chainlesschain 0.166.1 → 0.166.3

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 (174) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DwdhBUBc.js → AIOps-DZTvbk_H.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Dd1lBEeo.js → ActionButton-IaEVUN3o.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DuGuuI36.js → Analytics-CCQab0gl.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-CvHpSs3M.js → AppLayout-Bs_0GVpx.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BU9F3wJh.js → Artifacts-Bm83-yJv.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-DK_n_WFm.js → Audit-Bah1XDR5.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-qKsxF5tv.js → BackgroundAgents-BPZA0B5d.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-JS58pSyV.js → Backup-BMydWFiM.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-gGl6Ray1.js → BaseInput-lhopFSZz.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-B2FZNq3U.js → Chat-Bbbs5BP1.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZS_bLAr.js → ChatBubbleRenderer-BIAfOKCj.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-tsI0TE22.js → Checkbox-CLEMA9J4.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-D5kqhfAr.js → Codegen-deCSwmnK.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DdN1TrqS.js → Col-CH-n8haq.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DgbEeh6V.js → Community-DJuAl6dw.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-FIm-fRB_.js → Compact-BMyLBmgs.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-B-N0pudf.js → Compliance-BK75Ss93.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CuMafBpi.js → Cowork-5XbJwKYq.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-BTwzNFHR.js → Cron-Ezgir7IZ.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DRoYbLOd.js → Crosschain-CKuMoYA7.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-CPhnNkz_.js → DID-CxS244cH.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DJQftix2.js → Dashboard-wrUKrsJy.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-PSAH1Kfy.js → Dropdown-A6I91Z2J.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-PVRqeMiZ.js → EmailListRenderer-BofaiRYY.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CYtnjqjl.js → FamilyGuardDashboard-D3eeNA64.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-_-53kTDz.js → Federation-DzK-3AjS.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-DTQ4qGuE.js → FormItemContext-Dm6mYA8b.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-ON_NfX8k.js → GenericCardRenderer-BeWL-Q1b.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DUc3w_Bf.js → Git-CtGCxg9p.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CktsJ2ku.js → Governance-DZvFB46G.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-4wUHQvju.js → Inference-ntqp4cmw.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-Dq4saPnZ.js → KnowledgeGraph-CrLYbqLe.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-Btb50m5s.js → Logs-CKA1PRhC.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-DtwoKxDJ.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-D3rSncxx.js → Marketplace-B8aPsXYv.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Bc6Mori_.js → McpTools-DQOgNdGS.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-C-ottUdN.js → Memory-i9IK9B0M.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-C0DITBmP.js → MobileBridge-BynYvpv9.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-O6cr0Nal.js → MobileProjects-DixivGuQ.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-B_MXKXvY.js → Mtc-OWPvWVNr.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-BDkUqWIT.js → MtcAudit-Cqpg5C4A.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-BaxNWm8c.js → Multisig-CT5kMJIZ.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-UD2GndZc.js → NLProgramming-BXD0Dz0h.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-pU7wtMwB.js → Notes-T1w5p8N5.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BIs6ULr3.js → NotificationSettings-DFCThpKJ.js} +1 -1
  47. package/src/assets/web-panel/assets/OrderTableRenderer-BJOuM0Kl.js +1 -0
  48. package/src/assets/web-panel/assets/{Organization-C9o-n2lq.js → Organization-CSFcw86q.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-CEvMXxCS.js → Overflow-BxVMuLTk.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-C3gQMTK3.js → P2P-B8qxY_yX.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-D1LVpBOr.js → PdhVaultBrowser-Bcq27Exy.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-Dj5nIi0Y.js → Permissions-CGBvJVXP.js} +3 -3
  53. package/src/assets/web-panel/assets/{PersonalDataHub-uiLYuFcu.js → PersonalDataHub-DM9IEeJ3.js} +6 -6
  54. package/src/assets/web-panel/assets/{Pipeline-CIrmF89x.js → Pipeline-wEskx2-p.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-B3K1CUBa.js → Privacy-DIA02lLJ.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-C_wCZ0zW.js → ProjectInit-uMXlNLHV.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-iCitfuNJ.js → ProjectSettings-Sy3NOtt7.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-BwimeXkW.js → Projects-xFjfOkQM.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-BLpepgr6.js → Providers-CNyOpbg8.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DPy8tjXV.js → QrScannerModal-Dk1UVRwI.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CRq8VhID.js → QuickAsk-B-UqLoLG.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CirlWIiK.js → Recommend-CiTBVZvN.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-nlnJlKXO.js → RemoteSession-BhABd516.js} +3 -3
  64. package/src/assets/web-panel/assets/{Reputation-B5aaxee5.js → Reputation-Dq1xTCcN.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-lzsTQZlq.js → Row-DbFc4sc7.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C41AzjgC.js → RssFeed-D7IBkkLm.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-1Hxx3TZ3.js → Search-BVyMlGoa.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-8VqwRxAp.js → Security-BzMm9Be_.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-DCm0HHAD.js → Services-Dfk0kied.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-D6w5gpmW.js → Skeleton-C8B5mUit.js} +1 -1
  71. package/src/assets/web-panel/assets/Skills-BNTPoJn0.js +1 -0
  72. package/src/assets/web-panel/assets/{Sla-BkMj8Dxu.js → Sla-gnFelKfT.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-BOmLqW44.js → SpeechSettings-B12gCQkK.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-2xKSqFDO.js → SyncSettings-CHWk9cpj.js} +2 -2
  75. package/src/assets/web-panel/assets/Tasks-B_zs9jkJ.js +1 -0
  76. package/src/assets/web-panel/assets/{Templates-CcOGWgZz.js → Templates-PjdppQrI.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-CAyzzQWN.js → Tenant-CH3aARxE.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-Daagerkm.js → Terminal-BqqrYyg3.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-1jGbMj7I.js → TimelineRenderer-Dx9soq9f.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CYQ-FQju.js → Tokens-C66KpDDZ.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-C70zRwuR.js → Trigger-DHxgGsap.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CeqXfiX_.js → Trust-3cct4QxN.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-D0j6m1bU.js → UkeySign-Cs6UfDEH.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DFHpM7Yd.js → VideoEditing-jbu2EAQa.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-BVC2J0Yx.js → Wallet-BIykFB9D.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-BceIN2Gn.js → WebAuthn-DFgqKmHG.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-Bgeb-i-S.js → WorkflowEditor-CNg5bBiH.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BmMBqgvz.js → chat-B-6wzojE.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-sjRzwnyw.js → colors-BHAq7y9y.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-DNt6m2bM.js → compact-item-CGJnSTnu.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DELaLit3.js → createContext-Cx0ZF512.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-CNq_RRw4.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-dfwk9O8x.js → hasIn-DibIw3z7.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-Du62m6pG.js → index-0NWSa3Xq.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-LMfsEdLk.js → index-746-mNhw.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Cbu3-zFd.js → index-Aaeca8o4.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BXJ68ObJ.js → index-B1jAbIxx.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B4Z4HZcf.js → index-B28jdxwR.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Bs-mWOWt.js → index-B2rOMBeN.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B0wkOqE9.js → index-BAoFiV3n.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CtfYPnsY.js → index-BCtW4F8-.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CpVt6M_8.js → index-BEXM3qSV.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-1w7dha_a.js → index-BFTGp-aF.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C2Sxf7yC.js → index-BJhS6i02.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B7qiZc2Z.js → index-BO-XxBD5.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DlYL8VP8.js → index-BR2BiNtx.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-dAF9qRVa.js → index-BRflLAdr.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BMnvNNEd.js → index-BTWb3sbj.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BvIQ9sZa.js → index-BZ7GbrgF.js} +1 -1
  110. package/src/assets/web-panel/assets/index-B_H-RZ9i.js +1 -0
  111. package/src/assets/web-panel/assets/{index-DC6FlHlP.js → index-BiMLsIwd.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-6bjBUhoH.js → index-Bmqjip63.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BSB9Gin8.js → index-BoySHSgZ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-fNwu9CU_.js → index-Bz3J0eVB.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-dpDeFZNt.js → index-C6M2yHVE.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-WpEDoyTv.js → index-CH2A_Fdn.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CujMHspH.js → index-CUX9mq3M.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DFOYbzg-.js → index-CY2E4Y99.js} +1 -1
  119. package/src/assets/web-panel/assets/index-CkH9UQQL.js +1 -0
  120. package/src/assets/web-panel/assets/{index-CAIn5cS9.js → index-CoKu7Q9r.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-OC3qYV4-.js → index-CrjkH_QU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BzddvOOb.js → index-Cuity3gy.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Rt-fym5b.js → index-CwcWpW1q.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BLbvXsxf.js → index-Cz5ety6j.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-aj9ObF2R.js → index-DXNcm44v.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-vCQ3l6DX.js → index-DjCJIttz.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Clrqtycd.js → index-DnsVRqCa.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DnQOc5wo.js → index-SbQacweG.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CLSqyAcE.js → index-g0V_mLQ9.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DX3wwu3G.js → index-puIs3mTs.js} +3 -3
  131. package/src/assets/web-panel/assets/{index-DY2G1Th2.js → index-sI_1E0co.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DV8q_Hki.js → index-woOjtit-.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DUt9Xj8y.js → initDefaultProps-Gbl9QOqg.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-DdiFPnv7.js → motion-BHh6ZzZu.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-BJ2VH7Y2.js → move-mX6Rwrd1.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-BCnX6oOJ.js → mtc-parser-CuzZa_kI.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-CyHxlDLV.js → omit-DjANYkpi.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-BJiGW3bY.js → pickAttrs-C_3v40wY.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-DhJ9Rhx8.js → placementArrow-L2HgRede.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-C6zpL9bC.js → responsiveObserve-DIkGMHyT.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DCbMFRF-.js → slide-C1hp5tD0.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-CNtVLsIq.js → statusUtils-DH1W2uFA.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-Z078OtUc.js → styleChecker-dEaKQcv2.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-w4RVmcGs.js → useFlexGapSupport-CD7j1zxt.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-D4Xw1XRt.js → useFs-C8jXMvEM.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-Bnbd1PgY.js → usePersonalDataHub-C4r-8mys.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-DSOQxMFN.js → vnode-DDuI6wgY.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-DNPE1Wca.js → zoom-Dd-DteT6.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/team.js +239 -55
  151. package/src/data/changelog.json +26 -0
  152. package/src/lib/agent-team/task-lease.js +718 -6
  153. package/src/lib/agent-team/team-graph-projection.js +303 -0
  154. package/src/lib/agent-team/team-mailbox.js +508 -2
  155. package/src/lib/agent-team/team-message-bridge.js +722 -0
  156. package/src/lib/agent-team/team-message-tools.js +231 -0
  157. package/src/lib/agent-team/team-runner.js +1186 -10
  158. package/src/lib/agent-team/team-session-message-adapter.js +720 -0
  159. package/src/lib/app-server/cli-agent-kernel-adapter.js +1 -0
  160. package/src/lib/app-server/protocol.js +43 -0
  161. package/src/lib/app-server/server.js +8 -11
  162. package/src/lib/approval-grant-ledger.js +187 -0
  163. package/src/lib/session-message-fabric.js +265 -3
  164. package/src/lib/subagent-inheritance.js +5 -3
  165. package/src/runtime/agent-core.js +38 -0
  166. package/src/runtime/headless-runner.js +36 -3
  167. package/src/runtime/headless-stream.js +184 -19
  168. package/src/assets/web-panel/assets/MarkdownRenderer-Cre8P8HG.js +0 -1
  169. package/src/assets/web-panel/assets/OrderTableRenderer-0NuumnfG.js +0 -1
  170. package/src/assets/web-panel/assets/Skills-Bw_pUTJB.js +0 -1
  171. package/src/assets/web-panel/assets/Tasks-BPAnzVau.js +0 -1
  172. package/src/assets/web-panel/assets/devWarning-Ct8o3bu_.js +0 -1
  173. package/src/assets/web-panel/assets/index-D685kO6L.js +0 -1
  174. package/src/assets/web-panel/assets/index-DTlIRMqX.js +0 -1
@@ -24,7 +24,14 @@ import { TeamRunner } from "../lib/agent-team/team-runner.js";
24
24
  import { TeamWorktreeCoordinator } from "../lib/agent-team/team-worktree.js";
25
25
  import { TeamBudget } from "../lib/agent-team/team-budget.js";
26
26
  import { TeamMailbox } from "../lib/agent-team/team-mailbox.js";
27
+ import { TeamSessionMessageAdapter } from "../lib/agent-team/team-session-message-adapter.js";
27
28
  import { TeamAgentStreamParser } from "../lib/agent-team/team-agent-stream.js";
29
+ import { TeamMessageBridge } from "../lib/agent-team/team-message-bridge.js";
30
+ import {
31
+ computeTeamGraphAuthorityDigest,
32
+ computeTeamGraphRevisionDigest,
33
+ projectTeamGraphCollaboration,
34
+ } from "../lib/agent-team/team-graph-projection.js";
28
35
  import { resolveTeamTaskContract } from "../lib/agent-team/team-task-contract.js";
29
36
  import {
30
37
  TeamScopeLock,
@@ -727,6 +734,7 @@ export function buildTeamAgentPrompt(prompt, { inbox = [] } = {}) {
727
734
  const messages = inbox
728
735
  .slice(-MAX_TEAM_AGENT_INBOX_MESSAGES)
729
736
  .map((message) => ({
737
+ id: Number.isSafeInteger(message?.id) ? message.id : null,
730
738
  from: String(message?.from || "unknown").slice(0, 128),
731
739
  to: String(message?.to || "").slice(0, 128),
732
740
  subject:
@@ -1016,7 +1024,7 @@ export function makeShellRunTask() {
1016
1024
  }
1017
1025
 
1018
1026
  /** Spawn a headless `cc agent -p` for one prompt in `cwd`; resolve on exit 0. */
1019
- export function spawnAgent(prompt, cwd, opts = {}) {
1027
+ function spawnAgentProcess(prompt, cwd, opts = {}) {
1020
1028
  return new Promise((resolve, reject) => {
1021
1029
  const parser = new TeamAgentStreamParser({
1022
1030
  maxLineBytes: opts.maxStreamLineBytes,
@@ -1043,7 +1051,11 @@ export function spawnAgent(prompt, cwd, opts = {}) {
1043
1051
  try {
1044
1052
  child = _deps.spawn(process.execPath, args, {
1045
1053
  cwd,
1046
- env: { ...process.env, CLAUDECODE: "1" },
1054
+ env: {
1055
+ ...process.env,
1056
+ CLAUDECODE: "1",
1057
+ ...(opts.childEnv || {}),
1058
+ },
1047
1059
  windowsHide: true,
1048
1060
  detached:
1049
1061
  opts.managedCheckpoint === true
@@ -1311,6 +1323,33 @@ export function spawnAgent(prompt, cwd, opts = {}) {
1311
1323
  });
1312
1324
  }
1313
1325
 
1326
+ export function spawnAgent(prompt, cwd, opts = {}) {
1327
+ if (!opts.messageBridge) return spawnAgentProcess(prompt, cwd, opts);
1328
+ return (async () => {
1329
+ let bridge;
1330
+ try {
1331
+ bridge = new TeamMessageBridge(opts.messageBridge);
1332
+ await bridge.start();
1333
+ } catch (error) {
1334
+ throw teamAgentError(
1335
+ "TEAM_AGENT_MESSAGE_BRIDGE_FAILED",
1336
+ error?.message || "Could not start teammate message bridge",
1337
+ );
1338
+ }
1339
+ try {
1340
+ return await spawnAgentProcess(bridge.decoratePrompt(prompt), cwd, {
1341
+ ...opts,
1342
+ childEnv: {
1343
+ ...(opts.childEnv || {}),
1344
+ ...bridge.childEnvironment(),
1345
+ },
1346
+ });
1347
+ } finally {
1348
+ await bridge.close();
1349
+ }
1350
+ })();
1351
+ }
1352
+
1314
1353
  /** Real executor: hand a task's `prompt` to a headless `cc agent -p` in cwd. */
1315
1354
  function applyBudgetReservation(contract, budgetReservation) {
1316
1355
  const effectiveContract = { ...contract };
@@ -1333,7 +1372,14 @@ export function makeAgentRunTask(opts = {}) {
1333
1372
  return function runTask({
1334
1373
  key,
1335
1374
  task,
1375
+ holder,
1336
1376
  inbox = [],
1377
+ sendMessage = null,
1378
+ messageAuthority = null,
1379
+ recipientState = null,
1380
+ requestFollowupWake = null,
1381
+ requestHandoff = null,
1382
+ mailbox = null,
1337
1383
  budgetReservation = null,
1338
1384
  signal = null,
1339
1385
  }) {
@@ -1357,8 +1403,23 @@ export function makeAgentRunTask(opts = {}) {
1357
1403
  );
1358
1404
  return spawnAgent(buildTeamAgentPrompt(prompt, { inbox }), process.cwd(), {
1359
1405
  ...effectiveContract,
1360
- sessionId: opts.sessionIdForTask?.(key) || null,
1406
+ sessionId: opts.sessionIdForTask?.(key, task) || null,
1361
1407
  signal,
1408
+ ...(mailbox && holder
1409
+ ? {
1410
+ messageBridge: {
1411
+ mailbox,
1412
+ holder,
1413
+ sendMessage,
1414
+ assertAuthority: messageAuthority,
1415
+ recipientState,
1416
+ requestFollowupWake,
1417
+ requestHandoff,
1418
+ onMutation: opts.onMailboxMutation,
1419
+ durable: opts.mailboxDurable === true,
1420
+ },
1421
+ }
1422
+ : {}),
1362
1423
  });
1363
1424
  };
1364
1425
  }
@@ -2109,8 +2170,17 @@ export function registerTeamCommand(program, { logger } = {}) {
2109
2170
  return;
2110
2171
  }
2111
2172
  const ttlMs = limits.ttlMs;
2173
+ const stateId = resumeSnapshot?.stateId || `team_state_${randomUUID()}`;
2174
+ const messageStatePath = options.state
2175
+ ? `${options.state}.${stateId}.messages.json`
2176
+ : null;
2112
2177
  let reg;
2113
- let mailbox = new TeamMailbox();
2178
+ let mailbox = options.state
2179
+ ? new TeamSessionMessageAdapter({
2180
+ statePath: messageStatePath,
2181
+ teamId: stateId,
2182
+ })
2183
+ : new TeamMailbox();
2114
2184
  let budget = new TeamBudget({
2115
2185
  maxTasks: limits.maxTasks,
2116
2186
  maxTokens: limits.maxTokens,
@@ -2130,7 +2200,32 @@ export function registerTeamCommand(program, { logger } = {}) {
2130
2200
  const isV2 = snap && snap.version >= 2 && snap.registry;
2131
2201
  reg = TaskLeaseRegistry.restore(isV2 ? snap.registry : snap);
2132
2202
  if (isV2) {
2133
- if (snap.mailbox) mailbox = TeamMailbox.restore(snap.mailbox);
2203
+ if (snap.mailbox?.authority === "session-message-fabric") {
2204
+ if (
2205
+ !sameFilesystemPath(
2206
+ path.resolve(snap.mailbox.statePath),
2207
+ path.resolve(messageStatePath),
2208
+ )
2209
+ ) {
2210
+ throw new Error(
2211
+ "Team message authority path does not match the trusted state identity",
2212
+ );
2213
+ }
2214
+ mailbox = TeamSessionMessageAdapter.restore(snap.mailbox, {
2215
+ statePath: messageStatePath,
2216
+ teamId: stateId,
2217
+ });
2218
+ } else if (snap.mailbox && options.state) {
2219
+ mailbox = TeamSessionMessageAdapter.migrateLegacy(
2220
+ snap.mailbox,
2221
+ {
2222
+ statePath: messageStatePath,
2223
+ teamId: stateId,
2224
+ },
2225
+ );
2226
+ } else if (snap.mailbox) {
2227
+ mailbox = TeamMailbox.restore(snap.mailbox);
2228
+ }
2134
2229
  budget = TeamBudget.restore(snap.budget, {
2135
2230
  // Resume flags may only tighten prior caps; omitted flags keep
2136
2231
  // the persisted authority.
@@ -2234,6 +2329,11 @@ export function registerTeamCommand(program, { logger } = {}) {
2234
2329
  }),
2235
2330
  ]),
2236
2331
  );
2332
+ const sessionTaskKeyFor = (key, task = reg.getTask(key)) =>
2333
+ task?.metadata?.teamFollowup?.sessionTaskKey || key;
2334
+ const taskContractFor = (key, task = reg.getTask(key)) =>
2335
+ taskContracts.get(key) ||
2336
+ taskContracts.get(sessionTaskKeyFor(key, task));
2237
2337
  if ((options.agent || options.exec) && !options.worktree) {
2238
2338
  const isolatedTask = reg
2239
2339
  .list()
@@ -2301,7 +2401,6 @@ export function registerTeamCommand(program, { logger } = {}) {
2301
2401
  );
2302
2402
  }
2303
2403
  }
2304
- const stateId = resumeSnapshot?.stateId || `team_state_${randomUUID()}`;
2305
2404
  let controlCursor = resumeSnapshot?.controlCursor || null;
2306
2405
  let adjudicationCursor = resumeSnapshot?.adjudicationCursor || null;
2307
2406
  let adjudicationRunId = resumeSnapshot?.adjudicationRunId || null;
@@ -2480,37 +2579,40 @@ export function registerTeamCommand(program, { logger } = {}) {
2480
2579
  checkpointRequired:
2481
2580
  options.agent === true || options.managedCheckpoint === true,
2482
2581
  worktreeRequired: options.worktree === true,
2483
- units: reg.list().map((task) => ({
2484
- key: task.key,
2485
- branch: options.worktree
2486
- ? priorUnits.get(task.key)?.branch ||
2487
- branchPlanner.branchFor(task.key)
2488
- : null,
2489
- worktreePath: options.worktree
2490
- ? priorUnits.get(task.key)?.worktreePath || null
2491
- : null,
2492
- sessionId: options.agent
2493
- ? priorUnits.get(task.key)?.sessionId ||
2494
- _deps.collaborationStore.createSessionId(runId, task.key)
2495
- : null,
2496
- status:
2497
- String(task.status || "").toLowerCase() === "completed"
2498
- ? "completed"
2499
- : "pending",
2500
- permissionMode: taskContracts.get(task.key)?.permissionMode,
2501
- resourceBudget: {
2502
- maxTurns: taskContracts.get(task.key)?.maxTurns,
2503
- maxCostUsd: taskContracts.get(task.key)?.maxBudgetUsd,
2504
- maxTokens: taskContracts.get(task.key)?.maxTokens,
2505
- maxWallMs: taskContracts.get(task.key)?.maxWallMs,
2506
- },
2507
- checkpointRequired:
2508
- taskContracts.get(task.key)?.checkpointRequired === true ||
2509
- options.managedCheckpoint === true,
2510
- worktreeRequired:
2511
- taskContracts.get(task.key)?.worktreeRequired === true,
2512
- scopePaths: task.metadata?.scopePaths || [],
2513
- })),
2582
+ units: reg
2583
+ .list()
2584
+ .filter((task) => !task.metadata?.teamFollowup)
2585
+ .map((task) => ({
2586
+ key: task.key,
2587
+ branch: options.worktree
2588
+ ? priorUnits.get(task.key)?.branch ||
2589
+ branchPlanner.branchFor(task.key)
2590
+ : null,
2591
+ worktreePath: options.worktree
2592
+ ? priorUnits.get(task.key)?.worktreePath || null
2593
+ : null,
2594
+ sessionId: options.agent
2595
+ ? priorUnits.get(task.key)?.sessionId ||
2596
+ _deps.collaborationStore.createSessionId(runId, task.key)
2597
+ : null,
2598
+ status:
2599
+ String(task.status || "").toLowerCase() === "completed"
2600
+ ? "completed"
2601
+ : "pending",
2602
+ permissionMode: taskContracts.get(task.key)?.permissionMode,
2603
+ resourceBudget: {
2604
+ maxTurns: taskContracts.get(task.key)?.maxTurns,
2605
+ maxCostUsd: taskContracts.get(task.key)?.maxBudgetUsd,
2606
+ maxTokens: taskContracts.get(task.key)?.maxTokens,
2607
+ maxWallMs: taskContracts.get(task.key)?.maxWallMs,
2608
+ },
2609
+ checkpointRequired:
2610
+ taskContracts.get(task.key)?.checkpointRequired === true ||
2611
+ options.managedCheckpoint === true,
2612
+ worktreeRequired:
2613
+ taskContracts.get(task.key)?.worktreeRequired === true,
2614
+ scopePaths: task.metadata?.scopePaths || [],
2615
+ })),
2514
2616
  });
2515
2617
  } catch (err) {
2516
2618
  (log.error || console.error)(
@@ -2522,8 +2624,27 @@ export function registerTeamCommand(program, { logger } = {}) {
2522
2624
  const collaborationUnits = new Map(
2523
2625
  collaborationRun.units.map((unit) => [unit.key, unit]),
2524
2626
  );
2627
+ const teamGraphRunId =
2628
+ resumeSnapshot?.graphProjection?.runId || `team:${stateId}`;
2629
+ const teamGraphRevisionDigest =
2630
+ resumeSnapshot?.graphProjection?.revisionDigest ||
2631
+ computeTeamGraphRevisionDigest(reg);
2632
+ const teamGraphAuthorityDigest =
2633
+ resumeSnapshot?.graphProjection?.authorityDigest ||
2634
+ computeTeamGraphAuthorityDigest({
2635
+ stateId,
2636
+ permissionMode: options.agent ? permissionMode : "default",
2637
+ worktreeRequired: options.worktree === true,
2638
+ checkpointRequired:
2639
+ options.agent === true || options.managedCheckpoint === true,
2640
+ holders: Array.from(
2641
+ { length: Math.min(teammates, Math.max(1, reg.list().length)) },
2642
+ (_, index) => `teammate-${index + 1}`,
2643
+ ),
2644
+ });
2525
2645
  const settleGovernance = (key, status, extra = {}) => {
2526
- const unit = collaborationUnits.get(key);
2646
+ const governanceKey = sessionTaskKeyFor(key);
2647
+ const unit = collaborationUnits.get(governanceKey);
2527
2648
  let sideEffects = null;
2528
2649
  if (unit?.sessionId) {
2529
2650
  try {
@@ -2536,7 +2657,7 @@ export function registerTeamCommand(program, { logger } = {}) {
2536
2657
  }
2537
2658
  const updated = _deps.collaborationStore.updateUnit(
2538
2659
  collaborationRun.id,
2539
- key,
2660
+ governanceKey,
2540
2661
  {
2541
2662
  status,
2542
2663
  ...extra,
@@ -2544,7 +2665,7 @@ export function registerTeamCommand(program, { logger } = {}) {
2544
2665
  },
2545
2666
  { returnUnit: true },
2546
2667
  );
2547
- if (updated) collaborationUnits.set(key, updated);
2668
+ if (updated) collaborationUnits.set(governanceKey, updated);
2548
2669
  };
2549
2670
 
2550
2671
  // Persist a snapshot after each task settles so a crash mid-run is
@@ -2575,6 +2696,14 @@ export function registerTeamCommand(program, { logger } = {}) {
2575
2696
  adjudicationRunId,
2576
2697
  adjudicationCursor,
2577
2698
  execution: executionContract,
2699
+ graphProjection: projectTeamGraphCollaboration({
2700
+ runId: teamGraphRunId,
2701
+ mailbox,
2702
+ registry: reg,
2703
+ recipients: mailbox.status?.().recipients || [],
2704
+ revisionDigest: teamGraphRevisionDigest,
2705
+ authorityDigest: teamGraphAuthorityDigest,
2706
+ }),
2578
2707
  });
2579
2708
  };
2580
2709
 
@@ -2661,8 +2790,15 @@ export function registerTeamCommand(program, { logger } = {}) {
2661
2790
  runInWorktree: async ({
2662
2791
  key,
2663
2792
  task,
2793
+ holder,
2664
2794
  cwd,
2665
2795
  inbox = [],
2796
+ sendMessage = null,
2797
+ messageAuthority = null,
2798
+ recipientState = null,
2799
+ requestFollowupWake = null,
2800
+ requestHandoff = null,
2801
+ mailbox: taskMailbox = null,
2666
2802
  budgetReservation = null,
2667
2803
  signal = null,
2668
2804
  managedCheckpoint = false,
@@ -2672,7 +2808,7 @@ export function registerTeamCommand(program, { logger } = {}) {
2672
2808
  throw new Error(`task "${key}" has no \`prompt\` to --agent`);
2673
2809
  }
2674
2810
  const contract = applyBudgetReservation(
2675
- taskContracts.get(key),
2811
+ taskContractFor(key, task),
2676
2812
  budgetReservation,
2677
2813
  );
2678
2814
  return spawnAgent(
@@ -2687,8 +2823,25 @@ export function registerTeamCommand(program, { logger } = {}) {
2687
2823
  ? false
2688
2824
  : contract.checkpointRequired,
2689
2825
  managedCheckpoint,
2690
- sessionId: collaborationUnits.get(key)?.sessionId,
2826
+ sessionId: collaborationUnits.get(
2827
+ sessionTaskKeyFor(key, task),
2828
+ )?.sessionId,
2691
2829
  signal,
2830
+ ...(taskMailbox && holder
2831
+ ? {
2832
+ messageBridge: {
2833
+ mailbox: taskMailbox,
2834
+ holder,
2835
+ sendMessage,
2836
+ assertAuthority: messageAuthority,
2837
+ recipientState,
2838
+ requestFollowupWake,
2839
+ requestHandoff,
2840
+ onMutation: persist,
2841
+ durable: Boolean(options.state),
2842
+ },
2843
+ }
2844
+ : {}),
2692
2845
  },
2693
2846
  );
2694
2847
  },
@@ -2706,9 +2859,12 @@ export function registerTeamCommand(program, { logger } = {}) {
2706
2859
  runTask = makeShellRunTask(log);
2707
2860
  } else if (options.agent)
2708
2861
  runTask = makeAgentRunTask({
2709
- contractForTask: (key) => taskContracts.get(key),
2862
+ contractForTask: (key, task) => taskContractFor(key, task),
2710
2863
  worktreeEnabled: false,
2711
- sessionIdForTask: (key) => collaborationUnits.get(key)?.sessionId,
2864
+ sessionIdForTask: (key, task) =>
2865
+ collaborationUnits.get(sessionTaskKeyFor(key, task))?.sessionId,
2866
+ onMailboxMutation: persist,
2867
+ mailboxDurable: Boolean(options.state),
2712
2868
  });
2713
2869
  else runTask = async () => ({ dryRun: true });
2714
2870
 
@@ -2767,7 +2923,7 @@ export function registerTeamCommand(program, { logger } = {}) {
2767
2923
  }
2768
2924
  const binding = adjudicationBindingFor(
2769
2925
  task,
2770
- collaborationUnits.get(key) || null,
2926
+ collaborationUnits.get(sessionTaskKeyFor(key, task)) || null,
2771
2927
  );
2772
2928
  const opened = adjudicationStore.openCase(binding, {
2773
2929
  anchor: adjudicationCursor,
@@ -2794,9 +2950,10 @@ export function registerTeamCommand(program, { logger } = {}) {
2794
2950
  runTask,
2795
2951
  budget,
2796
2952
  budgetForTask: options.agent
2797
- ? (task) => taskContracts.get(task.key)
2953
+ ? (task) => taskContractFor(task.key, task)
2798
2954
  : () => ({ reserveUsage: false }),
2799
2955
  mailbox,
2956
+ realtimeMessaging: options.agent === true,
2800
2957
  scopeLock,
2801
2958
  recorder,
2802
2959
  beforeTask: ({ key }) => {
@@ -2823,9 +2980,14 @@ export function registerTeamCommand(program, { logger } = {}) {
2823
2980
  ? "pending"
2824
2981
  : retry
2825
2982
  ? "pending"
2826
- : status;
2983
+ : options.agent === true && status === "completed"
2984
+ ? "running"
2985
+ : status;
2827
2986
  settleGovernance(key, governanceStatus, {
2828
- endedAt: governanceStatus === "pending" ? null : Date.now(),
2987
+ endedAt:
2988
+ governanceStatus === "pending" || governanceStatus === "running"
2989
+ ? null
2990
+ : Date.now(),
2829
2991
  });
2830
2992
  ensureTaskAdjudicationCase(key);
2831
2993
  persist();
@@ -2833,6 +2995,14 @@ export function registerTeamCommand(program, { logger } = {}) {
2833
2995
  onLeaseChanged: () => {
2834
2996
  persist();
2835
2997
  },
2998
+ onFollowupMutation: () => {
2999
+ persist();
3000
+ },
3001
+ onHandoffMutation: () => {
3002
+ persist();
3003
+ },
3004
+ graphRevisionDigest: teamGraphRevisionDigest,
3005
+ graphAuthorityDigest: teamGraphAuthorityDigest,
2836
3006
  onEvent: (e) => {
2837
3007
  if (options.json) console.log(JSON.stringify(e));
2838
3008
  else if (e.type === "task:claimed")
@@ -2939,18 +3109,32 @@ export function registerTeamCommand(program, { logger } = {}) {
2939
3109
  persist();
2940
3110
  let governanceFailed = false;
2941
3111
  try {
2942
- // Reconcile only units whose authoritative registry state differs.
2943
- // Per-task hooks already durably settled the common path.
3112
+ // Follow-up wake tasks are new lease-bound turns in the same durable
3113
+ // collaboration session/unit as their source task. Aggregate every
3114
+ // such turn before making the unit terminal; otherwise the first
3115
+ // completed turn would freeze governance before a later follow-up.
3116
+ const tasksByGovernanceKey = new Map(
3117
+ [...collaborationUnits.keys()].map((key) => [key, []]),
3118
+ );
2944
3119
  for (const task of reg.list()) {
2945
- const state = String(task.status || "").toLowerCase();
3120
+ const governanceKey = sessionTaskKeyFor(task.key, task);
3121
+ tasksByGovernanceKey.get(governanceKey)?.push(task);
3122
+ }
3123
+ for (const [key, tasks] of tasksByGovernanceKey) {
3124
+ const states = tasks.map((task) =>
3125
+ String(task.status || "").toLowerCase(),
3126
+ );
2946
3127
  const status =
2947
- state === "completed"
3128
+ states.length > 0 &&
3129
+ states.every((state) => state === "completed")
2948
3130
  ? "completed"
2949
- : state === "cancelled" || state === "pending"
3131
+ : states.some(
3132
+ (state) => state === "cancelled" || state === "pending",
3133
+ )
2950
3134
  ? "cancelled"
2951
3135
  : "failed";
2952
- if (collaborationUnits.get(task.key)?.status === status) continue;
2953
- settleGovernance(task.key, status, {
3136
+ if (collaborationUnits.get(key)?.status === status) continue;
3137
+ settleGovernance(key, status, {
2954
3138
  endedAt: Date.now(),
2955
3139
  });
2956
3140
  }
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.3",
7
+ "cliVersions": ["0.1.2", "0.2.2", "0.166.2", "0.166.3"],
8
+ "date": "2026-08-25",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.3 + Agent Protocol 0.1.2 + Agent SDKs 0.2.2: scoped approvals and durable team authority",
13
+ "body": "> `chainlesschain` **0.166.2 -> 0.166.3**,\n> `@chainlesschain/agent-protocol` **0.1.1 -> 0.1.2**,\n> `@chainlesschain/agent-sdk` **0.2.1 -> 0.2.2**, and\n> `chainlesschain-agent-sdk` **0.2.1 -> 0.2.2** (release candidate,\n> 2026-08-25).\n\n- **Canonical approval contract**: the protocol package exports schema-derived\n JavaScript validators and deterministic TypeScript/Python bindings for\n `acceptOnce`, `acceptForTurn`, `acceptForSession`, `decline`, and `cancel`.\n Shared valid/invalid fixtures keep the protocol, both SDKs, and CLI App\n Server on one wire contract.\n- **Fail-closed, exactly scoped grants**: approval responses bind the request,\n requested permission, tool, arguments, working directory, and policy digest.\n Turn grants stay in memory; session grants become effective only after a\n tamper-evident authority event is persisted and verified. Expired, corrupt,\n mismatched, widened, or persistence-failed grants never silently authorize a\n call.\n- **N-1 SDK compatibility**: boolean callbacks normalize to one-shot canonical\n decisions with the request binding, while direct boolean responses retain\n the legacy wire for older callers. Invalid or throwing callbacks decline\n safely in both TypeScript and Python.\n- **Durable Team messaging and custody**: state-backed Team runs now use the\n `SessionMessageFabric` authority for bounded cross-process delivery,\n offline/reconnect, receipts, fencing, dead letters, rate limits, and legacy\n mailbox migration. Idle follow-up turns and offer/accept/commit handoffs keep\n stable message identity while transferring attempt/lease custody explicitly.\n- **Release validation**: publication requires the exact release commit to pass\n Agent Protocol and Python SDK conformance, Linux/Windows/macOS `CLI CI` and\n `CLI Strict Sandbox`, and the desktop E2E matrix before immutable OIDC tags\n are created."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.166.2",
20
+ "cliVersions": ["0.166.1", "0.166.2"],
21
+ "date": "2026-08-25",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Added - cc CLI 0.166.2: lease-bound real-time team messaging",
26
+ "body": "> `chainlesschain` **0.166.1 -> 0.166.2** (CLI-only release candidate,\n> 2026-08-25). `@chainlesschain/agent-protocol` remains **0.1.1**,\n> `@chainlesschain/agent-sdk` remains **0.2.1**, and\n> `chainlesschain-agent-sdk` remains **0.2.1**.\n\n- **Live teammate tools**: real `cc team --agent` children receive host-owned\n `team_send`, `team_receive`, `team_ack`, and `team_followup` tools over a\n private local bridge instead of relying only on a startup inbox snapshot.\n- **Retry-safe delivery**: the bounded mailbox persists at-least-once delivery\n receipts, stable-consumer ACKs, idempotent message keys, payload digests,\n causation/correlation metadata, processed/dead-letter states, and monotonic\n cursors across team-state restore.\n- **Attempt-scoped authority**: every bridge operation revalidates the current\n holder, task, attempt, lease, and fencing token; stale attempts fail closed,\n bridge credentials never enter the prompt, and nested subagents cannot\n inherit the parent-bound tools.\n- **Honest durability and wake semantics**: `--state` checkpoints every bridge\n mutation, runs without state declare process-local delivery, and follow-up\n results distinguish an active target from a request queued for a future turn.\n- **Release validation**: publication requires this candidate's exact commit\n to pass the complete Linux, Windows, and macOS `CLI CI` and\n `CLI Strict Sandbox` matrices before an immutable npm tag is created."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": null,
6
32
  "cliVersion": "0.166.1",