chainlesschain 0.163.8 → 0.165.1
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 +7 -4
- package/scripts/macos-mcp-launcher-build.mjs +317 -0
- package/scripts/macos-mcp-launcher-postinstall.sh +54 -0
- package/scripts/macos-mcp-launcher-preinstall.sh +61 -0
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CavM7W3k.js → AIOps-CYxFDrcm.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CUvZGabQ.js → ActionButton-CPBtdiU2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DeBnWnbe.js → Analytics-Dayq7Dp7.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DbI5kxvd.js → AppLayout-6U7bPb2s.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-D93bigKm.js → Artifacts-D2Iqg_3D.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CBNvfUZa.js → Audit-CdoOB7WV.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CJLyh_YU.js → BackgroundAgents-DrnAVB8w.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D_0yoehD.js → Backup-CesMi5cy.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-TJxmbObW.js → BaseInput-DaX9ptax.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CE0dto1q.js → Chat-OrwOPxDS.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZ5-yYiD.js → ChatBubbleRenderer-CvPZFRxM.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Ck1RVIVo.js → Checkbox-DiHbcysC.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-qpoyf6DK.js → Codegen-CbgCkaBJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DUyPWjIE.js → Col-Du5hgrh4.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D_S1BemS.js → Community-DsPOBW-p.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BjxeK-Gc.js → Compact-BwHIFkNC.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dd3CEJsu.js → Compliance-BvrDQSgd.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B4QG7-ad.js → Cowork-gwAE6arx.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BtZnids5.js → Cron-DW-0l4uF.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CHPfCBFD.js → Crosschain-j-NsLesB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DT8DCEOK.js → DID-CibVEBOI.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-COQab5_U.js → Dashboard-W4z9vSfe.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BY1PsQuU.js → Dropdown-DAcrkKxG.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CsuAuaq3.js → EmailListRenderer-6GXah-89.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BqpinD-j.js → FamilyGuardDashboard-TKDCq8Ku.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D0gkfQFv.js → Federation-BXBLlcNm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BqgE-axK.js → FormItemContext-BoJJBkG3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D0hJ2KvC.js → GenericCardRenderer-okjsl46v.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CmMB0uPY.js → Git-Rvs7i6nn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BnVEI0Dk.js → Governance-CHSUxXXS.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-YTAMihRP.js → Inference-V3BlfxsB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-0ax7VHop.js → KnowledgeGraph-C_NlD4aR.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-B9TRcokL.js → Logs-Nn4LNxhA.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-SVAgNnkt.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-B6CSuD_H.js → Marketplace-DEmjFcg-.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CjMXvOVU.js → McpTools-DlopXipI.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CXRF71U3.js → Memory-BG3ynX60.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DQgNp_oS.js → MobileBridge-DeRzWOfT.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DlPwcCbq.js → MobileProjects-Tyd3o2A0.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-6hDTRPe1.js → Mtc-BoPbOv1C.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BlVHU1DS.js → MtcAudit-un-rTHp7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DP9pzEbV.js → Multisig-Ds0oveEB.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Djorh8EV.js → NLProgramming-D09JI-yY.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-oLZ-JkUg.js → Notes-DTRhiKJn.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Cg288VH3.js → NotificationSettings-BAnnNCim.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Yr-1fSYi.js +1 -0
- package/src/assets/web-panel/assets/{Organization-CBdo-bHs.js → Organization-S9EAolpj.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-qZdnVumx.js → Overflow-CqcLKqJ8.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D4kNfGNQ.js → P2P-Dw0F9EcU.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DnlMemM7.js → PdhVaultBrowser-BDRwUevN.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DHucHFBJ.js → Permissions-D3_c3nKB.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BovlOIPR.js → PersonalDataHub-CxdMV98x.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-Deru3CQY.js → Pipeline-CgjNQFLI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bq5oTTbU.js → Privacy-BHghIIht.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BfzxVWAz.js → ProjectInit-De6pqaKM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CKC6XBtH.js → ProjectSettings-Bg4ZkNYQ.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CP8vPvzs.js +1 -0
- package/src/assets/web-panel/assets/{Providers-C_jx4TWX.js → Providers-CUnHbNf-.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BdIHeVGC.js → QrScannerModal-DA2f3Wts.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BwZwAcPD.js → QuickAsk-C1FeHDqp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BNTt0L-m.js → Recommend-B5guaUMN.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-PDADSds3.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D6VpG32B.js → Reputation-eTlRhgvK.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D_74OvQQ.js → Row-D7AqSGY0.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BTr0a-BQ.js → RssFeed-JiuLm4Ja.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C3MCFoNU.js → Search-CwruahW3.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CqW9aJ6s.js → Security-CdhqaR0b.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Cw5GNaHF.js → Services-CU0ZIlcT.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DZps5qeY.js → Skeleton-CtduPfAb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C6NQ1znT.js → Skills-CROXm6AY.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DFP8G2Sh.js → Sla-DiZiABFD.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-ESt6MB6v.js → SpeechSettings-B5pLcXUw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BHnN98aM.js → SyncSettings-DBX6J1Oe.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-NiSCaOf-.js → Tasks-BLyRJd3-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DsKFhW2C.js → Templates-BKa5qzmk.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CQ0E0ze5.js → Tenant-DnD3a4M6.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D_rBu_by.js → Terminal-DEitQeTb.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3Vm4Po4.js → TimelineRenderer-CjHggTDq.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DNTxRH6q.js → Tokens-CsGT7sfl.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dgprz1ms.js → Trigger-yr4rFDrW.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B2rUnVBD.js → Trust-CLvu1Sjp.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DEGQNc6_.js → UkeySign-B0m7yUP8.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-jlsAx3Eh.js → VideoEditing-C0VvP4lc.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-8jQih1ij.js → Wallet-kllBAG1M.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-XLeO6xIB.js → WebAuthn-C54UQNLx.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-De_dgDAG.js → WorkflowEditor-B7y8qSvU.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CI19R_Sk.js → chat-DRzTh8CJ.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DsYTOYN3.js → colors-BSMwSnCx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CM3-t_Qr.js → compact-item-BTg602H5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BjxlBRZv.js → createContext-B6EGsdvp.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Dol8jLEP.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-RDaWX_4i.js → hasIn-DDKqJ8RD.js} +1 -1
- package/src/assets/web-panel/assets/{index-nAH87mQP.js → index-323Hhxxt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIUnNOjG.js → index-BICn3Qh1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyIWssPC.js → index-BMuGd2--.js} +1 -1
- package/src/assets/web-panel/assets/{index-DX7tuWVJ.js → index-BRqt4fO-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd3euP_4.js → index-BVTAl5N2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cpqm1qfU.js → index-BsR7Y2NG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcPFB8qJ.js → index-Bx044qDj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd9OJhHG.js → index-C1GFfuqN.js} +1 -1
- package/src/assets/web-panel/assets/index-C3QX5tOl.js +1 -0
- package/src/assets/web-panel/assets/{index-B-Z8eFUJ.js → index-C66NpWy5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlT2VAEK.js → index-CDTvsX8t.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dsij_KsN.js → index-CGNklbP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4gkzxkw.js → index-CHfLYwcW.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6sm5-Xq.js → index-CNxg61YP.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0yx-jtQ.js → index-CQlHFN_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjTrRt13.js → index-CUEU48o1.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7WBt_4T.js → index-CWGax2QW.js} +1 -1
- package/src/assets/web-panel/assets/{index-IeiL9RKc.js → index-C_JzIXUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnHH7bnD.js → index-Cf23wVMs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKJr-TZp.js → index-CmAInUkX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiECJi-Q.js → index-CmAubjDi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCnZyIMA.js → index-Co7oM1qr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Drlnwr8F.js → index-CwPUZbMI.js} +1 -1
- package/src/assets/web-panel/assets/{index-9R6BxAr0.js → index-D1naNj4U.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGqqJfL0.js → index-D5CsBShd.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi46Xu4u.js → index-DBT3YeQ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXXtGMUJ.js → index-DLdrHhML.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0PMlbMs.js → index-Dc77VR3H.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0zcy54x.js → index-Dfv2lKu3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN6UPD2E.js → index-DiW0sDkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxge-xWl.js → index-DpTHIRfZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyOGN6a5.js → index-DqFXGzzC.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9O9YyWE.js → index-XFe-1twF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHNYPO0b.js → index-p2HYn89m.js} +3 -3
- package/src/assets/web-panel/assets/{index-CVQMeiwH.js → index-pqfux8vZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-pPL66J85.js → index-rjzk9z1Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoQA0-52.js → index-th2ihDc0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5REnKt8.js → index-u2YVld9W.js} +1 -1
- package/src/assets/web-panel/assets/index-xYybvEic.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-BTL88of4.js → initDefaultProps-C3Djh9fa.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BUB2pXwB.js → motion-BzqFmbSe.js} +1 -1
- package/src/assets/web-panel/assets/{move-egCkkOMm.js → move-DJo_FFaW.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DAWhZC8c.js → mtc-parser-_tlTiBvk.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CvOxe_6d.js → omit-CB2ZyxUg.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DZUSLZ5Z.js → pickAttrs-DZwIFD4u.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BERxGNMY.js → placementArrow-DxZY0dgk.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DZuDfZ9n.js → responsiveObserve-CzzGt7GL.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DO756sgI.js → slide-BaIK52yz.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BRQlIz28.js → statusUtils-3-FHu9_M.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DCSfdybl.js → styleChecker-BkRT68fK.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-LD8dWVve.js → useFlexGapSupport-DHYwKS-s.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BX9uW2LK.js → useFs-DVVUhV8p.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BPSlPuHU.js → usePersonalDataHub-CkrFKAzQ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BmOILC9V.js → vnode-BuBLFz0c.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-1iKowKGg.js → zoom-kpm6LtXU.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/cowork.js +418 -41
- package/src/commands/permissions.js +240 -16
- package/src/commands/plugin.js +1293 -56
- package/src/commands/session-location.js +276 -0
- package/src/commands/session.js +2 -0
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/action-protocol.js +316 -17
- package/src/gateways/ws/message-dispatcher.js +30 -0
- package/src/gateways/ws/remote-session-protocol.js +565 -35
- package/src/gateways/ws/ws-agent-handler.js +12 -0
- package/src/gateways/ws/ws-approval-gate.js +5 -0
- package/src/gateways/ws/ws-server.js +510 -50
- package/src/harness/jsonl-session-store.js +341 -24
- package/src/harness/mcp-client.js +8 -1
- package/src/harness/remote-session-audit.js +2 -0
- package/src/harness/remote-session-crypto.js +929 -21
- package/src/harness/remote-session-registry.js +945 -24
- package/src/harness/session-list-index.js +233 -14
- package/src/lib/agent-authority.js +6 -0
- package/src/lib/auto-mode-config.js +98 -3
- package/src/lib/background-agent-keeper-client.js +248 -0
- package/src/lib/background-agent-keeper-protocol.js +291 -0
- package/src/lib/background-agent-supervisor.js +1357 -85
- package/src/lib/background-interaction-resolver.js +12 -0
- package/src/lib/background-session-transport.js +23 -6
- package/src/lib/background-turn-bootstrap-protocol.js +190 -0
- package/src/lib/cowork-workflow.js +1188 -76
- package/src/lib/delivery-production-adapter.js +38 -2
- package/src/lib/dynamic-workflow-facade.js +1736 -0
- package/src/lib/execution-location-contract.js +551 -0
- package/src/lib/execution-location-runtime.js +130 -0
- package/src/lib/ide-context.js +94 -6
- package/src/lib/mcp-stdio-package-materialization.js +166 -14
- package/src/lib/packer/pkg-config-generator.js +2 -0
- package/src/lib/permission-authority.js +77 -0
- package/src/lib/permission-side-effect-center.js +495 -0
- package/src/lib/plugin-runtime/install.js +514 -13
- package/src/lib/plugin-runtime/marketplace-artifact-readback.js +900 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +1181 -0
- package/src/lib/plugin-runtime/marketplace-impact.js +408 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1567 -0
- package/src/lib/plugin-security.js +60 -3
- package/src/lib/process-execution-broker/index.js +1095 -57
- package/src/lib/process-execution-broker/linux-bwrap-descriptor-launch.js +375 -0
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +90 -16
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +159 -18
- package/src/lib/process-execution-broker/macos-mcp-launcher-contract.js +278 -0
- package/src/lib/process-execution-broker/macos-mcp-launcher-protocol.json +23 -0
- package/src/lib/process-execution-broker/macos-mcp-launcher.c +1497 -0
- package/src/lib/process-execution-broker/mcp-fd-entry-bootstrap.js +37 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +2330 -279
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +50 -4
- package/src/lib/public-ide-capability-manifest.js +3 -0
- package/src/lib/remote-approval-bridge.js +777 -34
- package/src/lib/remote-control.js +2 -0
- package/src/lib/remote-membership-authority.js +632 -0
- package/src/lib/remote-membership-coordinator.js +2973 -0
- package/src/lib/remote-membership-host-store.js +1799 -0
- package/src/lib/runtime-provenance-ledger.js +171 -46
- package/src/lib/scoped-permission-store.js +369 -0
- package/src/lib/session-anti-rollback-anchor.js +262 -5
- package/src/lib/shell-approval.js +169 -6
- package/src/lib/sub-agent-context.js +4 -0
- package/src/lib/with-file-lock.js +73 -38
- package/src/lib/workflow-definition-contract.js +149 -0
- package/src/repl/agent-repl.js +111 -36
- package/src/repl/chat-repl.js +2 -0
- package/src/repl/clipboard-image.js +735 -16
- package/src/repl/ide-status.js +1 -1
- package/src/repl/prompt-interactions.js +59 -6
- package/src/repl/remote-approval.js +29 -7
- package/src/runtime/agent-core.js +1182 -155
- package/src/runtime/headless-runner.js +52 -30
- package/src/runtime/headless-stream.js +51 -28
- package/src/workers/background-agent-keeper.js +689 -0
- package/src/workers/background-agent-worker.js +365 -13
- package/src/workers/background-turn-bootstrap.js +170 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Bb1O3Ofr.js +0 -1
- package/src/assets/web-panel/assets/Projects-CMolGhae.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Biyn2-Ro.js +0 -5
- package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +0 -1
- package/src/assets/web-panel/assets/index-Drz6yq0m.js +0 -1
- package/src/assets/web-panel/assets/index-uWiUs7S_.js +0 -1
|
@@ -109,6 +109,11 @@ export function createBackgroundInteractionClient(options = {}) {
|
|
|
109
109
|
let sequence = 0;
|
|
110
110
|
let closed = false;
|
|
111
111
|
|
|
112
|
+
const refChannel = () => processLike?.channel?.ref?.();
|
|
113
|
+
const unrefIdleChannel = () => {
|
|
114
|
+
if (pending.size === 0) processLike?.channel?.unref?.();
|
|
115
|
+
};
|
|
116
|
+
|
|
112
117
|
const removeMessageListener = () => {
|
|
113
118
|
if (typeof processLike?.off === "function") {
|
|
114
119
|
processLike.off("message", onMessage);
|
|
@@ -122,6 +127,7 @@ export function createBackgroundInteractionClient(options = {}) {
|
|
|
122
127
|
entry.settled = true;
|
|
123
128
|
clearTimeout(entry.timer);
|
|
124
129
|
pending.delete(entry.requestId);
|
|
130
|
+
unrefIdleChannel();
|
|
125
131
|
action(value);
|
|
126
132
|
}
|
|
127
133
|
|
|
@@ -204,6 +210,11 @@ export function createBackgroundInteractionClient(options = {}) {
|
|
|
204
210
|
}, timeoutMs);
|
|
205
211
|
entry.timer.unref?.();
|
|
206
212
|
pending.set(requestId, entry);
|
|
213
|
+
// The bootstrap channel is unref'd after Agent main is released so a
|
|
214
|
+
// naturally completed turn can exit. A suspended interaction is live
|
|
215
|
+
// work, however, and must keep that channel/process alive until its
|
|
216
|
+
// exact response, timeout, or close settles it.
|
|
217
|
+
refChannel();
|
|
207
218
|
|
|
208
219
|
const sent = sendIpc(
|
|
209
220
|
processLike,
|
|
@@ -262,6 +273,7 @@ export function createBackgroundInteractionClient(options = {}) {
|
|
|
262
273
|
protocolError(reason, "INTERACTION_CHANNEL_CLOSED"),
|
|
263
274
|
);
|
|
264
275
|
}
|
|
276
|
+
unrefIdleChannel();
|
|
265
277
|
},
|
|
266
278
|
};
|
|
267
279
|
}
|
|
@@ -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
|
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Private worker <-> turn bootstrap protocol.
|
|
3
|
+
*
|
|
4
|
+
* The nonce is deliberately confined to the inherited environment and the
|
|
5
|
+
* dedicated Node IPC channel. It must never be copied into background-agent
|
|
6
|
+
* state or the attach transport.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const BACKGROUND_TURN_BOOTSTRAP_PROTOCOL_VERSION = 1;
|
|
10
|
+
export const BACKGROUND_TURN_BOOTSTRAP_READY =
|
|
11
|
+
"background-turn-bootstrap-ready";
|
|
12
|
+
export const BACKGROUND_TURN_BOOTSTRAP_RELEASE =
|
|
13
|
+
"background-turn-bootstrap-release";
|
|
14
|
+
|
|
15
|
+
export const BACKGROUND_TURN_BOOTSTRAP_ENV = Object.freeze({
|
|
16
|
+
nonce: "CC_BACKGROUND_TURN_BOOTSTRAP_NONCE",
|
|
17
|
+
workerGeneration: "CC_BACKGROUND_TURN_BOOTSTRAP_GENERATION",
|
|
18
|
+
attempt: "CC_BACKGROUND_TURN_BOOTSTRAP_ATTEMPT",
|
|
19
|
+
testTimeoutMs: "CC_BACKGROUND_TURN_BOOTSTRAP_TEST_TIMEOUT_MS",
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const SAFE_BINDING = /^[A-Za-z0-9_-]+$/u;
|
|
23
|
+
|
|
24
|
+
function requiredBindingString(value, label) {
|
|
25
|
+
const normalized = typeof value === "string" ? value.trim() : "";
|
|
26
|
+
if (
|
|
27
|
+
normalized.length < 1 ||
|
|
28
|
+
normalized.length > 256 ||
|
|
29
|
+
!SAFE_BINDING.test(normalized)
|
|
30
|
+
) {
|
|
31
|
+
throw new TypeError(`invalid background turn bootstrap ${label}`);
|
|
32
|
+
}
|
|
33
|
+
return normalized;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function requiredPositiveInteger(value, label) {
|
|
37
|
+
const normalized = Number(value);
|
|
38
|
+
if (!Number.isSafeInteger(normalized) || normalized < 1) {
|
|
39
|
+
throw new TypeError(`invalid background turn bootstrap ${label}`);
|
|
40
|
+
}
|
|
41
|
+
return normalized;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function normalizeBackgroundTurnBootstrapAuthority(binding = {}) {
|
|
45
|
+
return Object.freeze({
|
|
46
|
+
nonce: requiredBindingString(binding.nonce, "nonce"),
|
|
47
|
+
workerGeneration: requiredBindingString(
|
|
48
|
+
binding.workerGeneration,
|
|
49
|
+
"worker generation",
|
|
50
|
+
),
|
|
51
|
+
attempt: requiredPositiveInteger(binding.attempt, "attempt"),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function normalizeBackgroundTurnBootstrapBinding(binding = {}) {
|
|
56
|
+
return Object.freeze({
|
|
57
|
+
...normalizeBackgroundTurnBootstrapAuthority(binding),
|
|
58
|
+
pid: requiredPositiveInteger(binding.pid, "pid"),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function backgroundTurnBootstrapBindingFromEnvironment(
|
|
63
|
+
environment,
|
|
64
|
+
pid,
|
|
65
|
+
) {
|
|
66
|
+
return normalizeBackgroundTurnBootstrapBinding({
|
|
67
|
+
nonce: environment?.[BACKGROUND_TURN_BOOTSTRAP_ENV.nonce],
|
|
68
|
+
workerGeneration:
|
|
69
|
+
environment?.[BACKGROUND_TURN_BOOTSTRAP_ENV.workerGeneration],
|
|
70
|
+
attempt: environment?.[BACKGROUND_TURN_BOOTSTRAP_ENV.attempt],
|
|
71
|
+
pid,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function createBackgroundTurnBootstrapMessage(type, binding) {
|
|
76
|
+
if (
|
|
77
|
+
type !== BACKGROUND_TURN_BOOTSTRAP_READY &&
|
|
78
|
+
type !== BACKGROUND_TURN_BOOTSTRAP_RELEASE
|
|
79
|
+
) {
|
|
80
|
+
throw new TypeError("invalid background turn bootstrap message type");
|
|
81
|
+
}
|
|
82
|
+
return Object.freeze({
|
|
83
|
+
type,
|
|
84
|
+
protocolVersion: BACKGROUND_TURN_BOOTSTRAP_PROTOCOL_VERSION,
|
|
85
|
+
...normalizeBackgroundTurnBootstrapBinding(binding),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function matchesBackgroundTurnBootstrapMessage(
|
|
90
|
+
message,
|
|
91
|
+
type,
|
|
92
|
+
authority,
|
|
93
|
+
) {
|
|
94
|
+
let expected;
|
|
95
|
+
let actual;
|
|
96
|
+
try {
|
|
97
|
+
expected = normalizeBackgroundTurnBootstrapAuthority(authority);
|
|
98
|
+
actual = normalizeBackgroundTurnBootstrapBinding(message);
|
|
99
|
+
} catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return (
|
|
103
|
+
message?.type === type &&
|
|
104
|
+
message.protocolVersion === BACKGROUND_TURN_BOOTSTRAP_PROTOCOL_VERSION &&
|
|
105
|
+
actual.nonce === expected.nonce &&
|
|
106
|
+
actual.workerGeneration === expected.workerGeneration &&
|
|
107
|
+
actual.attempt === expected.attempt &&
|
|
108
|
+
(authority.pid === undefined || Number(authority.pid) === actual.pid)
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function removeBackgroundTurnBootstrapImport(execArgv, moduleUrl) {
|
|
113
|
+
const expected = `--import=${moduleUrl}`;
|
|
114
|
+
const values = Array.isArray(execArgv) ? [...execArgv] : [];
|
|
115
|
+
if (values.filter((value) => value === expected).length !== 1) {
|
|
116
|
+
throw new Error("background turn bootstrap preload identity is ambiguous");
|
|
117
|
+
}
|
|
118
|
+
return values.filter((value) => value !== expected);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function clearBackgroundTurnBootstrapEnvironment(environment) {
|
|
122
|
+
if (!environment || typeof environment !== "object") return;
|
|
123
|
+
for (const key of Object.values(BACKGROUND_TURN_BOOTSTRAP_ENV)) {
|
|
124
|
+
delete environment[key];
|
|
125
|
+
}
|
|
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
|
+
}
|