@chances-ai/engine 27.0.0 → 29.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/dist/agents/bundled.d.ts +5 -0
- package/dist/agents/bundled.d.ts.map +1 -0
- package/dist/agents/bundled.js +66 -0
- package/dist/agents/bundled.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/parse.d.ts +3 -0
- package/dist/agents/parse.d.ts.map +1 -1
- package/dist/agents/parse.js +17 -0
- package/dist/agents/parse.js.map +1 -1
- package/dist/agents/types.d.ts +8 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/ai/adapters/ai-sdk-stream.js +15 -0
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -1
- package/dist/ai/types.d.ts +12 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/core/coordinator-mode.d.ts +32 -0
- package/dist/core/coordinator-mode.d.ts.map +1 -0
- package/dist/core/coordinator-mode.js +98 -0
- package/dist/core/coordinator-mode.js.map +1 -0
- package/dist/core/coordinator-tools.d.ts +22 -0
- package/dist/core/coordinator-tools.d.ts.map +1 -0
- package/dist/core/coordinator-tools.js +262 -0
- package/dist/core/coordinator-tools.js.map +1 -0
- package/dist/core/engine.d.ts +50 -6
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +107 -17
- package/dist/core/engine.js.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/task-tool.d.ts +85 -1
- package/dist/core/task-tool.d.ts.map +1 -1
- package/dist/core/task-tool.js +456 -500
- package/dist/core/task-tool.js.map +1 -1
- package/dist/hashline/apply.d.ts +9 -0
- package/dist/hashline/apply.d.ts.map +1 -0
- package/dist/hashline/apply.js +523 -0
- package/dist/hashline/apply.js.map +1 -0
- package/dist/hashline/block.d.ts +25 -0
- package/dist/hashline/block.d.ts.map +1 -0
- package/dist/hashline/block.js +71 -0
- package/dist/hashline/block.js.map +1 -0
- package/dist/hashline/format.d.ts +106 -0
- package/dist/hashline/format.d.ts.map +1 -0
- package/dist/hashline/format.js +191 -0
- package/dist/hashline/format.js.map +1 -0
- package/dist/hashline/fs.d.ts +87 -0
- package/dist/hashline/fs.d.ts.map +1 -0
- package/dist/hashline/fs.js +123 -0
- package/dist/hashline/fs.js.map +1 -0
- package/dist/hashline/index.d.ts +27 -0
- package/dist/hashline/index.d.ts.map +1 -0
- package/dist/hashline/index.js +27 -0
- package/dist/hashline/index.js.map +1 -0
- package/dist/hashline/input.d.ts +101 -0
- package/dist/hashline/input.d.ts.map +1 -0
- package/dist/hashline/input.js +378 -0
- package/dist/hashline/input.js.map +1 -0
- package/dist/hashline/messages.d.ts +87 -0
- package/dist/hashline/messages.d.ts.map +1 -0
- package/dist/hashline/messages.js +94 -0
- package/dist/hashline/messages.js.map +1 -0
- package/dist/hashline/mismatch.d.ts +45 -0
- package/dist/hashline/mismatch.d.ts.map +1 -0
- package/dist/hashline/mismatch.js +118 -0
- package/dist/hashline/mismatch.js.map +1 -0
- package/dist/hashline/normalize.d.ts +22 -0
- package/dist/hashline/normalize.d.ts.map +1 -0
- package/dist/hashline/normalize.js +31 -0
- package/dist/hashline/normalize.js.map +1 -0
- package/dist/hashline/parser.d.ts +24 -0
- package/dist/hashline/parser.d.ts.map +1 -0
- package/dist/hashline/parser.js +295 -0
- package/dist/hashline/parser.js.map +1 -0
- package/dist/hashline/patcher.d.ts +111 -0
- package/dist/hashline/patcher.d.ts.map +1 -0
- package/dist/hashline/patcher.js +332 -0
- package/dist/hashline/patcher.js.map +1 -0
- package/dist/hashline/recovery.d.ts +41 -0
- package/dist/hashline/recovery.d.ts.map +1 -0
- package/dist/hashline/recovery.js +175 -0
- package/dist/hashline/recovery.js.map +1 -0
- package/dist/hashline/snapshots.d.ts +62 -0
- package/dist/hashline/snapshots.d.ts.map +1 -0
- package/dist/hashline/snapshots.js +127 -0
- package/dist/hashline/snapshots.js.map +1 -0
- package/dist/hashline/tokenizer.d.ts +66 -0
- package/dist/hashline/tokenizer.d.ts.map +1 -0
- package/dist/hashline/tokenizer.js +408 -0
- package/dist/hashline/tokenizer.js.map +1 -0
- package/dist/hashline/types.d.ts +117 -0
- package/dist/hashline/types.d.ts.map +1 -0
- package/dist/hashline/types.js +13 -0
- package/dist/hashline/types.js.map +1 -0
- package/dist/tools/builtins/_hashline-fs.d.ts +16 -0
- package/dist/tools/builtins/_hashline-fs.d.ts.map +1 -0
- package/dist/tools/builtins/_hashline-fs.js +62 -0
- package/dist/tools/builtins/_hashline-fs.js.map +1 -0
- package/dist/tools/builtins/_image.d.ts +26 -0
- package/dist/tools/builtins/_image.d.ts.map +1 -0
- package/dist/tools/builtins/_image.js +76 -0
- package/dist/tools/builtins/_image.js.map +1 -0
- package/dist/tools/builtins/_login-shell.d.ts +17 -0
- package/dist/tools/builtins/_login-shell.d.ts.map +1 -0
- package/dist/tools/builtins/_login-shell.js +66 -0
- package/dist/tools/builtins/_login-shell.js.map +1 -0
- package/dist/tools/builtins/_notebook.d.ts +15 -0
- package/dist/tools/builtins/_notebook.d.ts.map +1 -0
- package/dist/tools/builtins/_notebook.js +81 -0
- package/dist/tools/builtins/_notebook.js.map +1 -0
- package/dist/tools/builtins/_pdf.d.ts +19 -0
- package/dist/tools/builtins/_pdf.d.ts.map +1 -0
- package/dist/tools/builtins/_pdf.js +42 -0
- package/dist/tools/builtins/_pdf.js.map +1 -0
- package/dist/tools/builtins/_shared.d.ts +11 -0
- package/dist/tools/builtins/_shared.d.ts.map +1 -1
- package/dist/tools/builtins/_shared.js +40 -1
- package/dist/tools/builtins/_shared.js.map +1 -1
- package/dist/tools/builtins/ast-edit.d.ts +18 -0
- package/dist/tools/builtins/ast-edit.d.ts.map +1 -0
- package/dist/tools/builtins/ast-edit.js +109 -0
- package/dist/tools/builtins/ast-edit.js.map +1 -0
- package/dist/tools/builtins/ast-grep.d.ts +6 -0
- package/dist/tools/builtins/ast-grep.d.ts.map +1 -0
- package/dist/tools/builtins/ast-grep.js +67 -0
- package/dist/tools/builtins/ast-grep.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +13 -2
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +112 -31
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/read.d.ts.map +1 -1
- package/dist/tools/builtins/read.js +187 -11
- package/dist/tools/builtins/read.js.map +1 -1
- package/dist/tools/builtins.d.ts.map +1 -1
- package/dist/tools/builtins.js +4 -0
- package/dist/tools/builtins.js.map +1 -1
- package/dist/tools/file-lock.d.ts +8 -0
- package/dist/tools/file-lock.d.ts.map +1 -1
- package/dist/tools/file-lock.js +22 -0
- package/dist/tools/file-lock.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +26 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/package.json +8 -3
|
@@ -45,6 +45,12 @@ export declare function guardWrite(ctx: ToolContext, p: string): string;
|
|
|
45
45
|
export declare function safePath(ctx: ToolContext, p: string, opts?: {
|
|
46
46
|
resolveSymlinks?: boolean;
|
|
47
47
|
}): string;
|
|
48
|
+
/** **Hashline snapshot key.** The canonical absolute path under which `read`
|
|
49
|
+
* records a file's full-text snapshot and `edit`'s patcher resolves the section
|
|
50
|
+
* tag — both MUST agree or every edit would re-read. Lexical `resolve(cwd, p)`
|
|
51
|
+
* (NOT realpath): it must match how the model re-states the path in a patch
|
|
52
|
+
* header, and the realpath jail already runs at write time. (7.9) */
|
|
53
|
+
export declare function hashlineSnapshotKey(ctx: ToolContext, p: string): string;
|
|
48
54
|
/** Atomically write `body` to `path`: write a sibling temp file then `rename`
|
|
49
55
|
* over the target (rename is atomic within a filesystem), so a crash mid-write
|
|
50
56
|
* never leaves a half-written file. Creates parent dirs. The temp lives in the
|
|
@@ -82,5 +88,10 @@ export declare function safeArtifactId(raw: string): string;
|
|
|
82
88
|
* bit on Windows; ACL-based access control is not enforced via this
|
|
83
89
|
* argument. POSIX-first audience; explicit DACL hardening is a follow-up.
|
|
84
90
|
*/
|
|
91
|
+
/** (7.9 [5.10]) Bound the `.chances/tool-results/` ring: keep the `max`
|
|
92
|
+
* most-recently-modified artifact dirs, delete the rest. Best-effort — a prune
|
|
93
|
+
* failure never affects the tool result. Called after a bash persist so a long
|
|
94
|
+
* session's persisted outputs can't grow unbounded. */
|
|
95
|
+
export declare function pruneToolResultsRing(workspaceRoot: string, max?: number): void;
|
|
85
96
|
export declare function persistFullOutput(workspaceRoot: string, body: string, prefix?: string, filename?: string, id?: string): string | null;
|
|
86
97
|
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/_shared.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;sDAEsD;AACtD,eAAO,MAAM,gBAAgB,QAAa,CAAC;AAE3C,wBAAgB,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKvE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOvE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAKzE;AAED;;;;;;;yCAOyC;AACzC,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED;;;;;;;;;;;;mCAYmC;AACnC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpE;AAED;;;;;wEAKwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED;;;eAGe;AACf,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAGlG;AAED;;;kEAGkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAahE;AAED,6EAA6E;AAC7E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGzC;AAaD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEnF;;;;;;;;;;;mFAWmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,SAAS,EACf,QAAQ,SAAe,EACvB,EAAE,CAAC,EAAE,MAAM,GACV,MAAM,GAAG,IAAI,CAef"}
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/_shared.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;sDAEsD;AACtD,eAAO,MAAM,gBAAgB,QAAa,CAAC;AAE3C,wBAAgB,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKvE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOvE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAKzE;AAED;;;;;;;yCAOyC;AACzC,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED;;;;;;;;;;;;mCAYmC;AACnC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpE;AAED;;;;;wEAKwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED;;;eAGe;AACf,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAGlG;AAED;;;;qEAIqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;kEAGkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAahE;AAED,6EAA6E;AAC7E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGzC;AAaD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEnF;;;;;;;;;;;mFAWmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;;;;;;;;;;;GAeG;AACH;;;uDAGuD;AACvD,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,IAAI,CAuB3E;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,SAAS,EACf,QAAQ,SAAe,EACvB,EAAE,CAAC,EAAE,MAAM,GACV,MAAM,GAAG,IAAI,CAef"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { chmodSync, mkdirSync, renameSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { chmodSync, mkdirSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
4
4
|
import { native } from "@chances-ai/native";
|
|
5
5
|
import { AppError, ErrorCode, createId, currentCwdOverride } from "@chances-ai/runtime";
|
|
@@ -98,6 +98,14 @@ export function safePath(ctx, p, opts) {
|
|
|
98
98
|
const isolated = currentCwdOverride() !== undefined;
|
|
99
99
|
return isolated || opts?.resolveSymlinks ? containWritePath(ctx, p) : containReadPath(ctx, p);
|
|
100
100
|
}
|
|
101
|
+
/** **Hashline snapshot key.** The canonical absolute path under which `read`
|
|
102
|
+
* records a file's full-text snapshot and `edit`'s patcher resolves the section
|
|
103
|
+
* tag — both MUST agree or every edit would re-read. Lexical `resolve(cwd, p)`
|
|
104
|
+
* (NOT realpath): it must match how the model re-states the path in a patch
|
|
105
|
+
* header, and the realpath jail already runs at write time. (7.9) */
|
|
106
|
+
export function hashlineSnapshotKey(ctx, p) {
|
|
107
|
+
return isAbsolute(p) ? p : resolve(ctx.cwd, p);
|
|
108
|
+
}
|
|
101
109
|
/** Atomically write `body` to `path`: write a sibling temp file then `rename`
|
|
102
110
|
* over the target (rename is atomic within a filesystem), so a crash mid-write
|
|
103
111
|
* never leaves a half-written file. Creates parent dirs. The temp lives in the
|
|
@@ -167,6 +175,37 @@ export function safeArtifactId(raw) {
|
|
|
167
175
|
* bit on Windows; ACL-based access control is not enforced via this
|
|
168
176
|
* argument. POSIX-first audience; explicit DACL hardening is a follow-up.
|
|
169
177
|
*/
|
|
178
|
+
/** (7.9 [5.10]) Bound the `.chances/tool-results/` ring: keep the `max`
|
|
179
|
+
* most-recently-modified artifact dirs, delete the rest. Best-effort — a prune
|
|
180
|
+
* failure never affects the tool result. Called after a bash persist so a long
|
|
181
|
+
* session's persisted outputs can't grow unbounded. */
|
|
182
|
+
export function pruneToolResultsRing(workspaceRoot, max = 100) {
|
|
183
|
+
try {
|
|
184
|
+
const dir = join(workspaceRoot, ".chances", "tool-results");
|
|
185
|
+
const entries = readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
186
|
+
if (entries.length <= max)
|
|
187
|
+
return;
|
|
188
|
+
const byMtime = entries
|
|
189
|
+
.map((e) => {
|
|
190
|
+
const full = join(dir, e.name);
|
|
191
|
+
let mtimeMs = 0;
|
|
192
|
+
try {
|
|
193
|
+
mtimeMs = statSync(full).mtimeMs;
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
/* racing removal — treat as oldest */
|
|
197
|
+
}
|
|
198
|
+
return { full, mtimeMs };
|
|
199
|
+
})
|
|
200
|
+
.sort((a, b) => a.mtimeMs - b.mtimeMs);
|
|
201
|
+
for (const victim of byMtime.slice(0, byMtime.length - max)) {
|
|
202
|
+
rmSync(victim.full, { recursive: true, force: true });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
/* best-effort */
|
|
207
|
+
}
|
|
208
|
+
}
|
|
170
209
|
export function persistFullOutput(workspaceRoot, body, prefix = "tool", filename = "output.txt", id) {
|
|
171
210
|
try {
|
|
172
211
|
// `id !== undefined` (not truthiness) so an empty-string call id still
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/tools/builtins/_shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/tools/builtins/_shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Tool } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Structural rewrite across files (ast-grep `pattern` → `rewrite`). High-risk:
|
|
4
|
+
* the native pass walks a directory and rewrites every match, so the TS wrapper
|
|
5
|
+
* (R1-M2) enforces the workspace's write safety the native layer can't:
|
|
6
|
+
*
|
|
7
|
+
* 1. realpath-jail the search root;
|
|
8
|
+
* 2. dry-run to learn the affected file set;
|
|
9
|
+
* 3. `guardWrite` EVERY affected file (jail + protected-path floor) — any
|
|
10
|
+
* failure aborts the whole pass with zero writes;
|
|
11
|
+
* 4. hold all affected files' mutation locks (sorted, deadlock-free);
|
|
12
|
+
* 5. only then run the real (write) pass; invalidate fs-scan caches.
|
|
13
|
+
*
|
|
14
|
+
* The `permission()` hook scopes the approval cache to `ctx.callId`, so every
|
|
15
|
+
* invocation re-prompts — ast_edit is never auto-approved (R1-OQ6).
|
|
16
|
+
*/
|
|
17
|
+
export declare const astEditTool: Tool;
|
|
18
|
+
//# sourceMappingURL=ast-edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-edit.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/ast-edit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAwB,IAAI,EAA2B,MAAM,aAAa,CAAC;AAIvF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,EAAE,IAuFzB,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { native } from "@chances-ai/native";
|
|
3
|
+
import { withSortedFileLocks } from "../file-lock.js";
|
|
4
|
+
import { astErr } from "./ast-grep.js";
|
|
5
|
+
import { containWritePath, guardWrite, optStr, preview, str } from "./_shared.js";
|
|
6
|
+
/**
|
|
7
|
+
* Structural rewrite across files (ast-grep `pattern` → `rewrite`). High-risk:
|
|
8
|
+
* the native pass walks a directory and rewrites every match, so the TS wrapper
|
|
9
|
+
* (R1-M2) enforces the workspace's write safety the native layer can't:
|
|
10
|
+
*
|
|
11
|
+
* 1. realpath-jail the search root;
|
|
12
|
+
* 2. dry-run to learn the affected file set;
|
|
13
|
+
* 3. `guardWrite` EVERY affected file (jail + protected-path floor) — any
|
|
14
|
+
* failure aborts the whole pass with zero writes;
|
|
15
|
+
* 4. hold all affected files' mutation locks (sorted, deadlock-free);
|
|
16
|
+
* 5. only then run the real (write) pass; invalidate fs-scan caches.
|
|
17
|
+
*
|
|
18
|
+
* The `permission()` hook scopes the approval cache to `ctx.callId`, so every
|
|
19
|
+
* invocation re-prompts — ast_edit is never auto-approved (R1-OQ6).
|
|
20
|
+
*/
|
|
21
|
+
export const astEditTool = {
|
|
22
|
+
name: "ast_edit",
|
|
23
|
+
category: "file-write",
|
|
24
|
+
description: "Structural find-and-replace across files with an ast-grep pattern → rewrite (e.g. `console.log($A)` → " +
|
|
25
|
+
"`logger.info($A)`). Matches by SYNTAX and rewrites every occurrence under `path` (a file or directory, " +
|
|
26
|
+
"default: workspace root), so it is the right tool for a global rename/refactor that `edit` would need many " +
|
|
27
|
+
"hunks for. Each run is previewed (dry-run) and requires explicit approval — it can touch many files. " +
|
|
28
|
+
"`$A`/`$$$` metavariables captured by the pattern can be referenced in the rewrite.",
|
|
29
|
+
parameters: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
pattern: { type: "string" },
|
|
33
|
+
rewrite: { type: "string", description: "Replacement template; may reference $A/$$$ metavars from the pattern." },
|
|
34
|
+
path: { type: "string", description: "File or directory to rewrite (default: workspace root)." },
|
|
35
|
+
lang: { type: "string" },
|
|
36
|
+
glob: { type: "string", description: "Glob filter for relative paths in a directory walk." },
|
|
37
|
+
},
|
|
38
|
+
required: ["pattern", "rewrite"],
|
|
39
|
+
},
|
|
40
|
+
// Never auto-approve: a per-call cacheKey means the gate prompts every time.
|
|
41
|
+
permission(args, ctx) {
|
|
42
|
+
return {
|
|
43
|
+
name: "ast_edit",
|
|
44
|
+
category: "file-write",
|
|
45
|
+
summary: `ast_edit (structural rewrite, may touch multiple files): ${preview(str(args, "pattern"))} → ${preview(str(args, "rewrite"))}${optStr(args, "path") ? ` under ${optStr(args, "path")}` : ""}`,
|
|
46
|
+
args,
|
|
47
|
+
cacheKey: `ast_edit:${ctx.callId ?? "no-call"}`,
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
summarize: (args) => {
|
|
51
|
+
const where = optStr(args, "path");
|
|
52
|
+
return `ast_edit ${preview(str(args, "pattern"))} → ${preview(str(args, "rewrite"))}${where ? ` under ${where}` : ""}`;
|
|
53
|
+
},
|
|
54
|
+
async execute(args, ctx) {
|
|
55
|
+
const pattern = str(args, "pattern");
|
|
56
|
+
const rewrite = str(args, "rewrite");
|
|
57
|
+
const lang = optStr(args, "lang");
|
|
58
|
+
const glob = optStr(args, "glob");
|
|
59
|
+
// (R1-M2 step 1) realpath-jail the search root within the workspace.
|
|
60
|
+
let root;
|
|
61
|
+
try {
|
|
62
|
+
root = containWritePath(ctx, optStr(args, "path") ?? ".");
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return { ok: false, output: err instanceof Error ? err.message : String(err) };
|
|
66
|
+
}
|
|
67
|
+
// (R1-M2 step 2) dry-run to learn the affected file set.
|
|
68
|
+
let dry;
|
|
69
|
+
try {
|
|
70
|
+
dry = await native.astEdit({ pattern, rewrite, path: root, lang, glob, dryRun: true });
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return { ok: false, output: astErr(err, "ast_edit") };
|
|
74
|
+
}
|
|
75
|
+
if (dry.replacements === 0) {
|
|
76
|
+
return { ok: true, output: `No matches for ${JSON.stringify(pattern)} — nothing rewritten.` };
|
|
77
|
+
}
|
|
78
|
+
// (R1-M2 step 3) guardWrite EVERY affected file (jail + protected floor).
|
|
79
|
+
// Any rejection aborts before a single byte is written.
|
|
80
|
+
const affected = dry.files.map((f) => join(root, f.path));
|
|
81
|
+
try {
|
|
82
|
+
for (const abs of affected)
|
|
83
|
+
guardWrite(ctx, abs);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return { ok: false, output: `ast_edit refused: ${err instanceof Error ? err.message : String(err)}` };
|
|
87
|
+
}
|
|
88
|
+
// (R1-M2 steps 4-5) hold all locks, run the real pass, invalidate caches.
|
|
89
|
+
return withSortedFileLocks(affected, async () => {
|
|
90
|
+
let result;
|
|
91
|
+
try {
|
|
92
|
+
result = await native.astEdit({ pattern, rewrite, path: root, lang, glob, dryRun: false });
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return { ok: false, output: astErr(err, "ast_edit") };
|
|
96
|
+
}
|
|
97
|
+
for (const dir of new Set(affected.map((p) => dirname(p)))) {
|
|
98
|
+
native.invalidateFsScanCache(dir);
|
|
99
|
+
}
|
|
100
|
+
const fileList = result.files.map((f) => ` ${f.path} (${f.count})`).join("\n");
|
|
101
|
+
return {
|
|
102
|
+
ok: true,
|
|
103
|
+
output: `Rewrote ${result.replacements} occurrence(s) across ${result.files.length} file(s). ` +
|
|
104
|
+
`Re-read any file before a follow-up hashline edit (its tag changed):\n${fileList}`,
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=ast-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/ast-edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Tool } from "../types.js";
|
|
2
|
+
/** Turn an `AST_UNAVAILABLE`/native error into model-facing guidance. */
|
|
3
|
+
declare function astErr(err: unknown, tool: string): string;
|
|
4
|
+
export declare const astGrepTool: Tool;
|
|
5
|
+
export { astErr };
|
|
6
|
+
//# sourceMappingURL=ast-grep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-grep.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/ast-grep.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AASpD,yEAAyE;AACzE,iBAAS,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,eAAO,MAAM,WAAW,EAAE,IAiDzB,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { native } from "@chances-ai/native";
|
|
2
|
+
import { containReadPath, optNum, optStr, preview, str } from "./_shared.js";
|
|
3
|
+
/** Collapse a (possibly multi-line) match to a single trimmed preview line. */
|
|
4
|
+
function oneLine(text, max = 100) {
|
|
5
|
+
const flat = text.replace(/\s+/g, " ").trim();
|
|
6
|
+
return flat.length > max ? `${flat.slice(0, max)}…` : flat;
|
|
7
|
+
}
|
|
8
|
+
/** Turn an `AST_UNAVAILABLE`/native error into model-facing guidance. */
|
|
9
|
+
function astErr(err, tool) {
|
|
10
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
11
|
+
if (/AST|unavailable|not a function/i.test(msg)) {
|
|
12
|
+
return `${tool} is unavailable in this build (the native tree-sitter module is absent). Use grep for a text search instead.`;
|
|
13
|
+
}
|
|
14
|
+
return `${tool} failed: ${msg}`;
|
|
15
|
+
}
|
|
16
|
+
export const astGrepTool = {
|
|
17
|
+
name: "ast_grep",
|
|
18
|
+
category: "file-read",
|
|
19
|
+
description: "Structural code search with an ast-grep pattern (e.g. `console.log($A)`, `function $F($$$) { $$$ }`). " +
|
|
20
|
+
"Matches by SYNTAX, not text — robust to formatting, whitespace, and line breaks. Returns `path:line:col` " +
|
|
21
|
+
"hits. Prefer over `grep` when you want to match a code shape rather than a string. `path` may be a file or " +
|
|
22
|
+
"directory (default: workspace root); `lang` is inferred from extension; `glob` filters a directory walk.",
|
|
23
|
+
parameters: {
|
|
24
|
+
type: "object",
|
|
25
|
+
properties: {
|
|
26
|
+
pattern: { type: "string" },
|
|
27
|
+
path: { type: "string", description: "File or directory to search (default: workspace root)." },
|
|
28
|
+
lang: { type: "string", description: "Language alias (e.g. ts, rust); inferred from extension if omitted." },
|
|
29
|
+
glob: { type: "string", description: "Glob filter for relative paths in a directory search." },
|
|
30
|
+
limit: { type: "number", description: "Max matches to return (default 100)." },
|
|
31
|
+
},
|
|
32
|
+
required: ["pattern"],
|
|
33
|
+
},
|
|
34
|
+
summarize: (args) => {
|
|
35
|
+
const where = optStr(args, "path");
|
|
36
|
+
return `ast-grep ${preview(str(args, "pattern"))}${where ? ` in ${where}` : ""}`;
|
|
37
|
+
},
|
|
38
|
+
async execute(args, ctx) {
|
|
39
|
+
const pattern = str(args, "pattern");
|
|
40
|
+
const path = containReadPath(ctx, optStr(args, "path") ?? ".");
|
|
41
|
+
try {
|
|
42
|
+
const res = await native.astGrep({
|
|
43
|
+
pattern,
|
|
44
|
+
path,
|
|
45
|
+
lang: optStr(args, "lang"),
|
|
46
|
+
glob: optStr(args, "glob"),
|
|
47
|
+
limit: optNum(args, "limit"),
|
|
48
|
+
});
|
|
49
|
+
if (res.matches.length === 0) {
|
|
50
|
+
return { ok: true, output: `No matches for ${JSON.stringify(pattern)} (searched ${res.filesSearched} file(s)).` };
|
|
51
|
+
}
|
|
52
|
+
const lines = res.matches.map((m) => `${m.path}:${m.startLine}:${m.startColumn} ${oneLine(m.text)}`);
|
|
53
|
+
const more = res.limitReached
|
|
54
|
+
? `\n… ${res.totalMatches} total matches; showing ${res.matches.length}. Raise limit or narrow the pattern.`
|
|
55
|
+
: "";
|
|
56
|
+
return {
|
|
57
|
+
ok: true,
|
|
58
|
+
output: `${res.totalMatches} match(es) across ${res.filesSearched} file(s):\n${lines.join("\n")}${more}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
return { ok: false, output: astErr(err, "ast_grep") };
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
export { astErr };
|
|
67
|
+
//# sourceMappingURL=ast-grep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-grep.js","sourceRoot":"","sources":["../../../src/tools/builtins/ast-grep.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAoHpD,eAAO,MAAM,QAAQ,EAAE,IA+EtB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { native } from "@chances-ai/native";
|
|
2
2
|
import { isBashCommandReadOnly } from "../bash-readonly.js";
|
|
3
|
-
import { cleanOutput, optNum, persistFullOutput, str } from "./_shared.js";
|
|
3
|
+
import { cleanOutput, optNum, persistFullOutput, pruneToolResultsRing, str } from "./_shared.js";
|
|
4
|
+
import { ensureLoginShellPath } from "./_login-shell.js";
|
|
4
5
|
/**
|
|
5
6
|
* `bash` runs a shell command in a real PTY when the native addon is
|
|
6
7
|
* loaded — programs see `isatty(stdout) === true`, signals propagate to
|
|
@@ -83,9 +84,16 @@ function formatBody(cleaned, workspaceRoot, runtimeDropped, callId) {
|
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
86
|
const persistedPath = persistFullOutput(workspaceRoot, cleaned, "bash", "output.txt", callId);
|
|
87
|
+
// (7.9 [5.10], goose) Give the model EXACT read-back commands, not a vague
|
|
88
|
+
// "output truncated" — it can page the persisted file deterministically.
|
|
89
|
+
const readBack = persistedPath
|
|
90
|
+
? ` Read more with \`sed -n '1,400p' ${persistedPath}\`, \`tail -n 200 ${persistedPath}\`, or \`grep -n PATTERN ${persistedPath}\`.`
|
|
91
|
+
: "";
|
|
86
92
|
const banner = persistedPath
|
|
87
|
-
? `[output truncated: showing first ${headStr} KB of ${totalStr} KB; full output saved to ${persistedPath}${runtimeNote}]`
|
|
93
|
+
? `[output truncated: showing first ${headStr} KB of ${totalStr} KB; full output saved to ${persistedPath}${runtimeNote}.${readBack}]`
|
|
88
94
|
: `[output truncated: showing first ${headStr} KB of ${totalStr} KB; persistence failed, remainder dropped${runtimeNote}]`;
|
|
95
|
+
if (persistedPath)
|
|
96
|
+
pruneToolResultsRing(workspaceRoot);
|
|
89
97
|
return {
|
|
90
98
|
body: `${banner}\n${head}`,
|
|
91
99
|
persistedPath,
|
|
@@ -122,6 +130,9 @@ export const bashTool = {
|
|
|
122
130
|
async execute(args, ctx) {
|
|
123
131
|
const command = str(args, "command");
|
|
124
132
|
const timeoutMs = clampTimeoutMs(optNum(args, "timeout"));
|
|
133
|
+
// (7.9 [5.9]) Ensure the child inherits the user's real PATH even when the
|
|
134
|
+
// process was GUI-launched (Electron desktop). One-shot, best-effort.
|
|
135
|
+
ensureLoginShellPath();
|
|
125
136
|
const result = await native.ptyRun({
|
|
126
137
|
command,
|
|
127
138
|
cwd: ctx.cwd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAWA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAyDjE,eAAO,MAAM,QAAQ,EAAE,IA+DtB,CAAC"}
|
|
@@ -1,45 +1,126 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { AppError, ErrorCode } from "@chances-ai/runtime";
|
|
3
|
+
import { InMemorySnapshotStore, MismatchError, Patch, Patcher, } from "../../hashline/index.js";
|
|
4
4
|
import { linesDiff } from "../diff.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { withSortedFileLocks } from "../file-lock.js";
|
|
6
|
+
import { EngineToolFs, makeBlockResolver } from "./_hashline-fs.js";
|
|
7
|
+
import { hashlineSnapshotKey, str } from "./_shared.js";
|
|
8
|
+
/**
|
|
9
|
+
* The model-facing hashline edit contract (7.9 [5.1], R1-S8/S9). Carried on the
|
|
10
|
+
* tool `description` so it reaches the provider. Distilled from oh-my-pi's
|
|
11
|
+
* battle-tested `prompt.md`.
|
|
12
|
+
*/
|
|
13
|
+
const EDIT_TOOL_PROMPT = `Edit existing files with a hashline patch. (To CREATE a file, use the write tool.)
|
|
14
|
+
|
|
15
|
+
A patch is one or more file sections. Each section starts with a header copied verbatim from your latest read/search output:
|
|
16
|
+
¶path#TAG
|
|
17
|
+
TAG is the 4-hex snapshot tag; it binds the edit to that exact file version and is REQUIRED.
|
|
18
|
+
|
|
19
|
+
Ops (line numbers are from read's LINE:TEXT, refer to the ORIGINAL file, and stay valid for the whole patch — they do NOT shift as hunks apply):
|
|
20
|
+
replace N..M: replace original lines N..M with the +body rows below (single line: replace N..N: or replace N:).
|
|
21
|
+
replace block N: replace the whole syntactic block that BEGINS on line N (tree-sitter; point N at the opening line, not a closing brace).
|
|
22
|
+
delete N..M delete original lines N..M. No body. (single: delete N)
|
|
23
|
+
delete block N delete the whole syntactic block beginning on line N. No body.
|
|
24
|
+
insert before N: insert the +body rows immediately before line N.
|
|
25
|
+
insert after N: insert the +body rows immediately after line N.
|
|
26
|
+
insert head: insert at the very start of the file.
|
|
27
|
+
insert tail: insert at the very end of the file.
|
|
28
|
+
|
|
29
|
+
Body rows appear only under a ':' header and are ALWAYS '+TEXT' (a new literal line, verbatim; '+' alone is a blank line). There is NO '-old' row and no bare/context row — the range does the deleting; the body is only the final new content. To insert a line starting with '+' or '-', prefix it: '++x' / '+-x'.
|
|
30
|
+
|
|
31
|
+
Rules:
|
|
32
|
+
- Keep ranges TIGHT: cover only lines whose content actually changes. To change lines 2 and 5 while keeping 3-4, issue two hunks (replace 2..2: and replace 5..5:).
|
|
33
|
+
- Multiple files / multiple hunks: just stack more sections / ops (this replaces any separate multi-edit tool). For a global rename across files, prefer the ast_edit tool.
|
|
34
|
+
- RE-GROUND AFTER EVERY EDIT: each applied edit mints a fresh #TAG and renumbers the file, so the tag and line numbers you just used are dead. Anchor the next edit on the ¶path#TAG and lines from THIS edit's response (or re-read). On a stale-tag rejection or any unexpected result, STOP and re-read — never stack more line-numbered edits onto output you have not re-grounded.
|
|
35
|
+
|
|
36
|
+
Example:
|
|
37
|
+
¶src/util.ts#1A2B
|
|
38
|
+
replace 2..2:
|
|
39
|
+
+ const greeting = "Hi";
|
|
40
|
+
delete 5`;
|
|
41
|
+
/** Extract a human-readable message from an unknown thrown value. */
|
|
42
|
+
function errMsg(err) {
|
|
43
|
+
return err instanceof Error ? err.message : String(err);
|
|
44
|
+
}
|
|
45
|
+
/** Best-effort structured-diff preview for one section (permission overlay). */
|
|
46
|
+
function previewSection(section, ctx) {
|
|
47
|
+
try {
|
|
48
|
+
const abs = hashlineSnapshotKey(ctx, section.path);
|
|
49
|
+
if (!existsSync(abs))
|
|
50
|
+
return `edit ${section.path}: (file not found)`;
|
|
51
|
+
const before = readFileSync(abs, "utf8").replace(/\r\n?/g, "\n");
|
|
52
|
+
const after = section.applyPartialTo(before, makeBlockResolver()).text;
|
|
53
|
+
return `edit ${section.path}\n${linesDiff(before, after)}`;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
const hunks = section.diff.split("\n").filter((l) => /^\s*(replace|delete|insert)\b/.test(l)).length;
|
|
57
|
+
return `edit ${section.path}: ${hunks} hunk(s)`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
7
60
|
export const editTool = {
|
|
8
61
|
name: "edit",
|
|
9
|
-
description: "Replace an exact, unique substring in a workspace file.",
|
|
10
62
|
category: "file-write",
|
|
63
|
+
description: EDIT_TOOL_PROMPT,
|
|
11
64
|
parameters: {
|
|
12
65
|
type: "object",
|
|
13
|
-
properties: {
|
|
14
|
-
required: ["
|
|
66
|
+
properties: { patch: { type: "string", description: "A hashline patch (see the tool description)." } },
|
|
67
|
+
required: ["patch"],
|
|
15
68
|
},
|
|
16
|
-
summarize: (args) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return
|
|
69
|
+
summarize: (args, ctx) => {
|
|
70
|
+
try {
|
|
71
|
+
const patch = Patch.parse(str(args, "patch"), { cwd: ctx.cwd });
|
|
72
|
+
if (patch.sections.length === 0)
|
|
73
|
+
return "edit (no sections)";
|
|
74
|
+
return patch.sections.map((s) => previewSection(s, ctx)).join("\n");
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return `edit (unparseable patch: ${errMsg(err)})`;
|
|
22
78
|
}
|
|
23
|
-
return `edit ${path}\n${linesDiff(find, replace)}`;
|
|
24
79
|
},
|
|
25
80
|
async execute(args, ctx) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
81
|
+
let patch;
|
|
82
|
+
try {
|
|
83
|
+
patch = Patch.parse(str(args, "patch"), { cwd: ctx.cwd });
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return { ok: false, output: errMsg(err) };
|
|
87
|
+
}
|
|
88
|
+
if (patch.sections.length === 0) {
|
|
89
|
+
return { ok: false, output: "No hashline sections found. Each section starts with `¶path#TAG` from your latest read." };
|
|
90
|
+
}
|
|
91
|
+
const snapshots = ctx.snapshots ?? new InMemorySnapshotStore();
|
|
92
|
+
const fs = new EngineToolFs(ctx);
|
|
93
|
+
const patcher = new Patcher({ fs, snapshots, blockResolver: makeBlockResolver() });
|
|
94
|
+
const lockPaths = patch.sections.map((s) => hashlineSnapshotKey(ctx, s.path));
|
|
95
|
+
// (R1-M1) Hold every affected file's mutation lock across the WHOLE
|
|
96
|
+
// prepare(all)+commit(all) span — hash check, apply, restore, and write all
|
|
97
|
+
// run inside the lock so a concurrent writer (another subagent, task 08)
|
|
98
|
+
// can't slip between preflight and write. Sorted acquisition = deadlock-free.
|
|
99
|
+
return withSortedFileLocks(lockPaths, async () => {
|
|
100
|
+
try {
|
|
101
|
+
const result = await patcher.apply(patch);
|
|
102
|
+
const blocks = result.sections.map((s) => {
|
|
103
|
+
const firstChange = s.firstChangedLine !== undefined ? ` (first change at line ${s.firstChangedLine})` : "";
|
|
104
|
+
const warns = s.warnings.length > 0 ? `\n${s.warnings.map((w) => `⚠ ${w}`).join("\n")}` : "";
|
|
105
|
+
return `${s.header}${firstChange}${warns}`;
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
ok: true,
|
|
109
|
+
output: `Edited ${result.sections.length} file(s). The tags below are fresh — anchor any follow-up edit on them ` +
|
|
110
|
+
`(the tags and line numbers you just used are now dead):\n${blocks.join("\n")}`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// Security violations (realpath jail escape / protected path) are hard
|
|
115
|
+
// failures — let them propagate so the write path can never be coaxed
|
|
116
|
+
// into a soft "couldn't apply" that the model might retry around.
|
|
117
|
+
if (err instanceof AppError && err.code === ErrorCode.Permission)
|
|
118
|
+
throw err;
|
|
119
|
+
// Stale-tag / unrecoverable mismatch → re-read (carries the file preview).
|
|
120
|
+
if (err instanceof MismatchError)
|
|
121
|
+
return { ok: false, output: err.displayMessage };
|
|
122
|
+
return { ok: false, output: errMsg(err) };
|
|
123
|
+
}
|
|
43
124
|
});
|
|
44
125
|
},
|
|
45
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/read.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/read.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AA2EpD,eAAO,MAAM,QAAQ,EAAE,IA+HtB,CAAC"}
|