@chances-ai/engine 24.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/dist/agents/discover.d.ts +30 -0
  2. package/dist/agents/discover.d.ts.map +1 -0
  3. package/dist/agents/discover.js +183 -0
  4. package/dist/agents/discover.js.map +1 -0
  5. package/dist/agents/index.d.ts +20 -0
  6. package/dist/agents/index.d.ts.map +1 -0
  7. package/dist/agents/index.js +52 -0
  8. package/dist/agents/index.js.map +1 -0
  9. package/dist/agents/parse.d.ts +61 -0
  10. package/dist/agents/parse.d.ts.map +1 -0
  11. package/dist/agents/parse.js +527 -0
  12. package/dist/agents/parse.js.map +1 -0
  13. package/dist/agents/types.d.ts +52 -0
  14. package/dist/agents/types.d.ts.map +1 -0
  15. package/dist/agents/types.js +8 -0
  16. package/dist/agents/types.js.map +1 -0
  17. package/dist/ai/adapters/ai-sdk-stream.d.ts +19 -0
  18. package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -0
  19. package/dist/ai/adapters/ai-sdk-stream.js +125 -0
  20. package/dist/ai/adapters/ai-sdk-stream.js.map +1 -0
  21. package/dist/ai/adapters/ai-sdk.d.ts +56 -0
  22. package/dist/ai/adapters/ai-sdk.d.ts.map +1 -0
  23. package/dist/ai/adapters/ai-sdk.js +112 -0
  24. package/dist/ai/adapters/ai-sdk.js.map +1 -0
  25. package/dist/ai/adapters/mock.d.ts +13 -0
  26. package/dist/ai/adapters/mock.d.ts.map +1 -0
  27. package/dist/ai/adapters/mock.js +54 -0
  28. package/dist/ai/adapters/mock.js.map +1 -0
  29. package/dist/ai/adapters/openai-compatible.d.ts +23 -0
  30. package/dist/ai/adapters/openai-compatible.d.ts.map +1 -0
  31. package/dist/ai/adapters/openai-compatible.js +45 -0
  32. package/dist/ai/adapters/openai-compatible.js.map +1 -0
  33. package/dist/ai/cost.d.ts +3 -0
  34. package/dist/ai/cost.d.ts.map +1 -0
  35. package/dist/ai/cost.js +5 -0
  36. package/dist/ai/cost.js.map +1 -0
  37. package/dist/ai/index.d.ts +12 -0
  38. package/dist/ai/index.d.ts.map +1 -0
  39. package/dist/ai/index.js +11 -0
  40. package/dist/ai/index.js.map +1 -0
  41. package/dist/ai/known-models.d.ts +20 -0
  42. package/dist/ai/known-models.d.ts.map +1 -0
  43. package/dist/ai/known-models.js +129 -0
  44. package/dist/ai/known-models.js.map +1 -0
  45. package/dist/ai/registry.d.ts +12 -0
  46. package/dist/ai/registry.d.ts.map +1 -0
  47. package/dist/ai/registry.js +24 -0
  48. package/dist/ai/registry.js.map +1 -0
  49. package/dist/ai/retry.d.ts +11 -0
  50. package/dist/ai/retry.d.ts.map +1 -0
  51. package/dist/ai/retry.js +14 -0
  52. package/dist/ai/retry.js.map +1 -0
  53. package/dist/ai/router.d.ts +25 -0
  54. package/dist/ai/router.d.ts.map +1 -0
  55. package/dist/ai/router.js +36 -0
  56. package/dist/ai/router.js.map +1 -0
  57. package/dist/ai/setup.d.ts +23 -0
  58. package/dist/ai/setup.d.ts.map +1 -0
  59. package/dist/ai/setup.js +47 -0
  60. package/dist/ai/setup.js.map +1 -0
  61. package/dist/ai/summarizer.d.ts +24 -0
  62. package/dist/ai/summarizer.d.ts.map +1 -0
  63. package/dist/ai/summarizer.js +56 -0
  64. package/dist/ai/summarizer.js.map +1 -0
  65. package/dist/ai/types.d.ts +83 -0
  66. package/dist/ai/types.d.ts.map +1 -0
  67. package/dist/ai/types.js +2 -0
  68. package/dist/ai/types.js.map +1 -0
  69. package/dist/core/compaction/circuit-breaker.d.ts +32 -0
  70. package/dist/core/compaction/circuit-breaker.d.ts.map +1 -0
  71. package/dist/core/compaction/circuit-breaker.js +42 -0
  72. package/dist/core/compaction/circuit-breaker.js.map +1 -0
  73. package/dist/core/compaction/compactor.d.ts +75 -0
  74. package/dist/core/compaction/compactor.d.ts.map +1 -0
  75. package/dist/core/compaction/compactor.js +261 -0
  76. package/dist/core/compaction/compactor.js.map +1 -0
  77. package/dist/core/compaction/estimate.d.ts +39 -0
  78. package/dist/core/compaction/estimate.d.ts.map +1 -0
  79. package/dist/core/compaction/estimate.js +74 -0
  80. package/dist/core/compaction/estimate.js.map +1 -0
  81. package/dist/core/compaction/index.d.ts +5 -0
  82. package/dist/core/compaction/index.d.ts.map +1 -0
  83. package/dist/core/compaction/index.js +5 -0
  84. package/dist/core/compaction/index.js.map +1 -0
  85. package/dist/core/compaction/prune.d.ts +43 -0
  86. package/dist/core/compaction/prune.d.ts.map +1 -0
  87. package/dist/core/compaction/prune.js +51 -0
  88. package/dist/core/compaction/prune.js.map +1 -0
  89. package/dist/core/engine.d.ts +268 -0
  90. package/dist/core/engine.d.ts.map +1 -0
  91. package/dist/core/engine.js +767 -0
  92. package/dist/core/engine.js.map +1 -0
  93. package/dist/core/index.d.ts +6 -0
  94. package/dist/core/index.d.ts.map +1 -0
  95. package/dist/core/index.js +6 -0
  96. package/dist/core/index.js.map +1 -0
  97. package/dist/core/task-tool.d.ts +175 -0
  98. package/dist/core/task-tool.d.ts.map +1 -0
  99. package/dist/core/task-tool.js +901 -0
  100. package/dist/core/task-tool.js.map +1 -0
  101. package/dist/core/workspace-query.d.ts +83 -0
  102. package/dist/core/workspace-query.d.ts.map +1 -0
  103. package/dist/core/workspace-query.js +217 -0
  104. package/dist/core/workspace-query.js.map +1 -0
  105. package/dist/core/worktree/active-marker.d.ts +31 -0
  106. package/dist/core/worktree/active-marker.d.ts.map +1 -0
  107. package/dist/core/worktree/active-marker.js +109 -0
  108. package/dist/core/worktree/active-marker.js.map +1 -0
  109. package/dist/core/worktree/create.d.ts +40 -0
  110. package/dist/core/worktree/create.d.ts.map +1 -0
  111. package/dist/core/worktree/create.js +121 -0
  112. package/dist/core/worktree/create.js.map +1 -0
  113. package/dist/core/worktree/errors.d.ts +7 -0
  114. package/dist/core/worktree/errors.d.ts.map +1 -0
  115. package/dist/core/worktree/errors.js +11 -0
  116. package/dist/core/worktree/errors.js.map +1 -0
  117. package/dist/core/worktree/gc.d.ts +39 -0
  118. package/dist/core/worktree/gc.d.ts.map +1 -0
  119. package/dist/core/worktree/gc.js +146 -0
  120. package/dist/core/worktree/gc.js.map +1 -0
  121. package/dist/core/worktree/git.d.ts +53 -0
  122. package/dist/core/worktree/git.d.ts.map +1 -0
  123. package/dist/core/worktree/git.js +166 -0
  124. package/dist/core/worktree/git.js.map +1 -0
  125. package/dist/core/worktree/index.d.ts +8 -0
  126. package/dist/core/worktree/index.d.ts.map +1 -0
  127. package/dist/core/worktree/index.js +8 -0
  128. package/dist/core/worktree/index.js.map +1 -0
  129. package/dist/core/worktree/paths.d.ts +26 -0
  130. package/dist/core/worktree/paths.d.ts.map +1 -0
  131. package/dist/core/worktree/paths.js +57 -0
  132. package/dist/core/worktree/paths.js.map +1 -0
  133. package/dist/core/worktree/slug.d.ts +6 -0
  134. package/dist/core/worktree/slug.d.ts.map +1 -0
  135. package/dist/core/worktree/slug.js +21 -0
  136. package/dist/core/worktree/slug.js.map +1 -0
  137. package/dist/local-vault/file-store.d.ts +64 -0
  138. package/dist/local-vault/file-store.d.ts.map +1 -0
  139. package/dist/local-vault/file-store.js +225 -0
  140. package/dist/local-vault/file-store.js.map +1 -0
  141. package/dist/local-vault/index.d.ts +57 -0
  142. package/dist/local-vault/index.d.ts.map +1 -0
  143. package/dist/local-vault/index.js +68 -0
  144. package/dist/local-vault/index.js.map +1 -0
  145. package/dist/local-vault/keychain.d.ts +58 -0
  146. package/dist/local-vault/keychain.d.ts.map +1 -0
  147. package/dist/local-vault/keychain.js +200 -0
  148. package/dist/local-vault/keychain.js.map +1 -0
  149. package/dist/local-vault/mutex.d.ts +20 -0
  150. package/dist/local-vault/mutex.d.ts.map +1 -0
  151. package/dist/local-vault/mutex.js +44 -0
  152. package/dist/local-vault/mutex.js.map +1 -0
  153. package/dist/local-vault/passphrase.d.ts +30 -0
  154. package/dist/local-vault/passphrase.d.ts.map +1 -0
  155. package/dist/local-vault/passphrase.js +72 -0
  156. package/dist/local-vault/passphrase.js.map +1 -0
  157. package/dist/lsp/config.d.ts +34 -0
  158. package/dist/lsp/config.d.ts.map +1 -0
  159. package/dist/lsp/config.js +68 -0
  160. package/dist/lsp/config.js.map +1 -0
  161. package/dist/lsp/detect.d.ts +7 -0
  162. package/dist/lsp/detect.d.ts.map +1 -0
  163. package/dist/lsp/detect.js +78 -0
  164. package/dist/lsp/detect.js.map +1 -0
  165. package/dist/lsp/errors.d.ts +11 -0
  166. package/dist/lsp/errors.d.ts.map +1 -0
  167. package/dist/lsp/errors.js +11 -0
  168. package/dist/lsp/errors.js.map +1 -0
  169. package/dist/lsp/formatters.d.ts +147 -0
  170. package/dist/lsp/formatters.d.ts.map +1 -0
  171. package/dist/lsp/formatters.js +259 -0
  172. package/dist/lsp/formatters.js.map +1 -0
  173. package/dist/lsp/index.d.ts +31 -0
  174. package/dist/lsp/index.d.ts.map +1 -0
  175. package/dist/lsp/index.js +31 -0
  176. package/dist/lsp/index.js.map +1 -0
  177. package/dist/lsp/instance.d.ts +72 -0
  178. package/dist/lsp/instance.d.ts.map +1 -0
  179. package/dist/lsp/instance.js +489 -0
  180. package/dist/lsp/instance.js.map +1 -0
  181. package/dist/lsp/lazy-load.d.ts +27 -0
  182. package/dist/lsp/lazy-load.d.ts.map +1 -0
  183. package/dist/lsp/lazy-load.js +57 -0
  184. package/dist/lsp/lazy-load.js.map +1 -0
  185. package/dist/lsp/manager.d.ts +59 -0
  186. package/dist/lsp/manager.d.ts.map +1 -0
  187. package/dist/lsp/manager.js +242 -0
  188. package/dist/lsp/manager.js.map +1 -0
  189. package/dist/lsp/ops.d.ts +13 -0
  190. package/dist/lsp/ops.d.ts.map +1 -0
  191. package/dist/lsp/ops.js +225 -0
  192. package/dist/lsp/ops.js.map +1 -0
  193. package/dist/lsp/rpc.d.ts +47 -0
  194. package/dist/lsp/rpc.d.ts.map +1 -0
  195. package/dist/lsp/rpc.js +134 -0
  196. package/dist/lsp/rpc.js.map +1 -0
  197. package/dist/lsp/safe-uri.d.ts +18 -0
  198. package/dist/lsp/safe-uri.d.ts.map +1 -0
  199. package/dist/lsp/safe-uri.js +96 -0
  200. package/dist/lsp/safe-uri.js.map +1 -0
  201. package/dist/lsp/types.d.ts +70 -0
  202. package/dist/lsp/types.d.ts.map +1 -0
  203. package/dist/lsp/types.js +16 -0
  204. package/dist/lsp/types.js.map +1 -0
  205. package/dist/mcp/bridge.d.ts +57 -0
  206. package/dist/mcp/bridge.d.ts.map +1 -0
  207. package/dist/mcp/bridge.js +98 -0
  208. package/dist/mcp/bridge.js.map +1 -0
  209. package/dist/mcp/category.d.ts +22 -0
  210. package/dist/mcp/category.d.ts.map +1 -0
  211. package/dist/mcp/category.js +11 -0
  212. package/dist/mcp/category.js.map +1 -0
  213. package/dist/mcp/client.d.ts +228 -0
  214. package/dist/mcp/client.d.ts.map +1 -0
  215. package/dist/mcp/client.js +352 -0
  216. package/dist/mcp/client.js.map +1 -0
  217. package/dist/mcp/content.d.ts +86 -0
  218. package/dist/mcp/content.d.ts.map +1 -0
  219. package/dist/mcp/content.js +147 -0
  220. package/dist/mcp/content.js.map +1 -0
  221. package/dist/mcp/env.d.ts +19 -0
  222. package/dist/mcp/env.d.ts.map +1 -0
  223. package/dist/mcp/env.js +50 -0
  224. package/dist/mcp/env.js.map +1 -0
  225. package/dist/mcp/host.d.ts +199 -0
  226. package/dist/mcp/host.d.ts.map +1 -0
  227. package/dist/mcp/host.js +530 -0
  228. package/dist/mcp/host.js.map +1 -0
  229. package/dist/mcp/index.d.ts +18 -0
  230. package/dist/mcp/index.d.ts.map +1 -0
  231. package/dist/mcp/index.js +17 -0
  232. package/dist/mcp/index.js.map +1 -0
  233. package/dist/mcp/load-mcp-host.d.ts +32 -0
  234. package/dist/mcp/load-mcp-host.d.ts.map +1 -0
  235. package/dist/mcp/load-mcp-host.js +49 -0
  236. package/dist/mcp/load-mcp-host.js.map +1 -0
  237. package/dist/mcp/oauth/callback-server.d.ts +73 -0
  238. package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
  239. package/dist/mcp/oauth/callback-server.js +280 -0
  240. package/dist/mcp/oauth/callback-server.js.map +1 -0
  241. package/dist/mcp/oauth/config-hash.d.ts +24 -0
  242. package/dist/mcp/oauth/config-hash.d.ts.map +1 -0
  243. package/dist/mcp/oauth/config-hash.js +55 -0
  244. package/dist/mcp/oauth/config-hash.js.map +1 -0
  245. package/dist/mcp/oauth/error-normalize.d.ts +39 -0
  246. package/dist/mcp/oauth/error-normalize.d.ts.map +1 -0
  247. package/dist/mcp/oauth/error-normalize.js +91 -0
  248. package/dist/mcp/oauth/error-normalize.js.map +1 -0
  249. package/dist/mcp/oauth/provider.d.ts +190 -0
  250. package/dist/mcp/oauth/provider.d.ts.map +1 -0
  251. package/dist/mcp/oauth/provider.js +305 -0
  252. package/dist/mcp/oauth/provider.js.map +1 -0
  253. package/dist/mcp/oauth/refresh-coalescer.d.ts +46 -0
  254. package/dist/mcp/oauth/refresh-coalescer.d.ts.map +1 -0
  255. package/dist/mcp/oauth/refresh-coalescer.js +77 -0
  256. package/dist/mcp/oauth/refresh-coalescer.js.map +1 -0
  257. package/dist/mcp/oauth/sdk-shapes.d.ts +77 -0
  258. package/dist/mcp/oauth/sdk-shapes.d.ts.map +1 -0
  259. package/dist/mcp/oauth/sdk-shapes.js +21 -0
  260. package/dist/mcp/oauth/sdk-shapes.js.map +1 -0
  261. package/dist/mcp/parse.d.ts +28 -0
  262. package/dist/mcp/parse.d.ts.map +1 -0
  263. package/dist/mcp/parse.js +209 -0
  264. package/dist/mcp/parse.js.map +1 -0
  265. package/dist/mcp/prompts.d.ts +31 -0
  266. package/dist/mcp/prompts.d.ts.map +1 -0
  267. package/dist/mcp/prompts.js +71 -0
  268. package/dist/mcp/prompts.js.map +1 -0
  269. package/dist/mcp/redact.d.ts +62 -0
  270. package/dist/mcp/redact.d.ts.map +1 -0
  271. package/dist/mcp/redact.js +87 -0
  272. package/dist/mcp/redact.js.map +1 -0
  273. package/dist/mcp/resources.d.ts +70 -0
  274. package/dist/mcp/resources.d.ts.map +1 -0
  275. package/dist/mcp/resources.js +170 -0
  276. package/dist/mcp/resources.js.map +1 -0
  277. package/dist/mcp/types.d.ts +123 -0
  278. package/dist/mcp/types.d.ts.map +1 -0
  279. package/dist/mcp/types.js +2 -0
  280. package/dist/mcp/types.js.map +1 -0
  281. package/dist/memory/frontmatter.d.ts +18 -0
  282. package/dist/memory/frontmatter.d.ts.map +1 -0
  283. package/dist/memory/frontmatter.js +81 -0
  284. package/dist/memory/frontmatter.js.map +1 -0
  285. package/dist/memory/index.d.ts +5 -0
  286. package/dist/memory/index.d.ts.map +1 -0
  287. package/dist/memory/index.js +5 -0
  288. package/dist/memory/index.js.map +1 -0
  289. package/dist/memory/store.d.ts +44 -0
  290. package/dist/memory/store.d.ts.map +1 -0
  291. package/dist/memory/store.js +237 -0
  292. package/dist/memory/store.js.map +1 -0
  293. package/dist/memory/tools.d.ts +11 -0
  294. package/dist/memory/tools.d.ts.map +1 -0
  295. package/dist/memory/tools.js +159 -0
  296. package/dist/memory/tools.js.map +1 -0
  297. package/dist/memory/types.d.ts +32 -0
  298. package/dist/memory/types.d.ts.map +1 -0
  299. package/dist/memory/types.js +20 -0
  300. package/dist/memory/types.js.map +1 -0
  301. package/dist/plugin-api/index.d.ts +167 -0
  302. package/dist/plugin-api/index.d.ts.map +1 -0
  303. package/dist/plugin-api/index.js +151 -0
  304. package/dist/plugin-api/index.js.map +1 -0
  305. package/dist/plugin-logger/index.d.ts +21 -0
  306. package/dist/plugin-logger/index.d.ts.map +1 -0
  307. package/dist/plugin-logger/index.js +59 -0
  308. package/dist/plugin-logger/index.js.map +1 -0
  309. package/dist/session/index.d.ts +125 -0
  310. package/dist/session/index.d.ts.map +1 -0
  311. package/dist/session/index.js +202 -0
  312. package/dist/session/index.js.map +1 -0
  313. package/dist/tools/approval.d.ts +33 -0
  314. package/dist/tools/approval.d.ts.map +1 -0
  315. package/dist/tools/approval.js +53 -0
  316. package/dist/tools/approval.js.map +1 -0
  317. package/dist/tools/builtins/_shared.d.ts +94 -0
  318. package/dist/tools/builtins/_shared.d.ts.map +1 -0
  319. package/dist/tools/builtins/_shared.js +246 -0
  320. package/dist/tools/builtins/_shared.js.map +1 -0
  321. package/dist/tools/builtins/ask-user-question.d.ts +27 -0
  322. package/dist/tools/builtins/ask-user-question.d.ts.map +1 -0
  323. package/dist/tools/builtins/ask-user-question.js +191 -0
  324. package/dist/tools/builtins/ask-user-question.js.map +1 -0
  325. package/dist/tools/builtins/bash.d.ts +3 -0
  326. package/dist/tools/builtins/bash.d.ts.map +1 -0
  327. package/dist/tools/builtins/bash.js +158 -0
  328. package/dist/tools/builtins/bash.js.map +1 -0
  329. package/dist/tools/builtins/diff.d.ts +3 -0
  330. package/dist/tools/builtins/diff.d.ts.map +1 -0
  331. package/dist/tools/builtins/diff.js +83 -0
  332. package/dist/tools/builtins/diff.js.map +1 -0
  333. package/dist/tools/builtins/edit.d.ts +3 -0
  334. package/dist/tools/builtins/edit.d.ts.map +1 -0
  335. package/dist/tools/builtins/edit.js +40 -0
  336. package/dist/tools/builtins/edit.js.map +1 -0
  337. package/dist/tools/builtins/glob.d.ts +3 -0
  338. package/dist/tools/builtins/glob.d.ts.map +1 -0
  339. package/dist/tools/builtins/glob.js +37 -0
  340. package/dist/tools/builtins/glob.js.map +1 -0
  341. package/dist/tools/builtins/grep.d.ts +3 -0
  342. package/dist/tools/builtins/grep.d.ts.map +1 -0
  343. package/dist/tools/builtins/grep.js +81 -0
  344. package/dist/tools/builtins/grep.js.map +1 -0
  345. package/dist/tools/builtins/lsp.d.ts +3 -0
  346. package/dist/tools/builtins/lsp.d.ts.map +1 -0
  347. package/dist/tools/builtins/lsp.js +102 -0
  348. package/dist/tools/builtins/lsp.js.map +1 -0
  349. package/dist/tools/builtins/pty.d.ts +64 -0
  350. package/dist/tools/builtins/pty.d.ts.map +1 -0
  351. package/dist/tools/builtins/pty.js +536 -0
  352. package/dist/tools/builtins/pty.js.map +1 -0
  353. package/dist/tools/builtins/read.d.ts +3 -0
  354. package/dist/tools/builtins/read.d.ts.map +1 -0
  355. package/dist/tools/builtins/read.js +18 -0
  356. package/dist/tools/builtins/read.js.map +1 -0
  357. package/dist/tools/builtins/web-fetch.d.ts +4 -0
  358. package/dist/tools/builtins/web-fetch.d.ts.map +1 -0
  359. package/dist/tools/builtins/web-fetch.js +353 -0
  360. package/dist/tools/builtins/web-fetch.js.map +1 -0
  361. package/dist/tools/builtins/write.d.ts +3 -0
  362. package/dist/tools/builtins/write.d.ts.map +1 -0
  363. package/dist/tools/builtins/write.js +48 -0
  364. package/dist/tools/builtins/write.js.map +1 -0
  365. package/dist/tools/builtins.d.ts +9 -0
  366. package/dist/tools/builtins.d.ts.map +1 -0
  367. package/dist/tools/builtins.js +29 -0
  368. package/dist/tools/builtins.js.map +1 -0
  369. package/dist/tools/diff.d.ts +18 -0
  370. package/dist/tools/diff.d.ts.map +1 -0
  371. package/dist/tools/diff.js +57 -0
  372. package/dist/tools/diff.js.map +1 -0
  373. package/dist/tools/index.d.ts +10 -0
  374. package/dist/tools/index.d.ts.map +1 -0
  375. package/dist/tools/index.js +9 -0
  376. package/dist/tools/index.js.map +1 -0
  377. package/dist/tools/permission.d.ts +120 -0
  378. package/dist/tools/permission.d.ts.map +1 -0
  379. package/dist/tools/permission.js +208 -0
  380. package/dist/tools/permission.js.map +1 -0
  381. package/dist/tools/registry.d.ts +12 -0
  382. package/dist/tools/registry.d.ts.map +1 -0
  383. package/dist/tools/registry.js +19 -0
  384. package/dist/tools/registry.js.map +1 -0
  385. package/dist/tools/types.d.ts +244 -0
  386. package/dist/tools/types.d.ts.map +1 -0
  387. package/dist/tools/types.js +15 -0
  388. package/dist/tools/types.js.map +1 -0
  389. package/package.json +109 -0
@@ -0,0 +1,530 @@
1
+ import { AppError, ErrorCode } from "@chances-ai/runtime";
2
+ import { McpClient } from "./client.js";
3
+ import { bridgeMcpTool, sanitizeMcpName } from "./bridge.js";
4
+ import { expandServerEnv } from "./env.js";
5
+ import { buildRedactor, collectSecrets } from "./redact.js";
6
+ import { ChancesOAuthClientProvider } from "./oauth/provider.js";
7
+ import { LoopbackCallbackServer } from "./oauth/callback-server.js";
8
+ /**
9
+ * Lifecycle orchestrator for one or more MCP servers. Connects them in
10
+ * parallel on `start()`, surfaces per-server failures as `failed` status
11
+ * instead of crashing the whole boot, and registers each server's discovered
12
+ * tools into the host `ToolRegistry`.
13
+ *
14
+ * Not a Plugin — MCP integration lives at the runtime layer because the
15
+ * engine consumes tools, not plugin hooks. Slash commands and CLI glue talk
16
+ * to the host directly.
17
+ *
18
+ * **Lifecycle serialization.** Every method that mutates host state
19
+ * (`startServer` / `restart` / `remove` / `dispose`) is chained behind a
20
+ * single `opsLock` promise so concurrent calls observe a consistent state
21
+ * machine. Two concurrent `restart(x)` calls run sequentially; a
22
+ * `dispose()` interleaved with a `restart()` always wins (because each
23
+ * step re-checks `disposed`). This guards against the codex-flagged race
24
+ * where a floating `/mcp restart` could resurrect a server after global
25
+ * teardown.
26
+ */
27
+ export class McpHost {
28
+ opts;
29
+ states = new Map();
30
+ disposed = false;
31
+ opsLock = Promise.resolve();
32
+ constructor(opts) {
33
+ this.opts = opts;
34
+ }
35
+ /**
36
+ * Constructs and starts the host. Returns once every server has either
37
+ * connected (and its tools are in the registry) or failed (status
38
+ * `failed`, error message logged). Always resolves — never throws — so a
39
+ * misconfigured MCP server can't take down the agent.
40
+ */
41
+ static async start(opts) {
42
+ const host = new McpHost(opts);
43
+ const entries = Object.entries(opts.servers);
44
+ if (entries.length === 0)
45
+ return host;
46
+ await Promise.allSettled(entries.map(([id, cfg]) => host.runOp(() => host.startServer(id, cfg))));
47
+ return host;
48
+ }
49
+ status() {
50
+ return [...this.states.values()].map((s) => ({ ...s.status }));
51
+ }
52
+ /**
53
+ * Tears down the named server (if any), wipes its registered tools, then
54
+ * reconnects from its current config. Surfaces the new status. Caller is
55
+ * the `/mcp restart` slash command.
56
+ */
57
+ async restart(id) {
58
+ return this.runOp(async () => {
59
+ const state = this.states.get(id);
60
+ if (!state) {
61
+ throw new AppError(ErrorCode.Config, `mcp: unknown server '${id}'`);
62
+ }
63
+ if (this.disposed) {
64
+ throw new AppError(ErrorCode.Config, `mcp: host is disposed; cannot restart '${id}'`);
65
+ }
66
+ await this.disposeServer(state);
67
+ // dispose() may have flipped `disposed` while we were awaiting; bail
68
+ // before we resurrect the server.
69
+ if (this.disposed) {
70
+ throw new AppError(ErrorCode.Config, `mcp: host was disposed during restart of '${id}'`);
71
+ }
72
+ await this.startServer(id, state.config);
73
+ return this.states.get(id).status;
74
+ });
75
+ }
76
+ /**
77
+ * Tears down the named server and unregisters its tools, but leaves no
78
+ * trace in host state — callers (typically `/mcp remove`) own the config
79
+ * mutation. Throws if no such server is known.
80
+ */
81
+ async remove(id) {
82
+ return this.runOp(async () => {
83
+ const state = this.states.get(id);
84
+ if (!state) {
85
+ throw new AppError(ErrorCode.Config, `mcp: unknown server '${id}'`);
86
+ }
87
+ await this.disposeServer(state);
88
+ this.states.delete(id);
89
+ });
90
+ }
91
+ /**
92
+ * One-shot validation: connect, list tools, dispose. Doesn't register any
93
+ * tools or mutate host state. Caller is `/mcp test`.
94
+ */
95
+ async test(id) {
96
+ const cfg = this.opts.servers[id];
97
+ if (!cfg)
98
+ return { ok: false, output: `unknown server '${id}'` };
99
+ const expanded = safeExpandEnv(cfg, this.opts.env ?? process.env, id);
100
+ if (expanded instanceof AppError)
101
+ return { ok: false, output: expanded.message };
102
+ const redact = buildRedactor(secretsFor(expanded));
103
+ let client;
104
+ try {
105
+ client = await McpClient.connect(id, expanded, {
106
+ connectTimeoutMs: this.opts.connectTimeoutMs,
107
+ clientIdentity: this.opts.clientIdentity,
108
+ redact,
109
+ });
110
+ const tools = await client.listTools();
111
+ const names = tools.map((t) => t.name).join(", ") || "(no tools advertised)";
112
+ return { ok: true, output: `connected — ${tools.length} tool(s): ${names}` };
113
+ }
114
+ catch (e) {
115
+ return { ok: false, output: redact(e.message) };
116
+ }
117
+ finally {
118
+ if (client) {
119
+ try {
120
+ await client.dispose();
121
+ }
122
+ catch (e) {
123
+ this.opts.logger.warn(`mcp '${id}': test dispose failed: ${redact(e.message)}`);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ /**
129
+ * Tears down every server and unregisters their tools. Safe to call
130
+ * repeatedly; subsequent calls are no-ops.
131
+ */
132
+ async dispose() {
133
+ return this.runOp(async () => {
134
+ if (this.disposed)
135
+ return;
136
+ this.disposed = true;
137
+ await Promise.allSettled([...this.states.values()].map((s) => this.disposeServer(s)));
138
+ this.states.clear();
139
+ });
140
+ }
141
+ /**
142
+ * Serializes a lifecycle operation behind `opsLock` so concurrent
143
+ * `restart`/`remove`/`dispose` calls run one at a time. The lock is a
144
+ * promise chain — every new op `.then`s itself onto the previous one.
145
+ */
146
+ runOp(op) {
147
+ const next = this.opsLock.then(op, op);
148
+ // Replace the lock with a never-rejected continuation so a rejected
149
+ // op doesn't poison the chain. The caller still sees the rejection.
150
+ this.opsLock = next.catch(() => undefined);
151
+ return next;
152
+ }
153
+ async startServer(id, config) {
154
+ // Preserve OAuth provider/redactor/coalescer across restart so a
155
+ // refresh in flight when the user runs /mcp restart can still be
156
+ // aborted, and so token scrubs from the previous connect still hold.
157
+ const prior = this.states.get(id);
158
+ const state = {
159
+ config,
160
+ status: { id, state: "starting" },
161
+ registeredToolNames: [],
162
+ oauth: prior?.oauth,
163
+ redactor: (m) => m,
164
+ resources: [],
165
+ prompts: [],
166
+ generation: (prior?.generation ?? 0) + 1,
167
+ };
168
+ this.states.set(id, state);
169
+ if (config.enabled === false) {
170
+ state.status = { id, state: "disabled" };
171
+ return;
172
+ }
173
+ const expanded = safeExpandEnv(config, this.opts.env ?? process.env, id);
174
+ if (expanded instanceof AppError) {
175
+ state.status = { id, state: "failed", error: expanded.message };
176
+ this.opts.logger.warn(`mcp '${id}': ${expanded.message}`);
177
+ return;
178
+ }
179
+ const redact = state.oauth?.redactor ?? buildRedactor(secretsFor(expanded));
180
+ // (5.4) Keep the redactor on state so resource/prompt reads scrub the same
181
+ // secret bag the bridge does (codex R1 S1).
182
+ state.redactor = redact;
183
+ // (3.7) Build / reuse the OAuth provider for this server when
184
+ // `auth.kind === "oauth"`. The provider survives across restarts
185
+ // (refresh coalescer must persist so an in-flight refresh can be
186
+ // aborted by /mcp logout); only the callback server is per-flow.
187
+ let authProvider;
188
+ if (isOAuthHttp(expanded)) {
189
+ if (!this.opts.vault) {
190
+ const message = `mcp '${id}': OAuth configured but local-vault unavailable — ` +
191
+ `install '../local-vault/index.js' or remove the 'auth' block`;
192
+ state.status = { id, state: "failed", error: message };
193
+ this.opts.logger.warn(message);
194
+ return;
195
+ }
196
+ // (codex Round-2 MUST-FIX #3) Always create a FRESH provider +
197
+ // callback server on startServer. The provider captures its
198
+ // vault-generation snapshot at construction and drops every later
199
+ // save when `current.generation > snapshotGen`; reusing the same
200
+ // instance across logout/restart leaves the snapshot stale and the
201
+ // next /mcp login can never persist tokens. The redactor is the
202
+ // only thing we preserve so secrets discovered before restart
203
+ // still scrub from errors after.
204
+ const callbackServer = new LoopbackCallbackServer();
205
+ const provider = await ChancesOAuthClientProvider.create({
206
+ serverName: id,
207
+ serverConfig: expanded,
208
+ vault: this.opts.vault,
209
+ callbackServer,
210
+ redactor: redact,
211
+ logger: this.opts.logger,
212
+ openBrowser: this.opts.openBrowser ?? (async () => undefined),
213
+ });
214
+ // Close the previous flow's callback server if one was still bound
215
+ // (e.g. user Ctrl-C'd a previous /mcp login mid-flow before restart).
216
+ if (state.oauth?.callbackServer) {
217
+ try {
218
+ await state.oauth.callbackServer.close();
219
+ }
220
+ catch {
221
+ // best-effort
222
+ }
223
+ }
224
+ state.oauth = {
225
+ provider,
226
+ callbackServer,
227
+ redactor: redact,
228
+ config: expanded,
229
+ };
230
+ authProvider = state.oauth.provider;
231
+ }
232
+ let client;
233
+ try {
234
+ client = await McpClient.connect(id, expanded, {
235
+ connectTimeoutMs: this.opts.connectTimeoutMs,
236
+ clientIdentity: this.opts.clientIdentity,
237
+ redact,
238
+ authProvider,
239
+ workspaceRoot: this.opts.workspaceRoot,
240
+ advertiseRoots: this.opts.advertiseRoots,
241
+ });
242
+ }
243
+ catch (e) {
244
+ const message = redact(e.message);
245
+ state.status = { id, state: "failed", error: message };
246
+ this.opts.logger.warn(`mcp '${id}': connect failed: ${message}`);
247
+ return;
248
+ }
249
+ // Host may have been disposed while we were connecting. Drop the new
250
+ // client cleanly instead of registering tools that will never be torn
251
+ // down by `dispose()` (it already drained `states`).
252
+ if (this.disposed) {
253
+ try {
254
+ await client.dispose();
255
+ }
256
+ catch {
257
+ // best-effort
258
+ }
259
+ this.states.delete(id);
260
+ return;
261
+ }
262
+ state.client = client;
263
+ let descriptors;
264
+ try {
265
+ descriptors = await client.listTools();
266
+ }
267
+ catch (e) {
268
+ const message = `listTools failed: ${redact(e.message)}`;
269
+ state.status = { id, state: "failed", error: message };
270
+ this.opts.logger.warn(`mcp '${id}': ${message}`);
271
+ try {
272
+ await client.dispose();
273
+ }
274
+ catch {
275
+ // best-effort
276
+ }
277
+ state.client = undefined;
278
+ return;
279
+ }
280
+ // Detect sanitization collisions BEFORE registering anything. Two MCP
281
+ // tool names that sanitize to the same `mcp__<srv>__<tool>` would let
282
+ // a later descriptor silently overwrite an earlier one in the shared
283
+ // `ToolRegistry` — and the per-tool permission rule key would be
284
+ // ambiguous between them. Fail the server instead.
285
+ const seen = new Map();
286
+ for (const d of descriptors) {
287
+ const final = `mcp__${sanitizeMcpName(id)}__${sanitizeMcpName(d.name)}`;
288
+ const prior = seen.get(final);
289
+ if (prior !== undefined) {
290
+ const message = `tool name collision: '${prior}' and '${d.name}' both sanitize to '${final}'`;
291
+ state.status = { id, state: "failed", error: message };
292
+ this.opts.logger.warn(`mcp '${id}': ${message}`);
293
+ try {
294
+ await client.dispose();
295
+ }
296
+ catch {
297
+ // best-effort
298
+ }
299
+ state.client = undefined;
300
+ return;
301
+ }
302
+ seen.set(final, d.name);
303
+ }
304
+ // Also catch collisions with existing registry entries (built-in tools
305
+ // or tools from another already-running MCP server). Registering over
306
+ // them would silently replace a previously-approved tool.
307
+ for (const finalName of seen.keys()) {
308
+ if (this.opts.registry.get(finalName)) {
309
+ const message = `tool name '${finalName}' is already registered (built-in or another MCP server)`;
310
+ state.status = { id, state: "failed", error: message };
311
+ this.opts.logger.warn(`mcp '${id}': ${message}`);
312
+ try {
313
+ await client.dispose();
314
+ }
315
+ catch {
316
+ // best-effort
317
+ }
318
+ state.client = undefined;
319
+ return;
320
+ }
321
+ }
322
+ const tools = descriptors.map((d) => bridgeMcpTool(id, d, client, { defaultTimeoutMs: config.timeoutMs, redact }));
323
+ for (const tool of tools) {
324
+ this.opts.registry.register(tool);
325
+ state.registeredToolNames.push(tool.name);
326
+ }
327
+ // (5.4 D9′) Best-effort resources + prompts discovery. A server that lacks
328
+ // the capability (rejects with -32601) or errors yields an empty list — we
329
+ // NEVER fail the server for it: its tools are already registered and useful.
330
+ state.resources = await this.discoverResources(id, client, redact);
331
+ state.prompts = await this.discoverPrompts(id, client, redact);
332
+ state.status = {
333
+ id,
334
+ state: "ready",
335
+ toolCount: tools.length,
336
+ toolNames: state.registeredToolNames.slice(),
337
+ };
338
+ }
339
+ async discoverResources(id, client, redact) {
340
+ try {
341
+ const list = await client.listResources();
342
+ return list.map((r) => ({ ...r, server: id }));
343
+ }
344
+ catch (e) {
345
+ this.opts.logger.debug(`mcp '${id}': resources/list unavailable: ${redact(e.message)}`);
346
+ return [];
347
+ }
348
+ }
349
+ async discoverPrompts(id, client, redact) {
350
+ try {
351
+ const list = await client.listPrompts();
352
+ return list.map((p) => ({ ...p, server: id }));
353
+ }
354
+ catch (e) {
355
+ this.opts.logger.debug(`mcp '${id}': prompts/list unavailable: ${redact(e.message)}`);
356
+ return [];
357
+ }
358
+ }
359
+ async disposeServer(state) {
360
+ for (const name of state.registeredToolNames) {
361
+ this.opts.registry.unregister(name);
362
+ }
363
+ state.registeredToolNames = [];
364
+ // (5.4) Drop cached resources/prompts. Prompt SLASH commands are owned by
365
+ // the CLI (rebuilt per respawn from `host.prompts()` — codex R1 M1), so
366
+ // there's nothing to unregister here.
367
+ state.resources = [];
368
+ state.prompts = [];
369
+ // (5.4 R2 S3) Detach the client + bump the generation BEFORE awaiting
370
+ // dispose. A concurrent `readResource`/`getPrompt` snapshots client+gen
371
+ // synchronously, then awaits; clearing here means its post-await
372
+ // `assertSameGeneration` sees `client !== captured` (and a higher gen) and
373
+ // fails cleanly instead of returning content from a server mid-teardown.
374
+ const client = state.client;
375
+ state.client = undefined;
376
+ state.generation += 1;
377
+ if (client) {
378
+ try {
379
+ await client.dispose();
380
+ }
381
+ catch (e) {
382
+ this.opts.logger.warn(`mcp '${state.status.id}': dispose failed: ${e.message}`);
383
+ }
384
+ }
385
+ state.status = { id: state.status.id, state: "disposed" };
386
+ }
387
+ // ─── 5.4 resources + prompts accessors ───────────────────────────────
388
+ // Implements `McpResourceProvider` (resources + readResource); the CLI uses
389
+ // `prompts`/`getPrompt` directly to build slash commands. Reads run OUTSIDE
390
+ // `opsLock`; each snapshots the client + generation so a concurrent
391
+ // `/mcp restart` that swaps the client mid-read fails cleanly (codex R1 S3).
392
+ /** Cached `resources/list` snapshot across servers (optional filter). */
393
+ resources(server) {
394
+ const all = [...this.states.values()].flatMap((s) => s.resources);
395
+ return server ? all.filter((r) => r.server === server) : all;
396
+ }
397
+ /** Cached `prompts/list` snapshot across servers (optional filter). */
398
+ prompts(server) {
399
+ const all = [...this.states.values()].flatMap((s) => s.prompts);
400
+ return server ? all.filter((p) => p.server === server) : all;
401
+ }
402
+ async readResource(server, uri, signal) {
403
+ const state = this.states.get(server);
404
+ if (!state?.client) {
405
+ throw new AppError(ErrorCode.Config, `mcp: server '${server}' is not connected`);
406
+ }
407
+ const client = state.client;
408
+ const gen = state.generation;
409
+ const redact = state.redactor;
410
+ let contents;
411
+ try {
412
+ contents = await client.readResource(uri, { signal });
413
+ }
414
+ catch (e) {
415
+ if (e instanceof AppError && e.code === ErrorCode.Cancelled)
416
+ throw e;
417
+ throw new AppError(ErrorCode.Provider, redact(e.message));
418
+ }
419
+ this.assertSameGeneration(server, client, gen, "read");
420
+ return { contents, redact };
421
+ }
422
+ async getPrompt(server, name, args, signal) {
423
+ const state = this.states.get(server);
424
+ if (!state?.client) {
425
+ throw new AppError(ErrorCode.Config, `mcp: server '${server}' is not connected`);
426
+ }
427
+ const client = state.client;
428
+ const gen = state.generation;
429
+ const redact = state.redactor;
430
+ let result;
431
+ try {
432
+ result = await client.getPrompt(name, args, { signal });
433
+ }
434
+ catch (e) {
435
+ if (e instanceof AppError && e.code === ErrorCode.Cancelled)
436
+ throw e;
437
+ throw new AppError(ErrorCode.Provider, redact(e.message));
438
+ }
439
+ this.assertSameGeneration(server, client, gen, "prompt fetch");
440
+ return { ...result, redact };
441
+ }
442
+ /** (5.4 S3) Throw if the server's client was swapped/disposed during an await. */
443
+ assertSameGeneration(server, client, gen, op) {
444
+ const after = this.states.get(server);
445
+ if (!after || after.generation !== gen || after.client !== client) {
446
+ throw new AppError(ErrorCode.Provider, `mcp: server '${server}' restarted during ${op}; retry`);
447
+ }
448
+ }
449
+ // ─── 3.7 OAuth surface ─────────────────────────────────────────────
450
+ /**
451
+ * Test/slash seam — returns the per-server OAuth bag (provider,
452
+ * callback server, coalescer, redactor). Returns undefined when the
453
+ * server isn't OAuth-configured or hasn't been started yet.
454
+ */
455
+ getOAuthState(id) {
456
+ return this.states.get(id)?.oauth;
457
+ }
458
+ /**
459
+ * (3.7) Logs out a single OAuth-configured server:
460
+ * 1. Bumps the vault payload's generation (via `invalidateCredentials("all")`)
461
+ * so late-arriving `saveTokens` from a refresh that escaped the
462
+ * teardown drops on the generation guard inside `mergeMutate`
463
+ * (codex Round-1 MUST-FIX #5).
464
+ * 2. Restarts the server. **(codex Round-2 MUST-FIX #3)** `startServer`
465
+ * constructs a FRESH `ChancesOAuthClientProvider` with the new
466
+ * generation snapshot, so the next `/mcp login` can persist tokens
467
+ * and the old provider's cached state can't resurface.
468
+ *
469
+ * No-op when the server isn't OAuth-configured.
470
+ */
471
+ async logout(id) {
472
+ return this.runOp(async () => {
473
+ const state = this.states.get(id);
474
+ if (!state?.oauth) {
475
+ // Either unknown server or non-OAuth. Neither is an error — slash
476
+ // commands surface their own messaging.
477
+ return;
478
+ }
479
+ await state.oauth.provider.invalidateCredentials("all");
480
+ // disposeServer + startServer together rebuild the OAuth state with
481
+ // a fresh provider (gen snapshot reads the just-bumped generation)
482
+ // and a fresh callback server. The previous callback server gets
483
+ // closed in startServer before assignment.
484
+ await this.disposeServer(state);
485
+ if (!this.disposed) {
486
+ await this.startServer(id, state.config);
487
+ }
488
+ });
489
+ }
490
+ /** (3.7) Logs out every OAuth-configured server. Per-server failures
491
+ * don't abort the loop. */
492
+ async logoutAll() {
493
+ const oauthIds = [...this.states.entries()]
494
+ .filter(([, s]) => s.oauth !== undefined)
495
+ .map(([id]) => id);
496
+ for (const id of oauthIds) {
497
+ try {
498
+ await this.logout(id);
499
+ }
500
+ catch (e) {
501
+ this.opts.logger.warn(`mcp '${id}': logout failed: ${e.message}`);
502
+ }
503
+ }
504
+ }
505
+ }
506
+ /**
507
+ * (3.7) Discriminator — is this config an HTTP MCP server with OAuth?
508
+ * Used by `startServer` to decide whether to construct a provider.
509
+ */
510
+ function isOAuthHttp(c) {
511
+ return c.type === "http" && c.auth?.kind === "oauth";
512
+ }
513
+ function safeExpandEnv(config, env, id) {
514
+ try {
515
+ return expandServerEnv(config, env);
516
+ }
517
+ catch (e) {
518
+ if (e instanceof AppError) {
519
+ return new AppError(ErrorCode.Config, `mcp '${id}': ${e.message}`);
520
+ }
521
+ return new AppError(ErrorCode.Config, `mcp '${id}': env expansion failed: ${e.message}`);
522
+ }
523
+ }
524
+ function secretsFor(config) {
525
+ if (config.type === "stdio") {
526
+ return collectSecrets({ env: config.env });
527
+ }
528
+ return collectSecrets({ headers: config.headers, url: config.url });
529
+ }
530
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/mcp/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type { HttpMcpConfig, McpPrompt, McpPromptArgument, McpPromptMessage, McpResource, McpResourceContent, McpServerConfig, McpServerStatus, McpTestResult, OAuthMcpAuth, StdioMcpConfig, } from "./types.js";
2
+ export { type McpContentPart, type RenderOptions, type FormatResourceOptions, renderMcpContentParts, capUtf8, formatResourceContents, persistResourceBlob, safeBlobExt, } from "./content.js";
3
+ export { parsePromptArgs, renderPromptMessages } from "./prompts.js";
4
+ export { type McpResolvedResource, type McpResourceProvider, type ResourceMention, type ResourceToolOptions, extractResourceMentions, makeResourceTools, resolveMcpMentions, } from "./resources.js";
5
+ export { type BridgeOptions, type McpCallToolClient, type McpCallToolResult, type McpToolDescriptor, bridgeMcpTool, sanitizeMcpName, } from "./bridge.js";
6
+ export { type ToolAnnotations, categoryFromAnnotations } from "./category.js";
7
+ export { expandEnv, expandServerEnv } from "./env.js";
8
+ export { type ClientIdentity, type LoadedSdk, type SdkLikeClient, type SdkLikeTransport, McpClient, __resetAuthFnForTest, __resetSdkLoaderForTest, __setAuthFnForTest, __setSdkLoaderForTest, loadSdkAuth, } from "./client.js";
9
+ export { type LocalVaultLike, type McpHostOptions, McpHost } from "./host.js";
10
+ export { type ParseFailure, parseServerConfig, parseServerMap } from "./parse.js";
11
+ export { type RuntimeRedactor, buildRedactor, collectSecrets, stripTerminalControls, } from "./redact.js";
12
+ export { loadMcpHost } from "./load-mcp-host.js";
13
+ export { ChancesOAuthClientProvider, type VaultPayload, type OAuthDiscoveryStateInput, type OAuthDiscoveryStateOutput, } from "./oauth/provider.js";
14
+ export { LoopbackCallbackServer } from "./oauth/callback-server.js";
15
+ export { RefreshCoalescer } from "./oauth/refresh-coalescer.js";
16
+ export { makeConfigHash, makeVaultKey } from "./oauth/config-hash.js";
17
+ export { classifyOAuthResponse, isDefinitiveOAuthError, type NormalisedOAuthError, } from "./oauth/error-normalize.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,OAAO,EACP,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,eAAe,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,SAAS,EACT,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EACL,KAAK,eAAe,EACpB,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,0BAA0B,EAC1B,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,17 @@
1
+ export { renderMcpContentParts, capUtf8, formatResourceContents, persistResourceBlob, safeBlobExt, } from "./content.js";
2
+ export { parsePromptArgs, renderPromptMessages } from "./prompts.js";
3
+ export { extractResourceMentions, makeResourceTools, resolveMcpMentions, } from "./resources.js";
4
+ export { bridgeMcpTool, sanitizeMcpName, } from "./bridge.js";
5
+ export { categoryFromAnnotations } from "./category.js";
6
+ export { expandEnv, expandServerEnv } from "./env.js";
7
+ export { McpClient, __resetAuthFnForTest, __resetSdkLoaderForTest, __setAuthFnForTest, __setSdkLoaderForTest, loadSdkAuth, } from "./client.js";
8
+ export { McpHost } from "./host.js";
9
+ export { parseServerConfig, parseServerMap } from "./parse.js";
10
+ export { buildRedactor, collectSecrets, stripTerminalControls, } from "./redact.js";
11
+ export { loadMcpHost } from "./load-mcp-host.js";
12
+ export { ChancesOAuthClientProvider, } from "./oauth/provider.js";
13
+ export { LoopbackCallbackServer } from "./oauth/callback-server.js";
14
+ export { RefreshCoalescer } from "./oauth/refresh-coalescer.js";
15
+ export { makeConfigHash, makeVaultKey } from "./oauth/config-hash.js";
16
+ export { classifyOAuthResponse, isDefinitiveOAuthError, } from "./oauth/error-normalize.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAIL,qBAAqB,EACrB,OAAO,EACP,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAKL,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAKL,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAwB,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAKL,SAAS,EACT,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAA4C,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAqB,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAEL,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,0BAA0B,GAI3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * (3.7) `loadMcpHost({withVault})` — boot-time factory for `McpHost` that
3
+ * lazily resolves `@chances-ai/local-vault` ONLY when the caller asks for
4
+ * a vault. Keeps the cold-start budget intact when no OAuth-configured
5
+ * MCP server is present (`apps/cli/src/boot/load-runtime.ts` passes
6
+ * `withVault: needsOAuth`).
7
+ *
8
+ * **Boundary decision (codex Round-1 NICE).** `apps/cli` MUST NOT import
9
+ * `@chances-ai/local-vault` directly — the only `app → local-vault` edge
10
+ * would force dependency-cruiser to permit a new boundary rule. Routing
11
+ * vault creation through this factory keeps the graph clean: only
12
+ * `@chances-ai/mcp` reaches into the vault package.
13
+ *
14
+ * **`bun build --compile` story.** The vault specifier is COMPUTED
15
+ * (`["@chances-ai", "local-vault"].join("/")`) so Bun's bundler doesn't
16
+ * statically resolve it. A binary built without `@chances-ai/local-vault`
17
+ * in node_modules still compiles cleanly — at runtime, the dynamic
18
+ * import fails, we log a clear diagnostic, and OAuth-configured MCP
19
+ * servers individually fail with the same diagnostic (the non-OAuth
20
+ * servers keep working). § 13.4 / § 16 of `docs/3.7-design.md` cover
21
+ * the five-permutation smoke gate that pins this property.
22
+ */
23
+ import { McpHost, type LocalVaultLike, type McpHostOptions } from "./host.js";
24
+ export interface LoadMcpHostOptions extends Omit<McpHostOptions, "vault"> {
25
+ /** Set to `true` when at least one configured server has OAuth — see
26
+ * `apps/cli/src/boot/load-runtime.ts` for the determinant. */
27
+ withVault: boolean;
28
+ /** Override the vault loader for tests. */
29
+ vaultLoader?: () => Promise<LocalVaultLike>;
30
+ }
31
+ export declare function loadMcpHost(opts: LoadMcpHostOptions): Promise<McpHost>;
32
+ //# sourceMappingURL=load-mcp-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-mcp-host.d.ts","sourceRoot":"","sources":["../../src/mcp/load-mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAE9E,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;IACvE;mEAC+D;IAC/D,SAAS,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;CAC7C;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB5E"}