@prestyj/cli 4.3.161 → 4.3.200

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 (299) hide show
  1. package/dist/cli.d.ts +1 -1
  2. package/dist/cli.js +112 -27
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/agent-session.d.ts +50 -1
  5. package/dist/core/agent-session.d.ts.map +1 -1
  6. package/dist/core/agent-session.js +175 -20
  7. package/dist/core/agent-session.js.map +1 -1
  8. package/dist/core/agents.d.ts +6 -1
  9. package/dist/core/agents.d.ts.map +1 -1
  10. package/dist/core/agents.js +112 -3
  11. package/dist/core/agents.js.map +1 -1
  12. package/dist/core/auth-storage.d.ts.map +1 -1
  13. package/dist/core/auth-storage.js +20 -1
  14. package/dist/core/auth-storage.js.map +1 -1
  15. package/dist/core/claude-code-version.d.ts +10 -0
  16. package/dist/core/claude-code-version.d.ts.map +1 -0
  17. package/dist/core/claude-code-version.js +106 -0
  18. package/dist/core/claude-code-version.js.map +1 -0
  19. package/dist/core/compaction/compactor.d.ts +13 -0
  20. package/dist/core/compaction/compactor.d.ts.map +1 -1
  21. package/dist/core/compaction/compactor.js +20 -1
  22. package/dist/core/compaction/compactor.js.map +1 -1
  23. package/dist/core/compaction/compactor.test.js +12 -1
  24. package/dist/core/compaction/compactor.test.js.map +1 -1
  25. package/dist/core/index.d.ts +1 -1
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/index.js +1 -1
  28. package/dist/core/index.js.map +1 -1
  29. package/dist/core/language-detector.d.ts +32 -0
  30. package/dist/core/language-detector.d.ts.map +1 -0
  31. package/dist/core/language-detector.js +191 -0
  32. package/dist/core/language-detector.js.map +1 -0
  33. package/dist/core/language-detector.test.d.ts +2 -0
  34. package/dist/core/language-detector.test.d.ts.map +1 -0
  35. package/dist/core/language-detector.test.js +109 -0
  36. package/dist/core/language-detector.test.js.map +1 -0
  37. package/dist/core/model-registry.d.ts +30 -2
  38. package/dist/core/model-registry.d.ts.map +1 -1
  39. package/dist/core/model-registry.js +41 -26
  40. package/dist/core/model-registry.js.map +1 -1
  41. package/dist/core/model-registry.test.d.ts +2 -0
  42. package/dist/core/model-registry.test.d.ts.map +1 -0
  43. package/dist/core/model-registry.test.js +19 -0
  44. package/dist/core/model-registry.test.js.map +1 -0
  45. package/dist/core/oauth/anthropic.d.ts.map +1 -1
  46. package/dist/core/oauth/anthropic.js +64 -42
  47. package/dist/core/oauth/anthropic.js.map +1 -1
  48. package/dist/core/oauth/openai.js +1 -1
  49. package/dist/core/oauth/openai.js.map +1 -1
  50. package/dist/core/prompt-commands.d.ts.map +1 -1
  51. package/dist/core/prompt-commands.js +569 -96
  52. package/dist/core/prompt-commands.js.map +1 -1
  53. package/dist/core/prompt-commands.test.d.ts +2 -0
  54. package/dist/core/prompt-commands.test.d.ts.map +1 -0
  55. package/dist/core/prompt-commands.test.js +33 -0
  56. package/dist/core/prompt-commands.test.js.map +1 -0
  57. package/dist/core/repomap-context.d.ts +11 -0
  58. package/dist/core/repomap-context.d.ts.map +1 -0
  59. package/dist/core/repomap-context.js +68 -0
  60. package/dist/core/repomap-context.js.map +1 -0
  61. package/dist/core/repomap-context.test.d.ts +2 -0
  62. package/dist/core/repomap-context.test.d.ts.map +1 -0
  63. package/dist/core/repomap-context.test.js +47 -0
  64. package/dist/core/repomap-context.test.js.map +1 -0
  65. package/dist/core/repomap.d.ts +74 -0
  66. package/dist/core/repomap.d.ts.map +1 -0
  67. package/dist/core/repomap.js +897 -0
  68. package/dist/core/repomap.js.map +1 -0
  69. package/dist/core/repomap.test.d.ts +2 -0
  70. package/dist/core/repomap.test.d.ts.map +1 -0
  71. package/dist/core/repomap.test.js +444 -0
  72. package/dist/core/repomap.test.js.map +1 -0
  73. package/dist/core/session-compaction.d.ts +15 -0
  74. package/dist/core/session-compaction.d.ts.map +1 -0
  75. package/dist/core/session-compaction.js +31 -0
  76. package/dist/core/session-compaction.js.map +1 -0
  77. package/dist/core/session-compaction.test.d.ts +2 -0
  78. package/dist/core/session-compaction.test.d.ts.map +1 -0
  79. package/dist/core/session-compaction.test.js +70 -0
  80. package/dist/core/session-compaction.test.js.map +1 -0
  81. package/dist/core/settings-manager.d.ts +3 -5
  82. package/dist/core/settings-manager.d.ts.map +1 -1
  83. package/dist/core/settings-manager.js +6 -5
  84. package/dist/core/settings-manager.js.map +1 -1
  85. package/dist/core/setup-history.d.ts +13 -0
  86. package/dist/core/setup-history.d.ts.map +1 -0
  87. package/dist/core/setup-history.js +71 -0
  88. package/dist/core/setup-history.js.map +1 -0
  89. package/dist/core/setup-history.test.d.ts +2 -0
  90. package/dist/core/setup-history.test.d.ts.map +1 -0
  91. package/dist/core/setup-history.test.js +74 -0
  92. package/dist/core/setup-history.test.js.map +1 -0
  93. package/dist/core/slash-commands.d.ts +2 -0
  94. package/dist/core/slash-commands.d.ts.map +1 -1
  95. package/dist/core/slash-commands.js +15 -14
  96. package/dist/core/slash-commands.js.map +1 -1
  97. package/dist/core/style-packs/index.d.ts +19 -0
  98. package/dist/core/style-packs/index.d.ts.map +1 -0
  99. package/dist/core/style-packs/index.js +69 -0
  100. package/dist/core/style-packs/index.js.map +1 -0
  101. package/dist/core/style-packs/packs.d.ts +18 -0
  102. package/dist/core/style-packs/packs.d.ts.map +1 -0
  103. package/dist/core/style-packs/packs.js +229 -0
  104. package/dist/core/style-packs/packs.js.map +1 -0
  105. package/dist/core/verify-commands.d.ts +35 -0
  106. package/dist/core/verify-commands.d.ts.map +1 -0
  107. package/dist/core/verify-commands.js +209 -0
  108. package/dist/core/verify-commands.js.map +1 -0
  109. package/dist/core/verify-commands.test.d.ts +2 -0
  110. package/dist/core/verify-commands.test.d.ts.map +1 -0
  111. package/dist/core/verify-commands.test.js +85 -0
  112. package/dist/core/verify-commands.test.js.map +1 -0
  113. package/dist/index.d.ts +2 -2
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +1 -1
  116. package/dist/index.js.map +1 -1
  117. package/dist/interactive.d.ts.map +1 -1
  118. package/dist/interactive.js +12 -6
  119. package/dist/interactive.js.map +1 -1
  120. package/dist/modes/json-mode.d.ts +7 -0
  121. package/dist/modes/json-mode.d.ts.map +1 -1
  122. package/dist/modes/json-mode.js +9 -1
  123. package/dist/modes/json-mode.js.map +1 -1
  124. package/dist/system-prompt.d.ts +2 -1
  125. package/dist/system-prompt.d.ts.map +1 -1
  126. package/dist/system-prompt.js +116 -92
  127. package/dist/system-prompt.js.map +1 -1
  128. package/dist/system-prompt.test.d.ts +2 -0
  129. package/dist/system-prompt.test.d.ts.map +1 -0
  130. package/dist/system-prompt.test.js +107 -0
  131. package/dist/system-prompt.test.js.map +1 -0
  132. package/dist/tools/bash.d.ts.map +1 -1
  133. package/dist/tools/bash.js +1 -0
  134. package/dist/tools/bash.js.map +1 -1
  135. package/dist/tools/edit-diff.d.ts +66 -1
  136. package/dist/tools/edit-diff.d.ts.map +1 -1
  137. package/dist/tools/edit-diff.js +208 -10
  138. package/dist/tools/edit-diff.js.map +1 -1
  139. package/dist/tools/edit-diff.test.js +175 -15
  140. package/dist/tools/edit-diff.test.js.map +1 -1
  141. package/dist/tools/edit.d.ts +3 -1
  142. package/dist/tools/edit.d.ts.map +1 -1
  143. package/dist/tools/edit.js +190 -44
  144. package/dist/tools/edit.js.map +1 -1
  145. package/dist/tools/edit.test.js +392 -3
  146. package/dist/tools/edit.test.js.map +1 -1
  147. package/dist/tools/enter-plan.d.ts.map +1 -1
  148. package/dist/tools/enter-plan.js +1 -0
  149. package/dist/tools/enter-plan.js.map +1 -1
  150. package/dist/tools/exit-plan.d.ts.map +1 -1
  151. package/dist/tools/exit-plan.js +1 -0
  152. package/dist/tools/exit-plan.js.map +1 -1
  153. package/dist/tools/index.d.ts +13 -0
  154. package/dist/tools/index.d.ts.map +1 -1
  155. package/dist/tools/index.js +4 -4
  156. package/dist/tools/index.js.map +1 -1
  157. package/dist/tools/prompt-hints.d.ts.map +1 -1
  158. package/dist/tools/prompt-hints.js +6 -4
  159. package/dist/tools/prompt-hints.js.map +1 -1
  160. package/dist/tools/read.d.ts +1 -1
  161. package/dist/tools/read.d.ts.map +1 -1
  162. package/dist/tools/read.js +2 -1
  163. package/dist/tools/read.js.map +1 -1
  164. package/dist/tools/subagent.d.ts +1 -1
  165. package/dist/tools/subagent.d.ts.map +1 -1
  166. package/dist/tools/subagent.js +55 -2
  167. package/dist/tools/subagent.js.map +1 -1
  168. package/dist/tools/tasks.d.ts.map +1 -1
  169. package/dist/tools/tasks.js +1 -0
  170. package/dist/tools/tasks.js.map +1 -1
  171. package/dist/tools/web-fetch.d.ts +1 -0
  172. package/dist/tools/web-fetch.d.ts.map +1 -1
  173. package/dist/tools/web-fetch.js +96 -6
  174. package/dist/tools/web-fetch.js.map +1 -1
  175. package/dist/tools/web-fetch.test.d.ts +2 -0
  176. package/dist/tools/web-fetch.test.d.ts.map +1 -0
  177. package/dist/tools/web-fetch.test.js +90 -0
  178. package/dist/tools/web-fetch.test.js.map +1 -0
  179. package/dist/tools/web-search.d.ts +1 -0
  180. package/dist/tools/web-search.d.ts.map +1 -1
  181. package/dist/tools/web-search.js +167 -27
  182. package/dist/tools/web-search.js.map +1 -1
  183. package/dist/tools/web-search.test.d.ts +2 -0
  184. package/dist/tools/web-search.test.d.ts.map +1 -0
  185. package/dist/tools/web-search.test.js +119 -0
  186. package/dist/tools/web-search.test.js.map +1 -0
  187. package/dist/tools/write.d.ts +1 -1
  188. package/dist/tools/write.d.ts.map +1 -1
  189. package/dist/tools/write.js +3 -1
  190. package/dist/tools/write.js.map +1 -1
  191. package/dist/tools/write.test.js +23 -0
  192. package/dist/tools/write.test.js.map +1 -1
  193. package/dist/ui/App.d.ts +74 -3
  194. package/dist/ui/App.d.ts.map +1 -1
  195. package/dist/ui/App.js +727 -223
  196. package/dist/ui/App.js.map +1 -1
  197. package/dist/ui/activity-phrases.d.ts +2 -1
  198. package/dist/ui/activity-phrases.d.ts.map +1 -1
  199. package/dist/ui/activity-phrases.js +11 -1
  200. package/dist/ui/activity-phrases.js.map +1 -1
  201. package/dist/ui/components/ActivityIndicator.d.ts +15 -1
  202. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  203. package/dist/ui/components/ActivityIndicator.js +143 -44
  204. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  205. package/dist/ui/components/ActivityIndicator.test.d.ts +2 -0
  206. package/dist/ui/components/ActivityIndicator.test.d.ts.map +1 -0
  207. package/dist/ui/components/ActivityIndicator.test.js +40 -0
  208. package/dist/ui/components/ActivityIndicator.test.js.map +1 -0
  209. package/dist/ui/components/AnimationContext.d.ts +8 -2
  210. package/dist/ui/components/AnimationContext.d.ts.map +1 -1
  211. package/dist/ui/components/AnimationContext.js +94 -16
  212. package/dist/ui/components/AnimationContext.js.map +1 -1
  213. package/dist/ui/components/AssistantMessage.js +1 -1
  214. package/dist/ui/components/AssistantMessage.js.map +1 -1
  215. package/dist/ui/components/CompactionNotice.d.ts +5 -1
  216. package/dist/ui/components/CompactionNotice.d.ts.map +1 -1
  217. package/dist/ui/components/CompactionNotice.js +4 -6
  218. package/dist/ui/components/CompactionNotice.js.map +1 -1
  219. package/dist/ui/components/Footer.d.ts +10 -2
  220. package/dist/ui/components/Footer.d.ts.map +1 -1
  221. package/dist/ui/components/Footer.js +45 -8
  222. package/dist/ui/components/Footer.js.map +1 -1
  223. package/dist/ui/components/InputArea.d.ts.map +1 -1
  224. package/dist/ui/components/InputArea.js +76 -28
  225. package/dist/ui/components/InputArea.js.map +1 -1
  226. package/dist/ui/components/ServerToolExecution.d.ts +1 -0
  227. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  228. package/dist/ui/components/ServerToolExecution.js +21 -2
  229. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  230. package/dist/ui/components/Spinner.d.ts +3 -1
  231. package/dist/ui/components/Spinner.d.ts.map +1 -1
  232. package/dist/ui/components/Spinner.js +10 -4
  233. package/dist/ui/components/Spinner.js.map +1 -1
  234. package/dist/ui/components/StreamingArea.js +1 -1
  235. package/dist/ui/components/StreamingArea.js.map +1 -1
  236. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  237. package/dist/ui/components/SubAgentPanel.js +3 -4
  238. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  239. package/dist/ui/components/ToolExecution.d.ts +2 -0
  240. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  241. package/dist/ui/components/ToolExecution.js +24 -5
  242. package/dist/ui/components/ToolExecution.js.map +1 -1
  243. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  244. package/dist/ui/components/ToolGroupExecution.js +23 -2
  245. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  246. package/dist/ui/components/ToolUseLoader.d.ts +4 -2
  247. package/dist/ui/components/ToolUseLoader.d.ts.map +1 -1
  248. package/dist/ui/components/ToolUseLoader.js +3 -3
  249. package/dist/ui/components/ToolUseLoader.js.map +1 -1
  250. package/dist/ui/components/index.d.ts +1 -2
  251. package/dist/ui/components/index.d.ts.map +1 -1
  252. package/dist/ui/components/index.js +1 -2
  253. package/dist/ui/components/index.js.map +1 -1
  254. package/dist/ui/hooks/useAgentLoop.d.ts +4 -1
  255. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  256. package/dist/ui/hooks/useAgentLoop.js +110 -13
  257. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  258. package/dist/ui/hooks/useBlink.d.ts.map +1 -1
  259. package/dist/ui/hooks/useBlink.js +3 -4
  260. package/dist/ui/hooks/useBlink.js.map +1 -1
  261. package/dist/ui/hooks/useTerminalSize.d.ts +12 -3
  262. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  263. package/dist/ui/hooks/useTerminalSize.js +16 -1
  264. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  265. package/dist/ui/pixel.js +1 -1
  266. package/dist/ui/pixel.test.js +1 -1
  267. package/dist/ui/pixel.test.js.map +1 -1
  268. package/dist/ui/render.d.ts +48 -1
  269. package/dist/ui/render.d.ts.map +1 -1
  270. package/dist/ui/render.js +56 -6
  271. package/dist/ui/render.js.map +1 -1
  272. package/dist/ui/theme/dark-ansi.json +2 -1
  273. package/dist/ui/theme/dark-daltonized.json +2 -1
  274. package/dist/ui/theme/dark.json +2 -1
  275. package/dist/ui/theme/light-ansi.json +2 -1
  276. package/dist/ui/theme/light-daltonized.json +2 -1
  277. package/dist/ui/theme/light.json +2 -1
  278. package/dist/ui/theme/theme.d.ts +1 -0
  279. package/dist/ui/theme/theme.d.ts.map +1 -1
  280. package/dist/utils/error-handler.d.ts.map +1 -1
  281. package/dist/utils/error-handler.js +2 -0
  282. package/dist/utils/error-handler.js.map +1 -1
  283. package/package.json +9 -6
  284. package/dist/ui/buddy/Buddy.d.ts +0 -15
  285. package/dist/ui/buddy/Buddy.d.ts.map +0 -1
  286. package/dist/ui/buddy/Buddy.js +0 -118
  287. package/dist/ui/buddy/Buddy.js.map +0 -1
  288. package/dist/ui/buddy/gacha.d.ts +0 -8
  289. package/dist/ui/buddy/gacha.d.ts.map +0 -1
  290. package/dist/ui/buddy/gacha.js +0 -94
  291. package/dist/ui/buddy/gacha.js.map +0 -1
  292. package/dist/ui/buddy/species.d.ts +0 -52
  293. package/dist/ui/buddy/species.d.ts.map +0 -1
  294. package/dist/ui/buddy/species.js +0 -257
  295. package/dist/ui/buddy/species.js.map +0 -1
  296. package/dist/ui/components/ThinkingIndicator.d.ts +0 -6
  297. package/dist/ui/components/ThinkingIndicator.d.ts.map +0 -1
  298. package/dist/ui/components/ThinkingIndicator.js +0 -145
  299. package/dist/ui/components/ThinkingIndicator.js.map +0 -1
@@ -0,0 +1,107 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { buildSystemPrompt } from "./system-prompt.js";
6
+ const tempDirs = [];
7
+ async function makeProject(files = {}) {
8
+ const cwd = await fs.mkdtemp(path.join(os.tmpdir(), "ezcoder-system-prompt-"));
9
+ tempDirs.push(cwd);
10
+ for (const [relativePath, content] of Object.entries(files)) {
11
+ const filePath = path.join(cwd, relativePath);
12
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
13
+ await fs.writeFile(filePath, content, "utf-8");
14
+ }
15
+ return cwd;
16
+ }
17
+ function sectionIndex(prompt, heading) {
18
+ const index = prompt.indexOf(heading);
19
+ expect(index, `${heading} should exist`).toBeGreaterThanOrEqual(0);
20
+ return index;
21
+ }
22
+ function toolsSection(prompt) {
23
+ const start = sectionIndex(prompt, "## Tools");
24
+ const rest = prompt.slice(start);
25
+ const next = rest.indexOf("\n\n## ", "## Tools".length);
26
+ return next === -1 ? rest : rest.slice(0, next);
27
+ }
28
+ afterEach(async () => {
29
+ await Promise.all(tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })));
30
+ });
31
+ describe("buildSystemPrompt", () => {
32
+ it("renders deterministic section order and keeps only the volatile date after the marker", async () => {
33
+ const cwd = await makeProject({
34
+ "CLAUDE.md": "Project rules win.",
35
+ "package.json": JSON.stringify({ scripts: { check: "tsc --noEmit" } }),
36
+ "tsconfig.json": "{}",
37
+ });
38
+ const prompt = await buildSystemPrompt(cwd, [{ name: "find-skills", description: "Find skills.", content: "", source: "test" }], false, undefined, ["read", "edit", "web_search", "enter_plan", "exit_plan", "skill"], new Set(["typescript"]));
39
+ expect(prompt.startsWith("You are EZ Coder by Nolan Grout")).toBe(true);
40
+ expect(sectionIndex(prompt, "## How to Talk")).toBeLessThan(sectionIndex(prompt, "## How to Work"));
41
+ expect(sectionIndex(prompt, "## How to Work")).toBeLessThan(sectionIndex(prompt, "## Research & Verification"));
42
+ expect(sectionIndex(prompt, "## Research & Verification")).toBeLessThan(sectionIndex(prompt, "## Code Quality"));
43
+ expect(sectionIndex(prompt, "## Code Quality")).toBeLessThan(sectionIndex(prompt, "## Tools"));
44
+ expect(sectionIndex(prompt, "## Tools")).toBeLessThan(sectionIndex(prompt, "## Project Context"));
45
+ expect(sectionIndex(prompt, "## Project Context")).toBeLessThan(sectionIndex(prompt, "## Language Style Packs"));
46
+ expect(sectionIndex(prompt, "## Language Style Packs")).toBeLessThan(sectionIndex(prompt, "## Verification"));
47
+ expect(sectionIndex(prompt, "## Verification")).toBeLessThan(sectionIndex(prompt, "## Skills"));
48
+ expect(sectionIndex(prompt, "## Skills")).toBeLessThan(sectionIndex(prompt, "## Environment"));
49
+ const marker = "<!-- uncached -->";
50
+ expect(prompt.match(new RegExp(marker, "g"))).toHaveLength(1);
51
+ const afterMarker = prompt.slice(prompt.indexOf(marker) + marker.length).trim();
52
+ expect(afterMarker).toMatch(/^Today's date: \d{1,2} [A-Za-z]+ \d{4}$/);
53
+ });
54
+ it("lists exactly available known tools and hides unavailable plan transition tools", async () => {
55
+ const cwd = await makeProject();
56
+ const normalPrompt = await buildSystemPrompt(cwd, undefined, false, undefined, [
57
+ "read",
58
+ "web_search",
59
+ "exit_plan",
60
+ "not_a_tool",
61
+ ]);
62
+ const normalTools = toolsSection(normalPrompt);
63
+ expect(normalTools).toContain("**read**");
64
+ expect(normalTools).toContain("**web_search**");
65
+ expect(normalTools).not.toContain("**exit_plan**");
66
+ expect(normalTools).not.toContain("not_a_tool");
67
+ expect(normalTools).not.toContain("**edit**");
68
+ const planPrompt = await buildSystemPrompt(cwd, undefined, true, undefined, [
69
+ "read",
70
+ "enter_plan",
71
+ "exit_plan",
72
+ ]);
73
+ const planTools = toolsSection(planPrompt);
74
+ expect(planTools).toContain("**read**");
75
+ expect(planTools).toContain("**exit_plan**");
76
+ expect(planTools).not.toContain("**enter_plan**");
77
+ });
78
+ it("places project-context precedence next to project context before style packs", async () => {
79
+ const cwd = await makeProject({
80
+ "AGENTS.md": "Use tabs for this fixture.",
81
+ "tsconfig.json": "{}",
82
+ });
83
+ const prompt = await buildSystemPrompt(cwd, undefined, false, undefined, ["read"], new Set(["typescript"]));
84
+ const projectContextIndex = sectionIndex(prompt, "## Project Context");
85
+ const precedenceIndex = prompt.indexOf("**Highest precedence**", projectContextIndex);
86
+ expect(precedenceIndex).toBeGreaterThan(projectContextIndex);
87
+ expect(precedenceIndex).toBeLessThan(sectionIndex(prompt, "### AGENTS.md"));
88
+ expect(sectionIndex(prompt, "## Project Context")).toBeLessThan(sectionIndex(prompt, "## Language Style Packs"));
89
+ expect(prompt).toContain("AGENTS.md / CLAUDE.md override Language Style Packs");
90
+ });
91
+ it("keeps kencode guidance concise while separating exploration from exact search", async () => {
92
+ const cwd = await makeProject();
93
+ const prompt = await buildSystemPrompt(cwd, undefined, false, undefined, [
94
+ "mcp__kencode-search__exploreCodeSamples",
95
+ "mcp__kencode-search__searchCode",
96
+ ]);
97
+ const tools = toolsSection(prompt);
98
+ expect(tools).toContain("discover candidate repos/files and literal anchors");
99
+ expect(tools).toContain("follow-up searchCode calls");
100
+ expect(tools).toContain("literal text or RE2 regex");
101
+ expect(tools).toContain("NOT semantic");
102
+ expect(tools).toContain("path` is a literal file-path substring");
103
+ expect(tools).not.toContain("zero hits, every time");
104
+ expect(tools.length).toBeLessThan(750);
105
+ });
106
+ });
107
+ //# sourceMappingURL=system-prompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.test.js","sourceRoot":"","sources":["../src/system-prompt.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAIjE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAwDvE,QAAA,MAAM,UAAU;;;;iBAed,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC,SAAS,CAAC,OAAO,UAAU,CAAC,CAiH9B"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAIjE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAwDvE,QAAA,MAAM,UAAU;;;;iBAed,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC,SAAS,CAAC,OAAO,UAAU,CAAC,CAkH9B"}
@@ -80,6 +80,7 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
80
80
  "Set run_in_background=true for long-running processes (dev servers, watchers). " +
81
81
  "Use task_output/task_stop to interact with background processes.",
82
82
  parameters: BashParams,
83
+ executionMode: "sequential",
83
84
  async execute({ command, timeout: timeoutMs, run_in_background }, context) {
84
85
  if (planModeRef?.current) {
85
86
  return "Error: bash is restricted in plan mode. Use read-only tools (read, grep, find, ls) to explore the codebase.";
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,53 @@
1
+ /**
2
+ * Aider's `replace_part_with_missing_leading_whitespace` (~10k stars between
3
+ * aider/devon/codemcp/qwen-coder use this exact pattern). Models very often
4
+ * mess up leading whitespace — uniformly across both old_text and new_text.
5
+ * Strategy:
6
+ * 1. Outdent old/new uniformly by the smallest leading-whitespace count
7
+ * across all non-blank lines (handles "model included some but not all").
8
+ * 2. Scan the file for a window where every line matches when stripped AND
9
+ * the file's actual leading prefix is uniform across non-blank lines.
10
+ * 3. Re-apply that uniform file-prefix to every non-blank line of new_text
11
+ * before substituting.
12
+ *
13
+ * Returns the rewritten file content on success, null when no unique match.
14
+ */
15
+ export declare function applyMissingLeadingWhitespace(working: string, old: string, next: string): string | null;
16
+ /**
17
+ * Aider-style `...` elision matching: when `old_text` contains lines that are
18
+ * just `...`, treat them as "skip whatever's here" placeholders. The model
19
+ * writes:
20
+ *
21
+ * old: function foo() {
22
+ * ...
23
+ * return bar;
24
+ * }
25
+ * new: function foo() {
26
+ * ...
27
+ * return baz;
28
+ * }
29
+ *
30
+ * We split both `old` and `next` on the `...` lines, then anchor the bookend
31
+ * pieces in `working` (greedy, in order). The elided middle from `working` is
32
+ * preserved verbatim and stitched in between the new bookends. Returns the
33
+ * rewritten buffer on success, null when:
34
+ * - `old` has no `...` lines (caller should try other strategies)
35
+ * - piece counts differ between `old` and `next` (ambiguous elision)
36
+ * - any piece is empty (means dots at start/end or adjacent — too risky)
37
+ * - any old piece doesn't appear in `working` after the previous one
38
+ *
39
+ * Greedy first-match-then-forward. We DO NOT support `replace_all` with
40
+ * elision — `...` is intrinsically a single edit.
41
+ */
42
+ export declare function applyDotdotdots(working: string, old: string, next: string): string | null;
43
+ /**
44
+ * Models often add a spurious leading blank line to `old_text` (e.g. when
45
+ * copying a code block out of fenced markdown). Aider noticed this back at
46
+ * its issue #25. If the first line is blank, return the same text minus that
47
+ * line so the caller can retry the match. Returns null when no leading blank
48
+ * line exists, so callers can cheaply skip the retry.
49
+ */
50
+ export declare function stripLeadingBlankLine(text: string): string | null;
1
51
  /**
2
52
  * Find text in content, trying exact match first then fuzzy.
3
53
  */
@@ -20,7 +70,22 @@ export declare function countOccurrences(content: string, oldText: string): numb
20
70
  * expected location(s) — multiple results help disambiguate when several
21
71
  * regions look similar (e.g. repeated function bodies).
22
72
  */
23
- export declare function findClosestSnippet(content: string, oldText: string, contextLines?: number, maxResults?: number): string | null;
73
+ export interface ClosestSnippet {
74
+ snippet: string;
75
+ topLine: number;
76
+ }
77
+ export declare function findClosestSnippet(content: string, oldText: string, contextLines?: number, maxResults?: number): ClosestSnippet | null;
78
+ /**
79
+ * Locate every occurrence of `text` in `content` and return the 1-indexed line
80
+ * number plus a trimmed preview of that line. Tries exact first, then the same
81
+ * fuzzy normalization as `countOccurrences` so the line numbers match what the
82
+ * caller saw in `countOccurrences`. Capped at `max` so error messages stay
83
+ * compact when a token like `}` matches dozens of times.
84
+ */
85
+ export declare function findOccurrenceLines(content: string, text: string, max?: number): {
86
+ line: number;
87
+ preview: string;
88
+ }[];
24
89
  /**
25
90
  * Generate a unified diff string.
26
91
  */
@@ -1 +1 @@
1
- {"version":3,"file":"edit-diff.d.ts","sourceRoot":"","sources":["../../src/tools/edit-diff.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAyC5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBzE;AASD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,SAAI,EAChB,UAAU,SAAI,GACb,MAAM,GAAG,IAAI,CAsCf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa7F"}
1
+ {"version":3,"file":"edit-diff.d.ts","sourceRoot":"","sources":["../../src/tools/edit-diff.ts"],"names":[],"mappings":"AA8CA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAgDf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkCzF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAyC5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBzE;AASD;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAIhB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,SAAI,EAChB,UAAU,SAAI,GACb,cAAc,GAAG,IAAI,CAuCvB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,GAAG,SAAI,GACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CA6BrC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa7F"}
@@ -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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"}