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,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":"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","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,72 @@
|
|
|
1
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
2
|
+
import { type Static } from "@sinclair/typebox";
|
|
3
|
+
import type { ToolPermissionGuard } from "./permissions.js";
|
|
4
|
+
import { type TruncationResult } from "./truncate.js";
|
|
5
|
+
declare const webSearchSchema: import("@sinclair/typebox").TObject<{
|
|
6
|
+
query: import("@sinclair/typebox").TString;
|
|
7
|
+
max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
8
|
+
include_domains: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
9
|
+
exclude_domains: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
10
|
+
topic: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
12
|
+
search_depth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"basic">, import("@sinclair/typebox").TLiteral<"advanced">]>>;
|
|
13
|
+
timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
14
|
+
}>;
|
|
15
|
+
export type WebSearchToolInput = Static<typeof webSearchSchema>;
|
|
16
|
+
export type WebSearchProviderMode = "auto" | "tavily";
|
|
17
|
+
export type WebSearchFallbackMode = "searxng_ddg" | "searxng_only" | "none";
|
|
18
|
+
export type WebSearchSafeSearch = "off" | "moderate" | "strict";
|
|
19
|
+
export type WebSearchSearchDepth = "basic" | "advanced";
|
|
20
|
+
export type WebSearchProvider = "tavily" | "searxng" | "duckduckgo";
|
|
21
|
+
export type WebSearchAttemptStatus = "success" | "empty" | "error" | "skipped";
|
|
22
|
+
export declare const DEFAULT_WEB_SEARCH_MAX_RESULTS = 8;
|
|
23
|
+
export declare const DEFAULT_WEB_SEARCH_TIMEOUT_SECONDS = 20;
|
|
24
|
+
export interface WebSearchAttemptDetail {
|
|
25
|
+
provider: WebSearchProvider;
|
|
26
|
+
status: WebSearchAttemptStatus;
|
|
27
|
+
reason?: string;
|
|
28
|
+
resultCount?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface WebSearchToolDetails {
|
|
31
|
+
query: string;
|
|
32
|
+
provider: WebSearchProvider;
|
|
33
|
+
maxResults: number;
|
|
34
|
+
timeoutSeconds: number;
|
|
35
|
+
safeSearch: WebSearchSafeSearch;
|
|
36
|
+
providerMode: WebSearchProviderMode;
|
|
37
|
+
fallbackMode: WebSearchFallbackMode;
|
|
38
|
+
includeDomains: string[];
|
|
39
|
+
excludeDomains: string[];
|
|
40
|
+
attempts: WebSearchAttemptDetail[];
|
|
41
|
+
truncation?: TruncationResult;
|
|
42
|
+
}
|
|
43
|
+
export interface WebSearchRuntimeConfig {
|
|
44
|
+
enabled: boolean;
|
|
45
|
+
providerMode: WebSearchProviderMode;
|
|
46
|
+
fallbackMode: WebSearchFallbackMode;
|
|
47
|
+
safeSearch: WebSearchSafeSearch;
|
|
48
|
+
maxResults: number;
|
|
49
|
+
timeoutSeconds: number;
|
|
50
|
+
}
|
|
51
|
+
export interface WebSearchToolOptions {
|
|
52
|
+
fetchImpl?: typeof fetch;
|
|
53
|
+
permissionGuard?: ToolPermissionGuard;
|
|
54
|
+
resolveRuntimeConfig?: () => Partial<WebSearchRuntimeConfig> | WebSearchRuntimeConfig;
|
|
55
|
+
resolveTavilyApiKey?: () => string | undefined;
|
|
56
|
+
resolveSearxngBaseUrl?: () => string | undefined;
|
|
57
|
+
defaultMaxResults?: number;
|
|
58
|
+
defaultTimeoutSeconds?: number;
|
|
59
|
+
}
|
|
60
|
+
export declare function createWebSearchTool(cwd: string, options?: WebSearchToolOptions): AgentTool<typeof webSearchSchema>;
|
|
61
|
+
export declare const webSearchTool: AgentTool<import("@sinclair/typebox").TObject<{
|
|
62
|
+
query: import("@sinclair/typebox").TString;
|
|
63
|
+
max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
64
|
+
include_domains: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
65
|
+
exclude_domains: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
66
|
+
topic: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
67
|
+
days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
68
|
+
search_depth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"basic">, import("@sinclair/typebox").TLiteral<"advanced">]>>;
|
|
69
|
+
timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
70
|
+
}>, any>;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=web-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../../src/core/tools/web-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAwC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAE1G,QAAA,MAAM,eAAe;;;;;;;;;EAanB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,CAAC;AACtD,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;AAC5E,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,UAAU,CAAC;AACxD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AACpE,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/E,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,kCAAkC,KAAK,CAAC;AAmBrD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,mBAAmB,CAAC;IAChC,YAAY,EAAE,qBAAqB,CAAC;IACpC,YAAY,EAAE,qBAAqB,CAAC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,qBAAqB,CAAC;IACpC,YAAY,EAAE,qBAAqB,CAAC;IACpC,UAAU,EAAE,mBAAmB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;IACtF,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC/C,qBAAqB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAqgBD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC,OAAO,eAAe,CAAC,CAuQlH;AAED,eAAO,MAAM,aAAa;;;;;;;;;QAAqC,CAAC"}
|