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,504 @@
1
+ /**
2
+ * connection.ts — one MCP server, and what state it is in.
3
+ *
4
+ * The previous implementation had no notion of state: a server was in a map or it was
5
+ * not. That makes three ordinary situations indistinguishable — still starting, failed
6
+ * to start, and waiting on the user to authenticate — so nothing could report anything
7
+ * useful and a dead server stayed dead for the session.
8
+ *
9
+ * So a connection is a small state machine:
10
+ *
11
+ * pending ──► connected ──► (dies) ──► pending ──► …
12
+ * │ │
13
+ * ├──► failed (cap reached) ◄─┘
14
+ * └──► needs-auth
15
+ *
16
+ * `needs-auth` is deliberately separate from `failed`. A 401 is not a broken server, it
17
+ * is a server waiting on the user, and collapsing the two would make the eventual auth
18
+ * flow look like an outage.
19
+ *
20
+ * Reconnection is capped at 3 consecutive failures, the same number used by the
21
+ * repeat-failure breaker in the engine. Past the cap we STOP and surface the state
22
+ * rather than retrying forever: a server that cannot start will not start on the
23
+ * fourth try, and quietly burning attempts is how a session ends up slow for a reason
24
+ * the user cannot see. `/mcp` can always retry by hand.
25
+ */
26
+ import { appVersion } from "../cli/version.js";
27
+ import { parseToolList } from "./catalog.js";
28
+ import { paramHeaders } from "./paramHeaders.js";
29
+ import { probe, UnsupportedProtocolVersionError } from "./discover.js";
30
+ import { buildMeta, DEFAULT_CLIENT_CAPABILITIES, cacheDirectiveOf, readInputRequired } from "./protocol.js";
31
+ import { hasPrompts, parsePromptList } from "./prompts.js";
32
+ import { hasResources, parseResourceList, parseResourceRead, parseTemplateList, } from "./resources.js";
33
+ import { HttpTransport } from "./transport/http.js";
34
+ import { StdioTransport } from "./transport/stdio.js";
35
+ import { RpcError } from "./transport/types.js";
36
+ import { isPromptsChanged, isResourcesChanged, isToolsChanged, subscriptionsFor } from "./subscriptions.js";
37
+ /** Consecutive failed connect attempts before we stop trying on our own. */
38
+ export const MAX_CONNECT_ATTEMPTS = 3;
39
+ /**
40
+ * Backoff between automatic reconnects, in ms.
41
+ *
42
+ * Deliberately short and deliberately finite. A server that dies mid-session is usually
43
+ * a crash or a restart, and getting it back within a few seconds is the difference
44
+ * between a blip and losing its tools for the rest of the session. But retrying forever
45
+ * is the pattern the repeat-failure breaker exists to prevent: a server that will not
46
+ * come back does not come back on the tenth attempt either, and quietly burning them is
47
+ * how a session gets slow for a reason the user cannot see. After the last one we stop
48
+ * and say so; `/mcp` can always retry by hand.
49
+ */
50
+ export const RECONNECT_BACKOFF_MS = [1_000, 4_000, 10_000];
51
+ /**
52
+ * How many extra round trips one MRTR call may take before we give up.
53
+ *
54
+ * A server is explicitly allowed to keep answering `input_required` "if they want to
55
+ * repeatedly prompt the user for information until they have what they need", so nothing
56
+ * on the server side ever has to stop. Terminating is therefore the client's job. Four
57
+ * is well past any ordinary exchange (which is one, occasionally two) and small enough
58
+ * that a server looping on us costs a moment rather than a session.
59
+ */
60
+ export const MAX_INPUT_ROUNDS = 4;
61
+ /** Is this error the server telling us it wants credentials? */
62
+ export function isAuthError(error) {
63
+ const e = error;
64
+ if (typeof e?.code === "number" && e.code === -32001)
65
+ return true;
66
+ return typeof e?.message === "string" && /\b401\b|\b403\b|unauthor|forbidden/i.test(e.message);
67
+ }
68
+ export class McpConnection {
69
+ config;
70
+ transport = null;
71
+ negotiated = null;
72
+ toolDefs = [];
73
+ /** Tools dropped from the last catalog load, with the reason. Drained by the manager
74
+ * into user-facing notices — a tool that silently does not exist is the failure mode
75
+ * quarantine already taught us to avoid. */
76
+ toolWarnings = [];
77
+ promptDefs = [];
78
+ resourceDefs = [];
79
+ templateDefs = [];
80
+ cache = {};
81
+ toolsFetchedAt = 0;
82
+ /** When the resource listing was last fetched (0 = never). Resources are loaded lazily,
83
+ * so this is the only thing standing between a curious model and a refetch per call. */
84
+ resourcesFetchedAt = 0;
85
+ resourceCache = {};
86
+ state;
87
+ lastError = "";
88
+ attempts = 0;
89
+ connecting = null;
90
+ retryTimer = null;
91
+ closed = false;
92
+ onChange = null;
93
+ constructor(config) {
94
+ this.config = config;
95
+ this.state = config.disabled ? "disabled" : "pending";
96
+ }
97
+ /** Told whenever this server's state or catalog moves, so the UI can repaint. */
98
+ setOnChange(handler) {
99
+ this.onChange = handler;
100
+ }
101
+ changed() {
102
+ this.onChange?.();
103
+ }
104
+ status() {
105
+ return {
106
+ name: this.config.name,
107
+ state: this.state,
108
+ toolCount: this.toolDefs.length,
109
+ promptCount: this.promptDefs.length,
110
+ offersResources: this.offersResources(),
111
+ attempts: this.attempts,
112
+ ...(this.lastError ? { error: this.lastError } : {}),
113
+ ...(this.negotiated ? { version: this.negotiated.version, legacy: this.negotiated.legacy } : {}),
114
+ ...(this.negotiated?.serverInfo ? { serverInfo: this.negotiated.serverInfo } : {}),
115
+ };
116
+ }
117
+ tools() {
118
+ return this.toolDefs;
119
+ }
120
+ /** This server's prompts, fetched at connect (they have to exist before the command
121
+ * list is rendered, and there is no way to discover them lazily from a keystroke). */
122
+ prompts() {
123
+ return this.promptDefs;
124
+ }
125
+ isConnected() {
126
+ return this.state === "connected";
127
+ }
128
+ /**
129
+ * Connect, handshake or discover, and load the tool catalog.
130
+ *
131
+ * Concurrent callers share one attempt: the pool starts every server in parallel and
132
+ * a `/mcp` retry can land on top of that, and two transports for one server would
133
+ * leak a child process.
134
+ */
135
+ async connect() {
136
+ if (this.state === "disabled")
137
+ return;
138
+ if (this.state === "connected")
139
+ return;
140
+ if (this.connecting)
141
+ return this.connecting;
142
+ if (this.attempts >= MAX_CONNECT_ATTEMPTS && this.state !== "pending")
143
+ return;
144
+ this.connecting = this.attempt().finally(() => {
145
+ this.connecting = null;
146
+ });
147
+ return this.connecting;
148
+ }
149
+ /** Force a retry even past the cap — what `/mcp` reconnect does. */
150
+ async reconnect() {
151
+ this.clearRetry();
152
+ await this.closeTransport();
153
+ this.closed = false;
154
+ this.attempts = 0;
155
+ this.state = this.config.disabled ? "disabled" : "pending";
156
+ this.lastError = "";
157
+ await this.connect();
158
+ }
159
+ async attempt() {
160
+ this.attempts++;
161
+ this.state = "pending";
162
+ try {
163
+ const transport = this.open();
164
+ this.transport = transport;
165
+ // If the server dies later, drop back to pending so a future call can revive it
166
+ // instead of dispatching into a corpse.
167
+ void transport.closed.then(() => {
168
+ if (this.transport === transport)
169
+ this.onDied();
170
+ });
171
+ const identity = { name: "mindweave", version: appVersion() };
172
+ this.negotiated = await probe({
173
+ request: (method, params) => this.raw(transport, method, params),
174
+ notify: (method, params) => transport.notify(method, params),
175
+ }, identity, DEFAULT_CLIENT_CAPABILITIES);
176
+ await this.loadTools();
177
+ // Prompts are eager, resources are not, and the difference is deliberate. A prompt
178
+ // has to exist before the user presses `/`, so there is no lazy moment to fetch it
179
+ // in. A resource listing is only ever wanted when the model goes looking, and
180
+ // fetching every server's on connect would slow every session down for a feature
181
+ // most projects never touch.
182
+ await this.loadPrompts();
183
+ transport.onNotification((note) => this.onNotify(note));
184
+ await this.subscribe(transport);
185
+ this.state = "connected";
186
+ this.lastError = "";
187
+ this.attempts = 0; // a success clears the budget for the next outage
188
+ this.changed();
189
+ }
190
+ catch (error) {
191
+ await this.closeTransport();
192
+ this.lastError = describeError(error);
193
+ // A server asking for credentials is waiting on the user, not broken — and
194
+ // retrying cannot help, so it does not consume the attempt budget's meaning.
195
+ this.state = isAuthError(error) ? "needs-auth" : "failed";
196
+ this.changed();
197
+ }
198
+ }
199
+ /**
200
+ * Opt into the change notifications we can actually act on.
201
+ *
202
+ * Best-effort by design: a server that does not support `subscriptions/listen` (every
203
+ * pre-2026 one) or refuses the request is still perfectly usable. Letting a failed
204
+ * subscription fail the whole connection would drop most servers in existence for the
205
+ * sake of an optimization.
206
+ *
207
+ * Be precise about what is lost, because an earlier version of this comment was not:
208
+ * there is NO periodic refresh. `ttlMs` is only ever read as permission to SKIP a
209
+ * refetch, never as a timer, so nothing polls. Without a subscription the catalog moves
210
+ * only when the server pushes `notifications/tools/list_changed` on its own (which
211
+ * stdio servers do regardless of dialect, and many pre-2026 ones send) or when the user
212
+ * reconnects it from `/mcp`. A poller is deliberately not built: it would re-fetch every
213
+ * server on a timer to catch a case the push path already covers, and each refresh that
214
+ * did find a change would cost a prompt-cache prefix.
215
+ */
216
+ async subscribe(transport) {
217
+ if (!this.negotiated || this.negotiated.dialect !== "stateless")
218
+ return;
219
+ const types = subscriptionsFor(this.negotiated.capabilities);
220
+ if (types.length === 0)
221
+ return;
222
+ try {
223
+ if (transport.openStream)
224
+ await transport.openStream("subscriptions/listen", { types });
225
+ else
226
+ await this.call("subscriptions/listen", { types });
227
+ }
228
+ catch {
229
+ // No subscription. The catalog is then whatever the server pushes unprompted, or
230
+ // what a `/mcp` reconnect fetches — see above.
231
+ }
232
+ }
233
+ /** A server telling us one of its lists moved. */
234
+ onNotify(note) {
235
+ // Force past the TTL in every case: the server just told us the cached answer is wrong.
236
+ const refresh = isToolsChanged(note.method)
237
+ ? this.loadTools(true)
238
+ : isPromptsChanged(note.method)
239
+ ? this.loadPrompts()
240
+ : isResourcesChanged(note.method)
241
+ ? this.loadResources(true)
242
+ : null;
243
+ if (!refresh)
244
+ return;
245
+ void refresh
246
+ .then(() => this.changed())
247
+ .catch(() => {
248
+ // A refresh that fails leaves the previous list in place, which is strictly
249
+ // better than dropping it because one notification could not be served.
250
+ });
251
+ }
252
+ open() {
253
+ if (this.config.type === "http") {
254
+ return new HttpTransport({ url: this.config.url, ...(this.config.headers ? { headers: this.config.headers } : {}) });
255
+ }
256
+ return new StdioTransport({
257
+ command: this.config.command,
258
+ args: this.config.args,
259
+ ...(this.config.env ? { env: this.config.env } : {}),
260
+ });
261
+ }
262
+ /** A request that has NOT yet negotiated a dialect (the probe itself). */
263
+ raw(transport, method, params) {
264
+ return transport.request(method, params);
265
+ }
266
+ /**
267
+ * A request on the negotiated dialect: `_meta` is attached on stateless servers and
268
+ * omitted on handshake ones, where it would be an unknown field.
269
+ */
270
+ /**
271
+ * A call that may take several round trips (MRTR, 2026-07-28).
272
+ *
273
+ * A server that cannot finish in one go does not hold a connection open and does not
274
+ * ask us a question over a side channel — both of those are gone. It returns
275
+ * `resultType: "input_required"` with an opaque `requestState`, and the client calls
276
+ * again, echoing that state back. Each attempt is a genuinely independent request with
277
+ * its own id; nothing on this side is resumed.
278
+ *
279
+ * Two rules of the echo are easy to get subtly wrong, so they are explicit below: the
280
+ * state is whatever THIS round returned, never a value carried over from an earlier
281
+ * one, and a round that returns no state must be retried with no state rather than
282
+ * with the last one we happened to hold.
283
+ *
284
+ * We answer no `inputRequests`, and that is a consequence of declaring no elicitation
285
+ * capability rather than an omission here — a conforming server is forbidden from
286
+ * sending them (see `ClientCapabilities`). If one arrives anyway we fail the call and
287
+ * say what was asked for. Returning the half-finished result instead, which is what
288
+ * happened before this existed, told the model the tool had answered.
289
+ */
290
+ async callMultiRound(method, params, mirrored) {
291
+ let requestState;
292
+ for (let round = 0; round <= MAX_INPUT_ROUNDS; round++) {
293
+ const body = requestState === undefined ? params : { ...params, requestState };
294
+ const result = await this.call(method, body, mirrored);
295
+ const pending = readInputRequired(result);
296
+ if (!pending)
297
+ return result;
298
+ const asked = Object.values(pending.inputRequests).map((r) => r.method);
299
+ if (asked.length > 0) {
300
+ throw new RpcError(-32603, `mcp server '${this.config.name}' asked for input this client cannot provide (${[...new Set(asked)].join(", ")}). ` +
301
+ `Mindweave declares no elicitation capability, so a conforming server should not have requested it.`);
302
+ }
303
+ requestState = pending.requestState;
304
+ }
305
+ // A server MAY ask again on every attempt, so terminating is our job, not its own.
306
+ throw new RpcError(-32603, `mcp server '${this.config.name}' still needed more input after ${MAX_INPUT_ROUNDS + 1} attempts at ${method}`);
307
+ }
308
+ async call(method, params, mirrored) {
309
+ if (!this.transport || !this.negotiated)
310
+ throw new RpcError(-32603, `mcp server '${this.config.name}' is not connected`);
311
+ const meta = buildMeta(this.negotiated.dialect, this.negotiated.version, { name: "mindweave", version: appVersion() });
312
+ const body = meta ? { ...(params ?? {}), _meta: meta } : params;
313
+ return this.transport.request(method, body, mirrored);
314
+ }
315
+ /** Fetch (or refresh) the tool catalog, honouring the server's own `ttlMs`. */
316
+ async loadTools(force = false) {
317
+ if (!force && this.toolsFetchedAt && this.cache.ttlMs !== undefined) {
318
+ if (Date.now() - this.toolsFetchedAt < this.cache.ttlMs)
319
+ return; // still fresh
320
+ }
321
+ const result = await this.call("tools/list");
322
+ this.toolDefs = parseToolList(this.config.name, result, {
323
+ mirrorsHeaders: this.config.type === "http",
324
+ onReject: (tool, reason) => {
325
+ this.toolWarnings.push(`'${this.config.name}' tool '${tool}' was dropped: ${reason}`);
326
+ },
327
+ });
328
+ this.cache = cacheDirectiveOf(result);
329
+ this.toolsFetchedAt = Date.now();
330
+ }
331
+ /**
332
+ * Fetch this server's prompts, if it has any.
333
+ *
334
+ * Best-effort in both directions: a server that does not advertise prompts is not
335
+ * asked, and one that advertises them but fails the call simply has none. A broken
336
+ * `prompts/list` must not cost the user the server's tools, which are the main event.
337
+ */
338
+ async loadPrompts() {
339
+ if (!this.negotiated || !hasPrompts(this.negotiated.capabilities))
340
+ return;
341
+ try {
342
+ this.promptDefs = parsePromptList(this.config.name, await this.call("prompts/list"));
343
+ }
344
+ catch {
345
+ this.promptDefs = [];
346
+ }
347
+ }
348
+ /** Render one of this server's prompts. Rejects, because the caller is a command the
349
+ * user just typed and silence would be worse than an error. */
350
+ async getPrompt(name, args) {
351
+ return this.callMultiRound("prompts/get", { name, ...(Object.keys(args).length > 0 ? { arguments: args } : {}) });
352
+ }
353
+ /**
354
+ * Fetch (or refresh) this server's resources and templates.
355
+ *
356
+ * Honours the server's own `ttlMs` the same way the tool catalog does, which matters
357
+ * more here: the model can call the listing tool repeatedly within one turn, and
358
+ * without the cache each call would be two round trips to every server.
359
+ */
360
+ async loadResources(force = false) {
361
+ if (!this.negotiated || !hasResources(this.negotiated.capabilities))
362
+ return;
363
+ if (!force && this.resourcesFetchedAt && this.resourceCache.ttlMs !== undefined) {
364
+ if (Date.now() - this.resourcesFetchedAt < this.resourceCache.ttlMs)
365
+ return;
366
+ }
367
+ try {
368
+ const listed = await this.call("resources/list");
369
+ this.resourceDefs = parseResourceList(this.config.name, listed);
370
+ this.resourceCache = cacheDirectiveOf(listed);
371
+ this.resourcesFetchedAt = Date.now();
372
+ }
373
+ catch {
374
+ this.resourceDefs = [];
375
+ }
376
+ try {
377
+ // Separate try: templates are optional even for a server that has resources, and a
378
+ // server that has never heard of `resources/templates/list` must not lose its list.
379
+ this.templateDefs = parseTemplateList(this.config.name, await this.call("resources/templates/list"));
380
+ }
381
+ catch {
382
+ this.templateDefs = [];
383
+ }
384
+ }
385
+ resources() {
386
+ return this.resourceDefs;
387
+ }
388
+ resourceTemplates() {
389
+ return this.templateDefs;
390
+ }
391
+ /** True when this server declared a resources capability at all. */
392
+ offersResources() {
393
+ return Boolean(this.negotiated && hasResources(this.negotiated.capabilities));
394
+ }
395
+ /** Read one resource by URI. */
396
+ async readResource(uri) {
397
+ return parseResourceRead(await this.callMultiRound("resources/read", { uri }));
398
+ }
399
+ /** Invoke a tool on this server.
400
+ *
401
+ * Any parameter the server annotated with `x-mcp-header` is repeated in the headers.
402
+ * Not an optimisation: a server MUST reject a call whose annotated value is in the
403
+ * body but absent from the headers, so a tool with an annotation is simply uncallable
404
+ * without this. The annotations were validated when the catalog was parsed, which is
405
+ * why nothing here can fail. */
406
+ async callTool(name, args) {
407
+ const annotations = this.toolDefs.find((d) => d.name === name)?.paramHeaders;
408
+ const mirrored = annotations?.length ? paramHeaders(annotations, args) : undefined;
409
+ return this.callMultiRound("tools/call", { name, arguments: args }, mirrored);
410
+ }
411
+ /** Drain warnings about tools dropped from this server's catalog. One-shot. */
412
+ takeToolWarnings() {
413
+ const out = this.toolWarnings;
414
+ this.toolWarnings = [];
415
+ return out;
416
+ }
417
+ /**
418
+ * The server went away on its own. Drop the catalog and schedule a revival.
419
+ *
420
+ * Automatic, because the alternative is that a server which crashed once is gone for
421
+ * the rest of the session and the user has no way to know why their tools vanished.
422
+ * Bounded, because a server that cannot come back never does.
423
+ */
424
+ onDied() {
425
+ this.transport = null;
426
+ this.negotiated = null;
427
+ this.toolDefs = [];
428
+ this.promptDefs = [];
429
+ this.resourceDefs = [];
430
+ this.templateDefs = [];
431
+ this.toolsFetchedAt = 0;
432
+ this.resourcesFetchedAt = 0;
433
+ if (this.state === "connected") {
434
+ this.state = "pending";
435
+ this.lastError = "server exited";
436
+ this.attempts = 0; // this is a NEW outage, not a continuation of the last one
437
+ this.scheduleRetry();
438
+ }
439
+ this.changed();
440
+ }
441
+ scheduleRetry() {
442
+ if (this.closed || this.config.disabled)
443
+ return;
444
+ const delay = RECONNECT_BACKOFF_MS[this.attempts];
445
+ if (delay === undefined) {
446
+ // Out of automatic attempts. Say so plainly rather than sitting in `pending`
447
+ // forever, which reads as "still trying".
448
+ this.state = "failed";
449
+ this.lastError = `${this.lastError || "server exited"} (gave up after ${RECONNECT_BACKOFF_MS.length} reconnect attempts; /mcp to retry)`;
450
+ this.changed();
451
+ return;
452
+ }
453
+ this.clearRetry();
454
+ this.retryTimer = setTimeout(() => {
455
+ this.retryTimer = null;
456
+ void this.attempt().then(() => {
457
+ if (this.state !== "connected")
458
+ this.scheduleRetry();
459
+ });
460
+ }, delay);
461
+ // Never hold the process open just to retry a background server.
462
+ this.retryTimer.unref?.();
463
+ }
464
+ clearRetry() {
465
+ if (this.retryTimer)
466
+ clearTimeout(this.retryTimer);
467
+ this.retryTimer = null;
468
+ }
469
+ /** Tear down the transport but keep this connection revivable.
470
+ * `sync` is forwarded so an exit-handler teardown kills synchronously. */
471
+ async closeTransport(sync = false) {
472
+ const transport = this.transport;
473
+ this.transport = null;
474
+ this.negotiated = null;
475
+ this.toolDefs = [];
476
+ this.promptDefs = [];
477
+ this.resourceDefs = [];
478
+ this.templateDefs = [];
479
+ this.toolsFetchedAt = 0;
480
+ this.resourcesFetchedAt = 0;
481
+ if (transport)
482
+ await transport.close(sync).catch(() => { });
483
+ }
484
+ /**
485
+ * Shut down for good: no more retries, no more tools.
486
+ *
487
+ * `sync` must be set when closing from a process-exit handler. The kill that
488
+ * reaps a shelled server spawns `taskkill`, and an async spawn never reaches
489
+ * the OS during exit, so the server would outlive us.
490
+ */
491
+ async close(sync = false) {
492
+ this.closed = true;
493
+ this.clearRetry();
494
+ await this.closeTransport(sync);
495
+ }
496
+ }
497
+ function describeError(error) {
498
+ if (error instanceof UnsupportedProtocolVersionError)
499
+ return error.message;
500
+ if (error instanceof Error)
501
+ return error.message;
502
+ return String(error);
503
+ }
504
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/mcp/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAmB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAmB,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,iBAAiB,EAAuB,MAAM,eAAe,CAAC;AACjI,OAAO,EAAE,UAAU,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE5G,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAuBlC,gEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,CAAC,GAAG,KAAqD,CAAC;IAChE,IAAI,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,qCAAqC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,OAAO,aAAa;IAyBH;IAxBb,SAAS,GAAqB,IAAI,CAAC;IACnC,UAAU,GAAsB,IAAI,CAAC;IACrC,QAAQ,GAAiB,EAAE,CAAC;IACpC;;iDAE6C;IACrC,YAAY,GAAa,EAAE,CAAC;IAC5B,UAAU,GAAgB,EAAE,CAAC;IAC7B,YAAY,GAAkB,EAAE,CAAC;IACjC,YAAY,GAA0B,EAAE,CAAC;IACzC,KAAK,GAAmB,EAAE,CAAC;IAC3B,cAAc,GAAG,CAAC,CAAC;IAC3B;6FACyF;IACjF,kBAAkB,GAAG,CAAC,CAAC;IACvB,aAAa,GAAmB,EAAE,CAAC;IACnC,KAAK,CAAkB;IACvB,SAAS,GAAG,EAAE,CAAC;IACf,QAAQ,GAAG,CAAC,CAAC;IACb,UAAU,GAAyB,IAAI,CAAC;IACxC,UAAU,GAAyC,IAAI,CAAC;IACxD,MAAM,GAAG,KAAK,CAAC;IACf,QAAQ,GAAwB,IAAI,CAAC;IAE7C,YAAqB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;QAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAED,iFAAiF;IACjF,WAAW,CAAC,OAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC/B,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YACnC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC;IACJ,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;2FACuF;IACvF,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC;IACpC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU;YAAE,OAAO;QACtC,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QACvC,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAC5C,IAAI,IAAI,CAAC,QAAQ,IAAI,oBAAoB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO;QAC9E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,gFAAgF;YAChF,wCAAwC;YACxC,KAAK,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC9B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;oBAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;YAC9D,IAAI,CAAC,UAAU,GAAG,MAAM,KAAK,CAC3B;gBACE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;gBAChE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;aAC7D,EACD,QAAQ,EACR,2BAA2B,CAC5B,CAAC;YAEF,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,mFAAmF;YACnF,mFAAmF;YACnF,8EAA8E;YAC9E,iFAAiF;YACjF,6BAA6B;YAC7B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,SAAS,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACxD,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,kDAAkD;YACrE,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACtC,2EAA2E;YAC3E,6EAA6E;YAC7E,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,KAAK,CAAC,SAAS,CAAC,SAAoB;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,WAAW;YAAE,OAAO;QACxE,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,IAAI,CAAC;YACH,IAAI,SAAS,CAAC,UAAU;gBAAE,MAAM,SAAS,CAAC,UAAU,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;;gBACnF,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;YACjF,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,kDAAkD;IAC1C,QAAQ,CAAC,IAAwB;QACvC,wFAAwF;QACxF,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;gBACpB,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC/B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;oBAC1B,CAAC,CAAC,IAAI,CAAC;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,KAAK,OAAO;aACT,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aAC1B,KAAK,CAAC,GAAG,EAAE;YACV,4EAA4E;YAC5E,wEAAwE;QAC1E,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,IAAI;QACV,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,OAAO,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvH,CAAC;QACD,OAAO,IAAI,cAAc,CAAC;YACxB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAClE,GAAG,CAAC,SAAoB,EAAE,MAAc,EAAE,MAAgC;QAChF,OAAO,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACH;;;;;;;;;;;;;;;;;;;OAmBG;IACK,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,MAA+B,EAAE,QAAiC;QAC7G,IAAI,YAAgC,CAAC;QACrC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,gBAAgB,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,CAAC;YAC/E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC;YAE5B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,QAAQ,CAChB,CAAC,KAAK,EACN,eAAe,IAAI,CAAC,MAAM,CAAC,IAAI,iDAAiD,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;oBACjH,oGAAoG,CACvG,CAAC;YACJ,CAAC;YACD,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACtC,CAAC;QACD,mFAAmF;QACnF,MAAM,IAAI,QAAQ,CAChB,CAAC,KAAK,EACN,eAAe,IAAI,CAAC,MAAM,CAAC,IAAI,mCAAmC,gBAAgB,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAC/G,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAgC,EAAE,QAAiC;QACpG,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,CAAC;QACzH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QACvH,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK;QAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,OAAO,CAAC,cAAc;QACjF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE;YACtD,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;YAC3C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,IAAI,kBAAkB,MAAM,EAAE,CAAC,CAAC;YACxF,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO;QAC1E,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;oEACgE;IAChE,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAA4B;QACxD,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO;QAC5E,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChF,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK;gBAAE,OAAO;QAC9E,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACjD,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC;YACH,mFAAmF;YACnF,oFAAoF;YACpF,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACvG,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,oEAAoE;IACpE,eAAe;QACb,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,OAAO,iBAAiB,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;;;;;qCAMiC;IACjC,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAA6B;QACxD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,YAAY,CAAC;QAC7E,MAAM,QAAQ,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChF,CAAC;IAED,+EAA+E;IAC/E,gBAAgB;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACK,MAAM;QACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,2DAA2D;YAC9E,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO;QAChD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,6EAA6E;YAC7E,0CAA0C;YAC1C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,eAAe,mBAAmB,oBAAoB,CAAC,MAAM,qCAAqC,CAAC;YACzI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;oBAAE,IAAI,CAAC,aAAa,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,UAAU;YAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;+EAC2E;IACnE,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,KAAK;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,SAAS;YAAE,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,+BAA+B;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAC3E,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { mcpToolName } from "./catalog.js";
2
+ /**
3
+ * Catalogs at or below this many tools are advertised in full.
4
+ *
5
+ * Below the threshold, deferral is strictly WORSE: the model pays a search round trip
6
+ * to reach tools it could simply have been shown, and a small catalog costs little to
7
+ * send. The point is to fix the many-tools case, not to hide three tools behind a menu.
8
+ */
9
+ export const DEFER_THRESHOLD = 25;
10
+ /** How many results one search returns. Enough to choose from, few enough to read. */
11
+ export const MAX_SEARCH_RESULTS = 8;
12
+ /** Should this catalog be held back behind search? */
13
+ export function shouldDefer(toolCount, threshold = DEFER_THRESHOLD) {
14
+ return toolCount > threshold;
15
+ }
16
+ /** Split a tool name into lowercase parts: `mcp__github__create_issue` → github, create, issue. */
17
+ export function nameParts(def) {
18
+ return `${def.server} ${def.name}`
19
+ .toLowerCase()
20
+ .split(/[^a-z0-9]+/)
21
+ .filter(Boolean);
22
+ }
23
+ /**
24
+ * Score one tool against the query terms (pure).
25
+ *
26
+ * Weights are deliberately blunt. This is keyword matching, not retrieval: the model
27
+ * already knows roughly what it wants and usually queries with a server name ("github"),
28
+ * an action ("create issue"), or the tool name itself. Precision matters less than never
29
+ * returning nothing useful for a reasonable query.
30
+ */
31
+ export function scoreTool(def, terms) {
32
+ const parts = nameParts(def);
33
+ const description = def.description.toLowerCase();
34
+ let score = 0;
35
+ for (const term of terms) {
36
+ if (parts.includes(term))
37
+ score += 10; // whole word in the name: the strongest signal
38
+ else if (parts.some((p) => p.includes(term)))
39
+ score += 5;
40
+ // A description match is weak on its own — descriptions are long and mention a lot.
41
+ if (description.includes(term))
42
+ score += 2;
43
+ }
44
+ return score;
45
+ }
46
+ /**
47
+ * Find tools matching a query (pure).
48
+ *
49
+ * The two special cases at the top are not politeness, they are the failure modes this
50
+ * kind of search actually hits. A model that already knows the exact tool name will
51
+ * pass it verbatim rather than describing it, and a model that knows the server will
52
+ * pass `mcp__server`. Both look like zero-scoring queries to a keyword ranker and would
53
+ * return nothing, which reads to the model as "that tool does not exist" — so it stops
54
+ * asking and guesses instead. Handling them is what keeps search from being a dead end.
55
+ */
56
+ export function searchCatalog(query, defs, max = MAX_SEARCH_RESULTS) {
57
+ const q = query.toLowerCase().trim();
58
+ if (!q)
59
+ return [];
60
+ // Exact advertised name, or exact bare name.
61
+ const exact = defs.find((d) => mcpToolName(d.server, d.name).toLowerCase() === q || d.name.toLowerCase() === q);
62
+ if (exact)
63
+ return [exact];
64
+ // A server prefix: give back that server's tools.
65
+ if (q.startsWith("mcp__")) {
66
+ const prefixed = defs.filter((d) => mcpToolName(d.server, d.name).toLowerCase().startsWith(q));
67
+ if (prefixed.length > 0)
68
+ return prefixed.slice(0, max);
69
+ }
70
+ // A bare server name: same idea, without the prefix.
71
+ const byServer = defs.filter((d) => d.server.toLowerCase() === q);
72
+ if (byServer.length > 0)
73
+ return byServer.slice(0, max);
74
+ const terms = q.split(/[^a-z0-9]+/).filter(Boolean);
75
+ if (terms.length === 0)
76
+ return [];
77
+ const scored = defs
78
+ .map((def) => ({ def, score: scoreTool(def, terms) }))
79
+ .filter((s) => s.score > 0)
80
+ // Ties break on name so results are stable between identical searches.
81
+ .sort((a, b) => b.score - a.score || mcpToolName(a.def.server, a.def.name).localeCompare(mcpToolName(b.def.server, b.def.name)));
82
+ return scored.slice(0, max).map((s) => s.def);
83
+ }
84
+ /**
85
+ * Render search results for the model: each match's full callable definition.
86
+ *
87
+ * The FULL schema, not a summary line, and that is what makes deferral pay. A summary
88
+ * only tells the model a tool exists; it then has to be added to the advertised `tools`
89
+ * array before it can be called, and that rewrites the provider's cached prefix — tools,
90
+ * system and messages — at full price. Delivered here instead, the schema rides in an
91
+ * appended message: every earlier byte is untouched, the cache survives, and the schema
92
+ * is itself cached from the next call onward. Dispatch resolves against the catalog
93
+ * rather than against what was advertised, so a name and a schema is all it takes.
94
+ */
95
+ export function renderResults(defs) {
96
+ return defs
97
+ .map((d) => `<function>${JSON.stringify({
98
+ name: mcpToolName(d.server, d.name),
99
+ description: d.description,
100
+ parameters: d.inputSchema,
101
+ })}</function>`)
102
+ .join("\n");
103
+ }
104
+ //# sourceMappingURL=deferred.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferred.js","sourceRoot":"","sources":["../../src/mcp/deferred.ts"],"names":[],"mappings":"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"}