chainlesschain 0.166.6 → 0.166.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -1
- package/src/assets/web-panel/assets/{AIOps-CVnFjTfG.js → AIOps-BlrmQxa2.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BxkwuuQC.js → ActionButton-zyRyLITg.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C2670q6z.js → Analytics-DwGz7OGN.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CU_rylW6.js → AppLayout-Dc-nj7Zd.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-DGJmYqnj.js → Artifacts-7Hu3O73p.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BZOQbINJ.js → Audit-Bnoe3-fR.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DghB4QwF.js → BackgroundAgents-BqYFrDKZ.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-l0mwPbta.js → Backup-B3hwW1nz.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bv3WSZOh.js → BaseInput-XFVxLA4w.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-s88nBdvt.js → Chat-CWRDNw7e.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Z8CBuB1a.js → ChatBubbleRenderer-Bf30VM8G.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B5icasEs.js → Checkbox-kFeeBgac.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CsUFqNud.js → Codegen-CCxp8xoI.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DlBtClaW.js → Col-BLKZalle.js} +1 -1
- package/src/assets/web-panel/assets/{Community-xRn1IdLB.js → Community-DD0eWCez.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-naIr8a_o.js → Compact-CHqHWdy0.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dp9esfFE.js → Compliance-Bw54uPiK.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DQlMYJB-.js → Cowork-DZ13zKNJ.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-Cd0oNLzJ.js → Cron-Dlj5Jevg.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BtDIx3XX.js → Crosschain-Nvz0aR0j.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BOlpzEwg.js → DID-Ct89eUyY.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DV15Axk1.js → Dashboard-BHUH5IAe.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-COXrewN1.js → Dropdown-BhZG-PO7.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-EjIt0Cm7.js → EmailListRenderer-ae4RVwwJ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DJlhwb-R.js → FamilyGuardDashboard-AOcxLfLr.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BMiFl82k.js → Federation-BK2PJQOF.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUcDQyxn.js → FormItemContext-C2n3xO2_.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C25uFxvK.js → GenericCardRenderer-DcyUVFZq.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D20uaEUU.js → Git-tBae9Lt8.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CQxYJjCX.js → Governance-DmNR3AP4.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-m-sczpS5.js → Inference-CoseEigi.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CBsIlU0S.js → KnowledgeGraph-Bdjd1sxr.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D0-5bqeu.js → Logs-CtlkKIcn.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BwH414Ms.js → MarkdownRenderer-CZsTBEQE.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CwDGFu2Q.js → Marketplace-BTYb7nEx.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-7FxJ3omT.js → McpTools-D0iUdW3P.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DOVyb59U.js → Memory--gwI7w4Y.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DZXl-Hje.js → MobileBridge-JmFBi24T.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DlZ8tRXt.js → MobileProjects-BK01cQRx.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D7Pjx1s_.js → Mtc-u7avzyoO.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BND7lX8p.js → MtcAudit-gT3z5fo_.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BknS7B-p.js → Multisig-BIqZTz5n.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-7C2-KPHt.js → NLProgramming-DdhVfXYq.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DNWdTndN.js → Notes-CBlyUmY3.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DCm4KcJZ.js → NotificationSettings-DSyI26N3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DyVwwjJx.js → OrderTableRenderer-B7IEuNz4.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dl2O_qJ9.js → Organization-ozhi4kGS.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BOFCvk9Q.js → Overflow-CBy57RVM.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DgdVowY1.js → P2P-CA-ZRv77.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DOHc9zm8.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-BHNEUUwa.js → Permissions-DiP632GP.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CaZbrOdz.js → PersonalDataHub-AnU8O-SS.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DJDnoXmE.js → Pipeline-DDibOUaP.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CBQr2eX8.js → Privacy-D421t36T.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Yghqa06z.js → ProjectInit-DR879ZPJ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-HBAtJi8U.js → ProjectSettings-Ded8o6aY.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DiCGnMjz.js → Projects-BHPxiucB.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-uJTz77GI.js → Providers-Boivuu-E.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-k3M5ouTp.js → QrScannerModal-xKD_ntKp.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CMji45PH.js → QuickAsk-D3y_A6FV.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DyoZYPls.js → Recommend-BjKM-YC2.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-s1gR38IO.js → RemoteSession-CgqKMXG4.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D4hIs4vV.js → Reputation-Ci2GjH5p.js} +1 -1
- package/src/assets/web-panel/assets/{Row-mzE-ElTg.js → Row-B0-T2BSh.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-cg7J3hI6.js → RssFeed-Bet-ur-r.js} +3 -3
- package/src/assets/web-panel/assets/{Search-6M0TkGSZ.js → Search-DWtRAS2R.js} +1 -1
- package/src/assets/web-panel/assets/{Security-B1GQ67qh.js → Security-BDfu2Qn6.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D_RwU_5S.js → Services-CvJmvSMM.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-TZjk-dsW.js → Skeleton-CEbrKpdC.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CG6FcaCV.js → Skills-CjVeiETf.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BI190QDv.js → Sla-Dibypxum.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BWmxF2Wu.js → SpeechSettings-XflYXp7a.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CwPiGw6L.js → SyncSettings-ro1Ivx1E.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BIXgCeSk.js → Tasks-CHq1qFbo.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CQFgGCoK.js → Templates-CRnUZxtZ.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DAelEdkL.js → Tenant-jUX72JCA.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BbqWK6qh.js → Terminal-BBhAs7pt.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-cmG3zvY5.js → TimelineRenderer-CD5M3RGp.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C8444NKU.js → Tokens-sah3v0gu.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C1Rpnz0I.js → Trigger-BNT3Uz3s.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-u4koPiFD.js → Trust-BytMGPMo.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-oPWKn80Z.js → UkeySign-BkYVMRQs.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D0CUUY_5.js → VideoEditing-psvb5Q7Y.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-fu9pIAbt.js → Wallet-PFQTW0MH.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Bc5ciuOx.js → WebAuthn-DgO-OwRT.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BCin4_4N.js → WorkflowEditor-DL2l9VNl.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B2jbM-XN.js → chat-C84akEzN.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CUVoUQ_2.js → colors-DzTWuQKP.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DgOGpkRH.js → compact-item-CR9LJQFv.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DIxU6eKI.js → createContext-CTTov5Kn.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BOhvmlpc.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DoKRKMav.js → hasIn-DALj523o.js} +1 -1
- package/src/assets/web-panel/assets/{index-i5MB455u.js → index-3-XJoYgX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLdpHe6w.js → index-7ux_XohH.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3F_p8NA.js → index-AXnERsyV.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2yo6ast.js → index-B2qpjU-D.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWbL1-N0.js → index-B6QOJbSn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtyAuGOm.js → index-BDyt57zL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpTFx8Xx.js → index-BHRXKiU1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF80xxPG.js → index-BKNIzw0U.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRMEO2Tl.js → index-BNaQt49r.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByjrulIZ.js → index-Be6Os5S8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCLeNqIL.js → index-C5eeMl_2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJMHnbmu.js → index-CNmTDXmf.js} +1 -1
- package/src/assets/web-panel/assets/{index-2flsPFIX.js → index-CXTEpfGe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwYofQJg.js → index-CXaCRXN4.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5ySiGYy.js → index-CZhhFQi9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeWSw-z5.js → index-Cef0n4k_.js} +1 -1
- package/src/assets/web-panel/assets/{index-C846lPGD.js → index-CjkPDSX4.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9TsO9T9.js → index-CmELknPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqlwIjJx.js → index-CnxjXIsK.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co4lDEk-.js → index-CqUgXYIQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj-us-D_.js → index-CunGDV0g.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFUprhNd.js → index-D0MqUnKO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGTZdZOE.js → index-D9ScRFxz.js} +3 -3
- package/src/assets/web-panel/assets/{index-C88m9lsi.js → index-DBIPnoTj.js} +1 -1
- package/src/assets/web-panel/assets/index-DDyMJexx.js +1 -0
- package/src/assets/web-panel/assets/{index-BXb-Smmm.js → index-DH6OG-ci.js} +1 -1
- package/src/assets/web-panel/assets/{index-eTWPaeBI.js → index-DZER6Lj3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cskz--fd.js → index-D_Bg0LdK.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-ufbAJB.js → index-Dah8M4l2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHugFl3v.js → index-DjE_ew7U.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9mSYovv.js → index-DtW6Zr_i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ds8r3Fzb.js → index-DxdzSljS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPXdBnGi.js → index-QW0EXx14.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-f6l4Vm.js → index-W9axN_Ce.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpvyOt5Z.js → index-_8vetPbU.js} +1 -1
- package/src/assets/web-panel/assets/index-btiojFYn.js +1 -0
- package/src/assets/web-panel/assets/{index-eYxUASSG.js → index-eJcFleIV.js} +1 -1
- package/src/assets/web-panel/assets/{index-be8SonCh.js → index-hzzTITR9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtSPhEyC.js → index-s4CFyn-n.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B4chl7iR.js → initDefaultProps-JuW8mFj7.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DruN9h96.js → motion-Cwb0HBve.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cl0UtCgU.js → move-DHokzMgu.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-FX2ttw70.js → mtc-parser-DX31y6QS.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BDCneY46.js → omit-BCIUYDA6.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DycsEg8b.js → pickAttrs-DMCj4EoZ.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bc-dBuMv.js → placementArrow-Dy5K-u1s.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve--Wwaf8lu.js → responsiveObserve-DkGeZu54.js} +1 -1
- package/src/assets/web-panel/assets/{slide-vDmHQqHH.js → slide-Dc5dyJdg.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-9c52yv3G.js → statusUtils-DIUBjOaC.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BT4BiO6_.js → styleChecker-DmyEOxm5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C7XxWPcP.js → useFlexGapSupport-FRhakk1e.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BHoMqh4i.js → useFs-clXyV1WQ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BOLxvsAG.js → usePersonalDataHub-UF6DG41z.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CA7poeeP.js → vnode-CoCt95G7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B_sAn-co.js → zoom-yVWt-ENm.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/graph.js +215 -5
- package/src/commands/team-distributed.js +342 -2
- package/src/commands/team.js +169 -7
- package/src/data/changelog.json +13 -0
- package/src/generated/cc-agent-protocol.schema.json +6 -1
- package/src/lib/agent-team/task-lease.js +315 -0
- 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 +225 -2
- package/src/lib/app-server/graph-runtime.js +754 -0
- package/src/lib/app-server/rollout-store.js +32 -0
- package/src/lib/app-server/server.js +140 -0
- package/src/lib/autonomous-agent.js +11 -0
- 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 +1 -8
- package/src/lib/graph-kernel/cutover-authority-resolver.js +219 -0
- package/src/lib/graph-kernel/cutover-ledger.js +650 -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/runtime-surface-manifest.js +481 -0
- package/src/lib/graph-kernel/runtime.js +661 -24
- 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/legacy-runtime-authority.js +160 -0
- package/src/lib/orchestrator.js +28 -0
- package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
- package/src/lib/scheduler-kernel/runtime.js +75 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-BiaZfQIM.js +0 -7
- 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.
|
|
@@ -1164,6 +1199,7 @@ export class TeamRunner {
|
|
|
1164
1199
|
requestedAt: this._now(),
|
|
1165
1200
|
};
|
|
1166
1201
|
}
|
|
1202
|
+
this._requestRunCancellation(failure);
|
|
1167
1203
|
this._setFatal(failure, { phase: "external-control" });
|
|
1168
1204
|
for (const claim of this._claimsByKey.values()) {
|
|
1169
1205
|
claim.coordinatorAbort = failure;
|
|
@@ -1176,6 +1212,58 @@ export class TeamRunner {
|
|
|
1176
1212
|
return { ok: true, activeClaims: this._claimsByKey.size };
|
|
1177
1213
|
}
|
|
1178
1214
|
|
|
1215
|
+
_requestRunCancellation(failure) {
|
|
1216
|
+
const request = {
|
|
1217
|
+
reason: failure.message,
|
|
1218
|
+
error: failure,
|
|
1219
|
+
requireAdjudication: failure.adjudication != null,
|
|
1220
|
+
};
|
|
1221
|
+
if (this.canonicalCancellation && !this._canonicalCancellationRequested) {
|
|
1222
|
+
this._canonicalCancellationRequested = true;
|
|
1223
|
+
let cancellation;
|
|
1224
|
+
try {
|
|
1225
|
+
cancellation = this.canonicalCancellation(request);
|
|
1226
|
+
} catch (error) {
|
|
1227
|
+
cancellation = Promise.reject(error);
|
|
1228
|
+
}
|
|
1229
|
+
this._cancellationPromise = Promise.resolve(cancellation).catch(
|
|
1230
|
+
(error) => {
|
|
1231
|
+
const authorityFailure = new Error(
|
|
1232
|
+
`Canonical Team Graph cancellation failed: ${error?.message || String(error)}`,
|
|
1233
|
+
{ cause: error },
|
|
1234
|
+
);
|
|
1235
|
+
authorityFailure.code = "CC_TEAM_GRAPH_CANCEL_FAILED";
|
|
1236
|
+
authorityFailure.retryable = false;
|
|
1237
|
+
authorityFailure.abortCause = failure;
|
|
1238
|
+
this._cancellationFailure = authorityFailure;
|
|
1239
|
+
},
|
|
1240
|
+
);
|
|
1241
|
+
}
|
|
1242
|
+
if (this.shadowCancellation && !this._shadowCancellationRequested) {
|
|
1243
|
+
this._shadowCancellationRequested = true;
|
|
1244
|
+
let observation;
|
|
1245
|
+
try {
|
|
1246
|
+
observation = this.shadowCancellation(request);
|
|
1247
|
+
} catch (error) {
|
|
1248
|
+
observation = Promise.reject(error);
|
|
1249
|
+
}
|
|
1250
|
+
const shadow = Promise.resolve(observation).catch((error) => {
|
|
1251
|
+
this._emit("run:shadow-cancel-diverged", {
|
|
1252
|
+
code: error?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
|
|
1253
|
+
error: error?.message || String(error),
|
|
1254
|
+
});
|
|
1255
|
+
});
|
|
1256
|
+
this._cancellationPromise = this._cancellationPromise
|
|
1257
|
+
? Promise.all([this._cancellationPromise, shadow])
|
|
1258
|
+
: shadow;
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
async _awaitRunCancellation() {
|
|
1263
|
+
await this._cancellationPromise;
|
|
1264
|
+
if (this._cancellationFailure) throw this._cancellationFailure;
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1179
1267
|
/**
|
|
1180
1268
|
* Run the graph to completion (all tasks terminal) or until no teammate can
|
|
1181
1269
|
* make progress (everything remaining is blocked/leased). Returns a summary.
|
|
@@ -1291,6 +1379,7 @@ export class TeamRunner {
|
|
|
1291
1379
|
clearTimeout(timer);
|
|
1292
1380
|
}
|
|
1293
1381
|
this._handoffExpiryTimers.clear();
|
|
1382
|
+
await this._awaitRunCancellation();
|
|
1294
1383
|
}
|
|
1295
1384
|
if (this._fatalError) throw this._fatalError;
|
|
1296
1385
|
const stats = this.registry.stats();
|
|
@@ -1546,6 +1635,24 @@ export class TeamRunner {
|
|
|
1546
1635
|
return;
|
|
1547
1636
|
}
|
|
1548
1637
|
// Lost the race to a peer (or it just got blocked) — try another.
|
|
1638
|
+
if (
|
|
1639
|
+
this.canonicalReady &&
|
|
1640
|
+
!["leased", "concurrent", "no_claimable_task"].includes(acq.reason)
|
|
1641
|
+
) {
|
|
1642
|
+
const error = new Error(
|
|
1643
|
+
`Canonical Graph declared task "${key}" ready but the legacy projection rejected it: ${acq.reason || "unknown"}`,
|
|
1644
|
+
);
|
|
1645
|
+
error.code = "CC_TEAM_GRAPH_LEGACY_PROJECTION_DIVERGED";
|
|
1646
|
+
this._setFatal(error, {
|
|
1647
|
+
phase: "legacy-ready-projection",
|
|
1648
|
+
key,
|
|
1649
|
+
holder,
|
|
1650
|
+
reason: acq.reason || null,
|
|
1651
|
+
});
|
|
1652
|
+
this._setState(holder, "shutdown", { reason: "fatal-error" });
|
|
1653
|
+
this._signalProgress();
|
|
1654
|
+
return;
|
|
1655
|
+
}
|
|
1549
1656
|
this._setState(holder, "idle");
|
|
1550
1657
|
await this._tick();
|
|
1551
1658
|
continue;
|
|
@@ -2119,10 +2226,15 @@ export class TeamRunner {
|
|
|
2119
2226
|
) {
|
|
2120
2227
|
return null;
|
|
2121
2228
|
}
|
|
2122
|
-
|
|
2229
|
+
const nextClaimable = this.canonicalReady
|
|
2230
|
+
? (options) => this.canonicalReady({ holder, ...options })
|
|
2231
|
+
: typeof this.registry.nextClaimable === "function"
|
|
2232
|
+
? (options) => this.registry.nextClaimable(options)
|
|
2233
|
+
: null;
|
|
2234
|
+
if (nextClaimable) {
|
|
2123
2235
|
const excluded = new Set(this._activeKeys);
|
|
2124
2236
|
for (let scanned = 0; scanned < this.maxScopeScan; scanned++) {
|
|
2125
|
-
const key =
|
|
2237
|
+
const key = nextClaimable({ excludeKeys: excluded });
|
|
2126
2238
|
if (!key) return null;
|
|
2127
2239
|
const task = this.registry.getTask(key);
|
|
2128
2240
|
const targetHolder =
|
|
@@ -2432,11 +2544,47 @@ export class TeamRunner {
|
|
|
2432
2544
|
throw error;
|
|
2433
2545
|
}
|
|
2434
2546
|
}
|
|
2547
|
+
if (this.canonicalSettlement) {
|
|
2548
|
+
try {
|
|
2549
|
+
await this.canonicalSettlement({
|
|
2550
|
+
key,
|
|
2551
|
+
task,
|
|
2552
|
+
holder,
|
|
2553
|
+
lease: claim.lease,
|
|
2554
|
+
status: "completed",
|
|
2555
|
+
result,
|
|
2556
|
+
});
|
|
2557
|
+
claim.canonicalSettled = true;
|
|
2558
|
+
} catch (error) {
|
|
2559
|
+
error.canonicalSettlementFailed = true;
|
|
2560
|
+
throw error;
|
|
2561
|
+
}
|
|
2562
|
+
}
|
|
2435
2563
|
const done = this.registry.complete(key, {
|
|
2436
2564
|
holder,
|
|
2437
2565
|
leaseId: claim.leaseId,
|
|
2438
2566
|
result,
|
|
2439
2567
|
});
|
|
2568
|
+
if (this.shadowSettlement) {
|
|
2569
|
+
try {
|
|
2570
|
+
await this.shadowSettlement({
|
|
2571
|
+
key,
|
|
2572
|
+
task,
|
|
2573
|
+
holder,
|
|
2574
|
+
lease: claim.lease,
|
|
2575
|
+
status: "completed",
|
|
2576
|
+
result,
|
|
2577
|
+
legacyAccepted: done.ok === true,
|
|
2578
|
+
});
|
|
2579
|
+
} catch (error) {
|
|
2580
|
+
this._emit("task:shadow-diverged", {
|
|
2581
|
+
key,
|
|
2582
|
+
holder,
|
|
2583
|
+
code: error?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
|
|
2584
|
+
error: error?.message || String(error),
|
|
2585
|
+
});
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2440
2588
|
if (done.ok) {
|
|
2441
2589
|
if (span) span.end();
|
|
2442
2590
|
this._setState(holder, "completed-task", {
|
|
@@ -2451,10 +2599,24 @@ export class TeamRunner {
|
|
|
2451
2599
|
await this._notifySettlement({
|
|
2452
2600
|
key,
|
|
2453
2601
|
holder,
|
|
2602
|
+
task,
|
|
2603
|
+
lease: claim.lease,
|
|
2454
2604
|
status: "completed",
|
|
2455
2605
|
result,
|
|
2456
2606
|
});
|
|
2457
2607
|
} else {
|
|
2608
|
+
if (claim.canonicalSettled) {
|
|
2609
|
+
const error = new Error(
|
|
2610
|
+
`Legacy Team projection rejected canonical completion for ${key}: ${done.reason || "lease_lost"}`,
|
|
2611
|
+
);
|
|
2612
|
+
error.code = "CC_TEAM_LEGACY_PROJECTION_DIVERGED";
|
|
2613
|
+
error.retryable = false;
|
|
2614
|
+
this._setFatal(error, {
|
|
2615
|
+
phase: "legacy-projection",
|
|
2616
|
+
key,
|
|
2617
|
+
holder,
|
|
2618
|
+
});
|
|
2619
|
+
}
|
|
2458
2620
|
if (span) {
|
|
2459
2621
|
span.setAttribute("team.completion_discarded", true);
|
|
2460
2622
|
span.end();
|
|
@@ -2500,6 +2662,33 @@ export class TeamRunner {
|
|
|
2500
2662
|
claim.budgetSettled = true;
|
|
2501
2663
|
}
|
|
2502
2664
|
this._recordSessionUsage(claim, failure);
|
|
2665
|
+
if (
|
|
2666
|
+
this.canonicalSettlement &&
|
|
2667
|
+
!claim.canonicalSettled &&
|
|
2668
|
+
!(this._canonicalCancellationRequested && claim.coordinatorAbort) &&
|
|
2669
|
+
failure?.code !== "TEAM_HANDOFF_COMMITTED" &&
|
|
2670
|
+
failure?.canonicalSettlementFailed !== true
|
|
2671
|
+
) {
|
|
2672
|
+
try {
|
|
2673
|
+
await this.canonicalSettlement({
|
|
2674
|
+
key,
|
|
2675
|
+
task,
|
|
2676
|
+
holder,
|
|
2677
|
+
lease: claim.lease,
|
|
2678
|
+
status: "failed",
|
|
2679
|
+
error: failure,
|
|
2680
|
+
});
|
|
2681
|
+
claim.canonicalSettled = true;
|
|
2682
|
+
} catch (canonicalError) {
|
|
2683
|
+
canonicalError.cause ||= failure;
|
|
2684
|
+
canonicalError.canonicalSettlementFailed = true;
|
|
2685
|
+
this._setFatal(canonicalError, {
|
|
2686
|
+
phase: "canonical-settlement",
|
|
2687
|
+
key,
|
|
2688
|
+
holder,
|
|
2689
|
+
});
|
|
2690
|
+
}
|
|
2691
|
+
}
|
|
2503
2692
|
const outcome = this.registry.fail(key, {
|
|
2504
2693
|
holder,
|
|
2505
2694
|
leaseId: claim.leaseId,
|
|
@@ -2507,6 +2696,26 @@ export class TeamRunner {
|
|
|
2507
2696
|
retryable: failure?.retryable !== false,
|
|
2508
2697
|
adjudication: failure?.adjudication || null,
|
|
2509
2698
|
});
|
|
2699
|
+
if (this.shadowSettlement) {
|
|
2700
|
+
try {
|
|
2701
|
+
await this.shadowSettlement({
|
|
2702
|
+
key,
|
|
2703
|
+
task,
|
|
2704
|
+
holder,
|
|
2705
|
+
lease: claim.lease,
|
|
2706
|
+
status: "failed",
|
|
2707
|
+
error: failure,
|
|
2708
|
+
legacyAccepted: outcome?.ok === true,
|
|
2709
|
+
});
|
|
2710
|
+
} catch (shadowError) {
|
|
2711
|
+
this._emit("task:shadow-diverged", {
|
|
2712
|
+
key,
|
|
2713
|
+
holder,
|
|
2714
|
+
code: shadowError?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
|
|
2715
|
+
error: shadowError?.message || String(shadowError),
|
|
2716
|
+
});
|
|
2717
|
+
}
|
|
2718
|
+
}
|
|
2510
2719
|
if (outcome?.ok) {
|
|
2511
2720
|
this._setState(holder, "failed-task", {
|
|
2512
2721
|
error: failure?.message || String(failure),
|
|
@@ -2525,6 +2734,8 @@ export class TeamRunner {
|
|
|
2525
2734
|
await this._notifySettlement({
|
|
2526
2735
|
key,
|
|
2527
2736
|
holder,
|
|
2737
|
+
task,
|
|
2738
|
+
lease: claim.lease,
|
|
2528
2739
|
status: outcome.retry === true ? "pending" : "failed",
|
|
2529
2740
|
error: failure?.message || String(failure),
|
|
2530
2741
|
retry: outcome.retry === true,
|
|
@@ -2533,6 +2744,18 @@ export class TeamRunner {
|
|
|
2533
2744
|
requestId: failure?.adjudication?.requestId || null,
|
|
2534
2745
|
});
|
|
2535
2746
|
} else {
|
|
2747
|
+
if (claim.canonicalSettled) {
|
|
2748
|
+
const error = new Error(
|
|
2749
|
+
`Legacy Team projection rejected canonical failure for ${key}: ${outcome?.reason || "lease_lost"}`,
|
|
2750
|
+
);
|
|
2751
|
+
error.code = "CC_TEAM_LEGACY_PROJECTION_DIVERGED";
|
|
2752
|
+
error.retryable = false;
|
|
2753
|
+
this._setFatal(error, {
|
|
2754
|
+
phase: "legacy-projection",
|
|
2755
|
+
key,
|
|
2756
|
+
holder,
|
|
2757
|
+
});
|
|
2758
|
+
}
|
|
2536
2759
|
this._emit("task:failure-discarded", {
|
|
2537
2760
|
key,
|
|
2538
2761
|
holder,
|