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
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { closeSync, fstatSync, openSync, readSync } from "node:fs";
|
|
2
|
+
import { StringDecoder } from "node:string_decoder";
|
|
3
|
+
|
|
4
|
+
const DEFAULT_CHUNK_SIZE = 64 * 1024;
|
|
5
|
+
|
|
6
|
+
function recordRead(ioMetrics, bytes) {
|
|
7
|
+
if (!ioMetrics || typeof ioMetrics !== "object") return;
|
|
8
|
+
ioMetrics.readCalls = Math.max(0, Number(ioMetrics.readCalls) || 0) + 1;
|
|
9
|
+
ioMetrics.bytesRead =
|
|
10
|
+
Math.max(0, Number(ioMetrics.bytesRead) || 0) + Math.max(0, bytes || 0);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Stream UTF-8 lines from a file without loading the whole file. The final
|
|
15
|
+
* unterminated fragment is yielded with `terminated:false`, which lets callers
|
|
16
|
+
* distinguish a crash tail from a normal record.
|
|
17
|
+
*/
|
|
18
|
+
export function* iterateFileLinesSync(
|
|
19
|
+
filePath,
|
|
20
|
+
{
|
|
21
|
+
chunkSize = DEFAULT_CHUNK_SIZE,
|
|
22
|
+
includeEmpty = false,
|
|
23
|
+
ioMetrics = null,
|
|
24
|
+
} = {},
|
|
25
|
+
) {
|
|
26
|
+
const fd = openSync(filePath, "r");
|
|
27
|
+
const decoder = new StringDecoder("utf8");
|
|
28
|
+
const buffer = Buffer.allocUnsafe(Math.max(1024, chunkSize));
|
|
29
|
+
let pending = "";
|
|
30
|
+
let lineNo = 0;
|
|
31
|
+
try {
|
|
32
|
+
for (;;) {
|
|
33
|
+
const bytes = readSync(fd, buffer, 0, buffer.length, null);
|
|
34
|
+
if (bytes === 0) break;
|
|
35
|
+
recordRead(ioMetrics, bytes);
|
|
36
|
+
pending += decoder.write(buffer.subarray(0, bytes));
|
|
37
|
+
let newline;
|
|
38
|
+
while ((newline = pending.indexOf("\n")) >= 0) {
|
|
39
|
+
let line = pending.slice(0, newline);
|
|
40
|
+
if (line.endsWith("\r")) line = line.slice(0, -1);
|
|
41
|
+
pending = pending.slice(newline + 1);
|
|
42
|
+
lineNo += 1;
|
|
43
|
+
if (includeEmpty || line.length > 0) {
|
|
44
|
+
yield { line, lineNo, terminated: true };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
pending += decoder.end();
|
|
49
|
+
if (pending.length > 0 || includeEmpty) {
|
|
50
|
+
lineNo += 1;
|
|
51
|
+
if (includeEmpty || pending.length > 0) {
|
|
52
|
+
yield { line: pending, lineNo, terminated: false };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} finally {
|
|
56
|
+
closeSync(fd);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Read UTF-8 lines newest-first using bounded memory. Lines are assembled as
|
|
62
|
+
* bytes before decoding so a multibyte character split across chunks remains
|
|
63
|
+
* intact. `terminated:false` marks only the physical tail fragment.
|
|
64
|
+
*/
|
|
65
|
+
export function* iterateFileLinesReverseSync(
|
|
66
|
+
filePath,
|
|
67
|
+
{
|
|
68
|
+
chunkSize = DEFAULT_CHUNK_SIZE,
|
|
69
|
+
includeEmpty = false,
|
|
70
|
+
ioMetrics = null,
|
|
71
|
+
} = {},
|
|
72
|
+
) {
|
|
73
|
+
const fd = openSync(filePath, "r");
|
|
74
|
+
const size = fstatSync(fd).size;
|
|
75
|
+
let endsWithNewline = false;
|
|
76
|
+
if (size > 0) {
|
|
77
|
+
const last = Buffer.allocUnsafe(1);
|
|
78
|
+
const bytes = readSync(fd, last, 0, 1, size - 1);
|
|
79
|
+
recordRead(ioMetrics, bytes);
|
|
80
|
+
endsWithNewline = last[0] === 0x0a;
|
|
81
|
+
}
|
|
82
|
+
let position = size;
|
|
83
|
+
let carry = Buffer.alloc(0);
|
|
84
|
+
let isPhysicalTail = true;
|
|
85
|
+
try {
|
|
86
|
+
while (position > 0) {
|
|
87
|
+
const length = Math.min(Math.max(1024, chunkSize), position);
|
|
88
|
+
position -= length;
|
|
89
|
+
const chunk = Buffer.allocUnsafe(length);
|
|
90
|
+
const bytes = readSync(fd, chunk, 0, length, position);
|
|
91
|
+
recordRead(ioMetrics, bytes);
|
|
92
|
+
const combined = Buffer.concat([chunk, carry]);
|
|
93
|
+
let end = combined.length;
|
|
94
|
+
for (let index = combined.length - 1; index >= 0; index -= 1) {
|
|
95
|
+
if (combined[index] !== 0x0a) continue;
|
|
96
|
+
let bytes = combined.subarray(index + 1, end);
|
|
97
|
+
if (bytes.length > 0 && bytes[bytes.length - 1] === 0x0d) {
|
|
98
|
+
bytes = bytes.subarray(0, bytes.length - 1);
|
|
99
|
+
}
|
|
100
|
+
const line = bytes.toString("utf8");
|
|
101
|
+
const terminated = isPhysicalTail ? endsWithNewline : true;
|
|
102
|
+
// A file ending in "\n" produces one empty physical-tail slice. Skip
|
|
103
|
+
// it without changing the termination status of the real last line.
|
|
104
|
+
if (includeEmpty || line.length > 0) {
|
|
105
|
+
yield { line, terminated };
|
|
106
|
+
isPhysicalTail = false;
|
|
107
|
+
}
|
|
108
|
+
end = index;
|
|
109
|
+
}
|
|
110
|
+
carry = combined.subarray(0, end);
|
|
111
|
+
}
|
|
112
|
+
if (carry.length > 0 || includeEmpty) {
|
|
113
|
+
let bytes = carry;
|
|
114
|
+
if (bytes.length > 0 && bytes[bytes.length - 1] === 0x0d) {
|
|
115
|
+
bytes = bytes.subarray(0, bytes.length - 1);
|
|
116
|
+
}
|
|
117
|
+
const line = bytes.toString("utf8");
|
|
118
|
+
if (includeEmpty || line.length > 0) {
|
|
119
|
+
yield { line, terminated: !isPhysicalTail };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} finally {
|
|
123
|
+
closeSync(fd);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
renderConfigGet,
|
|
17
17
|
renderConfigSet,
|
|
18
18
|
renderConfigSummary,
|
|
19
|
+
isSecretConfigKey,
|
|
19
20
|
} from "../repl/config-summary.js";
|
|
20
21
|
|
|
21
22
|
/** Does this headless prompt start with the `/config` slash command? */
|
|
@@ -48,11 +49,21 @@ export function runConfigDirective(prompt, deps = {}) {
|
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
if (cmd.action === "set") {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
if (isSecretConfigKey(cmd.key)) {
|
|
53
|
+
return {
|
|
54
|
+
text: `/config: ${cmd.key} is secret; use cc config set-secret ${cmd.key}`,
|
|
55
|
+
isError: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
cm.setConfigValue(cmd.key, cmd.value);
|
|
60
|
+
return {
|
|
61
|
+
text: renderConfigSet(cmd.key, cm.getConfigValue(cmd.key)),
|
|
62
|
+
isError: false,
|
|
63
|
+
};
|
|
64
|
+
} catch (error) {
|
|
65
|
+
return { text: `/config: ${error.message}`, isError: true };
|
|
66
|
+
}
|
|
56
67
|
}
|
|
57
68
|
// show
|
|
58
69
|
return {
|
package/src/lib/hook-runner.cjs
CHANGED
|
@@ -164,9 +164,20 @@ function tryParseDecision(stdout) {
|
|
|
164
164
|
if (firstLine && firstLine[0] === "{") obj = tryJson(firstLine);
|
|
165
165
|
}
|
|
166
166
|
if (obj === undefined || obj === null || typeof obj !== "object") return null;
|
|
167
|
+
if (Array.isArray(obj)) {
|
|
168
|
+
return {
|
|
169
|
+
decision: HOOK_DECISIONS.CONTINUE,
|
|
170
|
+
reason: "hook decision payload must be a JSON object",
|
|
171
|
+
unsupportedDecision: true,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
167
174
|
// PreToolUse-specific permission decision
|
|
168
175
|
const hso = obj.hookSpecificOutput;
|
|
169
|
-
if (
|
|
176
|
+
if (
|
|
177
|
+
hso &&
|
|
178
|
+
typeof hso === "object" &&
|
|
179
|
+
Object.prototype.hasOwnProperty.call(hso, "permissionDecision")
|
|
180
|
+
) {
|
|
170
181
|
const pd = String(hso.permissionDecision).toLowerCase();
|
|
171
182
|
const decision =
|
|
172
183
|
pd === "deny"
|
|
@@ -176,10 +187,17 @@ function tryParseDecision(stdout) {
|
|
|
176
187
|
: pd === "allow"
|
|
177
188
|
? HOOK_DECISIONS.ALLOW
|
|
178
189
|
: HOOK_DECISIONS.CONTINUE;
|
|
179
|
-
|
|
190
|
+
const supported = pd === "deny" || pd === "ask" || pd === "allow";
|
|
191
|
+
return {
|
|
192
|
+
decision,
|
|
193
|
+
reason: supported
|
|
194
|
+
? hso.permissionDecisionReason || null
|
|
195
|
+
: `unsupported hook permissionDecision: ${pd || "<empty>"}`,
|
|
196
|
+
...(supported ? {} : { unsupportedDecision: true }),
|
|
197
|
+
};
|
|
180
198
|
}
|
|
181
199
|
// Generic decision field
|
|
182
|
-
if (obj
|
|
200
|
+
if (Object.prototype.hasOwnProperty.call(obj, "decision")) {
|
|
183
201
|
const d = String(obj.decision).toLowerCase();
|
|
184
202
|
const decision =
|
|
185
203
|
d === "block" || d === "deny"
|
|
@@ -189,15 +207,37 @@ function tryParseDecision(stdout) {
|
|
|
189
207
|
: d === "ask"
|
|
190
208
|
? HOOK_DECISIONS.ASK
|
|
191
209
|
: HOOK_DECISIONS.CONTINUE;
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
210
|
+
const supported =
|
|
211
|
+
d === "block" ||
|
|
212
|
+
d === "deny" ||
|
|
213
|
+
d === "approve" ||
|
|
214
|
+
d === "allow" ||
|
|
215
|
+
d === "ask" ||
|
|
216
|
+
d === "continue";
|
|
196
217
|
return {
|
|
197
|
-
decision
|
|
198
|
-
reason:
|
|
218
|
+
decision,
|
|
219
|
+
reason: supported
|
|
220
|
+
? obj.reason || null
|
|
221
|
+
: `unsupported hook decision: ${d || "<empty>"}`,
|
|
222
|
+
...(supported ? {} : { unsupportedDecision: true }),
|
|
199
223
|
};
|
|
200
224
|
}
|
|
225
|
+
// continue:false → stop/block
|
|
226
|
+
if (Object.prototype.hasOwnProperty.call(obj, "continue")) {
|
|
227
|
+
if (obj.continue === false) {
|
|
228
|
+
return {
|
|
229
|
+
decision: HOOK_DECISIONS.BLOCK,
|
|
230
|
+
reason: obj.stopReason || obj.reason || "hook requested stop",
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (obj.continue !== true) {
|
|
234
|
+
return {
|
|
235
|
+
decision: HOOK_DECISIONS.CONTINUE,
|
|
236
|
+
reason: "hook continue field must be boolean",
|
|
237
|
+
unsupportedDecision: true,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
201
241
|
return {
|
|
202
242
|
decision: HOOK_DECISIONS.CONTINUE,
|
|
203
243
|
reason: null,
|
|
@@ -205,6 +245,42 @@ function tryParseDecision(stdout) {
|
|
|
205
245
|
};
|
|
206
246
|
}
|
|
207
247
|
|
|
248
|
+
/**
|
|
249
|
+
* Upgrade an execution/protocol failure to a blocking authority decision.
|
|
250
|
+
* Direct command-hook calls and observe/Post aggregation retain their historic
|
|
251
|
+
* fail-open behavior; runHooks callers opt in with `{ failClosed: true }`.
|
|
252
|
+
* Keeping this conversion at the aggregation boundary also preserves the
|
|
253
|
+
* underlying nonBlockingError/breaker/protocol flags for audit telemetry.
|
|
254
|
+
*/
|
|
255
|
+
function failClosedAuthorityResult(result) {
|
|
256
|
+
const supportedDecision =
|
|
257
|
+
result && Object.values(HOOK_DECISIONS).includes(result.decision);
|
|
258
|
+
const authorityFailure =
|
|
259
|
+
!supportedDecision ||
|
|
260
|
+
result.nonBlockingError === true ||
|
|
261
|
+
result.breakerOpen === true ||
|
|
262
|
+
result.malformedDecision === true ||
|
|
263
|
+
result.unsupportedDecision === true;
|
|
264
|
+
|
|
265
|
+
if (!authorityFailure || result?.decision === HOOK_DECISIONS.BLOCK) {
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const detail =
|
|
270
|
+
result?.reason ||
|
|
271
|
+
result?.error ||
|
|
272
|
+
(!supportedDecision
|
|
273
|
+
? "hook returned an invalid decision result"
|
|
274
|
+
: "hook authority evaluation failed");
|
|
275
|
+
return {
|
|
276
|
+
...(result || {}),
|
|
277
|
+
decision: HOOK_DECISIONS.BLOCK,
|
|
278
|
+
reason: `authority-bearing hook failed closed: ${detail}`,
|
|
279
|
+
authorityFailure: true,
|
|
280
|
+
originalDecision: supportedDecision ? result.decision : null,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
208
284
|
/**
|
|
209
285
|
* Run one command hook. `input` is JSON-serialized to the hook's stdin.
|
|
210
286
|
*
|
|
@@ -676,6 +752,12 @@ async function _runCommandHookInnerAsync(command, input = {}, opts = {}) {
|
|
|
676
752
|
* This closes the safety gap where an earlier hook's `ask` masks a LATER hook's
|
|
677
753
|
* `block` (the short-circuit path returns `ask` and never runs the blocker).
|
|
678
754
|
* Claude-Code parity: all matching hooks contribute to the merged decision.
|
|
755
|
+
*
|
|
756
|
+
* `opts.failClosed: true` (or its semantic alias `authorityBearing: true`)
|
|
757
|
+
* marks an authority-bearing decision path. It implies strict merge and
|
|
758
|
+
* upgrades spawn/timeout/breaker/protocol failures to BLOCK. The default
|
|
759
|
+
* remains fail-open for observe/Post hooks.
|
|
760
|
+
*
|
|
679
761
|
* spawnSync is synchronous so execution is sequential — but the MERGE is
|
|
680
762
|
* order-independent, so the outcome matches a parallel run.
|
|
681
763
|
*
|
|
@@ -684,25 +766,32 @@ async function _runCommandHookInnerAsync(command, input = {}, opts = {}) {
|
|
|
684
766
|
function runHooks(commandHooks, input = {}, opts = {}) {
|
|
685
767
|
const results = [];
|
|
686
768
|
const hooks = commandHooks || [];
|
|
769
|
+
const failClosed = opts.failClosed === true || opts.authorityBearing === true;
|
|
687
770
|
const runOne = (h) => {
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
771
|
+
try {
|
|
772
|
+
const sandboxPolicy = resolveHookSandboxPolicy(h, opts);
|
|
773
|
+
const result = runCommandHook(h.command, input, {
|
|
774
|
+
...opts,
|
|
775
|
+
...(sandboxPolicy ? { sandboxPolicy } : {}),
|
|
776
|
+
broker: opts.broker,
|
|
777
|
+
origin: h.origin,
|
|
778
|
+
pluginId: h.pluginId,
|
|
779
|
+
pluginVersion: h.pluginVersion,
|
|
780
|
+
pluginSource: h.pluginSource,
|
|
781
|
+
timeout: h.timeout != null ? h.timeout * 1000 : opts.timeout,
|
|
782
|
+
environmentAllowlist: h.environmentAllowlist || h.envAllowlist,
|
|
783
|
+
// per-hook shell selection (P1 #8): `{ "type":"command", "command":…,
|
|
784
|
+
// "shell":"powershell" }` in the settings hook entry
|
|
785
|
+
shell: h.shell != null ? h.shell : opts.shell,
|
|
786
|
+
});
|
|
787
|
+
return failClosed ? failClosedAuthorityResult(result) : result;
|
|
788
|
+
} catch (error) {
|
|
789
|
+
if (!failClosed) throw error;
|
|
790
|
+
return failClosedAuthorityResult(hookSpawnFailure(error));
|
|
791
|
+
}
|
|
703
792
|
};
|
|
704
793
|
|
|
705
|
-
if (opts.mergeStrict) {
|
|
794
|
+
if (opts.mergeStrict || failClosed) {
|
|
706
795
|
const decisions = [];
|
|
707
796
|
for (const h of hooks) {
|
|
708
797
|
const r = runOne(h);
|
|
@@ -752,21 +841,33 @@ function runHooks(commandHooks, input = {}, opts = {}) {
|
|
|
752
841
|
*/
|
|
753
842
|
async function runHooksParallel(commandHooks, input = {}, opts = {}) {
|
|
754
843
|
const hooks = commandHooks || [];
|
|
844
|
+
const failClosed = opts.failClosed === true || opts.authorityBearing === true;
|
|
755
845
|
const settled = await Promise.all(
|
|
756
846
|
hooks.map((h) => {
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
847
|
+
try {
|
|
848
|
+
const sandboxPolicy = resolveHookSandboxPolicy(h, opts);
|
|
849
|
+
return runCommandHookAsync(h.command, input, {
|
|
850
|
+
...opts,
|
|
851
|
+
...(sandboxPolicy ? { sandboxPolicy } : {}),
|
|
852
|
+
broker: opts.broker,
|
|
853
|
+
origin: h.origin,
|
|
854
|
+
pluginId: h.pluginId,
|
|
855
|
+
pluginVersion: h.pluginVersion,
|
|
856
|
+
pluginSource: h.pluginSource,
|
|
857
|
+
timeout: h.timeout != null ? h.timeout * 1000 : opts.timeout,
|
|
858
|
+
environmentAllowlist: h.environmentAllowlist || h.envAllowlist,
|
|
859
|
+
shell: h.shell != null ? h.shell : opts.shell,
|
|
860
|
+
}).then((r) => ({
|
|
861
|
+
h,
|
|
862
|
+
r: failClosed ? failClosedAuthorityResult(r) : r,
|
|
863
|
+
}));
|
|
864
|
+
} catch (error) {
|
|
865
|
+
if (!failClosed) throw error;
|
|
866
|
+
return Promise.resolve({
|
|
867
|
+
h,
|
|
868
|
+
r: failClosedAuthorityResult(hookSpawnFailure(error)),
|
|
869
|
+
});
|
|
870
|
+
}
|
|
770
871
|
}),
|
|
771
872
|
);
|
|
772
873
|
const results = settled.map(({ h, r }) => ({ command: h.command, ...r }));
|
|
@@ -232,6 +232,16 @@ export function currentHostHooksV2WorkspaceBinding() {
|
|
|
232
232
|
return verifyWorkspaceRecord(trustedWorkspaceStorage.getStore());
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
+
/** Resolve only the exact opaque binding object issued by this host process. */
|
|
236
|
+
export function resolveHostHooksV2WorkspaceBinding(binding) {
|
|
237
|
+
if (!binding || typeof binding !== "object") return null;
|
|
238
|
+
const bindingId = binding.bindingId;
|
|
239
|
+
if (typeof bindingId !== "string") return null;
|
|
240
|
+
const record = registeredHostWorkspaces.get(bindingId);
|
|
241
|
+
if (!record || record.binding !== binding) return null;
|
|
242
|
+
return verifyWorkspaceRecord(record);
|
|
243
|
+
}
|
|
244
|
+
|
|
235
245
|
/**
|
|
236
246
|
* Resolve an opaque durable binding only against roots registered by the
|
|
237
247
|
* current host process. No persisted or event-supplied path is accepted.
|