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 @@
1
+ {"version":3,"file":"chassisMux.js","sourceRoot":"","sources":["../../src/tools/chassisMux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,328 @@
1
+ /**
2
+ * checkpoints.ts — a per-turn undo net for file edits.
3
+ *
4
+ * Recoverability without git: whenever a mutating tool is about to change a file,
5
+ * it first hands the file's ORIGINAL bytes here (once per file per turn — the
6
+ * first touch wins, so we keep the true pre-turn state) along with the bytes it is
7
+ * ABOUT TO WRITE (last write wins — that is the state we expect to find on disk).
8
+ * At the end of a turn the engine `seal`s those into one restorable checkpoint.
9
+ * `/undo` then rolls the last turn's file changes back.
10
+ *
11
+ * It's deliberately a shadow-copy in memory (bounded stack), not a shadow git
12
+ * repo: cheap, dependency-free, and it works even when the project isn't a git
13
+ * repo at all. Client-side state (holds file bytes), like the background shells —
14
+ * absent in bare contexts, in which case edits simply aren't checkpointed.
15
+ *
16
+ * FOUR RULES THIS FILE EXISTS TO KEEP, all learned the hard way:
17
+ *
18
+ * 1. **Never destroy work we did not do.** If a file no longer matches what we
19
+ * wrote, somebody else changed it — the user, their editor, another process.
20
+ * Restoring would silently overwrite that. We report it and leave it alone.
21
+ * 2. **A failed restore must stay retryable, but not forever.** The checkpoint is
22
+ * retired once every file settles — or once retrying stops being useful. Popping
23
+ * first and restoring after loses the checkpoint to one locked file; never
24
+ * retiring pins that checkpoint at the top and walls off every older turn.
25
+ * 3. **Never say more than we did.** Anything `run_command` changed is invisible
26
+ * here, and a file too large to hold is not covered either. Both are reported
27
+ * rather than quietly folded into "the turn was undone".
28
+ * 4. **Bounded in bytes, not just in turns.** Twenty checkpoints of large files is
29
+ * hundreds of megabytes resident. The count bound never was the real limit.
30
+ */
31
+ import { promises as fs } from "node:fs";
32
+ import { writeFileAtomic } from "./atomicWrite.js";
33
+ /**
34
+ * Per-file ceiling on what we will hold. We keep two copies of every checkpointed
35
+ * file (the original, to restore; what we wrote, to detect someone else's edit), so
36
+ * the real cost is double. A source file past this size is not something anyone is
37
+ * hand-editing, and holding it would crowd out every ordinary file behind it.
38
+ */
39
+ const MAX_FILE_BYTES = 4 * 1024 * 1024;
40
+ /**
41
+ * Ceiling across the whole stack. Oldest checkpoints are evicted first when a new
42
+ * one pushes past it — except that the most recent checkpoint is always kept, even
43
+ * if it alone exceeds the budget. Undoing the last turn is the case that matters;
44
+ * leaving a user with no undo at all to satisfy a memory bound is the wrong trade.
45
+ */
46
+ const MAX_TOTAL_BYTES = 32 * 1024 * 1024;
47
+ /**
48
+ * How many times `/undo` re-tries a checkpoint that had files it could not write.
49
+ *
50
+ * Keeping a failed file for a retry is right — a lock from an editor or a dev server
51
+ * usually clears. Keeping it FOREVER is not: a file that never becomes writable would
52
+ * pin its checkpoint at the top of the stack permanently, and every older turn behind
53
+ * it would be unreachable. So retry, then give up and let the user get on.
54
+ */
55
+ const MAX_UNDO_ATTEMPTS = 2;
56
+ const byteLen = (s) => (s === null ? 0 : Buffer.byteLength(s, "utf8"));
57
+ /**
58
+ * The whole undo decision, as a pure function of what we recorded and what is on
59
+ * disk. Split out because this is where the judgement lives — the caller does only
60
+ * I/O around it, and the two failure modes that matter (clobbering someone else's
61
+ * edit, and mishandling a file that vanished) are decided here where they can be
62
+ * tested exhaustively.
63
+ *
64
+ * `currentBytes` is null when the file is not on disk, for any reason.
65
+ */
66
+ export function undoAction(state, currentBytes) {
67
+ if (state.original === null && currentBytes === null)
68
+ return "settled";
69
+ if (currentBytes !== state.written)
70
+ return "conflict";
71
+ return state.original === null ? "delete" : "restore";
72
+ }
73
+ /**
74
+ * Parse what follows `/undo`: nothing (roll back the last turn), `list` (show what
75
+ * is available), or a count (roll back that many turns, newest first).
76
+ */
77
+ export function parseUndoArg(arg) {
78
+ const text = arg.trim().toLowerCase();
79
+ if (text === "")
80
+ return { kind: "undo", count: 1 };
81
+ if (text === "list" || text === "ls")
82
+ return { kind: "list" };
83
+ if (/^\d+$/.test(text)) {
84
+ const count = Number(text);
85
+ if (count < 1)
86
+ return { kind: "error", message: "How many turns? /undo 1 rolls back the last one." };
87
+ return { kind: "undo", count };
88
+ }
89
+ return { kind: "error", message: `I don't understand "${arg.trim()}". Use /undo, /undo list, or /undo <number>.` };
90
+ }
91
+ /**
92
+ * What the MODEL is told after an undo. Pure.
93
+ *
94
+ * Without this the rollback is invisible to it: the transcript still says the edits
95
+ * were made, so the next turn reasons about code that is no longer on disk. The
96
+ * conversation is deliberately NOT rewound — only the facts are corrected, which is
97
+ * the smallest honest fix for the two drifting apart.
98
+ */
99
+ export function undoNotice(results, display) {
100
+ const list = (paths) => paths.map(display).join(", ");
101
+ const gather = (pick) => [...new Set(results.flatMap(pick))];
102
+ const labels = results.map((r) => `"${r.label}"`).join(", ");
103
+ const lines = [
104
+ `The user ran /undo. The file changes from ${labels} were rolled back on disk.`,
105
+ ];
106
+ const restored = gather((r) => r.restored);
107
+ const conflicts = gather((r) => r.conflicts);
108
+ const failed = gather((r) => r.failed);
109
+ const skipped = gather((r) => r.skipped);
110
+ if (restored.length > 0) {
111
+ lines.push(`Back to their pre-turn state: ${list(restored)}. Your edits to these are gone.`);
112
+ }
113
+ if (conflicts.length > 0) {
114
+ lines.push(`Left as they are, because they changed after you wrote them: ${list(conflicts)}.`);
115
+ }
116
+ if (failed.length > 0) {
117
+ lines.push(`Could not be rolled back and are still in their edited state: ${list(failed)}.`);
118
+ }
119
+ if (skipped.length > 0) {
120
+ lines.push(`Too large to checkpoint, so still in their edited state: ${list(skipped)}.`);
121
+ }
122
+ if (results.some((r) => r.ranShell)) {
123
+ lines.push("Shell commands also ran; whatever those changed was not rolled back.");
124
+ }
125
+ lines.push("Re-read any of these before editing them again.");
126
+ return lines.join(" ");
127
+ }
128
+ export class Checkpoints {
129
+ max;
130
+ current = new Map();
131
+ currentBytes = 0;
132
+ currentSkipped = new Set();
133
+ shellRan = false;
134
+ stack = [];
135
+ resumed = false;
136
+ constructor(max = 20) {
137
+ this.max = max;
138
+ }
139
+ /**
140
+ * Record a file's pre-change content the first time it's touched this turn, and
141
+ * the content being written now. `original` is the exact bytes on disk (or null
142
+ * for a not-yet-existing file); `written` is what the tool is about to put there.
143
+ *
144
+ * A file too large to hold is recorded as SKIPPED rather than dropped silently —
145
+ * `/undo` then says it wasn't covered instead of implying it was.
146
+ */
147
+ backup(absPath, original, written) {
148
+ const prior = this.current.get(absPath);
149
+ if (prior) {
150
+ // A later touch in the same turn moves only `written`; `original` is the
151
+ // pre-turn truth and never changes.
152
+ const grown = byteLen(original) + byteLen(written);
153
+ if (grown > MAX_FILE_BYTES) {
154
+ // It has outgrown what we can hold. Drop it wholesale rather than keep a
155
+ // half-record we would have to reason about at restore time.
156
+ this.currentBytes -= byteLen(prior.original) + byteLen(prior.written);
157
+ this.current.delete(absPath);
158
+ this.currentSkipped.add(absPath);
159
+ return;
160
+ }
161
+ this.currentBytes += byteLen(written) - byteLen(prior.written);
162
+ prior.written = written;
163
+ return;
164
+ }
165
+ const cost = byteLen(original) + byteLen(written);
166
+ if (cost > MAX_FILE_BYTES || this.currentBytes + cost > MAX_TOTAL_BYTES) {
167
+ this.currentSkipped.add(absPath);
168
+ return;
169
+ }
170
+ this.current.set(absPath, { original, written });
171
+ this.currentBytes += cost;
172
+ }
173
+ /** Note that this turn ran a shell command, whose effects we cannot capture. */
174
+ noteShell() {
175
+ this.shellRan = true;
176
+ }
177
+ /**
178
+ * Mark this as a resumed session. Undo history lives in memory, so a resumed
179
+ * session starts empty even though earlier turns really did change files — the
180
+ * difference matters when telling the user why there is nothing to undo.
181
+ */
182
+ noteResumed() {
183
+ this.resumed = true;
184
+ }
185
+ /** Whether this session was resumed (so earlier turns' undo history is gone). */
186
+ wasResumed() {
187
+ return this.resumed;
188
+ }
189
+ /** Close this turn's edits into a restorable checkpoint. No-op if nothing happened. */
190
+ seal(label) {
191
+ // A turn whose only file changes were too large still gets a checkpoint: it has
192
+ // nothing to restore, but it has something to SAY, and saying it is the point.
193
+ if (this.current.size === 0 && this.currentSkipped.size === 0) {
194
+ this.shellRan = false;
195
+ return;
196
+ }
197
+ this.stack.push({
198
+ label: label || "(edits)",
199
+ at: Date.now(),
200
+ files: this.current,
201
+ skipped: [...this.currentSkipped],
202
+ ranShell: this.shellRan,
203
+ bytes: this.currentBytes,
204
+ attempts: 0,
205
+ });
206
+ this.current = new Map();
207
+ this.currentBytes = 0;
208
+ this.currentSkipped = new Set();
209
+ this.shellRan = false;
210
+ this.evict();
211
+ }
212
+ /** Trim the stack to both bounds: the turn count, then the byte budget. */
213
+ evict() {
214
+ while (this.stack.length > this.max)
215
+ this.stack.shift();
216
+ let total = this.stack.reduce((n, cp) => n + cp.bytes, 0);
217
+ // `length > 1` keeps the newest checkpoint whatever it costs — see MAX_TOTAL_BYTES.
218
+ // Currently unreachable, because `backup` already refuses once a single turn's
219
+ // held bytes would pass the budget, so no lone checkpoint can exceed it. Kept
220
+ // anyway: it is one condition, and it is what stops that in-turn cap from
221
+ // becoming load-bearing in a way nobody would notice if it were relaxed.
222
+ while (total > MAX_TOTAL_BYTES && this.stack.length > 1) {
223
+ total -= this.stack.shift().bytes;
224
+ }
225
+ }
226
+ /** Whether there's a sealed checkpoint to undo. */
227
+ hasUndo() {
228
+ return this.stack.length > 0;
229
+ }
230
+ /** The label of the checkpoint that `undo()` would restore, if any. */
231
+ nextUndoLabel() {
232
+ return this.stack[this.stack.length - 1]?.label;
233
+ }
234
+ /** What is available to undo, newest first. */
235
+ list() {
236
+ return [...this.stack]
237
+ .reverse()
238
+ .map((cp) => ({
239
+ label: cp.label,
240
+ at: cp.at,
241
+ files: cp.files.size,
242
+ skipped: cp.skipped.length,
243
+ ranShell: cp.ranShell,
244
+ }));
245
+ }
246
+ /**
247
+ * Restore the most recent sealed checkpoint. Files that no longer match what we
248
+ * wrote are reported as conflicts and left untouched; files that fail to write
249
+ * are reported and KEPT in the checkpoint so a second `/undo` retries just those.
250
+ * The checkpoint retires when nothing is left in it, or when retrying it has
251
+ * stopped being useful.
252
+ */
253
+ async undo() {
254
+ const cp = this.stack[this.stack.length - 1];
255
+ if (!cp)
256
+ return null;
257
+ const restored = [];
258
+ const conflicts = [];
259
+ const failed = [];
260
+ for (const [path, state] of [...cp.files]) {
261
+ let currentBytes;
262
+ try {
263
+ currentBytes = await fs.readFile(path, "utf8");
264
+ }
265
+ catch {
266
+ currentBytes = null; // not on disk (deleted, or never created)
267
+ }
268
+ const action = undoAction(state, currentBytes);
269
+ if (action === "settled") {
270
+ cp.files.delete(path); // nothing to do, nothing worth reporting
271
+ continue;
272
+ }
273
+ if (action === "conflict") {
274
+ conflicts.push(path);
275
+ cp.files.delete(path); // reported once; their copy stands
276
+ continue;
277
+ }
278
+ try {
279
+ if (action === "delete")
280
+ await fs.rm(path, { force: true });
281
+ // ATOMIC, like every other write to a user's file. Writing straight onto the
282
+ // destination truncates it first, so a crash inside that window destroys the
283
+ // file — during the one operation whose entire purpose is to save it. Undo is
284
+ // the recovery mechanism; it must not be the thing that loses the work.
285
+ else
286
+ await writeFileAtomic(path, state.original);
287
+ restored.push(path);
288
+ cp.files.delete(path);
289
+ }
290
+ catch {
291
+ failed.push(path); // left in place so the next /undo can try again
292
+ }
293
+ }
294
+ cp.attempts++;
295
+ const retired = cp.files.size === 0 || cp.attempts >= MAX_UNDO_ATTEMPTS;
296
+ if (retired)
297
+ this.stack.pop();
298
+ return {
299
+ label: cp.label,
300
+ at: cp.at,
301
+ restored,
302
+ conflicts,
303
+ failed,
304
+ retryable: failed.length > 0 && !retired,
305
+ skipped: cp.skipped,
306
+ ranShell: cp.ranShell,
307
+ };
308
+ }
309
+ /**
310
+ * Undo up to `count` checkpoints, newest first — the coherent way to go back more
311
+ * than one turn, since a later turn's edits sit on top of an earlier one's. Stops
312
+ * early if the stack runs out, or if a checkpoint is left retryable (pressing on
313
+ * past a file we could not write would unwind state the user thinks is still here).
314
+ */
315
+ async undoMany(count) {
316
+ const results = [];
317
+ for (let i = 0; i < count; i++) {
318
+ const result = await this.undo();
319
+ if (!result)
320
+ break;
321
+ results.push(result);
322
+ if (result.retryable)
323
+ break;
324
+ }
325
+ return results;
326
+ }
327
+ }
328
+ //# sourceMappingURL=checkpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoints.js","sourceRoot":"","sources":["../../src/tools/checkpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * codeIntel.ts — the read-only tools that query the chassis (Mindweave's code map).
3
+ *
4
+ * These give the model IDE-grade navigation — outline, jump-to-definition,
5
+ * find-references, and a relevance map — without reading or grepping blindly.
6
+ * They query `ctx.chassis` (built by the alternator lane) and fall back to a
7
+ * clear "use grep/read" message when it isn't available. Every result carries
8
+ * the chassis's confidence: `name-level` answers tell the model to verify with
9
+ * grep when exact identity matters (the assistant-not-authority rule).
10
+ */
11
+ import { promises as fs } from "node:fs";
12
+ import { relativize, resolvePath } from "./paths.js";
13
+ import { allChassis, chassisForPath, mergedDefinition, mergedReferences } from "./chassisMux.js";
14
+ import { walkFiles } from "./walk.js";
15
+ import { excludedFromSearch } from "./guard.js";
16
+ import { isSupported } from "../alternator/chassis/treesitter.js";
17
+ import { isMarkupSupported } from "../alternator/chassis/markup.js";
18
+ import { fail, failQuietly } from "./results.js";
19
+ const DIR_FILE_CAP = 40;
20
+ const REF_CAP = 100;
21
+ function indexingNote(ctx) {
22
+ return ctx.chassis?.status().ready ? "" : " (code map still indexing — may be incomplete)";
23
+ }
24
+ function caveat(confidence) {
25
+ return confidence === "name-level"
26
+ ? "\n(name-level match — verify with grep if exact identity matters)"
27
+ : "";
28
+ }
29
+ const outlineDef = {
30
+ name: "outline",
31
+ readOnly: true,
32
+ // Two things were missing, and the second one matters more than it looks. A directory
33
+ // outline leads with a rollup (counts, the central symbols, which folders it depends
34
+ // on) that the description never mentioned, so the model had no reason to point this
35
+ // at a folder. And a directory outline stops after DIR_FILE_CAP files WITHOUT saying
36
+ // so, which means a model that outlines a 200-file folder believes it has seen the
37
+ // shape of all of it. Silent truncation is the worst kind: it looks like completeness.
38
+ description: "Show the structural outline of a file: its symbols and signatures, never bodies. " +
39
+ "Point it at a DIRECTORY and you get more than the files, you get a rollup first — " +
40
+ "how many files and symbols it holds, which symbols are most central to it, and " +
41
+ "which other folders it depends on. That is the fastest way to understand an " +
42
+ "unfamiliar area, and it costs one call. " +
43
+ `A directory outline covers at most ${DIR_FILE_CAP} files, so for anything larger ` +
44
+ "treat it as a sample and narrow to a subfolder. Files with no symbols are left out. " +
45
+ "Works on HTML and CSS too: it lists a page's sections and ids, and a stylesheet's " +
46
+ "selectors, with line numbers, so you can navigate a big page instead of reading it " +
47
+ "top to bottom.",
48
+ parameters: {
49
+ type: "object",
50
+ additionalProperties: false,
51
+ properties: {
52
+ path: { type: "string", description: "File or directory. Defaults to the working directory." },
53
+ },
54
+ },
55
+ async execute(args, ctx) {
56
+ if (allChassis(ctx).length === 0)
57
+ return degraded();
58
+ const rawPath = typeof args.path === "string" && args.path.trim() ? args.path.trim() : ".";
59
+ const abs = resolvePath(ctx, rawPath);
60
+ let stat;
61
+ try {
62
+ stat = await fs.stat(abs);
63
+ }
64
+ catch {
65
+ return fail(`path not found: ${rawPath}`);
66
+ }
67
+ const groups = [];
68
+ let rollup = "";
69
+ let dirTruncated = null;
70
+ if (stat.isFile()) {
71
+ const entries = await (chassisForPath(ctx, abs)?.outline(abs) ?? Promise.resolve([]));
72
+ groups.push({ file: abs, entries });
73
+ }
74
+ else {
75
+ // A directory: lead with a folder rollup (counts, central symbols, deps).
76
+ const summary = await chassisForPath(ctx, abs)?.directorySummary(abs);
77
+ if (summary)
78
+ rollup = renderDirSummary(ctx, summary);
79
+ const { files } = await walkFiles(abs, 5000);
80
+ // `excludedFromSearch` is what keeps secrets and other agents' data out of
81
+ // grep and glob. outline walked the same tree without it, so the one
82
+ // discovery tool that reads file CONTENTS to build its output was the one not
83
+ // applying the exclusion. Same list, same walk, same rule.
84
+ const eligible = files.filter((f) => !excludedFromSearch(f.abs) && (isSupported(f.abs) || isMarkupSupported(f.abs)));
85
+ const supported = eligible.slice(0, DIR_FILE_CAP);
86
+ // Say so when the cap bites. The description warns that a cap exists, but a
87
+ // model reading one particular reply cannot tell whether THIS answer hit it,
88
+ // and truncation that looks like completeness is how a partial survey gets
89
+ // treated as the shape of the whole folder.
90
+ if (eligible.length > supported.length) {
91
+ dirTruncated = { shown: supported.length, total: eligible.length };
92
+ }
93
+ for (const f of supported) {
94
+ const entries = (await chassisForPath(ctx, f.abs)?.outline(f.abs)) ?? [];
95
+ if (entries.length)
96
+ groups.push({ file: f.abs, entries });
97
+ }
98
+ }
99
+ const outlineBody = groups
100
+ .map((g) => {
101
+ const header = relativize(ctx, g.file);
102
+ return `${header}\n${renderOutlineEntries(g.entries).join("\n")}`;
103
+ })
104
+ .join("\n\n");
105
+ const truncNote = dirTruncated
106
+ ? `\n\n(outlined ${dirTruncated.shown} of ${dirTruncated.total} files — this is a ` +
107
+ `sample, not the whole folder; narrow to a subfolder to see the rest)`
108
+ : "";
109
+ const body = [rollup, outlineBody].filter(Boolean).join("\n\n");
110
+ if (!body)
111
+ return { output: `No symbols found in ${rawPath}.${indexingNote(ctx)}`, summary: `outline ${rawPath} (empty)` };
112
+ return {
113
+ output: body + truncNote + indexingNote(ctx),
114
+ summary: `outline ${rawPath} (${groups.length} file${groups.length === 1 ? "" : "s"})`,
115
+ };
116
+ },
117
+ };
118
+ const definitionDef = {
119
+ name: "definition",
120
+ readOnly: true,
121
+ // "the exact file:line" was an overclaim: a name defined in two files returns BOTH,
122
+ // which is the right behaviour and needs saying, because a model told it gets THE
123
+ // location will take the first row. The genuinely useful part was also unstated:
124
+ // the declaration line comes back with the location, so most lookups need no read
125
+ // at all. Same two-level certainty as references, for the same reason.
126
+ description: "Find where a symbol (function, class, type, and so on) is defined, by name. " +
127
+ "Returns file:line PLUS the declaration itself, so for most lookups you never need " +
128
+ "to open the file; use read_symbol when you want the body. " +
129
+ "If the name is defined in more than one place you get EVERY definition rather than " +
130
+ "a best guess, so an ambiguous name is visible instead of silently resolved. " +
131
+ "Certainty comes in two levels and the output says which one you got: resolved when " +
132
+ "a language server has analyzed the file, otherwise a NAME match, which can include " +
133
+ "an unrelated symbol that happens to share the name. " +
134
+ "Covers HTML and CSS as well: pass a CSS class or id (e.g. \"hero-stats\") to jump " +
135
+ "to its style rule, or an element id to find that section. " +
136
+ "An empty result means it is not in the code map, which may still be indexing, so " +
137
+ "fall back to grep rather than concluding the symbol does not exist.",
138
+ parameters: {
139
+ type: "object",
140
+ additionalProperties: false,
141
+ required: ["name"],
142
+ properties: { name: { type: "string", description: "The symbol name to locate." } },
143
+ },
144
+ async execute(args, ctx) {
145
+ if (allChassis(ctx).length === 0)
146
+ return degraded();
147
+ const name = typeof args.name === "string" ? args.name.trim() : "";
148
+ if (!name)
149
+ return failQuietly("`name` is required.");
150
+ const { symbols, confidence } = await mergedDefinition(ctx, name);
151
+ if (symbols.length === 0) {
152
+ return { output: `No definition of '${name}' in the code map.${indexingNote(ctx)} Try grep.`, summary: `definition ${name} — none` };
153
+ }
154
+ const body = symbols
155
+ .map((s) => `${relativize(ctx, s.file)}:${s.line} ${s.kind} ${s.signature ?? s.name}`)
156
+ .join("\n");
157
+ return { output: body + caveat(confidence) + indexingNote(ctx), summary: `definition ${name} (${symbols.length})` };
158
+ },
159
+ };
160
+ const referencesDef = {
161
+ name: "references",
162
+ readOnly: true,
163
+ // The old description read as if this were full semantic resolution. It is not, and
164
+ // the difference decides whether the model can trust the list: refs are keyed by NAME
165
+ // in the graph, and only files a language server has analyzed come back `resolved`.
166
+ // The tool already prints that caveat at runtime; a model that has not been told the
167
+ // distinction up front reads a name-level list as certainty and refactors on it.
168
+ description: "Find where a symbol is used, by name. Reads PARSED code rather than raw text, so a " +
169
+ "mention inside a comment or a string is never a match. Returns file:line locations " +
170
+ `(up to ${REF_CAP}), not the code itself. ` +
171
+ "There are TWO levels of certainty here and the output tells you which one you got. " +
172
+ "When a language server has analyzed the files involved, the answer is resolved. " +
173
+ "Otherwise it is a NAME match, and a different symbol that happens to share the name " +
174
+ "in an unrelated file WILL appear in the list. When it says name-level and exact " +
175
+ "identity matters, confirm with grep or by opening the candidates before you act. " +
176
+ "For a CSS class or id this returns every HTML element and every script " +
177
+ "(getElementById/querySelector/classList) that uses it, which is the cross-language " +
178
+ "blast radius before you change a style. " +
179
+ "An empty result means nothing in the code map references it; the map may still be " +
180
+ "indexing, so fall back to grep rather than concluding the symbol is unused.",
181
+ parameters: {
182
+ type: "object",
183
+ additionalProperties: false,
184
+ required: ["name"],
185
+ properties: { name: { type: "string", description: "The symbol name to find references to." } },
186
+ },
187
+ async execute(args, ctx) {
188
+ if (allChassis(ctx).length === 0)
189
+ return degraded();
190
+ const name = typeof args.name === "string" ? args.name.trim() : "";
191
+ if (!name)
192
+ return failQuietly("`name` is required.");
193
+ const { refs, confidence } = await mergedReferences(ctx, name);
194
+ if (refs.length === 0) {
195
+ return { output: `No references to '${name}' in the code map.${indexingNote(ctx)} Try grep.`, summary: `references ${name} — none` };
196
+ }
197
+ const shown = refs.slice(0, REF_CAP).map((r) => `${relativize(ctx, r.file)}:${r.line}`);
198
+ if (refs.length > REF_CAP)
199
+ shown.push(`… (${refs.length - REF_CAP} more)`);
200
+ return { output: shown.join("\n") + caveat(confidence) + indexingNote(ctx), summary: `references ${name} (${refs.length})` };
201
+ },
202
+ };
203
+ /** Render a directory rollup: counts, its most central symbols, and folder deps. */
204
+ function renderDirSummary(ctx, s) {
205
+ const where = relativize(ctx, s.dir);
206
+ const lines = [`${where}/ — ${s.files} file${s.files === 1 ? "" : "s"}, ${s.symbols} symbol${s.symbols === 1 ? "" : "s"}`];
207
+ if (s.topSymbols.length) {
208
+ lines.push(` central: ${s.topSymbols.slice(0, 8).map((sym) => `${sym.name} (${sym.kind})`).join(", ")}`);
209
+ }
210
+ if (s.dependsOn.length) {
211
+ lines.push(` depends on: ${s.dependsOn.map((d) => `${relativize(ctx, d)}/`).join(", ")}`);
212
+ }
213
+ return lines.join("\n");
214
+ }
215
+ /** Render a nested outline: indent by depth, show each symbol's doc when present. */
216
+ export function renderOutlineEntries(entries, depth = 0) {
217
+ const out = [];
218
+ for (const e of entries) {
219
+ const indent = " ".repeat(depth);
220
+ const doc = e.doc ? ` — ${e.doc}` : "";
221
+ out.push(` ${String(e.line).padStart(4)} ${indent}${e.kind} ${e.name}${doc}`);
222
+ if (e.children?.length)
223
+ out.push(...renderOutlineEntries(e.children, depth + 1));
224
+ }
225
+ return out;
226
+ }
227
+ function degraded() {
228
+ return {
229
+ output: "The code map isn't available here — use grep, glob, and read_file instead.",
230
+ summary: "code map unavailable",
231
+ };
232
+ }
233
+ /**
234
+ * These four never render a row.
235
+ *
236
+ * Outlining a file, resolving a definition, finding call sites, ranking what's
237
+ * relevant — that is the agent reading its way around the code, not work done
238
+ * TO the project. A row per lookup filled the transcript with the agent's own
239
+ * navigation while saying nothing the user could act on; the answers show up in
240
+ * what it goes on to say and do. The model still receives every result in full.
241
+ *
242
+ * Applied as a wrapper rather than a `quiet: true` on each return, because these
243
+ * four tools have eleven return sites between them and the next one added would
244
+ * silently start rendering again.
245
+ */
246
+ function navigational(tool) {
247
+ return {
248
+ ...tool,
249
+ /**
250
+ * Deferred, all four of them. They answer structural questions — where is this
251
+ * defined, what calls it, what is related — which is a phase of a task rather than a
252
+ * step in the edit loop, and four schemas is 1,257 tokens in front of the model on
253
+ * every single request.
254
+ *
255
+ * Marked here rather than on each definition because it is one decision about one
256
+ * family; splitting it four ways is four places for it to drift.
257
+ */
258
+ deferred: true,
259
+ async execute(args, ctx) {
260
+ return { ...(await tool.execute(args, ctx)), quiet: true };
261
+ },
262
+ };
263
+ }
264
+ export const outlineTool = navigational(outlineDef);
265
+ export const definitionTool = navigational(definitionDef);
266
+ export const referencesTool = navigational(referencesDef);
267
+ //# sourceMappingURL=codeIntel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeIntel.js","sourceRoot":"","sources":["../../src/tools/codeIntel.ts"],"names":[],"mappings":"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"}