chainlesschain 0.162.197 → 0.162.200
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/bin/chainlesschain.js +14 -6
- package/package.json +4 -1
- package/scripts/command-lifecycle-report.mjs +94 -0
- package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-FZIQOdln.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-DYyuwPCs.js} +1 -1
- package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
- package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-MFk58XB0.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
- package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
- package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
- package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
- package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-CbiTJkZf.js} +1 -1
- package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
- package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
- package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-DWzyTev7.js} +1 -1
- package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
- package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
- package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
- package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
- package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
- package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
- package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
- package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +4 -4
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +145 -0
- package/src/commands/mcp.js +244 -7
- package/src/commands/serve.js +1 -1
- package/src/commands/session-show.js +129 -0
- package/src/commands/session.js +97 -145
- package/src/commands/skill.js +87 -50
- package/src/data/changelog.json +40 -1
- package/src/gateways/ws/session-protocol.js +14 -4
- package/src/gateways/ws/ws-agent-handler.js +39 -1
- package/src/harness/jsonl-session-store.js +1547 -127
- package/src/harness/mcp-client.js +2690 -409
- package/src/harness/session-index.js +80 -80
- package/src/harness/session-list-index.js +210 -7
- package/src/lazy-dispatch.js +76 -8
- package/src/lib/abort-utils.js +68 -0
- package/src/lib/agent-core.js +1 -59
- package/src/lib/background-interaction-journal.js +2 -2
- package/src/lib/chat-core.js +24 -6
- package/src/lib/command-lifecycle-report.js +516 -0
- package/src/lib/cowork-mcp-tools.js +47 -2
- package/src/lib/cowork-task-runner.js +11 -3
- package/src/lib/doctor-checkup.js +9 -7
- package/src/lib/learning/skill-improver.js +21 -2
- package/src/lib/mcp-call-ledger-store.js +116 -3
- package/src/lib/mcp-call-ledger.js +59 -14
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-stdio-environment.js +48 -0
- package/src/lib/mcp-stdio-executable-identity.js +1133 -0
- package/src/lib/mcp-stdio-execution-authority.js +363 -0
- package/src/lib/mcp-stdio-package-materialization.js +1424 -0
- package/src/lib/mcp-tool-metadata.js +436 -0
- package/src/lib/mcp-tool-result.js +367 -0
- package/src/lib/observability/index.js +71 -0
- package/src/lib/packer/native-update-state.js +979 -1
- package/src/lib/packer/pack-update-applier.js +1050 -125
- package/src/lib/packer/pkg-config-generator.js +1 -0
- package/src/lib/paths.js +53 -0
- package/src/lib/pr-link-ledger.js +8 -27
- package/src/lib/pr-link-store.js +26 -0
- package/src/lib/process-execution-broker/index.js +192 -35
- package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
- package/src/lib/process-tree-termination.js +253 -0
- package/src/lib/recent-session.js +17 -17
- package/src/lib/secure-file-identity.js +47 -0
- package/src/lib/secure-fs.js +21 -2
- package/src/lib/session-anti-rollback-anchor.js +766 -0
- package/src/lib/session-host-lease.js +492 -0
- package/src/lib/session-host-snapshot.js +9 -5
- package/src/lib/session-persistence-failure.js +109 -0
- package/src/lib/session-picker.js +26 -3
- package/src/lib/session-projection.js +5 -1
- package/src/lib/session-search.js +25 -11
- package/src/lib/session-tail.js +31 -1
- package/src/lib/side-effect-ledger-store.js +2 -2
- package/src/lib/skill-budget.js +222 -0
- package/src/lib/skill-execution-authority.js +385 -0
- package/src/lib/skill-execution-identity.js +39 -2
- package/src/lib/skill-loader.js +322 -86
- package/src/lib/skill-mcp.js +43 -1
- package/src/lib/turn-binding-store.js +2 -2
- package/src/repl/agent-repl.js +483 -77
- package/src/repl/bg-dashboard.js +81 -28
- package/src/repl/chat-repl.js +77 -12
- package/src/runtime/agent-core.js +428 -113
- package/src/runtime/agent-runtime.js +26 -3
- package/src/runtime/cleanup-deadline.js +143 -0
- package/src/runtime/headless-runner.js +494 -149
- package/src/runtime/headless-stream.js +504 -75
- package/src/runtime/mcp-config.js +157 -10
- package/src/runtime/mcp-tool-search.js +0 -0
- package/src/runtime/output-backpressure.js +419 -0
- package/src/runtime/pipe-safety.js +56 -21
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
- package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
- package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
- package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
- package/src/lib/skill-process-broker.js +0 -85
|
@@ -394,6 +394,7 @@ export function generatePkgConfig(ctx) {
|
|
|
394
394
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.dll`,
|
|
395
395
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.exe`,
|
|
396
396
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox.cs`,
|
|
397
|
+
`${posixify(cliRoot)}/install/install.ps1`,
|
|
397
398
|
];
|
|
398
399
|
if (prebuildsDir) assets.push(`${posixify(prebuildsDir)}/**/*`);
|
|
399
400
|
// Project mode: bundle the collected .chainlesschain/ snapshot as an asset.
|
package/src/lib/paths.js
CHANGED
|
@@ -58,6 +58,59 @@ export function getStatePath() {
|
|
|
58
58
|
return join(getHomeDir(), "state");
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/** User-local security state that survives rollback of CHAINLESSCHAIN_HOME. */
|
|
62
|
+
export function getMachineSecurityAnchorDir() {
|
|
63
|
+
const configured = process.env.CHAINLESSCHAIN_SECURITY_ANCHOR_HOME;
|
|
64
|
+
let anchorPath;
|
|
65
|
+
if (configured) {
|
|
66
|
+
if (!isAbsolute(configured)) {
|
|
67
|
+
const error = new Error(
|
|
68
|
+
"CHAINLESSCHAIN_SECURITY_ANCHOR_HOME must be an absolute path",
|
|
69
|
+
);
|
|
70
|
+
error.code = "CONFIG_HOME_UNSAFE";
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
anchorPath = resolve(configured);
|
|
74
|
+
} else {
|
|
75
|
+
const platform = getPlatform();
|
|
76
|
+
if (platform === "win32") {
|
|
77
|
+
anchorPath = join(
|
|
78
|
+
process.env.LOCALAPPDATA || join(homedir(), "AppData", "Local"),
|
|
79
|
+
"ChainlessChain",
|
|
80
|
+
"SecurityAnchors",
|
|
81
|
+
);
|
|
82
|
+
} else if (platform === "darwin") {
|
|
83
|
+
anchorPath = join(
|
|
84
|
+
homedir(),
|
|
85
|
+
"Library",
|
|
86
|
+
"Application Support",
|
|
87
|
+
"ChainlessChain",
|
|
88
|
+
"SecurityAnchors",
|
|
89
|
+
);
|
|
90
|
+
} else {
|
|
91
|
+
anchorPath = join(
|
|
92
|
+
process.env.XDG_STATE_HOME || join(homedir(), ".local", "state"),
|
|
93
|
+
"chainlesschain",
|
|
94
|
+
"security-anchors",
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const resolvedAnchor = resolve(anchorPath);
|
|
99
|
+
const resolvedHome = resolve(getHomeDir());
|
|
100
|
+
const relativeToHome = relative(resolvedHome, resolvedAnchor);
|
|
101
|
+
if (
|
|
102
|
+
relativeToHome === "" ||
|
|
103
|
+
(!relativeToHome.startsWith("..") && !isAbsolute(relativeToHome))
|
|
104
|
+
) {
|
|
105
|
+
const error = new Error(
|
|
106
|
+
"CHAINLESSCHAIN_SECURITY_ANCHOR_HOME must be outside CHAINLESSCHAIN_HOME",
|
|
107
|
+
);
|
|
108
|
+
error.code = "CONFIG_HOME_UNSAFE";
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
return resolvedAnchor;
|
|
112
|
+
}
|
|
113
|
+
|
|
61
114
|
export function getPidFilePath() {
|
|
62
115
|
return join(getStatePath(), "app.pid");
|
|
63
116
|
}
|
|
@@ -16,10 +16,15 @@
|
|
|
16
16
|
* result or a session listing.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import {
|
|
20
|
-
import { join } from "node:path";
|
|
21
|
-
import { getHomeDir } from "./paths.js";
|
|
19
|
+
import { writeFileSync } from "node:fs";
|
|
22
20
|
import { executionBroker } from "./process-execution-broker/index.js";
|
|
21
|
+
import {
|
|
22
|
+
getPrLinks,
|
|
23
|
+
prLinkLedgerPath,
|
|
24
|
+
readPrLinkLedger,
|
|
25
|
+
} from "./pr-link-store.js";
|
|
26
|
+
|
|
27
|
+
export { getPrLinks, prLinkLedgerPath, readPrLinkLedger };
|
|
23
28
|
|
|
24
29
|
export const _deps = {
|
|
25
30
|
execFile: (...args) => executionBroker.execFile(...args),
|
|
@@ -29,21 +34,6 @@ export const _deps = {
|
|
|
29
34
|
const MAX_LINKS_PER_SESSION = 20;
|
|
30
35
|
const MAX_SESSIONS = 500;
|
|
31
36
|
|
|
32
|
-
export function prLinkLedgerPath() {
|
|
33
|
-
return join(getHomeDir(), "pr-links.json");
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function readPrLinkLedger() {
|
|
37
|
-
try {
|
|
38
|
-
const p = prLinkLedgerPath();
|
|
39
|
-
if (!existsSync(p)) return {};
|
|
40
|
-
const parsed = JSON.parse(readFileSync(p, "utf-8"));
|
|
41
|
-
return parsed && typeof parsed === "object" ? parsed : {};
|
|
42
|
-
} catch {
|
|
43
|
-
return {}; // corrupt ledger degrades to empty, never throws
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
37
|
function writeLedger(ledger) {
|
|
48
38
|
const ids = Object.keys(ledger);
|
|
49
39
|
if (ids.length > MAX_SESSIONS) {
|
|
@@ -138,15 +128,6 @@ export function recordPrLink(sessionId, ref, options = {}) {
|
|
|
138
128
|
return incoming;
|
|
139
129
|
}
|
|
140
130
|
|
|
141
|
-
/** Links for a session, newest first. */
|
|
142
|
-
export function getPrLinks(sessionId) {
|
|
143
|
-
if (!sessionId) return [];
|
|
144
|
-
const links = readPrLinkLedger()[sessionId];
|
|
145
|
-
return Array.isArray(links)
|
|
146
|
-
? [...links].sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0))
|
|
147
|
-
: [];
|
|
148
|
-
}
|
|
149
|
-
|
|
150
131
|
function ghPrForBranch(cwd, timeoutMs = 3000) {
|
|
151
132
|
const run = (file, fileArgs) =>
|
|
152
133
|
new Promise((resolve) => {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { getHomeDir } from "./paths.js";
|
|
4
|
+
|
|
5
|
+
export function prLinkLedgerPath() {
|
|
6
|
+
return join(getHomeDir(), "pr-links.json");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function readPrLinkLedger() {
|
|
10
|
+
try {
|
|
11
|
+
const ledgerPath = prLinkLedgerPath();
|
|
12
|
+
if (!existsSync(ledgerPath)) return {};
|
|
13
|
+
const parsed = JSON.parse(readFileSync(ledgerPath, "utf-8"));
|
|
14
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
15
|
+
} catch {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function getPrLinks(sessionId) {
|
|
21
|
+
if (!sessionId) return [];
|
|
22
|
+
const links = readPrLinkLedger()[sessionId];
|
|
23
|
+
return Array.isArray(links)
|
|
24
|
+
? [...links].sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0))
|
|
25
|
+
: [];
|
|
26
|
+
}
|
|
@@ -48,6 +48,11 @@ import { consumeIssuedPluginSandboxExecutionContract } from "../plugin-runtime/b
|
|
|
48
48
|
import runtimeProvenanceLedger from "../runtime-provenance-ledger.js";
|
|
49
49
|
import { credentialAgent } from "./credential-agent.js";
|
|
50
50
|
import { WorkspaceTransactionManager } from "./workspace-transaction.js";
|
|
51
|
+
import {
|
|
52
|
+
consumeMcpStdioCapsuleSandboxExecutionContract,
|
|
53
|
+
consumeMcpStdioExecutableIdentityAuthority,
|
|
54
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
|
|
55
|
+
} from "../mcp-stdio-executable-identity.js";
|
|
51
56
|
|
|
52
57
|
const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
|
|
53
58
|
const SUPPORTED_SANDBOX_PROFILES = new Set([
|
|
@@ -705,22 +710,35 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
705
710
|
}
|
|
706
711
|
return admitted;
|
|
707
712
|
}
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
713
|
+
const mcpCapsule = raw?.kind === MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND;
|
|
714
|
+
const consumed = mcpCapsule
|
|
715
|
+
? consumeMcpStdioCapsuleSandboxExecutionContract(raw, {
|
|
716
|
+
origin: options.origin,
|
|
717
|
+
command: launch?.command,
|
|
718
|
+
args: launch?.args,
|
|
719
|
+
cwd: options.cwd,
|
|
720
|
+
shell: options.shell,
|
|
721
|
+
requiredBoundaries,
|
|
722
|
+
sync: launch?.sync === true,
|
|
723
|
+
identityDigest: options.mcpStdioExecutableIdentityDigest,
|
|
724
|
+
})
|
|
725
|
+
: consumeIssuedPluginSandboxExecutionContract(raw, {
|
|
726
|
+
origin: options.origin,
|
|
727
|
+
command: launch?.command,
|
|
728
|
+
args: launch?.args,
|
|
729
|
+
cwd: options.cwd,
|
|
730
|
+
pluginId: options.pluginId,
|
|
731
|
+
pluginVersion: options.pluginVersion,
|
|
732
|
+
pluginSource: options.pluginSource,
|
|
733
|
+
pluginExecutableIdentity: options.pluginExecutableIdentity,
|
|
734
|
+
requiredBoundaries,
|
|
735
|
+
sync: launch?.sync === true,
|
|
736
|
+
});
|
|
737
|
+
if (!consumed) {
|
|
722
738
|
return invalid(
|
|
723
|
-
|
|
739
|
+
mcpCapsule
|
|
740
|
+
? "sandboxExecutionContract was not issued for this MCP capsule launch provenance"
|
|
741
|
+
: "sandboxExecutionContract was not issued for this plugin launch provenance",
|
|
724
742
|
);
|
|
725
743
|
}
|
|
726
744
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
@@ -750,18 +768,22 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
750
768
|
"strict-plugin-node-bin",
|
|
751
769
|
"strict-plugin-native-static-elf-bin",
|
|
752
770
|
"strict-plugin-native-elf-bin",
|
|
771
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
|
|
753
772
|
].includes(raw.kind)
|
|
754
773
|
) {
|
|
755
774
|
return invalid("unsupported sandboxExecutionContract kind or version");
|
|
756
775
|
}
|
|
757
776
|
if (
|
|
758
|
-
options.
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
777
|
+
options.shell !== false ||
|
|
778
|
+
(!mcpCapsule &&
|
|
779
|
+
(options.origin !== "plugin:bin" ||
|
|
780
|
+
typeof options.pluginId !== "string" ||
|
|
781
|
+
!options.pluginId))
|
|
762
782
|
) {
|
|
763
783
|
return invalid(
|
|
764
|
-
|
|
784
|
+
mcpCapsule
|
|
785
|
+
? "sandboxExecutionContract is restricted to direct MCP capsule shell:false launches"
|
|
786
|
+
: "sandboxExecutionContract is restricted to direct plugin:bin shell:false launches",
|
|
765
787
|
);
|
|
766
788
|
}
|
|
767
789
|
|
|
@@ -803,17 +825,19 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
803
825
|
);
|
|
804
826
|
}
|
|
805
827
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
if (
|
|
810
|
-
!provenanceIdentity ||
|
|
811
|
-
provenanceIdentity.realPath !== entryIdentity.realPath ||
|
|
812
|
-
provenanceIdentity.sha256 !== entryIdentity.sha256
|
|
813
|
-
) {
|
|
814
|
-
return invalid(
|
|
815
|
-
"sandboxExecutionContract entry identity does not match plugin provenance",
|
|
828
|
+
if (!mcpCapsule) {
|
|
829
|
+
const provenanceIdentity = this._normalizePluginExecutableIdentity(
|
|
830
|
+
options.pluginExecutableIdentity,
|
|
816
831
|
);
|
|
832
|
+
if (
|
|
833
|
+
!provenanceIdentity ||
|
|
834
|
+
provenanceIdentity.realPath !== entryIdentity.realPath ||
|
|
835
|
+
provenanceIdentity.sha256 !== entryIdentity.sha256
|
|
836
|
+
) {
|
|
837
|
+
return invalid(
|
|
838
|
+
"sandboxExecutionContract entry identity does not match plugin provenance",
|
|
839
|
+
);
|
|
840
|
+
}
|
|
817
841
|
}
|
|
818
842
|
const entryRelative = path.relative(
|
|
819
843
|
path.resolve(raw.pluginRoot),
|
|
@@ -1180,6 +1204,9 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1180
1204
|
"pluginTreeSnapshotContractBound",
|
|
1181
1205
|
"pluginTreeSnapshotAtomic",
|
|
1182
1206
|
"initialDynamicLoadClosureDescriptorBound",
|
|
1207
|
+
"sharedLibraryClosure",
|
|
1208
|
+
"entrySnapshotAtomic",
|
|
1209
|
+
"runtimeLaunchAtomic",
|
|
1183
1210
|
]) {
|
|
1184
1211
|
if (
|
|
1185
1212
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1196,6 +1223,9 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1196
1223
|
"pluginTreeContentSnapshotBytes",
|
|
1197
1224
|
"initialDynamicDependencyCount",
|
|
1198
1225
|
"initialDynamicRuntimeFileCount",
|
|
1226
|
+
"runtimeSnapshotBytes",
|
|
1227
|
+
"runtimeAttestedBytes",
|
|
1228
|
+
"entrySnapshotBytes",
|
|
1199
1229
|
]) {
|
|
1200
1230
|
if (
|
|
1201
1231
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1208,6 +1238,22 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1208
1238
|
);
|
|
1209
1239
|
}
|
|
1210
1240
|
}
|
|
1241
|
+
for (const field of [
|
|
1242
|
+
"runtimeSnapshotSha256",
|
|
1243
|
+
"runtimeAttestedSha256",
|
|
1244
|
+
"entrySnapshotSha256",
|
|
1245
|
+
]) {
|
|
1246
|
+
if (
|
|
1247
|
+
plan.runtimeProbe[field] !== undefined &&
|
|
1248
|
+
(typeof plan.runtimeProbe[field] !== "string" ||
|
|
1249
|
+
!/^[a-f0-9]{64}$/.test(plan.runtimeProbe[field]))
|
|
1250
|
+
) {
|
|
1251
|
+
throw this._sandboxError(
|
|
1252
|
+
"invalid_sandbox_plan",
|
|
1253
|
+
`Sandbox runtime probe ${field} must be a lowercase SHA-256 value`,
|
|
1254
|
+
);
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1211
1257
|
if (
|
|
1212
1258
|
plan.runtimeProbe.pluginTreeContentSnapshotDigest !== undefined &&
|
|
1213
1259
|
(typeof plan.runtimeProbe.pluginTreeContentSnapshotDigest !==
|
|
@@ -1509,6 +1555,78 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1509
1555
|
"Sandbox runtime probe successful dynamic ELF evidence requires a descriptor-bound initial direct system set",
|
|
1510
1556
|
);
|
|
1511
1557
|
}
|
|
1558
|
+
const codeSnapshotGuaranteed = guarantees.includes(
|
|
1559
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
1560
|
+
);
|
|
1561
|
+
if (codeSnapshotGuaranteed) {
|
|
1562
|
+
const exactSnapshotEvidence =
|
|
1563
|
+
plan.applied === true &&
|
|
1564
|
+
candidateBackend === null &&
|
|
1565
|
+
plan.runtimeProbe.attempted === true &&
|
|
1566
|
+
plan.runtimeProbe.runnable === true &&
|
|
1567
|
+
plan.runtimeProbe.reason === null &&
|
|
1568
|
+
plan.runtimeProbe.probeRuntime === "node" &&
|
|
1569
|
+
plan.runtimeProbe.targetRuntime === "node" &&
|
|
1570
|
+
plan.runtimeProbe.contentSnapshot === true &&
|
|
1571
|
+
plan.runtimeProbe.sharedLibraryClosure === false &&
|
|
1572
|
+
/^[a-f0-9]{64}$/.test(plan.runtimeProbe.entrySnapshotSha256 || "") &&
|
|
1573
|
+
Number.isSafeInteger(plan.runtimeProbe.entrySnapshotBytes) &&
|
|
1574
|
+
plan.runtimeProbe.entrySnapshotBytes >= 0 &&
|
|
1575
|
+
plan.runtimeProbe.entrySnapshotBytes <= 64 * 1024 * 1024;
|
|
1576
|
+
const linuxSnapshotEvidence =
|
|
1577
|
+
plan.platform === "linux" &&
|
|
1578
|
+
backend === "linux-fd-code-snapshot" &&
|
|
1579
|
+
plan.enforcement === "linux-fd-code-snapshot" &&
|
|
1580
|
+
policyAttested === true &&
|
|
1581
|
+
policyDigest !== null &&
|
|
1582
|
+
plan.runtimeProbe.kind === "linux-mcp-capsule-code-snapshot-v1" &&
|
|
1583
|
+
plan.runtimeProbe.contentSnapshotScope ===
|
|
1584
|
+
"mcp-capsule-entry-and-node-runtime" &&
|
|
1585
|
+
plan.runtimeProbe.contentSnapshotMechanism ===
|
|
1586
|
+
"verified-o_tmpfile-copy-inherited-fd-exec-v1" &&
|
|
1587
|
+
plan.runtimeProbe.handleAtomic === true &&
|
|
1588
|
+
/^[a-f0-9]{64}$/.test(
|
|
1589
|
+
plan.runtimeProbe.runtimeSnapshotSha256 || "",
|
|
1590
|
+
) &&
|
|
1591
|
+
Number.isSafeInteger(plan.runtimeProbe.runtimeSnapshotBytes) &&
|
|
1592
|
+
plan.runtimeProbe.runtimeSnapshotBytes > 0 &&
|
|
1593
|
+
plan.runtimeProbe.runtimeSnapshotBytes <= 256 * 1024 * 1024 &&
|
|
1594
|
+
/^\/proc\/self\/fd\/\d+$/.test(plan.command) &&
|
|
1595
|
+
/^\/proc\/self\/fd\/\d+$/.test(plan.args[0] || "");
|
|
1596
|
+
const windowsSnapshotEvidence =
|
|
1597
|
+
plan.platform === "win32" &&
|
|
1598
|
+
[
|
|
1599
|
+
"windows-job-restricted-token",
|
|
1600
|
+
"windows-appcontainer-job-restricted-token",
|
|
1601
|
+
].includes(backend) &&
|
|
1602
|
+
plan.enforcement === backend &&
|
|
1603
|
+
[
|
|
1604
|
+
"windows-plugin-node-entry-snapshot-v1",
|
|
1605
|
+
"windows-appcontainer-launch-attestation-v1",
|
|
1606
|
+
].includes(plan.runtimeProbe.kind) &&
|
|
1607
|
+
plan.runtimeProbe.contentSnapshotScope ===
|
|
1608
|
+
"mcp-capsule-entry-source" &&
|
|
1609
|
+
plan.runtimeProbe.contentSnapshotMechanism ===
|
|
1610
|
+
"verified-handle-inherited-pipe-module-compile-v1" &&
|
|
1611
|
+
plan.runtimeProbe.handleAtomic === false &&
|
|
1612
|
+
plan.runtimeProbe.entrySnapshotAtomic === true &&
|
|
1613
|
+
plan.runtimeProbe.runtimeLaunchAtomic === false &&
|
|
1614
|
+
/^[a-f0-9]{64}$/.test(
|
|
1615
|
+
plan.runtimeProbe.runtimeAttestedSha256 || "",
|
|
1616
|
+
) &&
|
|
1617
|
+
Number.isSafeInteger(plan.runtimeProbe.runtimeAttestedBytes) &&
|
|
1618
|
+
plan.runtimeProbe.runtimeAttestedBytes > 0 &&
|
|
1619
|
+
plan.runtimeProbe.runtimeAttestedBytes <= 256 * 1024 * 1024;
|
|
1620
|
+
if (
|
|
1621
|
+
!exactSnapshotEvidence ||
|
|
1622
|
+
(!linuxSnapshotEvidence && !windowsSnapshotEvidence)
|
|
1623
|
+
) {
|
|
1624
|
+
throw this._sandboxError(
|
|
1625
|
+
"invalid_sandbox_plan",
|
|
1626
|
+
"Code snapshot guarantee requires typed atomic MCP capsule evidence",
|
|
1627
|
+
);
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1512
1630
|
const genericWorkspaceEvidenceFields = [
|
|
1513
1631
|
"contractDigest",
|
|
1514
1632
|
"policyDigest",
|
|
@@ -1800,6 +1918,26 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1800
1918
|
plan.runtimeProbe.contentSnapshotMechanism,
|
|
1801
1919
|
}
|
|
1802
1920
|
: {}),
|
|
1921
|
+
...(plan.runtimeProbe.runtimeSnapshotSha256 !== undefined
|
|
1922
|
+
? {
|
|
1923
|
+
runtimeSnapshotSha256: plan.runtimeProbe.runtimeSnapshotSha256,
|
|
1924
|
+
runtimeSnapshotBytes: plan.runtimeProbe.runtimeSnapshotBytes,
|
|
1925
|
+
entrySnapshotSha256: plan.runtimeProbe.entrySnapshotSha256,
|
|
1926
|
+
entrySnapshotBytes: plan.runtimeProbe.entrySnapshotBytes,
|
|
1927
|
+
sharedLibraryClosure: plan.runtimeProbe.sharedLibraryClosure,
|
|
1928
|
+
}
|
|
1929
|
+
: {}),
|
|
1930
|
+
...(plan.runtimeProbe.runtimeAttestedSha256 !== undefined
|
|
1931
|
+
? {
|
|
1932
|
+
runtimeAttestedSha256: plan.runtimeProbe.runtimeAttestedSha256,
|
|
1933
|
+
runtimeAttestedBytes: plan.runtimeProbe.runtimeAttestedBytes,
|
|
1934
|
+
entrySnapshotSha256: plan.runtimeProbe.entrySnapshotSha256,
|
|
1935
|
+
entrySnapshotBytes: plan.runtimeProbe.entrySnapshotBytes,
|
|
1936
|
+
entrySnapshotAtomic: plan.runtimeProbe.entrySnapshotAtomic,
|
|
1937
|
+
runtimeLaunchAtomic: plan.runtimeProbe.runtimeLaunchAtomic,
|
|
1938
|
+
sharedLibraryClosure: plan.runtimeProbe.sharedLibraryClosure,
|
|
1939
|
+
}
|
|
1940
|
+
: {}),
|
|
1803
1941
|
};
|
|
1804
1942
|
for (const field of [
|
|
1805
1943
|
"pluginTreeContentSnapshot",
|
|
@@ -2717,6 +2855,10 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2717
2855
|
const startTime = Date.now();
|
|
2718
2856
|
const origin = options.origin || "unknown";
|
|
2719
2857
|
const requestedCwd = options.cwd || process.cwd();
|
|
2858
|
+
const mcpStdioExecutableIdentityAuthority =
|
|
2859
|
+
options.mcpStdioExecutableIdentityAuthority;
|
|
2860
|
+
const identityCommand = command;
|
|
2861
|
+
const identityArgs = [...(args || [])];
|
|
2720
2862
|
options = this._withWorkspaceTransactionBoundaries(options, requestedCwd, {
|
|
2721
2863
|
command,
|
|
2722
2864
|
args,
|
|
@@ -2764,6 +2906,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2764
2906
|
sandboxRequired: [],
|
|
2765
2907
|
sandboxGuarantees: [],
|
|
2766
2908
|
sandboxBackend: null,
|
|
2909
|
+
mcpStdioExecutableIdentityDigest: null,
|
|
2767
2910
|
};
|
|
2768
2911
|
|
|
2769
2912
|
let sandboxPolicy;
|
|
@@ -2813,6 +2956,8 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2813
2956
|
this._stripPluginControlOptions(spawnOpts);
|
|
2814
2957
|
this._stripWorkspaceTransactionOptions(spawnOpts);
|
|
2815
2958
|
this._stripAuditControlOptions(spawnOpts);
|
|
2959
|
+
delete spawnOpts.mcpStdioExecutableIdentityAuthority;
|
|
2960
|
+
delete spawnOpts.mcpStdioExecutableIdentityDigest;
|
|
2816
2961
|
if (traceCtx) {
|
|
2817
2962
|
spawnOpts.env = { ...(spawnOpts.env || process.env) };
|
|
2818
2963
|
spawnOpts.env.TRACEPARENT = traceCtx.traceparent;
|
|
@@ -2886,6 +3031,17 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2886
3031
|
const nativeSpawnFn = this._native?.spawn || nativeSpawn;
|
|
2887
3032
|
let proc;
|
|
2888
3033
|
try {
|
|
3034
|
+
if (mcpStdioExecutableIdentityAuthority !== undefined) {
|
|
3035
|
+
const admitted = consumeMcpStdioExecutableIdentityAuthority(
|
|
3036
|
+
mcpStdioExecutableIdentityAuthority,
|
|
3037
|
+
{
|
|
3038
|
+
command: identityCommand,
|
|
3039
|
+
args: identityArgs,
|
|
3040
|
+
env: optsForSpawn.env || {},
|
|
3041
|
+
},
|
|
3042
|
+
);
|
|
3043
|
+
auditEntry.mcpStdioExecutableIdentityDigest = admitted.identityDigest;
|
|
3044
|
+
}
|
|
2889
3045
|
proc = nativeSpawnFn(command, args, optsForSpawn);
|
|
2890
3046
|
this._bindWorkspaceTransactionProcess(auditEntry, proc);
|
|
2891
3047
|
} catch (spawnError) {
|
|
@@ -2920,15 +3076,16 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2920
3076
|
if (
|
|
2921
3077
|
sandboxPlan.applied === true &&
|
|
2922
3078
|
(sandboxPlan.backend === "linux-bwrap-workspace" ||
|
|
2923
|
-
sandboxPlan.backend === "linux-bwrap"
|
|
3079
|
+
sandboxPlan.backend === "linux-bwrap" ||
|
|
3080
|
+
sandboxPlan.backend === "linux-fd-code-snapshot") &&
|
|
2924
3081
|
sandboxPlan.postSpawn.required === false
|
|
2925
3082
|
) {
|
|
2926
3083
|
// child_process.spawn() has synchronously duplicated every stdio entry
|
|
2927
|
-
// into the launched
|
|
2928
|
-
//
|
|
3084
|
+
// into the launched process before returning. The generic/direct bwrap
|
|
3085
|
+
// backends and the MCP anonymous-code snapshot backend are complete
|
|
2929
3086
|
// pre-spawn plans with no parent-side enforcement handle. Retaining
|
|
2930
|
-
// their pinned
|
|
2931
|
-
//
|
|
3087
|
+
// their pinned descriptors until a long-lived process exits would turn
|
|
3088
|
+
// each child into an avoidable FD leak.
|
|
2932
3089
|
cleanupSandbox();
|
|
2933
3090
|
}
|
|
2934
3091
|
try {
|