iosm-cli 0.2.8 → 0.2.10

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 (100) hide show
  1. package/CHANGELOG.md +66 -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 +8 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +490 -3
  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/slash-commands.d.ts.map +1 -1
  25. package/dist/core/slash-commands.js +4 -0
  26. package/dist/core/slash-commands.js.map +1 -1
  27. package/dist/core/system-prompt.d.ts.map +1 -1
  28. package/dist/core/system-prompt.js +32 -1
  29. package/dist/core/system-prompt.js.map +1 -1
  30. package/dist/core/tools/db-run.d.ts +84 -0
  31. package/dist/core/tools/db-run.d.ts.map +1 -0
  32. package/dist/core/tools/db-run.js +690 -0
  33. package/dist/core/tools/db-run.js.map +1 -0
  34. package/dist/core/tools/index.d.ts +44 -0
  35. package/dist/core/tools/index.d.ts.map +1 -1
  36. package/dist/core/tools/index.js +16 -0
  37. package/dist/core/tools/index.js.map +1 -1
  38. package/dist/core/tools/lint-run.d.ts +42 -0
  39. package/dist/core/tools/lint-run.d.ts.map +1 -0
  40. package/dist/core/tools/lint-run.js +276 -0
  41. package/dist/core/tools/lint-run.js.map +1 -0
  42. package/dist/core/tools/test-run.d.ts +36 -0
  43. package/dist/core/tools/test-run.d.ts.map +1 -0
  44. package/dist/core/tools/test-run.js +255 -0
  45. package/dist/core/tools/test-run.js.map +1 -0
  46. package/dist/core/tools/typecheck-run.d.ts +44 -0
  47. package/dist/core/tools/typecheck-run.d.ts.map +1 -0
  48. package/dist/core/tools/typecheck-run.js +343 -0
  49. package/dist/core/tools/typecheck-run.js.map +1 -0
  50. package/dist/core/tools/verification-runner.d.ts +53 -0
  51. package/dist/core/tools/verification-runner.d.ts.map +1 -0
  52. package/dist/core/tools/verification-runner.js +235 -0
  53. package/dist/core/tools/verification-runner.js.map +1 -0
  54. package/dist/core/ultrathink.d.ts +122 -0
  55. package/dist/core/ultrathink.d.ts.map +1 -0
  56. package/dist/core/ultrathink.js +621 -0
  57. package/dist/core/ultrathink.js.map +1 -0
  58. package/dist/index.d.ts +2 -2
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +1 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  63. package/dist/modes/interactive/components/branch-summary-message.js +2 -1
  64. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  65. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  66. package/dist/modes/interactive/components/compaction-summary-message.js +2 -1
  67. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  68. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  69. package/dist/modes/interactive/components/custom-message.js +2 -1
  70. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  71. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  72. package/dist/modes/interactive/components/skill-invocation-message.js +4 -2
  73. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  74. package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
  75. package/dist/modes/interactive/components/subagent-message.js +3 -1
  76. package/dist/modes/interactive/components/subagent-message.js.map +1 -1
  77. package/dist/modes/interactive/components/task-plan-message.d.ts.map +1 -1
  78. package/dist/modes/interactive/components/task-plan-message.js +2 -1
  79. package/dist/modes/interactive/components/task-plan-message.js.map +1 -1
  80. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  81. package/dist/modes/interactive/components/tool-execution.js +25 -7
  82. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  83. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  84. package/dist/modes/interactive/components/user-message.js +2 -1
  85. package/dist/modes/interactive/components/user-message.js.map +1 -1
  86. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  87. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  88. package/dist/modes/interactive/interactive-mode.js +523 -9
  89. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  90. package/dist/modes/interactive/theme/dark.json +39 -38
  91. package/dist/modes/interactive/theme/light.json +29 -29
  92. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  93. package/dist/modes/interactive/theme/theme.js +16 -25
  94. package/dist/modes/interactive/theme/theme.js.map +1 -1
  95. package/dist/modes/interactive/theme/universal.json +85 -0
  96. package/docs/cli-reference.md +21 -1
  97. package/docs/configuration.md +76 -1
  98. package/docs/development-and-testing.md +1 -1
  99. package/docs/interactive-mode.md +11 -2
  100. package/package.json +1 -1
@@ -0,0 +1,235 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { spawn, spawnSync } from "node:child_process";
4
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, } from "./truncate.js";
5
+ export const DEFAULT_VERIFICATION_CAPTURE_BYTES = 512 * 1024;
6
+ function captureChunk(chunk, chunks, currentBytes, maxCaptureBytes) {
7
+ if (currentBytes >= maxCaptureBytes) {
8
+ return { nextBytes: currentBytes, truncated: true };
9
+ }
10
+ const remaining = maxCaptureBytes - currentBytes;
11
+ if (chunk.length <= remaining) {
12
+ chunks.push(chunk);
13
+ return { nextBytes: currentBytes + chunk.length, truncated: false };
14
+ }
15
+ chunks.push(chunk.subarray(0, remaining));
16
+ return { nextBytes: maxCaptureBytes, truncated: true };
17
+ }
18
+ export function commandExists(command) {
19
+ try {
20
+ const result = spawnSync(command, ["--version"], { stdio: "pipe" });
21
+ const err = result.error;
22
+ return !err || err.code !== "ENOENT";
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export function resolveCommandCandidate(candidates) {
29
+ for (const candidate of candidates) {
30
+ if (commandExists(candidate)) {
31
+ return candidate;
32
+ }
33
+ }
34
+ return undefined;
35
+ }
36
+ export function detectPackageManager(cwd) {
37
+ if (existsSync(join(cwd, "pnpm-lock.yaml")))
38
+ return "pnpm";
39
+ if (existsSync(join(cwd, "yarn.lock")))
40
+ return "yarn";
41
+ if (existsSync(join(cwd, "bun.lockb")) || existsSync(join(cwd, "bun.lock")))
42
+ return "bun";
43
+ if (existsSync(join(cwd, "package-lock.json")) || existsSync(join(cwd, "npm-shrinkwrap.json")))
44
+ return "npm";
45
+ return "npm";
46
+ }
47
+ export function readPackageJson(cwd) {
48
+ const packageJsonPath = join(cwd, "package.json");
49
+ if (!existsSync(packageJsonPath)) {
50
+ return undefined;
51
+ }
52
+ let parsed;
53
+ try {
54
+ parsed = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
55
+ }
56
+ catch (error) {
57
+ const message = error instanceof Error ? error.message : String(error);
58
+ throw new Error(`Failed to parse package.json at ${packageJsonPath}: ${message}`);
59
+ }
60
+ if (!parsed || typeof parsed !== "object") {
61
+ throw new Error(`package.json at ${packageJsonPath} must contain a JSON object.`);
62
+ }
63
+ const raw = parsed;
64
+ const scriptsRaw = raw.scripts;
65
+ const scripts = {};
66
+ if (scriptsRaw && typeof scriptsRaw === "object") {
67
+ for (const [key, value] of Object.entries(scriptsRaw)) {
68
+ if (typeof value === "string") {
69
+ scripts[key] = value;
70
+ }
71
+ }
72
+ }
73
+ return { path: packageJsonPath, raw, scripts };
74
+ }
75
+ export function resolvePackageManagerRunInvocation(packageManager, script, scriptArgs) {
76
+ if (packageManager === "npm") {
77
+ return {
78
+ command: "npm",
79
+ args: scriptArgs.length > 0 ? ["run", script, "--", ...scriptArgs] : ["run", script],
80
+ };
81
+ }
82
+ if (packageManager === "pnpm") {
83
+ return {
84
+ command: "pnpm",
85
+ args: scriptArgs.length > 0 ? ["run", script, "--", ...scriptArgs] : ["run", script],
86
+ };
87
+ }
88
+ if (packageManager === "yarn") {
89
+ return {
90
+ command: "yarn",
91
+ args: ["run", script, ...scriptArgs],
92
+ };
93
+ }
94
+ return {
95
+ command: "bun",
96
+ args: ["run", script, ...scriptArgs],
97
+ };
98
+ }
99
+ export function resolvePackageManagerExecInvocation(packageManager, binary, binaryArgs) {
100
+ if (packageManager === "npm") {
101
+ return { command: "npm", args: ["exec", "--", binary, ...binaryArgs] };
102
+ }
103
+ if (packageManager === "pnpm") {
104
+ return { command: "pnpm", args: ["exec", binary, ...binaryArgs] };
105
+ }
106
+ if (packageManager === "yarn") {
107
+ return { command: "yarn", args: ["exec", binary, ...binaryArgs] };
108
+ }
109
+ if (commandExists("bunx")) {
110
+ return { command: "bunx", args: [binary, ...binaryArgs] };
111
+ }
112
+ return { command: "bun", args: ["x", binary, ...binaryArgs] };
113
+ }
114
+ export function ensureCommandOrThrow(command, hint) {
115
+ if (commandExists(command)) {
116
+ return;
117
+ }
118
+ const message = hint ? `${hint}` : `Command "${command}" is not available in PATH.`;
119
+ throw new Error(message);
120
+ }
121
+ export async function runVerificationCommand(input) {
122
+ return new Promise((resolve, reject) => {
123
+ if (input.signal?.aborted) {
124
+ reject(new Error("Operation aborted"));
125
+ return;
126
+ }
127
+ const startedAt = Date.now();
128
+ const child = spawn(input.command, input.args, {
129
+ cwd: input.cwd,
130
+ stdio: ["pipe", "pipe", "pipe"],
131
+ env: input.env ? { ...process.env, ...input.env } : process.env,
132
+ });
133
+ let stdoutBytes = 0;
134
+ let stderrBytes = 0;
135
+ let captureTruncated = false;
136
+ let timedOut = false;
137
+ let aborted = false;
138
+ let settled = false;
139
+ const stdoutChunks = [];
140
+ const stderrChunks = [];
141
+ const settle = (fn) => {
142
+ if (!settled) {
143
+ settled = true;
144
+ fn();
145
+ }
146
+ };
147
+ const timeoutHandle = setTimeout(() => {
148
+ timedOut = true;
149
+ child.kill("SIGTERM");
150
+ }, Math.max(1_000, input.timeoutMs));
151
+ const onAbort = () => {
152
+ aborted = true;
153
+ child.kill("SIGTERM");
154
+ };
155
+ input.signal?.addEventListener("abort", onAbort, { once: true });
156
+ const cleanup = () => {
157
+ clearTimeout(timeoutHandle);
158
+ input.signal?.removeEventListener("abort", onAbort);
159
+ };
160
+ child.stdout.on("data", (chunk) => {
161
+ const captured = captureChunk(chunk, stdoutChunks, stdoutBytes, DEFAULT_VERIFICATION_CAPTURE_BYTES);
162
+ stdoutBytes = captured.nextBytes;
163
+ captureTruncated = captureTruncated || captured.truncated;
164
+ });
165
+ child.stderr.on("data", (chunk) => {
166
+ const captured = captureChunk(chunk, stderrChunks, stderrBytes, DEFAULT_VERIFICATION_CAPTURE_BYTES);
167
+ stderrBytes = captured.nextBytes;
168
+ captureTruncated = captureTruncated || captured.truncated;
169
+ });
170
+ if (input.stdin !== undefined) {
171
+ child.stdin.write(input.stdin);
172
+ }
173
+ child.stdin.end();
174
+ child.on("error", (error) => {
175
+ cleanup();
176
+ settle(() => reject(new Error(`Failed to run ${input.command}: ${error.message}`)));
177
+ });
178
+ child.on("close", (code) => {
179
+ cleanup();
180
+ if (aborted) {
181
+ settle(() => reject(new Error("Operation aborted")));
182
+ return;
183
+ }
184
+ if (timedOut) {
185
+ settle(() => reject(new Error(`Command timed out after ${Math.round(input.timeoutMs / 1000)}s`)));
186
+ return;
187
+ }
188
+ settle(() => resolve({
189
+ stdout: Buffer.concat(stdoutChunks).toString("utf-8"),
190
+ stderr: Buffer.concat(stderrChunks).toString("utf-8"),
191
+ exitCode: code ?? -1,
192
+ captureTruncated,
193
+ durationMs: Date.now() - startedAt,
194
+ }));
195
+ });
196
+ });
197
+ }
198
+ export async function runVerificationCommandBatch(items) {
199
+ const results = [];
200
+ for (const item of items) {
201
+ const result = await runVerificationCommand(item);
202
+ results.push({
203
+ key: item.key,
204
+ input: item,
205
+ result,
206
+ });
207
+ }
208
+ return results;
209
+ }
210
+ export function formatVerificationOutput(stdout, stderr, captureTruncated, emptyOutputMessage) {
211
+ let output = stdout.trimEnd();
212
+ if (!output && stderr.trim().length > 0) {
213
+ output = stderr.trimEnd();
214
+ }
215
+ if (!output) {
216
+ output = emptyOutputMessage;
217
+ }
218
+ const truncation = truncateHead(output);
219
+ let text = truncation.content;
220
+ const notices = [];
221
+ if (truncation.truncated) {
222
+ notices.push(`${formatSize(DEFAULT_MAX_BYTES)} output limit reached`);
223
+ }
224
+ if (captureTruncated) {
225
+ notices.push(`capture limit reached (${formatSize(DEFAULT_VERIFICATION_CAPTURE_BYTES)})`);
226
+ }
227
+ if (notices.length > 0) {
228
+ text += `\n\n[${notices.join(". ")} · showing up to ${DEFAULT_MAX_LINES} lines]`;
229
+ }
230
+ return {
231
+ text,
232
+ truncation: truncation.truncated ? truncation : undefined,
233
+ };
234
+ }
235
+ //# sourceMappingURL=verification-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-runner.js","sourceRoot":"","sources":["../../../src/core/tools/verification-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EAEV,YAAY,GACZ,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,GAAG,IAAI,CAAC;AA2C7D,SAAS,YAAY,CACpB,KAAa,EACb,MAAgB,EAChB,YAAoB,EACpB,eAAuB;IAEvB,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,GAAG,YAAY,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,EAAE,SAAS,EAAE,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC5C,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,CAAC,KAA0C,CAAC;QAC9D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAoB;IAC3D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1F,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7G,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,mCAAmC,eAAe,KAAK,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,mBAAmB,eAAe,8BAA8B,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAqC,CAAC,EAAE,CAAC;YAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kCAAkC,CACjD,cAA8B,EAC9B,MAAc,EACd,UAAoB;IAEpB,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO;YACN,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC;SACpF,CAAC;IACH,CAAC;IACD,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO;YACN,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC;SACpF,CAAC;IACH,CAAC;IACD,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO;YACN,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;SACpC,CAAC;IACH,CAAC;IACD,OAAO;QACN,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;KACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mCAAmC,CAClD,cAA8B,EAC9B,MAAc,EACd,UAAoB;IAEpB,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,IAAa;IAClE,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO;IACR,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,OAAO,6BAA6B,CAAC;IACpF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAkC;IAC9E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACvC,OAAO;QACR,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;YAC9C,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;SAC/D,CAAC,CAAC;QAEH,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,MAAM,MAAM,GAAG,CAAC,EAAc,EAAE,EAAE;YACjC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,GAAG,IAAI,CAAC;gBACf,EAAE,EAAE,CAAC;YACN,CAAC;QACF,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACrC,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kCAAkC,CAAC,CAAC;YACpG,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC;YACjC,gBAAgB,GAAG,gBAAgB,IAAI,QAAQ,CAAC,SAAS,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kCAAkC,CAAC,CAAC;YACpG,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC;YACjC,gBAAgB,GAAG,gBAAgB,IAAI,QAAQ,CAAC,SAAS,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAElB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACR,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClG,OAAO;YACR,CAAC;YAED,MAAM,CAAC,GAAG,EAAE,CACX,OAAO,CAAC;gBACP,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACrD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACrD,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;gBACpB,gBAAgB;gBAChB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAClC,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,KAA8B;IAC/E,MAAM,OAAO,GAA8B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI;YACX,MAAM;SACN,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,MAAc,EACd,MAAc,EACd,gBAAyB,EACzB,kBAA0B;IAE1B,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,GAAG,kBAAkB,CAAC;IAC7B,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,0BAA0B,UAAU,CAAC,kCAAkC,CAAC,GAAG,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,IAAI,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,iBAAiB,SAAS,CAAC;IAClF,CAAC;IAED,OAAO;QACN,IAAI;QACJ,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC;AACH,CAAC","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\tformatSize,\n\ttype TruncationResult,\n\ttruncateHead,\n} from \"./truncate.js\";\n\nexport const DEFAULT_VERIFICATION_CAPTURE_BYTES = 512 * 1024;\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport interface PackageJsonInfo {\n\tpath: string;\n\traw: Record<string, unknown>;\n\tscripts: Record<string, string>;\n}\n\nexport interface VerificationCommandResult {\n\tstdout: string;\n\tstderr: string;\n\texitCode: number;\n\tcaptureTruncated: boolean;\n\tdurationMs: number;\n}\n\nexport interface VerificationOutputFormat {\n\ttext: string;\n\ttruncation?: TruncationResult;\n}\n\nexport interface RunVerificationCommandInput {\n\tcommand: string;\n\targs: string[];\n\tcwd: string;\n\ttimeoutMs: number;\n\tsignal?: AbortSignal;\n\tenv?: NodeJS.ProcessEnv;\n\tstdin?: string;\n}\n\nexport interface VerificationBatchItem extends RunVerificationCommandInput {\n\tkey?: string;\n}\n\nexport interface VerificationBatchResult {\n\tkey?: string;\n\tinput: VerificationBatchItem;\n\tresult: VerificationCommandResult;\n}\n\nfunction captureChunk(\n\tchunk: Buffer,\n\tchunks: Buffer[],\n\tcurrentBytes: number,\n\tmaxCaptureBytes: number,\n): { nextBytes: number; truncated: boolean } {\n\tif (currentBytes >= maxCaptureBytes) {\n\t\treturn { nextBytes: currentBytes, truncated: true };\n\t}\n\tconst remaining = maxCaptureBytes - currentBytes;\n\tif (chunk.length <= remaining) {\n\t\tchunks.push(chunk);\n\t\treturn { nextBytes: currentBytes + chunk.length, truncated: false };\n\t}\n\tchunks.push(chunk.subarray(0, remaining));\n\treturn { nextBytes: maxCaptureBytes, truncated: true };\n}\n\nexport function commandExists(command: string): boolean {\n\ttry {\n\t\tconst result = spawnSync(command, [\"--version\"], { stdio: \"pipe\" });\n\t\tconst err = result.error as NodeJS.ErrnoException | undefined;\n\t\treturn !err || err.code !== \"ENOENT\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function resolveCommandCandidate(candidates: string[]): string | undefined {\n\tfor (const candidate of candidates) {\n\t\tif (commandExists(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function detectPackageManager(cwd: string): PackageManager {\n\tif (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n\tif (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n\tif (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\"))) return \"bun\";\n\tif (existsSync(join(cwd, \"package-lock.json\")) || existsSync(join(cwd, \"npm-shrinkwrap.json\"))) return \"npm\";\n\treturn \"npm\";\n}\n\nexport function readPackageJson(cwd: string): PackageJsonInfo | undefined {\n\tconst packageJsonPath = join(cwd, \"package.json\");\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn undefined;\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to parse package.json at ${packageJsonPath}: ${message}`);\n\t}\n\n\tif (!parsed || typeof parsed !== \"object\") {\n\t\tthrow new Error(`package.json at ${packageJsonPath} must contain a JSON object.`);\n\t}\n\n\tconst raw = parsed as Record<string, unknown>;\n\tconst scriptsRaw = raw.scripts;\n\tconst scripts: Record<string, string> = {};\n\tif (scriptsRaw && typeof scriptsRaw === \"object\") {\n\t\tfor (const [key, value] of Object.entries(scriptsRaw as Record<string, unknown>)) {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tscripts[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { path: packageJsonPath, raw, scripts };\n}\n\nexport function resolvePackageManagerRunInvocation(\n\tpackageManager: PackageManager,\n\tscript: string,\n\tscriptArgs: string[],\n): { command: string; args: string[] } {\n\tif (packageManager === \"npm\") {\n\t\treturn {\n\t\t\tcommand: \"npm\",\n\t\t\targs: scriptArgs.length > 0 ? [\"run\", script, \"--\", ...scriptArgs] : [\"run\", script],\n\t\t};\n\t}\n\tif (packageManager === \"pnpm\") {\n\t\treturn {\n\t\t\tcommand: \"pnpm\",\n\t\t\targs: scriptArgs.length > 0 ? [\"run\", script, \"--\", ...scriptArgs] : [\"run\", script],\n\t\t};\n\t}\n\tif (packageManager === \"yarn\") {\n\t\treturn {\n\t\t\tcommand: \"yarn\",\n\t\t\targs: [\"run\", script, ...scriptArgs],\n\t\t};\n\t}\n\treturn {\n\t\tcommand: \"bun\",\n\t\targs: [\"run\", script, ...scriptArgs],\n\t};\n}\n\nexport function resolvePackageManagerExecInvocation(\n\tpackageManager: PackageManager,\n\tbinary: string,\n\tbinaryArgs: string[],\n): { command: string; args: string[] } {\n\tif (packageManager === \"npm\") {\n\t\treturn { command: \"npm\", args: [\"exec\", \"--\", binary, ...binaryArgs] };\n\t}\n\tif (packageManager === \"pnpm\") {\n\t\treturn { command: \"pnpm\", args: [\"exec\", binary, ...binaryArgs] };\n\t}\n\tif (packageManager === \"yarn\") {\n\t\treturn { command: \"yarn\", args: [\"exec\", binary, ...binaryArgs] };\n\t}\n\tif (commandExists(\"bunx\")) {\n\t\treturn { command: \"bunx\", args: [binary, ...binaryArgs] };\n\t}\n\treturn { command: \"bun\", args: [\"x\", binary, ...binaryArgs] };\n}\n\nexport function ensureCommandOrThrow(command: string, hint?: string): void {\n\tif (commandExists(command)) {\n\t\treturn;\n\t}\n\tconst message = hint ? `${hint}` : `Command \"${command}\" is not available in PATH.`;\n\tthrow new Error(message);\n}\n\nexport async function runVerificationCommand(input: RunVerificationCommandInput): Promise<VerificationCommandResult> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (input.signal?.aborted) {\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst startedAt = Date.now();\n\t\tconst child = spawn(input.command, input.args, {\n\t\t\tcwd: input.cwd,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\tenv: input.env ? { ...process.env, ...input.env } : process.env,\n\t\t});\n\n\t\tlet stdoutBytes = 0;\n\t\tlet stderrBytes = 0;\n\t\tlet captureTruncated = false;\n\t\tlet timedOut = false;\n\t\tlet aborted = false;\n\t\tlet settled = false;\n\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\n\t\tconst settle = (fn: () => void) => {\n\t\t\tif (!settled) {\n\t\t\t\tsettled = true;\n\t\t\t\tfn();\n\t\t\t}\n\t\t};\n\n\t\tconst timeoutHandle = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t}, Math.max(1_000, input.timeoutMs));\n\n\t\tconst onAbort = () => {\n\t\t\taborted = true;\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t};\n\t\tinput.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutHandle);\n\t\t\tinput.signal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\n\t\tchild.stdout.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst captured = captureChunk(chunk, stdoutChunks, stdoutBytes, DEFAULT_VERIFICATION_CAPTURE_BYTES);\n\t\t\tstdoutBytes = captured.nextBytes;\n\t\t\tcaptureTruncated = captureTruncated || captured.truncated;\n\t\t});\n\n\t\tchild.stderr.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst captured = captureChunk(chunk, stderrChunks, stderrBytes, DEFAULT_VERIFICATION_CAPTURE_BYTES);\n\t\t\tstderrBytes = captured.nextBytes;\n\t\t\tcaptureTruncated = captureTruncated || captured.truncated;\n\t\t});\n\n\t\tif (input.stdin !== undefined) {\n\t\t\tchild.stdin.write(input.stdin);\n\t\t}\n\t\tchild.stdin.end();\n\n\t\tchild.on(\"error\", (error) => {\n\t\t\tcleanup();\n\t\t\tsettle(() => reject(new Error(`Failed to run ${input.command}: ${error.message}`)));\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tcleanup();\n\t\t\tif (aborted) {\n\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (timedOut) {\n\t\t\t\tsettle(() => reject(new Error(`Command timed out after ${Math.round(input.timeoutMs / 1000)}s`)));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsettle(() =>\n\t\t\t\tresolve({\n\t\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n\t\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n\t\t\t\t\texitCode: code ?? -1,\n\t\t\t\t\tcaptureTruncated,\n\t\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t});\n}\n\nexport async function runVerificationCommandBatch(items: VerificationBatchItem[]): Promise<VerificationBatchResult[]> {\n\tconst results: VerificationBatchResult[] = [];\n\tfor (const item of items) {\n\t\tconst result = await runVerificationCommand(item);\n\t\tresults.push({\n\t\t\tkey: item.key,\n\t\t\tinput: item,\n\t\t\tresult,\n\t\t});\n\t}\n\treturn results;\n}\n\nexport function formatVerificationOutput(\n\tstdout: string,\n\tstderr: string,\n\tcaptureTruncated: boolean,\n\temptyOutputMessage: string,\n): VerificationOutputFormat {\n\tlet output = stdout.trimEnd();\n\tif (!output && stderr.trim().length > 0) {\n\t\toutput = stderr.trimEnd();\n\t}\n\tif (!output) {\n\t\toutput = emptyOutputMessage;\n\t}\n\n\tconst truncation = truncateHead(output);\n\tlet text = truncation.content;\n\tconst notices: string[] = [];\n\tif (truncation.truncated) {\n\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} output limit reached`);\n\t}\n\tif (captureTruncated) {\n\t\tnotices.push(`capture limit reached (${formatSize(DEFAULT_VERIFICATION_CAPTURE_BYTES)})`);\n\t}\n\tif (notices.length > 0) {\n\t\ttext += `\\n\\n[${notices.join(\". \")} · showing up to ${DEFAULT_MAX_LINES} lines]`;\n\t}\n\n\treturn {\n\t\ttext,\n\t\ttruncation: truncation.truncated ? truncation : undefined,\n\t};\n}\n"]}
@@ -0,0 +1,122 @@
1
+ import type { AgentMessage } from "@mariozechner/pi-agent-core";
2
+ export declare const ULTRATHINK_COMMAND = "ultrathink";
3
+ export declare const ULTRATHINK_DEFAULT_ITERATIONS = 5;
4
+ export declare const ULTRATHINK_MAX_ITERATIONS = 12;
5
+ export declare const ULTRATHINK_MAX_CHECKPOINT_CHARS = 2200;
6
+ export declare const ULTRATHINK_MAX_CONTEXT_MESSAGES = 8;
7
+ export declare const ULTRATHINK_MAX_CONTEXT_MESSAGE_CHARS = 260;
8
+ export declare const ULTRATHINK_MAX_EVIDENCE_ENTRIES = 12;
9
+ export declare const ULTRATHINK_VISIBLE_PROMPT_PREFIX = "Ultrathink iteration";
10
+ export declare const ULTRATHINK_NO_NEW_EVIDENCE_MARKER = "[NO_NEW_EVIDENCE_OK]";
11
+ export declare const ULTRATHINK_STAGNATION_LIMIT = 2;
12
+ export declare const ULTRATHINK_MAX_ITERATION_INPUT_TOKENS = 50000;
13
+ export declare const ULTRATHINK_MAX_RUN_INPUT_TOKENS = 180000;
14
+ export declare const ULTRATHINK_MAX_RUN_TOTAL_TOKENS = 220000;
15
+ export declare const ULTRATHINK_MAX_RUN_COST = 0.03;
16
+ export interface UltrathinkCommandConfig {
17
+ iterations: number;
18
+ query?: string;
19
+ }
20
+ export interface UltrathinkToolEvidence {
21
+ toolCallId: string;
22
+ toolName: string;
23
+ summary: string;
24
+ }
25
+ export interface UltrathinkEvidencePolicyResult {
26
+ hasNumericClaims: boolean;
27
+ hasEvidenceTags: boolean;
28
+ invalidEvidenceTags: string[];
29
+ missingEvidenceForNumbers: boolean;
30
+ needsNoNewEvidenceMarker: boolean;
31
+ hasNoNewEvidenceMarker: boolean;
32
+ }
33
+ export interface UltrathinkToolGroundingPolicyInput {
34
+ phase: UltrathinkPhase;
35
+ cumulativeEvidenceCount: number;
36
+ toolChecksThisIteration: number;
37
+ }
38
+ export type UltrathinkCommandParseResult = {
39
+ kind: "command";
40
+ command: UltrathinkCommandConfig;
41
+ } | {
42
+ kind: "error";
43
+ error: string;
44
+ usage: string;
45
+ };
46
+ export declare const ULTRATHINK_USAGE: string;
47
+ export type UltrathinkPhase = "Recon" | "Critique" | "Verify" | "Synthesis";
48
+ export declare const ULTRATHINK_CHECKPOINT_COMPRESSION_SYSTEM_PROMPT: string;
49
+ export declare function parseUltrathinkCommand(text: string): UltrathinkCommandParseResult | undefined;
50
+ export declare function getUltrathinkPhase(iteration: number, totalIterations: number): UltrathinkPhase;
51
+ export declare function resolveUltrathinkReadOnlyTools(activeToolNames: string[]): string[];
52
+ export declare function findLastMeaningfulUserIntent(messages: AgentMessage[]): string | undefined;
53
+ export declare function buildUltrathinkContextTail(messages: AgentMessage[]): string;
54
+ export declare function extractUltrathinkToolEvidence(messages: AgentMessage[]): UltrathinkToolEvidence[];
55
+ export declare function buildUltrathinkEvidenceCatalog(evidence: UltrathinkToolEvidence[]): string;
56
+ export declare function extractUltrathinkEvidenceTags(text: string): string[];
57
+ export declare function hasUltrathinkNoNewEvidenceMarker(text: string): boolean;
58
+ export declare function evaluateUltrathinkEvidencePolicy(input: {
59
+ text: string;
60
+ phase: UltrathinkPhase;
61
+ toolChecksThisIteration: number;
62
+ knownEvidenceIds: string[];
63
+ }): UltrathinkEvidencePolicyResult;
64
+ export declare function createInitialUltrathinkCheckpoint(objective: string): string;
65
+ export declare function normalizeUltrathinkCheckpoint(rawCheckpoint: string, objective: string): string;
66
+ export declare function truncateUltrathinkCheckpoint(checkpoint: string, maxChars: number): string;
67
+ export declare function extractUltrathinkIterationSummary(text: string): string;
68
+ export declare function extractUltrathinkCheckpoint(text: string): string | undefined;
69
+ export declare function buildUltrathinkIterationPrompt(input: {
70
+ iteration: number;
71
+ totalIterations: number;
72
+ phase: UltrathinkPhase;
73
+ objective: string;
74
+ checkpoint: string;
75
+ previousSummary?: string;
76
+ contextTail?: string;
77
+ evidenceCatalog?: string;
78
+ budgetStatus?: string;
79
+ }): string;
80
+ export declare function buildUltrathinkVisibleIterationPrompt(input: {
81
+ iteration: number;
82
+ totalIterations: number;
83
+ phase: UltrathinkPhase;
84
+ objective: string;
85
+ }): string;
86
+ export declare function buildUltrathinkBudgetStatusLine(input: {
87
+ accumulatedInputTokens: number;
88
+ accumulatedTotalTokens: number;
89
+ accumulatedCost: number;
90
+ }): string;
91
+ export declare function buildUltrathinkComplianceRepairPrompt(input: {
92
+ iteration: number;
93
+ totalIterations: number;
94
+ phase: UltrathinkPhase;
95
+ objective: string;
96
+ originalResponse: string;
97
+ issues: string[];
98
+ checkpoint: string;
99
+ evidenceCatalog?: string;
100
+ }): string;
101
+ export declare function shouldUltrathinkForceToolGrounding(input: UltrathinkToolGroundingPolicyInput): boolean;
102
+ export declare function buildUltrathinkToolGroundingPrompt(input: {
103
+ iteration: number;
104
+ totalIterations: number;
105
+ phase: UltrathinkPhase;
106
+ objective: string;
107
+ checkpoint: string;
108
+ availableReadOnlyTools: string[];
109
+ evidenceCatalog?: string;
110
+ }): string;
111
+ export declare function buildUltrathinkCheckpointCompressionPrompt(input: {
112
+ objective: string;
113
+ checkpoint: string;
114
+ maxChars: number;
115
+ }): string;
116
+ export declare function hasUltrathinkEvidenceViolations(policy: UltrathinkEvidencePolicyResult): boolean;
117
+ export declare function isUltrathinkStagnated(input: {
118
+ previousCheckpoint: string;
119
+ nextCheckpoint: string;
120
+ toolChecksThisIteration: number;
121
+ }): boolean;
122
+ //# sourceMappingURL=ultrathink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ultrathink.d.ts","sourceRoot":"","sources":["../../src/core/ultrathink.ts"],"names":[],"mappings":"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"}