iosm-cli 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +3 -3
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +7 -3
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-profiles.d.ts.map +1 -1
  7. package/dist/core/agent-profiles.js +5 -1
  8. package/dist/core/agent-profiles.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +3 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +188 -2
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/sdk.d.ts +2 -2
  14. package/dist/core/sdk.d.ts.map +1 -1
  15. package/dist/core/sdk.js +7 -4
  16. package/dist/core/sdk.js.map +1 -1
  17. package/dist/core/settings-manager.d.ts +18 -0
  18. package/dist/core/settings-manager.d.ts.map +1 -1
  19. package/dist/core/settings-manager.js +29 -0
  20. package/dist/core/settings-manager.js.map +1 -1
  21. package/dist/core/shadow-guard.d.ts.map +1 -1
  22. package/dist/core/shadow-guard.js +12 -1
  23. package/dist/core/shadow-guard.js.map +1 -1
  24. package/dist/core/system-prompt.d.ts.map +1 -1
  25. package/dist/core/system-prompt.js +32 -1
  26. package/dist/core/system-prompt.js.map +1 -1
  27. package/dist/core/tools/db-run.d.ts +84 -0
  28. package/dist/core/tools/db-run.d.ts.map +1 -0
  29. package/dist/core/tools/db-run.js +690 -0
  30. package/dist/core/tools/db-run.js.map +1 -0
  31. package/dist/core/tools/index.d.ts +44 -0
  32. package/dist/core/tools/index.d.ts.map +1 -1
  33. package/dist/core/tools/index.js +16 -0
  34. package/dist/core/tools/index.js.map +1 -1
  35. package/dist/core/tools/lint-run.d.ts +42 -0
  36. package/dist/core/tools/lint-run.d.ts.map +1 -0
  37. package/dist/core/tools/lint-run.js +276 -0
  38. package/dist/core/tools/lint-run.js.map +1 -0
  39. package/dist/core/tools/test-run.d.ts +36 -0
  40. package/dist/core/tools/test-run.d.ts.map +1 -0
  41. package/dist/core/tools/test-run.js +255 -0
  42. package/dist/core/tools/test-run.js.map +1 -0
  43. package/dist/core/tools/typecheck-run.d.ts +44 -0
  44. package/dist/core/tools/typecheck-run.d.ts.map +1 -0
  45. package/dist/core/tools/typecheck-run.js +343 -0
  46. package/dist/core/tools/typecheck-run.js.map +1 -0
  47. package/dist/core/tools/verification-runner.d.ts +53 -0
  48. package/dist/core/tools/verification-runner.d.ts.map +1 -0
  49. package/dist/core/tools/verification-runner.js +235 -0
  50. package/dist/core/tools/verification-runner.js.map +1 -0
  51. package/dist/index.d.ts +2 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  56. package/dist/modes/interactive/components/branch-summary-message.js +2 -1
  57. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  58. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  59. package/dist/modes/interactive/components/compaction-summary-message.js +2 -1
  60. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  61. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  62. package/dist/modes/interactive/components/custom-message.js +2 -1
  63. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  64. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  65. package/dist/modes/interactive/components/skill-invocation-message.js +4 -2
  66. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  67. package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
  68. package/dist/modes/interactive/components/subagent-message.js +3 -1
  69. package/dist/modes/interactive/components/subagent-message.js.map +1 -1
  70. package/dist/modes/interactive/components/task-plan-message.d.ts.map +1 -1
  71. package/dist/modes/interactive/components/task-plan-message.js +2 -1
  72. package/dist/modes/interactive/components/task-plan-message.js.map +1 -1
  73. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  74. package/dist/modes/interactive/components/tool-execution.js +25 -7
  75. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  76. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  77. package/dist/modes/interactive/components/user-message.js +2 -1
  78. package/dist/modes/interactive/components/user-message.js.map +1 -1
  79. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  80. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  81. package/dist/modes/interactive/interactive-mode.js +494 -9
  82. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  83. package/dist/modes/interactive/theme/dark.json +39 -38
  84. package/dist/modes/interactive/theme/light.json +29 -29
  85. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  86. package/dist/modes/interactive/theme/theme.js +16 -25
  87. package/dist/modes/interactive/theme/theme.js.map +1 -1
  88. package/dist/modes/interactive/theme/universal.json +85 -0
  89. package/docs/cli-reference.md +16 -1
  90. package/docs/configuration.md +76 -1
  91. package/docs/development-and-testing.md +1 -1
  92. package/docs/interactive-mode.md +7 -2
  93. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run.js","sourceRoot":"","sources":["../../../src/core/tools/test-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentTool } from \"@mariozechner/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { resolveToCwd } from \"./path-utils.js\";\nimport type { TruncationResult } from \"./truncate.js\";\nimport {\n\ttype PackageManager,\n\tcommandExists,\n\tdetectPackageManager,\n\tensureCommandOrThrow,\n\tformatVerificationOutput,\n\treadPackageJson,\n\tresolvePackageManagerExecInvocation,\n\tresolvePackageManagerRunInvocation,\n\trunVerificationCommand,\n} from \"./verification-runner.js\";\n\nconst testRunSchema = Type.Object({\n\trunner: Type.Optional(\n\t\tType.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"auto\"),\n\t\t\t\tType.Literal(\"npm\"),\n\t\t\t\tType.Literal(\"pnpm\"),\n\t\t\t\tType.Literal(\"yarn\"),\n\t\t\t\tType.Literal(\"bun\"),\n\t\t\t\tType.Literal(\"vitest\"),\n\t\t\t\tType.Literal(\"jest\"),\n\t\t\t\tType.Literal(\"pytest\"),\n\t\t\t],\n\t\t\t{\n\t\t\t\tdescription: \"Test runner: auto | npm | pnpm | yarn | bun | vitest | jest | pytest\",\n\t\t\t},\n\t\t),\n\t),\n\tscript: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Package script for npm/pnpm/yarn/bun runners (default: test).\",\n\t\t}),\n\t),\n\targs: Type.Optional(\n\t\tType.Array(Type.String(), {\n\t\t\tdescription: \"Additional arguments forwarded to the selected runner.\",\n\t\t}),\n\t),\n\tpath: Type.Optional(Type.String({ description: \"Working directory for running tests (default: current directory).\" })),\n\ttimeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (default: 900).\" })),\n});\n\nexport type TestRunToolInput = Static<typeof testRunSchema>;\nexport type TestRunRunner = \"auto\" | \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"vitest\" | \"jest\" | \"pytest\";\nexport type TestRunStatus = \"passed\" | \"failed\" | \"no_tests\" | \"error\";\n\ntype ResolvedTestRunner = Exclude<TestRunRunner, \"auto\">;\n\ninterface ResolvedTestCommand {\n\tresolvedRunner: ResolvedTestRunner;\n\tcommand: string;\n\targs: string[];\n}\n\nexport interface TestRunToolDetails {\n\tresolvedRunner: ResolvedTestRunner;\n\tresolvedCommand: string;\n\tresolvedArgs: string[];\n\tcwd: string;\n\texitCode: number;\n\tstatus: TestRunStatus;\n\tdurationMs: number;\n\tcaptureTruncated?: boolean;\n\ttruncation?: TruncationResult;\n}\n\nexport const DEFAULT_TEST_RUN_TIMEOUT_SECONDS = 900;\n\nfunction normalizeTimeoutSeconds(raw: number | undefined): number {\n\tif (raw === undefined) return DEFAULT_TEST_RUN_TIMEOUT_SECONDS;\n\tconst value = Math.floor(raw);\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(\"timeout must be a positive number.\");\n\t}\n\treturn value;\n}\n\nfunction normalizeStringArray(raw: string[] | undefined): string[] {\n\treturn (raw ?? []).map((item) => String(item));\n}\n\nfunction normalizeScriptName(raw: string | undefined, fallback: string): string {\n\tconst script = (raw ?? fallback).trim();\n\tif (script.length === 0) {\n\t\tthrow new Error(\"script must not be empty.\");\n\t}\n\treturn script;\n}\n\nfunction hasAnyFile(cwd: string, fileNames: string[]): boolean {\n\treturn fileNames.some((name) => existsSync(join(cwd, name)));\n}\n\nfunction hasVitestConfig(cwd: string): boolean {\n\treturn hasAnyFile(cwd, [\n\t\t\"vitest.config.ts\",\n\t\t\"vitest.config.js\",\n\t\t\"vitest.config.mjs\",\n\t\t\"vitest.config.cjs\",\n\t\t\"vitest.config.mts\",\n\t\t\"vitest.config.cts\",\n\t]);\n}\n\nfunction hasJestConfig(cwd: string, packageJsonJest: unknown): boolean {\n\tif (packageJsonJest && typeof packageJsonJest === \"object\") {\n\t\treturn true;\n\t}\n\treturn hasAnyFile(cwd, [\n\t\t\"jest.config.ts\",\n\t\t\"jest.config.js\",\n\t\t\"jest.config.mjs\",\n\t\t\"jest.config.cjs\",\n\t\t\"jest.config.json\",\n\t\t\"jest.config.mts\",\n\t\t\"jest.config.cts\",\n\t]);\n}\n\nfunction hasPythonMarkers(cwd: string): boolean {\n\treturn hasAnyFile(cwd, [\n\t\t\"pyproject.toml\",\n\t\t\"pytest.ini\",\n\t\t\"tox.ini\",\n\t\t\"setup.cfg\",\n\t\t\"requirements.txt\",\n\t\t\"requirements-dev.txt\",\n\t]);\n}\n\nfunction assertPackageManagerAvailable(packageManager: PackageManager): void {\n\tif (packageManager === \"bun\") {\n\t\tensureCommandOrThrow(\"bun\", 'Command \"bun\" is required for bun-based test execution.');\n\t\treturn;\n\t}\n\tensureCommandOrThrow(packageManager, `Command \"${packageManager}\" is required for test execution.`);\n}\n\nfunction resolveScriptBasedCommand(\n\tpackageManager: PackageManager,\n\tscript: string,\n\targs: string[],\n): ResolvedTestCommand {\n\tassertPackageManagerAvailable(packageManager);\n\tconst invocation = resolvePackageManagerRunInvocation(packageManager, script, args);\n\treturn {\n\t\tresolvedRunner: packageManager,\n\t\tcommand: invocation.command,\n\t\targs: invocation.args,\n\t};\n}\n\nfunction resolveFrameworkCommand(\n\tpackageManager: PackageManager,\n\trunner: \"vitest\" | \"jest\",\n\targs: string[],\n): ResolvedTestCommand {\n\tassertPackageManagerAvailable(packageManager);\n\tconst invocation = resolvePackageManagerExecInvocation(packageManager, runner, args);\n\tensureCommandOrThrow(\n\t\tinvocation.command,\n\t\t`Command \"${invocation.command}\" is required to run ${runner}. Install ${packageManager} tooling first.`,\n\t);\n\treturn {\n\t\tresolvedRunner: runner,\n\t\tcommand: invocation.command,\n\t\targs: invocation.args,\n\t};\n}\n\nfunction resolvePytestCommand(args: string[]): ResolvedTestCommand {\n\tif (commandExists(\"python3\")) {\n\t\treturn {\n\t\t\tresolvedRunner: \"pytest\",\n\t\t\tcommand: \"python3\",\n\t\t\targs: [\"-m\", \"pytest\", ...args],\n\t\t};\n\t}\n\tif (commandExists(\"pytest\")) {\n\t\treturn {\n\t\t\tresolvedRunner: \"pytest\",\n\t\t\tcommand: \"pytest\",\n\t\t\targs,\n\t\t};\n\t}\n\tthrow new Error('No pytest runtime found. Install python3 + pytest or expose \"pytest\" in PATH.');\n}\n\nfunction resolveAutoRunner(cwd: string, script: string): ResolvedTestRunner {\n\tconst packageJson = readPackageJson(cwd);\n\tif (packageJson?.scripts[script]) {\n\t\treturn detectPackageManager(cwd);\n\t}\n\tif (hasVitestConfig(cwd)) return \"vitest\";\n\tif (hasJestConfig(cwd, packageJson?.raw?.jest)) return \"jest\";\n\tif (hasPythonMarkers(cwd)) return \"pytest\";\n\tthrow new Error(\n\t\t'Unable to auto-detect test runner. Expected package.json script, vitest/jest config, or python pytest markers.',\n\t);\n}\n\nfunction resolveTestCommand(input: {\n\tcwd: string;\n\trunner: TestRunRunner;\n\tscript: string;\n\targs: string[];\n}): ResolvedTestCommand {\n\tconst packageJson = readPackageJson(input.cwd);\n\tconst detectedPackageManager = detectPackageManager(input.cwd);\n\tlet resolvedRunner: ResolvedTestRunner;\n\n\tif (input.runner === \"auto\") {\n\t\tresolvedRunner = resolveAutoRunner(input.cwd, input.script);\n\t} else {\n\t\tresolvedRunner = input.runner;\n\t}\n\n\tif (resolvedRunner === \"npm\" || resolvedRunner === \"pnpm\" || resolvedRunner === \"yarn\" || resolvedRunner === \"bun\") {\n\t\tif (!packageJson) {\n\t\t\tthrow new Error(`package.json is required to run ${resolvedRunner} scripts.`);\n\t\t}\n\t\tif (!packageJson.scripts[input.script]) {\n\t\t\tthrow new Error(`Script \"${input.script}\" is not defined in package.json.`);\n\t\t}\n\t\treturn resolveScriptBasedCommand(resolvedRunner, input.script, input.args);\n\t}\n\n\tif (resolvedRunner === \"vitest\" || resolvedRunner === \"jest\") {\n\t\treturn resolveFrameworkCommand(detectedPackageManager, resolvedRunner, input.args);\n\t}\n\n\treturn resolvePytestCommand(input.args);\n}\n\nfunction mapTestStatus(resolvedRunner: ResolvedTestRunner, exitCode: number): TestRunStatus {\n\tif (exitCode === 0) return \"passed\";\n\tif (resolvedRunner === \"pytest\" && exitCode === 5) return \"no_tests\";\n\tif (exitCode === 1) return \"failed\";\n\treturn \"error\";\n}\n\nfunction indicatesPytestModuleMissing(output: string): boolean {\n\treturn /No module named pytest|ModuleNotFoundError:\\s*No module named ['\"]pytest['\"]/i.test(output);\n}\n\nfunction renderSummary(details: TestRunToolDetails, output: string): string {\n\tconst argsText = details.resolvedArgs.length > 0 ? ` ${details.resolvedArgs.join(\" \")}` : \"\";\n\treturn [\n\t\t`test_run status: ${details.status}`,\n\t\t`runner: ${details.resolvedRunner}`,\n\t\t`command: ${details.resolvedCommand}${argsText}`,\n\t\t`cwd: ${details.cwd}`,\n\t\t`exit_code: ${details.exitCode}`,\n\t\t`duration_ms: ${details.durationMs}`,\n\t\t\"\",\n\t\toutput,\n\t].join(\"\\n\");\n}\n\nexport function createTestRunTool(cwd: string): AgentTool<typeof testRunSchema> {\n\treturn {\n\t\tname: \"test_run\",\n\t\tlabel: \"test_run\",\n\t\tdescription:\n\t\t\t\"Structured test runner with auto detection across npm/pnpm/yarn/bun, vitest, jest, and pytest. Returns normalized status without throwing on ordinary test failures.\",\n\t\tparameters: testRunSchema,\n\t\texecute: async (_toolCallId: string, input: TestRunToolInput, signal?: AbortSignal) => {\n\t\t\tconst executionCwd = resolveToCwd(input.path || \".\", cwd);\n\t\t\tconst timeoutSeconds = normalizeTimeoutSeconds(input.timeout);\n\t\t\tconst normalizedArgs = normalizeStringArray(input.args);\n\t\t\tconst script = normalizeScriptName(input.script, \"test\");\n\t\t\tconst runner = input.runner ?? \"auto\";\n\n\t\t\tlet command = resolveTestCommand({\n\t\t\t\tcwd: executionCwd,\n\t\t\t\trunner,\n\t\t\t\tscript,\n\t\t\t\targs: normalizedArgs,\n\t\t\t});\n\n\t\t\tlet result = await runVerificationCommand({\n\t\t\t\tcommand: command.command,\n\t\t\t\targs: command.args,\n\t\t\t\tcwd: executionCwd,\n\t\t\t\ttimeoutMs: timeoutSeconds * 1000,\n\t\t\t\tsignal,\n\t\t\t});\n\n\t\t\t// python3 -m pytest fallback to bare pytest when pytest module is unavailable\n\t\t\tif (\n\t\t\t\tcommand.resolvedRunner === \"pytest\" &&\n\t\t\t\tcommand.command === \"python3\" &&\n\t\t\t\tresult.exitCode !== 0 &&\n\t\t\t\tindicatesPytestModuleMissing(`${result.stdout}\\n${result.stderr}`) &&\n\t\t\t\tcommandExists(\"pytest\")\n\t\t\t) {\n\t\t\t\tconst fallback = await runVerificationCommand({\n\t\t\t\t\tcommand: \"pytest\",\n\t\t\t\t\targs: normalizedArgs,\n\t\t\t\t\tcwd: executionCwd,\n\t\t\t\t\ttimeoutMs: timeoutSeconds * 1000,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t\tcommand = { resolvedRunner: \"pytest\", command: \"pytest\", args: normalizedArgs };\n\t\t\t\tresult = {\n\t\t\t\t\t...fallback,\n\t\t\t\t\tdurationMs: result.durationMs + fallback.durationMs,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst status = mapTestStatus(command.resolvedRunner, result.exitCode);\n\t\t\tconst formatted = formatVerificationOutput(\n\t\t\t\tresult.stdout,\n\t\t\t\tresult.stderr,\n\t\t\t\tresult.captureTruncated,\n\t\t\t\t\"No test output\",\n\t\t\t);\n\n\t\t\tconst details: TestRunToolDetails = {\n\t\t\t\tresolvedRunner: command.resolvedRunner,\n\t\t\t\tresolvedCommand: command.command,\n\t\t\t\tresolvedArgs: command.args,\n\t\t\t\tcwd: executionCwd,\n\t\t\t\texitCode: result.exitCode,\n\t\t\t\tstatus,\n\t\t\t\tdurationMs: result.durationMs,\n\t\t\t\tcaptureTruncated: result.captureTruncated || undefined,\n\t\t\t\ttruncation: formatted.truncation,\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: renderSummary(details, formatted.text) }],\n\t\t\t\tdetails,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport const testRunTool = createTestRunTool(process.cwd());\n\n"]}
@@ -0,0 +1,44 @@
1
+ import type { AgentTool } from "@mariozechner/pi-agent-core";
2
+ import { type Static } from "@sinclair/typebox";
3
+ import type { TruncationResult } from "./truncate.js";
4
+ declare const typecheckRunSchema: import("@sinclair/typebox").TObject<{
5
+ runner: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"auto">, import("@sinclair/typebox").TLiteral<"npm">, import("@sinclair/typebox").TLiteral<"pnpm">, import("@sinclair/typebox").TLiteral<"yarn">, import("@sinclair/typebox").TLiteral<"bun">, import("@sinclair/typebox").TLiteral<"tsc">, import("@sinclair/typebox").TLiteral<"vue_tsc">, import("@sinclair/typebox").TLiteral<"pyright">, import("@sinclair/typebox").TLiteral<"mypy">]>>;
6
+ script: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
+ targets: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
8
+ args: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
9
+ path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
11
+ }>;
12
+ export type TypecheckRunToolInput = Static<typeof typecheckRunSchema>;
13
+ export type TypecheckRunRunner = "auto" | "npm" | "pnpm" | "yarn" | "bun" | "tsc" | "vue_tsc" | "pyright" | "mypy";
14
+ export type TypecheckRunStatus = "passed" | "failed" | "no_files" | "error";
15
+ type ResolvedTypecheckRunner = Exclude<TypecheckRunRunner, "auto">;
16
+ export interface TypecheckRunItemDetails {
17
+ resolvedRunner: ResolvedTypecheckRunner;
18
+ resolvedCommand: string;
19
+ resolvedArgs: string[];
20
+ exitCode: number;
21
+ status: TypecheckRunStatus;
22
+ durationMs: number;
23
+ captureTruncated?: boolean;
24
+ truncation?: TruncationResult;
25
+ }
26
+ export interface TypecheckRunToolDetails {
27
+ status: TypecheckRunStatus;
28
+ cwd: string;
29
+ durationMs: number;
30
+ runs: TypecheckRunItemDetails[];
31
+ aggregateExitCode: number;
32
+ }
33
+ export declare const DEFAULT_TYPECHECK_RUN_TIMEOUT_SECONDS = 600;
34
+ export declare function createTypecheckRunTool(cwd: string): AgentTool<typeof typecheckRunSchema>;
35
+ export declare const typecheckRunTool: AgentTool<import("@sinclair/typebox").TObject<{
36
+ runner: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"auto">, import("@sinclair/typebox").TLiteral<"npm">, import("@sinclair/typebox").TLiteral<"pnpm">, import("@sinclair/typebox").TLiteral<"yarn">, import("@sinclair/typebox").TLiteral<"bun">, import("@sinclair/typebox").TLiteral<"tsc">, import("@sinclair/typebox").TLiteral<"vue_tsc">, import("@sinclair/typebox").TLiteral<"pyright">, import("@sinclair/typebox").TLiteral<"mypy">]>>;
37
+ script: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
38
+ targets: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
39
+ args: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
40
+ path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
41
+ timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
42
+ }>, any>;
43
+ export {};
44
+ //# sourceMappingURL=typecheck-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typecheck-run.d.ts","sourceRoot":"","sources":["../../../src/core/tools/typecheck-run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAatD,QAAA,MAAM,kBAAkB;;;;;;;EAoCtB,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAC3B,MAAM,GACN,KAAK,GACL,MAAM,GACN,MAAM,GACN,KAAK,GACL,KAAK,GACL,SAAS,GACT,SAAS,GACT,MAAM,CAAC;AACV,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAE5E,KAAK,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAQnE,MAAM,WAAW,uBAAuB;IACvC,cAAc,EAAE,uBAAuB,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACvC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,uBAAuB,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAgSzD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,kBAAkB,CAAC,CA2FxF;AAED,eAAO,MAAM,gBAAgB;;;;;;;QAAwC,CAAC"}
@@ -0,0 +1,343 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { Type } from "@sinclair/typebox";
4
+ import { resolveToCwd } from "./path-utils.js";
5
+ import { commandExists, detectPackageManager, ensureCommandOrThrow, formatVerificationOutput, readPackageJson, resolvePackageManagerExecInvocation, resolvePackageManagerRunInvocation, runVerificationCommandBatch, } from "./verification-runner.js";
6
+ const typecheckRunSchema = Type.Object({
7
+ runner: Type.Optional(Type.Union([
8
+ Type.Literal("auto"),
9
+ Type.Literal("npm"),
10
+ Type.Literal("pnpm"),
11
+ Type.Literal("yarn"),
12
+ Type.Literal("bun"),
13
+ Type.Literal("tsc"),
14
+ Type.Literal("vue_tsc"),
15
+ Type.Literal("pyright"),
16
+ Type.Literal("mypy"),
17
+ ], {
18
+ description: "Typecheck runner: auto | npm | pnpm | yarn | bun | tsc | vue_tsc | pyright | mypy",
19
+ })),
20
+ script: Type.Optional(Type.String({
21
+ description: "Package script for npm/pnpm/yarn/bun runners (default: typecheck).",
22
+ })),
23
+ targets: Type.Optional(Type.Array(Type.String(), {
24
+ description: "Optional explicit typecheck targets (files/directories/globs).",
25
+ })),
26
+ args: Type.Optional(Type.Array(Type.String(), {
27
+ description: "Additional CLI args forwarded to each selected typecheck runner.",
28
+ })),
29
+ path: Type.Optional(Type.String({ description: "Working directory for typecheck execution (default: current directory)." })),
30
+ timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (default: 600)." })),
31
+ });
32
+ export const DEFAULT_TYPECHECK_RUN_TIMEOUT_SECONDS = 600;
33
+ function normalizeTimeoutSeconds(raw) {
34
+ if (raw === undefined)
35
+ return DEFAULT_TYPECHECK_RUN_TIMEOUT_SECONDS;
36
+ const value = Math.floor(raw);
37
+ if (!Number.isFinite(value) || value <= 0) {
38
+ throw new Error("timeout must be a positive number.");
39
+ }
40
+ return value;
41
+ }
42
+ function normalizeStringArray(raw) {
43
+ return (raw ?? []).map((item) => String(item));
44
+ }
45
+ function normalizeOptionalScriptName(raw) {
46
+ if (raw === undefined)
47
+ return undefined;
48
+ const script = raw.trim();
49
+ if (!script) {
50
+ throw new Error("script must not be empty.");
51
+ }
52
+ return script;
53
+ }
54
+ function hasAnyFile(cwd, fileNames) {
55
+ return fileNames.some((name) => existsSync(join(cwd, name)));
56
+ }
57
+ function pyprojectContains(cwd, marker) {
58
+ const pyprojectPath = join(cwd, "pyproject.toml");
59
+ if (!existsSync(pyprojectPath))
60
+ return false;
61
+ try {
62
+ const content = readFileSync(pyprojectPath, "utf-8");
63
+ return content.includes(marker);
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ function packageHasDependency(packageJson, dependency) {
70
+ if (!packageJson)
71
+ return false;
72
+ const raw = packageJson.raw;
73
+ return Boolean(raw.dependencies?.[dependency] ??
74
+ raw.devDependencies?.[dependency] ??
75
+ raw.optionalDependencies?.[dependency] ??
76
+ raw.peerDependencies?.[dependency]);
77
+ }
78
+ function scriptsContainToken(packageJson, token) {
79
+ if (!packageJson)
80
+ return false;
81
+ return Object.values(packageJson.scripts).some((value) => value.includes(token));
82
+ }
83
+ function hasTypeScriptMarkers(cwd, packageJson) {
84
+ if (hasAnyFile(cwd, [
85
+ "tsconfig.json",
86
+ "tsconfig.base.json",
87
+ "tsconfig.app.json",
88
+ "tsconfig.build.json",
89
+ "tsconfig.node.json",
90
+ ])) {
91
+ return true;
92
+ }
93
+ return packageHasDependency(packageJson, "typescript") || scriptsContainToken(packageJson, "tsc");
94
+ }
95
+ function hasVueTypeScriptMarkers(cwd, packageJson) {
96
+ if (hasAnyFile(cwd, ["tsconfig.vue.json", "vue-tsc.config.ts", "vue-tsc.config.js"])) {
97
+ return true;
98
+ }
99
+ return packageHasDependency(packageJson, "vue-tsc") || scriptsContainToken(packageJson, "vue-tsc");
100
+ }
101
+ function hasPyrightMarkers(cwd) {
102
+ return existsSync(join(cwd, "pyrightconfig.json")) || pyprojectContains(cwd, "[tool.pyright]");
103
+ }
104
+ function hasMypyMarkers(cwd) {
105
+ return hasAnyFile(cwd, ["mypy.ini", ".mypy.ini"]) || pyprojectContains(cwd, "[tool.mypy]");
106
+ }
107
+ function assertPackageManagerAvailable(packageManager) {
108
+ if (packageManager === "bun") {
109
+ ensureCommandOrThrow("bun", 'Command "bun" is required for bun-based typecheck execution.');
110
+ return;
111
+ }
112
+ ensureCommandOrThrow(packageManager, `Command "${packageManager}" is required for typecheck execution.`);
113
+ }
114
+ function resolveScriptCommand(packageManager, script, args, targets) {
115
+ assertPackageManagerAvailable(packageManager);
116
+ const invocation = resolvePackageManagerRunInvocation(packageManager, script, [...args, ...targets]);
117
+ return {
118
+ resolvedRunner: packageManager,
119
+ command: invocation.command,
120
+ args: invocation.args,
121
+ };
122
+ }
123
+ function resolvePackageExecRunner(cwd, binary, resolvedRunner, args, targets) {
124
+ const packageManager = detectPackageManager(cwd);
125
+ assertPackageManagerAvailable(packageManager);
126
+ const invocation = resolvePackageManagerExecInvocation(packageManager, binary, [...args, ...targets]);
127
+ ensureCommandOrThrow(invocation.command, `Command "${invocation.command}" is required to run ${binary}. Install ${packageManager} tooling first.`);
128
+ return {
129
+ resolvedRunner,
130
+ command: invocation.command,
131
+ args: invocation.args,
132
+ };
133
+ }
134
+ function resolveMypyRunner(args, targets) {
135
+ const positionalTargets = targets.length > 0 ? targets : ["."];
136
+ if (commandExists("python3")) {
137
+ return {
138
+ resolvedRunner: "mypy",
139
+ command: "python3",
140
+ args: ["-m", "mypy", ...args, ...positionalTargets],
141
+ };
142
+ }
143
+ if (commandExists("mypy")) {
144
+ return {
145
+ resolvedRunner: "mypy",
146
+ command: "mypy",
147
+ args: [...args, ...positionalTargets],
148
+ };
149
+ }
150
+ throw new Error('No mypy runtime found. Install python3 + mypy or expose "mypy" in PATH.');
151
+ }
152
+ function uniqueByRunner(commands) {
153
+ const seen = new Set();
154
+ const result = [];
155
+ for (const command of commands) {
156
+ if (seen.has(command.resolvedRunner))
157
+ continue;
158
+ seen.add(command.resolvedRunner);
159
+ result.push(command);
160
+ }
161
+ return result;
162
+ }
163
+ function resolveAutoCommands(input) {
164
+ const packageJson = readPackageJson(input.cwd);
165
+ const commands = [];
166
+ const packageManager = detectPackageManager(input.cwd);
167
+ const scriptCandidates = input.script ? [input.script] : ["typecheck", "check:types", "types"];
168
+ if (packageJson) {
169
+ const selectedScript = scriptCandidates.find((candidate) => Boolean(packageJson.scripts[candidate]));
170
+ if (selectedScript) {
171
+ commands.push(resolveScriptCommand(packageManager, selectedScript, input.args, input.targets));
172
+ }
173
+ }
174
+ if (hasTypeScriptMarkers(input.cwd, packageJson)) {
175
+ commands.push(resolvePackageExecRunner(input.cwd, "tsc", "tsc", input.args, input.targets));
176
+ }
177
+ if (hasVueTypeScriptMarkers(input.cwd, packageJson)) {
178
+ commands.push(resolvePackageExecRunner(input.cwd, "vue-tsc", "vue_tsc", input.args, input.targets));
179
+ }
180
+ if (hasPyrightMarkers(input.cwd)) {
181
+ commands.push(resolvePackageExecRunner(input.cwd, "pyright", "pyright", input.args, input.targets));
182
+ }
183
+ if (hasMypyMarkers(input.cwd)) {
184
+ commands.push(resolveMypyRunner(input.args, input.targets));
185
+ }
186
+ const unique = uniqueByRunner(commands);
187
+ if (unique.length === 0) {
188
+ throw new Error("Unable to auto-detect typecheck runners. Expected package.json typecheck scripts, TS configs/dependencies, or Python pyright/mypy markers.");
189
+ }
190
+ return unique;
191
+ }
192
+ function resolveSingleCommand(input) {
193
+ if (input.runner === "npm" || input.runner === "pnpm" || input.runner === "yarn" || input.runner === "bun") {
194
+ const packageJson = readPackageJson(input.cwd);
195
+ if (!packageJson) {
196
+ throw new Error(`package.json is required to run ${input.runner} scripts.`);
197
+ }
198
+ if (!packageJson.scripts[input.script]) {
199
+ throw new Error(`Script "${input.script}" is not defined in package.json.`);
200
+ }
201
+ return resolveScriptCommand(input.runner, input.script, input.args, input.targets);
202
+ }
203
+ if (input.runner === "tsc") {
204
+ return resolvePackageExecRunner(input.cwd, "tsc", "tsc", input.args, input.targets);
205
+ }
206
+ if (input.runner === "vue_tsc") {
207
+ return resolvePackageExecRunner(input.cwd, "vue-tsc", "vue_tsc", input.args, input.targets);
208
+ }
209
+ if (input.runner === "pyright") {
210
+ return resolvePackageExecRunner(input.cwd, "pyright", "pyright", input.args, input.targets);
211
+ }
212
+ return resolveMypyRunner(input.args, input.targets);
213
+ }
214
+ function indicatesNoFiles(output) {
215
+ return /No inputs were found in config file|No source files found|0 source files/i.test(output);
216
+ }
217
+ function mapTypecheckStatus(exitCode, output) {
218
+ if (indicatesNoFiles(output))
219
+ return "no_files";
220
+ if (exitCode === 0)
221
+ return "passed";
222
+ if (exitCode === 1)
223
+ return "failed";
224
+ return "error";
225
+ }
226
+ function aggregateStatus(statuses) {
227
+ if (statuses.length === 0)
228
+ return "error";
229
+ if (statuses.includes("error"))
230
+ return "error";
231
+ if (statuses.includes("failed"))
232
+ return "failed";
233
+ if (statuses.every((status) => status === "no_files"))
234
+ return "no_files";
235
+ return "passed";
236
+ }
237
+ function resolveAggregateExitCode(status, runs) {
238
+ if (status === "passed")
239
+ return 0;
240
+ const nonZero = runs.find((run) => run.exitCode !== 0);
241
+ if (nonZero)
242
+ return nonZero.exitCode;
243
+ const first = runs[0];
244
+ return first ? first.exitCode : -1;
245
+ }
246
+ function renderSummary(details, outputs) {
247
+ const lines = [
248
+ `typecheck_run status: ${details.status}`,
249
+ `cwd: ${details.cwd}`,
250
+ `runs: ${details.runs.length}`,
251
+ `aggregate_exit_code: ${details.aggregateExitCode}`,
252
+ `duration_ms: ${details.durationMs}`,
253
+ ];
254
+ for (let index = 0; index < details.runs.length; index += 1) {
255
+ const run = details.runs[index];
256
+ const output = outputs[index];
257
+ const argsText = run.resolvedArgs.length > 0 ? ` ${run.resolvedArgs.join(" ")}` : "";
258
+ lines.push("");
259
+ lines.push(`[${index + 1}] ${run.resolvedRunner} status=${run.status} exit_code=${run.exitCode} duration_ms=${run.durationMs}`);
260
+ lines.push(`command: ${run.resolvedCommand}${argsText}`);
261
+ lines.push(output?.text ?? "No typecheck output");
262
+ }
263
+ return lines.join("\n");
264
+ }
265
+ export function createTypecheckRunTool(cwd) {
266
+ return {
267
+ name: "typecheck_run",
268
+ label: "typecheck_run",
269
+ description: "Structured typecheck execution for TS/Python stacks with auto detection across package scripts, tsc/vue-tsc, pyright, and mypy. Returns normalized status without throwing on ordinary typecheck failures.",
270
+ parameters: typecheckRunSchema,
271
+ execute: async (_toolCallId, input, signal) => {
272
+ const executionCwd = resolveToCwd(input.path || ".", cwd);
273
+ const timeoutSeconds = normalizeTimeoutSeconds(input.timeout);
274
+ const args = normalizeStringArray(input.args);
275
+ const targets = normalizeStringArray(input.targets);
276
+ const runner = input.runner ?? "auto";
277
+ const script = normalizeOptionalScriptName(input.script) ?? "typecheck";
278
+ const commands = runner === "auto"
279
+ ? resolveAutoCommands({
280
+ cwd: executionCwd,
281
+ script: normalizeOptionalScriptName(input.script),
282
+ args,
283
+ targets,
284
+ })
285
+ : [
286
+ resolveSingleCommand({
287
+ cwd: executionCwd,
288
+ runner,
289
+ script,
290
+ args,
291
+ targets,
292
+ }),
293
+ ];
294
+ const startedAt = Date.now();
295
+ const batch = await runVerificationCommandBatch(commands.map((command, index) => ({
296
+ key: `${command.resolvedRunner}-${index}`,
297
+ command: command.command,
298
+ args: command.args,
299
+ cwd: executionCwd,
300
+ timeoutMs: timeoutSeconds * 1000,
301
+ signal,
302
+ })));
303
+ const durationMs = Date.now() - startedAt;
304
+ const runDetails = [];
305
+ const renderedOutputs = [];
306
+ for (let index = 0; index < batch.length; index += 1) {
307
+ const resolved = commands[index];
308
+ const entry = batch[index];
309
+ const rawOutput = `${entry.result.stdout}\n${entry.result.stderr}`;
310
+ const status = mapTypecheckStatus(entry.result.exitCode, rawOutput);
311
+ const formatted = formatVerificationOutput(entry.result.stdout, entry.result.stderr, entry.result.captureTruncated, "No typecheck output");
312
+ runDetails.push({
313
+ resolvedRunner: resolved?.resolvedRunner ?? "tsc",
314
+ resolvedCommand: resolved?.command ?? entry.input.command,
315
+ resolvedArgs: resolved?.args ?? entry.input.args,
316
+ exitCode: entry.result.exitCode,
317
+ status,
318
+ durationMs: entry.result.durationMs,
319
+ captureTruncated: entry.result.captureTruncated || undefined,
320
+ truncation: formatted.truncation,
321
+ });
322
+ renderedOutputs.push({
323
+ runner: resolved?.resolvedRunner ?? "tsc",
324
+ text: formatted.text,
325
+ });
326
+ }
327
+ const status = aggregateStatus(runDetails.map((run) => run.status));
328
+ const details = {
329
+ status,
330
+ cwd: executionCwd,
331
+ durationMs,
332
+ runs: runDetails,
333
+ aggregateExitCode: resolveAggregateExitCode(status, runDetails),
334
+ };
335
+ return {
336
+ content: [{ type: "text", text: renderSummary(details, renderedOutputs) }],
337
+ details,
338
+ };
339
+ },
340
+ };
341
+ }
342
+ export const typecheckRunTool = createTypecheckRunTool(process.cwd());
343
+ //# sourceMappingURL=typecheck-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typecheck-run.js","sourceRoot":"","sources":["../../../src/core/tools/typecheck-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentTool } from \"@mariozechner/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { resolveToCwd } from \"./path-utils.js\";\nimport type { TruncationResult } from \"./truncate.js\";\nimport {\n\ttype PackageManager,\n\tcommandExists,\n\tdetectPackageManager,\n\tensureCommandOrThrow,\n\tformatVerificationOutput,\n\treadPackageJson,\n\tresolvePackageManagerExecInvocation,\n\tresolvePackageManagerRunInvocation,\n\trunVerificationCommandBatch,\n} from \"./verification-runner.js\";\n\nconst typecheckRunSchema = Type.Object({\n\trunner: Type.Optional(\n\t\tType.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"auto\"),\n\t\t\t\tType.Literal(\"npm\"),\n\t\t\t\tType.Literal(\"pnpm\"),\n\t\t\t\tType.Literal(\"yarn\"),\n\t\t\t\tType.Literal(\"bun\"),\n\t\t\t\tType.Literal(\"tsc\"),\n\t\t\t\tType.Literal(\"vue_tsc\"),\n\t\t\t\tType.Literal(\"pyright\"),\n\t\t\t\tType.Literal(\"mypy\"),\n\t\t\t],\n\t\t\t{\n\t\t\t\tdescription: \"Typecheck runner: auto | npm | pnpm | yarn | bun | tsc | vue_tsc | pyright | mypy\",\n\t\t\t},\n\t\t),\n\t),\n\tscript: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Package script for npm/pnpm/yarn/bun runners (default: typecheck).\",\n\t\t}),\n\t),\n\ttargets: Type.Optional(\n\t\tType.Array(Type.String(), {\n\t\t\tdescription: \"Optional explicit typecheck targets (files/directories/globs).\",\n\t\t}),\n\t),\n\targs: Type.Optional(\n\t\tType.Array(Type.String(), {\n\t\t\tdescription: \"Additional CLI args forwarded to each selected typecheck runner.\",\n\t\t}),\n\t),\n\tpath: Type.Optional(Type.String({ description: \"Working directory for typecheck execution (default: current directory).\" })),\n\ttimeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (default: 600).\" })),\n});\n\nexport type TypecheckRunToolInput = Static<typeof typecheckRunSchema>;\nexport type TypecheckRunRunner =\n\t| \"auto\"\n\t| \"npm\"\n\t| \"pnpm\"\n\t| \"yarn\"\n\t| \"bun\"\n\t| \"tsc\"\n\t| \"vue_tsc\"\n\t| \"pyright\"\n\t| \"mypy\";\nexport type TypecheckRunStatus = \"passed\" | \"failed\" | \"no_files\" | \"error\";\n\ntype ResolvedTypecheckRunner = Exclude<TypecheckRunRunner, \"auto\">;\n\ninterface ResolvedTypecheckCommand {\n\tresolvedRunner: ResolvedTypecheckRunner;\n\tcommand: string;\n\targs: string[];\n}\n\nexport interface TypecheckRunItemDetails {\n\tresolvedRunner: ResolvedTypecheckRunner;\n\tresolvedCommand: string;\n\tresolvedArgs: string[];\n\texitCode: number;\n\tstatus: TypecheckRunStatus;\n\tdurationMs: number;\n\tcaptureTruncated?: boolean;\n\ttruncation?: TruncationResult;\n}\n\nexport interface TypecheckRunToolDetails {\n\tstatus: TypecheckRunStatus;\n\tcwd: string;\n\tdurationMs: number;\n\truns: TypecheckRunItemDetails[];\n\taggregateExitCode: number;\n}\n\nexport const DEFAULT_TYPECHECK_RUN_TIMEOUT_SECONDS = 600;\n\nfunction normalizeTimeoutSeconds(raw: number | undefined): number {\n\tif (raw === undefined) return DEFAULT_TYPECHECK_RUN_TIMEOUT_SECONDS;\n\tconst value = Math.floor(raw);\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(\"timeout must be a positive number.\");\n\t}\n\treturn value;\n}\n\nfunction normalizeStringArray(raw: string[] | undefined): string[] {\n\treturn (raw ?? []).map((item) => String(item));\n}\n\nfunction normalizeOptionalScriptName(raw: string | undefined): string | undefined {\n\tif (raw === undefined) return undefined;\n\tconst script = raw.trim();\n\tif (!script) {\n\t\tthrow new Error(\"script must not be empty.\");\n\t}\n\treturn script;\n}\n\nfunction hasAnyFile(cwd: string, fileNames: string[]): boolean {\n\treturn fileNames.some((name) => existsSync(join(cwd, name)));\n}\n\nfunction pyprojectContains(cwd: string, marker: string): boolean {\n\tconst pyprojectPath = join(cwd, \"pyproject.toml\");\n\tif (!existsSync(pyprojectPath)) return false;\n\ttry {\n\t\tconst content = readFileSync(pyprojectPath, \"utf-8\");\n\t\treturn content.includes(marker);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction packageHasDependency(packageJson: ReturnType<typeof readPackageJson>, dependency: string): boolean {\n\tif (!packageJson) return false;\n\tconst raw = packageJson.raw as {\n\t\tdependencies?: Record<string, unknown>;\n\t\tdevDependencies?: Record<string, unknown>;\n\t\toptionalDependencies?: Record<string, unknown>;\n\t\tpeerDependencies?: Record<string, unknown>;\n\t};\n\treturn Boolean(\n\t\traw.dependencies?.[dependency] ??\n\t\t\traw.devDependencies?.[dependency] ??\n\t\t\traw.optionalDependencies?.[dependency] ??\n\t\t\traw.peerDependencies?.[dependency],\n\t);\n}\n\nfunction scriptsContainToken(packageJson: ReturnType<typeof readPackageJson>, token: string): boolean {\n\tif (!packageJson) return false;\n\treturn Object.values(packageJson.scripts).some((value) => value.includes(token));\n}\n\nfunction hasTypeScriptMarkers(cwd: string, packageJson: ReturnType<typeof readPackageJson>): boolean {\n\tif (\n\t\thasAnyFile(cwd, [\n\t\t\t\"tsconfig.json\",\n\t\t\t\"tsconfig.base.json\",\n\t\t\t\"tsconfig.app.json\",\n\t\t\t\"tsconfig.build.json\",\n\t\t\t\"tsconfig.node.json\",\n\t\t])\n\t) {\n\t\treturn true;\n\t}\n\treturn packageHasDependency(packageJson, \"typescript\") || scriptsContainToken(packageJson, \"tsc\");\n}\n\nfunction hasVueTypeScriptMarkers(cwd: string, packageJson: ReturnType<typeof readPackageJson>): boolean {\n\tif (hasAnyFile(cwd, [\"tsconfig.vue.json\", \"vue-tsc.config.ts\", \"vue-tsc.config.js\"])) {\n\t\treturn true;\n\t}\n\treturn packageHasDependency(packageJson, \"vue-tsc\") || scriptsContainToken(packageJson, \"vue-tsc\");\n}\n\nfunction hasPyrightMarkers(cwd: string): boolean {\n\treturn existsSync(join(cwd, \"pyrightconfig.json\")) || pyprojectContains(cwd, \"[tool.pyright]\");\n}\n\nfunction hasMypyMarkers(cwd: string): boolean {\n\treturn hasAnyFile(cwd, [\"mypy.ini\", \".mypy.ini\"]) || pyprojectContains(cwd, \"[tool.mypy]\");\n}\n\nfunction assertPackageManagerAvailable(packageManager: PackageManager): void {\n\tif (packageManager === \"bun\") {\n\t\tensureCommandOrThrow(\"bun\", 'Command \"bun\" is required for bun-based typecheck execution.');\n\t\treturn;\n\t}\n\tensureCommandOrThrow(packageManager, `Command \"${packageManager}\" is required for typecheck execution.`);\n}\n\nfunction resolveScriptCommand(\n\tpackageManager: PackageManager,\n\tscript: string,\n\targs: string[],\n\ttargets: string[],\n): ResolvedTypecheckCommand {\n\tassertPackageManagerAvailable(packageManager);\n\tconst invocation = resolvePackageManagerRunInvocation(packageManager, script, [...args, ...targets]);\n\treturn {\n\t\tresolvedRunner: packageManager,\n\t\tcommand: invocation.command,\n\t\targs: invocation.args,\n\t};\n}\n\nfunction resolvePackageExecRunner(\n\tcwd: string,\n\tbinary: \"tsc\" | \"vue-tsc\" | \"pyright\",\n\tresolvedRunner: \"tsc\" | \"vue_tsc\" | \"pyright\",\n\targs: string[],\n\ttargets: string[],\n): ResolvedTypecheckCommand {\n\tconst packageManager = detectPackageManager(cwd);\n\tassertPackageManagerAvailable(packageManager);\n\tconst invocation = resolvePackageManagerExecInvocation(packageManager, binary, [...args, ...targets]);\n\tensureCommandOrThrow(\n\t\tinvocation.command,\n\t\t`Command \"${invocation.command}\" is required to run ${binary}. Install ${packageManager} tooling first.`,\n\t);\n\treturn {\n\t\tresolvedRunner,\n\t\tcommand: invocation.command,\n\t\targs: invocation.args,\n\t};\n}\n\nfunction resolveMypyRunner(args: string[], targets: string[]): ResolvedTypecheckCommand {\n\tconst positionalTargets = targets.length > 0 ? targets : [\".\"];\n\tif (commandExists(\"python3\")) {\n\t\treturn {\n\t\t\tresolvedRunner: \"mypy\",\n\t\t\tcommand: \"python3\",\n\t\t\targs: [\"-m\", \"mypy\", ...args, ...positionalTargets],\n\t\t};\n\t}\n\tif (commandExists(\"mypy\")) {\n\t\treturn {\n\t\t\tresolvedRunner: \"mypy\",\n\t\t\tcommand: \"mypy\",\n\t\t\targs: [...args, ...positionalTargets],\n\t\t};\n\t}\n\tthrow new Error('No mypy runtime found. Install python3 + mypy or expose \"mypy\" in PATH.');\n}\n\nfunction uniqueByRunner(commands: ResolvedTypecheckCommand[]): ResolvedTypecheckCommand[] {\n\tconst seen = new Set<ResolvedTypecheckRunner>();\n\tconst result: ResolvedTypecheckCommand[] = [];\n\tfor (const command of commands) {\n\t\tif (seen.has(command.resolvedRunner)) continue;\n\t\tseen.add(command.resolvedRunner);\n\t\tresult.push(command);\n\t}\n\treturn result;\n}\n\nfunction resolveAutoCommands(input: {\n\tcwd: string;\n\tscript?: string;\n\targs: string[];\n\ttargets: string[];\n}): ResolvedTypecheckCommand[] {\n\tconst packageJson = readPackageJson(input.cwd);\n\tconst commands: ResolvedTypecheckCommand[] = [];\n\tconst packageManager = detectPackageManager(input.cwd);\n\n\tconst scriptCandidates = input.script ? [input.script] : [\"typecheck\", \"check:types\", \"types\"];\n\tif (packageJson) {\n\t\tconst selectedScript = scriptCandidates.find((candidate) => Boolean(packageJson.scripts[candidate]));\n\t\tif (selectedScript) {\n\t\t\tcommands.push(resolveScriptCommand(packageManager, selectedScript, input.args, input.targets));\n\t\t}\n\t}\n\n\tif (hasTypeScriptMarkers(input.cwd, packageJson)) {\n\t\tcommands.push(resolvePackageExecRunner(input.cwd, \"tsc\", \"tsc\", input.args, input.targets));\n\t}\n\n\tif (hasVueTypeScriptMarkers(input.cwd, packageJson)) {\n\t\tcommands.push(resolvePackageExecRunner(input.cwd, \"vue-tsc\", \"vue_tsc\", input.args, input.targets));\n\t}\n\n\tif (hasPyrightMarkers(input.cwd)) {\n\t\tcommands.push(resolvePackageExecRunner(input.cwd, \"pyright\", \"pyright\", input.args, input.targets));\n\t}\n\n\tif (hasMypyMarkers(input.cwd)) {\n\t\tcommands.push(resolveMypyRunner(input.args, input.targets));\n\t}\n\n\tconst unique = uniqueByRunner(commands);\n\tif (unique.length === 0) {\n\t\tthrow new Error(\n\t\t\t\"Unable to auto-detect typecheck runners. Expected package.json typecheck scripts, TS configs/dependencies, or Python pyright/mypy markers.\",\n\t\t);\n\t}\n\treturn unique;\n}\n\nfunction resolveSingleCommand(input: {\n\tcwd: string;\n\trunner: ResolvedTypecheckRunner;\n\tscript: string;\n\targs: string[];\n\ttargets: string[];\n}): ResolvedTypecheckCommand {\n\tif (input.runner === \"npm\" || input.runner === \"pnpm\" || input.runner === \"yarn\" || input.runner === \"bun\") {\n\t\tconst packageJson = readPackageJson(input.cwd);\n\t\tif (!packageJson) {\n\t\t\tthrow new Error(`package.json is required to run ${input.runner} scripts.`);\n\t\t}\n\t\tif (!packageJson.scripts[input.script]) {\n\t\t\tthrow new Error(`Script \"${input.script}\" is not defined in package.json.`);\n\t\t}\n\t\treturn resolveScriptCommand(input.runner, input.script, input.args, input.targets);\n\t}\n\n\tif (input.runner === \"tsc\") {\n\t\treturn resolvePackageExecRunner(input.cwd, \"tsc\", \"tsc\", input.args, input.targets);\n\t}\n\tif (input.runner === \"vue_tsc\") {\n\t\treturn resolvePackageExecRunner(input.cwd, \"vue-tsc\", \"vue_tsc\", input.args, input.targets);\n\t}\n\tif (input.runner === \"pyright\") {\n\t\treturn resolvePackageExecRunner(input.cwd, \"pyright\", \"pyright\", input.args, input.targets);\n\t}\n\treturn resolveMypyRunner(input.args, input.targets);\n}\n\nfunction indicatesNoFiles(output: string): boolean {\n\treturn /No inputs were found in config file|No source files found|0 source files/i.test(output);\n}\n\nfunction mapTypecheckStatus(exitCode: number, output: string): TypecheckRunStatus {\n\tif (indicatesNoFiles(output)) return \"no_files\";\n\tif (exitCode === 0) return \"passed\";\n\tif (exitCode === 1) return \"failed\";\n\treturn \"error\";\n}\n\nfunction aggregateStatus(statuses: TypecheckRunStatus[]): TypecheckRunStatus {\n\tif (statuses.length === 0) return \"error\";\n\tif (statuses.includes(\"error\")) return \"error\";\n\tif (statuses.includes(\"failed\")) return \"failed\";\n\tif (statuses.every((status) => status === \"no_files\")) return \"no_files\";\n\treturn \"passed\";\n}\n\nfunction resolveAggregateExitCode(status: TypecheckRunStatus, runs: TypecheckRunItemDetails[]): number {\n\tif (status === \"passed\") return 0;\n\tconst nonZero = runs.find((run) => run.exitCode !== 0);\n\tif (nonZero) return nonZero.exitCode;\n\tconst first = runs[0];\n\treturn first ? first.exitCode : -1;\n}\n\nfunction renderSummary(details: TypecheckRunToolDetails, outputs: Array<{ runner: string; text: string }>): string {\n\tconst lines: string[] = [\n\t\t`typecheck_run status: ${details.status}`,\n\t\t`cwd: ${details.cwd}`,\n\t\t`runs: ${details.runs.length}`,\n\t\t`aggregate_exit_code: ${details.aggregateExitCode}`,\n\t\t`duration_ms: ${details.durationMs}`,\n\t];\n\n\tfor (let index = 0; index < details.runs.length; index += 1) {\n\t\tconst run = details.runs[index];\n\t\tconst output = outputs[index];\n\t\tconst argsText = run.resolvedArgs.length > 0 ? ` ${run.resolvedArgs.join(\" \")}` : \"\";\n\t\tlines.push(\"\");\n\t\tlines.push(\n\t\t\t`[${index + 1}] ${run.resolvedRunner} status=${run.status} exit_code=${run.exitCode} duration_ms=${run.durationMs}`,\n\t\t);\n\t\tlines.push(`command: ${run.resolvedCommand}${argsText}`);\n\t\tlines.push(output?.text ?? \"No typecheck output\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function createTypecheckRunTool(cwd: string): AgentTool<typeof typecheckRunSchema> {\n\treturn {\n\t\tname: \"typecheck_run\",\n\t\tlabel: \"typecheck_run\",\n\t\tdescription:\n\t\t\t\"Structured typecheck execution for TS/Python stacks with auto detection across package scripts, tsc/vue-tsc, pyright, and mypy. Returns normalized status without throwing on ordinary typecheck failures.\",\n\t\tparameters: typecheckRunSchema,\n\t\texecute: async (_toolCallId: string, input: TypecheckRunToolInput, signal?: AbortSignal) => {\n\t\t\tconst executionCwd = resolveToCwd(input.path || \".\", cwd);\n\t\t\tconst timeoutSeconds = normalizeTimeoutSeconds(input.timeout);\n\t\t\tconst args = normalizeStringArray(input.args);\n\t\t\tconst targets = normalizeStringArray(input.targets);\n\t\t\tconst runner = input.runner ?? \"auto\";\n\t\t\tconst script = normalizeOptionalScriptName(input.script) ?? \"typecheck\";\n\n\t\t\tconst commands =\n\t\t\t\trunner === \"auto\"\n\t\t\t\t\t? resolveAutoCommands({\n\t\t\t\t\t\tcwd: executionCwd,\n\t\t\t\t\t\tscript: normalizeOptionalScriptName(input.script),\n\t\t\t\t\t\targs,\n\t\t\t\t\t\ttargets,\n\t\t\t\t\t})\n\t\t\t\t\t: [\n\t\t\t\t\t\tresolveSingleCommand({\n\t\t\t\t\t\t\tcwd: executionCwd,\n\t\t\t\t\t\t\trunner,\n\t\t\t\t\t\t\tscript,\n\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\ttargets,\n\t\t\t\t\t\t}),\n\t\t\t\t\t];\n\n\t\t\tconst startedAt = Date.now();\n\t\t\tconst batch = await runVerificationCommandBatch(\n\t\t\t\tcommands.map((command, index) => ({\n\t\t\t\t\tkey: `${command.resolvedRunner}-${index}`,\n\t\t\t\t\tcommand: command.command,\n\t\t\t\t\targs: command.args,\n\t\t\t\t\tcwd: executionCwd,\n\t\t\t\t\ttimeoutMs: timeoutSeconds * 1000,\n\t\t\t\t\tsignal,\n\t\t\t\t})),\n\t\t\t);\n\t\t\tconst durationMs = Date.now() - startedAt;\n\n\t\t\tconst runDetails: TypecheckRunItemDetails[] = [];\n\t\t\tconst renderedOutputs: Array<{ runner: string; text: string }> = [];\n\t\t\tfor (let index = 0; index < batch.length; index += 1) {\n\t\t\t\tconst resolved = commands[index];\n\t\t\t\tconst entry = batch[index];\n\t\t\t\tconst rawOutput = `${entry.result.stdout}\\n${entry.result.stderr}`;\n\t\t\t\tconst status = mapTypecheckStatus(entry.result.exitCode, rawOutput);\n\t\t\t\tconst formatted = formatVerificationOutput(\n\t\t\t\t\tentry.result.stdout,\n\t\t\t\t\tentry.result.stderr,\n\t\t\t\t\tentry.result.captureTruncated,\n\t\t\t\t\t\"No typecheck output\",\n\t\t\t\t);\n\n\t\t\t\trunDetails.push({\n\t\t\t\t\tresolvedRunner: resolved?.resolvedRunner ?? \"tsc\",\n\t\t\t\t\tresolvedCommand: resolved?.command ?? entry.input.command,\n\t\t\t\t\tresolvedArgs: resolved?.args ?? entry.input.args,\n\t\t\t\t\texitCode: entry.result.exitCode,\n\t\t\t\t\tstatus,\n\t\t\t\t\tdurationMs: entry.result.durationMs,\n\t\t\t\t\tcaptureTruncated: entry.result.captureTruncated || undefined,\n\t\t\t\t\ttruncation: formatted.truncation,\n\t\t\t\t});\n\t\t\t\trenderedOutputs.push({\n\t\t\t\t\trunner: resolved?.resolvedRunner ?? \"tsc\",\n\t\t\t\t\ttext: formatted.text,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst status = aggregateStatus(runDetails.map((run) => run.status));\n\t\t\tconst details: TypecheckRunToolDetails = {\n\t\t\t\tstatus,\n\t\t\t\tcwd: executionCwd,\n\t\t\t\tdurationMs,\n\t\t\t\truns: runDetails,\n\t\t\t\taggregateExitCode: resolveAggregateExitCode(status, runDetails),\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: renderSummary(details, renderedOutputs) }],\n\t\t\t\tdetails,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport const typecheckRunTool = createTypecheckRunTool(process.cwd());\n"]}
@@ -0,0 +1,53 @@
1
+ import { type TruncationResult } from "./truncate.js";
2
+ export declare const DEFAULT_VERIFICATION_CAPTURE_BYTES: number;
3
+ export type PackageManager = "npm" | "pnpm" | "yarn" | "bun";
4
+ export interface PackageJsonInfo {
5
+ path: string;
6
+ raw: Record<string, unknown>;
7
+ scripts: Record<string, string>;
8
+ }
9
+ export interface VerificationCommandResult {
10
+ stdout: string;
11
+ stderr: string;
12
+ exitCode: number;
13
+ captureTruncated: boolean;
14
+ durationMs: number;
15
+ }
16
+ export interface VerificationOutputFormat {
17
+ text: string;
18
+ truncation?: TruncationResult;
19
+ }
20
+ export interface RunVerificationCommandInput {
21
+ command: string;
22
+ args: string[];
23
+ cwd: string;
24
+ timeoutMs: number;
25
+ signal?: AbortSignal;
26
+ env?: NodeJS.ProcessEnv;
27
+ stdin?: string;
28
+ }
29
+ export interface VerificationBatchItem extends RunVerificationCommandInput {
30
+ key?: string;
31
+ }
32
+ export interface VerificationBatchResult {
33
+ key?: string;
34
+ input: VerificationBatchItem;
35
+ result: VerificationCommandResult;
36
+ }
37
+ export declare function commandExists(command: string): boolean;
38
+ export declare function resolveCommandCandidate(candidates: string[]): string | undefined;
39
+ export declare function detectPackageManager(cwd: string): PackageManager;
40
+ export declare function readPackageJson(cwd: string): PackageJsonInfo | undefined;
41
+ export declare function resolvePackageManagerRunInvocation(packageManager: PackageManager, script: string, scriptArgs: string[]): {
42
+ command: string;
43
+ args: string[];
44
+ };
45
+ export declare function resolvePackageManagerExecInvocation(packageManager: PackageManager, binary: string, binaryArgs: string[]): {
46
+ command: string;
47
+ args: string[];
48
+ };
49
+ export declare function ensureCommandOrThrow(command: string, hint?: string): void;
50
+ export declare function runVerificationCommand(input: RunVerificationCommandInput): Promise<VerificationCommandResult>;
51
+ export declare function runVerificationCommandBatch(items: VerificationBatchItem[]): Promise<VerificationBatchResult[]>;
52
+ export declare function formatVerificationOutput(stdout: string, stderr: string, captureTruncated: boolean, emptyOutputMessage: string): VerificationOutputFormat;
53
+ //# sourceMappingURL=verification-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-runner.d.ts","sourceRoot":"","sources":["../../../src/core/tools/verification-runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,kCAAkC,QAAa,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAsB,SAAQ,2BAA2B;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,uBAAuB;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,yBAAyB,CAAC;CAClC;AAoBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAOhF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAMhE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CA8BxE;AAED,wBAAgB,kCAAkC,CACjD,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAuBrC;AAED,wBAAgB,mCAAmC,CAClD,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAcrC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAMzE;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA2FnH;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAWpH;AAED,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,OAAO,EACzB,kBAAkB,EAAE,MAAM,GACxB,wBAAwB,CA0B1B"}