chainlesschain 0.166.1 → 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 (163) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DwdhBUBc.js → AIOps-BnZ24WRk.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Dd1lBEeo.js → ActionButton-ivXY7MGb.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DuGuuI36.js → Analytics-BQS4OD-k.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-CvHpSs3M.js → AppLayout-wOBuOKTO.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BU9F3wJh.js → Artifacts-BYuC4nw-.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-DK_n_WFm.js → Audit-BIeVfBt6.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-qKsxF5tv.js → BackgroundAgents-hIuyhmJ7.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-JS58pSyV.js → Backup-B6ohdgPQ.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-gGl6Ray1.js → BaseInput-BzgYCw6h.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-B2FZNq3U.js → Chat-CwahvZU1.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZS_bLAr.js → ChatBubbleRenderer-B-1IZ_k8.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-tsI0TE22.js → Checkbox-26EDP2x0.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-D5kqhfAr.js → Codegen-DYLw1Zvd.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DdN1TrqS.js → Col-DH_zAvD-.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DgbEeh6V.js → Community-DURrTXJu.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-FIm-fRB_.js → Compact-CQyBqN0p.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-B-N0pudf.js → Compliance-a0DfgKHD.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CuMafBpi.js → Cowork-C6fY_5Ke.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-BTwzNFHR.js → Cron-DOwmpbTe.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DRoYbLOd.js → Crosschain-DEPOIEUs.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-CPhnNkz_.js → DID-DaKc-CEV.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DJQftix2.js → Dashboard-C-0KLXq5.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-PSAH1Kfy.js → Dropdown-CnsDukzr.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-PVRqeMiZ.js → EmailListRenderer-Bi_ACD4N.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CYtnjqjl.js → FamilyGuardDashboard-BZASpnx3.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-_-53kTDz.js → Federation-43oTtzyp.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-DTQ4qGuE.js → FormItemContext-oyVadnkZ.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-ON_NfX8k.js → GenericCardRenderer-Cwvfd6TZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DUc3w_Bf.js → Git-Cgi2wvU0.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CktsJ2ku.js → Governance-l8TWDKZ0.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-4wUHQvju.js → Inference-Dc8j6TaO.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-Dq4saPnZ.js → KnowledgeGraph-DgcO-Fwz.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-Btb50m5s.js → Logs-DjiZpiwa.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-B5MFCi0N.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-D3rSncxx.js → Marketplace-BeDn1hFc.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Bc6Mori_.js → McpTools-PGdVfWK6.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-C-ottUdN.js → Memory-e76lY3a1.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-C0DITBmP.js → MobileBridge-DKlQqot_.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-O6cr0Nal.js → MobileProjects-C4g6WOEr.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-B_MXKXvY.js → Mtc-1j3NpRQq.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-BDkUqWIT.js → MtcAudit-DgwiVd1C.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-BaxNWm8c.js → Multisig-Dzg5lZZY.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-UD2GndZc.js → NLProgramming-D7GYhst-.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-pU7wtMwB.js → Notes-Blcfvaic.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BIs6ULr3.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-C9o-n2lq.js → Organization-DBXq024L.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-CEvMXxCS.js → Overflow-CFPbdx1Y.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-C3gQMTK3.js → P2P-w7z61NR5.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-D1LVpBOr.js → PdhVaultBrowser-B7eGGZOa.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-Dj5nIi0Y.js → Permissions-Df5Cl50D.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-uiLYuFcu.js → PersonalDataHub-C-We7RF6.js} +6 -6
  54. package/src/assets/web-panel/assets/{Pipeline-CIrmF89x.js → Pipeline-B6fHPnKy.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-B3K1CUBa.js → Privacy-B85BdiIc.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-C_wCZ0zW.js → ProjectInit-CcOyazSe.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-iCitfuNJ.js → ProjectSettings-BE53KfuU.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-BwimeXkW.js → Projects-DOvMOoe_.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-BLpepgr6.js → Providers-5l7sT9lq.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DPy8tjXV.js → QrScannerModal-DE37RXy4.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CRq8VhID.js → QuickAsk-BGmGCo7j.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CirlWIiK.js → Recommend-BFdx8Nrm.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-nlnJlKXO.js → RemoteSession-C1w-j_hB.js} +3 -3
  64. package/src/assets/web-panel/assets/{Reputation-B5aaxee5.js → Reputation-BOvn-10y.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-lzsTQZlq.js → Row-db-a1YO9.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C41AzjgC.js → RssFeed-DeS43ZGM.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-1Hxx3TZ3.js → Search-BaQYNfeb.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-8VqwRxAp.js → Security-yt1ESHDg.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-DCm0HHAD.js → Services-BcNqPUsS.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-D6w5gpmW.js → Skeleton-X3ceUQWf.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-Bw_pUTJB.js → Skills-DmYeax6C.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-BkMj8Dxu.js → Sla-C_fdfbuJ.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-BOmLqW44.js → SpeechSettings-CDqohXXQ.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-2xKSqFDO.js → SyncSettings-B25maYEY.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-BPAnzVau.js → Tasks-3ILwauYw.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-CcOGWgZz.js → Templates-DUH0iuc4.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-CAyzzQWN.js → Tenant-DrvhHf9T.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-Daagerkm.js → Terminal-C2lJVYHA.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-1jGbMj7I.js → TimelineRenderer-C1Hf_jYn.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CYQ-FQju.js → Tokens-DniS1NpS.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-C70zRwuR.js → Trigger-4jrcb8oA.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CeqXfiX_.js → Trust-DiBte55w.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-D0j6m1bU.js → UkeySign-CZRtc4VB.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DFHpM7Yd.js → VideoEditing-BtYGJDmg.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-BVC2J0Yx.js → Wallet-D1nrTm7H.js} +3 -3
  86. package/src/assets/web-panel/assets/{WebAuthn-BceIN2Gn.js → WebAuthn-DI91acpx.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-Bgeb-i-S.js → WorkflowEditor-BtQjI50d.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BmMBqgvz.js → chat-I4A-f4FC.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-sjRzwnyw.js → colors-QZkDkFVt.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-DNt6m2bM.js → compact-item--FtCdzpr.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DELaLit3.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-dfwk9O8x.js → hasIn-DLYUII6-.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-DY2G1Th2.js → index-0DYBQ-6e.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DnQOc5wo.js → index-21I79XSf.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-LMfsEdLk.js → index-3rVtgqa2.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BvIQ9sZa.js → index-B65QxJaG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-1w7dha_a.js → index-BGWSmE3G.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B4Z4HZcf.js → index-BLGJmgmx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CLSqyAcE.js → index-BcgtvJbC.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DC6FlHlP.js → index-BebTT7iR.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Rt-fym5b.js → index-BkJgWW_L.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BzddvOOb.js → index-Bs0qPPFb.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DX3wwu3G.js → index-BvdwNnHC.js} +3 -3
  105. package/src/assets/web-panel/assets/{index-Cbu3-zFd.js → index-BxPoPofq.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DV8q_Hki.js → index-C3PnIEOH.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-dAF9qRVa.js → index-CBtII-nl.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Bs-mWOWt.js → index-CL4c5D6G.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B7qiZc2Z.js → index-CQ7OBHka.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-aj9ObF2R.js → index-CXaeZCRP.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Clrqtycd.js → index-CgMm85BY.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BMnvNNEd.js → index-Ch0IFpGy.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CAIn5cS9.js → index-CisYjy88.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DFOYbzg-.js → index-D2xETCkj.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BXJ68ObJ.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-OC3qYV4-.js → index-DA_TPdzX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CpVt6M_8.js → index-DAuf8r5o.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BSB9Gin8.js → index-DGLHSCHM.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-fNwu9CU_.js → index-DJrd_CR3.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-dpDeFZNt.js → index-DK2r6Bv7.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-vCQ3l6DX.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-BLbvXsxf.js → index-Deg2S9ZJ.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CtfYPnsY.js → index-Du2wUavy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Du62m6pG.js → index-OQPIS_am.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CujMHspH.js → index-Ooo_5jHo.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-6bjBUhoH.js → index-Ygi2rYL1.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C2Sxf7yC.js → index-eTqL91aV.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DlYL8VP8.js → index-hfiZ-i2b.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B0wkOqE9.js → index-vfiDxdN2.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-WpEDoyTv.js → index-yayaayEA.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DUt9Xj8y.js → initDefaultProps-DDkTvw8k.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-DdiFPnv7.js → motion-fkr96tN5.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-BJ2VH7Y2.js → move-CGBV0SV2.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-BCnX6oOJ.js → mtc-parser-DAsCliFt.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-CyHxlDLV.js → omit-BM8PMmKN.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-BJiGW3bY.js → pickAttrs-C6SdWoTK.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-DhJ9Rhx8.js → placementArrow-BG0EVu-d.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-C6zpL9bC.js → responsiveObserve-L10IvfYC.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DCbMFRF-.js → slide-TddIkbrn.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-CNtVLsIq.js → statusUtils-FlveF2Yn.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-Z078OtUc.js → styleChecker-BrXRyebg.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-w4RVmcGs.js → useFlexGapSupport-B7_oiDXZ.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-D4Xw1XRt.js → useFs-CQYeRYWb.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-Bnbd1PgY.js → usePersonalDataHub-DspIkhVi.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-DSOQxMFN.js → vnode-BCwmwMAW.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-DNPE1Wca.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 +13 -0
  152. package/src/lib/agent-team/team-mailbox.js +508 -2
  153. package/src/lib/agent-team/team-message-bridge.js +644 -0
  154. package/src/lib/agent-team/team-message-tools.js +198 -0
  155. package/src/lib/agent-team/team-runner.js +57 -3
  156. package/src/lib/subagent-inheritance.js +5 -3
  157. package/src/runtime/agent-core.js +38 -0
  158. package/src/runtime/headless-runner.js +36 -3
  159. package/src/assets/web-panel/assets/MarkdownRenderer-Cre8P8HG.js +0 -1
  160. package/src/assets/web-panel/assets/OrderTableRenderer-0NuumnfG.js +0 -1
  161. package/src/assets/web-panel/assets/devWarning-Ct8o3bu_.js +0 -1
  162. package/src/assets/web-panel/assets/index-D685kO6L.js +0 -1
  163. package/src/assets/web-panel/assets/index-DTlIRMqX.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,
@@ -54,20 +54,22 @@ export function filterInheritedMcp(parent, allow) {
54
54
  typeof parent.externalToolExecutors === "object"
55
55
  ? parent.externalToolExecutors
56
56
  : {};
57
+ const inheritable = (name) =>
58
+ descs[name]?.inheritable !== false && execs[name]?.inheritable !== false;
57
59
 
58
60
  const outDefs = defs.filter((d) => {
59
61
  const name = d?.function?.name;
60
- return name && serverAllowed(mcpServerOf(name));
62
+ return name && inheritable(name) && serverAllowed(mcpServerOf(name));
61
63
  });
62
64
  const outDescs = {};
63
65
  for (const [name, desc] of Object.entries(descs)) {
64
66
  const server = desc?.serverName || mcpServerOf(name);
65
- if (serverAllowed(server)) outDescs[name] = desc;
67
+ if (inheritable(name) && serverAllowed(server)) outDescs[name] = desc;
66
68
  }
67
69
  const outExecs = {};
68
70
  for (const [name, exec] of Object.entries(execs)) {
69
71
  const server = exec?.serverName || mcpServerOf(name);
70
- if (serverAllowed(server)) outExecs[name] = exec;
72
+ if (inheritable(name) && serverAllowed(server)) outExecs[name] = exec;
71
73
  }
72
74
 
73
75
  if (
@@ -8304,6 +8304,44 @@ async function executeToolInner(
8304
8304
  );
8305
8305
  }
8306
8306
 
8307
+ if (localToolExecutor?.kind === "team-message") {
8308
+ if (
8309
+ localToolExecutor.inheritable !== false ||
8310
+ typeof localToolExecutor.execute !== "function"
8311
+ ) {
8312
+ return attachDescriptor({
8313
+ error:
8314
+ "Team message tool blocked because its host authority is invalid",
8315
+ code: "TEAM_MESSAGE_TOOL_AUTHORITY_INVALID",
8316
+ policy: {
8317
+ decision: "blocked",
8318
+ via: "team-message-authority",
8319
+ },
8320
+ });
8321
+ }
8322
+ try {
8323
+ const result = await localToolExecutor.execute(args || {}, {
8324
+ signal,
8325
+ });
8326
+ return attachDescriptor(
8327
+ result && typeof result === "object" ? result : { result },
8328
+ );
8329
+ } catch (error) {
8330
+ return attachDescriptor({
8331
+ error: `Team message tool failed: ${String(error?.message || error).slice(0, 2048)}`,
8332
+ code: String(
8333
+ error?.code || "TEAM_MESSAGE_TOOL_EXECUTION_FAILED",
8334
+ ).slice(0, 128),
8335
+ retryable:
8336
+ error?.code === "TEAM_MESSAGE_BRIDGE_TIMEOUT" ||
8337
+ Number.isSafeInteger(error?.retryAfterMs),
8338
+ ...(Number.isSafeInteger(error?.retryAfterMs)
8339
+ ? { retryAfterMs: error.retryAfterMs }
8340
+ : {}),
8341
+ });
8342
+ }
8343
+ }
8344
+
8307
8345
  if (localToolExecutor?.kind === "mcp") {
8308
8346
  if (!mcpClient || typeof mcpClient.callTool !== "function") {
8309
8347
  return attachDescriptor({
@@ -204,6 +204,7 @@ import {
204
204
  runtimeToolCallId,
205
205
  } from "../lib/runtime-usage-ledger.js";
206
206
  import { runMeteredDirectModelCall } from "../lib/direct-model-usage.js";
207
+ import { resolveTeamMessageToolBundle } from "../lib/agent-team/team-message-tools.js";
207
208
 
208
209
  /**
209
210
  * Normalize a public --permission-mode spelling to the canonical internal mode.
@@ -1990,6 +1991,20 @@ async function runAgentHeadlessInWorkspace(
1990
1991
  const hostMcp = mcp
1991
1992
  ? { ...mcp, mcpClient: mcpRecoveryRuntime.client || mcp.mcpClient }
1992
1993
  : null;
1994
+ let teamMessageTools = null;
1995
+ try {
1996
+ teamMessageTools = (
1997
+ deps.resolveTeamMessageToolBundle || resolveTeamMessageToolBundle
1998
+ )({ env: options.teamMessageEnv || process.env });
1999
+ } catch (error) {
2000
+ writeErr(`Error: ${error.message}\n`);
2001
+ emitHeadlessError(error.message);
2002
+ return {
2003
+ exitCode: HEADLESS_EXIT_CODES.CONFIG_ERROR,
2004
+ result: error.message,
2005
+ isError: true,
2006
+ };
2007
+ }
1993
2008
 
1994
2009
  // Seed MCP roots for --add-dir (Claude-Code roots/list_changed parity): a
1995
2010
  // headless session started with extra workspace roots must advertise the FULL
@@ -2424,9 +2439,27 @@ async function runAgentHeadlessInWorkspace(
2424
2439
  // --mcp-config wiring: tool defs for the LLM + dispatch map + live client.
2425
2440
  mcpClient: mcp?.mcpClient || null,
2426
2441
  mcpHostClient: mcpRecoveryRuntime.client || mcp?.mcpClient || null,
2427
- extraToolDefinitions: mcp?.extraToolDefinitions || undefined,
2428
- externalToolExecutors: mcp?.externalToolExecutors || undefined,
2429
- externalToolDescriptors: mcp?.externalToolDescriptors || undefined,
2442
+ extraToolDefinitions:
2443
+ mcp?.extraToolDefinitions || teamMessageTools?.extraToolDefinitions
2444
+ ? [
2445
+ ...(mcp?.extraToolDefinitions || []),
2446
+ ...(teamMessageTools?.extraToolDefinitions || []),
2447
+ ]
2448
+ : undefined,
2449
+ externalToolExecutors:
2450
+ mcp?.externalToolExecutors || teamMessageTools?.externalToolExecutors
2451
+ ? {
2452
+ ...(mcp?.externalToolExecutors || {}),
2453
+ ...(teamMessageTools?.externalToolExecutors || {}),
2454
+ }
2455
+ : undefined,
2456
+ externalToolDescriptors:
2457
+ mcp?.externalToolDescriptors || teamMessageTools?.externalToolDescriptors
2458
+ ? {
2459
+ ...(mcp?.externalToolDescriptors || {}),
2460
+ ...(teamMessageTools?.externalToolDescriptors || {}),
2461
+ }
2462
+ : undefined,
2430
2463
  // Persist every MCP started/settled record into this exact canonical
2431
2464
  // session. Unknown/write/destructive prewrite failure then blocks before
2432
2465
  // the external call; a settlement failure leaves a recoverable started row.
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as a}from"./vendor-Bn1JzzAn.js";import{r as s}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-DX3wwu3G.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=a(()=>s(e.content||"")),n={props:e,rendered:r,computed:a,get renderMarkdown(){return s}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-awzFRF/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as h,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-DX3wwu3G.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),w=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),b=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:w,formattedTime:b,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},R={class:"row"},V={class:"val"},F={class:"row"},B={class:"val"},D={class:"row amount-row"},I={class:"val amount"},j={key:0,class:"row"},A={class:"val mono"},M={key:1,class:"row"};function P(p,r,o,e,d,m){const c=h("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",R,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",V,n(e.merchantText),1)]),s("div",F,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",B,n(e.itemText),1)]),s("div",D,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",I,n(e.amountText),1)]),e.orderNo?(l(),u("div",j,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",A,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",M,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const J=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-awzFRF/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-DX3wwu3G.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DdN1TrqS.js";import{a0 as t}from"./index-DX3wwu3G.js";import"./vendor-Bn1JzzAn.js";import"./index-Cbu3-zFd.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-lzsTQZlq.js";import{a0 as t}from"./index-DX3wwu3G.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-C6zpL9bC.js";import"./useFlexGapSupport-w4RVmcGs.js";import"./styleChecker-Z078OtUc.js";import"./index-Cbu3-zFd.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};