@xandout/libra-harness 0.1.128 → 0.1.130
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 +13 -114
- package/package.json +13 -68
- package/dist/extensions/code-tools/extension.test.d.ts +0 -2
- package/dist/extensions/code-tools/extension.test.d.ts.map +0 -1
- package/dist/extensions/code-tools/extension.test.js +0 -544
- package/dist/extensions/code-tools/extension.test.js.map +0 -1
- package/dist/extensions/disk-session/extension.test.d.ts +0 -2
- package/dist/extensions/disk-session/extension.test.d.ts.map +0 -1
- package/dist/extensions/disk-session/extension.test.js +0 -1101
- package/dist/extensions/disk-session/extension.test.js.map +0 -1
- package/dist/extensions/index.d.ts +0 -3
- package/dist/extensions/index.d.ts.map +0 -1
- package/dist/extensions/index.js +0 -2
- package/dist/extensions/index.js.map +0 -1
- package/dist/extensions/loader.d.ts +0 -205
- package/dist/extensions/loader.d.ts.map +0 -1
- package/dist/extensions/loader.js +0 -315
- package/dist/extensions/loader.js.map +0 -1
- package/dist/extensions/skills/extension.test.d.ts +0 -2
- package/dist/extensions/skills/extension.test.d.ts.map +0 -1
- package/dist/extensions/skills/extension.test.js +0 -184
- package/dist/extensions/skills/extension.test.js.map +0 -1
- package/dist/openai-provider/index.d.ts +0 -3
- package/dist/openai-provider/index.d.ts.map +0 -1
- package/dist/openai-provider/index.js +0 -2
- package/dist/openai-provider/index.js.map +0 -1
- package/dist/openai-provider/server.d.ts +0 -34
- package/dist/openai-provider/server.d.ts.map +0 -1
- package/dist/openai-provider/server.js +0 -335
- package/dist/openai-provider/server.js.map +0 -1
|
@@ -1,544 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { existsSync, mkdtempSync, rmSync, writeFileSync, readFileSync, mkdirSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import { Agent } from '../../agent.js';
|
|
6
|
-
import createCodeToolsExtension from './extension.js';
|
|
7
|
-
function mockModel() {
|
|
8
|
-
return {
|
|
9
|
-
id: 'test-model',
|
|
10
|
-
provider: 'test-provider',
|
|
11
|
-
async generate() {
|
|
12
|
-
return {
|
|
13
|
-
role: 'assistant',
|
|
14
|
-
message: 'ok',
|
|
15
|
-
finishReason: 'stop',
|
|
16
|
-
iterations: 1,
|
|
17
|
-
metadata: {},
|
|
18
|
-
};
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
describe('code-tools extension', () => {
|
|
23
|
-
let tmpDir;
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
tmpDir = mkdtempSync(join(tmpdir(), 'code-tools-test-'));
|
|
26
|
-
});
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
rmSync(tmpDir, { recursive: true, force: true });
|
|
29
|
-
});
|
|
30
|
-
// ── read tool ──────────────────────────────────────────────────────
|
|
31
|
-
describe('read tool', () => {
|
|
32
|
-
it('reads a text file with line numbers', async () => {
|
|
33
|
-
const filePath = join(tmpDir, 'test.txt');
|
|
34
|
-
writeFileSync(filePath, 'line one\nline two\nline three');
|
|
35
|
-
const agent = new Agent({ model: mockModel() });
|
|
36
|
-
agent.use(createCodeToolsExtension());
|
|
37
|
-
const tools = agent.tools;
|
|
38
|
-
const readTool = tools.get('read');
|
|
39
|
-
expect(readTool).toBeDefined();
|
|
40
|
-
const result = await readTool.execute({ file_path: filePath }, { signal: new AbortController().signal, metadata: {} });
|
|
41
|
-
expect(result.content).toContain('test.txt');
|
|
42
|
-
expect(result.content).toMatch(/1\tline one/);
|
|
43
|
-
expect(result.content).toMatch(/2\tline two/);
|
|
44
|
-
expect(result.content).toMatch(/3\tline three/);
|
|
45
|
-
});
|
|
46
|
-
it('returns error if file_path is missing', async () => {
|
|
47
|
-
const agent = new Agent({ model: mockModel() });
|
|
48
|
-
agent.use(createCodeToolsExtension());
|
|
49
|
-
const readTool = agent.tools.get('read');
|
|
50
|
-
const result = await readTool.execute({}, { signal: new AbortController().signal, metadata: {} });
|
|
51
|
-
expect(result.content).toContain('Error: file_path is required');
|
|
52
|
-
});
|
|
53
|
-
it('returns error for non-existent file', async () => {
|
|
54
|
-
const agent = new Agent({ model: mockModel() });
|
|
55
|
-
agent.use(createCodeToolsExtension());
|
|
56
|
-
const readTool = agent.tools.get('read');
|
|
57
|
-
const result = await readTool.execute({ file_path: join(tmpDir, 'nope.txt') }, { signal: new AbortController().signal, metadata: {} });
|
|
58
|
-
expect(result.content).toContain('File not found');
|
|
59
|
-
});
|
|
60
|
-
it('returns error for directory path', async () => {
|
|
61
|
-
const agent = new Agent({ model: mockModel() });
|
|
62
|
-
agent.use(createCodeToolsExtension());
|
|
63
|
-
const readTool = agent.tools.get('read');
|
|
64
|
-
const subDir = join(tmpDir, 'subdir');
|
|
65
|
-
mkdirSync(subDir);
|
|
66
|
-
const result = await readTool.execute({ file_path: subDir }, { signal: new AbortController().signal, metadata: {} });
|
|
67
|
-
expect(result.content).toContain('Path is a directory, not a file');
|
|
68
|
-
});
|
|
69
|
-
it('respects startLine and endLine pagination', async () => {
|
|
70
|
-
const filePath = join(tmpDir, 'paginated.txt');
|
|
71
|
-
const lines = Array.from({ length: 20 }, (_, i) => `line ${i + 1}`).join('\n');
|
|
72
|
-
writeFileSync(filePath, lines);
|
|
73
|
-
const agent = new Agent({ model: mockModel() });
|
|
74
|
-
agent.use(createCodeToolsExtension());
|
|
75
|
-
const readTool = agent.tools.get('read');
|
|
76
|
-
const result = await readTool.execute({ file_path: filePath, startLine: 5, endLine: 8 }, { signal: new AbortController().signal, metadata: {} });
|
|
77
|
-
expect(result.content).not.toContain('line 4\n');
|
|
78
|
-
expect(result.content).toMatch(/5\tline 5/);
|
|
79
|
-
expect(result.content).toMatch(/8\tline 8/);
|
|
80
|
-
expect(result.content).not.toMatch(/9\tline 9/);
|
|
81
|
-
expect(result.content).toContain('[showing lines 5-8 of 20 total]');
|
|
82
|
-
});
|
|
83
|
-
it('returns base64 for binary files', async () => {
|
|
84
|
-
const filePath = join(tmpDir, 'binary.bin');
|
|
85
|
-
const binData = Buffer.from([0x00, 0x01, 0x02, 0x03, 0xff]);
|
|
86
|
-
writeFileSync(filePath, binData);
|
|
87
|
-
const agent = new Agent({ model: mockModel() });
|
|
88
|
-
agent.use(createCodeToolsExtension());
|
|
89
|
-
const readTool = agent.tools.get('read');
|
|
90
|
-
const result = await readTool.execute({ file_path: filePath }, { signal: new AbortController().signal, metadata: {} });
|
|
91
|
-
expect(result.content).toContain('binary');
|
|
92
|
-
expect(result.content).toContain('base64:');
|
|
93
|
-
});
|
|
94
|
-
it('returns data URL for image files', async () => {
|
|
95
|
-
const filePath = join(tmpDir, 'image.png');
|
|
96
|
-
const pngHeader = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
97
|
-
writeFileSync(filePath, pngHeader);
|
|
98
|
-
const agent = new Agent({ model: mockModel() });
|
|
99
|
-
agent.use(createCodeToolsExtension());
|
|
100
|
-
const readTool = agent.tools.get('read');
|
|
101
|
-
const result = await readTool.execute({ file_path: filePath }, { signal: new AbortController().signal, metadata: {} });
|
|
102
|
-
expect(result.content).toContain('data:image/png;base64,');
|
|
103
|
-
});
|
|
104
|
-
it('tracks read paths in metadata for edit/write enforcement', async () => {
|
|
105
|
-
const filePath = join(tmpDir, 'tracked.txt');
|
|
106
|
-
writeFileSync(filePath, 'content');
|
|
107
|
-
const agent = new Agent({ model: mockModel() });
|
|
108
|
-
agent.use(createCodeToolsExtension());
|
|
109
|
-
const readTool = agent.tools.get('read');
|
|
110
|
-
const metadata = {};
|
|
111
|
-
await readTool.execute({ file_path: filePath }, { signal: new AbortController().signal, metadata });
|
|
112
|
-
const readSet = metadata.__codeToolsReadPaths;
|
|
113
|
-
expect(readSet).toBeDefined();
|
|
114
|
-
expect(readSet.has(filePath)).toBe(true);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
// ── write tool ─────────────────────────────────────────────────────
|
|
118
|
-
describe('write tool', () => {
|
|
119
|
-
it('creates a new file', async () => {
|
|
120
|
-
const filePath = join(tmpDir, 'new.txt');
|
|
121
|
-
const agent = new Agent({ model: mockModel() });
|
|
122
|
-
agent.use(createCodeToolsExtension());
|
|
123
|
-
const writeTool = agent.tools.get('write');
|
|
124
|
-
const result = await writeTool.execute({ file_path: filePath, content: 'created' }, { signal: new AbortController().signal, metadata: {} });
|
|
125
|
-
expect(result.content).toContain('Wrote 7 chars');
|
|
126
|
-
expect(readFileSync(filePath, 'utf-8')).toBe('created');
|
|
127
|
-
});
|
|
128
|
-
it('creates parent directories recursively', async () => {
|
|
129
|
-
const filePath = join(tmpDir, 'nested', 'sub', 'file.txt');
|
|
130
|
-
const agent = new Agent({ model: mockModel() });
|
|
131
|
-
agent.use(createCodeToolsExtension());
|
|
132
|
-
const writeTool = agent.tools.get('write');
|
|
133
|
-
await writeTool.execute({ file_path: filePath, content: 'nested' }, { signal: new AbortController().signal, metadata: {} });
|
|
134
|
-
expect(readFileSync(filePath, 'utf-8')).toBe('nested');
|
|
135
|
-
});
|
|
136
|
-
it('returns error if file_path is missing', async () => {
|
|
137
|
-
const agent = new Agent({ model: mockModel() });
|
|
138
|
-
agent.use(createCodeToolsExtension());
|
|
139
|
-
const writeTool = agent.tools.get('write');
|
|
140
|
-
const result = await writeTool.execute({}, { signal: new AbortController().signal, metadata: {} });
|
|
141
|
-
expect(result.content).toContain('file_path is required');
|
|
142
|
-
});
|
|
143
|
-
it('refuses to overwrite an existing file without reading first', async () => {
|
|
144
|
-
const filePath = join(tmpDir, 'existing.txt');
|
|
145
|
-
writeFileSync(filePath, 'original');
|
|
146
|
-
const agent = new Agent({ model: mockModel() });
|
|
147
|
-
agent.use(createCodeToolsExtension());
|
|
148
|
-
const writeTool = agent.tools.get('write');
|
|
149
|
-
const result = await writeTool.execute({ file_path: filePath, content: 'updated' }, { signal: new AbortController().signal, metadata: {} });
|
|
150
|
-
expect(result.isError).toBe(true);
|
|
151
|
-
expect(result.content).toContain('You must read');
|
|
152
|
-
expect(readFileSync(filePath, 'utf-8')).toBe('original');
|
|
153
|
-
});
|
|
154
|
-
it('overwrites an existing file after reading it', async () => {
|
|
155
|
-
const filePath = join(tmpDir, 'allowed.txt');
|
|
156
|
-
writeFileSync(filePath, 'original');
|
|
157
|
-
const agent = new Agent({ model: mockModel() });
|
|
158
|
-
agent.use(createCodeToolsExtension());
|
|
159
|
-
const tools = agent.tools;
|
|
160
|
-
const readTool = tools.get('read');
|
|
161
|
-
const writeTool = tools.get('write');
|
|
162
|
-
const metadata = {};
|
|
163
|
-
const ctx = { signal: new AbortController().signal, metadata };
|
|
164
|
-
await readTool.execute({ file_path: filePath }, ctx);
|
|
165
|
-
const result = await writeTool.execute({ file_path: filePath, content: 'overwritten' }, ctx);
|
|
166
|
-
expect(result.content).toContain('Wrote 11 chars');
|
|
167
|
-
expect(readFileSync(filePath, 'utf-8')).toBe('overwritten');
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
// ── edit tool ──────────────────────────────────────────────────────
|
|
171
|
-
describe('edit tool', () => {
|
|
172
|
-
it('refuses to edit without reading first', async () => {
|
|
173
|
-
const filePath = join(tmpDir, 'edit-me.txt');
|
|
174
|
-
writeFileSync(filePath, 'alpha\nbeta\ngamma');
|
|
175
|
-
const agent = new Agent({ model: mockModel() });
|
|
176
|
-
agent.use(createCodeToolsExtension());
|
|
177
|
-
const editTool = agent.tools.get('edit');
|
|
178
|
-
const result = await editTool.execute({
|
|
179
|
-
file_path: filePath,
|
|
180
|
-
startLine: 1,
|
|
181
|
-
endLine: 3,
|
|
182
|
-
targetContent: 'beta',
|
|
183
|
-
replacementContent: 'BETA',
|
|
184
|
-
}, { signal: new AbortController().signal, metadata: {} });
|
|
185
|
-
expect(result.isError).toBe(true);
|
|
186
|
-
expect(result.content).toContain('You must read');
|
|
187
|
-
});
|
|
188
|
-
it('fails if line range is invalid or startLine > endLine', async () => {
|
|
189
|
-
const filePath = join(tmpDir, 'range-check.txt');
|
|
190
|
-
writeFileSync(filePath, 'a\nb\nc');
|
|
191
|
-
const agent = new Agent({ model: mockModel() });
|
|
192
|
-
agent.use(createCodeToolsExtension());
|
|
193
|
-
const editTool = agent.tools.get('edit');
|
|
194
|
-
const result = await editTool.execute({
|
|
195
|
-
file_path: filePath,
|
|
196
|
-
startLine: 5,
|
|
197
|
-
endLine: 2,
|
|
198
|
-
targetContent: 'b',
|
|
199
|
-
replacementContent: 'B',
|
|
200
|
-
}, { signal: new AbortController().signal, metadata: {} });
|
|
201
|
-
expect(result.isError).toBe(true);
|
|
202
|
-
expect(result.content).toContain('Invalid line range');
|
|
203
|
-
});
|
|
204
|
-
it('fails if targetContent and replacementContent are identical', async () => {
|
|
205
|
-
const filePath = join(tmpDir, 'identical.txt');
|
|
206
|
-
writeFileSync(filePath, 'same');
|
|
207
|
-
const agent = new Agent({ model: mockModel() });
|
|
208
|
-
agent.use(createCodeToolsExtension());
|
|
209
|
-
const editTool = agent.tools.get('edit');
|
|
210
|
-
const result = await editTool.execute({
|
|
211
|
-
file_path: filePath,
|
|
212
|
-
startLine: 1,
|
|
213
|
-
endLine: 1,
|
|
214
|
-
targetContent: 'same',
|
|
215
|
-
replacementContent: 'same',
|
|
216
|
-
}, { signal: new AbortController().signal, metadata: {} });
|
|
217
|
-
expect(result.isError).toBe(true);
|
|
218
|
-
expect(result.content).toContain('identical');
|
|
219
|
-
});
|
|
220
|
-
it('replaces a unique targetContent in the specified line range', async () => {
|
|
221
|
-
const filePath = join(tmpDir, 'block-edit.txt');
|
|
222
|
-
writeFileSync(filePath, 'line1\nline2\nline3\nline4\nline5\n');
|
|
223
|
-
const agent = new Agent({ model: mockModel() });
|
|
224
|
-
agent.use(createCodeToolsExtension());
|
|
225
|
-
const tools = agent.tools;
|
|
226
|
-
const readTool = tools.get('read');
|
|
227
|
-
const editTool = tools.get('edit');
|
|
228
|
-
const metadata = {};
|
|
229
|
-
const ctx = { signal: new AbortController().signal, metadata };
|
|
230
|
-
await readTool.execute({ file_path: filePath }, ctx);
|
|
231
|
-
const result = await editTool.execute({
|
|
232
|
-
file_path: filePath,
|
|
233
|
-
startLine: 2,
|
|
234
|
-
endLine: 4,
|
|
235
|
-
targetContent: 'line3',
|
|
236
|
-
replacementContent: 'MODIFIED_LINE_3',
|
|
237
|
-
}, ctx);
|
|
238
|
-
expect(result.isError).toBeFalsy();
|
|
239
|
-
expect(result.content).toContain('Successfully edited');
|
|
240
|
-
const updated = readFileSync(filePath, 'utf-8');
|
|
241
|
-
expect(updated).toBe('line1\nline2\nMODIFIED_LINE_3\nline4\nline5\n');
|
|
242
|
-
});
|
|
243
|
-
it('replaces a multi-line block across several lines', async () => {
|
|
244
|
-
const filePath = join(tmpDir, 'multiline.txt');
|
|
245
|
-
writeFileSync(filePath, 'start\nfunction test() {\n return 1;\n}\nend\n');
|
|
246
|
-
const agent = new Agent({ model: mockModel() });
|
|
247
|
-
agent.use(createCodeToolsExtension());
|
|
248
|
-
const tools = agent.tools;
|
|
249
|
-
const readTool = tools.get('read');
|
|
250
|
-
const editTool = tools.get('edit');
|
|
251
|
-
const metadata = {};
|
|
252
|
-
const ctx = { signal: new AbortController().signal, metadata };
|
|
253
|
-
await readTool.execute({ file_path: filePath }, ctx);
|
|
254
|
-
const result = await editTool.execute({
|
|
255
|
-
file_path: filePath,
|
|
256
|
-
startLine: 2,
|
|
257
|
-
endLine: 4,
|
|
258
|
-
targetContent: 'function test() {\n return 1;\n}',
|
|
259
|
-
replacementContent: 'function test() {\n return 42;\n}',
|
|
260
|
-
}, ctx);
|
|
261
|
-
expect(result.isError).toBeFalsy();
|
|
262
|
-
const updated = readFileSync(filePath, 'utf-8');
|
|
263
|
-
expect(updated).toBe('start\nfunction test() {\n return 42;\n}\nend\n');
|
|
264
|
-
});
|
|
265
|
-
it('fails if targetContent is not found within line range', async () => {
|
|
266
|
-
const filePath = join(tmpDir, 'not-found.txt');
|
|
267
|
-
writeFileSync(filePath, 'alpha\nbeta\ngamma\ndelta');
|
|
268
|
-
const agent = new Agent({ model: mockModel() });
|
|
269
|
-
agent.use(createCodeToolsExtension());
|
|
270
|
-
const tools = agent.tools;
|
|
271
|
-
const readTool = tools.get('read');
|
|
272
|
-
const editTool = tools.get('edit');
|
|
273
|
-
const metadata = {};
|
|
274
|
-
const ctx = { signal: new AbortController().signal, metadata };
|
|
275
|
-
await readTool.execute({ file_path: filePath }, ctx);
|
|
276
|
-
const result = await editTool.execute({
|
|
277
|
-
file_path: filePath,
|
|
278
|
-
startLine: 1,
|
|
279
|
-
endLine: 2,
|
|
280
|
-
targetContent: 'delta',
|
|
281
|
-
replacementContent: 'DELTA',
|
|
282
|
-
}, ctx);
|
|
283
|
-
expect(result.isError).toBe(true);
|
|
284
|
-
expect(result.content).toContain('not found in');
|
|
285
|
-
});
|
|
286
|
-
it('fails if targetContent appears multiple times in the range', async () => {
|
|
287
|
-
const filePath = join(tmpDir, 'duplicate.txt');
|
|
288
|
-
writeFileSync(filePath, 'dup\ndup\ndup\n');
|
|
289
|
-
const agent = new Agent({ model: mockModel() });
|
|
290
|
-
agent.use(createCodeToolsExtension());
|
|
291
|
-
const tools = agent.tools;
|
|
292
|
-
const readTool = tools.get('read');
|
|
293
|
-
const editTool = tools.get('edit');
|
|
294
|
-
const metadata = {};
|
|
295
|
-
const ctx = { signal: new AbortController().signal, metadata };
|
|
296
|
-
await readTool.execute({ file_path: filePath }, ctx);
|
|
297
|
-
const result = await editTool.execute({
|
|
298
|
-
file_path: filePath,
|
|
299
|
-
startLine: 1,
|
|
300
|
-
endLine: 3,
|
|
301
|
-
targetContent: 'dup',
|
|
302
|
-
replacementContent: 'new',
|
|
303
|
-
}, ctx);
|
|
304
|
-
expect(result.isError).toBe(true);
|
|
305
|
-
expect(result.content).toContain('appears 3 times');
|
|
306
|
-
});
|
|
307
|
-
it('returns error if file_path is missing or file does not exist', async () => {
|
|
308
|
-
const agent = new Agent({ model: mockModel() });
|
|
309
|
-
agent.use(createCodeToolsExtension());
|
|
310
|
-
const editTool = agent.tools.get('edit');
|
|
311
|
-
const res1 = await editTool.execute({ startLine: 1, endLine: 1, targetContent: 'a', replacementContent: 'b' }, { signal: new AbortController().signal, metadata: {} });
|
|
312
|
-
expect(res1.content).toContain('file_path is required');
|
|
313
|
-
const res2 = await editTool.execute({ file_path: join(tmpDir, 'ghost.txt'), startLine: 1, endLine: 1, targetContent: 'a', replacementContent: 'b' }, { signal: new AbortController().signal, metadata: {} });
|
|
314
|
-
expect(res2.content).toContain('File not found');
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
// ── find_file_by_name tool ──────────────────────────────────────────
|
|
318
|
-
describe('find_file_by_name tool', () => {
|
|
319
|
-
it('finds files by glob pattern', async () => {
|
|
320
|
-
writeFileSync(join(tmpDir, 'foo.ts'), '');
|
|
321
|
-
writeFileSync(join(tmpDir, 'bar.ts'), '');
|
|
322
|
-
writeFileSync(join(tmpDir, 'baz.js'), '');
|
|
323
|
-
const agent = new Agent({ model: mockModel() });
|
|
324
|
-
agent.use(createCodeToolsExtension());
|
|
325
|
-
const findTool = agent.tools.get('find_file_by_name');
|
|
326
|
-
const result = await findTool.execute({ pattern: '*.ts', path: tmpDir }, { signal: new AbortController().signal, metadata: {} });
|
|
327
|
-
expect(result.content).toContain('foo.ts');
|
|
328
|
-
expect(result.content).toContain('bar.ts');
|
|
329
|
-
expect(result.content).not.toContain('baz.js');
|
|
330
|
-
});
|
|
331
|
-
it('returns message when no files match', async () => {
|
|
332
|
-
const agent = new Agent({ model: mockModel() });
|
|
333
|
-
agent.use(createCodeToolsExtension());
|
|
334
|
-
const findTool = agent.tools.get('find_file_by_name');
|
|
335
|
-
const result = await findTool.execute({ pattern: '*.nonexistent', path: tmpDir }, { signal: new AbortController().signal, metadata: {} });
|
|
336
|
-
expect(result.content).toContain('No files matching');
|
|
337
|
-
});
|
|
338
|
-
it('returns error for missing pattern or non-existent path', async () => {
|
|
339
|
-
const agent = new Agent({ model: mockModel() });
|
|
340
|
-
agent.use(createCodeToolsExtension());
|
|
341
|
-
const findTool = agent.tools.get('find_file_by_name');
|
|
342
|
-
const res1 = await findTool.execute({}, { signal: new AbortController().signal, metadata: {} });
|
|
343
|
-
expect(res1.content).toContain('pattern is required');
|
|
344
|
-
const res2 = await findTool.execute({ pattern: '*', path: join(tmpDir, 'does-not-exist') }, { signal: new AbortController().signal, metadata: {} });
|
|
345
|
-
expect(res2.content).toContain('Directory not found');
|
|
346
|
-
});
|
|
347
|
-
});
|
|
348
|
-
// ── grep tool ───────────────────────────────────────────────────────
|
|
349
|
-
describe('grep tool', () => {
|
|
350
|
-
it('finds matching lines with ripgrep', async () => {
|
|
351
|
-
writeFileSync(join(tmpDir, 'sample.txt'), 'hello world\ngoodbye world\nhello universe\n');
|
|
352
|
-
const agent = new Agent({ model: mockModel() });
|
|
353
|
-
agent.use(createCodeToolsExtension());
|
|
354
|
-
const grepTool = agent.tools.get('grep');
|
|
355
|
-
const result = await grepTool.execute({ pattern: 'hello', path: tmpDir }, { signal: new AbortController().signal, metadata: {} });
|
|
356
|
-
expect(result.content).toContain('hello world');
|
|
357
|
-
expect(result.content).toContain('hello universe');
|
|
358
|
-
expect(result.content).not.toContain('goodbye world');
|
|
359
|
-
});
|
|
360
|
-
it('supports case_insensitive search', async () => {
|
|
361
|
-
writeFileSync(join(tmpDir, 'case.txt'), 'ABC\nabc\n');
|
|
362
|
-
const agent = new Agent({ model: mockModel() });
|
|
363
|
-
agent.use(createCodeToolsExtension());
|
|
364
|
-
const grepTool = agent.tools.get('grep');
|
|
365
|
-
const result = await grepTool.execute({ pattern: 'abc', path: tmpDir, case_insensitive: true }, { signal: new AbortController().signal, metadata: {} });
|
|
366
|
-
expect(result.content).toContain('ABC');
|
|
367
|
-
expect(result.content).toContain('abc');
|
|
368
|
-
});
|
|
369
|
-
it('supports context_lines', async () => {
|
|
370
|
-
writeFileSync(join(tmpDir, 'ctx.txt'), 'line1\nTARGET\nline3\n');
|
|
371
|
-
const agent = new Agent({ model: mockModel() });
|
|
372
|
-
agent.use(createCodeToolsExtension());
|
|
373
|
-
const grepTool = agent.tools.get('grep');
|
|
374
|
-
const result = await grepTool.execute({ pattern: 'TARGET', path: tmpDir, context_lines: 1 }, { signal: new AbortController().signal, metadata: {} });
|
|
375
|
-
expect(result.content).toContain('line1');
|
|
376
|
-
expect(result.content).toContain('TARGET');
|
|
377
|
-
expect(result.content).toContain('line3');
|
|
378
|
-
});
|
|
379
|
-
it('returns message when no matches are found', async () => {
|
|
380
|
-
writeFileSync(join(tmpDir, 'empty.txt'), 'nothing here');
|
|
381
|
-
const agent = new Agent({ model: mockModel() });
|
|
382
|
-
agent.use(createCodeToolsExtension());
|
|
383
|
-
const grepTool = agent.tools.get('grep');
|
|
384
|
-
const result = await grepTool.execute({ pattern: 'MISSING_KEYWORD', path: tmpDir }, { signal: new AbortController().signal, metadata: {} });
|
|
385
|
-
expect(result.content).toContain('No matches found for');
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
// ── run_command & manage_task tools ─────────────────────────────────
|
|
389
|
-
describe('run_command and manage_task tools', () => {
|
|
390
|
-
it('executes a command synchronously and returns output', async () => {
|
|
391
|
-
const agent = new Agent({ model: mockModel() });
|
|
392
|
-
agent.use(createCodeToolsExtension());
|
|
393
|
-
const runTool = agent.tools.get('run_command');
|
|
394
|
-
const result = await runTool.execute({ CommandLine: 'echo "hello from bash"', Cwd: tmpDir, WaitMsBeforeAsync: 3000 }, { signal: new AbortController().signal, metadata: {} });
|
|
395
|
-
expect(result.content).toContain('Command completed');
|
|
396
|
-
expect(result.content).toContain('hello from bash');
|
|
397
|
-
});
|
|
398
|
-
it('preserves shell quoting, substitution, and command separators', async () => {
|
|
399
|
-
const agent = new Agent({ model: mockModel() });
|
|
400
|
-
agent.use(createCodeToolsExtension());
|
|
401
|
-
const runTool = agent.tools.get('run_command');
|
|
402
|
-
const result = await runTool.execute({ CommandLine: 'printf "quoted value\\n"; echo "stamp-$(printf 123)"', Cwd: tmpDir, WaitMsBeforeAsync: 3000 }, { signal: new AbortController().signal, metadata: {} });
|
|
403
|
-
expect(result.content).toContain('quoted value\nstamp-123');
|
|
404
|
-
expect(result.content).not.toContain('"quoted value');
|
|
405
|
-
});
|
|
406
|
-
it('captures failing commands with non-zero exit code', async () => {
|
|
407
|
-
const agent = new Agent({ model: mockModel() });
|
|
408
|
-
agent.use(createCodeToolsExtension());
|
|
409
|
-
const runTool = agent.tools.get('run_command');
|
|
410
|
-
const result = await runTool.execute({ CommandLine: 'exit 42', Cwd: tmpDir, WaitMsBeforeAsync: 3000 }, { signal: new AbortController().signal, metadata: {} });
|
|
411
|
-
expect(result.content).toContain('exit code 42');
|
|
412
|
-
});
|
|
413
|
-
it('backgrounds immediately when WaitMsBeforeAsync is 0', async () => {
|
|
414
|
-
const agent = new Agent({ model: mockModel() });
|
|
415
|
-
agent.use(createCodeToolsExtension());
|
|
416
|
-
const runTool = agent.tools.get('run_command');
|
|
417
|
-
const manageTool = agent.tools.get('manage_task');
|
|
418
|
-
const result = await runTool.execute({ CommandLine: 'sleep 1', Cwd: tmpDir, WaitMsBeforeAsync: 0 }, { signal: new AbortController().signal, metadata: {} });
|
|
419
|
-
expect(result.content).toContain('Command sent to background. Task ID:');
|
|
420
|
-
const match = result.content.match(/Task ID: (task_[\w-]+)/);
|
|
421
|
-
expect(match).toBeTruthy();
|
|
422
|
-
const taskId = match[1];
|
|
423
|
-
// Check status using manage_task
|
|
424
|
-
const statusRes = await manageTool.execute({ Action: 'status', TaskId: taskId }, { signal: new AbortController().signal, metadata: {} });
|
|
425
|
-
expect(statusRes.content).toBeDefined();
|
|
426
|
-
// Kill the task
|
|
427
|
-
const killRes = await manageTool.execute({ Action: 'kill', TaskId: taskId }, { signal: new AbortController().signal, metadata: {} });
|
|
428
|
-
expect(killRes.content).toContain(`Killed task ${taskId}`);
|
|
429
|
-
});
|
|
430
|
-
it('fires the configured callback after a background task exits', async () => {
|
|
431
|
-
const callbackFile = join(tmpDir, 'callback.txt');
|
|
432
|
-
const callbackScript = join(tmpDir, 'callback.sh');
|
|
433
|
-
const shellsDir = join(tmpDir, 'shells');
|
|
434
|
-
writeFileSync(callbackScript, `printf '%s\\n' "$*" > "${callbackFile}"\n`);
|
|
435
|
-
const agent = new Agent({ model: mockModel() });
|
|
436
|
-
agent.use(createCodeToolsExtension({
|
|
437
|
-
shellsDir,
|
|
438
|
-
callbackBin: '/bin/bash',
|
|
439
|
-
callbackEntry: callbackScript,
|
|
440
|
-
callbackSessionKey: 'test-session',
|
|
441
|
-
}));
|
|
442
|
-
const runTool = agent.tools.get('run_command');
|
|
443
|
-
const result = await runTool.execute({ CommandLine: 'sleep 0.1; echo finished', Cwd: tmpDir, WaitMsBeforeAsync: 0 }, { signal: new AbortController().signal, metadata: { sessionId: 'slack-session' } });
|
|
444
|
-
const taskId = result.content.match(/Task ID: (task_[\w-]+)/)[1];
|
|
445
|
-
for (let i = 0; i < 20 && !existsSync(callbackFile); i++) {
|
|
446
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
447
|
-
}
|
|
448
|
-
const lifecycleFile = join(shellsDir, `${taskId}.output.lifecycle`);
|
|
449
|
-
for (let i = 0; i < 20 && (!existsSync(lifecycleFile) || !readFileSync(lifecycleFile, 'utf-8').includes('callback-exited')); i++) {
|
|
450
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
451
|
-
}
|
|
452
|
-
expect(readFileSync(join(shellsDir, `${taskId}.output`), 'utf-8')).toContain('finished');
|
|
453
|
-
const callback = readFileSync(callbackFile, 'utf-8');
|
|
454
|
-
expect(callback).toContain(`--session slack-session FYI: Background task ${taskId} finished`);
|
|
455
|
-
expect(callback).toContain('send it with slack-post');
|
|
456
|
-
const lifecycle = readFileSync(lifecycleFile, 'utf-8');
|
|
457
|
-
expect(lifecycle).toMatch(/^\[\d{4}-\d{2}-\d{2}T.*Z\] \[shell\]/m);
|
|
458
|
-
expect(lifecycle).toContain('command-exited code=0');
|
|
459
|
-
expect(lifecycle).toContain('callback-started pid=');
|
|
460
|
-
expect(lifecycle).toContain('callback-exited');
|
|
461
|
-
});
|
|
462
|
-
it('handles run_command and manage_task error conditions', async () => {
|
|
463
|
-
const agent = new Agent({ model: mockModel() });
|
|
464
|
-
agent.use(createCodeToolsExtension());
|
|
465
|
-
const runTool = agent.tools.get('run_command');
|
|
466
|
-
const manageTool = agent.tools.get('manage_task');
|
|
467
|
-
const noCmd = await runTool.execute({}, { signal: new AbortController().signal, metadata: {} });
|
|
468
|
-
expect(noCmd.content).toContain('CommandLine is required');
|
|
469
|
-
const noTaskId = await manageTool.execute({ Action: 'kill' }, { signal: new AbortController().signal, metadata: {} });
|
|
470
|
-
expect(noTaskId.content).toContain('TaskId is required');
|
|
471
|
-
const unknownTask = await manageTool.execute({ Action: 'status', TaskId: 'task_99999' }, { signal: new AbortController().signal, metadata: {} });
|
|
472
|
-
expect(unknownTask.content).toContain('no task with id "task_99999"');
|
|
473
|
-
const unknownAction = await manageTool.execute({ Action: 'dance', TaskId: 'task_1' }, { signal: new AbortController().signal, metadata: {} });
|
|
474
|
-
expect(unknownAction.content).toContain('no task with id');
|
|
475
|
-
});
|
|
476
|
-
});
|
|
477
|
-
// ── todo_write tool ─────────────────────────────────────────────────
|
|
478
|
-
describe('todo_write tool', () => {
|
|
479
|
-
it('creates and updates todos', async () => {
|
|
480
|
-
const todoFile = join(tmpDir, 'todos.json');
|
|
481
|
-
const agent = new Agent({ model: mockModel() });
|
|
482
|
-
agent.use(createCodeToolsExtension({ todoFile }));
|
|
483
|
-
const todoTool = agent.tools.get('todo_write');
|
|
484
|
-
const res1 = await todoTool.execute({
|
|
485
|
-
todos: [
|
|
486
|
-
{ content: 'Task 1', status: 'completed' },
|
|
487
|
-
{ content: 'Task 2', status: 'in_progress' },
|
|
488
|
-
{ content: 'Task 3', status: 'pending' },
|
|
489
|
-
],
|
|
490
|
-
}, { signal: new AbortController().signal, metadata: {} });
|
|
491
|
-
expect(res1.content).toContain('Updated todo list:');
|
|
492
|
-
expect(res1.content).toContain('[x] Task 1');
|
|
493
|
-
expect(res1.content).toContain('[~] Task 2');
|
|
494
|
-
expect(res1.content).toContain('[ ] Task 3');
|
|
495
|
-
// Check file persistence
|
|
496
|
-
const diskContent = JSON.parse(readFileSync(todoFile, 'utf-8'));
|
|
497
|
-
expect(diskContent).toHaveLength(3);
|
|
498
|
-
expect(diskContent[0].content).toBe('Task 1');
|
|
499
|
-
});
|
|
500
|
-
it('rejects multiple in_progress todos', async () => {
|
|
501
|
-
const agent = new Agent({ model: mockModel() });
|
|
502
|
-
agent.use(createCodeToolsExtension());
|
|
503
|
-
const todoTool = agent.tools.get('todo_write');
|
|
504
|
-
const res = await todoTool.execute({
|
|
505
|
-
todos: [
|
|
506
|
-
{ content: 'Task 1', status: 'in_progress' },
|
|
507
|
-
{ content: 'Task 2', status: 'in_progress' },
|
|
508
|
-
],
|
|
509
|
-
}, { signal: new AbortController().signal, metadata: {} });
|
|
510
|
-
expect(res.isError).toBe(true);
|
|
511
|
-
expect(res.content).toContain('only one todo can be "in_progress"');
|
|
512
|
-
});
|
|
513
|
-
});
|
|
514
|
-
// ── configuration & extension wiring ────────────────────────────────
|
|
515
|
-
describe('configuration', () => {
|
|
516
|
-
it('registers all 8 expected tools without prefix', () => {
|
|
517
|
-
const agent = new Agent({ model: mockModel() });
|
|
518
|
-
agent.use(createCodeToolsExtension());
|
|
519
|
-
const toolNames = Array.from(agent.tools.keys());
|
|
520
|
-
expect(toolNames).toContain('read');
|
|
521
|
-
expect(toolNames).toContain('write');
|
|
522
|
-
expect(toolNames).toContain('edit');
|
|
523
|
-
expect(toolNames).toContain('find_file_by_name');
|
|
524
|
-
expect(toolNames).toContain('grep');
|
|
525
|
-
expect(toolNames).toContain('run_command');
|
|
526
|
-
expect(toolNames).toContain('manage_task');
|
|
527
|
-
expect(toolNames).toContain('todo_write');
|
|
528
|
-
});
|
|
529
|
-
it('supports custom tool prefix', () => {
|
|
530
|
-
const agent = new Agent({ model: mockModel() });
|
|
531
|
-
agent.use(createCodeToolsExtension({ toolPrefix: 'custom' }));
|
|
532
|
-
const toolNames = Array.from(agent.tools.keys());
|
|
533
|
-
expect(toolNames).toContain('custom_read');
|
|
534
|
-
expect(toolNames).toContain('custom_write');
|
|
535
|
-
expect(toolNames).toContain('custom_edit');
|
|
536
|
-
expect(toolNames).toContain('custom_find_file_by_name');
|
|
537
|
-
expect(toolNames).toContain('custom_grep');
|
|
538
|
-
expect(toolNames).toContain('custom_run_command');
|
|
539
|
-
expect(toolNames).toContain('custom_manage_task');
|
|
540
|
-
expect(toolNames).toContain('custom_todo_write');
|
|
541
|
-
});
|
|
542
|
-
});
|
|
543
|
-
});
|
|
544
|
-
//# sourceMappingURL=extension.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.test.js","sourceRoot":"","sources":["../../../src/extensions/code-tools/extension.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.test.d.ts","sourceRoot":"","sources":["../../../src/extensions/disk-session/extension.test.ts"],"names":[],"mappings":""}
|