@namzu/sdk 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +40 -10
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/registry/tool/execute.test.js +93 -7
- package/dist/registry/tool/execute.test.js.map +1 -1
- package/dist/registry/toolset/catalog.d.ts.map +1 -1
- package/dist/registry/toolset/catalog.js +17 -4
- package/dist/registry/toolset/catalog.js.map +1 -1
- package/dist/registry/toolset/catalog.test.js +101 -0
- package/dist/registry/toolset/catalog.test.js.map +1 -1
- package/dist/runtime/query/__tests__/capability-negotiation.test.js +79 -0
- package/dist/runtime/query/__tests__/capability-negotiation.test.js.map +1 -1
- package/dist/runtime/query/__tests__/deferred-tools.test.js +100 -0
- package/dist/runtime/query/__tests__/deferred-tools.test.js.map +1 -1
- package/dist/runtime/query/__tests__/long-document-flow.test.js +12 -12
- package/dist/runtime/query/__tests__/long-document-flow.test.js.map +1 -1
- package/dist/runtime/query/__tests__/stream-recovery.test.js +1 -1
- package/dist/runtime/query/__tests__/stream-recovery.test.js.map +1 -1
- package/dist/runtime/query/executor.js +2 -2
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +10 -0
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/tools/builtins/__tests__/edit.test.js +206 -54
- package/dist/tools/builtins/__tests__/edit.test.js.map +1 -1
- package/dist/tools/builtins/__tests__/payload-budget.test.js +30 -16
- package/dist/tools/builtins/__tests__/payload-budget.test.js.map +1 -1
- package/dist/tools/builtins/__tests__/write-file.test.js +37 -13
- package/dist/tools/builtins/__tests__/write-file.test.js.map +1 -1
- package/dist/tools/builtins/atomic-write-file.d.ts +13 -0
- package/dist/tools/builtins/atomic-write-file.d.ts.map +1 -0
- package/dist/tools/builtins/atomic-write-file.js +46 -0
- package/dist/tools/builtins/atomic-write-file.js.map +1 -0
- package/dist/tools/builtins/bash.js +2 -2
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts +2 -5
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +107 -125
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/file-mutation-lock.d.ts +7 -0
- package/dist/tools/builtins/file-mutation-lock.d.ts.map +1 -0
- package/dist/tools/builtins/file-mutation-lock.js +25 -0
- package/dist/tools/builtins/file-mutation-lock.js.map +1 -0
- package/dist/tools/builtins/index.js +2 -2
- package/dist/tools/builtins/index.js.map +1 -1
- package/dist/tools/builtins/write-file.d.ts +1 -2
- package/dist/tools/builtins/write-file.d.ts.map +1 -1
- package/dist/tools/builtins/write-file.js +66 -40
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/defineTool.d.ts +2 -0
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +2 -0
- package/dist/tools/defineTool.js.map +1 -1
- package/dist/types/provider/chat.d.ts +9 -0
- package/dist/types/provider/chat.d.ts.map +1 -1
- package/dist/types/sandbox/index.d.ts +4 -0
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/tool/index.d.ts +14 -0
- package/dist/types/tool/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/registry/tool/execute.test.ts +107 -7
- package/src/registry/tool/execute.ts +45 -10
- package/src/registry/toolset/catalog.test.ts +118 -0
- package/src/registry/toolset/catalog.ts +26 -4
- package/src/runtime/query/__tests__/capability-negotiation.test.ts +88 -0
- package/src/runtime/query/__tests__/deferred-tools.test.ts +111 -0
- package/src/runtime/query/__tests__/long-document-flow.test.ts +12 -12
- package/src/runtime/query/__tests__/stream-recovery.test.ts +1 -1
- package/src/runtime/query/executor.ts +2 -2
- package/src/runtime/query/iteration/index.ts +15 -0
- package/src/tools/builtins/__tests__/edit.test.ts +248 -64
- package/src/tools/builtins/__tests__/payload-budget.test.ts +40 -20
- package/src/tools/builtins/__tests__/write-file.test.ts +52 -13
- package/src/tools/builtins/atomic-write-file.ts +58 -0
- package/src/tools/builtins/bash.ts +2 -2
- package/src/tools/builtins/edit.ts +117 -163
- package/src/tools/builtins/file-mutation-lock.ts +27 -0
- package/src/tools/builtins/index.ts +2 -2
- package/src/tools/builtins/write-file.ts +68 -44
- package/src/tools/defineTool.ts +4 -0
- package/src/types/provider/chat.ts +14 -1
- package/src/types/sandbox/index.ts +4 -0
- package/src/types/tool/index.ts +14 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-budget.test.js","sourceRoot":"","sources":["../../../../src/tools/builtins/__tests__/payload-budget.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAChF,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAEpC,MAAM,CAAC,GAAG,EAAE,CACX,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAChF,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACf,MAAM,CAAC,GAAG,EAAE,CACX,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;YAC1B,IAAI,EAAE,iBAAiB;YACvB,
|
|
1
|
+
{"version":3,"file":"payload-budget.test.js","sourceRoot":"","sources":["../../../../src/tools/builtins/__tests__/payload-budget.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,10 @@ import { WriteFileTool } from '../write-file.js';
|
|
|
6
6
|
function makeTracker() {
|
|
7
7
|
const set = new Set();
|
|
8
8
|
return {
|
|
9
|
-
recordRead: (
|
|
10
|
-
set.add(
|
|
9
|
+
recordRead: (key) => {
|
|
10
|
+
set.add(key);
|
|
11
11
|
},
|
|
12
|
-
hasRead: (
|
|
12
|
+
hasRead: (key) => set.has(key),
|
|
13
13
|
keys: () => Array.from(set),
|
|
14
14
|
};
|
|
15
15
|
}
|
|
@@ -23,7 +23,27 @@ function makeContext(workingDirectory, tracker) {
|
|
|
23
23
|
fileReadTracker: tracker,
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
-
describe('WriteFileTool — read-before-overwrite invariant', () => {
|
|
26
|
+
describe('WriteFileTool — canonical contract and read-before-overwrite invariant', () => {
|
|
27
|
+
it('publishes one closed path + content contract', () => {
|
|
28
|
+
expect(WriteFileTool.modelInputSchema).toEqual({
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
path: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Non-empty path to the file to write.',
|
|
34
|
+
},
|
|
35
|
+
content: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Complete bounded file body. May be empty only for an intentionally empty file.',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ['path', 'content'],
|
|
41
|
+
additionalProperties: false,
|
|
42
|
+
});
|
|
43
|
+
expect(WriteFileTool.inputSchema.safeParse({ path: 'doc.md', content: '' }).success).toBe(true);
|
|
44
|
+
expect(WriteFileTool.inputSchema.safeParse({ path: 'doc.md', newStr: 'legacy' }).success).toBe(false);
|
|
45
|
+
expect(WriteFileTool.inputSchema.safeParse({ path: ' ', content: 'body' }).success).toBe(false);
|
|
46
|
+
});
|
|
27
47
|
it('writes a new file without requiring a prior read', async () => {
|
|
28
48
|
const dir = mkdtempSync(join(tmpdir(), 'namzu-write-'));
|
|
29
49
|
const tracker = makeTracker();
|
|
@@ -33,13 +53,17 @@ describe('WriteFileTool — read-before-overwrite invariant', () => {
|
|
|
33
53
|
expect(readFileSync(join(dir, 'fresh.txt'), 'utf-8')).toBe('hello');
|
|
34
54
|
expect(tracker.hasRead(join(dir, 'fresh.txt'))).toBe(true);
|
|
35
55
|
});
|
|
36
|
-
it('
|
|
56
|
+
it('preserves edge whitespace in a valid path', async () => {
|
|
37
57
|
const dir = mkdtempSync(join(tmpdir(), 'namzu-write-'));
|
|
38
|
-
const
|
|
39
|
-
const ctx = makeContext(dir, tracker);
|
|
40
|
-
const result = await WriteFileTool.execute({ path: 'fresh.txt', newStr: 'hello' }, ctx);
|
|
58
|
+
const result = await WriteFileTool.execute({ path: ' fresh.txt ', content: 'hello' }, makeContext(dir));
|
|
41
59
|
expect(result.success).toBe(true);
|
|
42
|
-
expect(readFileSync(join(dir, 'fresh.txt'), 'utf-8')).toBe('hello');
|
|
60
|
+
expect(readFileSync(join(dir, ' fresh.txt '), 'utf-8')).toBe('hello');
|
|
61
|
+
});
|
|
62
|
+
it('rejects legacy content aliases even when execute is called directly', async () => {
|
|
63
|
+
const dir = mkdtempSync(join(tmpdir(), 'namzu-write-'));
|
|
64
|
+
const result = await WriteFileTool.execute({ path: 'fresh.txt', newStr: 'legacy' }, makeContext(dir));
|
|
65
|
+
expect(result.success).toBe(false);
|
|
66
|
+
expect(result.error).toContain('Invalid write input');
|
|
43
67
|
});
|
|
44
68
|
it('refuses to overwrite an existing file the agent has not read', async () => {
|
|
45
69
|
const dir = mkdtempSync(join(tmpdir(), 'namzu-write-'));
|
|
@@ -62,13 +86,13 @@ describe('WriteFileTool — read-before-overwrite invariant', () => {
|
|
|
62
86
|
expect(result.success).toBe(true);
|
|
63
87
|
expect(readFileSync(filePath, 'utf-8')).toBe('replaced');
|
|
64
88
|
});
|
|
65
|
-
it('
|
|
89
|
+
it('preserves existing hosts without a file read tracker', async () => {
|
|
66
90
|
const dir = mkdtempSync(join(tmpdir(), 'namzu-write-'));
|
|
67
|
-
writeFileSync(join(dir, '
|
|
91
|
+
writeFileSync(join(dir, 'existing.txt'), 'before');
|
|
68
92
|
const ctx = makeContext(dir);
|
|
69
|
-
const result = await WriteFileTool.execute({ path: '
|
|
93
|
+
const result = await WriteFileTool.execute({ path: 'existing.txt', content: 'after' }, ctx);
|
|
70
94
|
expect(result.success).toBe(true);
|
|
71
|
-
expect(readFileSync(join(dir, '
|
|
95
|
+
expect(readFileSync(join(dir, 'existing.txt'), 'utf-8')).toBe('after');
|
|
72
96
|
});
|
|
73
97
|
});
|
|
74
98
|
//# sourceMappingURL=write-file.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.test.js","sourceRoot":"","sources":["../../../../src/tools/builtins/__tests__/write-file.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,SAAS,WAAW;IACnB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,OAAO;QACN,UAAU,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"write-file.test.js","sourceRoot":"","sources":["../../../../src/tools/builtins/__tests__/write-file.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface AtomicWriteHooks {
|
|
2
|
+
/** Internal fault-injection seam; production callers never pass this. */
|
|
3
|
+
beforeCommit?: () => Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Commit a complete file body without exposing a truncated destination.
|
|
7
|
+
*
|
|
8
|
+
* The temp file lives beside the destination so rename stays on one
|
|
9
|
+
* filesystem. A failed pre-commit write leaves the original untouched.
|
|
10
|
+
*/
|
|
11
|
+
export declare function atomicWriteFile(filePath: string, content: string, hooks?: AtomicWriteHooks): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=atomic-write-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write-file.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/atomic-write-file.ts"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACzB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAClC;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,gBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, open, rename, stat, unlink } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname, join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Commit a complete file body without exposing a truncated destination.
|
|
6
|
+
*
|
|
7
|
+
* The temp file lives beside the destination so rename stays on one
|
|
8
|
+
* filesystem. A failed pre-commit write leaves the original untouched.
|
|
9
|
+
*/
|
|
10
|
+
export async function atomicWriteFile(filePath, content, hooks = {}) {
|
|
11
|
+
const directory = dirname(filePath);
|
|
12
|
+
await mkdir(directory, { recursive: true });
|
|
13
|
+
const existingMode = await stat(filePath)
|
|
14
|
+
.then((value) => value.mode)
|
|
15
|
+
.catch(() => undefined);
|
|
16
|
+
const tempPath = join(directory, `.${basename(filePath)}.namzu-${process.pid}-${randomUUID()}.tmp`);
|
|
17
|
+
let handle;
|
|
18
|
+
let committed = false;
|
|
19
|
+
try {
|
|
20
|
+
handle = await open(tempPath, 'wx', existingMode ?? 0o666);
|
|
21
|
+
await handle.writeFile(content, 'utf-8');
|
|
22
|
+
await handle.sync();
|
|
23
|
+
await handle.close();
|
|
24
|
+
handle = undefined;
|
|
25
|
+
await hooks.beforeCommit?.();
|
|
26
|
+
await rename(tempPath, filePath);
|
|
27
|
+
committed = true;
|
|
28
|
+
await syncDirectory(directory);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await handle?.close().catch(() => undefined);
|
|
32
|
+
if (!committed)
|
|
33
|
+
await unlink(tempPath).catch(() => undefined);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function syncDirectory(directory) {
|
|
37
|
+
let handle;
|
|
38
|
+
try {
|
|
39
|
+
handle = await open(directory, 'r');
|
|
40
|
+
await handle.sync();
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
await handle?.close().catch(() => undefined);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=atomic-write-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write-file.js","sourceRoot":"","sources":["../../../src/tools/builtins/atomic-write-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAmB,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACrF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAOnD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,QAAgB,EAChB,OAAe,EACf,QAA0B,EAAE;IAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;SACvC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC3B,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IACxB,MAAM,QAAQ,GAAG,IAAI,CACpB,SAAS,EACT,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CACjE,CAAA;IACD,IAAI,MAA8B,CAAA;IAClC,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,IAAI,CAAC;QACJ,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,IAAI,KAAK,CAAC,CAAA;QAC1D,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACxC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QACnB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,MAAM,GAAG,SAAS,CAAA;QAClB,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,CAAA;QAC5B,MAAM,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAChC,SAAS,GAAG,IAAI,CAAA;QAChB,MAAM,aAAa,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,SAAS;YAAE,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC9D,CAAC;AACF,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAiB;IAC7C,IAAI,MAA8B,CAAA;IAClC,IAAI,CAAC;QACJ,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QACnC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IACpB,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC7C,CAAC;AACF,CAAC"}
|
|
@@ -16,7 +16,7 @@ const inputSchema = z.object({
|
|
|
16
16
|
command: z
|
|
17
17
|
.string()
|
|
18
18
|
.min(1)
|
|
19
|
-
.describe('The bash command to execute. Required, non-empty. Single command per call (use `&&` / `;` chaining for compound commands). Avoid heredocs that span more than a few hundred bytes — large content
|
|
19
|
+
.describe('The bash command to execute. Required, non-empty. Single command per call (use `&&` / `;` chaining for compound commands). Avoid heredocs that span more than a few hundred bytes — create large content with bounded write plus exact marker-advancing edit calls instead.'),
|
|
20
20
|
timeout: z
|
|
21
21
|
.preprocess((v) => (typeof v === 'string' ? Number(v) : v), z.number().default(DEFAULT_BASH_TIMEOUT_MS))
|
|
22
22
|
.describe(`Command timeout in milliseconds. Default: ${DEFAULT_BASH_TIMEOUT_MS}`),
|
|
@@ -26,7 +26,7 @@ function isDangerousCommand(command) {
|
|
|
26
26
|
}
|
|
27
27
|
export const BashTool = defineTool({
|
|
28
28
|
name: 'bash',
|
|
29
|
-
description: 'Executes a bash command and returns stdout/stderr output. Command timeout is configurable. The `command` parameter is required — never call this tool with empty arguments. For very long content
|
|
29
|
+
description: 'Executes a bash command and returns stdout/stderr output. Command timeout is configurable. The `command` parameter is required — never call this tool with empty arguments. For very long content, prefer a bounded write with a deterministic marker followed by exact marker-advancing edit calls over a heredoc.',
|
|
30
30
|
inputSchema,
|
|
31
31
|
category: 'shell',
|
|
32
32
|
permissions: ['shell_execute'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;AACjC,kEAAkE;AAClE,kEAAkE;AAClE,mEAAmE;AACnE,gEAAgE;AAChE,iEAAiE;AACjE,oCAAoC;AACpC,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;AAC3F,MAAM,6BAA6B,GAAG,kBAAkB,CACvD,6BAA6B,EAC7B,GAAG,GAAG,IAAI,GAAG,IAAI,CACjB,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACR,
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
export declare const EditTool: import("../../public-types.js").ToolDefinition<{
|
|
2
2
|
path: string;
|
|
3
|
+
old_string: string;
|
|
4
|
+
new_string: string;
|
|
3
5
|
replace_all: boolean;
|
|
4
|
-
newStr?: string | undefined;
|
|
5
|
-
old_string?: string | undefined;
|
|
6
|
-
oldStr?: string | undefined;
|
|
7
|
-
new_string?: string | undefined;
|
|
8
|
-
insertLine?: number | "end" | undefined;
|
|
9
6
|
}>;
|
|
10
7
|
//# sourceMappingURL=edit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"AAiEA,eAAO,MAAM,QAAQ;;;;;EAwEnB,CAAA"}
|
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
import { readFile
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { defineTool } from '../defineTool.js';
|
|
5
|
+
import { atomicWriteFile } from './atomic-write-file.js';
|
|
6
|
+
import { withFileMutationLock } from './file-mutation-lock.js';
|
|
5
7
|
const inputSchema = z
|
|
6
8
|
.object({
|
|
7
|
-
path: z
|
|
8
|
-
old_string: z
|
|
9
|
+
path: z
|
|
9
10
|
.string()
|
|
10
|
-
.
|
|
11
|
-
.describe('
|
|
12
|
-
|
|
11
|
+
.refine((value) => value.trim().length > 0, 'Path must not be empty.')
|
|
12
|
+
.describe('Path to the file to edit. Must not be empty.'),
|
|
13
|
+
old_string: z
|
|
13
14
|
.string()
|
|
14
|
-
.
|
|
15
|
-
.describe('
|
|
15
|
+
.min(1)
|
|
16
|
+
.describe('The exact unique text to replace, without read-tool line-number prefixes. Must not be empty.'),
|
|
16
17
|
new_string: z
|
|
17
18
|
.string()
|
|
18
|
-
.
|
|
19
|
-
.describe('The replacement string. Self-budget this payload under 12000 characters before calling.'),
|
|
20
|
-
newStr: z
|
|
21
|
-
.string()
|
|
22
|
-
.optional()
|
|
23
|
-
.describe('Alias for new_string. Also used as inserted content when insertLine is provided. Self-budget this payload under 12000 characters before calling.'),
|
|
24
|
-
insertLine: z
|
|
25
|
-
.union([z.number().int().min(0), z.literal('end')])
|
|
26
|
-
.optional()
|
|
27
|
-
.describe('Optional line insertion target. Pass a JSON integer to insert after that 1-indexed line, 0 to insert before the first line, or the exact string "end" to append. Headings, anchors, numeric strings, null, and empty strings are invalid.'),
|
|
19
|
+
.describe('The exact replacement text. May be empty to delete old_string. Keep this payload under 12000 characters.'),
|
|
28
20
|
replace_all: z
|
|
29
21
|
.boolean()
|
|
30
22
|
.default(false)
|
|
31
|
-
.describe('Replace
|
|
23
|
+
.describe('Replace every occurrence instead of requiring one unique match.'),
|
|
32
24
|
})
|
|
33
|
-
.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
25
|
+
.strict();
|
|
26
|
+
const modelInputSchema = {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
path: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Path to the file to edit. Must not be empty.',
|
|
32
|
+
},
|
|
33
|
+
old_string: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'Exact unique text from the file, without read-tool line-number prefixes. Must not be empty.',
|
|
36
|
+
},
|
|
37
|
+
new_string: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'Exact replacement text. May be empty to delete old_string. Keep under 12000 characters.',
|
|
40
|
+
},
|
|
41
|
+
replace_all: {
|
|
42
|
+
type: 'boolean',
|
|
43
|
+
description: 'Replace every occurrence instead of requiring one unique match.',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ['path', 'old_string', 'new_string'],
|
|
47
|
+
additionalProperties: false,
|
|
48
|
+
};
|
|
39
49
|
export const EditTool = defineTool({
|
|
40
50
|
name: 'edit',
|
|
41
|
-
description:
|
|
51
|
+
description: "Performs one targeted exact-string replacement in an existing file. Pass path + old_string + new_string; old_string must match exactly and be unique unless replace_all is true. Read the file immediately before editing, preserve whitespace and indentation, and never include the read tool's line-number prefix in old_string. To append or insert, replace a unique existing tail/marker with itself plus the new text; advance a deterministic marker such as {{CHUNK_001}} to {{CHUNK_002}} so replaying a completed edit cannot duplicate content. Prefer this tool over rewriting an existing file. Self-budget new_string under 12000 characters.",
|
|
42
52
|
inputSchema,
|
|
43
|
-
|
|
53
|
+
modelInputSchema,
|
|
54
|
+
enforceModelInput: true,
|
|
55
|
+
validationErrorHint: 'Required shape: {"path":"file.md","old_string":"exact unique text","new_string":"replacement text"}. Optional: "replace_all": true.',
|
|
44
56
|
category: 'filesystem',
|
|
45
57
|
permissions: ['file_write'],
|
|
46
58
|
readOnly: false,
|
|
47
59
|
destructive: false,
|
|
48
60
|
concurrencySafe: false,
|
|
49
61
|
async execute(input, context) {
|
|
50
|
-
const
|
|
51
|
-
if (!
|
|
52
|
-
return {
|
|
62
|
+
const parsed = inputSchema.safeParse(input);
|
|
63
|
+
if (!parsed.success) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
output: '',
|
|
67
|
+
error: `Invalid edit input: ${parsed.error.issues.map((issue) => issue.message).join('; ')}`,
|
|
68
|
+
};
|
|
53
69
|
}
|
|
54
|
-
|
|
55
|
-
|
|
70
|
+
const canonicalInput = parsed.data;
|
|
71
|
+
const replacement = {
|
|
72
|
+
oldString: canonicalInput.old_string,
|
|
73
|
+
newString: canonicalInput.new_string,
|
|
74
|
+
replaceAll: canonicalInput.replace_all,
|
|
75
|
+
};
|
|
76
|
+
if (replacement.oldString === replacement.newString) {
|
|
56
77
|
return {
|
|
57
78
|
success: false,
|
|
58
79
|
output: '',
|
|
59
|
-
error: 'old_string
|
|
80
|
+
error: 'old_string and new_string are identical — no change needed.',
|
|
60
81
|
};
|
|
61
82
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
83
|
+
const filePath = resolve(context.workingDirectory, canonicalInput.path);
|
|
84
|
+
const lockKey = `${context.sandbox ? 'sandbox' : 'local'}:${filePath}`;
|
|
85
|
+
return withFileMutationLock(lockKey, async () => {
|
|
86
|
+
if (context.sandbox) {
|
|
87
|
+
const buffer = await context.sandbox.readFile(canonicalInput.path);
|
|
88
|
+
const result = applyEdit(buffer.toString('utf-8'), replacement);
|
|
89
|
+
if (!result.success)
|
|
90
|
+
return { success: false, output: '', error: result.error };
|
|
91
|
+
await context.sandbox.writeFile(canonicalInput.path, result.content);
|
|
92
|
+
return {
|
|
93
|
+
success: true,
|
|
94
|
+
output: `Edited ${canonicalInput.path}: ${result.replacements} replacement(s) [sandboxed]`,
|
|
95
|
+
data: {
|
|
96
|
+
path: canonicalInput.path,
|
|
97
|
+
replacements: result.replacements,
|
|
98
|
+
sandboxed: true,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
69
101
|
}
|
|
70
|
-
await
|
|
102
|
+
const content = await readFile(filePath, 'utf-8');
|
|
103
|
+
const result = applyEdit(content, replacement);
|
|
104
|
+
if (!result.success)
|
|
105
|
+
return { success: false, output: '', error: result.error };
|
|
106
|
+
await atomicWriteFile(filePath, result.content);
|
|
71
107
|
return {
|
|
72
108
|
success: true,
|
|
73
|
-
output: `Edited ${
|
|
74
|
-
data: { path:
|
|
109
|
+
output: `Edited ${filePath}: ${result.replacements} replacement(s)`,
|
|
110
|
+
data: { path: filePath, replacements: result.replacements },
|
|
75
111
|
};
|
|
76
|
-
}
|
|
77
|
-
const filePath = resolve(context.workingDirectory, input.path);
|
|
78
|
-
const content = await readFile(filePath, 'utf-8');
|
|
79
|
-
const result = applyEdit(content, normalized.operation);
|
|
80
|
-
if (!result.success) {
|
|
81
|
-
return { success: false, output: '', error: result.error };
|
|
82
|
-
}
|
|
83
|
-
await writeFile(filePath, result.content, 'utf-8');
|
|
84
|
-
return {
|
|
85
|
-
success: true,
|
|
86
|
-
output: `Edited ${filePath}: ${result.replacements} replacement(s)`,
|
|
87
|
-
data: { path: filePath, replacements: result.replacements },
|
|
88
|
-
};
|
|
112
|
+
});
|
|
89
113
|
},
|
|
90
114
|
});
|
|
91
|
-
function
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
if (input.insertLine !== undefined) {
|
|
97
|
-
const insertLine = normalizeInsertLine(input.insertLine);
|
|
98
|
-
if (!insertLine.success)
|
|
99
|
-
return insertLine;
|
|
115
|
+
function normalizeLineEndings(content, input) {
|
|
116
|
+
const withoutCrlf = content.replaceAll('\r\n', '');
|
|
117
|
+
const usesOnlyCrlf = content.includes('\r\n') && !withoutCrlf.includes('\n');
|
|
118
|
+
if (usesOnlyCrlf) {
|
|
100
119
|
return {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
replace_all: input.replace_all,
|
|
107
|
-
},
|
|
120
|
+
...input,
|
|
121
|
+
oldString: content.includes(input.oldString)
|
|
122
|
+
? input.oldString
|
|
123
|
+
: input.oldString.replaceAll('\r\n', '\n').replaceAll('\n', '\r\n'),
|
|
124
|
+
newString: input.newString.replaceAll('\r\n', '\n').replaceAll('\n', '\r\n'),
|
|
108
125
|
};
|
|
109
126
|
}
|
|
110
|
-
const
|
|
111
|
-
if (
|
|
112
|
-
return {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
newString,
|
|
120
|
-
replace_all: input.replace_all,
|
|
121
|
-
},
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
function normalizeInsertLine(value) {
|
|
125
|
-
if (value === 'end')
|
|
126
|
-
return { success: true, value: 'end' };
|
|
127
|
-
if (typeof value === 'number' && Number.isInteger(value) && value >= 0) {
|
|
128
|
-
return { success: true, value };
|
|
127
|
+
const usesOnlyLf = content.includes('\n') && !content.includes('\r\n');
|
|
128
|
+
if (usesOnlyLf) {
|
|
129
|
+
return {
|
|
130
|
+
...input,
|
|
131
|
+
oldString: content.includes(input.oldString)
|
|
132
|
+
? input.oldString
|
|
133
|
+
: input.oldString.replaceAll('\r\n', '\n'),
|
|
134
|
+
newString: input.newString.replaceAll('\r\n', '\n'),
|
|
135
|
+
};
|
|
129
136
|
}
|
|
130
|
-
return
|
|
131
|
-
success: false,
|
|
132
|
-
error: 'insertLine must be a non-negative line number or "end".',
|
|
133
|
-
};
|
|
137
|
+
return input;
|
|
134
138
|
}
|
|
135
|
-
function applyEdit(content,
|
|
136
|
-
|
|
137
|
-
return applyLineInsert(content, input);
|
|
138
|
-
}
|
|
139
|
+
function applyEdit(content, rawInput) {
|
|
140
|
+
const input = normalizeLineEndings(content, rawInput);
|
|
139
141
|
if (!content.includes(input.oldString)) {
|
|
140
142
|
return {
|
|
141
143
|
success: false,
|
|
142
|
-
error: 'old_string
|
|
144
|
+
error: 'old_string was not found. Read the file again and copy exact text without line-number prefixes.',
|
|
143
145
|
};
|
|
144
146
|
}
|
|
145
|
-
if (input.
|
|
147
|
+
if (input.replaceAll) {
|
|
146
148
|
const parts = content.split(input.oldString);
|
|
147
|
-
const replacements = parts.length - 1;
|
|
148
149
|
return {
|
|
149
150
|
success: true,
|
|
150
151
|
content: parts.join(input.newString),
|
|
151
|
-
replacements,
|
|
152
|
+
replacements: parts.length - 1,
|
|
152
153
|
};
|
|
153
154
|
}
|
|
154
|
-
// Uniqueness check: old_string/oldStr must appear exactly once
|
|
155
155
|
const firstIndex = content.indexOf(input.oldString);
|
|
156
|
-
const secondIndex = content.indexOf(input.oldString, firstIndex +
|
|
156
|
+
const secondIndex = content.indexOf(input.oldString, firstIndex + input.oldString.length);
|
|
157
157
|
if (secondIndex !== -1) {
|
|
158
|
-
const
|
|
158
|
+
const firstLine = content.slice(0, firstIndex).split('\n').length;
|
|
159
159
|
const secondLine = content.slice(0, secondIndex).split('\n').length;
|
|
160
160
|
return {
|
|
161
161
|
success: false,
|
|
162
|
-
error: `old_string
|
|
162
|
+
error: `old_string is not unique — found at lines ${firstLine} and ${secondLine}. Include more surrounding context, or use replace_all: true.`,
|
|
163
163
|
};
|
|
164
164
|
}
|
|
165
165
|
return {
|
|
@@ -170,22 +170,4 @@ function applyEdit(content, input) {
|
|
|
170
170
|
replacements: 1,
|
|
171
171
|
};
|
|
172
172
|
}
|
|
173
|
-
function applyLineInsert(content, input) {
|
|
174
|
-
const hasTrailingNewline = content.endsWith('\n');
|
|
175
|
-
const lines = content.split('\n');
|
|
176
|
-
if (hasTrailingNewline)
|
|
177
|
-
lines.pop();
|
|
178
|
-
const line = input.insertLine === 'end'
|
|
179
|
-
? lines.length
|
|
180
|
-
: Math.min(Math.max(input.insertLine, 0), lines.length);
|
|
181
|
-
const inserted = input.newString.endsWith('\n')
|
|
182
|
-
? input.newString.slice(0, -1).split('\n')
|
|
183
|
-
: input.newString.split('\n');
|
|
184
|
-
lines.splice(line, 0, ...inserted);
|
|
185
|
-
return {
|
|
186
|
-
success: true,
|
|
187
|
-
content: `${lines.join('\n')}${hasTrailingNewline ? '\n' : ''}`,
|
|
188
|
-
replacements: 1,
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
173
|
//# sourceMappingURL=edit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialize read-modify-write filesystem operations by resolved path within
|
|
3
|
+
* one SDK process. Distributed hosts must still assign one writer per file or
|
|
4
|
+
* provide a storage-level compare-and-swap primitive.
|
|
5
|
+
*/
|
|
6
|
+
export declare function withFileMutationLock<T>(key: string, operation: () => Promise<T>): Promise<T>;
|
|
7
|
+
//# sourceMappingURL=file-mutation-lock.d.ts.map
|