@prestyj/cli 4.3.164 → 4.3.201

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 (258) hide show
  1. package/dist/cli.js +106 -27
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/agent-session.d.ts +50 -1
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +175 -20
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/agents.d.ts +6 -1
  8. package/dist/core/agents.d.ts.map +1 -1
  9. package/dist/core/agents.js +112 -3
  10. package/dist/core/agents.js.map +1 -1
  11. package/dist/core/auth-storage.d.ts.map +1 -1
  12. package/dist/core/auth-storage.js +20 -1
  13. package/dist/core/auth-storage.js.map +1 -1
  14. package/dist/core/claude-code-version.d.ts +10 -0
  15. package/dist/core/claude-code-version.d.ts.map +1 -0
  16. package/dist/core/claude-code-version.js +106 -0
  17. package/dist/core/claude-code-version.js.map +1 -0
  18. package/dist/core/compaction/compactor.d.ts +13 -0
  19. package/dist/core/compaction/compactor.d.ts.map +1 -1
  20. package/dist/core/compaction/compactor.js +20 -1
  21. package/dist/core/compaction/compactor.js.map +1 -1
  22. package/dist/core/compaction/compactor.test.js +12 -1
  23. package/dist/core/compaction/compactor.test.js.map +1 -1
  24. package/dist/core/index.d.ts +1 -1
  25. package/dist/core/index.d.ts.map +1 -1
  26. package/dist/core/index.js +1 -1
  27. package/dist/core/index.js.map +1 -1
  28. package/dist/core/model-registry.d.ts +30 -2
  29. package/dist/core/model-registry.d.ts.map +1 -1
  30. package/dist/core/model-registry.js +41 -26
  31. package/dist/core/model-registry.js.map +1 -1
  32. package/dist/core/model-registry.test.d.ts +2 -0
  33. package/dist/core/model-registry.test.d.ts.map +1 -0
  34. package/dist/core/model-registry.test.js +19 -0
  35. package/dist/core/model-registry.test.js.map +1 -0
  36. package/dist/core/oauth/anthropic.d.ts.map +1 -1
  37. package/dist/core/oauth/anthropic.js +64 -42
  38. package/dist/core/oauth/anthropic.js.map +1 -1
  39. package/dist/core/oauth/openai.js +1 -1
  40. package/dist/core/oauth/openai.js.map +1 -1
  41. package/dist/core/prompt-commands.d.ts.map +1 -1
  42. package/dist/core/prompt-commands.js +480 -100
  43. package/dist/core/prompt-commands.js.map +1 -1
  44. package/dist/core/prompt-commands.test.d.ts +2 -0
  45. package/dist/core/prompt-commands.test.d.ts.map +1 -0
  46. package/dist/core/prompt-commands.test.js +33 -0
  47. package/dist/core/prompt-commands.test.js.map +1 -0
  48. package/dist/core/repomap-context.d.ts +11 -0
  49. package/dist/core/repomap-context.d.ts.map +1 -0
  50. package/dist/core/repomap-context.js +68 -0
  51. package/dist/core/repomap-context.js.map +1 -0
  52. package/dist/core/repomap-context.test.d.ts +2 -0
  53. package/dist/core/repomap-context.test.d.ts.map +1 -0
  54. package/dist/core/repomap-context.test.js +47 -0
  55. package/dist/core/repomap-context.test.js.map +1 -0
  56. package/dist/core/repomap.d.ts +74 -0
  57. package/dist/core/repomap.d.ts.map +1 -0
  58. package/dist/core/repomap.js +897 -0
  59. package/dist/core/repomap.js.map +1 -0
  60. package/dist/core/repomap.test.d.ts +2 -0
  61. package/dist/core/repomap.test.d.ts.map +1 -0
  62. package/dist/core/repomap.test.js +444 -0
  63. package/dist/core/repomap.test.js.map +1 -0
  64. package/dist/core/session-compaction.d.ts +15 -0
  65. package/dist/core/session-compaction.d.ts.map +1 -0
  66. package/dist/core/session-compaction.js +31 -0
  67. package/dist/core/session-compaction.js.map +1 -0
  68. package/dist/core/session-compaction.test.d.ts +2 -0
  69. package/dist/core/session-compaction.test.d.ts.map +1 -0
  70. package/dist/core/session-compaction.test.js +70 -0
  71. package/dist/core/session-compaction.test.js.map +1 -0
  72. package/dist/core/settings-manager.d.ts +3 -5
  73. package/dist/core/settings-manager.d.ts.map +1 -1
  74. package/dist/core/settings-manager.js +6 -5
  75. package/dist/core/settings-manager.js.map +1 -1
  76. package/dist/core/slash-commands.d.ts +2 -0
  77. package/dist/core/slash-commands.d.ts.map +1 -1
  78. package/dist/core/slash-commands.js +15 -14
  79. package/dist/core/slash-commands.js.map +1 -1
  80. package/dist/core/style-packs/index.d.ts.map +1 -1
  81. package/dist/core/style-packs/index.js +8 -9
  82. package/dist/core/style-packs/index.js.map +1 -1
  83. package/dist/index.d.ts +2 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +1 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/interactive.d.ts.map +1 -1
  88. package/dist/interactive.js +12 -6
  89. package/dist/interactive.js.map +1 -1
  90. package/dist/modes/json-mode.d.ts +7 -0
  91. package/dist/modes/json-mode.d.ts.map +1 -1
  92. package/dist/modes/json-mode.js +9 -1
  93. package/dist/modes/json-mode.js.map +1 -1
  94. package/dist/system-prompt.d.ts.map +1 -1
  95. package/dist/system-prompt.js +105 -108
  96. package/dist/system-prompt.js.map +1 -1
  97. package/dist/system-prompt.test.d.ts +2 -0
  98. package/dist/system-prompt.test.d.ts.map +1 -0
  99. package/dist/system-prompt.test.js +107 -0
  100. package/dist/system-prompt.test.js.map +1 -0
  101. package/dist/tools/bash.d.ts.map +1 -1
  102. package/dist/tools/bash.js +1 -0
  103. package/dist/tools/bash.js.map +1 -1
  104. package/dist/tools/edit-diff.d.ts +66 -1
  105. package/dist/tools/edit-diff.d.ts.map +1 -1
  106. package/dist/tools/edit-diff.js +208 -10
  107. package/dist/tools/edit-diff.js.map +1 -1
  108. package/dist/tools/edit-diff.test.js +175 -15
  109. package/dist/tools/edit-diff.test.js.map +1 -1
  110. package/dist/tools/edit.d.ts +3 -1
  111. package/dist/tools/edit.d.ts.map +1 -1
  112. package/dist/tools/edit.js +190 -44
  113. package/dist/tools/edit.js.map +1 -1
  114. package/dist/tools/edit.test.js +392 -3
  115. package/dist/tools/edit.test.js.map +1 -1
  116. package/dist/tools/enter-plan.d.ts.map +1 -1
  117. package/dist/tools/enter-plan.js +1 -0
  118. package/dist/tools/enter-plan.js.map +1 -1
  119. package/dist/tools/exit-plan.d.ts.map +1 -1
  120. package/dist/tools/exit-plan.js +1 -0
  121. package/dist/tools/exit-plan.js.map +1 -1
  122. package/dist/tools/index.d.ts +13 -0
  123. package/dist/tools/index.d.ts.map +1 -1
  124. package/dist/tools/index.js +4 -4
  125. package/dist/tools/index.js.map +1 -1
  126. package/dist/tools/prompt-hints.d.ts.map +1 -1
  127. package/dist/tools/prompt-hints.js +6 -4
  128. package/dist/tools/prompt-hints.js.map +1 -1
  129. package/dist/tools/read.d.ts +1 -1
  130. package/dist/tools/read.d.ts.map +1 -1
  131. package/dist/tools/read.js +2 -1
  132. package/dist/tools/read.js.map +1 -1
  133. package/dist/tools/subagent.d.ts +1 -1
  134. package/dist/tools/subagent.d.ts.map +1 -1
  135. package/dist/tools/subagent.js +55 -2
  136. package/dist/tools/subagent.js.map +1 -1
  137. package/dist/tools/tasks.d.ts.map +1 -1
  138. package/dist/tools/tasks.js +1 -0
  139. package/dist/tools/tasks.js.map +1 -1
  140. package/dist/tools/web-fetch.d.ts +1 -0
  141. package/dist/tools/web-fetch.d.ts.map +1 -1
  142. package/dist/tools/web-fetch.js +96 -6
  143. package/dist/tools/web-fetch.js.map +1 -1
  144. package/dist/tools/web-fetch.test.d.ts +2 -0
  145. package/dist/tools/web-fetch.test.d.ts.map +1 -0
  146. package/dist/tools/web-fetch.test.js +90 -0
  147. package/dist/tools/web-fetch.test.js.map +1 -0
  148. package/dist/tools/web-search.d.ts +1 -0
  149. package/dist/tools/web-search.d.ts.map +1 -1
  150. package/dist/tools/web-search.js +167 -27
  151. package/dist/tools/web-search.js.map +1 -1
  152. package/dist/tools/web-search.test.d.ts +2 -0
  153. package/dist/tools/web-search.test.d.ts.map +1 -0
  154. package/dist/tools/web-search.test.js +119 -0
  155. package/dist/tools/web-search.test.js.map +1 -0
  156. package/dist/tools/write.d.ts +1 -1
  157. package/dist/tools/write.d.ts.map +1 -1
  158. package/dist/tools/write.js +3 -1
  159. package/dist/tools/write.js.map +1 -1
  160. package/dist/tools/write.test.js +23 -0
  161. package/dist/tools/write.test.js.map +1 -1
  162. package/dist/ui/App.d.ts +54 -5
  163. package/dist/ui/App.d.ts.map +1 -1
  164. package/dist/ui/App.js +533 -241
  165. package/dist/ui/App.js.map +1 -1
  166. package/dist/ui/activity-phrases.d.ts +2 -1
  167. package/dist/ui/activity-phrases.d.ts.map +1 -1
  168. package/dist/ui/activity-phrases.js +11 -1
  169. package/dist/ui/activity-phrases.js.map +1 -1
  170. package/dist/ui/components/ActivityIndicator.d.ts +15 -1
  171. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  172. package/dist/ui/components/ActivityIndicator.js +143 -44
  173. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  174. package/dist/ui/components/ActivityIndicator.test.d.ts +2 -0
  175. package/dist/ui/components/ActivityIndicator.test.d.ts.map +1 -0
  176. package/dist/ui/components/ActivityIndicator.test.js +40 -0
  177. package/dist/ui/components/ActivityIndicator.test.js.map +1 -0
  178. package/dist/ui/components/AnimationContext.d.ts +8 -2
  179. package/dist/ui/components/AnimationContext.d.ts.map +1 -1
  180. package/dist/ui/components/AnimationContext.js +94 -16
  181. package/dist/ui/components/AnimationContext.js.map +1 -1
  182. package/dist/ui/components/AssistantMessage.js +1 -1
  183. package/dist/ui/components/AssistantMessage.js.map +1 -1
  184. package/dist/ui/components/CompactionNotice.d.ts +5 -1
  185. package/dist/ui/components/CompactionNotice.d.ts.map +1 -1
  186. package/dist/ui/components/CompactionNotice.js +4 -6
  187. package/dist/ui/components/CompactionNotice.js.map +1 -1
  188. package/dist/ui/components/Footer.d.ts +10 -2
  189. package/dist/ui/components/Footer.d.ts.map +1 -1
  190. package/dist/ui/components/Footer.js +45 -8
  191. package/dist/ui/components/Footer.js.map +1 -1
  192. package/dist/ui/components/InputArea.d.ts.map +1 -1
  193. package/dist/ui/components/InputArea.js +76 -28
  194. package/dist/ui/components/InputArea.js.map +1 -1
  195. package/dist/ui/components/ServerToolExecution.d.ts +1 -0
  196. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  197. package/dist/ui/components/ServerToolExecution.js +21 -2
  198. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  199. package/dist/ui/components/Spinner.d.ts +3 -1
  200. package/dist/ui/components/Spinner.d.ts.map +1 -1
  201. package/dist/ui/components/Spinner.js +10 -4
  202. package/dist/ui/components/Spinner.js.map +1 -1
  203. package/dist/ui/components/StreamingArea.js +1 -1
  204. package/dist/ui/components/StreamingArea.js.map +1 -1
  205. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  206. package/dist/ui/components/SubAgentPanel.js +3 -4
  207. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  208. package/dist/ui/components/ToolExecution.d.ts +2 -0
  209. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  210. package/dist/ui/components/ToolExecution.js +24 -5
  211. package/dist/ui/components/ToolExecution.js.map +1 -1
  212. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  213. package/dist/ui/components/ToolGroupExecution.js +23 -2
  214. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  215. package/dist/ui/components/ToolUseLoader.d.ts +4 -2
  216. package/dist/ui/components/ToolUseLoader.d.ts.map +1 -1
  217. package/dist/ui/components/ToolUseLoader.js +3 -3
  218. package/dist/ui/components/ToolUseLoader.js.map +1 -1
  219. package/dist/ui/components/index.d.ts +1 -2
  220. package/dist/ui/components/index.d.ts.map +1 -1
  221. package/dist/ui/components/index.js +1 -2
  222. package/dist/ui/components/index.js.map +1 -1
  223. package/dist/ui/hooks/useAgentLoop.d.ts +4 -1
  224. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  225. package/dist/ui/hooks/useAgentLoop.js +110 -13
  226. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  227. package/dist/ui/hooks/useBlink.d.ts.map +1 -1
  228. package/dist/ui/hooks/useBlink.js +3 -4
  229. package/dist/ui/hooks/useBlink.js.map +1 -1
  230. package/dist/ui/hooks/useTerminalSize.d.ts +12 -3
  231. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  232. package/dist/ui/hooks/useTerminalSize.js +16 -1
  233. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  234. package/dist/ui/pixel.js +1 -1
  235. package/dist/ui/render.d.ts +44 -5
  236. package/dist/ui/render.d.ts.map +1 -1
  237. package/dist/ui/render.js +56 -8
  238. package/dist/ui/render.js.map +1 -1
  239. package/dist/utils/error-handler.d.ts.map +1 -1
  240. package/dist/utils/error-handler.js +2 -0
  241. package/dist/utils/error-handler.js.map +1 -1
  242. package/package.json +8 -5
  243. package/dist/ui/buddy/Buddy.d.ts +0 -15
  244. package/dist/ui/buddy/Buddy.d.ts.map +0 -1
  245. package/dist/ui/buddy/Buddy.js +0 -118
  246. package/dist/ui/buddy/Buddy.js.map +0 -1
  247. package/dist/ui/buddy/gacha.d.ts +0 -8
  248. package/dist/ui/buddy/gacha.d.ts.map +0 -1
  249. package/dist/ui/buddy/gacha.js +0 -94
  250. package/dist/ui/buddy/gacha.js.map +0 -1
  251. package/dist/ui/buddy/species.d.ts +0 -52
  252. package/dist/ui/buddy/species.d.ts.map +0 -1
  253. package/dist/ui/buddy/species.js +0 -257
  254. package/dist/ui/buddy/species.js.map +0 -1
  255. package/dist/ui/components/ThinkingIndicator.d.ts +0 -6
  256. package/dist/ui/components/ThinkingIndicator.d.ts.map +0 -1
  257. package/dist/ui/components/ThinkingIndicator.js +0 -145
  258. package/dist/ui/components/ThinkingIndicator.js.map +0 -1
@@ -12,6 +12,176 @@ function normalizeForFuzzyMatch(text) {
12
12
  .replace(/[\u201C\u201D]/g, '"') // smart double quotes
13
13
  .replace(/[\u2013\u2014]/g, "-"); // en/em dashes
14
14
  }
15
+ /**
16
+ * Aider's `match_but_for_leading_whitespace`: returns the uniform leading
17
+ * whitespace prefix that — if prepended to every non-blank line of `partLines`
18
+ * — would make them equal to `wholeLines`. Returns null when:
19
+ * - line counts differ
20
+ * - any line's non-whitespace content doesn't match
21
+ * - the leading whitespace delta isn't uniform across all non-blank lines
22
+ *
23
+ * This is the precision check that anchors `applyMissingLeadingWhitespace`.
24
+ */
25
+ function matchButForLeadingWhitespace(wholeLines, partLines) {
26
+ if (wholeLines.length !== partLines.length)
27
+ return null;
28
+ for (let i = 0; i < wholeLines.length; i++) {
29
+ if (wholeLines[i].trimStart() !== partLines[i].trimStart())
30
+ return null;
31
+ }
32
+ const prefixes = new Set();
33
+ for (let i = 0; i < wholeLines.length; i++) {
34
+ if (wholeLines[i].trim() === "")
35
+ continue;
36
+ const wholeLead = wholeLines[i].length - wholeLines[i].trimStart().length;
37
+ const partLead = partLines[i].length - partLines[i].trimStart().length;
38
+ if (wholeLead < partLead)
39
+ return null;
40
+ prefixes.add(wholeLines[i].slice(0, wholeLead - partLead));
41
+ }
42
+ if (prefixes.size !== 1)
43
+ return null;
44
+ return [...prefixes][0];
45
+ }
46
+ /**
47
+ * Aider's `replace_part_with_missing_leading_whitespace` (~10k stars between
48
+ * aider/devon/codemcp/qwen-coder use this exact pattern). Models very often
49
+ * mess up leading whitespace — uniformly across both old_text and new_text.
50
+ * Strategy:
51
+ * 1. Outdent old/new uniformly by the smallest leading-whitespace count
52
+ * across all non-blank lines (handles "model included some but not all").
53
+ * 2. Scan the file for a window where every line matches when stripped AND
54
+ * the file's actual leading prefix is uniform across non-blank lines.
55
+ * 3. Re-apply that uniform file-prefix to every non-blank line of new_text
56
+ * before substituting.
57
+ *
58
+ * Returns the rewritten file content on success, null when no unique match.
59
+ */
60
+ export function applyMissingLeadingWhitespace(working, old, next) {
61
+ const workingLines = working.split("\n");
62
+ let oldLines = old.split("\n");
63
+ let newLines = next.split("\n");
64
+ if (oldLines.length === 0)
65
+ return null;
66
+ // Outdent both uniformly by the min leading-whitespace count across all
67
+ // non-blank lines in either old or new. Handles the common case where the
68
+ // model wrote SOME indentation but less than the file's actual amount.
69
+ const nonBlank = [...oldLines, ...newLines].filter((l) => l.trim() !== "");
70
+ if (nonBlank.length > 0) {
71
+ const minLead = Math.min(...nonBlank.map((l) => l.length - l.trimStart().length));
72
+ if (minLead > 0) {
73
+ oldLines = oldLines.map((l) => (l.trim() !== "" ? l.slice(minLead) : l));
74
+ newLines = newLines.map((l) => (l.trim() !== "" ? l.slice(minLead) : l));
75
+ }
76
+ }
77
+ const numOld = oldLines.length;
78
+ let matchIdx = -1;
79
+ let matchPrefix = null;
80
+ let matchCount = 0;
81
+ for (let i = 0; i + numOld <= workingLines.length; i++) {
82
+ const window = workingLines.slice(i, i + numOld);
83
+ const prefix = matchButForLeadingWhitespace(window, oldLines);
84
+ if (prefix !== null) {
85
+ matchCount++;
86
+ if (matchIdx === -1) {
87
+ matchIdx = i;
88
+ matchPrefix = prefix;
89
+ }
90
+ // Two matches → ambiguous; let the caller fall through to the not_found
91
+ // path so the model adds context. (Same safety bar as our other matchers.)
92
+ if (matchCount > 1)
93
+ return null;
94
+ }
95
+ }
96
+ if (matchIdx === -1 || matchPrefix === null)
97
+ return null;
98
+ const newWithPrefix = newLines.map((l) => (l.trim() !== "" ? matchPrefix + l : l));
99
+ const result = [
100
+ ...workingLines.slice(0, matchIdx),
101
+ ...newWithPrefix,
102
+ ...workingLines.slice(matchIdx + numOld),
103
+ ];
104
+ return result.join("\n");
105
+ }
106
+ /**
107
+ * Aider-style `...` elision matching: when `old_text` contains lines that are
108
+ * just `...`, treat them as "skip whatever's here" placeholders. The model
109
+ * writes:
110
+ *
111
+ * old: function foo() {
112
+ * ...
113
+ * return bar;
114
+ * }
115
+ * new: function foo() {
116
+ * ...
117
+ * return baz;
118
+ * }
119
+ *
120
+ * We split both `old` and `next` on the `...` lines, then anchor the bookend
121
+ * pieces in `working` (greedy, in order). The elided middle from `working` is
122
+ * preserved verbatim and stitched in between the new bookends. Returns the
123
+ * rewritten buffer on success, null when:
124
+ * - `old` has no `...` lines (caller should try other strategies)
125
+ * - piece counts differ between `old` and `next` (ambiguous elision)
126
+ * - any piece is empty (means dots at start/end or adjacent — too risky)
127
+ * - any old piece doesn't appear in `working` after the previous one
128
+ *
129
+ * Greedy first-match-then-forward. We DO NOT support `replace_all` with
130
+ * elision — `...` is intrinsically a single edit.
131
+ */
132
+ export function applyDotdotdots(working, old, next) {
133
+ const dotLineRe = /^[ \t]*\.\.\.[ \t]*$/m;
134
+ if (!dotLineRe.test(old))
135
+ return null;
136
+ // Split consumes the dot line including its trailing newline (if present),
137
+ // so the next piece starts cleanly at its first real character.
138
+ const splitRe = /^[ \t]*\.\.\.[ \t]*\r?\n?/m;
139
+ const oldPieces = old.split(splitRe);
140
+ const newPieces = next.split(splitRe);
141
+ if (oldPieces.length !== newPieces.length)
142
+ return null;
143
+ if (oldPieces.length < 2)
144
+ return null;
145
+ if (oldPieces.some((p) => p === "") || newPieces.some((p) => p === ""))
146
+ return null;
147
+ let cursor = 0;
148
+ const positions = [];
149
+ for (const piece of oldPieces) {
150
+ const idx = working.indexOf(piece, cursor);
151
+ if (idx === -1)
152
+ return null;
153
+ positions.push({ start: idx, end: idx + piece.length });
154
+ cursor = idx + piece.length;
155
+ }
156
+ let result = working.slice(0, positions[0].start);
157
+ for (let i = 0; i < oldPieces.length; i++) {
158
+ result += newPieces[i];
159
+ if (i < oldPieces.length - 1) {
160
+ // The elided middle from the original file is preserved verbatim —
161
+ // that's the whole point of the `...` placeholder.
162
+ result += working.slice(positions[i].end, positions[i + 1].start);
163
+ }
164
+ }
165
+ result += working.slice(positions[positions.length - 1].end);
166
+ return result;
167
+ }
168
+ /**
169
+ * Models often add a spurious leading blank line to `old_text` (e.g. when
170
+ * copying a code block out of fenced markdown). Aider noticed this back at
171
+ * its issue #25. If the first line is blank, return the same text minus that
172
+ * line so the caller can retry the match. Returns null when no leading blank
173
+ * line exists, so callers can cheaply skip the retry.
174
+ */
175
+ export function stripLeadingBlankLine(text) {
176
+ if (!text)
177
+ return null;
178
+ const newlineIdx = text.indexOf("\n");
179
+ if (newlineIdx === -1)
180
+ return null;
181
+ if (text.slice(0, newlineIdx).trim() !== "")
182
+ return null;
183
+ return text.slice(newlineIdx + 1);
184
+ }
15
185
  /**
16
186
  * Find text in content, trying exact match first then fuzzy.
17
187
  */
@@ -80,15 +250,6 @@ function tokenize(line) {
80
250
  .filter((t) => t.length >= 2)
81
251
  .map((t) => t.toLowerCase());
82
252
  }
83
- /**
84
- * When old_text isn't found, locate up to `maxResults` lines in `content` with
85
- * the highest token-overlap to the first non-empty line of `oldText` and
86
- * return ±contextLines around each as numbered snippets, joined by `---`.
87
- * Returns null if there's no plausible match (no shared tokens at all).
88
- * Cuts retry loops by showing the model what's actually in the file at the
89
- * expected location(s) — multiple results help disambiguate when several
90
- * regions look similar (e.g. repeated function bodies).
91
- */
92
253
  export function findClosestSnippet(content, oldText, contextLines = 3, maxResults = 3) {
93
254
  const oldFirstLine = oldText.split("\n").find((l) => l.trim().length > 0);
94
255
  if (!oldFirstLine)
@@ -113,6 +274,7 @@ export function findClosestSnippet(content, oldText, contextLines = 3, maxResult
113
274
  return null;
114
275
  candidates.sort((a, b) => b.score - a.score || a.line - b.line);
115
276
  const bestScore = candidates[0].score;
277
+ const topLine = candidates[0].line + 1;
116
278
  // Drop candidates that are dramatically weaker than the best match —
117
279
  // keeps the snippet focused instead of dumping the whole file.
118
280
  const minScore = Math.max(1, Math.ceil(bestScore / 3));
@@ -127,7 +289,43 @@ export function findClosestSnippet(content, oldText, contextLines = 3, maxResult
127
289
  .map((l, i) => `${String(start + i + 1).padStart(6, " ")}\t${l}`)
128
290
  .join("\n");
129
291
  };
130
- return top.map((c) => renderRange(c.line)).join("\n---\n");
292
+ return { snippet: top.map((c) => renderRange(c.line)).join("\n---\n"), topLine };
293
+ }
294
+ /**
295
+ * Locate every occurrence of `text` in `content` and return the 1-indexed line
296
+ * number plus a trimmed preview of that line. Tries exact first, then the same
297
+ * fuzzy normalization as `countOccurrences` so the line numbers match what the
298
+ * caller saw in `countOccurrences`. Capped at `max` so error messages stay
299
+ * compact when a token like `}` matches dozens of times.
300
+ */
301
+ export function findOccurrenceLines(content, text, max = 6) {
302
+ const collectOffsets = (haystack, needle) => {
303
+ if (!needle)
304
+ return [];
305
+ const offsets = [];
306
+ let pos = 0;
307
+ while ((pos = haystack.indexOf(needle, pos)) !== -1) {
308
+ offsets.push(pos);
309
+ pos += needle.length;
310
+ }
311
+ return offsets;
312
+ };
313
+ let source = content;
314
+ let offsets = collectOffsets(content, text);
315
+ if (offsets.length === 0) {
316
+ source = normalizeForFuzzyMatch(content);
317
+ offsets = collectOffsets(source, normalizeForFuzzyMatch(text));
318
+ }
319
+ const out = [];
320
+ for (const offset of offsets.slice(0, max)) {
321
+ const before = source.slice(0, offset);
322
+ const line = before.split("\n").length;
323
+ const lineStart = before.lastIndexOf("\n") + 1;
324
+ const nextNewline = source.indexOf("\n", lineStart);
325
+ const lineText = source.slice(lineStart, nextNewline === -1 ? undefined : nextNewline);
326
+ out.push({ line, preview: lineText.trim() });
327
+ }
328
+ return out;
131
329
  }
132
330
  /**
133
331
  * Generate a unified diff string.
@@ -1 +1 @@
1
- {"version":3,"file":"edit-diff.js","sourceRoot":"","sources":["../../src/tools/edit-diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit-diff.js","sourceRoot":"","sources":["../../src/tools/edit-diff.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet } from "./edit-diff.js";
2
+ import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet, findOccurrenceLines, stripLeadingBlankLine, applyDotdotdots, applyMissingLeadingWhitespace, } from "./edit-diff.js";
3
3
  describe("fuzzyFindText", () => {
4
4
  it("finds exact match with usedFuzzy=false", () => {
5
5
  const content = "hello world\nfoo bar\n";
@@ -62,23 +62,29 @@ describe("findClosestSnippet", () => {
62
62
  "}",
63
63
  ].join("\n");
64
64
  it("finds the closest line by token overlap and returns numbered context", () => {
65
- const snippet = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
66
- expect(snippet).not.toBeNull();
67
- expect(snippet).toContain("useState(0)");
65
+ const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
66
+ expect(result).not.toBeNull();
67
+ expect(result.snippet).toContain("useState(0)");
68
68
  // Numbered (cat -n style)
69
- expect(snippet).toMatch(/^\s+\d+\t/m);
69
+ expect(result.snippet).toMatch(/^\s+\d+\t/m);
70
+ });
71
+ it("returns the 1-based line of the strongest candidate for read-suggestion use", () => {
72
+ const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
73
+ expect(result).not.toBeNull();
74
+ // Line 4 of `content` is ` const [count, setCount] = useState(0);`
75
+ expect(result.topLine).toBe(4);
70
76
  });
71
77
  it("returns null when there are no shared tokens", () => {
72
- const snippet = findClosestSnippet(content, "completely unrelated zzzqqq xxx");
73
- expect(snippet).toBeNull();
78
+ const result = findClosestSnippet(content, "completely unrelated zzzqqq xxx");
79
+ expect(result).toBeNull();
74
80
  });
75
81
  it("returns null on empty oldText", () => {
76
82
  expect(findClosestSnippet(content, "")).toBeNull();
77
83
  expect(findClosestSnippet(content, " \n\n")).toBeNull();
78
84
  });
79
85
  it("respects contextLines", () => {
80
- const snippet = findClosestSnippet(content, "const [count, setCount] = useState(1);", 0);
81
- expect(snippet).toBe(" 4\t const [count, setCount] = useState(0);");
86
+ const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 0);
87
+ expect(result.snippet).toBe(" 4\t const [count, setCount] = useState(0);");
82
88
  });
83
89
  it("returns multiple matches separated by --- when several regions tie", () => {
84
90
  const multi = [
@@ -94,20 +100,174 @@ describe("findClosestSnippet", () => {
94
100
  " setCount(count * 2);",
95
101
  "}",
96
102
  ].join("\n");
97
- const snippet = findClosestSnippet(multi, "setCount(count - 1);", 0, 3);
98
- expect(snippet).not.toBeNull();
99
- const parts = snippet.split("\n---\n");
103
+ const result = findClosestSnippet(multi, "setCount(count - 1);", 0, 3);
104
+ expect(result).not.toBeNull();
105
+ const parts = result.snippet.split("\n---\n");
100
106
  expect(parts.length).toBeGreaterThanOrEqual(2);
101
107
  // Every part should reference setCount
102
108
  for (const p of parts)
103
109
  expect(p).toContain("setCount");
104
110
  });
105
111
  it("keeps a single match when one candidate dominates", () => {
106
- const snippet = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
112
+ const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
107
113
  // Only line 4 has the full token set; line 1 (just `useState`) is dropped
108
114
  // by the bestScore/3 cutoff.
109
- expect(snippet).not.toBeNull();
110
- expect(snippet.split("\n---\n")).toHaveLength(1);
115
+ expect(result).not.toBeNull();
116
+ expect(result.snippet.split("\n---\n")).toHaveLength(1);
117
+ });
118
+ });
119
+ describe("findOccurrenceLines", () => {
120
+ it("returns 1-indexed line numbers and trimmed previews for every match", () => {
121
+ const css = [
122
+ ".timer { color: white; }",
123
+ ".button { color: black; }",
124
+ ".label { color: white; }",
125
+ ".footer { color: white; }",
126
+ ].join("\n");
127
+ const matches = findOccurrenceLines(css, "color: white;");
128
+ expect(matches).toEqual([
129
+ { line: 1, preview: ".timer { color: white; }" },
130
+ { line: 3, preview: ".label { color: white; }" },
131
+ { line: 4, preview: ".footer { color: white; }" },
132
+ ]);
133
+ });
134
+ it("caps results at `max` so dozens of matches stay compact", () => {
135
+ const lines = Array.from({ length: 20 }, (_, i) => `row ${i} }`);
136
+ const matches = findOccurrenceLines(lines.join("\n"), "}", 4);
137
+ expect(matches).toHaveLength(4);
138
+ expect(matches[0].line).toBe(1);
139
+ });
140
+ it("falls back to fuzzy matching when exact yields zero", () => {
141
+ const content = "say “hi”";
142
+ const matches = findOccurrenceLines(content, 'say "hi"');
143
+ expect(matches).toHaveLength(1);
144
+ expect(matches[0].line).toBe(1);
145
+ });
146
+ it("returns empty array for no matches at all", () => {
147
+ expect(findOccurrenceLines("hello world", "missing")).toEqual([]);
148
+ });
149
+ });
150
+ describe("applyMissingLeadingWhitespace", () => {
151
+ it("returns null when text matches exactly (caller already handled it)", () => {
152
+ // The whole point of this strategy is to handle MIS-indented text.
153
+ // When indentation matches, this returns null too — but in practice
154
+ // the primary exact matcher catches that case first.
155
+ const file = " function foo() {\n return 1;\n }\n";
156
+ const old = "function foo() {\n return 1;\n}";
157
+ const next = "function foo() {\n return 2;\n}";
158
+ const result = applyMissingLeadingWhitespace(file, old, next);
159
+ expect(result).not.toBeNull();
160
+ expect(result).toContain("return 2;");
161
+ // File's 2-space prefix was preserved on the rewritten lines.
162
+ expect(result).toContain(" function foo() {");
163
+ expect(result).toContain(" return 2;");
164
+ expect(result).toContain(" }");
165
+ });
166
+ it("model omits indentation entirely; file has 4 spaces — apply 4-space prefix to new", () => {
167
+ const file = " const x = 1;\n const y = 2;\n const z = 3;\n";
168
+ const old = "const x = 1;\nconst y = 2;\nconst z = 3;";
169
+ const next = "const x = 10;\nconst y = 20;\nconst z = 30;";
170
+ const result = applyMissingLeadingWhitespace(file, old, next);
171
+ expect(result).toBe(" const x = 10;\n const y = 20;\n const z = 30;\n");
172
+ });
173
+ it("model used 2-space indent but file uses 4 — outdents both, finds match, re-indents new", () => {
174
+ const file = " if (x) {\n return y;\n }\n";
175
+ const old = " if (x) {\n return y;\n }";
176
+ const next = " if (x) {\n return z;\n }";
177
+ const result = applyMissingLeadingWhitespace(file, old, next);
178
+ expect(result).toContain(" if (x) {");
179
+ expect(result).toContain(" return z;");
180
+ expect(result).toContain(" }");
181
+ });
182
+ it("returns null when non-leading content differs", () => {
183
+ const file = " function foo() {\n return 1;\n }\n";
184
+ const old = "function bar() {\n return 1;\n}";
185
+ const next = "function bar() {\n return 2;\n}";
186
+ expect(applyMissingLeadingWhitespace(file, old, next)).toBeNull();
187
+ });
188
+ it("returns null when leading-whitespace delta is non-uniform across lines", () => {
189
+ // File has 4 spaces on line 1, 6 on line 2 (irregular block).
190
+ const file = " line one\n line two\n";
191
+ const old = "line one\nline two";
192
+ const next = "LINE ONE\nLINE TWO";
193
+ // The delta is " " for line 1 but " " for line 2 — non-uniform.
194
+ expect(applyMissingLeadingWhitespace(file, old, next)).toBeNull();
195
+ });
196
+ it("returns null on multiple matches (ambiguous)", () => {
197
+ const file = " foo();\n bar();\n\n foo();\n bar();\n";
198
+ const old = "foo();\nbar();";
199
+ const next = "FOO();\nBAR();";
200
+ expect(applyMissingLeadingWhitespace(file, old, next)).toBeNull();
201
+ });
202
+ });
203
+ describe("applyDotdotdots", () => {
204
+ const file = [
205
+ "function foo() {",
206
+ " console.log('keep this');",
207
+ " doStuff();",
208
+ " return bar;",
209
+ "}",
210
+ "",
211
+ "function unrelated() { return 0; }",
212
+ ].join("\n");
213
+ it("returns null when old_text has no `...` lines", () => {
214
+ expect(applyDotdotdots(file, "function foo() {", "function FOO() {")).toBeNull();
215
+ });
216
+ it("matches bookends and preserves the elided middle", () => {
217
+ const old = "function foo() {\n ...\n return bar;\n}";
218
+ const next = "function foo() {\n ...\n return baz;\n}";
219
+ const result = applyDotdotdots(file, old, next);
220
+ expect(result).not.toBeNull();
221
+ expect(result).toContain("return baz;");
222
+ expect(result).not.toContain("return bar;");
223
+ // Middle preserved verbatim.
224
+ expect(result).toContain("console.log('keep this');");
225
+ expect(result).toContain("doStuff();");
226
+ });
227
+ it("returns null when piece counts mismatch (ambiguous elision)", () => {
228
+ const old = "function foo() {\n ...\n return bar;\n}";
229
+ const next = "function foo() {\n ...\n ...\n return baz;\n}";
230
+ expect(applyDotdotdots(file, old, next)).toBeNull();
231
+ });
232
+ it("returns null when bookend piece is missing in the file", () => {
233
+ const old = "function MISSING() {\n ...\n return bar;\n}";
234
+ const next = "function MISSING() {\n ...\n return baz;\n}";
235
+ expect(applyDotdotdots(file, old, next)).toBeNull();
236
+ });
237
+ it("returns null when a piece would be empty (`...` at boundary)", () => {
238
+ const old = "...\nfunction foo() {";
239
+ const next = "...\nfunction FOO() {";
240
+ expect(applyDotdotdots(file, old, next)).toBeNull();
241
+ });
242
+ it("supports multiple `...` blocks", () => {
243
+ const old = "function foo() {\n ...\n doStuff();\n ...\n return bar;\n}";
244
+ const next = "function foo() {\n ...\n doStuff();\n ...\n return baz;\n}";
245
+ const result = applyDotdotdots(file, old, next);
246
+ expect(result).not.toBeNull();
247
+ expect(result).toContain("return baz;");
248
+ // First and second middles both preserved.
249
+ expect(result).toContain("console.log('keep this');");
250
+ });
251
+ it("ignores inline `...` (only line-only dots count)", () => {
252
+ // Inline ... like JS spread should NOT trigger dotdotdots.
253
+ expect(applyDotdotdots(file, "doStuff(...args);", "doStuff(...newArgs);")).toBeNull();
254
+ });
255
+ });
256
+ describe("stripLeadingBlankLine", () => {
257
+ it("returns null when there is no leading blank line", () => {
258
+ expect(stripLeadingBlankLine("foo\nbar")).toBeNull();
259
+ });
260
+ it("strips a single leading newline", () => {
261
+ expect(stripLeadingBlankLine("\nfoo\nbar")).toBe("foo\nbar");
262
+ });
263
+ it("strips a leading whitespace-only line", () => {
264
+ expect(stripLeadingBlankLine(" \nfoo")).toBe("foo");
265
+ });
266
+ it("returns null on empty input", () => {
267
+ expect(stripLeadingBlankLine("")).toBeNull();
268
+ });
269
+ it("returns null when the text is a single line", () => {
270
+ expect(stripLeadingBlankLine("only one line")).toBeNull();
111
271
  });
112
272
  });
113
273
  describe("generateDiff", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"edit-diff.test.js","sourceRoot":"","sources":["../../src/tools/edit-diff.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit-diff.test.js","sourceRoot":"","sources":["../../src/tools/edit-diff.test.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,12 @@ declare const EditParams: z.ZodObject<{
7
7
  edits: z.ZodPreprocess<z.ZodArray<z.ZodObject<{
8
8
  old_text: z.ZodString;
9
9
  new_text: z.ZodString;
10
+ replace_all: z.ZodOptional<z.ZodBoolean>;
10
11
  }, z.core.$strip>>>;
12
+ atomic: z.ZodOptional<z.ZodBoolean>;
11
13
  }, z.core.$strip>;
12
14
  export declare function createEditTool(cwd: string, readFiles?: ReadTracker, ops?: ToolOperations, planModeRef?: {
13
15
  current: boolean;
14
- }): AgentTool<typeof EditParams>;
16
+ }, onFileMutated?: (filePath: string) => void | Promise<void>): AgentTool<typeof EditParams>;
15
17
  export {};
16
18
  //# sourceMappingURL=edit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAoB/E,QAAA,MAAM,UAAU;;;;;;iBAQd,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,WAAW,EACvB,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC,SAAS,CAAC,OAAO,UAAU,CAAC,CA0F9B"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAYhD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA2B/E,QAAA,MAAM,UAAU;;;;;;;;iBAgBd,CAAC;AA4CH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,WAAW,EACvB,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAClC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzD,SAAS,CAAC,OAAO,UAAU,CAAC,CAiN9B"}