chainlesschain 0.166.5 → 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.
Files changed (195) hide show
  1. package/package.json +3 -1
  2. package/src/assets/web-panel/assets/{AIOps-DhCWWRmS.js → AIOps-BlrmQxa2.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BGbZcxSE.js → ActionButton-zyRyLITg.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CUJNYrmU.js → Analytics-DwGz7OGN.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-ParuJRmc.js → AppLayout-Dc-nj7Zd.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BMESCkte.js → Artifacts-7Hu3O73p.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-B614pUXR.js → Audit-Bnoe3-fR.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-BKkkvkQl.js → BackgroundAgents-BqYFrDKZ.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-CoFiC_kv.js → Backup-B3hwW1nz.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-Cu4OHz1W.js → BaseInput-XFVxLA4w.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-mxb_SR22.js → Chat-CWRDNw7e.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CsqO-fiV.js → ChatBubbleRenderer-Bf30VM8G.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-BJpZz-5L.js → Checkbox-kFeeBgac.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-ng7fYMi8.js → Codegen-CCxp8xoI.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-D751NOsU.js → Col-BLKZalle.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-BPVTHvTC.js → Community-DD0eWCez.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CY42ARxJ.js → Compact-CHqHWdy0.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Ec3zabvu.js → Compliance-Bw54uPiK.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-Do0oOlj8.js → Cowork-DZ13zKNJ.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-BXu6LGra.js → Cron-Dlj5Jevg.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-Dg1CsWLA.js → Crosschain-Nvz0aR0j.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-D1B8O6C9.js → DID-Ct89eUyY.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DJFnfIVk.js → Dashboard-BHUH5IAe.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-Be6KCHb7.js → Dropdown-BhZG-PO7.js} +1 -1
  25. package/src/assets/web-panel/assets/EmailListRenderer-ae4RVwwJ.js +1 -0
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CWt6WUoP.js → FamilyGuardDashboard-AOcxLfLr.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-Ba7bRkZh.js → Federation-BK2PJQOF.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CNa8GTAM.js → FormItemContext-C2n3xO2_.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DGHg2fio.js → GenericCardRenderer-DcyUVFZq.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DJAgN16e.js → Git-tBae9Lt8.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DqIapin6.js → Governance-DmNR3AP4.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-B00_KwDW.js → Inference-CoseEigi.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-D1_ZCehX.js → KnowledgeGraph-Bdjd1sxr.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-22jGgUmw.js → Logs-CtlkKIcn.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-DOIQQUTp.js → MarkdownRenderer-CZsTBEQE.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-ClIyNRL6.js → Marketplace-BTYb7nEx.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BhPsaaJr.js → McpTools-D0iUdW3P.js} +2 -2
  38. package/src/assets/web-panel/assets/{Memory-BXNDHgEH.js → Memory--gwI7w4Y.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BeSEujLm.js → MobileBridge-JmFBi24T.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DKJjWZ6t.js → MobileProjects-BK01cQRx.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-CsX4lo0h.js → Mtc-u7avzyoO.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-CdGiWPEN.js → MtcAudit-gT3z5fo_.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-C1aJmYGd.js → Multisig-BIqZTz5n.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-ClOwZKGW.js → NLProgramming-DdhVfXYq.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-xqZJkp5X.js → Notes-CBlyUmY3.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-D_8hg6E5.js → NotificationSettings-DSyI26N3.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BNMgCFHY.js → OrderTableRenderer-B7IEuNz4.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-DQjjPQ9u.js → Organization-ozhi4kGS.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-D0g51CZb.js → Overflow-CBy57RVM.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-BqDCDnon.js → P2P-CA-ZRv77.js} +2 -2
  51. package/src/assets/web-panel/assets/PdhVaultBrowser-DOHc9zm8.js +7 -0
  52. package/src/assets/web-panel/assets/{Permissions-D9Mk4hzw.js → Permissions-DiP632GP.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-Cksd0Ft-.js → PersonalDataHub-AnU8O-SS.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-ALaa1U0w.js → Pipeline-DDibOUaP.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-M-mmVDtr.js → Privacy-D421t36T.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-Bn39Z5S7.js → ProjectInit-DR879ZPJ.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-6Xmsc-zo.js → ProjectSettings-Ded8o6aY.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-BHPxiucB.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-FLNmdOWT.js → Providers-Boivuu-E.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-C5PNS5N7.js → QrScannerModal-xKD_ntKp.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CHSVdvQA.js → QuickAsk-D3y_A6FV.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-BRwvF4m9.js → Recommend-BjKM-YC2.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DeAfmrU2.js → RemoteSession-CgqKMXG4.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-Be_YQzm9.js → Reputation-Ci2GjH5p.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-Bv3cbL2A.js → Row-B0-T2BSh.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-DsTYAdrh.js → RssFeed-Bet-ur-r.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-2gch6_kT.js → Search-DWtRAS2R.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-pkS2eKdn.js → Security-BDfu2Qn6.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-D1ns1NlD.js → Services-CvJmvSMM.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-B-9nVmze.js → Skeleton-CEbrKpdC.js} +1 -1
  71. package/src/assets/web-panel/assets/Skills-CjVeiETf.js +1 -0
  72. package/src/assets/web-panel/assets/{Sla-CI9DZg-s.js → Sla-Dibypxum.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-CH0mQsl3.js → SpeechSettings-XflYXp7a.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-BHeEVZyN.js → SyncSettings-ro1Ivx1E.js} +2 -2
  75. package/src/assets/web-panel/assets/Tasks-CHq1qFbo.js +1 -0
  76. package/src/assets/web-panel/assets/{Templates--GvWvJEB.js → Templates-CRnUZxtZ.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-L-FgZD-r.js → Tenant-jUX72JCA.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-DMNfs5hK.js → Terminal-BBhAs7pt.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-DFzInCAj.js → TimelineRenderer-CD5M3RGp.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-Bnh73Gam.js → Tokens-sah3v0gu.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BO-fMwq8.js → Trigger-BNT3Uz3s.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CX-HXcRl.js → Trust-BytMGPMo.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-C8AOFGVL.js → UkeySign-BkYVMRQs.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-B_bJ6BO2.js → VideoEditing-psvb5Q7Y.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-Ccd3u1t4.js → Wallet-PFQTW0MH.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DVSL5e6o.js → WebAuthn-DgO-OwRT.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-DqFq6xGO.js → WorkflowEditor-DL2l9VNl.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-s5SEbhS8.js → chat-C84akEzN.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-CRFmX1eW.js → colors-DzTWuQKP.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-DCofr-Ii.js → compact-item-CR9LJQFv.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-duu0_qGr.js → createContext-CTTov5Kn.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-BOhvmlpc.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-B0KKSHGi.js → hasIn-DALj523o.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-PR4YRMxw.js → index-3-XJoYgX.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DY6ZHvJw.js → index-7ux_XohH.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DFzJlpwu.js → index-AXnERsyV.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CaDLq49Y.js → index-B2qpjU-D.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CpnGJDxL.js → index-B6QOJbSn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D6sAHm_C.js → index-BDyt57zL.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B_8atrbf.js → index-BHRXKiU1.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CQWeRqsN.js → index-BKNIzw0U.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-NiXCoVfh.js → index-BNaQt49r.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-C5chs_dS.js → index-Be6Os5S8.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C3PtUFgB.js → index-C5eeMl_2.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-4aqbfxrp.js → index-CNmTDXmf.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-SbxDTh6S.js → index-CXTEpfGe.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BWWfogVi.js → index-CXaCRXN4.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CIiqGHl0.js → index-CZhhFQi9.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D8sxQTSI.js → index-Cef0n4k_.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BM48QU3P.js → index-CjkPDSX4.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DjZvE3_P.js → index-CmELknPe.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BMaM-Yex.js → index-CnxjXIsK.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BugberH-.js → index-CqUgXYIQ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DeJMQynL.js → index-CunGDV0g.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DHHrnUkx.js → index-D0MqUnKO.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Ch8O1mrO.js → index-D9ScRFxz.js} +3 -3
  117. package/src/assets/web-panel/assets/{index-DJrRZ5um.js → index-DBIPnoTj.js} +1 -1
  118. package/src/assets/web-panel/assets/index-DDyMJexx.js +1 -0
  119. package/src/assets/web-panel/assets/{index-BDGNTPr6.js → index-DH6OG-ci.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DDLVcra4.js → index-DZER6Lj3.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-B24nGxlB.js → index-D_Bg0LdK.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CRjnopxx.js → index-Dah8M4l2.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BRpzktuV.js → index-DjE_ew7U.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BERyKHMq.js → index-DtW6Zr_i.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BCnLafAV.js → index-DxdzSljS.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CxvnkXVj.js → index-QW0EXx14.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CUFMz21M.js → index-W9axN_Ce.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CDCDbWnv.js → index-_8vetPbU.js} +1 -1
  129. package/src/assets/web-panel/assets/index-btiojFYn.js +1 -0
  130. package/src/assets/web-panel/assets/{index-oxcFCNJ4.js → index-eJcFleIV.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DtPSAUza.js → index-hzzTITR9.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DUT3dpdB.js → index-s4CFyn-n.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-Ncgc0S0H.js → initDefaultProps-JuW8mFj7.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BBobPHz-.js → motion-Cwb0HBve.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-Dgeb9hea.js → move-DHokzMgu.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-onxX64FZ.js → mtc-parser-DX31y6QS.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-D2OZXzri.js → omit-BCIUYDA6.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-J5iBCavx.js → pickAttrs-DMCj4EoZ.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CE4U8sO6.js → placementArrow-Dy5K-u1s.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-Dl64-wdo.js → responsiveObserve-DkGeZu54.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DRFC8TgC.js → slide-Dc5dyJdg.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-Bh1xb87a.js → statusUtils-DIUBjOaC.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-DlG_dRlk.js → styleChecker-DmyEOxm5.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-5qmSh3pc.js → useFlexGapSupport-FRhakk1e.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-C_fMqkQA.js → useFs-clXyV1WQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-D0Aih7lk.js → usePersonalDataHub-UF6DG41z.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-Cv17kLab.js → vnode-CoCt95G7.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B8Mzvavx.js → zoom-yVWt-ENm.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/graph.js +215 -5
  151. package/src/commands/team-distributed.js +342 -2
  152. package/src/commands/team.js +169 -7
  153. package/src/data/changelog.json +26 -0
  154. package/src/generated/cc-agent-protocol.schema.json +6 -1
  155. package/src/lib/agent-ipc-bus.js +453 -91
  156. package/src/lib/agent-ipc-flow-control.js +200 -0
  157. package/src/lib/agent-team/task-lease.js +315 -0
  158. package/src/lib/agent-team/team-agent-stream.js +16 -0
  159. package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
  160. package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
  161. package/src/lib/agent-team/team-distributed-queue.js +251 -0
  162. package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
  163. package/src/lib/agent-team/team-runner.js +225 -2
  164. package/src/lib/app-server/graph-runtime.js +754 -0
  165. package/src/lib/app-server/rollout-store.js +32 -0
  166. package/src/lib/app-server/server.js +140 -0
  167. package/src/lib/autonomous-agent.js +11 -0
  168. package/src/lib/cowork-graph-authority-adapter.js +455 -0
  169. package/src/lib/dynamic-workflow-facade.js +83 -16
  170. package/src/lib/graph-kernel/adapters.js +93 -20
  171. package/src/lib/graph-kernel/authority.js +324 -0
  172. package/src/lib/graph-kernel/compiler.js +1 -8
  173. package/src/lib/graph-kernel/cutover-authority-resolver.js +219 -0
  174. package/src/lib/graph-kernel/cutover-ledger.js +650 -0
  175. package/src/lib/graph-kernel/event-store.js +15 -1
  176. package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
  177. package/src/lib/graph-kernel/index.js +4 -0
  178. package/src/lib/graph-kernel/migration-saga.js +309 -0
  179. package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
  180. package/src/lib/graph-kernel/runtime.js +661 -24
  181. package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
  182. package/src/lib/graph-kernel/trace-reducer.js +6 -0
  183. package/src/lib/graph-kernel/trigger-adapter.js +60 -3
  184. package/src/lib/legacy-runtime-authority.js +160 -0
  185. package/src/lib/orchestrator.js +28 -0
  186. package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
  187. package/src/lib/scheduler-kernel/runtime.js +75 -2
  188. package/src/assets/web-panel/assets/EmailListRenderer-9L4EdmcR.js +0 -1
  189. package/src/assets/web-panel/assets/PdhVaultBrowser-BDMyV-DM.js +0 -7
  190. package/src/assets/web-panel/assets/Projects-C2KI2sH1.js +0 -1
  191. package/src/assets/web-panel/assets/Skills-V7TqlXWR.js +0 -1
  192. package/src/assets/web-panel/assets/Tasks-DOld05sg.js +0 -1
  193. package/src/assets/web-panel/assets/devWarning-0bFBr86K.js +0 -1
  194. package/src/assets/web-panel/assets/index-BJCitHZ6.js +0 -1
  195. package/src/assets/web-panel/assets/index-WmqZ5PwS.js +0 -1
@@ -0,0 +1,200 @@
1
+ export const AGENT_IPC_DEFAULT_LIMITS = Object.freeze({
2
+ maxAgents: 64,
3
+ maxPendingInteractions: 128,
4
+ maxPendingInteractionsPerAgent: 16,
5
+ maxPendingAgentRequests: 256,
6
+ maxPendingAgentRequestsPerAgent: 32,
7
+ maxStdoutLineBytes: 1024 * 1024,
8
+ maxStderrChunkBytes: 64 * 1024,
9
+ maxStdinFrameBytes: 1024 * 1024,
10
+ maxStdinQueueMessages: 128,
11
+ maxStdinQueueBytes: 4 * 1024 * 1024,
12
+ interactionTimeoutMs: 5 * 60 * 1000,
13
+ maxInteractionTimeoutMs: 10 * 60 * 1000,
14
+ agentRequestTimeoutMs: 30 * 1000,
15
+ maxAgentRequestTimeoutMs: 2 * 60 * 1000,
16
+ agentInitTimeoutMs: 10 * 1000,
17
+ maxAgentInitTimeoutMs: 2 * 60 * 1000,
18
+ agentHeartbeatMs: 30 * 1000,
19
+ maxAgentHeartbeatMs: 2 * 60 * 1000,
20
+ overloadRetryAfterMs: 1000,
21
+ });
22
+
23
+ export function positiveInteger(value, fallback, name) {
24
+ const candidate = value ?? fallback;
25
+ if (!Number.isSafeInteger(candidate) || candidate <= 0) {
26
+ throw new TypeError(`${name} must be a positive safe integer`);
27
+ }
28
+ return candidate;
29
+ }
30
+
31
+ export function boundedTimeout(value, fallback, maximum) {
32
+ const normalized = positiveInteger(value, fallback, "timeoutMs");
33
+ return Math.min(normalized, maximum);
34
+ }
35
+
36
+ export function overloadError(resource, limit, retryAfterMs) {
37
+ const error = new Error(
38
+ `Agent IPC overloaded: ${resource} reached its limit of ${limit}`,
39
+ );
40
+ error.code = "OVERLOADED";
41
+ error.retryAfterMs = retryAfterMs;
42
+ error.data = {
43
+ resource,
44
+ limit,
45
+ retry_after_ms: retryAfterMs,
46
+ };
47
+ return error;
48
+ }
49
+
50
+ export function normalizeAgentIPCLimits(limits = {}) {
51
+ const normalized = {};
52
+ for (const [name, fallback] of Object.entries(AGENT_IPC_DEFAULT_LIMITS)) {
53
+ normalized[name] = positiveInteger(limits[name], fallback, name);
54
+ }
55
+ return Object.freeze(normalized);
56
+ }
57
+
58
+ /**
59
+ * A bounded JSONL writer for one child stdin stream. The first write that
60
+ * returns false marks the transport blocked; later frames enter an explicit
61
+ * message/byte-capped queue until Node emits drain.
62
+ */
63
+ export function createBoundedStdinWriter({
64
+ child,
65
+ agentId,
66
+ limits,
67
+ onOverload,
68
+ }) {
69
+ const queue = [];
70
+ let queuedBytes = 0;
71
+ let blocked = false;
72
+ let closed = false;
73
+
74
+ const cleanupListeners = () => {
75
+ child.stdin.off?.("drain", flush);
76
+ child.stdin.off?.("error", handleError);
77
+ child.stdin.off?.("close", handleClose);
78
+ };
79
+
80
+ const fail = (error) => {
81
+ if (closed) return;
82
+ closed = true;
83
+ blocked = false;
84
+ queue.length = 0;
85
+ queuedBytes = 0;
86
+ cleanupListeners();
87
+ queueMicrotask(() => onOverload(error));
88
+ };
89
+
90
+ const writePayload = (payload) => {
91
+ if (closed) {
92
+ throw new Error(`Agent ${agentId} stdin transport is closed`);
93
+ }
94
+ if (child.stdin.destroyed || child.stdin.writableEnded) {
95
+ const error = new Error(`Agent ${agentId} stdin is not writable`);
96
+ fail(error);
97
+ throw error;
98
+ }
99
+ const bytes = Buffer.byteLength(payload);
100
+ if (bytes > limits.maxStdinFrameBytes) {
101
+ const error = overloadError(
102
+ "stdin_frame_bytes",
103
+ limits.maxStdinFrameBytes,
104
+ limits.overloadRetryAfterMs,
105
+ );
106
+ fail(error);
107
+ throw error;
108
+ }
109
+
110
+ if (blocked || queue.length > 0) {
111
+ if (
112
+ queue.length >= limits.maxStdinQueueMessages ||
113
+ queuedBytes + bytes > limits.maxStdinQueueBytes
114
+ ) {
115
+ const resource =
116
+ queue.length >= limits.maxStdinQueueMessages
117
+ ? "stdin_queue_messages"
118
+ : "stdin_queue_bytes";
119
+ const limit =
120
+ resource === "stdin_queue_messages"
121
+ ? limits.maxStdinQueueMessages
122
+ : limits.maxStdinQueueBytes;
123
+ const error = overloadError(
124
+ resource,
125
+ limit,
126
+ limits.overloadRetryAfterMs,
127
+ );
128
+ fail(error);
129
+ throw error;
130
+ }
131
+ queue.push({ payload, bytes });
132
+ queuedBytes += bytes;
133
+ return true;
134
+ }
135
+
136
+ try {
137
+ blocked = child.stdin.write(payload) === false;
138
+ } catch (error) {
139
+ fail(error);
140
+ throw error;
141
+ }
142
+ return true;
143
+ };
144
+
145
+ const flush = () => {
146
+ if (closed) return;
147
+ blocked = false;
148
+ while (queue.length > 0 && !blocked) {
149
+ const entry = queue.shift();
150
+ queuedBytes -= entry.bytes;
151
+ try {
152
+ blocked = child.stdin.write(entry.payload) === false;
153
+ } catch (error) {
154
+ fail(error);
155
+ return;
156
+ }
157
+ }
158
+ };
159
+
160
+ const handleError = (error) => {
161
+ if (!closed) fail(error);
162
+ };
163
+
164
+ const handleClose = () => {
165
+ if (
166
+ !closed &&
167
+ child.exitCode === null &&
168
+ (child.signalCode === null || child.signalCode === undefined)
169
+ ) {
170
+ fail(new Error(`Agent ${agentId} stdin closed before process exit`));
171
+ }
172
+ };
173
+
174
+ child.stdin.on?.("drain", flush);
175
+ child.stdin.on?.("error", handleError);
176
+ child.stdin.on?.("close", handleClose);
177
+
178
+ return {
179
+ write(message) {
180
+ const payload = `${JSON.stringify(message)}\n`;
181
+ return writePayload(payload);
182
+ },
183
+ close() {
184
+ if (closed) return;
185
+ closed = true;
186
+ blocked = false;
187
+ queue.length = 0;
188
+ queuedBytes = 0;
189
+ cleanupListeners();
190
+ },
191
+ status() {
192
+ return {
193
+ blocked,
194
+ closed,
195
+ queuedMessages: queue.length,
196
+ queuedBytes,
197
+ };
198
+ },
199
+ };
200
+ }
@@ -325,6 +325,7 @@ export class TaskLeaseRegistry {
325
325
  attempts: t.metadata?.attempts || 0,
326
326
  lease: lease ? { ...lease } : null,
327
327
  assignee: t.assignee,
328
+ createdBy: t.createdBy ?? null,
328
329
  rev: t.rev,
329
330
  // Full metadata is exposed so executors can read user payload
330
331
  // (e.g. a task's shell `command` or agent `prompt`) — it carries the
@@ -1465,6 +1466,320 @@ export class TaskLeaseRegistry {
1465
1466
  return { ok: true, priorStatus };
1466
1467
  }
1467
1468
 
1469
+ /**
1470
+ * Repair the compatibility task view from a terminal canonical Graph node.
1471
+ * This exceptional path may correct a fail-closed recovery cancellation when
1472
+ * the immutable Graph ledger proves that the effect/attempt already settled.
1473
+ */
1474
+ applyCanonicalTaskProjection(
1475
+ key,
1476
+ {
1477
+ runId,
1478
+ nodeId,
1479
+ graphStatus,
1480
+ authorityGeneration,
1481
+ eventHead,
1482
+ revisionDigest,
1483
+ evidence = null,
1484
+ now = this._now(),
1485
+ } = {},
1486
+ ) {
1487
+ const terminalStatus =
1488
+ graphStatus === "succeeded"
1489
+ ? TASK_STATUS.COMPLETED
1490
+ : ["failed", "blocked", "cancelled"].includes(graphStatus)
1491
+ ? TASK_STATUS.CANCELLED
1492
+ : null;
1493
+ if (!terminalStatus) {
1494
+ return { ok: false, reason: "graph_not_terminal" };
1495
+ }
1496
+ if (
1497
+ !SAFE_HANDOFF_ID_PATTERN.test(String(runId || "")) ||
1498
+ !SAFE_HANDOFF_ID_PATTERN.test(String(nodeId || "")) ||
1499
+ !Number.isSafeInteger(Number(authorityGeneration)) ||
1500
+ Number(authorityGeneration) < 1 ||
1501
+ !SHA256_PATTERN.test(String(eventHead || "")) ||
1502
+ !SHA256_PATTERN.test(String(revisionDigest || ""))
1503
+ ) {
1504
+ return { ok: false, reason: "invalid_graph_binding" };
1505
+ }
1506
+ let cleanEvidence;
1507
+ try {
1508
+ cleanEvidence = cloneValue(evidence);
1509
+ } catch {
1510
+ return { ok: false, reason: "invalid_graph_evidence" };
1511
+ }
1512
+ const binding = {
1513
+ schema: "chainlesschain.team-graph-task-projection/v1",
1514
+ runId: String(runId),
1515
+ nodeId: String(nodeId),
1516
+ graphStatus,
1517
+ authorityGeneration: Number(authorityGeneration),
1518
+ eventHead: String(eventHead),
1519
+ revisionDigest: String(revisionDigest),
1520
+ evidence: cleanEvidence,
1521
+ };
1522
+ const projectionDigest = digestValue(binding);
1523
+ const id = this._byKey.get(key);
1524
+ const task = id ? this._tasks.get(id) : null;
1525
+ if (!task) return { ok: false, reason: "not_found" };
1526
+ const prior = task.metadata?.canonicalGraphProjection || null;
1527
+ if (prior?.projectionDigest === projectionDigest) {
1528
+ return {
1529
+ ok: true,
1530
+ idempotent: true,
1531
+ status: task.status,
1532
+ projectionDigest,
1533
+ };
1534
+ }
1535
+ if (
1536
+ prior &&
1537
+ (prior.runId !== binding.runId ||
1538
+ prior.nodeId !== binding.nodeId ||
1539
+ prior.revisionDigest !== binding.revisionDigest ||
1540
+ prior.graphStatus !== binding.graphStatus)
1541
+ ) {
1542
+ return { ok: false, reason: "graph_projection_conflict" };
1543
+ }
1544
+ const snapshot = this._tasks.snapshot();
1545
+ const stored = snapshot.tasks.find((candidate) => candidate.id === task.id);
1546
+ if (!stored || stored.rev !== task.rev) {
1547
+ return { ok: false, reason: "concurrent" };
1548
+ }
1549
+ const projectedAt = Number.isFinite(Number(now))
1550
+ ? Number(now)
1551
+ : this._now();
1552
+ const metadata = {
1553
+ ...stored.metadata,
1554
+ lease: null,
1555
+ canonicalGraphProjection: {
1556
+ ...binding,
1557
+ projectionDigest,
1558
+ projectedAt,
1559
+ },
1560
+ };
1561
+ delete metadata.adjudication;
1562
+ if (terminalStatus === TASK_STATUS.COMPLETED) {
1563
+ metadata.result = {
1564
+ canonicalGraph: true,
1565
+ terminalEvidence: cleanEvidence,
1566
+ };
1567
+ delete metadata.lastError;
1568
+ } else {
1569
+ metadata.lastError = `canonical Graph node settled ${graphStatus}`;
1570
+ }
1571
+ stored.status = terminalStatus;
1572
+ stored.assignee = null;
1573
+ stored.updatedAt = projectedAt;
1574
+ stored.rev += 1;
1575
+ stored.metadata = metadata;
1576
+ stored.history = [
1577
+ ...(stored.history || []),
1578
+ {
1579
+ ts: projectedAt,
1580
+ actor: "graph-kernel",
1581
+ action: "canonical-projection-repaired",
1582
+ changes: ["status", "assignee", "metadata"],
1583
+ graphStatus,
1584
+ projectionDigest,
1585
+ },
1586
+ ];
1587
+ this._tasks = SharedTaskList.restore(snapshot, { now: this._now });
1588
+ this._rebuildIndexes();
1589
+ if (terminalStatus === TASK_STATUS.COMPLETED) {
1590
+ for (const dependent of this._dependentsByKey.get(key) || []) {
1591
+ this._enqueueIfReady(dependent, projectedAt);
1592
+ }
1593
+ }
1594
+ return { ok: true, status: terminalStatus, projectionDigest };
1595
+ }
1596
+
1597
+ applyCanonicalHandoffProjection(
1598
+ key,
1599
+ { handoff: source, targetLease = null, now = this._now() } = {},
1600
+ ) {
1601
+ if (!source || typeof source !== "object") {
1602
+ return { ok: false, reason: "invalid_handoff_projection" };
1603
+ }
1604
+ const id = normalizedHandoffId(source.id, () => null);
1605
+ const fromHolder = normalizedHolder(source.fromHolder);
1606
+ const toHolder = normalizedHolder(source.toHolder);
1607
+ const revisionDigest = normalizedDigest(source.revisionDigest);
1608
+ const authorityDigest = normalizedDigest(source.authorityDigest);
1609
+ const artifactIds = normalizedArtifactIds(source.artifactIds);
1610
+ const status = String(source.status || "");
1611
+ const ttlMs = Number(source.ttlMs);
1612
+ if (
1613
+ !id ||
1614
+ !fromHolder ||
1615
+ !toHolder ||
1616
+ fromHolder === toHolder ||
1617
+ !revisionDigest ||
1618
+ !authorityDigest ||
1619
+ !artifactIds ||
1620
+ !TEAM_CUSTODY_HANDOFF_STATUSES.includes(status) ||
1621
+ !Number.isSafeInteger(ttlMs) ||
1622
+ ttlMs <= 0 ||
1623
+ ttlMs > MAX_HANDOFF_TTL_MS ||
1624
+ source.taskKey !== key ||
1625
+ typeof source.fromLeaseId !== "string" ||
1626
+ source.fromLeaseId.length === 0 ||
1627
+ !["string", "number"].includes(typeof source.fromFence)
1628
+ ) {
1629
+ return { ok: false, reason: "invalid_handoff_projection" };
1630
+ }
1631
+ let preconditions;
1632
+ let summary;
1633
+ try {
1634
+ preconditions = cloneValue(source.preconditions);
1635
+ summary = cloneValue(source.summary);
1636
+ } catch {
1637
+ return { ok: false, reason: "invalid_handoff_projection" };
1638
+ }
1639
+ const idempotencyKey = normalizedHandoffId(
1640
+ source.idempotencyKey,
1641
+ () => null,
1642
+ );
1643
+ if (!idempotencyKey) {
1644
+ return { ok: false, reason: "invalid_handoff_projection" };
1645
+ }
1646
+ const binding = {
1647
+ schema: TEAM_CUSTODY_HANDOFF_SCHEMA,
1648
+ id,
1649
+ taskKey: key,
1650
+ fromHolder,
1651
+ fromLeaseId: source.fromLeaseId,
1652
+ fromFence: source.fromFence,
1653
+ toHolder,
1654
+ revisionDigest,
1655
+ authorityDigest,
1656
+ artifactIds,
1657
+ preconditions,
1658
+ summary,
1659
+ idempotencyKey,
1660
+ ttlMs,
1661
+ };
1662
+ const bindingDigest = digestValue(binding);
1663
+ if (source.bindingDigest && source.bindingDigest !== bindingDigest) {
1664
+ return { ok: false, reason: "handoff_binding_conflict" };
1665
+ }
1666
+ let cleanTargetLease = null;
1667
+ if (status === "committed") {
1668
+ try {
1669
+ cleanTargetLease = cloneValue(targetLease || source.targetLease);
1670
+ } catch {
1671
+ return { ok: false, reason: "invalid_target_lease" };
1672
+ }
1673
+ if (
1674
+ !cleanTargetLease ||
1675
+ cleanTargetLease.holder !== toHolder ||
1676
+ typeof cleanTargetLease.leaseId !== "string" ||
1677
+ cleanTargetLease.leaseId.length === 0 ||
1678
+ !Number.isFinite(Number(cleanTargetLease.expiresAt))
1679
+ ) {
1680
+ return { ok: false, reason: "invalid_target_lease" };
1681
+ }
1682
+ }
1683
+ const taskId = this._byKey.get(key);
1684
+ const task = taskId ? this._tasks.get(taskId) : null;
1685
+ if (!task) return { ok: false, reason: "not_found" };
1686
+ const history = handoffHistory(task);
1687
+ const existing = history.find((entry) => entry.id === id);
1688
+ if (existing && existing.bindingDigest !== bindingDigest) {
1689
+ return { ok: false, reason: "handoff_binding_conflict" };
1690
+ }
1691
+ if (existing && existing.status !== status) {
1692
+ const transitions = {
1693
+ offered: new Set([
1694
+ "accepted",
1695
+ "rejected",
1696
+ "committed",
1697
+ "revoked",
1698
+ "expired",
1699
+ ]),
1700
+ accepted: new Set(["committed", "revoked", "expired"]),
1701
+ };
1702
+ if (!transitions[existing.status]?.has(status)) {
1703
+ return { ok: false, reason: "handoff_projection_regressed" };
1704
+ }
1705
+ }
1706
+ if (existing?.status === status) {
1707
+ return { ok: true, idempotent: true, handoff: cloneValue(existing) };
1708
+ }
1709
+ const projectedAt = Number.isFinite(Number(now))
1710
+ ? Number(now)
1711
+ : this._now();
1712
+ const projected = {
1713
+ ...(existing || binding),
1714
+ ...binding,
1715
+ bindingDigest,
1716
+ expiresAtMs: Number(source.expiresAtMs),
1717
+ status,
1718
+ offeredAt: Number(source.offeredAt),
1719
+ acceptedAt: source.acceptedAt == null ? null : Number(source.acceptedAt),
1720
+ rejectedAt: source.rejectedAt == null ? null : Number(source.rejectedAt),
1721
+ committedAt:
1722
+ source.committedAt == null ? null : Number(source.committedAt),
1723
+ revokedAt: source.revokedAt == null ? null : Number(source.revokedAt),
1724
+ expiredAt: source.expiredAt == null ? null : Number(source.expiredAt),
1725
+ targetStartedAt: existing?.targetStartedAt ?? null,
1726
+ targetSettledAt: existing?.targetSettledAt ?? null,
1727
+ targetSettlement: existing?.targetSettlement ?? null,
1728
+ reason:
1729
+ source.reason == null ? null : String(source.reason).slice(0, 1024),
1730
+ acceptedByAttempt: existing?.acceptedByAttempt ?? null,
1731
+ targetLease:
1732
+ status === "committed"
1733
+ ? cloneValue(existing?.targetLease || cleanTargetLease)
1734
+ : null,
1735
+ canonicalProjectedAt: projectedAt,
1736
+ updatedAt: Number(source.updatedAt) || projectedAt,
1737
+ };
1738
+ if (existing) {
1739
+ history[history.indexOf(existing)] = projected;
1740
+ } else {
1741
+ history.push(projected);
1742
+ while (history.length > MAX_HANDOFF_HISTORY) history.shift();
1743
+ }
1744
+ const snapshot = this._tasks.snapshot();
1745
+ const stored = snapshot.tasks.find((candidate) => candidate.id === task.id);
1746
+ if (!stored || stored.rev !== task.rev) {
1747
+ return { ok: false, reason: "concurrent" };
1748
+ }
1749
+ stored.rev += 1;
1750
+ stored.updatedAt = projectedAt;
1751
+ stored.metadata = { ...stored.metadata, custodyHandoffs: history };
1752
+ if (
1753
+ status === "committed" &&
1754
+ ![TASK_STATUS.COMPLETED, TASK_STATUS.CANCELLED].includes(stored.status)
1755
+ ) {
1756
+ stored.status = TASK_STATUS.IN_PROGRESS;
1757
+ stored.assignee = toHolder;
1758
+ stored.metadata.lease = cloneValue(projected.targetLease);
1759
+ } else if (
1760
+ status === "expired" &&
1761
+ stored.metadata?.lease?.leaseId === binding.fromLeaseId
1762
+ ) {
1763
+ stored.status = TASK_STATUS.PENDING;
1764
+ stored.assignee = null;
1765
+ stored.metadata.lease = null;
1766
+ }
1767
+ stored.history = [
1768
+ ...(stored.history || []),
1769
+ {
1770
+ ts: projectedAt,
1771
+ actor: "graph-kernel",
1772
+ action: "canonical-handoff-projected",
1773
+ changes: ["status", "assignee", "metadata"],
1774
+ handoffId: id,
1775
+ handoffStatus: status,
1776
+ },
1777
+ ];
1778
+ this._tasks = SharedTaskList.restore(snapshot, { now: this._now });
1779
+ this._rebuildIndexes();
1780
+ return { ok: true, handoff: cloneValue(projected) };
1781
+ }
1782
+
1468
1783
  /** Bind a pending adjudication to its immutable durable case evidence. */
1469
1784
  bindAdjudicationCase(key, { caseId, registryDigest, sideEffectDigest } = {}) {
1470
1785
  const id = this._byKey.get(key);
@@ -7,6 +7,7 @@
7
7
  * are never copied into parser state or returned to callers.
8
8
  */
9
9
 
10
+ import { createHash } from "node:crypto";
10
11
  import { TextDecoder } from "node:util";
11
12
 
12
13
  export const DEFAULT_TEAM_AGENT_MAX_LINE_BYTES = 1024 * 1024;
@@ -96,6 +97,7 @@ export class TeamAgentStreamParser {
96
97
  #tokenUsageEvents = 0;
97
98
  #usageByIdentity = new Map();
98
99
  #sawTerminalResult = false;
100
+ #terminalResultDigest = null;
99
101
  #finished = false;
100
102
  #failed = null;
101
103
  #finalSummary = null;
@@ -204,6 +206,16 @@ export class TeamAgentStreamParser {
204
206
  return this.#copyLiveSummary();
205
207
  }
206
208
 
209
+ /**
210
+ * Return an immutable digest of the exact terminal result record without
211
+ * retaining or exposing its prompt/result body.
212
+ */
213
+ terminalEvidence() {
214
+ return this.#terminalResultDigest
215
+ ? Object.freeze({ outputDigest: this.#terminalResultDigest })
216
+ : null;
217
+ }
218
+
207
219
  #copyLiveSummary() {
208
220
  return {
209
221
  provider: this.#provider,
@@ -291,6 +303,9 @@ export class TeamAgentStreamParser {
291
303
  }
292
304
  if (line.trim() === "") return;
293
305
 
306
+ const lineDigest = `sha256:${createHash("sha256")
307
+ .update(line, "utf8")
308
+ .digest("hex")}`;
294
309
  let event;
295
310
  try {
296
311
  event = JSON.parse(line);
@@ -345,6 +360,7 @@ export class TeamAgentStreamParser {
345
360
 
346
361
  if (event.type === "result") {
347
362
  this.#sawTerminalResult = true;
363
+ this.#terminalResultDigest = lineDigest;
348
364
  this.#lastResultProvider =
349
365
  typeof event.provider === "string" ? event.provider : this.#provider;
350
366
  this.#lastResultModel =