ccgateway 0.1.9 → 0.2.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/dist/messaging.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { appendFile, readFile, writeFile, mkdir } from "node:fs/promises";
2
2
  import { existsSync } from "node:fs";
3
3
  import { join } from "node:path";
4
+ import { logger } from "./logger.js";
4
5
  // ── CrossAgentMessenger ──────────────────────────────────────────────────
5
6
  export class CrossAgentMessenger {
6
7
  agents;
@@ -19,8 +20,13 @@ export class CrossAgentMessenger {
19
20
  this.router = router;
20
21
  }
21
22
  /**
22
- * Send a message to an agent. Uses channel-native messaging if the agent
23
- * has a gateway binding, otherwise falls back to file-based inbox.
23
+ * Send a message to an agent. The request is posted to the target's
24
+ * channel for visibility, then the target agent processes it **in the
25
+ * background**. When done, the response is posted to both the target's
26
+ * channel and the sender's channel.
27
+ *
28
+ * Returns immediately after posting the request — does NOT block waiting
29
+ * for the target agent to finish.
24
30
  */
25
31
  async send(toAgentId, content, fromAgentId) {
26
32
  // Validate target agent exists
@@ -31,10 +37,9 @@ export class CrossAgentMessenger {
31
37
  // 1. Find target agent's primary binding (first binding where agent matches)
32
38
  const binding = this.bindings.find((b) => b.agent === toAgentId);
33
39
  if (binding) {
34
- // 2a. Post to Discord/Slack for human visibility (optional)
35
- const gatewayPlugins = this.plugins.getPluginsByType("gateway");
36
- const plugin = gatewayPlugins.find((p) => p.name === `${binding.gateway}-gateway`);
37
- if (plugin && typeof plugin.sendToChannel === "function") {
40
+ const sendToChannel = this.getSendToChannel(binding.gateway);
41
+ // 2. Post the request to the target's channel for human visibility
42
+ if (sendToChannel) {
38
43
  let senderBotId = binding.bot;
39
44
  if (fromAgentId) {
40
45
  const senderBinding = this.bindings.find((b) => b.agent === fromAgentId && b.gateway === binding.gateway);
@@ -42,12 +47,27 @@ export class CrossAgentMessenger {
42
47
  senderBotId = senderBinding.bot;
43
48
  }
44
49
  }
45
- // Post to channel so humans can see the cross-agent message
46
- await plugin.sendToChannel(binding.channel, senderBotId, content);
50
+ await sendToChannel(binding.channel, senderBotId, content);
47
51
  }
48
- // 2b. Route internally so the target agent actually processes it.
49
- // Bot messages are ignored by the gateway, so we route directly.
52
+ // 3. Route in the background don't block the caller.
53
+ // Uses spawnStreaming (via onChunk no-op) for activity-based timeout.
50
54
  if (this.router) {
55
+ this.routeInBackground(toAgentId, content, fromAgentId, binding, sendToChannel);
56
+ }
57
+ return;
58
+ }
59
+ // 4. No binding or no usable gateway plugin — fall back to inbox
60
+ await this.sendToInbox(toAgentId, content, fromAgentId);
61
+ }
62
+ /**
63
+ * Route a cross-agent message in the background and post the response
64
+ * to both the target's channel and the sender's channel when done.
65
+ */
66
+ routeInBackground(toAgentId, content, fromAgentId, binding, sendToChannel) {
67
+ // Fire and forget — errors are logged, not thrown
68
+ void (async () => {
69
+ try {
70
+ // Use a no-op onChunk to trigger spawnStreaming (activity-based timeout)
51
71
  const response = await this.router.route({
52
72
  from: {
53
73
  gateway: "internal",
@@ -59,25 +79,43 @@ export class CrossAgentMessenger {
59
79
  to: { agent: toAgentId },
60
80
  content,
61
81
  attachments: [],
62
- });
63
- if (plugin && typeof plugin.sendToChannel === "function") {
64
- const sendToChannel = plugin.sendToChannel;
65
- // Post the agent's response in their own channel for visibility
82
+ }, () => { });
83
+ if (sendToChannel) {
84
+ // Post the agent's response in their own channel
66
85
  await sendToChannel(binding.channel, binding.bot, response);
67
- // Post the response back to the sender's channel so they see the reply.
68
- // Bot messages are ignored by the gateway handler, so this won't loop.
86
+ // Post the response back to the sender's channel so they see the reply
69
87
  if (fromAgentId) {
70
88
  const senderBinding = this.bindings.find((b) => b.agent === fromAgentId && b.gateway === binding.gateway);
71
89
  if (senderBinding && senderBinding.channel !== binding.channel) {
72
- await sendToChannel(senderBinding.channel, binding.bot, response);
90
+ await sendToChannel(senderBinding.channel, binding.bot, `[from ${toAgentId}] ${response}`);
73
91
  }
74
92
  }
75
93
  }
94
+ logger.info(`messaging: cross-agent ${fromAgentId || "system"} → ${toAgentId} completed`);
76
95
  }
77
- return;
96
+ catch (err) {
97
+ const errMsg = err instanceof Error ? err.message : String(err);
98
+ logger.error(`messaging: cross-agent ${fromAgentId || "system"} → ${toAgentId} failed: ${errMsg}`);
99
+ // Post error to sender's channel if possible
100
+ if (sendToChannel && fromAgentId) {
101
+ const senderBinding = this.bindings.find((b) => b.agent === fromAgentId && b.gateway === binding.gateway);
102
+ if (senderBinding) {
103
+ await sendToChannel(senderBinding.channel, binding.bot, `⚠️ Cross-agent message to ${toAgentId} failed: ${errMsg}`).catch(() => { });
104
+ }
105
+ }
106
+ }
107
+ })();
108
+ }
109
+ /**
110
+ * Get the sendToChannel function for a gateway, if available.
111
+ */
112
+ getSendToChannel(gateway) {
113
+ const gatewayPlugins = this.plugins.getPluginsByType("gateway");
114
+ const plugin = gatewayPlugins.find((p) => p.name === `${gateway}-gateway`);
115
+ if (plugin && typeof plugin.sendToChannel === "function") {
116
+ return plugin.sendToChannel;
78
117
  }
79
- // 3. No binding or no usable gateway plugin — fall back to inbox
80
- await this.sendToInbox(toAgentId, content, fromAgentId);
118
+ return null;
81
119
  }
82
120
  /**
83
121
  * Direct file-based inbox write.
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../src/messaging.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWjC,4EAA4E;AAE5E,MAAM,OAAO,mBAAmB;IAIpB;IACA;IACA;IACA;IANF,MAAM,CAAiB;IAE/B,YACU,MAAqB,EACrB,QAAyB,EACzB,OAAqB,EACrB,OAAe;QAHf,WAAM,GAAN,MAAM,CAAe;QACrB,aAAQ,GAAR,QAAQ,CAAiB;QACzB,YAAO,GAAP,OAAO,CAAc;QACrB,YAAO,GAAP,OAAO,CAAQ;IACtB,CAAC;IAEJ,mFAAmF;IACnF,SAAS,CAAC,MAAqB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CACR,SAAiB,EACjB,OAAe,EACf,WAAoB;QAEpB,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,aAAa,CAAC,CAAC;QACpD,CAAC;QAED,6EAA6E;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QAEjE,IAAI,OAAO,EAAE,CAAC;YACZ,4DAA4D;YAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,UAAU,CACN,CAAC;YAE3C,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBACzD,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;gBAC9B,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAChE,CAAC;oBACF,IAAI,aAAa,EAAE,CAAC;wBAClB,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAED,4DAA4D;gBAC5D,MAAO,MAAM,CAAC,aAIK,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;YAED,kEAAkE;YAClE,qEAAqE;YACrE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;oBACvC,IAAI,EAAE;wBACJ,OAAO,EAAE,UAAU;wBACnB,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,IAAI,EAAE,WAAW,IAAI,QAAQ;wBAC7B,MAAM,EAAE,WAAW,IAAI,QAAQ;wBAC/B,SAAS,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE;qBAClC;oBACD,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;oBACxB,OAAO;oBACP,WAAW,EAAE,EAAE;iBAChB,CAAC,CAAC;gBAEH,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;oBACzD,MAAM,aAAa,GAAG,MAAM,CAAC,aAIX,CAAC;oBAEnB,gEAAgE;oBAChE,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAE5D,wEAAwE;oBACxE,uEAAuE;oBACvE,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAChE,CAAC;wBACF,IAAI,aAAa,IAAI,aAAa,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;4BAC/D,MAAM,aAAa,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;wBACpE,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,SAAiB,EACjB,OAAe,EACf,WAAoB;QAEpB,MAAM,GAAG,GAAiB;YACxB,IAAI,EAAE,WAAW,IAAI,QAAQ;YAC7B,OAAO;YACP,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,IAAI,EAAE,KAAK;SACZ,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEpD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE7C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAmB,KAAK,CAAC,GAAG,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAC3C,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE7C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAmB,KAAK,CAAC,GAAG,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAC3C,CAAC;QAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACxE,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAC9D,CAAC;CACF"}
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../src/messaging.ts"],"names":[],"mappings":"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"}
package/dist/plugin.d.ts CHANGED
@@ -8,7 +8,7 @@ export interface SessionManager {
8
8
  resetSession(agentId: string, sessionKey: string): Promise<void>;
9
9
  }
10
10
  export interface MessageRouter {
11
- route(message: IncomingMessage): Promise<string>;
11
+ route(message: IncomingMessage, onChunk?: (accumulated: string) => void): Promise<string>;
12
12
  resolveAgent(gateway: string, channelId: string): string | undefined;
13
13
  resolveAgentByBot(gateway: string, botId: string): string | undefined;
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAC9C,UAAU,IAAI,WAAW,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC;IACV,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrE,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACvE;AAID,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAID,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,4EAA4E;AAC5E,MAAM,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC;AAI5C,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAmB;IAElC;;;;;;;;;OASG;IACG,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkClE,gDAAgD;IAC1C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B,uDAAuD;IACjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,8EAA8E;IAC9E,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIvC,kCAAkC;IAClC,UAAU,IAAI,SAAS,EAAE;IAIzB,+CAA+C;IAC/C,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE;IAI/C,uDAAuD;IACvD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAM9C;;;;OAIG;YACW,YAAY;CAW3B"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAC9C,UAAU,IAAI,WAAW,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC;IACV,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1F,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrE,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACvE;AAID,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAID,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,4EAA4E;AAC5E,MAAM,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC;AAI5C,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAmB;IAElC;;;;;;;;;OASG;IACG,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkClE,gDAAgD;IAC1C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B,uDAAuD;IACjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,8EAA8E;IAC9E,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIvC,kCAAkC;IAClC,UAAU,IAAI,SAAS,EAAE;IAIzB,+CAA+C;IAC/C,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE;IAI/C,uDAAuD;IACvD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAM9C;;;;OAIG;YACW,YAAY;CAW3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"discord-gateway.d.ts","sourceRoot":"","sources":["../../src/plugins/discord-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,OAAO,EAAoB,MAAM,YAAY,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKnD,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,MAAM,EAAE,CAoCzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,MAAM,GACd,eAAe,CAiBjB;AAID,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,YAAY,EAAE,oBAAoB,GACjC,SAAS,CAgMX"}
1
+ {"version":3,"file":"discord-gateway.d.ts","sourceRoot":"","sources":["../../src/plugins/discord-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,OAAO,EAAoB,MAAM,YAAY,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKnD,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAYD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,MAAM,EAAE,CAoCzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,MAAM,GACd,eAAe,CAiBjB;AAID,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,YAAY,EAAE,oBAAoB,GACjC,SAAS,CAwRX"}
@@ -1,5 +1,10 @@
1
1
  import { Client, GatewayIntentBits } from "discord.js";
2
2
  import { logger } from "../logger.js";
3
+ // ── Constants ────────────────────────────────────────────────────────────
4
+ /** Minimum interval between Discord message edits (rate-limit safe). */
5
+ const EDIT_THROTTLE_MS = 800;
6
+ /** Discord message character limit. */
7
+ const DISCORD_CHAR_LIMIT = 2000;
3
8
  // ── Helpers (exported for testing) ────────────────────────────────────────
4
9
  /**
5
10
  * Resolve a token value. If it starts with "$", treat it as an env var name.
@@ -82,6 +87,16 @@ export default function createDiscordGateway(pluginConfig) {
82
87
  const resolvedTokens = new Map();
83
88
  // Track our own bot user IDs so we can distinguish "our bots" from "other bots"
84
89
  const ownBotUserIds = new Set();
90
+ // Per-channel message queue — prevents concurrent spawns for the same channel.
91
+ // When a message is being processed, subsequent messages queue behind it.
92
+ const channelLocks = new Map();
93
+ // Message deduplication — Discord gateway can replay events after reconnection.
94
+ // Track recently seen message IDs to prevent processing the same message twice.
95
+ const seenMessages = new Set();
96
+ // Cross-agent loop prevention — tracks channels where the last message we
97
+ // processed was from a bot. If ANOTHER bot message arrives in the same channel
98
+ // before a human message resets it, we skip it (caps at 1 hop).
99
+ const botChainActive = new Set();
85
100
  const plugin = {
86
101
  name: "discord-gateway",
87
102
  type: "gateway",
@@ -116,8 +131,21 @@ export default function createDiscordGateway(pluginConfig) {
116
131
  }
117
132
  });
118
133
  client.on("messageCreate", async (msg) => {
134
+ // Deduplicate at the earliest point — before enqueue.
135
+ // Discord gateway can deliver the same event multiple times per bot.
136
+ // Key includes botId so different bots can still process the same message.
137
+ const dedupKey = `${botId}:${msg.id}`;
138
+ if (seenMessages.has(dedupKey))
139
+ return;
140
+ seenMessages.add(dedupKey);
141
+ if (seenMessages.size > 5000) {
142
+ const all = [...seenMessages];
143
+ seenMessages.clear();
144
+ for (const id of all.slice(-2500))
145
+ seenMessages.add(id);
146
+ }
119
147
  try {
120
- await handleMessage(msg, botId);
148
+ await enqueueMessage(msg, botId);
121
149
  }
122
150
  catch (err) {
123
151
  const errMsg = err instanceof Error ? err.message : String(err);
@@ -152,12 +180,48 @@ export default function createDiscordGateway(pluginConfig) {
152
180
  }
153
181
  };
154
182
  return plugin;
183
+ // ── Per-channel queue — serialize messages so only one spawns at a time ──
184
+ async function enqueueMessage(msg, receivingBotId) {
185
+ const key = `${receivingBotId}:${msg.channelId}`;
186
+ const prev = channelLocks.get(key) ?? Promise.resolve();
187
+ const current = prev.then(() => handleMessage(msg, receivingBotId), () => handleMessage(msg, receivingBotId));
188
+ channelLocks.set(key, current);
189
+ // Clean up after completion to avoid memory leak
190
+ current.finally(() => {
191
+ if (channelLocks.get(key) === current) {
192
+ channelLocks.delete(key);
193
+ }
194
+ });
195
+ return current;
196
+ }
155
197
  // ── Internal message handler ──────────────────────────────────────────
156
198
  async function handleMessage(msg, receivingBotId) {
157
- logger.info(`discord-gateway: bot "${receivingBotId}" received message in channel ${msg.channelId} from ${msg.author.tag} (bot=${msg.author.bot})`);
158
- // Ignore all bot messages (prevents feedback loops)
199
+ logger.info(`discord-gateway: bot "${receivingBotId}" received message ${msg.id} in channel ${msg.channelId} from ${msg.author.tag} (bot=${msg.author.bot})`);
200
+ // Cross-agent communication: allow messages from our own bots, but
201
+ // prevent loops. External bots are always ignored.
159
202
  if (msg.author.bot) {
160
- return;
203
+ // Ignore external bots entirely
204
+ if (!ownBotUserIds.has(msg.author.id))
205
+ return;
206
+ // Ignore self — a bot never responds to its own messages
207
+ const client = clients.get(receivingBotId);
208
+ if (client?.user?.id === msg.author.id)
209
+ return;
210
+ // Loop prevention: only allow 1 hop of bot-to-bot per channel.
211
+ // If we already responded to a bot message here, skip until a human resets.
212
+ const chainKey = `${receivingBotId}:${msg.channelId}`;
213
+ if (botChainActive.has(chainKey)) {
214
+ logger.info(`discord-gateway: bot "${receivingBotId}" skipping bot message in ${msg.channelId} (chain limit)`);
215
+ return;
216
+ }
217
+ // Mark chain active — next bot message in this channel will be skipped
218
+ botChainActive.add(chainKey);
219
+ }
220
+ else {
221
+ // Human message resets the chain for all bots in this channel
222
+ for (const botId of clients.keys()) {
223
+ botChainActive.delete(`${botId}:${msg.channelId}`);
224
+ }
161
225
  }
162
226
  // Only handle messages if THIS bot is the one bound to this channel.
163
227
  // This prevents "several people typing" — only the correct bot responds.
@@ -186,24 +250,39 @@ export default function createDiscordGateway(pluginConfig) {
186
250
  }
187
251
  // Normalize to IncomingMessage and route
188
252
  const incomingMessage = normalizeMessage(msg, agentId);
189
- // Show typing indicator
253
+ // Show typing indicator while processing
190
254
  const typingInterval = setInterval(() => {
191
255
  msg.channel.sendTyping().catch(() => { });
192
256
  }, 5000);
193
- // Send initial typing
194
257
  await msg.channel.sendTyping().catch(() => { });
258
+ // Send initial "thinking" message that we'll edit with streaming content
259
+ const sentMsg = await msg.channel.send("Thinking...");
260
+ let lastEditTime = 0;
261
+ // Throttled streaming callback — edits the message at most every EDIT_THROTTLE_MS
262
+ const onChunk = (accumulated) => {
263
+ const now = Date.now();
264
+ if (now - lastEditTime < EDIT_THROTTLE_MS)
265
+ return;
266
+ lastEditTime = now;
267
+ // During streaming, show first chunk (truncated if too long)
268
+ const preview = accumulated.length > DISCORD_CHAR_LIMIT - 3
269
+ ? accumulated.slice(0, DISCORD_CHAR_LIMIT - 3) + "..."
270
+ : accumulated;
271
+ sentMsg.edit(preview).catch(() => { });
272
+ };
195
273
  try {
196
- const response = await core.router.route(incomingMessage);
197
- // Split and send response
274
+ const response = await core.router.route(incomingMessage, onChunk);
275
+ // Final response: replace initial message + send overflow chunks
198
276
  const chunks = splitMessage(response);
199
- for (const chunk of chunks) {
200
- await msg.channel.send(chunk);
277
+ await sentMsg.edit(chunks[0]);
278
+ for (let i = 1; i < chunks.length; i++) {
279
+ await msg.channel.send(chunks[i]);
201
280
  }
202
281
  }
203
282
  catch (err) {
204
283
  const errMsg = err instanceof Error ? err.message : String(err);
205
284
  logger.error(`discord-gateway: error handling message: ${errMsg}`);
206
- await msg.channel.send(`⚠️ Error: ${errMsg}`).catch(() => { });
285
+ await sentMsg.edit(`⚠️ Error: ${errMsg}`).catch(() => { });
207
286
  }
208
287
  finally {
209
288
  clearInterval(typingInterval);
@@ -1 +1 @@
1
- {"version":3,"file":"discord-gateway.js","sourceRoot":"","sources":["../../src/plugins/discord-gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discord-gateway.js","sourceRoot":"","sources":["../../src/plugins/discord-gateway.ts"],"names":[],"mappings":"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"}
@@ -26,8 +26,8 @@ export declare function resolveToken(value: string): string;
26
26
  */
27
27
  export declare function markdownToMrkdwn(md: string): string;
28
28
  /**
29
- * Split a message into chunks that fit within Slack's character limit.
30
- * Prefers splitting at newline boundaries.
29
+ * Split a message into chunks that fit within Slack's section block text
30
+ * limit (3000 chars). Prefers splitting at newline boundaries.
31
31
  */
32
32
  export declare function splitMessage(text: string, maxLen?: number): string[];
33
33
  export default function createSlackGateway(pluginConfig: SlackGatewayConfig): CcgPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"slack-gateway.d.ts","sourceRoot":"","sources":["../../src/plugins/slack-gateway.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,cAAc,CAAC;AAMvD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAqCnD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAO,GAAG,MAAM,EAAE,CA4BlE;AAWD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,YAAY,EAAE,kBAAkB,GAAG,SAAS,CAqQtF"}
1
+ {"version":3,"file":"slack-gateway.d.ts","sourceRoot":"","sources":["../../src/plugins/slack-gateway.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,cAAc,CAAC;AAMvD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAYD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAqCnD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAqB,GAAG,MAAM,EAAE,CA4BhF;AAuBD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,YAAY,EAAE,kBAAkB,GAAG,SAAS,CAmVtF"}