@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,86 @@
1
+ import type { McpResourceContent } from "./types.js";
2
+ /**
3
+ * (5.4) An MCP content part — the shape carried by tool results, prompt
4
+ * messages, and embedded resources. Moved here (from `bridge.ts`) so the
5
+ * renderer can be shared by the bridge, the resource tools, and the prompt
6
+ * commands; `bridge.ts` re-exports it for backwards compatibility.
7
+ */
8
+ export type McpContentPart = {
9
+ type: "text";
10
+ text: string;
11
+ } | {
12
+ type: "image";
13
+ data?: string;
14
+ mimeType?: string;
15
+ } | {
16
+ type: "audio";
17
+ data?: string;
18
+ mimeType?: string;
19
+ } | {
20
+ type: "resource";
21
+ resource?: {
22
+ uri?: string;
23
+ text?: string;
24
+ blob?: string;
25
+ mimeType?: string;
26
+ };
27
+ } | {
28
+ type: "resource_link";
29
+ uri?: string;
30
+ name?: string;
31
+ } | {
32
+ type: string;
33
+ [k: string]: unknown;
34
+ };
35
+ export interface RenderOptions {
36
+ /** Per-server secret scrubber. Applied to ALL rendered content (5.4 codex
37
+ * R1 S1 — successful content is redacted too, not just errors: a server can
38
+ * echo a bearer token in a normal prompt message / resource body). */
39
+ redact?: (msg: string) => string;
40
+ }
41
+ /**
42
+ * (5.4) Render MCP content parts to model/TUI-safe text. Text-first: `text`
43
+ * and embedded-resource `text` inline; `resource_link` and binary
44
+ * (`image`/`audio`/blob) become bracketed placeholders — v1 does not forward
45
+ * binary media into the model message (providers vary; the bridge has always
46
+ * done this for tool results). Strips terminal control sequences, then applies
47
+ * the caller's per-server redactor.
48
+ */
49
+ export declare function renderMcpContentParts(content: ReadonlyArray<McpContentPart> | undefined, opts?: RenderOptions): string;
50
+ /**
51
+ * Cap a string at `maxBytes` UTF-8 bytes WITHOUT splitting a code point (CJK-
52
+ * safe). Iterates by code point (`for…of`), stopping before the budget is
53
+ * exceeded; only runs the loop when truncation is actually needed.
54
+ */
55
+ export declare function capUtf8(text: string, maxBytes: number): {
56
+ text: string;
57
+ truncated: boolean;
58
+ fullBytes: number;
59
+ };
60
+ /** Resolve a SAFE extension for a blob's mime type. Strips any `;params`, then
61
+ * looks up the allowlist; anything unknown → `bin`. */
62
+ export declare function safeBlobExt(mimeType: string | undefined): string;
63
+ /**
64
+ * Persist a binary blob under `<root>/.chances/tool-results/<id>/resource.<ext>`
65
+ * (0o700 dir, 0o600 file). `root` MUST be `ctx.parentWorkspaceRoot ?? ctx.workspaceRoot`
66
+ * (M6 — isolated-subagent artifacts survive worktree removal). Returns the path,
67
+ * or null on any fs failure (best-effort, like `persistFullOutput`).
68
+ */
69
+ export declare function persistResourceBlob(root: string, data: Buffer, mimeType: string | undefined): string | null;
70
+ export interface FormatResourceOptions {
71
+ redact?: (msg: string) => string;
72
+ /** Per-content-item UTF-8 byte cap for inline text. */
73
+ maxBytes: number;
74
+ /** Called for blob content; returns the persisted path (or null). When
75
+ * omitted, blobs are summarised without persistence. */
76
+ persistBlob?: (data: Buffer, mimeType?: string) => string | null;
77
+ }
78
+ /**
79
+ * (5.4) Format `resources/read` content items into model-safe text. Text items
80
+ * are stripped + redacted + byte-capped (with a truncation note pointing at no
81
+ * file — callers that need the full body use the larger tool cap); blob items
82
+ * are persisted to disk and replaced with a bracketed path reference (claude-
83
+ * code parity). Never inlines base64.
84
+ */
85
+ export declare function formatResourceContents(contents: McpResourceContent[], opts: FormatResourceOptions): string;
86
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/mcp/content.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAClG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B;;2EAEuE;IACvE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAClC;AAID;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,SAAS,EAClD,IAAI,GAAE,aAAkB,GACvB,MAAM,CAuBR;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAYzD;AAoBD;wDACwD;AACxD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIhE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,GAAG,IAAI,CAUf;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB;6DACyD;IACzD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAClE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,IAAI,EAAE,qBAAqB,GAC1B,MAAM,CA8BR"}
@@ -0,0 +1,147 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { createId } from "@chances-ai/runtime";
4
+ import { stripTerminalControls } from "./redact.js";
5
+ const identity = (m) => m;
6
+ /**
7
+ * (5.4) Render MCP content parts to model/TUI-safe text. Text-first: `text`
8
+ * and embedded-resource `text` inline; `resource_link` and binary
9
+ * (`image`/`audio`/blob) become bracketed placeholders — v1 does not forward
10
+ * binary media into the model message (providers vary; the bridge has always
11
+ * done this for tool results). Strips terminal control sequences, then applies
12
+ * the caller's per-server redactor.
13
+ */
14
+ export function renderMcpContentParts(content, opts = {}) {
15
+ const redact = opts.redact ?? identity;
16
+ if (!content || content.length === 0)
17
+ return "";
18
+ const parts = [];
19
+ for (const part of content) {
20
+ if (part.type === "text" && typeof part.text === "string") {
21
+ parts.push(part.text);
22
+ }
23
+ else if (part.type === "resource") {
24
+ const r = part.resource;
25
+ if (r?.text)
26
+ parts.push(r.text);
27
+ else if (r?.uri)
28
+ parts.push(`[resource ${r.uri}]`);
29
+ }
30
+ else if (part.type === "resource_link") {
31
+ const p = part;
32
+ parts.push(p.name ? `[resource ${p.uri ?? "?"} — ${p.name}]` : `[resource ${p.uri ?? "?"}]`);
33
+ }
34
+ else if (part.type === "image") {
35
+ parts.push(`[image ${part.mimeType ?? "unknown"}]`);
36
+ }
37
+ else if (part.type === "audio") {
38
+ parts.push(`[audio ${part.mimeType ?? "unknown"}]`);
39
+ }
40
+ else {
41
+ parts.push(`[${part.type} content]`);
42
+ }
43
+ }
44
+ return redact(stripTerminalControls(parts.join("\n")));
45
+ }
46
+ /**
47
+ * Cap a string at `maxBytes` UTF-8 bytes WITHOUT splitting a code point (CJK-
48
+ * safe). Iterates by code point (`for…of`), stopping before the budget is
49
+ * exceeded; only runs the loop when truncation is actually needed.
50
+ */
51
+ export function capUtf8(text, maxBytes) {
52
+ const fullBytes = Buffer.byteLength(text, "utf8");
53
+ if (fullBytes <= maxBytes)
54
+ return { text, truncated: false, fullBytes };
55
+ let bytes = 0;
56
+ let out = "";
57
+ for (const ch of text) {
58
+ const b = Buffer.byteLength(ch, "utf8");
59
+ if (bytes + b > maxBytes)
60
+ break;
61
+ bytes += b;
62
+ out += ch;
63
+ }
64
+ return { text: out, truncated: true, fullBytes };
65
+ }
66
+ /** mime → safe file extension allowlist (5.4 codex R1 M6 — never derive a path
67
+ * segment from raw MIME, which can carry `/`, params, or hostile text). */
68
+ const MIME_EXT = {
69
+ "image/png": "png",
70
+ "image/jpeg": "jpg",
71
+ "image/gif": "gif",
72
+ "image/webp": "webp",
73
+ "image/svg+xml": "svg",
74
+ "application/pdf": "pdf",
75
+ "application/json": "json",
76
+ "application/octet-stream": "bin",
77
+ "text/plain": "txt",
78
+ "text/csv": "csv",
79
+ "text/html": "html",
80
+ "audio/mpeg": "mp3",
81
+ "audio/wav": "wav",
82
+ };
83
+ /** Resolve a SAFE extension for a blob's mime type. Strips any `;params`, then
84
+ * looks up the allowlist; anything unknown → `bin`. */
85
+ export function safeBlobExt(mimeType) {
86
+ if (!mimeType)
87
+ return "bin";
88
+ const base = mimeType.split(";")[0].trim().toLowerCase();
89
+ return MIME_EXT[base] ?? "bin";
90
+ }
91
+ /**
92
+ * Persist a binary blob under `<root>/.chances/tool-results/<id>/resource.<ext>`
93
+ * (0o700 dir, 0o600 file). `root` MUST be `ctx.parentWorkspaceRoot ?? ctx.workspaceRoot`
94
+ * (M6 — isolated-subagent artifacts survive worktree removal). Returns the path,
95
+ * or null on any fs failure (best-effort, like `persistFullOutput`).
96
+ */
97
+ export function persistResourceBlob(root, data, mimeType) {
98
+ try {
99
+ const dir = join(root, ".chances", "tool-results", createId("mcpres"));
100
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
101
+ const path = join(dir, `resource.${safeBlobExt(mimeType)}`);
102
+ writeFileSync(path, data, { mode: 0o600 });
103
+ return path;
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ }
109
+ /**
110
+ * (5.4) Format `resources/read` content items into model-safe text. Text items
111
+ * are stripped + redacted + byte-capped (with a truncation note pointing at no
112
+ * file — callers that need the full body use the larger tool cap); blob items
113
+ * are persisted to disk and replaced with a bracketed path reference (claude-
114
+ * code parity). Never inlines base64.
115
+ */
116
+ export function formatResourceContents(contents, opts) {
117
+ const redact = opts.redact ?? identity;
118
+ const out = [];
119
+ for (const c of contents) {
120
+ if (typeof c.text === "string") {
121
+ const cleaned = redact(stripTerminalControls(c.text));
122
+ const capped = capUtf8(cleaned, opts.maxBytes);
123
+ out.push(capped.truncated
124
+ ? `${capped.text}\n[…truncated — ${capped.fullBytes} bytes total]`
125
+ : capped.text);
126
+ }
127
+ else if (typeof c.blob === "string") {
128
+ let buf;
129
+ try {
130
+ buf = Buffer.from(c.blob, "base64");
131
+ }
132
+ catch {
133
+ buf = undefined;
134
+ }
135
+ const path = buf && opts.persistBlob ? opts.persistBlob(buf, c.mimeType) : null;
136
+ const mime = c.mimeType ?? "application/octet-stream";
137
+ // (5.4 R2 S1) `mimeType` is server-controlled — strip + redact BOTH the
138
+ // persisted and the not-persisted notes, not just the persisted one.
139
+ const note = path
140
+ ? `[binary resource (${mime}) saved to ${path}]`
141
+ : `[binary resource (${mime})${buf ? `, ${buf.length} bytes` : ""} — not persisted]`;
142
+ out.push(redact(stripTerminalControls(note)));
143
+ }
144
+ }
145
+ return out.join("\n\n");
146
+ }
147
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/mcp/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { McpServerConfig } from "./types.js";
2
+ /**
3
+ * Expands `${VAR}` and `${VAR:-default}` references inside a single string.
4
+ * No `$VAR` (without braces) on purpose — too many MCP commands contain
5
+ * unbraced dollars in URLs and we don't want false positives.
6
+ *
7
+ * Unknown variables without a `:-default` fallback throw `AppError(Config)`
8
+ * so misconfigured env doesn't silently produce a string with an unresolved
9
+ * `${VAR}` literal that the MCP server can't parse.
10
+ */
11
+ export declare function expandEnv(raw: string, env: Record<string, string | undefined>): string;
12
+ /**
13
+ * Walks a config entry and expands every string field that could meaningfully
14
+ * carry an env reference: command, args[], env values, cwd, url, header
15
+ * values. Leaves booleans / numbers / undefined alone. Returns a new object —
16
+ * never mutates the input.
17
+ */
18
+ export declare function expandServerEnv(config: McpServerConfig, env: Record<string, string | undefined>): McpServerConfig;
19
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/mcp/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAUtF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,eAAe,CAgBjB"}
@@ -0,0 +1,50 @@
1
+ import { AppError, ErrorCode } from "@chances-ai/runtime";
2
+ /**
3
+ * Expands `${VAR}` and `${VAR:-default}` references inside a single string.
4
+ * No `$VAR` (without braces) on purpose — too many MCP commands contain
5
+ * unbraced dollars in URLs and we don't want false positives.
6
+ *
7
+ * Unknown variables without a `:-default` fallback throw `AppError(Config)`
8
+ * so misconfigured env doesn't silently produce a string with an unresolved
9
+ * `${VAR}` literal that the MCP server can't parse.
10
+ */
11
+ export function expandEnv(raw, env) {
12
+ return raw.replace(/\$\{([A-Z_][A-Z0-9_]*)(?::-([^}]*))?\}/gi, (_match, name, fallback) => {
13
+ const value = env[name];
14
+ if (value !== undefined && value !== "")
15
+ return value;
16
+ if (fallback !== undefined)
17
+ return fallback;
18
+ throw new AppError(ErrorCode.Config, `mcp env: required variable \${${name}} is not set (use \${${name}:-default} to provide a fallback)`);
19
+ });
20
+ }
21
+ /**
22
+ * Walks a config entry and expands every string field that could meaningfully
23
+ * carry an env reference: command, args[], env values, cwd, url, header
24
+ * values. Leaves booleans / numbers / undefined alone. Returns a new object —
25
+ * never mutates the input.
26
+ */
27
+ export function expandServerEnv(config, env) {
28
+ const exp = (s) => expandEnv(s, env);
29
+ if (config.type === "stdio") {
30
+ return {
31
+ ...config,
32
+ command: exp(config.command),
33
+ args: config.args?.map(exp),
34
+ env: config.env ? mapValues(config.env, exp) : undefined,
35
+ cwd: config.cwd ? exp(config.cwd) : undefined,
36
+ };
37
+ }
38
+ return {
39
+ ...config,
40
+ url: exp(config.url),
41
+ headers: config.headers ? mapValues(config.headers, exp) : undefined,
42
+ };
43
+ }
44
+ function mapValues(obj, f) {
45
+ const out = {};
46
+ for (const [k, v] of Object.entries(obj))
47
+ out[k] = f(v);
48
+ return out;
49
+ }
50
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/mcp/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAuC;IAC5E,OAAO,GAAG,CAAC,OAAO,CAAC,0CAA0C,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,QAAiB,EAAE,EAAE;QACzG,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,MAAM,EAChB,iCAAiC,IAAI,wBAAwB,IAAI,mCAAmC,CACrG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAuB,EACvB,GAAuC;IAEvC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO;YACL,GAAG,MAAM;YACT,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5B,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;YAC3B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YACxD,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,MAAM;QACT,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAI,GAAsB,EAAE,CAAc;IAC1D,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,199 @@
1
+ import type { EventBus, Logger } from "@chances-ai/runtime";
2
+ import type { ToolRegistry } from "../tools/index.js";
3
+ import { type ClientIdentity } from "./client.js";
4
+ import { type RuntimeRedactor } from "./redact.js";
5
+ import type { HttpMcpConfig, McpPrompt, McpPromptMessage, McpResource, McpResourceContent, McpServerConfig, McpServerStatus, McpTestResult } from "./types.js";
6
+ import type { McpResourceProvider } from "./resources.js";
7
+ import { ChancesOAuthClientProvider } from "./oauth/provider.js";
8
+ import { LoopbackCallbackServer } from "./oauth/callback-server.js";
9
+ /**
10
+ * (3.7) Narrow vault surface the host depends on. Mirrored from
11
+ * `@chances-ai/local-vault#LocalVault` so this package does NOT hard-import
12
+ * the optional peer (which is loaded via computed specifier in
13
+ * `loadMcp({withVault})` — see `index.ts`).
14
+ */
15
+ export interface LocalVaultLike {
16
+ read<T = unknown>(key: string): Promise<T | undefined>;
17
+ list(): Promise<readonly string[]>;
18
+ remove(key: string): Promise<void>;
19
+ mergeMutate<T>(key: string, mutator: (current: T | undefined) => T | undefined | Promise<T | undefined>, allowDelete?: boolean): Promise<void>;
20
+ }
21
+ export interface McpHostOptions {
22
+ /** Map keyed by server id (used in `mcp__<server>__<tool>` names). */
23
+ servers: Record<string, McpServerConfig>;
24
+ bus: EventBus;
25
+ logger: Logger;
26
+ registry: ToolRegistry;
27
+ /** Optional env source for `${VAR}` expansion. Defaults to `process.env`. */
28
+ env?: Record<string, string | undefined>;
29
+ /** Connection-attempt timeout, in ms. Caps a single server's startup so a
30
+ * wedged spawn doesn't block the whole boot. Defaults to 10 000 ms. */
31
+ connectTimeoutMs?: number;
32
+ /**
33
+ * Identity the host announces to each MCP server during the initialize
34
+ * handshake. Callers (the CLI) thread `{ name: pkg.name, version: pkg.version }`
35
+ * read from their own `package.json` — keeping the version read out of
36
+ * `@chances-ai/mcp` itself avoids the unverified "Bun embeds a transitive
37
+ * workspace JSON import" path under `bun build --compile`. When omitted,
38
+ * the library falls back to a `0.0.0-dev` default.
39
+ */
40
+ clientIdentity?: ClientIdentity;
41
+ /**
42
+ * (3.7) Encrypted credential store. Required for OAuth-configured
43
+ * servers; absent means OAuth servers fail with a clear "vault
44
+ * unavailable" message and the rest keep working. Routed in by
45
+ * `loadMcp({withVault: true})` — see `index.ts`. `apps/cli` never
46
+ * imports `@chances-ai/local-vault` directly (boundary decision).
47
+ */
48
+ vault?: LocalVaultLike;
49
+ /**
50
+ * (3.7) Platform-agnostic browser launcher used by `/mcp login`.
51
+ * Default delegates to `open` / `xdg-open` / `start.exe`. Tests inject
52
+ * a stub.
53
+ */
54
+ openBrowser?: (url: URL) => Promise<void>;
55
+ /**
56
+ * (5.4 D6′) Absolute workspace root advertised to servers via `roots/list`
57
+ * when `advertiseRoots` is true. Threaded from the CLI boot.
58
+ */
59
+ workspaceRoot?: string;
60
+ /**
61
+ * (5.4 D6′ / S5) Advertise the `roots` capability (workspace path) to
62
+ * servers. `listChanged` is always false. Default false at the library layer;
63
+ * the CLI passes `config.mcp.advertiseRoots` (default true).
64
+ */
65
+ advertiseRoots?: boolean;
66
+ }
67
+ /**
68
+ * (3.7) Per-server OAuth state held by the host across restart cycles.
69
+ * The redactor outlives any single connect cycle so tokens written
70
+ * during connect-N stay scrubbed in errors from connect-N+1.
71
+ *
72
+ * **(codex Round-2 MUST-FIX #3 + #4)** The provider + callbackServer
73
+ * pair is recreated whenever the vault generation bumps (e.g. on
74
+ * `/mcp logout`), since the provider holds an immutable snapshot of
75
+ * that generation. The previous V1 also held a `RefreshCoalescer` but
76
+ * no production codepath called `coalescer.refresh(...)` — the SDK
77
+ * owns refresh through `auth()` and we never intercepted it — so the
78
+ * field has been removed. Coalescing the SDK's refresh path is a
79
+ * 3.7.1 follow-up (would require taking ownership of refresh in the
80
+ * provider's `tokens()` and re-issuing the IdP call ourselves).
81
+ */
82
+ export interface OAuthServerState {
83
+ provider: ChancesOAuthClientProvider;
84
+ callbackServer: LoopbackCallbackServer;
85
+ redactor: RuntimeRedactor;
86
+ /** The OAuth-configured HTTP server config — the slash command's
87
+ * `/mcp login` flow needs the URL + scopes to drive `auth()`. */
88
+ config: HttpMcpConfig & {
89
+ auth: {
90
+ kind: "oauth";
91
+ scopes?: readonly string[];
92
+ };
93
+ };
94
+ }
95
+ /**
96
+ * Lifecycle orchestrator for one or more MCP servers. Connects them in
97
+ * parallel on `start()`, surfaces per-server failures as `failed` status
98
+ * instead of crashing the whole boot, and registers each server's discovered
99
+ * tools into the host `ToolRegistry`.
100
+ *
101
+ * Not a Plugin — MCP integration lives at the runtime layer because the
102
+ * engine consumes tools, not plugin hooks. Slash commands and CLI glue talk
103
+ * to the host directly.
104
+ *
105
+ * **Lifecycle serialization.** Every method that mutates host state
106
+ * (`startServer` / `restart` / `remove` / `dispose`) is chained behind a
107
+ * single `opsLock` promise so concurrent calls observe a consistent state
108
+ * machine. Two concurrent `restart(x)` calls run sequentially; a
109
+ * `dispose()` interleaved with a `restart()` always wins (because each
110
+ * step re-checks `disposed`). This guards against the codex-flagged race
111
+ * where a floating `/mcp restart` could resurrect a server after global
112
+ * teardown.
113
+ */
114
+ export declare class McpHost implements McpResourceProvider {
115
+ private readonly opts;
116
+ private readonly states;
117
+ private disposed;
118
+ private opsLock;
119
+ private constructor();
120
+ /**
121
+ * Constructs and starts the host. Returns once every server has either
122
+ * connected (and its tools are in the registry) or failed (status
123
+ * `failed`, error message logged). Always resolves — never throws — so a
124
+ * misconfigured MCP server can't take down the agent.
125
+ */
126
+ static start(opts: McpHostOptions): Promise<McpHost>;
127
+ status(): McpServerStatus[];
128
+ /**
129
+ * Tears down the named server (if any), wipes its registered tools, then
130
+ * reconnects from its current config. Surfaces the new status. Caller is
131
+ * the `/mcp restart` slash command.
132
+ */
133
+ restart(id: string): Promise<McpServerStatus>;
134
+ /**
135
+ * Tears down the named server and unregisters its tools, but leaves no
136
+ * trace in host state — callers (typically `/mcp remove`) own the config
137
+ * mutation. Throws if no such server is known.
138
+ */
139
+ remove(id: string): Promise<void>;
140
+ /**
141
+ * One-shot validation: connect, list tools, dispose. Doesn't register any
142
+ * tools or mutate host state. Caller is `/mcp test`.
143
+ */
144
+ test(id: string): Promise<McpTestResult>;
145
+ /**
146
+ * Tears down every server and unregisters their tools. Safe to call
147
+ * repeatedly; subsequent calls are no-ops.
148
+ */
149
+ dispose(): Promise<void>;
150
+ /**
151
+ * Serializes a lifecycle operation behind `opsLock` so concurrent
152
+ * `restart`/`remove`/`dispose` calls run one at a time. The lock is a
153
+ * promise chain — every new op `.then`s itself onto the previous one.
154
+ */
155
+ private runOp;
156
+ private startServer;
157
+ private discoverResources;
158
+ private discoverPrompts;
159
+ private disposeServer;
160
+ /** Cached `resources/list` snapshot across servers (optional filter). */
161
+ resources(server?: string): McpResource[];
162
+ /** Cached `prompts/list` snapshot across servers (optional filter). */
163
+ prompts(server?: string): McpPrompt[];
164
+ readResource(server: string, uri: string, signal: AbortSignal): Promise<{
165
+ contents: McpResourceContent[];
166
+ redact: (msg: string) => string;
167
+ }>;
168
+ getPrompt(server: string, name: string, args: Record<string, string>, signal: AbortSignal): Promise<{
169
+ messages: McpPromptMessage[];
170
+ description?: string;
171
+ redact: (msg: string) => string;
172
+ }>;
173
+ /** (5.4 S3) Throw if the server's client was swapped/disposed during an await. */
174
+ private assertSameGeneration;
175
+ /**
176
+ * Test/slash seam — returns the per-server OAuth bag (provider,
177
+ * callback server, coalescer, redactor). Returns undefined when the
178
+ * server isn't OAuth-configured or hasn't been started yet.
179
+ */
180
+ getOAuthState(id: string): OAuthServerState | undefined;
181
+ /**
182
+ * (3.7) Logs out a single OAuth-configured server:
183
+ * 1. Bumps the vault payload's generation (via `invalidateCredentials("all")`)
184
+ * so late-arriving `saveTokens` from a refresh that escaped the
185
+ * teardown drops on the generation guard inside `mergeMutate`
186
+ * (codex Round-1 MUST-FIX #5).
187
+ * 2. Restarts the server. **(codex Round-2 MUST-FIX #3)** `startServer`
188
+ * constructs a FRESH `ChancesOAuthClientProvider` with the new
189
+ * generation snapshot, so the next `/mcp login` can persist tokens
190
+ * and the old provider's cached state can't resurface.
191
+ *
192
+ * No-op when the server isn't OAuth-configured.
193
+ */
194
+ logout(id: string): Promise<void>;
195
+ /** (3.7) Logs out every OAuth-configured server. Per-server failures
196
+ * don't abort the loop. */
197
+ logoutAll(): Promise<void>;
198
+ }
199
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/mcp/host.ts"],"names":[],"mappings":"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"}