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.
Files changed (214) hide show
  1. package/README.md +21 -0
  2. package/package.json +5 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-CVnFjTfG.js → AIOps-DJvpifGx.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-BxkwuuQC.js → ActionButton-D2UhuF_A.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C2670q6z.js → Analytics-C9ho9obu.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CU_rylW6.js → AppLayout-BvRCpFK3.js} +3 -3
  8. package/src/assets/web-panel/assets/{Artifacts-DGJmYqnj.js → Artifacts-jxrySvpk.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-BZOQbINJ.js → Audit-ovEw0ZYl.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-DghB4QwF.js → BackgroundAgents-D7H5z6zS.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-l0mwPbta.js → Backup-BuXob8za.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-Bv3WSZOh.js → BaseInput-CtnszuQ2.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-s88nBdvt.js → Chat-B_mYE8fJ.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Z8CBuB1a.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-B5icasEs.js → Checkbox-ierdtcJD.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-CsUFqNud.js → Codegen-3VKPJD_B.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-DlBtClaW.js → Col-1EdMyf5P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-xRn1IdLB.js → Community-D6H7UA8K.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-naIr8a_o.js → Compact-BBAZvYIm.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-Dp9esfFE.js → Compliance-CgsTrAoj.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DQlMYJB-.js → Cowork-tnZgLoTE.js} +4 -4
  22. package/src/assets/web-panel/assets/{Cron-Cd0oNLzJ.js → Cron-CPpZw2Nh.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BtDIx3XX.js → Crosschain-BymBcp5z.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BOlpzEwg.js → DID-DKPxS_K1.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-DV15Axk1.js → Dashboard-DvJhEmH9.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-COXrewN1.js → Dropdown-b8iQyQIZ.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-EjIt0Cm7.js → EmailListRenderer--0-A-zKb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DJlhwb-R.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BMiFl82k.js → Federation-BRhaE2Z8.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BUcDQyxn.js → FormItemContext-C4dnq7yf.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-C25uFxvK.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-D20uaEUU.js → Git-4eA2fYzL.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-CQxYJjCX.js → Governance-BJuY9Y-9.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-m-sczpS5.js → Inference-DZ5Dy4up.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-CBsIlU0S.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-D0-5bqeu.js → Logs-BKEeQEfJ.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-CwDGFu2Q.js → Marketplace-Dhho4fEg.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-7FxJ3omT.js → McpTools-BW6xxSlU.js} +2 -2
  40. package/src/assets/web-panel/assets/{Memory-DOVyb59U.js → Memory-mPqlpSkq.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DZXl-Hje.js → MobileBridge-Cb9N_DQI.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-DlZ8tRXt.js → MobileProjects-BNs8tah_.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-D7Pjx1s_.js → Mtc-CaxBt8tn.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-BND7lX8p.js → MtcAudit-DRPQbp3t.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BknS7B-p.js → Multisig-CRm-d8bK.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-7C2-KPHt.js → NLProgramming-BCCk3LPs.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-DNWdTndN.js → Notes-Cv8SN8gN.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-DCm4KcJZ.js → NotificationSettings-CggIvTh5.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-DyVwwjJx.js → OrderTableRenderer-BW3_bV12.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-Dl2O_qJ9.js → Organization-BuRE-VCO.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-BOFCvk9Q.js → Overflow-DBrm1gju.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-DgdVowY1.js → P2P-CWVnDYgS.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-8RKUIpte.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-BHNEUUwa.js → Permissions-tDUAxogW.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CaZbrOdz.js → PersonalDataHub-Dv2-CFis.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-DJDnoXmE.js → Pipeline-DM6kvFni.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CBQr2eX8.js → Privacy-DzK-yL0d.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-Yghqa06z.js → ProjectInit-B5UrNpkj.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-HBAtJi8U.js → ProjectSettings-CxJD43oW.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-uJTz77GI.js → Providers-CYl4jRYK.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-k3M5ouTp.js → QrScannerModal-DeH2T0fH.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-CMji45PH.js → QuickAsk-Bw9k_kTk.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DyoZYPls.js → Recommend-Bl_jGwoi.js} +1 -1
  65. package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
  66. package/src/assets/web-panel/assets/{Reputation-D4hIs4vV.js → Reputation-Ds_Dfr-k.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-mzE-ElTg.js → Row-BpQUQTNj.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-cg7J3hI6.js → RssFeed-BatpZBGt.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-6M0TkGSZ.js → Search-D7hOObzi.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-B1GQ67qh.js → Security-dXQ4FKNt.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-D_RwU_5S.js → Services-D8wInGPa.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-TZjk-dsW.js → Skeleton-DXQCoYpM.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CG6FcaCV.js → Skills-D3oLRIVn.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-BI190QDv.js → Sla-BmP4-LnJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-BWmxF2Wu.js → SpeechSettings-DLj-xzro.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CwPiGw6L.js → SyncSettings-8KKaaRMr.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-BIXgCeSk.js → Tasks-GyK42I7C.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-CQFgGCoK.js → Templates-n1y_8UBG.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DAelEdkL.js → Tenant-B39nBph8.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BbqWK6qh.js → Terminal-DCQoOKXe.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-cmG3zvY5.js → TimelineRenderer-BkhbDfXk.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-C8444NKU.js → Tokens-BeHIIU8D.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C1Rpnz0I.js → Trigger-BHvWXVOb.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-u4koPiFD.js → Trust-y2WaOSto.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-oPWKn80Z.js → UkeySign-DBFeJBzt.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-D0CUUY_5.js → VideoEditing-BEOWitC-.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-fu9pIAbt.js → Wallet-BITedTe6.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-Bc5ciuOx.js → WebAuthn-DMwlJVin.js} +2 -2
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BCin4_4N.js → WorkflowEditor-CKfGFEu1.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-B2jbM-XN.js → chat-DR6gnBGF.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-CUVoUQ_2.js → colors-C_Hw5NCn.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DgOGpkRH.js → compact-item-B8IPwsEu.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DIxU6eKI.js → createContext-D-u4JVnJ.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DoKRKMav.js → hasIn-CZubdS4D.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-ByjrulIZ.js → index-11ASqx-A.js} +1 -1
  97. package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
  98. package/src/assets/web-panel/assets/{index-BwYofQJg.js → index-BXS6wYJZ.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CLdpHe6w.js → index-Bi21Etg4.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-2flsPFIX.js → index-Bizm87cX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BXb-Smmm.js → index-Bv2132PO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B5ySiGYy.js → index-BzoFanEQ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CWbL1-N0.js → index-C25rOz7O.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Cj-us-D_.js → index-C2VmtNaQ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C9TsO9T9.js → index-Cbm8F0M2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-eTWPaeBI.js → index-CfniPP5p.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D2yo6ast.js → index-Cg2bCeol.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CPXdBnGi.js → index-CiXkhOkY.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BCLeNqIL.js → index-Cl5RpreD.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BtSPhEyC.js → index-CqmLw8cs.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-eYxUASSG.js → index-Ctje8Vl3.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-i5MB455u.js → index-D1w96gg9.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CpvyOt5Z.js → index-D47jt8ET.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CeWSw-z5.js → index-DJ6pG79m.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-B3F_p8NA.js → index-DTosx2Wu.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B9mSYovv.js → index-DY6MHo9D.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DJMHnbmu.js → index-DcFjRT-K.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-D-ufbAJB.js → index-DfnzrUxU.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BFUprhNd.js → index-DjRrqooR.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Co4lDEk-.js → index-DmRcgiYT.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DGTZdZOE.js → index-DpjHpRoq.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-DHugFl3v.js → index-Dt-w3xQ7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-B-f6l4Vm.js → index-DuOU5apg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DtyAuGOm.js → index-LvjAKDSl.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-be8SonCh.js → index-_nL79NT8.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BRMEO2Tl.js → index-auyNYjLo.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C88m9lsi.js → index-cVqbas5C.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CqlwIjJx.js → index-ffe7bvqP.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DpTFx8Xx.js → index-idZKyADQ.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Cskz--fd.js → index-k1Xa5iw1.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CF80xxPG.js → index-mYZJxGH6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Ds8r3Fzb.js → index-rYBHSDcJ.js} +1 -1
  133. package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
  134. package/src/assets/web-panel/assets/{index-C846lPGD.js → index-xoNssgz_.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-B4chl7iR.js → initDefaultProps-lcU_dT2r.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-DruN9h96.js → motion-Dc7UNXZ1.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Cl0UtCgU.js → move-Cll8ZXaL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-FX2ttw70.js → mtc-parser-CAb_yLIM.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-BDCneY46.js → omit-DurYMyTe.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DycsEg8b.js → pickAttrs-BITQyOlw.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-Bc-dBuMv.js → placementArrow-Dg1rH91i.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve--Wwaf8lu.js → responsiveObserve-D_EWIeac.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-vDmHQqHH.js → slide-lK4d3zsh.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-9c52yv3G.js → statusUtils-Bflq-Git.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BT4BiO6_.js → styleChecker-Ccp0I-wt.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-C7XxWPcP.js → useFlexGapSupport-CYZbByYA.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-BHoMqh4i.js → useFs-B_x0nxFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BOLxvsAG.js → usePersonalDataHub-DW55rL85.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CA7poeeP.js → vnode-Ca6MH3W8.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-B_sAn-co.js → zoom-NdHelOog.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/graph.js +215 -5
  154. package/src/commands/orchestrate.js +61 -9
  155. package/src/commands/team-distributed.js +342 -2
  156. package/src/commands/team.js +169 -7
  157. package/src/data/changelog.json +46 -0
  158. package/src/gateways/ws/message-dispatcher.js +4 -0
  159. package/src/gateways/ws/session-protocol.js +89 -11
  160. package/src/gateways/ws/ws-agent-handler.js +65 -9
  161. package/src/gateways/ws/ws-approval-gate.js +181 -16
  162. package/src/gateways/ws/ws-server.js +16 -6
  163. package/src/generated/cc-agent-protocol.schema.json +154 -3
  164. package/src/lib/agent-team/task-lease.js +487 -3
  165. package/src/lib/agent-team/team-agent-stream.js +16 -0
  166. package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
  167. package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
  168. package/src/lib/agent-team/team-distributed-queue.js +251 -0
  169. package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
  170. package/src/lib/agent-team/team-runner.js +285 -3
  171. package/src/lib/app-server/graph-runtime.js +1078 -0
  172. package/src/lib/app-server/rollout-store.js +32 -0
  173. package/src/lib/app-server/server.js +200 -0
  174. package/src/lib/approval-grant-ledger.js +69 -0
  175. package/src/lib/autonomous-agent.js +11 -0
  176. package/src/lib/codex-app-server-adapter.js +11 -20
  177. package/src/lib/cowork-graph-authority-adapter.js +455 -0
  178. package/src/lib/dynamic-workflow-facade.js +83 -16
  179. package/src/lib/graph-kernel/adapters.js +93 -20
  180. package/src/lib/graph-kernel/authority.js +324 -0
  181. package/src/lib/graph-kernel/compiler.js +67 -21
  182. package/src/lib/graph-kernel/cutover-authority-resolver.js +245 -0
  183. package/src/lib/graph-kernel/cutover-ledger.js +692 -0
  184. package/src/lib/graph-kernel/event-store.js +15 -1
  185. package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
  186. package/src/lib/graph-kernel/index.js +4 -0
  187. package/src/lib/graph-kernel/migration-saga.js +309 -0
  188. package/src/lib/graph-kernel/retirement-evidence.js +567 -0
  189. package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
  190. package/src/lib/graph-kernel/runtime.js +737 -38
  191. package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
  192. package/src/lib/graph-kernel/trace-reducer.js +6 -0
  193. package/src/lib/graph-kernel/trigger-adapter.js +60 -3
  194. package/src/lib/interaction-adapter.js +61 -9
  195. package/src/lib/legacy-runtime-authority.js +160 -0
  196. package/src/lib/orchestrator.js +28 -0
  197. package/src/lib/policy-decision-event.js +149 -0
  198. package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
  199. package/src/lib/record-replay/index.js +1 -0
  200. package/src/lib/record-replay/playwright-ui-driver.js +327 -0
  201. package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
  202. package/src/lib/scheduler-kernel/runtime.js +75 -2
  203. package/src/lib/webhook-security.js +484 -36
  204. package/src/runtime/coding-agent-events.cjs +13 -11
  205. package/src/runtime/headless-runner.js +17 -1
  206. package/src/runtime/headless-stream.js +66 -3
  207. package/src/runtime/session-slash-commands.js +57 -6
  208. package/src/assets/web-panel/assets/MarkdownRenderer-BwH414Ms.js +0 -1
  209. package/src/assets/web-panel/assets/PdhVaultBrowser-BiaZfQIM.js +0 -7
  210. package/src/assets/web-panel/assets/Projects-DiCGnMjz.js +0 -1
  211. package/src/assets/web-panel/assets/RemoteSession-s1gR38IO.js +0 -5
  212. package/src/assets/web-panel/assets/devWarning-DiSlgCC4.js +0 -1
  213. package/src/assets/web-panel/assets/index-9WIQEHvv.js +0 -1
  214. 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
- if (typeof this.registry.nextClaimable === "function") {
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 = this.registry.nextClaimable({ excludeKeys: excluded });
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", { key, holder, attempts: task.attempts });
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,