@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,470 @@
1
+ import { publishChannelEvent } from '@glows777/vela-core/extension-api';
2
+ import { errorMessage } from "./log.js";
3
+ import { channelSessionId } from "./session-id.js";
4
+ /** An admitted input keeps its acknowledgement across asynchronous task handoff. */
5
+ export class MessageFeedback {
6
+ message;
7
+ report;
8
+ ready;
9
+ feedback;
10
+ finished;
11
+ startPresentation;
12
+ failed = false;
13
+ constructor(channel, message, report, acknowledge = true) {
14
+ this.message = message;
15
+ this.report = report;
16
+ this.ready = Promise.resolve()
17
+ .then(() => channel.startRun?.(message, { acknowledge }))
18
+ .then((value) => {
19
+ this.feedback = value || undefined;
20
+ })
21
+ .catch(async (error) => {
22
+ await this.report(error);
23
+ // A failed initial reaction must not remove the run's Stop control.
24
+ // Create presentation only; never retry the acknowledgement.
25
+ this.startPresentation = async () => {
26
+ if (!acknowledge)
27
+ throw error;
28
+ this.feedback =
29
+ (await channel.startRun?.(message, { acknowledge: false })) ||
30
+ undefined;
31
+ };
32
+ });
33
+ }
34
+ fail() {
35
+ this.failed = true;
36
+ }
37
+ event(update) {
38
+ if (this.startPresentation) {
39
+ const start = this.startPresentation;
40
+ this.startPresentation = undefined;
41
+ return start().then(() => this.event(update));
42
+ }
43
+ return this.feedback?.event(update);
44
+ }
45
+ finish(outcome) {
46
+ this.finished ??= this.complete(outcome);
47
+ return this.finished;
48
+ }
49
+ async complete(outcome) {
50
+ await this.ready;
51
+ try {
52
+ await this.feedback?.finish(this.failed ? 'failed' : outcome);
53
+ }
54
+ catch (error) {
55
+ await this.report(error);
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * A passive input is marked only once the run starts writing an answer, so untagged
61
+ * group discussion stays unmarked unless Vela replies.
62
+ */
63
+ class DeferredMessageFeedback {
64
+ channel;
65
+ message;
66
+ report;
67
+ /** There is no admission acknowledgement to await. */
68
+ ready = Promise.resolve();
69
+ feedback;
70
+ starting;
71
+ finished;
72
+ constructor(channel, message, report) {
73
+ this.channel = channel;
74
+ this.message = message;
75
+ this.report = report;
76
+ }
77
+ event(update) {
78
+ if (!this.starting) {
79
+ if (update.type !== 'agent' ||
80
+ update.event.type !== 'message_update' ||
81
+ update.event.assistantMessageEvent.type !== 'text_delta' ||
82
+ update.event.assistantMessageEvent.delta === '')
83
+ return;
84
+ this.starting = Promise.resolve()
85
+ .then(() => this.channel.startRun?.(this.message, { acknowledge: true }))
86
+ .then((feedback) => {
87
+ this.feedback = feedback || undefined;
88
+ })
89
+ .catch(this.report);
90
+ }
91
+ const starting = this.starting;
92
+ return starting.then(() => this.feedback?.event(update));
93
+ }
94
+ finish(outcome) {
95
+ this.finished ??= this.complete(outcome);
96
+ return this.finished;
97
+ }
98
+ async complete(outcome) {
99
+ await this.starting;
100
+ try {
101
+ await this.feedback?.finish(outcome);
102
+ }
103
+ catch (error) {
104
+ await this.report(error);
105
+ }
106
+ }
107
+ }
108
+ /** Coordinates admitted inputs and controls without owning the gateway's queues. */
109
+ export class RunFeedback {
110
+ options;
111
+ active = new Set();
112
+ runs = new Map();
113
+ acknowledgements = new WeakMap();
114
+ constructor(options) {
115
+ this.options = options;
116
+ }
117
+ receive(id, channelName, msg, admitted = Promise.resolve()) {
118
+ if (msg.passive || msg.routine || msg.externalEvent || msg.handoff)
119
+ return async () => false;
120
+ const channel = this.options.channel(channelName);
121
+ const run = this.runs.get(id);
122
+ if (channel &&
123
+ (!msg.requireExistingSession || (run && this.runIsLive(run))))
124
+ this.acknowledge(channel, msg);
125
+ let consumed = false;
126
+ let chosen = false;
127
+ let decision;
128
+ let card;
129
+ const apply = (action) => {
130
+ if (!run || !channel)
131
+ return Promise.resolve();
132
+ const choice = action === 'stop'
133
+ ? this.applyRunChoice(channel, msg, run, action)
134
+ : admitted.then(() => this.applyRunChoice(channel, msg, run, action));
135
+ return choice
136
+ .then((handled) => {
137
+ consumed = handled;
138
+ })
139
+ .catch(async (error) => {
140
+ const aborted = this.options.stopped() || run.stopped || isAbort(error);
141
+ if (!aborted)
142
+ await this.feedbackError(channelName, msg, error);
143
+ else
144
+ publishChannelEvent(run.session, {
145
+ type: 'channel_error',
146
+ channel: channelName,
147
+ senderId: msg.senderId,
148
+ error,
149
+ aborted: true,
150
+ });
151
+ await Promise.all((this.acknowledgements.get(msg) ?? []).map(async (input) => {
152
+ if (!aborted)
153
+ input.fail();
154
+ if (!run.inputs.includes(input))
155
+ await input.finish(aborted ? 'stopped' : 'failed');
156
+ }));
157
+ consumed = true;
158
+ })
159
+ .finally(() => {
160
+ if (run.stopped)
161
+ consumed = true;
162
+ });
163
+ };
164
+ // A person's message never steers into a note's run: it would inherit the note's hop count and limits.
165
+ if (run &&
166
+ !run.trigger.passive &&
167
+ !run.trigger.handoff &&
168
+ this.runIsLive(run) &&
169
+ channel) {
170
+ if (msg.topic) {
171
+ decision = (run.steering ?? Promise.resolve()).then(() => apply('steer'));
172
+ run.steering = decision;
173
+ }
174
+ else if (channel.startRun) {
175
+ const input = this.acknowledge(channel, msg)[0];
176
+ card = input.ready
177
+ .then(() => input.event({
178
+ type: 'controls',
179
+ message: msg,
180
+ signal: run.lifetime.signal,
181
+ choose: (action) => {
182
+ if (chosen || !this.runIsLive(run))
183
+ return false;
184
+ chosen = true;
185
+ if (action !== 'queue')
186
+ decision = apply(action);
187
+ return true;
188
+ },
189
+ error: (error) => this.feedbackError(channelName, msg, error),
190
+ }))
191
+ .catch((error) => this.options.logger.warn(`[${channelName}] Failed to send run controls: ${errorMessage(error)}`));
192
+ }
193
+ }
194
+ return async () => {
195
+ await card;
196
+ await decision;
197
+ return consumed;
198
+ };
199
+ }
200
+ runIsLive(run) {
201
+ return (!this.options.stopped() &&
202
+ !run.stopped &&
203
+ !run.lifetime.signal.aborted &&
204
+ this.runs.get(run.key) === run &&
205
+ run.session.isRunning);
206
+ }
207
+ /** The same cancellation boundary is used by topic commands and card controls. */
208
+ async stop(id) {
209
+ const run = this.runs.get(id);
210
+ if (!run ||
211
+ this.options.stopped() ||
212
+ run.stopped ||
213
+ run.lifetime.signal.aborted)
214
+ return false;
215
+ await this.stopRun(run);
216
+ return true;
217
+ }
218
+ async stopRun(run) {
219
+ run.stopped = true;
220
+ run.lifetime.abort();
221
+ // These inputs belong to the cancelled run; the gateway's default queue stays intact.
222
+ run.session.clearQueue();
223
+ await Promise.all([
224
+ run.session.abort(),
225
+ this.options.directory.finish(run.key, 'stopped'),
226
+ ]);
227
+ }
228
+ /** Apply one reserved card choice; true consumes its gateway input. */
229
+ async applyRunChoice(channel, msg, run, action) {
230
+ if (action === 'stop') {
231
+ await this.stopRun(run);
232
+ if (!msg.topic)
233
+ await this.options.reply(run.session, channel.name, msg, 'Stopped the current run.');
234
+ await Promise.all((this.acknowledgements.get(msg) ?? [])
235
+ .filter((input) => !run.inputs.includes(input))
236
+ .map((input) => input.finish('stopped')));
237
+ return true;
238
+ }
239
+ const inputs = this.acknowledge(channel, msg);
240
+ await Promise.all(inputs.map((input) => input.ready));
241
+ if (msg.topic)
242
+ msg.isNewTopic = false;
243
+ const prepared = channel.prepareMessage
244
+ ? await channel.prepareMessage(msg, run.trigger)
245
+ : msg;
246
+ // History/name lookups can outlast the run. Leave the default queue intact.
247
+ if (!prepared) {
248
+ await this.options.directory.forget(run.key, msg.replyToId ? [msg.replyToId] : []);
249
+ await Promise.all(inputs.map((input) => input.finish('failed')));
250
+ return true;
251
+ }
252
+ if (!this.runIsLive(run)) {
253
+ if (!run.stopped)
254
+ return false;
255
+ await Promise.all(inputs.map((input) => input.finish('stopped')));
256
+ return true;
257
+ }
258
+ run.inputs.push(...inputs);
259
+ publishChannelEvent(run.session, {
260
+ type: 'channel_message',
261
+ channel: channel.name,
262
+ senderId: prepared.senderId,
263
+ senderName: prepared.senderName,
264
+ text: prepared.text,
265
+ });
266
+ this.options.recovery.track(run.key, run.session, prepared);
267
+ await run.session.prompt(prepared.text, {
268
+ source: 'channel',
269
+ streamingBehavior: 'steer',
270
+ images: prepared.images,
271
+ signal: run.lifetime.signal,
272
+ });
273
+ return true;
274
+ }
275
+ acknowledge(channel, msg, acknowledge = true) {
276
+ if (msg.passive)
277
+ return [];
278
+ let inputs = this.acknowledgements.get(msg);
279
+ if (!inputs) {
280
+ inputs = [
281
+ new MessageFeedback(channel, msg, (error) => this.feedbackError(channel.name, msg, error), acknowledge && !msg.externalEvent && !msg.handoff),
282
+ ];
283
+ this.acknowledgements.set(msg, inputs);
284
+ }
285
+ return inputs;
286
+ }
287
+ async feedbackError(channelName, msg, error) {
288
+ const session = this.options.find(channelSessionId(channelName, msg.channelId, msg.topic?.rootId));
289
+ session &&
290
+ publishChannelEvent(session, {
291
+ type: 'channel_error',
292
+ channel: channelName,
293
+ senderId: msg.senderId,
294
+ error,
295
+ aborted: false,
296
+ });
297
+ this.options.logger.error(`[${channelName}] Feedback failed: ${errorMessage(error)}`);
298
+ if (msg.passive || msg.externalEvent)
299
+ return;
300
+ try {
301
+ await this.options.channel(channelName)?.send({
302
+ ...msg,
303
+ recipientId: msg.senderId,
304
+ text: `Couldn't update task feedback: ${errorMessage(error)}. Check the bot's permissions and connection.`,
305
+ });
306
+ }
307
+ catch (sendError) {
308
+ this.options.logger.error(`[${channelName}] Could not deliver feedback error: ${errorMessage(sendError)}`);
309
+ }
310
+ }
311
+ async prompt(id, channelName, channel, msg, session, inputs, input) {
312
+ this.active.add(session);
313
+ const run = {
314
+ key: id,
315
+ session,
316
+ trigger: msg,
317
+ lifetime: new AbortController(),
318
+ stopped: false,
319
+ inputs,
320
+ };
321
+ this.runs.set(id, run);
322
+ let feedbackErrorReported = false;
323
+ const report = async (error) => {
324
+ if (feedbackErrorReported)
325
+ return;
326
+ feedbackErrorReported = true;
327
+ await this.feedbackError(channelName, msg, error);
328
+ };
329
+ const feedback = channel && msg.passive
330
+ ? new DeferredMessageFeedback(channel, msg, report)
331
+ : channel
332
+ ? (inputs.find((item) => item.message === input) ??
333
+ new MessageFeedback(channel, msg, report, false))
334
+ : undefined;
335
+ await feedback?.ready;
336
+ const pending = [];
337
+ const unsubscribe = session.subscribe((event) => {
338
+ try {
339
+ const update = feedback?.event({ type: 'agent', event });
340
+ if (update)
341
+ pending.push(Promise.resolve(update).catch(report));
342
+ }
343
+ catch (error) {
344
+ pending.push(report(error));
345
+ }
346
+ if (event.type === 'agent_settled')
347
+ run.lifetime.abort();
348
+ });
349
+ let outcome = 'done';
350
+ let answer = '';
351
+ let failureReported = false;
352
+ let promptStarted = false;
353
+ let executionFailed = false;
354
+ let interrupted = false;
355
+ // An input handler can handle the message without a run: then there is no new answer to send
356
+ const previous = session.messages.at(-1);
357
+ try {
358
+ if (msg.topic && channel && !msg.passive && feedback) {
359
+ try {
360
+ await feedback.event({
361
+ type: 'controls',
362
+ message: msg,
363
+ signal: run.lifetime.signal,
364
+ error: report,
365
+ choose: (action) => {
366
+ if (action !== 'stop' || !this.runIsLive(run))
367
+ return false;
368
+ void this.applyRunChoice(channel, msg, run, 'stop').catch((error) => publishChannelEvent(session, {
369
+ type: 'channel_error',
370
+ channel: channelName,
371
+ senderId: msg.senderId,
372
+ error,
373
+ aborted: this.options.stopped() || isAbort(error),
374
+ }));
375
+ return true;
376
+ },
377
+ });
378
+ }
379
+ catch (error) {
380
+ failureReported = true;
381
+ await this.options.reply(session, channelName, msg, `Couldn't show the topic Stop control: ${errorMessage(error)}. Check the bot's send permission and retry.`);
382
+ throw error;
383
+ }
384
+ }
385
+ if (run.stopped)
386
+ throw new DOMException('Stopped before prompting', 'AbortError');
387
+ await this.options.directory.begin(id, msg);
388
+ if (run.stopped)
389
+ throw new DOMException('Stopped before prompting', 'AbortError');
390
+ this.options.recovery.track(id, session, msg);
391
+ promptStarted = true;
392
+ this.options.logger.debug(`[${channelName}] input ${msg.replyToId ?? '-'} prompt at=${new Date().toISOString()}`);
393
+ await session.prompt(msg.text, { source: 'channel', images: msg.images });
394
+ if (session.messages.at(-1) !== previous)
395
+ answer = lastAssistantText(session.messages);
396
+ }
397
+ catch (error) {
398
+ outcome =
399
+ run.stopped || this.options.stopped() || isAbort(error)
400
+ ? 'stopped'
401
+ : 'failed';
402
+ interrupted = this.options.stopped() && !run.stopped;
403
+ executionFailed = promptStarted && outcome === 'failed';
404
+ if (outcome === 'failed' && !failureReported) {
405
+ if (msg.passive)
406
+ this.options.logger.error(`[${channelName}] Passive evaluation failed: ${errorMessage(error)}`);
407
+ else
408
+ answer = `Task failed: ${errorMessage(error)}`;
409
+ }
410
+ publishChannelEvent(session, {
411
+ type: 'channel_error',
412
+ channel: channelName,
413
+ senderId: msg.senderId,
414
+ error,
415
+ aborted: outcome === 'stopped',
416
+ });
417
+ }
418
+ finally {
419
+ unsubscribe();
420
+ run.lifetime.abort();
421
+ await run.steering;
422
+ await Promise.all(pending);
423
+ this.runs.delete(id);
424
+ this.active.delete(session);
425
+ }
426
+ await this.options.recovery.settled(session);
427
+ if (run.handedOff) {
428
+ await this.options.directory.finish(id, 'done');
429
+ if (msg.passive)
430
+ await feedback?.finish('silent');
431
+ return;
432
+ }
433
+ if (run.stopped)
434
+ outcome = 'stopped';
435
+ if (outcome === 'stopped')
436
+ answer = msg.topic ? 'Stopped the current run.' : '';
437
+ if (run.skipReply)
438
+ answer = '';
439
+ const delivered = !answer || (await this.options.reply(session, channelName, msg, answer));
440
+ if (!delivered)
441
+ outcome = 'failed';
442
+ await feedback?.finish(msg.passive && outcome === 'done' && !answer ? 'silent' : outcome);
443
+ // Shutdown is recoverable, including accepted steers not yet saved. A reported
444
+ // execution failure is terminal; a failed delivery must remain recoverable.
445
+ if (!interrupted &&
446
+ (outcome !== 'failed' || (executionFailed && delivered))) {
447
+ await this.options.directory.forget(id, [msg, ...run.inputs.map((item) => item.message)].flatMap((item) => item.replyToId ? [item.replyToId] : []));
448
+ await this.options.directory.finish(id, outcome === 'stopped' ? 'stopped' : 'done',
449
+ // A note's run leaves a person's pending decision open, even when silent.
450
+ outcome === 'done' && (!!answer || !!msg.handoff));
451
+ await this.options.finished(id, msg, outcome, answer);
452
+ }
453
+ return outcome;
454
+ }
455
+ }
456
+ function isAbort(error) {
457
+ return error instanceof Error && error.name === 'AbortError';
458
+ }
459
+ /** Text of the last assistant message (this turn's reply). */
460
+ function lastAssistantText(messages) {
461
+ const last = messages[messages.length - 1];
462
+ if (last?.role !== 'assistant')
463
+ return '';
464
+ if (typeof last.content === 'string')
465
+ return last.content;
466
+ return last.content
467
+ .map((part) => (part.type === 'text' ? part.text : ''))
468
+ .join('');
469
+ }
470
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AASlD,oFAAoF;AACpF,MAAM,OAAO,eAAe;IAQf;IACD;IARD,KAAK,CAAe;IACrB,QAAQ,CAAqB;IAC7B,QAAQ,CAAgB;IACxB,iBAAiB,CAAsB;IACvC,MAAM,GAAG,KAAK,CAAA;IACtB,YACE,OAA0B,EACjB,OAAwB,EACzB,MAAyC,EACjD,WAAW,GAAG,IAAI;QAFT,YAAO,GAAP,OAAO,CAAiB;QACzB,WAAM,GAAN,MAAM,CAAmC;QAGjD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE;aAC3B,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;aACxD,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,IAAI,CAAC,QAAQ,GAAG,KAAK,IAAI,SAAS,CAAA;QACpC,CAAC,CAAC;aACD,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACrB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACxB,oEAAoE;YACpE,6DAA6D;YAC7D,IAAI,CAAC,iBAAiB,GAAG,KAAK,IAAI,EAAE;gBAClC,IAAI,CAAC,WAAW;oBAAE,MAAM,KAAK,CAAA;gBAC7B,IAAI,CAAC,QAAQ;oBACX,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC3D,SAAS,CAAA;YACb,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACN,CAAC;IAED,IAAI;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,MAA6B;QACjC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAA;YACpC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;YAClC,OAAO,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,CAAC,OAAuB;QAC5B,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAuB;QAC5C,MAAM,IAAI,CAAC,KAAK,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,uBAAuB;IAQjB;IACA;IACA;IATV,sDAAsD;IAC7C,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,QAAQ,CAAqB;IAC7B,QAAQ,CAAgB;IACxB,QAAQ,CAAgB;IAEhC,YACU,OAA0B,EAC1B,OAAwB,EACxB,MAAyC;QAFzC,YAAO,GAAP,OAAO,CAAmB;QAC1B,YAAO,GAAP,OAAO,CAAiB;QACxB,WAAM,GAAN,MAAM,CAAmC;IAChD,CAAC;IAEJ,KAAK,CAAC,MAA6B;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IACE,MAAM,CAAC,IAAI,KAAK,OAAO;gBACvB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB;gBACtC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,KAAK,YAAY;gBACxD,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,KAAK,EAAE;gBAE/C,OAAM;YACR,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE;iBAC9B,IAAI,CAAC,GAAG,EAAE,CACT,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAC7D;iBACA,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAA;YACvC,CAAC,CAAC;iBACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,CAAC,OAAuB;QAC5B,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAuB;QAC5C,MAAM,IAAI,CAAC,QAAQ,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;CACF;AAoCD,oFAAoF;AACpF,MAAM,OAAO,WAAW;IAKF;IAJX,MAAM,GAAG,IAAI,GAAG,EAAe,CAAA;IAC/B,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAA;IACpC,gBAAgB,GAAG,IAAI,OAAO,EAAsC,CAAA;IAE7E,YAAoB,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEhD,OAAO,CACL,EAAU,EACV,WAAmB,EACnB,GAAoB,EACpB,WAA0B,OAAO,CAAC,OAAO,EAAE;QAE3C,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO;YAChE,OAAO,KAAK,IAAI,EAAE,CAAC,KAAK,CAAA;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7B,IACE,OAAO;YACP,CAAC,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAE7D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAChC,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,IAAI,QAAmC,CAAA;QACvC,IAAI,IAA+B,CAAA;QACnC,MAAM,KAAK,GAAG,CAAC,MAAwB,EAAiB,EAAE;YACxD,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO;gBAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;YAC9C,MAAM,MAAM,GACV,MAAM,KAAK,MAAM;gBACf,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC;gBAChD,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;YACzE,OAAO,MAAM;iBACV,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBAChB,QAAQ,GAAG,OAAO,CAAA;YACpB,CAAC,CAAC;iBACD,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACrB,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;gBACzD,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;;oBAE7D,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE;wBAC/B,IAAI,EAAE,eAAe;wBACrB,OAAO,EAAE,WAAW;wBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,KAAK;wBACL,OAAO,EAAE,IAAI;qBACd,CAAC,CAAA;gBACJ,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACzD,IAAI,CAAC,OAAO;wBAAE,KAAK,CAAC,IAAI,EAAE,CAAA;oBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;gBACtD,CAAC,CAAC,CACH,CAAA;gBACD,QAAQ,GAAG,IAAI,CAAA;YACjB,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACZ,IAAI,GAAG,CAAC,OAAO;oBAAE,QAAQ,GAAG,IAAI,CAAA;YAClC,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QACD,uGAAuG;QACvG,IACE,GAAG;YACH,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;YACpB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;YACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YACnB,OAAO,EACP,CAAC;YACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACvD,KAAK,CAAC,OAAO,CAAC,CACf,CAAA;gBACD,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACzB,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;gBAChD,IAAI,GAAG,KAAK,CAAC,KAAK;qBACf,IAAI,CAAC,GAAG,EAAE,CACT,KAAK,CAAC,KAAK,CAAC;oBACV,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,GAAG;oBACZ,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;oBAC3B,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;wBACjB,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;4BAAE,OAAO,KAAK,CAAA;wBAChD,MAAM,GAAG,IAAI,CAAA;wBACb,IAAI,MAAM,KAAK,OAAO;4BAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;wBAChD,OAAO,IAAI,CAAA;oBACb,CAAC;oBACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC;iBAC9D,CAAC,CACH;qBACA,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CACtB,IAAI,WAAW,kCAAkC,YAAY,CAAC,KAAK,CAAC,EAAE,CACvE,CACF,CAAA;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,IAAI,EAAE;YAChB,MAAM,IAAI,CAAA;YACV,MAAM,QAAQ,CAAA;YACd,OAAO,QAAQ,CAAA;QACjB,CAAC,CAAA;IACH,CAAC;IAED,SAAS,CAAC,GAAe;QACvB,OAAO,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACvB,CAAC,GAAG,CAAC,OAAO;YACZ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;YAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG;YAC9B,GAAG,CAAC,OAAO,CAAC,SAAS,CACtB,CAAA;IACH,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7B,IACE,CAAC,GAAG;YACJ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,GAAG,CAAC,OAAO;YACX,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;YAE3B,OAAO,KAAK,CAAA;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,GAAe;QACnC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;QAClB,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACpB,sFAAsF;QACtF,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;QACxB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;SAClD,CAAC,CAAA;IACJ,CAAC;IAED,uEAAuE;IAC/D,KAAK,CAAC,cAAc,CAC1B,OAA0B,EAC1B,GAAoB,EACpB,GAAe,EACf,MAAwB;QAExB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACvB,IAAI,CAAC,GAAG,CAAC,KAAK;gBACZ,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CACtB,GAAG,CAAC,OAAO,EACX,OAAO,CAAC,IAAI,EACZ,GAAG,EACH,0BAA0B,CAC3B,CAAA;YACH,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;iBACnC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBAC9C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAC3C,CAAA;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QACrD,IAAI,GAAG,CAAC,KAAK;YAAE,GAAG,CAAC,UAAU,GAAG,KAAK,CAAA;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc;YACrC,CAAC,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;YAChD,CAAC,CAAC,GAAG,CAAA;QACP,4EAA4E;QAC5E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CACjC,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACrC,CAAA;YACD,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAChE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAA;YAC9B,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACjE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;QAC1B,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE;YAC/B,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAC3D,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;YACtC,MAAM,EAAE,SAAS;YACjB,iBAAiB,EAAE,OAAO;YAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;SAC5B,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,WAAW,CACT,OAA0B,EAC1B,GAAoB,EACpB,WAAW,GAAG,IAAI;QAElB,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QAC1B,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG;gBACP,IAAI,eAAe,CACjB,OAAO,EACP,GAAG,EACH,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EACvD,WAAW,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,OAAO,CAClD;aACF,CAAA;YACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,WAAmB,EACnB,GAAoB,EACpB,KAAc;QAEd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAC/B,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAChE,CAAA;QACD,OAAO;YACL,mBAAmB,CAAC,OAAO,EAAE;gBAC3B,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,WAAW;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK;gBACL,OAAO,EAAE,KAAK;aACf,CAAC,CAAA;QACJ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,WAAW,sBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,CAC3D,CAAA;QACD,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,aAAa;YAAE,OAAM;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;gBAC5C,GAAG,GAAG;gBACN,WAAW,EAAE,GAAG,CAAC,QAAQ;gBACzB,IAAI,EAAE,kCAAkC,YAAY,CAAC,KAAK,CAAC,+CAA+C;aAC3G,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,WAAW,uCAAuC,YAAY,CAAC,SAAS,CAAC,EAAE,CAChF,CAAA;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAU,EACV,WAAmB,EACnB,OAAsC,EACtC,GAAoB,EACpB,OAAoB,EACpB,MAAyB,EACzB,KAAsB;QAEtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACxB,MAAM,GAAG,GAAe;YACtB,GAAG,EAAE,EAAE;YACP,OAAO;YACP,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,IAAI,eAAe,EAAE;YAC/B,OAAO,EAAE,KAAK;YACd,MAAM;SACP,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QACtB,IAAI,qBAAqB,GAAG,KAAK,CAAA;QACjC,MAAM,MAAM,GAAG,KAAK,EAAE,KAAc,EAAE,EAAE;YACtC,IAAI,qBAAqB;gBAAE,OAAM;YACjC,qBAAqB,GAAG,IAAI,CAAA;YAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QACnD,CAAC,CAAA;QACD,MAAM,QAAQ,GACZ,OAAO,IAAI,GAAG,CAAC,OAAO;YACpB,CAAC,CAAC,IAAI,uBAAuB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;YACnD,CAAC,CAAC,OAAO;gBACP,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;oBAC9C,IAAI,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACnD,CAAC,CAAC,SAAS,CAAA;QACjB,MAAM,QAAQ,EAAE,KAAK,CAAA;QACrB,MAAM,OAAO,GAAoB,EAAE,CAAA;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;gBACxD,IAAI,MAAM;oBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;YACjE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAC7B,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;gBAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAC1D,CAAC,CAAC,CAAA;QACF,IAAI,OAAO,GAAmB,MAAM,CAAA;QACpC,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,eAAe,GAAG,KAAK,CAAA;QAC3B,IAAI,aAAa,GAAG,KAAK,CAAA;QACzB,IAAI,eAAe,GAAG,KAAK,CAAA;QAC3B,IAAI,WAAW,GAAG,KAAK,CAAA;QACvB,6FAA6F;QAC7F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC,KAAK,CAAC;wBACnB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE,GAAG;wBACZ,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;wBAC3B,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;4BACjB,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;gCAAE,OAAO,KAAK,CAAA;4BAC3D,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CACvD,CAAC,KAAK,EAAE,EAAE,CACR,mBAAmB,CAAC,OAAO,EAAE;gCAC3B,IAAI,EAAE,eAAe;gCACrB,OAAO,EAAE,WAAW;gCACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gCACtB,KAAK;gCACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC;6BAClD,CAAC,CACL,CAAA;4BACD,OAAO,IAAI,CAAA;wBACb,CAAC;qBACF,CAAC,CAAA;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAe,GAAG,IAAI,CAAA;oBACtB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CACtB,OAAO,EACP,WAAW,EACX,GAAG,EACH,yCAAyC,YAAY,CAAC,KAAK,CAAC,8CAA8C,CAC3G,CAAA;oBACD,MAAM,KAAK,CAAA;gBACb,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,OAAO;gBACb,MAAM,IAAI,YAAY,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAA;YAClE,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;YAC3C,IAAI,GAAG,CAAC,OAAO;gBACb,MAAM,IAAI,YAAY,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAA;YAClE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;YAC7C,aAAa,GAAG,IAAI,CAAA;YACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,WAAW,WAAW,GAAG,CAAC,SAAS,IAAI,GAAG,cAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CACvF,CAAA;YACD,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;YACzE,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;gBACtC,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC;oBACrD,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,QAAQ,CAAA;YACd,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAA;YACpD,eAAe,GAAG,aAAa,IAAI,OAAO,KAAK,QAAQ,CAAA;YACvD,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7C,IAAI,GAAG,CAAC,OAAO;oBACb,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,WAAW,gCAAgC,YAAY,CAAC,KAAK,CAAC,EAAE,CACrE,CAAA;;oBACE,MAAM,GAAG,gBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;YACrD,CAAC;YACD,mBAAmB,CAAC,OAAO,EAAE;gBAC3B,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,WAAW;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK;gBACL,OAAO,EAAE,OAAO,KAAK,SAAS;aAC/B,CAAC,CAAA;QACJ,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;YACb,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YACpB,MAAM,GAAG,CAAC,QAAQ,CAAA;YAClB,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC7B,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC5C,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YAC/C,IAAI,GAAG,CAAC,OAAO;gBAAE,MAAM,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QACD,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,GAAG,SAAS,CAAA;QACpC,IAAI,OAAO,KAAK,SAAS;YACvB,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAA;QACtD,IAAI,GAAG,CAAC,SAAS;YAAE,MAAM,GAAG,EAAE,CAAA;QAC9B,MAAM,SAAS,GACb,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;QAC1E,IAAI,CAAC,SAAS;YAAE,OAAO,GAAG,QAAQ,CAAA;QAClC,MAAM,QAAQ,EAAE,MAAM,CACpB,GAAG,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAClE,CAAA;QACD,+EAA+E;QAC/E,4EAA4E;QAC5E,IACE,CAAC,WAAW;YACZ,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC,CAAC,EACxD,CAAC;YACD,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CACjC,EAAE,EACF,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAChE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACvC,CACF,CAAA;YACD,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CACjC,EAAE,EACF,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YAC1C,0EAA0E;YAC1E,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAClD,CAAA;YACD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAA;AAC9D,CAAC;AAED,8DAA8D;AAC9D,SAAS,iBAAiB,CAAC,QAAwB;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC1C,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,CAAA;IACzC,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,OAAO,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACtD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC"}
@@ -0,0 +1,76 @@
1
+ import type { SessionOptions, VelaLogger, VelaSession } from '@glows777/vela-core/extension-api';
2
+ import { ChannelEvents } from './events.ts';
3
+ import { ChannelHandoff } from './handoff.ts';
4
+ import { ChannelRoutines } from './routines.ts';
5
+ import type { ChannelDefinition, IncomingMessage } from './types.ts';
6
+ interface GatewayOptions {
7
+ dataDir?: string;
8
+ /** Opens (or returns) a session by id; one shared session per channel and conversation */
9
+ session: (id: string, options?: SessionOptions) => VelaSession;
10
+ /** The open session with this id, without opening one */
11
+ find: (id: string) => VelaSession | undefined;
12
+ /** A channel session with no message for this long is closed; the next message resumes it. Default 10 minutes */
13
+ idleMs?: number;
14
+ logger?: VelaLogger;
15
+ eventDefaultTarget?: {
16
+ channel: string;
17
+ chatId: string;
18
+ };
19
+ }
20
+ export declare class ChannelGateway {
21
+ private options;
22
+ readonly routines: ChannelRoutines;
23
+ readonly events: ChannelEvents;
24
+ readonly handoff: ChannelHandoff;
25
+ private readonly directory;
26
+ private readonly recovery;
27
+ private readonly sessions;
28
+ private admitting;
29
+ private readonly commands;
30
+ private readonly usage;
31
+ private channels;
32
+ /** Channels whose `start()` reported a connection; `serve` refuses to idle when this is empty */
33
+ private started;
34
+ /** Messages are processed serially per session: the next message in a chat waits for the previous reply */
35
+ private queues;
36
+ private subscribed;
37
+ private saveFailures;
38
+ /** Idle sessions waiting to be closed, by session id */
39
+ private idleTimers;
40
+ /** Sessions being closed: a new message for the id waits until the close is done, then reopens it */
41
+ private closing;
42
+ private readonly admission;
43
+ private readonly feedback;
44
+ private stopped;
45
+ private readonly logger;
46
+ constructor(options: GatewayOptions);
47
+ /** Internal storage-success notification, including saves outside a channel prompt. */
48
+ sessionSaved(id: string): void;
49
+ private topics;
50
+ private find;
51
+ register(channel: ChannelDefinition): void;
52
+ startAll(toolNames?: readonly string[]): Promise<void>;
53
+ stopAll(): Promise<void>;
54
+ /** Handles one channel message; the returned Promise settles once the reply is sent (or fails). */
55
+ handleIncoming(channelName: string, msg: IncomingMessage): Promise<void>;
56
+ private admit;
57
+ private releaseQueue;
58
+ /**
59
+ * Channel sessions would otherwise stay open (and in memory) for as long as the process runs, one per
60
+ * conversation. Once a chat's queue is empty, the session is closed after `idleMs`; its history
61
+ * is saved, and the next message reopens and resumes it.
62
+ */
63
+ private closeWhenIdle;
64
+ private closeIdleSession;
65
+ private process;
66
+ private processRun;
67
+ private sendReply;
68
+ list(): Array<{
69
+ name: string;
70
+ description: string;
71
+ }>;
72
+ /** Channels whose last `start()` reported a connection (not `false`, and it did not throw) */
73
+ running(): string[];
74
+ }
75
+ export {};
76
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACZ,MAAM,mCAAmC,CAAA;AAQ1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAG7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAI/C,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,YAAY,CAAA;AAGnB,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0FAA0F;IAC1F,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,WAAW,CAAA;IAC9D,yDAAyD;IACzD,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAA;IAC7C,iHAAiH;IACjH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,kBAAkB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACzD;AAOD,qBAAa,cAAc;IA0Bb,OAAO,CAAC,OAAO;IAzB3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAuC;IACvD,iGAAiG;IACjG,OAAO,CAAC,OAAO,CAAoB;IACnC,2GAA2G;IAC3G,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,YAAY,CAA4B;IAChD,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAmD;IACrE,qGAAqG;IACrG,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEf,OAAO,EAAE,cAAc;IAiF3C,uFAAuF;IACvF,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK9B,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,IAAI;IAIZ,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAuEpC,QAAQ,CAAC,SAAS,GAAE,SAAS,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkE1D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC9B,mGAAmG;IACnG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DxE,OAAO,CAAC,KAAK;IA+Bb,OAAO,CAAC,YAAY;IAQpB;;;;OAIG;IACH,OAAO,CAAC,aAAa;YA8BP,gBAAgB;YAoBhB,OAAO;YA6BP,UAAU;YA0IV,SAAS;IAuCvB,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAOpD,8FAA8F;IAC9F,OAAO,IAAI,MAAM,EAAE;CAGpB"}