chainlesschain 0.165.3 → 0.165.5
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/README.md +151 -29
- package/package.json +2 -2
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BiHNUlbU.js → AIOps-CEeYTeDB.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-D-UFjDRQ.js → ActionButton-BeRUQ3V2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DazVsDgW.js → Analytics-DrV718XF.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DXh9UfNJ.js → AppLayout-Cd2Frt7Q.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CZ6tsceY.js → Artifacts-CUJMlORU.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-RyxnBr_h.js → Audit-CXJcfT6p.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BWS51Q6X.js → BackgroundAgents-DOv6Z7H9.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BRtPcUul.js → Backup-BwdDyBI0.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CGd4vZYY.js → BaseInput-BmLn4kYH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-h8ijVwCg.js → Chat-COg8pAW2.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-NyF6dPl8.js → Checkbox-BCP4uoU8.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Ci4OOxr5.js → Codegen-pRt6Y9JI.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CwTkc9BM.js → Col-DLaprKhS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DW_tM82m.js → Community-DyATsz5f.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DEvHRV4S.js → Compact-BXAaupZK.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BbjBEEfD.js → Compliance-DpcJBELr.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-10IXBaBa.js → Cowork-DG4EFWyd.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BZkbpd5I.js → Cron-F6Oy5n2P.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CFQ8L_6v.js → Crosschain-BOdgtalX.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BDF6AkXe.js → DID-DT1dSkjH.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CoOdWMi4.js → Dashboard-NBUIqWzC.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DEsGmu8Y.js → Dropdown-CSpHeMYB.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BS89SWlK.js → EmailListRenderer-CEG0xISr.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C1FpCHiI.js → FamilyGuardDashboard-BTZ0BZna.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BzvpVmLA.js → Federation-BuuCTn2V.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BeC259PQ.js → FormItemContext-KAVceevk.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-azgG3bmV.js → GenericCardRenderer-DnHpcQvW.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BmSSowc5.js → Git-C_B_0HwB.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CTBCSyQZ.js → Governance-DPSZuzuu.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DA5xyk4a.js → Inference-BV-06V7q.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D1gPHNig.js → KnowledgeGraph-wpDuupn6.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BPmLf1AR.js → Logs-Bseca1_I.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-SVLOg49H.js → MarkdownRenderer-B4RLp2zs.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DtUFcR0E.js → Marketplace-d3kM4DDL.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DS_kqBv-.js → McpTools-DQ_xZ23i.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Fvh7XL7V.js → Memory-CRIeYO4L.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C7itAP45.js → MobileBridge-BsllIa9l.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BUuQy30X.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B57MiNLK.js → Mtc-BOFDIzrC.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-BXfCUcM7.js → MtcAudit-BQg-vyvG.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-yaJ-ZcF6.js → Multisig-Bo1jrPdN.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CoaUCKrO.js → NLProgramming-Bmod8alw.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BKLM_65R.js → Notes-CGGFL8w-.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DoDtK9uZ.js → NotificationSettings-BsZvCJxC.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BJ28TGr-.js → OrderTableRenderer-C1-Quo_h.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-MuGsdoIb.js → Organization-BjOeDYOi.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BLUN9J4R.js → Overflow-DwVV3l5A.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DWuoBUPd.js → P2P-Cu3DQT9W.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CUi37YPj.js → PdhVaultBrowser-Cg0gR7dH.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BYQg2pcr.js → Permissions-CsAXxRN5.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CAxoV2xu.js → PersonalDataHub-C-nNmnYp.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-B33wGvIO.js → Pipeline-BOnW7nNc.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-A8yXTORP.js → Privacy-ClLSyGKt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D49I2I1O.js → ProjectInit-DuLvjjq7.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ci73jJDw.js → ProjectSettings-DQYYbDD9.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CF-yD6Cn.js → Projects-Drw8MBGK.js} +1 -1
- package/src/assets/web-panel/assets/Providers-ckqHQe6K.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-Brza0ykJ.js → QrScannerModal-DW5BXk-G.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DFydhjxL.js → QuickAsk-DDLnhNTp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DLF8_NhA.js → Recommend-PJQ2C91U.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-dyuStW3x.js → RemoteSession-s6wmda34.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-5F3tA6yw.js → Reputation-DC2sb-I3.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Ca2A57S5.js → Row-hPGk1eGj.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B0bxBkq_.js → RssFeed-RIvfZql0.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CFNvHalZ.js → Search-DFg1G1eR.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DSoH3Hav.js → Security-D6H5p8Dp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BHpfEmBQ.js → Services-nxYiFV_w.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Dsh-QNmn.js → Skeleton-BmgFNAdB.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BhT1NkSU.js → Skills-CsaaD2av.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DY9snPeJ.js → Sla-yM5y9yvK.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CWaX0_Cx.js → SpeechSettings-DPy1XMYh.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B690y_TC.js → SyncSettings-CFVhEyyr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-2N-w3zWd.js → Tasks-DdO02Inn.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BjwQOQYC.js → Templates-Eo2d8Llu.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CUqHErxY.js → Tenant-ChESOXgy.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-C13rXvNy.js → Terminal-BJ7oDxTI.js} +2 -2
- package/src/assets/web-panel/assets/TimelineRenderer-hWX0fUvz.js +1 -0
- package/src/assets/web-panel/assets/{Tokens-BXHLGXYC.js → Tokens-DVBZQnd-.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-1e5i65o3.js → Trigger-D89cQfVq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-FLGqNHs5.js → Trust-BIVSb4-V.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BbaR_LJB.js → UkeySign-B58gWopl.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-NOp4RIov.js → VideoEditing-DhHI7bmG.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-B7DW7bG4.js → Wallet-C4FheWS_.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-BptSUWix.js → WebAuthn-DnPRq-Bx.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-CAJnDOXS.js → WorkflowEditor-BerRPjpJ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-I8LgG1-Z.js → chat-BzZ52iKr.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CWe7SOVD.js → colors-BI_E4BAn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cx3u3CA3.js → compact-item-d50mr3yk.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CgD5ArwY.js → createContext-C6FsQ1IH.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CagEcIex.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BfQWiXN8.js → hasIn-DLZEMgLP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuEQSorC.js → index-9H_M2jju.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiI-xPRH.js → index-A5CDWP7y.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAVy98u7.js → index-AHr7ryWf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUAR7RY-.js → index-B81mo1Et.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlIyt1qF.js → index-BAE3hwev.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dcdm_Z2c.js → index-BB9SqVSt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWZ3REg6.js → index-BRGx3w6T.js} +3 -3
- package/src/assets/web-panel/assets/{index-B6yChzt1.js → index-BTpIOTfR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeizoQVZ.js → index-BZjjdQ62.js} +1 -1
- package/src/assets/web-panel/assets/{index-e8BM1yY1.js → index-BcSUl9fA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNYFQxAW.js → index-BeM4hfht.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGMYTN5W.js → index-Bmr_vxXD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BREnPKGo.js → index-BoNZlzhQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1cX4Rxu.js → index-C3k8kevG.js} +1 -1
- package/src/assets/web-panel/assets/{index-3iKP9OTJ.js → index-CLoTQr0W.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1UjHdgZ.js → index-CO8DAF7U.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cy_cCJlr.js → index-CRN5TRTQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0nDKhWv.js → index-CUaEHfQ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DslTuqro.js → index-CVzuawCX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAUnl4Jv.js → index-CdKt9fOd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMu16vPC.js → index-CgkoH3_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-rIKccl.js → index-CjuKZBqJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bx7BNIRH.js → index-Co7s9LsB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Doc0Ftpd.js → index-D-aBumtY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd79NQAx.js → index-DE0V6cp-.js} +1 -1
- package/src/assets/web-panel/assets/{index-V-kIHzAV.js → index-DY4j5zkF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi24S7Dw.js → index-Dec0Kf_Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCJEY2T0.js → index-DoFtCVZ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0ztiqtB.js → index-DqkbHHg8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcX4FSPf.js → index-DsscwxPE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdRkCwm4.js → index-GXE0D8Nx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmgtY58H.js → index-IPkwSAW_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQDKYbnv.js → index-KNGgO4Wm.js} +1 -1
- package/src/assets/web-panel/assets/{index-87gMxqhN.js → index-Pvf30m8Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmrdUwzU.js → index-Q5Tn735s.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFb-XIKy.js → index-TWG-_D1M.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsQcURkA.js → index-Y2-q7QLm.js} +1 -1
- package/src/assets/web-panel/assets/index-pzT9PpOU.js +1 -0
- package/src/assets/web-panel/assets/index-z1kFadaX.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-DiBszVdG.js → initDefaultProps-D-4Hzgej.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BGIFFozv.js → motion-D4Wl4xU7.js} +1 -1
- package/src/assets/web-panel/assets/{move-D5W7mp7B.js → move-Cd5eQvL0.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-JFIlxJ7F.js → mtc-parser-B4ilslCW.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CQ3o6LIU.js → omit-Ckarx-tf.js} +1 -1
- package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
- package/src/assets/web-panel/assets/{pickAttrs-R8MIlXo3.js → pickAttrs-QJ0bpCmc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-sW7ylSky.js → placementArrow-CKHm-tq8.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Cnl39Vbz.js → responsiveObserve-CV6a_w_Y.js} +1 -1
- package/src/assets/web-panel/assets/{slide-sn8tFd14.js → slide-mHpeQFgk.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-IKKY_QxZ.js → statusUtils-DIaQNQWA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BNpV4Nqs.js → styleChecker-PJpzavV8.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BWyT_eoU.js → useFlexGapSupport-BH7zTw8S.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D09p6_U9.js → useFs-BDNG3JDd.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CzW3TkJZ.js → usePersonalDataHub-CY2VWdUg.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-3s3WoAKB.js → vnode-D0kw9jhz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cjy_673s.js → zoom-B5g7TN7r.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 +105 -35
- package/src/commands/artifacts.js +598 -33
- package/src/commands/cowork.js +200 -5
- package/src/commands/session-budget.js +155 -0
- package/src/commands/session-location.js +968 -1
- package/src/commands/session.js +23 -2
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/artifact-protocol.js +77 -13
- package/src/gateways/ws/message-dispatcher.js +57 -0
- package/src/gateways/ws/session-protocol.js +391 -24
- package/src/gateways/ws/ws-agent-handler.js +191 -14
- package/src/gateways/ws/ws-server.js +14 -3
- package/src/gateways/ws/ws-session-gateway.js +101 -5
- package/src/harness/jsonl-session-store.js +1210 -0
- package/src/lib/agent-team/team-runner.js +43 -13
- package/src/lib/artifact-access-ledger.js +462 -0
- package/src/lib/artifact-cleanup-ledger.js +861 -0
- package/src/lib/artifact-deletion-ledger.js +678 -0
- package/src/lib/artifact-recovery.js +970 -0
- package/src/lib/artifact-store.js +256 -51
- package/src/lib/artifact-workbench-projection.js +171 -0
- package/src/lib/command-lifecycle-report.js +8 -4
- package/src/lib/cowork-adapter.js +9 -5
- package/src/lib/cowork-task-runner.js +20 -0
- package/src/lib/cowork-workflow.js +178 -20
- package/src/lib/direct-model-usage.js +62 -22
- package/src/lib/dynamic-workflow-runtime.js +3592 -112
- package/src/lib/execution-location-result-apply.js +339 -0
- package/src/lib/execution-location-result-artifact.js +271 -0
- package/src/lib/execution-location-result-review.js +253 -0
- package/src/lib/execution-location-result-store.js +331 -0
- package/src/lib/execution-location-result.js +617 -0
- package/src/lib/execution-location-target.js +240 -3
- package/src/lib/managed-tool-checkpoint.js +47 -4
- 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/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 +29 -0
- package/src/lib/session-budget-production-root.js +376 -0
- package/src/lib/session-budget-runtime.js +109 -18
- package/src/lib/session-budget-usage.js +63 -0
- package/src/lib/session-host-snapshot.js +19 -2
- package/src/lib/session-projection.js +126 -10
- package/src/lib/session-resource-budget.js +766 -105
- package/src/lib/sub-agent-context.js +69 -22
- package/src/lib/web-ui-server.js +12 -1
- package/src/repl/agent-repl.js +237 -16
- package/src/runtime/agent-core.js +135 -0
- package/src/runtime/headless-runner.js +135 -46
- package/src/runtime/headless-stream.js +133 -25
- package/src/runtime/policies/agent-policy.js +10 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-D7tcdDS9.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DGbP36-3.js +0 -1
- package/src/assets/web-panel/assets/Providers-D-etEhg5.js +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-CpbWcya_.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DLv_872g.js +0 -1
- package/src/assets/web-panel/assets/index-CdiGCibe.js +0 -1
- package/src/assets/web-panel/assets/index-D_0z-gyz.js +0 -1
- package/src/assets/web-panel/assets/parsers-UEvh_ShA.js +0 -4
|
@@ -71,6 +71,10 @@ import {
|
|
|
71
71
|
consumeMcpStdioExecutableIdentityAuthority,
|
|
72
72
|
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
|
|
73
73
|
} from "../mcp-stdio-executable-identity.js";
|
|
74
|
+
import {
|
|
75
|
+
isMcpStdioCapsuleNativeCodePolicy,
|
|
76
|
+
mcpStdioCapsuleNativeCodePolicyDigest,
|
|
77
|
+
} from "../mcp-stdio-native-code-policy.js";
|
|
74
78
|
|
|
75
79
|
const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
|
|
76
80
|
const SUPPORTED_SANDBOX_PROFILES = new Set([
|
|
@@ -1193,6 +1197,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1193
1197
|
"rootIdentity",
|
|
1194
1198
|
"entryIdentity",
|
|
1195
1199
|
"runtimeIdentity",
|
|
1200
|
+
"nativeCodePolicy",
|
|
1196
1201
|
]);
|
|
1197
1202
|
const unsupportedKey = Object.keys(raw).find(
|
|
1198
1203
|
(key) => !supportedKeys.has(key),
|
|
@@ -1213,6 +1218,15 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1213
1218
|
) {
|
|
1214
1219
|
return invalid("unsupported sandboxExecutionContract kind or version");
|
|
1215
1220
|
}
|
|
1221
|
+
if (
|
|
1222
|
+
(mcpCapsule &&
|
|
1223
|
+
!isMcpStdioCapsuleNativeCodePolicy(raw.nativeCodePolicy)) ||
|
|
1224
|
+
(!mcpCapsule && raw.nativeCodePolicy !== undefined)
|
|
1225
|
+
) {
|
|
1226
|
+
return invalid(
|
|
1227
|
+
"sandboxExecutionContract native-code policy is invalid for this contract kind",
|
|
1228
|
+
);
|
|
1229
|
+
}
|
|
1216
1230
|
if (
|
|
1217
1231
|
options.shell !== false ||
|
|
1218
1232
|
(!mcpCapsule &&
|
|
@@ -1303,6 +1317,11 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1303
1317
|
rootIdentity,
|
|
1304
1318
|
entryIdentity: this._freezeExecutableIdentity(entryIdentity),
|
|
1305
1319
|
runtimeIdentity: this._freezeExecutableIdentity(runtimeIdentity),
|
|
1320
|
+
...(mcpCapsule
|
|
1321
|
+
? {
|
|
1322
|
+
nativeCodePolicy: Object.freeze({ ...raw.nativeCodePolicy }),
|
|
1323
|
+
}
|
|
1324
|
+
: {}),
|
|
1306
1325
|
});
|
|
1307
1326
|
}
|
|
1308
1327
|
|
|
@@ -1789,6 +1808,13 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1789
1808
|
"helperTeamIdentifier",
|
|
1790
1809
|
"helperPackageIdentifier",
|
|
1791
1810
|
"helperPackageVersion",
|
|
1811
|
+
"nativeCodePolicySchema",
|
|
1812
|
+
"nativeCodePolicyMode",
|
|
1813
|
+
"capsuleNativeCodeFormat",
|
|
1814
|
+
"nativeAddonLoading",
|
|
1815
|
+
"nativeAddonDenialMechanism",
|
|
1816
|
+
"hostRuntimeSharedLibraries",
|
|
1817
|
+
"anonymousExecutableMemory",
|
|
1792
1818
|
]) {
|
|
1793
1819
|
if (
|
|
1794
1820
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1842,6 +1868,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1842
1868
|
"processForkExplicitlyDenied",
|
|
1843
1869
|
"sandboxExecLiveGateContract",
|
|
1844
1870
|
"globalLaunchSerialization",
|
|
1871
|
+
"nativeCodePolicyBound",
|
|
1845
1872
|
]) {
|
|
1846
1873
|
if (
|
|
1847
1874
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1890,6 +1917,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1890
1917
|
"helperDesignatedRequirementSha256",
|
|
1891
1918
|
"installAttestationDigest",
|
|
1892
1919
|
"planBindingDigest",
|
|
1920
|
+
"nativeCodePolicyDigest",
|
|
1893
1921
|
]) {
|
|
1894
1922
|
if (
|
|
1895
1923
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -2347,6 +2375,75 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2347
2375
|
"Successful dynamic ELF evidence requires a runtime pathname shared-library closure",
|
|
2348
2376
|
);
|
|
2349
2377
|
}
|
|
2378
|
+
const nativeCodeEvidenceFields = [
|
|
2379
|
+
"nativeCodePolicyBound",
|
|
2380
|
+
"nativeCodePolicySchema",
|
|
2381
|
+
"nativeCodePolicyDigest",
|
|
2382
|
+
"nativeCodePolicyMode",
|
|
2383
|
+
"capsuleNativeCodeFormat",
|
|
2384
|
+
"nativeAddonLoading",
|
|
2385
|
+
"nativeAddonDenialMechanism",
|
|
2386
|
+
"hostRuntimeSharedLibraries",
|
|
2387
|
+
"anonymousExecutableMemory",
|
|
2388
|
+
];
|
|
2389
|
+
const nativeAddonLoadingGuaranteed = guarantees.includes(
|
|
2390
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
2391
|
+
);
|
|
2392
|
+
const capsuleExecutionContract = launchContext.executionContract;
|
|
2393
|
+
const expectedNativeCodePolicy =
|
|
2394
|
+
capsuleExecutionContract?.nativeCodePolicy;
|
|
2395
|
+
const nativeCodePolicyEvidenceValid =
|
|
2396
|
+
nativeAddonLoadingGuaranteed &&
|
|
2397
|
+
guarantees.includes(SANDBOX_BOUNDARIES.CODE_SNAPSHOT) &&
|
|
2398
|
+
capsuleExecutionContract?.kind ===
|
|
2399
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND &&
|
|
2400
|
+
isMcpStdioCapsuleNativeCodePolicy(expectedNativeCodePolicy) &&
|
|
2401
|
+
plan.runtimeProbe.nativeCodePolicyBound === true &&
|
|
2402
|
+
plan.runtimeProbe.nativeCodePolicySchema ===
|
|
2403
|
+
expectedNativeCodePolicy.schema &&
|
|
2404
|
+
plan.runtimeProbe.nativeCodePolicyDigest ===
|
|
2405
|
+
mcpStdioCapsuleNativeCodePolicyDigest(expectedNativeCodePolicy) &&
|
|
2406
|
+
plan.runtimeProbe.nativeCodePolicyMode ===
|
|
2407
|
+
expectedNativeCodePolicy.mode &&
|
|
2408
|
+
plan.runtimeProbe.capsuleNativeCodeFormat ===
|
|
2409
|
+
expectedNativeCodePolicy.capsuleFormat &&
|
|
2410
|
+
plan.runtimeProbe.nativeAddonLoading ===
|
|
2411
|
+
expectedNativeCodePolicy.nativeAddonLoading &&
|
|
2412
|
+
plan.runtimeProbe.nativeAddonDenialMechanism ===
|
|
2413
|
+
expectedNativeCodePolicy.nativeAddonDenialMechanism &&
|
|
2414
|
+
plan.runtimeProbe.hostRuntimeSharedLibraries ===
|
|
2415
|
+
expectedNativeCodePolicy.hostRuntimeSharedLibraries &&
|
|
2416
|
+
plan.runtimeProbe.anonymousExecutableMemory ===
|
|
2417
|
+
expectedNativeCodePolicy.anonymousExecutableMemory &&
|
|
2418
|
+
plan.runtimeProbe.sharedLibraryClosure === false;
|
|
2419
|
+
if (nativeAddonLoadingGuaranteed && !nativeCodePolicyEvidenceValid) {
|
|
2420
|
+
throw this._sandboxError(
|
|
2421
|
+
"invalid_sandbox_plan",
|
|
2422
|
+
"Native-addon loading guarantee requires the exact deny-native-addons capsule policy",
|
|
2423
|
+
);
|
|
2424
|
+
}
|
|
2425
|
+
if (
|
|
2426
|
+
!nativeAddonLoadingGuaranteed &&
|
|
2427
|
+
nativeCodeEvidenceFields.some(
|
|
2428
|
+
(field) => plan.runtimeProbe[field] !== undefined,
|
|
2429
|
+
)
|
|
2430
|
+
) {
|
|
2431
|
+
throw this._sandboxError(
|
|
2432
|
+
"invalid_sandbox_plan",
|
|
2433
|
+
"Native-addon policy evidence requires its sandbox guarantee",
|
|
2434
|
+
);
|
|
2435
|
+
}
|
|
2436
|
+
if (
|
|
2437
|
+
capsuleExecutionContract?.kind ===
|
|
2438
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND &&
|
|
2439
|
+
guarantees.includes(SANDBOX_BOUNDARIES.CODE_SNAPSHOT) &&
|
|
2440
|
+
!nativeCodePolicyEvidenceValid
|
|
2441
|
+
) {
|
|
2442
|
+
throw this._sandboxError(
|
|
2443
|
+
"invalid_sandbox_plan",
|
|
2444
|
+
"MCP capsule code snapshots require a bound native-addon denial policy",
|
|
2445
|
+
);
|
|
2446
|
+
}
|
|
2350
2447
|
const codeSnapshotGuaranteed = guarantees.includes(
|
|
2351
2448
|
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
2352
2449
|
);
|
|
@@ -3099,6 +3196,21 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
3099
3196
|
}
|
|
3100
3197
|
: {}),
|
|
3101
3198
|
};
|
|
3199
|
+
for (const field of [
|
|
3200
|
+
"nativeCodePolicyBound",
|
|
3201
|
+
"nativeCodePolicySchema",
|
|
3202
|
+
"nativeCodePolicyDigest",
|
|
3203
|
+
"nativeCodePolicyMode",
|
|
3204
|
+
"capsuleNativeCodeFormat",
|
|
3205
|
+
"nativeAddonLoading",
|
|
3206
|
+
"nativeAddonDenialMechanism",
|
|
3207
|
+
"hostRuntimeSharedLibraries",
|
|
3208
|
+
"anonymousExecutableMemory",
|
|
3209
|
+
]) {
|
|
3210
|
+
if (plan.runtimeProbe[field] !== undefined) {
|
|
3211
|
+
runtimeProbe[field] = plan.runtimeProbe[field];
|
|
3212
|
+
}
|
|
3213
|
+
}
|
|
3102
3214
|
for (const field of [
|
|
3103
3215
|
"pluginTreeContentSnapshot",
|
|
3104
3216
|
...pluginTreeEvidenceFields,
|
|
@@ -48,6 +48,11 @@ import {
|
|
|
48
48
|
macosMcpLauncherPolicyDigest,
|
|
49
49
|
verifyMacosMcpLauncherInstallContract,
|
|
50
50
|
} from "./macos-mcp-launcher-contract.js";
|
|
51
|
+
import {
|
|
52
|
+
isMcpStdioCapsuleNativeCodePolicy,
|
|
53
|
+
mcpStdioCapsuleNativeCodeEvidence,
|
|
54
|
+
mcpStdioCapsuleNativeCodePolicyDigest,
|
|
55
|
+
} from "../mcp-stdio-native-code-policy.js";
|
|
51
56
|
|
|
52
57
|
export {
|
|
53
58
|
MCP_STDIO_FD_ENTRY_BOOTSTRAP,
|
|
@@ -68,6 +73,7 @@ export const SANDBOX_BOUNDARIES = Object.freeze({
|
|
|
68
73
|
PROCESS_TREE: "process-tree",
|
|
69
74
|
RESOURCE_LIMITS: "resource-limits",
|
|
70
75
|
PRIVILEGE_REDUCTION: "privilege-reduction",
|
|
76
|
+
NATIVE_ADDON_LOADING: "native-addon-loading",
|
|
71
77
|
});
|
|
72
78
|
|
|
73
79
|
/**
|
|
@@ -1663,6 +1669,7 @@ function validateMacMcpCapsuleContract(
|
|
|
1663
1669
|
if (
|
|
1664
1670
|
contract?.kind !== MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND ||
|
|
1665
1671
|
contract.contractVersion !== 1 ||
|
|
1672
|
+
!isMcpStdioCapsuleNativeCodePolicy(contract.nativeCodePolicy) ||
|
|
1666
1673
|
(sync !== true && sync !== false) ||
|
|
1667
1674
|
spawnOpts?.shell !== false ||
|
|
1668
1675
|
!linuxStdioIsNarrow(spawnOpts?.stdio) ||
|
|
@@ -1774,6 +1781,9 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1774
1781
|
});
|
|
1775
1782
|
}
|
|
1776
1783
|
|
|
1784
|
+
const nativeCodeEvidence = mcpStdioCapsuleNativeCodeEvidence(
|
|
1785
|
+
contract.nativeCodePolicy,
|
|
1786
|
+
);
|
|
1777
1787
|
const protocol = MACOS_MCP_LAUNCHER_INPUTS.protocol;
|
|
1778
1788
|
const legacyUnavailable = () =>
|
|
1779
1789
|
unavailable("macos_atomic_runtime_exec_unavailable", {
|
|
@@ -1894,6 +1904,7 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1894
1904
|
entryFd: entryPin.fd,
|
|
1895
1905
|
capsuleRootFd: capsulePin.fd,
|
|
1896
1906
|
callerLifelineFd: protocol.callerLifelineFd,
|
|
1907
|
+
nativeCodePolicyDigest: nativeCodeEvidence.nativeCodePolicyDigest,
|
|
1897
1908
|
}),
|
|
1898
1909
|
)
|
|
1899
1910
|
.digest("hex");
|
|
@@ -1940,6 +1951,7 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1940
1951
|
entrySnapshotBootstrapSha256:
|
|
1941
1952
|
MCP_STDIO_MACOS_GATED_ENTRY_BOOTSTRAP_SHA256,
|
|
1942
1953
|
sharedLibraryClosure: false,
|
|
1954
|
+
...nativeCodeEvidence,
|
|
1943
1955
|
rootProtectedRuntimeSnapshot: true,
|
|
1944
1956
|
entryRootOwnedAnonymousSnapshot: true,
|
|
1945
1957
|
entrySourcePrePostStat: true,
|
|
@@ -1996,6 +2008,7 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1996
2008
|
SANDBOX_BOUNDARIES.PROCESS_EXEC,
|
|
1997
2009
|
SANDBOX_BOUNDARIES.PROCESS_TREE,
|
|
1998
2010
|
SANDBOX_BOUNDARIES.PRIVILEGE_REDUCTION,
|
|
2011
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
1999
2012
|
],
|
|
2000
2013
|
cleanup,
|
|
2001
2014
|
});
|
|
@@ -4039,6 +4052,15 @@ function windowsPluginNodeEntrySnapshot(invocation, sandboxOpts, spawnOpts) {
|
|
|
4039
4052
|
reason: "windows_plugin_execution_contract_unsupported",
|
|
4040
4053
|
};
|
|
4041
4054
|
}
|
|
4055
|
+
if (
|
|
4056
|
+
capsuleContract &&
|
|
4057
|
+
!isMcpStdioCapsuleNativeCodePolicy(contract.nativeCodePolicy)
|
|
4058
|
+
) {
|
|
4059
|
+
return {
|
|
4060
|
+
locks: null,
|
|
4061
|
+
reason: "windows_mcp_native_code_policy_invalid",
|
|
4062
|
+
};
|
|
4063
|
+
}
|
|
4042
4064
|
if (
|
|
4043
4065
|
(!capsuleContract && sandboxOpts.sync !== true) ||
|
|
4044
4066
|
spawnOpts?.detached === true
|
|
@@ -4189,6 +4211,9 @@ function windowsAppContainerPolicyDigest({
|
|
|
4189
4211
|
runtimeLaunchMechanism:
|
|
4190
4212
|
"filter-oplock-locked-createprocess-suspended-image-v1",
|
|
4191
4213
|
sharedLibraryClosure: false,
|
|
4214
|
+
nativeCodePolicyDigest: mcpStdioCapsuleNativeCodePolicyDigest(
|
|
4215
|
+
executionContract.nativeCodePolicy,
|
|
4216
|
+
),
|
|
4192
4217
|
}
|
|
4193
4218
|
: {}),
|
|
4194
4219
|
launchPathLocks: snapshotLocks,
|
|
@@ -4241,6 +4266,7 @@ export function applyWindowsSandbox(
|
|
|
4241
4266
|
const appContainerSupportedBoundaries = [
|
|
4242
4267
|
...appContainerGuarantees,
|
|
4243
4268
|
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
4269
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
4244
4270
|
];
|
|
4245
4271
|
const base = {
|
|
4246
4272
|
platform: runtime.platform,
|
|
@@ -4859,6 +4885,9 @@ export function applyWindowsSandbox(
|
|
|
4859
4885
|
runtimeLaunchMechanism:
|
|
4860
4886
|
"filter-oplock-locked-createprocess-suspended-image-v1",
|
|
4861
4887
|
sharedLibraryClosure: false,
|
|
4888
|
+
...mcpStdioCapsuleNativeCodeEvidence(
|
|
4889
|
+
sandboxOpts.executionContract.nativeCodePolicy,
|
|
4890
|
+
),
|
|
4862
4891
|
planBindingMechanism: "windows-mcp-code-snapshot-plan-binding-v1",
|
|
4863
4892
|
planBindingDigest: windowsMcpPlanBinding.planBindingDigest,
|
|
4864
4893
|
}
|
|
@@ -4884,7 +4913,10 @@ export function applyWindowsSandbox(
|
|
|
4884
4913
|
...(entrySnapshot.locks &&
|
|
4885
4914
|
sandboxOpts.executionContract?.kind ===
|
|
4886
4915
|
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND
|
|
4887
|
-
? [
|
|
4916
|
+
? [
|
|
4917
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
4918
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
4919
|
+
]
|
|
4888
4920
|
: []),
|
|
4889
4921
|
],
|
|
4890
4922
|
command: helperInvocation.command,
|
|
@@ -5402,6 +5434,12 @@ function validateLinuxPluginContract(
|
|
|
5402
5434
|
) {
|
|
5403
5435
|
return { ok: false, reason: "execution_contract_missing" };
|
|
5404
5436
|
}
|
|
5437
|
+
if (
|
|
5438
|
+
capsuleContract &&
|
|
5439
|
+
!isMcpStdioCapsuleNativeCodePolicy(contract.nativeCodePolicy)
|
|
5440
|
+
) {
|
|
5441
|
+
return { ok: false, reason: "mcp_native_code_policy_invalid" };
|
|
5442
|
+
}
|
|
5405
5443
|
if (
|
|
5406
5444
|
(sync !== true && sync !== false) ||
|
|
5407
5445
|
spawnOpts?.shell !== false ||
|
|
@@ -6173,6 +6211,9 @@ function applyLinuxMcpCapsuleCodeSnapshot(
|
|
|
6173
6211
|
entrySnapshotSha256: entrySnapshot.attestation.sha256,
|
|
6174
6212
|
entrySnapshotBytes: entrySnapshot.attestation.bytes,
|
|
6175
6213
|
});
|
|
6214
|
+
const nativeCodeEvidence = mcpStdioCapsuleNativeCodeEvidence(
|
|
6215
|
+
contract.nativeCodePolicy,
|
|
6216
|
+
);
|
|
6176
6217
|
const policyDigest = sha256(
|
|
6177
6218
|
JSON.stringify({
|
|
6178
6219
|
version: 1,
|
|
@@ -6186,6 +6227,7 @@ function applyLinuxMcpCapsuleCodeSnapshot(
|
|
|
6186
6227
|
entrySnapshotBootstrapSha256: MCP_STDIO_FD_ENTRY_BOOTSTRAP_SHA256,
|
|
6187
6228
|
runtimeLaunchMechanism: "inherited-executable-fd-v1",
|
|
6188
6229
|
passthroughArgsDigest: sha256(JSON.stringify(invocation.args.slice(1))),
|
|
6230
|
+
nativeCodePolicyDigest: nativeCodeEvidence.nativeCodePolicyDigest,
|
|
6189
6231
|
}),
|
|
6190
6232
|
);
|
|
6191
6233
|
let closed = false;
|
|
@@ -6218,10 +6260,14 @@ function applyLinuxMcpCapsuleCodeSnapshot(
|
|
|
6218
6260
|
runtimeLaunchMechanism: "inherited-executable-fd-v1",
|
|
6219
6261
|
entrySnapshotBootstrapSha256: MCP_STDIO_FD_ENTRY_BOOTSTRAP_SHA256,
|
|
6220
6262
|
sharedLibraryClosure: false,
|
|
6263
|
+
...nativeCodeEvidence,
|
|
6221
6264
|
...snapshotIdentity,
|
|
6222
6265
|
},
|
|
6223
6266
|
reason: null,
|
|
6224
|
-
guarantees: [
|
|
6267
|
+
guarantees: [
|
|
6268
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
6269
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
6270
|
+
],
|
|
6225
6271
|
command: `/proc/self/fd/${runtimeFd}`,
|
|
6226
6272
|
args: [
|
|
6227
6273
|
"-e",
|
|
@@ -9694,6 +9740,9 @@ export function applyLinuxSandbox(
|
|
|
9694
9740
|
runtimeLaunchMechanism:
|
|
9695
9741
|
"bwrap-descriptor-mount-node-runtime-exec-v1",
|
|
9696
9742
|
sharedLibraryClosure: false,
|
|
9743
|
+
...mcpStdioCapsuleNativeCodeEvidence(
|
|
9744
|
+
validation.contract.nativeCodePolicy,
|
|
9745
|
+
),
|
|
9697
9746
|
runtimeSnapshotSha256: validation.contract.runtimeIdentity.sha256,
|
|
9698
9747
|
runtimeSnapshotBytes: validation.contract.runtimeIdentity.bytes,
|
|
9699
9748
|
entrySnapshotSha256: entrySnapshot.attestation.sha256,
|
|
@@ -9749,7 +9798,12 @@ export function applyLinuxSandbox(
|
|
|
9749
9798
|
SANDBOX_BOUNDARIES.FILESYSTEM,
|
|
9750
9799
|
SANDBOX_BOUNDARIES.NETWORK,
|
|
9751
9800
|
SANDBOX_BOUNDARIES.PROCESS_TREE,
|
|
9752
|
-
...(capsuleContract
|
|
9801
|
+
...(capsuleContract
|
|
9802
|
+
? [
|
|
9803
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
9804
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
9805
|
+
]
|
|
9806
|
+
: []),
|
|
9753
9807
|
],
|
|
9754
9808
|
command: invocation.command,
|
|
9755
9809
|
args: invocation.args,
|
|
@@ -102,6 +102,8 @@ const WORKSPACE_LOCK_OWNER_KEYS = Object.freeze([
|
|
|
102
102
|
const WORKSPACE_LOCK_RETENTION_REQUEST = Symbol(
|
|
103
103
|
"workspace-lock-retention-request",
|
|
104
104
|
);
|
|
105
|
+
const WORKSPACE_COORDINATION_TOKEN_PATTERN = /^[A-Za-z0-9-]{16,128}$/;
|
|
106
|
+
const WORKSPACE_COORDINATION_RECLAIM_TOKENS_PATTERN = /^[A-Za-z0-9-]{33,257}$/;
|
|
105
107
|
const TERMINAL_STATES = new Set([
|
|
106
108
|
WORKSPACE_TRANSACTION_STATE.COMMITTED,
|
|
107
109
|
WORKSPACE_TRANSACTION_STATE.ROLLED_BACK,
|
|
@@ -1669,6 +1671,24 @@ function workspacesOverlap(left, right) {
|
|
|
1669
1671
|
return isPathInside(left, right) || isPathInside(right, left);
|
|
1670
1672
|
}
|
|
1671
1673
|
|
|
1674
|
+
function isWorkspaceCoordinationDebris(name) {
|
|
1675
|
+
for (const lifecycle of ["acquire", "release"]) {
|
|
1676
|
+
const prefix = `coordination.lock.${lifecycle}-`;
|
|
1677
|
+
if (name.startsWith(prefix)) {
|
|
1678
|
+
return WORKSPACE_COORDINATION_TOKEN_PATTERN.test(
|
|
1679
|
+
name.slice(prefix.length),
|
|
1680
|
+
);
|
|
1681
|
+
}
|
|
1682
|
+
}
|
|
1683
|
+
const reclaimedPrefix = "coordination.lock.reclaimed-";
|
|
1684
|
+
return (
|
|
1685
|
+
name.startsWith(reclaimedPrefix) &&
|
|
1686
|
+
WORKSPACE_COORDINATION_RECLAIM_TOKENS_PATTERN.test(
|
|
1687
|
+
name.slice(reclaimedPrefix.length),
|
|
1688
|
+
)
|
|
1689
|
+
);
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1672
1692
|
function assertNoOverlappingWorkspaceLock(
|
|
1673
1693
|
lockDir,
|
|
1674
1694
|
workspaceRoot,
|
|
@@ -1695,6 +1715,12 @@ function assertNoOverlappingWorkspaceLock(
|
|
|
1695
1715
|
{ path: candidate },
|
|
1696
1716
|
);
|
|
1697
1717
|
}
|
|
1718
|
+
// withFileLock atomically detaches its private coordination directory
|
|
1719
|
+
// before recursive cleanup. Windows can temporarily retain that uniquely
|
|
1720
|
+
// tokened directory after the coordination lock itself is already free.
|
|
1721
|
+
// It contains state-lock ownership, not workspace ownership, and therefore
|
|
1722
|
+
// must not be interpreted as an overlapping workspace lease.
|
|
1723
|
+
if (isWorkspaceCoordinationDebris(name)) continue;
|
|
1698
1724
|
const owner = readLockOwner(candidate);
|
|
1699
1725
|
if (!owner) {
|
|
1700
1726
|
throw codedError(
|
|
@@ -4286,6 +4312,8 @@ export class WorkspaceTransactionManager {
|
|
|
4286
4312
|
recoverPending(options = {}) {
|
|
4287
4313
|
this._ensureStateRoot();
|
|
4288
4314
|
this._ensureLockRoot();
|
|
4315
|
+
const requestedId =
|
|
4316
|
+
options.id == null ? null : normalizeId(options.id, "transaction id");
|
|
4289
4317
|
const requestedRoot = options.workspaceRoot
|
|
4290
4318
|
? assertSafeDirectory(options.workspaceRoot, "workspace root")
|
|
4291
4319
|
: null;
|
|
@@ -4293,6 +4321,7 @@ export class WorkspaceTransactionManager {
|
|
|
4293
4321
|
const names = fs.readdirSync(this.transactionsDir).sort();
|
|
4294
4322
|
for (const name of names) {
|
|
4295
4323
|
if (!SAFE_ID.test(name)) continue;
|
|
4324
|
+
if (requestedId !== null && name !== requestedId) continue;
|
|
4296
4325
|
let loaded;
|
|
4297
4326
|
try {
|
|
4298
4327
|
loaded = this._loadTransaction(name);
|