@trigger.dev/sdk 4.5.1 → 4.5.3

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 (68) hide show
  1. package/dist/commonjs/v3/ai-shared.d.ts +3 -127
  2. package/dist/commonjs/v3/ai-shared.js.map +1 -1
  3. package/dist/commonjs/v3/ai.js +66 -22
  4. package/dist/commonjs/v3/ai.js.map +1 -1
  5. package/dist/commonjs/v3/chat-react.d.ts +1 -0
  6. package/dist/commonjs/v3/chat-react.js +4 -1
  7. package/dist/commonjs/v3/chat-react.js.map +1 -1
  8. package/dist/commonjs/v3/chat.d.ts +204 -1
  9. package/dist/commonjs/v3/chat.js +203 -19
  10. package/dist/commonjs/v3/chat.js.map +1 -1
  11. package/dist/commonjs/v3/index.d.ts +1 -1
  12. package/dist/commonjs/v3/index.js.map +1 -1
  13. package/dist/commonjs/v3/runs-bulk.test.d.ts +1 -0
  14. package/dist/commonjs/v3/runs-bulk.test.js +141 -0
  15. package/dist/commonjs/v3/runs-bulk.test.js.map +1 -0
  16. package/dist/commonjs/v3/runs.d.ts +23 -6
  17. package/dist/commonjs/v3/runs.js +87 -0
  18. package/dist/commonjs/v3/runs.js.map +1 -1
  19. package/dist/commonjs/v3/sessions.js +5 -2
  20. package/dist/commonjs/v3/sessions.js.map +1 -1
  21. package/dist/commonjs/v3/shared.d.ts +2 -2
  22. package/dist/commonjs/v3/shared.js +79 -4
  23. package/dist/commonjs/v3/shared.js.map +1 -1
  24. package/dist/commonjs/v3/shared.test.js +37 -0
  25. package/dist/commonjs/v3/shared.test.js.map +1 -1
  26. package/dist/commonjs/version.js +1 -1
  27. package/dist/esm/v3/ai-shared.d.ts +3 -127
  28. package/dist/esm/v3/ai-shared.js.map +1 -1
  29. package/dist/esm/v3/ai.js +66 -22
  30. package/dist/esm/v3/ai.js.map +1 -1
  31. package/dist/esm/v3/chat-react.d.ts +1 -0
  32. package/dist/esm/v3/chat-react.js +4 -1
  33. package/dist/esm/v3/chat-react.js.map +1 -1
  34. package/dist/esm/v3/chat.d.ts +204 -1
  35. package/dist/esm/v3/chat.js +204 -20
  36. package/dist/esm/v3/chat.js.map +1 -1
  37. package/dist/esm/v3/index.d.ts +1 -1
  38. package/dist/esm/v3/index.js.map +1 -1
  39. package/dist/esm/v3/runs-bulk.test.d.ts +1 -0
  40. package/dist/esm/v3/runs-bulk.test.js +139 -0
  41. package/dist/esm/v3/runs-bulk.test.js.map +1 -0
  42. package/dist/esm/v3/runs.d.ts +18 -1
  43. package/dist/esm/v3/runs.js +87 -0
  44. package/dist/esm/v3/runs.js.map +1 -1
  45. package/dist/esm/v3/sessions.js +5 -2
  46. package/dist/esm/v3/sessions.js.map +1 -1
  47. package/dist/esm/v3/shared.d.ts +2 -2
  48. package/dist/esm/v3/shared.js +79 -5
  49. package/dist/esm/v3/shared.js.map +1 -1
  50. package/dist/esm/v3/shared.test.js +38 -1
  51. package/dist/esm/v3/shared.test.js.map +1 -1
  52. package/dist/esm/version.js +1 -1
  53. package/docs/ai-chat/frontend.mdx +46 -0
  54. package/docs/ai-chat/pending-messages.mdx +3 -1
  55. package/docs/ai-chat/reference.mdx +20 -0
  56. package/docs/billing-limits.mdx +73 -0
  57. package/docs/github-repo.mdx +1 -1
  58. package/docs/how-to-reduce-your-spend.mdx +1 -14
  59. package/docs/limits.mdx +5 -0
  60. package/docs/quick-start.mdx +1 -1
  61. package/docs/self-hosting/docker.mdx +24 -1
  62. package/docs/self-hosting/env/webapp.mdx +6 -1
  63. package/docs/self-hosting/kubernetes.mdx +26 -0
  64. package/docs/self-hosting/overview.mdx +4 -1
  65. package/docs/self-hosting/security.mdx +50 -0
  66. package/docs/troubleshooting.mdx +4 -0
  67. package/package.json +2 -2
  68. package/docs/open-source-self-hosting.mdx +0 -541
@@ -15,6 +15,7 @@ export type UseTriggerChatTransportOptions<TTask extends AnyTask = AnyTask> = Om
15
15
  task: TaskIdentifier<TTask>;
16
16
  };
17
17
  export type { InferChatUIMessage };
18
+ export type { ChatTransportEvent, ChatTransportSendSource } from "./chat.js";
18
19
  /**
19
20
  * React hook that creates and memoizes a `TriggerChatTransport` instance.
20
21
  *
@@ -60,10 +60,13 @@ export function useTriggerChatTransport(options) {
60
60
  ref.current = new TriggerChatTransport(options);
61
61
  }
62
62
  // Keep callbacks up to date without recreating the transport.
63
- const { onSessionChange, clientData } = options;
63
+ const { onSessionChange, clientData, onEvent } = options;
64
64
  useEffect(() => {
65
65
  ref.current?.setOnSessionChange(onSessionChange);
66
66
  }, [onSessionChange]);
67
+ useEffect(() => {
68
+ ref.current?.setOnEvent(onEvent);
69
+ }, [onEvent]);
67
70
  // Keep `clientData` up to date so the transport's per-turn merge and
68
71
  // `startSession` callback both see the latest value without
69
72
  // reconstructing the transport.
@@ -1 +1 @@
1
- {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,110 @@
22
22
  * }
23
23
  * ```
24
24
  */
25
- import type { ChatTransport, UIMessage, UIMessageChunk, ChatRequestOptions } from "ai";
25
+ import type { ChatTransport, ModelMessage, UIMessage, UIMessageChunk, ChatRequestOptions } from "ai";
26
+ /**
27
+ * The wire payload shape sent by `TriggerChatTransport`.
28
+ * Uses `metadata` to match the AI SDK's `ChatRequestOptions` field name.
29
+ *
30
+ * Slim wire: at most ONE message per record. The agent runtime
31
+ * reconstructs prior history at run boot from a durable S3 snapshot +
32
+ * `session.out` replay (or `hydrateMessages` if registered).
33
+ *
34
+ * Declared here (rather than the internal shared module) so `declaration:
35
+ * true` consumers can name inferred agent types via this public subpath.
36
+ */
37
+ export type ChatTaskWirePayload<TMessage extends UIMessage = UIMessage, TMetadata = unknown> = {
38
+ /**
39
+ * The single message being delivered on this trigger. Set for:
40
+ * - `submit-message`: the new user message OR a tool-approval-responded
41
+ * assistant message (with `state: "approval-responded"` tool parts).
42
+ * - `regenerate-message`: omitted (the agent slices its own history).
43
+ * - `preload` / `close` / `action`: omitted.
44
+ * - `handover-prepare`: omitted (use `headStartMessages` instead).
45
+ */
46
+ message?: TMessage;
47
+ /**
48
+ * Bespoke escape hatch for `chat.headStart`. The customer's HTTP route
49
+ * handler ships full `UIMessage[]` history at the very first turn — before
50
+ * any snapshot exists. The route handler isn't subject to the
51
+ * `MAX_APPEND_BODY_BYTES` cap on `/in/append` because it goes through the
52
+ * customer's own HTTP endpoint. Used ONLY by `trigger: "handover-prepare"`.
53
+ * Ignored on every other trigger.
54
+ */
55
+ headStartMessages?: TMessage[];
56
+ chatId: string;
57
+ trigger: "submit-message" | "regenerate-message" | "preload" | "close" | "action"
58
+ /**
59
+ * The customer's `chat.handover` route handler kicked us off in
60
+ * parallel with the first-turn `streamText` running in the warm
61
+ * Next.js process. The run sits idle on `session.in` waiting for
62
+ * a `kind: "handover"` (continue from tool execution) or
63
+ * `kind: "handover-skip"` (handler finished pure-text, exit
64
+ * cleanly). See `chat.handover` in `@trigger.dev/sdk/chat-server`.
65
+ */
66
+ | "handover-prepare";
67
+ messageId?: string;
68
+ metadata?: TMetadata;
69
+ /** Custom action payload when `trigger` is `"action"`. Validated against `actionSchema` on the backend. */
70
+ action?: unknown;
71
+ /** Whether this run is continuing an existing chat whose previous run ended. */
72
+ continuation?: boolean;
73
+ /** The run ID of the previous run (only set when `continuation` is true). */
74
+ previousRunId?: string;
75
+ /** Override idle timeout for this run (seconds). Set by transport.preload(). */
76
+ idleTimeoutInSeconds?: number;
77
+ /**
78
+ * The friendlyId of the Session primitive backing this chat. The
79
+ * transport opens (or lazy-creates) the session with
80
+ * `externalId = chatId` on first message, then sends this friendlyId
81
+ * through to the run so the agent can attach to `.in` / `.out`
82
+ * without needing to round-trip through the control plane again.
83
+ * Optional for backward-compat while the migration is in flight;
84
+ * required once the legacy run-scoped stream path is removed.
85
+ */
86
+ sessionId?: string;
87
+ };
88
+ /**
89
+ * One chunk on the chat input stream. `kind` discriminates the variants —
90
+ * a single ordered stream carries all the signals (`message`, `stop`,
91
+ * `handover`, `handover-skip`).
92
+ */
93
+ export type ChatInputChunk<TMessage extends UIMessage = UIMessage, TMetadata = unknown> = {
94
+ kind: "message";
95
+ /** Full wire payload for a new user message or regeneration. */
96
+ payload: ChatTaskWirePayload<TMessage, TMetadata>;
97
+ } | {
98
+ kind: "stop";
99
+ /** Optional human-readable reason. */
100
+ message?: string;
101
+ } | {
102
+ /**
103
+ * Sent by `chat.headStart` when the customer's first-turn
104
+ * `streamText` finishes. The agent run (parked in
105
+ * `handover-prepare`) wakes, seeds its accumulators with
106
+ * `partialAssistantMessage`, and runs the normal turn loop.
107
+ * `isFinal: false` means step 1 ended in tool-calls (the agent
108
+ * executes them and continues); `isFinal: true` means step 1 was
109
+ * the complete response (the agent skips the LLM call).
110
+ */
111
+ kind: "handover";
112
+ /** Customer's step-1 response messages (ModelMessage form). */
113
+ partialAssistantMessage: ModelMessage[];
114
+ /**
115
+ * The UI messageId the customer's handler used for its step-1
116
+ * assistant message, reused so post-handover chunks merge into
117
+ * the SAME assistant message on the browser side.
118
+ */
119
+ messageId?: string;
120
+ isFinal: boolean;
121
+ } | {
122
+ /**
123
+ * Sent by `chat.headStart` only when the customer's handler
124
+ * ABORTS before producing a finishReason. The agent run exits
125
+ * cleanly without firing turn hooks.
126
+ */
127
+ kind: "handover-skip";
128
+ };
26
129
  /**
27
130
  * Discriminator passed to per-endpoint `baseURL` and `fetch` callbacks.
28
131
  *
@@ -52,6 +155,81 @@ export type ChatBaseURLResolver = (ctx: ChatTransportEndpointContext) => string;
52
155
  * what `globalThis.fetch(url, init)` would have returned.
53
156
  */
54
157
  export type ChatFetchOverride = (url: string, init: RequestInit, ctx: ChatTransportEndpointContext) => Promise<Response>;
158
+ /**
159
+ * Which transport path produced a send-lifecycle event: `useChat` sends,
160
+ * steering (`sendPendingMessage`), actions, stops, or the first-turn
161
+ * `headStart` POST.
162
+ */
163
+ export type ChatTransportSendSource = "submit-message" | "regenerate-message" | "steer" | "action" | "stop" | "head-start";
164
+ /**
165
+ * Lifecycle events emitted through the transport's `onEvent` callback.
166
+ *
167
+ * Send events are terminal: `message-sent` fires when the append is
168
+ * durably acknowledged (2xx from the session input stream, after any
169
+ * internal token-refresh retries), `message-send-failed` when the send
170
+ * definitively failed. Response events follow the output stream:
171
+ * `stream-connected` when the SSE subscription opens, `first-chunk` on
172
+ * the first response chunk of a turn, `turn-completed` when the agent's
173
+ * turn-complete control record arrives, and `stream-error` when the
174
+ * stream fails unrecoverably.
175
+ */
176
+ export type ChatTransportEvent = {
177
+ type: "message-sent";
178
+ chatId: string;
179
+ timestamp: number;
180
+ messageId?: string;
181
+ source: ChatTransportSendSource;
182
+ durationMs: number;
183
+ /** The append's idempotency key — also stored on the server-side record. */
184
+ partId?: string;
185
+ /** Serialized request body size in bytes. */
186
+ bodyBytes?: number;
187
+ } | {
188
+ type: "message-send-failed";
189
+ chatId: string;
190
+ timestamp: number;
191
+ messageId?: string;
192
+ source: ChatTransportSendSource;
193
+ error: Error;
194
+ status?: number;
195
+ durationMs: number;
196
+ partId?: string;
197
+ bodyBytes?: number;
198
+ } | {
199
+ type: "stream-connected";
200
+ chatId: string;
201
+ timestamp: number;
202
+ resumed: boolean;
203
+ /** The resume cursor the subscription connected from, if any. */
204
+ lastEventId?: string;
205
+ /** The last turn-producing send on this chat (client-side attribution). */
206
+ messageId?: string;
207
+ } | {
208
+ type: "stream-error";
209
+ chatId: string;
210
+ timestamp: number;
211
+ error: Error;
212
+ status?: number;
213
+ } | {
214
+ type: "first-chunk";
215
+ chatId: string;
216
+ timestamp: number;
217
+ chunkType?: string;
218
+ lastEventId?: string;
219
+ messageId?: string;
220
+ /** Milliseconds since the last turn-producing send on this chat (time to first token). */
221
+ sinceSendMs?: number;
222
+ } | {
223
+ type: "turn-completed";
224
+ chatId: string;
225
+ timestamp: number;
226
+ lastEventId?: string;
227
+ /** The agent's committed input-stream cursor from the turn-complete record. */
228
+ sessionInEventId?: string;
229
+ messageId?: string;
230
+ /** Milliseconds since the last turn-producing send on this chat (full turn latency). */
231
+ sinceSendMs?: number;
232
+ };
55
233
  /**
56
234
  * Arguments for the `accessToken` callback. The transport invokes this
57
235
  * whenever it needs a fresh session-scoped PAT — initial use, and
@@ -204,6 +382,22 @@ export type TriggerChatTransportOptions<TClientData = unknown> = {
204
382
  * ```
205
383
  */
206
384
  fetch?: ChatFetchOverride;
385
+ /**
386
+ * Observability callback for transport lifecycle events (sends,
387
+ * stream connects, first chunk, turn completion). See
388
+ * {@link ChatTransportEvent} for the event catalog and semantics.
389
+ * Exceptions thrown by the callback are swallowed.
390
+ *
391
+ * @example Record send metrics:
392
+ * ```ts
393
+ * onEvent: (event) => {
394
+ * if (event.type === "message-sent") {
395
+ * metrics.timing("chat.send", event.durationMs);
396
+ * }
397
+ * },
398
+ * ```
399
+ */
400
+ onEvent?: (event: ChatTransportEvent) => void;
207
401
  /** Additional headers included in every API request. */
208
402
  headers?: Record<string, string>;
209
403
  /**
@@ -305,9 +499,11 @@ export declare class TriggerChatTransport implements ChatTransport<UIMessage> {
305
499
  private readonly headStart;
306
500
  private coordinator;
307
501
  private _onSessionChange;
502
+ private _onEvent;
308
503
  private sessions;
309
504
  private activeStreams;
310
505
  private pendingStarts;
506
+ private lastTurnSends;
311
507
  constructor(options: TriggerChatTransportOptions);
312
508
  /**
313
509
  * Eagerly create a Session and trigger its first run. Useful as a
@@ -382,6 +578,13 @@ export declare class TriggerChatTransport implements ChatTransport<UIMessage> {
382
578
  getSession: (chatId: string) => ChatSessionPersistedState | undefined;
383
579
  setSession(chatId: string, session: ChatSessionPersistedState): void;
384
580
  setOnSessionChange(callback: ((chatId: string, session: ChatSessionPersistedState | null) => void) | undefined): void;
581
+ /** Update the `onEvent` callback without recreating the transport. */
582
+ setOnEvent(callback: ((event: ChatTransportEvent) => void) | undefined): void;
583
+ private emitEvent;
584
+ /** Run a send op, emitting the terminal message-sent / message-send-failed event. */
585
+ private sendWithEvents;
586
+ /** Attribution fields for response-side events. */
587
+ private turnAttribution;
385
588
  /**
386
589
  * Update the transport's `clientData`. Used by `useTriggerChatTransport`
387
590
  * to keep the latest value reachable from inside `startSession` and
@@ -22,7 +22,10 @@
22
22
  * }
23
23
  * ```
24
24
  */
25
- import { controlSubtype, headerValue, PUBLIC_ACCESS_TOKEN_HEADER, SSEStreamSubscription, TRIGGER_CONTROL_SUBTYPE, } from "@trigger.dev/core/v3";
25
+ import { controlSubtype, headerValue, PUBLIC_ACCESS_TOKEN_HEADER, SESSION_IN_EVENT_ID_HEADER, SSEStreamSubscription, TRIGGER_CONTROL_SUBTYPE, } from "@trigger.dev/core/v3";
26
+ function byteLength(body) {
27
+ return new TextEncoder().encode(body).byteLength;
28
+ }
26
29
  import { ChatTabCoordinator } from "./chat-tab-coordinator.js";
27
30
  import { slimSubmitMessageForWire } from "./ai-shared.js";
28
31
  const DEFAULT_BASE_URL = "https://api.trigger.dev";
@@ -140,9 +143,13 @@ export class TriggerChatTransport {
140
143
  headStart;
141
144
  coordinator = null;
142
145
  _onSessionChange;
146
+ _onEvent;
143
147
  sessions = new Map();
144
148
  activeStreams = new Map();
145
149
  pendingStarts = new Map();
150
+ // Last turn-producing send per chat — attribution source for the
151
+ // response-side events' `messageId` / `sinceSendMs`.
152
+ lastTurnSends = new Map();
146
153
  constructor(options) {
147
154
  this.taskId = options.task;
148
155
  this.resolveAccessToken = options.accessToken;
@@ -158,6 +165,7 @@ export class TriggerChatTransport {
158
165
  this.streamTimeoutSeconds = options.streamTimeoutSeconds ?? DEFAULT_STREAM_TIMEOUT_SECONDS;
159
166
  this.defaultMetadata = options.clientData;
160
167
  this._onSessionChange = options.onSessionChange;
168
+ this._onEvent = options.onEvent;
161
169
  this.watchMode = options.watch ?? false;
162
170
  this.headStart = options.headStart;
163
171
  if (options.multiTab && !this.watchMode) {
@@ -282,10 +290,15 @@ export class TriggerChatTransport {
282
290
  // Generated outside the closure so auth-retries reuse the same part id
283
291
  // and the server-side dedupe sees one logical append.
284
292
  const partId = crypto.randomUUID();
293
+ const serializedBody = this.serializeInputChunk({ kind: "message", payload: wirePayload });
285
294
  const sendChatMessage = async (token) => {
286
- await this.appendInputChunk(chatId, token, this.serializeInputChunk({ kind: "message", payload: wirePayload }), partId);
295
+ await this.appendInputChunk(chatId, token, serializedBody, partId);
287
296
  };
288
- await this.callWithAuthRetry(chatId, state, sendChatMessage);
297
+ await this.sendWithEvents(chatId, trigger, {
298
+ messageId: messageId ?? messages.at(-1)?.id,
299
+ partId,
300
+ bodyBytes: byteLength(serializedBody),
301
+ }, () => this.callWithAuthRetry(chatId, state, sendChatMessage));
289
302
  // Cancel any in-flight stream for this chat — the new turn supersedes it.
290
303
  const activeStream = this.activeStreams.get(chatId);
291
304
  if (activeStream) {
@@ -320,18 +333,27 @@ export class TriggerChatTransport {
320
333
  messageId: args.messageId,
321
334
  metadata: args.metadata,
322
335
  };
323
- const response = await fetch(this.headStart, {
324
- method: "POST",
325
- headers: {
326
- "Content-Type": "application/json",
327
- ...this.extraHeaders,
328
- },
329
- body: JSON.stringify(wirePayload),
330
- signal: args.abortSignal,
336
+ let response;
337
+ const serializedBody = JSON.stringify(wirePayload);
338
+ await this.sendWithEvents(args.chatId, "head-start", {
339
+ messageId: args.messageId ?? args.messages.at(-1)?.id,
340
+ bodyBytes: byteLength(serializedBody),
341
+ }, async () => {
342
+ response = await fetch(this.headStart, {
343
+ method: "POST",
344
+ headers: {
345
+ "Content-Type": "application/json",
346
+ ...this.extraHeaders,
347
+ },
348
+ body: serializedBody,
349
+ signal: args.abortSignal,
350
+ });
351
+ if (!response.ok) {
352
+ const err = new Error(`chat.handover endpoint returned ${response.status} ${response.statusText}`);
353
+ err.status = response.status;
354
+ throw err;
355
+ }
331
356
  });
332
- if (!response.ok) {
333
- throw new Error(`chat.handover endpoint returned ${response.status} ${response.statusText}`);
334
- }
335
357
  if (!response.body) {
336
358
  throw new Error("chat.handover endpoint returned no response body");
337
359
  }
@@ -385,7 +407,17 @@ export class TriggerChatTransport {
385
407
  notifyChange(chatId, state);
386
408
  }
387
409
  };
388
- return response.body
410
+ const emit = (event) => this.emitEvent(event);
411
+ const attribution = () => this.turnAttribution(chatId);
412
+ let sawFirstChunk = false;
413
+ emit({
414
+ type: "stream-connected",
415
+ chatId,
416
+ timestamp: Date.now(),
417
+ resumed: false,
418
+ messageId: this.lastTurnSends.get(chatId)?.messageId,
419
+ });
420
+ const piped = response.body
389
421
  .pipeThrough(new TextDecoderStream())
390
422
  .pipeThrough(parseUIMessageSseTransform())
391
423
  .pipeThrough(new TransformStream({
@@ -394,6 +426,13 @@ export class TriggerChatTransport {
394
426
  const type = chunk.type;
395
427
  if (type === TRIGGER_TURN_COMPLETE) {
396
428
  clearStreaming();
429
+ emit({
430
+ type: "turn-completed",
431
+ chatId,
432
+ timestamp: Date.now(),
433
+ lastEventId: sessions.get(chatId)?.lastEventId,
434
+ ...attribution(),
435
+ });
397
436
  return; // drop — not a real UIMessageChunk
398
437
  }
399
438
  if (type === TRIGGER_SESSION_STATE) {
@@ -404,12 +443,61 @@ export class TriggerChatTransport {
404
443
  return; // drop
405
444
  }
406
445
  }
446
+ if (!sawFirstChunk) {
447
+ sawFirstChunk = true;
448
+ emit({
449
+ type: "first-chunk",
450
+ chatId,
451
+ timestamp: Date.now(),
452
+ chunkType: chunk?.type,
453
+ ...attribution(),
454
+ });
455
+ }
407
456
  controller.enqueue(chunk);
408
457
  },
409
458
  flush() {
410
459
  clearStreaming();
411
460
  },
412
461
  }));
462
+ // Pump wrapper: a TransformStream can't observe upstream errors, so
463
+ // read here to emit stream-error (aborts close cleanly, matching the
464
+ // session subscribe path).
465
+ const pipedReader = piped.getReader();
466
+ return new ReadableStream({
467
+ async pull(controller) {
468
+ try {
469
+ const next = await pipedReader.read();
470
+ if (next.done) {
471
+ controller.close();
472
+ return;
473
+ }
474
+ controller.enqueue(next.value);
475
+ }
476
+ catch (error) {
477
+ if (error instanceof Error && error.name === "AbortError") {
478
+ try {
479
+ controller.close();
480
+ }
481
+ catch {
482
+ /* already closed */
483
+ }
484
+ return;
485
+ }
486
+ const errorStatus = error.status;
487
+ emit({
488
+ type: "stream-error",
489
+ chatId,
490
+ timestamp: Date.now(),
491
+ error: error instanceof Error ? error : new Error(String(error)),
492
+ status: typeof errorStatus === "number" ? errorStatus : undefined,
493
+ });
494
+ controller.error(error);
495
+ }
496
+ },
497
+ cancel(reason) {
498
+ return pipedReader.cancel(reason);
499
+ },
500
+ });
413
501
  }
414
502
  /**
415
503
  * Send a steering message during an active stream without disrupting
@@ -430,11 +518,12 @@ export class TriggerChatTransport {
430
518
  metadata: mergedMetadata,
431
519
  };
432
520
  const partId = crypto.randomUUID();
521
+ const serializedBody = this.serializeInputChunk({ kind: "message", payload: wirePayload });
433
522
  const send = async (token) => {
434
- await this.appendInputChunk(chatId, token, this.serializeInputChunk({ kind: "message", payload: wirePayload }), partId);
523
+ await this.appendInputChunk(chatId, token, serializedBody, partId);
435
524
  };
436
525
  try {
437
- await this.callWithAuthRetry(chatId, state, send);
526
+ await this.sendWithEvents(chatId, "steer", { messageId: message.id, partId, bodyBytes: byteLength(serializedBody) }, () => this.callWithAuthRetry(chatId, state, send));
438
527
  return true;
439
528
  }
440
529
  catch {
@@ -460,6 +549,7 @@ export class TriggerChatTransport {
460
549
  ? AbortSignal.any([options.abortSignal, abortController.signal])
461
550
  : abortController.signal;
462
551
  return this.subscribeToSessionStream(state, abortSignal, options.chatId, {
552
+ resumed: true,
463
553
  sendStopOnAbort: !!options.abortSignal,
464
554
  // Reconnect-on-reload opts into the server's settled-peek shortcut
465
555
  // so the SSE doesn't hang for 60s when no turn is in flight. Active
@@ -478,11 +568,12 @@ export class TriggerChatTransport {
478
568
  if (!state)
479
569
  return false;
480
570
  const partId = crypto.randomUUID();
571
+ const serializedBody = this.serializeInputChunk({ kind: "stop" });
481
572
  const send = async (token) => {
482
- await this.appendInputChunk(chatId, token, this.serializeInputChunk({ kind: "stop" }), partId);
573
+ await this.appendInputChunk(chatId, token, serializedBody, partId);
483
574
  };
484
575
  try {
485
- await this.callWithAuthRetry(chatId, state, send);
576
+ await this.sendWithEvents(chatId, "stop", { partId, bodyBytes: byteLength(serializedBody) }, () => this.callWithAuthRetry(chatId, state, send));
486
577
  }
487
578
  catch {
488
579
  return false;
@@ -528,7 +619,7 @@ export class TriggerChatTransport {
528
619
  const send = async (token) => {
529
620
  await this.appendInputChunk(chatId, token, body, partId);
530
621
  };
531
- await this.callWithAuthRetry(chatId, state, send);
622
+ await this.sendWithEvents(chatId, "action", { partId, bodyBytes: byteLength(body) }, () => this.callWithAuthRetry(chatId, state, send));
532
623
  // Supersede any in-flight reader before subscribing — same as
533
624
  // `sendMessages`. Two concurrent readers both write `state.lastEventId`
534
625
  // and the slower one can regress the cursor, replaying records on the
@@ -564,6 +655,61 @@ export class TriggerChatTransport {
564
655
  setOnSessionChange(callback) {
565
656
  this._onSessionChange = callback;
566
657
  }
658
+ /** Update the `onEvent` callback without recreating the transport. */
659
+ setOnEvent(callback) {
660
+ this._onEvent = callback;
661
+ }
662
+ emitEvent(event) {
663
+ const cb = this._onEvent;
664
+ if (!cb)
665
+ return;
666
+ try {
667
+ cb(event);
668
+ }
669
+ catch {
670
+ // observability must never break the chat
671
+ }
672
+ }
673
+ /** Run a send op, emitting the terminal message-sent / message-send-failed event. */
674
+ async sendWithEvents(chatId, source, extras, op) {
675
+ const startedAt = Date.now();
676
+ try {
677
+ await op();
678
+ const turnProducing = source === "submit-message" || source === "regenerate-message" || source === "head-start";
679
+ if (turnProducing) {
680
+ this.lastTurnSends.set(chatId, { messageId: extras.messageId, at: Date.now() });
681
+ }
682
+ this.emitEvent({
683
+ type: "message-sent",
684
+ chatId,
685
+ timestamp: Date.now(),
686
+ source,
687
+ durationMs: Date.now() - startedAt,
688
+ ...extras,
689
+ });
690
+ }
691
+ catch (error) {
692
+ const status = error.status;
693
+ this.emitEvent({
694
+ type: "message-send-failed",
695
+ chatId,
696
+ timestamp: Date.now(),
697
+ source,
698
+ error: error instanceof Error ? error : new Error(String(error)),
699
+ status: typeof status === "number" ? status : undefined,
700
+ durationMs: Date.now() - startedAt,
701
+ ...extras,
702
+ });
703
+ throw error;
704
+ }
705
+ }
706
+ /** Attribution fields for response-side events. */
707
+ turnAttribution(chatId) {
708
+ const lastSend = this.lastTurnSends.get(chatId);
709
+ if (!lastSend)
710
+ return {};
711
+ return { messageId: lastSend.messageId, sinceSendMs: Date.now() - lastSend.at };
712
+ }
567
713
  /**
568
714
  * Update the transport's `clientData`. Used by `useTriggerChatTransport`
569
715
  * to keep the latest value reachable from inside `startSession` and
@@ -930,6 +1076,15 @@ export class TriggerChatTransport {
930
1076
  throw e;
931
1077
  }
932
1078
  }
1079
+ this.emitEvent({
1080
+ type: "stream-connected",
1081
+ chatId,
1082
+ timestamp: Date.now(),
1083
+ resumed: options?.resumed ?? false,
1084
+ lastEventId: state.lastEventId,
1085
+ messageId: this.lastTurnSends.get(chatId)?.messageId,
1086
+ });
1087
+ let sawFirstChunk = false;
933
1088
  while (true) {
934
1089
  let value;
935
1090
  if (primed !== undefined) {
@@ -1001,12 +1156,22 @@ export class TriggerChatTransport {
1001
1156
  if (refreshedToken) {
1002
1157
  state.publicAccessToken = refreshedToken;
1003
1158
  }
1159
+ this.emitEvent({
1160
+ type: "turn-completed",
1161
+ chatId,
1162
+ timestamp: Date.now(),
1163
+ lastEventId: state.lastEventId,
1164
+ sessionInEventId: headerValue(value.headers, SESSION_IN_EVENT_ID_HEADER),
1165
+ ...this.turnAttribution(chatId),
1166
+ });
1004
1167
  state.isStreaming = false;
1005
1168
  this.notifySessionChange(chatId, state);
1006
1169
  this.coordinator?.release(chatId);
1007
1170
  this.coordinator?.broadcastSession(chatId, {
1008
1171
  lastEventId: state.lastEventId,
1009
1172
  });
1173
+ // Re-arm per-turn events for watch mode's next turn.
1174
+ sawFirstChunk = false;
1010
1175
  if (this.watchMode)
1011
1176
  continue;
1012
1177
  internalAbort.abort();
@@ -1023,6 +1188,17 @@ export class TriggerChatTransport {
1023
1188
  // JSON unwrap). Drop empty/malformed payloads defensively.
1024
1189
  if (value.chunk == null)
1025
1190
  continue;
1191
+ if (!sawFirstChunk) {
1192
+ sawFirstChunk = true;
1193
+ this.emitEvent({
1194
+ type: "first-chunk",
1195
+ chatId,
1196
+ timestamp: Date.now(),
1197
+ chunkType: value.chunk.type,
1198
+ lastEventId: value.id || undefined,
1199
+ ...this.turnAttribution(chatId),
1200
+ });
1201
+ }
1026
1202
  controller.enqueue(value.chunk);
1027
1203
  }
1028
1204
  }
@@ -1036,6 +1212,14 @@ export class TriggerChatTransport {
1036
1212
  }
1037
1213
  return;
1038
1214
  }
1215
+ const errorStatus = error.status;
1216
+ this.emitEvent({
1217
+ type: "stream-error",
1218
+ chatId,
1219
+ timestamp: Date.now(),
1220
+ error: error instanceof Error ? error : new Error(String(error)),
1221
+ status: typeof errorStatus === "number" ? errorStatus : undefined,
1222
+ });
1039
1223
  controller.error(error);
1040
1224
  }
1041
1225
  finally {