mindweave 0.0.1 → 2.1.2

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 (481) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +171 -14
  3. package/dist/alternator/chassis/cache.js +47 -0
  4. package/dist/alternator/chassis/cache.js.map +1 -0
  5. package/dist/alternator/chassis/domRefs.js +53 -0
  6. package/dist/alternator/chassis/domRefs.js.map +1 -0
  7. package/dist/alternator/chassis/extractWorker.js +65 -0
  8. package/dist/alternator/chassis/extractWorker.js.map +1 -0
  9. package/dist/alternator/chassis/graph.js +221 -0
  10. package/dist/alternator/chassis/graph.js.map +1 -0
  11. package/dist/alternator/chassis/index.js +463 -0
  12. package/dist/alternator/chassis/index.js.map +1 -0
  13. package/dist/alternator/chassis/isolation.js +336 -0
  14. package/dist/alternator/chassis/isolation.js.map +1 -0
  15. package/dist/alternator/chassis/langCases.js +69 -0
  16. package/dist/alternator/chassis/langCases.js.map +1 -0
  17. package/dist/alternator/chassis/lsp.js +469 -0
  18. package/dist/alternator/chassis/lsp.js.map +1 -0
  19. package/dist/alternator/chassis/markup.js +262 -0
  20. package/dist/alternator/chassis/markup.js.map +1 -0
  21. package/dist/alternator/chassis/provision.js +198 -0
  22. package/dist/alternator/chassis/provision.js.map +1 -0
  23. package/dist/alternator/chassis/rank.js +72 -0
  24. package/dist/alternator/chassis/rank.js.map +1 -0
  25. package/dist/alternator/chassis/servers.js +215 -0
  26. package/dist/alternator/chassis/servers.js.map +1 -0
  27. package/dist/alternator/chassis/treesitter.js +608 -0
  28. package/dist/alternator/chassis/treesitter.js.map +1 -0
  29. package/dist/alternator/chassis/types.js +24 -0
  30. package/dist/alternator/chassis/types.js.map +1 -0
  31. package/dist/alternator/lane.js +67 -0
  32. package/dist/alternator/lane.js.map +1 -0
  33. package/dist/cli/App.js +2586 -0
  34. package/dist/cli/App.js.map +1 -0
  35. package/dist/cli/altScreen.js +67 -0
  36. package/dist/cli/altScreen.js.map +1 -0
  37. package/dist/cli/approvalChannel.js +72 -0
  38. package/dist/cli/approvalChannel.js.map +1 -0
  39. package/dist/cli/attachments.js +188 -0
  40. package/dist/cli/attachments.js.map +1 -0
  41. package/dist/cli/bootstrap.js +279 -0
  42. package/dist/cli/bootstrap.js.map +1 -0
  43. package/dist/cli/chatAnchor.js +94 -0
  44. package/dist/cli/chatAnchor.js.map +1 -0
  45. package/dist/cli/commandArgs.js +79 -0
  46. package/dist/cli/commandArgs.js.map +1 -0
  47. package/dist/cli/commandRoute.js +78 -0
  48. package/dist/cli/commandRoute.js.map +1 -0
  49. package/dist/cli/compaction.js +69 -0
  50. package/dist/cli/compaction.js.map +1 -0
  51. package/dist/cli/components/ApprovalBox.js +100 -0
  52. package/dist/cli/components/ApprovalBox.js.map +1 -0
  53. package/dist/cli/components/BlockView.js +128 -0
  54. package/dist/cli/components/BlockView.js.map +1 -0
  55. package/dist/cli/components/FirstRunFrame.js +41 -0
  56. package/dist/cli/components/FirstRunFrame.js.map +1 -0
  57. package/dist/cli/components/KeyManager.js +197 -0
  58. package/dist/cli/components/KeyManager.js.map +1 -0
  59. package/dist/cli/components/KeySetup.js +125 -0
  60. package/dist/cli/components/KeySetup.js.map +1 -0
  61. package/dist/cli/components/MenuFrame.js +24 -0
  62. package/dist/cli/components/MenuFrame.js.map +1 -0
  63. package/dist/cli/components/Picker.js +82 -0
  64. package/dist/cli/components/Picker.js.map +1 -0
  65. package/dist/cli/components/PromptInput.js +509 -0
  66. package/dist/cli/components/PromptInput.js.map +1 -0
  67. package/dist/cli/components/SubagentView.js +86 -0
  68. package/dist/cli/components/SubagentView.js.map +1 -0
  69. package/dist/cli/components/ToolGroup.js +60 -0
  70. package/dist/cli/components/ToolGroup.js.map +1 -0
  71. package/dist/cli/components/ToolLine.js +123 -0
  72. package/dist/cli/components/ToolLine.js.map +1 -0
  73. package/dist/cli/components/TrustGate.js +37 -0
  74. package/dist/cli/components/TrustGate.js.map +1 -0
  75. package/dist/cli/costView.js +40 -0
  76. package/dist/cli/costView.js.map +1 -0
  77. package/dist/cli/frameRate.js +30 -0
  78. package/dist/cli/frameRate.js.map +1 -0
  79. package/dist/cli/framebuffer/paint.js +165 -0
  80. package/dist/cli/framebuffer/paint.js.map +1 -0
  81. package/dist/cli/framebuffer/parse.js +266 -0
  82. package/dist/cli/framebuffer/parse.js.map +1 -0
  83. package/dist/cli/framebuffer/screen.js +196 -0
  84. package/dist/cli/framebuffer/screen.js.map +1 -0
  85. package/dist/cli/framebuffer/writer.js +139 -0
  86. package/dist/cli/framebuffer/writer.js.map +1 -0
  87. package/dist/cli/groupReveal.js +51 -0
  88. package/dist/cli/groupReveal.js.map +1 -0
  89. package/dist/cli/help.js +55 -0
  90. package/dist/cli/help.js.map +1 -0
  91. package/dist/cli/inputView.js +105 -0
  92. package/dist/cli/inputView.js.map +1 -0
  93. package/dist/cli/keyManager.js +65 -0
  94. package/dist/cli/keyManager.js.map +1 -0
  95. package/dist/cli/keySetup.js +35 -0
  96. package/dist/cli/keySetup.js.map +1 -0
  97. package/dist/cli/keyStore.js +73 -0
  98. package/dist/cli/keyStore.js.map +1 -0
  99. package/dist/cli/markdown.js +460 -0
  100. package/dist/cli/markdown.js.map +1 -0
  101. package/dist/cli/messageQueue.js +96 -0
  102. package/dist/cli/messageQueue.js.map +1 -0
  103. package/dist/cli/modes.js +90 -0
  104. package/dist/cli/modes.js.map +1 -0
  105. package/dist/cli/mouse.js +78 -0
  106. package/dist/cli/mouse.js.map +1 -0
  107. package/dist/cli/pasteAssembler.js +44 -0
  108. package/dist/cli/pasteAssembler.js.map +1 -0
  109. package/dist/cli/pathComplete.js +39 -0
  110. package/dist/cli/pathComplete.js.map +1 -0
  111. package/dist/cli/perfLog.js +90 -0
  112. package/dist/cli/perfLog.js.map +1 -0
  113. package/dist/cli/reveal.js +32 -0
  114. package/dist/cli/reveal.js.map +1 -0
  115. package/dist/cli/revealPace.js +59 -0
  116. package/dist/cli/revealPace.js.map +1 -0
  117. package/dist/cli/sessionCarry.js +19 -0
  118. package/dist/cli/sessionCarry.js.map +1 -0
  119. package/dist/cli/smoothScroll.js +74 -0
  120. package/dist/cli/smoothScroll.js.map +1 -0
  121. package/dist/cli/startupArgs.js +96 -0
  122. package/dist/cli/startupArgs.js.map +1 -0
  123. package/dist/cli/terminalRestore.js +34 -0
  124. package/dist/cli/terminalRestore.js.map +1 -0
  125. package/dist/cli/toolDisplay.js +219 -0
  126. package/dist/cli/toolDisplay.js.map +1 -0
  127. package/dist/cli/toolItems.js +65 -0
  128. package/dist/cli/toolItems.js.map +1 -0
  129. package/dist/cli/transcript.js +351 -0
  130. package/dist/cli/transcript.js.map +1 -0
  131. package/dist/cli/trust.js +79 -0
  132. package/dist/cli/trust.js.map +1 -0
  133. package/dist/cli/updateCheck.js +107 -0
  134. package/dist/cli/updateCheck.js.map +1 -0
  135. package/dist/cli/version.js +39 -0
  136. package/dist/cli/version.js.map +1 -0
  137. package/dist/cli/viewport.js +179 -0
  138. package/dist/cli/viewport.js.map +1 -0
  139. package/dist/cli/virtualWindow.js +103 -0
  140. package/dist/cli/virtualWindow.js.map +1 -0
  141. package/dist/cli/workingVerb.js +37 -0
  142. package/dist/cli/workingVerb.js.map +1 -0
  143. package/dist/cli/wrap.js +145 -0
  144. package/dist/cli/wrap.js.map +1 -0
  145. package/dist/drivers/anthropic/cachePoints.js +77 -0
  146. package/dist/drivers/anthropic/cachePoints.js.map +1 -0
  147. package/dist/drivers/anthropic/client.js +432 -0
  148. package/dist/drivers/anthropic/client.js.map +1 -0
  149. package/dist/drivers/anthropic/index.js +10 -0
  150. package/dist/drivers/anthropic/index.js.map +1 -0
  151. package/dist/drivers/anthropic/manifest.js +221 -0
  152. package/dist/drivers/anthropic/manifest.js.map +1 -0
  153. package/dist/drivers/cerebras/client.js +69 -0
  154. package/dist/drivers/cerebras/client.js.map +1 -0
  155. package/dist/drivers/cerebras/index.js +5 -0
  156. package/dist/drivers/cerebras/index.js.map +1 -0
  157. package/dist/drivers/cerebras/manifest.js +140 -0
  158. package/dist/drivers/cerebras/manifest.js.map +1 -0
  159. package/dist/drivers/clientId.js +41 -0
  160. package/dist/drivers/clientId.js.map +1 -0
  161. package/dist/drivers/contextOverflow.js +77 -0
  162. package/dist/drivers/contextOverflow.js.map +1 -0
  163. package/dist/drivers/deepseek/client.js +168 -0
  164. package/dist/drivers/deepseek/client.js.map +1 -0
  165. package/dist/drivers/deepseek/index.js +16 -0
  166. package/dist/drivers/deepseek/index.js.map +1 -0
  167. package/dist/drivers/deepseek/inlineTools.js +46 -0
  168. package/dist/drivers/deepseek/inlineTools.js.map +1 -0
  169. package/dist/drivers/deepseek/manifest.js +166 -0
  170. package/dist/drivers/deepseek/manifest.js.map +1 -0
  171. package/dist/drivers/gemini/client.js +38 -0
  172. package/dist/drivers/gemini/client.js.map +1 -0
  173. package/dist/drivers/gemini/index.js +5 -0
  174. package/dist/drivers/gemini/index.js.map +1 -0
  175. package/dist/drivers/gemini/manifest.js +150 -0
  176. package/dist/drivers/gemini/manifest.js.map +1 -0
  177. package/dist/drivers/glm/client.js +90 -0
  178. package/dist/drivers/glm/client.js.map +1 -0
  179. package/dist/drivers/glm/index.js +9 -0
  180. package/dist/drivers/glm/index.js.map +1 -0
  181. package/dist/drivers/glm/manifest.js +183 -0
  182. package/dist/drivers/glm/manifest.js.map +1 -0
  183. package/dist/drivers/groq/client.js +80 -0
  184. package/dist/drivers/groq/client.js.map +1 -0
  185. package/dist/drivers/groq/index.js +5 -0
  186. package/dist/drivers/groq/index.js.map +1 -0
  187. package/dist/drivers/groq/manifest.js +160 -0
  188. package/dist/drivers/groq/manifest.js.map +1 -0
  189. package/dist/drivers/kimi/client.js +82 -0
  190. package/dist/drivers/kimi/client.js.map +1 -0
  191. package/dist/drivers/kimi/index.js +9 -0
  192. package/dist/drivers/kimi/index.js.map +1 -0
  193. package/dist/drivers/kimi/manifest.js +168 -0
  194. package/dist/drivers/kimi/manifest.js.map +1 -0
  195. package/dist/drivers/meta/client.js +30 -0
  196. package/dist/drivers/meta/client.js.map +1 -0
  197. package/dist/drivers/meta/index.js +5 -0
  198. package/dist/drivers/meta/index.js.map +1 -0
  199. package/dist/drivers/meta/manifest.js +101 -0
  200. package/dist/drivers/meta/manifest.js.map +1 -0
  201. package/dist/drivers/minimax/client.js +36 -0
  202. package/dist/drivers/minimax/client.js.map +1 -0
  203. package/dist/drivers/minimax/index.js +5 -0
  204. package/dist/drivers/minimax/index.js.map +1 -0
  205. package/dist/drivers/minimax/manifest.js +120 -0
  206. package/dist/drivers/minimax/manifest.js.map +1 -0
  207. package/dist/drivers/mistral/client.js +54 -0
  208. package/dist/drivers/mistral/client.js.map +1 -0
  209. package/dist/drivers/mistral/index.js +5 -0
  210. package/dist/drivers/mistral/index.js.map +1 -0
  211. package/dist/drivers/mistral/manifest.js +118 -0
  212. package/dist/drivers/mistral/manifest.js.map +1 -0
  213. package/dist/drivers/openai/client.js +290 -0
  214. package/dist/drivers/openai/client.js.map +1 -0
  215. package/dist/drivers/openai/index.js +9 -0
  216. package/dist/drivers/openai/index.js.map +1 -0
  217. package/dist/drivers/openai/manifest.js +133 -0
  218. package/dist/drivers/openai/manifest.js.map +1 -0
  219. package/dist/drivers/openaiCompat/wire.js +493 -0
  220. package/dist/drivers/openaiCompat/wire.js.map +1 -0
  221. package/dist/drivers/partialTurn.js +23 -0
  222. package/dist/drivers/partialTurn.js.map +1 -0
  223. package/dist/drivers/providerError.js +181 -0
  224. package/dist/drivers/providerError.js.map +1 -0
  225. package/dist/drivers/qwen/client.js +93 -0
  226. package/dist/drivers/qwen/client.js.map +1 -0
  227. package/dist/drivers/qwen/index.js +9 -0
  228. package/dist/drivers/qwen/index.js.map +1 -0
  229. package/dist/drivers/qwen/manifest.js +146 -0
  230. package/dist/drivers/qwen/manifest.js.map +1 -0
  231. package/dist/drivers/registry.js +177 -0
  232. package/dist/drivers/registry.js.map +1 -0
  233. package/dist/drivers/retryPolicy.js +129 -0
  234. package/dist/drivers/retryPolicy.js.map +1 -0
  235. package/dist/drivers/searchBlocks.js +61 -0
  236. package/dist/drivers/searchBlocks.js.map +1 -0
  237. package/dist/drivers/types.js +2 -0
  238. package/dist/drivers/types.js.map +1 -0
  239. package/dist/drivers/xai/client.js +63 -0
  240. package/dist/drivers/xai/client.js.map +1 -0
  241. package/dist/drivers/xai/index.js +5 -0
  242. package/dist/drivers/xai/index.js.map +1 -0
  243. package/dist/drivers/xai/manifest.js +137 -0
  244. package/dist/drivers/xai/manifest.js.map +1 -0
  245. package/dist/dynamo/_probe.tmp.js +20 -0
  246. package/dist/dynamo/_probe.tmp.js.map +1 -0
  247. package/dist/dynamo/cacheBreak.js +88 -0
  248. package/dist/dynamo/cacheBreak.js.map +1 -0
  249. package/dist/dynamo/contextWindow.js +243 -0
  250. package/dist/dynamo/contextWindow.js.map +1 -0
  251. package/dist/dynamo/engine.js +2011 -0
  252. package/dist/dynamo/engine.js.map +1 -0
  253. package/dist/dynamo/guard.js +132 -0
  254. package/dist/dynamo/guard.js.map +1 -0
  255. package/dist/dynamo/liveMeter.js +58 -0
  256. package/dist/dynamo/liveMeter.js.map +1 -0
  257. package/dist/dynamo/model.js +172 -0
  258. package/dist/dynamo/model.js.map +1 -0
  259. package/dist/dynamo/planArtifact.js +125 -0
  260. package/dist/dynamo/planArtifact.js.map +1 -0
  261. package/dist/dynamo/pricing.js +140 -0
  262. package/dist/dynamo/pricing.js.map +1 -0
  263. package/dist/dynamo/prompt.js +264 -0
  264. package/dist/dynamo/prompt.js.map +1 -0
  265. package/dist/dynamo/spend.js +45 -0
  266. package/dist/dynamo/spend.js.map +1 -0
  267. package/dist/dynamo/verify.js +483 -0
  268. package/dist/dynamo/verify.js.map +1 -0
  269. package/dist/governor/forbidden.js +181 -0
  270. package/dist/governor/forbidden.js.map +1 -0
  271. package/dist/governor/freshness.js +83 -0
  272. package/dist/governor/freshness.js.map +1 -0
  273. package/dist/governor/frontmatter.js +38 -0
  274. package/dist/governor/frontmatter.js.map +1 -0
  275. package/dist/governor/glob.js +75 -0
  276. package/dist/governor/glob.js.map +1 -0
  277. package/dist/governor/index.js +87 -0
  278. package/dist/governor/index.js.map +1 -0
  279. package/dist/governor/rules.js +80 -0
  280. package/dist/governor/rules.js.map +1 -0
  281. package/dist/governor/scope.js +91 -0
  282. package/dist/governor/scope.js.map +1 -0
  283. package/dist/governor/skills.js +176 -0
  284. package/dist/governor/skills.js.map +1 -0
  285. package/dist/governor/types.js +16 -0
  286. package/dist/governor/types.js.map +1 -0
  287. package/dist/governor/write.js +182 -0
  288. package/dist/governor/write.js.map +1 -0
  289. package/dist/index.js +89 -0
  290. package/dist/index.js.map +1 -0
  291. package/dist/mcp/catalog.js +232 -0
  292. package/dist/mcp/catalog.js.map +1 -0
  293. package/dist/mcp/config.js +116 -0
  294. package/dist/mcp/config.js.map +1 -0
  295. package/dist/mcp/configWrite.js +254 -0
  296. package/dist/mcp/configWrite.js.map +1 -0
  297. package/dist/mcp/connection.js +504 -0
  298. package/dist/mcp/connection.js.map +1 -0
  299. package/dist/mcp/deferred.js +104 -0
  300. package/dist/mcp/deferred.js.map +1 -0
  301. package/dist/mcp/discover.js +128 -0
  302. package/dist/mcp/discover.js.map +1 -0
  303. package/dist/mcp/manager.js +679 -0
  304. package/dist/mcp/manager.js.map +1 -0
  305. package/dist/mcp/paramHeaders.js +163 -0
  306. package/dist/mcp/paramHeaders.js.map +1 -0
  307. package/dist/mcp/prompts.js +136 -0
  308. package/dist/mcp/prompts.js.map +1 -0
  309. package/dist/mcp/protocol.js +171 -0
  310. package/dist/mcp/protocol.js.map +1 -0
  311. package/dist/mcp/resources.js +119 -0
  312. package/dist/mcp/resources.js.map +1 -0
  313. package/dist/mcp/resultStore.js +180 -0
  314. package/dist/mcp/resultStore.js.map +1 -0
  315. package/dist/mcp/subscriptions.js +74 -0
  316. package/dist/mcp/subscriptions.js.map +1 -0
  317. package/dist/mcp/transport/headerValue.js +40 -0
  318. package/dist/mcp/transport/headerValue.js.map +1 -0
  319. package/dist/mcp/transport/http.js +321 -0
  320. package/dist/mcp/transport/http.js.map +1 -0
  321. package/dist/mcp/transport/stdio.js +234 -0
  322. package/dist/mcp/transport/stdio.js.map +1 -0
  323. package/dist/mcp/transport/types.js +27 -0
  324. package/dist/mcp/transport/types.js.map +1 -0
  325. package/dist/mcp/trust.js +98 -0
  326. package/dist/mcp/trust.js.map +1 -0
  327. package/dist/mcp/trustStore.js +55 -0
  328. package/dist/mcp/trustStore.js.map +1 -0
  329. package/dist/memory/autoMemory.js +340 -0
  330. package/dist/memory/autoMemory.js.map +1 -0
  331. package/dist/memory/compaction.js +513 -0
  332. package/dist/memory/compaction.js.map +1 -0
  333. package/dist/memory/images.js +173 -0
  334. package/dist/memory/images.js.map +1 -0
  335. package/dist/memory/presence.js +59 -0
  336. package/dist/memory/presence.js.map +1 -0
  337. package/dist/memory/projectNotes.js +247 -0
  338. package/dist/memory/projectNotes.js.map +1 -0
  339. package/dist/memory/restore.js +72 -0
  340. package/dist/memory/restore.js.map +1 -0
  341. package/dist/memory/session.js +472 -0
  342. package/dist/memory/session.js.map +1 -0
  343. package/dist/memory/sessionMemory.js +142 -0
  344. package/dist/memory/sessionMemory.js.map +1 -0
  345. package/dist/memory/sessionMemoryCompact.js +136 -0
  346. package/dist/memory/sessionMemoryCompact.js.map +1 -0
  347. package/dist/memory/store.js +217 -0
  348. package/dist/memory/store.js.map +1 -0
  349. package/dist/memory/types.js +14 -0
  350. package/dist/memory/types.js.map +1 -0
  351. package/dist/memory/workingSet.js +383 -0
  352. package/dist/memory/workingSet.js.map +1 -0
  353. package/dist/project/context.js +425 -0
  354. package/dist/project/context.js.map +1 -0
  355. package/dist/tools/approval.js +189 -0
  356. package/dist/tools/approval.js.map +1 -0
  357. package/dist/tools/askUser.js +103 -0
  358. package/dist/tools/askUser.js.map +1 -0
  359. package/dist/tools/atomicWrite.js +151 -0
  360. package/dist/tools/atomicWrite.js.map +1 -0
  361. package/dist/tools/backgroundShells.js +468 -0
  362. package/dist/tools/backgroundShells.js.map +1 -0
  363. package/dist/tools/captureSweep.js +77 -0
  364. package/dist/tools/captureSweep.js.map +1 -0
  365. package/dist/tools/chassisMux.js +92 -0
  366. package/dist/tools/chassisMux.js.map +1 -0
  367. package/dist/tools/checkpoints.js +328 -0
  368. package/dist/tools/checkpoints.js.map +1 -0
  369. package/dist/tools/codeIntel.js +267 -0
  370. package/dist/tools/codeIntel.js.map +1 -0
  371. package/dist/tools/deferredNative.js +121 -0
  372. package/dist/tools/deferredNative.js.map +1 -0
  373. package/dist/tools/detail.js +135 -0
  374. package/dist/tools/detail.js.map +1 -0
  375. package/dist/tools/diagnostics.js +174 -0
  376. package/dist/tools/diagnostics.js.map +1 -0
  377. package/dist/tools/edit.js +167 -0
  378. package/dist/tools/edit.js.map +1 -0
  379. package/dist/tools/editCore.js +283 -0
  380. package/dist/tools/editCore.js.map +1 -0
  381. package/dist/tools/editFile.js +183 -0
  382. package/dist/tools/editFile.js.map +1 -0
  383. package/dist/tools/editRipple.js +126 -0
  384. package/dist/tools/editRipple.js.map +1 -0
  385. package/dist/tools/editTarget.js +131 -0
  386. package/dist/tools/editTarget.js.map +1 -0
  387. package/dist/tools/editWindow.js +49 -0
  388. package/dist/tools/editWindow.js.map +1 -0
  389. package/dist/tools/eol.js +56 -0
  390. package/dist/tools/eol.js.map +1 -0
  391. package/dist/tools/exitPlan.js +175 -0
  392. package/dist/tools/exitPlan.js.map +1 -0
  393. package/dist/tools/focus.js +42 -0
  394. package/dist/tools/focus.js.map +1 -0
  395. package/dist/tools/gitignore.js +148 -0
  396. package/dist/tools/gitignore.js.map +1 -0
  397. package/dist/tools/glob.js +134 -0
  398. package/dist/tools/glob.js.map +1 -0
  399. package/dist/tools/governorTools.js +258 -0
  400. package/dist/tools/governorTools.js.map +1 -0
  401. package/dist/tools/grep.js +450 -0
  402. package/dist/tools/grep.js.map +1 -0
  403. package/dist/tools/guard.js +220 -0
  404. package/dist/tools/guard.js.map +1 -0
  405. package/dist/tools/killTree.js +215 -0
  406. package/dist/tools/killTree.js.map +1 -0
  407. package/dist/tools/listDir.js +143 -0
  408. package/dist/tools/listDir.js.map +1 -0
  409. package/dist/tools/mcpAdd.js +176 -0
  410. package/dist/tools/mcpAdd.js.map +1 -0
  411. package/dist/tools/mcpResources.js +116 -0
  412. package/dist/tools/mcpResources.js.map +1 -0
  413. package/dist/tools/mcpSearch.js +123 -0
  414. package/dist/tools/mcpSearch.js.map +1 -0
  415. package/dist/tools/multiEdit.js +168 -0
  416. package/dist/tools/multiEdit.js.map +1 -0
  417. package/dist/tools/paths.js +225 -0
  418. package/dist/tools/paths.js.map +1 -0
  419. package/dist/tools/posixShell.js +123 -0
  420. package/dist/tools/posixShell.js.map +1 -0
  421. package/dist/tools/readFile.js +371 -0
  422. package/dist/tools/readFile.js.map +1 -0
  423. package/dist/tools/readSymbol.js +145 -0
  424. package/dist/tools/readSymbol.js.map +1 -0
  425. package/dist/tools/registry.js +120 -0
  426. package/dist/tools/registry.js.map +1 -0
  427. package/dist/tools/replaceSymbol.js +141 -0
  428. package/dist/tools/replaceSymbol.js.map +1 -0
  429. package/dist/tools/results.js +15 -0
  430. package/dist/tools/results.js.map +1 -0
  431. package/dist/tools/ripgrep.js +145 -0
  432. package/dist/tools/ripgrep.js.map +1 -0
  433. package/dist/tools/runCommand.js +633 -0
  434. package/dist/tools/runCommand.js.map +1 -0
  435. package/dist/tools/saveMemory.js +102 -0
  436. package/dist/tools/saveMemory.js.map +1 -0
  437. package/dist/tools/screenshot.js +200 -0
  438. package/dist/tools/screenshot.js.map +1 -0
  439. package/dist/tools/screenshotWin.js +227 -0
  440. package/dist/tools/screenshotWin.js.map +1 -0
  441. package/dist/tools/search.js +121 -0
  442. package/dist/tools/search.js.map +1 -0
  443. package/dist/tools/sessionTools.js +187 -0
  444. package/dist/tools/sessionTools.js.map +1 -0
  445. package/dist/tools/shellCheckpoint.js +123 -0
  446. package/dist/tools/shellCheckpoint.js.map +1 -0
  447. package/dist/tools/shellLint.js +102 -0
  448. package/dist/tools/shellLint.js.map +1 -0
  449. package/dist/tools/shellTools.js +203 -0
  450. package/dist/tools/shellTools.js.map +1 -0
  451. package/dist/tools/spanCore.js +78 -0
  452. package/dist/tools/spanCore.js.map +1 -0
  453. package/dist/tools/subagent.js +224 -0
  454. package/dist/tools/subagent.js.map +1 -0
  455. package/dist/tools/subagentReport.js +114 -0
  456. package/dist/tools/subagentReport.js.map +1 -0
  457. package/dist/tools/tempSweep.js +118 -0
  458. package/dist/tools/tempSweep.js.map +1 -0
  459. package/dist/tools/todo.js +117 -0
  460. package/dist/tools/todo.js.map +1 -0
  461. package/dist/tools/types.js +2 -0
  462. package/dist/tools/types.js.map +1 -0
  463. package/dist/tools/untrusted.js +46 -0
  464. package/dist/tools/untrusted.js.map +1 -0
  465. package/dist/tools/useSkill.js +62 -0
  466. package/dist/tools/useSkill.js.map +1 -0
  467. package/dist/tools/walk.js +152 -0
  468. package/dist/tools/walk.js.map +1 -0
  469. package/dist/tools/web.js +61 -0
  470. package/dist/tools/web.js.map +1 -0
  471. package/dist/tools/webFetch.js +444 -0
  472. package/dist/tools/webFetch.js.map +1 -0
  473. package/dist/tools/webSearch.js +130 -0
  474. package/dist/tools/webSearch.js.map +1 -0
  475. package/dist/tools/workspace.js +212 -0
  476. package/dist/tools/workspace.js.map +1 -0
  477. package/dist/tools/workspaceDiscover.js +216 -0
  478. package/dist/tools/workspaceDiscover.js.map +1 -0
  479. package/dist/tools/writeFile.js +162 -0
  480. package/dist/tools/writeFile.js.map +1 -0
  481. package/package.json +74 -28
@@ -0,0 +1,121 @@
1
+ import { screenshot } from "./screenshot.js";
2
+ import { saveMemoryTool } from "./saveMemory.js";
3
+ import { governor, createSkill } from "./governorTools.js";
4
+ import { sessionsTool } from "./sessionTools.js";
5
+ import { mcpResourceTool } from "./mcpResources.js";
6
+ import { workspaceTool } from "./workspace.js";
7
+ import { todoWrite } from "./todo.js";
8
+ import { askUserTool } from "./askUser.js";
9
+ import { outlineTool, definitionTool, referencesTool } from "./codeIntel.js";
10
+ import { web } from "./web.js";
11
+ import { replaceSymbolBody } from "./replaceSymbol.js";
12
+ import { spawnSubagent } from "./subagent.js";
13
+ import { addMcpServer } from "./mcpAdd.js";
14
+ /** The pool, in the order it is named to the model. */
15
+ export const DEFERRED_TOOLS = [
16
+ todoWrite,
17
+ askUserTool,
18
+ outlineTool,
19
+ definitionTool,
20
+ referencesTool,
21
+ spawnSubagent,
22
+ web,
23
+ replaceSymbolBody,
24
+ governor,
25
+ createSkill,
26
+ saveMemoryTool,
27
+ sessionsTool,
28
+ workspaceTool,
29
+ mcpResourceTool,
30
+ addMcpServer,
31
+ screenshot,
32
+ ];
33
+ /**
34
+ * The one line about the pool that goes in the system prompt.
35
+ *
36
+ * It exists so the model knows these capabilities are REACHABLE rather than absent.
37
+ * Without it a deferred tool is indistinguishable from a missing feature, and the model
38
+ * routes around something it actually has — which costs far more than the schemas ever
39
+ * did. Names only, no descriptions: enough to prompt a search, cheap enough that the
40
+ * trade is obviously worth it.
41
+ */
42
+ export function deferredToolsIndex() {
43
+ if (DEFERRED_TOOLS.length === 0)
44
+ return "";
45
+ return (`Some of your own tools are not listed above. Their names: ` +
46
+ `${DEFERRED_TOOLS.map((t) => t.name).join(", ")}. ` +
47
+ `Only the name is known until you fetch one — find_tools returns the full schema, and ` +
48
+ `from that moment the tool is callable exactly like the ones listed above. ` +
49
+ `When a task needs one, search for it rather than concluding you cannot do it.`);
50
+ }
51
+ /** Keep a hit only if it scores at least this share of the best hit. */
52
+ const RELEVANCE_FLOOR = 0.5;
53
+ /** Most tools one search hands over. Each one costs its full schema. */
54
+ const MAX_NATIVE_RESULTS = 5;
55
+ /**
56
+ * Render one deferred tool the way the advertised list renders it: name, description and
57
+ * the full JSON parameter schema.
58
+ *
59
+ * This is what makes deferral cache-safe. The schema is delivered in the SEARCH RESULT,
60
+ * which is an ordinary message appended to the conversation, rather than by adding the
61
+ * tool to the advertised `tools` array. An appended message leaves every earlier byte
62
+ * untouched, so the provider's cached prefix survives and the schema itself is cached
63
+ * from the next call onward. Mutating the array instead re-writes the prefix — tools,
64
+ * system and messages — at full price, which cost several times what the deferral saved.
65
+ *
66
+ * The model can call the tool from this alone: dispatch resolves against the registry,
67
+ * not against what was advertised, so a name and a schema is everything it needs.
68
+ */
69
+ export function renderToolSchema(tool) {
70
+ return `<function>${JSON.stringify({
71
+ name: tool.name,
72
+ description: tool.description,
73
+ parameters: tool.parameters,
74
+ })}</function>`;
75
+ }
76
+ /**
77
+ * Rank the pool against a search query (pure).
78
+ *
79
+ * Deliberately the same blunt keyword approach as the MCP ranker: the model queries
80
+ * with a capability word ("memory", "skill", "screenshot") or a tool name, not a
81
+ * sentence, so precision matters less than never returning nothing for a fair query.
82
+ */
83
+ export function matchDeferred(query) {
84
+ const terms = query.toLowerCase().trim().split(/[^a-z0-9]+/).filter(Boolean);
85
+ if (terms.length === 0)
86
+ return [];
87
+ const scored = DEFERRED_TOOLS.map((tool) => {
88
+ const name = tool.name.toLowerCase();
89
+ const description = tool.description.toLowerCase();
90
+ let score = 0;
91
+ for (const term of terms) {
92
+ if (name === term)
93
+ score += 20; // the model named the tool outright
94
+ else if (name.includes(term))
95
+ score += 10;
96
+ // A description hit is weak on its own: descriptions are long and mention a lot.
97
+ if (description.includes(term))
98
+ score += 2;
99
+ }
100
+ return { tool, score };
101
+ })
102
+ .filter((s) => s.score > 0)
103
+ // Ties break on name so identical searches return identical results.
104
+ .sort((a, b) => b.score - a.score || a.tool.name.localeCompare(b.tool.name));
105
+ // Cut the weak tail, RELATIVE to the best hit rather than at a fixed score.
106
+ //
107
+ // Every match is answered with the tool's full schema now, so a loose match is not a
108
+ // harmless extra line — it is a few hundred tokens the model did not ask for. Searching
109
+ // "session" used to return six tools, because the word appears in four other tools'
110
+ // descriptions in passing ("for the rest of this session") and a description mention
111
+ // scored enough to qualify.
112
+ //
113
+ // Relative, because the right floor depends on what was found. When something matched
114
+ // by NAME, a passing mention elsewhere is noise and should go. When the best anyone
115
+ // managed was a description hit, that same score is the real answer and must be kept —
116
+ // a fixed threshold would have to choose one of those cases and be wrong in the other.
117
+ const best = scored[0]?.score ?? 0;
118
+ const floor = Math.max(1, best * RELEVANCE_FLOOR);
119
+ return scored.filter((s) => s.score >= floor).slice(0, MAX_NATIVE_RESULTS).map((s) => s.tool);
120
+ }
121
+ //# sourceMappingURL=deferredNative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferredNative.js","sourceRoot":"","sources":["../../src/tools/deferredNative.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * detail.ts — display-only rich detail for mutating tools.
3
+ *
4
+ * Builds the multi-line block the UI shows under a tool row: a +/- diff for an
5
+ * edit, a preview of a freshly written file, or a command's output. This is
6
+ * `ToolResult.detail` — it never reaches the model (the model gets the terse
7
+ * `output`), it only makes the terminal show what actually happened —
8
+ * a diff or a command's stdout. Lines are prefixed so the
9
+ * renderer can colour them: `+ ` added (green), `- ` removed (red), bare = plain.
10
+ */
11
+ /** Cap a list of display lines, noting how many were hidden. */
12
+ export function capLines(lines, max) {
13
+ if (lines.length <= max)
14
+ return lines.join("\n");
15
+ const hidden = lines.length - max;
16
+ return [...lines.slice(0, max), ` … (${hidden} more line${hidden === 1 ? "" : "s"})`].join("\n");
17
+ }
18
+ // ── Scope helpers (pure) — the "what/where/how much" a change touched, so the row
19
+ // isn't just a diff with no sense of range or magnitude. Kept pure + tested.
20
+ /** Lines a replacement string spans (an empty string spans none). */
21
+ export function lineCount(s) {
22
+ return s === "" ? 0 : s.split("\n").length;
23
+ }
24
+ /** A line-range label: "L120" for one line, "L120-138" for a span. */
25
+ export function rangeLabel(startLine, endLine) {
26
+ return endLine > startLine ? `L${startLine}-${endLine}` : `L${startLine}`;
27
+ }
28
+ /** The change magnitude, "−6 +12" — a real minus sign (U+2212), never the diff's
29
+ * hyphen, so it can't be mistaken for a removed line. */
30
+ export function magnitude(removed, added) {
31
+ return `−${removed} +${added}`;
32
+ }
33
+ /** Prepend a dim scope header above a diff/preview (its own line, no +/- prefix so
34
+ * the renderer leaves it uncolored). Empty `body` → just the header. */
35
+ export function withScope(scope, body) {
36
+ return body ? `${scope}\n${body}` : scope;
37
+ }
38
+ /** A +/- diff for an edit: the replaced lines removed, the new lines added. */
39
+ export function editDetail(oldStr, newStr) {
40
+ const lines = [
41
+ ...stripTrailingNewline(oldStr).split("\n").map((l) => `- ${l}`),
42
+ ...stripTrailingNewline(newStr).split("\n").map((l) => `+ ${l}`),
43
+ ];
44
+ return capLines(lines, 30);
45
+ }
46
+ /** A stacked +/- diff for a sequence of edits (the edit tool), one block per edit. */
47
+ export function multiEditDetail(edits) {
48
+ const lines = [];
49
+ for (const e of edits) {
50
+ lines.push(...stripTrailingNewline(e.oldString).split("\n").map((l) => `- ${l}`));
51
+ lines.push(...stripTrailingNewline(e.newString).split("\n").map((l) => `+ ${l}`));
52
+ }
53
+ return capLines(lines, 30);
54
+ }
55
+ /** A preview of a newly created file — all additions. */
56
+ export function writeDetail(content) {
57
+ if (content === "")
58
+ return "";
59
+ return capLines(stripTrailingNewline(content).split("\n").map((l) => `+ ${l}`), 20);
60
+ }
61
+ const ESC = String.fromCharCode(27);
62
+ // SGR colour codes, plus the cursor/erase sequences a progress-printing command emits.
63
+ const ANSI_RE = new RegExp(`${ESC}\\[[0-9;?]*[a-zA-Z]|${ESC}\\][^${ESC}\\u0007]*(?:\\u0007|${ESC}\\\\)`, "g");
64
+ /**
65
+ * Strip ANSI escapes from captured text.
66
+ *
67
+ * A command's output is captured from a pipe, and plenty of programs colour their
68
+ * output anyway. Those bytes are meaningless in a display block that applies its own
69
+ * colour, and they corrupt width measurement — an escape sequence counts as visible
70
+ * characters when wrapping, so a coloured line wraps early and the block goes ragged.
71
+ */
72
+ export function stripAnsi(s) {
73
+ return s.replace(ANSI_RE, "");
74
+ }
75
+ /**
76
+ * Blank-line noise from a command's own formatting, collapsed.
77
+ *
78
+ * PowerShell's table output leads with a blank line, separates directory groups with
79
+ * two, and trails one. Reproduced verbatim in a display block those blanks are most of
80
+ * the block's height and carry nothing. Runs collapse to a single blank (which still
81
+ * separates the groups) and the leading/trailing ones go.
82
+ */
83
+ export function collapseBlanks(lines) {
84
+ const out = [];
85
+ for (const line of lines) {
86
+ if (line.trim() === "" && (out.length === 0 || out[out.length - 1].trim() === ""))
87
+ continue;
88
+ out.push(line);
89
+ }
90
+ while (out.length > 0 && out[out.length - 1].trim() === "")
91
+ out.pop();
92
+ return out;
93
+ }
94
+ /** A command's output for inline display (plain lines, no diff prefixes). */
95
+ export function outputDetail(body) {
96
+ if (!body)
97
+ return "";
98
+ return capLines(collapseBlanks(stripAnsi(body).split("\n")), 18);
99
+ }
100
+ /**
101
+ * A command's output with its outcome as the last line (pure).
102
+ *
103
+ * ✓ Exit code 0
104
+ * ✖ Exit code 1
105
+ * ✖ Timed out after 30s — killed
106
+ * ✖ Terminated by SIGTERM
107
+ *
108
+ * Shown for a SUCCESS too, not only a failure. A row that says nothing when a command
109
+ * passed and something when it failed makes the absence of a line the signal, and an
110
+ * absence is easy to read past — especially under a wall of build output. The reference
111
+ * design puts the exit code on every command for the same reason.
112
+ *
113
+ * `exitCode` is null when a process was ended by a signal and never reported one; that
114
+ * case is named by the signal instead, because reporting it as "exit 0" made a killed
115
+ * command read as a command that worked.
116
+ */
117
+ export function withOutcome(body, timedOut, exitCode, signal, timeoutMs, pid) {
118
+ const line = timedOut
119
+ ? `✖ Timed out after ${Math.round(timeoutMs / 1000)}s — killed`
120
+ : signal
121
+ ? `✖ Terminated by ${signal}`
122
+ : exitCode === null
123
+ ? "✖ Ended without an exit code"
124
+ : `${exitCode === 0 ? "✓" : "✖"} Exit code ${exitCode}`;
125
+ // Which process was killed, and by what. Only when something WAS killed: on an
126
+ // ordinary exit the pid is trivia, but after a timeout it is the thing the user needs
127
+ // in order to check whether it actually died or is still holding a port.
128
+ const killed = timedOut || signal !== null;
129
+ const detail = killed && pid !== undefined ? `\n Signal: ${signal ?? "SIGTERM"} sent to process (PID ${pid})` : "";
130
+ return (body ? `${body}\n${line}` : line) + detail;
131
+ }
132
+ function stripTrailingNewline(s) {
133
+ return s.endsWith("\n") ? s.slice(0, -1) : s;
134
+ }
135
+ //# sourceMappingURL=detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/tools/detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * diagnostics.ts — surface compiler/linter errors from the language servers.
3
+ *
4
+ * Mindweave already runs language servers (for def/ref); this reads their *diagnostics*
5
+ * — the type errors, syntax errors, and warnings they publish — so the model can
6
+ * check what it just wrote and fix it, instead of editing blind. Rather than running
7
+ * diagnostics automatically after every edit, here it's an explicit tool the model calls
8
+ * after changing code, plus prompt guidance to do so.
9
+ *
10
+ * Read-only: it only reads what the servers report. Degrade-safe: no server for the
11
+ * language (or none reported) → a clean "no diagnostics" result.
12
+ */
13
+ import { promises as fs } from "node:fs";
14
+ import { chassisForPath } from "./chassisMux.js";
15
+ import { relativize, resolvePath } from "./paths.js";
16
+ import { selectActiveFiles } from "../memory/workingSet.js";
17
+ /** When no path is given, check this many of the most-recently-touched files.
18
+ * Exported so the number quoted in the description is pinned to the real value. */
19
+ export const MAX_WORKING_SET = 3;
20
+ const MAX_SHOWN = 50;
21
+ /** Full caret context is built for at most this many diagnostics (errors first) —
22
+ * reading source lines and drawing a caret for all 50 shown would bury the ones
23
+ * that matter under a wall of low-value warnings. */
24
+ const MAX_CARETS = 5;
25
+ export const diagnosticsTool = {
26
+ name: "diagnostics",
27
+ readOnly: true,
28
+ // Written against the failure this tool is supposed to PREVENT: the model edits,
29
+ // asks for diagnostics, is told "no diagnostics", and moves on with broken code.
30
+ // Three things made that possible and none of them were in the text — the check is
31
+ // per-file so a broken CALLER is never seen, a clean answer is not proof (no server,
32
+ // a slow server, and an unreadable path all render identically), and the no-path
33
+ // form only reaches a few files.
34
+ description: "Report compiler and linter diagnostics (type errors, syntax errors, warnings) for " +
35
+ "a file, from its language server. It re-syncs the file from disk first, so it " +
36
+ "reflects what you actually just wrote, not a stale copy. Call it after editing " +
37
+ "code, and fix what it reports before moving on.\n" +
38
+ "SCOPE: it checks the FILES YOU NAME and nothing else. Diagnostics are per-file, " +
39
+ `so if you omit path it checks only the ${MAX_WORKING_SET} files you touched most ` +
40
+ "recently. A change that breaks code elsewhere — you renamed a symbol, changed a " +
41
+ "signature, altered an exported type — will NOT show up here, because the broken " +
42
+ "file is the CALLER. After that kind of edit, find the callers with `references` " +
43
+ "and check those paths too.\n" +
44
+ "A clean result is weaker evidence than it looks: you also get \"no diagnostics\" " +
45
+ "when no language server handles that file type, when the server is too slow to " +
46
+ "answer, and when the path does not exist or cannot be read. So it confirms " +
47
+ "problems, it does not prove their absence. Treat a clean answer on code you " +
48
+ "expected to be broken as a reason to check the path and verify another way " +
49
+ "(build it, run the tests) rather than as a passing grade.",
50
+ parameters: {
51
+ type: "object",
52
+ additionalProperties: false,
53
+ properties: {
54
+ path: {
55
+ type: "string",
56
+ description: "File to check. Omit to check the most recently read/edited files.",
57
+ },
58
+ },
59
+ },
60
+ async execute(args, ctx) {
61
+ const targets = pickTargets(ctx, typeof args.path === "string" ? args.path.trim() : "");
62
+ if (targets.length === 0) {
63
+ return { output: "No file to check — edit or read a file first, or pass a `path`.", summary: "no target" };
64
+ }
65
+ const results = await Promise.all(targets.map(async (abs) => {
66
+ const chassis = chassisForPath(ctx, abs);
67
+ const diags = chassis ? await chassis.diagnostics(abs) : [];
68
+ return { abs, diags };
69
+ }));
70
+ const all = [];
71
+ for (const r of results)
72
+ all.push(...r.diags);
73
+ if (all.length === 0) {
74
+ const label = targets.map((t) => relativize(ctx, t)).join(", ");
75
+ // Silent when it finds nothing. A model runs this in a burst right after editing,
76
+ // and a row per file saying "no diagnostics" is a wall of rows reporting the
77
+ // absence of news. The model still gets the answer; the user gets the screen back.
78
+ return { output: `No diagnostics for ${label}.`, summary: "no diagnostics", quiet: true };
79
+ }
80
+ const output = formatDiagnostics(all.map((d) => ({ ...d, file: relativize(ctx, d.file) })));
81
+ const errors = all.filter((d) => d.severity === "error").length;
82
+ const warnings = all.filter((d) => d.severity === "warning").length;
83
+ return {
84
+ output,
85
+ summary: `${errors} error${errors === 1 ? "" : "s"}, ${warnings} warning${warnings === 1 ? "" : "s"}`,
86
+ detail: await buildCaretDetail(all, ctx),
87
+ // Named for what it IS. "Check(app.ts)" reads as a routine step that happened to
88
+ // return something; the caret block under it is a compiler error, and the header
89
+ // should say so before the user has read a single line of it.
90
+ displayName: errors > 0 ? "Build Error" : "Check",
91
+ };
92
+ },
93
+ };
94
+ /**
95
+ * The UI-only compiler-caret block — never sent to the model (`formatDiagnostics`'s
96
+ * flat text is what the model sees). Reads each diagnostic's own source line fresh
97
+ * from disk (never sent, so a fetch failure just drops that one caret rather than
98
+ * failing the tool) and draws a `~~~~~~~~` under the exact failing token when the
99
+ * server gave us an end column (see CodeDiagnostic.endColumn).
100
+ */
101
+ async function buildCaretDetail(all, ctx) {
102
+ const rank = { error: 0, warning: 1, info: 2, hint: 3 };
103
+ const sorted = [...all].sort((a, b) => rank[a.severity] - rank[b.severity]);
104
+ const shown = sorted.slice(0, MAX_CARETS);
105
+ const blocks = await Promise.all(shown.map((d) => caretBlock(d, ctx)));
106
+ const parts = blocks.filter((b) => b !== null);
107
+ const hidden = sorted.length - shown.length;
108
+ if (hidden > 0)
109
+ parts.push(`(+${hidden} more — see the full list above)`);
110
+ return parts.join("\n\n");
111
+ }
112
+ /** One diagnostic's caret block, or null if its source line couldn't be read. */
113
+ async function caretBlock(d, ctx) {
114
+ const lines = await readLines(d.file);
115
+ if (!lines)
116
+ return null;
117
+ const line = lines[d.line - 1];
118
+ if (line == null)
119
+ return null;
120
+ const rel = relativize(ctx, d.file);
121
+ const lineLabel = `${d.line}: `;
122
+ const out = [`${rel}:${d.line}:${d.column}`];
123
+ const prev = lines[d.line - 2];
124
+ if (prev != null)
125
+ out.push(`│ ${String(d.line - 1).padStart(lineLabel.length - 2)}: ${prev}`);
126
+ out.push(`│ ${lineLabel}${line}`);
127
+ out.push(caretLine(d, lineLabel.length));
128
+ const codeLabel = d.source ? `${d.source}: ` : "";
129
+ out.push(`⎿ ${codeLabel}${d.message}`); // same branch glyph ToolLine/SubagentView use, not the mockup's literal "└─"
130
+ return out.join("\n");
131
+ }
132
+ /** The `~~~~~~~~` (or `^` when no end column is known) aligned under the failing
133
+ * token, indented to match the `│ N: ` gutter the source line itself sits under. */
134
+ function caretLine(d, gutterWidth) {
135
+ const indent = " ".repeat(2 + gutterWidth + Math.max(0, d.column - 1));
136
+ const width = d.endColumn != null ? Math.max(1, d.endColumn - d.column) : 1;
137
+ return indent + (d.endColumn != null ? "~".repeat(width) : "^");
138
+ }
139
+ /** The file's lines, or null if it can't be read — a caret is a nice-to-have, not
140
+ * worth failing the whole diagnostics call over. */
141
+ async function readLines(absPath) {
142
+ try {
143
+ return (await fs.readFile(absPath, "utf8")).split("\n");
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ /**
150
+ * The absolute paths to check: the given path, else the most recently touched files.
151
+ *
152
+ * This used to read `reads.keys()` in Map order, which is INSERTION order — and
153
+ * `reads.set()` on a key that already exists does not move it. So a file read early
154
+ * and edited last kept its original position and fell outside the window, and the tool
155
+ * answered "No diagnostics" for files it had never looked at while the file just
156
+ * edited was broken. `touchedAt` is the recency stamp that survives a re-touch, and
157
+ * `selectActiveFiles` is the same ordering the working set already uses.
158
+ */
159
+ function pickTargets(ctx, rawPath) {
160
+ if (rawPath)
161
+ return [resolvePath(ctx, rawPath)];
162
+ return selectActiveFiles(ctx.reads, MAX_WORKING_SET).map((f) => f.path);
163
+ }
164
+ /** Render diagnostics as `file:line:col severity: message`, errors first. Pure. */
165
+ export function formatDiagnostics(diags) {
166
+ const rank = { error: 0, warning: 1, info: 2, hint: 3 };
167
+ const sorted = [...diags].sort((a, b) => rank[a.severity] - rank[b.severity] || a.file.localeCompare(b.file) || a.line - b.line);
168
+ const shown = sorted.slice(0, MAX_SHOWN);
169
+ const lines = shown.map((d) => `${d.file}:${d.line}:${d.column} ${d.severity}: ${d.message}${d.source ? ` (${d.source})` : ""}`);
170
+ if (sorted.length > shown.length)
171
+ lines.push(`… (${sorted.length - shown.length} more)`);
172
+ return lines.join("\n");
173
+ }
174
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;oFACoF;AACpF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB;;sDAEsD;AACtD,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,IAAI;IACd,iFAAiF;IACjF,iFAAiF;IACjF,mFAAmF;IACnF,qFAAqF;IACrF,iFAAiF;IACjF,iCAAiC;IACjC,WAAW,EACT,oFAAoF;QACpF,gFAAgF;QAChF,iFAAiF;QACjF,mDAAmD;QACnD,kFAAkF;QAClF,0CAA0C,eAAe,0BAA0B;QACnF,kFAAkF;QAClF,kFAAkF;QAClF,kFAAkF;QAClF,8BAA8B;QAC9B,mFAAmF;QACnF,iFAAiF;QACjF,6EAA6E;QAC7E,8EAA8E;QAC9E,6EAA6E;QAC7E,2DAA2D;IAC7D,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mEAAmE;aACjF;SACF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;QACrB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,iEAAiE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAC7G,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACxB,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAqB,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,kFAAkF;YAClF,6EAA6E;YAC7E,mFAAmF;YACnF,OAAO,EAAE,MAAM,EAAE,sBAAsB,KAAK,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACpE,OAAO;YACL,MAAM;YACN,OAAO,EAAE,GAAG,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,WAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;YACrG,MAAM,EAAE,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;YACxC,iFAAiF;YACjF,iFAAiF;YACjF,8DAA8D;YAC9D,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO;SAClD,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;;;;GAMG;AACH,KAAK,UAAU,gBAAgB,CAAC,GAAqB,EAAE,GAAgB;IACrE,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAW,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5C,IAAI,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,kCAAkC,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,iFAAiF;AACjF,KAAK,UAAU,UAAU,CAAC,CAAiB,EAAE,GAAgB;IAC3D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IAChC,MAAM,GAAG,GAAa,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,IAAI,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9F,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,IAAI,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,6EAA6E;IACrH,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;qFACqF;AACrF,SAAS,SAAS,CAAC,CAAiB,EAAE,WAAmB;IACvD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC;AAED;qDACqD;AACrD,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,WAAW,CAAC,GAAgB,EAAE,OAAe;IACpD,IAAI,OAAO;QAAE,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAW,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CACjG,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxG,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,167 @@
1
+ import { recordWrite, relativize } from "./paths.js";
2
+ import { applyEol } from "./eol.js";
3
+ import { multiEditDetail, lineCount, magnitude, rangeLabel, withScope } from "./detail.js";
4
+ import { applyEditSequence } from "./editCore.js";
5
+ import { numberedWindow, charToLine } from "./editWindow.js";
6
+ import { prepareEditTarget, unreadError, fail, failQuietly, errText } from "./editTarget.js";
7
+ import { writeFileAtomic } from "./atomicWrite.js";
8
+ export const edit = {
9
+ name: "edit",
10
+ readOnly: false,
11
+ // Two things this description has to do at once: make the single-edit case feel as
12
+ // light as it is (one entry, no ceremony), and make batching the OBVIOUS move for a
13
+ // file needing several changes, since one call beats three round trips. The matcher's
14
+ // leniency is stated because a model told it needs exact bytes re-reads whole files
15
+ // to get them; what the matcher does NOT forgive is stated just as plainly, because a
16
+ // matcher that sounds infinitely lenient invites the sloppy input that makes a
17
+ // wrong-place edit possible. See editCore.ts.
18
+ description: "Change an existing file by replacing strings in it. This is the DEFAULT way to modify " +
19
+ "a file — prefer it over rewriting one with write_file. Read the file first. " +
20
+ "Pass `edits`: one entry for a single change, or several entries to change one file in " +
21
+ "several places in a single call (an import at the top, a call site in the middle, a " +
22
+ "helper further down). Batching is strongly preferred over repeated calls to this tool " +
23
+ "on the same file. Edits apply in order and each sees the result of the previous ones, " +
24
+ "so you can add a symbol and then edit around it. " +
25
+ "Each `old_string` must identify exactly ONE place, and is matched on content rather " +
26
+ "than formatting: if an exact match is not found, each line is compared with leading " +
27
+ "and trailing whitespace ignored, and line endings are normalized on both sides. So you " +
28
+ "do not need to reproduce a file's exact indentation, and a CRLF file is not a problem. " +
29
+ "What is never forgiven is a skipped, reordered, or extra line. " +
30
+ "If an `old_string` matches SEVERAL places the file is left untouched and you get the " +
31
+ "candidate locations back with surrounding context: pick one and include enough nearby " +
32
+ "lines to make it unique, or set `replace_all` to change every occurrence. " +
33
+ "ONE FILE PER CALL — make a separate call for each file you need to change. " +
34
+ "All-or-nothing: if any edit doesn't match, the file is left completely untouched.",
35
+ parameters: {
36
+ type: "object",
37
+ additionalProperties: false,
38
+ required: ["path", "edits"],
39
+ properties: {
40
+ path: {
41
+ type: "string",
42
+ description: "The one file every edit in this call applies to, absolute or relative to the working directory.",
43
+ },
44
+ edits: {
45
+ type: "array",
46
+ minItems: 1,
47
+ description: "The replacements to apply to that file, in order. A single change is an array of one.",
48
+ items: {
49
+ type: "object",
50
+ additionalProperties: false,
51
+ required: ["old_string", "new_string"],
52
+ properties: {
53
+ old_string: {
54
+ type: "string",
55
+ description: "The text to replace. Include enough surrounding lines to make it unique.",
56
+ },
57
+ new_string: {
58
+ type: "string",
59
+ description: "The replacement text. Use an empty string to delete old_string.",
60
+ },
61
+ replace_all: {
62
+ type: "boolean",
63
+ description: "Replace every occurrence instead of requiring a unique match. Use it when the same change applies " +
64
+ "to all of them — e.g. deleting a duplicated helper that appears twice in this file. Default false.",
65
+ },
66
+ },
67
+ },
68
+ },
69
+ },
70
+ },
71
+ async execute(args, ctx) {
72
+ const rawPath = typeof args.path === "string" ? args.path.trim() : "";
73
+ if (!rawPath)
74
+ return failQuietly("`path` is required — it names the one file this call edits.");
75
+ if (!Array.isArray(args.edits) || args.edits.length === 0) {
76
+ return failQuietly("`edits` is required and must be a non-empty array of {old_string, new_string} edits.");
77
+ }
78
+ // Validate and normalize each edit up front, so a bad shape is reported before we
79
+ // touch the file.
80
+ const ops = [];
81
+ for (let i = 0; i < args.edits.length; i++) {
82
+ const e = args.edits[i];
83
+ if (!e || typeof e !== "object")
84
+ return failQuietly(`edit #${i + 1} is not an object.`);
85
+ // A per-edit path is refused rather than ignored. Silently dropping it would apply
86
+ // the edit to the WRONG file — the top-level one — which is the worst outcome
87
+ // available here, so say what to do instead.
88
+ if (typeof e.path === "string" && e.path.trim() && e.path.trim() !== rawPath) {
89
+ return failQuietly(`edit #${i + 1} names a different file (${e.path.trim()}). One edit call changes one file: ` +
90
+ `make a separate call for each file you need to change.`);
91
+ }
92
+ if (typeof e.old_string !== "string" || e.old_string === "") {
93
+ return failQuietly(`edit #${i + 1}: \`old_string\` is required and must not be empty.`);
94
+ }
95
+ if (typeof e.new_string !== "string") {
96
+ return failQuietly(`edit #${i + 1}: \`new_string\` is required (use an empty string to delete).`);
97
+ }
98
+ if (e.old_string === e.new_string) {
99
+ return failQuietly(`edit #${i + 1}: \`old_string\` and \`new_string\` are identical — nothing to change.`);
100
+ }
101
+ ops.push({ oldString: e.old_string, newString: e.new_string, replaceAll: e.replace_all === true });
102
+ }
103
+ const target = await prepareEditTarget(ctx, rawPath, "editing");
104
+ if (!target.ok)
105
+ return target.error;
106
+ const { filePath, content, eol } = target;
107
+ // Apply the whole sequence to an in-memory copy. Atomic: a failure names the
108
+ // offending edit and writes nothing. A one-entry sequence is exactly a single
109
+ // replacement, so the single-edit case shares this path rather than forking it.
110
+ const seq = applyEditSequence(content, ops);
111
+ // A file that was never read has to EARN the edit by matching exactly. It just
112
+ // failed to, so this is the case the read-before-edit gate exists for — and the
113
+ // read now happens because it is genuinely needed, not on the off chance.
114
+ if (!seq.ok && target.unread)
115
+ return unreadError(rawPath);
116
+ if (!seq.ok) {
117
+ // The reason may already end in a sentence (the ambiguity report does), so don't
118
+ // staple a second full stop onto it.
119
+ const reason = /[.!?]$/.test(seq.reason) ? seq.reason : `${seq.reason}.`;
120
+ // Quiet: the model has the reason and the candidate locations and fixes its own
121
+ // aim. Nothing reached disk, so there is nothing for the user to act on.
122
+ const which = ops.length === 1 ? "the edit" : `edit #${seq.index + 1}`;
123
+ return failQuietly(`${which} could not be applied to ${rawPath}: ${reason} No changes were written.`);
124
+ }
125
+ const updated = applyEol(seq.updated, eol);
126
+ // Snapshot the pre-edit bytes for /undo before touching disk.
127
+ ctx.checkpoints?.backup(filePath, content, updated);
128
+ try {
129
+ await writeFileAtomic(filePath, updated);
130
+ }
131
+ catch (error) {
132
+ return fail(`could not write ${rawPath}: ${errText(error)}`);
133
+ }
134
+ const startLine = charToLine(seq.updated, seq.spanStart) + 1;
135
+ const endLine = charToLine(seq.updated, seq.spanEnd) + 1;
136
+ // Record the edited region as this file's focus, so a large file localizes to it
137
+ // in the working set instead of being carried whole.
138
+ await recordWrite(ctx, filePath, { start: startLine, end: endLine });
139
+ const shown = relativize(ctx, filePath);
140
+ const nEdits = ops.length;
141
+ // One numbered window spanning from the first change to the last, so the model can
142
+ // keep working from the result without re-reading the file.
143
+ const window = numberedWindow(seq.updated, seq.spanStart, seq.spanEnd);
144
+ let removed = 0;
145
+ let added = 0;
146
+ for (const op of ops) {
147
+ removed += lineCount(op.oldString);
148
+ added += lineCount(op.newString);
149
+ }
150
+ // Scope reads as the change actually was: "L120-124 · −2 +5" for one edit, and
151
+ // "3 edits · L120-420 · −18 +40" when several were batched. Leading with an edit
152
+ // count on a single edit would be noise.
153
+ const magnitudes = `${rangeLabel(startLine, endLine)} · ${magnitude(removed, added)}`;
154
+ const scope = nEdits === 1 ? magnitudes : `${nEdits} edits · ${magnitudes}`;
155
+ const headline = nEdits === 1
156
+ ? `Edited ${shown}.`
157
+ : `Edited ${shown}: ${nEdits} edits, ${seq.total} replacement${seq.total === 1 ? "" : "s"} total.`;
158
+ return {
159
+ output: `${headline}\n` +
160
+ `Changed region — line-numbered so you can make further edits without re-reading:\n${window}`,
161
+ summary: `edited ${shown} · ${scope}`,
162
+ detail: withScope(scope, multiEditDetail(ops)),
163
+ detailKind: "diff",
164
+ };
165
+ },
166
+ };
167
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}