chainlesschain 0.162.188 → 0.162.193
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 +61 -11
- package/bin/chainlesschain.js +7 -52
- package/completions/_cc +209 -0
- package/completions/cc.bash +18 -0
- package/completions/cc.fish +13 -0
- package/completions/cc.ps1 +226 -0
- package/package.json +10 -2
- package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DBLkaTje.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-BAy-Qebo.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-Dfb1Mlau.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-BbFkN8m0.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-kM4-cEEH.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-BSQfYWf3.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-CWDbI_fG.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BxLPbq_Q.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-DuIbdrp6.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-NEmjGahU.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DfJEo-5_.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CaoeG3Ns.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-BFf_g3xY.js} +1 -1
- package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CNOd8mdQ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-BhpDqz-i.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-CQ42T7Z6.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-DI5PcLMN.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-wYYZe0wR.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-Dlq03DD_.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BzqS8PP3.js} +1 -1
- package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-It55Yem7.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-9HkH6oxn.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-00e2YWRB.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-By-ugRDL.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-C396yu5m.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-BME5sbZY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-B4TEZCr-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-_9CX9ieY.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-BrS6WVSr.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-BMdCWnKF.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-Bcp3vzcA.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-DlLuqGY5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-D-W_6x09.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DElGPxCZ.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-Dzn2guvI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-uPict-KL.js} +6 -6
- package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-BCw43kOb.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-DmV8Wv7F.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-COBbEOlj.js → MobileProjects-C-HaCmSM.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-C6jxJ34Y.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-Za8ExwhQ.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-KKDbuEgb.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-Dj97zbCk.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DBXvMraU.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-DOxITLYl.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-7DVjZwMM.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D1i73mjb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-kW6Q3rvg.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-C-v_8p2v.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-tUbbY64W.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-DkHxEZ58.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-DWuMPGrK.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-30IYXWWm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-DZNQ4RrH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-De2MCElf.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-5uHk9wsC.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-XjDfrFLb.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-Bgwj6gcE.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-gKql9umv.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-BWvmwkh7.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-Uok4hZPd.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-oOVIv9wq.js → RemoteSession-DLJzTk9a.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-ZVwIPMSO.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CN04HxWR.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BdSrEG4g.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-5PwVd0IR.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-DdBo4zjN.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-D3letU7M.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton--Jb83f1v.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-Bg-CulHX.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-7QOa7S-X.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-DQwppjRw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-dNPQGL-s.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-Ggs-Z48q.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-78TYHgRO.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-xHwwv9vO.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BJXSJfm4.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-fLbjRhJw.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-oMSBSBmB.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-CfnY_wX_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-AdyTgYKO.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-C5K_81dS.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-vcGVDqki.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-hhOc3hlY.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-CVloC11s.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-CYeE32R5.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-CNROR5bN.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-Cjx-cnwU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-DOIfelvD.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-DfA7UZ8u.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-BMSCzcfM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-5-HXgOX5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-AWg-0M1S.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-B4iYzpkL.js} +1 -1
- package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-B5Udeb_6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-B7gf77CJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-BEMwBBHk.js} +1 -1
- package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-BM1y_9hM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-BUonmKSE.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-BbQ2eQ8H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-BemJ2u_E.js} +1 -1
- package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-BolaOQxx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-BxOk9vkG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-By61ojUx.js} +1 -1
- package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-C2K9SNVX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-C3L5gdiD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-C7xn0Nub.js} +1 -1
- package/src/assets/web-panel/assets/{index-COG61sRv.js → index-CAnvhwg6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CEKMcOyU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-CNC5onm4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CVL27kXC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-CVm1_i3t.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-CdYBye8B.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-ClNMrqEY.js} +1 -1
- package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-Cs6l7uRu.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-CshQbilz.js} +1 -1
- package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-Cyweh0Hy.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-DBpWXFed.js} +3 -3
- package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-DHtpHZAQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-DLmn0BoK.js} +1 -1
- package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-DPAWBrMf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-DjEsxO5h.js} +1 -1
- package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-FBc_CJBd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Icdoqmzt.js} +1 -1
- package/src/assets/web-panel/assets/index-Q2IajL54.js +1 -0
- package/src/assets/web-panel/assets/index-bRkHgOMc.js +1 -0
- package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-dCd8cSUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-m2vG9gG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaslYch6.js → index-mTpHoEzr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-ti_lnTWl.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-Bu8k7H1Y.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-s3iVK41k.js} +1 -1
- package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-B6B-E5Jz.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-BiYgTidA.js} +1 -1
- package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-pU1RdUDA.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-Cdoq_SeM.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-DIuvAn2K.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-8w16YR2D.js} +1 -1
- package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-VZ01cZe3.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-lh8YMN8Z.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-CmDyreec.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-hiJWMU5y.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-Thnu-Iaj.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-LBdOxjwY.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-Cg6lFY_X.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-DVfsR1YO.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/cli-help.js +181 -0
- package/src/command-help-index.json +181 -0
- package/src/command-manifest.json +1107 -175
- package/src/command-surface-policy.js +197 -0
- package/src/commands/agent.js +98 -33
- package/src/commands/artifacts.js +400 -2
- package/src/commands/background-session.js +41 -3
- package/src/commands/checkpoint-managed.js +1059 -0
- package/src/commands/checkpoint-restore-recovery.js +1476 -0
- package/src/commands/checkpoint.js +950 -22
- package/src/commands/compact.js +101 -25
- package/src/commands/config.js +506 -20
- package/src/commands/doctor.js +4 -1
- package/src/commands/hub.js +1 -1
- package/src/commands/mcp.js +688 -24
- package/src/commands/pack.js +16 -2
- package/src/commands/plugin.js +20 -12
- package/src/commands/session-mcp-recovery.js +218 -0
- package/src/commands/session.js +470 -110
- package/src/commands/setup.js +36 -10
- package/src/commands/skill.js +181 -110
- package/src/commands/status.js +21 -5
- package/src/commands/team-distributed.js +3324 -0
- package/src/commands/team.js +1130 -74
- package/src/commands/update.js +68 -6
- package/src/constants.js +11 -0
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/action-protocol.js +10 -0
- package/src/gateways/ws/session-protocol.js +555 -27
- package/src/gateways/ws/ws-agent-handler.js +541 -14
- package/src/gateways/ws/ws-session-gateway.js +129 -22
- package/src/gateways/ws/ws-session-state.js +431 -0
- package/src/harness/background-task-manager.js +233 -36
- package/src/harness/jsonl-session-store.js +2551 -167
- package/src/harness/mcp-client.js +802 -61
- package/src/harness/prompt-compressor.js +227 -27
- package/src/harness/session-index.js +89 -38
- package/src/harness/session-list-index.js +254 -0
- package/src/harness/structured-handoff.js +410 -0
- package/src/lazy-dispatch.js +747 -84
- package/src/lib/__tests__/logger.test.js +50 -2
- package/src/lib/advisor-runtime.js +1047 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +120 -26
- package/src/lib/agent-session-export.js +20 -0
- package/src/lib/agent-team/task-lease.js +271 -3
- package/src/lib/agent-team/team-adjudication.js +1501 -0
- package/src/lib/agent-team/team-budget.js +4 -1
- package/src/lib/agent-team/team-control-store.js +582 -0
- package/src/lib/agent-team/team-distributed-queue.js +5246 -0
- package/src/lib/agent-team/team-process-checkpoint.js +211 -0
- package/src/lib/agent-team/team-runner.js +543 -24
- package/src/lib/agent-team/team-worktree.js +1403 -95
- package/src/lib/artifact-store.js +131 -8
- package/src/lib/background-agent-supervisor.js +185 -13
- package/src/lib/background-interaction-journal.js +37 -9
- package/src/lib/background-launch-profile.js +1058 -0
- package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
- package/src/lib/checkpoint-restore-orchestrator.js +987 -0
- package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
- package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
- package/src/lib/checkpoint-restore-recovery.js +884 -0
- package/src/lib/checkpoint-restore-retention.js +126 -0
- package/src/lib/checkpoint-restore-saga.js +5079 -0
- package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
- package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
- package/src/lib/checkpoint-store.js +1688 -97
- package/src/lib/checkpoint-timeline-authority.js +522 -0
- package/src/lib/checkpoint-timeline.js +642 -0
- package/src/lib/config-keys.js +18 -119
- package/src/lib/config-manager.js +446 -27
- package/src/lib/config-redaction.js +57 -0
- package/src/lib/config-schema.js +853 -0
- package/src/lib/cowork-mcp-tools.js +5 -0
- package/src/lib/cowork-task-runner.js +458 -63
- package/src/lib/delivery-coordinator.js +1234 -0
- package/src/lib/delivery-evidence.js +450 -0
- package/src/lib/doctor-checkup.js +199 -14
- package/src/lib/executable-path.js +34 -0
- package/src/lib/fatal-handler.js +16 -0
- package/src/lib/file-checkpoint.js +4909 -186
- package/src/lib/file-lines.js +125 -0
- package/src/lib/headless-config-command.js +16 -5
- package/src/lib/hook-runner.cjs +139 -38
- package/src/lib/hooks-v2-workspace-context.js +10 -0
- package/src/lib/impacted-gate-selector.js +424 -0
- package/src/lib/interaction-adapter.js +62 -0
- package/src/lib/jsonl-session-store.js +1 -35
- package/src/lib/logger.js +66 -14
- package/src/lib/managed-checkpoint-render.js +60 -0
- package/src/lib/managed-tool-checkpoint.js +194 -0
- package/src/lib/mcp-call-ledger-store.js +1069 -0
- package/src/lib/mcp-call-ledger.js +747 -0
- package/src/lib/mcp-client.js +5 -0
- package/src/lib/mcp-conflict-scheduler.js +468 -0
- package/src/lib/mcp-effect-contract.js +102 -0
- package/src/lib/mcp-headers-helper-trust.js +145 -0
- package/src/lib/mcp-headers-helper.js +616 -0
- package/src/lib/mcp-host-recovery-runtime.js +131 -0
- package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
- package/src/lib/mcp-recovery-adjudication.js +443 -0
- package/src/lib/output-context.js +86 -0
- package/src/lib/packer/file-identity.js +170 -0
- package/src/lib/packer/index.js +3 -0
- package/src/lib/packer/native-update-state.js +277 -0
- package/src/lib/packer/pack-update-applier.js +1983 -136
- package/src/lib/packer/pack-update-checker.js +34 -0
- package/src/lib/packer/pack-update-downloader.js +875 -86
- package/src/lib/packer/pack-update-signature.js +86 -0
- package/src/lib/packer/pkg-config-generator.js +6 -0
- package/src/lib/paths.js +65 -10
- package/src/lib/plan-mode.js +831 -14
- package/src/lib/plan-persistence.js +540 -0
- package/src/lib/plugin-runtime/hooks.js +227 -69
- package/src/lib/plugin-runtime/plugin-options.js +189 -44
- package/src/lib/pr-automation-policy.js +146 -8
- package/src/lib/process-execution-broker/credential-agent.js +7 -0
- package/src/lib/process-execution-broker/index.js +491 -13
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
- package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
- 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 +284 -19
- package/src/lib/process-execution-broker/workspace-transaction.js +4459 -0
- package/src/lib/project-instructions.js +165 -29
- package/src/lib/project-mcp-trust.js +67 -0
- package/src/lib/public-ide-capability-manifest.js +272 -0
- package/src/lib/public-ide-capability-validation.js +351 -0
- package/src/lib/secret-store.js +267 -43
- package/src/lib/secure-file-identity.js +433 -0
- package/src/lib/secure-fs.js +1089 -0
- package/src/lib/security-audit.js +58 -0
- package/src/lib/service-manager.js +34 -13
- package/src/lib/session-budget-runtime.js +1452 -0
- package/src/lib/session-host-snapshot.js +388 -0
- package/src/lib/session-message-provenance.js +429 -0
- package/src/lib/session-projection.js +804 -0
- package/src/lib/session-resource-budget.js +1495 -0
- package/src/lib/settings-hooks.cjs +138 -22
- package/src/lib/settings-loader.cjs +25 -2
- package/src/lib/side-effect-ledger-store.js +45 -23
- package/src/lib/skill-execution-identity.js +217 -0
- package/src/lib/skill-loader.js +299 -18
- package/src/lib/sub-agent-context.js +236 -28
- package/src/lib/sub-agent-registry.js +5 -0
- package/src/lib/subagent-contract.js +94 -0
- package/src/lib/todo-manager.js +185 -18
- package/src/lib/todo-persistence.js +417 -0
- package/src/lib/turn-binding-store.js +41 -23
- package/src/lib/turn-binding.js +160 -2
- package/src/lib/with-file-lock.js +165 -24
- package/src/lib/ws-chat-handler.js +21 -0
- package/src/program-base.js +18 -0
- package/src/repl/advisor-command.js +103 -0
- package/src/repl/agent-repl.js +2175 -146
- package/src/repl/btw-command.js +93 -10
- package/src/repl/clipboard-image.js +119 -0
- package/src/repl/config-summary.js +64 -108
- package/src/repl/prompt-editor.js +233 -0
- package/src/repl/prompt-interactions.js +344 -0
- package/src/repl/prompt-stash.js +354 -0
- package/src/repl/prompt-suggestions.js +312 -0
- package/src/repl/repl-keybindings.js +227 -0
- package/src/repl/session-recap.js +217 -0
- package/src/repl/slash-command-registry.js +22 -0
- package/src/repl/terminal-layout.js +88 -0
- package/src/runtime/agent-core.js +1630 -447
- package/src/runtime/coding-agent-contract-shared.cjs +13 -1
- package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
- package/src/runtime/diagnostics.js +32 -13
- package/src/runtime/headless-runner.js +310 -118
- package/src/runtime/headless-stream.js +356 -95
- package/src/runtime/mcp-config.js +148 -14
- package/src/runtime/policies/agent-policy.js +14 -0
- package/src/runtime/status-diagnostics-lite.js +137 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BU2Yqq5H.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-69ca_WeR.js +0 -7
- package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
- package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
- package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
|
@@ -22,9 +22,44 @@ import { EventEmitter } from "node:events";
|
|
|
22
22
|
import { getHomeDir } from "../lib/paths.js";
|
|
23
23
|
import executionBroker from "../lib/process-execution-broker/index.js";
|
|
24
24
|
|
|
25
|
+
function defaultKillProcessTree(child, signal = "SIGTERM") {
|
|
26
|
+
// `child.killed` only means Node successfully delivered an earlier signal;
|
|
27
|
+
// the process may still be alive and must remain eligible for escalation.
|
|
28
|
+
if (!child || child.exitCode !== null) return false;
|
|
29
|
+
try {
|
|
30
|
+
if (_deps.platform === "win32" && child.pid) {
|
|
31
|
+
const result = executionBroker.spawnSync(
|
|
32
|
+
"taskkill",
|
|
33
|
+
["/PID", String(child.pid), "/T", "/F"],
|
|
34
|
+
{
|
|
35
|
+
windowsHide: true,
|
|
36
|
+
encoding: "utf8",
|
|
37
|
+
origin: "background-task:process-tree-kill",
|
|
38
|
+
policy: "allow",
|
|
39
|
+
scope: "background-task",
|
|
40
|
+
},
|
|
41
|
+
);
|
|
42
|
+
if (!result?.error && result?.status === 0) return true;
|
|
43
|
+
return child.kill(signal) !== false;
|
|
44
|
+
}
|
|
45
|
+
if (child.pid) {
|
|
46
|
+
try {
|
|
47
|
+
process.kill(-child.pid, signal);
|
|
48
|
+
return true;
|
|
49
|
+
} catch {
|
|
50
|
+
return child.kill(signal) !== false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return child.kill(signal) !== false;
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
25
59
|
export const _deps = {
|
|
26
60
|
spawn: executionBroker.spawn.bind(executionBroker),
|
|
27
61
|
platform: process.platform,
|
|
62
|
+
killProcessTree: defaultKillProcessTree,
|
|
28
63
|
};
|
|
29
64
|
|
|
30
65
|
function getTasksDir() {
|
|
@@ -181,8 +216,23 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
181
216
|
? resolve(options.policyCwd || process.cwd())
|
|
182
217
|
: null;
|
|
183
218
|
this._resolveSandboxPolicy = resolveSandboxPolicy;
|
|
219
|
+
this.sessionBudget = options.sessionBudget || null;
|
|
220
|
+
if (
|
|
221
|
+
this.sessionBudget !== null &&
|
|
222
|
+
(typeof this.sessionBudget.acquireWork !== "function" ||
|
|
223
|
+
typeof this.sessionBudget.registerAbortable !== "function")
|
|
224
|
+
) {
|
|
225
|
+
throw new TypeError("sessionBudget must be a SessionResourceBudget");
|
|
226
|
+
}
|
|
227
|
+
this.killGraceMs =
|
|
228
|
+
Number.isFinite(options.killGraceMs) && options.killGraceMs >= 0
|
|
229
|
+
? options.killGraceMs
|
|
230
|
+
: 2000;
|
|
184
231
|
this.tasks = new Map();
|
|
185
232
|
this.processes = new Map();
|
|
233
|
+
this._budgetLeases = new Map();
|
|
234
|
+
this._budgetAbortCleanup = new Map();
|
|
235
|
+
this._killTimers = new Map();
|
|
186
236
|
this._checkInterval = null;
|
|
187
237
|
this._createSeq = 0;
|
|
188
238
|
if (options.recoverOnStart) {
|
|
@@ -229,6 +279,8 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
229
279
|
sandboxRequiredBoundaries: sandboxPolicy
|
|
230
280
|
? [...sandboxPolicy.requiredBoundaries].sort()
|
|
231
281
|
: null,
|
|
282
|
+
depth:
|
|
283
|
+
Number.isSafeInteger(spec.depth) && spec.depth >= 0 ? spec.depth : 1,
|
|
232
284
|
_seq: ++this._createSeq,
|
|
233
285
|
};
|
|
234
286
|
|
|
@@ -247,6 +299,11 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
247
299
|
if (task.status !== TaskStatus.PENDING) {
|
|
248
300
|
throw new Error(`Task ${taskId} is not pending (status: ${task.status})`);
|
|
249
301
|
}
|
|
302
|
+
if (this._runningCount() >= this.maxConcurrent) {
|
|
303
|
+
throw new Error(
|
|
304
|
+
`Max concurrent tasks reached (${this.maxConcurrent}). Wait for a task to finish.`,
|
|
305
|
+
);
|
|
306
|
+
}
|
|
250
307
|
|
|
251
308
|
const sandboxPolicy = this._resolvePinnedSandboxPolicy(task.cwd);
|
|
252
309
|
const pinnedBoundaries = task.sandboxRequiredBoundaries;
|
|
@@ -277,6 +334,22 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
277
334
|
}
|
|
278
335
|
}
|
|
279
336
|
|
|
337
|
+
const budgetLease = this.sessionBudget?.acquireWork({
|
|
338
|
+
id: `background-task:${taskId}`,
|
|
339
|
+
kind: "background-task",
|
|
340
|
+
depth: task.depth ?? 1,
|
|
341
|
+
});
|
|
342
|
+
if (budgetLease && !budgetLease.ok) {
|
|
343
|
+
const error = new Error(
|
|
344
|
+
`Background task blocked by session budget: ${budgetLease.reason}`,
|
|
345
|
+
);
|
|
346
|
+
error.code = "ERR_SESSION_RESOURCE_BUDGET";
|
|
347
|
+
error.budgetReason = budgetLease.reason;
|
|
348
|
+
error.retryable = budgetLease.retryable === true;
|
|
349
|
+
throw error;
|
|
350
|
+
}
|
|
351
|
+
if (budgetLease) this._budgetLeases.set(taskId, budgetLease);
|
|
352
|
+
|
|
280
353
|
task.status = TaskStatus.RUNNING;
|
|
281
354
|
task.startedAt = Date.now();
|
|
282
355
|
task.lastHeartbeat = Date.now();
|
|
@@ -288,33 +361,43 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
288
361
|
import.meta.dirname || ".",
|
|
289
362
|
"background-task-worker.js",
|
|
290
363
|
);
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
364
|
+
let child;
|
|
365
|
+
try {
|
|
366
|
+
child = _deps.spawn(
|
|
367
|
+
process.execPath,
|
|
368
|
+
[
|
|
369
|
+
...(sandboxPolicy ? [] : process.execArgv),
|
|
370
|
+
workerPath,
|
|
371
|
+
task.command,
|
|
372
|
+
task.cwd,
|
|
373
|
+
task.type,
|
|
374
|
+
task.sandboxWorkspaceCwd || "",
|
|
375
|
+
JSON.stringify(task.sandboxRequiredBoundaries || []),
|
|
376
|
+
],
|
|
377
|
+
{
|
|
378
|
+
cwd: task.cwd,
|
|
379
|
+
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
380
|
+
env: sandboxPolicy
|
|
381
|
+
? strongWorkerEnvironment(taskId)
|
|
382
|
+
: { ...process.env, CC_TASK_ID: taskId },
|
|
383
|
+
origin: "background-task:worker",
|
|
384
|
+
policy: "allow",
|
|
385
|
+
scope: "background-task",
|
|
386
|
+
shell: false,
|
|
387
|
+
// POSIX group ownership lets cancellation kill the worker and every
|
|
388
|
+
// shell/tool descendant with one negative-pid signal.
|
|
389
|
+
detached: _deps.platform !== "win32",
|
|
390
|
+
},
|
|
391
|
+
);
|
|
392
|
+
} catch (error) {
|
|
393
|
+
this._complete(taskId, TaskStatus.FAILED, null, error.message);
|
|
394
|
+
throw error;
|
|
395
|
+
}
|
|
314
396
|
|
|
315
397
|
this.processes.set(taskId, child);
|
|
316
398
|
|
|
317
399
|
child.on("message", (msg) => {
|
|
400
|
+
if (task.status !== TaskStatus.RUNNING) return;
|
|
318
401
|
if (msg.type === "heartbeat") {
|
|
319
402
|
task.lastHeartbeat = Date.now();
|
|
320
403
|
} else if (msg.type === "result") {
|
|
@@ -345,14 +428,35 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
345
428
|
);
|
|
346
429
|
}
|
|
347
430
|
}
|
|
348
|
-
this.
|
|
431
|
+
this._settleProcessOwnership(taskId, child);
|
|
349
432
|
});
|
|
350
433
|
|
|
351
434
|
child.on("error", (err) => {
|
|
352
435
|
this._complete(taskId, TaskStatus.FAILED, null, err.message);
|
|
353
|
-
this.
|
|
436
|
+
this._settleProcessOwnership(taskId, child);
|
|
354
437
|
});
|
|
355
438
|
|
|
439
|
+
if (this.sessionBudget) {
|
|
440
|
+
try {
|
|
441
|
+
const unregister = this.sessionBudget.registerAbortable(
|
|
442
|
+
`background-task:${taskId}`,
|
|
443
|
+
(reason) => this._stopForBudget(taskId, reason),
|
|
444
|
+
);
|
|
445
|
+
this._budgetAbortCleanup.set(taskId, unregister);
|
|
446
|
+
} catch (error) {
|
|
447
|
+
// Registration happens after spawn, so settlement and lease release
|
|
448
|
+
// must still run even if an injected/host kill adapter itself throws.
|
|
449
|
+
try {
|
|
450
|
+
_deps.killProcessTree(child, "SIGKILL");
|
|
451
|
+
} catch {
|
|
452
|
+
// Keep the live child in `processes` so destroy()/its eventual event
|
|
453
|
+
// retains ownership and can retry instead of orphaning it.
|
|
454
|
+
}
|
|
455
|
+
this._complete(taskId, TaskStatus.FAILED, null, error.message);
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
356
460
|
this._persistTask(task, "started");
|
|
357
461
|
this._ensureHeartbeatChecker();
|
|
358
462
|
return task;
|
|
@@ -435,16 +539,20 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
435
539
|
stop(taskId) {
|
|
436
540
|
const child = this.processes.get(taskId);
|
|
437
541
|
if (child) {
|
|
438
|
-
|
|
542
|
+
this._clearKillTimer(taskId);
|
|
543
|
+
_deps.killProcessTree(child, "SIGTERM");
|
|
439
544
|
// Escalate to SIGKILL only if SIGTERM didn't take. unref() + clear-on-exit
|
|
440
545
|
// so a prompt exit (or process shutdown right after stop) isn't held open
|
|
441
546
|
// for the full grace period by this timer.
|
|
442
547
|
const killTimer = setTimeout(() => {
|
|
443
|
-
if (child.exitCode === null)
|
|
444
|
-
|
|
548
|
+
if (child.exitCode === null) {
|
|
549
|
+
_deps.killProcessTree(child, "SIGKILL");
|
|
550
|
+
}
|
|
551
|
+
}, this.killGraceMs);
|
|
445
552
|
if (killTimer && typeof killTimer.unref === "function") killTimer.unref();
|
|
553
|
+
this._killTimers.set(taskId, killTimer);
|
|
446
554
|
if (typeof child.once === "function") {
|
|
447
|
-
child.once("exit", () =>
|
|
555
|
+
child.once("exit", () => this._clearKillTimer(taskId));
|
|
448
556
|
}
|
|
449
557
|
}
|
|
450
558
|
const task = this.tasks.get(taskId);
|
|
@@ -454,6 +562,66 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
454
562
|
this._complete(taskId, TaskStatus.FAILED, null, "Stopped by user");
|
|
455
563
|
}
|
|
456
564
|
|
|
565
|
+
_stopForBudget(taskId, reason) {
|
|
566
|
+
const child = this.processes.get(taskId);
|
|
567
|
+
if (child) {
|
|
568
|
+
this._clearKillTimer(taskId);
|
|
569
|
+
_deps.killProcessTree(child, "SIGTERM");
|
|
570
|
+
const killTimer = setTimeout(() => {
|
|
571
|
+
if (child.exitCode === null) {
|
|
572
|
+
_deps.killProcessTree(child, "SIGKILL");
|
|
573
|
+
}
|
|
574
|
+
}, this.killGraceMs);
|
|
575
|
+
killTimer?.unref?.();
|
|
576
|
+
this._killTimers.set(taskId, killTimer);
|
|
577
|
+
child.once?.("exit", () => this._clearKillTimer(taskId));
|
|
578
|
+
}
|
|
579
|
+
const budgetReason =
|
|
580
|
+
reason?.budgetReason || reason?.message || "session-budget";
|
|
581
|
+
const task = this.tasks.get(taskId);
|
|
582
|
+
if (task) {
|
|
583
|
+
this._recordHistory(task, "budget-stop-requested", { budgetReason });
|
|
584
|
+
}
|
|
585
|
+
this._complete(
|
|
586
|
+
taskId,
|
|
587
|
+
TaskStatus.FAILED,
|
|
588
|
+
null,
|
|
589
|
+
`Session budget exhausted: ${budgetReason}`,
|
|
590
|
+
);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
_clearKillTimer(taskId) {
|
|
594
|
+
const timer = this._killTimers.get(taskId);
|
|
595
|
+
if (timer) clearTimeout(timer);
|
|
596
|
+
this._killTimers.delete(taskId);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
_releaseBudget(taskId) {
|
|
600
|
+
const unregister = this._budgetAbortCleanup.get(taskId);
|
|
601
|
+
this._budgetAbortCleanup.delete(taskId);
|
|
602
|
+
try {
|
|
603
|
+
unregister?.();
|
|
604
|
+
} catch {
|
|
605
|
+
// Budget cancellation has already been delivered.
|
|
606
|
+
}
|
|
607
|
+
const lease = this._budgetLeases.get(taskId);
|
|
608
|
+
this._budgetLeases.delete(taskId);
|
|
609
|
+
try {
|
|
610
|
+
lease?.release?.();
|
|
611
|
+
} catch {
|
|
612
|
+
// Work leases are idempotent and must not hide task settlement.
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
_settleProcessOwnership(taskId, child = null) {
|
|
617
|
+
const ownedChild = this.processes.get(taskId);
|
|
618
|
+
if (child && ownedChild && ownedChild !== child) return false;
|
|
619
|
+
if (ownedChild) this.processes.delete(taskId);
|
|
620
|
+
this._clearKillTimer(taskId);
|
|
621
|
+
this._releaseBudget(taskId);
|
|
622
|
+
return Boolean(ownedChild);
|
|
623
|
+
}
|
|
624
|
+
|
|
457
625
|
cleanup(maxAge = 3600000) {
|
|
458
626
|
const cutoff = Date.now() - maxAge;
|
|
459
627
|
let removed = 0;
|
|
@@ -478,16 +646,35 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
478
646
|
clearInterval(this._checkInterval);
|
|
479
647
|
this._checkInterval = null;
|
|
480
648
|
}
|
|
481
|
-
for (const [id] of this.processes) {
|
|
649
|
+
for (const [id, child] of this.processes) {
|
|
482
650
|
this.stop(id);
|
|
651
|
+
// destroy() has no future owner that can wait for the grace timer. Force
|
|
652
|
+
// the detached group/tree down before clearing process accountability.
|
|
653
|
+
if (child.exitCode === null) {
|
|
654
|
+
_deps.killProcessTree(child, "SIGKILL");
|
|
655
|
+
}
|
|
656
|
+
this._clearKillTimer(id);
|
|
483
657
|
}
|
|
484
658
|
this.tasks.clear();
|
|
485
|
-
this.
|
|
659
|
+
for (const taskId of [...this._killTimers.keys()]) {
|
|
660
|
+
this._clearKillTimer(taskId);
|
|
661
|
+
}
|
|
662
|
+
for (const taskId of [...this._budgetLeases.keys()]) {
|
|
663
|
+
if (!this.processes.has(taskId)) this._releaseBudget(taskId);
|
|
664
|
+
}
|
|
486
665
|
}
|
|
487
666
|
|
|
488
667
|
_complete(taskId, status, result, error) {
|
|
489
668
|
const task = this.tasks.get(taskId);
|
|
490
669
|
if (!task) return;
|
|
670
|
+
if (
|
|
671
|
+
task.completedAt !== null &&
|
|
672
|
+
[TaskStatus.COMPLETED, TaskStatus.FAILED, TaskStatus.TIMEOUT].includes(
|
|
673
|
+
task.status,
|
|
674
|
+
)
|
|
675
|
+
) {
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
491
678
|
|
|
492
679
|
task.status = status;
|
|
493
680
|
task.completedAt = Date.now();
|
|
@@ -496,15 +683,24 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
496
683
|
task.outputSummary = this._buildOutputSummary({ result, error, status });
|
|
497
684
|
this._recordHistory(task, "completed", { status, result, error });
|
|
498
685
|
this._persistTask(task, "completed");
|
|
686
|
+
// Logical settlement can arrive over IPC before the worker and its tool
|
|
687
|
+
// descendants have physically exited. Keep the work lease and abort hook
|
|
688
|
+
// until exit/error proves that process ownership has ended.
|
|
689
|
+
if (!this.processes.has(taskId)) this._releaseBudget(taskId);
|
|
499
690
|
this.emit("task:complete", task);
|
|
500
691
|
}
|
|
501
692
|
|
|
502
693
|
_runningCount() {
|
|
503
|
-
|
|
694
|
+
// A task can be known to be running before/without a local child-process
|
|
695
|
+
// entry (for example a restored task or an alternate executor), while a
|
|
696
|
+
// logically settled task must continue occupying capacity until its owned
|
|
697
|
+
// worker actually exits. Count the union so neither case can bypass the
|
|
698
|
+
// concurrency ceiling, and avoid double-counting ordinary local workers.
|
|
699
|
+
const activeTaskIds = new Set(this.processes.keys());
|
|
504
700
|
for (const task of this.tasks.values()) {
|
|
505
|
-
if (task.status === TaskStatus.RUNNING)
|
|
701
|
+
if (task.status === TaskStatus.RUNNING) activeTaskIds.add(task.id);
|
|
506
702
|
}
|
|
507
|
-
return
|
|
703
|
+
return activeTaskIds.size;
|
|
508
704
|
}
|
|
509
705
|
|
|
510
706
|
_persistTask(task, eventType = "snapshot", meta = {}) {
|
|
@@ -736,8 +932,9 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
736
932
|
this._complete(id, TaskStatus.TIMEOUT, null, "Heartbeat timeout");
|
|
737
933
|
const child = this.processes.get(id);
|
|
738
934
|
if (child) {
|
|
739
|
-
|
|
740
|
-
|
|
935
|
+
_deps.killProcessTree(child, "SIGKILL");
|
|
936
|
+
// Retain ownership until exit/error confirms the child is gone;
|
|
937
|
+
// destroy() can otherwise retry a failed host termination.
|
|
741
938
|
}
|
|
742
939
|
}
|
|
743
940
|
}
|