chainlesschain 0.166.6 → 0.166.9
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 +21 -0
- package/package.json +5 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CVnFjTfG.js → AIOps-DJvpifGx.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BxkwuuQC.js → ActionButton-D2UhuF_A.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C2670q6z.js → Analytics-C9ho9obu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CU_rylW6.js → AppLayout-BvRCpFK3.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-DGJmYqnj.js → Artifacts-jxrySvpk.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BZOQbINJ.js → Audit-ovEw0ZYl.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DghB4QwF.js → BackgroundAgents-D7H5z6zS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-l0mwPbta.js → Backup-BuXob8za.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bv3WSZOh.js → BaseInput-CtnszuQ2.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-s88nBdvt.js → Chat-B_mYE8fJ.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Z8CBuB1a.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B5icasEs.js → Checkbox-ierdtcJD.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CsUFqNud.js → Codegen-3VKPJD_B.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DlBtClaW.js → Col-1EdMyf5P.js} +1 -1
- package/src/assets/web-panel/assets/{Community-xRn1IdLB.js → Community-D6H7UA8K.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-naIr8a_o.js → Compact-BBAZvYIm.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dp9esfFE.js → Compliance-CgsTrAoj.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DQlMYJB-.js → Cowork-tnZgLoTE.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-Cd0oNLzJ.js → Cron-CPpZw2Nh.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BtDIx3XX.js → Crosschain-BymBcp5z.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BOlpzEwg.js → DID-DKPxS_K1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DV15Axk1.js → Dashboard-DvJhEmH9.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-COXrewN1.js → Dropdown-b8iQyQIZ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-EjIt0Cm7.js → EmailListRenderer--0-A-zKb.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DJlhwb-R.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BMiFl82k.js → Federation-BRhaE2Z8.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUcDQyxn.js → FormItemContext-C4dnq7yf.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C25uFxvK.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D20uaEUU.js → Git-4eA2fYzL.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CQxYJjCX.js → Governance-BJuY9Y-9.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-m-sczpS5.js → Inference-DZ5Dy4up.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CBsIlU0S.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D0-5bqeu.js → Logs-BKEeQEfJ.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CwDGFu2Q.js → Marketplace-Dhho4fEg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-7FxJ3omT.js → McpTools-BW6xxSlU.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DOVyb59U.js → Memory-mPqlpSkq.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DZXl-Hje.js → MobileBridge-Cb9N_DQI.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DlZ8tRXt.js → MobileProjects-BNs8tah_.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D7Pjx1s_.js → Mtc-CaxBt8tn.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BND7lX8p.js → MtcAudit-DRPQbp3t.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BknS7B-p.js → Multisig-CRm-d8bK.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-7C2-KPHt.js → NLProgramming-BCCk3LPs.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DNWdTndN.js → Notes-Cv8SN8gN.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DCm4KcJZ.js → NotificationSettings-CggIvTh5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DyVwwjJx.js → OrderTableRenderer-BW3_bV12.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dl2O_qJ9.js → Organization-BuRE-VCO.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BOFCvk9Q.js → Overflow-DBrm1gju.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DgdVowY1.js → P2P-CWVnDYgS.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-8RKUIpte.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-BHNEUUwa.js → Permissions-tDUAxogW.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CaZbrOdz.js → PersonalDataHub-Dv2-CFis.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DJDnoXmE.js → Pipeline-DM6kvFni.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CBQr2eX8.js → Privacy-DzK-yL0d.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Yghqa06z.js → ProjectInit-B5UrNpkj.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-HBAtJi8U.js → ProjectSettings-CxJD43oW.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
- package/src/assets/web-panel/assets/{Providers-uJTz77GI.js → Providers-CYl4jRYK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-k3M5ouTp.js → QrScannerModal-DeH2T0fH.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CMji45PH.js → QuickAsk-Bw9k_kTk.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DyoZYPls.js → Recommend-Bl_jGwoi.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D4hIs4vV.js → Reputation-Ds_Dfr-k.js} +1 -1
- package/src/assets/web-panel/assets/{Row-mzE-ElTg.js → Row-BpQUQTNj.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-cg7J3hI6.js → RssFeed-BatpZBGt.js} +3 -3
- package/src/assets/web-panel/assets/{Search-6M0TkGSZ.js → Search-D7hOObzi.js} +1 -1
- package/src/assets/web-panel/assets/{Security-B1GQ67qh.js → Security-dXQ4FKNt.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D_RwU_5S.js → Services-D8wInGPa.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-TZjk-dsW.js → Skeleton-DXQCoYpM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CG6FcaCV.js → Skills-D3oLRIVn.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BI190QDv.js → Sla-BmP4-LnJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BWmxF2Wu.js → SpeechSettings-DLj-xzro.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CwPiGw6L.js → SyncSettings-8KKaaRMr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BIXgCeSk.js → Tasks-GyK42I7C.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CQFgGCoK.js → Templates-n1y_8UBG.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DAelEdkL.js → Tenant-B39nBph8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BbqWK6qh.js → Terminal-DCQoOKXe.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-cmG3zvY5.js → TimelineRenderer-BkhbDfXk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C8444NKU.js → Tokens-BeHIIU8D.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C1Rpnz0I.js → Trigger-BHvWXVOb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-u4koPiFD.js → Trust-y2WaOSto.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-oPWKn80Z.js → UkeySign-DBFeJBzt.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D0CUUY_5.js → VideoEditing-BEOWitC-.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-fu9pIAbt.js → Wallet-BITedTe6.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Bc5ciuOx.js → WebAuthn-DMwlJVin.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-BCin4_4N.js → WorkflowEditor-CKfGFEu1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B2jbM-XN.js → chat-DR6gnBGF.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CUVoUQ_2.js → colors-C_Hw5NCn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DgOGpkRH.js → compact-item-B8IPwsEu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DIxU6eKI.js → createContext-D-u4JVnJ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DoKRKMav.js → hasIn-CZubdS4D.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByjrulIZ.js → index-11ASqx-A.js} +1 -1
- package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
- package/src/assets/web-panel/assets/{index-BwYofQJg.js → index-BXS6wYJZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLdpHe6w.js → index-Bi21Etg4.js} +1 -1
- package/src/assets/web-panel/assets/{index-2flsPFIX.js → index-Bizm87cX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXb-Smmm.js → index-Bv2132PO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5ySiGYy.js → index-BzoFanEQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWbL1-N0.js → index-C25rOz7O.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj-us-D_.js → index-C2VmtNaQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9TsO9T9.js → index-Cbm8F0M2.js} +1 -1
- package/src/assets/web-panel/assets/{index-eTWPaeBI.js → index-CfniPP5p.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2yo6ast.js → index-Cg2bCeol.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPXdBnGi.js → index-CiXkhOkY.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCLeNqIL.js → index-Cl5RpreD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtSPhEyC.js → index-CqmLw8cs.js} +1 -1
- package/src/assets/web-panel/assets/{index-eYxUASSG.js → index-Ctje8Vl3.js} +1 -1
- package/src/assets/web-panel/assets/{index-i5MB455u.js → index-D1w96gg9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpvyOt5Z.js → index-D47jt8ET.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeWSw-z5.js → index-DJ6pG79m.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3F_p8NA.js → index-DTosx2Wu.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9mSYovv.js → index-DY6MHo9D.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJMHnbmu.js → index-DcFjRT-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-ufbAJB.js → index-DfnzrUxU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFUprhNd.js → index-DjRrqooR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co4lDEk-.js → index-DmRcgiYT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGTZdZOE.js → index-DpjHpRoq.js} +3 -3
- package/src/assets/web-panel/assets/{index-DHugFl3v.js → index-Dt-w3xQ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-f6l4Vm.js → index-DuOU5apg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtyAuGOm.js → index-LvjAKDSl.js} +1 -1
- package/src/assets/web-panel/assets/{index-be8SonCh.js → index-_nL79NT8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRMEO2Tl.js → index-auyNYjLo.js} +1 -1
- package/src/assets/web-panel/assets/{index-C88m9lsi.js → index-cVqbas5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqlwIjJx.js → index-ffe7bvqP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpTFx8Xx.js → index-idZKyADQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cskz--fd.js → index-k1Xa5iw1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF80xxPG.js → index-mYZJxGH6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ds8r3Fzb.js → index-rYBHSDcJ.js} +1 -1
- package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
- package/src/assets/web-panel/assets/{index-C846lPGD.js → index-xoNssgz_.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B4chl7iR.js → initDefaultProps-lcU_dT2r.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DruN9h96.js → motion-Dc7UNXZ1.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cl0UtCgU.js → move-Cll8ZXaL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-FX2ttw70.js → mtc-parser-CAb_yLIM.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BDCneY46.js → omit-DurYMyTe.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DycsEg8b.js → pickAttrs-BITQyOlw.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bc-dBuMv.js → placementArrow-Dg1rH91i.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve--Wwaf8lu.js → responsiveObserve-D_EWIeac.js} +1 -1
- package/src/assets/web-panel/assets/{slide-vDmHQqHH.js → slide-lK4d3zsh.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-9c52yv3G.js → statusUtils-Bflq-Git.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BT4BiO6_.js → styleChecker-Ccp0I-wt.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C7XxWPcP.js → useFlexGapSupport-CYZbByYA.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BHoMqh4i.js → useFs-B_x0nxFD.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BOLxvsAG.js → usePersonalDataHub-DW55rL85.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CA7poeeP.js → vnode-Ca6MH3W8.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B_sAn-co.js → zoom-NdHelOog.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/graph.js +215 -5
- package/src/commands/orchestrate.js +61 -9
- package/src/commands/team-distributed.js +342 -2
- package/src/commands/team.js +169 -7
- package/src/data/changelog.json +46 -0
- package/src/gateways/ws/message-dispatcher.js +4 -0
- package/src/gateways/ws/session-protocol.js +89 -11
- package/src/gateways/ws/ws-agent-handler.js +65 -9
- package/src/gateways/ws/ws-approval-gate.js +181 -16
- package/src/gateways/ws/ws-server.js +16 -6
- package/src/generated/cc-agent-protocol.schema.json +154 -3
- package/src/lib/agent-team/task-lease.js +487 -3
- package/src/lib/agent-team/team-agent-stream.js +16 -0
- package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
- package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
- package/src/lib/agent-team/team-distributed-queue.js +251 -0
- package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
- package/src/lib/agent-team/team-runner.js +285 -3
- package/src/lib/app-server/graph-runtime.js +1078 -0
- package/src/lib/app-server/rollout-store.js +32 -0
- package/src/lib/app-server/server.js +200 -0
- package/src/lib/approval-grant-ledger.js +69 -0
- package/src/lib/autonomous-agent.js +11 -0
- package/src/lib/codex-app-server-adapter.js +11 -20
- package/src/lib/cowork-graph-authority-adapter.js +455 -0
- package/src/lib/dynamic-workflow-facade.js +83 -16
- package/src/lib/graph-kernel/adapters.js +93 -20
- package/src/lib/graph-kernel/authority.js +324 -0
- package/src/lib/graph-kernel/compiler.js +67 -21
- package/src/lib/graph-kernel/cutover-authority-resolver.js +245 -0
- package/src/lib/graph-kernel/cutover-ledger.js +692 -0
- package/src/lib/graph-kernel/event-store.js +15 -1
- package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
- package/src/lib/graph-kernel/index.js +4 -0
- package/src/lib/graph-kernel/migration-saga.js +309 -0
- package/src/lib/graph-kernel/retirement-evidence.js +567 -0
- package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
- package/src/lib/graph-kernel/runtime.js +737 -38
- package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
- package/src/lib/graph-kernel/trace-reducer.js +6 -0
- package/src/lib/graph-kernel/trigger-adapter.js +60 -3
- package/src/lib/interaction-adapter.js +61 -9
- package/src/lib/legacy-runtime-authority.js +160 -0
- package/src/lib/orchestrator.js +28 -0
- package/src/lib/policy-decision-event.js +149 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
- package/src/lib/record-replay/index.js +1 -0
- package/src/lib/record-replay/playwright-ui-driver.js +327 -0
- package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
- package/src/lib/scheduler-kernel/runtime.js +75 -2
- package/src/lib/webhook-security.js +484 -36
- package/src/runtime/coding-agent-events.cjs +13 -11
- package/src/runtime/headless-runner.js +17 -1
- package/src/runtime/headless-stream.js +66 -3
- package/src/runtime/session-slash-commands.js +57 -6
- package/src/assets/web-panel/assets/MarkdownRenderer-BwH414Ms.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BiaZfQIM.js +0 -7
- package/src/assets/web-panel/assets/Projects-DiCGnMjz.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-s1gR38IO.js +0 -5
- package/src/assets/web-panel/assets/devWarning-DiSlgCC4.js +0 -1
- package/src/assets/web-panel/assets/index-9WIQEHvv.js +0 -1
- package/src/assets/web-panel/assets/index-B7mDobAl.js +0 -1
|
@@ -126,6 +126,37 @@ export class TeamRunner {
|
|
|
126
126
|
typeof opts.beforeTask === "function" ? opts.beforeTask : null;
|
|
127
127
|
this.afterTask =
|
|
128
128
|
typeof opts.afterTask === "function" ? opts.afterTask : null;
|
|
129
|
+
// Canonical Graph settlement happens after the executor has physically
|
|
130
|
+
// settled but before the legacy registry projection is updated. This hook
|
|
131
|
+
// is fail-closed: a Graph write failure cannot be converted into legacy
|
|
132
|
+
// task success.
|
|
133
|
+
this.canonicalSettlement =
|
|
134
|
+
typeof opts.canonicalSettlement === "function"
|
|
135
|
+
? opts.canonicalSettlement
|
|
136
|
+
: null;
|
|
137
|
+
// In canonical rollout the Graph Kernel owns the ready frontier. The task
|
|
138
|
+
// registry remains a compatibility/lease projection and cannot make a node
|
|
139
|
+
// executable when Graph still considers it blocked.
|
|
140
|
+
this.canonicalReady =
|
|
141
|
+
typeof opts.canonicalReady === "function" ? opts.canonicalReady : null;
|
|
142
|
+
// Shadow settlement observes the already-produced executor outcome and
|
|
143
|
+
// never owns effects. Divergence is visible but cannot change the legacy
|
|
144
|
+
// result while a surface is still in shadow rollout.
|
|
145
|
+
this.shadowSettlement =
|
|
146
|
+
typeof opts.shadowSettlement === "function"
|
|
147
|
+
? opts.shadowSettlement
|
|
148
|
+
: null;
|
|
149
|
+
// Whole-run cancellation follows the same rollout contract as settlement.
|
|
150
|
+
// Canonical cancellation is fail-closed and must finish before run() can
|
|
151
|
+
// return/throw; shadow cancellation is observation-only.
|
|
152
|
+
this.canonicalCancellation =
|
|
153
|
+
typeof opts.canonicalCancellation === "function"
|
|
154
|
+
? opts.canonicalCancellation
|
|
155
|
+
: null;
|
|
156
|
+
this.shadowCancellation =
|
|
157
|
+
typeof opts.shadowCancellation === "function"
|
|
158
|
+
? opts.shadowCancellation
|
|
159
|
+
: null;
|
|
129
160
|
// A lease that expires and is reacquired receives a new fencing identity.
|
|
130
161
|
// Persist that identity synchronously before the executor can settle under
|
|
131
162
|
// it. Ordinary renewals keep the same identity and do not call this hook.
|
|
@@ -169,6 +200,10 @@ export class TeamRunner {
|
|
|
169
200
|
this._budgetStopped = false;
|
|
170
201
|
this._registryBudgetReason = null;
|
|
171
202
|
this._fatalError = null;
|
|
203
|
+
this._canonicalCancellationRequested = false;
|
|
204
|
+
this._shadowCancellationRequested = false;
|
|
205
|
+
this._cancellationPromise = null;
|
|
206
|
+
this._cancellationFailure = null;
|
|
172
207
|
// Idle workers wait on graph progress instead of polling the full graph
|
|
173
208
|
// through setTimeout(0). This matters once a team has many workers but only
|
|
174
209
|
// a narrow DAG frontier.
|
|
@@ -176,6 +211,7 @@ export class TeamRunner {
|
|
|
176
211
|
this._workerCount = 1;
|
|
177
212
|
this._claimControllers = new Set();
|
|
178
213
|
this._claimsByKey = new Map();
|
|
214
|
+
this._scopeDonations = new Map();
|
|
179
215
|
this._handoffTransfers = new Map();
|
|
180
216
|
this._handoffExpiryTimers = new Map();
|
|
181
217
|
this._wallTimer = null;
|
|
@@ -189,6 +225,53 @@ export class TeamRunner {
|
|
|
189
225
|
}
|
|
190
226
|
}
|
|
191
227
|
|
|
228
|
+
/** Wake idle workers after a producer durably appends new tasks. */
|
|
229
|
+
notifyWorkAvailable() {
|
|
230
|
+
this._signalProgress();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** Current dependency/aging priority plus scope-wait donations. */
|
|
234
|
+
priorityContext(key) {
|
|
235
|
+
return Object.freeze({
|
|
236
|
+
scheduling:
|
|
237
|
+
this.registry.schedulingPriority?.(key, { now: this._now() }) || null,
|
|
238
|
+
scopeDonations: Object.freeze(
|
|
239
|
+
[...(this._scopeDonations.get(key) || [])].map((entry) =>
|
|
240
|
+
Object.freeze({ ...entry }),
|
|
241
|
+
),
|
|
242
|
+
),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
_recordScopeDonation(waiterKey, conflicts) {
|
|
247
|
+
const scheduling =
|
|
248
|
+
this.registry.schedulingPriority?.(waiterKey, { now: this._now() }) ||
|
|
249
|
+
null;
|
|
250
|
+
for (const conflict of conflicts || []) {
|
|
251
|
+
const holderKey = conflict?.key;
|
|
252
|
+
if (!holderKey || !this._activeKeys.has(holderKey)) continue;
|
|
253
|
+
const current = this._scopeDonations.get(holderKey) || [];
|
|
254
|
+
const previous = current.find((entry) => entry.waiterKey === waiterKey);
|
|
255
|
+
const donation = {
|
|
256
|
+
holderKey,
|
|
257
|
+
waiterKey,
|
|
258
|
+
waiterPriority: scheduling,
|
|
259
|
+
observedAt: this._now(),
|
|
260
|
+
};
|
|
261
|
+
if (
|
|
262
|
+
previous &&
|
|
263
|
+
Number(previous.waiterPriority?.total || 0) >=
|
|
264
|
+
Number(scheduling?.total || 0)
|
|
265
|
+
) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const next = current.filter((entry) => entry.waiterKey !== waiterKey);
|
|
269
|
+
next.push(donation);
|
|
270
|
+
this._scopeDonations.set(holderKey, next);
|
|
271
|
+
this._emit("task:priority-donated", donation);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
192
275
|
/**
|
|
193
276
|
* Track a teammate's lifecycle state (idle / running / failed / shutdown) and
|
|
194
277
|
* emit a `teammate:state` event on every transition. `lost` is set on resume
|
|
@@ -1164,6 +1247,7 @@ export class TeamRunner {
|
|
|
1164
1247
|
requestedAt: this._now(),
|
|
1165
1248
|
};
|
|
1166
1249
|
}
|
|
1250
|
+
this._requestRunCancellation(failure);
|
|
1167
1251
|
this._setFatal(failure, { phase: "external-control" });
|
|
1168
1252
|
for (const claim of this._claimsByKey.values()) {
|
|
1169
1253
|
claim.coordinatorAbort = failure;
|
|
@@ -1176,6 +1260,58 @@ export class TeamRunner {
|
|
|
1176
1260
|
return { ok: true, activeClaims: this._claimsByKey.size };
|
|
1177
1261
|
}
|
|
1178
1262
|
|
|
1263
|
+
_requestRunCancellation(failure) {
|
|
1264
|
+
const request = {
|
|
1265
|
+
reason: failure.message,
|
|
1266
|
+
error: failure,
|
|
1267
|
+
requireAdjudication: failure.adjudication != null,
|
|
1268
|
+
};
|
|
1269
|
+
if (this.canonicalCancellation && !this._canonicalCancellationRequested) {
|
|
1270
|
+
this._canonicalCancellationRequested = true;
|
|
1271
|
+
let cancellation;
|
|
1272
|
+
try {
|
|
1273
|
+
cancellation = this.canonicalCancellation(request);
|
|
1274
|
+
} catch (error) {
|
|
1275
|
+
cancellation = Promise.reject(error);
|
|
1276
|
+
}
|
|
1277
|
+
this._cancellationPromise = Promise.resolve(cancellation).catch(
|
|
1278
|
+
(error) => {
|
|
1279
|
+
const authorityFailure = new Error(
|
|
1280
|
+
`Canonical Team Graph cancellation failed: ${error?.message || String(error)}`,
|
|
1281
|
+
{ cause: error },
|
|
1282
|
+
);
|
|
1283
|
+
authorityFailure.code = "CC_TEAM_GRAPH_CANCEL_FAILED";
|
|
1284
|
+
authorityFailure.retryable = false;
|
|
1285
|
+
authorityFailure.abortCause = failure;
|
|
1286
|
+
this._cancellationFailure = authorityFailure;
|
|
1287
|
+
},
|
|
1288
|
+
);
|
|
1289
|
+
}
|
|
1290
|
+
if (this.shadowCancellation && !this._shadowCancellationRequested) {
|
|
1291
|
+
this._shadowCancellationRequested = true;
|
|
1292
|
+
let observation;
|
|
1293
|
+
try {
|
|
1294
|
+
observation = this.shadowCancellation(request);
|
|
1295
|
+
} catch (error) {
|
|
1296
|
+
observation = Promise.reject(error);
|
|
1297
|
+
}
|
|
1298
|
+
const shadow = Promise.resolve(observation).catch((error) => {
|
|
1299
|
+
this._emit("run:shadow-cancel-diverged", {
|
|
1300
|
+
code: error?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
|
|
1301
|
+
error: error?.message || String(error),
|
|
1302
|
+
});
|
|
1303
|
+
});
|
|
1304
|
+
this._cancellationPromise = this._cancellationPromise
|
|
1305
|
+
? Promise.all([this._cancellationPromise, shadow])
|
|
1306
|
+
: shadow;
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
async _awaitRunCancellation() {
|
|
1311
|
+
await this._cancellationPromise;
|
|
1312
|
+
if (this._cancellationFailure) throw this._cancellationFailure;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1179
1315
|
/**
|
|
1180
1316
|
* Run the graph to completion (all tasks terminal) or until no teammate can
|
|
1181
1317
|
* make progress (everything remaining is blocked/leased). Returns a summary.
|
|
@@ -1291,6 +1427,7 @@ export class TeamRunner {
|
|
|
1291
1427
|
clearTimeout(timer);
|
|
1292
1428
|
}
|
|
1293
1429
|
this._handoffExpiryTimers.clear();
|
|
1430
|
+
await this._awaitRunCancellation();
|
|
1294
1431
|
}
|
|
1295
1432
|
if (this._fatalError) throw this._fatalError;
|
|
1296
1433
|
const stats = this.registry.stats();
|
|
@@ -1531,6 +1668,8 @@ export class TeamRunner {
|
|
|
1531
1668
|
this._setState(holder, "shutdown", { reason: "no-more-work" });
|
|
1532
1669
|
return; // no claimable + nothing in flight → this worker is finished
|
|
1533
1670
|
}
|
|
1671
|
+
const schedulingPriority =
|
|
1672
|
+
this.registry.schedulingPriority?.(key, { now: this._now() }) || null;
|
|
1534
1673
|
const acq = this.registry.acquire(key, { holder, ttlMs: this.ttlMs });
|
|
1535
1674
|
if (!acq.ok) {
|
|
1536
1675
|
if (
|
|
@@ -1546,6 +1685,24 @@ export class TeamRunner {
|
|
|
1546
1685
|
return;
|
|
1547
1686
|
}
|
|
1548
1687
|
// Lost the race to a peer (or it just got blocked) — try another.
|
|
1688
|
+
if (
|
|
1689
|
+
this.canonicalReady &&
|
|
1690
|
+
!["leased", "concurrent", "no_claimable_task"].includes(acq.reason)
|
|
1691
|
+
) {
|
|
1692
|
+
const error = new Error(
|
|
1693
|
+
`Canonical Graph declared task "${key}" ready but the legacy projection rejected it: ${acq.reason || "unknown"}`,
|
|
1694
|
+
);
|
|
1695
|
+
error.code = "CC_TEAM_GRAPH_LEGACY_PROJECTION_DIVERGED";
|
|
1696
|
+
this._setFatal(error, {
|
|
1697
|
+
phase: "legacy-ready-projection",
|
|
1698
|
+
key,
|
|
1699
|
+
holder,
|
|
1700
|
+
reason: acq.reason || null,
|
|
1701
|
+
});
|
|
1702
|
+
this._setState(holder, "shutdown", { reason: "fatal-error" });
|
|
1703
|
+
this._signalProgress();
|
|
1704
|
+
return;
|
|
1705
|
+
}
|
|
1549
1706
|
this._setState(holder, "idle");
|
|
1550
1707
|
await this._tick();
|
|
1551
1708
|
continue;
|
|
@@ -1629,6 +1786,7 @@ export class TeamRunner {
|
|
|
1629
1786
|
budgetReservation,
|
|
1630
1787
|
sessionWork,
|
|
1631
1788
|
);
|
|
1789
|
+
claim.schedulingPriority = schedulingPriority;
|
|
1632
1790
|
} catch (error) {
|
|
1633
1791
|
this._reservedExecutions = Math.max(0, this._reservedExecutions - 1);
|
|
1634
1792
|
this.registry.release(key, {
|
|
@@ -2119,10 +2277,15 @@ export class TeamRunner {
|
|
|
2119
2277
|
) {
|
|
2120
2278
|
return null;
|
|
2121
2279
|
}
|
|
2122
|
-
|
|
2280
|
+
const nextClaimable = this.canonicalReady
|
|
2281
|
+
? (options) => this.canonicalReady({ holder, ...options })
|
|
2282
|
+
: typeof this.registry.nextClaimable === "function"
|
|
2283
|
+
? (options) => this.registry.nextClaimable(options)
|
|
2284
|
+
: null;
|
|
2285
|
+
if (nextClaimable) {
|
|
2123
2286
|
const excluded = new Set(this._activeKeys);
|
|
2124
2287
|
for (let scanned = 0; scanned < this.maxScopeScan; scanned++) {
|
|
2125
|
-
const key =
|
|
2288
|
+
const key = nextClaimable({ excludeKeys: excluded });
|
|
2126
2289
|
if (!key) return null;
|
|
2127
2290
|
const task = this.registry.getTask(key);
|
|
2128
2291
|
const targetHolder =
|
|
@@ -2145,6 +2308,7 @@ export class TeamRunner {
|
|
|
2145
2308
|
this._setFatal(error, { phase: "scope-validation", key });
|
|
2146
2309
|
return null;
|
|
2147
2310
|
}
|
|
2311
|
+
this._recordScopeDonation(key, check.conflicts);
|
|
2148
2312
|
excluded.add(key);
|
|
2149
2313
|
}
|
|
2150
2314
|
return null;
|
|
@@ -2200,6 +2364,7 @@ export class TeamRunner {
|
|
|
2200
2364
|
_releaseScope(holder, key) {
|
|
2201
2365
|
if (!this.scopeLock) return;
|
|
2202
2366
|
const released = this.scopeLock.release(key);
|
|
2367
|
+
this._scopeDonations.delete(key);
|
|
2203
2368
|
if (released?.ok) {
|
|
2204
2369
|
this._emit("task:scope-released", {
|
|
2205
2370
|
key,
|
|
@@ -2218,7 +2383,12 @@ export class TeamRunner {
|
|
|
2218
2383
|
this._inFlight++;
|
|
2219
2384
|
this._maxInFlight = Math.max(this._maxInFlight, this._inFlight);
|
|
2220
2385
|
this._setState(holder, "running", { key, sessionTaskKey });
|
|
2221
|
-
this._emit("task:claimed", {
|
|
2386
|
+
this._emit("task:claimed", {
|
|
2387
|
+
key,
|
|
2388
|
+
holder,
|
|
2389
|
+
attempts: task.attempts,
|
|
2390
|
+
schedulingPriority: claim.schedulingPriority || null,
|
|
2391
|
+
});
|
|
2222
2392
|
const renew = () => this._renewClaim(claim);
|
|
2223
2393
|
// A teammate-scoped messaging handle: post to a peer / broadcast, and read
|
|
2224
2394
|
// its own inbox (direct messages + unseen broadcasts).
|
|
@@ -2359,6 +2529,7 @@ export class TeamRunner {
|
|
|
2359
2529
|
task,
|
|
2360
2530
|
holder,
|
|
2361
2531
|
renew,
|
|
2532
|
+
priorityContext: () => this.priorityContext(key),
|
|
2362
2533
|
inbox,
|
|
2363
2534
|
sendMessage,
|
|
2364
2535
|
messageAuthority,
|
|
@@ -2432,11 +2603,47 @@ export class TeamRunner {
|
|
|
2432
2603
|
throw error;
|
|
2433
2604
|
}
|
|
2434
2605
|
}
|
|
2606
|
+
if (this.canonicalSettlement) {
|
|
2607
|
+
try {
|
|
2608
|
+
await this.canonicalSettlement({
|
|
2609
|
+
key,
|
|
2610
|
+
task,
|
|
2611
|
+
holder,
|
|
2612
|
+
lease: claim.lease,
|
|
2613
|
+
status: "completed",
|
|
2614
|
+
result,
|
|
2615
|
+
});
|
|
2616
|
+
claim.canonicalSettled = true;
|
|
2617
|
+
} catch (error) {
|
|
2618
|
+
error.canonicalSettlementFailed = true;
|
|
2619
|
+
throw error;
|
|
2620
|
+
}
|
|
2621
|
+
}
|
|
2435
2622
|
const done = this.registry.complete(key, {
|
|
2436
2623
|
holder,
|
|
2437
2624
|
leaseId: claim.leaseId,
|
|
2438
2625
|
result,
|
|
2439
2626
|
});
|
|
2627
|
+
if (this.shadowSettlement) {
|
|
2628
|
+
try {
|
|
2629
|
+
await this.shadowSettlement({
|
|
2630
|
+
key,
|
|
2631
|
+
task,
|
|
2632
|
+
holder,
|
|
2633
|
+
lease: claim.lease,
|
|
2634
|
+
status: "completed",
|
|
2635
|
+
result,
|
|
2636
|
+
legacyAccepted: done.ok === true,
|
|
2637
|
+
});
|
|
2638
|
+
} catch (error) {
|
|
2639
|
+
this._emit("task:shadow-diverged", {
|
|
2640
|
+
key,
|
|
2641
|
+
holder,
|
|
2642
|
+
code: error?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
|
|
2643
|
+
error: error?.message || String(error),
|
|
2644
|
+
});
|
|
2645
|
+
}
|
|
2646
|
+
}
|
|
2440
2647
|
if (done.ok) {
|
|
2441
2648
|
if (span) span.end();
|
|
2442
2649
|
this._setState(holder, "completed-task", {
|
|
@@ -2451,10 +2658,24 @@ export class TeamRunner {
|
|
|
2451
2658
|
await this._notifySettlement({
|
|
2452
2659
|
key,
|
|
2453
2660
|
holder,
|
|
2661
|
+
task,
|
|
2662
|
+
lease: claim.lease,
|
|
2454
2663
|
status: "completed",
|
|
2455
2664
|
result,
|
|
2456
2665
|
});
|
|
2457
2666
|
} else {
|
|
2667
|
+
if (claim.canonicalSettled) {
|
|
2668
|
+
const error = new Error(
|
|
2669
|
+
`Legacy Team projection rejected canonical completion for ${key}: ${done.reason || "lease_lost"}`,
|
|
2670
|
+
);
|
|
2671
|
+
error.code = "CC_TEAM_LEGACY_PROJECTION_DIVERGED";
|
|
2672
|
+
error.retryable = false;
|
|
2673
|
+
this._setFatal(error, {
|
|
2674
|
+
phase: "legacy-projection",
|
|
2675
|
+
key,
|
|
2676
|
+
holder,
|
|
2677
|
+
});
|
|
2678
|
+
}
|
|
2458
2679
|
if (span) {
|
|
2459
2680
|
span.setAttribute("team.completion_discarded", true);
|
|
2460
2681
|
span.end();
|
|
@@ -2500,6 +2721,33 @@ export class TeamRunner {
|
|
|
2500
2721
|
claim.budgetSettled = true;
|
|
2501
2722
|
}
|
|
2502
2723
|
this._recordSessionUsage(claim, failure);
|
|
2724
|
+
if (
|
|
2725
|
+
this.canonicalSettlement &&
|
|
2726
|
+
!claim.canonicalSettled &&
|
|
2727
|
+
!(this._canonicalCancellationRequested && claim.coordinatorAbort) &&
|
|
2728
|
+
failure?.code !== "TEAM_HANDOFF_COMMITTED" &&
|
|
2729
|
+
failure?.canonicalSettlementFailed !== true
|
|
2730
|
+
) {
|
|
2731
|
+
try {
|
|
2732
|
+
await this.canonicalSettlement({
|
|
2733
|
+
key,
|
|
2734
|
+
task,
|
|
2735
|
+
holder,
|
|
2736
|
+
lease: claim.lease,
|
|
2737
|
+
status: "failed",
|
|
2738
|
+
error: failure,
|
|
2739
|
+
});
|
|
2740
|
+
claim.canonicalSettled = true;
|
|
2741
|
+
} catch (canonicalError) {
|
|
2742
|
+
canonicalError.cause ||= failure;
|
|
2743
|
+
canonicalError.canonicalSettlementFailed = true;
|
|
2744
|
+
this._setFatal(canonicalError, {
|
|
2745
|
+
phase: "canonical-settlement",
|
|
2746
|
+
key,
|
|
2747
|
+
holder,
|
|
2748
|
+
});
|
|
2749
|
+
}
|
|
2750
|
+
}
|
|
2503
2751
|
const outcome = this.registry.fail(key, {
|
|
2504
2752
|
holder,
|
|
2505
2753
|
leaseId: claim.leaseId,
|
|
@@ -2507,6 +2755,26 @@ export class TeamRunner {
|
|
|
2507
2755
|
retryable: failure?.retryable !== false,
|
|
2508
2756
|
adjudication: failure?.adjudication || null,
|
|
2509
2757
|
});
|
|
2758
|
+
if (this.shadowSettlement) {
|
|
2759
|
+
try {
|
|
2760
|
+
await this.shadowSettlement({
|
|
2761
|
+
key,
|
|
2762
|
+
task,
|
|
2763
|
+
holder,
|
|
2764
|
+
lease: claim.lease,
|
|
2765
|
+
status: "failed",
|
|
2766
|
+
error: failure,
|
|
2767
|
+
legacyAccepted: outcome?.ok === true,
|
|
2768
|
+
});
|
|
2769
|
+
} catch (shadowError) {
|
|
2770
|
+
this._emit("task:shadow-diverged", {
|
|
2771
|
+
key,
|
|
2772
|
+
holder,
|
|
2773
|
+
code: shadowError?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
|
|
2774
|
+
error: shadowError?.message || String(shadowError),
|
|
2775
|
+
});
|
|
2776
|
+
}
|
|
2777
|
+
}
|
|
2510
2778
|
if (outcome?.ok) {
|
|
2511
2779
|
this._setState(holder, "failed-task", {
|
|
2512
2780
|
error: failure?.message || String(failure),
|
|
@@ -2525,6 +2793,8 @@ export class TeamRunner {
|
|
|
2525
2793
|
await this._notifySettlement({
|
|
2526
2794
|
key,
|
|
2527
2795
|
holder,
|
|
2796
|
+
task,
|
|
2797
|
+
lease: claim.lease,
|
|
2528
2798
|
status: outcome.retry === true ? "pending" : "failed",
|
|
2529
2799
|
error: failure?.message || String(failure),
|
|
2530
2800
|
retry: outcome.retry === true,
|
|
@@ -2533,6 +2803,18 @@ export class TeamRunner {
|
|
|
2533
2803
|
requestId: failure?.adjudication?.requestId || null,
|
|
2534
2804
|
});
|
|
2535
2805
|
} else {
|
|
2806
|
+
if (claim.canonicalSettled) {
|
|
2807
|
+
const error = new Error(
|
|
2808
|
+
`Legacy Team projection rejected canonical failure for ${key}: ${outcome?.reason || "lease_lost"}`,
|
|
2809
|
+
);
|
|
2810
|
+
error.code = "CC_TEAM_LEGACY_PROJECTION_DIVERGED";
|
|
2811
|
+
error.retryable = false;
|
|
2812
|
+
this._setFatal(error, {
|
|
2813
|
+
phase: "legacy-projection",
|
|
2814
|
+
key,
|
|
2815
|
+
holder,
|
|
2816
|
+
});
|
|
2817
|
+
}
|
|
2536
2818
|
this._emit("task:failure-discarded", {
|
|
2537
2819
|
key,
|
|
2538
2820
|
holder,
|