zelari-code 0.7.9 → 0.7.11
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/LICENSE +37 -37
- package/README.md +320 -295
- package/bin/zelari-code.js +62 -62
- package/dist/cli/app.js +33 -3
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/components/LiveRegion.js +7 -3
- package/dist/cli/components/LiveRegion.js.map +1 -1
- package/dist/cli/components/SelectList.js +67 -0
- package/dist/cli/components/SelectList.js.map +1 -0
- package/dist/cli/components/Spinner.js +51 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/SplashScreen.js +85 -85
- package/dist/cli/components/StatusBar.js +42 -34
- package/dist/cli/components/StatusBar.js.map +1 -1
- package/dist/cli/headless.js +10 -10
- package/dist/cli/hooks/useSlashDispatch.js +11 -1
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
- package/dist/cli/keyStore.js +2 -2
- package/dist/cli/keyStore.js.map +1 -1
- package/dist/cli/main.bundled.js +15146 -14919
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +1 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/modelDiscovery.js +42 -5
- package/dist/cli/modelDiscovery.js.map +1 -1
- package/dist/cli/provider/openai-compatible.js +4 -2
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/slashCommands.js +22 -5
- package/dist/cli/slashCommands.js.map +1 -1
- package/dist/cli/slashHandlers/provider.js +102 -5
- package/dist/cli/slashHandlers/provider.js.map +1 -1
- package/package.json +2 -2
- package/dist/agents/advancedTools.js +0 -115
- package/dist/agents/advancedTools.js.map +0 -1
- package/dist/agents/councilApi.js +0 -375
- package/dist/agents/councilApi.js.map +0 -1
- package/dist/agents/councilDirectives.js +0 -100
- package/dist/agents/councilDirectives.js.map +0 -1
- package/dist/agents/promoteMember.js +0 -210
- package/dist/agents/promoteMember.js.map +0 -1
- package/dist/agents/promptModules.js +0 -139
- package/dist/agents/promptModules.js.map +0 -1
- package/dist/agents/roles.js +0 -299
- package/dist/agents/roles.js.map +0 -1
- package/dist/agents/skills/builtin/debugging.js +0 -248
- package/dist/agents/skills/builtin/debugging.js.map +0 -1
- package/dist/agents/skills/builtin/docs.js +0 -301
- package/dist/agents/skills/builtin/docs.js.map +0 -1
- package/dist/agents/skills/builtin/git-ops.js +0 -301
- package/dist/agents/skills/builtin/git-ops.js.map +0 -1
- package/dist/agents/skills/builtin/planning.js +0 -335
- package/dist/agents/skills/builtin/planning.js.map +0 -1
- package/dist/agents/skills/builtin/refactoring.js +0 -261
- package/dist/agents/skills/builtin/refactoring.js.map +0 -1
- package/dist/agents/skills/builtin/review.js +0 -302
- package/dist/agents/skills/builtin/review.js.map +0 -1
- package/dist/agents/skills/builtin/testing.js +0 -245
- package/dist/agents/skills/builtin/testing.js.map +0 -1
- package/dist/agents/skills.js +0 -272
- package/dist/agents/skills.js.map +0 -1
- package/dist/agents/systemPromptBuilder.js +0 -151
- package/dist/agents/systemPromptBuilder.js.map +0 -1
- package/dist/agents/toolSchemas.js +0 -249
- package/dist/agents/toolSchemas.js.map +0 -1
- package/dist/agents/tools.js +0 -196
- package/dist/agents/tools.js.map +0 -1
- package/dist/agents/vaultTools.js +0 -134
- package/dist/agents/vaultTools.js.map +0 -1
- package/dist/cli/components/CollapsibleToolOutput.js +0 -43
- package/dist/cli/components/CollapsibleToolOutput.js.map +0 -1
- package/dist/cli/components/Header.js +0 -38
- package/dist/cli/components/Header.js.map +0 -1
- package/dist/main/core/AgentHarness.js +0 -467
- package/dist/main/core/AgentHarness.js.map +0 -1
- package/dist/main/core/providerStream.js +0 -99
- package/dist/main/core/providerStream.js.map +0 -1
- package/dist/main/core/sessionJsonl.js +0 -99
- package/dist/main/core/sessionJsonl.js.map +0 -1
- package/dist/main/core/tools/auditLog.js +0 -26
- package/dist/main/core/tools/auditLog.js.map +0 -1
- package/dist/main/core/tools/builtin/filesystem.js +0 -110
- package/dist/main/core/tools/builtin/filesystem.js.map +0 -1
- package/dist/main/core/tools/builtin/listFiles.js +0 -86
- package/dist/main/core/tools/builtin/listFiles.js.map +0 -1
- package/dist/main/core/tools/builtin/search.js +0 -56
- package/dist/main/core/tools/builtin/search.js.map +0 -1
- package/dist/main/core/tools/builtin/shell.js +0 -51
- package/dist/main/core/tools/builtin/shell.js.map +0 -1
- package/dist/main/core/tools/registry.js +0 -71
- package/dist/main/core/tools/registry.js.map +0 -1
- package/dist/main/core/tools/toolTypes.js +0 -8
- package/dist/main/core/tools/toolTypes.js.map +0 -1
- package/dist/main/core/tools/zodBridge.js +0 -56
- package/dist/main/core/tools/zodBridge.js.map +0 -1
- package/dist/shared/eventBus.js +0 -104
- package/dist/shared/eventBus.js.map +0 -1
- package/dist/shared/events.js +0 -73
- package/dist/shared/events.js.map +0 -1
- package/dist/shared/index.js +0 -8
- package/dist/shared/index.js.map +0 -1
- package/dist/types/context.js +0 -3
- package/dist/types/context.js.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/types/knowledge.js +0 -2
- package/dist/types/knowledge.js.map +0 -1
- package/dist/types/systemTypes.js +0 -10
- package/dist/types/systemTypes.js.map +0 -1
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* sessionJsonl — append-only JSONL sidecar writer for a single agent session.
|
|
3
|
-
*
|
|
4
|
-
* Every {@link BrainEvent} is appended as one JSON object per line so the raw
|
|
5
|
-
* session transcript can be inspected with `cat`, `jq`, or any text editor.
|
|
6
|
-
* Each session gets its own file under `<baseDir>/<sessionId>.jsonl`.
|
|
7
|
-
*
|
|
8
|
-
* Pure `node:fs` — zero Electron deps, so this module is browser-importable
|
|
9
|
-
* for jsdom tests. The main-process caller passes `<userData>/sessions` as
|
|
10
|
-
* `baseDir`; tests pass a temp dir.
|
|
11
|
-
*
|
|
12
|
-
* @see docs/plans/2026-06-28-zelari-code.md (Task 12.3)
|
|
13
|
-
*/
|
|
14
|
-
import { promises as fs } from 'node:fs';
|
|
15
|
-
import path from 'node:path';
|
|
16
|
-
import os from 'node:os';
|
|
17
|
-
/**
|
|
18
|
-
* Append-only JSONL writer for a single session.
|
|
19
|
-
*
|
|
20
|
-
* One JSON object per line, shape:
|
|
21
|
-
* {"ts": <epoch-ms>, "sessionId": "<uuid>", "event": { ...BrainEvent }}
|
|
22
|
-
*
|
|
23
|
-
* The writer is line-buffered: every `append()` flushes synchronously
|
|
24
|
-
* to ensure no events are lost on crash. Uses O_APPEND for atomicity.
|
|
25
|
-
*
|
|
26
|
-
* Malformed lines on read are skipped (with a warning) so the file is
|
|
27
|
-
* always recoverable via `readSession()`.
|
|
28
|
-
*/
|
|
29
|
-
export class SessionJsonlWriter {
|
|
30
|
-
filePath;
|
|
31
|
-
onError;
|
|
32
|
-
constructor(sessionId, options = {}) {
|
|
33
|
-
const baseDir = options.baseDir ?? defaultBaseDir();
|
|
34
|
-
this.filePath = path.join(baseDir, `${sessionId}.jsonl`);
|
|
35
|
-
this.onError = options.onError ?? console.error;
|
|
36
|
-
}
|
|
37
|
-
/** Absolute path to the session JSONL file. */
|
|
38
|
-
get path() {
|
|
39
|
-
return this.filePath;
|
|
40
|
-
}
|
|
41
|
-
/** Append a BrainEvent as one JSON line. Creates the file + parent dirs if missing. */
|
|
42
|
-
async append(event) {
|
|
43
|
-
try {
|
|
44
|
-
await fs.mkdir(path.dirname(this.filePath), { recursive: true });
|
|
45
|
-
const line = JSON.stringify({
|
|
46
|
-
ts: event.ts,
|
|
47
|
-
sessionId: event.sessionId,
|
|
48
|
-
event,
|
|
49
|
-
}) + '\n';
|
|
50
|
-
await fs.appendFile(this.filePath, line, { encoding: 'utf-8', mode: 0o644 });
|
|
51
|
-
}
|
|
52
|
-
catch (err) {
|
|
53
|
-
this.onError(`[sessionJsonl] failed to append event to ${this.filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/** Close the writer (no-op currently, but reserved for future buffered mode). */
|
|
57
|
-
async close() {
|
|
58
|
-
// No buffered state to flush yet.
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Read all events from a session JSONL file. Malformed lines are skipped.
|
|
63
|
-
* Returns an empty array if the file does not exist.
|
|
64
|
-
*/
|
|
65
|
-
export async function readSession(filePath) {
|
|
66
|
-
try {
|
|
67
|
-
const content = await fs.readFile(filePath, 'utf-8');
|
|
68
|
-
const events = [];
|
|
69
|
-
for (const line of content.split('\n')) {
|
|
70
|
-
const trimmed = line.trim();
|
|
71
|
-
if (!trimmed)
|
|
72
|
-
continue;
|
|
73
|
-
try {
|
|
74
|
-
const parsed = JSON.parse(trimmed);
|
|
75
|
-
if (parsed && typeof parsed === 'object' && 'event' in parsed) {
|
|
76
|
-
events.push(parsed.event);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Skip malformed lines silently.
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return events;
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
if (err.code === 'ENOENT')
|
|
87
|
-
return [];
|
|
88
|
-
throw err;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/** Default base directory: `<userData>/sessions/` (resolved at runtime via electron.app).
|
|
92
|
-
* In test environments, override via `new SessionJsonlWriter(id, { baseDir: '/tmp/test' })`. */
|
|
93
|
-
function defaultBaseDir() {
|
|
94
|
-
// We can't import 'electron' here (this module is browser-importable for tests).
|
|
95
|
-
// The caller must pass baseDir explicitly OR we use a sensible fallback.
|
|
96
|
-
// In main process, the AgentHarness caller will pass `<userData>/sessions`.
|
|
97
|
-
return path.join(os.tmpdir(), 'zelari-code', 'sessions');
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=sessionJsonl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionJsonl.js","sourceRoot":"","sources":["../../../src/main/core/sessionJsonl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/** In-memory audit log (last N entries). Persisting to disk is a follow-up. */
|
|
2
|
-
export class AuditLog {
|
|
3
|
-
entries = [];
|
|
4
|
-
maxEntries;
|
|
5
|
-
constructor(maxEntries = 1000) {
|
|
6
|
-
this.maxEntries = maxEntries;
|
|
7
|
-
}
|
|
8
|
-
record(entry) {
|
|
9
|
-
this.entries.push(entry);
|
|
10
|
-
if (this.entries.length > this.maxEntries) {
|
|
11
|
-
this.entries.shift();
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
/** Return the last N entries (most recent last). */
|
|
15
|
-
recent(n = 50) {
|
|
16
|
-
return this.entries.slice(-n);
|
|
17
|
-
}
|
|
18
|
-
/** Filter by sessionId. */
|
|
19
|
-
bySession(sessionId) {
|
|
20
|
-
return this.entries.filter((e) => e.sessionId === sessionId);
|
|
21
|
-
}
|
|
22
|
-
clear() {
|
|
23
|
-
this.entries = [];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=auditLog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auditLog.js","sourceRoot":"","sources":["../../../../src/main/core/tools/auditLog.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,OAAO,QAAQ;IACX,OAAO,GAAiB,EAAE,CAAC;IAC3B,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,IAAI;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAiB;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,CAAC,CAAC,GAAG,EAAE;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { promises as fs } from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { typedOk, typedErr } from '../toolTypes.js';
|
|
5
|
-
const ReadFileArgsSchema = z.object({
|
|
6
|
-
path: z.string().min(1),
|
|
7
|
-
startLine: z.number().int().nonnegative().optional(),
|
|
8
|
-
endLine: z.number().int().positive().optional(),
|
|
9
|
-
maxBytes: z.number().int().positive().max(10_000_000).default(1_000_000),
|
|
10
|
-
});
|
|
11
|
-
export const readFileTool = {
|
|
12
|
-
name: 'read_file',
|
|
13
|
-
description: 'Read a file with optional line range. Returns content + metadata. Use before edit_file.',
|
|
14
|
-
permissions: ['read'],
|
|
15
|
-
timeoutMs: 5000,
|
|
16
|
-
inputSchema: ReadFileArgsSchema,
|
|
17
|
-
execute: async (args, ctx) => {
|
|
18
|
-
try {
|
|
19
|
-
const absPath = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
|
|
20
|
-
const buf = await fs.readFile(absPath, { encoding: 'utf-8', signal: ctx.signal });
|
|
21
|
-
const content = typeof buf === 'string' ? buf : buf.toString('utf-8');
|
|
22
|
-
const truncated = content.length > args.maxBytes ? content.slice(0, args.maxBytes) : content;
|
|
23
|
-
const lines = truncated.split('\n');
|
|
24
|
-
const totalLines = content.split('\n').length;
|
|
25
|
-
const start = args.startLine ?? 0;
|
|
26
|
-
const end = Math.min(args.endLine ?? lines.length, lines.length);
|
|
27
|
-
return typedOk({
|
|
28
|
-
path: absPath,
|
|
29
|
-
content: lines.slice(start, end).join('\n'),
|
|
30
|
-
totalLines,
|
|
31
|
-
readLines: { start, end: end - 1 },
|
|
32
|
-
sizeBytes: content.length,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
return typedErr(err instanceof Error ? err.message : String(err));
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
const WriteFileArgsSchema = z.object({
|
|
41
|
-
path: z.string().min(1),
|
|
42
|
-
content: z.string(),
|
|
43
|
-
createDirs: z.boolean().default(false),
|
|
44
|
-
});
|
|
45
|
-
export const writeFileTool = {
|
|
46
|
-
name: 'write_file',
|
|
47
|
-
description: 'Write or create a file. Use createDirs=true to auto-create parent directories.',
|
|
48
|
-
permissions: ['write'],
|
|
49
|
-
timeoutMs: 10000,
|
|
50
|
-
inputSchema: WriteFileArgsSchema,
|
|
51
|
-
execute: async (args, ctx) => {
|
|
52
|
-
try {
|
|
53
|
-
const absPath = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
|
|
54
|
-
if (args.createDirs) {
|
|
55
|
-
await fs.mkdir(path.dirname(absPath), { recursive: true });
|
|
56
|
-
}
|
|
57
|
-
await fs.writeFile(absPath, args.content, { encoding: 'utf-8', signal: ctx.signal });
|
|
58
|
-
return typedOk({ path: absPath, bytesWritten: args.content.length });
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
return typedErr(err instanceof Error ? err.message : String(err));
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
const EditFileArgsSchema = z.object({
|
|
66
|
-
path: z.string().min(1),
|
|
67
|
-
oldString: z.string().min(1),
|
|
68
|
-
newString: z.string(),
|
|
69
|
-
replaceAll: z.boolean().default(false),
|
|
70
|
-
});
|
|
71
|
-
export const editFileTool = {
|
|
72
|
-
name: 'edit_file',
|
|
73
|
-
description: 'Replace exact string match in a file. Idempotent: returns 0 occurrences if no match.',
|
|
74
|
-
permissions: ['write'],
|
|
75
|
-
timeoutMs: 10000,
|
|
76
|
-
inputSchema: EditFileArgsSchema,
|
|
77
|
-
execute: async (args, ctx) => {
|
|
78
|
-
try {
|
|
79
|
-
const absPath = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
|
|
80
|
-
const content = await fs.readFile(absPath, { encoding: 'utf-8', signal: ctx.signal });
|
|
81
|
-
const text = typeof content === 'string' ? content : content.toString('utf-8');
|
|
82
|
-
let occurrences = 0;
|
|
83
|
-
let newContent;
|
|
84
|
-
if (args.replaceAll) {
|
|
85
|
-
const parts = text.split(args.oldString);
|
|
86
|
-
occurrences = parts.length - 1;
|
|
87
|
-
newContent = parts.join(args.newString);
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
const idx = text.indexOf(args.oldString);
|
|
91
|
-
if (idx === -1) {
|
|
92
|
-
occurrences = 0;
|
|
93
|
-
newContent = text;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
occurrences = 1;
|
|
97
|
-
newContent = text.slice(0, idx) + args.newString + text.slice(idx + args.oldString.length);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (occurrences > 0) {
|
|
101
|
-
await fs.writeFile(absPath, newContent, { encoding: 'utf-8', signal: ctx.signal });
|
|
102
|
-
}
|
|
103
|
-
return typedOk({ path: absPath, occurrencesReplaced: occurrences });
|
|
104
|
-
}
|
|
105
|
-
catch (err) {
|
|
106
|
-
return typedErr(err instanceof Error ? err.message : String(err));
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
//# sourceMappingURL=filesystem.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAuB,MAAM,iBAAiB,CAAC;AAEzE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACpD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;CACzE,CAAC,CAAC;AAYH,MAAM,CAAC,MAAM,YAAY,GAAiD;IACxE,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,yFAAyF;IACtG,WAAW,EAAE,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC3F,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7F,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACjE,OAAO,OAAO,CAAC;gBACb,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC3C,UAAU;gBACV,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE;gBAClC,SAAS,EAAE,OAAO,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,aAAa,GAAmD;IAC3E,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,gFAAgF;IAC7F,WAAW,EAAE,CAAC,OAAO,CAAC;IACtB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,mBAAmB;IAChC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC9F,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,YAAY,GAAiD;IACxE,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,sFAAsF;IACnG,WAAW,EAAE,CAAC,OAAO,CAAC;IACtB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC/F,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/E,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,UAAkB,CAAC;YACvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzC,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/B,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;oBACf,WAAW,GAAG,CAAC,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,CAAC,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC7F,CAAC;YACH,CAAC;YACD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC9F,CAAC;YACD,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { promises as fs } from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { typedOk, typedErr } from '../toolTypes.js';
|
|
5
|
-
const ListFilesArgsSchema = z.object({
|
|
6
|
-
/** Directory to list (relative to cwd or absolute). Defaults to cwd. */
|
|
7
|
-
path: z.string().optional(),
|
|
8
|
-
/** Max traversal depth. 1 = immediate children only (default). */
|
|
9
|
-
maxDepth: z.number().int().positive().max(10).default(1),
|
|
10
|
-
/** Glob-style patterns to exclude (matched against each entry name). */
|
|
11
|
-
exclude: z.array(z.string()).default([
|
|
12
|
-
'node_modules', '.git', 'dist', 'build', '.next', '__pycache__', '.cache',
|
|
13
|
-
]),
|
|
14
|
-
});
|
|
15
|
-
function matchesAny(name, patterns) {
|
|
16
|
-
return patterns.some((p) => {
|
|
17
|
-
// Simple glob: '*' wildcard.
|
|
18
|
-
if (p.includes('*')) {
|
|
19
|
-
const regex = new RegExp('^' + p.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*') + '$');
|
|
20
|
-
return regex.test(name);
|
|
21
|
-
}
|
|
22
|
-
return name === p;
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
async function walk(dir, baseRel, depth, maxDepth, exclude, entries, signal) {
|
|
26
|
-
if (depth > maxDepth)
|
|
27
|
-
return;
|
|
28
|
-
let dirents;
|
|
29
|
-
try {
|
|
30
|
-
dirents = await fs.readdir(dir, { withFileTypes: true });
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return; // unreadable subdirectory — skip silently
|
|
34
|
-
}
|
|
35
|
-
// Honor the abort signal between reads (fs.readdir options.signal typing
|
|
36
|
-
// varies across Node versions, so we check manually here).
|
|
37
|
-
if (signal?.aborted)
|
|
38
|
-
return;
|
|
39
|
-
for (const dirent of dirents) {
|
|
40
|
-
if (matchesAny(dirent.name, exclude))
|
|
41
|
-
continue;
|
|
42
|
-
const rel = baseRel ? `${baseRel}/${dirent.name}` : dirent.name;
|
|
43
|
-
const isDir = dirent.isDirectory();
|
|
44
|
-
entries.push({
|
|
45
|
-
name: rel,
|
|
46
|
-
type: isDir ? 'directory' : dirent.isFile() ? 'file' : 'other',
|
|
47
|
-
});
|
|
48
|
-
if (isDir && depth < maxDepth) {
|
|
49
|
-
await walk(path.join(dir, dirent.name), rel, depth + 1, maxDepth, exclude, entries, signal);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export const listFilesTool = {
|
|
54
|
-
name: 'list_files',
|
|
55
|
-
description: 'List files and directories in the given path (defaults to the working directory). ' +
|
|
56
|
-
'Returns names with types (file/directory). Use this to discover the project structure ' +
|
|
57
|
-
'before reading specific files. Supports a maxDepth for recursive listing and excludes ' +
|
|
58
|
-
'common dependency/build directories by default.',
|
|
59
|
-
permissions: ['read'],
|
|
60
|
-
timeoutMs: 15000,
|
|
61
|
-
inputSchema: ListFilesArgsSchema,
|
|
62
|
-
execute: async (args, ctx) => {
|
|
63
|
-
try {
|
|
64
|
-
const target = args.path
|
|
65
|
-
? (path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path))
|
|
66
|
-
: ctx.cwd;
|
|
67
|
-
const entries = [];
|
|
68
|
-
await walk(target, '', 1, args.maxDepth, args.exclude, entries, ctx.signal);
|
|
69
|
-
// Sort: directories first, then files, alphabetically.
|
|
70
|
-
entries.sort((a, b) => {
|
|
71
|
-
if (a.type === 'directory' && b.type !== 'directory')
|
|
72
|
-
return -1;
|
|
73
|
-
if (a.type !== 'directory' && b.type === 'directory')
|
|
74
|
-
return 1;
|
|
75
|
-
return a.name.localeCompare(b.name);
|
|
76
|
-
});
|
|
77
|
-
const MAX_ENTRIES = 500;
|
|
78
|
-
const truncated = entries.length > MAX_ENTRIES;
|
|
79
|
-
return typedOk({ dir: target, entries: truncated ? entries.slice(0, MAX_ENTRIES) : entries, truncated });
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
return typedErr(err instanceof Error ? err.message : String(err));
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
//# sourceMappingURL=listFiles.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"listFiles.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/listFiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { promises as fs } from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { typedOk, typedErr } from '../toolTypes.js';
|
|
5
|
-
const GrepContentArgsSchema = z.object({
|
|
6
|
-
path: z.string().min(1),
|
|
7
|
-
pattern: z.string().min(1),
|
|
8
|
-
contextLines: z.number().int().nonnegative().default(2),
|
|
9
|
-
maxMatches: z.number().int().positive().max(1000).default(50),
|
|
10
|
-
});
|
|
11
|
-
export const grepContentTool = {
|
|
12
|
-
name: 'grep_content',
|
|
13
|
-
description: 'Regex search for content in a file. Returns matches with line numbers and context.',
|
|
14
|
-
permissions: ['read'],
|
|
15
|
-
timeoutMs: 10000,
|
|
16
|
-
inputSchema: GrepContentArgsSchema,
|
|
17
|
-
execute: async (args, ctx) => {
|
|
18
|
-
try {
|
|
19
|
-
const absPath = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
|
|
20
|
-
const content = await fs.readFile(absPath, { encoding: 'utf-8', signal: ctx.signal });
|
|
21
|
-
const text = typeof content === 'string' ? content : content.toString('utf-8');
|
|
22
|
-
const lines = text.split('\n');
|
|
23
|
-
const regex = new RegExp(args.pattern, 'gm');
|
|
24
|
-
const matches = [];
|
|
25
|
-
let totalMatches = 0;
|
|
26
|
-
let truncated = false;
|
|
27
|
-
for (let i = 0; i < lines.length; i++) {
|
|
28
|
-
if (regex.test(lines[i])) {
|
|
29
|
-
regex.lastIndex = 0; // Reset global regex state
|
|
30
|
-
totalMatches++;
|
|
31
|
-
if (matches.length < args.maxMatches) {
|
|
32
|
-
const startBefore = Math.max(0, i - args.contextLines);
|
|
33
|
-
const endAfter = Math.min(lines.length - 1, i + args.contextLines);
|
|
34
|
-
matches.push({
|
|
35
|
-
file: absPath,
|
|
36
|
-
line: i + 1,
|
|
37
|
-
text: lines[i],
|
|
38
|
-
context: {
|
|
39
|
-
before: lines.slice(startBefore, i),
|
|
40
|
-
after: lines.slice(i + 1, endAfter + 1),
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
truncated = true;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return typedOk({ matches, totalMatches, truncated });
|
|
50
|
-
}
|
|
51
|
-
catch (err) {
|
|
52
|
-
return typedErr(err instanceof Error ? err.message : String(err));
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
//# sourceMappingURL=search.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { spawn } from 'node:child_process';
|
|
3
|
-
import { typedOk, typedErr } from '../toolTypes.js';
|
|
4
|
-
const BashArgsSchema = z.object({
|
|
5
|
-
command: z.string().min(1),
|
|
6
|
-
cwd: z.string().optional(),
|
|
7
|
-
timeoutMs: z.number().int().positive().max(600_000).default(30_000),
|
|
8
|
-
});
|
|
9
|
-
export const bashTool = {
|
|
10
|
-
name: 'bash',
|
|
11
|
-
description: 'Run a shell command. Streams stdout/stderr. Respects timeout and cancellation. Returns exit code.',
|
|
12
|
-
permissions: ['execute'],
|
|
13
|
-
timeoutMs: 60000,
|
|
14
|
-
inputSchema: BashArgsSchema,
|
|
15
|
-
execute: async (args, ctx) => {
|
|
16
|
-
return new Promise((resolve) => {
|
|
17
|
-
const start = Date.now();
|
|
18
|
-
const cwd = args.cwd ?? ctx.cwd;
|
|
19
|
-
const child = spawn(args.command, { shell: true, cwd, signal: ctx.signal });
|
|
20
|
-
let stdout = '';
|
|
21
|
-
let stderr = '';
|
|
22
|
-
const maxBuffer = 1024 * 1024; // 1MB cap on each stream
|
|
23
|
-
child.stdout?.on('data', (data) => {
|
|
24
|
-
if (stdout.length < maxBuffer)
|
|
25
|
-
stdout += data.toString('utf-8');
|
|
26
|
-
});
|
|
27
|
-
child.stderr?.on('data', (data) => {
|
|
28
|
-
if (stderr.length < maxBuffer)
|
|
29
|
-
stderr += data.toString('utf-8');
|
|
30
|
-
});
|
|
31
|
-
const timer = setTimeout(() => {
|
|
32
|
-
child.kill('SIGTERM');
|
|
33
|
-
resolve(typedErr(`Bash command timed out after ${args.timeoutMs}ms`));
|
|
34
|
-
}, args.timeoutMs);
|
|
35
|
-
child.on('close', (code) => {
|
|
36
|
-
clearTimeout(timer);
|
|
37
|
-
resolve(typedOk({
|
|
38
|
-
stdout: stdout.slice(0, maxBuffer),
|
|
39
|
-
stderr: stderr.slice(0, maxBuffer),
|
|
40
|
-
exitCode: code ?? -1,
|
|
41
|
-
durationMs: Date.now() - start,
|
|
42
|
-
}));
|
|
43
|
-
});
|
|
44
|
-
child.on('error', (err) => {
|
|
45
|
-
clearTimeout(timer);
|
|
46
|
-
resolve(typedErr(err.message));
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
},
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=shell.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { zodToJsonSchema } from './zodBridge.js';
|
|
2
|
-
import { typedErr } from './toolTypes.js';
|
|
3
|
-
export class ToolRegistry {
|
|
4
|
-
tools = new Map();
|
|
5
|
-
register(def) {
|
|
6
|
-
this.tools.set(def.name, def);
|
|
7
|
-
}
|
|
8
|
-
get(name) {
|
|
9
|
-
return this.tools.get(name);
|
|
10
|
-
}
|
|
11
|
-
list() {
|
|
12
|
-
return Array.from(this.tools.keys());
|
|
13
|
-
}
|
|
14
|
-
/** Invoke a tool with validated input + timeout + audit + permissions check. */
|
|
15
|
-
async invoke(name, rawInput, options = {}) {
|
|
16
|
-
const tool = this.tools.get(name);
|
|
17
|
-
if (!tool) {
|
|
18
|
-
return typedErr(`Tool "${name}" not found. Available: ${this.list().join(', ')}`);
|
|
19
|
-
}
|
|
20
|
-
// Zod validation
|
|
21
|
-
const parsed = tool.inputSchema.safeParse(rawInput);
|
|
22
|
-
if (!parsed.success) {
|
|
23
|
-
return typedErr(`Invalid input: ${parsed.error.message}`);
|
|
24
|
-
}
|
|
25
|
-
// Timeout + cancellation
|
|
26
|
-
const timeoutMs = options.timeoutMs ?? tool.timeoutMs ?? 30000;
|
|
27
|
-
const signal = options.signal;
|
|
28
|
-
const ctx = {
|
|
29
|
-
signal: signal ?? new AbortController().signal,
|
|
30
|
-
cwd: options.cwd ?? process.cwd(),
|
|
31
|
-
audit: () => { },
|
|
32
|
-
sessionId: options.sessionId ?? 'default',
|
|
33
|
-
};
|
|
34
|
-
try {
|
|
35
|
-
const result = await Promise.race([
|
|
36
|
-
tool.execute(parsed.data, ctx),
|
|
37
|
-
new Promise((_, reject) => {
|
|
38
|
-
const timer = setTimeout(() => reject(new Error(`Tool "${name}" timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
39
|
-
signal?.addEventListener('abort', () => {
|
|
40
|
-
clearTimeout(timer);
|
|
41
|
-
reject(new Error(`Tool "${name}" aborted`));
|
|
42
|
-
});
|
|
43
|
-
}),
|
|
44
|
-
]);
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
const error = err instanceof Error ? err.message : String(err);
|
|
49
|
-
return typedErr(error);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/** Return all tool definitions in OpenAI function-calling format. */
|
|
53
|
-
toOpenAITools() {
|
|
54
|
-
return Array.from(this.tools.values()).map((t) => ({
|
|
55
|
-
type: 'function',
|
|
56
|
-
function: {
|
|
57
|
-
name: t.name,
|
|
58
|
-
description: t.description,
|
|
59
|
-
parameters: zodToJsonSchema(t.inputSchema),
|
|
60
|
-
},
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/** Singleton instance (caller can override via setInstance). */
|
|
65
|
-
let _instance = null;
|
|
66
|
-
export function getToolRegistry() {
|
|
67
|
-
if (!_instance)
|
|
68
|
-
_instance = new ToolRegistry();
|
|
69
|
-
return _instance;
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/main/core/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolTypes.js","sourceRoot":"","sources":["../../../../src/main/core/tools/toolTypes.ts"],"names":[],"mappings":"AAgDA,oDAAoD;AACpD,MAAM,UAAU,OAAO,CAAI,KAAQ;IACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAY,KAAa;IAC/C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/** Convert a Zod schema into a JSON Schema-like object suitable for LLM
|
|
2
|
-
* function-calling definitions. Best-effort: handles primitives, objects,
|
|
3
|
-
* arrays, unions, optionals. Does not handle refinements beyond type. */
|
|
4
|
-
export function zodToJsonSchema(schema) {
|
|
5
|
-
if (typeof schema.toJSONSchema === 'function') {
|
|
6
|
-
const res = schema.toJSONSchema();
|
|
7
|
-
if (res && typeof res === 'object') {
|
|
8
|
-
const copy = { ...res };
|
|
9
|
-
delete copy['$schema'];
|
|
10
|
-
return copy;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
return _convert(schema);
|
|
14
|
-
}
|
|
15
|
-
function _convert(schema) {
|
|
16
|
-
const def = schema._def;
|
|
17
|
-
if (!def)
|
|
18
|
-
return {};
|
|
19
|
-
switch (def.typeName) {
|
|
20
|
-
case 'ZodString': return { type: 'string' };
|
|
21
|
-
case 'ZodNumber': return { type: 'number' };
|
|
22
|
-
case 'ZodBoolean': return { type: 'boolean' };
|
|
23
|
-
case 'ZodObject': {
|
|
24
|
-
const shape = schema.shape;
|
|
25
|
-
const properties = {};
|
|
26
|
-
const required = [];
|
|
27
|
-
for (const [key, value] of Object.entries(shape)) {
|
|
28
|
-
properties[key] = _convert(value);
|
|
29
|
-
// If inner type is not ZodOptional, mark required
|
|
30
|
-
const vDef = value._def;
|
|
31
|
-
if (vDef?.typeName !== 'ZodOptional') {
|
|
32
|
-
required.push(key);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return { type: 'object', properties, required };
|
|
36
|
-
}
|
|
37
|
-
case 'ZodArray': {
|
|
38
|
-
const inner = def.innerType;
|
|
39
|
-
return { type: 'array', items: _convert(inner) };
|
|
40
|
-
}
|
|
41
|
-
case 'ZodOptional': {
|
|
42
|
-
const inner = def.innerType;
|
|
43
|
-
return _convert(inner);
|
|
44
|
-
}
|
|
45
|
-
case 'ZodUnion': {
|
|
46
|
-
const options = def.options ?? [];
|
|
47
|
-
return { anyOf: options.map(_convert) };
|
|
48
|
-
}
|
|
49
|
-
case 'ZodEnum': {
|
|
50
|
-
const values = schema.options;
|
|
51
|
-
return { type: 'string', enum: values };
|
|
52
|
-
}
|
|
53
|
-
default: return {};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=zodBridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zodBridge.js","sourceRoot":"","sources":["../../../../src/main/core/tools/zodBridge.ts"],"names":[],"mappings":"AAEA;;0EAE0E;AAC1E,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,IAAI,OAAQ,MAAc,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACvD,MAAM,GAAG,GAAI,MAAc,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,MAAoB,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAkB;IAClC,MAAM,GAAG,GAAI,MAAgH,CAAC,IAAI,CAAC;IACnI,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5C,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5C,KAAK,YAAY,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAI,MAA2D,CAAC,KAAK,CAAC;YACjF,MAAM,UAAU,GAA4B,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClC,kDAAkD;gBAClD,MAAM,IAAI,GAAI,KAAkE,CAAC,IAAI,CAAC;gBACtF,IAAI,IAAI,EAAE,QAAQ,KAAK,aAAa,EAAE,CAAC;oBACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAClD,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAuB,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAuB,CAAC;YAC1C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,OAAO,GAAI,GAAG,CAAC,OAAwB,IAAI,EAAE,CAAC;YACpD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAI,MAAoD,CAAC,OAAO,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|