iosm-cli 0.2.7 → 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.
- package/CHANGELOG.md +61 -1
- package/README.md +4 -4
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +12 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-profiles.d.ts.map +1 -1
- package/dist/core/agent-profiles.js +15 -2
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-session.d.ts +3 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +214 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +7 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +57 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +197 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shadow-guard.d.ts.map +1 -1
- package/dist/core/shadow-guard.js +12 -1
- package/dist/core/shadow-guard.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +109 -4
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/db-run.d.ts +84 -0
- package/dist/core/tools/db-run.d.ts.map +1 -0
- package/dist/core/tools/db-run.js +690 -0
- package/dist/core/tools/db-run.js.map +1 -0
- package/dist/core/tools/git-common.d.ts +45 -0
- package/dist/core/tools/git-common.d.ts.map +1 -0
- package/dist/core/tools/git-common.js +185 -0
- package/dist/core/tools/git-common.js.map +1 -0
- package/dist/core/tools/git-read.d.ts +15 -13
- package/dist/core/tools/git-read.d.ts.map +1 -1
- package/dist/core/tools/git-read.js +101 -153
- package/dist/core/tools/git-read.js.map +1 -1
- package/dist/core/tools/git-write.d.ts +75 -0
- package/dist/core/tools/git-write.d.ts.map +1 -0
- package/dist/core/tools/git-write.js +298 -0
- package/dist/core/tools/git-write.js.map +1 -0
- package/dist/core/tools/index.d.ts +91 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +26 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/lint-run.d.ts +42 -0
- package/dist/core/tools/lint-run.d.ts.map +1 -0
- package/dist/core/tools/lint-run.js +276 -0
- package/dist/core/tools/lint-run.js.map +1 -0
- package/dist/core/tools/task.js +1 -1
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/tools/test-run.d.ts +36 -0
- package/dist/core/tools/test-run.d.ts.map +1 -0
- package/dist/core/tools/test-run.js +255 -0
- package/dist/core/tools/test-run.js.map +1 -0
- package/dist/core/tools/typecheck-run.d.ts +44 -0
- package/dist/core/tools/typecheck-run.d.ts.map +1 -0
- package/dist/core/tools/typecheck-run.js +343 -0
- package/dist/core/tools/typecheck-run.js.map +1 -0
- package/dist/core/tools/verification-runner.d.ts +53 -0
- package/dist/core/tools/verification-runner.d.ts.map +1 -0
- package/dist/core/tools/verification-runner.js +235 -0
- package/dist/core/tools/verification-runner.js.map +1 -0
- package/dist/core/tools/web-search.d.ts +72 -0
- package/dist/core/tools/web-search.d.ts.map +1 -0
- package/dist/core/tools/web-search.js +702 -0
- package/dist/core/tools/web-search.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +2 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +2 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +7 -2
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +2 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/mcp-selector.js +3 -1
- package/dist/modes/interactive/components/mcp-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +12 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +11 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +16 -5
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +4 -2
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +25 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +182 -2
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +7 -2
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +4 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/subagent-message.js +3 -1
- package/dist/modes/interactive/components/subagent-message.js.map +1 -1
- package/dist/modes/interactive/components/task-plan-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/task-plan-message.js +2 -1
- package/dist/modes/interactive/components/task-plan-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +7 -2
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +7 -2
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +25 -7
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +18 -3
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +8 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +2 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +622 -11
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +39 -38
- package/dist/modes/interactive/theme/light.json +29 -29
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +16 -25
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/theme/universal.json +85 -0
- package/docs/cli-reference.md +32 -2
- package/docs/configuration.md +86 -2
- package/docs/development-and-testing.md +1 -1
- package/docs/interactive-mode.md +8 -3
- package/docs/rpc-json-sdk.md +1 -1
- package/package.json +1 -1
|
@@ -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"}
|