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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-D5_pwQ7M.js → AIOps-BnZ24WRk.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DgoYO32D.js → ActionButton-ivXY7MGb.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BIpoZ4QH.js → Analytics-BQS4OD-k.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BJ3XrCEe.js → AppLayout-wOBuOKTO.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-DUFs_izZ.js → Artifacts-BYuC4nw-.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BZdPwwfL.js → Audit-BIeVfBt6.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DK9Fn-8B.js → BackgroundAgents-hIuyhmJ7.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Bd6bOhV_.js → Backup-B6ohdgPQ.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CRnWlXrd.js → BaseInput-BzgYCw6h.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D1G_yEl6.js → Chat-CwahvZU1.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DDAlEtm-.js → ChatBubbleRenderer-B-1IZ_k8.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CP35SH7R.js → Checkbox-26EDP2x0.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DugeL4pj.js → Codegen-DYLw1Zvd.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DPuJsvKg.js → Col-DH_zAvD-.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CZqNjNNp.js → Community-DURrTXJu.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-eeyIPEAb.js → Compact-CQyBqN0p.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-MGzTw87k.js → Compliance-a0DfgKHD.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D3goVIA5.js → Cowork-C6fY_5Ke.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-9HA8hLLG.js → Cron-DOwmpbTe.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DCSOX3l6.js → Crosschain-DEPOIEUs.js} +1 -1
- package/src/assets/web-panel/assets/{DID-ji3lN5Bc.js → DID-DaKc-CEV.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DlZvF1E5.js → Dashboard-C-0KLXq5.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-2FyZcow9.js → Dropdown-CnsDukzr.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-qH2bSpSY.js → EmailListRenderer-Bi_ACD4N.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bfx47wZj.js → FamilyGuardDashboard-BZASpnx3.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DhGcZbIv.js → Federation-43oTtzyp.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BMgi9_YQ.js → FormItemContext-oyVadnkZ.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DugMac-4.js → GenericCardRenderer-Cwvfd6TZ.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D943BpH-.js → Git-Cgi2wvU0.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DZ66a8Aa.js → Governance-l8TWDKZ0.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-B00Mp2tN.js → Inference-Dc8j6TaO.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BdwXXO2Q.js → KnowledgeGraph-DgcO-Fwz.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-_MVXyYWc.js → Logs-DjiZpiwa.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-hOTeNyi7.js → MarkdownRenderer-B5MFCi0N.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CxeHRsnO.js → Marketplace-BeDn1hFc.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BOieTxZ4.js → McpTools-PGdVfWK6.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BQD26CM3.js → Memory-e76lY3a1.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CPJ8ZlvR.js → MobileBridge-DKlQqot_.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-D7qRVu0y.js → MobileProjects-C4g6WOEr.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BOyndGuk.js → Mtc-1j3NpRQq.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CXQ_8ZoR.js → MtcAudit-DgwiVd1C.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-32Oh9KbH.js → Multisig-Dzg5lZZY.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CFAd00CX.js → NLProgramming-D7GYhst-.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BBCY_qJA.js → Notes-Blcfvaic.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-uaQ0PdmW.js → NotificationSettings-Dc4Y6vfr.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-dgM87XIn.js +1 -0
- package/src/assets/web-panel/assets/{Organization-CmFn7Oeo.js → Organization-DBXq024L.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-R_avat3a.js → Overflow-CFPbdx1Y.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BIhLFmkY.js → P2P-w7z61NR5.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DTJjk-_i.js → PdhVaultBrowser-B7eGGZOa.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CkzYv8Yb.js → Permissions-Df5Cl50D.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub--0QvN2Nz.js → PersonalDataHub-C-We7RF6.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-Bfw5gQCH.js → Pipeline-B6fHPnKy.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DicjKfax.js → Privacy-B85BdiIc.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DUl_ykBp.js → ProjectInit-CcOyazSe.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CPYDvN8a.js → ProjectSettings-BE53KfuU.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DnZ9_fAr.js → Projects-DOvMOoe_.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BX1jP31w.js → Providers-5l7sT9lq.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-COab5qUl.js → QrScannerModal-DE37RXy4.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CdKQ_JZ0.js → QuickAsk-BGmGCo7j.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BPFHg8pK.js → Recommend-BFdx8Nrm.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CqrfTJvO.js → RemoteSession-C1w-j_hB.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DM-l8Pb3.js → Reputation-BOvn-10y.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CKGBTeCw.js → Row-db-a1YO9.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Wb0YHIkc.js → RssFeed-DeS43ZGM.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DiBjxKv-.js → Search-BaQYNfeb.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BAVEmbWP.js → Security-yt1ESHDg.js} +4 -4
- package/src/assets/web-panel/assets/{Services-A_a3TIRn.js → Services-BcNqPUsS.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CloHJ-I7.js → Skeleton-X3ceUQWf.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CkvV5hKa.js → Skills-DmYeax6C.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BYozxxsV.js → Sla-C_fdfbuJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CWianiZF.js → SpeechSettings-CDqohXXQ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BR4G75do.js → SyncSettings-B25maYEY.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-D6gyUVrM.js → Tasks-3ILwauYw.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DbfYIRzT.js → Templates-DUH0iuc4.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BHutvukT.js → Tenant-DrvhHf9T.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CYEiy2wJ.js → Terminal-C2lJVYHA.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D9s1AxfE.js → TimelineRenderer-C1Hf_jYn.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-ij9vxnoy.js → Tokens-DniS1NpS.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dq_DCVeQ.js → Trigger-4jrcb8oA.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Bs6wdfoH.js → Trust-DiBte55w.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CLazyr5t.js → UkeySign-CZRtc4VB.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-viWotIHA.js → VideoEditing-BtYGJDmg.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DlZ-A78d.js → Wallet-D1nrTm7H.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DSmOND3Y.js → WebAuthn-DI91acpx.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BempLOJi.js → WorkflowEditor-BtQjI50d.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CyJzf4JI.js → chat-I4A-f4FC.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C62q7WrL.js → colors-QZkDkFVt.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-7dYM1KW3.js → compact-item--FtCdzpr.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CYTy7z2Q.js → createContext-CaIKIKxP.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-D7qVrkrO.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DHoclUqm.js → hasIn-DLYUII6-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CW86F2Zw.js → index-0DYBQ-6e.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2efftJb.js → index-21I79XSf.js} +1 -1
- package/src/assets/web-panel/assets/{index-4gWv-Ubg.js → index-3rVtgqa2.js} +1 -1
- package/src/assets/web-panel/assets/{index-QXtrdrub.js → index-B65QxJaG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMxvWauP.js → index-BGWSmE3G.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dyq9tK5u.js → index-BLGJmgmx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYKwGrAn.js → index-BcgtvJbC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMRmxFU_.js → index-BebTT7iR.js} +1 -1
- package/src/assets/web-panel/assets/{index-XrsAHHQN.js → index-BkJgWW_L.js} +1 -1
- package/src/assets/web-panel/assets/{index-2C8Xx2UO.js → index-Bs0qPPFb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnEZ4ZHj.js → index-BvdwNnHC.js} +3 -3
- package/src/assets/web-panel/assets/{index-DkczsbiP.js → index-BxPoPofq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvEtHpLc.js → index-C3PnIEOH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DK84lAS0.js → index-CBtII-nl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKdv8cju.js → index-CL4c5D6G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjeViaU-.js → index-CQ7OBHka.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhJjifZe.js → index-CXaeZCRP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BghdJ87W.js → index-CgMm85BY.js} +1 -1
- package/src/assets/web-panel/assets/{index-lHfNxiB5.js → index-Ch0IFpGy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJzZaPlb.js → index-CisYjy88.js} +1 -1
- package/src/assets/web-panel/assets/{index-DghnbMlY.js → index-D2xETCkj.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5YWYlW9.js → index-D4CXFU-w.js} +1 -1
- package/src/assets/web-panel/assets/index-D9Y_ZwZn.js +1 -0
- package/src/assets/web-panel/assets/{index-LK1MZoBj.js → index-DA_TPdzX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOFAwpUK.js → index-DAuf8r5o.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA-_807C.js → index-DGLHSCHM.js} +1 -1
- package/src/assets/web-panel/assets/{index-9uR7rc9a.js → index-DJrd_CR3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVTnruDt.js → index-DK2r6Bv7.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZXYp76IB.js → index-DVitI3UQ.js} +1 -1
- package/src/assets/web-panel/assets/index-D_cPes4G.js +1 -0
- package/src/assets/web-panel/assets/{index-Bzz0aJ86.js → index-Deg2S9ZJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHgSRimK.js → index-Du2wUavy.js} +1 -1
- package/src/assets/web-panel/assets/{index-94ktimZG.js → index-OQPIS_am.js} +1 -1
- package/src/assets/web-panel/assets/{index-3pI7AfmD.js → index-Ooo_5jHo.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNLD3nZY.js → index-Ygi2rYL1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZRBvN6i.js → index-eTqL91aV.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6BC4mmz.js → index-hfiZ-i2b.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAYanuSk.js → index-vfiDxdN2.js} +1 -1
- package/src/assets/web-panel/assets/{index-NuNCstRO.js → index-yayaayEA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CwCl5sFQ.js → initDefaultProps-DDkTvw8k.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BFJFy70N.js → motion-fkr96tN5.js} +1 -1
- package/src/assets/web-panel/assets/{move-ByrtVGq8.js → move-CGBV0SV2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BFiH1mT3.js → mtc-parser-DAsCliFt.js} +1 -1
- package/src/assets/web-panel/assets/{omit-bdvgpivj.js → omit-BM8PMmKN.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BlfuuE3s.js → pickAttrs-C6SdWoTK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-t2SC3DMy.js → placementArrow-BG0EVu-d.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CoEXv2Li.js → responsiveObserve-L10IvfYC.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BfXCf0Fu.js → slide-TddIkbrn.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DNsdyOuS.js → statusUtils-FlveF2Yn.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-9aHukmoG.js → styleChecker-BrXRyebg.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-dTkPxzHN.js → useFlexGapSupport-B7_oiDXZ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DINwfItP.js → useFs-CQYeRYWb.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Bj_RriBV.js → usePersonalDataHub-DspIkhVi.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BzRAZrTc.js → vnode-BCwmwMAW.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CamPjkeK.js → zoom-B0cEGluV.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/team.js +74 -2
- package/src/data/changelog.json +26 -0
- package/src/generated/cc-agent-protocol.schema.json +49 -0
- package/src/lib/agent-team/team-mailbox.js +508 -2
- package/src/lib/agent-team/team-message-bridge.js +644 -0
- package/src/lib/agent-team/team-message-tools.js +198 -0
- package/src/lib/agent-team/team-runner.js +57 -3
- package/src/lib/graph-kernel/compiler.js +548 -16
- package/src/lib/graph-kernel/runtime.js +1158 -30
- package/src/lib/graph-kernel/trace-reducer.js +101 -7
- package/src/lib/subagent-inheritance.js +5 -3
- package/src/runtime/agent-core.js +38 -0
- package/src/runtime/headless-runner.js +36 -3
- package/src/assets/web-panel/assets/OrderTableRenderer-kpBxJ-SG.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BdTg_AMF.js +0 -1
- package/src/assets/web-panel/assets/index-B6WvFV4N.js +0 -1
- 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
|
|
1148
|
-
|
|
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
|
-
|
|
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,
|