chainlesschain 0.165.4 → 0.165.6

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 (214) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-C__nnraW.js → AIOps-vfoDb6HZ.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CsKWHEZ-.js → ActionButton-Cm5f7p93.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BhIjfjWO.js → Analytics-yRuvgWxa.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BjuXFzWZ.js → AppLayout-BROsC4h1.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-k6whDkZJ.js → Artifacts-CimHApb1.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-C4FBMYRh.js → Audit-DI8kr8zI.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-C_vRrSXk.js → BackgroundAgents-DSLzKy-n.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CngFZeVp.js → Backup-DkH_n2r1.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-B_H9EBRm.js → BaseInput-CKSrUoRA.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DLEC5kt7.js → Chat-ClwfMXUS.js} +3 -3
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-CjMaqfL7.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-m3ClR4xh.js → Checkbox-BYTehcQG.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CmLSFrgp.js → Codegen-B8AMcp6J.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DFGQteHN.js → Col-BNSogPo3.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-EUUVORHE.js → Community-JxPvGb8O.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-2PSg0Yr7.js → Compact-DF7bFAgE.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CcKur7gB.js → Compliance-Bvhqnwrq.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DK_Fezfa.js → Cowork-BDS0CJvM.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-Dbw89xl7.js → Cron-DqvRfxoQ.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CH66h_Ec.js → Crosschain-CDcIvnqS.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D1igRb17.js → DID-D7jaUxU3.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DVAsrobk.js → Dashboard-B5A18wEV.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Dl7W8AQs.js → Dropdown-_6IVkGag.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-D5tpaEQC.js → EmailListRenderer-C9PeiKCG.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-O_VQf8gq.js → FamilyGuardDashboard-DXjuEHrX.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-BTVcgS9n.js → Federation-B4IAR9zv.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BRnkJAIz.js → FormItemContext-CxQeSNx1.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-8OWSCkDj.js → GenericCardRenderer-B8GS-Y3N.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-WXLYTQj2.js → Git-BS8SouUX.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-BezaUhtc.js → Governance-Dq9aYb5Q.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CuRay3Gu.js → Inference-BrCEe9AJ.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DfWLDW1m.js → KnowledgeGraph-DybOpiY2.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-C55y2pPY.js → Logs-DBpzbRfx.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-Dk08Uycg.js → Marketplace-Cc7CCSCu.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-C11fSB5V.js → McpTools-DFaIhOfu.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-mr0eZc97.js → Memory-KCqlp9ol.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-C0iCSRbb.js → MobileBridge-Bys84ySN.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CY-xMG8Z.js → MobileProjects-B-6qU-je.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Bplqc_Wc.js → Mtc-BgY-fvCq.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-BlzwsoSM.js → MtcAudit-B8pCmqQJ.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-BBLmTty6.js → Multisig-BbOmYutA.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-DtT1uf1W.js → NLProgramming-BocLQz_M.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-DcqQAxTK.js → Notes-CSwbxEop.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-cb0kWoZe.js → NotificationSettings-CqFNSYG3.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-kw9HZQNN.js → OrderTableRenderer-C6gMfAk7.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-DlTlbkUN.js → Organization-QrDXVdMJ.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-pp1qs-oY.js → Overflow-Cxntotjt.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BESLnyYz.js → P2P-CIdBOwNq.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-B-J1mGuf.js → PdhVaultBrowser-CT5aP8rD.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-B36PeT1_.js → Permissions-DH7OM8XU.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-CTK2ad-3.js → PersonalDataHub-CnJqbWce.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-zJNGXsac.js → Pipeline-5C3HG1kH.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-b9fz0Qf0.js → Privacy-B4yIp7xK.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-DjZbZgiB.js → ProjectInit-BMvt-2M0.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-C-hHJXlD.js → ProjectSettings-CvSTEMRG.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-BKBJxEek.js +1 -0
  60. package/src/assets/web-panel/assets/Providers-BdwUqFWN.js +1 -0
  61. package/src/assets/web-panel/assets/{QrScannerModal-A0yoQ3-3.js → QrScannerModal-DtnCKlTm.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-DrFgFJNC.js → QuickAsk-sTbgwyNr.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-KC8hF1g4.js → Recommend-Bzr14gSb.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DGTPIk6u.js → RemoteSession-C_TF5IaJ.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-QmbwM7Yk.js → Reputation-GCAM4H2K.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-BxjJylia.js → Row-Dir0r6OQ.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-B7Wda1J6.js → RssFeed-CpGnlecX.js} +2 -2
  68. package/src/assets/web-panel/assets/{Search-_plQ_YSA.js → Search-DMMamC6u.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CD2YJZfx.js → Security-yqay5yG-.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-qQE7NmwE.js → Services-C5i2wh9G.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DgQqkFf7.js → Skeleton-vUqk35yj.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-C4C0oFFt.js → Skills-DzcSkhot.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Px2N2B5c.js → Sla-CB6qbYNr.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-DN6C3lQd.js → SpeechSettings-BHUI7cox.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-jm5aH_m7.js → SyncSettings-D-RrsxTJ.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-DlkJcv67.js → Tasks-DFxdOJiq.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-DyrTHUBs.js → Templates-SKAob_Aq.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-mC434PtL.js → Tenant-BPfsfHQ-.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-o0_s3NgK.js → Terminal-8iw7FpUf.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DAGlAXOw.js → TimelineRenderer-C4Gjj5Su.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BnulS_bs.js → Tokens-COYhN18e.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-suQbVXYM.js → Trigger-B-JzXcf6.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-DbIJAPo5.js → Trust-BJ5bg0nI.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-CQNpbIHi.js → UkeySign-BG_ByRMf.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-D8aWCERk.js → VideoEditing-B3kOnSiU.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-CuLpYfZc.js → Wallet-CcoGFnK7.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CsfG8ZMc.js → WebAuthn-DdT8vRC_.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-BYsEAZbd.js → WorkflowEditor-CZu3M9N8.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-FT4Um3-I.js → chat-DxJt3Qba.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-CKbS_Wlt.js → colors-DdYfwJaB.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-CFJtzuJM.js → compact-item-BG3SUzwj.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-B9kSRW6K.js → createContext-By51z2-1.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DR-x0Xpi.js → hasIn-B0apZ3KJ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DjEP7WkH.js → index-3jWkIu5j.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-7jHr_A_k.js → index-B3rWuPMW.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DcfxhKXR.js → index-B5rLiEo0.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-tqSEHPRT.js → index-BBPf3TpM.js} +1 -1
  99. package/src/assets/web-panel/assets/index-BETiL0a3.js +1 -0
  100. package/src/assets/web-panel/assets/{index-Cr2FLUsD.js → index-BIrJfqO4.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Bt4fS2eL.js → index-BLIbGOLX.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BwR7yc2h.js → index-BP94CrBV.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BVPU43b1.js → index-BWF8_mkx.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DShSkww-.js → index-BYINoRLK.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Bzz0C1BZ.js → index-BZ_0qm4g.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-KqDaCApw.js → index-BewKYrX9.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BW-t9n-q.js → index-BfWYsB9t.js} +1 -1
  108. package/src/assets/web-panel/assets/index-BhAVHuW8.js +1 -0
  109. package/src/assets/web-panel/assets/{index-B7osrXqy.js → index-Bissefox.js} +3 -3
  110. package/src/assets/web-panel/assets/{index-DW4BWjTk.js → index-BkvcEo4p.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DdkIhfi-.js → index-Bos5_aMV.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DTxNy0ZU.js → index-C1C9i79A.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-QBSeNVO3.js → index-CAhHirVH.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-D4LfPvWA.js → index-CNIxXMmN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C_enk9I_.js → index-CW93tZDv.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-WE08gMJP.js → index-CWEuZWCK.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-r2VI1Ikk.js → index-Cp6e-hGw.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dap9c3eD.js → index-CpjZhgNd.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DWdqx7zI.js → index-CzmQElZy.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BGbPnC5x.js → index-DCn8IcxV.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DiNUEpSQ.js → index-DE76D-kA.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DtkFqPVA.js → index-DaIz0NAW.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CGaXUsIs.js → index-Da_WBdLX.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B3ZX81mK.js → index-Dz49VOyQ.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BK3TiKVq.js → index-Q2SCX-MI.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CJmIQ9XR.js → index-RD6O-0C6.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CvrCCqJt.js → index-SQqOlR3d.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BI5hP_qy.js → index-ZFbps9po.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DeSgw-WV.js → index-ZxtP8jG7.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DMGmg497.js → index-bP_VlDb4.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BfFCQHL3.js → index-kf57LJ93.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-OSzjTzGM.js → index-oxRrmFO9.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-C2JvmYRc.js → index-p1_8SbI1.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-Dd7n7VgI.js → initDefaultProps-BWJktcg8.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BwxouRw1.js → motion-BEXBzUFV.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-DObN0PG9.js → move-BUKwn2sx.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-B3nOUQc7.js → mtc-parser-FTI7btqQ.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-o9WU2Nbl.js → omit-CsLtSPH3.js} +1 -1
  139. package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
  140. package/src/assets/web-panel/assets/{pickAttrs-CL_vvfQ_.js → pickAttrs-DWZxsT_S.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-CYrM2tyK.js → placementArrow-Bcfs43CX.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-k_06cQ96.js → responsiveObserve-a9bcC1p-.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CPKG0pxS.js → slide-BDTzgOXN.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BDDEeLTw.js → statusUtils-Iq1j_HUg.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-Cmb7RTh7.js → styleChecker-DAZEYxeh.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-e2IedC4N.js → useFlexGapSupport-DVkjyDrh.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CE_gxVnm.js → useFs-wXTpNTHt.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BkMIIKMz.js → usePersonalDataHub-CtQM_aZr.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DW886XV1.js → vnode-hjEoG85v.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-Dwo_adaf.js → zoom-BHVpyKg_.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +3 -3
  153. package/src/commands/agent.js +14 -2
  154. package/src/commands/artifacts.js +235 -0
  155. package/src/commands/background-session.js +100 -10
  156. package/src/commands/cowork.js +86 -57
  157. package/src/commands/mcp.js +5 -0
  158. package/src/commands/plugin.js +145 -29
  159. package/src/commands/remote-control.js +295 -110
  160. package/src/commands/session-location.js +20 -1
  161. package/src/commands/session-message.js +171 -0
  162. package/src/commands/session.js +75 -69
  163. package/src/data/changelog.json +29 -3
  164. package/src/gateways/ws/message-dispatcher.js +57 -0
  165. package/src/harness/mcp-client.js +141 -10
  166. package/src/lib/artifact-access-ledger.js +1 -0
  167. package/src/lib/artifact-deletion-ledger.js +1 -0
  168. package/src/lib/artifact-recovery.js +970 -0
  169. package/src/lib/artifact-workbench-projection.js +171 -0
  170. package/src/lib/background-session-transport.js +153 -27
  171. package/src/lib/dynamic-workflow-runtime.js +408 -1
  172. package/src/lib/execution-location-target.js +4 -2
  173. package/src/lib/mcp-client.js +2 -0
  174. package/src/lib/mcp-headers-helper.js +47 -5
  175. package/src/lib/mcp-oauth.js +55 -6
  176. package/src/lib/mcp-stdio-executable-identity.js +16 -0
  177. package/src/lib/mcp-stdio-native-code-policy.js +74 -0
  178. package/src/lib/mcp-stdio-package-materialization.js +12 -3
  179. package/src/lib/mcp-tls.js +230 -0
  180. package/src/lib/output-styles.js +12 -0
  181. package/src/lib/plugin-runtime/install.js +614 -71
  182. package/src/lib/plugin-runtime/marketplace-archive-source.js +331 -0
  183. package/src/lib/plugin-runtime/marketplace-catalog.js +52 -6
  184. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
  185. package/src/lib/plugin-runtime/marketplace-source-adapter.js +163 -0
  186. package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
  187. package/src/lib/plugin-runtime/remote-source.js +435 -55
  188. package/src/lib/plugin-security.js +393 -41
  189. package/src/lib/plugin-source-identity.js +850 -0
  190. package/src/lib/process-execution-broker/index.js +112 -0
  191. package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
  192. package/src/lib/process-execution-broker/workspace-transaction.js +26 -0
  193. package/src/lib/remote-approval-bridge.js +136 -46
  194. package/src/lib/remote-control.js +217 -31
  195. package/src/lib/session-message-fabric.js +1105 -0
  196. package/src/lib/session-projection.js +171 -12
  197. package/src/lib/session-runtime-retention.js +155 -0
  198. package/src/lib/settings-loader.cjs +29 -0
  199. package/src/repl/agent-repl.js +51 -14
  200. package/src/repl/permission-prompt.js +31 -8
  201. package/src/repl/repl-keybindings.js +55 -0
  202. package/src/runtime/agent-core.js +63 -2
  203. package/src/runtime/headless-runner.js +47 -66
  204. package/src/runtime/headless-stream.js +18 -24
  205. package/src/runtime/mcp-config.js +2 -0
  206. package/src/runtime/policies/agent-policy.js +2 -0
  207. package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +0 -1
  208. package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +0 -1
  209. package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +0 -1
  210. package/src/assets/web-panel/assets/Providers-Dz-CAYYU.js +0 -1
  211. package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +0 -1
  212. package/src/assets/web-panel/assets/index-Bizb4hkw.js +0 -1
  213. package/src/assets/web-panel/assets/index-OHSl-xCh.js +0 -1
  214. package/src/assets/web-panel/assets/parsers-UEvh_ShA.js +0 -4
@@ -45,6 +45,11 @@ import {
45
45
  prepareMcpStdioExecutableIdentity,
46
46
  } from "../lib/mcp-stdio-executable-identity.js";
47
47
  import { resolveMcpStdioSandboxContext } from "../lib/mcp-stdio-workspace-authority.js";
48
+ import {
49
+ closeMcpTlsDispatcher,
50
+ createMcpTlsDispatcher,
51
+ loadMcpTlsMaterial,
52
+ } from "../lib/mcp-tls.js";
48
53
 
49
54
  /**
50
55
  * Injectable dependencies — overridable from tests.
@@ -63,6 +68,9 @@ export const _deps = {
63
68
  verifyMcpStdioApprovedWorkingDirectory,
64
69
  prepareMcpStdioExecutableIdentity,
65
70
  resolveMcpStdioSandboxContext,
71
+ loadMcpTlsMaterial,
72
+ createMcpTlsDispatcher,
73
+ closeMcpTlsDispatcher,
66
74
  // Backoff sleep seam (tests override with a no-op so retries don't wait).
67
75
  sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
68
76
  };
@@ -230,6 +238,24 @@ const MCP_HTTP_RESPONSE_MAX_BYTES = 16 * 1024 * 1024;
230
238
  */
231
239
  const STDIO_REQUEST_TIMEOUT_MS = 30000;
232
240
  const MCP_PROTOCOL_VERSION = "2025-11-25";
241
+ export const SUPPORTED_MCP_PROTOCOL_VERSIONS = Object.freeze([
242
+ "2024-11-05",
243
+ "2025-03-26",
244
+ "2025-06-18",
245
+ MCP_PROTOCOL_VERSION,
246
+ ]);
247
+ const supportedMcpProtocolVersions = new Set(SUPPORTED_MCP_PROTOCOL_VERSIONS);
248
+
249
+ export function assertSupportedMcpProtocolVersion(value) {
250
+ if (typeof value !== "string" || !supportedMcpProtocolVersions.has(value)) {
251
+ const error = new Error(
252
+ "MCP server selected an unsupported protocol version",
253
+ );
254
+ error.code = "CC_MCP_PROTOCOL_VERSION_UNSUPPORTED";
255
+ throw error;
256
+ }
257
+ return value;
258
+ }
233
259
  const URL_ELICITATION_REQUIRED = -32042;
234
260
  const MCP_RPC_ERROR_CODE = "CC_MCP_RPC_ERROR";
235
261
  const mcpRpcControlData = new WeakMap();
@@ -1287,6 +1313,10 @@ export class MCPClient extends EventEmitter {
1287
1313
  this._nextId = 1;
1288
1314
  this._reconnectors = new Map(); // name → async () => config|null
1289
1315
  this._reconnecting = new Map(); // name → in-flight reconnect promise
1316
+ // Desired resource subscriptions outlive a single transport entry. Keeping
1317
+ // them on the client lets a later reconnect retry restoration even when a
1318
+ // previous partial reconnect was torn down fail-closed.
1319
+ this._resourceSubscriptions = new Map(); // name → Set<uri>
1290
1320
  this._sessionId =
1291
1321
  options && options.sessionId != null ? String(options.sessionId) : null;
1292
1322
  this._workspaceBinding =
@@ -2082,6 +2112,17 @@ export class MCPClient extends EventEmitter {
2082
2112
  };
2083
2113
  }
2084
2114
  }
2115
+ let tlsMaterial = null;
2116
+ if (sourceConfig.tls != null) {
2117
+ if (transportKind !== "https" && transportKind !== "wss") {
2118
+ throw mcpTransportError(
2119
+ "CC_MCP_TLS_TRANSPORT_REQUIRED",
2120
+ `MCP TLS configuration requires https or wss (server "${name}")`,
2121
+ { transport: transportKind, url: sourceConfig.url },
2122
+ );
2123
+ }
2124
+ tlsMaterial = _deps.loadMcpTlsMaterial(sourceConfig.tls);
2125
+ }
2085
2126
  const connectionHeaders = await this._connectionHeaders(
2086
2127
  name,
2087
2128
  sourceConfig,
@@ -2104,6 +2145,8 @@ export class MCPClient extends EventEmitter {
2104
2145
  _httpRequestControllers: new Set(),
2105
2146
  _httpDiscardControllers: new Set(),
2106
2147
  _httpDiscardStopping: false,
2148
+ _httpDispatcher: null,
2149
+ _tlsIdentityDigest: tlsMaterial?.identityDigest || null,
2107
2150
  _disconnectPromise: null,
2108
2151
  _webSocketPayloadError: null,
2109
2152
  _webSocketInboundError: null,
@@ -2157,6 +2200,9 @@ export class MCPClient extends EventEmitter {
2157
2200
  }
2158
2201
  entry.httpUrl = config.url;
2159
2202
  entry.httpHeaders = connectionHeaders;
2203
+ entry._httpDispatcher = tlsMaterial
2204
+ ? _deps.createMcpTlsDispatcher(tlsMaterial)
2205
+ : null;
2160
2206
  } else if (isWebSocketTransport(transportKind)) {
2161
2207
  if (!config.url) {
2162
2208
  throw mcpTransportError(
@@ -2203,6 +2249,7 @@ export class MCPClient extends EventEmitter {
2203
2249
  ...(transportKind === "wss" && config.rejectUnauthorized === false
2204
2250
  ? { rejectUnauthorized: false }
2205
2251
  : {}),
2252
+ ...(tlsMaterial?.connectOptions || {}),
2206
2253
  });
2207
2254
  entry.socket = socket;
2208
2255
 
@@ -2680,8 +2727,8 @@ export class MCPClient extends EventEmitter {
2680
2727
  clientInfo: { name: "chainlesschain-cli", version: "0.37.9" },
2681
2728
  });
2682
2729
 
2683
- entry.protocolVersion = String(
2684
- initResult?.protocolVersion || this._protocolVersion,
2730
+ entry.protocolVersion = assertSupportedMcpProtocolVersion(
2731
+ initResult?.protocolVersion,
2685
2732
  );
2686
2733
  // Send initialized notification
2687
2734
  this._sendNotification(name, "notifications/initialized", {});
@@ -2831,6 +2878,12 @@ export class MCPClient extends EventEmitter {
2831
2878
  // teardown is best-effort
2832
2879
  }
2833
2880
  }
2881
+ try {
2882
+ await _deps.closeMcpTlsDispatcher(entry._httpDispatcher);
2883
+ } catch {
2884
+ // Preserve the connection failure; dispatcher cleanup is best-effort.
2885
+ }
2886
+ entry._httpDispatcher = null;
2834
2887
  this._releaseToolInventory(entry);
2835
2888
  this.servers.delete(name);
2836
2889
  if (
@@ -2850,7 +2903,10 @@ export class MCPClient extends EventEmitter {
2850
2903
  /**
2851
2904
  * Disconnect from an MCP server.
2852
2905
  */
2853
- disconnect(name) {
2906
+ disconnect(name, options = {}) {
2907
+ if (options.preserveResourceSubscriptions !== true) {
2908
+ this._resourceSubscriptions.delete(name);
2909
+ }
2854
2910
  const entry = this.servers.get(name);
2855
2911
  if (!entry) {
2856
2912
  this._cancelServerElicitations(name);
@@ -2906,6 +2962,12 @@ export class MCPClient extends EventEmitter {
2906
2962
  }
2907
2963
  return true;
2908
2964
  } finally {
2965
+ try {
2966
+ await _deps.closeMcpTlsDispatcher(entry._httpDispatcher);
2967
+ } catch {
2968
+ // Transport teardown remains best-effort.
2969
+ }
2970
+ entry._httpDispatcher = null;
2909
2971
  entry.state = ServerState.DISCONNECTED;
2910
2972
  this._releaseToolInventory(entry);
2911
2973
  // A future connection may reuse the same name. Never let a delayed
@@ -2928,8 +2990,15 @@ export class MCPClient extends EventEmitter {
2928
2990
  */
2929
2991
  async disconnectAll() {
2930
2992
  const names = [...this.servers.keys()];
2931
- for (const name of names) {
2932
- await this.disconnect(name);
2993
+ try {
2994
+ for (const name of names) {
2995
+ await this.disconnect(name);
2996
+ }
2997
+ } finally {
2998
+ // A failed reconnect may have already removed its transport entry while
2999
+ // retaining desired subscriptions for another retry. disconnectAll()
3000
+ // is the explicit terminal teardown and must clear those tombstones too.
3001
+ this._resourceSubscriptions.clear();
2933
3002
  }
2934
3003
  }
2935
3004
 
@@ -3173,11 +3242,22 @@ export class MCPClient extends EventEmitter {
3173
3242
  try {
3174
3243
  const currentEntry = this.servers.get(name) || null;
3175
3244
  const currentConfig = currentEntry?.config || null;
3245
+ // Resource subscriptions belong to the logical client/server
3246
+ // relationship, not to one transport connection. Snapshot them before
3247
+ // disconnect() removes the old entry so a hot reconnect cannot
3248
+ // silently stop delivering resource update notifications.
3249
+ const resourceSubscriptions = new Set([
3250
+ ...(this._resourceSubscriptions.get(name) || []),
3251
+ ...(currentEntry?.resourceSubscriptions || []),
3252
+ ]);
3253
+ if (resourceSubscriptions.size > 0) {
3254
+ this._resourceSubscriptions.set(name, new Set(resourceSubscriptions));
3255
+ }
3176
3256
  const resolver = this._reconnectors.get(name);
3177
3257
  const fresh = resolver ? await resolver() : currentConfig;
3178
3258
  if (!fresh) return false;
3179
3259
  try {
3180
- await this.disconnect(name);
3260
+ await this.disconnect(name, { preserveResourceSubscriptions: true });
3181
3261
  } catch {
3182
3262
  // entry may already be gone — connect() below is what matters
3183
3263
  }
@@ -3195,6 +3275,25 @@ export class MCPClient extends EventEmitter {
3195
3275
  reconnectConfig,
3196
3276
  options.connectAuthRetryUsed === true,
3197
3277
  );
3278
+ try {
3279
+ for (const uri of resourceSubscriptions) {
3280
+ await this.subscribeResource(name, uri);
3281
+ }
3282
+ } catch {
3283
+ // A partially restored connection is unsafe: callers would believe
3284
+ // the reconnect recovered their live subscriptions while some were
3285
+ // already lost. Tear it down and let the original operation surface
3286
+ // its connection error.
3287
+ try {
3288
+ await this.disconnect(name, {
3289
+ preserveResourceSubscriptions: true,
3290
+ });
3291
+ } catch {
3292
+ // The outer reconnect result remains fail-closed even if cleanup
3293
+ // itself reports an error.
3294
+ }
3295
+ return false;
3296
+ }
3198
3297
  this.emit("server-reconnected", { name, url: fresh.url || null });
3199
3298
  return true;
3200
3299
  } catch {
@@ -3269,9 +3368,23 @@ export class MCPClient extends EventEmitter {
3269
3368
  async subscribeResource(serverName, uri) {
3270
3369
  const entry = this.servers.get(serverName);
3271
3370
  if (!entry) throw new Error(`Server "${serverName}" not found`);
3272
- await this._sendRequest(serverName, "resources/subscribe", { uri });
3371
+ if (typeof uri !== "string" || !uri.trim()) {
3372
+ throw new TypeError(
3373
+ "MCP resource subscription URI must be a non-empty string",
3374
+ );
3375
+ }
3376
+ const normalizedUri = uri;
3377
+ await this._sendRequest(serverName, "resources/subscribe", {
3378
+ uri: normalizedUri,
3379
+ });
3273
3380
  entry.resourceSubscriptions ||= new Set();
3274
- entry.resourceSubscriptions.add(String(uri));
3381
+ entry.resourceSubscriptions.add(normalizedUri);
3382
+ let desired = this._resourceSubscriptions.get(serverName);
3383
+ if (!desired) {
3384
+ desired = new Set();
3385
+ this._resourceSubscriptions.set(serverName, desired);
3386
+ }
3387
+ desired.add(normalizedUri);
3275
3388
  return true;
3276
3389
  }
3277
3390
 
@@ -3279,8 +3392,19 @@ export class MCPClient extends EventEmitter {
3279
3392
  async unsubscribeResource(serverName, uri) {
3280
3393
  const entry = this.servers.get(serverName);
3281
3394
  if (!entry) throw new Error(`Server "${serverName}" not found`);
3282
- await this._sendRequest(serverName, "resources/unsubscribe", { uri });
3283
- entry.resourceSubscriptions?.delete(String(uri));
3395
+ if (typeof uri !== "string" || !uri.trim()) {
3396
+ throw new TypeError(
3397
+ "MCP resource subscription URI must be a non-empty string",
3398
+ );
3399
+ }
3400
+ const normalizedUri = uri;
3401
+ await this._sendRequest(serverName, "resources/unsubscribe", {
3402
+ uri: normalizedUri,
3403
+ });
3404
+ entry.resourceSubscriptions?.delete(normalizedUri);
3405
+ const desired = this._resourceSubscriptions.get(serverName);
3406
+ desired?.delete(normalizedUri);
3407
+ if (desired?.size === 0) this._resourceSubscriptions.delete(serverName);
3284
3408
  return true;
3285
3409
  }
3286
3410
 
@@ -3752,6 +3876,9 @@ export class MCPClient extends EventEmitter {
3752
3876
  ...(stream.controller
3753
3877
  ? { signal: stream.controller.signal }
3754
3878
  : {}),
3879
+ ...(entry._httpDispatcher
3880
+ ? { dispatcher: entry._httpDispatcher }
3881
+ : {}),
3755
3882
  }),
3756
3883
  stream.controller?.signal,
3757
3884
  );
@@ -3997,6 +4124,9 @@ export class MCPClient extends EventEmitter {
3997
4124
  headers,
3998
4125
  body,
3999
4126
  ...(controller ? { signal: controller.signal } : {}),
4127
+ ...(entry._httpDispatcher
4128
+ ? { dispatcher: entry._httpDispatcher }
4129
+ : {}),
4000
4130
  });
4001
4131
  },
4002
4132
  );
@@ -4729,6 +4859,7 @@ async function _fetchAndDiscardHttpResponse(entry, options) {
4729
4859
  const response = await _deps.fetch(entry.httpUrl, {
4730
4860
  ...options,
4731
4861
  ...(controller ? { signal: controller.signal } : {}),
4862
+ ...(entry._httpDispatcher ? { dispatcher: entry._httpDispatcher } : {}),
4732
4863
  });
4733
4864
  _cancelHttpResponseBody(response);
4734
4865
  if (timedOut) {
@@ -18,6 +18,7 @@ export const ARTIFACT_ACCESS_CLIENTS = Object.freeze([
18
18
  "cli",
19
19
  "vscode",
20
20
  "jetbrains",
21
+ "desktop",
21
22
  "websocket",
22
23
  "web",
23
24
  ]);
@@ -21,6 +21,7 @@ export const ARTIFACT_DELETION_CLIENTS = Object.freeze([
21
21
  "cli",
22
22
  "vscode",
23
23
  "jetbrains",
24
+ "desktop",
24
25
  "websocket",
25
26
  "system",
26
27
  ]);