@nxisai/agent-harness 0.5.0 → 0.7.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 (78) hide show
  1. package/README.md +38 -4
  2. package/dist/handoff/a2a.d.ts +152 -0
  3. package/dist/handoff/a2a.d.ts.map +1 -0
  4. package/dist/handoff/a2a.js +227 -0
  5. package/dist/handoff/a2a.js.map +1 -0
  6. package/dist/handoff/controller.d.ts +181 -0
  7. package/dist/handoff/controller.d.ts.map +1 -0
  8. package/dist/handoff/controller.js +543 -0
  9. package/dist/handoff/controller.js.map +1 -0
  10. package/dist/handoff/envelope.d.ts +130 -0
  11. package/dist/handoff/envelope.d.ts.map +1 -0
  12. package/dist/handoff/envelope.js +178 -0
  13. package/dist/handoff/envelope.js.map +1 -0
  14. package/dist/handoff/index.d.ts +16 -0
  15. package/dist/handoff/index.d.ts.map +1 -0
  16. package/dist/handoff/index.js +12 -0
  17. package/dist/handoff/index.js.map +1 -0
  18. package/dist/handoff/tools.d.ts +36 -0
  19. package/dist/handoff/tools.d.ts.map +1 -0
  20. package/dist/handoff/tools.js +155 -0
  21. package/dist/handoff/tools.js.map +1 -0
  22. package/dist/harness/harness.d.ts +4 -2
  23. package/dist/harness/harness.d.ts.map +1 -1
  24. package/dist/harness/harness.js +53 -12
  25. package/dist/harness/harness.js.map +1 -1
  26. package/dist/harness/renderer.d.ts +20 -0
  27. package/dist/harness/renderer.d.ts.map +1 -1
  28. package/dist/harness/router/coordinator.d.ts +13 -0
  29. package/dist/harness/router/coordinator.d.ts.map +1 -1
  30. package/dist/harness/router/coordinator.js +7 -0
  31. package/dist/harness/router/coordinator.js.map +1 -1
  32. package/dist/harness/tools/action-tools.d.ts +29 -0
  33. package/dist/harness/tools/action-tools.d.ts.map +1 -1
  34. package/dist/harness/tools/action-tools.js +64 -4
  35. package/dist/harness/tools/action-tools.js.map +1 -1
  36. package/dist/harness/tools/discovery.d.ts +12 -1
  37. package/dist/harness/tools/discovery.d.ts.map +1 -1
  38. package/dist/harness/tools/discovery.js +19 -1
  39. package/dist/harness/tools/discovery.js.map +1 -1
  40. package/dist/harness/tools/site-actions.d.ts +27 -0
  41. package/dist/harness/tools/site-actions.d.ts.map +1 -1
  42. package/dist/harness/tools/site-actions.js +47 -0
  43. package/dist/harness/tools/site-actions.js.map +1 -1
  44. package/dist/harness/tools/source.d.ts.map +1 -1
  45. package/dist/harness/tools/source.js +5 -2
  46. package/dist/harness/tools/source.js.map +1 -1
  47. package/dist/index.d.ts +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/ui/action-card.d.ts +141 -0
  52. package/dist/ui/action-card.d.ts.map +1 -0
  53. package/dist/ui/action-card.js +384 -0
  54. package/dist/ui/action-card.js.map +1 -0
  55. package/dist/ui/agent-fullscreen.d.ts.map +1 -1
  56. package/dist/ui/agent-fullscreen.js +795 -17
  57. package/dist/ui/agent-fullscreen.js.map +1 -1
  58. package/dist/ui/tailwind.generated.d.ts +1 -1
  59. package/dist/ui/tailwind.generated.d.ts.map +1 -1
  60. package/dist/ui/tailwind.generated.js +1 -1
  61. package/dist/ui/tailwind.generated.js.map +1 -1
  62. package/package.json +1 -1
  63. package/src/handoff/a2a.ts +326 -0
  64. package/src/handoff/controller.ts +661 -0
  65. package/src/handoff/envelope.ts +216 -0
  66. package/src/handoff/index.ts +53 -0
  67. package/src/handoff/tools.ts +182 -0
  68. package/src/harness/harness.ts +55 -14
  69. package/src/harness/renderer.ts +22 -0
  70. package/src/harness/router/coordinator.ts +21 -0
  71. package/src/harness/tools/action-tools.ts +74 -4
  72. package/src/harness/tools/discovery.ts +20 -2
  73. package/src/harness/tools/site-actions.ts +58 -0
  74. package/src/harness/tools/source.ts +5 -2
  75. package/src/index.ts +4 -1
  76. package/src/ui/action-card.ts +496 -0
  77. package/src/ui/agent-fullscreen.ts +842 -16
  78. package/src/ui/tailwind.generated.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/handoff/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,543 @@
1
+ /**
2
+ * Runs handoffs: one per conversation, to an agent or a person, over A2A
3
+ * through the site's relay.
4
+ *
5
+ * The controller is headless. It starts a handoff, sends what the visitor types
6
+ * while one is open, ends it, and turns what the target sends back into
7
+ * {@link HandoffEvent}s, dispatched as `handoff` events. A UI renders those; the
8
+ * packaged element does.
9
+ *
10
+ * A handoff outlives the page it started on. Its task id, and the key the
11
+ * relay tied it to, are kept per conversation in `localStorage`, and
12
+ * {@link HandoffController.resume} picks it up on the next page. A stream the
13
+ * host cuts off mid-handoff is picked up the same way, after a short wait.
14
+ *
15
+ * @module
16
+ */
17
+ import { A2AClient, A2AError, } from './a2a.js';
18
+ import { HANDOFF_EXTENSION, envelopeMessage, readHandBack, readOperator, readQueue, readableText, visitorMessage, } from './envelope.js';
19
+ /** Whether a handoff in this state is over. */
20
+ export const isHandoffOver = (state) => state === 'handed-back' || state === 'ended' || state === 'failed';
21
+ const STORAGE_KEY = 'nxis:handoffs:v1';
22
+ /** A finished handoff is kept a day, so its hand-back survives a reload; an open one a month. */
23
+ const KEEP_FINISHED_MS = 24 * 60 * 60 * 1000;
24
+ const KEEP_OPEN_MS = 30 * 24 * 60 * 60 * 1000;
25
+ const TARGETS_TTL_MS = 30 * 1000;
26
+ const MAX_SEEN = 200;
27
+ const MAX_RESUME_DELAY_MS = 15000;
28
+ /** The response header a relay ties a task to this browser with. */
29
+ export const HANDOFF_KEY_HEADER = 'Nxis-Handoff-Key';
30
+ function defaultStorage() {
31
+ try {
32
+ return typeof localStorage === 'undefined' ? null : localStorage;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ /** A failure in words a visitor can read. */
39
+ function describeFailure(err, label) {
40
+ if (err instanceof A2AError) {
41
+ if (err.status === 429) {
42
+ return `${label} is busy right now.${err.retryAfter ? ` Try again in about ${Math.ceil(err.retryAfter / 60)} minute(s).` : ''}`;
43
+ }
44
+ if (err.status === 404)
45
+ return `${label} isn't available on this site.`;
46
+ if (err.status === 403)
47
+ return `This conversation can't reach ${label} from here.`;
48
+ }
49
+ return `I couldn't reach ${label}.`;
50
+ }
51
+ /** Runs handoffs for every conversation on the page. Dispatches `handoff` events. */
52
+ export class HandoffController extends EventTarget {
53
+ constructor(opts) {
54
+ super();
55
+ this.opts = opts;
56
+ this.sessions = new Map();
57
+ /** The stream open for each conversation, so a new one can close it first. */
58
+ this.live = new Map();
59
+ /** Consecutive resumes that brought nothing, per conversation, for backoff. */
60
+ this.idle = new Map();
61
+ this.timers = new Map();
62
+ this.targetsCache = null;
63
+ /** Events reported so far, so a stream can tell whether it brought anything new. */
64
+ this.reported = 0;
65
+ this.loaded = false;
66
+ this.storage = opts.storage === undefined ? defaultStorage() : opts.storage;
67
+ }
68
+ /** The page's target config. */
69
+ get config() {
70
+ return { relay: this.opts.relay, targets: this.opts.targets };
71
+ }
72
+ /**
73
+ * The targets that can be offered: those both in the page's config and on
74
+ * the relay's list, with the relay's availability.
75
+ *
76
+ * Cached for thirty seconds. A relay that can't be reached offers none.
77
+ */
78
+ targets() {
79
+ const now = this.now();
80
+ if (this.targetsCache && now - this.targetsCache.at < TARGETS_TTL_MS)
81
+ return this.targetsCache.list;
82
+ const list = this.fetchTargets().catch((err) => {
83
+ console.warn('[nxis-handoff] could not read the relay:', err);
84
+ this.targetsCache = null;
85
+ return [];
86
+ });
87
+ this.targetsCache = { at: now, list };
88
+ return list;
89
+ }
90
+ async fetchTargets() {
91
+ const doFetch = this.opts.fetchImpl ?? fetch;
92
+ const res = await doFetch(this.opts.relay, { headers: { Accept: 'application/json' }, credentials: 'same-origin' });
93
+ if (!res.ok)
94
+ throw new Error(`GET ${this.opts.relay} → ${res.status}`);
95
+ const body = (await res.json());
96
+ const out = [];
97
+ for (const t of body.targets ?? []) {
98
+ const name = String(t.name ?? '');
99
+ const mine = this.opts.targets[name];
100
+ // The page decides what is offered and how it is named; the relay decides what is reachable.
101
+ if (!mine)
102
+ continue;
103
+ out.push({
104
+ name,
105
+ kind: mine.kind,
106
+ label: mine.label,
107
+ description: mine.description ?? t.description,
108
+ available: t.available !== false,
109
+ hours: t.hours,
110
+ queueLength: t.queueLength,
111
+ waitMinutes: t.waitMinutes ?? null,
112
+ transcript: t.transcript === true,
113
+ });
114
+ }
115
+ return out;
116
+ }
117
+ /** A conversation's handoff, open or finished, if it has one. */
118
+ session(conversationId) {
119
+ this.load();
120
+ return this.sessions.get(conversationId) ?? null;
121
+ }
122
+ /** A conversation's handoff while it is open, else null. */
123
+ active(conversationId) {
124
+ if (!conversationId)
125
+ return null;
126
+ const s = this.session(conversationId);
127
+ return s && !isHandoffOver(s.state) ? s : null;
128
+ }
129
+ /**
130
+ * Hand a conversation to a target.
131
+ *
132
+ * Resolves once the relay has accepted it; what the target says arrives as
133
+ * events. Call only after the visitor has confirmed what is being sent.
134
+ *
135
+ * @throws When the target is not configured, the conversation is already
136
+ * handed off, or the relay refuses. The session is marked failed first.
137
+ */
138
+ async start(conversationId, target, envelope) {
139
+ const config = this.opts.targets[target];
140
+ if (!config)
141
+ throw new Error(`"${target}" is not a handoff target on this page.`);
142
+ if (this.active(conversationId))
143
+ throw new Error('This conversation is already handed off.');
144
+ const now = this.now();
145
+ const session = {
146
+ conversationId,
147
+ target,
148
+ label: config.label,
149
+ kind: config.kind,
150
+ state: 'connecting',
151
+ startedAt: now,
152
+ updatedAt: now,
153
+ seen: [],
154
+ };
155
+ this.sessions.set(conversationId, session);
156
+ this.setState(session, 'connecting');
157
+ const message = envelopeMessage(envelope);
158
+ session.seen.push(message.messageId);
159
+ let stream;
160
+ const abort = this.openLive(conversationId);
161
+ try {
162
+ stream = await this.client(target).stream('SendStreamingMessage', { message, configuration: { acceptedOutputModes: ['text/plain', 'application/json'] } }, { signal: abort.signal });
163
+ }
164
+ catch (err) {
165
+ this.live.delete(conversationId);
166
+ session.error = describeFailure(err, config.label);
167
+ this.setState(session, 'failed');
168
+ throw err;
169
+ }
170
+ const key = stream.headers.get(HANDOFF_KEY_HEADER);
171
+ if (key)
172
+ session.key = key;
173
+ this.save();
174
+ void this.pump(session, stream, abort);
175
+ return session;
176
+ }
177
+ /**
178
+ * Send what the visitor typed to the target handling this conversation.
179
+ *
180
+ * @throws When nothing is handed off, or the target hasn't answered yet.
181
+ */
182
+ async send(conversationId, text) {
183
+ const session = this.active(conversationId);
184
+ if (!session)
185
+ throw new Error('This conversation is not handed off.');
186
+ if (!session.taskId && !session.contextId)
187
+ throw new Error(`Still connecting to ${session.label}.`);
188
+ const message = visitorMessage(text, { taskId: session.taskId, contextId: session.contextId });
189
+ this.remember(session, message.messageId);
190
+ const abort = this.openLive(conversationId);
191
+ try {
192
+ const stream = await this.client(session.target).stream('SendStreamingMessage', { message, configuration: { acceptedOutputModes: ['text/plain', 'application/json'] } }, { signal: abort.signal, headers: this.keyHeader(session) });
193
+ void this.pump(session, stream, abort);
194
+ }
195
+ catch (err) {
196
+ if (abort.signal.aborted)
197
+ return;
198
+ this.live.delete(conversationId);
199
+ session.error = describeFailure(err, session.label);
200
+ this.setState(session, 'failed');
201
+ throw err;
202
+ }
203
+ }
204
+ /**
205
+ * End a handoff at the visitor's request: "Back to the assistant".
206
+ *
207
+ * Cancels the task at the target. A target that won't cancel still loses the
208
+ * visitor: the handoff is ended here either way.
209
+ */
210
+ async end(conversationId) {
211
+ const session = this.active(conversationId);
212
+ if (!session)
213
+ return;
214
+ this.closeLive(conversationId);
215
+ if (session.taskId) {
216
+ try {
217
+ await this.client(session.target).call('CancelTask', { id: session.taskId }, { headers: this.keyHeader(session) });
218
+ }
219
+ catch {
220
+ // Already finished, or unreachable: the visitor has left it regardless.
221
+ }
222
+ }
223
+ this.setState(session, 'ended');
224
+ }
225
+ /**
226
+ * Pick up an open handoff after a page change or reload.
227
+ *
228
+ * Subscribes to the task while it runs, or reads it once when it is waiting
229
+ * on the visitor. Safe to call for any conversation, at any time: it does
230
+ * nothing when there is no open handoff or a stream is already open.
231
+ */
232
+ async resume(conversationId) {
233
+ const session = this.active(conversationId);
234
+ if (!session || this.live.has(conversationId))
235
+ return;
236
+ if (!session.taskId) {
237
+ // It never got as far as a task: the page left before the target answered.
238
+ session.error = `The connection to ${session.label} was lost before it started.`;
239
+ this.setState(session, 'failed');
240
+ return;
241
+ }
242
+ // An agent waiting on the visitor has nothing more to say until they answer. A person might.
243
+ if (session.state === 'awaiting-visitor' && session.kind === 'agent') {
244
+ await this.readOnce(session);
245
+ return;
246
+ }
247
+ const abort = this.openLive(conversationId);
248
+ try {
249
+ const stream = await this.client(session.target).stream('SubscribeToTask', { id: session.taskId }, { signal: abort.signal, headers: this.keyHeader(session) });
250
+ void this.pump(session, stream, abort);
251
+ }
252
+ catch (err) {
253
+ this.live.delete(conversationId);
254
+ if (abort.signal.aborted)
255
+ return;
256
+ if (err instanceof A2AError && (err.status === 403 || err.status === 404)) {
257
+ session.error = `The conversation with ${session.label} has expired.`;
258
+ this.setState(session, 'failed');
259
+ return;
260
+ }
261
+ // Finished while we were away (subscribing to a finished task is refused), or a blip.
262
+ await this.readOnce(session);
263
+ }
264
+ }
265
+ /** Stop every stream and pending resume. The sessions stay saved for the next page. */
266
+ dispose() {
267
+ for (const id of [...this.live.keys()])
268
+ this.closeLive(id);
269
+ for (const t of this.timers.values())
270
+ clearTimeout(t);
271
+ this.timers.clear();
272
+ }
273
+ // ── Streams ────────────────────────────────────────────────────────────────
274
+ client(target) {
275
+ const relay = this.opts.relay.replace(/\/+$/, '');
276
+ return new A2AClient({
277
+ endpoint: `${relay}/${encodeURIComponent(target)}`,
278
+ extensions: [HANDOFF_EXTENSION],
279
+ fetchImpl: this.opts.fetchImpl,
280
+ });
281
+ }
282
+ keyHeader(session) {
283
+ return session.key ? { [HANDOFF_KEY_HEADER]: session.key } : {};
284
+ }
285
+ /** A fresh abort signal for a conversation's stream, closing the one before it. */
286
+ openLive(conversationId) {
287
+ this.closeLive(conversationId);
288
+ const abort = new AbortController();
289
+ this.live.set(conversationId, abort);
290
+ return abort;
291
+ }
292
+ closeLive(conversationId) {
293
+ this.live.get(conversationId)?.abort();
294
+ this.live.delete(conversationId);
295
+ const timer = this.timers.get(conversationId);
296
+ if (timer)
297
+ clearTimeout(timer);
298
+ this.timers.delete(conversationId);
299
+ }
300
+ /** Read a stream to its end, then resume it if the task is still running. */
301
+ async pump(session, stream, abort) {
302
+ const id = session.conversationId;
303
+ // Progress is what the visitor would notice: a new message, a new state. A resubscribe that only
304
+ // repeats the task as it stood is not progress, and must back off like an empty one.
305
+ const before = this.reported;
306
+ try {
307
+ for await (const event of stream.events) {
308
+ if (abort.signal.aborted)
309
+ return;
310
+ this.apply(session, event);
311
+ }
312
+ }
313
+ catch (err) {
314
+ if (abort.signal.aborted)
315
+ return;
316
+ console.warn(`[nxis-handoff] stream from ${session.label} broke:`, err);
317
+ }
318
+ if (abort.signal.aborted)
319
+ return;
320
+ if (this.live.get(id) === abort)
321
+ this.live.delete(id);
322
+ if (isHandoffOver(session.state))
323
+ return;
324
+ // Waiting on the visitor: their next message opens the next stream.
325
+ if (session.state === 'awaiting-visitor' && session.kind === 'agent')
326
+ return;
327
+ // The stream ended with the task still running: the host cut it off. Come back for the rest.
328
+ const quiet = this.reported > before ? 0 : (this.idle.get(id) ?? 0) + 1;
329
+ this.idle.set(id, quiet);
330
+ const base = this.opts.resumeDelayMs ?? 1000;
331
+ const delay = Math.min(base * 2 ** Math.max(0, quiet - 1), MAX_RESUME_DELAY_MS);
332
+ this.timers.set(id, setTimeout(() => {
333
+ this.timers.delete(id);
334
+ void this.resume(id);
335
+ }, delay));
336
+ }
337
+ /** Read a task once, for a handoff that can't or needn't be streamed. */
338
+ async readOnce(session) {
339
+ if (!session.taskId)
340
+ return;
341
+ try {
342
+ const { result } = await this.client(session.target).call('GetTask', { id: session.taskId, historyLength: 50 }, { headers: this.keyHeader(session) });
343
+ const task = result.task ?? result;
344
+ this.apply(session, { task });
345
+ }
346
+ catch (err) {
347
+ session.error =
348
+ err instanceof A2AError && (err.status === 403 || err.status === 404)
349
+ ? `The conversation with ${session.label} has expired.`
350
+ : describeFailure(err, session.label);
351
+ this.setState(session, 'failed');
352
+ }
353
+ }
354
+ // ── Events ─────────────────────────────────────────────────────────────────
355
+ apply(session, event) {
356
+ if (event.task) {
357
+ const task = event.task;
358
+ this.adopt(session, task.id, task.contextId);
359
+ for (const message of task.history ?? [])
360
+ this.message(session, message);
361
+ for (const artifact of task.artifacts ?? [])
362
+ this.parts(session, artifact.parts, artifact.artifactId);
363
+ this.status(session, task.status);
364
+ }
365
+ else if (event.statusUpdate) {
366
+ this.adopt(session, event.statusUpdate.taskId, event.statusUpdate.contextId);
367
+ this.status(session, event.statusUpdate.status);
368
+ }
369
+ else if (event.artifactUpdate) {
370
+ this.adopt(session, event.artifactUpdate.taskId, event.artifactUpdate.contextId);
371
+ const a = event.artifactUpdate.artifact;
372
+ this.parts(session, a.parts, a.artifactId);
373
+ }
374
+ else if (event.message) {
375
+ // A reply with no task: the target answered at once. The context carries the conversation on.
376
+ this.adopt(session, event.message.taskId, event.message.contextId);
377
+ this.message(session, event.message);
378
+ if (session.state === 'connecting' || session.state === 'queued')
379
+ this.setState(session, 'active');
380
+ }
381
+ }
382
+ adopt(session, taskId, contextId) {
383
+ let changed = false;
384
+ if (taskId && session.taskId !== taskId) {
385
+ session.taskId = taskId;
386
+ changed = true;
387
+ }
388
+ if (contextId && session.contextId !== contextId) {
389
+ session.contextId = contextId;
390
+ changed = true;
391
+ }
392
+ if (changed)
393
+ this.save();
394
+ }
395
+ status(session, status) {
396
+ const queue = readQueue(status.message?.parts);
397
+ if (queue)
398
+ session.queue = queue;
399
+ // Who is speaking is known before what they say, so "Sam has joined" comes first.
400
+ const operator = readOperator(status.message?.parts);
401
+ if (operator)
402
+ session.operator = operator.name;
403
+ // A hand-back is read before the state is decided: it is what makes COMPLETED "handed back".
404
+ const handBack = readHandBack(status.message?.parts);
405
+ const next = handBack && status.state === 'TASK_STATE_COMPLETED' ? 'handed-back' : this.stateFor(status.state, session);
406
+ const changed = !!next && (next !== session.state || !!queue);
407
+ // A state that continues the conversation is announced before the message that comes with it;
408
+ // one that ends it after the last word.
409
+ if (changed && !isHandoffOver(next))
410
+ this.setState(session, next);
411
+ if (status.message)
412
+ this.message(session, status.message);
413
+ if (!next)
414
+ return;
415
+ if (changed && isHandoffOver(next))
416
+ this.setState(session, next);
417
+ if (isHandoffOver(next))
418
+ this.closeLive(session.conversationId);
419
+ }
420
+ stateFor(state, session) {
421
+ switch (state) {
422
+ case 'TASK_STATE_SUBMITTED':
423
+ return session.kind === 'person' ? 'queued' : 'connecting';
424
+ case 'TASK_STATE_WORKING':
425
+ return 'active';
426
+ case 'TASK_STATE_INPUT_REQUIRED':
427
+ return 'awaiting-visitor';
428
+ case 'TASK_STATE_COMPLETED':
429
+ return session.handBack ? 'handed-back' : 'ended';
430
+ case 'TASK_STATE_CANCELED':
431
+ return 'ended';
432
+ case 'TASK_STATE_AUTH_REQUIRED':
433
+ session.error = `${session.label} needs you to sign in, which isn't supported here yet.`;
434
+ return 'failed';
435
+ case 'TASK_STATE_FAILED':
436
+ case 'TASK_STATE_REJECTED':
437
+ session.error ?? (session.error = `${session.label} couldn't take this conversation.`);
438
+ return 'failed';
439
+ default:
440
+ return null;
441
+ }
442
+ }
443
+ /** One message from the target: who is speaking, a hand-back, and the words. */
444
+ message(session, message) {
445
+ if (message.role === 'ROLE_USER') {
446
+ this.remember(session, message.messageId);
447
+ return;
448
+ }
449
+ if (message.messageId && session.seen.includes(message.messageId))
450
+ return;
451
+ this.remember(session, message.messageId);
452
+ this.parts(session, message.parts);
453
+ }
454
+ parts(session, parts = [], artifactId) {
455
+ if (artifactId) {
456
+ const seenKey = `artifact:${artifactId}`;
457
+ if (session.seen.includes(seenKey))
458
+ return;
459
+ this.remember(session, seenKey);
460
+ }
461
+ const operator = readOperator(parts);
462
+ if (operator) {
463
+ session.operator = operator.name;
464
+ this.save();
465
+ }
466
+ const handBack = readHandBack(parts);
467
+ const text = readableText(parts);
468
+ // The last words first, then what they hand back: the references follow the goodbye.
469
+ if (text) {
470
+ this.emit({
471
+ type: 'message',
472
+ conversationId: session.conversationId,
473
+ session,
474
+ from: session.operator ?? session.label,
475
+ fromKind: operator?.kind ?? session.kind,
476
+ text,
477
+ });
478
+ }
479
+ if (handBack && !session.handBack) {
480
+ session.handBack = handBack;
481
+ this.save();
482
+ this.emit({ type: 'handback', conversationId: session.conversationId, session, handBack });
483
+ }
484
+ }
485
+ remember(session, id) {
486
+ if (!id || session.seen.includes(id))
487
+ return;
488
+ session.seen.push(id);
489
+ if (session.seen.length > MAX_SEEN)
490
+ session.seen.splice(0, session.seen.length - MAX_SEEN);
491
+ this.save();
492
+ }
493
+ setState(session, state) {
494
+ session.state = state;
495
+ session.updatedAt = this.now();
496
+ if (state !== 'queued')
497
+ delete session.queue;
498
+ if (isHandoffOver(state))
499
+ this.idle.delete(session.conversationId);
500
+ this.save();
501
+ this.emit({ type: 'state', conversationId: session.conversationId, session, state });
502
+ }
503
+ emit(detail) {
504
+ this.reported++;
505
+ this.dispatchEvent(new CustomEvent('handoff', { detail }));
506
+ }
507
+ // ── Storage ────────────────────────────────────────────────────────────────
508
+ now() {
509
+ return this.opts.now?.() ?? Date.now();
510
+ }
511
+ load() {
512
+ if (this.loaded)
513
+ return;
514
+ this.loaded = true;
515
+ if (!this.storage)
516
+ return;
517
+ try {
518
+ const raw = JSON.parse(this.storage.getItem(STORAGE_KEY) || '{}');
519
+ const now = this.now();
520
+ for (const [id, s] of Object.entries(raw)) {
521
+ const keep = isHandoffOver(s.state) ? KEEP_FINISHED_MS : KEEP_OPEN_MS;
522
+ if (s && typeof s.target === 'string' && now - (s.updatedAt ?? 0) < keep && !this.sessions.has(id)) {
523
+ this.sessions.set(id, { ...s, seen: Array.isArray(s.seen) ? s.seen : [] });
524
+ }
525
+ }
526
+ }
527
+ catch {
528
+ // Unreadable: start afresh.
529
+ }
530
+ }
531
+ save() {
532
+ if (!this.storage)
533
+ return;
534
+ this.load();
535
+ try {
536
+ this.storage.setItem(STORAGE_KEY, JSON.stringify(Object.fromEntries(this.sessions)));
537
+ }
538
+ catch {
539
+ // Full or blocked: the handoff still runs, it just won't survive a reload.
540
+ }
541
+ }
542
+ }
543
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/handoff/controller.ts"],"names":[],"mappings":"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"}