import { z } from 'zod';
import { config } from '../../config.js';
import { detectProject, resolvePackage } from '../../lib/frameworks/detect.js';
import { resolveTarget } from '../../lib/frameworks/resolve.js';
import { detectJsPackageManager, runScriptCommandFor } from '../../lib/frameworks/packageManager.js';
import { runCommand } from '../../lib/runCommand.js';
import { processManager } from '../../lib/processManager.js';
import { errorResult, jsonResult, packageSchema, targetSchema, toErrorMessage } from '../shared.js';
export function registerRunScriptTool(server) {
    server.registerTool('run_script', {
        title: 'Run package.json Script',
        description: 'Run an npm/pnpm/yarn/bun script from package.json. Runs in the foreground and waits for completion by default; set background: true for long-running scripts (watchers, servers) and manage them via get_process_logs/stop_process. Optional `package` scopes to a monorepo package.',
        inputSchema: {
            script: z.string().describe('The package.json script name to run, e.g. "build" or "dev".'),
            target: targetSchema,
            package: packageSchema,
            background: z
                .boolean()
                .optional()
                .default(false)
                .describe('Run as a tracked background process instead of waiting for it to finish.'),
            extraArgs: z.array(z.string()).optional().describe('Extra arguments forwarded to the script.'),
        },
    }, async ({ script, target, package: packageName, background, extraArgs }) => {
        try {
            const scopeRoot = packageName
                ? resolvePackage(config.workspaceRoot, packageName).pkg.absolutePath
                : config.workspaceRoot;
            const detected = detectProject(scopeRoot);
            const { adapter, target: resolvedTarget } = resolveTarget(detected, target, 'frontend');
            const root = adapter.root;
            const pm = detectJsPackageManager(root);
            const { command, args } = runScriptCommandFor(pm, script, extraArgs ?? []);
            if (background) {
                const info = processManager.start({ label: `run_script:${script}`, command, args, cwd: root });
                return jsonResult({ started: true, target: resolvedTarget, package: packageName ?? null, ...info });
            }
            const result = await runCommand(command, args, { cwd: root });
            return jsonResult({
                target: resolvedTarget,
                package: packageName ?? null,
                exitCode: result.exitCode,
                timedOut: result.timedOut,
                failed: result.failed,
                output: result.output,
                cwd: result.cwd,
                command: result.command,
                args: result.args,
            });
        }
        catch (error) {
            return errorResult(toErrorMessage(error));
        }
    });
}
//# sourceMappingURL=runScript.js.map