chainlesschain 0.163.2 → 0.163.4
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 +3 -2
- package/scripts/command-lifecycle-report.mjs +330 -38
- package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DB5X7qqV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-DxHRtKLk.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-DIH5QrxT.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-uu0oxVz7.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-BNSMiW9Y.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-DcAzB4_x.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-ClSsvjIc.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-BMciY0js.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-Hn3b57Sh.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-CoSlC53V.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-CFevJ3So.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-B4L4Eu4w.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-C77FgRxF.js} +1 -1
- package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-BrLtJLH3.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-Be7pXXhA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-DuGPecjo.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-CzS66mjP.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-CEhjCoyK.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-D7ir8Vja.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-BcXmuLxf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-Cto1dtBy.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-B7KjgwOX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-COMqxijg.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BZrya-nf.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-AmVeMq0J.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-kZU8c-27.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-sOV22v2-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-BUuLtGCz.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-K-ZxsLsH.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-D3OEnawI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-Bll0gRmP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-DBXwjr53.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-CEzPwEfP.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Bf3DEqP6.js → MarkdownRenderer-CLmCbHx6.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BYyRyOPz.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DVu8w_rM.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-tenuZ_hO.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-Bxgy4ozS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-Dgx1D6sc.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-CRfJ8r8j.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-BBJq4Aiz.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-B3ii9lai.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-FIi-Cubv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-DIq8MPf1.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-BFOD9eGd.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer--41u7vre.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-B_0AWztW.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-B6I7TuXv.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-Cdf6qens.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-B_0FcQJY.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-6nFBjsQp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-nQYV7xpn.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-CBVod5jm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-D52jW1Nt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Bdx3BYhf.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-b7xr4DUa.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DhfifCKx.js +1 -0
- package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-FQKSmc3e.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-CSTrhzcF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend-CxMABOUh.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-Cv2T8yRa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-CE1k4Vvu.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-BNgNcAV_.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-5ZiBZ3ph.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-mDOIF1UV.js} +1 -1
- package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-CtuCTC-e.js} +3 -3
- package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DxFO2Zg7.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CKmKkH9y.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-Bmzl9qkk.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-9RqaWHOC.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-CGdzFIYw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-CvNuCeBT.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B_sLdcnw.js +1 -0
- package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-D9_YijdK.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Cuc7BUSP.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-6VYRnJgd.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-GtK8xd8Y.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-BZ94Lt5W.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-DEcZgDaX.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-CC3z9THe.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-Cvtw8cV3.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-CL4e6Bn3.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-ycEemP27.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-DgZ4X_aw.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-D0qMhSv7.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-DsAg01Zn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-B0oqAhrQ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-CmX0Rabz.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-Be4cn1Ub.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-D5v12kVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-0eWLkQKT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-301ogenv.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-5LGY0JbG.js} +1 -1
- package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index-7VKDn-t1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-8WvYGnON.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-B1YGjOWC.js} +1 -1
- package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-B3mUHuVc.js} +1 -1
- package/src/assets/web-panel/assets/{index--rq90rL9.js → index-BA4oulaP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-BBREnn1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-BBvyHguy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-BKmsS2jj.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-BRIqLy1m.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-BXGSbelg.js} +3 -3
- package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-BaE0Ui07.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-BoAIAZ5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-BqltWojQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-CGiIyTZw.js} +1 -1
- package/src/assets/web-panel/assets/index-CKB0vbJU.js +1 -0
- package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-CZ2wUEgr.js} +1 -1
- package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-CZpfzcuy.js} +1 -1
- package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-Ckrk3pIV.js} +1 -1
- package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-CqoCZ5vR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-CyWBir7N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CyyGTMKd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-D0BSkxYQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-D5YVopyr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-DKUBj36_.js} +1 -1
- package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-DM724NgU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-DQRsQen0.js} +1 -1
- package/src/assets/web-panel/assets/index-DgoXmwqB.js +1 -0
- package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-DikJ0Qqe.js} +1 -1
- package/src/assets/web-panel/assets/{index-caye7AOE.js → index-Dn2dSdXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DyUaFWEk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-Hfe_dEGx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-_JjRLSD0.js} +1 -1
- package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-frSojpHj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-jK3ax6Z6.js} +1 -1
- package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-qMuZ-NRR.js} +1 -1
- package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-q_fQ94SE.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-D4VdhJ9_.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-CZJA0MQW.js} +1 -1
- package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-BqEs7Sb1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-BpHEtsu1.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-BW94tY9W.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-BnBjPWP9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-uUkjQ_hu.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-B-klUqXK.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CvY1cNAs.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-Ix5sEDT2.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-C8qcXOne.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-KNF6Kj8f.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DGJr345n.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-BboN99rI.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-Bgt8Vgte.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-BhJtErgt.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agenda.js +6 -5
- package/src/commands/agent.js +237 -75
- package/src/commands/agents.js +6 -0
- package/src/commands/artifacts.js +98 -0
- package/src/commands/background-session.js +11 -1
- package/src/commands/mcp.js +218 -31
- package/src/commands/review.js +221 -22
- package/src/commands/session-mcp-recovery.js +5 -5
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/ws-agent-handler.js +492 -14
- package/src/harness/jsonl-session-store.js +39 -1
- package/src/harness/mcp-client.js +414 -71
- package/src/harness/prompt-compressor.js +24 -0
- package/src/harness/provider-backed-compaction.js +205 -0
- package/src/harness/worktree-isolator.js +26 -3
- package/src/lib/agent-worktree.js +41 -2
- package/src/lib/app-preview.js +3 -0
- package/src/lib/background-agent-supervisor.js +790 -186
- package/src/lib/background-command-argv.js +318 -0
- package/src/lib/background-launch-profile.js +1 -0
- package/src/lib/background-phase-reporter.js +22 -2
- package/src/lib/background-worktree-policy.js +109 -0
- package/src/lib/command-lifecycle-report.js +1340 -145
- package/src/lib/cowork-mcp-tools.js +51 -6
- package/src/lib/cowork-task-runner.js +1 -0
- package/src/lib/delivery-coordinator.js +30 -5
- package/src/lib/delivery-production-adapter.js +1777 -0
- package/src/lib/delivery-production-runner.js +240 -0
- package/src/lib/durable-security-store.js +29 -17
- package/src/lib/execution-trace/trace-context.cjs +179 -0
- package/src/lib/execution-trace/trace-context.js +8 -175
- package/src/lib/mcp-call-ledger-store.js +58 -6
- package/src/lib/mcp-headers-helper.js +76 -8
- package/src/lib/mcp-host-recovery-runtime.js +2 -0
- package/src/lib/mcp-ledger-recovery-admission.js +39 -3
- package/src/lib/mcp-recovery-adjudication.js +256 -19
- package/src/lib/mcp-sandbox-policy.js +184 -0
- package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
- package/src/lib/mcp-stdio-executable-identity.js +33 -2
- package/src/lib/mcp-stdio-execution-authority.js +163 -0
- package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
- package/src/lib/mcp-stdio-package-materialization.js +721 -333
- package/src/lib/mcp-stdio-workspace-authority.js +252 -0
- package/src/lib/observability/index.js +2 -0
- package/src/lib/observability/otlp-exporter.js +2 -2
- package/src/lib/packer/pack-update-applier.js +8 -1
- package/src/lib/packer/pkg-config-generator.js +34 -0
- package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
- package/src/lib/process-execution-broker/index.js +213 -109
- package/src/lib/process-execution-broker/platform-sandbox.js +1024 -169
- package/src/lib/process-tree-termination.js +17 -1
- package/src/lib/scheduler-kernel/contract.js +315 -0
- package/src/lib/scheduler-kernel/store.js +1345 -0
- package/src/lib/session-host-lease.js +403 -30
- package/src/lib/session-persistence-failure.js +4 -1
- package/src/lib/skill-mcp.js +65 -4
- package/src/lib/sub-agent-context.js +8 -0
- package/src/lib/web-fetch.js +4 -4
- package/src/repl/agent-repl.js +285 -38
- package/src/runtime/agent-core.js +1044 -90
- package/src/runtime/agent-runtime.js +61 -8
- package/src/runtime/headless-runner.js +260 -166
- package/src/runtime/headless-stream.js +254 -25
- package/src/runtime/mcp-config.js +235 -28
- package/src/workers/background-agent-worker.js +492 -71
- package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
- package/src/assets/web-panel/assets/Providers-BGs47s1a.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
- package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
- package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
|
@@ -73,7 +73,7 @@ const _ipcBus = null;
|
|
|
73
73
|
function getTraceCtx() {
|
|
74
74
|
if (!_traceCtx) {
|
|
75
75
|
try {
|
|
76
|
-
_traceCtx = require("../execution-trace/trace-context.
|
|
76
|
+
_traceCtx = require("../execution-trace/trace-context.cjs");
|
|
77
77
|
} catch {
|
|
78
78
|
_traceCtx = null;
|
|
79
79
|
}
|
|
@@ -1218,6 +1218,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1218
1218
|
"entrySnapshotAtomic",
|
|
1219
1219
|
"runtimeLaunchAtomic",
|
|
1220
1220
|
"mcpCapsuleCodeSnapshot",
|
|
1221
|
+
"runtimeDetachedChildSpawnVerified",
|
|
1221
1222
|
]) {
|
|
1222
1223
|
if (
|
|
1223
1224
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1237,6 +1238,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1237
1238
|
"runtimeSnapshotBytes",
|
|
1238
1239
|
"runtimeAttestedBytes",
|
|
1239
1240
|
"entrySnapshotBytes",
|
|
1241
|
+
"capabilityCount",
|
|
1240
1242
|
]) {
|
|
1241
1243
|
if (
|
|
1242
1244
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1320,6 +1322,20 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1320
1322
|
"pluginTreeSnapshotContractBound",
|
|
1321
1323
|
"pluginTreeSnapshotAtomic",
|
|
1322
1324
|
];
|
|
1325
|
+
const nodePluginTreeSnapshotEvidence =
|
|
1326
|
+
plan.runtimeProbe.kind === "linux-bwrap-plugin-node-policy-v1" &&
|
|
1327
|
+
plan.runtimeProbe.targetRuntime === "node" &&
|
|
1328
|
+
plan.runtimeProbe.contentSnapshotScope === "plugin-entry-source";
|
|
1329
|
+
const nativePluginRuntimeEvidence =
|
|
1330
|
+
(plan.runtimeProbe.kind ===
|
|
1331
|
+
"linux-bwrap-plugin-native-static-elf-policy-v1" &&
|
|
1332
|
+
plan.runtimeProbe.targetRuntime === "native-static-elf") ||
|
|
1333
|
+
(plan.runtimeProbe.kind ===
|
|
1334
|
+
"linux-bwrap-plugin-native-dynamic-elf-policy-v1" &&
|
|
1335
|
+
plan.runtimeProbe.targetRuntime === "native-dynamic-elf");
|
|
1336
|
+
const nativePluginTreeSnapshotEvidence =
|
|
1337
|
+
nativePluginRuntimeEvidence &&
|
|
1338
|
+
plan.runtimeProbe.contentSnapshotScope === "plugin-entry-executable";
|
|
1323
1339
|
if (
|
|
1324
1340
|
pluginTreeSnapshot &&
|
|
1325
1341
|
(plan.applied !== true ||
|
|
@@ -1334,11 +1350,10 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1334
1350
|
plan.runtimeProbe.attempted !== true ||
|
|
1335
1351
|
plan.runtimeProbe.runnable !== true ||
|
|
1336
1352
|
plan.runtimeProbe.reason !== null ||
|
|
1337
|
-
|
|
1353
|
+
(!nodePluginTreeSnapshotEvidence &&
|
|
1354
|
+
!nativePluginTreeSnapshotEvidence) ||
|
|
1338
1355
|
plan.runtimeProbe.probeRuntime !== "node" ||
|
|
1339
|
-
plan.runtimeProbe.targetRuntime !== "node" ||
|
|
1340
1356
|
plan.runtimeProbe.contentSnapshot !== true ||
|
|
1341
|
-
plan.runtimeProbe.contentSnapshotScope !== "plugin-entry-source" ||
|
|
1342
1357
|
plan.runtimeProbe.contentSnapshotMechanism !==
|
|
1343
1358
|
"verified-o_tmpfile-copy-bwrap-ro-bind-data-v1" ||
|
|
1344
1359
|
plan.runtimeProbe.handleAtomic !== false ||
|
|
@@ -1382,6 +1397,18 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1382
1397
|
"Sandbox runtime probe plugin tree snapshot evidence requires pluginTreeContentSnapshot",
|
|
1383
1398
|
);
|
|
1384
1399
|
}
|
|
1400
|
+
const successfulNativeProbe =
|
|
1401
|
+
plan.applied === true &&
|
|
1402
|
+
plan.runtimeProbe.attempted === true &&
|
|
1403
|
+
plan.runtimeProbe.runnable === true &&
|
|
1404
|
+
plan.runtimeProbe.reason === null &&
|
|
1405
|
+
nativePluginRuntimeEvidence;
|
|
1406
|
+
if (successfulNativeProbe && !pluginTreeSnapshot) {
|
|
1407
|
+
throw this._sandboxError(
|
|
1408
|
+
"invalid_sandbox_plan",
|
|
1409
|
+
"Successful Linux native plugin evidence requires a complete plugin tree snapshot",
|
|
1410
|
+
);
|
|
1411
|
+
}
|
|
1385
1412
|
const supervisorStringFields = [
|
|
1386
1413
|
"supervisorBindingScope",
|
|
1387
1414
|
"supervisorDescriptorBindingMechanism",
|
|
@@ -1733,6 +1760,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1733
1760
|
plan.runtimeProbe.runtimeLaunchAtomic === true &&
|
|
1734
1761
|
plan.runtimeProbe.runtimeLaunchMechanism ===
|
|
1735
1762
|
"bwrap-descriptor-mount-node-runtime-exec-v1" &&
|
|
1763
|
+
plan.runtimeProbe.runtimeDetachedChildSpawnVerified === true &&
|
|
1736
1764
|
plan.runtimeProbe.supervisorDescriptorBound === true &&
|
|
1737
1765
|
plan.runtimeProbe.pluginTreeContentSnapshot === true &&
|
|
1738
1766
|
plan.runtimeProbe.runtimeLaunchPath ===
|
|
@@ -1769,6 +1797,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1769
1797
|
(backend === "windows-appcontainer-job-restricted-token" &&
|
|
1770
1798
|
plan.runtimeProbe.kind ===
|
|
1771
1799
|
"windows-appcontainer-launch-attestation-v1" &&
|
|
1800
|
+
plan.runtimeProbe.capabilityCount === 0 &&
|
|
1772
1801
|
policyAttested === true &&
|
|
1773
1802
|
policyDigest !== null)) &&
|
|
1774
1803
|
plan.runtimeProbe.contentSnapshotScope ===
|
|
@@ -1804,6 +1833,17 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1804
1833
|
);
|
|
1805
1834
|
}
|
|
1806
1835
|
}
|
|
1836
|
+
if (
|
|
1837
|
+
plan.runtimeProbe.kind ===
|
|
1838
|
+
"windows-appcontainer-launch-attestation-v1" &&
|
|
1839
|
+
plan.runtimeProbe.runnable === true &&
|
|
1840
|
+
plan.runtimeProbe.capabilityCount !== 0
|
|
1841
|
+
) {
|
|
1842
|
+
throw this._sandboxError(
|
|
1843
|
+
"invalid_sandbox_plan",
|
|
1844
|
+
"Windows AppContainer runtime evidence must attest zero capabilities",
|
|
1845
|
+
);
|
|
1846
|
+
}
|
|
1807
1847
|
const genericWorkspaceEvidenceFields = [
|
|
1808
1848
|
"contractDigest",
|
|
1809
1849
|
"policyDigest",
|
|
@@ -2078,6 +2118,9 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2078
2118
|
...(plan.runtimeProbe.targetRuntime !== undefined
|
|
2079
2119
|
? { targetRuntime: plan.runtimeProbe.targetRuntime }
|
|
2080
2120
|
: {}),
|
|
2121
|
+
...(plan.runtimeProbe.capabilityCount !== undefined
|
|
2122
|
+
? { capabilityCount: plan.runtimeProbe.capabilityCount }
|
|
2123
|
+
: {}),
|
|
2081
2124
|
...(plan.runtimeProbe.contentSnapshot !== undefined
|
|
2082
2125
|
? { contentSnapshot: plan.runtimeProbe.contentSnapshot }
|
|
2083
2126
|
: {}),
|
|
@@ -2090,6 +2133,12 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2090
2133
|
...(plan.runtimeProbe.runtimeLaunchAtomic !== undefined
|
|
2091
2134
|
? { runtimeLaunchAtomic: plan.runtimeProbe.runtimeLaunchAtomic }
|
|
2092
2135
|
: {}),
|
|
2136
|
+
...(plan.runtimeProbe.runtimeDetachedChildSpawnVerified !== undefined
|
|
2137
|
+
? {
|
|
2138
|
+
runtimeDetachedChildSpawnVerified:
|
|
2139
|
+
plan.runtimeProbe.runtimeDetachedChildSpawnVerified,
|
|
2140
|
+
}
|
|
2141
|
+
: {}),
|
|
2093
2142
|
...(plan.runtimeProbe.runtimeLaunchMechanism !== undefined
|
|
2094
2143
|
? {
|
|
2095
2144
|
runtimeLaunchMechanism: plan.runtimeProbe.runtimeLaunchMechanism,
|
|
@@ -2585,12 +2634,6 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2585
2634
|
}
|
|
2586
2635
|
|
|
2587
2636
|
_createWorkspaceProcessCloseFence(auditEntry, proc) {
|
|
2588
|
-
if (
|
|
2589
|
-
!Array.isArray(auditEntry.workspaceTransactionIds) ||
|
|
2590
|
-
auditEntry.workspaceTransactionIds.length === 0
|
|
2591
|
-
) {
|
|
2592
|
-
return null;
|
|
2593
|
-
}
|
|
2594
2637
|
return new Promise((resolve) => {
|
|
2595
2638
|
if (typeof proc?.once === "function") {
|
|
2596
2639
|
proc.once("close", (exitCode, signal) => {
|
|
@@ -2612,6 +2655,54 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2612
2655
|
});
|
|
2613
2656
|
}
|
|
2614
2657
|
|
|
2658
|
+
_postSpawnOwnershipError(
|
|
2659
|
+
error,
|
|
2660
|
+
{ proc, auditEntry, workspaceProcessClosed, cleanup },
|
|
2661
|
+
) {
|
|
2662
|
+
let failure =
|
|
2663
|
+
error instanceof Error
|
|
2664
|
+
? error
|
|
2665
|
+
: new Error(String(error || "spawn failed"));
|
|
2666
|
+
if (
|
|
2667
|
+
failure.processTerminationRequested !== true &&
|
|
2668
|
+
failure.workspaceTerminationRequested !== true
|
|
2669
|
+
) {
|
|
2670
|
+
try {
|
|
2671
|
+
if (typeof proc?.once === "function") proc.once("error", () => {});
|
|
2672
|
+
} catch {
|
|
2673
|
+
// Listener installation failure is itself post-spawn evidence.
|
|
2674
|
+
}
|
|
2675
|
+
try {
|
|
2676
|
+
proc?.kill?.("SIGKILL");
|
|
2677
|
+
} catch {
|
|
2678
|
+
// The close fence remains the only settlement authority.
|
|
2679
|
+
}
|
|
2680
|
+
}
|
|
2681
|
+
try {
|
|
2682
|
+
cleanup?.();
|
|
2683
|
+
} catch {
|
|
2684
|
+
// Ownership evidence must survive cleanup reporting failures.
|
|
2685
|
+
}
|
|
2686
|
+
const attach = (target) => {
|
|
2687
|
+
target.auditEntry = auditEntry;
|
|
2688
|
+
target.spawnedProcess = proc;
|
|
2689
|
+
target.workspaceProcessClosed = workspaceProcessClosed;
|
|
2690
|
+
target.workspaceTerminationRequested = true;
|
|
2691
|
+
return target;
|
|
2692
|
+
};
|
|
2693
|
+
try {
|
|
2694
|
+
return attach(failure);
|
|
2695
|
+
} catch {
|
|
2696
|
+
const wrapped = new Error(failure.message || "post-spawn failure", {
|
|
2697
|
+
cause: failure,
|
|
2698
|
+
});
|
|
2699
|
+
wrapped.name = failure.name || wrapped.name;
|
|
2700
|
+
if (failure.code !== undefined) wrapped.code = failure.code;
|
|
2701
|
+
failure = wrapped;
|
|
2702
|
+
return attach(failure);
|
|
2703
|
+
}
|
|
2704
|
+
}
|
|
2705
|
+
|
|
2615
2706
|
_runPostSpawnSandbox(proc, plan, auditEntry) {
|
|
2616
2707
|
if (!plan.applied || !plan.postSpawn.required) {
|
|
2617
2708
|
this._applySandboxAudit(auditEntry, plan, plan.applied);
|
|
@@ -2855,10 +2946,15 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2855
2946
|
|
|
2856
2947
|
_getTraceContext() {
|
|
2857
2948
|
const traceCtx = getTraceCtx();
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2949
|
+
const activeContext = traceCtx?.traceContext?.getCurrentContext?.() || null;
|
|
2950
|
+
if (!activeContext) return null;
|
|
2951
|
+
return {
|
|
2952
|
+
...activeContext,
|
|
2953
|
+
traceparent: traceCtx.traceContext.formatTraceparent(
|
|
2954
|
+
activeContext.traceId,
|
|
2955
|
+
activeContext.spanId,
|
|
2956
|
+
),
|
|
2957
|
+
};
|
|
2862
2958
|
}
|
|
2863
2959
|
|
|
2864
2960
|
_writeRplEntry(auditEntry, status = "started", error = null) {
|
|
@@ -3328,6 +3424,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
3328
3424
|
// Use native spawn from _native (set by patch-child-process.js)
|
|
3329
3425
|
const nativeSpawnFn = this._native?.spawn || nativeSpawn;
|
|
3330
3426
|
let proc;
|
|
3427
|
+
let workspaceProcessClosed = null;
|
|
3331
3428
|
try {
|
|
3332
3429
|
if (mcpStdioExecutableIdentityAuthority !== undefined) {
|
|
3333
3430
|
const admitted = consumeMcpStdioExecutableIdentityAuthority(
|
|
@@ -3341,16 +3438,20 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
3341
3438
|
auditEntry.mcpStdioExecutableIdentityDigest = admitted.identityDigest;
|
|
3342
3439
|
}
|
|
3343
3440
|
proc = nativeSpawnFn(command, args, optsForSpawn);
|
|
3441
|
+
workspaceProcessClosed = this._createWorkspaceProcessCloseFence(
|
|
3442
|
+
auditEntry,
|
|
3443
|
+
proc,
|
|
3444
|
+
);
|
|
3344
3445
|
this._bindWorkspaceTransactionProcess(auditEntry, proc);
|
|
3345
3446
|
} catch (spawnError) {
|
|
3346
|
-
if (proc
|
|
3347
|
-
|
|
3348
|
-
proc
|
|
3349
|
-
|
|
3350
|
-
|
|
3351
|
-
|
|
3352
|
-
|
|
3353
|
-
|
|
3447
|
+
if (proc) {
|
|
3448
|
+
throw this._postSpawnOwnershipError(spawnError, {
|
|
3449
|
+
proc,
|
|
3450
|
+
auditEntry,
|
|
3451
|
+
workspaceProcessClosed,
|
|
3452
|
+
cleanup: sandboxPlan.cleanup,
|
|
3453
|
+
});
|
|
3454
|
+
} else {
|
|
3354
3455
|
try {
|
|
3355
3456
|
this._settleWorkspaceTransactionSpawn(auditEntry, {
|
|
3356
3457
|
error: spawnError.message,
|
|
@@ -3363,102 +3464,105 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
3363
3464
|
throw spawnError;
|
|
3364
3465
|
}
|
|
3365
3466
|
auditEntry.pid = proc.pid;
|
|
3366
|
-
|
|
3367
|
-
auditEntry,
|
|
3368
|
-
proc,
|
|
3369
|
-
);
|
|
3370
|
-
const cleanupSandbox = this._scheduleSandboxCleanup(
|
|
3371
|
-
proc,
|
|
3372
|
-
sandboxPlan.cleanup,
|
|
3373
|
-
);
|
|
3374
|
-
if (
|
|
3375
|
-
sandboxPlan.applied === true &&
|
|
3376
|
-
(sandboxPlan.backend === "linux-bwrap-workspace" ||
|
|
3377
|
-
sandboxPlan.backend === "linux-bwrap" ||
|
|
3378
|
-
sandboxPlan.backend === "linux-fd-code-snapshot") &&
|
|
3379
|
-
sandboxPlan.postSpawn.required === false
|
|
3380
|
-
) {
|
|
3381
|
-
// child_process.spawn() has synchronously duplicated every stdio entry
|
|
3382
|
-
// into the launched process before returning. The generic/direct bwrap
|
|
3383
|
-
// backends and the MCP anonymous-code snapshot backend are complete
|
|
3384
|
-
// pre-spawn plans with no parent-side enforcement handle. Retaining
|
|
3385
|
-
// their pinned descriptors until a long-lived process exits would turn
|
|
3386
|
-
// each child into an avoidable FD leak.
|
|
3387
|
-
cleanupSandbox();
|
|
3388
|
-
}
|
|
3467
|
+
let cleanupSandbox = sandboxPlan.cleanup;
|
|
3389
3468
|
try {
|
|
3390
|
-
this.
|
|
3391
|
-
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3395
|
-
|
|
3396
|
-
|
|
3397
|
-
|
|
3469
|
+
cleanupSandbox = this._scheduleSandboxCleanup(proc, sandboxPlan.cleanup);
|
|
3470
|
+
if (
|
|
3471
|
+
sandboxPlan.applied === true &&
|
|
3472
|
+
(sandboxPlan.backend === "linux-bwrap-workspace" ||
|
|
3473
|
+
sandboxPlan.backend === "linux-bwrap" ||
|
|
3474
|
+
sandboxPlan.backend === "linux-fd-code-snapshot") &&
|
|
3475
|
+
sandboxPlan.postSpawn.required === false
|
|
3476
|
+
) {
|
|
3477
|
+
// child_process.spawn() has synchronously duplicated every stdio entry
|
|
3478
|
+
// into the launched process before returning. The generic/direct bwrap
|
|
3479
|
+
// backends and the MCP anonymous-code snapshot backend are complete
|
|
3480
|
+
// pre-spawn plans with no parent-side enforcement handle. Retaining
|
|
3481
|
+
// their pinned descriptors until a long-lived process exits would turn
|
|
3482
|
+
// each child into an avoidable FD leak.
|
|
3483
|
+
cleanupSandbox();
|
|
3398
3484
|
}
|
|
3399
|
-
|
|
3400
|
-
|
|
3401
|
-
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
|
|
3485
|
+
try {
|
|
3486
|
+
this._runPostSpawnSandbox(proc, sandboxPlan, auditEntry);
|
|
3487
|
+
this._updateWorkspaceTransactionProcessGuarantees(auditEntry);
|
|
3488
|
+
auditEntry.pid = proc.pid;
|
|
3489
|
+
if (Number.isSafeInteger(proc.sandboxWrapperPid)) {
|
|
3490
|
+
auditEntry.sandboxWrapperPid = proc.sandboxWrapperPid;
|
|
3491
|
+
}
|
|
3492
|
+
if (Number.isSafeInteger(proc.sandboxTargetPid)) {
|
|
3493
|
+
auditEntry.sandboxTargetPid = proc.sandboxTargetPid;
|
|
3494
|
+
}
|
|
3495
|
+
} catch (postSpawnError) {
|
|
3496
|
+
if (postSpawnError.processTerminationRequested !== true) {
|
|
3497
|
+
try {
|
|
3498
|
+
proc.kill?.("SIGKILL");
|
|
3499
|
+
} catch {
|
|
3500
|
+
// The close fence remains pending and recovery stays fail-closed.
|
|
3501
|
+
}
|
|
3405
3502
|
}
|
|
3503
|
+
cleanupSandbox();
|
|
3504
|
+
this._recordSandboxDenial(auditEntry, postSpawnError, startTime);
|
|
3505
|
+
postSpawnError.auditEntry = auditEntry;
|
|
3506
|
+
postSpawnError.spawnedProcess = proc;
|
|
3507
|
+
postSpawnError.workspaceProcessClosed = workspaceProcessClosed;
|
|
3508
|
+
postSpawnError.workspaceTerminationRequested = true;
|
|
3509
|
+
throw postSpawnError;
|
|
3406
3510
|
}
|
|
3407
|
-
cleanupSandbox();
|
|
3408
|
-
this._recordSandboxDenial(auditEntry, postSpawnError, startTime);
|
|
3409
|
-
postSpawnError.auditEntry = auditEntry;
|
|
3410
|
-
postSpawnError.spawnedProcess = proc;
|
|
3411
|
-
postSpawnError.workspaceProcessClosed = workspaceProcessClosed;
|
|
3412
|
-
postSpawnError.workspaceTerminationRequested = true;
|
|
3413
|
-
throw postSpawnError;
|
|
3414
|
-
}
|
|
3415
|
-
|
|
3416
|
-
this._recordAudit(auditEntry);
|
|
3417
|
-
this._writeRplEntry(auditEntry, "started");
|
|
3418
|
-
this._emitHooksEvent("tool:start", {
|
|
3419
|
-
executionId,
|
|
3420
|
-
toolName: origin,
|
|
3421
|
-
command,
|
|
3422
|
-
args: [...auditEntry.args],
|
|
3423
|
-
cwd,
|
|
3424
|
-
pid: proc.pid,
|
|
3425
|
-
component: origin,
|
|
3426
|
-
});
|
|
3427
3511
|
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
auditEntry.signal = signal;
|
|
3432
|
-
auditEntry.endTime = endTime;
|
|
3433
|
-
auditEntry.durationMs = endTime - startTime;
|
|
3434
|
-
this._writeRplEntry(auditEntry, "completed");
|
|
3435
|
-
this._emitHooksEvent("tool:end", {
|
|
3512
|
+
this._recordAudit(auditEntry);
|
|
3513
|
+
this._writeRplEntry(auditEntry, "started");
|
|
3514
|
+
this._emitHooksEvent("tool:start", {
|
|
3436
3515
|
executionId,
|
|
3437
|
-
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3516
|
+
toolName: origin,
|
|
3517
|
+
command,
|
|
3518
|
+
args: [...auditEntry.args],
|
|
3519
|
+
cwd,
|
|
3520
|
+
pid: proc.pid,
|
|
3441
3521
|
component: origin,
|
|
3442
3522
|
});
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3523
|
+
|
|
3524
|
+
proc.on("exit", (code, signal) => {
|
|
3525
|
+
const endTime = Date.now();
|
|
3526
|
+
auditEntry.exitCode = code;
|
|
3527
|
+
auditEntry.signal = signal;
|
|
3528
|
+
auditEntry.endTime = endTime;
|
|
3529
|
+
auditEntry.durationMs = endTime - startTime;
|
|
3530
|
+
this._writeRplEntry(auditEntry, "completed");
|
|
3531
|
+
this._emitHooksEvent("tool:end", {
|
|
3532
|
+
executionId,
|
|
3533
|
+
success: code === 0,
|
|
3534
|
+
exitCode: code,
|
|
3535
|
+
signal,
|
|
3536
|
+
durationMs: auditEntry.durationMs,
|
|
3537
|
+
component: origin,
|
|
3538
|
+
});
|
|
3539
|
+
this.emit("exit", auditEntry);
|
|
3455
3540
|
});
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3541
|
+
proc.on("error", (err) => {
|
|
3542
|
+
auditEntry.error = err.message;
|
|
3543
|
+
auditEntry.endTime = Date.now();
|
|
3544
|
+
auditEntry.durationMs = auditEntry.endTime - startTime;
|
|
3545
|
+
this._writeRplEntry(auditEntry, "error", err);
|
|
3546
|
+
this._emitHooksEvent("tool:end", {
|
|
3547
|
+
executionId,
|
|
3548
|
+
success: false,
|
|
3549
|
+
error: err.message,
|
|
3550
|
+
component: origin,
|
|
3551
|
+
});
|
|
3552
|
+
// EventEmitter treats an unhandled `error` event as an exception. A
|
|
3553
|
+
// process ENOENT must reach the child-process listener/callback instead
|
|
3554
|
+
// of crashing callers that did not subscribe to broker diagnostics.
|
|
3555
|
+
if (this.listenerCount("error") > 0) this.emit("error", auditEntry);
|
|
3556
|
+
});
|
|
3557
|
+
return proc;
|
|
3558
|
+
} catch (postNativeError) {
|
|
3559
|
+
throw this._postSpawnOwnershipError(postNativeError, {
|
|
3560
|
+
proc,
|
|
3561
|
+
auditEntry,
|
|
3562
|
+
workspaceProcessClosed,
|
|
3563
|
+
cleanup: cleanupSandbox,
|
|
3564
|
+
});
|
|
3565
|
+
}
|
|
3462
3566
|
}
|
|
3463
3567
|
|
|
3464
3568
|
spawnSync(command, args, options = {}) {
|