@glows777/vela-channels 0.0.0-stage → 0.5.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +263 -0
  2. package/LICENSE +21 -0
  3. package/README.md +4 -2
  4. package/dist/admission.d.ts +15 -0
  5. package/dist/admission.d.ts.map +1 -0
  6. package/dist/admission.js +31 -0
  7. package/dist/admission.js.map +1 -0
  8. package/dist/atomic-json.d.ts +3 -0
  9. package/dist/atomic-json.d.ts.map +1 -0
  10. package/dist/atomic-json.js +23 -0
  11. package/dist/atomic-json.js.map +1 -0
  12. package/dist/commands.d.ts +47 -0
  13. package/dist/commands.d.ts.map +1 -0
  14. package/dist/commands.js +130 -0
  15. package/dist/commands.js.map +1 -0
  16. package/dist/directory.d.ts +144 -0
  17. package/dist/directory.d.ts.map +1 -0
  18. package/dist/directory.js +309 -0
  19. package/dist/directory.js.map +1 -0
  20. package/dist/event-receiver.d.ts +19 -0
  21. package/dist/event-receiver.d.ts.map +1 -0
  22. package/dist/event-receiver.js +192 -0
  23. package/dist/event-receiver.js.map +1 -0
  24. package/dist/events.d.ts +40 -0
  25. package/dist/events.d.ts.map +1 -0
  26. package/dist/events.js +247 -0
  27. package/dist/events.js.map +1 -0
  28. package/dist/feedback.d.ts +61 -0
  29. package/dist/feedback.d.ts.map +1 -0
  30. package/dist/feedback.js +470 -0
  31. package/dist/feedback.js.map +1 -0
  32. package/dist/gateway.d.ts +76 -0
  33. package/dist/gateway.d.ts.map +1 -0
  34. package/dist/gateway.js +536 -0
  35. package/dist/gateway.js.map +1 -0
  36. package/dist/generic-events.d.ts +9 -0
  37. package/dist/generic-events.d.ts.map +1 -0
  38. package/dist/generic-events.js +33 -0
  39. package/dist/generic-events.js.map +1 -0
  40. package/dist/github-events.d.ts +11 -0
  41. package/dist/github-events.d.ts.map +1 -0
  42. package/dist/github-events.js +118 -0
  43. package/dist/github-events.js.map +1 -0
  44. package/dist/handoff.d.ts +28 -0
  45. package/dist/handoff.d.ts.map +1 -0
  46. package/dist/handoff.js +189 -0
  47. package/dist/handoff.js.map +1 -0
  48. package/dist/index.d.ts +8 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +5 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/log.d.ts +2 -0
  53. package/dist/log.d.ts.map +1 -0
  54. package/dist/log.js +2 -0
  55. package/dist/log.js.map +1 -0
  56. package/dist/recovery.d.ts +19 -0
  57. package/dist/recovery.d.ts.map +1 -0
  58. package/dist/recovery.js +190 -0
  59. package/dist/recovery.js.map +1 -0
  60. package/dist/routine-time.d.ts +8 -0
  61. package/dist/routine-time.d.ts.map +1 -0
  62. package/dist/routine-time.js +114 -0
  63. package/dist/routine-time.js.map +1 -0
  64. package/dist/routines.d.ts +126 -0
  65. package/dist/routines.d.ts.map +1 -0
  66. package/dist/routines.js +370 -0
  67. package/dist/routines.js.map +1 -0
  68. package/dist/scope.d.ts +11 -0
  69. package/dist/scope.d.ts.map +1 -0
  70. package/dist/scope.js +26 -0
  71. package/dist/scope.js.map +1 -0
  72. package/dist/session-id.d.ts +6 -0
  73. package/dist/session-id.d.ts.map +1 -0
  74. package/dist/session-id.js +21 -0
  75. package/dist/session-id.js.map +1 -0
  76. package/dist/sessions.d.ts +13 -0
  77. package/dist/sessions.d.ts.map +1 -0
  78. package/dist/sessions.js +40 -0
  79. package/dist/sessions.js.map +1 -0
  80. package/dist/testing.d.ts +4 -0
  81. package/dist/testing.d.ts.map +1 -0
  82. package/dist/testing.js +8 -0
  83. package/dist/testing.js.map +1 -0
  84. package/dist/types.d.ts +177 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +2 -0
  87. package/dist/types.js.map +1 -0
  88. package/dist/usage.d.ts +31 -0
  89. package/dist/usage.d.ts.map +1 -0
  90. package/dist/usage.js +151 -0
  91. package/dist/usage.js.map +1 -0
  92. package/dist/vela.d.ts +38 -0
  93. package/dist/vela.d.ts.map +1 -0
  94. package/dist/vela.js +112 -0
  95. package/dist/vela.js.map +1 -0
  96. package/package.json +41 -4
@@ -0,0 +1,536 @@
1
+ import { publishChannelEvent, silentLogger, } from '@glows777/vela-core/extension-api';
2
+ import { TopicAdmission } from "./admission.js";
3
+ import { TopicCommands } from "./commands.js";
4
+ import { ChannelDirectory } from "./directory.js";
5
+ import { ChannelEvents } from "./events.js";
6
+ import { RunFeedback } from "./feedback.js";
7
+ import { ChannelHandoff } from "./handoff.js";
8
+ import { errorMessage } from "./log.js";
9
+ import { ChannelRecovery, storedMessage } from "./recovery.js";
10
+ import { ChannelRoutines } from "./routines.js";
11
+ import { resolveChannelScope } from "./scope.js";
12
+ import { channelSessionId } from "./session-id.js";
13
+ import { ChannelSessions } from "./sessions.js";
14
+ import { ChannelUsage } from "./usage.js";
15
+ const DEFAULT_CHANNEL_IDLE_MS = 10 * 60_000;
16
+ /** With `idleMs` 0, how often a session that is busy at its deadline is checked again */
17
+ const BUSY_RECHECK_MS = 1000;
18
+ const MAX_SAVE_FAILURES = 3;
19
+ export class ChannelGateway {
20
+ options;
21
+ routines;
22
+ events;
23
+ handoff;
24
+ directory;
25
+ recovery;
26
+ sessions;
27
+ admitting = new Map();
28
+ commands;
29
+ usage;
30
+ channels = new Map();
31
+ /** Channels whose `start()` reported a connection; `serve` refuses to idle when this is empty */
32
+ started = new Set();
33
+ /** Messages are processed serially per session: the next message in a chat waits for the previous reply */
34
+ queues = new Map();
35
+ subscribed = new WeakSet();
36
+ saveFailures = new Map();
37
+ /** Idle sessions waiting to be closed, by session id */
38
+ idleTimers = new Map();
39
+ /** Sessions being closed: a new message for the id waits until the close is done, then reopens it */
40
+ closing = new Map();
41
+ admission;
42
+ feedback;
43
+ stopped = false;
44
+ logger;
45
+ constructor(options) {
46
+ this.options = options;
47
+ this.logger = options.logger ?? silentLogger;
48
+ this.directory = new ChannelDirectory(options.dataDir);
49
+ this.usage = new ChannelUsage(options.dataDir, this.directory);
50
+ this.routines = new ChannelRoutines(options.dataDir, this.directory, (name) => this.channels.get(name), (name, msg) => this.handleIncoming(name, msg), async (key, name, msg) => {
51
+ await this.queues.get(key);
52
+ if (this.stopped)
53
+ return;
54
+ return this.admission.admit(key, this.channels.get(name), msg);
55
+ }, this.logger);
56
+ this.recovery = new ChannelRecovery(this.directory, this.logger, (msg) => this.routines.confirmed(msg));
57
+ this.sessions = new ChannelSessions(this.directory, (name) => this.channels.get(name), options.session, options.dataDir ?? process.cwd());
58
+ this.admission = new TopicAdmission(this.directory, (id, name, msg) => this.sessions.open(id, name, msg));
59
+ this.feedback = new RunFeedback({
60
+ directory: this.directory,
61
+ recovery: this.recovery,
62
+ stopped: () => this.stopped,
63
+ channel: (name) => this.channels.get(name),
64
+ find: (id) => this.find(id),
65
+ reply: (session, name, msg, text) => this.sendReply(session, name, msg, text),
66
+ logger: this.logger,
67
+ finished: (key, msg, outcome, answer) => this.handoff.finished(key, msg, outcome, answer),
68
+ });
69
+ this.commands = new TopicCommands({
70
+ directory: this.directory,
71
+ feedback: this.feedback,
72
+ admission: this.admission,
73
+ usage: this.usage,
74
+ stopped: () => this.stopped,
75
+ channel: (name) => this.channels.get(name),
76
+ find: (key) => this.find(key),
77
+ closing: (key) => this.closing.get(key),
78
+ routines: (name, chatId) => this.routines.formatList(name, chatId),
79
+ });
80
+ const liveTrigger = (id) => {
81
+ const run = this.feedback.runs.get(this.directory.keyForSession(id));
82
+ return run?.session.id === id && this.feedback.runIsLive(run)
83
+ ? run.trigger
84
+ : undefined;
85
+ };
86
+ const enqueue = (name, msg) => {
87
+ void this.handleIncoming(name, msg);
88
+ };
89
+ this.events = new ChannelEvents(options.dataDir, this.directory, (name) => this.channels.get(name), (name) => !this.stopped &&
90
+ (name ? this.started.has(name) : this.started.size > 0), liveTrigger, enqueue, this.logger, options.eventDefaultTarget);
91
+ this.handoff = new ChannelHandoff(this.directory, liveTrigger, (name, chatId) => this.topics(name, chatId), enqueue, this.logger);
92
+ }
93
+ /** Internal storage-success notification, including saves outside a channel prompt. */
94
+ sessionSaved(id) {
95
+ this.saveFailures.delete(this.directory.keyForSession(id));
96
+ this.handoff.saved(id);
97
+ }
98
+ topics(channel, chatId) {
99
+ return this.admission.list(channel, chatId, (id) => this.feedback.runs.has(id)
100
+ ? 'running'
101
+ : this.queues.has(id)
102
+ ? 'queued'
103
+ : (this.directory.get(id)?.state ?? 'done'));
104
+ }
105
+ find(key) {
106
+ return this.options.find(this.directory.sessionId(key));
107
+ }
108
+ register(channel) {
109
+ this.channels.set(channel.name, channel);
110
+ channel.connect?.({
111
+ scope: (id) => {
112
+ const record = this.directory.get(this.directory.keyForSession(id)) ??
113
+ this.directory
114
+ .entries(channel.name)
115
+ .find((entry) => channelSessionId(channel.name, entry.chatId) === id);
116
+ return record
117
+ ? resolveChannelScope(this.options.dataDir ?? process.cwd(), record.channel, record.chatId, record.chatKind, record.storageKey)
118
+ : undefined;
119
+ },
120
+ routines: this.routines.scoped(channel.name, (id) => this.feedback.runs.get(this.directory.keyForSession(id))?.trigger),
121
+ context: (id) => this.feedback.runs.get(this.directory.keyForSession(id))?.trigger,
122
+ topicCoverage: () => this.directory.coverage,
123
+ skipReply: (id) => {
124
+ const run = this.feedback.runs.get(this.directory.keyForSession(id));
125
+ if (!run ||
126
+ run.session.id !== id ||
127
+ !(run.trigger.passive || run.trigger.handoff) ||
128
+ !this.feedback.runIsLive(run))
129
+ throw new Error('Silence requires an active passive or hand-off group run');
130
+ run.skipReply = true;
131
+ },
132
+ topics: (chatId) => this.topics(channel.name, chatId),
133
+ waitForInput: (id, reason) => {
134
+ const key = this.directory.keyForSession(id);
135
+ const run = this.feedback.runs.get(key);
136
+ if (!run || run.session.id !== id || !this.feedback.runIsLive(run))
137
+ throw new Error('The topic run has ended');
138
+ return this.directory.waitForInput(key, reason);
139
+ },
140
+ dispatch: (id, msg, label) => {
141
+ const source = this.feedback.runs.get(this.directory.keyForSession(id));
142
+ if (!source || !this.feedback.runIsLive(source))
143
+ throw new Error('The source channel run has ended');
144
+ const targetId = channelSessionId(channel.name, msg.channelId, msg.topic?.rootId);
145
+ this.admission.observe(targetId, channel.name, msg, label);
146
+ this.feedback.acknowledgements.set(msg, source.inputs);
147
+ source.handedOff = true;
148
+ void this.handleIncoming(channel.name, msg);
149
+ },
150
+ });
151
+ channel.onMessage?.((msg) => {
152
+ return this.handleIncoming(channel.name, msg);
153
+ });
154
+ }
155
+ async startAll(toolNames = []) {
156
+ for (const channel of this.channels.values())
157
+ channel.validateTools?.(toolNames);
158
+ await this.directory.load();
159
+ await this.events.load();
160
+ await this.routines.load(this.channels.values());
161
+ this.usage.load();
162
+ this.stopped = false;
163
+ for (const [name, ch] of this.channels) {
164
+ try {
165
+ // Reserve recovery before transport startup can deliver new events.
166
+ let connected;
167
+ const ready = new Promise((resolve) => {
168
+ connected = resolve;
169
+ });
170
+ const records = this.directory
171
+ .entries(name)
172
+ .filter((record) => record.state === 'running' || record.pendingMessageIds.length);
173
+ for (const stored of records) {
174
+ const record = structuredClone(stored);
175
+ const task = ready
176
+ .then(async (started) => {
177
+ if (!started)
178
+ return;
179
+ const msg = storedMessage(record);
180
+ if (this.stopped ||
181
+ ch.canRecover?.(msg, record.chatKind) === false)
182
+ return;
183
+ const session = this.sessions.open(record.activeSessionId);
184
+ await session.resume();
185
+ this.admission.resumed.add(session);
186
+ await this.recovery.recover(record, ch, session, (input) => this.process(record.key, name, input, true));
187
+ })
188
+ .catch((error) => this.feedback.feedbackError(name, storedMessage(record), error));
189
+ this.queues.set(record.key, task);
190
+ this.releaseQueue(record.key, task);
191
+ }
192
+ let started = false;
193
+ try {
194
+ started = (await ch.start()) !== false;
195
+ connected(started);
196
+ }
197
+ catch (error) {
198
+ connected(false);
199
+ throw error;
200
+ }
201
+ if (started) {
202
+ this.started.add(name);
203
+ this.logger.info(`[gateway] ✓ ${name} started`);
204
+ this.routines.start(name);
205
+ }
206
+ }
207
+ catch (err) {
208
+ this.logger.error(`[gateway] ✗ ${name} failed to start: ${errorMessage(err)}`);
209
+ }
210
+ }
211
+ }
212
+ async stopAll() {
213
+ this.stopped = true;
214
+ this.started.clear();
215
+ this.routines.stop();
216
+ for (const timer of this.idleTimers.values())
217
+ clearTimeout(timer);
218
+ this.idleTimers.clear();
219
+ // Drain all active work before stopping its channels, even if an independent close fails.
220
+ const errors = [];
221
+ const drained = await Promise.allSettled([
222
+ ...[...this.feedback.active].map((session) => session.abort()),
223
+ ...this.queues.values(),
224
+ ...this.admitting.values(),
225
+ ...this.commands.active,
226
+ ...this.closing.values(),
227
+ ...this.routines.active,
228
+ ...this.events.active,
229
+ ]);
230
+ this.saveFailures.clear();
231
+ for (const result of drained)
232
+ if (result.status === 'rejected')
233
+ errors.push(result.reason);
234
+ for (const [, ch] of this.channels) {
235
+ try {
236
+ await ch.stop();
237
+ }
238
+ catch (error) {
239
+ errors.push(error);
240
+ }
241
+ }
242
+ try {
243
+ if (this.channels.size)
244
+ await this.directory.flush();
245
+ }
246
+ catch (error) {
247
+ errors.push(error);
248
+ }
249
+ if (errors.length)
250
+ throw new AggregateError(errors, 'Channel shutdown failed');
251
+ }
252
+ /** Handles one channel message; the returned Promise settles once the reply is sent (or fails). */
253
+ handleIncoming(channelName, msg) {
254
+ const id = channelSessionId(channelName, msg.channelId, msg.topic?.rootId);
255
+ clearTimeout(this.idleTimers.get(id));
256
+ this.idleTimers.delete(id);
257
+ const previous = this.queues.get(id) ?? Promise.resolve();
258
+ const incoming = this.commands.receive(id, channelName, msg, () => this.admit(id, channelName, msg), previous);
259
+ if (incoming.command) {
260
+ if (incoming.blocks) {
261
+ this.queues.set(id, incoming.command);
262
+ this.releaseQueue(id, incoming.command);
263
+ }
264
+ else
265
+ void incoming.command.then(() => this.closeWhenIdle(id));
266
+ return incoming.command;
267
+ }
268
+ const available = incoming.available;
269
+ // Keep live controls immediate. Steer waits for its admitted ID before submitting input.
270
+ const ready = available.then(() => { });
271
+ void ready.catch(() => { });
272
+ const receive = !incoming.blocked &&
273
+ (!msg.requireExistingSession ||
274
+ this.directory.get(id) ||
275
+ this.feedback.runs.has(id))
276
+ ? this.feedback.receive(id, channelName, msg, ready)
277
+ : undefined;
278
+ const consumed = available
279
+ .then((accepted) => accepted
280
+ ? (receive ?? this.feedback.receive(id, channelName, msg))
281
+ : () => Promise.resolve(true))
282
+ .catch(async (error) => {
283
+ await this.feedback.feedbackError(channelName, msg, error);
284
+ return () => Promise.resolve(true);
285
+ });
286
+ const next = previous
287
+ .then(async () => {
288
+ this.logger.debug(`[${channelName}] input ${msg.replyToId ?? '-'} dequeued at=${new Date().toISOString()}`);
289
+ if (!(await (await consumed)()))
290
+ await this.process(id, channelName, msg);
291
+ })
292
+ .catch((error) => this.logger.error(`[${channelName}] Failed to handle message: ${errorMessage(error)}`));
293
+ this.queues.set(id, next);
294
+ this.releaseQueue(id, next);
295
+ return next;
296
+ }
297
+ admit(id, channelName, msg) {
298
+ const admitted = (this.admitting.get(id) ?? this.directory.load()).then(async () => {
299
+ if (this.stopped)
300
+ return false;
301
+ const channel = this.channels.get(channelName);
302
+ if (msg.requireExistingSession && !this.directory.get(id)) {
303
+ await this.closing.get(id);
304
+ if (!(await this.admission.admit(id, channel, msg)))
305
+ return false;
306
+ }
307
+ await this.directory.admit(id, channelName, msg);
308
+ this.logger.debug(`[${channelName}] input ${msg.replyToId ?? '-'} admitted at=${new Date().toISOString()}`);
309
+ return true;
310
+ });
311
+ const admission = admitted.then(() => { }, () => { });
312
+ this.admitting.set(id, admission);
313
+ void admission.then(() => {
314
+ if (this.admitting.get(id) === admission)
315
+ this.admitting.delete(id);
316
+ });
317
+ return admitted;
318
+ }
319
+ releaseQueue(id, next) {
320
+ void next.then(() => {
321
+ if (this.queues.get(id) !== next)
322
+ return;
323
+ this.queues.delete(id);
324
+ this.closeWhenIdle(id);
325
+ });
326
+ }
327
+ /**
328
+ * Channel sessions would otherwise stay open (and in memory) for as long as the process runs, one per
329
+ * conversation. Once a chat's queue is empty, the session is closed after `idleMs`; its history
330
+ * is saved, and the next message reopens and resumes it.
331
+ */
332
+ closeWhenIdle(id, delay) {
333
+ if (this.stopped)
334
+ return;
335
+ const idleMs = this.options.idleMs ?? DEFAULT_CHANNEL_IDLE_MS;
336
+ const timer = setTimeout(() => {
337
+ this.idleTimers.delete(id);
338
+ const session = this.find(id);
339
+ // A queued message rearms the timer once its reply is sent
340
+ if (!session || this.queues.has(id))
341
+ return;
342
+ // Running (an extension or SDK caller is using it), or opened with a UI (the terminal resumed it): check
343
+ // again later, so it is still closed once that use ends without another channel message
344
+ if (session.isRunning || session.hasUI) {
345
+ this.closeWhenIdle(id, idleMs || BUSY_RECHECK_MS);
346
+ return;
347
+ }
348
+ const closed = this.closeIdleSession(id, session, idleMs)
349
+ .catch((error) => this.logger.error(`[gateway] Failed to close idle session ${id}: ${errorMessage(error)}`))
350
+ .finally(() => {
351
+ if (this.closing.get(id) === closed)
352
+ this.closing.delete(id);
353
+ });
354
+ this.closing.set(id, closed);
355
+ }, delay ?? idleMs);
356
+ // An idle timer alone doesn't keep the process alive
357
+ timer.unref?.();
358
+ this.idleTimers.set(id, timer);
359
+ }
360
+ async closeIdleSession(id, session, idleMs) {
361
+ try {
362
+ // A failed close discards pending history. Keep the live session until a real save succeeds.
363
+ await session.save({ reportFailure: true });
364
+ }
365
+ catch {
366
+ return;
367
+ }
368
+ // New work may have arrived while saving; its queue will rearm idle cleanup.
369
+ if (this.stopped || this.find(id) !== session || this.queues.has(id))
370
+ return;
371
+ if (session.isRunning || session.hasUI) {
372
+ this.closeWhenIdle(id, idleMs || BUSY_RECHECK_MS);
373
+ return;
374
+ }
375
+ await session.close();
376
+ }
377
+ async process(id, channelName, msg, recovered = false) {
378
+ const processing = this.commands.begin(id);
379
+ let outcome = 'failed';
380
+ try {
381
+ outcome = await this.processRun(id, channelName, msg, processing, recovered);
382
+ }
383
+ catch (error) {
384
+ await this.feedback.feedbackError(channelName, msg, error);
385
+ }
386
+ finally {
387
+ this.commands.end(id, processing);
388
+ if (outcome)
389
+ await Promise.all((this.feedback.acknowledgements.get(msg) ?? []).map((input) => input.finish(outcome)));
390
+ }
391
+ }
392
+ async processRun(id, channelName, msg, processing, recovered = false) {
393
+ if (this.stopped)
394
+ return 'stopped';
395
+ this.logger.debug(`[${channelName}] input ${msg.replyToId ?? '-'} preparing at=${new Date().toISOString()}`);
396
+ await this.closing.get(id);
397
+ const channel = this.channels.get(channelName);
398
+ if (msg.externalEvent) {
399
+ const record = this.directory.get(id);
400
+ if (!record || channel?.canRecover?.(msg, record.chatKind) === false)
401
+ return 'done';
402
+ }
403
+ const topicSession = msg.topic || msg.passive
404
+ ? await this.admission.admit(id, channel, msg)
405
+ : undefined;
406
+ if (msg.topic && !topicSession)
407
+ return 'failed';
408
+ if (msg.passive &&
409
+ msg.replyToId &&
410
+ topicSession &&
411
+ this.recovery.hasInput(topicSession, msg.replyToId)) {
412
+ await this.directory.forget(id, [msg.replyToId]);
413
+ return 'done';
414
+ }
415
+ const inputs = channel
416
+ ? this.feedback.acknowledge(channel, msg, !recovered)
417
+ : [];
418
+ await Promise.all(inputs.map((input) => input.ready));
419
+ this.logger.debug(`[${channelName}] input ${msg.replyToId ?? '-'} acknowledged at=${new Date().toISOString()}`);
420
+ const input = msg;
421
+ const task = msg.text;
422
+ const prepared = !processing.stopped && !recovered && channel?.prepareMessage
423
+ ? await channel.prepareMessage(msg)
424
+ : msg;
425
+ this.logger.debug(`[${channelName}] input ${msg.replyToId ?? '-'} prepared at=${new Date().toISOString()}`);
426
+ if (processing.stopped) {
427
+ await this.directory.forget(id, msg.replyToId ? [msg.replyToId] : []);
428
+ await this.directory.finish(id, 'stopped');
429
+ await this.sendReply(topicSession ?? this.sessions.open(id, channelName, msg), channelName, msg, 'Stopped the current run.');
430
+ return 'stopped';
431
+ }
432
+ if (!prepared) {
433
+ // Undefined means the adapter handled the input without a model prompt.
434
+ await this.directory.forget(id, msg.replyToId ? [msg.replyToId] : []);
435
+ return 'failed';
436
+ }
437
+ if (this.stopped)
438
+ return 'failed';
439
+ msg = prepared;
440
+ const session = topicSession ?? this.sessions.open(id, channelName, msg);
441
+ this.admission.observe(id, channelName, msg, task);
442
+ this.usage.track(id, msg.channelId, session);
443
+ if (!this.subscribed.has(session)) {
444
+ this.subscribed.add(session);
445
+ session.subscribe((event) => {
446
+ if (event.type !== 'session_save_failed')
447
+ return;
448
+ if (!this.stopped)
449
+ this.saveFailures.set(id, (this.saveFailures.get(id) ?? 0) + 1);
450
+ this.logger.error(`[gateway] Could not save session ${id}: ${errorMessage(event.error)}`);
451
+ });
452
+ }
453
+ if ((this.saveFailures.get(id) ?? 0) >= MAX_SAVE_FAILURES) {
454
+ try {
455
+ // Retry the retained live session, without appending the new input or calling the model.
456
+ await session.save();
457
+ }
458
+ catch {
459
+ // The refusal below reports the continuing outage; only a real write clears the count.
460
+ }
461
+ }
462
+ // A blocked session must reply even when the storage outage also prevents reads.
463
+ if ((this.saveFailures.get(id) ?? 0) < MAX_SAVE_FAILURES &&
464
+ !this.admission.resumed.has(session)) {
465
+ await session.resume();
466
+ this.admission.resumed.add(session);
467
+ }
468
+ if (msg.routine &&
469
+ !recovered &&
470
+ !(await this.routines.shouldRun(msg, session)))
471
+ return 'done';
472
+ publishChannelEvent(session, {
473
+ type: 'channel_message',
474
+ channel: channelName,
475
+ senderId: msg.senderId,
476
+ senderName: msg.senderName,
477
+ text: msg.text,
478
+ });
479
+ if ((this.saveFailures.get(id) ?? 0) >= MAX_SAVE_FAILURES) {
480
+ if (msg.passive) {
481
+ this.logger.error(`[${channelName}] Passive evaluation paused: session ${session.id} cannot be saved`);
482
+ return 'failed';
483
+ }
484
+ await this.sendReply(session, channelName, msg, "This session can't be saved. New prompts are paused after 3 consecutive save failures. Please ask the operator to restore session storage.");
485
+ return 'failed';
486
+ }
487
+ await this.handoff.beforeRun(id, session, msg);
488
+ return this.feedback.prompt(id, channelName, channel, msg, session, inputs, input);
489
+ }
490
+ async sendReply(session, channelName, msg, replyText) {
491
+ const channel = this.channels.get(channelName);
492
+ if (!replyText || !channel)
493
+ return false;
494
+ const reply = {
495
+ routine: msg.routine,
496
+ handoff: msg.handoff,
497
+ topic: msg.topic,
498
+ channelId: msg.channelId,
499
+ recipientId: msg.senderId,
500
+ text: replyText,
501
+ ...(msg.replyToId ? { replyToId: msg.replyToId } : {}),
502
+ };
503
+ try {
504
+ await channel.send(reply);
505
+ }
506
+ catch (error) {
507
+ publishChannelEvent(session, {
508
+ type: 'channel_error',
509
+ channel: channelName,
510
+ senderId: msg.senderId,
511
+ error,
512
+ aborted: false,
513
+ });
514
+ this.logger.error(`[${channelName}] Reply failed: ${errorMessage(error)}`);
515
+ return false;
516
+ }
517
+ publishChannelEvent(session, {
518
+ type: 'channel_reply',
519
+ channel: channelName,
520
+ recipientId: msg.senderId,
521
+ text: replyText,
522
+ });
523
+ return true;
524
+ }
525
+ list() {
526
+ return Array.from(this.channels.values()).map((ch) => ({
527
+ name: ch.name,
528
+ description: ch.description,
529
+ }));
530
+ }
531
+ /** Channels whose last `start()` reported a connection (not `false`, and it did not throw) */
532
+ running() {
533
+ return [...this.started];
534
+ }
535
+ }
536
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ import type { ChannelEvent } from './types.ts';
3
+ export declare const genericOptions: z.ZodObject<{
4
+ secret: z.ZodString;
5
+ source: z.ZodString;
6
+ }, z.core.$strict>;
7
+ /** Maps one authenticated producer to its configured source and exact key namespace. */
8
+ export declare function genericEvent(input: unknown, deliveryId: string, options: z.infer<typeof genericOptions>): ChannelEvent;
9
+ //# sourceMappingURL=generic-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-events.d.ts","sourceRoot":"","sources":["../src/generic-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,eAAO,MAAM,cAAc;;;kBAahB,CAAA;AAaX,wFAAwF;AACxF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,GACtC,YAAY,CASd"}
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ import { eventSchema } from "./events.js";
3
+ export const genericOptions = z
4
+ .object({
5
+ secret: z.string().min(1),
6
+ source: z
7
+ .string()
8
+ .trim()
9
+ .min(1)
10
+ .max(510)
11
+ .refine((source) => source.toLowerCase() !== 'github', 'github is reserved'),
12
+ })
13
+ .strict();
14
+ const payloadSchema = eventSchema
15
+ .omit({ source: true, deliveryId: true })
16
+ .extend({
17
+ // Remote keys are kept unchanged, not silently normalized into another subscription.
18
+ key: z
19
+ .string()
20
+ .min(1)
21
+ .max(512)
22
+ .refine((key) => key === key.trim()),
23
+ });
24
+ /** Maps one authenticated producer to its configured source and exact key namespace. */
25
+ export function genericEvent(input, deliveryId, options) {
26
+ const payload = payloadSchema.parse(input);
27
+ const prefix = `${options.source}:`;
28
+ if (!payload.key.startsWith(prefix) ||
29
+ !payload.key.slice(prefix.length).trim())
30
+ throw new Error('Event key is outside the configured source namespace');
31
+ return eventSchema.parse({ ...payload, source: options.source, deliveryId });
32
+ }
33
+ //# sourceMappingURL=generic-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-events.js","sourceRoot":"","sources":["../src/generic-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,MAAM,CACL,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,QAAQ,EAC7C,oBAAoB,CACrB;CACJ,CAAC;KACD,MAAM,EAAE,CAAA;AAEX,MAAM,aAAa,GAAG,WAAW;KAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;KACxC,MAAM,CAAC;IACN,qFAAqF;IACrF,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;CACvC,CAAC,CAAA;AAEJ,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAC1B,KAAc,EACd,UAAkB,EAClB,OAAuC;IAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,CAAA;IACnC,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAC/B,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;QAExC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACzE,OAAO,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;AAC9E,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { VelaLogger } from '@glows777/vela-core/extension-api';
2
+ import { z } from 'zod';
3
+ import type { ChannelEvent } from './types.ts';
4
+ export declare const githubOptions: z.ZodObject<{
5
+ secret: z.ZodString;
6
+ repositories: z.ZodArray<z.ZodString>;
7
+ apps: z.ZodDefault<z.ZodArray<z.ZodString>>;
8
+ }, z.core.$strict>;
9
+ /** Pure mapping after authentication. Never fetches payload links or guesses missing PR mappings. */
10
+ export declare function githubEvents(type: string, input: unknown, deliveryId: string, options: z.infer<typeof githubOptions>, logger: VelaLogger): ChannelEvent[];
11
+ //# sourceMappingURL=github-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-events.d.ts","sourceRoot":"","sources":["../src/github-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;kBAaf,CAAA;AA4CX,qGAAqG;AACrG,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,EACtC,MAAM,EAAE,UAAU,GACjB,YAAY,EAAE,CAqFhB"}