chainlesschain 0.164.0 → 0.165.2
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 +248 -2
- package/package.json +7 -4
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-D2MEn7fI.js → AIOps-lS1R0Cza.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-lCW_4Gf0.js → ActionButton-BmlgBPsj.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bs7i-nsS.js → Analytics-CNKczv1S.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CK7B6S_j.js → AppLayout-BuZGJARQ.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C8ILjpyo.js → Artifacts-Dm73Sl-O.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bb9cNaWc.js → Audit-BGMW7A5e.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-sC9ooXIf.js → BackgroundAgents-BQ6M54JR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D-DrsplT.js → Backup-DBzGP0bR.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-uCNZpwSK.js → BaseInput-D1mLCoOV.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CsDK1uE9.js → Chat-BUfcN7p8.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-OqSDt50w.js → ChatBubbleRenderer-CY5m8ZHg.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-JhTXM1-K.js → Checkbox-Du0Yg5Pi.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BbzZLnyD.js → Codegen-B2RXziHW.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D4VW4m4j.js → Col-DWhekOrR.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BXrYawxV.js → Community-HQhrkon4.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DCihGy1u.js → Compact-izHNb4uz.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DlyZ-lk8.js → Compliance-BDwLy41-.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DvGZrhbO.js → Cowork-DFJhLa7K.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DUncZi8h.js → Cron-DYY9RG7-.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C_hLuUcm.js → Crosschain-rr7tJTtv.js} +1 -1
- package/src/assets/web-panel/assets/{DID-b6YSUqxr.js → DID-D2sfHRLi.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-uvM15Cfb.js → Dashboard-q_eGdhha.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D1-Nd4qY.js → Dropdown-Cufrh2Bz.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-8ApvL6Zc.js → EmailListRenderer-B-kdv10f.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-LYJt8811.js → FamilyGuardDashboard-D21XjgfG.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BbI3HGpv.js → Federation-CAwRTLZH.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DSoEKuFu.js → FormItemContext-vx3daNDF.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B0S9OWd5.js → GenericCardRenderer-CRWY2wU4.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DIs9Zhf3.js → Git-Q6SwauyD.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-jzZXrxcl.js → Governance-BJ1q4IQZ.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-JUPjf2ZI.js → Inference-CSWjROgD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DxnfJvlP.js → KnowledgeGraph-fzuQsWuY.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-iXiz8BEE.js → Logs-DVF8Mnns.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Y3Xch312.js → Marketplace-BQP7LOA4.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D7kGGbO7.js → McpTools-BNlJCmNc.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-Do_hVxzh.js → Memory-DLLg5WQ4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CtrR0Tas.js → MobileBridge-CR2skNAF.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BxVavObl.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-qo5QCTGd.js → Mtc-B17pgqMI.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-cq5mnjYj.js → MtcAudit-4UmV5cIL.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Bq0MAQHw.js → Multisig-DoMEXEcU.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DdWE6Vi2.js → NLProgramming-h9DMXFX4.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BxMBFcIp.js → Notes-Cihn-xX8.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-RTrAcbUe.js → NotificationSettings-BE6ZGa3R.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DJbpGqzT.js → OrderTableRenderer-CnwojoSI.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-SQzIPdqC.js → Organization-B2vpwmjb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-02yECh22.js → Overflow-C4z28R0-.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BNg4pNCM.js → P2P-BVlFkwhW.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BxPJZsD3.js → PdhVaultBrowser-BXbEdL5B.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CLnDnPAz.js → Permissions-C28xs4lp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C5m0AjGf.js → PersonalDataHub-Dgl_rBjM.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-VwOf5Dhv.js → Pipeline-3QUIhrKI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CC0W2hZd.js → Privacy-8Gh33OZ5.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Dz893Bob.js → ProjectInit-BNmg4tZi.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CxQkvl0k.js → ProjectSettings-vgMfeCf9.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BhtAVilc.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DeB9IkxK.js → Providers-CXoOa8eX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-OCeoaswn.js → QrScannerModal-BhfTF0oS.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DenotaAj.js → QuickAsk-C746HEAj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cies_jjI.js → Recommend-BSej8Eo0.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-f3gmnlG3.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-CW0mvxgZ.js → Reputation-CyvybpkN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-SEd32qZU.js → Row-DwV2PeYn.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BSwnJ3Lm.js → RssFeed-11GrzjZy.js} +3 -3
- package/src/assets/web-panel/assets/{Search-xe2m8bkC.js → Search-BjKXkrAY.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Mq2F9Nro.js → Security-eWiFb9Yk.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BKGw2V3P.js → Services-CdCsMAtt.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DW95-Rxf.js → Skeleton-4Q2UTKQ5.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CHgChCv_.js → Skills-v4rtYrRj.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-tKh6k3R7.js → Sla-CRhsFvd_.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-D0Fw8fVL.js → SyncSettings-D16zonl7.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-20x1GB3D.js → Tasks-Xxozz0i_.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DJ-lts-a.js → Templates-CXJpPtCT.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BFdGpbs7.js → Tenant-XRV0L1ZF.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Xpx61vHL.js → Terminal-CYuO1i_w.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C6UIvyZQ.js → TimelineRenderer-BXqitWsu.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Dellq08f.js → Tokens-BvPrDHIy.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-VKw8d0J-.js → Trigger-DhCrSTf5.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DNftdKT5.js → Trust-DmsuZD6K.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DX9VAKJI.js → UkeySign-D_yrts5C.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B2h3jO8q.js → VideoEditing-B01ihPrm.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CjGkof7f.js → Wallet-DpUjKa-N.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-2Zfcu55P.js → WebAuthn-CL07yON6.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-B9eZ8UxZ.js → WorkflowEditor-CLMflnRr.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CQNfD-YO.js → chat-DtUqe8h_.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D4usyFT2.js → colors-DPKrgVfy.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-s4TpjvjX.js → compact-item-BTt2GtOm.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BRCSvYxj.js → createContext-D_VeUc1J.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-AdkUbkV-.js → hasIn-1kndiylj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIoG5yYf.js → index-2eyAXE3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-nXyk8GZ9.js → index-4bna2_SR.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2V-eKfK.js → index-8nz_fmlj.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_XBHopw.js → index-B9KvcS7R.js} +1 -1
- package/src/assets/web-panel/assets/{index-s_buFMEG.js → index-BAXfRKfG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZT36ZYq.js → index-BHpBMWCh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMcimU-2.js → index-BaZAbw9A.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzRjHxEv.js → index-BepLZwgB.js} +1 -1
- package/src/assets/web-panel/assets/{index--00U6vXZ.js → index-Bhudc_Ez.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7Y8Aluc.js → index-BlDNVgBt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtobShro.js → index-By5n8up9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cvyt-zhm.js → index-CHG-KcS4.js} +1 -1
- package/src/assets/web-panel/assets/index-CPcM-eqo.js +1 -0
- package/src/assets/web-panel/assets/{index-MMN9V6JF.js → index-CX81qSM4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bad4VNvz.js → index-CauoBQkH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCsM_Ybx.js → index-CcO04eDn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DARsAyUp.js → index-CtF7EN49.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5KAQFPQ.js → index-CzjkKUmR.js} +1 -1
- package/src/assets/web-panel/assets/{index-RfMr79MW.js → index-D95OFht7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdCB70SS.js → index-DFIZ_1Sf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYdoQsa1.js → index-DG2MZQ3f.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPhkFZ1I.js → index-DJ8vXGOa.js} +1 -1
- package/src/assets/web-panel/assets/{index-_IRVsV9X.js → index-Dbbymxpj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVKfQ0Ux.js → index-DdkplL9R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkwiSLhU.js → index-DfGl8CqG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJVEOa4i.js → index-DfKBRdSS.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1mJtE6q.js → index-DsJCDUJG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgiXR_-_.js → index-Dwqmtk65.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJCFe2Qf.js → index-DxdTdBix.js} +1 -1
- package/src/assets/web-panel/assets/{index-C484EJiS.js → index-FzdwcSy2.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4JJCfQ2.js → index-GsoUQ2M7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQhAVU5t.js → index-brCInrzq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKC1t3Ic.js → index-dVc-CXY4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQ3DXBtD.js → index-fk2Rjacw.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cduu2Hhr.js → index-l1BETrDb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw2MEnUk.js → index-m31Ka8hZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2GjI2oe.js → index-ocf06EVQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJdQrZth.js → index-sDoMHTNA.js} +1 -1
- package/src/assets/web-panel/assets/index-xeSyVoRe.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-Blmpk7HL.js → initDefaultProps-CvyYJd7z.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DPBJMv1n.js → motion-DYZkhUdz.js} +1 -1
- package/src/assets/web-panel/assets/{move-ButdzCM7.js → move-slnJRVT1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-cyRC_QCe.js → mtc-parser-DVc0CKmy.js} +1 -1
- package/src/assets/web-panel/assets/{omit-1epSV7hz.js → omit-BCXAtHCq.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DuPY8xJs.js → pickAttrs-DBsemz_K.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-6XZqarhe.js → placementArrow-BRtkJ-nv.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B40pXBWM.js → responsiveObserve-Cebq7EZn.js} +1 -1
- package/src/assets/web-panel/assets/{slide-jbZ9Wu4n.js → slide-DT7qvId2.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BKQQcVy4.js → statusUtils-pQiITLkG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-NiKfWjUT.js → styleChecker-c-19BVKQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-bQUCvPeb.js → useFlexGapSupport-DsS5-0bE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CUGji7ph.js → useFs-CxGiMe5n.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-4veyN2N2.js → usePersonalDataHub-D9btVID5.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-1-nLug-Z.js → vnode-CUYFsFEN.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-dhCeRDMo.js → zoom-CXmn_35j.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/cowork.js +559 -62
- package/src/commands/plugin.js +819 -64
- package/src/commands/session-location.js +318 -7
- package/src/constants.js +2 -2
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/action-protocol.js +293 -19
- package/src/gateways/ws/message-dispatcher.js +30 -0
- package/src/gateways/ws/remote-session-protocol.js +542 -35
- package/src/gateways/ws/ws-approval-gate.js +5 -0
- package/src/gateways/ws/ws-server.js +462 -38
- package/src/harness/jsonl-session-store.js +638 -2
- package/src/harness/prompt-compressor.js +4 -0
- package/src/harness/remote-session-audit.js +1 -0
- package/src/harness/remote-session-crypto.js +750 -50
- package/src/harness/remote-session-registry.js +795 -27
- package/src/lib/auto-mode-config.js +98 -3
- package/src/lib/background-agent-keeper-client.js +29 -0
- package/src/lib/background-agent-keeper-protocol.js +158 -10
- package/src/lib/background-agent-supervisor.js +870 -48
- package/src/lib/background-session-transport.js +23 -6
- package/src/lib/background-turn-bootstrap-protocol.js +64 -0
- package/src/lib/cowork-task-runner.js +70 -0
- package/src/lib/cowork-workflow.js +887 -62
- package/src/lib/delivery-production-adapter.js +38 -2
- package/src/lib/doctor-checkup.js +34 -10
- package/src/lib/dynamic-workflow-draft.js +535 -0
- package/src/lib/dynamic-workflow-facade.js +1105 -17
- package/src/lib/dynamic-workflow-runtime.js +2974 -0
- package/src/lib/execution-location-contract.js +111 -7
- package/src/lib/execution-location-runtime.js +3 -1
- package/src/lib/execution-location-target.js +910 -0
- package/src/lib/llm-providers.js +1 -0
- package/src/lib/mcp-call-ledger-store.js +35 -0
- package/src/lib/mcp-call-ledger.js +30 -0
- package/src/lib/mcp-stdio-package-materialization.js +1 -1
- package/src/lib/plugin-runtime/__tests__/remote-source.test.js +34 -16
- package/src/lib/plugin-runtime/install.js +4956 -657
- package/src/lib/plugin-runtime/manifest.js +3 -1
- package/src/lib/plugin-runtime/marketplace-artifact-readback.js +671 -31
- package/src/lib/plugin-runtime/marketplace-catalog.js +68 -2
- package/src/lib/plugin-runtime/marketplace-impact.js +208 -15
- package/src/lib/plugin-runtime/marketplace-network.js +317 -0
- package/src/lib/plugin-runtime/marketplace-pac-worker.js +15 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +25 -2
- package/src/lib/plugin-runtime/marketplace-source-cache.js +359 -0
- package/src/lib/plugin-runtime/policy.js +21 -6
- package/src/lib/plugin-runtime/publisher-trust.js +332 -0
- package/src/lib/plugin-runtime/remote-source.js +323 -27
- package/src/lib/plugin-runtime/scopes.js +317 -41
- package/src/lib/plugin-runtime/transaction-journal.js +806 -0
- package/src/lib/public-ide-capability-manifest.js +1 -1
- package/src/lib/remote-approval-bridge.js +745 -108
- package/src/lib/remote-control.js +2 -0
- package/src/lib/remote-membership-coordinator.js +612 -46
- package/src/lib/remote-membership-host-store.js +59 -10
- package/src/lib/runtime-provenance-ledger.js +171 -46
- package/src/lib/shell-approval.js +169 -6
- package/src/lib/sub-agent-context.js +268 -2
- package/src/lib/task-model-selector.js +1 -1
- package/src/lib/with-file-lock.js +167 -42
- package/src/repl/agent-repl.js +70 -29
- package/src/repl/remote-approval.js +29 -7
- package/src/runtime/agent-core.js +1695 -194
- package/src/runtime/headless-runner.js +22 -5
- package/src/runtime/headless-stream.js +19 -3
- package/src/workers/background-agent-keeper.js +279 -58
- package/src/workers/background-agent-worker.js +7 -0
- package/src/workers/background-turn-bootstrap.js +29 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-GmB6DOr6.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +0 -1
- package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Dxzl5n2T.js +0 -5
- package/src/assets/web-panel/assets/SpeechSettings-D6UL3dA5.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +0 -1
- package/src/assets/web-panel/assets/index-C61cnl3K.js +0 -1
- package/src/assets/web-panel/assets/index-D4XFHxBr.js +0 -1
|
@@ -25,15 +25,18 @@
|
|
|
25
25
|
|
|
26
26
|
import net from "node:net";
|
|
27
27
|
import { unlinkSync } from "node:fs";
|
|
28
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
backgroundAgentSessionPipePath,
|
|
30
|
+
cleanupBackgroundAgentLocalPipeDirectory,
|
|
31
|
+
prepareBackgroundAgentLocalPipePath,
|
|
32
|
+
} from "./background-agent-keeper-protocol.js";
|
|
29
33
|
|
|
30
34
|
const HELLO_TIMEOUT_MS = 5000;
|
|
31
35
|
const MAX_LINE_BYTES = 1024 * 1024;
|
|
32
36
|
|
|
33
37
|
/** Pipe endpoint for a session id (Windows named pipe / POSIX socket file). */
|
|
34
|
-
export function transportPipePath(id, dir) {
|
|
35
|
-
|
|
36
|
-
return join(dir, `${id}.sock`);
|
|
38
|
+
export function transportPipePath(id, dir, options = {}) {
|
|
39
|
+
return backgroundAgentSessionPipePath(id, dir, options);
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
/**
|
|
@@ -106,6 +109,7 @@ export function startBackgroundSessionServer(opts) {
|
|
|
106
109
|
getStatus,
|
|
107
110
|
} = opts;
|
|
108
111
|
const pipePath = opts.pipePath || transportPipePath(id, dir);
|
|
112
|
+
prepareBackgroundAgentLocalPipePath(pipePath);
|
|
109
113
|
if (process.platform !== "win32") {
|
|
110
114
|
try {
|
|
111
115
|
unlinkSync(pipePath); // stale socket from a crashed prior worker
|
|
@@ -259,9 +263,17 @@ export function startBackgroundSessionServer(opts) {
|
|
|
259
263
|
});
|
|
260
264
|
|
|
261
265
|
return new Promise((resolve, reject) => {
|
|
262
|
-
|
|
266
|
+
const rejectListen = (error) => {
|
|
267
|
+
try {
|
|
268
|
+
cleanupBackgroundAgentLocalPipeDirectory(pipePath);
|
|
269
|
+
} catch {
|
|
270
|
+
/* preserve the original listen error */
|
|
271
|
+
}
|
|
272
|
+
reject(error);
|
|
273
|
+
};
|
|
274
|
+
server.once("error", rejectListen);
|
|
263
275
|
server.listen(pipePath, () => {
|
|
264
|
-
server.removeListener("error",
|
|
276
|
+
server.removeListener("error", rejectListen);
|
|
265
277
|
server.on("error", () => {
|
|
266
278
|
/* post-listen errors must not crash the worker */
|
|
267
279
|
});
|
|
@@ -299,6 +311,11 @@ export function startBackgroundSessionServer(opts) {
|
|
|
299
311
|
} catch {
|
|
300
312
|
/* already gone */
|
|
301
313
|
}
|
|
314
|
+
try {
|
|
315
|
+
cleanupBackgroundAgentLocalPipeDirectory(pipePath);
|
|
316
|
+
} catch {
|
|
317
|
+
/* best-effort cleanup after the server has closed */
|
|
318
|
+
}
|
|
302
319
|
}
|
|
303
320
|
done();
|
|
304
321
|
});
|
|
@@ -124,3 +124,67 @@ export function clearBackgroundTurnBootstrapEnvironment(environment) {
|
|
|
124
124
|
delete environment[key];
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Freeze a released POSIX turn in its detached process group when its worker
|
|
130
|
+
* disappears. The worker's detached-spawn contract makes the positive current
|
|
131
|
+
* PID the group ID; using its negative form fails with ESRCH if that invariant
|
|
132
|
+
* is ever broken instead of stopping an unrelated worker/runner group.
|
|
133
|
+
*
|
|
134
|
+
* Register the SIGCONT fail-safe before SIGSTOP because Node's process.kill()
|
|
135
|
+
* can return to JavaScript before the stop is delivered. If the group is ever
|
|
136
|
+
* resumed, immediately SIGKILL it instead of letting the Agent or one of its
|
|
137
|
+
* descendants continue without supervision.
|
|
138
|
+
*/
|
|
139
|
+
export function containReleasedBackgroundTurnDisconnect(options = {}) {
|
|
140
|
+
const released = options.released === true;
|
|
141
|
+
const platform = options.platform || process.platform;
|
|
142
|
+
const currentPid = Number(options.currentPid ?? process.pid);
|
|
143
|
+
const signalProcessGroup =
|
|
144
|
+
options.signalProcessGroup || process.kill.bind(process);
|
|
145
|
+
const resumeSignalTarget = options.resumeSignalTarget || process;
|
|
146
|
+
const onResumedKillFailure =
|
|
147
|
+
options.onResumedKillFailure || (() => process.exit(1));
|
|
148
|
+
if (
|
|
149
|
+
!released ||
|
|
150
|
+
platform === "win32" ||
|
|
151
|
+
!Number.isSafeInteger(currentPid) ||
|
|
152
|
+
currentPid <= 0
|
|
153
|
+
) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const groupPid = -currentPid;
|
|
157
|
+
const killAfterResume = () => {
|
|
158
|
+
try {
|
|
159
|
+
signalProcessGroup(groupPid, "SIGKILL");
|
|
160
|
+
} catch {
|
|
161
|
+
onResumedKillFailure();
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
try {
|
|
165
|
+
resumeSignalTarget.once("SIGCONT", killAfterResume);
|
|
166
|
+
} catch {
|
|
167
|
+
try {
|
|
168
|
+
signalProcessGroup(groupPid, "SIGKILL");
|
|
169
|
+
return true;
|
|
170
|
+
} catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
signalProcessGroup(groupPid, "SIGSTOP");
|
|
176
|
+
return true;
|
|
177
|
+
} catch {
|
|
178
|
+
try {
|
|
179
|
+
resumeSignalTarget.removeListener("SIGCONT", killAfterResume);
|
|
180
|
+
} catch {
|
|
181
|
+
// The same group SIGKILL below remains the containment fallback.
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
signalProcessGroup(groupPid, "SIGKILL");
|
|
185
|
+
return true;
|
|
186
|
+
} catch {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -58,6 +58,7 @@ export const _deps = {
|
|
|
58
58
|
|
|
59
59
|
const DEFAULT_MAX_ITERATIONS = 50;
|
|
60
60
|
const DEFAULT_TOKEN_BUDGET = 100_000;
|
|
61
|
+
const WORKFLOW_EFFECT_ID_RE = /^sha256:[a-f0-9]{64}$/;
|
|
61
62
|
const COWORK_MCP_CALL_LEDGER_UNSUPPORTED =
|
|
62
63
|
"CC_COWORK_MCP_CALL_LEDGER_UNSUPPORTED";
|
|
63
64
|
const COWORK_MCP_SESSION_UNVERIFIED = "CC_COWORK_MCP_SESSION_UNVERIFIED";
|
|
@@ -74,6 +75,44 @@ function coworkMcpAdmissionError(code, message, sessionId, cause = null) {
|
|
|
74
75
|
return error;
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
function assertWorkflowEffectId(value) {
|
|
79
|
+
if (value == null) return;
|
|
80
|
+
if (typeof value !== "string" || !WORKFLOW_EFFECT_ID_RE.test(value)) {
|
|
81
|
+
const error = new TypeError(
|
|
82
|
+
"workflowEffectId must be a canonical sha256 identity",
|
|
83
|
+
);
|
|
84
|
+
error.code = "CC_COWORK_WORKFLOW_EFFECT_ID_INVALID";
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function workflowEffectEvidence(subAgent, workflowEffectId) {
|
|
90
|
+
if (!workflowEffectId) return {};
|
|
91
|
+
const attempts =
|
|
92
|
+
typeof subAgent?.providerRequestAttempts === "function"
|
|
93
|
+
? subAgent.providerRequestAttempts()
|
|
94
|
+
: [];
|
|
95
|
+
const receipts =
|
|
96
|
+
typeof subAgent?.providerRequestReceipts === "function"
|
|
97
|
+
? subAgent.providerRequestReceipts()
|
|
98
|
+
: [];
|
|
99
|
+
const nestedEffectAttempts =
|
|
100
|
+
typeof subAgent?.nestedEffectAttempts === "function"
|
|
101
|
+
? subAgent.nestedEffectAttempts()
|
|
102
|
+
: [];
|
|
103
|
+
const nestedEffectSettlements =
|
|
104
|
+
typeof subAgent?.nestedEffectSettlements === "function"
|
|
105
|
+
? subAgent.nestedEffectSettlements()
|
|
106
|
+
: [];
|
|
107
|
+
return {
|
|
108
|
+
workflowEffectId,
|
|
109
|
+
providerRequestAttempts: attempts,
|
|
110
|
+
providerRequestReceipts: receipts,
|
|
111
|
+
nestedEffectAttempts,
|
|
112
|
+
nestedEffectSettlements,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
77
116
|
function assertCoworkMcpEventUsageAdmission(event, sessionId) {
|
|
78
117
|
if (event?.type !== "session_start") return;
|
|
79
118
|
const data =
|
|
@@ -477,6 +516,12 @@ export function prepareCoworkMcpRuntime(mcp, options = {}) {
|
|
|
477
516
|
* @param {number} [options.maxIterations] - Override iteration limit
|
|
478
517
|
* @param {number} [options.tokenBudget] - Override token budget
|
|
479
518
|
* @param {string} [options.mcpSessionId] - Stable MCP ledger session for resume
|
|
519
|
+
* @param {string} [options.workflowEffectId] - Canonical durable workflow effect
|
|
520
|
+
* @param {boolean} [options.strictUsageTelemetry] - Require synchronous durable call observers
|
|
521
|
+
* @param {function} [options.onUsageBoundary] - Provider-call durable start observer
|
|
522
|
+
* @param {function} [options.onUsageSettlement] - Provider-call durable settlement observer
|
|
523
|
+
* @param {function} [options.onToolCallBoundary] - Tool-call durable start observer
|
|
524
|
+
* @param {function} [options.onToolCallSettlement] - Tool-call durable settlement observer
|
|
480
525
|
* @param {(request: object) => boolean|Promise<boolean>} [options.approveMcpLocalCodeExecution]
|
|
481
526
|
* @returns {Promise<{ taskId: string, status: string, result: object }>}
|
|
482
527
|
*/
|
|
@@ -493,12 +538,19 @@ export async function runCoworkTask(options = {}) {
|
|
|
493
538
|
onProgress = null,
|
|
494
539
|
signal = null,
|
|
495
540
|
mcpSessionId = null,
|
|
541
|
+
workflowEffectId = null,
|
|
542
|
+
strictUsageTelemetry = false,
|
|
543
|
+
onUsageBoundary = null,
|
|
544
|
+
onUsageSettlement = null,
|
|
545
|
+
onToolCallBoundary = null,
|
|
546
|
+
onToolCallSettlement = null,
|
|
496
547
|
approveMcpLocalCodeExecution = null,
|
|
497
548
|
} = options;
|
|
498
549
|
|
|
499
550
|
if (!userMessage || typeof userMessage !== "string") {
|
|
500
551
|
throw new Error("userMessage is required");
|
|
501
552
|
}
|
|
553
|
+
assertWorkflowEffectId(workflowEffectId);
|
|
502
554
|
|
|
503
555
|
// An explicit canonical authority must be admitted before mounting local MCP
|
|
504
556
|
// servers, constructing a child context, or making any provider call.
|
|
@@ -582,6 +634,16 @@ export async function runCoworkTask(options = {}) {
|
|
|
582
634
|
cwd,
|
|
583
635
|
onProgress,
|
|
584
636
|
signal,
|
|
637
|
+
...(workflowEffectId ? { workflowEffectId } : {}),
|
|
638
|
+
...(strictUsageTelemetry
|
|
639
|
+
? {
|
|
640
|
+
strictUsageTelemetry: true,
|
|
641
|
+
onUsageBoundary,
|
|
642
|
+
onUsageSettlement,
|
|
643
|
+
onToolCallBoundary,
|
|
644
|
+
onToolCallSettlement,
|
|
645
|
+
}
|
|
646
|
+
: {}),
|
|
585
647
|
extraToolDefinitions: mcp.extraToolDefinitions,
|
|
586
648
|
externalToolDescriptors: mcp.externalToolDescriptors,
|
|
587
649
|
externalToolExecutors: mcp.externalToolExecutors,
|
|
@@ -632,17 +694,25 @@ export async function runCoworkTask(options = {}) {
|
|
|
632
694
|
templateId: template.id,
|
|
633
695
|
templateName: template.name,
|
|
634
696
|
...(mcpRuntime.sessionId ? { mcpSessionId: mcpRuntime.sessionId } : {}),
|
|
697
|
+
...workflowEffectEvidence(subAgent, workflowEffectId),
|
|
635
698
|
result,
|
|
636
699
|
};
|
|
637
700
|
_appendHistory(cwd, entry, userMessage);
|
|
638
701
|
return entry;
|
|
639
702
|
} catch (err) {
|
|
703
|
+
// A durable workflow already marked this outer effect as dispatched.
|
|
704
|
+
// Converting a child/provider exception into an ordinary failed result
|
|
705
|
+
// would authorize the step retry path even though the physical provider
|
|
706
|
+
// outcome may be unknown. Propagate so the runtime keeps it pending and
|
|
707
|
+
// requires reconciliation.
|
|
708
|
+
if (workflowEffectId) throw err;
|
|
640
709
|
const entry = {
|
|
641
710
|
taskId,
|
|
642
711
|
status: "failed",
|
|
643
712
|
templateId: template.id,
|
|
644
713
|
templateName: template.name,
|
|
645
714
|
...(mcpRuntime.sessionId ? { mcpSessionId: mcpRuntime.sessionId } : {}),
|
|
715
|
+
...workflowEffectEvidence(subAgent, workflowEffectId),
|
|
646
716
|
result: {
|
|
647
717
|
summary: `Task failed: ${err.message}`,
|
|
648
718
|
artifacts: [],
|