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,321 @@
1
+ /**
2
+ * http.ts — MCP over Streamable HTTP.
3
+ *
4
+ * The remote transport, and the one 2026-07-28 changed most. What it is NOT, any more:
5
+ *
6
+ * - No session. The `Mcp-Session-Id` header is gone; there is nothing to establish,
7
+ * echo back, or re-establish on a 404. Each POST stands alone.
8
+ * - No GET channel. Server-to-client notifications moved to an explicit
9
+ * `subscriptions/listen` stream, which is a POST like everything else.
10
+ * - No resumability. SSE event ids and `Last-Event-ID` were removed. A broken stream
11
+ * LOSES the in-flight request, and the spec says to re-issue it as a new request
12
+ * with a new id. So we do not try to reconnect mid-request and pretend nothing
13
+ * happened; we fail it and let the caller decide.
14
+ *
15
+ * What remains is refreshingly plain: POST a JSON-RPC frame, get back either a single
16
+ * JSON body or an SSE stream, and read the response for THIS request off that stream.
17
+ * The server chooses which; the client says it accepts both.
18
+ *
19
+ * HTTP+SSE (the old two-endpoint transport) is deliberately not implemented. It was
20
+ * deprecated in 2025-03-26 and its sunset has already passed.
21
+ */
22
+ import { META_PROTOCOL_VERSION } from "../protocol.js";
23
+ import { encodeHeaderValue } from "./headerValue.js";
24
+ import { DEFAULT_REQUEST_TIMEOUT_MS, RpcError } from "./types.js";
25
+ export { encodeHeaderValue };
26
+ /**
27
+ * Parse an SSE body into its `data:` payloads (pure).
28
+ *
29
+ * Events are separated by a blank line and a single event's data may span several
30
+ * `data:` lines, which are joined with a newline. We deliberately ignore `id:` fields:
31
+ * they exist in older streams, but resumability was removed and honouring them would
32
+ * imply a redelivery guarantee the protocol no longer makes.
33
+ */
34
+ export function parseSseEvents(body) {
35
+ const out = [];
36
+ for (const block of body.split(/\r?\n\r?\n/)) {
37
+ const data = block
38
+ .split(/\r?\n/)
39
+ .filter((line) => line.startsWith("data:"))
40
+ .map((line) => line.slice(5).replace(/^ /, ""))
41
+ .join("\n");
42
+ if (data.trim())
43
+ out.push(data);
44
+ }
45
+ return out;
46
+ }
47
+ /**
48
+ * Pick the JSON-RPC message answering `id` out of a decoded body (pure).
49
+ *
50
+ * A response stream can carry progress notifications and log messages alongside the
51
+ * actual result, so "the last message" is not good enough — matching on the id is what
52
+ * stops a progress notification being mistaken for a result.
53
+ */
54
+ export function findResponse(messages, id) {
55
+ for (const msg of messages) {
56
+ const m = msg;
57
+ if (m && typeof m === "object" && m.id === id && ("result" in m || "error" in m)) {
58
+ return m;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Incrementally pull complete SSE events out of a growing buffer (pure).
65
+ *
66
+ * `parseSseEvents` is fine for a body that has finished arriving. A subscription stream
67
+ * never finishes, so it has to be consumed as it goes: this returns whatever whole
68
+ * events are already present and the partial tail still waiting for its blank line.
69
+ */
70
+ export function drainSseEvents(buffer) {
71
+ const parts = buffer.split(/\r?\n\r?\n/);
72
+ // The final segment has not been terminated by a blank line yet, so it may be half
73
+ // an event. Everything before it is complete.
74
+ const rest = parts.pop() ?? "";
75
+ const events = [];
76
+ for (const block of parts) {
77
+ const data = block
78
+ .split(/\r?\n/)
79
+ .filter((line) => line.startsWith("data:"))
80
+ .map((line) => line.slice(5).replace(/^ /, ""))
81
+ .join("\n");
82
+ if (data.trim())
83
+ events.push(data);
84
+ }
85
+ return { events, rest };
86
+ }
87
+ /**
88
+ * The metadata headers Streamable HTTP mirrors out of the body so that intermediaries
89
+ * can route and inspect a request without parsing it (2026-07-28).
90
+ *
91
+ * A conforming server checks every one of these against the body and MUST answer a
92
+ * mismatch, or a missing required header, with 400 and `-32020 HeaderMismatch`. That
93
+ * cuts both ways, and both directions are load-bearing here: `Mcp-Name` carries
94
+ * `params.name` or `params.uri` — never the method, which would disagree with the body
95
+ * on every single `tools/call` — and it is omitted outright when the request has no
96
+ * target rather than being padded with something that cannot match.
97
+ *
98
+ * The body stays the source of truth, which is why the protocol version is read back out
99
+ * of `_meta` rather than passed in alongside it. Two sources drift; one cannot.
100
+ */
101
+ export function metadataHeaders(method, params) {
102
+ const headers = { "mcp-method": method };
103
+ // `tools/call` and `prompts/get` name their target; `resources/read` addresses one by
104
+ // uri. Deriving from the value rather than from a list of methods covers those three
105
+ // and stays correct for anything later that mirrors a target the same way.
106
+ const target = params?.name ?? params?.uri;
107
+ if (typeof target === "string")
108
+ headers["mcp-name"] = encodeHeaderValue(target);
109
+ const meta = params?._meta;
110
+ const version = meta?.[META_PROTOCOL_VERSION];
111
+ // Absent on the handshake dialect, where the version was agreed once in `initialize`
112
+ // and there is no `_meta` to mirror. Asserting a version we did not take from the body
113
+ // would manufacture the very disagreement this header exists to prevent.
114
+ if (typeof version === "string")
115
+ headers["mcp-protocol-version"] = version;
116
+ return headers;
117
+ }
118
+ export class HttpTransport {
119
+ options;
120
+ nextId = 1;
121
+ disposed = false;
122
+ timeoutMs;
123
+ fetchImpl;
124
+ notificationHandler = null;
125
+ streams = new Set();
126
+ resolveClosed;
127
+ closed;
128
+ constructor(options) {
129
+ this.options = options;
130
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
131
+ this.fetchImpl = options.fetchImpl ?? fetch;
132
+ this.closed = new Promise((resolve) => {
133
+ this.resolveClosed = resolve;
134
+ });
135
+ }
136
+ async request(method, params, mirrored) {
137
+ if (this.disposed)
138
+ throw new RpcError(-32603, "mcp transport is closed");
139
+ const id = this.nextId++;
140
+ const message = { jsonrpc: "2.0", id, method, ...(params ? { params } : {}) };
141
+ const controller = new AbortController();
142
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
143
+ timer.unref?.();
144
+ let response;
145
+ try {
146
+ response = await this.fetchImpl(this.options.url, {
147
+ method: "POST",
148
+ signal: controller.signal,
149
+ headers: {
150
+ "content-type": "application/json",
151
+ // The client says it takes either shape; the SERVER picks. A single result
152
+ // comes back as JSON, a long-running call upgrades to a stream.
153
+ accept: "application/json, text/event-stream",
154
+ ...(this.options.headers ?? {}),
155
+ // Mirrored last, so configuration cannot overwrite them. These are not
156
+ // settings — they are a restatement of the body, checked against it by the
157
+ // server, and a configured header that disagreed would earn a -32020 on every
158
+ // call with no way for the user to see why.
159
+ ...metadataHeaders(method, params),
160
+ ...(mirrored ?? {}),
161
+ },
162
+ body: JSON.stringify(message),
163
+ });
164
+ }
165
+ catch (error) {
166
+ const reason = controller.signal.aborted ? `timeout after ${this.timeoutMs}ms` : String(error?.message ?? error);
167
+ throw new RpcError(-32603, `mcp request failed: ${method}: ${reason}`);
168
+ }
169
+ finally {
170
+ clearTimeout(timer);
171
+ }
172
+ if (!response.ok) {
173
+ // 401/403 are the auth signal the connection layer turns into `needs-auth`
174
+ // rather than `failed`, so the code has to survive as more than a message.
175
+ throw new RpcError(httpErrorCode(response.status), `mcp http ${response.status} ${response.statusText || ""}`.trim());
176
+ }
177
+ const contentType = response.headers.get("content-type") ?? "";
178
+ const body = await response.text();
179
+ const messages = contentType.includes("text/event-stream")
180
+ ? parseSseEvents(body).map(safeParse)
181
+ : [safeParse(body)];
182
+ const answer = findResponse(messages.filter((m) => m !== undefined), id);
183
+ if (!answer) {
184
+ // A stream that ended without answering is exactly the "broken response stream"
185
+ // case: the spec's remedy is a NEW request, not a resume, so we surface it.
186
+ throw new RpcError(-32603, `mcp response stream ended without a result for ${method}`);
187
+ }
188
+ if (answer.error) {
189
+ const code = typeof answer.error.code === "number" ? answer.error.code : -32603;
190
+ const msg = typeof answer.error.message === "string" ? answer.error.message : "mcp error";
191
+ throw new RpcError(code, msg, answer.error.data);
192
+ }
193
+ return answer.result;
194
+ }
195
+ /** Notifications have no id and no reply, so failure is not actionable. */
196
+ notify(method, params) {
197
+ if (this.disposed)
198
+ return;
199
+ void this.fetchImpl(this.options.url, {
200
+ method: "POST",
201
+ headers: {
202
+ "content-type": "application/json",
203
+ accept: "application/json, text/event-stream",
204
+ ...metadataHeaders(method, params),
205
+ ...(this.options.headers ?? {}),
206
+ },
207
+ body: JSON.stringify({ jsonrpc: "2.0", method, ...(params ? { params } : {}) }),
208
+ }).catch(() => {
209
+ /* nothing awaits a notification */
210
+ });
211
+ }
212
+ onNotification(handler) {
213
+ this.notificationHandler = handler;
214
+ }
215
+ /**
216
+ * Open a long-lived response stream and pump notifications off it until it ends.
217
+ *
218
+ * This is how `subscriptions/listen` works after 2026-07-28 removed the GET endpoint:
219
+ * one POST whose response never completes. It cannot go through `request()`, which
220
+ * buffers the whole body and would therefore wait forever.
221
+ *
222
+ * Resolves once the stream is ESTABLISHED, not when it ends — the caller wants to know
223
+ * the subscription took, and then get on with its life. There is no resumability, so a
224
+ * stream that drops is simply over; reviving it is the connection layer's business.
225
+ */
226
+ async openStream(method, params) {
227
+ if (this.disposed)
228
+ throw new RpcError(-32603, "mcp transport is closed");
229
+ const controller = new AbortController();
230
+ this.streams.add(controller);
231
+ const response = await this.fetchImpl(this.options.url, {
232
+ method: "POST",
233
+ signal: controller.signal,
234
+ headers: {
235
+ "content-type": "application/json",
236
+ accept: "text/event-stream",
237
+ ...metadataHeaders(method, params),
238
+ ...(this.options.headers ?? {}),
239
+ },
240
+ // No id: nothing resolves this, and a stream is not a request/response pair.
241
+ body: JSON.stringify({ jsonrpc: "2.0", id: this.nextId++, method, ...(params ? { params } : {}) }),
242
+ }).catch((error) => {
243
+ this.streams.delete(controller);
244
+ throw new RpcError(-32603, `mcp subscription failed: ${String(error?.message ?? error)}`);
245
+ });
246
+ if (!response.ok) {
247
+ this.streams.delete(controller);
248
+ throw new RpcError(httpErrorCode(response.status), `mcp http ${response.status} on ${method}`);
249
+ }
250
+ const body = response.body;
251
+ if (!body) {
252
+ this.streams.delete(controller);
253
+ throw new RpcError(-32603, `mcp subscription returned no stream for ${method}`);
254
+ }
255
+ // Pump in the background. Deliberately not awaited: the subscription is live from
256
+ // here on, and awaiting it would block the caller until the server goes away.
257
+ void this.pump(body, controller);
258
+ }
259
+ async pump(body, controller) {
260
+ const reader = body.getReader();
261
+ const decoder = new TextDecoder();
262
+ let buffer = "";
263
+ try {
264
+ for (;;) {
265
+ const { done, value } = await reader.read();
266
+ if (done)
267
+ break;
268
+ buffer += decoder.decode(value, { stream: true });
269
+ const { events, rest } = drainSseEvents(buffer);
270
+ buffer = rest;
271
+ for (const event of events) {
272
+ const msg = safeParse(event);
273
+ // Only server-initiated messages matter here; anything with an id on this
274
+ // stream is not something we are waiting on.
275
+ if (msg && typeof msg.method === "string" && this.notificationHandler) {
276
+ this.notificationHandler({
277
+ method: msg.method,
278
+ ...(msg.params && typeof msg.params === "object" ? { params: msg.params } : {}),
279
+ });
280
+ }
281
+ }
282
+ }
283
+ }
284
+ catch {
285
+ // A dropped stream is not recoverable at this layer: resumability was removed, so
286
+ // there is nothing to resume. The connection layer decides whether to re-subscribe.
287
+ }
288
+ finally {
289
+ this.streams.delete(controller);
290
+ reader.releaseLock?.();
291
+ }
292
+ }
293
+ async close() {
294
+ if (this.disposed)
295
+ return;
296
+ this.disposed = true;
297
+ // Long-lived subscription streams would otherwise hold the process open.
298
+ for (const controller of this.streams)
299
+ controller.abort();
300
+ this.streams.clear();
301
+ // No DELETE and no session teardown: there is no server-side session to end.
302
+ this.resolveClosed();
303
+ }
304
+ }
305
+ /** Map an HTTP status onto a JSON-RPC-ish code the connection layer can classify. */
306
+ export function httpErrorCode(status) {
307
+ if (status === 401 || status === 403)
308
+ return -32001; // auth: implementation-defined range
309
+ if (status === 404)
310
+ return -32601; // no such endpoint reads as no such method
311
+ return -32603;
312
+ }
313
+ function safeParse(text) {
314
+ try {
315
+ return JSON.parse(text);
316
+ }
317
+ catch {
318
+ return undefined;
319
+ }
320
+ }
321
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/mcp/transport/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { killTree, killTreeSync, spawnManaged } from "../../tools/killTree.js";
2
+ import { DEFAULT_REQUEST_TIMEOUT_MS, RpcError } from "./types.js";
3
+ /** How much of the child's stderr to keep for diagnostics. */
4
+ const STDERR_TAIL_CHARS = 4_000;
5
+ /**
6
+ * Does this command need a shell on Windows (pure)?
7
+ *
8
+ * `spawn` on Windows executes a binary directly and does NOT apply PATHEXT, so it can
9
+ * only find something that is already a real executable. Every npm-installed launcher —
10
+ * `npx`, `pnpm`, `uvx`, `yarn` — is a `.cmd` shim on PATH, so `spawn("npx", …)` fails
11
+ * with ENOENT. That matters more than it sounds: `{"command": "npx", "args": ["-y",
12
+ * "@scope/server"]}` is how essentially every MCP server in the ecosystem is configured,
13
+ * including in this codebase's own config docstring. Checking for a literal `.cmd`/`.bat`
14
+ * suffix (what we did before) only helps the rare user who spelled the extension out.
15
+ *
16
+ * So: anything that is not already a directly-executable image goes through the shell,
17
+ * which is what performs PATHEXT lookup. `.exe`/`.com` and absolute paths to them are
18
+ * spawned directly, because a shell there buys nothing and adds a quoting problem.
19
+ */
20
+ export function windowsNeedsShell(command) {
21
+ return !/\.(exe|com)$/i.test(command.trim());
22
+ }
23
+ /**
24
+ * Quote one token for `cmd.exe` (pure).
25
+ *
26
+ * Only when it needs it: an untouched token is easier to read in an error message, and
27
+ * the overwhelming majority (`-y`, `@scope/pkg`) contain nothing special. Internal
28
+ * quotes are doubled, which is the form `cmd` itself understands.
29
+ */
30
+ export function quoteForCmd(token) {
31
+ if (token === "")
32
+ return '""';
33
+ if (!/[\s"^&|<>()%!]/.test(token))
34
+ return token;
35
+ return `"${token.replace(/"/g, '""')}"`;
36
+ }
37
+ /**
38
+ * Build the single command line a shell spawn takes (pure).
39
+ *
40
+ * The previous code interpolated `"${command}" ${args.join(" ")}`, which breaks the
41
+ * moment any argument holds a space — a Windows path with `Program Files` in it, say —
42
+ * because the argument silently splits in two.
43
+ */
44
+ export function windowsCommandLine(command, args) {
45
+ return [command, ...args].map(quoteForCmd).join(" ");
46
+ }
47
+ /** Build a message frame. Exported for the framing test — the bug it guards (a missing
48
+ * trailing newline) makes a server wait forever rather than fail. */
49
+ export function frame(message) {
50
+ return JSON.stringify(message) + "\n";
51
+ }
52
+ /**
53
+ * Split a buffer into complete lines plus the unconsumed remainder (pure).
54
+ *
55
+ * A pipe delivers arbitrary chunks: one read can hold three messages, or half of one.
56
+ * Keeping this pure is what lets the split-frame cases be tested without a process.
57
+ */
58
+ export function drainLines(buffer) {
59
+ const lines = [];
60
+ let rest = buffer;
61
+ let nl;
62
+ while ((nl = rest.indexOf("\n")) >= 0) {
63
+ const line = rest.slice(0, nl).trim();
64
+ rest = rest.slice(nl + 1);
65
+ if (line)
66
+ lines.push(line);
67
+ }
68
+ return { lines, rest };
69
+ }
70
+ export class StdioTransport {
71
+ proc;
72
+ /** True when the child is a shell wrapping the real server (Windows). */
73
+ shelled;
74
+ nextId = 1;
75
+ buffer = "";
76
+ stderrTail = "";
77
+ disposed = false;
78
+ timeoutMs;
79
+ pending = new Map();
80
+ notificationHandler = null;
81
+ resolveClosed;
82
+ closed;
83
+ constructor(options) {
84
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
85
+ this.closed = new Promise((resolve) => {
86
+ this.resolveClosed = resolve;
87
+ });
88
+ const args = [...(options.args ?? [])];
89
+ const env = { ...process.env, ...(options.env ?? {}) };
90
+ // On Windows almost everything has to go through a shell to be found at all; see
91
+ // `windowsNeedsShell`. POSIX spawns directly, where PATH lookup already works and a
92
+ // shell would only add a quoting surface.
93
+ this.shelled = process.platform === "win32" && windowsNeedsShell(options.command);
94
+ // spawnManaged, not spawn: on POSIX it makes the server its own process-group
95
+ // leader, which is what lets `close` take its children down with it. An MCP server
96
+ // is very often a launcher (`npx`, `uvx`, `pnpm dlx`) whose real work happens in a
97
+ // grandchild, and those used to survive Mindweave exiting.
98
+ this.proc = this.shelled
99
+ ? spawnManaged(windowsCommandLine(options.command, args), [], {
100
+ stdio: ["pipe", "pipe", "pipe"],
101
+ windowsHide: true,
102
+ shell: true,
103
+ env,
104
+ ...(options.cwd ? { cwd: options.cwd } : {}),
105
+ })
106
+ : spawnManaged(options.command, args, {
107
+ stdio: ["pipe", "pipe", "pipe"],
108
+ windowsHide: true,
109
+ env,
110
+ ...(options.cwd ? { cwd: options.cwd } : {}),
111
+ });
112
+ this.proc.stdout?.setEncoding("utf8");
113
+ this.proc.stdout?.on("data", (chunk) => this.onData(chunk));
114
+ this.proc.stderr?.setEncoding("utf8");
115
+ this.proc.stderr?.on("data", (chunk) => {
116
+ this.stderrTail = (this.stderrTail + chunk).slice(-STDERR_TAIL_CHARS);
117
+ });
118
+ // Both are terminal for us; `error` fires when the command does not exist at all.
119
+ this.proc.on("exit", (code) => this.die(new Error(`mcp server exited (code ${code ?? "unknown"})${this.stderrNote()}`)));
120
+ this.proc.on("error", (e) => this.die(new Error(`mcp server failed to start: ${e.message}${this.stderrNote()}`)));
121
+ }
122
+ onNotification(handler) {
123
+ this.notificationHandler = handler;
124
+ }
125
+ /** The child's recent stderr, if any — usually the actual reason a server failed. */
126
+ stderr() {
127
+ return this.stderrTail.trim();
128
+ }
129
+ stderrNote() {
130
+ const tail = this.stderr();
131
+ return tail ? `: ${tail.split("\n").slice(-3).join(" ").slice(0, 300)}` : "";
132
+ }
133
+ onData(chunk) {
134
+ this.buffer += chunk;
135
+ const { lines, rest } = drainLines(this.buffer);
136
+ this.buffer = rest;
137
+ for (const line of lines) {
138
+ let msg;
139
+ try {
140
+ msg = JSON.parse(line);
141
+ }
142
+ catch {
143
+ continue; // a banner, a log line, anything — not our problem
144
+ }
145
+ if (typeof msg.id !== "number") {
146
+ // Server-initiated. Nothing awaits it, but `subscriptions/listen` change
147
+ // notifications arrive this way on stdio, so they have to be handed up rather
148
+ // than dropped on the floor the way Phase 1 did.
149
+ const note = msg;
150
+ if (typeof note.method === "string" && this.notificationHandler) {
151
+ this.notificationHandler({
152
+ method: note.method,
153
+ ...(note.params && typeof note.params === "object" ? { params: note.params } : {}),
154
+ });
155
+ }
156
+ continue;
157
+ }
158
+ const waiter = this.pending.get(msg.id);
159
+ if (!waiter)
160
+ continue;
161
+ this.pending.delete(msg.id);
162
+ clearTimeout(waiter.timer);
163
+ if (msg.error) {
164
+ const code = typeof msg.error.code === "number" ? msg.error.code : -32603;
165
+ const message = typeof msg.error.message === "string" ? msg.error.message : "mcp error";
166
+ waiter.reject(new RpcError(code, message, msg.error.data));
167
+ }
168
+ else {
169
+ waiter.resolve(msg.result);
170
+ }
171
+ }
172
+ }
173
+ /** Mirrored headers are accepted and ignored: a pipe has no headers, and the spec lets
174
+ * a non-HTTP client ignore `x-mcp-header` annotations entirely. */
175
+ request(method, params) {
176
+ if (this.disposed)
177
+ return Promise.reject(new RpcError(-32603, "mcp transport is closed"));
178
+ const id = this.nextId++;
179
+ return new Promise((resolve, reject) => {
180
+ const timer = setTimeout(() => {
181
+ this.pending.delete(id);
182
+ reject(new RpcError(-32603, `mcp timeout after ${this.timeoutMs}ms: ${method}`));
183
+ }, this.timeoutMs);
184
+ // Do not hold the event loop open just to wait on a slow server.
185
+ timer.unref?.();
186
+ this.pending.set(id, { resolve, reject, timer });
187
+ this.write({ jsonrpc: "2.0", id, method, ...(params ? { params } : {}) });
188
+ });
189
+ }
190
+ notify(method, params) {
191
+ if (this.disposed)
192
+ return;
193
+ this.write({ jsonrpc: "2.0", method, ...(params ? { params } : {}) });
194
+ }
195
+ write(message) {
196
+ try {
197
+ this.proc.stdin?.write(frame(message));
198
+ }
199
+ catch {
200
+ // The child is gone; the pending request will time out or be failed by `die`.
201
+ }
202
+ }
203
+ /** Fail everything in flight and mark the transport dead. Idempotent. */
204
+ die(error) {
205
+ if (this.disposed)
206
+ return;
207
+ this.disposed = true;
208
+ for (const waiter of this.pending.values()) {
209
+ clearTimeout(waiter.timer);
210
+ waiter.reject(error);
211
+ }
212
+ this.pending.clear();
213
+ this.resolveClosed();
214
+ }
215
+ async close(sync = false) {
216
+ if (!this.disposed)
217
+ this.die(new Error("mcp transport closed"));
218
+ try {
219
+ // Always kill the TREE, on every platform. A shelled child is `cmd.exe` rather
220
+ // than the server, so killing the handle leaves the real process running — but
221
+ // the same is true off Windows whenever the server is a launcher (`npx`, `uvx`)
222
+ // that does its work in a child. This used to be gated on `shelled`, which is
223
+ // Windows-only, so on macOS and Linux only the direct child was ever signalled
224
+ // and its children were orphaned. From a process-exit handler the async path
225
+ // never reaches the OS, so that case has to block instead.
226
+ (sync ? killTreeSync : killTree)(this.proc.pid);
227
+ this.proc.kill();
228
+ }
229
+ catch {
230
+ // Already gone.
231
+ }
232
+ }
233
+ }
234
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/mcp/transport/stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * types.ts — the one thing every MCP transport has to be.
3
+ *
4
+ * MCP runs over a local child process (stdio) or over HTTP (Streamable HTTP). Those are
5
+ * genuinely different animals: one is a pipe you own the lifecycle of, the other is a
6
+ * request/response with streaming bodies and no session. Everything above this file
7
+ * should not care which it got, so the difference stops here.
8
+ *
9
+ * Kept to request/notify/close on purpose. MCP's server-to-client traffic used to need
10
+ * more surface, but 2026-07-28 removed `ping`, removed the HTTP GET channel, and moved
11
+ * change notifications onto an explicit `subscriptions/listen` stream — so a transport
12
+ * no longer needs a general inbound-message channel just to stay alive.
13
+ */
14
+ /** A JSON-RPC error surfaced by a transport, carrying the code so callers can classify it. */
15
+ export class RpcError extends Error {
16
+ code;
17
+ data;
18
+ constructor(code, message, data) {
19
+ super(message);
20
+ this.code = code;
21
+ this.data = data;
22
+ this.name = "RpcError";
23
+ }
24
+ }
25
+ /** How long a single request may take before we give up on it. */
26
+ export const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
27
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/transport/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,8FAA8F;AAC9F,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IAEA;IAHX,YACW,IAAY,EACrB,OAAe,EACN,IAAc;QAEvB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAAQ;QAEZ,SAAI,GAAJ,IAAI,CAAU;QAGvB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AA6CD,kEAAkE;AAClE,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC"}