@vetala/vetala 0.1.0-dev → 0.2.1-dev
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/README.md +31 -1
- package/dist/src/agent.d.ts +12 -1
- package/dist/src/agent.js +92 -14
- package/dist/src/agent.js.map +1 -1
- package/dist/src/app-meta.d.ts +3 -0
- package/dist/src/app-meta.js +4 -0
- package/dist/src/app-meta.js.map +1 -0
- package/dist/src/cli.js +28 -10
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +10 -1
- package/dist/src/config.js +160 -67
- package/dist/src/config.js.map +1 -1
- package/dist/src/edit-history.d.ts +4 -0
- package/dist/src/edit-history.js +77 -0
- package/dist/src/edit-history.js.map +1 -0
- package/dist/src/edits/diff.d.ts +1 -0
- package/dist/src/edits/diff.js +176 -0
- package/dist/src/edits/diff.js.map +1 -0
- package/dist/src/ink/command-suggestions.js +1 -0
- package/dist/src/ink/command-suggestions.js.map +1 -1
- package/dist/src/ink/ink-terminal-ui.d.ts +2 -2
- package/dist/src/ink/ink-terminal-ui.js +7 -3
- package/dist/src/ink/ink-terminal-ui.js.map +1 -1
- package/dist/src/ink/repl-app.d.ts +3 -2
- package/dist/src/ink/repl-app.js +419 -111
- package/dist/src/ink/repl-app.js.map +1 -1
- package/dist/src/process-utils.d.ts +1 -0
- package/dist/src/process-utils.js +3 -1
- package/dist/src/process-utils.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +29 -0
- package/dist/src/providers/catalog.js +121 -0
- package/dist/src/providers/catalog.js.map +1 -0
- package/dist/src/providers/index.d.ts +9 -0
- package/dist/src/providers/index.js +11 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/providers/openai-compatible-client.d.ts +23 -0
- package/dist/src/providers/openai-compatible-client.js +183 -0
- package/dist/src/providers/openai-compatible-client.js.map +1 -0
- package/dist/src/repl.d.ts +2 -1
- package/dist/src/repl.js +1 -1
- package/dist/src/repl.js.map +1 -1
- package/dist/src/runtime-profile.d.ts +16 -0
- package/dist/src/runtime-profile.js +112 -0
- package/dist/src/runtime-profile.js.map +1 -0
- package/dist/src/search-provider.d.ts +6 -1
- package/dist/src/search-provider.js +257 -0
- package/dist/src/search-provider.js.map +1 -1
- package/dist/src/session-store.d.ts +5 -3
- package/dist/src/session-store.js +75 -4
- package/dist/src/session-store.js.map +1 -1
- package/dist/src/terminal-ui.d.ts +3 -1
- package/dist/src/terminal-ui.js +13 -3
- package/dist/src/terminal-ui.js.map +1 -1
- package/dist/src/tools/filesystem.js +141 -143
- package/dist/src/tools/filesystem.js.map +1 -1
- package/dist/src/tools/index.js +2 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/repo-search.d.ts +23 -0
- package/dist/src/tools/repo-search.js +221 -0
- package/dist/src/tools/repo-search.js.map +1 -0
- package/dist/src/tools/shell.js +26 -3
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/timing.d.ts +2 -0
- package/dist/src/tools/timing.js +58 -0
- package/dist/src/tools/timing.js.map +1 -0
- package/dist/src/tools/web.js +70 -5
- package/dist/src/tools/web.js.map +1 -1
- package/dist/src/types.d.ts +89 -17
- package/dist/src/update-notifier.d.ts +41 -0
- package/dist/src/update-notifier.js +145 -0
- package/dist/src/update-notifier.js.map +1 -0
- package/package.json +13 -2
- package/terminal.png +0 -0
package/dist/src/tools/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { createGitTools } from "./git.js";
|
|
|
3
3
|
import { ToolRegistry } from "./registry.js";
|
|
4
4
|
import { createShellTools } from "./shell.js";
|
|
5
5
|
import { createSkillTools } from "./skill.js";
|
|
6
|
+
import { createTimingTools } from "./timing.js";
|
|
6
7
|
import { createWebToolsForConfig } from "./web.js";
|
|
7
8
|
export function createToolRegistry(options = {}) {
|
|
8
9
|
const registry = new ToolRegistry();
|
|
@@ -10,6 +11,7 @@ export function createToolRegistry(options = {}) {
|
|
|
10
11
|
for (const tool of [
|
|
11
12
|
...createFilesystemTools(),
|
|
12
13
|
...createShellTools(),
|
|
14
|
+
...createTimingTools(),
|
|
13
15
|
...createGitTools(),
|
|
14
16
|
...(options.skillRuntime ? createSkillTools(options.skillRuntime) : []),
|
|
15
17
|
...createWebToolsForConfig(includeWebSearch)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,UAG/B,EAAE;IACJ,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAE1D,KAAK,MAAM,IAAI,IAAI;QACjB,GAAG,qBAAqB,EAAE;QAC1B,GAAG,gBAAgB,EAAE;QACrB,GAAG,cAAc,EAAE;QACnB,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,uBAAuB,CAAC,gBAAgB,CAAC;KAC7C,EAAE,CAAC;QACF,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,UAG/B,EAAE;IACJ,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAE1D,KAAK,MAAM,IAAI,IAAI;QACjB,GAAG,qBAAqB,EAAE;QAC1B,GAAG,gBAAgB,EAAE;QACrB,GAAG,iBAAiB,EAAE;QACtB,GAAG,cAAc,EAAE;QACnB,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,uBAAuB,CAAC,gBAAgB,CAAC;KAC7C,EAAE,CAAC;QACF,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface RepoSearchMatch {
|
|
2
|
+
filePath: string;
|
|
3
|
+
lineNumber: number;
|
|
4
|
+
lineText: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RepoSearchOptions {
|
|
7
|
+
query: string;
|
|
8
|
+
target: string;
|
|
9
|
+
cwd: string;
|
|
10
|
+
limit: number;
|
|
11
|
+
mode?: "fixed" | "regex";
|
|
12
|
+
caseSensitive?: boolean;
|
|
13
|
+
globs?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface RepoSymbolSearchOptions {
|
|
16
|
+
symbol: string;
|
|
17
|
+
target: string;
|
|
18
|
+
cwd: string;
|
|
19
|
+
limit: number;
|
|
20
|
+
globs?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function searchRepo(options: RepoSearchOptions): Promise<RepoSearchMatch[]>;
|
|
23
|
+
export declare function searchRepoSymbol(options: RepoSymbolSearchOptions): Promise<RepoSearchMatch[]>;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { runExecFile } from "../process-utils.js";
|
|
4
|
+
const SKIP_DIRECTORIES = new Set([
|
|
5
|
+
".git",
|
|
6
|
+
".hg",
|
|
7
|
+
".svn",
|
|
8
|
+
".idea",
|
|
9
|
+
".vscode",
|
|
10
|
+
"node_modules",
|
|
11
|
+
"dist",
|
|
12
|
+
"build",
|
|
13
|
+
"coverage"
|
|
14
|
+
]);
|
|
15
|
+
export async function searchRepo(options) {
|
|
16
|
+
const globs = options.globs?.filter((value) => value.length > 0) ?? [];
|
|
17
|
+
try {
|
|
18
|
+
const result = await runExecFile("rg", buildRgArgs({
|
|
19
|
+
...options,
|
|
20
|
+
globs
|
|
21
|
+
}), { cwd: options.cwd });
|
|
22
|
+
return parseSearchMatches(`${result.stdout}${result.stderr}`, options.limit);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (!isMissingBinary(error)) {
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
return fallbackSearch({
|
|
29
|
+
...options,
|
|
30
|
+
globs
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function searchRepoSymbol(options) {
|
|
35
|
+
const symbolRegex = `\\b${escapeRegex(options.symbol)}\\b`;
|
|
36
|
+
const candidates = await searchRepo({
|
|
37
|
+
query: symbolRegex,
|
|
38
|
+
target: options.target,
|
|
39
|
+
cwd: options.cwd,
|
|
40
|
+
limit: Math.max(options.limit * 6, options.limit),
|
|
41
|
+
mode: "regex",
|
|
42
|
+
caseSensitive: true,
|
|
43
|
+
globs: options.globs ?? []
|
|
44
|
+
});
|
|
45
|
+
return candidates
|
|
46
|
+
.sort((left, right) => {
|
|
47
|
+
const scoreDelta = scoreSymbolLine(right.lineText, options.symbol) - scoreSymbolLine(left.lineText, options.symbol);
|
|
48
|
+
if (scoreDelta !== 0) {
|
|
49
|
+
return scoreDelta;
|
|
50
|
+
}
|
|
51
|
+
const fileDelta = left.filePath.localeCompare(right.filePath);
|
|
52
|
+
return fileDelta !== 0 ? fileDelta : left.lineNumber - right.lineNumber;
|
|
53
|
+
})
|
|
54
|
+
.slice(0, options.limit);
|
|
55
|
+
}
|
|
56
|
+
function buildRgArgs(options) {
|
|
57
|
+
const args = [
|
|
58
|
+
"--line-number",
|
|
59
|
+
"--no-heading",
|
|
60
|
+
"--color",
|
|
61
|
+
"never",
|
|
62
|
+
"--max-count",
|
|
63
|
+
String(options.limit),
|
|
64
|
+
"--glob",
|
|
65
|
+
"!.git/",
|
|
66
|
+
"--glob",
|
|
67
|
+
"!node_modules/"
|
|
68
|
+
];
|
|
69
|
+
if (options.mode !== "regex") {
|
|
70
|
+
args.push("--fixed-strings");
|
|
71
|
+
}
|
|
72
|
+
args.push(options.caseSensitive === true ? "--case-sensitive" : "--smart-case");
|
|
73
|
+
for (const glob of options.globs) {
|
|
74
|
+
args.push("--glob", glob);
|
|
75
|
+
}
|
|
76
|
+
args.push(options.query, options.target);
|
|
77
|
+
return args;
|
|
78
|
+
}
|
|
79
|
+
function parseSearchMatches(output, limit) {
|
|
80
|
+
const matches = [];
|
|
81
|
+
for (const line of output.split(/\r?\n/)) {
|
|
82
|
+
if (!line.trim()) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const match = line.match(/^(.*?):(\d+):(.*)$/);
|
|
86
|
+
if (!match) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
matches.push({
|
|
90
|
+
filePath: match[1] ?? "",
|
|
91
|
+
lineNumber: Number(match[2]),
|
|
92
|
+
lineText: match[3] ?? ""
|
|
93
|
+
});
|
|
94
|
+
if (matches.length >= limit) {
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return matches;
|
|
99
|
+
}
|
|
100
|
+
async function fallbackSearch(options) {
|
|
101
|
+
const matches = [];
|
|
102
|
+
const targetStats = await stat(options.target);
|
|
103
|
+
if (targetStats.isFile()) {
|
|
104
|
+
await searchFile(options, options.target, matches);
|
|
105
|
+
return matches;
|
|
106
|
+
}
|
|
107
|
+
const queue = [options.target];
|
|
108
|
+
while (queue.length > 0 && matches.length < options.limit) {
|
|
109
|
+
const current = queue.shift();
|
|
110
|
+
if (!current) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
if (matches.length >= options.limit) {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
if (entry.isDirectory() && shouldSkipDirectory(entry.name)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const entryPath = path.join(current, entry.name);
|
|
122
|
+
if (entry.isDirectory()) {
|
|
123
|
+
queue.push(entryPath);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (entry.isFile() && matchesGlob(entryPath, options.globs)) {
|
|
127
|
+
await searchFile(options, entryPath, matches);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return matches;
|
|
132
|
+
}
|
|
133
|
+
async function searchFile(options, filePath, matches) {
|
|
134
|
+
try {
|
|
135
|
+
const content = await readFile(filePath);
|
|
136
|
+
if (content.includes(0)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const text = content.toString("utf8");
|
|
140
|
+
const lines = text.split("\n");
|
|
141
|
+
const matcher = buildMatcher(options);
|
|
142
|
+
for (const [index, line] of lines.entries()) {
|
|
143
|
+
if (!matcher(line)) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
matches.push({
|
|
147
|
+
filePath,
|
|
148
|
+
lineNumber: index + 1,
|
|
149
|
+
lineText: line
|
|
150
|
+
});
|
|
151
|
+
if (matches.length >= options.limit) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Skip unreadable files in the fallback path.
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function buildMatcher(options) {
|
|
161
|
+
if (options.mode === "regex") {
|
|
162
|
+
const flags = options.caseSensitive === true ? "" : "i";
|
|
163
|
+
const pattern = new RegExp(options.query, flags);
|
|
164
|
+
return (line) => pattern.test(line);
|
|
165
|
+
}
|
|
166
|
+
const needle = options.caseSensitive === true ? options.query : options.query.toLowerCase();
|
|
167
|
+
return (line) => {
|
|
168
|
+
const haystack = options.caseSensitive === true ? line : line.toLowerCase();
|
|
169
|
+
return haystack.includes(needle);
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function shouldSkipDirectory(name) {
|
|
173
|
+
return name.startsWith(".") || SKIP_DIRECTORIES.has(name);
|
|
174
|
+
}
|
|
175
|
+
function scoreSymbolLine(lineText, symbol) {
|
|
176
|
+
const trimmed = lineText.trim();
|
|
177
|
+
const exactName = escapeRegex(symbol);
|
|
178
|
+
const definitionPatterns = [
|
|
179
|
+
new RegExp(`^(export\\s+)?(async\\s+)?function\\s+${exactName}\\b`),
|
|
180
|
+
new RegExp(`^(export\\s+)?class\\s+${exactName}\\b`),
|
|
181
|
+
new RegExp(`^(export\\s+)?interface\\s+${exactName}\\b`),
|
|
182
|
+
new RegExp(`^(export\\s+)?type\\s+${exactName}\\b`),
|
|
183
|
+
new RegExp(`^(export\\s+)?enum\\s+${exactName}\\b`),
|
|
184
|
+
new RegExp(`^(export\\s+)?(const|let|var)\\s+${exactName}\\b`),
|
|
185
|
+
new RegExp(`^fn\\s+${exactName}\\b`),
|
|
186
|
+
new RegExp(`^struct\\s+${exactName}\\b`),
|
|
187
|
+
new RegExp(`^trait\\s+${exactName}\\b`)
|
|
188
|
+
];
|
|
189
|
+
for (const [index, pattern] of definitionPatterns.entries()) {
|
|
190
|
+
if (pattern.test(trimmed)) {
|
|
191
|
+
return 100 - index;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (new RegExp(`\\b${exactName}\\s*[:=]\\s*(async\\s*)?\\(`).test(trimmed)) {
|
|
195
|
+
return 80;
|
|
196
|
+
}
|
|
197
|
+
if (new RegExp(`\\b${exactName}\\b`).test(trimmed)) {
|
|
198
|
+
return trimmed.includes("export ") ? 60 : 40;
|
|
199
|
+
}
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
function matchesGlob(filePath, globs) {
|
|
203
|
+
if (globs.length === 0) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
const normalized = filePath.split(path.sep).join("/");
|
|
207
|
+
return globs.some((glob) => {
|
|
208
|
+
const escaped = glob
|
|
209
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
210
|
+
.replace(/\*\*/g, ".*")
|
|
211
|
+
.replace(/\*/g, "[^/]*");
|
|
212
|
+
return new RegExp(`^${escaped}$`).test(normalized) || new RegExp(`/${escaped}$`).test(normalized);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function escapeRegex(value) {
|
|
216
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
217
|
+
}
|
|
218
|
+
function isMissingBinary(error) {
|
|
219
|
+
return error !== null && typeof error === "object" && "code" in error && error.code === "ENOENT";
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=repo-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-search.js","sourceRoot":"","sources":["../../../src/tools/repo-search.ts"],"names":[],"mappings":"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"}
|
package/dist/src/tools/shell.js
CHANGED
|
@@ -18,6 +18,7 @@ const READ_ONLY_COMMANDS = new Set([
|
|
|
18
18
|
"which"
|
|
19
19
|
]);
|
|
20
20
|
const ALLOWED_GIT_SUBCOMMANDS = new Set(["branch", "diff", "log", "rev-parse", "show", "status"]);
|
|
21
|
+
const MAX_SHELL_TIMEOUT_MS = 300_000;
|
|
21
22
|
export function createShellTools() {
|
|
22
23
|
return [runShellTool, bashTool];
|
|
23
24
|
}
|
|
@@ -30,6 +31,10 @@ const runShellTool = {
|
|
|
30
31
|
command: {
|
|
31
32
|
type: "string",
|
|
32
33
|
description: "Shell command to execute."
|
|
34
|
+
},
|
|
35
|
+
timeout_ms: {
|
|
36
|
+
type: "integer",
|
|
37
|
+
description: "Optional command timeout in milliseconds. Use this for slower builds/tests. Maximum 300000."
|
|
33
38
|
}
|
|
34
39
|
},
|
|
35
40
|
required: ["command"],
|
|
@@ -39,6 +44,7 @@ const runShellTool = {
|
|
|
39
44
|
async execute(rawArgs, context) {
|
|
40
45
|
const args = expectObject(rawArgs);
|
|
41
46
|
const command = requiredString(args.command, "command");
|
|
47
|
+
const timeoutMs = optionalTimeoutMs(args.timeout_ms);
|
|
42
48
|
if (!isReadOnlyCommand(command)) {
|
|
43
49
|
const approved = await context.approvals.requestApproval({
|
|
44
50
|
kind: "run_shell",
|
|
@@ -53,12 +59,20 @@ const runShellTool = {
|
|
|
53
59
|
};
|
|
54
60
|
}
|
|
55
61
|
}
|
|
56
|
-
const result = await runShellCommand(command, {
|
|
62
|
+
const result = await runShellCommand(command, {
|
|
63
|
+
cwd: context.workspaceRoot,
|
|
64
|
+
...(timeoutMs ? { timeoutMs } : {})
|
|
65
|
+
});
|
|
57
66
|
const rendered = [result.stdout.trim(), result.stderr.trim()].filter(Boolean).join("\n");
|
|
67
|
+
const summary = result.timedOut
|
|
68
|
+
? `Command timed out after ${timeoutMs ?? 30_000} ms`
|
|
69
|
+
: result.signal
|
|
70
|
+
? `Command terminated by signal ${result.signal}`
|
|
71
|
+
: `Command finished with exit code ${result.exitCode ?? "null"}`;
|
|
58
72
|
return {
|
|
59
|
-
summary
|
|
73
|
+
summary,
|
|
60
74
|
content: rendered || "(no output)",
|
|
61
|
-
isError: (result.exitCode ?? 1) !== 0
|
|
75
|
+
isError: result.timedOut || (result.exitCode ?? 1) !== 0
|
|
62
76
|
};
|
|
63
77
|
}
|
|
64
78
|
};
|
|
@@ -94,4 +108,13 @@ function requiredString(value, key) {
|
|
|
94
108
|
}
|
|
95
109
|
throw new Error(`Missing string argument: ${key}`);
|
|
96
110
|
}
|
|
111
|
+
function optionalTimeoutMs(value) {
|
|
112
|
+
if (value === undefined) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
if (!Number.isInteger(value) || typeof value !== "number" || value <= 0) {
|
|
116
|
+
throw new Error("timeout_ms must be a positive integer.");
|
|
117
|
+
}
|
|
118
|
+
return Math.min(value, MAX_SHELL_TIMEOUT_MS);
|
|
119
|
+
}
|
|
97
120
|
//# sourceMappingURL=shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,MAAM;IACN,MAAM;IACN,IAAI;IACJ,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const MAX_SLEEP_MS = 60_000;
|
|
2
|
+
export function createTimingTools() {
|
|
3
|
+
return [sleepTool];
|
|
4
|
+
}
|
|
5
|
+
const sleepTool = {
|
|
6
|
+
name: "sleep",
|
|
7
|
+
description: "Pause briefly before the next tool call. Useful after starting a background process or waiting for generated files or logs.",
|
|
8
|
+
jsonSchema: {
|
|
9
|
+
type: "object",
|
|
10
|
+
properties: {
|
|
11
|
+
seconds: {
|
|
12
|
+
type: "number",
|
|
13
|
+
description: "How long to wait in seconds. Maximum 60 seconds."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
required: ["seconds"],
|
|
17
|
+
additionalProperties: false
|
|
18
|
+
},
|
|
19
|
+
readOnly: true,
|
|
20
|
+
async execute(rawArgs) {
|
|
21
|
+
const args = expectObject(rawArgs);
|
|
22
|
+
const seconds = requiredNumber(args.seconds, "seconds");
|
|
23
|
+
const sleepMs = clampSleepMs(seconds);
|
|
24
|
+
await delay(sleepMs);
|
|
25
|
+
return {
|
|
26
|
+
summary: `Waited ${formatSleepSeconds(sleepMs / 1000)} seconds`,
|
|
27
|
+
content: `Paused for ${formatSleepSeconds(sleepMs / 1000)} seconds.`,
|
|
28
|
+
isError: false
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
function expectObject(value) {
|
|
33
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
throw new Error("Tool arguments must be a JSON object.");
|
|
37
|
+
}
|
|
38
|
+
function requiredNumber(value, key) {
|
|
39
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Missing numeric argument: ${key}`);
|
|
43
|
+
}
|
|
44
|
+
function clampSleepMs(seconds) {
|
|
45
|
+
if (seconds <= 0) {
|
|
46
|
+
throw new Error("seconds must be greater than 0.");
|
|
47
|
+
}
|
|
48
|
+
return Math.min(MAX_SLEEP_MS, Math.round(seconds * 1000));
|
|
49
|
+
}
|
|
50
|
+
function delay(milliseconds) {
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
setTimeout(resolve, milliseconds);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function formatSleepSeconds(seconds) {
|
|
56
|
+
return Number.isInteger(seconds) ? String(seconds) : seconds.toFixed(1);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../../src/tools/timing.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,SAAS,GAAa;IAC1B,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,6HAA6H;IAC1I,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kDAAkD;aAChE;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,oBAAoB,EAAE,KAAK;KAC5B;IACD,QAAQ,EAAE,IAAI;IACd,KAAK,CAAC,OAAO,CAAC,OAAO;QACnB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QAErB,OAAO;YACL,OAAO,EAAE,UAAU,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU;YAC/D,OAAO,EAAE,cAAc,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW;YACpE,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,KAAgC,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,GAAW;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC"}
|
package/dist/src/tools/web.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { createSearchProvider, normalizeSearchProviderName } from "../search-provider.js";
|
|
1
2
|
const FETCH_TIMEOUT_MS = 20_000;
|
|
2
3
|
const MAX_FETCH_CONTENT = 12_000;
|
|
3
4
|
export function createWebTools() {
|
|
4
|
-
return [fetchUrlTool, webSearchTool];
|
|
5
|
+
return [fetchUrlTool, webSearchTool, stackOverflowSearchTool];
|
|
5
6
|
}
|
|
6
7
|
export function createWebToolsForConfig(includeSearchTool) {
|
|
7
|
-
return includeSearchTool ? [fetchUrlTool, webSearchTool] : [fetchUrlTool];
|
|
8
|
+
return includeSearchTool ? [fetchUrlTool, webSearchTool, stackOverflowSearchTool] : [fetchUrlTool];
|
|
8
9
|
}
|
|
9
10
|
const fetchUrlTool = {
|
|
10
11
|
name: "fetch_url",
|
|
@@ -59,7 +60,7 @@ const fetchUrlTool = {
|
|
|
59
60
|
};
|
|
60
61
|
const webSearchTool = {
|
|
61
62
|
name: "web_search",
|
|
62
|
-
description: "Search the web
|
|
63
|
+
description: "Search the web after web access is approved. Uses the configured provider by default and can be overridden per query.",
|
|
63
64
|
jsonSchema: {
|
|
64
65
|
type: "object",
|
|
65
66
|
properties: {
|
|
@@ -70,6 +71,10 @@ const webSearchTool = {
|
|
|
70
71
|
limit: {
|
|
71
72
|
type: "integer",
|
|
72
73
|
description: "Maximum number of results to return. Defaults to 5."
|
|
74
|
+
},
|
|
75
|
+
provider: {
|
|
76
|
+
type: "string",
|
|
77
|
+
description: "Optional override provider: duckduckgo, brave, bing, or stack_overflow."
|
|
73
78
|
}
|
|
74
79
|
},
|
|
75
80
|
required: ["query"],
|
|
@@ -80,13 +85,14 @@ const webSearchTool = {
|
|
|
80
85
|
const args = expectObject(rawArgs);
|
|
81
86
|
const query = requiredString(args.query, "query");
|
|
82
87
|
const limit = typeof args.limit === "number" && Number.isInteger(args.limit) ? args.limit : 5;
|
|
88
|
+
const provider = resolveSearchProvider(args.provider, context);
|
|
83
89
|
if (!await context.approvals.ensureWebAccess()) {
|
|
84
90
|
return denied("Web access denied.");
|
|
85
91
|
}
|
|
86
92
|
try {
|
|
87
|
-
const results = await
|
|
93
|
+
const results = await provider.search(query, limit);
|
|
88
94
|
return {
|
|
89
|
-
summary: `Returned ${results.length} search results`,
|
|
95
|
+
summary: `Returned ${results.length} search results from ${provider.name}`,
|
|
90
96
|
content: results
|
|
91
97
|
.map((result, index) => `${index + 1}. ${result.title}\n${result.url}\n${result.snippet}`)
|
|
92
98
|
.join("\n\n"),
|
|
@@ -102,6 +108,52 @@ const webSearchTool = {
|
|
|
102
108
|
}
|
|
103
109
|
}
|
|
104
110
|
};
|
|
111
|
+
const stackOverflowSearchTool = {
|
|
112
|
+
name: "stack_overflow_search",
|
|
113
|
+
description: "Search Stack Overflow for programming questions after web access is approved.",
|
|
114
|
+
jsonSchema: {
|
|
115
|
+
type: "object",
|
|
116
|
+
properties: {
|
|
117
|
+
query: {
|
|
118
|
+
type: "string",
|
|
119
|
+
description: "Programming search query."
|
|
120
|
+
},
|
|
121
|
+
limit: {
|
|
122
|
+
type: "integer",
|
|
123
|
+
description: "Maximum number of results to return. Defaults to 5."
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
required: ["query"],
|
|
127
|
+
additionalProperties: false
|
|
128
|
+
},
|
|
129
|
+
readOnly: true,
|
|
130
|
+
async execute(rawArgs, context) {
|
|
131
|
+
const args = expectObject(rawArgs);
|
|
132
|
+
const query = requiredString(args.query, "query");
|
|
133
|
+
const limit = typeof args.limit === "number" && Number.isInteger(args.limit) ? args.limit : 5;
|
|
134
|
+
if (!await context.approvals.ensureWebAccess()) {
|
|
135
|
+
return denied("Web access denied.");
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const provider = createSearchProvider("stack_overflow");
|
|
139
|
+
const results = await provider.search(query, limit);
|
|
140
|
+
return {
|
|
141
|
+
summary: `Returned ${results.length} Stack Overflow results`,
|
|
142
|
+
content: results
|
|
143
|
+
.map((result, index) => `${index + 1}. ${result.title}\n${result.url}\n${result.snippet}`)
|
|
144
|
+
.join("\n\n"),
|
|
145
|
+
isError: false
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return {
|
|
150
|
+
summary: "Stack Overflow search error",
|
|
151
|
+
content: error instanceof Error ? error.message : String(error),
|
|
152
|
+
isError: true
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
105
157
|
function expectObject(value) {
|
|
106
158
|
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
107
159
|
return value;
|
|
@@ -121,6 +173,19 @@ function denied(message) {
|
|
|
121
173
|
isError: true
|
|
122
174
|
};
|
|
123
175
|
}
|
|
176
|
+
function resolveSearchProvider(value, context) {
|
|
177
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
178
|
+
const override = normalizeSearchProviderName(value);
|
|
179
|
+
if (!override) {
|
|
180
|
+
throw new Error(`Unknown search provider: ${value}`);
|
|
181
|
+
}
|
|
182
|
+
if (override === "disabled") {
|
|
183
|
+
return context.searchProvider;
|
|
184
|
+
}
|
|
185
|
+
return createSearchProvider(override);
|
|
186
|
+
}
|
|
187
|
+
return context.searchProvider;
|
|
188
|
+
}
|
|
124
189
|
function renderFetchedBody(body, contentType) {
|
|
125
190
|
if (contentType.includes("application/json")) {
|
|
126
191
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/tools/web.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/tools/web.ts"],"names":[],"mappings":"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"}
|