@chances-ai/engine 28.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.
Files changed (123) hide show
  1. package/dist/ai/adapters/ai-sdk-stream.js +15 -0
  2. package/dist/ai/adapters/ai-sdk-stream.js.map +1 -1
  3. package/dist/ai/types.d.ts +12 -0
  4. package/dist/ai/types.d.ts.map +1 -1
  5. package/dist/core/engine.d.ts +14 -0
  6. package/dist/core/engine.d.ts.map +1 -1
  7. package/dist/core/engine.js +48 -2
  8. package/dist/core/engine.js.map +1 -1
  9. package/dist/hashline/apply.d.ts +9 -0
  10. package/dist/hashline/apply.d.ts.map +1 -0
  11. package/dist/hashline/apply.js +523 -0
  12. package/dist/hashline/apply.js.map +1 -0
  13. package/dist/hashline/block.d.ts +25 -0
  14. package/dist/hashline/block.d.ts.map +1 -0
  15. package/dist/hashline/block.js +71 -0
  16. package/dist/hashline/block.js.map +1 -0
  17. package/dist/hashline/format.d.ts +106 -0
  18. package/dist/hashline/format.d.ts.map +1 -0
  19. package/dist/hashline/format.js +191 -0
  20. package/dist/hashline/format.js.map +1 -0
  21. package/dist/hashline/fs.d.ts +87 -0
  22. package/dist/hashline/fs.d.ts.map +1 -0
  23. package/dist/hashline/fs.js +123 -0
  24. package/dist/hashline/fs.js.map +1 -0
  25. package/dist/hashline/index.d.ts +27 -0
  26. package/dist/hashline/index.d.ts.map +1 -0
  27. package/dist/hashline/index.js +27 -0
  28. package/dist/hashline/index.js.map +1 -0
  29. package/dist/hashline/input.d.ts +101 -0
  30. package/dist/hashline/input.d.ts.map +1 -0
  31. package/dist/hashline/input.js +378 -0
  32. package/dist/hashline/input.js.map +1 -0
  33. package/dist/hashline/messages.d.ts +87 -0
  34. package/dist/hashline/messages.d.ts.map +1 -0
  35. package/dist/hashline/messages.js +94 -0
  36. package/dist/hashline/messages.js.map +1 -0
  37. package/dist/hashline/mismatch.d.ts +45 -0
  38. package/dist/hashline/mismatch.d.ts.map +1 -0
  39. package/dist/hashline/mismatch.js +118 -0
  40. package/dist/hashline/mismatch.js.map +1 -0
  41. package/dist/hashline/normalize.d.ts +22 -0
  42. package/dist/hashline/normalize.d.ts.map +1 -0
  43. package/dist/hashline/normalize.js +31 -0
  44. package/dist/hashline/normalize.js.map +1 -0
  45. package/dist/hashline/parser.d.ts +24 -0
  46. package/dist/hashline/parser.d.ts.map +1 -0
  47. package/dist/hashline/parser.js +295 -0
  48. package/dist/hashline/parser.js.map +1 -0
  49. package/dist/hashline/patcher.d.ts +111 -0
  50. package/dist/hashline/patcher.d.ts.map +1 -0
  51. package/dist/hashline/patcher.js +332 -0
  52. package/dist/hashline/patcher.js.map +1 -0
  53. package/dist/hashline/recovery.d.ts +41 -0
  54. package/dist/hashline/recovery.d.ts.map +1 -0
  55. package/dist/hashline/recovery.js +175 -0
  56. package/dist/hashline/recovery.js.map +1 -0
  57. package/dist/hashline/snapshots.d.ts +62 -0
  58. package/dist/hashline/snapshots.d.ts.map +1 -0
  59. package/dist/hashline/snapshots.js +127 -0
  60. package/dist/hashline/snapshots.js.map +1 -0
  61. package/dist/hashline/tokenizer.d.ts +66 -0
  62. package/dist/hashline/tokenizer.d.ts.map +1 -0
  63. package/dist/hashline/tokenizer.js +408 -0
  64. package/dist/hashline/tokenizer.js.map +1 -0
  65. package/dist/hashline/types.d.ts +117 -0
  66. package/dist/hashline/types.d.ts.map +1 -0
  67. package/dist/hashline/types.js +13 -0
  68. package/dist/hashline/types.js.map +1 -0
  69. package/dist/tools/builtins/_hashline-fs.d.ts +16 -0
  70. package/dist/tools/builtins/_hashline-fs.d.ts.map +1 -0
  71. package/dist/tools/builtins/_hashline-fs.js +62 -0
  72. package/dist/tools/builtins/_hashline-fs.js.map +1 -0
  73. package/dist/tools/builtins/_image.d.ts +26 -0
  74. package/dist/tools/builtins/_image.d.ts.map +1 -0
  75. package/dist/tools/builtins/_image.js +76 -0
  76. package/dist/tools/builtins/_image.js.map +1 -0
  77. package/dist/tools/builtins/_login-shell.d.ts +17 -0
  78. package/dist/tools/builtins/_login-shell.d.ts.map +1 -0
  79. package/dist/tools/builtins/_login-shell.js +66 -0
  80. package/dist/tools/builtins/_login-shell.js.map +1 -0
  81. package/dist/tools/builtins/_notebook.d.ts +15 -0
  82. package/dist/tools/builtins/_notebook.d.ts.map +1 -0
  83. package/dist/tools/builtins/_notebook.js +81 -0
  84. package/dist/tools/builtins/_notebook.js.map +1 -0
  85. package/dist/tools/builtins/_pdf.d.ts +19 -0
  86. package/dist/tools/builtins/_pdf.d.ts.map +1 -0
  87. package/dist/tools/builtins/_pdf.js +42 -0
  88. package/dist/tools/builtins/_pdf.js.map +1 -0
  89. package/dist/tools/builtins/_shared.d.ts +11 -0
  90. package/dist/tools/builtins/_shared.d.ts.map +1 -1
  91. package/dist/tools/builtins/_shared.js +40 -1
  92. package/dist/tools/builtins/_shared.js.map +1 -1
  93. package/dist/tools/builtins/ast-edit.d.ts +18 -0
  94. package/dist/tools/builtins/ast-edit.d.ts.map +1 -0
  95. package/dist/tools/builtins/ast-edit.js +109 -0
  96. package/dist/tools/builtins/ast-edit.js.map +1 -0
  97. package/dist/tools/builtins/ast-grep.d.ts +6 -0
  98. package/dist/tools/builtins/ast-grep.d.ts.map +1 -0
  99. package/dist/tools/builtins/ast-grep.js +67 -0
  100. package/dist/tools/builtins/ast-grep.js.map +1 -0
  101. package/dist/tools/builtins/bash.d.ts.map +1 -1
  102. package/dist/tools/builtins/bash.js +13 -2
  103. package/dist/tools/builtins/bash.js.map +1 -1
  104. package/dist/tools/builtins/edit.d.ts.map +1 -1
  105. package/dist/tools/builtins/edit.js +112 -31
  106. package/dist/tools/builtins/edit.js.map +1 -1
  107. package/dist/tools/builtins/read.d.ts.map +1 -1
  108. package/dist/tools/builtins/read.js +187 -11
  109. package/dist/tools/builtins/read.js.map +1 -1
  110. package/dist/tools/builtins.d.ts.map +1 -1
  111. package/dist/tools/builtins.js +4 -0
  112. package/dist/tools/builtins.js.map +1 -1
  113. package/dist/tools/file-lock.d.ts +8 -0
  114. package/dist/tools/file-lock.d.ts.map +1 -1
  115. package/dist/tools/file-lock.js +22 -0
  116. package/dist/tools/file-lock.js.map +1 -1
  117. package/dist/tools/index.d.ts +1 -1
  118. package/dist/tools/index.d.ts.map +1 -1
  119. package/dist/tools/index.js.map +1 -1
  120. package/dist/tools/types.d.ts +26 -0
  121. package/dist/tools/types.d.ts.map +1 -1
  122. package/dist/tools/types.js.map +1 -1
  123. 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":"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"}
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;AA6GpD,eAAO,MAAM,QAAQ,EAAE,IA2EtB,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":"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"}
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":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,QAAQ,EAAE,IAmCtB,CAAC"}
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 { dirname } from "node:path";
3
- import { native } from "@chances-ai/native";
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 { withFileLock } from "../file-lock.js";
6
- import { guardWrite, preview, str, writeFileAtomic } from "./_shared.js";
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: { path: { type: "string" }, find: { type: "string" }, replace: { type: "string" } },
14
- required: ["path", "find", "replace"],
66
+ properties: { patch: { type: "string", description: "A hashline patch (see the tool description)." } },
67
+ required: ["patch"],
15
68
  },
16
- summarize: (args) => {
17
- const path = str(args, "path");
18
- const find = str(args, "find");
19
- const replace = str(args, "replace");
20
- if (!find.includes("\n") && !replace.includes("\n")) {
21
- return `edit ${path}: replace ${preview(find)} ${preview(replace)}`;
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
- const path = guardWrite(ctx, str(args, "path"));
27
- // (7.7 §3.4) Hold the per-file mutation lock for the whole read-modify-write
28
- // so a concurrent edit/write to the SAME file (another subagent, task 08)
29
- // can't interleave and corrupt it. Reads never take the lock.
30
- return withFileLock(path, async () => {
31
- if (!existsSync(path))
32
- return { ok: false, output: `No such file: ${str(args, "path")}` };
33
- const find = str(args, "find");
34
- const content = readFileSync(path, "utf8");
35
- const count = content.split(find).length - 1;
36
- if (count === 0)
37
- return { ok: false, output: `Substring not found in ${str(args, "path")}` };
38
- if (count > 1)
39
- return { ok: false, output: `Substring not unique (${count} matches)` };
40
- writeFileAtomic(path, content.replace(find, str(args, "replace")));
41
- native.invalidateFsScanCache(dirname(path));
42
- return { ok: true, output: `Edited ${str(args, "path")}` };
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":"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"}
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":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,QAAQ,EAAE,IAatB,CAAC"}
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"}