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
|
@@ -284,6 +284,31 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
|
|
|
284
284
|
const isActive =
|
|
285
285
|
typeof opts.isActive === "function" ? opts.isActive : () => true;
|
|
286
286
|
let confirm = null;
|
|
287
|
+
let authorizationConsumerRequired = false;
|
|
288
|
+
const authorityConfig = Object.freeze({
|
|
289
|
+
map: Object.freeze(
|
|
290
|
+
Object.fromEntries(
|
|
291
|
+
RISK_LEVELS.map((riskLevel) => [
|
|
292
|
+
riskLevel,
|
|
293
|
+
Object.freeze({
|
|
294
|
+
decision: map[riskLevel]?.decision || null,
|
|
295
|
+
reason: map[riskLevel]?.reason || null,
|
|
296
|
+
source: map[riskLevel]?.source || null,
|
|
297
|
+
}),
|
|
298
|
+
]),
|
|
299
|
+
),
|
|
300
|
+
),
|
|
301
|
+
rules: Object.freeze(
|
|
302
|
+
rules.map((rule) =>
|
|
303
|
+
Object.freeze({
|
|
304
|
+
decision: rule.decision || null,
|
|
305
|
+
reason: rule.reason || null,
|
|
306
|
+
source: rule.source || null,
|
|
307
|
+
match: rule.match ? Object.freeze({ ...rule.match }) : null,
|
|
308
|
+
}),
|
|
309
|
+
),
|
|
310
|
+
),
|
|
311
|
+
});
|
|
287
312
|
|
|
288
313
|
return {
|
|
289
314
|
isAutoModeGate: true,
|
|
@@ -303,6 +328,37 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
|
|
|
303
328
|
hasConfirmer() {
|
|
304
329
|
return typeof confirm === "function";
|
|
305
330
|
},
|
|
331
|
+
setAuthorizationConsumer(fn) {
|
|
332
|
+
authorizationConsumerRequired = typeof fn === "function";
|
|
333
|
+
return inner?.setAuthorizationConsumer?.(fn);
|
|
334
|
+
},
|
|
335
|
+
hasAuthorizationConsumer() {
|
|
336
|
+
return authorizationConsumerRequired;
|
|
337
|
+
},
|
|
338
|
+
getAuthorizationPolicySnapshot(sessionId = null) {
|
|
339
|
+
return Object.freeze({
|
|
340
|
+
schema: "chainlesschain.approval-policy-authority/v1",
|
|
341
|
+
kind: "auto-mode",
|
|
342
|
+
active: isActive() === true,
|
|
343
|
+
config: authorityConfig,
|
|
344
|
+
inner:
|
|
345
|
+
inner?.getAuthorizationPolicySnapshot?.(sessionId) ||
|
|
346
|
+
Object.freeze({
|
|
347
|
+
schema: "chainlesschain.approval-policy-authority/v1",
|
|
348
|
+
kind: "unobserved-inner",
|
|
349
|
+
sessionId: sessionId ? String(sessionId) : null,
|
|
350
|
+
}),
|
|
351
|
+
});
|
|
352
|
+
},
|
|
353
|
+
consumeAuthorization(authorization, ctx) {
|
|
354
|
+
if (typeof inner?.consumeAuthorization !== "function") {
|
|
355
|
+
throw new Error("Approval authorization consumer is unavailable");
|
|
356
|
+
}
|
|
357
|
+
return inner.consumeAuthorization(authorization, ctx);
|
|
358
|
+
},
|
|
359
|
+
createAuthorizationBinder() {
|
|
360
|
+
return inner?.createAuthorizationBinder?.() || null;
|
|
361
|
+
},
|
|
306
362
|
async decide(ctx = {}) {
|
|
307
363
|
if (!isActive()) return inner.decide(ctx);
|
|
308
364
|
const riskLevel = RISK_LEVELS.includes(ctx.riskLevel)
|
|
@@ -365,7 +421,15 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
|
|
|
365
421
|
}
|
|
366
422
|
// ask — same confirm semantics as the session-core gate: no confirmer
|
|
367
423
|
// means fail-closed deny (headless installs a deny-confirmer anyway).
|
|
368
|
-
|
|
424
|
+
// Snapshot both mutable callbacks before the first await. A concurrent
|
|
425
|
+
// stop/start or session reconfiguration must not retarget an in-flight
|
|
426
|
+
// remote approval to a different authorization consumer generation.
|
|
427
|
+
const confirmer = confirm;
|
|
428
|
+
const consumerRequired = authorizationConsumerRequired;
|
|
429
|
+
const bindAuthorization = consumerRequired
|
|
430
|
+
? inner?.createAuthorizationBinder?.()
|
|
431
|
+
: null;
|
|
432
|
+
if (typeof confirmer !== "function") {
|
|
369
433
|
return {
|
|
370
434
|
decision: "deny",
|
|
371
435
|
via: "no-confirmer",
|
|
@@ -374,8 +438,38 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
|
|
|
374
438
|
};
|
|
375
439
|
}
|
|
376
440
|
let ok = false;
|
|
441
|
+
let authorization = null;
|
|
442
|
+
let confirmationVia = null;
|
|
377
443
|
try {
|
|
378
|
-
|
|
444
|
+
const confirmation = await confirmer(ctx);
|
|
445
|
+
if (confirmation && typeof confirmation === "object") {
|
|
446
|
+
ok = confirmation.approved === true;
|
|
447
|
+
confirmationVia = confirmation.via || null;
|
|
448
|
+
if (ok && !confirmation.authorization) {
|
|
449
|
+
return {
|
|
450
|
+
decision: "deny",
|
|
451
|
+
via: "authorization-missing",
|
|
452
|
+
base: "confirm",
|
|
453
|
+
...common,
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
if (
|
|
457
|
+
ok &&
|
|
458
|
+
(!consumerRequired || typeof bindAuthorization !== "function")
|
|
459
|
+
) {
|
|
460
|
+
return {
|
|
461
|
+
decision: "deny",
|
|
462
|
+
via: "authorization-consumer-missing",
|
|
463
|
+
base: "confirm",
|
|
464
|
+
...common,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
if (ok) {
|
|
468
|
+
authorization = bindAuthorization(confirmation.authorization);
|
|
469
|
+
}
|
|
470
|
+
} else {
|
|
471
|
+
ok = confirmation === true;
|
|
472
|
+
}
|
|
379
473
|
} catch (error) {
|
|
380
474
|
return {
|
|
381
475
|
decision: "deny",
|
|
@@ -387,8 +481,9 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
|
|
|
387
481
|
}
|
|
388
482
|
return {
|
|
389
483
|
decision: ok ? "allow" : "deny",
|
|
390
|
-
via: ok ? "user-confirm" : "user-deny",
|
|
484
|
+
via: confirmationVia || (ok ? "user-confirm" : "user-deny"),
|
|
391
485
|
base: "confirm",
|
|
486
|
+
...(authorization ? { authorization } : {}),
|
|
392
487
|
...common,
|
|
393
488
|
};
|
|
394
489
|
},
|
|
@@ -5,6 +5,8 @@ import {
|
|
|
5
5
|
BACKGROUND_AGENT_KEEPER_ARM,
|
|
6
6
|
BACKGROUND_AGENT_KEEPER_ARMED,
|
|
7
7
|
BACKGROUND_AGENT_KEEPER_HELLO,
|
|
8
|
+
BACKGROUND_AGENT_KEEPER_HEARTBEAT,
|
|
9
|
+
BACKGROUND_AGENT_KEEPER_HEARTBEAT_INTERVAL_MS,
|
|
8
10
|
BACKGROUND_AGENT_KEEPER_PROTOCOL_VERSION,
|
|
9
11
|
BACKGROUND_AGENT_KEEPER_READY,
|
|
10
12
|
BACKGROUND_AGENT_KEEPER_RETIRE,
|
|
@@ -76,11 +78,17 @@ export async function connectBackgroundAgentKeeper(options = {}) {
|
|
|
76
78
|
const retireTimeoutMs = resolveBackgroundAgentKeeperRetireTimeoutMs(
|
|
77
79
|
options.retireTimeoutMs,
|
|
78
80
|
);
|
|
81
|
+
const heartbeatIntervalMs = Math.max(
|
|
82
|
+
10,
|
|
83
|
+
Number(options.heartbeatIntervalMs) ||
|
|
84
|
+
BACKGROUND_AGENT_KEEPER_HEARTBEAT_INTERVAL_MS,
|
|
85
|
+
);
|
|
79
86
|
const socket = await connectWithDeadline(options.pipePath, connectTimeoutMs);
|
|
80
87
|
const pending = new Map();
|
|
81
88
|
let ready = false;
|
|
82
89
|
let closing = false;
|
|
83
90
|
let activeTurn = null;
|
|
91
|
+
let heartbeatTimer = null;
|
|
84
92
|
let readyResolve;
|
|
85
93
|
let readyReject;
|
|
86
94
|
const readyPromise = new Promise((resolve, reject) => {
|
|
@@ -89,6 +97,8 @@ export async function connectBackgroundAgentKeeper(options = {}) {
|
|
|
89
97
|
});
|
|
90
98
|
|
|
91
99
|
const failPending = (error) => {
|
|
100
|
+
clearInterval(heartbeatTimer);
|
|
101
|
+
heartbeatTimer = null;
|
|
92
102
|
readyReject(error);
|
|
93
103
|
for (const entry of pending.values()) {
|
|
94
104
|
clearTimeout(entry.timer);
|
|
@@ -171,6 +181,23 @@ export async function connectBackgroundAgentKeeper(options = {}) {
|
|
|
171
181
|
);
|
|
172
182
|
helloTimer.unref?.();
|
|
173
183
|
await readyPromise.finally(() => clearTimeout(helloTimer));
|
|
184
|
+
const sendHeartbeat = () => {
|
|
185
|
+
try {
|
|
186
|
+
writeMessage(
|
|
187
|
+
socket,
|
|
188
|
+
createBackgroundAgentKeeperMessage(BACKGROUND_AGENT_KEEPER_HEARTBEAT, {
|
|
189
|
+
id: hello.id,
|
|
190
|
+
workerGeneration: hello.workerGeneration,
|
|
191
|
+
workerPid: hello.workerPid,
|
|
192
|
+
}),
|
|
193
|
+
);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
socket.destroy(error);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
sendHeartbeat();
|
|
199
|
+
heartbeatTimer = setInterval(sendHeartbeat, heartbeatIntervalMs);
|
|
200
|
+
heartbeatTimer.unref?.();
|
|
174
201
|
|
|
175
202
|
const request = (
|
|
176
203
|
type,
|
|
@@ -241,6 +268,8 @@ export async function connectBackgroundAgentKeeper(options = {}) {
|
|
|
241
268
|
close() {
|
|
242
269
|
if (closing) return;
|
|
243
270
|
closing = true;
|
|
271
|
+
clearInterval(heartbeatTimer);
|
|
272
|
+
heartbeatTimer = null;
|
|
244
273
|
socket.end();
|
|
245
274
|
},
|
|
246
275
|
activeTurn: () => activeTurn,
|
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstatSync, mkdirSync, rmdirSync } from "node:fs";
|
|
3
|
+
import { posix } from "node:path";
|
|
2
4
|
|
|
3
5
|
export const BACKGROUND_AGENT_KEEPER_PROTOCOL_VERSION = 1;
|
|
4
6
|
export const BACKGROUND_AGENT_KEEPER_HELLO = "background-agent-keeper-hello";
|
|
5
7
|
export const BACKGROUND_AGENT_KEEPER_READY = "background-agent-keeper-ready";
|
|
8
|
+
export const BACKGROUND_AGENT_KEEPER_HEARTBEAT =
|
|
9
|
+
"background-agent-keeper-heartbeat";
|
|
6
10
|
export const BACKGROUND_AGENT_KEEPER_ARM = "background-agent-keeper-arm";
|
|
7
11
|
export const BACKGROUND_AGENT_KEEPER_ARMED = "background-agent-keeper-armed";
|
|
8
12
|
export const BACKGROUND_AGENT_KEEPER_RETIRE = "background-agent-keeper-retire";
|
|
9
13
|
export const BACKGROUND_AGENT_KEEPER_RETIRED =
|
|
10
14
|
"background-agent-keeper-retired";
|
|
15
|
+
export const BACKGROUND_AGENT_KEEPER_HEARTBEAT_INTERVAL_MS = 1_000;
|
|
16
|
+
export const BACKGROUND_AGENT_KEEPER_HEARTBEAT_TIMEOUT_MS = 15_000;
|
|
11
17
|
|
|
12
18
|
// RETIRE is the only keeper request that performs destructive OS cleanup. Its
|
|
13
19
|
// deadline is deliberately independent from the short HELLO/ARM request
|
|
14
20
|
// deadline and is derived from every synchronous operation on the longest
|
|
15
21
|
// Windows path:
|
|
16
22
|
//
|
|
17
|
-
// 2 targets * (
|
|
18
|
-
// 2
|
|
19
|
-
// margin =
|
|
23
|
+
// 2 targets * (strict identity + taskkill + cleanup confirmation identity) +
|
|
24
|
+
// 2 cleanup-critical persistence retry windows + cleanup confirmation +
|
|
25
|
+
// scheduling margin = 120 seconds.
|
|
20
26
|
//
|
|
21
27
|
// Keeping these limits in the shared protocol contract prevents either side
|
|
22
28
|
// from silently reintroducing the old 10-second client / longer keeper race.
|
|
@@ -24,15 +30,19 @@ export const BACKGROUND_AGENT_KEEPER_CLEANUP_TARGET_LIMIT = 2;
|
|
|
24
30
|
export const BACKGROUND_AGENT_KEEPER_TASKKILL_TIMEOUT_MS = 10_000;
|
|
25
31
|
export const BACKGROUND_AGENT_KEEPER_WMIC_TIMEOUT_MS = 5_000;
|
|
26
32
|
export const BACKGROUND_AGENT_KEEPER_POWERSHELL_TIMEOUT_MS = 10_000;
|
|
33
|
+
export const BACKGROUND_AGENT_KEEPER_IDENTITY_PROBE_TIMEOUT_MS =
|
|
34
|
+
BACKGROUND_AGENT_KEEPER_WMIC_TIMEOUT_MS +
|
|
35
|
+
BACKGROUND_AGENT_KEEPER_POWERSHELL_TIMEOUT_MS;
|
|
27
36
|
export const BACKGROUND_AGENT_KEEPER_STATE_LOCK_TIMEOUT_MS = 5_000;
|
|
37
|
+
export const BACKGROUND_AGENT_KEEPER_PERSIST_RETRY_TIMEOUT_MS =
|
|
38
|
+
3 * BACKGROUND_AGENT_KEEPER_STATE_LOCK_TIMEOUT_MS;
|
|
28
39
|
export const BACKGROUND_AGENT_KEEPER_CLEANUP_CONFIRM_TIMEOUT_MS = 2_000;
|
|
29
40
|
export const BACKGROUND_AGENT_KEEPER_RETIRE_TIMEOUT_MARGIN_MS = 8_000;
|
|
30
41
|
export const BACKGROUND_AGENT_KEEPER_RETIRE_TIMEOUT_MS =
|
|
31
42
|
BACKGROUND_AGENT_KEEPER_CLEANUP_TARGET_LIMIT *
|
|
32
43
|
(BACKGROUND_AGENT_KEEPER_TASKKILL_TIMEOUT_MS +
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
2 * BACKGROUND_AGENT_KEEPER_STATE_LOCK_TIMEOUT_MS +
|
|
44
|
+
2 * BACKGROUND_AGENT_KEEPER_IDENTITY_PROBE_TIMEOUT_MS) +
|
|
45
|
+
2 * BACKGROUND_AGENT_KEEPER_PERSIST_RETRY_TIMEOUT_MS +
|
|
36
46
|
BACKGROUND_AGENT_KEEPER_CLEANUP_CONFIRM_TIMEOUT_MS +
|
|
37
47
|
BACKGROUND_AGENT_KEEPER_RETIRE_TIMEOUT_MARGIN_MS;
|
|
38
48
|
|
|
@@ -49,6 +59,14 @@ export function resolveBackgroundAgentKeeperRetireTimeoutMs(value) {
|
|
|
49
59
|
|
|
50
60
|
const SAFE_ID = /^[A-Za-z0-9_-]{1,256}$/u;
|
|
51
61
|
const SAFE_TOKEN = /^[a-f0-9]{64}$/u;
|
|
62
|
+
const POSIX_LOCAL_PIPE_DIRECTORY = /^cc-bg[ks]-[a-f0-9]{24}$/u;
|
|
63
|
+
const POSIX_LOCAL_PIPE_SOCKET = /^[a-f0-9]{32}\.sock$/u;
|
|
64
|
+
|
|
65
|
+
// Darwin's sockaddr_un.sun_path has 104 bytes including the trailing NUL.
|
|
66
|
+
// Linux allows a few more bytes, but the conservative cross-platform ceiling
|
|
67
|
+
// prevents a long state directory from being silently truncated into the same
|
|
68
|
+
// endpoint as a concurrent keeper.
|
|
69
|
+
export const POSIX_KEEPER_SOCKET_PATH_MAX_BYTES = 103;
|
|
52
70
|
|
|
53
71
|
function requiredSafeString(value, label, pattern = SAFE_ID) {
|
|
54
72
|
const normalized = typeof value === "string" ? value.trim() : "";
|
|
@@ -74,12 +92,142 @@ function requiredTimestamp(value, label) {
|
|
|
74
92
|
return normalized;
|
|
75
93
|
}
|
|
76
94
|
|
|
77
|
-
|
|
95
|
+
function digestKeeperPath(value, length) {
|
|
96
|
+
return createHash("sha256").update(value).digest("hex").slice(0, length);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function requiredPosixDirectory(value, label) {
|
|
100
|
+
const normalized = typeof value === "string" ? value.trim() : "";
|
|
101
|
+
if (!normalized || normalized.includes("\0")) {
|
|
102
|
+
throw new TypeError(`invalid background agent keeper ${label}`);
|
|
103
|
+
}
|
|
104
|
+
return posix.resolve(normalized.replaceAll("\\", "/"));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function backgroundAgentPosixPipePath(
|
|
108
|
+
id,
|
|
109
|
+
directory,
|
|
110
|
+
options,
|
|
111
|
+
{ candidateSuffix, fallbackPrefix, tooLongMessage },
|
|
112
|
+
) {
|
|
78
113
|
const safeId = requiredSafeString(id, "id");
|
|
79
|
-
|
|
114
|
+
const stateDirectory = requiredPosixDirectory(directory, "state directory");
|
|
115
|
+
const candidate = posix.join(stateDirectory, `${safeId}${candidateSuffix}`);
|
|
116
|
+
if (
|
|
117
|
+
Buffer.byteLength(candidate, "utf8") <= POSIX_KEEPER_SOCKET_PATH_MAX_BYTES
|
|
118
|
+
) {
|
|
119
|
+
return candidate;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Keep the endpoint inside a private, state-root-specific namespace under
|
|
123
|
+
// the short POSIX /tmp alias. The full directory and id remain collision
|
|
124
|
+
// inputs even though neither long value appears in sockaddr_un.sun_path.
|
|
125
|
+
const uid =
|
|
126
|
+
options.uid ??
|
|
127
|
+
(typeof process.getuid === "function" ? process.getuid() : "unknown");
|
|
128
|
+
const shortTempDirectory = requiredPosixDirectory(
|
|
129
|
+
options.tempDirectory || "/tmp",
|
|
130
|
+
"short temp directory",
|
|
131
|
+
);
|
|
132
|
+
const namespace = digestKeeperPath(`${uid}\0${stateDirectory}`, 24);
|
|
133
|
+
const socketId = digestKeeperPath(safeId, 32);
|
|
134
|
+
const fallback = posix.join(
|
|
135
|
+
shortTempDirectory,
|
|
136
|
+
`${fallbackPrefix}-${namespace}`,
|
|
137
|
+
`${socketId}.sock`,
|
|
138
|
+
);
|
|
139
|
+
if (
|
|
140
|
+
Buffer.byteLength(fallback, "utf8") > POSIX_KEEPER_SOCKET_PATH_MAX_BYTES
|
|
141
|
+
) {
|
|
142
|
+
throw new Error(tooLongMessage);
|
|
143
|
+
}
|
|
144
|
+
return fallback;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function backgroundAgentKeeperPipePath(id, directory, options = {}) {
|
|
148
|
+
const safeId = requiredSafeString(id, "id");
|
|
149
|
+
const platform = options.platform || process.platform;
|
|
150
|
+
if (platform === "win32") {
|
|
80
151
|
return `\\\\.\\pipe\\cc-bg-keeper-${safeId}`;
|
|
81
152
|
}
|
|
82
|
-
return
|
|
153
|
+
return backgroundAgentPosixPipePath(id, directory, options, {
|
|
154
|
+
candidateSuffix: ".keeper.sock",
|
|
155
|
+
fallbackPrefix: "cc-bgk",
|
|
156
|
+
tooLongMessage: "background agent keeper fallback socket path is too long",
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function backgroundAgentSessionPipePath(id, directory, options = {}) {
|
|
161
|
+
const safeId = requiredSafeString(id, "id");
|
|
162
|
+
const platform = options.platform || process.platform;
|
|
163
|
+
if (platform === "win32") {
|
|
164
|
+
return `\\\\.\\pipe\\cc-bg-${safeId}`;
|
|
165
|
+
}
|
|
166
|
+
return backgroundAgentPosixPipePath(id, directory, options, {
|
|
167
|
+
candidateSuffix: ".sock",
|
|
168
|
+
fallbackPrefix: "cc-bgs",
|
|
169
|
+
tooLongMessage: "background agent session fallback socket path is too long",
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function fallbackLocalPipeDirectory(pipePath) {
|
|
174
|
+
const normalized = posix.resolve(
|
|
175
|
+
String(pipePath || "").replaceAll("\\", "/"),
|
|
176
|
+
);
|
|
177
|
+
const directory = posix.dirname(normalized);
|
|
178
|
+
return POSIX_LOCAL_PIPE_DIRECTORY.test(posix.basename(directory)) &&
|
|
179
|
+
POSIX_LOCAL_PIPE_SOCKET.test(posix.basename(normalized))
|
|
180
|
+
? directory
|
|
181
|
+
: null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export function prepareBackgroundAgentLocalPipePath(
|
|
185
|
+
pipePath,
|
|
186
|
+
{ platform = process.platform } = {},
|
|
187
|
+
) {
|
|
188
|
+
if (platform === "win32") return pipePath;
|
|
189
|
+
const directory = fallbackLocalPipeDirectory(pipePath);
|
|
190
|
+
if (!directory) return pipePath;
|
|
191
|
+
try {
|
|
192
|
+
mkdirSync(directory, { mode: 0o700 });
|
|
193
|
+
} catch (error) {
|
|
194
|
+
if (error?.code !== "EEXIST") throw error;
|
|
195
|
+
}
|
|
196
|
+
const stat = lstatSync(directory);
|
|
197
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : null;
|
|
198
|
+
if (
|
|
199
|
+
!stat.isDirectory() ||
|
|
200
|
+
stat.isSymbolicLink() ||
|
|
201
|
+
(uid !== null && stat.uid !== uid) ||
|
|
202
|
+
(stat.mode & 0o077) !== 0
|
|
203
|
+
) {
|
|
204
|
+
throw new Error("background agent socket directory is not private");
|
|
205
|
+
}
|
|
206
|
+
return pipePath;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function cleanupBackgroundAgentLocalPipeDirectory(
|
|
210
|
+
pipePath,
|
|
211
|
+
{ platform = process.platform } = {},
|
|
212
|
+
) {
|
|
213
|
+
if (platform === "win32") return false;
|
|
214
|
+
const directory = fallbackLocalPipeDirectory(pipePath);
|
|
215
|
+
if (!directory) return false;
|
|
216
|
+
try {
|
|
217
|
+
rmdirSync(directory);
|
|
218
|
+
return true;
|
|
219
|
+
} catch (error) {
|
|
220
|
+
if (error?.code === "ENOENT" || error?.code === "ENOTEMPTY") return false;
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export function prepareBackgroundAgentKeeperPipePath(pipePath, options) {
|
|
226
|
+
return prepareBackgroundAgentLocalPipePath(pipePath, options);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function cleanupBackgroundAgentKeeperPipeDirectory(pipePath, options) {
|
|
230
|
+
return cleanupBackgroundAgentLocalPipeDirectory(pipePath, options);
|
|
83
231
|
}
|
|
84
232
|
|
|
85
233
|
export function normalizeBackgroundAgentKeeperAuthority(value = {}) {
|