@trigger.dev/sdk 0.0.0-prerelease-20260304181730 → 0.0.0-prerelease-20260305142821

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/v3/ai.js CHANGED
@@ -90,28 +90,6 @@ export { CHAT_MESSAGES_STREAM_ID, CHAT_STOP_STREAM_ID };
90
90
  // Input streams for bidirectional chat communication
91
91
  const messagesInput = streams.input({ id: CHAT_MESSAGES_STREAM_ID });
92
92
  const stopInput = streams.input({ id: CHAT_STOP_STREAM_ID });
93
- /**
94
- * Strips provider-specific IDs from message parts so that partial/stopped
95
- * assistant responses don't cause 404s when sent back to the provider
96
- * (e.g. OpenAI Responses API message IDs).
97
- * @internal
98
- */
99
- function sanitizeMessages(messages) {
100
- return messages.map((msg) => {
101
- if (msg.role !== "assistant" || !msg.parts)
102
- return msg;
103
- return {
104
- ...msg,
105
- parts: msg.parts.map((part) => {
106
- // Strip provider-specific metadata (e.g. OpenAI Responses API itemId)
107
- // and streaming state from assistant message parts. These cause 404s
108
- // when partial/stopped responses are sent back to the provider.
109
- const { providerMetadata, state, id, ...rest } = part;
110
- return rest;
111
- }),
112
- };
113
- });
114
- }
115
93
  /**
116
94
  * Tracks how many times `pipeChat` has been called in the current `chatTask` run.
117
95
  * Used to prevent double-piping when a user both calls `pipeChat()` manually
@@ -225,7 +203,7 @@ async function pipeChat(source, options) {
225
203
  * ```
226
204
  */
227
205
  function chatTask(options) {
228
- const { run: userRun, maxTurns = 100, turnTimeout = "1h", warmTimeoutInSeconds = 30, ...restOptions } = options;
206
+ const { run: userRun, onChatStart, onTurnComplete, maxTurns = 100, turnTimeout = "1h", warmTimeoutInSeconds = 30, ...restOptions } = options;
229
207
  return createTask({
230
208
  ...restOptions,
231
209
  run: async (payload, { signal: runSignal }) => {
@@ -235,6 +213,13 @@ function chatTask(options) {
235
213
  activeSpan.setAttribute("gen_ai.conversation.id", payload.chatId);
236
214
  }
237
215
  let currentWirePayload = payload;
216
+ // Accumulated model messages across turns. Turn 1 initialises from the
217
+ // full history the frontend sends; subsequent turns append only the new
218
+ // user message(s) and the captured assistant response.
219
+ let accumulatedMessages = [];
220
+ // Accumulated UI messages for persistence. Mirrors the model accumulator
221
+ // but in frontend-friendly UIMessage format (with parts, id, etc.).
222
+ let accumulatedUIMessages = [];
238
223
  // Mutable reference to the current turn's stop controller so the
239
224
  // stop input stream listener (registered once) can abort the right turn.
240
225
  let currentStopController;
@@ -284,23 +269,75 @@ function chatTask(options) {
284
269
  const msgSub = messagesInput.on((msg) => {
285
270
  pendingMessages.push(msg);
286
271
  });
287
- // Convert wire payload to user-facing payload
288
- const sanitized = sanitizeMessages(uiMessages);
289
- const modelMessages = await convertToModelMessages(sanitized);
272
+ // Convert the incoming UIMessages to model messages and update the accumulator.
273
+ // Turn 1: full history from the frontend → replaces the accumulator.
274
+ // Turn 2+: only the new message(s) → appended to the accumulator.
275
+ const incomingModelMessages = await convertToModelMessages(uiMessages);
276
+ // Track new messages for this turn (user input + assistant response).
277
+ const turnNewModelMessages = [];
278
+ const turnNewUIMessages = [];
279
+ if (turn === 0) {
280
+ accumulatedMessages = incomingModelMessages;
281
+ accumulatedUIMessages = [...uiMessages];
282
+ // On first turn, the "new" messages are just the last user message
283
+ // (the rest is history). We'll add the response after streaming.
284
+ if (uiMessages.length > 0) {
285
+ turnNewUIMessages.push(uiMessages[uiMessages.length - 1]);
286
+ const lastModel = incomingModelMessages[incomingModelMessages.length - 1];
287
+ if (lastModel)
288
+ turnNewModelMessages.push(lastModel);
289
+ }
290
+ }
291
+ else if (currentWirePayload.trigger === "regenerate-message") {
292
+ // Regenerate: frontend sent full history with last assistant message
293
+ // removed. Reset the accumulator to match.
294
+ accumulatedMessages = incomingModelMessages;
295
+ accumulatedUIMessages = [...uiMessages];
296
+ // No new user messages for regenerate — just the response (added below)
297
+ }
298
+ else {
299
+ // Submit: frontend sent only the new user message(s). Append to accumulator.
300
+ accumulatedMessages.push(...incomingModelMessages);
301
+ accumulatedUIMessages.push(...uiMessages);
302
+ turnNewModelMessages.push(...incomingModelMessages);
303
+ turnNewUIMessages.push(...uiMessages);
304
+ }
305
+ // Fire onChatStart on the first turn
306
+ if (turn === 0 && onChatStart) {
307
+ await tracer.startActiveSpan("onChatStart()", async () => {
308
+ await onChatStart({
309
+ chatId: currentWirePayload.chatId,
310
+ messages: accumulatedMessages,
311
+ clientData: wireMetadata,
312
+ });
313
+ }, {
314
+ attributes: {
315
+ [SemanticInternalAttributes.STYLE_ICON]: "task-hook-onStart",
316
+ [SemanticInternalAttributes.COLLAPSED]: true,
317
+ },
318
+ });
319
+ }
320
+ // Captured by the onFinish callback below — works even on abort/stop.
321
+ let capturedResponseMessage;
290
322
  try {
291
323
  const result = await userRun({
292
324
  ...restWire,
293
- messages: modelMessages,
294
- uiMessages: sanitized,
325
+ messages: accumulatedMessages,
295
326
  clientData: wireMetadata,
296
327
  signal: combinedSignal,
297
328
  cancelSignal,
298
329
  stopSignal,
299
330
  });
300
331
  // Auto-pipe if the run function returned a StreamTextResult or similar,
301
- // but only if pipeChat() wasn't already called manually during this turn
332
+ // but only if pipeChat() wasn't already called manually during this turn.
333
+ // We call toUIMessageStream ourselves to attach onFinish for response capture.
302
334
  if (_chatPipeCount === 0 && isUIMessageStreamable(result)) {
303
- await pipeChat(result, { signal: combinedSignal, spanName: "stream response" });
335
+ const uiStream = result.toUIMessageStream({
336
+ onFinish: ({ responseMessage }) => {
337
+ capturedResponseMessage = responseMessage;
338
+ },
339
+ });
340
+ await pipeChat(uiStream, { signal: combinedSignal, spanName: "stream response" });
304
341
  }
305
342
  }
306
343
  catch (error) {
@@ -318,8 +355,48 @@ function chatTask(options) {
318
355
  finally {
319
356
  msgSub.off();
320
357
  }
358
+ // Append the assistant's response (partial or complete) to the accumulator.
359
+ // The onFinish callback fires even on abort/stop, so partial responses
360
+ // from stopped generation are captured correctly.
361
+ if (capturedResponseMessage) {
362
+ accumulatedUIMessages.push(capturedResponseMessage);
363
+ turnNewUIMessages.push(capturedResponseMessage);
364
+ try {
365
+ const responseModelMessages = await convertToModelMessages([
366
+ stripProviderMetadata(capturedResponseMessage),
367
+ ]);
368
+ accumulatedMessages.push(...responseModelMessages);
369
+ turnNewModelMessages.push(...responseModelMessages);
370
+ }
371
+ catch {
372
+ // Conversion failed — skip accumulation for this turn
373
+ }
374
+ }
375
+ // TODO: When the user calls `pipeChat` manually instead of returning a
376
+ // StreamTextResult, we don't have access to onFinish. A future iteration
377
+ // should let manual-mode users report back response messages for
378
+ // accumulation (e.g. via a `chat.addMessages()` helper).
321
379
  if (runSignal.aborted)
322
380
  return "exit";
381
+ // Fire onTurnComplete after response capture
382
+ if (onTurnComplete) {
383
+ await tracer.startActiveSpan("onTurnComplete()", async () => {
384
+ await onTurnComplete({
385
+ chatId: currentWirePayload.chatId,
386
+ messages: accumulatedMessages,
387
+ uiMessages: accumulatedUIMessages,
388
+ newMessages: turnNewModelMessages,
389
+ newUIMessages: turnNewUIMessages,
390
+ responseMessage: capturedResponseMessage,
391
+ turn,
392
+ });
393
+ }, {
394
+ attributes: {
395
+ [SemanticInternalAttributes.STYLE_ICON]: "task-hook-onComplete",
396
+ [SemanticInternalAttributes.COLLAPSED]: true,
397
+ },
398
+ });
399
+ }
323
400
  // Write turn-complete control chunk so frontend closes its stream
324
401
  await writeTurnCompleteChunk(currentWirePayload.chatId);
325
402
  // If messages arrived during streaming, use the first one immediately
@@ -329,9 +406,10 @@ function chatTask(options) {
329
406
  }
330
407
  // Phase 1: Keep the run warm for quick response to the next message.
331
408
  // The run stays active (using compute) during this window.
332
- if (warmTimeoutInSeconds > 0) {
409
+ const effectiveWarmTimeout = metadata.get(WARM_TIMEOUT_METADATA_KEY) ?? warmTimeoutInSeconds;
410
+ if (effectiveWarmTimeout > 0) {
333
411
  const warm = await messagesInput.once({
334
- timeoutMs: warmTimeoutInSeconds * 1000,
412
+ timeoutMs: effectiveWarmTimeout * 1000,
335
413
  spanName: "waiting (warm)",
336
414
  });
337
415
  if (warm.ok) {
@@ -341,8 +419,9 @@ function chatTask(options) {
341
419
  }
342
420
  }
343
421
  // Phase 2: Suspend the task (frees compute) until the next message arrives
422
+ const effectiveTurnTimeout = metadata.get(TURN_TIMEOUT_METADATA_KEY) ?? turnTimeout;
344
423
  const next = await messagesInput.wait({
345
- timeout: turnTimeout,
424
+ timeout: effectiveTurnTimeout,
346
425
  spanName: "waiting (suspended)",
347
426
  });
348
427
  if (!next.ok) {
@@ -387,6 +466,69 @@ function chatTask(options) {
387
466
  * const token = await chat.createAccessToken("my-chat");
388
467
  * ```
389
468
  */
469
+ // ---------------------------------------------------------------------------
470
+ // Runtime configuration helpers
471
+ // ---------------------------------------------------------------------------
472
+ const TURN_TIMEOUT_METADATA_KEY = "chat.turnTimeout";
473
+ const WARM_TIMEOUT_METADATA_KEY = "chat.warmTimeout";
474
+ /**
475
+ * Override the turn timeout for subsequent turns in the current run.
476
+ *
477
+ * The turn timeout controls how long the run stays suspended (freeing compute)
478
+ * waiting for the next user message. When it expires, the run completes
479
+ * gracefully and the next message starts a fresh run.
480
+ *
481
+ * Call from inside a `chatTask` run function to adjust based on context.
482
+ *
483
+ * @param duration - A duration string (e.g. `"5m"`, `"1h"`, `"30s"`)
484
+ *
485
+ * @example
486
+ * ```ts
487
+ * run: async ({ messages, signal }) => {
488
+ * chat.setTurnTimeout("2h");
489
+ * return streamText({ model, messages, abortSignal: signal });
490
+ * }
491
+ * ```
492
+ */
493
+ function setTurnTimeout(duration) {
494
+ metadata.set(TURN_TIMEOUT_METADATA_KEY, duration);
495
+ }
496
+ /**
497
+ * Override the turn timeout in seconds for subsequent turns in the current run.
498
+ *
499
+ * @param seconds - Number of seconds to wait for the next message before ending the run
500
+ *
501
+ * @example
502
+ * ```ts
503
+ * run: async ({ messages, signal }) => {
504
+ * chat.setTurnTimeoutInSeconds(3600); // 1 hour
505
+ * return streamText({ model, messages, abortSignal: signal });
506
+ * }
507
+ * ```
508
+ */
509
+ function setTurnTimeoutInSeconds(seconds) {
510
+ metadata.set(TURN_TIMEOUT_METADATA_KEY, `${seconds}s`);
511
+ }
512
+ /**
513
+ * Override the warm timeout for subsequent turns in the current run.
514
+ *
515
+ * The warm timeout controls how long the run stays active (using compute)
516
+ * after each turn, waiting for the next message. During this window,
517
+ * responses are instant. After it expires, the run suspends.
518
+ *
519
+ * @param seconds - Number of seconds to stay warm (0 to suspend immediately)
520
+ *
521
+ * @example
522
+ * ```ts
523
+ * run: async ({ messages, signal }) => {
524
+ * chat.setWarmTimeoutInSeconds(60);
525
+ * return streamText({ model, messages, abortSignal: signal });
526
+ * }
527
+ * ```
528
+ */
529
+ function setWarmTimeoutInSeconds(seconds) {
530
+ metadata.set(WARM_TIMEOUT_METADATA_KEY, seconds);
531
+ }
390
532
  export const chat = {
391
533
  /** Create a chat task. See {@link chatTask}. */
392
534
  task: chatTask,
@@ -394,6 +536,12 @@ export const chat = {
394
536
  pipe: pipeChat,
395
537
  /** Create a public access token for a chat task. See {@link createChatAccessToken}. */
396
538
  createAccessToken: createChatAccessToken,
539
+ /** Override the turn timeout at runtime (duration string). See {@link setTurnTimeout}. */
540
+ setTurnTimeout,
541
+ /** Override the turn timeout at runtime (seconds). See {@link setTurnTimeoutInSeconds}. */
542
+ setTurnTimeoutInSeconds,
543
+ /** Override the warm timeout at runtime. See {@link setWarmTimeoutInSeconds}. */
544
+ setWarmTimeoutInSeconds,
397
545
  };
398
546
  /**
399
547
  * Writes a turn-complete control chunk to the chat output stream.
@@ -433,4 +581,35 @@ function extractLastUserMessageText(messages) {
433
581
  }
434
582
  return undefined;
435
583
  }
584
+ /**
585
+ * Strips ephemeral OpenAI Responses API `itemId` from a UIMessage's parts.
586
+ *
587
+ * The OpenAI Responses provider attaches `itemId` to message parts via
588
+ * `providerMetadata.openai.itemId`. These IDs are ephemeral — sending them
589
+ * back in a subsequent `streamText` call causes 404s because the provider
590
+ * can't find the referenced item (especially for stopped/partial responses).
591
+ *
592
+ * @internal
593
+ */
594
+ function stripProviderMetadata(message) {
595
+ if (!message.parts)
596
+ return message;
597
+ return {
598
+ ...message,
599
+ parts: message.parts.map((part) => {
600
+ const openai = part.providerMetadata?.openai;
601
+ if (!openai?.itemId)
602
+ return part;
603
+ const { itemId, ...restOpenai } = openai;
604
+ const { openai: _, ...restProviders } = part.providerMetadata;
605
+ return {
606
+ ...part,
607
+ providerMetadata: {
608
+ ...restProviders,
609
+ ...(Object.keys(restOpenai).length > 0 ? { openai: restOpenai } : {}),
610
+ },
611
+ };
612
+ }),
613
+ };
614
+ }
436
615
  //# sourceMappingURL=ai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../src/v3/ai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../src/v3/ai.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,9 @@ export type UseTriggerChatTransportOptions<TTask extends AnyTask = AnyTask> = Om
23
23
  * For dynamic access tokens, pass a function — it will be called on each
24
24
  * request without needing to recreate the transport.
25
25
  *
26
+ * The `onSessionChange` callback is kept in a ref so the transport always
27
+ * calls the latest version without needing to be recreated.
28
+ *
26
29
  * @example
27
30
  * ```tsx
28
31
  * import { useChat } from "@ai-sdk/react";
@@ -21,7 +21,7 @@
21
21
  * }
22
22
  * ```
23
23
  */
24
- import { useRef } from "react";
24
+ import { useEffect, useRef } from "react";
25
25
  import { TriggerChatTransport, } from "./chat.js";
26
26
  /**
27
27
  * React hook that creates and memoizes a `TriggerChatTransport` instance.
@@ -34,6 +34,9 @@ import { TriggerChatTransport, } from "./chat.js";
34
34
  * For dynamic access tokens, pass a function — it will be called on each
35
35
  * request without needing to recreate the transport.
36
36
  *
37
+ * The `onSessionChange` callback is kept in a ref so the transport always
38
+ * calls the latest version without needing to be recreated.
39
+ *
37
40
  * @example
38
41
  * ```tsx
39
42
  * import { useChat } from "@ai-sdk/react";
@@ -55,6 +58,11 @@ export function useTriggerChatTransport(options) {
55
58
  if (ref.current === null) {
56
59
  ref.current = new TriggerChatTransport(options);
57
60
  }
61
+ // Keep onSessionChange up to date without recreating the transport
62
+ const { onSessionChange } = options;
63
+ useEffect(() => {
64
+ ref.current?.setOnSessionChange(onSessionChange);
65
+ }, [onSessionChange]);
58
66
  return ref.current;
59
67
  }
60
68
  //# sourceMappingURL=chat-react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,oBAAoB,GAErB,MAAM,WAAW,CAAC;AAmBnB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAA8C;IAE9C,MAAM,GAAG,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EACL,oBAAoB,GAErB,MAAM,WAAW,CAAC;AAmBnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAA8C;IAE9C,MAAM,GAAG,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,mEAAmE;IACnE,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC"}
@@ -84,6 +84,60 @@ export type TriggerChatTransportOptions = {
84
84
  * ```
85
85
  */
86
86
  metadata?: Record<string, unknown>;
87
+ /**
88
+ * Restore active chat sessions from external storage (e.g. localStorage).
89
+ *
90
+ * After a page refresh, pass previously persisted sessions here so the
91
+ * transport can reconnect to existing runs instead of starting new ones.
92
+ * Use `getSession()` to retrieve session state for persistence.
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * new TriggerChatTransport({
97
+ * task: "my-chat",
98
+ * accessToken,
99
+ * sessions: {
100
+ * "chat-abc": { runId: "run_123", publicAccessToken: "...", lastEventId: "42" },
101
+ * },
102
+ * });
103
+ * ```
104
+ */
105
+ sessions?: Record<string, {
106
+ runId: string;
107
+ publicAccessToken: string;
108
+ lastEventId?: string;
109
+ }>;
110
+ /**
111
+ * Called whenever a chat session's state changes.
112
+ *
113
+ * Fires when:
114
+ * - A new session is created (after triggering a task)
115
+ * - A turn completes (lastEventId updated)
116
+ * - A session is removed (run ended or input stream send failed) — `session` will be `null`
117
+ *
118
+ * Use this to persist session state for reconnection after page refreshes,
119
+ * without needing to call `getSession()` manually.
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * new TriggerChatTransport({
124
+ * task: "my-chat",
125
+ * accessToken,
126
+ * onSessionChange: (chatId, session) => {
127
+ * if (session) {
128
+ * localStorage.setItem(`session:${chatId}`, JSON.stringify(session));
129
+ * } else {
130
+ * localStorage.removeItem(`session:${chatId}`);
131
+ * }
132
+ * },
133
+ * });
134
+ * ```
135
+ */
136
+ onSessionChange?: (chatId: string, session: {
137
+ runId: string;
138
+ publicAccessToken: string;
139
+ lastEventId?: string;
140
+ } | null) => void;
87
141
  };
88
142
  /**
89
143
  * A custom AI SDK `ChatTransport` that runs chat completions as durable Trigger.dev tasks.
@@ -121,6 +175,7 @@ export declare class TriggerChatTransport implements ChatTransport<UIMessage> {
121
175
  private readonly extraHeaders;
122
176
  private readonly streamTimeoutSeconds;
123
177
  private readonly defaultMetadata;
178
+ private _onSessionChange;
124
179
  private sessions;
125
180
  constructor(options: TriggerChatTransportOptions);
126
181
  sendMessages: (options: {
@@ -133,6 +188,36 @@ export declare class TriggerChatTransport implements ChatTransport<UIMessage> {
133
188
  reconnectToStream: (options: {
134
189
  chatId: string;
135
190
  } & ChatRequestOptions) => Promise<ReadableStream<UIMessageChunk> | null>;
191
+ /**
192
+ * Get the current session state for a chat, suitable for external persistence.
193
+ *
194
+ * Returns `undefined` if no active session exists for this chatId.
195
+ * Persist the returned value to localStorage so it can be restored
196
+ * after a page refresh via `restoreSession()`.
197
+ *
198
+ * @example
199
+ * ```ts
200
+ * const session = transport.getSession(chatId);
201
+ * if (session) {
202
+ * localStorage.setItem(`session:${chatId}`, JSON.stringify(session));
203
+ * }
204
+ * ```
205
+ */
206
+ getSession: (chatId: string) => {
207
+ runId: string;
208
+ publicAccessToken: string;
209
+ lastEventId?: string;
210
+ } | undefined;
211
+ /**
212
+ * Update the `onSessionChange` callback.
213
+ * Useful for React hooks that need to update the callback without recreating the transport.
214
+ */
215
+ setOnSessionChange(callback: ((chatId: string, session: {
216
+ runId: string;
217
+ publicAccessToken: string;
218
+ lastEventId?: string;
219
+ } | null) => void) | undefined): void;
220
+ private notifySessionChange;
136
221
  private subscribeToStream;
137
222
  }
138
223
  /**
@@ -62,6 +62,7 @@ export class TriggerChatTransport {
62
62
  extraHeaders;
63
63
  streamTimeoutSeconds;
64
64
  defaultMetadata;
65
+ _onSessionChange;
65
66
  sessions = new Map();
66
67
  constructor(options) {
67
68
  this.taskId = options.task;
@@ -74,6 +75,17 @@ export class TriggerChatTransport {
74
75
  this.extraHeaders = options.headers ?? {};
75
76
  this.streamTimeoutSeconds = options.streamTimeoutSeconds ?? DEFAULT_STREAM_TIMEOUT_SECONDS;
76
77
  this.defaultMetadata = options.metadata;
78
+ this._onSessionChange = options.onSessionChange;
79
+ // Restore sessions from external storage
80
+ if (options.sessions) {
81
+ for (const [chatId, session] of Object.entries(options.sessions)) {
82
+ this.sessions.set(chatId, {
83
+ runId: session.runId,
84
+ publicAccessToken: session.publicAccessToken,
85
+ lastEventId: session.lastEventId,
86
+ });
87
+ }
88
+ }
77
89
  }
78
90
  sendMessages = async (options) => {
79
91
  const { trigger, chatId, messageId, messages, abortSignal, body, metadata } = options;
@@ -93,13 +105,21 @@ export class TriggerChatTransport {
93
105
  // to resume the conversation in the same run.
94
106
  if (session?.runId) {
95
107
  try {
108
+ // Keep wire payloads minimal — the backend accumulates the full history.
109
+ // For submit-message: only send the new user message (always the last one).
110
+ // For regenerate-message: send full history so the backend can reset its accumulator.
111
+ const minimalPayload = {
112
+ ...payload,
113
+ messages: trigger === "submit-message" ? messages.slice(-1) : messages,
114
+ };
96
115
  const apiClient = new ApiClient(this.baseURL, session.publicAccessToken);
97
- await apiClient.sendInputStream(session.runId, CHAT_MESSAGES_STREAM_ID, payload);
116
+ await apiClient.sendInputStream(session.runId, CHAT_MESSAGES_STREAM_ID, minimalPayload);
98
117
  return this.subscribeToStream(session.runId, session.publicAccessToken, abortSignal, chatId);
99
118
  }
100
119
  catch {
101
120
  // If sending fails (run died, etc.), fall through to trigger a new run.
102
121
  this.sessions.delete(chatId);
122
+ this.notifySessionChange(chatId, null);
103
123
  }
104
124
  }
105
125
  // First message or run has ended — trigger a new run
@@ -115,10 +135,12 @@ export class TriggerChatTransport {
115
135
  const publicAccessToken = "publicAccessToken" in triggerResponse
116
136
  ? triggerResponse.publicAccessToken
117
137
  : undefined;
118
- this.sessions.set(chatId, {
138
+ const newSession = {
119
139
  runId,
120
140
  publicAccessToken: publicAccessToken ?? currentToken,
121
- });
141
+ };
142
+ this.sessions.set(chatId, newSession);
143
+ this.notifySessionChange(chatId, newSession);
122
144
  return this.subscribeToStream(runId, publicAccessToken ?? currentToken, abortSignal, chatId);
123
145
  };
124
146
  reconnectToStream = async (options) => {
@@ -128,6 +150,52 @@ export class TriggerChatTransport {
128
150
  }
129
151
  return this.subscribeToStream(session.runId, session.publicAccessToken, undefined, options.chatId);
130
152
  };
153
+ /**
154
+ * Get the current session state for a chat, suitable for external persistence.
155
+ *
156
+ * Returns `undefined` if no active session exists for this chatId.
157
+ * Persist the returned value to localStorage so it can be restored
158
+ * after a page refresh via `restoreSession()`.
159
+ *
160
+ * @example
161
+ * ```ts
162
+ * const session = transport.getSession(chatId);
163
+ * if (session) {
164
+ * localStorage.setItem(`session:${chatId}`, JSON.stringify(session));
165
+ * }
166
+ * ```
167
+ */
168
+ getSession = (chatId) => {
169
+ const session = this.sessions.get(chatId);
170
+ if (!session)
171
+ return undefined;
172
+ return {
173
+ runId: session.runId,
174
+ publicAccessToken: session.publicAccessToken,
175
+ lastEventId: session.lastEventId,
176
+ };
177
+ };
178
+ /**
179
+ * Update the `onSessionChange` callback.
180
+ * Useful for React hooks that need to update the callback without recreating the transport.
181
+ */
182
+ setOnSessionChange(callback) {
183
+ this._onSessionChange = callback;
184
+ }
185
+ notifySessionChange(chatId, session) {
186
+ if (!this._onSessionChange)
187
+ return;
188
+ if (session) {
189
+ this._onSessionChange(chatId, {
190
+ runId: session.runId,
191
+ publicAccessToken: session.publicAccessToken,
192
+ lastEventId: session.lastEventId,
193
+ });
194
+ }
195
+ else {
196
+ this._onSessionChange(chatId, null);
197
+ }
198
+ }
131
199
  subscribeToStream(runId, accessToken, abortSignal, chatId) {
132
200
  const headers = {
133
201
  Authorization: `Bearer ${accessToken}`,
@@ -179,6 +247,7 @@ export class TriggerChatTransport {
179
247
  // the next message via input streams.
180
248
  if (chatId && !combinedSignal.aborted) {
181
249
  this.sessions.delete(chatId);
250
+ this.notifySessionChange(chatId, null);
182
251
  }
183
252
  controller.close();
184
253
  return;
@@ -206,6 +275,10 @@ export class TriggerChatTransport {
206
275
  continue;
207
276
  }
208
277
  if (chunk.type === "__trigger_turn_complete" && chatId) {
278
+ // Notify with updated lastEventId before closing
279
+ if (session) {
280
+ this.notifySessionChange(chatId, session);
281
+ }
209
282
  internalAbort.abort();
210
283
  try {
211
284
  controller.close();