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.
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-C__nnraW.js → AIOps-vfoDb6HZ.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CsKWHEZ-.js → ActionButton-Cm5f7p93.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BhIjfjWO.js → Analytics-yRuvgWxa.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BjuXFzWZ.js → AppLayout-BROsC4h1.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-k6whDkZJ.js → Artifacts-CimHApb1.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C4FBMYRh.js → Audit-DI8kr8zI.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C_vRrSXk.js → BackgroundAgents-DSLzKy-n.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CngFZeVp.js → Backup-DkH_n2r1.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B_H9EBRm.js → BaseInput-CKSrUoRA.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DLEC5kt7.js → Chat-ClwfMXUS.js} +3 -3
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CjMaqfL7.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-m3ClR4xh.js → Checkbox-BYTehcQG.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CmLSFrgp.js → Codegen-B8AMcp6J.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DFGQteHN.js → Col-BNSogPo3.js} +1 -1
- package/src/assets/web-panel/assets/{Community-EUUVORHE.js → Community-JxPvGb8O.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-2PSg0Yr7.js → Compact-DF7bFAgE.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CcKur7gB.js → Compliance-Bvhqnwrq.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DK_Fezfa.js → Cowork-BDS0CJvM.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dbw89xl7.js → Cron-DqvRfxoQ.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CH66h_Ec.js → Crosschain-CDcIvnqS.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D1igRb17.js → DID-D7jaUxU3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DVAsrobk.js → Dashboard-B5A18wEV.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Dl7W8AQs.js → Dropdown-_6IVkGag.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D5tpaEQC.js → EmailListRenderer-C9PeiKCG.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-O_VQf8gq.js → FamilyGuardDashboard-DXjuEHrX.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BTVcgS9n.js → Federation-B4IAR9zv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BRnkJAIz.js → FormItemContext-CxQeSNx1.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-8OWSCkDj.js → GenericCardRenderer-B8GS-Y3N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-WXLYTQj2.js → Git-BS8SouUX.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BezaUhtc.js → Governance-Dq9aYb5Q.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CuRay3Gu.js → Inference-BrCEe9AJ.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DfWLDW1m.js → KnowledgeGraph-DybOpiY2.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C55y2pPY.js → Logs-DBpzbRfx.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dk08Uycg.js → Marketplace-Cc7CCSCu.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C11fSB5V.js → McpTools-DFaIhOfu.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-mr0eZc97.js → Memory-KCqlp9ol.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C0iCSRbb.js → MobileBridge-Bys84ySN.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CY-xMG8Z.js → MobileProjects-B-6qU-je.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Bplqc_Wc.js → Mtc-BgY-fvCq.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BlzwsoSM.js → MtcAudit-B8pCmqQJ.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BBLmTty6.js → Multisig-BbOmYutA.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DtT1uf1W.js → NLProgramming-BocLQz_M.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DcqQAxTK.js → Notes-CSwbxEop.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-cb0kWoZe.js → NotificationSettings-CqFNSYG3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-kw9HZQNN.js → OrderTableRenderer-C6gMfAk7.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DlTlbkUN.js → Organization-QrDXVdMJ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-pp1qs-oY.js → Overflow-Cxntotjt.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BESLnyYz.js → P2P-CIdBOwNq.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-B-J1mGuf.js → PdhVaultBrowser-CT5aP8rD.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B36PeT1_.js → Permissions-DH7OM8XU.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CTK2ad-3.js → PersonalDataHub-CnJqbWce.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-zJNGXsac.js → Pipeline-5C3HG1kH.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-b9fz0Qf0.js → Privacy-B4yIp7xK.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DjZbZgiB.js → ProjectInit-BMvt-2M0.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C-hHJXlD.js → ProjectSettings-CvSTEMRG.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BKBJxEek.js +1 -0
- package/src/assets/web-panel/assets/Providers-BdwUqFWN.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-A0yoQ3-3.js → QrScannerModal-DtnCKlTm.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DrFgFJNC.js → QuickAsk-sTbgwyNr.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-KC8hF1g4.js → Recommend-Bzr14gSb.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DGTPIk6u.js → RemoteSession-C_TF5IaJ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-QmbwM7Yk.js → Reputation-GCAM4H2K.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BxjJylia.js → Row-Dir0r6OQ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B7Wda1J6.js → RssFeed-CpGnlecX.js} +2 -2
- package/src/assets/web-panel/assets/{Search-_plQ_YSA.js → Search-DMMamC6u.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CD2YJZfx.js → Security-yqay5yG-.js} +4 -4
- package/src/assets/web-panel/assets/{Services-qQE7NmwE.js → Services-C5i2wh9G.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DgQqkFf7.js → Skeleton-vUqk35yj.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C4C0oFFt.js → Skills-DzcSkhot.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Px2N2B5c.js → Sla-CB6qbYNr.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DN6C3lQd.js → SpeechSettings-BHUI7cox.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-jm5aH_m7.js → SyncSettings-D-RrsxTJ.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DlkJcv67.js → Tasks-DFxdOJiq.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DyrTHUBs.js → Templates-SKAob_Aq.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-mC434PtL.js → Tenant-BPfsfHQ-.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-o0_s3NgK.js → Terminal-8iw7FpUf.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DAGlAXOw.js → TimelineRenderer-C4Gjj5Su.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BnulS_bs.js → Tokens-COYhN18e.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-suQbVXYM.js → Trigger-B-JzXcf6.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DbIJAPo5.js → Trust-BJ5bg0nI.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CQNpbIHi.js → UkeySign-BG_ByRMf.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D8aWCERk.js → VideoEditing-B3kOnSiU.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CuLpYfZc.js → Wallet-CcoGFnK7.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CsfG8ZMc.js → WebAuthn-DdT8vRC_.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BYsEAZbd.js → WorkflowEditor-CZu3M9N8.js} +1 -1
- package/src/assets/web-panel/assets/{chat-FT4Um3-I.js → chat-DxJt3Qba.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CKbS_Wlt.js → colors-DdYfwJaB.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CFJtzuJM.js → compact-item-BG3SUzwj.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-B9kSRW6K.js → createContext-By51z2-1.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DR-x0Xpi.js → hasIn-B0apZ3KJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjEP7WkH.js → index-3jWkIu5j.js} +1 -1
- package/src/assets/web-panel/assets/{index-7jHr_A_k.js → index-B3rWuPMW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcfxhKXR.js → index-B5rLiEo0.js} +1 -1
- package/src/assets/web-panel/assets/{index-tqSEHPRT.js → index-BBPf3TpM.js} +1 -1
- package/src/assets/web-panel/assets/index-BETiL0a3.js +1 -0
- package/src/assets/web-panel/assets/{index-Cr2FLUsD.js → index-BIrJfqO4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bt4fS2eL.js → index-BLIbGOLX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwR7yc2h.js → index-BP94CrBV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVPU43b1.js → index-BWF8_mkx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DShSkww-.js → index-BYINoRLK.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bzz0C1BZ.js → index-BZ_0qm4g.js} +1 -1
- package/src/assets/web-panel/assets/{index-KqDaCApw.js → index-BewKYrX9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW-t9n-q.js → index-BfWYsB9t.js} +1 -1
- package/src/assets/web-panel/assets/index-BhAVHuW8.js +1 -0
- package/src/assets/web-panel/assets/{index-B7osrXqy.js → index-Bissefox.js} +3 -3
- package/src/assets/web-panel/assets/{index-DW4BWjTk.js → index-BkvcEo4p.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdkIhfi-.js → index-Bos5_aMV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTxNy0ZU.js → index-C1C9i79A.js} +1 -1
- package/src/assets/web-panel/assets/{index-QBSeNVO3.js → index-CAhHirVH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4LfPvWA.js → index-CNIxXMmN.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_enk9I_.js → index-CW93tZDv.js} +1 -1
- package/src/assets/web-panel/assets/{index-WE08gMJP.js → index-CWEuZWCK.js} +1 -1
- package/src/assets/web-panel/assets/{index-r2VI1Ikk.js → index-Cp6e-hGw.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dap9c3eD.js → index-CpjZhgNd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWdqx7zI.js → index-CzmQElZy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGbPnC5x.js → index-DCn8IcxV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiNUEpSQ.js → index-DE76D-kA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtkFqPVA.js → index-DaIz0NAW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGaXUsIs.js → index-Da_WBdLX.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3ZX81mK.js → index-Dz49VOyQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BK3TiKVq.js → index-Q2SCX-MI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJmIQ9XR.js → index-RD6O-0C6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvrCCqJt.js → index-SQqOlR3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI5hP_qy.js → index-ZFbps9po.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeSgw-WV.js → index-ZxtP8jG7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMGmg497.js → index-bP_VlDb4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfFCQHL3.js → index-kf57LJ93.js} +1 -1
- package/src/assets/web-panel/assets/{index-OSzjTzGM.js → index-oxRrmFO9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2JvmYRc.js → index-p1_8SbI1.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Dd7n7VgI.js → initDefaultProps-BWJktcg8.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BwxouRw1.js → motion-BEXBzUFV.js} +1 -1
- package/src/assets/web-panel/assets/{move-DObN0PG9.js → move-BUKwn2sx.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B3nOUQc7.js → mtc-parser-FTI7btqQ.js} +1 -1
- package/src/assets/web-panel/assets/{omit-o9WU2Nbl.js → omit-CsLtSPH3.js} +1 -1
- package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
- package/src/assets/web-panel/assets/{pickAttrs-CL_vvfQ_.js → pickAttrs-DWZxsT_S.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CYrM2tyK.js → placementArrow-Bcfs43CX.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-k_06cQ96.js → responsiveObserve-a9bcC1p-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CPKG0pxS.js → slide-BDTzgOXN.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BDDEeLTw.js → statusUtils-Iq1j_HUg.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cmb7RTh7.js → styleChecker-DAZEYxeh.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-e2IedC4N.js → useFlexGapSupport-DVkjyDrh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CE_gxVnm.js → useFs-wXTpNTHt.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BkMIIKMz.js → usePersonalDataHub-CtQM_aZr.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DW886XV1.js → vnode-hjEoG85v.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Dwo_adaf.js → zoom-BHVpyKg_.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +14 -2
- package/src/commands/artifacts.js +235 -0
- package/src/commands/background-session.js +100 -10
- package/src/commands/cowork.js +86 -57
- package/src/commands/mcp.js +5 -0
- package/src/commands/plugin.js +145 -29
- package/src/commands/remote-control.js +295 -110
- package/src/commands/session-location.js +20 -1
- package/src/commands/session-message.js +171 -0
- package/src/commands/session.js +75 -69
- package/src/data/changelog.json +29 -3
- package/src/gateways/ws/message-dispatcher.js +57 -0
- package/src/harness/mcp-client.js +141 -10
- package/src/lib/artifact-access-ledger.js +1 -0
- package/src/lib/artifact-deletion-ledger.js +1 -0
- package/src/lib/artifact-recovery.js +970 -0
- package/src/lib/artifact-workbench-projection.js +171 -0
- package/src/lib/background-session-transport.js +153 -27
- package/src/lib/dynamic-workflow-runtime.js +408 -1
- package/src/lib/execution-location-target.js +4 -2
- package/src/lib/mcp-client.js +2 -0
- package/src/lib/mcp-headers-helper.js +47 -5
- package/src/lib/mcp-oauth.js +55 -6
- package/src/lib/mcp-stdio-executable-identity.js +16 -0
- package/src/lib/mcp-stdio-native-code-policy.js +74 -0
- package/src/lib/mcp-stdio-package-materialization.js +12 -3
- package/src/lib/mcp-tls.js +230 -0
- package/src/lib/output-styles.js +12 -0
- package/src/lib/plugin-runtime/install.js +614 -71
- package/src/lib/plugin-runtime/marketplace-archive-source.js +331 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +52 -6
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
- package/src/lib/plugin-runtime/marketplace-source-adapter.js +163 -0
- package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
- package/src/lib/plugin-runtime/remote-source.js +435 -55
- package/src/lib/plugin-security.js +393 -41
- package/src/lib/plugin-source-identity.js +850 -0
- package/src/lib/process-execution-broker/index.js +112 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
- package/src/lib/process-execution-broker/workspace-transaction.js +26 -0
- package/src/lib/remote-approval-bridge.js +136 -46
- package/src/lib/remote-control.js +217 -31
- package/src/lib/session-message-fabric.js +1105 -0
- package/src/lib/session-projection.js +171 -12
- package/src/lib/session-runtime-retention.js +155 -0
- package/src/lib/settings-loader.cjs +29 -0
- package/src/repl/agent-repl.js +51 -14
- package/src/repl/permission-prompt.js +31 -8
- package/src/repl/repl-keybindings.js +55 -0
- package/src/runtime/agent-core.js +63 -2
- package/src/runtime/headless-runner.js +47 -66
- package/src/runtime/headless-stream.js +18 -24
- package/src/runtime/mcp-config.js +2 -0
- package/src/runtime/policies/agent-policy.js +2 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +0 -1
- package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +0 -1
- package/src/assets/web-panel/assets/Providers-Dz-CAYYU.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +0 -1
- package/src/assets/web-panel/assets/index-Bizb4hkw.js +0 -1
- package/src/assets/web-panel/assets/index-OHSl-xCh.js +0 -1
- 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 =
|
|
2684
|
-
initResult?.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
|
-
|
|
2932
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
3283
|
-
|
|
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) {
|