chainlesschain 0.166.0 → 0.166.2

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 (166) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-D5_pwQ7M.js → AIOps-BnZ24WRk.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DgoYO32D.js → ActionButton-ivXY7MGb.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BIpoZ4QH.js → Analytics-BQS4OD-k.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BJ3XrCEe.js → AppLayout-wOBuOKTO.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-DUFs_izZ.js → Artifacts-BYuC4nw-.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-BZdPwwfL.js → Audit-BIeVfBt6.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DK9Fn-8B.js → BackgroundAgents-hIuyhmJ7.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-Bd6bOhV_.js → Backup-B6ohdgPQ.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CRnWlXrd.js → BaseInput-BzgYCw6h.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-D1G_yEl6.js → Chat-CwahvZU1.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DDAlEtm-.js → ChatBubbleRenderer-B-1IZ_k8.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-CP35SH7R.js → Checkbox-26EDP2x0.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DugeL4pj.js → Codegen-DYLw1Zvd.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DPuJsvKg.js → Col-DH_zAvD-.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CZqNjNNp.js → Community-DURrTXJu.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-eeyIPEAb.js → Compact-CQyBqN0p.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-MGzTw87k.js → Compliance-a0DfgKHD.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-D3goVIA5.js → Cowork-C6fY_5Ke.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-9HA8hLLG.js → Cron-DOwmpbTe.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DCSOX3l6.js → Crosschain-DEPOIEUs.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-ji3lN5Bc.js → DID-DaKc-CEV.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DlZvF1E5.js → Dashboard-C-0KLXq5.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-2FyZcow9.js → Dropdown-CnsDukzr.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-qH2bSpSY.js → EmailListRenderer-Bi_ACD4N.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bfx47wZj.js → FamilyGuardDashboard-BZASpnx3.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DhGcZbIv.js → Federation-43oTtzyp.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-BMgi9_YQ.js → FormItemContext-oyVadnkZ.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DugMac-4.js → GenericCardRenderer-Cwvfd6TZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-D943BpH-.js → Git-Cgi2wvU0.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DZ66a8Aa.js → Governance-l8TWDKZ0.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-B00Mp2tN.js → Inference-Dc8j6TaO.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-BdwXXO2Q.js → KnowledgeGraph-DgcO-Fwz.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-_MVXyYWc.js → Logs-DjiZpiwa.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-hOTeNyi7.js → MarkdownRenderer-B5MFCi0N.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-CxeHRsnO.js → Marketplace-BeDn1hFc.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BOieTxZ4.js → McpTools-PGdVfWK6.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-BQD26CM3.js → Memory-e76lY3a1.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-CPJ8ZlvR.js → MobileBridge-DKlQqot_.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-D7qRVu0y.js → MobileProjects-C4g6WOEr.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BOyndGuk.js → Mtc-1j3NpRQq.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-CXQ_8ZoR.js → MtcAudit-DgwiVd1C.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-32Oh9KbH.js → Multisig-Dzg5lZZY.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CFAd00CX.js → NLProgramming-D7GYhst-.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-BBCY_qJA.js → Notes-Blcfvaic.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-uaQ0PdmW.js → NotificationSettings-Dc4Y6vfr.js} +1 -1
  47. package/src/assets/web-panel/assets/OrderTableRenderer-dgM87XIn.js +1 -0
  48. package/src/assets/web-panel/assets/{Organization-CmFn7Oeo.js → Organization-DBXq024L.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-R_avat3a.js → Overflow-CFPbdx1Y.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-BIhLFmkY.js → P2P-w7z61NR5.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-DTJjk-_i.js → PdhVaultBrowser-B7eGGZOa.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CkzYv8Yb.js → Permissions-Df5Cl50D.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub--0QvN2Nz.js → PersonalDataHub-C-We7RF6.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-Bfw5gQCH.js → Pipeline-B6fHPnKy.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-DicjKfax.js → Privacy-B85BdiIc.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-DUl_ykBp.js → ProjectInit-CcOyazSe.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-CPYDvN8a.js → ProjectSettings-BE53KfuU.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-DnZ9_fAr.js → Projects-DOvMOoe_.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-BX1jP31w.js → Providers-5l7sT9lq.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-COab5qUl.js → QrScannerModal-DE37RXy4.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CdKQ_JZ0.js → QuickAsk-BGmGCo7j.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-BPFHg8pK.js → Recommend-BFdx8Nrm.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-CqrfTJvO.js → RemoteSession-C1w-j_hB.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DM-l8Pb3.js → Reputation-BOvn-10y.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-CKGBTeCw.js → Row-db-a1YO9.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-Wb0YHIkc.js → RssFeed-DeS43ZGM.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DiBjxKv-.js → Search-BaQYNfeb.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-BAVEmbWP.js → Security-yt1ESHDg.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-A_a3TIRn.js → Services-BcNqPUsS.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-CloHJ-I7.js → Skeleton-X3ceUQWf.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CkvV5hKa.js → Skills-DmYeax6C.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-BYozxxsV.js → Sla-C_fdfbuJ.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-CWianiZF.js → SpeechSettings-CDqohXXQ.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-BR4G75do.js → SyncSettings-B25maYEY.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-D6gyUVrM.js → Tasks-3ILwauYw.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-DbfYIRzT.js → Templates-DUH0iuc4.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-BHutvukT.js → Tenant-DrvhHf9T.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-CYEiy2wJ.js → Terminal-C2lJVYHA.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-D9s1AxfE.js → TimelineRenderer-C1Hf_jYn.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-ij9vxnoy.js → Tokens-DniS1NpS.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-Dq_DCVeQ.js → Trigger-4jrcb8oA.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-Bs6wdfoH.js → Trust-DiBte55w.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-CLazyr5t.js → UkeySign-CZRtc4VB.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-viWotIHA.js → VideoEditing-BtYGJDmg.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DlZ-A78d.js → Wallet-D1nrTm7H.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DSmOND3Y.js → WebAuthn-DI91acpx.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BempLOJi.js → WorkflowEditor-BtQjI50d.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-CyJzf4JI.js → chat-I4A-f4FC.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-C62q7WrL.js → colors-QZkDkFVt.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-7dYM1KW3.js → compact-item--FtCdzpr.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-CYTy7z2Q.js → createContext-CaIKIKxP.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-D7qVrkrO.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DHoclUqm.js → hasIn-DLYUII6-.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CW86F2Zw.js → index-0DYBQ-6e.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-C2efftJb.js → index-21I79XSf.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-4gWv-Ubg.js → index-3rVtgqa2.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-QXtrdrub.js → index-B65QxJaG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BMxvWauP.js → index-BGWSmE3G.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Dyq9tK5u.js → index-BLGJmgmx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DYKwGrAn.js → index-BcgtvJbC.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BMRmxFU_.js → index-BebTT7iR.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-XrsAHHQN.js → index-BkJgWW_L.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-2C8Xx2UO.js → index-Bs0qPPFb.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CnEZ4ZHj.js → index-BvdwNnHC.js} +3 -3
  105. package/src/assets/web-panel/assets/{index-DkczsbiP.js → index-BxPoPofq.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DvEtHpLc.js → index-C3PnIEOH.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DK84lAS0.js → index-CBtII-nl.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DKdv8cju.js → index-CL4c5D6G.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CjeViaU-.js → index-CQ7OBHka.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DhJjifZe.js → index-CXaeZCRP.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BghdJ87W.js → index-CgMm85BY.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-lHfNxiB5.js → index-Ch0IFpGy.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DJzZaPlb.js → index-CisYjy88.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DghnbMlY.js → index-D2xETCkj.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C5YWYlW9.js → index-D4CXFU-w.js} +1 -1
  116. package/src/assets/web-panel/assets/index-D9Y_ZwZn.js +1 -0
  117. package/src/assets/web-panel/assets/{index-LK1MZoBj.js → index-DA_TPdzX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DOFAwpUK.js → index-DAuf8r5o.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DA-_807C.js → index-DGLHSCHM.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-9uR7rc9a.js → index-DJrd_CR3.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CVTnruDt.js → index-DK2r6Bv7.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-ZXYp76IB.js → index-DVitI3UQ.js} +1 -1
  123. package/src/assets/web-panel/assets/index-D_cPes4G.js +1 -0
  124. package/src/assets/web-panel/assets/{index-Bzz0aJ86.js → index-Deg2S9ZJ.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DHgSRimK.js → index-Du2wUavy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-94ktimZG.js → index-OQPIS_am.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-3pI7AfmD.js → index-Ooo_5jHo.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DNLD3nZY.js → index-Ygi2rYL1.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CZRBvN6i.js → index-eTqL91aV.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-D6BC4mmz.js → index-hfiZ-i2b.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DAYanuSk.js → index-vfiDxdN2.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-NuNCstRO.js → index-yayaayEA.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-CwCl5sFQ.js → initDefaultProps-DDkTvw8k.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BFJFy70N.js → motion-fkr96tN5.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-ByrtVGq8.js → move-CGBV0SV2.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-BFiH1mT3.js → mtc-parser-DAsCliFt.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-bdvgpivj.js → omit-BM8PMmKN.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-BlfuuE3s.js → pickAttrs-C6SdWoTK.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-t2SC3DMy.js → placementArrow-BG0EVu-d.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CoEXv2Li.js → responsiveObserve-L10IvfYC.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-BfXCf0Fu.js → slide-TddIkbrn.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DNsdyOuS.js → statusUtils-FlveF2Yn.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-9aHukmoG.js → styleChecker-BrXRyebg.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-dTkPxzHN.js → useFlexGapSupport-B7_oiDXZ.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-DINwfItP.js → useFs-CQYeRYWb.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-Bj_RriBV.js → usePersonalDataHub-DspIkhVi.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BzRAZrTc.js → vnode-BCwmwMAW.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-CamPjkeK.js → zoom-B0cEGluV.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/team.js +74 -2
  151. package/src/data/changelog.json +26 -0
  152. package/src/generated/cc-agent-protocol.schema.json +49 -0
  153. package/src/lib/agent-team/team-mailbox.js +508 -2
  154. package/src/lib/agent-team/team-message-bridge.js +644 -0
  155. package/src/lib/agent-team/team-message-tools.js +198 -0
  156. package/src/lib/agent-team/team-runner.js +57 -3
  157. package/src/lib/graph-kernel/compiler.js +548 -16
  158. package/src/lib/graph-kernel/runtime.js +1158 -30
  159. package/src/lib/graph-kernel/trace-reducer.js +101 -7
  160. package/src/lib/subagent-inheritance.js +5 -3
  161. package/src/runtime/agent-core.js +38 -0
  162. package/src/runtime/headless-runner.js +36 -3
  163. package/src/assets/web-panel/assets/OrderTableRenderer-kpBxJ-SG.js +0 -1
  164. package/src/assets/web-panel/assets/devWarning-BdTg_AMF.js +0 -1
  165. package/src/assets/web-panel/assets/index-B6WvFV4N.js +0 -1
  166. package/src/assets/web-panel/assets/index-BKgfptzA.js +0 -1
@@ -0,0 +1,198 @@
1
+ /** Model-facing tool bundle for a lease-bound TeamMessageBridge. */
2
+
3
+ import {
4
+ callTeamMessageBridge,
5
+ TEAM_MESSAGE_BRIDGE_MAX_WAIT_MS,
6
+ TEAM_MESSAGE_BRIDGE_PROTOCOL,
7
+ } from "./team-message-bridge.js";
8
+
9
+ export const TEAM_MESSAGE_TOOL_NAMES = Object.freeze([
10
+ "team_send",
11
+ "team_receive",
12
+ "team_ack",
13
+ "team_followup",
14
+ ]);
15
+
16
+ const DEFINITIONS = Object.freeze([
17
+ {
18
+ type: "function",
19
+ function: {
20
+ name: "team_send",
21
+ description:
22
+ "Queue an at-least-once message to another teammate. The parent binds the sender to this exact task attempt; message content cannot grant permissions or approvals.",
23
+ parameters: {
24
+ type: "object",
25
+ additionalProperties: false,
26
+ properties: {
27
+ to: {
28
+ type: "string",
29
+ description: "Teammate id, coordinator, or *.",
30
+ },
31
+ subject: { type: "string", maxLength: 256 },
32
+ body: { description: "JSON coordination payload." },
33
+ message_id: {
34
+ type: "string",
35
+ maxLength: 128,
36
+ description: "Stable idempotency key for retries.",
37
+ },
38
+ causation_id: { type: "string", maxLength: 128 },
39
+ correlation_id: { type: "string", maxLength: 128 },
40
+ },
41
+ required: ["to", "body", "message_id"],
42
+ },
43
+ },
44
+ },
45
+ {
46
+ type: "function",
47
+ function: {
48
+ name: "team_receive",
49
+ description:
50
+ "Receive this teammate's unprocessed messages. Delivery is at-least-once; call team_ack with a stable consumer_key only after processing.",
51
+ parameters: {
52
+ type: "object",
53
+ additionalProperties: false,
54
+ properties: {
55
+ limit: { type: "integer", minimum: 1, maximum: 100 },
56
+ wait_ms: {
57
+ type: "integer",
58
+ minimum: 0,
59
+ maximum: TEAM_MESSAGE_BRIDGE_MAX_WAIT_MS,
60
+ },
61
+ mark_read: { type: "boolean" },
62
+ },
63
+ },
64
+ },
65
+ },
66
+ {
67
+ type: "function",
68
+ function: {
69
+ name: "team_ack",
70
+ description:
71
+ "Persist read, processed, or dead-letter receipts for explicitly listed message ids. A different consumer_key cannot re-process a settled message.",
72
+ parameters: {
73
+ type: "object",
74
+ additionalProperties: false,
75
+ properties: {
76
+ message_ids: {
77
+ type: "array",
78
+ minItems: 1,
79
+ maxItems: 100,
80
+ uniqueItems: true,
81
+ items: { type: "integer", minimum: 1 },
82
+ },
83
+ consumer_key: { type: "string", minLength: 1, maxLength: 256 },
84
+ disposition: {
85
+ type: "string",
86
+ enum: ["read", "processed", "dead_letter"],
87
+ },
88
+ reason: { type: "string", maxLength: 1024 },
89
+ },
90
+ required: ["message_ids", "consumer_key"],
91
+ },
92
+ },
93
+ },
94
+ {
95
+ type: "function",
96
+ function: {
97
+ name: "team_followup",
98
+ description:
99
+ "Queue an at-least-once follow-up and request a teammate turn wake. The result states whether the target is active or the request remains queued.",
100
+ parameters: {
101
+ type: "object",
102
+ additionalProperties: false,
103
+ properties: {
104
+ to: { type: "string", description: "Teammate id or coordinator." },
105
+ subject: { type: "string", maxLength: 256 },
106
+ body: { description: "JSON follow-up payload." },
107
+ message_id: {
108
+ type: "string",
109
+ maxLength: 128,
110
+ description: "Stable idempotency key for retries.",
111
+ },
112
+ causation_id: { type: "string", maxLength: 128 },
113
+ correlation_id: { type: "string", maxLength: 128 },
114
+ },
115
+ required: ["to", "body", "message_id"],
116
+ },
117
+ },
118
+ },
119
+ ]);
120
+
121
+ function descriptor(name) {
122
+ return Object.freeze({
123
+ name,
124
+ kind: "team-message",
125
+ category: "coordination",
126
+ source: "host:team-message-bridge",
127
+ serverName: null,
128
+ inheritable: false,
129
+ isReadOnly: false,
130
+ riskLevel: "low",
131
+ effectContract: Object.freeze({
132
+ version: 1,
133
+ declaredEffect: "write",
134
+ authorizedEffect: "write",
135
+ riskLevel: "low",
136
+ sourceTrusted: true,
137
+ provenance: "host:lease-bound-team-message-bridge",
138
+ annotations: Object.freeze({
139
+ readOnlyHint: false,
140
+ destructiveHint: false,
141
+ idempotentHint: true,
142
+ openWorldHint: false,
143
+ }),
144
+ }),
145
+ });
146
+ }
147
+
148
+ export function resolveTeamMessageToolBundle({
149
+ env = process.env,
150
+ call = callTeamMessageBridge,
151
+ } = {}) {
152
+ const endpoint = env.CC_TEAM_MESSAGE_BRIDGE_ENDPOINT;
153
+ const token = env.CC_TEAM_MESSAGE_BRIDGE_TOKEN;
154
+ const protocol = Number(env.CC_TEAM_MESSAGE_BRIDGE_PROTOCOL);
155
+ if (!endpoint && !token && !env.CC_TEAM_MESSAGE_BRIDGE_PROTOCOL) return null;
156
+ if (
157
+ typeof endpoint !== "string" ||
158
+ !endpoint ||
159
+ typeof token !== "string" ||
160
+ token.length !== 64 ||
161
+ !/^[a-f0-9]{64}$/u.test(token) ||
162
+ protocol !== TEAM_MESSAGE_BRIDGE_PROTOCOL
163
+ ) {
164
+ const error = new Error("Team message bridge environment is invalid");
165
+ error.code = "TEAM_MESSAGE_BRIDGE_CONFIG_INVALID";
166
+ throw error;
167
+ }
168
+
169
+ const operations = {
170
+ team_send: "send",
171
+ team_receive: "receive",
172
+ team_ack: "ack",
173
+ team_followup: "followup",
174
+ };
175
+ const externalToolExecutors = {};
176
+ const externalToolDescriptors = {};
177
+ for (const [name, operation] of Object.entries(operations)) {
178
+ externalToolExecutors[name] = Object.freeze({
179
+ kind: "team-message",
180
+ operation,
181
+ inheritable: false,
182
+ execute: (args, options = {}) =>
183
+ call({
184
+ endpoint,
185
+ token,
186
+ op: operation,
187
+ args,
188
+ signal: options.signal || null,
189
+ }),
190
+ });
191
+ externalToolDescriptors[name] = descriptor(name);
192
+ }
193
+ return Object.freeze({
194
+ extraToolDefinitions: DEFINITIONS,
195
+ externalToolExecutors: Object.freeze(externalToolExecutors),
196
+ externalToolDescriptors: Object.freeze(externalToolDescriptors),
197
+ });
198
+ }
@@ -54,6 +54,9 @@ export class TeamRunner {
54
54
  typeof opts.budgetForTask === "function" ? opts.budgetForTask : null;
55
55
  // Directed/broadcast messaging between teammates (null → disabled).
56
56
  this.mailbox = opts.mailbox || null;
57
+ // Real agent children keep messages pending until their explicit ACK tool
58
+ // succeeds. Legacy/dry-run executors retain drain-on-dispatch semantics.
59
+ this.realtimeMessaging = opts.realtimeMessaging === true;
57
60
  // Optional conservative path ownership. Tasks with overlapping scopes are
58
61
  // serialized in a shared workspace; an empty scope means the whole repo.
59
62
  this.scopeLock = opts.scopeLock || null;
@@ -1144,12 +1147,54 @@ export class TeamRunner {
1144
1147
  const renew = () => this._renewClaim(claim);
1145
1148
  // A teammate-scoped messaging handle: post to a peer / broadcast, and read
1146
1149
  // its own inbox (direct messages + unseen broadcasts).
1147
- const inbox = this.mailbox ? this.mailbox.drain(holder) : [];
1148
- const sendMessage = (to, body, subject = null) => {
1150
+ const inbox = this.mailbox
1151
+ ? this.realtimeMessaging
1152
+ ? this.mailbox.peek(holder)
1153
+ : this.mailbox.drain(holder)
1154
+ : [];
1155
+ const messageAuthority = () => {
1156
+ const current = this._claimsByKey.get(key);
1157
+ if (
1158
+ current !== claim ||
1159
+ claim.lost ||
1160
+ claim.interruption ||
1161
+ claim.coordinatorAbort ||
1162
+ claim.abortController.signal.aborted
1163
+ ) {
1164
+ const error = new Error(
1165
+ `Team message authority for task "${key}" is no longer active`,
1166
+ );
1167
+ error.code = "TEAM_MESSAGE_BRIDGE_STALE_ATTEMPT";
1168
+ throw error;
1169
+ }
1170
+ return {
1171
+ holder,
1172
+ taskKey: key,
1173
+ attempt: task.attempts,
1174
+ leaseId: claim.leaseId,
1175
+ fencingToken: claim.fencingToken,
1176
+ };
1177
+ };
1178
+ const recipientState = (recipient) => {
1179
+ const member = this._members.get(recipient);
1180
+ return member ? { ...member } : null;
1181
+ };
1182
+ const sendMessage = (to, body, subject = null, options = {}) => {
1149
1183
  if (!this.mailbox) return null;
1150
1184
  let message;
1151
1185
  try {
1152
- message = this.mailbox.send({ from: holder, to, subject, body });
1186
+ const authority = messageAuthority();
1187
+ message = this.mailbox.send({
1188
+ from: holder,
1189
+ to,
1190
+ subject,
1191
+ body,
1192
+ mode: options.mode,
1193
+ idempotencyKey: options.idempotencyKey,
1194
+ causationId: options.causationId,
1195
+ correlationId: options.correlationId,
1196
+ senderAttempt: authority,
1197
+ });
1153
1198
  } catch (error) {
1154
1199
  this._emit("mailbox:backpressure", {
1155
1200
  holder,
@@ -1167,6 +1212,13 @@ export class TeamRunner {
1167
1212
  messages: this.mailbox.size(),
1168
1213
  });
1169
1214
  }
1215
+ this._emit("mailbox:message-sent", {
1216
+ holder,
1217
+ key,
1218
+ messageId: message.id,
1219
+ to: message.to,
1220
+ mode: message.mode || "send",
1221
+ });
1170
1222
  return message;
1171
1223
  };
1172
1224
  const startedAt = this._now();
@@ -1197,6 +1249,8 @@ export class TeamRunner {
1197
1249
  renew,
1198
1250
  inbox,
1199
1251
  sendMessage,
1252
+ messageAuthority,
1253
+ recipientState,
1200
1254
  mailbox: this.mailbox,
1201
1255
  budget: this.budget,
1202
1256
  budgetReservation: claim.budgetReservation,