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
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Materialized MCP capsules are JavaScript-only products. They do not admit
|
|
5
|
+
* package-provided native addons: esbuild emits one CJS file, retains only
|
|
6
|
+
* Node builtins as externals, and the immutable capsule prelude replaces
|
|
7
|
+
* process.dlopen before package code runs. Platform runtime libraries and V8's
|
|
8
|
+
* own executable memory remain part of the trusted Node/OS runtime base and are
|
|
9
|
+
* deliberately not represented as an arbitrary shared-library closure.
|
|
10
|
+
*/
|
|
11
|
+
export const MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY = Object.freeze({
|
|
12
|
+
schema: "chainlesschain.mcp-stdio-native-code-policy/v1",
|
|
13
|
+
contractVersion: 1,
|
|
14
|
+
mode: "deny-package-native-addons",
|
|
15
|
+
capsuleFormat: "single-bundled-cjs",
|
|
16
|
+
nativeAddonLoading: "denied",
|
|
17
|
+
nativeAddonDenialMechanism:
|
|
18
|
+
"immutable-process-dlopen-guard-plus-bundled-js-only-v1",
|
|
19
|
+
hostRuntimeSharedLibraries: "platform-runtime-tcb",
|
|
20
|
+
anonymousExecutableMemory: "node-runtime-tcb",
|
|
21
|
+
sharedLibraryClosure: false,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const POLICY_KEYS = Object.freeze(
|
|
25
|
+
Object.keys(MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY).sort(),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
function canonicalPolicy(value) {
|
|
29
|
+
return JSON.stringify(
|
|
30
|
+
Object.fromEntries(POLICY_KEYS.map((key) => [key, value[key]])),
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY_DIGEST = crypto
|
|
35
|
+
.createHash("sha256")
|
|
36
|
+
.update(canonicalPolicy(MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY))
|
|
37
|
+
.digest("hex");
|
|
38
|
+
|
|
39
|
+
export function isMcpStdioCapsuleNativeCodePolicy(value) {
|
|
40
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
41
|
+
const keys = Object.keys(value).sort();
|
|
42
|
+
return (
|
|
43
|
+
keys.length === POLICY_KEYS.length &&
|
|
44
|
+
keys.every((key, index) => key === POLICY_KEYS[index]) &&
|
|
45
|
+
POLICY_KEYS.every(
|
|
46
|
+
(key) => value[key] === MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY[key],
|
|
47
|
+
)
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function mcpStdioCapsuleNativeCodePolicyDigest(value) {
|
|
52
|
+
if (!isMcpStdioCapsuleNativeCodePolicy(value)) {
|
|
53
|
+
throw new TypeError("MCP capsule native-code policy is invalid");
|
|
54
|
+
}
|
|
55
|
+
return crypto
|
|
56
|
+
.createHash("sha256")
|
|
57
|
+
.update(canonicalPolicy(value))
|
|
58
|
+
.digest("hex");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function mcpStdioCapsuleNativeCodeEvidence(value) {
|
|
62
|
+
const digest = mcpStdioCapsuleNativeCodePolicyDigest(value);
|
|
63
|
+
return Object.freeze({
|
|
64
|
+
nativeCodePolicyBound: true,
|
|
65
|
+
nativeCodePolicySchema: value.schema,
|
|
66
|
+
nativeCodePolicyDigest: digest,
|
|
67
|
+
nativeCodePolicyMode: value.mode,
|
|
68
|
+
capsuleNativeCodeFormat: value.capsuleFormat,
|
|
69
|
+
nativeAddonLoading: value.nativeAddonLoading,
|
|
70
|
+
nativeAddonDenialMechanism: value.nativeAddonDenialMechanism,
|
|
71
|
+
hostRuntimeSharedLibraries: value.hostRuntimeSharedLibraries,
|
|
72
|
+
anonymousExecutableMemory: value.anonymousExecutableMemory,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
@@ -25,6 +25,10 @@ import {
|
|
|
25
25
|
writeSecurityStore,
|
|
26
26
|
} from "./durable-security-store.js";
|
|
27
27
|
import { sanitizeMcpStdioHostEnvironment } from "./mcp-stdio-environment.js";
|
|
28
|
+
import {
|
|
29
|
+
isMcpStdioCapsuleNativeCodePolicy,
|
|
30
|
+
MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY,
|
|
31
|
+
} from "./mcp-stdio-native-code-policy.js";
|
|
28
32
|
|
|
29
33
|
export const MCP_STDIO_PACKAGE_MATERIALIZATION_REQUIRED_CODE =
|
|
30
34
|
"CC_MCP_STDIO_PACKAGE_MATERIALIZATION_REQUIRED";
|
|
@@ -36,9 +40,9 @@ export const MCP_STDIO_PACKAGE_MATERIALIZATION_CHANGED_CODE =
|
|
|
36
40
|
"CC_MCP_STDIO_PACKAGE_MATERIALIZATION_CHANGED";
|
|
37
41
|
|
|
38
42
|
const MATERIALIZATION_SCHEMA =
|
|
39
|
-
"chainlesschain.mcp-stdio-package-materialization/
|
|
40
|
-
const MATERIALIZATION_VERSION =
|
|
41
|
-
const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/
|
|
43
|
+
"chainlesschain.mcp-stdio-package-materialization/v6";
|
|
44
|
+
const MATERIALIZATION_VERSION = 6;
|
|
45
|
+
const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/v5";
|
|
42
46
|
const CAPSULE_RELATIVE_PATH = "capsule/server.cjs";
|
|
43
47
|
const CAPSULE_BUILDER = "esbuild-wasm";
|
|
44
48
|
const CAPSULE_BUILDER_VERSION = "0.28.1";
|
|
@@ -1504,6 +1508,7 @@ async function buildCapsule({
|
|
|
1504
1508
|
? CAPSULE_EXECUTION_CONTEXT_ISOLATION
|
|
1505
1509
|
: "not-required",
|
|
1506
1510
|
}),
|
|
1511
|
+
nativeCodePolicy: MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY,
|
|
1507
1512
|
});
|
|
1508
1513
|
}
|
|
1509
1514
|
|
|
@@ -1563,6 +1568,7 @@ function validateManifest(manifest) {
|
|
|
1563
1568
|
) ||
|
|
1564
1569
|
manifest.capsule?.builtinPolicy?.schema !== CAPSULE_BUILTIN_POLICY_SCHEMA ||
|
|
1565
1570
|
manifest.capsule?.builtinPolicy?.mode !== "static-external-only" ||
|
|
1571
|
+
!isMcpStdioCapsuleNativeCodePolicy(manifest.capsule?.nativeCodePolicy) ||
|
|
1566
1572
|
!Array.isArray(manifest.capsule?.builtinPolicy?.allowedBuiltins) ||
|
|
1567
1573
|
manifest.capsule.builtinPolicy.allowedBuiltins.some(
|
|
1568
1574
|
(name) => typeof name !== "string" || !NODE_BUILTINS.has(name),
|
|
@@ -1743,6 +1749,9 @@ function verifyPublishedGeneration(root, record, expectedFingerprint) {
|
|
|
1743
1749
|
...manifest.capsule.builtinPolicy.executionContextBuiltins,
|
|
1744
1750
|
]),
|
|
1745
1751
|
}),
|
|
1752
|
+
nativeCodePolicy: Object.freeze({
|
|
1753
|
+
...manifest.capsule.nativeCodePolicy,
|
|
1754
|
+
}),
|
|
1746
1755
|
}),
|
|
1747
1756
|
closureDigest: manifest.closureDigest,
|
|
1748
1757
|
fileCount: manifest.fileCount,
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/** Bounded mTLS material loading for HTTP/WebSocket MCP transports. */
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { isProxy } from "node:util/types";
|
|
7
|
+
import { Agent } from "undici";
|
|
8
|
+
|
|
9
|
+
export const MCP_TLS_MAX_FILE_BYTES = 1024 * 1024;
|
|
10
|
+
|
|
11
|
+
const TLS_KEYS = new Set([
|
|
12
|
+
"certFile",
|
|
13
|
+
"keyFile",
|
|
14
|
+
"caFile",
|
|
15
|
+
"serverName",
|
|
16
|
+
"rejectUnauthorized",
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
function tlsError(code, message, cause = undefined) {
|
|
20
|
+
const error = new Error(message, cause ? { cause } : undefined);
|
|
21
|
+
error.code = code;
|
|
22
|
+
return error;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function plainTlsObject(value) {
|
|
26
|
+
if (
|
|
27
|
+
!value ||
|
|
28
|
+
typeof value !== "object" ||
|
|
29
|
+
Array.isArray(value) ||
|
|
30
|
+
isProxy(value)
|
|
31
|
+
) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
let prototype;
|
|
35
|
+
let descriptors;
|
|
36
|
+
try {
|
|
37
|
+
prototype = Object.getPrototypeOf(value);
|
|
38
|
+
descriptors = Object.getOwnPropertyDescriptors(value);
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (prototype !== Object.prototype && prototype !== null) return null;
|
|
43
|
+
const keys = Reflect.ownKeys(descriptors);
|
|
44
|
+
if (
|
|
45
|
+
keys.some(
|
|
46
|
+
(key) =>
|
|
47
|
+
typeof key !== "string" ||
|
|
48
|
+
!TLS_KEYS.has(key) ||
|
|
49
|
+
!Object.prototype.hasOwnProperty.call(descriptors[key], "value") ||
|
|
50
|
+
descriptors[key].enumerable !== true,
|
|
51
|
+
)
|
|
52
|
+
) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return Object.fromEntries(keys.map((key) => [key, descriptors[key].value]));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function absoluteFile(value, label) {
|
|
59
|
+
if (value == null || value === "") return null;
|
|
60
|
+
if (typeof value !== "string" || !path.isAbsolute(value)) {
|
|
61
|
+
throw tlsError(
|
|
62
|
+
"CC_MCP_TLS_CONFIG_INVALID",
|
|
63
|
+
`MCP TLS ${label} must be an absolute file path`,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return path.resolve(value);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function validServerName(value) {
|
|
70
|
+
if (typeof value !== "string" || value.length === 0 || value.length > 253) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return value
|
|
74
|
+
.split(".")
|
|
75
|
+
.every(
|
|
76
|
+
(label) =>
|
|
77
|
+
label.length > 0 &&
|
|
78
|
+
label.length <= 63 &&
|
|
79
|
+
/^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$/u.test(label),
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function normalizeMcpTlsConfig(value) {
|
|
84
|
+
if (value == null) return null;
|
|
85
|
+
const snapshot = plainTlsObject(value);
|
|
86
|
+
if (!snapshot) {
|
|
87
|
+
throw tlsError(
|
|
88
|
+
"CC_MCP_TLS_CONFIG_INVALID",
|
|
89
|
+
"MCP TLS configuration must be a plain allowlisted data object",
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const certFile = absoluteFile(snapshot.certFile, "certFile");
|
|
93
|
+
const keyFile = absoluteFile(snapshot.keyFile, "keyFile");
|
|
94
|
+
if (Boolean(certFile) !== Boolean(keyFile)) {
|
|
95
|
+
throw tlsError(
|
|
96
|
+
"CC_MCP_TLS_CONFIG_INVALID",
|
|
97
|
+
"MCP TLS certFile and keyFile must be configured together",
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
const caFile = absoluteFile(snapshot.caFile, "caFile");
|
|
101
|
+
if (!certFile && !caFile) {
|
|
102
|
+
throw tlsError(
|
|
103
|
+
"CC_MCP_TLS_CONFIG_INVALID",
|
|
104
|
+
"MCP TLS configuration requires a client certificate or CA file",
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
const serverName = snapshot.serverName == null ? null : snapshot.serverName;
|
|
108
|
+
if (serverName != null && !validServerName(serverName)) {
|
|
109
|
+
throw tlsError(
|
|
110
|
+
"CC_MCP_TLS_CONFIG_INVALID",
|
|
111
|
+
"MCP TLS serverName must be a valid DNS name",
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
if (
|
|
115
|
+
snapshot.rejectUnauthorized != null &&
|
|
116
|
+
typeof snapshot.rejectUnauthorized !== "boolean"
|
|
117
|
+
) {
|
|
118
|
+
throw tlsError(
|
|
119
|
+
"CC_MCP_TLS_CONFIG_INVALID",
|
|
120
|
+
"MCP TLS rejectUnauthorized must be boolean",
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
certFile,
|
|
125
|
+
keyFile,
|
|
126
|
+
caFile,
|
|
127
|
+
serverName,
|
|
128
|
+
rejectUnauthorized: snapshot.rejectUnauthorized !== false,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function readTlsFile(filePath, label, fsImpl) {
|
|
133
|
+
if (!filePath) return null;
|
|
134
|
+
let descriptor = null;
|
|
135
|
+
let stat;
|
|
136
|
+
try {
|
|
137
|
+
const link = fsImpl.lstatSync(filePath);
|
|
138
|
+
if (link.isSymbolicLink()) {
|
|
139
|
+
throw tlsError(
|
|
140
|
+
"CC_MCP_TLS_FILE_UNSAFE",
|
|
141
|
+
`MCP TLS ${label} must not be a symbolic link`,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
const constants = fsImpl.constants || fs.constants;
|
|
145
|
+
descriptor = fsImpl.openSync(
|
|
146
|
+
filePath,
|
|
147
|
+
constants.O_RDONLY | (constants.O_NOFOLLOW || 0),
|
|
148
|
+
);
|
|
149
|
+
stat = fsImpl.fstatSync(descriptor);
|
|
150
|
+
} catch (cause) {
|
|
151
|
+
if (descriptor != null) fsImpl.closeSync?.(descriptor);
|
|
152
|
+
if (cause?.code?.startsWith?.("CC_MCP_TLS_")) throw cause;
|
|
153
|
+
throw tlsError(
|
|
154
|
+
"CC_MCP_TLS_FILE_UNAVAILABLE",
|
|
155
|
+
`MCP TLS ${label} could not be inspected`,
|
|
156
|
+
cause,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
if (!stat.isFile() || stat.size <= 0 || stat.size > MCP_TLS_MAX_FILE_BYTES) {
|
|
160
|
+
fsImpl.closeSync?.(descriptor);
|
|
161
|
+
throw tlsError(
|
|
162
|
+
"CC_MCP_TLS_FILE_UNSAFE",
|
|
163
|
+
`MCP TLS ${label} must be a non-empty regular file no larger than ${MCP_TLS_MAX_FILE_BYTES} bytes`,
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
if (
|
|
167
|
+
label === "keyFile" &&
|
|
168
|
+
process.platform !== "win32" &&
|
|
169
|
+
(stat.mode & 0o077) !== 0
|
|
170
|
+
) {
|
|
171
|
+
fsImpl.closeSync?.(descriptor);
|
|
172
|
+
throw tlsError(
|
|
173
|
+
"CC_MCP_TLS_FILE_UNSAFE",
|
|
174
|
+
"MCP TLS keyFile must not be readable or writable by group/other users",
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
return fsImpl.readFileSync(descriptor);
|
|
179
|
+
} catch (cause) {
|
|
180
|
+
throw tlsError(
|
|
181
|
+
"CC_MCP_TLS_FILE_UNAVAILABLE",
|
|
182
|
+
`MCP TLS ${label} could not be read`,
|
|
183
|
+
cause,
|
|
184
|
+
);
|
|
185
|
+
} finally {
|
|
186
|
+
fsImpl.closeSync?.(descriptor);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function updateDigestPart(hash, value) {
|
|
191
|
+
const bytes = value || Buffer.alloc(0);
|
|
192
|
+
const length = Buffer.alloc(4);
|
|
193
|
+
length.writeUInt32BE(bytes.length);
|
|
194
|
+
hash.update(length).update(bytes);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function loadMcpTlsMaterial(value, { fsImpl = fs } = {}) {
|
|
198
|
+
const config = normalizeMcpTlsConfig(value);
|
|
199
|
+
if (!config) return null;
|
|
200
|
+
const cert = readTlsFile(config.certFile, "certFile", fsImpl);
|
|
201
|
+
const key = readTlsFile(config.keyFile, "keyFile", fsImpl);
|
|
202
|
+
const ca = readTlsFile(config.caFile, "caFile", fsImpl);
|
|
203
|
+
const connectOptions = {
|
|
204
|
+
...(cert ? { cert } : {}),
|
|
205
|
+
...(key ? { key } : {}),
|
|
206
|
+
...(ca ? { ca } : {}),
|
|
207
|
+
...(config.serverName ? { servername: config.serverName } : {}),
|
|
208
|
+
rejectUnauthorized: config.rejectUnauthorized,
|
|
209
|
+
};
|
|
210
|
+
const identityHash = createHash("sha256");
|
|
211
|
+
updateDigestPart(identityHash, cert);
|
|
212
|
+
updateDigestPart(identityHash, key);
|
|
213
|
+
updateDigestPart(identityHash, ca);
|
|
214
|
+
const identityDigest = `sha256:${identityHash.digest("hex")}`;
|
|
215
|
+
return { connectOptions, identityDigest };
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export function createMcpTlsDispatcher(material) {
|
|
219
|
+
if (!material?.connectOptions) return null;
|
|
220
|
+
return new Agent({ connect: material.connectOptions });
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export async function closeMcpTlsDispatcher(dispatcher) {
|
|
224
|
+
if (!dispatcher) return;
|
|
225
|
+
if (typeof dispatcher.close === "function") {
|
|
226
|
+
await dispatcher.close();
|
|
227
|
+
} else if (typeof dispatcher.destroy === "function") {
|
|
228
|
+
dispatcher.destroy();
|
|
229
|
+
}
|
|
230
|
+
}
|
package/src/lib/output-styles.js
CHANGED
|
@@ -33,6 +33,18 @@ export const BUILTIN_OUTPUT_STYLES = Object.freeze({
|
|
|
33
33
|
body: "",
|
|
34
34
|
builtin: true,
|
|
35
35
|
},
|
|
36
|
+
concise: {
|
|
37
|
+
name: "concise",
|
|
38
|
+
description: "Uses short, direct responses with minimal explanation.",
|
|
39
|
+
body: [
|
|
40
|
+
"## Output style: Concise",
|
|
41
|
+
"Respond directly and briefly. Prefer the smallest complete answer that",
|
|
42
|
+
"preserves essential context, decisions, verification results, and safety",
|
|
43
|
+
"warnings. Avoid restating the request, long preambles, and optional",
|
|
44
|
+
"tangents unless the user asks for more detail.",
|
|
45
|
+
].join("\n"),
|
|
46
|
+
builtin: true,
|
|
47
|
+
},
|
|
36
48
|
explanatory: {
|
|
37
49
|
name: "explanatory",
|
|
38
50
|
description: "Explains the reasoning and trade-offs behind changes.",
|