@prestyj/cli 5.12.0 → 5.16.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 (1245) hide show
  1. package/README.md +51 -36
  2. package/assets/skills/bulletproof/SKILL.md +158 -0
  3. package/assets/skills/bulletproof/references/agent-surface.md +82 -0
  4. package/assets/skills/bulletproof/references/audit-protocol.md +147 -0
  5. package/assets/skills/bulletproof/references/platform-playbooks.md +176 -0
  6. package/assets/skills/bulletproof/references/provenance.md +45 -0
  7. package/assets/skills/bulletproof/references/secure-defaults.md +108 -0
  8. package/assets/skills/bulletproof/references/supply-chain.md +76 -0
  9. package/assets/skills/bulletproof/references/threat-landscape.md +74 -0
  10. package/assets/skills/bulletproof/references/verification.md +65 -0
  11. package/assets/skills/clarify/SKILL.md +30 -0
  12. package/assets/skills/code-review/SKILL.md +30 -0
  13. package/assets/skills/durable/SKILL.md +111 -0
  14. package/assets/skills/durable/references/backups-and-runtime.md +86 -0
  15. package/assets/skills/durable/references/migrations-and-schema.md +79 -0
  16. package/assets/skills/lean/SKILL.md +110 -0
  17. package/assets/skills/lean/references/memory-and-processes.md +98 -0
  18. package/assets/skills/lean/references/playbooks.md +107 -0
  19. package/assets/skills/root-cause/SKILL.md +36 -0
  20. package/assets/skills/shared-language/SKILL.md +30 -0
  21. package/assets/skills/tdd/SKILL.md +30 -0
  22. package/dist/app-sidecar.js +486 -95
  23. package/dist/app-sidecar.js.map +1 -1
  24. package/dist/chat-agents/research.d.ts +1 -1
  25. package/dist/chat-agents/research.d.ts.map +1 -1
  26. package/dist/chat-agents/research.js +1 -1
  27. package/dist/chat-agents/research.js.map +1 -1
  28. package/dist/cli/mcp.js +30 -10
  29. package/dist/cli/mcp.js.map +1 -1
  30. package/dist/cli/shared.d.ts.map +1 -1
  31. package/dist/cli/shared.js +2 -0
  32. package/dist/cli/shared.js.map +1 -1
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +16 -7
  35. package/dist/cli.js.map +1 -1
  36. package/dist/config.d.ts +12 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +16 -0
  39. package/dist/config.js.map +1 -1
  40. package/dist/core/agent-session.d.ts +65 -4
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +281 -22
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/agents.d.ts +2 -3
  45. package/dist/core/agents.d.ts.map +1 -1
  46. package/dist/core/agents.js +4 -5
  47. package/dist/core/agents.js.map +1 -1
  48. package/dist/core/api-benchmark.d.ts +1 -1
  49. package/dist/core/api-benchmark.js +2 -2
  50. package/dist/core/ask-user.d.ts +63 -0
  51. package/dist/core/ask-user.d.ts.map +1 -0
  52. package/dist/core/ask-user.js +40 -0
  53. package/dist/core/ask-user.js.map +1 -0
  54. package/dist/core/auth-providers.d.ts +6 -0
  55. package/dist/core/auth-providers.d.ts.map +1 -1
  56. package/dist/core/auth-providers.js +30 -24
  57. package/dist/core/auth-providers.js.map +1 -1
  58. package/dist/core/bundled-agents.d.ts.map +1 -1
  59. package/dist/core/bundled-agents.js +17 -5
  60. package/dist/core/bundled-agents.js.map +1 -1
  61. package/dist/core/context-limits.d.ts +35 -0
  62. package/dist/core/context-limits.d.ts.map +1 -0
  63. package/dist/core/context-limits.js +35 -0
  64. package/dist/core/context-limits.js.map +1 -0
  65. package/dist/core/env-delta.d.ts +27 -0
  66. package/dist/core/env-delta.d.ts.map +1 -0
  67. package/dist/core/env-delta.js +65 -0
  68. package/dist/core/env-delta.js.map +1 -0
  69. package/dist/core/event-bus.d.ts +12 -2
  70. package/dist/core/event-bus.d.ts.map +1 -1
  71. package/dist/core/event-bus.js +1 -0
  72. package/dist/core/event-bus.js.map +1 -1
  73. package/dist/core/goal-worker.js +1 -1
  74. package/dist/core/goal-worker.js.map +1 -1
  75. package/dist/core/hashline-edit-benchmark.d.ts +2 -0
  76. package/dist/core/hashline-edit-benchmark.d.ts.map +1 -1
  77. package/dist/core/hashline-edit-benchmark.js +5 -1
  78. package/dist/core/hashline-edit-benchmark.js.map +1 -1
  79. package/dist/core/lsp/edit-telemetry.d.ts +27 -0
  80. package/dist/core/lsp/edit-telemetry.d.ts.map +1 -0
  81. package/dist/core/lsp/edit-telemetry.js +50 -0
  82. package/dist/core/lsp/edit-telemetry.js.map +1 -0
  83. package/dist/core/lsp/manager.d.ts +24 -1
  84. package/dist/core/lsp/manager.d.ts.map +1 -1
  85. package/dist/core/lsp/manager.js +53 -2
  86. package/dist/core/lsp/manager.js.map +1 -1
  87. package/dist/core/mcp/client.js +1 -1
  88. package/dist/core/mcp/client.js.map +1 -1
  89. package/dist/core/mcp/content.d.ts +5 -0
  90. package/dist/core/mcp/content.d.ts.map +1 -1
  91. package/dist/core/mcp/content.js +20 -2
  92. package/dist/core/mcp/content.js.map +1 -1
  93. package/dist/core/mcp/defaults.d.ts +7 -3
  94. package/dist/core/mcp/defaults.d.ts.map +1 -1
  95. package/dist/core/mcp/defaults.js +19 -14
  96. package/dist/core/mcp/defaults.js.map +1 -1
  97. package/dist/core/mcp/deferred-catalog.d.ts +9 -0
  98. package/dist/core/mcp/deferred-catalog.d.ts.map +1 -1
  99. package/dist/core/mcp/deferred-catalog.js +15 -1
  100. package/dist/core/mcp/deferred-catalog.js.map +1 -1
  101. package/dist/core/mcp/elicitation-bridge.d.ts.map +1 -1
  102. package/dist/core/mcp/elicitation-bridge.js +12 -28
  103. package/dist/core/mcp/elicitation-bridge.js.map +1 -1
  104. package/dist/core/mcp/shared-pool.d.ts +2 -2
  105. package/dist/core/mcp/shared-pool.js +2 -2
  106. package/dist/core/nolan-prompt.d.ts +1 -1
  107. package/dist/core/nolan-prompt.js +16 -8
  108. package/dist/core/nolan-prompt.js.map +1 -1
  109. package/dist/core/parked-requests.d.ts +44 -0
  110. package/dist/core/parked-requests.d.ts.map +1 -0
  111. package/dist/core/parked-requests.js +34 -0
  112. package/dist/core/parked-requests.js.map +1 -0
  113. package/dist/core/platform-clis.d.ts +16 -0
  114. package/dist/core/platform-clis.d.ts.map +1 -0
  115. package/dist/core/platform-clis.js +299 -0
  116. package/dist/core/platform-clis.js.map +1 -0
  117. package/dist/core/process-manager.d.ts +50 -1
  118. package/dist/core/process-manager.d.ts.map +1 -1
  119. package/dist/core/process-manager.js +155 -4
  120. package/dist/core/process-manager.js.map +1 -1
  121. package/dist/core/prompt-commands.d.ts.map +1 -1
  122. package/dist/core/prompt-commands.js +75 -37
  123. package/dist/core/prompt-commands.js.map +1 -1
  124. package/dist/core/sandbox.d.ts +17 -1
  125. package/dist/core/sandbox.d.ts.map +1 -1
  126. package/dist/core/sandbox.js +140 -9
  127. package/dist/core/sandbox.js.map +1 -1
  128. package/dist/core/session-manager.d.ts +18 -1
  129. package/dist/core/session-manager.d.ts.map +1 -1
  130. package/dist/core/session-manager.js +62 -23
  131. package/dist/core/session-manager.js.map +1 -1
  132. package/dist/core/settings-manager.d.ts +22 -2
  133. package/dist/core/settings-manager.d.ts.map +1 -1
  134. package/dist/core/settings-manager.js +64 -0
  135. package/dist/core/settings-manager.js.map +1 -1
  136. package/dist/core/skills.d.ts +16 -1
  137. package/dist/core/skills.d.ts.map +1 -1
  138. package/dist/core/skills.js +38 -6
  139. package/dist/core/skills.js.map +1 -1
  140. package/dist/core/steroids.d.ts +59 -0
  141. package/dist/core/steroids.d.ts.map +1 -0
  142. package/dist/core/steroids.js +227 -0
  143. package/dist/core/steroids.js.map +1 -0
  144. package/dist/core/subagent-manager.d.ts +17 -0
  145. package/dist/core/subagent-manager.d.ts.map +1 -1
  146. package/dist/core/subagent-manager.js +92 -1
  147. package/dist/core/subagent-manager.js.map +1 -1
  148. package/dist/core/subagent-turn-record.d.ts +17 -0
  149. package/dist/core/subagent-turn-record.d.ts.map +1 -0
  150. package/dist/core/subagent-turn-record.js +82 -0
  151. package/dist/core/subagent-turn-record.js.map +1 -0
  152. package/dist/core/verification-gate.d.ts +123 -0
  153. package/dist/core/verification-gate.d.ts.map +1 -0
  154. package/dist/core/verification-gate.js +446 -0
  155. package/dist/core/verification-gate.js.map +1 -0
  156. package/dist/core/workspace-guard.d.ts +6 -0
  157. package/dist/core/workspace-guard.d.ts.map +1 -1
  158. package/dist/core/workspace-guard.js +58 -7
  159. package/dist/core/workspace-guard.js.map +1 -1
  160. package/dist/hf-pull.d.ts +102 -0
  161. package/dist/hf-pull.d.ts.map +1 -0
  162. package/dist/hf-pull.js +225 -0
  163. package/dist/hf-pull.js.map +1 -0
  164. package/dist/modes/json-mode.d.ts +2 -2
  165. package/dist/modes/json-mode.d.ts.map +1 -1
  166. package/dist/modes/json-mode.js +2 -8
  167. package/dist/modes/json-mode.js.map +1 -1
  168. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  169. package/dist/modes/subagent-worker-mode.js +66 -18
  170. package/dist/modes/subagent-worker-mode.js.map +1 -1
  171. package/dist/system-prompt.d.ts +5 -2
  172. package/dist/system-prompt.d.ts.map +1 -1
  173. package/dist/system-prompt.js +136 -36
  174. package/dist/system-prompt.js.map +1 -1
  175. package/dist/tools/ask-user.d.ts +35 -0
  176. package/dist/tools/ask-user.d.ts.map +1 -0
  177. package/dist/tools/ask-user.js +157 -0
  178. package/dist/tools/ask-user.js.map +1 -0
  179. package/dist/tools/bash.d.ts +4 -0
  180. package/dist/tools/bash.d.ts.map +1 -1
  181. package/dist/tools/bash.js +63 -4
  182. package/dist/tools/bash.js.map +1 -1
  183. package/dist/tools/edit.d.ts +2 -1
  184. package/dist/tools/edit.d.ts.map +1 -1
  185. package/dist/tools/edit.js +58 -9
  186. package/dist/tools/edit.js.map +1 -1
  187. package/dist/tools/index.d.ts +9 -0
  188. package/dist/tools/index.d.ts.map +1 -1
  189. package/dist/tools/index.js +8 -2
  190. package/dist/tools/index.js.map +1 -1
  191. package/dist/tools/operations.d.ts +48 -0
  192. package/dist/tools/operations.d.ts.map +1 -1
  193. package/dist/tools/operations.js +92 -2
  194. package/dist/tools/operations.js.map +1 -1
  195. package/dist/tools/path-utils.d.ts +28 -1
  196. package/dist/tools/path-utils.d.ts.map +1 -1
  197. package/dist/tools/path-utils.js +44 -2
  198. package/dist/tools/path-utils.js.map +1 -1
  199. package/dist/tools/prompt-hints.d.ts.map +1 -1
  200. package/dist/tools/prompt-hints.js +8 -6
  201. package/dist/tools/prompt-hints.js.map +1 -1
  202. package/dist/tools/read-only-bash.d.ts +6 -0
  203. package/dist/tools/read-only-bash.d.ts.map +1 -1
  204. package/dist/tools/read-only-bash.js +168 -9
  205. package/dist/tools/read-only-bash.js.map +1 -1
  206. package/dist/tools/read.d.ts.map +1 -1
  207. package/dist/tools/read.js +35 -3
  208. package/dist/tools/read.js.map +1 -1
  209. package/dist/tools/skill.d.ts +3 -2
  210. package/dist/tools/skill.d.ts.map +1 -1
  211. package/dist/tools/skill.js +11 -7
  212. package/dist/tools/skill.js.map +1 -1
  213. package/dist/tools/steroids.d.ts +46 -0
  214. package/dist/tools/steroids.d.ts.map +1 -0
  215. package/dist/tools/steroids.js +233 -0
  216. package/dist/tools/steroids.js.map +1 -0
  217. package/dist/tools/subagent-shared.d.ts +1 -1
  218. package/dist/tools/subagent-shared.d.ts.map +1 -1
  219. package/dist/tools/subagent-shared.js +1 -4
  220. package/dist/tools/subagent-shared.js.map +1 -1
  221. package/dist/tools/subagent.js +1 -1
  222. package/dist/tools/subagent.js.map +1 -1
  223. package/dist/tools/tool-search.d.ts +2 -1
  224. package/dist/tools/tool-search.d.ts.map +1 -1
  225. package/dist/tools/tool-search.js +28 -3
  226. package/dist/tools/tool-search.js.map +1 -1
  227. package/dist/tools/tool-tiers.d.ts.map +1 -1
  228. package/dist/tools/tool-tiers.js +5 -0
  229. package/dist/tools/tool-tiers.js.map +1 -1
  230. package/dist/tools/web-fetch.d.ts +7 -0
  231. package/dist/tools/web-fetch.d.ts.map +1 -1
  232. package/dist/tools/web-fetch.js +308 -20
  233. package/dist/tools/web-fetch.js.map +1 -1
  234. package/dist/tools/write.d.ts +1 -1
  235. package/dist/tools/write.d.ts.map +1 -1
  236. package/dist/tools/write.js +1 -1
  237. package/dist/tools/write.js.map +1 -1
  238. package/dist/ui/App.d.ts +3 -0
  239. package/dist/ui/App.d.ts.map +1 -1
  240. package/dist/ui/App.js +56 -30
  241. package/dist/ui/App.js.map +1 -1
  242. package/dist/ui/app-items.d.ts +5 -0
  243. package/dist/ui/app-items.d.ts.map +1 -1
  244. package/dist/ui/app-items.js +5 -0
  245. package/dist/ui/app-items.js.map +1 -1
  246. package/dist/ui/components/Footer.js +1 -1
  247. package/dist/ui/components/Footer.js.map +1 -1
  248. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  249. package/dist/ui/components/ModelSelector.js +1 -0
  250. package/dist/ui/components/ModelSelector.js.map +1 -1
  251. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  252. package/dist/ui/components/ToolExecution.js +10 -3
  253. package/dist/ui/components/ToolExecution.js.map +1 -1
  254. package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
  255. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  256. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  257. package/dist/ui/login.d.ts.map +1 -1
  258. package/dist/ui/login.js +5 -33
  259. package/dist/ui/login.js.map +1 -1
  260. package/dist/ui/prompt-routing.d.ts +2 -2
  261. package/dist/ui/prompt-routing.d.ts.map +1 -1
  262. package/dist/ui/prompt-routing.js +20 -8
  263. package/dist/ui/prompt-routing.js.map +1 -1
  264. package/dist/ui/submit-prompt-command.d.ts.map +1 -1
  265. package/dist/ui/submit-prompt-command.js +1 -1
  266. package/dist/ui/submit-prompt-command.js.map +1 -1
  267. package/dist/ui/terminal-history.js +4 -2
  268. package/dist/ui/terminal-history.js.map +1 -1
  269. package/dist/ui/tool-group-summary.d.ts +2 -0
  270. package/dist/ui/tool-group-summary.d.ts.map +1 -1
  271. package/dist/ui/tool-group-summary.js +11 -25
  272. package/dist/ui/tool-group-summary.js.map +1 -1
  273. package/dist/ui/tool-line-summary.d.ts.map +1 -1
  274. package/dist/ui/tool-line-summary.js +12 -9
  275. package/dist/ui/tool-line-summary.js.map +1 -1
  276. package/dist/ui/transcript/tool-presentation.d.ts.map +1 -1
  277. package/dist/ui/transcript/tool-presentation.js +2 -7
  278. package/dist/ui/transcript/tool-presentation.js.map +1 -1
  279. package/dist/ui/utils/text-utils.d.ts +0 -6
  280. package/dist/ui/utils/text-utils.d.ts.map +1 -1
  281. package/dist/ui/utils/text-utils.js +8 -3
  282. package/dist/ui/utils/text-utils.js.map +1 -1
  283. package/dist/utils/image.d.ts.map +1 -1
  284. package/dist/utils/image.js.map +1 -1
  285. package/dist/utils/text.d.ts +41 -0
  286. package/dist/utils/text.d.ts.map +1 -1
  287. package/dist/utils/text.js +46 -0
  288. package/dist/utils/text.js.map +1 -1
  289. package/package.json +7 -8
  290. package/dist/app-sidecar-auth-broadcast.test.d.ts +0 -2
  291. package/dist/app-sidecar-auth-broadcast.test.d.ts.map +0 -1
  292. package/dist/app-sidecar-auth-broadcast.test.js +0 -348
  293. package/dist/app-sidecar-auth-broadcast.test.js.map +0 -1
  294. package/dist/app-sidecar-sessions.test.d.ts +0 -2
  295. package/dist/app-sidecar-sessions.test.d.ts.map +0 -1
  296. package/dist/app-sidecar-sessions.test.js +0 -178
  297. package/dist/app-sidecar-sessions.test.js.map +0 -1
  298. package/dist/chat-agents/general.test.d.ts +0 -2
  299. package/dist/chat-agents/general.test.d.ts.map +0 -1
  300. package/dist/chat-agents/general.test.js +0 -52
  301. package/dist/chat-agents/general.test.js.map +0 -1
  302. package/dist/chat-agents/jiwa.test.d.ts +0 -2
  303. package/dist/chat-agents/jiwa.test.d.ts.map +0 -1
  304. package/dist/chat-agents/jiwa.test.js +0 -66
  305. package/dist/chat-agents/jiwa.test.js.map +0 -1
  306. package/dist/chat-agents/memory.test.d.ts +0 -2
  307. package/dist/chat-agents/memory.test.d.ts.map +0 -1
  308. package/dist/chat-agents/memory.test.js +0 -165
  309. package/dist/chat-agents/memory.test.js.map +0 -1
  310. package/dist/chat-agents/specialists.test.d.ts +0 -2
  311. package/dist/chat-agents/specialists.test.d.ts.map +0 -1
  312. package/dist/chat-agents/specialists.test.js +0 -98
  313. package/dist/chat-agents/specialists.test.js.map +0 -1
  314. package/dist/cli/command-routing.test.d.ts +0 -2
  315. package/dist/cli/command-routing.test.d.ts.map +0 -1
  316. package/dist/cli/command-routing.test.js +0 -61
  317. package/dist/cli/command-routing.test.js.map +0 -1
  318. package/dist/config.test.d.ts +0 -2
  319. package/dist/config.test.d.ts.map +0 -1
  320. package/dist/config.test.js +0 -123
  321. package/dist/config.test.js.map +0 -1
  322. package/dist/core/agent-mcp-passthrough.test.d.ts +0 -2
  323. package/dist/core/agent-mcp-passthrough.test.d.ts.map +0 -1
  324. package/dist/core/agent-mcp-passthrough.test.js +0 -61
  325. package/dist/core/agent-mcp-passthrough.test.js.map +0 -1
  326. package/dist/core/agent-notifications.test.d.ts +0 -2
  327. package/dist/core/agent-notifications.test.d.ts.map +0 -1
  328. package/dist/core/agent-notifications.test.js +0 -97
  329. package/dist/core/agent-notifications.test.js.map +0 -1
  330. package/dist/core/agent-session-add-dir.test.d.ts +0 -2
  331. package/dist/core/agent-session-add-dir.test.d.ts.map +0 -1
  332. package/dist/core/agent-session-add-dir.test.js +0 -110
  333. package/dist/core/agent-session-add-dir.test.js.map +0 -1
  334. package/dist/core/agent-session-checkpoint-flush.test.d.ts +0 -2
  335. package/dist/core/agent-session-checkpoint-flush.test.d.ts.map +0 -1
  336. package/dist/core/agent-session-checkpoint-flush.test.js +0 -201
  337. package/dist/core/agent-session-checkpoint-flush.test.js.map +0 -1
  338. package/dist/core/agent-session-compaction.test.d.ts +0 -2
  339. package/dist/core/agent-session-compaction.test.d.ts.map +0 -1
  340. package/dist/core/agent-session-compaction.test.js +0 -1096
  341. package/dist/core/agent-session-compaction.test.js.map +0 -1
  342. package/dist/core/agent-session-crash-durability.test.d.ts +0 -2
  343. package/dist/core/agent-session-crash-durability.test.d.ts.map +0 -1
  344. package/dist/core/agent-session-crash-durability.test.js +0 -102
  345. package/dist/core/agent-session-crash-durability.test.js.map +0 -1
  346. package/dist/core/agent-session-marker-anchors.test.d.ts +0 -2
  347. package/dist/core/agent-session-marker-anchors.test.d.ts.map +0 -1
  348. package/dist/core/agent-session-marker-anchors.test.js +0 -326
  349. package/dist/core/agent-session-marker-anchors.test.js.map +0 -1
  350. package/dist/core/agent-session-memory-tail.test.d.ts +0 -2
  351. package/dist/core/agent-session-memory-tail.test.d.ts.map +0 -1
  352. package/dist/core/agent-session-memory-tail.test.js +0 -119
  353. package/dist/core/agent-session-memory-tail.test.js.map +0 -1
  354. package/dist/core/agent-session-model-switch.test.d.ts +0 -2
  355. package/dist/core/agent-session-model-switch.test.d.ts.map +0 -1
  356. package/dist/core/agent-session-model-switch.test.js +0 -161
  357. package/dist/core/agent-session-model-switch.test.js.map +0 -1
  358. package/dist/core/agent-session-notifications.test.d.ts +0 -2
  359. package/dist/core/agent-session-notifications.test.d.ts.map +0 -1
  360. package/dist/core/agent-session-notifications.test.js +0 -114
  361. package/dist/core/agent-session-notifications.test.js.map +0 -1
  362. package/dist/core/agent-session-process-gate.test.d.ts +0 -2
  363. package/dist/core/agent-session-process-gate.test.d.ts.map +0 -1
  364. package/dist/core/agent-session-process-gate.test.js +0 -98
  365. package/dist/core/agent-session-process-gate.test.js.map +0 -1
  366. package/dist/core/agent-session-queue.test.d.ts +0 -2
  367. package/dist/core/agent-session-queue.test.d.ts.map +0 -1
  368. package/dist/core/agent-session-queue.test.js +0 -184
  369. package/dist/core/agent-session-queue.test.js.map +0 -1
  370. package/dist/core/agent-session-review-coverage.test.d.ts +0 -2
  371. package/dist/core/agent-session-review-coverage.test.d.ts.map +0 -1
  372. package/dist/core/agent-session-review-coverage.test.js +0 -140
  373. package/dist/core/agent-session-review-coverage.test.js.map +0 -1
  374. package/dist/core/agent-session-slash-restore.test.d.ts +0 -2
  375. package/dist/core/agent-session-slash-restore.test.d.ts.map +0 -1
  376. package/dist/core/agent-session-slash-restore.test.js +0 -121
  377. package/dist/core/agent-session-slash-restore.test.js.map +0 -1
  378. package/dist/core/agent-session-subagent-policy.test.d.ts +0 -2
  379. package/dist/core/agent-session-subagent-policy.test.d.ts.map +0 -1
  380. package/dist/core/agent-session-subagent-policy.test.js +0 -40
  381. package/dist/core/agent-session-subagent-policy.test.js.map +0 -1
  382. package/dist/core/agent-session-tool-result-policy.test.d.ts +0 -2
  383. package/dist/core/agent-session-tool-result-policy.test.d.ts.map +0 -1
  384. package/dist/core/agent-session-tool-result-policy.test.js +0 -25
  385. package/dist/core/agent-session-tool-result-policy.test.js.map +0 -1
  386. package/dist/core/agent-session-tool-tiers.test.d.ts +0 -2
  387. package/dist/core/agent-session-tool-tiers.test.d.ts.map +0 -1
  388. package/dist/core/agent-session-tool-tiers.test.js +0 -138
  389. package/dist/core/agent-session-tool-tiers.test.js.map +0 -1
  390. package/dist/core/agent-tools-allowlist.test.d.ts +0 -2
  391. package/dist/core/agent-tools-allowlist.test.d.ts.map +0 -1
  392. package/dist/core/agent-tools-allowlist.test.js +0 -74
  393. package/dist/core/agent-tools-allowlist.test.js.map +0 -1
  394. package/dist/core/agents.test.d.ts +0 -2
  395. package/dist/core/agents.test.d.ts.map +0 -1
  396. package/dist/core/agents.test.js +0 -147
  397. package/dist/core/agents.test.js.map +0 -1
  398. package/dist/core/auto-update.test.d.ts +0 -2
  399. package/dist/core/auto-update.test.d.ts.map +0 -1
  400. package/dist/core/auto-update.test.js +0 -204
  401. package/dist/core/auto-update.test.js.map +0 -1
  402. package/dist/core/autopilot-cycle.test.d.ts +0 -2
  403. package/dist/core/autopilot-cycle.test.d.ts.map +0 -1
  404. package/dist/core/autopilot-cycle.test.js +0 -375
  405. package/dist/core/autopilot-cycle.test.js.map +0 -1
  406. package/dist/core/autopilot-gate.test.d.ts +0 -2
  407. package/dist/core/autopilot-gate.test.d.ts.map +0 -1
  408. package/dist/core/autopilot-gate.test.js +0 -295
  409. package/dist/core/autopilot-gate.test.js.map +0 -1
  410. package/dist/core/autopilot-verdict.test.d.ts +0 -2
  411. package/dist/core/autopilot-verdict.test.d.ts.map +0 -1
  412. package/dist/core/autopilot-verdict.test.js +0 -153
  413. package/dist/core/autopilot-verdict.test.js.map +0 -1
  414. package/dist/core/checkpoint-store.test.d.ts +0 -2
  415. package/dist/core/checkpoint-store.test.d.ts.map +0 -1
  416. package/dist/core/checkpoint-store.test.js +0 -111
  417. package/dist/core/checkpoint-store.test.js.map +0 -1
  418. package/dist/core/code-retrieval-chunkers.test.d.ts +0 -2
  419. package/dist/core/code-retrieval-chunkers.test.d.ts.map +0 -1
  420. package/dist/core/code-retrieval-chunkers.test.js +0 -203
  421. package/dist/core/code-retrieval-chunkers.test.js.map +0 -1
  422. package/dist/core/compaction/active-context.test.d.ts +0 -2
  423. package/dist/core/compaction/active-context.test.d.ts.map +0 -1
  424. package/dist/core/compaction/active-context.test.js +0 -57
  425. package/dist/core/compaction/active-context.test.js.map +0 -1
  426. package/dist/core/compaction/compactor.test.d.ts +0 -2
  427. package/dist/core/compaction/compactor.test.d.ts.map +0 -1
  428. package/dist/core/compaction/compactor.test.js +0 -1072
  429. package/dist/core/compaction/compactor.test.js.map +0 -1
  430. package/dist/core/compaction/policy.test.d.ts +0 -2
  431. package/dist/core/compaction/policy.test.d.ts.map +0 -1
  432. package/dist/core/compaction/policy.test.js +0 -35
  433. package/dist/core/compaction/policy.test.js.map +0 -1
  434. package/dist/core/compaction/query-aware-selector.test.d.ts +0 -2
  435. package/dist/core/compaction/query-aware-selector.test.d.ts.map +0 -1
  436. package/dist/core/compaction/query-aware-selector.test.js +0 -96
  437. package/dist/core/compaction/query-aware-selector.test.js.map +0 -1
  438. package/dist/core/compaction/token-estimator.test.d.ts +0 -2
  439. package/dist/core/compaction/token-estimator.test.d.ts.map +0 -1
  440. package/dist/core/compaction/token-estimator.test.js +0 -283
  441. package/dist/core/compaction/token-estimator.test.js.map +0 -1
  442. package/dist/core/compaction/tool-result-pruner.test.d.ts +0 -2
  443. package/dist/core/compaction/tool-result-pruner.test.d.ts.map +0 -1
  444. package/dist/core/compaction/tool-result-pruner.test.js +0 -320
  445. package/dist/core/compaction/tool-result-pruner.test.js.map +0 -1
  446. package/dist/core/continue-replay-inventory.test.d.ts +0 -2
  447. package/dist/core/continue-replay-inventory.test.d.ts.map +0 -1
  448. package/dist/core/continue-replay-inventory.test.js +0 -42
  449. package/dist/core/continue-replay-inventory.test.js.map +0 -1
  450. package/dist/core/encode-cwd.test.d.ts +0 -2
  451. package/dist/core/encode-cwd.test.d.ts.map +0 -1
  452. package/dist/core/encode-cwd.test.js +0 -80
  453. package/dist/core/encode-cwd.test.js.map +0 -1
  454. package/dist/core/extensions/plugin-bundles.test.d.ts +0 -2
  455. package/dist/core/extensions/plugin-bundles.test.d.ts.map +0 -1
  456. package/dist/core/extensions/plugin-bundles.test.js +0 -110
  457. package/dist/core/extensions/plugin-bundles.test.js.map +0 -1
  458. package/dist/core/foreign-session-import.test.d.ts +0 -2
  459. package/dist/core/foreign-session-import.test.d.ts.map +0 -1
  460. package/dist/core/foreign-session-import.test.js +0 -220
  461. package/dist/core/foreign-session-import.test.js.map +0 -1
  462. package/dist/core/goal-controller.test.d.ts +0 -2
  463. package/dist/core/goal-controller.test.d.ts.map +0 -1
  464. package/dist/core/goal-controller.test.js +0 -784
  465. package/dist/core/goal-controller.test.js.map +0 -1
  466. package/dist/core/goal-lifecycle-smoke.test.d.ts +0 -2
  467. package/dist/core/goal-lifecycle-smoke.test.d.ts.map +0 -1
  468. package/dist/core/goal-lifecycle-smoke.test.js +0 -248
  469. package/dist/core/goal-lifecycle-smoke.test.js.map +0 -1
  470. package/dist/core/goal-prerequisites.test.d.ts +0 -2
  471. package/dist/core/goal-prerequisites.test.d.ts.map +0 -1
  472. package/dist/core/goal-prerequisites.test.js +0 -118
  473. package/dist/core/goal-prerequisites.test.js.map +0 -1
  474. package/dist/core/goal-store.test.d.ts +0 -2
  475. package/dist/core/goal-store.test.d.ts.map +0 -1
  476. package/dist/core/goal-store.test.js +0 -398
  477. package/dist/core/goal-store.test.js.map +0 -1
  478. package/dist/core/goal-verifier.test.d.ts +0 -2
  479. package/dist/core/goal-verifier.test.d.ts.map +0 -1
  480. package/dist/core/goal-verifier.test.js +0 -131
  481. package/dist/core/goal-verifier.test.js.map +0 -1
  482. package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts +0 -2
  483. package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts.map +0 -1
  484. package/dist/core/goal-worker-dev-server-lifecycle.test.js +0 -68
  485. package/dist/core/goal-worker-dev-server-lifecycle.test.js.map +0 -1
  486. package/dist/core/goal-worker.test.d.ts +0 -2
  487. package/dist/core/goal-worker.test.d.ts.map +0 -1
  488. package/dist/core/goal-worker.test.js +0 -269
  489. package/dist/core/goal-worker.test.js.map +0 -1
  490. package/dist/core/hashline-edit-benchmark.test.d.ts +0 -2
  491. package/dist/core/hashline-edit-benchmark.test.d.ts.map +0 -1
  492. package/dist/core/hashline-edit-benchmark.test.js +0 -190
  493. package/dist/core/hashline-edit-benchmark.test.js.map +0 -1
  494. package/dist/core/ideal-review.test.d.ts +0 -2
  495. package/dist/core/ideal-review.test.d.ts.map +0 -1
  496. package/dist/core/ideal-review.test.js +0 -242
  497. package/dist/core/ideal-review.test.js.map +0 -1
  498. package/dist/core/input-normalization.test.d.ts +0 -2
  499. package/dist/core/input-normalization.test.d.ts.map +0 -1
  500. package/dist/core/input-normalization.test.js +0 -75
  501. package/dist/core/input-normalization.test.js.map +0 -1
  502. package/dist/core/json-mode-flag-parity.test.d.ts +0 -2
  503. package/dist/core/json-mode-flag-parity.test.d.ts.map +0 -1
  504. package/dist/core/json-mode-flag-parity.test.js +0 -66
  505. package/dist/core/json-mode-flag-parity.test.js.map +0 -1
  506. package/dist/core/language-detector.test.d.ts +0 -2
  507. package/dist/core/language-detector.test.d.ts.map +0 -1
  508. package/dist/core/language-detector.test.js +0 -109
  509. package/dist/core/language-detector.test.js.map +0 -1
  510. package/dist/core/local-endpoint-store.test.d.ts +0 -2
  511. package/dist/core/local-endpoint-store.test.d.ts.map +0 -1
  512. package/dist/core/local-endpoint-store.test.js +0 -131
  513. package/dist/core/local-endpoint-store.test.js.map +0 -1
  514. package/dist/core/loop-breaker.test.d.ts +0 -2
  515. package/dist/core/loop-breaker.test.d.ts.map +0 -1
  516. package/dist/core/loop-breaker.test.js +0 -238
  517. package/dist/core/loop-breaker.test.js.map +0 -1
  518. package/dist/core/lsp/client-navigation.test.d.ts +0 -2
  519. package/dist/core/lsp/client-navigation.test.d.ts.map +0 -1
  520. package/dist/core/lsp/client-navigation.test.js +0 -135
  521. package/dist/core/lsp/client-navigation.test.js.map +0 -1
  522. package/dist/core/lsp/format.test.d.ts +0 -2
  523. package/dist/core/lsp/format.test.d.ts.map +0 -1
  524. package/dist/core/lsp/format.test.js +0 -56
  525. package/dist/core/lsp/format.test.js.map +0 -1
  526. package/dist/core/lsp/integration.test.d.ts +0 -2
  527. package/dist/core/lsp/integration.test.d.ts.map +0 -1
  528. package/dist/core/lsp/integration.test.js +0 -60
  529. package/dist/core/lsp/integration.test.js.map +0 -1
  530. package/dist/core/lsp/jsonrpc.test.d.ts +0 -2
  531. package/dist/core/lsp/jsonrpc.test.d.ts.map +0 -1
  532. package/dist/core/lsp/jsonrpc.test.js +0 -127
  533. package/dist/core/lsp/jsonrpc.test.js.map +0 -1
  534. package/dist/core/lsp/manager-navigation.test.d.ts +0 -2
  535. package/dist/core/lsp/manager-navigation.test.d.ts.map +0 -1
  536. package/dist/core/lsp/manager-navigation.test.js +0 -121
  537. package/dist/core/lsp/manager-navigation.test.js.map +0 -1
  538. package/dist/core/lsp/manager.test.d.ts +0 -2
  539. package/dist/core/lsp/manager.test.d.ts.map +0 -1
  540. package/dist/core/lsp/manager.test.js +0 -220
  541. package/dist/core/lsp/manager.test.js.map +0 -1
  542. package/dist/core/lsp/pool.test.d.ts +0 -2
  543. package/dist/core/lsp/pool.test.d.ts.map +0 -1
  544. package/dist/core/lsp/pool.test.js +0 -286
  545. package/dist/core/lsp/pool.test.js.map +0 -1
  546. package/dist/core/lsp/servers.test.d.ts +0 -2
  547. package/dist/core/lsp/servers.test.d.ts.map +0 -1
  548. package/dist/core/lsp/servers.test.js +0 -67
  549. package/dist/core/lsp/servers.test.js.map +0 -1
  550. package/dist/core/lsp/uri.test.d.ts +0 -2
  551. package/dist/core/lsp/uri.test.d.ts.map +0 -1
  552. package/dist/core/lsp/uri.test.js +0 -56
  553. package/dist/core/lsp/uri.test.js.map +0 -1
  554. package/dist/core/lsp/windows.test.d.ts +0 -2
  555. package/dist/core/lsp/windows.test.d.ts.map +0 -1
  556. package/dist/core/lsp/windows.test.js +0 -239
  557. package/dist/core/lsp/windows.test.js.map +0 -1
  558. package/dist/core/mcp/catalog-cache.test.d.ts +0 -2
  559. package/dist/core/mcp/catalog-cache.test.d.ts.map +0 -1
  560. package/dist/core/mcp/catalog-cache.test.js +0 -99
  561. package/dist/core/mcp/catalog-cache.test.js.map +0 -1
  562. package/dist/core/mcp/client-session-recovery.test.d.ts +0 -2
  563. package/dist/core/mcp/client-session-recovery.test.d.ts.map +0 -1
  564. package/dist/core/mcp/client-session-recovery.test.js +0 -231
  565. package/dist/core/mcp/client-session-recovery.test.js.map +0 -1
  566. package/dist/core/mcp/content.test.d.ts +0 -2
  567. package/dist/core/mcp/content.test.d.ts.map +0 -1
  568. package/dist/core/mcp/content.test.js +0 -135
  569. package/dist/core/mcp/content.test.js.map +0 -1
  570. package/dist/core/mcp/elicitation.test.d.ts +0 -2
  571. package/dist/core/mcp/elicitation.test.d.ts.map +0 -1
  572. package/dist/core/mcp/elicitation.test.js +0 -158
  573. package/dist/core/mcp/elicitation.test.js.map +0 -1
  574. package/dist/core/mcp/legacy-negotiation.test.d.ts +0 -2
  575. package/dist/core/mcp/legacy-negotiation.test.d.ts.map +0 -1
  576. package/dist/core/mcp/legacy-negotiation.test.js +0 -80
  577. package/dist/core/mcp/legacy-negotiation.test.js.map +0 -1
  578. package/dist/core/mcp/loopback.test.d.ts +0 -2
  579. package/dist/core/mcp/loopback.test.d.ts.map +0 -1
  580. package/dist/core/mcp/loopback.test.js +0 -87
  581. package/dist/core/mcp/loopback.test.js.map +0 -1
  582. package/dist/core/mcp/oauth-store.test.d.ts +0 -2
  583. package/dist/core/mcp/oauth-store.test.d.ts.map +0 -1
  584. package/dist/core/mcp/oauth-store.test.js +0 -94
  585. package/dist/core/mcp/oauth-store.test.js.map +0 -1
  586. package/dist/core/mcp/parse-add-command.test.d.ts +0 -2
  587. package/dist/core/mcp/parse-add-command.test.d.ts.map +0 -1
  588. package/dist/core/mcp/parse-add-command.test.js +0 -81
  589. package/dist/core/mcp/parse-add-command.test.js.map +0 -1
  590. package/dist/core/mcp/resolve-stdio.test.d.ts +0 -2
  591. package/dist/core/mcp/resolve-stdio.test.d.ts.map +0 -1
  592. package/dist/core/mcp/resolve-stdio.test.js +0 -239
  593. package/dist/core/mcp/resolve-stdio.test.js.map +0 -1
  594. package/dist/core/mcp/session-elicitation-wiring.test.d.ts +0 -2
  595. package/dist/core/mcp/session-elicitation-wiring.test.d.ts.map +0 -1
  596. package/dist/core/mcp/session-elicitation-wiring.test.js +0 -138
  597. package/dist/core/mcp/session-elicitation-wiring.test.js.map +0 -1
  598. package/dist/core/mcp/shared-pool.test.d.ts +0 -2
  599. package/dist/core/mcp/shared-pool.test.d.ts.map +0 -1
  600. package/dist/core/mcp/shared-pool.test.js +0 -425
  601. package/dist/core/mcp/shared-pool.test.js.map +0 -1
  602. package/dist/core/mcp/store.test.d.ts +0 -2
  603. package/dist/core/mcp/store.test.d.ts.map +0 -1
  604. package/dist/core/mcp/store.test.js +0 -110
  605. package/dist/core/mcp/store.test.js.map +0 -1
  606. package/dist/core/mcp/when-connected.test.d.ts +0 -2
  607. package/dist/core/mcp/when-connected.test.d.ts.map +0 -1
  608. package/dist/core/mcp/when-connected.test.js +0 -46
  609. package/dist/core/mcp/when-connected.test.js.map +0 -1
  610. package/dist/core/message-images.test.d.ts +0 -2
  611. package/dist/core/message-images.test.d.ts.map +0 -1
  612. package/dist/core/message-images.test.js +0 -62
  613. package/dist/core/message-images.test.js.map +0 -1
  614. package/dist/core/network-guard.test.d.ts +0 -2
  615. package/dist/core/network-guard.test.d.ts.map +0 -1
  616. package/dist/core/network-guard.test.js +0 -72
  617. package/dist/core/network-guard.test.js.map +0 -1
  618. package/dist/core/nolan-context.test.d.ts +0 -2
  619. package/dist/core/nolan-context.test.d.ts.map +0 -1
  620. package/dist/core/nolan-context.test.js +0 -342
  621. package/dist/core/nolan-context.test.js.map +0 -1
  622. package/dist/core/nolan-model.test.d.ts +0 -2
  623. package/dist/core/nolan-model.test.d.ts.map +0 -1
  624. package/dist/core/nolan-model.test.js +0 -51
  625. package/dist/core/nolan-model.test.js.map +0 -1
  626. package/dist/core/nolan-prompt.test.d.ts +0 -2
  627. package/dist/core/nolan-prompt.test.d.ts.map +0 -1
  628. package/dist/core/nolan-prompt.test.js +0 -160
  629. package/dist/core/nolan-prompt.test.js.map +0 -1
  630. package/dist/core/persistent-shell.test.d.ts +0 -2
  631. package/dist/core/persistent-shell.test.d.ts.map +0 -1
  632. package/dist/core/persistent-shell.test.js +0 -84
  633. package/dist/core/persistent-shell.test.js.map +0 -1
  634. package/dist/core/pixel-fix.test.d.ts +0 -2
  635. package/dist/core/pixel-fix.test.d.ts.map +0 -1
  636. package/dist/core/pixel-fix.test.js +0 -310
  637. package/dist/core/pixel-fix.test.js.map +0 -1
  638. package/dist/core/pixel.test.d.ts +0 -2
  639. package/dist/core/pixel.test.d.ts.map +0 -1
  640. package/dist/core/pixel.test.js +0 -269
  641. package/dist/core/pixel.test.js.map +0 -1
  642. package/dist/core/process-gate.test.d.ts +0 -2
  643. package/dist/core/process-gate.test.d.ts.map +0 -1
  644. package/dist/core/process-gate.test.js +0 -87
  645. package/dist/core/process-gate.test.js.map +0 -1
  646. package/dist/core/process-manager-dev-server-repro.test.d.ts +0 -2
  647. package/dist/core/process-manager-dev-server-repro.test.d.ts.map +0 -1
  648. package/dist/core/process-manager-dev-server-repro.test.js +0 -225
  649. package/dist/core/process-manager-dev-server-repro.test.js.map +0 -1
  650. package/dist/core/process-manager-notifications.test.d.ts +0 -2
  651. package/dist/core/process-manager-notifications.test.d.ts.map +0 -1
  652. package/dist/core/process-manager-notifications.test.js +0 -227
  653. package/dist/core/process-manager-notifications.test.js.map +0 -1
  654. package/dist/core/progress/engine.test.d.ts +0 -2
  655. package/dist/core/progress/engine.test.d.ts.map +0 -1
  656. package/dist/core/progress/engine.test.js +0 -136
  657. package/dist/core/progress/engine.test.js.map +0 -1
  658. package/dist/core/progress/git-xp.test.d.ts +0 -2
  659. package/dist/core/progress/git-xp.test.d.ts.map +0 -1
  660. package/dist/core/progress/git-xp.test.js +0 -88
  661. package/dist/core/progress/git-xp.test.js.map +0 -1
  662. package/dist/core/progress/ranks.test.d.ts +0 -2
  663. package/dist/core/progress/ranks.test.d.ts.map +0 -1
  664. package/dist/core/progress/ranks.test.js +0 -100
  665. package/dist/core/progress/ranks.test.js.map +0 -1
  666. package/dist/core/progress/rebuild.test.d.ts +0 -2
  667. package/dist/core/progress/rebuild.test.d.ts.map +0 -1
  668. package/dist/core/progress/rebuild.test.js +0 -103
  669. package/dist/core/progress/rebuild.test.js.map +0 -1
  670. package/dist/core/progress/store.test.d.ts +0 -2
  671. package/dist/core/progress/store.test.d.ts.map +0 -1
  672. package/dist/core/progress/store.test.js +0 -108
  673. package/dist/core/progress/store.test.js.map +0 -1
  674. package/dist/core/project-discovery.test.d.ts +0 -2
  675. package/dist/core/project-discovery.test.d.ts.map +0 -1
  676. package/dist/core/project-discovery.test.js +0 -519
  677. package/dist/core/project-discovery.test.js.map +0 -1
  678. package/dist/core/prompt-commands.test.d.ts +0 -2
  679. package/dist/core/prompt-commands.test.d.ts.map +0 -1
  680. package/dist/core/prompt-commands.test.js +0 -175
  681. package/dist/core/prompt-commands.test.js.map +0 -1
  682. package/dist/core/radio.test.d.ts +0 -2
  683. package/dist/core/radio.test.d.ts.map +0 -1
  684. package/dist/core/radio.test.js +0 -117
  685. package/dist/core/radio.test.js.map +0 -1
  686. package/dist/core/regrounding.test.d.ts +0 -2
  687. package/dist/core/regrounding.test.d.ts.map +0 -1
  688. package/dist/core/regrounding.test.js +0 -38
  689. package/dist/core/regrounding.test.js.map +0 -1
  690. package/dist/core/resolve-start.test.d.ts +0 -2
  691. package/dist/core/resolve-start.test.d.ts.map +0 -1
  692. package/dist/core/resolve-start.test.js +0 -68
  693. package/dist/core/resolve-start.test.js.map +0 -1
  694. package/dist/core/run-claim.test.d.ts +0 -2
  695. package/dist/core/run-claim.test.d.ts.map +0 -1
  696. package/dist/core/run-claim.test.js +0 -107
  697. package/dist/core/run-claim.test.js.map +0 -1
  698. package/dist/core/run-journal.test.d.ts +0 -2
  699. package/dist/core/run-journal.test.d.ts.map +0 -1
  700. package/dist/core/run-journal.test.js +0 -195
  701. package/dist/core/run-journal.test.js.map +0 -1
  702. package/dist/core/run-lifecycle.test.d.ts +0 -2
  703. package/dist/core/run-lifecycle.test.d.ts.map +0 -1
  704. package/dist/core/run-lifecycle.test.js +0 -64
  705. package/dist/core/run-lifecycle.test.js.map +0 -1
  706. package/dist/core/sandbox-feedback.test.d.ts +0 -2
  707. package/dist/core/sandbox-feedback.test.d.ts.map +0 -1
  708. package/dist/core/sandbox-feedback.test.js +0 -32
  709. package/dist/core/sandbox-feedback.test.js.map +0 -1
  710. package/dist/core/sandbox.test.d.ts +0 -2
  711. package/dist/core/sandbox.test.d.ts.map +0 -1
  712. package/dist/core/sandbox.test.js +0 -157
  713. package/dist/core/sandbox.test.js.map +0 -1
  714. package/dist/core/semantic-search-benchmark.test.d.ts +0 -2
  715. package/dist/core/semantic-search-benchmark.test.d.ts.map +0 -1
  716. package/dist/core/semantic-search-benchmark.test.js +0 -89
  717. package/dist/core/semantic-search-benchmark.test.js.map +0 -1
  718. package/dist/core/session-compaction.test.d.ts +0 -2
  719. package/dist/core/session-compaction.test.d.ts.map +0 -1
  720. package/dist/core/session-compaction.test.js +0 -92
  721. package/dist/core/session-compaction.test.js.map +0 -1
  722. package/dist/core/session-export.test.d.ts +0 -2
  723. package/dist/core/session-export.test.d.ts.map +0 -1
  724. package/dist/core/session-export.test.js +0 -353
  725. package/dist/core/session-export.test.js.map +0 -1
  726. package/dist/core/session-history.test.d.ts +0 -2
  727. package/dist/core/session-history.test.d.ts.map +0 -1
  728. package/dist/core/session-history.test.js +0 -272
  729. package/dist/core/session-history.test.js.map +0 -1
  730. package/dist/core/session-manager.test.d.ts +0 -2
  731. package/dist/core/session-manager.test.d.ts.map +0 -1
  732. package/dist/core/session-manager.test.js +0 -573
  733. package/dist/core/session-manager.test.js.map +0 -1
  734. package/dist/core/session-notification-visibility.test.d.ts +0 -2
  735. package/dist/core/session-notification-visibility.test.d.ts.map +0 -1
  736. package/dist/core/session-notification-visibility.test.js +0 -113
  737. package/dist/core/session-notification-visibility.test.js.map +0 -1
  738. package/dist/core/session-restore-display.test.d.ts +0 -2
  739. package/dist/core/session-restore-display.test.d.ts.map +0 -1
  740. package/dist/core/session-restore-display.test.js +0 -103
  741. package/dist/core/session-restore-display.test.js.map +0 -1
  742. package/dist/core/session-storage-fd-leak.test.d.ts +0 -2
  743. package/dist/core/session-storage-fd-leak.test.d.ts.map +0 -1
  744. package/dist/core/session-storage-fd-leak.test.js +0 -116
  745. package/dist/core/session-storage-fd-leak.test.js.map +0 -1
  746. package/dist/core/session-storage.test.d.ts +0 -2
  747. package/dist/core/session-storage.test.d.ts.map +0 -1
  748. package/dist/core/session-storage.test.js +0 -277
  749. package/dist/core/session-storage.test.js.map +0 -1
  750. package/dist/core/setup-history.test.d.ts +0 -2
  751. package/dist/core/setup-history.test.d.ts.map +0 -1
  752. package/dist/core/setup-history.test.js +0 -59
  753. package/dist/core/setup-history.test.js.map +0 -1
  754. package/dist/core/shell.test.d.ts +0 -2
  755. package/dist/core/shell.test.d.ts.map +0 -1
  756. package/dist/core/shell.test.js +0 -87
  757. package/dist/core/shell.test.js.map +0 -1
  758. package/dist/core/shutdown.test.d.ts +0 -2
  759. package/dist/core/shutdown.test.d.ts.map +0 -1
  760. package/dist/core/shutdown.test.js +0 -160
  761. package/dist/core/shutdown.test.js.map +0 -1
  762. package/dist/core/sidecar-error-reporter.d.ts +0 -12
  763. package/dist/core/sidecar-error-reporter.d.ts.map +0 -1
  764. package/dist/core/sidecar-error-reporter.js +0 -57
  765. package/dist/core/sidecar-error-reporter.js.map +0 -1
  766. package/dist/core/sidecar-error-reporter.test.d.ts +0 -2
  767. package/dist/core/sidecar-error-reporter.test.d.ts.map +0 -1
  768. package/dist/core/sidecar-error-reporter.test.js +0 -61
  769. package/dist/core/sidecar-error-reporter.test.js.map +0 -1
  770. package/dist/core/skills-routing.test.d.ts +0 -2
  771. package/dist/core/skills-routing.test.d.ts.map +0 -1
  772. package/dist/core/skills-routing.test.js +0 -168
  773. package/dist/core/skills-routing.test.js.map +0 -1
  774. package/dist/core/slash-commands.test.d.ts +0 -2
  775. package/dist/core/slash-commands.test.d.ts.map +0 -1
  776. package/dist/core/slash-commands.test.js +0 -59
  777. package/dist/core/slash-commands.test.js.map +0 -1
  778. package/dist/core/source-maps.test.d.ts +0 -2
  779. package/dist/core/source-maps.test.d.ts.map +0 -1
  780. package/dist/core/source-maps.test.js +0 -175
  781. package/dist/core/source-maps.test.js.map +0 -1
  782. package/dist/core/speed-benchmark.test.d.ts +0 -2
  783. package/dist/core/speed-benchmark.test.d.ts.map +0 -1
  784. package/dist/core/speed-benchmark.test.js +0 -102
  785. package/dist/core/speed-benchmark.test.js.map +0 -1
  786. package/dist/core/subagent-manager.test.d.ts +0 -2
  787. package/dist/core/subagent-manager.test.d.ts.map +0 -1
  788. package/dist/core/subagent-manager.test.js +0 -375
  789. package/dist/core/subagent-manager.test.js.map +0 -1
  790. package/dist/core/subagent-store.test.d.ts +0 -2
  791. package/dist/core/subagent-store.test.d.ts.map +0 -1
  792. package/dist/core/subagent-store.test.js +0 -106
  793. package/dist/core/subagent-store.test.js.map +0 -1
  794. package/dist/core/verification-evidence.test.d.ts +0 -2
  795. package/dist/core/verification-evidence.test.d.ts.map +0 -1
  796. package/dist/core/verification-evidence.test.js +0 -103
  797. package/dist/core/verification-evidence.test.js.map +0 -1
  798. package/dist/core/verify-commands.test.d.ts +0 -2
  799. package/dist/core/verify-commands.test.d.ts.map +0 -1
  800. package/dist/core/verify-commands.test.js +0 -81
  801. package/dist/core/verify-commands.test.js.map +0 -1
  802. package/dist/core/workspace-guard.test.d.ts +0 -2
  803. package/dist/core/workspace-guard.test.d.ts.map +0 -1
  804. package/dist/core/workspace-guard.test.js +0 -107
  805. package/dist/core/workspace-guard.test.js.map +0 -1
  806. package/dist/modes/acp-mode.test.d.ts +0 -2
  807. package/dist/modes/acp-mode.test.d.ts.map +0 -1
  808. package/dist/modes/acp-mode.test.js +0 -1065
  809. package/dist/modes/acp-mode.test.js.map +0 -1
  810. package/dist/modes/json-mode.test.d.ts +0 -2
  811. package/dist/modes/json-mode.test.d.ts.map +0 -1
  812. package/dist/modes/json-mode.test.js +0 -84
  813. package/dist/modes/json-mode.test.js.map +0 -1
  814. package/dist/modes/subagent-worker-mode.test.d.ts +0 -2
  815. package/dist/modes/subagent-worker-mode.test.d.ts.map +0 -1
  816. package/dist/modes/subagent-worker-mode.test.js +0 -52
  817. package/dist/modes/subagent-worker-mode.test.js.map +0 -1
  818. package/dist/session.test.d.ts +0 -2
  819. package/dist/session.test.d.ts.map +0 -1
  820. package/dist/session.test.js +0 -35
  821. package/dist/session.test.js.map +0 -1
  822. package/dist/system-prompt.test.d.ts +0 -2
  823. package/dist/system-prompt.test.d.ts.map +0 -1
  824. package/dist/system-prompt.test.js +0 -536
  825. package/dist/system-prompt.test.js.map +0 -1
  826. package/dist/system-prompt.tiering.test.d.ts +0 -2
  827. package/dist/system-prompt.tiering.test.d.ts.map +0 -1
  828. package/dist/system-prompt.tiering.test.js +0 -105
  829. package/dist/system-prompt.tiering.test.js.map +0 -1
  830. package/dist/tools/bash.test.d.ts +0 -2
  831. package/dist/tools/bash.test.d.ts.map +0 -1
  832. package/dist/tools/bash.test.js +0 -204
  833. package/dist/tools/bash.test.js.map +0 -1
  834. package/dist/tools/checkpoint-hook.test.d.ts +0 -2
  835. package/dist/tools/checkpoint-hook.test.d.ts.map +0 -1
  836. package/dist/tools/checkpoint-hook.test.js +0 -65
  837. package/dist/tools/checkpoint-hook.test.js.map +0 -1
  838. package/dist/tools/code-nav.test.d.ts +0 -2
  839. package/dist/tools/code-nav.test.d.ts.map +0 -1
  840. package/dist/tools/code-nav.test.js +0 -136
  841. package/dist/tools/code-nav.test.js.map +0 -1
  842. package/dist/tools/code-skeleton.test.d.ts +0 -2
  843. package/dist/tools/code-skeleton.test.d.ts.map +0 -1
  844. package/dist/tools/code-skeleton.test.js +0 -115
  845. package/dist/tools/code-skeleton.test.js.map +0 -1
  846. package/dist/tools/compress-integration.test.d.ts +0 -2
  847. package/dist/tools/compress-integration.test.d.ts.map +0 -1
  848. package/dist/tools/compress-integration.test.js +0 -59
  849. package/dist/tools/compress-integration.test.js.map +0 -1
  850. package/dist/tools/compress.test.d.ts +0 -2
  851. package/dist/tools/compress.test.d.ts.map +0 -1
  852. package/dist/tools/compress.test.js +0 -60
  853. package/dist/tools/compress.test.js.map +0 -1
  854. package/dist/tools/edit-diff.test.d.ts +0 -2
  855. package/dist/tools/edit-diff.test.d.ts.map +0 -1
  856. package/dist/tools/edit-diff.test.js +0 -329
  857. package/dist/tools/edit-diff.test.js.map +0 -1
  858. package/dist/tools/edit-robustness.test.d.ts +0 -2
  859. package/dist/tools/edit-robustness.test.d.ts.map +0 -1
  860. package/dist/tools/edit-robustness.test.js +0 -417
  861. package/dist/tools/edit-robustness.test.js.map +0 -1
  862. package/dist/tools/edit.test.d.ts +0 -2
  863. package/dist/tools/edit.test.d.ts.map +0 -1
  864. package/dist/tools/edit.test.js +0 -940
  865. package/dist/tools/edit.test.js.map +0 -1
  866. package/dist/tools/exit-plan.test.d.ts +0 -2
  867. package/dist/tools/exit-plan.test.d.ts.map +0 -1
  868. package/dist/tools/exit-plan.test.js +0 -72
  869. package/dist/tools/exit-plan.test.js.map +0 -1
  870. package/dist/tools/generate-image.test.d.ts +0 -2
  871. package/dist/tools/generate-image.test.d.ts.map +0 -1
  872. package/dist/tools/generate-image.test.js +0 -240
  873. package/dist/tools/generate-image.test.js.map +0 -1
  874. package/dist/tools/goal-mode.test.d.ts +0 -2
  875. package/dist/tools/goal-mode.test.d.ts.map +0 -1
  876. package/dist/tools/goal-mode.test.js +0 -121
  877. package/dist/tools/goal-mode.test.js.map +0 -1
  878. package/dist/tools/goals.test.d.ts +0 -2
  879. package/dist/tools/goals.test.d.ts.map +0 -1
  880. package/dist/tools/goals.test.js +0 -795
  881. package/dist/tools/goals.test.js.map +0 -1
  882. package/dist/tools/grep-parity.test.d.ts +0 -2
  883. package/dist/tools/grep-parity.test.d.ts.map +0 -1
  884. package/dist/tools/grep-parity.test.js +0 -92
  885. package/dist/tools/grep-parity.test.js.map +0 -1
  886. package/dist/tools/grep-recall.test.d.ts +0 -2
  887. package/dist/tools/grep-recall.test.d.ts.map +0 -1
  888. package/dist/tools/grep-recall.test.js +0 -114
  889. package/dist/tools/grep-recall.test.js.map +0 -1
  890. package/dist/tools/grep-spawn.test.d.ts +0 -2
  891. package/dist/tools/grep-spawn.test.d.ts.map +0 -1
  892. package/dist/tools/grep-spawn.test.js +0 -66
  893. package/dist/tools/grep-spawn.test.js.map +0 -1
  894. package/dist/tools/grep.test.d.ts +0 -2
  895. package/dist/tools/grep.test.d.ts.map +0 -1
  896. package/dist/tools/grep.test.js +0 -82
  897. package/dist/tools/grep.test.js.map +0 -1
  898. package/dist/tools/html-extract.test.d.ts +0 -2
  899. package/dist/tools/html-extract.test.d.ts.map +0 -1
  900. package/dist/tools/html-extract.test.js +0 -60
  901. package/dist/tools/html-extract.test.js.map +0 -1
  902. package/dist/tools/index.test.d.ts +0 -2
  903. package/dist/tools/index.test.d.ts.map +0 -1
  904. package/dist/tools/index.test.js +0 -55
  905. package/dist/tools/index.test.js.map +0 -1
  906. package/dist/tools/overflow.test.d.ts +0 -2
  907. package/dist/tools/overflow.test.d.ts.map +0 -1
  908. package/dist/tools/overflow.test.js +0 -59
  909. package/dist/tools/overflow.test.js.map +0 -1
  910. package/dist/tools/path-utils.test.d.ts +0 -2
  911. package/dist/tools/path-utils.test.d.ts.map +0 -1
  912. package/dist/tools/path-utils.test.js +0 -54
  913. package/dist/tools/path-utils.test.js.map +0 -1
  914. package/dist/tools/pdf-extract.test.d.ts +0 -2
  915. package/dist/tools/pdf-extract.test.d.ts.map +0 -1
  916. package/dist/tools/pdf-extract.test.js +0 -15
  917. package/dist/tools/pdf-extract.test.js.map +0 -1
  918. package/dist/tools/plan-mode.test.d.ts +0 -2
  919. package/dist/tools/plan-mode.test.d.ts.map +0 -1
  920. package/dist/tools/plan-mode.test.js +0 -116
  921. package/dist/tools/plan-mode.test.js.map +0 -1
  922. package/dist/tools/read-only-bash.test.d.ts +0 -2
  923. package/dist/tools/read-only-bash.test.d.ts.map +0 -1
  924. package/dist/tools/read-only-bash.test.js +0 -47
  925. package/dist/tools/read-only-bash.test.js.map +0 -1
  926. package/dist/tools/read.test.d.ts +0 -2
  927. package/dist/tools/read.test.d.ts.map +0 -1
  928. package/dist/tools/read.test.js +0 -146
  929. package/dist/tools/read.test.js.map +0 -1
  930. package/dist/tools/screenshot.test.d.ts +0 -2
  931. package/dist/tools/screenshot.test.d.ts.map +0 -1
  932. package/dist/tools/screenshot.test.js +0 -145
  933. package/dist/tools/screenshot.test.js.map +0 -1
  934. package/dist/tools/search-code.test.d.ts +0 -2
  935. package/dist/tools/search-code.test.d.ts.map +0 -1
  936. package/dist/tools/search-code.test.js +0 -83
  937. package/dist/tools/search-code.test.js.map +0 -1
  938. package/dist/tools/source-path.test.d.ts +0 -2
  939. package/dist/tools/source-path.test.d.ts.map +0 -1
  940. package/dist/tools/source-path.test.js +0 -80
  941. package/dist/tools/source-path.test.js.map +0 -1
  942. package/dist/tools/subagent-control.test.d.ts +0 -2
  943. package/dist/tools/subagent-control.test.d.ts.map +0 -1
  944. package/dist/tools/subagent-control.test.js +0 -73
  945. package/dist/tools/subagent-control.test.js.map +0 -1
  946. package/dist/tools/subagent-shared.test.d.ts +0 -2
  947. package/dist/tools/subagent-shared.test.d.ts.map +0 -1
  948. package/dist/tools/subagent-shared.test.js +0 -83
  949. package/dist/tools/subagent-shared.test.js.map +0 -1
  950. package/dist/tools/subagent.test.d.ts +0 -2
  951. package/dist/tools/subagent.test.d.ts.map +0 -1
  952. package/dist/tools/subagent.test.js +0 -180
  953. package/dist/tools/subagent.test.js.map +0 -1
  954. package/dist/tools/task-send.test.d.ts +0 -2
  955. package/dist/tools/task-send.test.d.ts.map +0 -1
  956. package/dist/tools/task-send.test.js +0 -104
  957. package/dist/tools/task-send.test.js.map +0 -1
  958. package/dist/tools/tasks.test.d.ts +0 -2
  959. package/dist/tools/tasks.test.d.ts.map +0 -1
  960. package/dist/tools/tasks.test.js +0 -62
  961. package/dist/tools/tasks.test.js.map +0 -1
  962. package/dist/tools/tool-search.test.d.ts +0 -2
  963. package/dist/tools/tool-search.test.d.ts.map +0 -1
  964. package/dist/tools/tool-search.test.js +0 -69
  965. package/dist/tools/tool-search.test.js.map +0 -1
  966. package/dist/tools/tool-tiers.test.d.ts +0 -2
  967. package/dist/tools/tool-tiers.test.d.ts.map +0 -1
  968. package/dist/tools/tool-tiers.test.js +0 -48
  969. package/dist/tools/tool-tiers.test.js.map +0 -1
  970. package/dist/tools/truncate-utils.test.d.ts +0 -2
  971. package/dist/tools/truncate-utils.test.d.ts.map +0 -1
  972. package/dist/tools/truncate-utils.test.js +0 -93
  973. package/dist/tools/truncate-utils.test.js.map +0 -1
  974. package/dist/tools/truncate.test.d.ts +0 -2
  975. package/dist/tools/truncate.test.d.ts.map +0 -1
  976. package/dist/tools/truncate.test.js +0 -100
  977. package/dist/tools/truncate.test.js.map +0 -1
  978. package/dist/tools/web-fetch.test.d.ts +0 -2
  979. package/dist/tools/web-fetch.test.d.ts.map +0 -1
  980. package/dist/tools/web-fetch.test.js +0 -539
  981. package/dist/tools/web-fetch.test.js.map +0 -1
  982. package/dist/tools/web-search.test.d.ts +0 -2
  983. package/dist/tools/web-search.test.d.ts.map +0 -1
  984. package/dist/tools/web-search.test.js +0 -333
  985. package/dist/tools/web-search.test.js.map +0 -1
  986. package/dist/tools/write.test.d.ts +0 -2
  987. package/dist/tools/write.test.d.ts.map +0 -1
  988. package/dist/tools/write.test.js +0 -176
  989. package/dist/tools/write.test.js.map +0 -1
  990. package/dist/ui/anchor-pad-reclaim.test.d.ts +0 -2
  991. package/dist/ui/anchor-pad-reclaim.test.d.ts.map +0 -1
  992. package/dist/ui/anchor-pad-reclaim.test.js +0 -146
  993. package/dist/ui/anchor-pad-reclaim.test.js.map +0 -1
  994. package/dist/ui/app-items.test.d.ts +0 -2
  995. package/dist/ui/app-items.test.d.ts.map +0 -1
  996. package/dist/ui/app-items.test.js +0 -54
  997. package/dist/ui/app-items.test.js.map +0 -1
  998. package/dist/ui/app-state-persistence.test.d.ts +0 -2
  999. package/dist/ui/app-state-persistence.test.d.ts.map +0 -1
  1000. package/dist/ui/app-state-persistence.test.js +0 -71
  1001. package/dist/ui/app-state-persistence.test.js.map +0 -1
  1002. package/dist/ui/assistant-stream-flush-parity.test.d.ts +0 -2
  1003. package/dist/ui/assistant-stream-flush-parity.test.d.ts.map +0 -1
  1004. package/dist/ui/assistant-stream-flush-parity.test.js +0 -85
  1005. package/dist/ui/assistant-stream-flush-parity.test.js.map +0 -1
  1006. package/dist/ui/atomic-flush-regression.test.d.ts +0 -2
  1007. package/dist/ui/atomic-flush-regression.test.d.ts.map +0 -1
  1008. package/dist/ui/atomic-flush-regression.test.js +0 -218
  1009. package/dist/ui/atomic-flush-regression.test.js.map +0 -1
  1010. package/dist/ui/chat-layout-pinning.test.d.ts +0 -2
  1011. package/dist/ui/chat-layout-pinning.test.d.ts.map +0 -1
  1012. package/dist/ui/chat-layout-pinning.test.js +0 -525
  1013. package/dist/ui/chat-layout-pinning.test.js.map +0 -1
  1014. package/dist/ui/components/ActivityIndicator.test.d.ts +0 -2
  1015. package/dist/ui/components/ActivityIndicator.test.d.ts.map +0 -1
  1016. package/dist/ui/components/ActivityIndicator.test.js +0 -40
  1017. package/dist/ui/components/ActivityIndicator.test.js.map +0 -1
  1018. package/dist/ui/components/AssistantMessage.test.d.ts +0 -2
  1019. package/dist/ui/components/AssistantMessage.test.d.ts.map +0 -1
  1020. package/dist/ui/components/AssistantMessage.test.js +0 -418
  1021. package/dist/ui/components/AssistantMessage.test.js.map +0 -1
  1022. package/dist/ui/components/Footer.test.d.ts +0 -2
  1023. package/dist/ui/components/Footer.test.d.ts.map +0 -1
  1024. package/dist/ui/components/Footer.test.js +0 -16
  1025. package/dist/ui/components/Footer.test.js.map +0 -1
  1026. package/dist/ui/components/InputArea.test.d.ts +0 -2
  1027. package/dist/ui/components/InputArea.test.d.ts.map +0 -1
  1028. package/dist/ui/components/InputArea.test.js +0 -95
  1029. package/dist/ui/components/InputArea.test.js.map +0 -1
  1030. package/dist/ui/components/PlanOverlay.test.d.ts +0 -2
  1031. package/dist/ui/components/PlanOverlay.test.d.ts.map +0 -1
  1032. package/dist/ui/components/PlanOverlay.test.js +0 -24
  1033. package/dist/ui/components/PlanOverlay.test.js.map +0 -1
  1034. package/dist/ui/components/StreamingArea.test.d.ts +0 -2
  1035. package/dist/ui/components/StreamingArea.test.d.ts.map +0 -1
  1036. package/dist/ui/components/StreamingArea.test.js +0 -18
  1037. package/dist/ui/components/StreamingArea.test.js.map +0 -1
  1038. package/dist/ui/components/UserMessage.test.d.ts +0 -2
  1039. package/dist/ui/components/UserMessage.test.d.ts.map +0 -1
  1040. package/dist/ui/components/UserMessage.test.js +0 -39
  1041. package/dist/ui/components/UserMessage.test.js.map +0 -1
  1042. package/dist/ui/components/themed-output.test.d.ts +0 -2
  1043. package/dist/ui/components/themed-output.test.d.ts.map +0 -1
  1044. package/dist/ui/components/themed-output.test.js +0 -111
  1045. package/dist/ui/components/themed-output.test.js.map +0 -1
  1046. package/dist/ui/footer-jump-regression.test.d.ts +0 -2
  1047. package/dist/ui/footer-jump-regression.test.d.ts.map +0 -1
  1048. package/dist/ui/footer-jump-regression.test.js +0 -224
  1049. package/dist/ui/footer-jump-regression.test.js.map +0 -1
  1050. package/dist/ui/footer-status-layout.test.d.ts +0 -2
  1051. package/dist/ui/footer-status-layout.test.d.ts.map +0 -1
  1052. package/dist/ui/footer-status-layout.test.js +0 -71
  1053. package/dist/ui/footer-status-layout.test.js.map +0 -1
  1054. package/dist/ui/frame-clip-regression.test.d.ts +0 -2
  1055. package/dist/ui/frame-clip-regression.test.d.ts.map +0 -1
  1056. package/dist/ui/frame-clip-regression.test.js +0 -215
  1057. package/dist/ui/frame-clip-regression.test.js.map +0 -1
  1058. package/dist/ui/goal-events.test.d.ts +0 -2
  1059. package/dist/ui/goal-events.test.d.ts.map +0 -1
  1060. package/dist/ui/goal-events.test.js +0 -350
  1061. package/dist/ui/goal-events.test.js.map +0 -1
  1062. package/dist/ui/goal-lifecycle-orchestration.test.d.ts +0 -2
  1063. package/dist/ui/goal-lifecycle-orchestration.test.d.ts.map +0 -1
  1064. package/dist/ui/goal-lifecycle-orchestration.test.js +0 -512
  1065. package/dist/ui/goal-lifecycle-orchestration.test.js.map +0 -1
  1066. package/dist/ui/goal-overlay.test.d.ts +0 -2
  1067. package/dist/ui/goal-overlay.test.d.ts.map +0 -1
  1068. package/dist/ui/goal-overlay.test.js +0 -384
  1069. package/dist/ui/goal-overlay.test.js.map +0 -1
  1070. package/dist/ui/goal-status-bar.test.d.ts +0 -2
  1071. package/dist/ui/goal-status-bar.test.d.ts.map +0 -1
  1072. package/dist/ui/goal-status-bar.test.js +0 -172
  1073. package/dist/ui/goal-status-bar.test.js.map +0 -1
  1074. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +0 -2
  1075. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +0 -1
  1076. package/dist/ui/hooks/stall-retry-duplicate.test.js +0 -94
  1077. package/dist/ui/hooks/stall-retry-duplicate.test.js.map +0 -1
  1078. package/dist/ui/hooks/useAgentLoop.test.d.ts +0 -2
  1079. package/dist/ui/hooks/useAgentLoop.test.d.ts.map +0 -1
  1080. package/dist/ui/hooks/useAgentLoop.test.js +0 -66
  1081. package/dist/ui/hooks/useAgentLoop.test.js.map +0 -1
  1082. package/dist/ui/hooks/useContextCompaction.test.d.ts +0 -2
  1083. package/dist/ui/hooks/useContextCompaction.test.d.ts.map +0 -1
  1084. package/dist/ui/hooks/useContextCompaction.test.js +0 -135
  1085. package/dist/ui/hooks/useContextCompaction.test.js.map +0 -1
  1086. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts +0 -2
  1087. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts.map +0 -1
  1088. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js +0 -81
  1089. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js.map +0 -1
  1090. package/dist/ui/hooks/useTranscriptHistory.test.d.ts +0 -2
  1091. package/dist/ui/hooks/useTranscriptHistory.test.d.ts.map +0 -1
  1092. package/dist/ui/hooks/useTranscriptHistory.test.js +0 -61
  1093. package/dist/ui/hooks/useTranscriptHistory.test.js.map +0 -1
  1094. package/dist/ui/hooks/useTranscriptScroll.test.d.ts +0 -2
  1095. package/dist/ui/hooks/useTranscriptScroll.test.d.ts.map +0 -1
  1096. package/dist/ui/hooks/useTranscriptScroll.test.js +0 -119
  1097. package/dist/ui/hooks/useTranscriptScroll.test.js.map +0 -1
  1098. package/dist/ui/live-area-clamp.test.d.ts +0 -2
  1099. package/dist/ui/live-area-clamp.test.d.ts.map +0 -1
  1100. package/dist/ui/live-area-clamp.test.js +0 -125
  1101. package/dist/ui/live-area-clamp.test.js.map +0 -1
  1102. package/dist/ui/live-area-height.test.d.ts +0 -2
  1103. package/dist/ui/live-area-height.test.d.ts.map +0 -1
  1104. package/dist/ui/live-area-height.test.js +0 -76
  1105. package/dist/ui/live-area-height.test.js.map +0 -1
  1106. package/dist/ui/live-frame-height.test.d.ts +0 -2
  1107. package/dist/ui/live-frame-height.test.d.ts.map +0 -1
  1108. package/dist/ui/live-frame-height.test.js +0 -116
  1109. package/dist/ui/live-frame-height.test.js.map +0 -1
  1110. package/dist/ui/live-item-flush.test.d.ts +0 -2
  1111. package/dist/ui/live-item-flush.test.d.ts.map +0 -1
  1112. package/dist/ui/live-item-flush.test.js +0 -437
  1113. package/dist/ui/live-item-flush.test.js.map +0 -1
  1114. package/dist/ui/long-prompt-regression-harness.test.d.ts +0 -2
  1115. package/dist/ui/long-prompt-regression-harness.test.d.ts.map +0 -1
  1116. package/dist/ui/long-prompt-regression-harness.test.js +0 -195
  1117. package/dist/ui/long-prompt-regression-harness.test.js.map +0 -1
  1118. package/dist/ui/pixel.test.d.ts +0 -2
  1119. package/dist/ui/pixel.test.d.ts.map +0 -1
  1120. package/dist/ui/pixel.test.js +0 -138
  1121. package/dist/ui/pixel.test.js.map +0 -1
  1122. package/dist/ui/plan-overlay.test.d.ts +0 -2
  1123. package/dist/ui/plan-overlay.test.d.ts.map +0 -1
  1124. package/dist/ui/plan-overlay.test.js +0 -305
  1125. package/dist/ui/plan-overlay.test.js.map +0 -1
  1126. package/dist/ui/queued-message.test.d.ts +0 -2
  1127. package/dist/ui/queued-message.test.d.ts.map +0 -1
  1128. package/dist/ui/queued-message.test.js +0 -172
  1129. package/dist/ui/queued-message.test.js.map +0 -1
  1130. package/dist/ui/render.test.d.ts +0 -2
  1131. package/dist/ui/render.test.d.ts.map +0 -1
  1132. package/dist/ui/render.test.js +0 -42
  1133. package/dist/ui/render.test.js.map +0 -1
  1134. package/dist/ui/scroll-stabilization.test.d.ts +0 -2
  1135. package/dist/ui/scroll-stabilization.test.d.ts.map +0 -1
  1136. package/dist/ui/scroll-stabilization.test.js +0 -64
  1137. package/dist/ui/scroll-stabilization.test.js.map +0 -1
  1138. package/dist/ui/slash-command-images.test.d.ts +0 -2
  1139. package/dist/ui/slash-command-images.test.d.ts.map +0 -1
  1140. package/dist/ui/slash-command-images.test.js +0 -110
  1141. package/dist/ui/slash-command-images.test.js.map +0 -1
  1142. package/dist/ui/startup-banner-order.test.d.ts +0 -2
  1143. package/dist/ui/startup-banner-order.test.d.ts.map +0 -1
  1144. package/dist/ui/startup-banner-order.test.js +0 -105
  1145. package/dist/ui/startup-banner-order.test.js.map +0 -1
  1146. package/dist/ui/stores/transcript-scroll-store.test.d.ts +0 -2
  1147. package/dist/ui/stores/transcript-scroll-store.test.d.ts.map +0 -1
  1148. package/dist/ui/stores/transcript-scroll-store.test.js +0 -73
  1149. package/dist/ui/stores/transcript-scroll-store.test.js.map +0 -1
  1150. package/dist/ui/streaming-flush-bounce.test.d.ts +0 -2
  1151. package/dist/ui/streaming-flush-bounce.test.d.ts.map +0 -1
  1152. package/dist/ui/streaming-flush-bounce.test.js +0 -177
  1153. package/dist/ui/streaming-flush-bounce.test.js.map +0 -1
  1154. package/dist/ui/submit-boundary-gap.test.d.ts +0 -2
  1155. package/dist/ui/submit-boundary-gap.test.d.ts.map +0 -1
  1156. package/dist/ui/submit-boundary-gap.test.js +0 -180
  1157. package/dist/ui/submit-boundary-gap.test.js.map +0 -1
  1158. package/dist/ui/terminal-history-repaint.test.d.ts +0 -2
  1159. package/dist/ui/terminal-history-repaint.test.d.ts.map +0 -1
  1160. package/dist/ui/terminal-history-repaint.test.js +0 -73
  1161. package/dist/ui/terminal-history-repaint.test.js.map +0 -1
  1162. package/dist/ui/terminal-history-retry-dedup.test.d.ts +0 -2
  1163. package/dist/ui/terminal-history-retry-dedup.test.d.ts.map +0 -1
  1164. package/dist/ui/terminal-history-retry-dedup.test.js +0 -61
  1165. package/dist/ui/terminal-history-retry-dedup.test.js.map +0 -1
  1166. package/dist/ui/terminal-history.test.d.ts +0 -2
  1167. package/dist/ui/terminal-history.test.d.ts.map +0 -1
  1168. package/dist/ui/terminal-history.test.js +0 -557
  1169. package/dist/ui/terminal-history.test.js.map +0 -1
  1170. package/dist/ui/thinking-level-cycle.test.d.ts +0 -2
  1171. package/dist/ui/thinking-level-cycle.test.d.ts.map +0 -1
  1172. package/dist/ui/thinking-level-cycle.test.js +0 -45
  1173. package/dist/ui/thinking-level-cycle.test.js.map +0 -1
  1174. package/dist/ui/tool-group-summary.test.d.ts +0 -2
  1175. package/dist/ui/tool-group-summary.test.d.ts.map +0 -1
  1176. package/dist/ui/tool-group-summary.test.js +0 -79
  1177. package/dist/ui/tool-group-summary.test.js.map +0 -1
  1178. package/dist/ui/transcript/spacing.test.d.ts +0 -2
  1179. package/dist/ui/transcript/spacing.test.d.ts.map +0 -1
  1180. package/dist/ui/transcript/spacing.test.js +0 -191
  1181. package/dist/ui/transcript/spacing.test.js.map +0 -1
  1182. package/dist/ui/transcript/transcript-lines.test.d.ts +0 -2
  1183. package/dist/ui/transcript/transcript-lines.test.d.ts.map +0 -1
  1184. package/dist/ui/transcript/transcript-lines.test.js +0 -76
  1185. package/dist/ui/transcript/transcript-lines.test.js.map +0 -1
  1186. package/dist/ui/transcript-viewport-pinning.test.d.ts +0 -2
  1187. package/dist/ui/transcript-viewport-pinning.test.d.ts.map +0 -1
  1188. package/dist/ui/transcript-viewport-pinning.test.js +0 -148
  1189. package/dist/ui/transcript-viewport-pinning.test.js.map +0 -1
  1190. package/dist/ui/tui-history-parity.test.d.ts +0 -2
  1191. package/dist/ui/tui-history-parity.test.d.ts.map +0 -1
  1192. package/dist/ui/tui-history-parity.test.js +0 -388
  1193. package/dist/ui/tui-history-parity.test.js.map +0 -1
  1194. package/dist/ui/tui-simulation.test.d.ts +0 -2
  1195. package/dist/ui/tui-simulation.test.d.ts.map +0 -1
  1196. package/dist/ui/tui-simulation.test.js +0 -145
  1197. package/dist/ui/tui-simulation.test.js.map +0 -1
  1198. package/dist/ui/tui-terminal-recorder.test.d.ts +0 -2
  1199. package/dist/ui/tui-terminal-recorder.test.d.ts.map +0 -1
  1200. package/dist/ui/tui-terminal-recorder.test.js +0 -134
  1201. package/dist/ui/tui-terminal-recorder.test.js.map +0 -1
  1202. package/dist/ui/utils/assistant-stream-split.test.d.ts +0 -2
  1203. package/dist/ui/utils/assistant-stream-split.test.d.ts.map +0 -1
  1204. package/dist/ui/utils/assistant-stream-split.test.js +0 -74
  1205. package/dist/ui/utils/assistant-stream-split.test.js.map +0 -1
  1206. package/dist/ui/utils/markdown-renderer.test.d.ts +0 -2
  1207. package/dist/ui/utils/markdown-renderer.test.d.ts.map +0 -1
  1208. package/dist/ui/utils/markdown-renderer.test.js +0 -63
  1209. package/dist/ui/utils/markdown-renderer.test.js.map +0 -1
  1210. package/dist/ui/utils/table-text.test.d.ts +0 -2
  1211. package/dist/ui/utils/table-text.test.d.ts.map +0 -1
  1212. package/dist/ui/utils/table-text.test.js +0 -202
  1213. package/dist/ui/utils/table-text.test.js.map +0 -1
  1214. package/dist/ui/utils/terminal-graphics.test.d.ts +0 -2
  1215. package/dist/ui/utils/terminal-graphics.test.d.ts.map +0 -1
  1216. package/dist/ui/utils/terminal-graphics.test.js +0 -100
  1217. package/dist/ui/utils/terminal-graphics.test.js.map +0 -1
  1218. package/dist/ui/utils/terminal-input.test.d.ts +0 -2
  1219. package/dist/ui/utils/terminal-input.test.d.ts.map +0 -1
  1220. package/dist/ui/utils/terminal-input.test.js +0 -15
  1221. package/dist/ui/utils/terminal-input.test.js.map +0 -1
  1222. package/dist/utils/git.test.d.ts +0 -2
  1223. package/dist/utils/git.test.d.ts.map +0 -1
  1224. package/dist/utils/git.test.js +0 -36
  1225. package/dist/utils/git.test.js.map +0 -1
  1226. package/dist/utils/github.test.d.ts +0 -2
  1227. package/dist/utils/github.test.d.ts.map +0 -1
  1228. package/dist/utils/github.test.js +0 -23
  1229. package/dist/utils/github.test.js.map +0 -1
  1230. package/dist/utils/http-body.test.d.ts +0 -2
  1231. package/dist/utils/http-body.test.d.ts.map +0 -1
  1232. package/dist/utils/http-body.test.js +0 -68
  1233. package/dist/utils/http-body.test.js.map +0 -1
  1234. package/dist/utils/image.test.d.ts +0 -2
  1235. package/dist/utils/image.test.d.ts.map +0 -1
  1236. package/dist/utils/image.test.js +0 -139
  1237. package/dist/utils/image.test.js.map +0 -1
  1238. package/dist/utils/plan-steps.test.d.ts +0 -2
  1239. package/dist/utils/plan-steps.test.d.ts.map +0 -1
  1240. package/dist/utils/plan-steps.test.js +0 -159
  1241. package/dist/utils/plan-steps.test.js.map +0 -1
  1242. package/dist/utils/process.test.d.ts +0 -2
  1243. package/dist/utils/process.test.d.ts.map +0 -1
  1244. package/dist/utils/process.test.js +0 -42
  1245. package/dist/utils/process.test.js.map +0 -1
@@ -1,940 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import fs from "node:fs/promises";
3
- import path from "node:path";
4
- import os from "node:os";
5
- import { createEditTool } from "./edit.js";
6
- import { lineHash } from "../core/hashline.js";
7
- import { recordRead } from "./read-tracker.js";
8
- function resultToString(result) {
9
- if (typeof result === "string")
10
- return result;
11
- if (result && typeof result === "object" && "details" in result) {
12
- const details = result.details;
13
- return details?.diff ?? "";
14
- }
15
- return "";
16
- }
17
- async function markRead(tracker, filePath) {
18
- const stat = await fs.stat(filePath);
19
- const content = await fs.readFile(filePath, "utf-8");
20
- recordRead(tracker, filePath, content, stat.mtimeMs);
21
- }
22
- describe("createEditTool", () => {
23
- let tmpDir;
24
- beforeEach(async () => {
25
- tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "edit-test-"));
26
- });
27
- afterEach(async () => {
28
- await fs.rm(tmpDir, { recursive: true, force: true });
29
- });
30
- it("opts into sequential agent-loop execution", () => {
31
- const tool = createEditTool(tmpDir);
32
- expect(tool.executionMode).toBe("sequential");
33
- });
34
- it("replaces exact text and returns a diff", async () => {
35
- const filePath = path.join(tmpDir, "hello.txt");
36
- await fs.writeFile(filePath, "hello world\n");
37
- const tool = createEditTool(tmpDir);
38
- const result = await tool.execute({ file_path: "hello.txt", edits: [{ old_text: "hello", new_text: "goodbye" }] }, { signal: new AbortController().signal, toolCallId: "test-1" });
39
- const diff = resultToString(result);
40
- expect(diff).toContain("-hello world");
41
- expect(diff).toContain("+goodbye world");
42
- const written = await fs.readFile(filePath, "utf-8");
43
- expect(written).toBe("goodbye world\n");
44
- });
45
- it("applies multiple edits sequentially", async () => {
46
- const filePath = path.join(tmpDir, "multi.txt");
47
- await fs.writeFile(filePath, "alpha\nbeta\ngamma\n");
48
- const tool = createEditTool(tmpDir);
49
- const result = await tool.execute({
50
- file_path: "multi.txt",
51
- edits: [
52
- { old_text: "alpha", new_text: "ALPHA" },
53
- { old_text: "gamma", new_text: "GAMMA" },
54
- ],
55
- }, { signal: new AbortController().signal, toolCallId: "test-multi" });
56
- const summary = typeof result === "string" ? result : result.content;
57
- expect(summary).toContain("2 edits");
58
- const written = await fs.readFile(filePath, "utf-8");
59
- expect(written).toBe("ALPHA\nbeta\nGAMMA\n");
60
- });
61
- it("supports chained edits where later edits depend on earlier ones", async () => {
62
- const filePath = path.join(tmpDir, "chain.txt");
63
- await fs.writeFile(filePath, "foo\n");
64
- const tool = createEditTool(tmpDir);
65
- await tool.execute({
66
- file_path: "chain.txt",
67
- edits: [
68
- { old_text: "foo", new_text: "bar" },
69
- { old_text: "bar", new_text: "baz" },
70
- ],
71
- }, { signal: new AbortController().signal, toolCallId: "test-chain" });
72
- const written = await fs.readFile(filePath, "utf-8");
73
- expect(written).toBe("baz\n");
74
- });
75
- it("reports edit index on failure within a multi-edit batch (atomic mode)", async () => {
76
- const filePath = path.join(tmpDir, "batch.txt");
77
- await fs.writeFile(filePath, "one two three\n");
78
- const tool = createEditTool(tmpDir);
79
- await expect(tool.execute({
80
- file_path: "batch.txt",
81
- edits: [
82
- { old_text: "one", new_text: "1" },
83
- { old_text: "missing", new_text: "x" },
84
- ],
85
- atomic: true,
86
- }, { signal: new AbortController().signal, toolCallId: "test-batch" })).rejects.toThrow(/edit 2\/2/);
87
- // Nothing should have been written — atomic
88
- const written = await fs.readFile(filePath, "utf-8");
89
- expect(written).toBe("one two three\n");
90
- });
91
- it("throws when file hasn't been read with readFiles tracking", async () => {
92
- const filePath = path.join(tmpDir, "unread.txt");
93
- await fs.writeFile(filePath, "content\n");
94
- const readFiles = new Map();
95
- const tool = createEditTool(tmpDir, readFiles);
96
- await expect(tool.execute({ file_path: "unread.txt", edits: [{ old_text: "content", new_text: "new" }] }, { signal: new AbortController().signal, toolCallId: "test-3" })).rejects.toThrow("File must be read first");
97
- });
98
- it("allows edit when file is in readFiles tracker", async () => {
99
- const filePath = path.join(tmpDir, "tracked.txt");
100
- await fs.writeFile(filePath, "alpha beta\n");
101
- const readFiles = new Map();
102
- await markRead(readFiles, filePath);
103
- const tool = createEditTool(tmpDir, readFiles);
104
- const result = await tool.execute({ file_path: "tracked.txt", edits: [{ old_text: "alpha", new_text: "gamma" }] }, { signal: new AbortController().signal, toolCallId: "test-4" });
105
- const diff = resultToString(result);
106
- expect(diff).toContain("-alpha beta");
107
- expect(diff).toContain("+gamma beta");
108
- const written = await fs.readFile(filePath, "utf-8");
109
- expect(written).toBe("gamma beta\n");
110
- });
111
- it("rejects edit when the file changed since it was read", async () => {
112
- const filePath = path.join(tmpDir, "stale.txt");
113
- await fs.writeFile(filePath, "alpha\n");
114
- const readFiles = new Map();
115
- await markRead(readFiles, filePath);
116
- // Simulate an external formatter rewriting the file (different bytes,
117
- // forced bumped mtime so the fast-path mtime check trips).
118
- await fs.writeFile(filePath, "ALPHA\n");
119
- const future = new Date(Date.now() + 5_000);
120
- await fs.utimes(filePath, future, future);
121
- const tool = createEditTool(tmpDir, readFiles);
122
- await expect(tool.execute({ file_path: "stale.txt", edits: [{ old_text: "ALPHA", new_text: "beta" }] }, { signal: new AbortController().signal, toolCallId: "test-stale" })).rejects.toThrow(/modified since/);
123
- });
124
- it("allows consecutive edits without re-reading (recordWrite refreshes)", async () => {
125
- const filePath = path.join(tmpDir, "consec.txt");
126
- await fs.writeFile(filePath, "one\ntwo\n");
127
- const readFiles = new Map();
128
- await markRead(readFiles, filePath);
129
- const tool = createEditTool(tmpDir, readFiles);
130
- await tool.execute({ file_path: "consec.txt", edits: [{ old_text: "one", new_text: "ONE" }] }, { signal: new AbortController().signal, toolCallId: "test-consec-1" });
131
- // Second edit must succeed without an explicit re-read.
132
- await tool.execute({ file_path: "consec.txt", edits: [{ old_text: "two", new_text: "TWO" }] }, { signal: new AbortController().signal, toolCallId: "test-consec-2" });
133
- const written = await fs.readFile(filePath, "utf-8");
134
- expect(written).toBe("ONE\nTWO\n");
135
- });
136
- it("appends a 'Closest match' snippet when old_text is not found", async () => {
137
- const filePath = path.join(tmpDir, "snippet.txt");
138
- await fs.writeFile(filePath, "import { useState } from 'react';\n\nexport function Counter() {\n const [count, setCount] = useState(0);\n return <div>{count}</div>;\n}\n");
139
- const tool = createEditTool(tmpDir);
140
- await expect(tool.execute({
141
- file_path: "snippet.txt",
142
- edits: [
143
- {
144
- old_text: "const [count, setCount] = useState(1);",
145
- new_text: "const [count, setCount] = useState(2);",
146
- },
147
- ],
148
- }, { signal: new AbortController().signal, toolCallId: "test-snippet" })).rejects.toThrow(/Closest match in file:[\s\S]*useState\(0\)/);
149
- });
150
- it("suggests a bounded re-read around the closest match when not_found", async () => {
151
- const filePath = path.join(tmpDir, "rehint.txt");
152
- await fs.writeFile(filePath, "import { useState } from 'react';\n\nexport function Counter() {\n const [count, setCount] = useState(0);\n return <div>{count}</div>;\n}\n");
153
- const tool = createEditTool(tmpDir);
154
- // The closest match is on line 4. With ±25 lines, offset clamps to 1 and
155
- // limit stays at 50. The hint uses the same file_path the model passed.
156
- await expect(tool.execute({
157
- file_path: "rehint.txt",
158
- edits: [
159
- {
160
- old_text: "const [count, setCount] = useState(1);",
161
- new_text: "const [count, setCount] = useState(2);",
162
- },
163
- ],
164
- }, { signal: new AbortController().signal, toolCallId: "rehint-1" })).rejects.toThrow(/Suggested re-read: `read file_path="rehint\.txt" offset=1 limit=50`/);
165
- });
166
- it("aggregates multiple edit failures into one error (atomic mode)", async () => {
167
- const filePath = path.join(tmpDir, "agg.txt");
168
- await fs.writeFile(filePath, "alpha\nbeta\ngamma\n");
169
- const tool = createEditTool(tmpDir);
170
- await expect(tool.execute({
171
- file_path: "agg.txt",
172
- edits: [
173
- { old_text: "alpha", new_text: "ALPHA" },
174
- { old_text: "MISSING", new_text: "X" },
175
- { old_text: "ALSO_MISSING", new_text: "Y" },
176
- ],
177
- atomic: true,
178
- }, { signal: new AbortController().signal, toolCallId: "test-agg" })).rejects.toThrow(/2 of 3 edits failed[\s\S]*edit 2\/3[\s\S]*edit 3\/3/);
179
- // Atomic — nothing written.
180
- const written = await fs.readFile(filePath, "utf-8");
181
- expect(written).toBe("alpha\nbeta\ngamma\n");
182
- });
183
- it("partial-apply (default): keeps successful edits and reports failures for retry", async () => {
184
- const filePath = path.join(tmpDir, "partial.txt");
185
- await fs.writeFile(filePath, "alpha\nbeta\ngamma\n");
186
- const tool = createEditTool(tmpDir);
187
- const result = await tool.execute({
188
- file_path: "partial.txt",
189
- edits: [
190
- { old_text: "alpha", new_text: "ALPHA" },
191
- { old_text: "MISSING", new_text: "X" },
192
- { old_text: "gamma", new_text: "GAMMA" },
193
- ],
194
- }, { signal: new AbortController().signal, toolCallId: "test-partial" });
195
- const summary = typeof result === "string" ? result : result.content;
196
- expect(summary).toMatch(/Applied 2 of 3 edits/);
197
- expect(summary).toMatch(/re-issue ONLY these/);
198
- expect(summary).toMatch(/edit 2\/3/);
199
- expect(summary).not.toMatch(/edit 1\/3/);
200
- expect(summary).not.toMatch(/edit 3\/3/);
201
- // Successful edits landed; failed one didn't.
202
- const written = await fs.readFile(filePath, "utf-8");
203
- expect(written).toBe("ALPHA\nbeta\nGAMMA\n");
204
- });
205
- it("partial-apply on a 19-edit batch with 2 failures lands the other 17", async () => {
206
- const filePath = path.join(tmpDir, "big.css");
207
- const lines = Array.from({ length: 19 }, (_, i) => `.cls${i} { color: red; }`);
208
- await fs.writeFile(filePath, lines.join("\n") + "\n");
209
- const edits = lines.map((line, i) => ({
210
- old_text: line,
211
- // Two of them deliberately drift so the batch sees real failures.
212
- new_text: i === 7 || i === 13
213
- ? line.replace("color: red", "color: blue")
214
- : line.replace("red", "green"),
215
- }));
216
- // Corrupt edits 8 (index 7) and 14 (index 13) by paraphrasing old_text.
217
- edits[7] = { old_text: ".cls7 { colour: red; }", new_text: ".cls7 { color: blue; }" };
218
- edits[13] = { old_text: ".cls13 { colur: red; }", new_text: ".cls13 { color: blue; }" };
219
- const tool = createEditTool(tmpDir);
220
- const result = await tool.execute({ file_path: "big.css", edits }, { signal: new AbortController().signal, toolCallId: "test-19" });
221
- const summary = typeof result === "string" ? result : result.content;
222
- expect(summary).toMatch(/Applied 17 of 19 edits/);
223
- expect(summary).toMatch(/edit 8\/19/);
224
- expect(summary).toMatch(/edit 14\/19/);
225
- const written = await fs.readFile(filePath, "utf-8");
226
- // 17 lines should have green, the two failed ones still red.
227
- expect((written.match(/color: green/g) ?? []).length).toBe(17);
228
- expect(written).toContain(".cls7 { color: red; }");
229
- expect(written).toContain(".cls13 { color: red; }");
230
- });
231
- it("throws when every edit fails even in partial-apply mode", async () => {
232
- const filePath = path.join(tmpDir, "all-fail.txt");
233
- await fs.writeFile(filePath, "untouched\n");
234
- const tool = createEditTool(tmpDir);
235
- await expect(tool.execute({
236
- file_path: "all-fail.txt",
237
- edits: [
238
- { old_text: "MISSING1", new_text: "X" },
239
- { old_text: "MISSING2", new_text: "Y" },
240
- ],
241
- }, { signal: new AbortController().signal, toolCallId: "test-all-fail" })).rejects.toThrow(/2 of 2 edits failed/);
242
- const written = await fs.readFile(filePath, "utf-8");
243
- expect(written).toBe("untouched\n");
244
- });
245
- it("suppresses Closest-match snippet in partial-apply when other edits succeeded", async () => {
246
- // Mirrors the StartingYourAgency.tsx scenario: token-heavy lines where
247
- // findClosestSnippet returns noisy top-of-file regions. When 17 of 19
248
- // edits succeed, those diffs already give the model context — the
249
- // snippet would just be noise.
250
- const filePath = path.join(tmpDir, "noisy.tsx");
251
- const lines = Array.from({ length: 6 }, (_, i) => ` <div className="card-${i}">Section ${i}</div>`);
252
- await fs.writeFile(filePath, lines.join("\n") + "\n");
253
- const edits = lines.map((line) => ({
254
- old_text: line,
255
- new_text: line.replace("card-", "glass-card-"),
256
- }));
257
- // Drift edit 4 — paraphrase the case so it doesn't match.
258
- edits[3] = {
259
- old_text: ` <div className="Card-3">Section 3</div>`,
260
- new_text: ` <div className="glass-card-3">Section 3</div>`,
261
- };
262
- const tool = createEditTool(tmpDir);
263
- const result = await tool.execute({ file_path: "noisy.tsx", edits }, { signal: new AbortController().signal, toolCallId: "test-suppress" });
264
- const summary = typeof result === "string" ? result : result.content;
265
- expect(summary).toMatch(/Applied 5 of 6/);
266
- expect(summary).toMatch(/edit 4\/6/);
267
- // The snippet would be ~3-7 lines starting with "Closest match in file:".
268
- // In partial-apply with successes, we suppress it.
269
- expect(summary).not.toMatch(/Closest match in file:/);
270
- });
271
- it("keeps Closest-match snippet when no other edit succeeded", async () => {
272
- // Single-edit call — no surrounding context for the model, so the snippet
273
- // is genuinely useful and must remain. Use overlapping tokens so the
274
- // closest-snippet heuristic actually fires.
275
- const filePath = path.join(tmpDir, "lonely.tsx");
276
- await fs.writeFile(filePath, "function Counter() {\n const [count, setCount] = useState(0);\n return count;\n}\n");
277
- const tool = createEditTool(tmpDir);
278
- await expect(tool.execute({
279
- file_path: "lonely.tsx",
280
- edits: [
281
- {
282
- old_text: "const [count, setCount] = useState(1);",
283
- new_text: "const [count, setCount] = useState(2);",
284
- },
285
- ],
286
- }, { signal: new AbortController().signal, toolCallId: "test-keep" })).rejects.toThrow(/Closest match in file:[\s\S]*useState\(0\)/);
287
- });
288
- it("atomic mode keeps Closest-match snippet (model retries against unchanged file)", async () => {
289
- const filePath = path.join(tmpDir, "atomic-snippet.tsx");
290
- const lines = Array.from({ length: 4 }, (_, i) => ` <div className="card-${i}">Section ${i}</div>`);
291
- await fs.writeFile(filePath, lines.join("\n") + "\n");
292
- const edits = lines.map((line) => ({
293
- old_text: line,
294
- new_text: line.replace("card-", "glass-card-"),
295
- }));
296
- edits[2] = {
297
- old_text: ` <div className="Card-2">Section 2</div>`,
298
- new_text: ` <div className="glass-card-2">Section 2</div>`,
299
- };
300
- const tool = createEditTool(tmpDir);
301
- await expect(tool.execute({ file_path: "atomic-snippet.tsx", edits, atomic: true }, { signal: new AbortController().signal, toolCallId: "test-atomic-snippet" })).rejects.toThrow(/Closest match in file:/);
302
- });
303
- it("indent-flex: model omits indentation entirely; file has 4-space prefix — applies it", async () => {
304
- const filePath = path.join(tmpDir, "indent.ts");
305
- await fs.writeFile(filePath, " const x = 1;\n const y = 2;\n const z = 3;\n");
306
- const tool = createEditTool(tmpDir);
307
- const result = await tool.execute({
308
- file_path: "indent.ts",
309
- edits: [
310
- {
311
- old_text: "const x = 1;\nconst y = 2;\nconst z = 3;",
312
- new_text: "const x = 10;\nconst y = 20;\nconst z = 30;",
313
- },
314
- ],
315
- }, { signal: new AbortController().signal, toolCallId: "test-indent-flex" });
316
- const summary = typeof result === "string" ? result : result.content;
317
- expect(summary).toMatch(/Successfully/);
318
- const written = await fs.readFile(filePath, "utf-8");
319
- expect(written).toBe(" const x = 10;\n const y = 20;\n const z = 30;\n");
320
- });
321
- it("indent-flex: model used 2-space but file uses 4 — outdents both, re-indents new", async () => {
322
- const filePath = path.join(tmpDir, "mixed-indent.ts");
323
- await fs.writeFile(filePath, " if (x) {\n return y;\n }\n");
324
- const tool = createEditTool(tmpDir);
325
- const result = await tool.execute({
326
- file_path: "mixed-indent.ts",
327
- edits: [
328
- {
329
- old_text: " if (x) {\n return y;\n }",
330
- new_text: " if (x) {\n return z;\n }",
331
- },
332
- ],
333
- }, { signal: new AbortController().signal, toolCallId: "test-mixed-indent" });
334
- const summary = typeof result === "string" ? result : result.content;
335
- expect(summary).toMatch(/Successfully/);
336
- const written = await fs.readFile(filePath, "utf-8");
337
- expect(written).toBe(" if (x) {\n return z;\n }\n");
338
- });
339
- it("dotdotdots: model elides middle with `...`, edit lands and middle preserved", async () => {
340
- const filePath = path.join(tmpDir, "elide.ts");
341
- await fs.writeFile(filePath, [
342
- "function pomodoro() {",
343
- " const timer = startTimer();",
344
- " trackPomodoro(timer);",
345
- " scheduleBreak();",
346
- " return timer;",
347
- "}",
348
- ].join("\n") + "\n");
349
- const tool = createEditTool(tmpDir);
350
- const result = await tool.execute({
351
- file_path: "elide.ts",
352
- edits: [
353
- {
354
- old_text: "function pomodoro() {\n ...\n return timer;\n}",
355
- new_text: "function pomodoro(): Timer {\n ...\n return timer;\n}",
356
- },
357
- ],
358
- }, { signal: new AbortController().signal, toolCallId: "test-elide" });
359
- const summary = typeof result === "string" ? result : result.content;
360
- expect(summary).toMatch(/Successfully/);
361
- const written = await fs.readFile(filePath, "utf-8");
362
- expect(written).toContain("function pomodoro(): Timer {");
363
- // Middle preserved verbatim.
364
- expect(written).toContain("trackPomodoro(timer);");
365
- expect(written).toContain("scheduleBreak();");
366
- });
367
- it("dotdotdots: model can omit common indentation from elided bookends", async () => {
368
- const filePath = path.join(tmpDir, "elide-indent.ts");
369
- await fs.writeFile(filePath, " function pomodoro() {\n trackPomodoro(timer);\n return timer;\n }\n");
370
- const tool = createEditTool(tmpDir);
371
- await tool.execute({
372
- file_path: "elide-indent.ts",
373
- edits: [
374
- {
375
- old_text: "function pomodoro() {\n ...\n return timer;\n}",
376
- new_text: "function pomodoro(): Timer {\n ...\n return timer;\n}",
377
- },
378
- ],
379
- }, { signal: new AbortController().signal, toolCallId: "test-elide-indent" });
380
- const written = await fs.readFile(filePath, "utf-8");
381
- expect(written).toBe(" function pomodoro(): Timer {\n trackPomodoro(timer);\n return timer;\n }\n");
382
- });
383
- it("dotdotdots: failed elision falls through to standard not_found error", async () => {
384
- const filePath = path.join(tmpDir, "elide-fail.ts");
385
- await fs.writeFile(filePath, "function actuallyExists() { return 1; }\n");
386
- const tool = createEditTool(tmpDir);
387
- await expect(tool.execute({
388
- file_path: "elide-fail.ts",
389
- edits: [
390
- {
391
- // Bookends don't exist in the file.
392
- old_text: "function nonexistent() {\n ...\n return x;\n}",
393
- new_text: "function nonexistent() {\n ...\n return y;\n}",
394
- },
395
- ],
396
- }, { signal: new AbortController().signal, toolCallId: "test-elide-fail" })).rejects.toThrow(/old_text not found/);
397
- });
398
- it("treats no-op edits where old_text equals new_text as successful no-ops", async () => {
399
- const filePath = path.join(tmpDir, "noop.txt");
400
- await fs.writeFile(filePath, "hello world\n");
401
- const mutated = [];
402
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, (mutatedPath) => {
403
- mutated.push(mutatedPath);
404
- });
405
- const result = await tool.execute({
406
- file_path: "noop.txt",
407
- edits: [{ old_text: "hello", new_text: "hello" }],
408
- }, { signal: new AbortController().signal, toolCallId: "test-noop" });
409
- const summary = typeof result === "string" ? result : result.content;
410
- expect(summary).toMatch(/No changes needed[\s\S]*no-op/);
411
- expect(mutated).toEqual([]);
412
- // File untouched — confirms we didn't write a no-op.
413
- const written = await fs.readFile(filePath, "utf-8");
414
- expect(written).toBe("hello world\n");
415
- });
416
- it("applies real edits atomically when the batch also contains no-ops", async () => {
417
- const filePath = path.join(tmpDir, "noop-atomic.txt");
418
- await fs.writeFile(filePath, "alpha\nbeta\ngamma\n");
419
- const tool = createEditTool(tmpDir);
420
- const result = await tool.execute({
421
- file_path: "noop-atomic.txt",
422
- edits: [
423
- { old_text: "alpha", new_text: "ALPHA" },
424
- { old_text: "beta", new_text: "beta" },
425
- { old_text: "gamma", new_text: "GAMMA" },
426
- ],
427
- atomic: true,
428
- }, { signal: new AbortController().signal, toolCallId: "test-noop-atomic" });
429
- const summary = typeof result === "string" ? result : result.content;
430
- expect(summary).toContain("3 edits");
431
- const written = await fs.readFile(filePath, "utf-8");
432
- expect(written).toBe("ALPHA\nbeta\nGAMMA\n");
433
- });
434
- it("no-op edit in a partial-apply batch still lets the other edits land", async () => {
435
- const filePath = path.join(tmpDir, "noop-batch.txt");
436
- await fs.writeFile(filePath, "alpha\nbeta\n");
437
- const tool = createEditTool(tmpDir);
438
- const result = await tool.execute({
439
- file_path: "noop-batch.txt",
440
- edits: [
441
- { old_text: "alpha", new_text: "ALPHA" },
442
- { old_text: "beta", new_text: "beta" }, // no-op
443
- ],
444
- }, { signal: new AbortController().signal, toolCallId: "test-noop-batch" });
445
- const summary = typeof result === "string" ? result : result.content;
446
- expect(summary).toMatch(/Successfully applied 2 edits/);
447
- const written = await fs.readFile(filePath, "utf-8");
448
- expect(written).toBe("ALPHA\nbeta\n");
449
- });
450
- it("strips a spurious leading blank line in old_text and still matches", async () => {
451
- const filePath = path.join(tmpDir, "blank.ts");
452
- await fs.writeFile(filePath, "function foo() {\n return 42;\n}\n");
453
- const tool = createEditTool(tmpDir);
454
- const result = await tool.execute({
455
- file_path: "blank.ts",
456
- edits: [
457
- {
458
- // Note the leading blank line — the model often pastes one in.
459
- old_text: "\n return 42;",
460
- new_text: "\n return 100;",
461
- },
462
- ],
463
- }, { signal: new AbortController().signal, toolCallId: "test-blank" });
464
- const summary = typeof result === "string" ? result : result.content;
465
- expect(summary).toMatch(/Successfully/);
466
- const written = await fs.readFile(filePath, "utf-8");
467
- expect(written).toBe("function foo() {\n return 100;\n}\n");
468
- });
469
- it("throws when old_text is not found", async () => {
470
- const filePath = path.join(tmpDir, "missing.txt");
471
- await fs.writeFile(filePath, "some content here\n");
472
- const tool = createEditTool(tmpDir);
473
- await expect(tool.execute({
474
- file_path: "missing.txt",
475
- edits: [{ old_text: "nonexistent text", new_text: "replacement" }],
476
- }, { signal: new AbortController().signal, toolCallId: "test-5" })).rejects.toThrow("old_text not found");
477
- });
478
- it("keeps the read tracker valid after a not_found failure so the model can retry immediately", async () => {
479
- const filePath = path.join(tmpDir, "guardrail.txt");
480
- await fs.writeFile(filePath, "the actual content\n");
481
- const tracker = new Map();
482
- await markRead(tracker, filePath);
483
- const tool = createEditTool(tmpDir, tracker);
484
- // First edit fails with not_found. Nothing was written, so the file is
485
- // unchanged and the tracker must stay valid — invalidating it here used to
486
- // surface a misleading "File must be read first" on the next edit.
487
- await expect(tool.execute({
488
- file_path: "guardrail.txt",
489
- edits: [{ old_text: "the wrong content", new_text: "anything" }],
490
- }, { signal: new AbortController().signal, toolCallId: "guardrail-1" })).rejects.toThrow(/old_text not found/);
491
- expect(tracker.has(filePath)).toBe(true);
492
- // Second edit with corrected old_text succeeds without a forced re-read.
493
- const result = await tool.execute({
494
- file_path: "guardrail.txt",
495
- edits: [{ old_text: "the actual content", new_text: "replaced" }],
496
- }, { signal: new AbortController().signal, toolCallId: "guardrail-2" });
497
- const summary = typeof result === "string" ? result : result.content;
498
- expect(summary).toMatch(/Successfully replaced/);
499
- expect(await fs.readFile(filePath, "utf-8")).toBe("replaced\n");
500
- });
501
- it("refreshes (not clears) the tracker on partial-apply so retries validate against the written content", async () => {
502
- const filePath = path.join(tmpDir, "partial.txt");
503
- await fs.writeFile(filePath, "alpha\nbeta\ngamma\n");
504
- const tracker = new Map();
505
- await markRead(tracker, filePath);
506
- const tool = createEditTool(tmpDir, tracker);
507
- // One edit succeeds (alpha → ALPHA), one fails with not_found (missing).
508
- // The success is written and the tracker is refreshed to the new content.
509
- await tool.execute({
510
- file_path: "partial.txt",
511
- edits: [
512
- { old_text: "alpha", new_text: "ALPHA" },
513
- { old_text: "missing", new_text: "replacement" },
514
- ],
515
- }, { signal: new AbortController().signal, toolCallId: "partial-1" });
516
- expect(await fs.readFile(filePath, "utf-8")).toBe("ALPHA\nbeta\ngamma\n");
517
- expect(tracker.has(filePath)).toBe(true);
518
- // A follow-up edit against the just-written content applies without a re-read.
519
- const result = await tool.execute({
520
- file_path: "partial.txt",
521
- edits: [{ old_text: "beta", new_text: "BETA" }],
522
- }, { signal: new AbortController().signal, toolCallId: "partial-2" });
523
- const summary = typeof result === "string" ? result : result.content;
524
- expect(summary).toMatch(/Successfully replaced/);
525
- expect(await fs.readFile(filePath, "utf-8")).toBe("ALPHA\nBETA\ngamma\n");
526
- });
527
- it("throws when old_text matches multiple times", async () => {
528
- const filePath = path.join(tmpDir, "dupes.txt");
529
- await fs.writeFile(filePath, "foo bar foo baz foo\n");
530
- const tool = createEditTool(tmpDir);
531
- await expect(tool.execute({ file_path: "dupes.txt", edits: [{ old_text: "foo", new_text: "qux" }] }, { signal: new AbortController().signal, toolCallId: "test-6" })).rejects.toThrow(/found 3 times/);
532
- });
533
- it("includes line numbers of every duplicate match in the error", async () => {
534
- const filePath = path.join(tmpDir, "pomodoro.css");
535
- await fs.writeFile(filePath, [
536
- ".timer { color: white; }",
537
- ".button { color: black; }",
538
- ".label { color: white; }",
539
- ".footer { color: white; }",
540
- "",
541
- ].join("\n"));
542
- const tool = createEditTool(tmpDir);
543
- await expect(tool.execute({
544
- file_path: "pomodoro.css",
545
- edits: [{ old_text: "color: white;", new_text: "color: red;" }],
546
- }, { signal: new AbortController().signal, toolCallId: "test-dup-lines" })).rejects.toThrow(/Matches at:[\s\S]*line 1[\s\S]*line 3[\s\S]*line 4/);
547
- });
548
- it("hints at replace_all in the duplicate-match error", async () => {
549
- const filePath = path.join(tmpDir, "hint.txt");
550
- await fs.writeFile(filePath, "foo\nfoo\nfoo\n");
551
- const tool = createEditTool(tmpDir);
552
- await expect(tool.execute({ file_path: "hint.txt", edits: [{ old_text: "foo", new_text: "bar" }] }, { signal: new AbortController().signal, toolCallId: "test-dup-hint" })).rejects.toThrow(/replace_all: true/);
553
- });
554
- it("replaces every occurrence when replace_all: true is set", async () => {
555
- const filePath = path.join(tmpDir, "rename.css");
556
- await fs.writeFile(filePath, [".timer { color: white; }", ".label { color: white; }", ".footer { color: white; }"].join("\n") + "\n");
557
- const tool = createEditTool(tmpDir);
558
- const result = await tool.execute({
559
- file_path: "rename.css",
560
- edits: [{ old_text: "color: white;", new_text: "color: red;", replace_all: true }],
561
- }, { signal: new AbortController().signal, toolCallId: "test-replace-all" });
562
- const summary = typeof result === "string" ? result : result.content;
563
- expect(summary).toMatch(/Successfully/);
564
- const written = await fs.readFile(filePath, "utf-8");
565
- expect(written).toBe([".timer { color: red; }", ".label { color: red; }", ".footer { color: red; }"].join("\n") +
566
- "\n");
567
- });
568
- it("replace_all still errors when no occurrences exist (with closest-match hint)", async () => {
569
- const filePath = path.join(tmpDir, "missing-all.txt");
570
- await fs.writeFile(filePath, "alpha beta\n");
571
- const tool = createEditTool(tmpDir);
572
- await expect(tool.execute({
573
- file_path: "missing-all.txt",
574
- edits: [{ old_text: "gamma", new_text: "delta", replace_all: true }],
575
- }, { signal: new AbortController().signal, toolCallId: "test-replace-all-missing" })).rejects.toThrow(/old_text not found/);
576
- });
577
- it("replace_all applies fuzzy matches instead of requiring exact split", async () => {
578
- const filePath = path.join(tmpDir, "replace-all-fuzzy.txt");
579
- await fs.writeFile(filePath, "say “hi”\nsay “hi”\n");
580
- const tool = createEditTool(tmpDir);
581
- await tool.execute({
582
- file_path: "replace-all-fuzzy.txt",
583
- edits: [{ old_text: 'say "hi"', new_text: "say hello", replace_all: true }],
584
- }, { signal: new AbortController().signal, toolCallId: "test-replace-all-fuzzy" });
585
- const written = await fs.readFile(filePath, "utf-8");
586
- expect(written).toBe("say hello\nsay hello\n");
587
- });
588
- it("replace_all coexists with sequential edits in one batch", async () => {
589
- const filePath = path.join(tmpDir, "mixed.css");
590
- await fs.writeFile(filePath, [".a { color: white; }", ".b { color: white; }", ".header { font-size: 12px; }"].join("\n") +
591
- "\n");
592
- const tool = createEditTool(tmpDir);
593
- const result = await tool.execute({
594
- file_path: "mixed.css",
595
- edits: [
596
- { old_text: "color: white;", new_text: "color: red;", replace_all: true },
597
- { old_text: "font-size: 12px;", new_text: "font-size: 14px;" },
598
- ],
599
- }, { signal: new AbortController().signal, toolCallId: "test-mixed" });
600
- const summary = typeof result === "string" ? result : result.content;
601
- expect(summary).toContain("2 edits");
602
- const written = await fs.readFile(filePath, "utf-8");
603
- expect(written).toBe([".a { color: red; }", ".b { color: red; }", ".header { font-size: 14px; }"].join("\n") +
604
- "\n");
605
- });
606
- it("handles fuzzy matching with trailing whitespace and smart quotes", async () => {
607
- const filePath = path.join(tmpDir, "fuzzy.txt");
608
- await fs.writeFile(filePath, "const msg = 'hello'; \nend\n");
609
- const tool = createEditTool(tmpDir);
610
- const result = await tool.execute({
611
- file_path: "fuzzy.txt",
612
- edits: [
613
- {
614
- old_text: "const msg = \u2018hello\u2019;",
615
- new_text: "const msg = 'goodbye';",
616
- },
617
- ],
618
- }, { signal: new AbortController().signal, toolCallId: "test-7" });
619
- const diff = resultToString(result);
620
- expect(diff).toContain("+const msg = 'goodbye';");
621
- const written = await fs.readFile(filePath, "utf-8");
622
- expect(written).toContain("goodbye");
623
- });
624
- it("preserves CRLF line endings", async () => {
625
- const filePath = path.join(tmpDir, "crlf.txt");
626
- await fs.writeFile(filePath, "line one\r\nline two\r\nline three\r\n");
627
- const tool = createEditTool(tmpDir);
628
- const result = await tool.execute({ file_path: "crlf.txt", edits: [{ old_text: "line two", new_text: "line TWO" }] }, { signal: new AbortController().signal, toolCallId: "test-8" });
629
- const diff = resultToString(result);
630
- expect(diff).toContain("+line TWO");
631
- const written = await fs.readFile(filePath, "utf-8");
632
- expect(written).toBe("line one\r\nline TWO\r\nline three\r\n");
633
- });
634
- it("calls mutation callback after successful edits", async () => {
635
- const filePath = path.join(tmpDir, "mutated.txt");
636
- await fs.writeFile(filePath, "alpha\n");
637
- const mutated = [];
638
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, (mutatedPath) => {
639
- mutated.push(mutatedPath);
640
- });
641
- await tool.execute({ file_path: "mutated.txt", edits: [{ old_text: "alpha", new_text: "beta" }] }, { signal: new AbortController().signal, toolCallId: "test-mutated" });
642
- expect(mutated).toEqual([filePath]);
643
- });
644
- it("does not call mutation callback when no edits are written", async () => {
645
- const filePath = path.join(tmpDir, "not-mutated.txt");
646
- await fs.writeFile(filePath, "alpha\n");
647
- const mutated = [];
648
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, (mutatedPath) => {
649
- mutated.push(mutatedPath);
650
- });
651
- await expect(tool.execute({ file_path: "not-mutated.txt", edits: [{ old_text: "missing", new_text: "beta" }] }, { signal: new AbortController().signal, toolCallId: "test-not-mutated" })).rejects.toThrow("old_text not found");
652
- expect(mutated).toEqual([]);
653
- });
654
- describe("LSP diagnostics", () => {
655
- function contentOf(result) {
656
- if (result && typeof result === "object" && "content" in result) {
657
- const c = result.content;
658
- if (typeof c === "string")
659
- return c;
660
- }
661
- return String(result);
662
- }
663
- it("appends a non-empty diagnostics string to a successful edit", async () => {
664
- const filePath = path.join(tmpDir, "diag.ts");
665
- await fs.writeFile(filePath, "const x = 1;\n");
666
- const seen = [];
667
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, undefined, undefined, async (fp, content) => {
668
- seen.push({ filePath: fp, content });
669
- return "\n\nDiagnostics in diag.ts (informational — may resolve after related edits):\nL1:7 boom (typescript)";
670
- });
671
- const result = await tool.execute({
672
- file_path: "diag.ts",
673
- edits: [{ old_text: "const x = 1;", new_text: 'const x: number = "a";' }],
674
- }, { signal: new AbortController().signal, toolCallId: "test-diag-1" });
675
- const content = contentOf(result);
676
- expect(content).toContain("Successfully replaced text in diag.ts.");
677
- expect(content).toContain("L1:7 boom (typescript)");
678
- expect(seen).toEqual([{ filePath, content: 'const x: number = "a";\n' }]);
679
- });
680
- it("leaves the result unchanged when the provider returns empty", async () => {
681
- const filePath = path.join(tmpDir, "clean.ts");
682
- await fs.writeFile(filePath, "alpha\n");
683
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, undefined, undefined, async () => "");
684
- const result = await tool.execute({ file_path: "clean.ts", edits: [{ old_text: "alpha", new_text: "beta" }] }, { signal: new AbortController().signal, toolCallId: "test-diag-2" });
685
- expect(contentOf(result)).toBe("Successfully replaced text in clean.ts.");
686
- });
687
- it("leaves the result unchanged when the provider throws", async () => {
688
- const filePath = path.join(tmpDir, "throws.ts");
689
- await fs.writeFile(filePath, "alpha\n");
690
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, undefined, undefined, async () => {
691
- throw new Error("lsp exploded");
692
- });
693
- const result = await tool.execute({ file_path: "throws.ts", edits: [{ old_text: "alpha", new_text: "beta" }] }, { signal: new AbortController().signal, toolCallId: "test-diag-3" });
694
- expect(contentOf(result)).toBe("Successfully replaced text in throws.ts.");
695
- expect(await fs.readFile(filePath, "utf-8")).toBe("beta\n");
696
- });
697
- it("does not call the provider when nothing was written", async () => {
698
- const filePath = path.join(tmpDir, "untouched.ts");
699
- await fs.writeFile(filePath, "alpha\n");
700
- let calls = 0;
701
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, undefined, undefined, async () => {
702
- calls++;
703
- return "should not appear";
704
- });
705
- await expect(tool.execute({ file_path: "untouched.ts", edits: [{ old_text: "missing", new_text: "beta" }] }, { signal: new AbortController().signal, toolCallId: "test-diag-4" })).rejects.toThrow("old_text not found");
706
- expect(calls).toBe(0);
707
- });
708
- it("appends diagnostics to partial-success results", async () => {
709
- const filePath = path.join(tmpDir, "partial.ts");
710
- await fs.writeFile(filePath, "alpha\ngamma\n");
711
- const tool = createEditTool(tmpDir, undefined, undefined, undefined, undefined, undefined, async () => "\n\nDiagnostics in partial.ts (informational — may resolve after related edits):\nL1:1 oops (typescript)");
712
- const result = await tool.execute({
713
- file_path: "partial.ts",
714
- edits: [
715
- { old_text: "alpha", new_text: "beta" },
716
- { old_text: "missing", new_text: "x" },
717
- ],
718
- }, { signal: new AbortController().signal, toolCallId: "test-diag-5" });
719
- const content = contentOf(result);
720
- expect(content).toContain("Applied 1 of 2 edits");
721
- expect(content).toContain("L1:1 oops (typescript)");
722
- });
723
- });
724
- });
725
- describe("edit anchor guard", () => {
726
- let tmpDir;
727
- beforeEach(async () => {
728
- tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "edit-anchor-test-"));
729
- });
730
- afterEach(async () => {
731
- await fs.rm(tmpDir, { recursive: true, force: true });
732
- });
733
- function diffOf(result) {
734
- if (typeof result === "string")
735
- return result;
736
- if (result && typeof result === "object" && "details" in result) {
737
- return result.details?.diff ?? "";
738
- }
739
- return "";
740
- }
741
- /** Anchor for a 1-based line in `content`. */
742
- function anchorFor(content, line1) {
743
- const idx = line1 - 1;
744
- const text = content.split("\n")[idx];
745
- return { line: line1, hash: lineHash(text, idx) };
746
- }
747
- it("applies normally when the anchor matches", async () => {
748
- const filePath = path.join(tmpDir, "a.ts");
749
- const content = "const a = 1;\nconst b = 2;\nconst c = 3;\n";
750
- await fs.writeFile(filePath, content);
751
- const tracker = new Map();
752
- await markRead(tracker, filePath);
753
- const a = anchorFor(content, 2);
754
- const tool = createEditTool(tmpDir, tracker);
755
- const result = await tool.execute({
756
- file_path: "a.ts",
757
- edits: [
758
- {
759
- old_text: "const b = 2;",
760
- new_text: "const b = 20;",
761
- anchor: { start_line: a.line, start_hash: a.hash, end_line: a.line, end_hash: a.hash },
762
- },
763
- ],
764
- }, { signal: new AbortController().signal, toolCallId: "anc-1" });
765
- expect(diffOf(result)).toContain("+const b = 20;");
766
- expect(await fs.readFile(filePath, "utf-8")).toBe("const a = 1;\nconst b = 20;\nconst c = 3;\n");
767
- });
768
- it("rejects a wrong start_hash with stale_anchor and writes nothing", async () => {
769
- const filePath = path.join(tmpDir, "b.ts");
770
- const content = "const a = 1;\nconst b = 2;\n";
771
- await fs.writeFile(filePath, content);
772
- const tracker = new Map();
773
- await markRead(tracker, filePath);
774
- const tool = createEditTool(tmpDir, tracker);
775
- await expect(tool.execute({
776
- file_path: "b.ts",
777
- edits: [
778
- {
779
- old_text: "const b = 2;",
780
- new_text: "const b = 20;",
781
- anchor: { start_line: 2, start_hash: "dead", end_line: 2, end_hash: "dead" },
782
- },
783
- ],
784
- }, { signal: new AbortController().signal, toolCallId: "anc-2" })).rejects.toThrow(/changed since you read it/);
785
- // File untouched.
786
- expect(await fs.readFile(filePath, "utf-8")).toBe(content);
787
- });
788
- it("partial-applies a multi-edit batch where one anchor is stale", async () => {
789
- const filePath = path.join(tmpDir, "c.ts");
790
- const content = "const a = 1;\nconst b = 2;\nconst c = 3;\n";
791
- await fs.writeFile(filePath, content);
792
- const tracker = new Map();
793
- await markRead(tracker, filePath);
794
- const a = anchorFor(content, 1);
795
- const tool = createEditTool(tmpDir, tracker);
796
- const result = await tool.execute({
797
- file_path: "c.ts",
798
- edits: [
799
- {
800
- old_text: "const a = 1;",
801
- new_text: "const a = 10;",
802
- anchor: { start_line: a.line, start_hash: a.hash, end_line: a.line, end_hash: a.hash },
803
- },
804
- {
805
- old_text: "const c = 3;",
806
- new_text: "const c = 30;",
807
- anchor: { start_line: 3, start_hash: "dead", end_line: 3, end_hash: "dead" },
808
- },
809
- ],
810
- }, { signal: new AbortController().signal, toolCallId: "anc-3" });
811
- const content2 = contentOf(result);
812
- expect(content2).toContain("Applied 1 of 2 edits");
813
- expect(content2).toContain("changed since you read it");
814
- // First edit persisted; the stale one did not.
815
- expect(await fs.readFile(filePath, "utf-8")).toBe("const a = 10;\nconst b = 2;\nconst c = 3;\n");
816
- });
817
- it("absent anchor behaves exactly like today (fuzzy path)", async () => {
818
- const filePath = path.join(tmpDir, "d.ts");
819
- await fs.writeFile(filePath, "const a = 1;\n");
820
- const tracker = new Map();
821
- await markRead(tracker, filePath);
822
- const tool = createEditTool(tmpDir, tracker);
823
- const result = await tool.execute({ file_path: "d.ts", edits: [{ old_text: "const a = 1;", new_text: "const a = 2;" }] }, { signal: new AbortController().signal, toolCallId: "anc-4" });
824
- expect(diffOf(result)).toContain("+const a = 2;");
825
- expect(await fs.readFile(filePath, "utf-8")).toBe("const a = 2;\n");
826
- });
827
- // ── Span form { span, lines } ──
828
- function spanFor(content, startLine, endLine) {
829
- const lines = content.split("\n");
830
- return {
831
- start_line: startLine,
832
- start_hash: lineHash(lines[startLine - 1], startLine - 1),
833
- end_line: endLine,
834
- end_hash: lineHash(lines[endLine - 1], endLine - 1),
835
- };
836
- }
837
- it("span form replaces the pinned line range without old_text", async () => {
838
- const content = "const a = 1;\nconst b = 2;\nconst c = 3;\n";
839
- const filePath = path.join(tmpDir, "span1.ts");
840
- await fs.writeFile(filePath, content);
841
- const tool = createEditTool(tmpDir);
842
- const result = await tool.execute({
843
- file_path: "span1.ts",
844
- edits: [{ span: spanFor(content, 2, 2), lines: ["const b = 20;"] }],
845
- }, { signal: new AbortController().signal, toolCallId: "span-1" });
846
- expect(diffOf(result)).toContain("+const b = 20;");
847
- expect(await fs.readFile(filePath, "utf-8")).toBe("const a = 1;\nconst b = 20;\nconst c = 3;\n");
848
- });
849
- it("span form: multi-line replace, insert-by-expansion, and delete via empty lines", async () => {
850
- const content = "one\ntwo\nthree\nfour\nfive\n";
851
- const filePath = path.join(tmpDir, "span2.txt");
852
- await fs.writeFile(filePath, content);
853
- const tool = createEditTool(tmpDir);
854
- await tool.execute({
855
- file_path: "span2.txt",
856
- edits: [
857
- // Replace lines 2-3 with three lines (expansion = insertion).
858
- { span: spanFor(content, 2, 3), lines: ["TWO", "TWO.5", "THREE"] },
859
- // Delete line 5 ("five"). Anchors verify against the file AS READ,
860
- // and spans apply bottom-up, so the earlier expansion doesn't shift this.
861
- { span: spanFor(content, 5, 5), lines: [] },
862
- ],
863
- }, { signal: new AbortController().signal, toolCallId: "span-2" });
864
- // Deleting line 5 ("five") leaves the trailing newline's empty segment as EOF.
865
- expect(await fs.readFile(filePath, "utf-8")).toBe("one\nTWO\nTWO.5\nTHREE\nfour\n");
866
- });
867
- it("span form rejects stale hashes without touching the file", async () => {
868
- const content = "alpha\nbeta\n";
869
- const filePath = path.join(tmpDir, "span3.txt");
870
- await fs.writeFile(filePath, content);
871
- const tool = createEditTool(tmpDir);
872
- await expect(tool.execute({
873
- file_path: "span3.txt",
874
- edits: [
875
- {
876
- span: { start_line: 1, start_hash: "dead", end_line: 1, end_hash: "dead" },
877
- lines: ["hijacked"],
878
- },
879
- ],
880
- }, { signal: new AbortController().signal, toolCallId: "span-3" })).rejects.toThrow(/changed since you read it/);
881
- expect(await fs.readFile(filePath, "utf-8")).toBe(content);
882
- });
883
- it("span form rejects overlapping spans (first wins, overlap reported)", async () => {
884
- const content = "l1\nl2\nl3\nl4\n";
885
- const filePath = path.join(tmpDir, "span4.txt");
886
- await fs.writeFile(filePath, content);
887
- const tool = createEditTool(tmpDir);
888
- const result = await tool.execute({
889
- file_path: "span4.txt",
890
- edits: [
891
- { span: spanFor(content, 1, 2), lines: ["A"] },
892
- { span: spanFor(content, 2, 3), lines: ["B"] },
893
- ],
894
- }, { signal: new AbortController().signal, toolCallId: "span-4" });
895
- expect(contentOf(result)).toContain("overlaps");
896
- expect(await fs.readFile(filePath, "utf-8")).toBe("A\nl3\nl4\n");
897
- });
898
- it("span and text forms mix in one batch: spans first, then text on the result", async () => {
899
- const content = "const x = 1;\nconst y = 2;\n";
900
- const filePath = path.join(tmpDir, "span5.ts");
901
- await fs.writeFile(filePath, content);
902
- const tool = createEditTool(tmpDir);
903
- await tool.execute({
904
- file_path: "span5.ts",
905
- edits: [
906
- { span: spanFor(content, 1, 1), lines: ["const x = 10;"] },
907
- { old_text: "const y = 2;", new_text: "const y = 20;" },
908
- ],
909
- }, { signal: new AbortController().signal, toolCallId: "span-5" });
910
- expect(await fs.readFile(filePath, "utf-8")).toBe("const x = 10;\nconst y = 20;\n");
911
- });
912
- it("rejects an edit that mixes span with old_text, and one with neither form", async () => {
913
- const content = "a\nb\n";
914
- const filePath = path.join(tmpDir, "span6.txt");
915
- await fs.writeFile(filePath, content);
916
- const tool = createEditTool(tmpDir);
917
- await expect(tool.execute({
918
- file_path: "span6.txt",
919
- edits: [{ span: spanFor(content, 1, 1), lines: ["z"], old_text: "a", new_text: "z" }],
920
- }, { signal: new AbortController().signal, toolCallId: "span-6" })).rejects.toThrow(/must not mix/);
921
- await expect(tool.execute({ file_path: "span6.txt", edits: [{}] }, { signal: new AbortController().signal, toolCallId: "span-7" })).rejects.toThrow(/has neither/);
922
- expect(await fs.readFile(filePath, "utf-8")).toBe(content);
923
- });
924
- it("blocks edits outside the workspace with the guard error", async () => {
925
- const tool = createEditTool(tmpDir);
926
- const outside = path.join(os.homedir(), "Documents", "ez-guard-test-outside.txt");
927
- const raw = await tool.execute({ file_path: outside, edits: [{ old_text: "a", new_text: "b" }] }, { signal: new AbortController().signal, toolCallId: "guard-1" });
928
- expect(contentOf(raw)).toContain("outside the workspace");
929
- expect(contentOf(raw)).toContain("allowOutsideWorkspaceWrites");
930
- });
931
- });
932
- function contentOf(result) {
933
- if (typeof result === "string")
934
- return result;
935
- if (result && typeof result === "object" && "content" in result) {
936
- return result.content ?? "";
937
- }
938
- return "";
939
- }
940
- //# sourceMappingURL=edit.test.js.map