@yoda.digital/iris-gateway 1.14.0 → 1.15.0

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/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [1.15.0](https://github.com/yoda-digital/iris-gateway/compare/v1.14.1...v1.15.0) (2026-03-27)
2
+
3
+ ### Features
4
+
5
+ * add GitHub Discussion category form templates ([7d89c82](https://github.com/yoda-digital/iris-gateway/commit/7d89c82958ee168577949df79b024c0cc569d0ce))
6
+
7
+ ## [1.14.1](https://github.com/yoda-digital/iris-gateway/compare/v1.14.0...v1.14.1) (2026-03-27)
8
+
9
+ ### Bug Fixes
10
+
11
+ * [#234](https://github.com/yoda-digital/iris-gateway/issues/234) — split message-router.ts (380→268 lines) into TurnGrouper + router-metrics ([#237](https://github.com/yoda-digital/iris-gateway/issues/237)) ([37316b0](https://github.com/yoda-digital/iris-gateway/commit/37316b003881eadaf16dc567435666b01ebc8c38))
12
+
1
13
  ## [1.14.0](https://github.com/yoda-digital/iris-gateway/compare/v1.13.18...v1.14.0) (2026-03-26)
2
14
 
3
15
  ### Features
@@ -18,10 +18,9 @@ export declare class MessageRouter {
18
18
  private readonly profileEnricher?;
19
19
  private readonly vaultStoreRef?;
20
20
  private readonly eventHandler;
21
- private readonly pendingResponses;
21
+ private readonly turnGrouper;
22
22
  private readonly activeCoalescers;
23
23
  private readonly outboundQueue;
24
- private cleanupTimer;
25
24
  constructor(bridge: OpenCodeBridge, sessionMap: SessionMap, securityGate: SecurityGate, registry: ChannelRegistry, logger: Logger, channelConfigs?: Record<string, ChannelAccountConfig>, templateEngine?: (TemplateEngine | null) | undefined, profileEnricher?: {
26
25
  isFirstContact(profile: any): boolean;
27
26
  } | null | undefined, vaultStoreRef?: {
@@ -32,6 +31,5 @@ export declare class MessageRouter {
32
31
  handleInbound(msg: InboundMessage): Promise<void>;
33
32
  sendResponse(channelId: string, chatId: string, text: string, replyToId?: string): Promise<void>;
34
33
  private handleResponse;
35
- private pruneStale;
36
34
  }
37
35
  //# sourceMappingURL=message-router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/bridge/message-router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,0BAA0B,CAAC;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAY9D,qBAAa,aAAa;IAQtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAfjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,YAAY,CAA+C;gBAGhD,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAM,EACzD,cAAc,CAAC,GAAE,cAAc,GAAG,IAAI,aAAA,EACtC,eAAe,CAAC,EAAE;QAAE,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,YAAA,EAClE,aAAa,CAAC,EAAE;QAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI,YAAA;IA4ClG,OAAO,IAAI,IAAI;IAQf,eAAe,IAAI,YAAY;IAIzB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAmOjD,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAuBhB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,UAAU;CASnB"}
1
+ {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/bridge/message-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,0BAA0B,CAAC;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAdjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;gBAG1B,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAM,EACzD,cAAc,CAAC,GAAE,cAAc,GAAG,IAAI,aAAA,EACtC,eAAe,CAAC,EAAE;QAAE,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,YAAA,EAClE,aAAa,CAAC,EAAE;QAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI,YAAA;IAuClG,OAAO,IAAI,IAAI;IAKf,eAAe,IAAI,YAAY;IAIzB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkKjD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAetG,OAAO,CAAC,cAAc;CAWvB"}
@@ -1,11 +1,10 @@
1
- import { metrics } from "../gateway/metrics.js";
2
1
  import { chunkText, PLATFORM_LIMITS } from "../utils/text-chunker.js";
3
2
  import { shouldProcessGroupMessage, stripBotMention } from "../channels/mention-gating.js";
4
3
  import { EventHandler } from "./event-handler.js";
5
4
  import { MessageQueue } from "./message-queue.js";
6
5
  import { StreamCoalescer } from "./stream-coalescer.js";
7
- const PENDING_TTL_MS = 5 * 60_000; // 5 minutes
8
- const CLEANUP_INTERVAL_MS = 60_000; // 1 minute
6
+ import { TurnGrouper } from "./turn-grouper.js";
7
+ import { recordReceived, recordSent, recordError, recordLatency } from "./router-metrics.js";
9
8
  export class MessageRouter {
10
9
  bridge;
11
10
  sessionMap;
@@ -17,10 +16,9 @@ export class MessageRouter {
17
16
  profileEnricher;
18
17
  vaultStoreRef;
19
18
  eventHandler;
20
- pendingResponses = new Map();
19
+ turnGrouper;
21
20
  activeCoalescers = new Map();
22
21
  outboundQueue;
23
- cleanupTimer = null;
24
22
  constructor(bridge, sessionMap, securityGate, registry, logger, channelConfigs = {}, templateEngine, profileEnricher, vaultStoreRef) {
25
23
  this.bridge = bridge;
26
24
  this.sessionMap = sessionMap;
@@ -31,11 +29,12 @@ export class MessageRouter {
31
29
  this.templateEngine = templateEngine;
32
30
  this.profileEnricher = profileEnricher;
33
31
  this.vaultStoreRef = vaultStoreRef;
32
+ this.turnGrouper = new TurnGrouper((sessionId) => {
33
+ this.logger.warn({ sessionId }, "Pruning stale pending response");
34
+ });
34
35
  this.eventHandler = new EventHandler();
35
36
  this.eventHandler.events.on("partial", (sessionId, delta) => {
36
- const coalescer = this.activeCoalescers.get(sessionId);
37
- if (coalescer)
38
- coalescer.append(delta);
37
+ this.activeCoalescers.get(sessionId)?.append(delta);
39
38
  });
40
39
  this.eventHandler.events.on("response", (sessionId, text) => {
41
40
  const coalescer = this.activeCoalescers.get(sessionId);
@@ -43,7 +42,7 @@ export class MessageRouter {
43
42
  coalescer.end();
44
43
  coalescer.dispose();
45
44
  this.activeCoalescers.delete(sessionId);
46
- this.pendingResponses.delete(sessionId);
45
+ this.turnGrouper.delete(sessionId);
47
46
  }
48
47
  else {
49
48
  this.handleResponse(sessionId, text);
@@ -56,28 +55,18 @@ export class MessageRouter {
56
55
  coalescer.dispose();
57
56
  this.activeCoalescers.delete(sessionId);
58
57
  }
59
- this.pendingResponses.delete(sessionId);
58
+ this.turnGrouper.delete(sessionId);
60
59
  });
61
60
  this.outboundQueue = new MessageQueue(logger);
62
61
  this.outboundQueue.setDeliveryFn(async (msg) => {
63
62
  const adapter = this.registry.get(msg.channelId);
64
63
  if (!adapter)
65
64
  throw new Error(`No adapter for ${msg.channelId}`);
66
- return adapter.sendText({
67
- to: msg.chatId,
68
- text: msg.text,
69
- replyToId: msg.replyToId,
70
- });
65
+ return adapter.sendText({ to: msg.chatId, text: msg.text, replyToId: msg.replyToId });
71
66
  });
72
- this.cleanupTimer = setInterval(() => this.pruneStale(), CLEANUP_INTERVAL_MS);
73
- // Don't keep the process alive just for cleanup
74
- this.cleanupTimer.unref();
75
67
  }
76
68
  dispose() {
77
- if (this.cleanupTimer) {
78
- clearInterval(this.cleanupTimer);
79
- this.cleanupTimer = null;
80
- }
69
+ this.turnGrouper.dispose();
81
70
  this.eventHandler.dispose();
82
71
  }
83
72
  getEventHandler() {
@@ -85,41 +74,29 @@ export class MessageRouter {
85
74
  }
86
75
  async handleInbound(msg) {
87
76
  const startTime = Date.now();
88
- const log = this.logger.child({
89
- channel: msg.channelId,
90
- sender: msg.senderId,
91
- chat: msg.chatId,
92
- });
93
- const textPreview = msg.text ? `"${msg.text.substring(0, 60)}${msg.text.length > 60 ? "…" : ""}"` : "(no text)";
77
+ const log = this.logger.child({ channel: msg.channelId, sender: msg.senderId, chat: msg.chatId });
78
+ const textPreview = msg.text
79
+ ? `"${msg.text.substring(0, 60)}${msg.text.length > 60 ? "…" : ""}"`
80
+ : "(no text)";
94
81
  log.info(`──── INBOUND ─── ${msg.channelId}/${msg.chatType} ─── ${textPreview}`);
95
- metrics.messagesReceived.inc({ channel: msg.channelId });
96
- // ── Step 1: Adapter ──
82
+ recordReceived(msg.channelId);
97
83
  const adapter = this.registry.get(msg.channelId);
98
84
  log.info(` 1 ▸ Adapter ${adapter ? "✓ " + msg.channelId : "✗ no adapter"}`);
99
- // ── Step 2: Security gate ──
100
85
  const checkResult = await this.securityGate.check({
101
- channelId: msg.channelId,
102
- senderId: msg.senderId,
103
- senderName: msg.senderName,
104
- chatType: msg.chatType,
86
+ channelId: msg.channelId, senderId: msg.senderId,
87
+ senderName: msg.senderName, chatType: msg.chatType,
105
88
  });
106
89
  log.info(` 2 ▸ SecurityGate ${checkResult.allowed ? "✓ allowed" : "✗ " + checkResult.reason}`);
107
90
  if (!checkResult.allowed) {
108
91
  if (checkResult.message && adapter) {
109
- await adapter.sendText({
110
- to: msg.chatId,
111
- text: checkResult.message,
112
- replyToId: msg.id,
113
- });
92
+ await adapter.sendText({ to: msg.chatId, text: checkResult.message, replyToId: msg.id });
114
93
  }
115
94
  return;
116
95
  }
117
- // ── Step 3: Mention gating ──
118
96
  const channelConfig = this.channelConfigs[msg.channelId];
119
97
  if (channelConfig?.groupPolicy?.enabled && channelConfig.groupPolicy.requireMention) {
120
- const mentionPattern = channelConfig.mentionPattern;
121
98
  const botId = adapter?.id ?? msg.channelId;
122
- if (!shouldProcessGroupMessage(msg, botId, mentionPattern)) {
99
+ if (!shouldProcessGroupMessage(msg, botId, channelConfig.mentionPattern)) {
123
100
  log.info(" 3 ▸ MentionGate ✗ filtered (no bot mention)");
124
101
  return;
125
102
  }
@@ -128,33 +105,22 @@ export class MessageRouter {
128
105
  else {
129
106
  log.info(` 3 ▸ MentionGate ○ skipped (${msg.chatType})`);
130
107
  }
131
- // ── Step 4: Commands ──
132
108
  if (msg.text?.trim().toLowerCase() === "/new" || msg.text?.trim().toLowerCase() === "/start") {
133
109
  const key = this.sessionMap.buildKey(msg.channelId, msg.chatId, msg.chatType);
134
110
  await this.sessionMap.reset(key);
135
111
  log.info(" 4 ▸ Command /new → session reset");
136
112
  if (adapter) {
137
- await adapter.sendText({
138
- to: msg.chatId,
139
- text: "Session reset. Send a message to start fresh.",
140
- replyToId: msg.id,
141
- });
113
+ await adapter.sendText({ to: msg.chatId, text: "Session reset. Send a message to start fresh.", replyToId: msg.id });
142
114
  }
143
115
  return;
144
116
  }
145
117
  log.info(" 4 ▸ Commands ○ not a command");
146
- // ── Step 5: Auto-reply ──
147
118
  if (this.templateEngine) {
148
119
  const match = this.templateEngine.match(msg);
149
120
  if (match) {
150
121
  log.info(` 5 ▸ AutoReply ✓ matched "${match.template.id}"${match.template.forwardToAi ? " (+ forward)" : ""}`);
151
- if (adapter) {
152
- await adapter.sendText({
153
- to: msg.chatId,
154
- text: match.response,
155
- replyToId: msg.id,
156
- });
157
- }
122
+ if (adapter)
123
+ await adapter.sendText({ to: msg.chatId, text: match.response, replyToId: msg.id });
158
124
  if (!match.template.forwardToAi)
159
125
  return;
160
126
  }
@@ -165,7 +131,6 @@ export class MessageRouter {
165
131
  else {
166
132
  log.info(" 5 ▸ AutoReply ○ disabled");
167
133
  }
168
- // ── Step 6: First contact detection ──
169
134
  let firstContactPrefix = "";
170
135
  if (this.profileEnricher && this.vaultStoreRef) {
171
136
  const profile = this.vaultStoreRef.getProfile(msg.senderId, msg.channelId);
@@ -180,31 +145,20 @@ export class MessageRouter {
180
145
  else {
181
146
  log.info(" 6 ▸ FirstContact ○ enricher disabled");
182
147
  }
183
- // ── Step 7: Session resolution ──
184
148
  const entry = await this.sessionMap.resolve(msg.channelId, msg.senderId, msg.chatId, msg.chatType, this.bridge);
185
149
  log.info(` 7 ▸ Session ✓ ${entry.openCodeSessionId}`);
186
- // Store pending response context
187
- this.pendingResponses.set(entry.openCodeSessionId, {
188
- channelId: msg.channelId,
189
- chatId: msg.chatId,
190
- replyToId: msg.id,
191
- createdAt: Date.now(),
150
+ this.turnGrouper.set(entry.openCodeSessionId, {
151
+ channelId: msg.channelId, chatId: msg.chatId, replyToId: msg.id,
192
152
  });
193
- // ── Step 8: Typing indicator ──
194
153
  await adapter?.sendTyping?.({ to: msg.chatId });
195
154
  log.info(" 8 ▸ Typing ✓ sent");
196
- // Strip bot mention from text before forwarding to OpenCode
197
155
  let messageText = msg.text ?? "";
198
156
  if (channelConfig?.groupPolicy?.enabled && channelConfig.groupPolicy.requireMention) {
199
- const mentionPattern = channelConfig.mentionPattern;
200
157
  const botId = adapter?.id ?? msg.channelId;
201
- messageText = stripBotMention(messageText, botId, mentionPattern);
158
+ messageText = stripBotMention(messageText, botId, channelConfig.mentionPattern);
202
159
  }
203
- // Prepend first-contact meta-prompt if applicable
204
- if (firstContactPrefix) {
160
+ if (firstContactPrefix)
205
161
  messageText = firstContactPrefix + messageText;
206
- }
207
- // Set up streaming coalescer if enabled for this channel
208
162
  const streamConfig = channelConfig?.streaming;
209
163
  if (streamConfig?.enabled && adapter) {
210
164
  const maxLen = PLATFORM_LIMITS[msg.channelId] ?? adapter.capabilities.maxTextLength ?? 4096;
@@ -220,35 +174,21 @@ export class MessageRouter {
220
174
  adapter.editMessage({ messageId: "", text, chatId: msg.chatId }).catch(() => { });
221
175
  }
222
176
  else {
223
- this.outboundQueue.enqueue({
224
- channelId: msg.channelId,
225
- chatId: msg.chatId,
226
- text,
227
- replyToId: msg.id,
228
- });
177
+ this.outboundQueue.enqueue({ channelId: msg.channelId, chatId: msg.chatId, text, replyToId: msg.id });
229
178
  }
230
179
  });
231
180
  this.activeCoalescers.set(entry.openCodeSessionId, coalescer);
232
181
  }
233
- // ── Step 9: OpenCode bridge ──
234
182
  const cb = this.bridge.getCircuitBreaker();
235
183
  if (!cb.allowRequest()) {
236
- // Fix #1: circuit OPEN → reject immediately, do NOT fall through to sendAndWait
237
184
  log.warn(" 9 ▸ Bridge ✗ circuit OPEN — rejecting, notifying user");
238
185
  if (adapter) {
239
- await adapter.sendText({
240
- to: msg.chatId,
241
- text: cb.unavailableMessage,
242
- replyToId: msg.id,
243
- }).catch(() => { });
186
+ await adapter.sendText({ to: msg.chatId, text: cb.unavailableMessage, replyToId: msg.id }).catch(() => { });
244
187
  }
245
- this.pendingResponses.delete(entry.openCodeSessionId);
188
+ this.turnGrouper.delete(entry.openCodeSessionId);
246
189
  return;
247
190
  }
248
191
  log.info(" 9 ▸ Bridge → prompt_async to OpenCode");
249
- log.info(" ── HOOKS ── system.transform → vault context + profile learning + proactive awareness");
250
- log.info(" ── MODEL ── thinking + tool calls (see ⚡ below) + response generation");
251
- // Fix #2: wrap in try/catch and call onSuccess()/onFailure() for feedback loop
252
192
  let response = null;
253
193
  try {
254
194
  const sendTimeoutMs = this.channelConfigs[msg.channelId]?.sendAndWaitTimeoutMs;
@@ -256,32 +196,30 @@ export class MessageRouter {
256
196
  }
257
197
  catch (err) {
258
198
  cb.onFailure();
259
- metrics.messagesErrors.inc({ channel: msg.channelId, error_type: 'bridge_error' });
199
+ recordError(msg.channelId, "bridge_error");
260
200
  log.error({ err }, " 9 ▸ Bridge ✗ sendAndWait threw");
261
201
  throw err;
262
202
  }
263
- // Clean up streaming coalescer (not used in polling path)
264
203
  const coalescer = this.activeCoalescers.get(entry.openCodeSessionId);
265
204
  if (coalescer) {
266
205
  coalescer.dispose();
267
206
  this.activeCoalescers.delete(entry.openCodeSessionId);
268
207
  }
269
- this.pendingResponses.delete(entry.openCodeSessionId);
270
- // ── Step 10: Response delivery ──
208
+ this.turnGrouper.delete(entry.openCodeSessionId);
271
209
  const elapsed = Date.now() - startTime;
272
210
  if (response) {
273
- cb.onSuccess(); // Fix #2: feedback loop — close circuit on success
211
+ cb.onSuccess();
274
212
  const responsePreview = `"${response.substring(0, 80)}${response.length > 80 ? "…" : ""}"`;
275
213
  log.info(` 10 ▸ Response ✓ ${response.length}ch in ${elapsed}ms`);
276
214
  log.info(` 11 ▸ Deliver → ${msg.channelId} ${responsePreview}`);
277
215
  await this.sendResponse(msg.channelId, msg.chatId, response, msg.id);
278
- metrics.messageProcessingLatency.observe({ channel: msg.channelId, stage: 'full' }, elapsed / 1000);
279
- metrics.messagesSent.inc({ channel: msg.channelId });
216
+ recordLatency(msg.channelId, elapsed);
217
+ recordSent(msg.channelId);
280
218
  log.info(`──── DONE ──── ${elapsed}ms total ────`);
281
219
  }
282
220
  else {
283
- cb.onFailure(); // Fix #2: null response = bridge failure
284
- metrics.messagesErrors.inc({ channel: msg.channelId, error_type: 'empty_response' });
221
+ cb.onFailure();
222
+ recordError(msg.channelId, "empty_response");
285
223
  log.warn(` 10 ▸ Response ✗ empty (${elapsed}ms) — model may be unavailable`);
286
224
  log.info(`──── DONE ──── ${elapsed}ms total (no response) ────`);
287
225
  }
@@ -296,34 +234,20 @@ export class MessageRouter {
296
234
  const chunks = chunkText(text, maxLen);
297
235
  let currentReplyToId = replyToId;
298
236
  for (const chunk of chunks) {
299
- this.outboundQueue.enqueue({
300
- channelId,
301
- chatId,
302
- text: chunk,
303
- replyToId: currentReplyToId,
304
- });
305
- currentReplyToId = undefined; // Only reply to first chunk
237
+ this.outboundQueue.enqueue({ channelId, chatId, text: chunk, replyToId: currentReplyToId });
238
+ currentReplyToId = undefined;
306
239
  }
307
240
  }
308
241
  handleResponse(sessionId, text) {
309
- const pending = this.pendingResponses.get(sessionId);
242
+ const pending = this.turnGrouper.get(sessionId);
310
243
  if (!pending) {
311
244
  this.logger.warn({ sessionId }, "No pending response context");
312
245
  return;
313
246
  }
314
- this.pendingResponses.delete(sessionId);
247
+ this.turnGrouper.delete(sessionId);
315
248
  this.sendResponse(pending.channelId, pending.chatId, text, pending.replyToId).catch((err) => {
316
249
  this.logger.error({ err, sessionId }, "Failed to send response");
317
250
  });
318
251
  }
319
- pruneStale() {
320
- const now = Date.now();
321
- for (const [sessionId, pending] of this.pendingResponses) {
322
- if (now - pending.createdAt > PENDING_TTL_MS) {
323
- this.logger.warn({ sessionId }, "Pruning stale pending response");
324
- this.pendingResponses.delete(sessionId);
325
- }
326
- }
327
- }
328
252
  }
329
253
  //# sourceMappingURL=message-router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/bridge/message-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/bridge/message-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Centralises metric emissions for MessageRouter.
3
+ * Extracted from message-router.ts to keep that file under 250 lines.
4
+ */
5
+ export declare function recordReceived(channel: string): void;
6
+ export declare function recordSent(channel: string): void;
7
+ export declare function recordError(channel: string, errorType: string): void;
8
+ export declare function recordLatency(channel: string, elapsedMs: number): void;
9
+ //# sourceMappingURL=router-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-metrics.d.ts","sourceRoot":"","sources":["../../src/bridge/router-metrics.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAKtE"}
@@ -0,0 +1,18 @@
1
+ import { metrics } from "../gateway/metrics.js";
2
+ /**
3
+ * Centralises metric emissions for MessageRouter.
4
+ * Extracted from message-router.ts to keep that file under 250 lines.
5
+ */
6
+ export function recordReceived(channel) {
7
+ metrics.messagesReceived.inc({ channel });
8
+ }
9
+ export function recordSent(channel) {
10
+ metrics.messagesSent.inc({ channel });
11
+ }
12
+ export function recordError(channel, errorType) {
13
+ metrics.messagesErrors.inc({ channel, error_type: errorType });
14
+ }
15
+ export function recordLatency(channel, elapsedMs) {
16
+ metrics.messageProcessingLatency.observe({ channel, stage: "full" }, elapsedMs / 1000);
17
+ }
18
+ //# sourceMappingURL=router-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-metrics.js","sourceRoot":"","sources":["../../src/bridge/router-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,SAAiB;IAC5D,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,SAAiB;IAC9D,OAAO,CAAC,wBAAwB,CAAC,OAAO,CACtC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAC1B,SAAS,GAAG,IAAI,CACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Manages pending-response tracking and stale-entry pruning.
3
+ * Extracted from message-router.ts to keep that file under 250 lines.
4
+ */
5
+ export interface PendingResponse {
6
+ channelId: string;
7
+ chatId: string;
8
+ replyToId?: string;
9
+ createdAt: number;
10
+ }
11
+ export declare class TurnGrouper {
12
+ private readonly onPrune?;
13
+ private readonly pendingResponses;
14
+ private cleanupTimer;
15
+ constructor(onPrune?: ((sessionId: string) => void) | undefined);
16
+ set(sessionId: string, ctx: Omit<PendingResponse, "createdAt">): void;
17
+ get(sessionId: string): PendingResponse | undefined;
18
+ delete(sessionId: string): void;
19
+ dispose(): void;
20
+ private pruneStale;
21
+ }
22
+ //# sourceMappingURL=turn-grouper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-grouper.d.ts","sourceRoot":"","sources":["../../src/bridge/turn-grouper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAHrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,YAAY,CAA+C;gBAEtC,OAAO,CAAC,GAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,aAAA;IAQlE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,IAAI;IAIrE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/B,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,UAAU;CASnB"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Manages pending-response tracking and stale-entry pruning.
3
+ * Extracted from message-router.ts to keep that file under 250 lines.
4
+ */
5
+ const PENDING_TTL_MS = 5 * 60_000; // 5 minutes
6
+ const CLEANUP_INTERVAL_MS = 60_000; // 1 minute
7
+ export class TurnGrouper {
8
+ onPrune;
9
+ pendingResponses = new Map();
10
+ cleanupTimer = null;
11
+ constructor(onPrune) {
12
+ this.onPrune = onPrune;
13
+ this.cleanupTimer = setInterval(() => this.pruneStale(), CLEANUP_INTERVAL_MS);
14
+ this.cleanupTimer.unref();
15
+ }
16
+ set(sessionId, ctx) {
17
+ this.pendingResponses.set(sessionId, { ...ctx, createdAt: Date.now() });
18
+ }
19
+ get(sessionId) {
20
+ return this.pendingResponses.get(sessionId);
21
+ }
22
+ delete(sessionId) {
23
+ this.pendingResponses.delete(sessionId);
24
+ }
25
+ dispose() {
26
+ if (this.cleanupTimer) {
27
+ clearInterval(this.cleanupTimer);
28
+ this.cleanupTimer = null;
29
+ }
30
+ }
31
+ pruneStale() {
32
+ const now = Date.now();
33
+ for (const [sessionId, pending] of this.pendingResponses) {
34
+ if (now - pending.createdAt > PENDING_TTL_MS) {
35
+ this.pendingResponses.delete(sessionId);
36
+ this.onPrune?.(sessionId);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ //# sourceMappingURL=turn-grouper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-grouper.js","sourceRoot":"","sources":["../../src/bridge/turn-grouper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,YAAY;AAC/C,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,WAAW;AAS/C,MAAM,OAAO,WAAW;IAIO;IAHZ,gBAAgB,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC/D,YAAY,GAA0C,IAAI,CAAC;IAEnE,YAA6B,OAAqC;QAArC,YAAO,GAAP,OAAO,CAA8B;QAChE,IAAI,CAAC,YAAY,GAAG,WAAW,CAC7B,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EACvB,mBAAmB,CACpB,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,SAAiB,EAAE,GAAuC;QAC5D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzD,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,GAAG,cAAc,EAAE,CAAC;gBAC7C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACxC,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoda.digital/iris-gateway",
3
- "version": "1.14.0",
3
+ "version": "1.15.0",
4
4
  "description": "Multi-channel AI messaging gateway powered by OpenCode CLI",
5
5
  "homepage": "https://github.com/yoda-digital/iris-gateway",
6
6
  "repository": {