@trigger.dev/sdk 4.5.1 → 4.5.2
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/commonjs/v3/ai.js +66 -22
- package/dist/commonjs/v3/ai.js.map +1 -1
- package/dist/commonjs/v3/chat-react.d.ts +1 -0
- package/dist/commonjs/v3/chat-react.js +4 -1
- package/dist/commonjs/v3/chat-react.js.map +1 -1
- package/dist/commonjs/v3/chat.d.ts +100 -0
- package/dist/commonjs/v3/chat.js +203 -19
- package/dist/commonjs/v3/chat.js.map +1 -1
- package/dist/commonjs/v3/index.d.ts +1 -1
- package/dist/commonjs/v3/index.js.map +1 -1
- package/dist/commonjs/v3/runs-bulk.test.d.ts +1 -0
- package/dist/commonjs/v3/runs-bulk.test.js +141 -0
- package/dist/commonjs/v3/runs-bulk.test.js.map +1 -0
- package/dist/commonjs/v3/runs.d.ts +19 -2
- package/dist/commonjs/v3/runs.js +87 -0
- package/dist/commonjs/v3/runs.js.map +1 -1
- package/dist/commonjs/v3/sessions.js +5 -2
- package/dist/commonjs/v3/sessions.js.map +1 -1
- package/dist/commonjs/v3/shared.d.ts +2 -2
- package/dist/commonjs/v3/shared.js +79 -4
- package/dist/commonjs/v3/shared.js.map +1 -1
- package/dist/commonjs/v3/shared.test.js +37 -0
- package/dist/commonjs/v3/shared.test.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/ai.js +66 -22
- package/dist/esm/v3/ai.js.map +1 -1
- package/dist/esm/v3/chat-react.d.ts +1 -0
- package/dist/esm/v3/chat-react.js +4 -1
- package/dist/esm/v3/chat-react.js.map +1 -1
- package/dist/esm/v3/chat.d.ts +100 -0
- package/dist/esm/v3/chat.js +204 -20
- package/dist/esm/v3/chat.js.map +1 -1
- package/dist/esm/v3/index.d.ts +1 -1
- package/dist/esm/v3/index.js.map +1 -1
- package/dist/esm/v3/runs-bulk.test.d.ts +1 -0
- package/dist/esm/v3/runs-bulk.test.js +139 -0
- package/dist/esm/v3/runs-bulk.test.js.map +1 -0
- package/dist/esm/v3/runs.d.ts +18 -1
- package/dist/esm/v3/runs.js +87 -0
- package/dist/esm/v3/runs.js.map +1 -1
- package/dist/esm/v3/sessions.js +5 -2
- package/dist/esm/v3/sessions.js.map +1 -1
- package/dist/esm/v3/shared.d.ts +2 -2
- package/dist/esm/v3/shared.js +79 -5
- package/dist/esm/v3/shared.js.map +1 -1
- package/dist/esm/v3/shared.test.js +38 -1
- package/dist/esm/v3/shared.test.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/docs/ai-chat/frontend.mdx +46 -0
- package/docs/ai-chat/pending-messages.mdx +3 -1
- package/docs/ai-chat/reference.mdx +20 -0
- package/docs/billing-limits.mdx +73 -0
- package/docs/how-to-reduce-your-spend.mdx +1 -14
- package/docs/limits.mdx +5 -0
- package/docs/self-hosting/docker.mdx +24 -1
- package/docs/self-hosting/env/webapp.mdx +6 -1
- package/docs/self-hosting/kubernetes.mdx +26 -0
- package/docs/self-hosting/overview.mdx +4 -1
- package/docs/self-hosting/security.mdx +50 -0
- package/docs/troubleshooting.mdx +4 -0
- package/package.json +2 -2
|
@@ -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
|
*
|
|
@@ -65,10 +65,13 @@ function useTriggerChatTransport(options) {
|
|
|
65
65
|
ref.current = new chat_js_1.TriggerChatTransport(options);
|
|
66
66
|
}
|
|
67
67
|
// Keep callbacks up to date without recreating the transport.
|
|
68
|
-
const { onSessionChange, clientData } = options;
|
|
68
|
+
const { onSessionChange, clientData, onEvent } = options;
|
|
69
69
|
(0, react_1.useEffect)(() => {
|
|
70
70
|
ref.current?.setOnSessionChange(onSessionChange);
|
|
71
71
|
}, [onSessionChange]);
|
|
72
|
+
(0, react_1.useEffect)(() => {
|
|
73
|
+
ref.current?.setOnEvent(onEvent);
|
|
74
|
+
}, [onEvent]);
|
|
72
75
|
// Keep `clientData` up to date so the transport's per-turn merge and
|
|
73
76
|
// `startSession` callback both see the latest value without
|
|
74
77
|
// reconstructing the transport.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;
|
|
1
|
+
{"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,81 @@ export type ChatBaseURLResolver = (ctx: ChatTransportEndpointContext) => string;
|
|
|
52
52
|
* what `globalThis.fetch(url, init)` would have returned.
|
|
53
53
|
*/
|
|
54
54
|
export type ChatFetchOverride = (url: string, init: RequestInit, ctx: ChatTransportEndpointContext) => Promise<Response>;
|
|
55
|
+
/**
|
|
56
|
+
* Which transport path produced a send-lifecycle event: `useChat` sends,
|
|
57
|
+
* steering (`sendPendingMessage`), actions, stops, or the first-turn
|
|
58
|
+
* `headStart` POST.
|
|
59
|
+
*/
|
|
60
|
+
export type ChatTransportSendSource = "submit-message" | "regenerate-message" | "steer" | "action" | "stop" | "head-start";
|
|
61
|
+
/**
|
|
62
|
+
* Lifecycle events emitted through the transport's `onEvent` callback.
|
|
63
|
+
*
|
|
64
|
+
* Send events are terminal: `message-sent` fires when the append is
|
|
65
|
+
* durably acknowledged (2xx from the session input stream, after any
|
|
66
|
+
* internal token-refresh retries), `message-send-failed` when the send
|
|
67
|
+
* definitively failed. Response events follow the output stream:
|
|
68
|
+
* `stream-connected` when the SSE subscription opens, `first-chunk` on
|
|
69
|
+
* the first response chunk of a turn, `turn-completed` when the agent's
|
|
70
|
+
* turn-complete control record arrives, and `stream-error` when the
|
|
71
|
+
* stream fails unrecoverably.
|
|
72
|
+
*/
|
|
73
|
+
export type ChatTransportEvent = {
|
|
74
|
+
type: "message-sent";
|
|
75
|
+
chatId: string;
|
|
76
|
+
timestamp: number;
|
|
77
|
+
messageId?: string;
|
|
78
|
+
source: ChatTransportSendSource;
|
|
79
|
+
durationMs: number;
|
|
80
|
+
/** The append's idempotency key — also stored on the server-side record. */
|
|
81
|
+
partId?: string;
|
|
82
|
+
/** Serialized request body size in bytes. */
|
|
83
|
+
bodyBytes?: number;
|
|
84
|
+
} | {
|
|
85
|
+
type: "message-send-failed";
|
|
86
|
+
chatId: string;
|
|
87
|
+
timestamp: number;
|
|
88
|
+
messageId?: string;
|
|
89
|
+
source: ChatTransportSendSource;
|
|
90
|
+
error: Error;
|
|
91
|
+
status?: number;
|
|
92
|
+
durationMs: number;
|
|
93
|
+
partId?: string;
|
|
94
|
+
bodyBytes?: number;
|
|
95
|
+
} | {
|
|
96
|
+
type: "stream-connected";
|
|
97
|
+
chatId: string;
|
|
98
|
+
timestamp: number;
|
|
99
|
+
resumed: boolean;
|
|
100
|
+
/** The resume cursor the subscription connected from, if any. */
|
|
101
|
+
lastEventId?: string;
|
|
102
|
+
/** The last turn-producing send on this chat (client-side attribution). */
|
|
103
|
+
messageId?: string;
|
|
104
|
+
} | {
|
|
105
|
+
type: "stream-error";
|
|
106
|
+
chatId: string;
|
|
107
|
+
timestamp: number;
|
|
108
|
+
error: Error;
|
|
109
|
+
status?: number;
|
|
110
|
+
} | {
|
|
111
|
+
type: "first-chunk";
|
|
112
|
+
chatId: string;
|
|
113
|
+
timestamp: number;
|
|
114
|
+
chunkType?: string;
|
|
115
|
+
lastEventId?: string;
|
|
116
|
+
messageId?: string;
|
|
117
|
+
/** Milliseconds since the last turn-producing send on this chat (time to first token). */
|
|
118
|
+
sinceSendMs?: number;
|
|
119
|
+
} | {
|
|
120
|
+
type: "turn-completed";
|
|
121
|
+
chatId: string;
|
|
122
|
+
timestamp: number;
|
|
123
|
+
lastEventId?: string;
|
|
124
|
+
/** The agent's committed input-stream cursor from the turn-complete record. */
|
|
125
|
+
sessionInEventId?: string;
|
|
126
|
+
messageId?: string;
|
|
127
|
+
/** Milliseconds since the last turn-producing send on this chat (full turn latency). */
|
|
128
|
+
sinceSendMs?: number;
|
|
129
|
+
};
|
|
55
130
|
/**
|
|
56
131
|
* Arguments for the `accessToken` callback. The transport invokes this
|
|
57
132
|
* whenever it needs a fresh session-scoped PAT — initial use, and
|
|
@@ -204,6 +279,22 @@ export type TriggerChatTransportOptions<TClientData = unknown> = {
|
|
|
204
279
|
* ```
|
|
205
280
|
*/
|
|
206
281
|
fetch?: ChatFetchOverride;
|
|
282
|
+
/**
|
|
283
|
+
* Observability callback for transport lifecycle events (sends,
|
|
284
|
+
* stream connects, first chunk, turn completion). See
|
|
285
|
+
* {@link ChatTransportEvent} for the event catalog and semantics.
|
|
286
|
+
* Exceptions thrown by the callback are swallowed.
|
|
287
|
+
*
|
|
288
|
+
* @example Record send metrics:
|
|
289
|
+
* ```ts
|
|
290
|
+
* onEvent: (event) => {
|
|
291
|
+
* if (event.type === "message-sent") {
|
|
292
|
+
* metrics.timing("chat.send", event.durationMs);
|
|
293
|
+
* }
|
|
294
|
+
* },
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
onEvent?: (event: ChatTransportEvent) => void;
|
|
207
298
|
/** Additional headers included in every API request. */
|
|
208
299
|
headers?: Record<string, string>;
|
|
209
300
|
/**
|
|
@@ -305,9 +396,11 @@ export declare class TriggerChatTransport implements ChatTransport<UIMessage> {
|
|
|
305
396
|
private readonly headStart;
|
|
306
397
|
private coordinator;
|
|
307
398
|
private _onSessionChange;
|
|
399
|
+
private _onEvent;
|
|
308
400
|
private sessions;
|
|
309
401
|
private activeStreams;
|
|
310
402
|
private pendingStarts;
|
|
403
|
+
private lastTurnSends;
|
|
311
404
|
constructor(options: TriggerChatTransportOptions);
|
|
312
405
|
/**
|
|
313
406
|
* Eagerly create a Session and trigger its first run. Useful as a
|
|
@@ -382,6 +475,13 @@ export declare class TriggerChatTransport implements ChatTransport<UIMessage> {
|
|
|
382
475
|
getSession: (chatId: string) => ChatSessionPersistedState | undefined;
|
|
383
476
|
setSession(chatId: string, session: ChatSessionPersistedState): void;
|
|
384
477
|
setOnSessionChange(callback: ((chatId: string, session: ChatSessionPersistedState | null) => void) | undefined): void;
|
|
478
|
+
/** Update the `onEvent` callback without recreating the transport. */
|
|
479
|
+
setOnEvent(callback: ((event: ChatTransportEvent) => void) | undefined): void;
|
|
480
|
+
private emitEvent;
|
|
481
|
+
/** Run a send op, emitting the terminal message-sent / message-send-failed event. */
|
|
482
|
+
private sendWithEvents;
|
|
483
|
+
/** Attribution fields for response-side events. */
|
|
484
|
+
private turnAttribution;
|
|
385
485
|
/**
|
|
386
486
|
* Update the transport's `clientData`. Used by `useTriggerChatTransport`
|
|
387
487
|
* to keep the latest value reachable from inside `startSession` and
|
package/dist/commonjs/v3/chat.js
CHANGED
|
@@ -27,6 +27,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
27
27
|
exports.ChatStream = exports.AgentChat = exports.TriggerChatTransport = void 0;
|
|
28
28
|
exports.createChatTransport = createChatTransport;
|
|
29
29
|
const v3_1 = require("@trigger.dev/core/v3");
|
|
30
|
+
function byteLength(body) {
|
|
31
|
+
return new TextEncoder().encode(body).byteLength;
|
|
32
|
+
}
|
|
30
33
|
const chat_tab_coordinator_js_1 = require("./chat-tab-coordinator.js");
|
|
31
34
|
const ai_shared_js_1 = require("./ai-shared.js");
|
|
32
35
|
const DEFAULT_BASE_URL = "https://api.trigger.dev";
|
|
@@ -144,9 +147,13 @@ class TriggerChatTransport {
|
|
|
144
147
|
headStart;
|
|
145
148
|
coordinator = null;
|
|
146
149
|
_onSessionChange;
|
|
150
|
+
_onEvent;
|
|
147
151
|
sessions = new Map();
|
|
148
152
|
activeStreams = new Map();
|
|
149
153
|
pendingStarts = new Map();
|
|
154
|
+
// Last turn-producing send per chat — attribution source for the
|
|
155
|
+
// response-side events' `messageId` / `sinceSendMs`.
|
|
156
|
+
lastTurnSends = new Map();
|
|
150
157
|
constructor(options) {
|
|
151
158
|
this.taskId = options.task;
|
|
152
159
|
this.resolveAccessToken = options.accessToken;
|
|
@@ -162,6 +169,7 @@ class TriggerChatTransport {
|
|
|
162
169
|
this.streamTimeoutSeconds = options.streamTimeoutSeconds ?? DEFAULT_STREAM_TIMEOUT_SECONDS;
|
|
163
170
|
this.defaultMetadata = options.clientData;
|
|
164
171
|
this._onSessionChange = options.onSessionChange;
|
|
172
|
+
this._onEvent = options.onEvent;
|
|
165
173
|
this.watchMode = options.watch ?? false;
|
|
166
174
|
this.headStart = options.headStart;
|
|
167
175
|
if (options.multiTab && !this.watchMode) {
|
|
@@ -286,10 +294,15 @@ class TriggerChatTransport {
|
|
|
286
294
|
// Generated outside the closure so auth-retries reuse the same part id
|
|
287
295
|
// and the server-side dedupe sees one logical append.
|
|
288
296
|
const partId = crypto.randomUUID();
|
|
297
|
+
const serializedBody = this.serializeInputChunk({ kind: "message", payload: wirePayload });
|
|
289
298
|
const sendChatMessage = async (token) => {
|
|
290
|
-
await this.appendInputChunk(chatId, token,
|
|
299
|
+
await this.appendInputChunk(chatId, token, serializedBody, partId);
|
|
291
300
|
};
|
|
292
|
-
await this.
|
|
301
|
+
await this.sendWithEvents(chatId, trigger, {
|
|
302
|
+
messageId: messageId ?? messages.at(-1)?.id,
|
|
303
|
+
partId,
|
|
304
|
+
bodyBytes: byteLength(serializedBody),
|
|
305
|
+
}, () => this.callWithAuthRetry(chatId, state, sendChatMessage));
|
|
293
306
|
// Cancel any in-flight stream for this chat — the new turn supersedes it.
|
|
294
307
|
const activeStream = this.activeStreams.get(chatId);
|
|
295
308
|
if (activeStream) {
|
|
@@ -324,18 +337,27 @@ class TriggerChatTransport {
|
|
|
324
337
|
messageId: args.messageId,
|
|
325
338
|
metadata: args.metadata,
|
|
326
339
|
};
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
340
|
+
let response;
|
|
341
|
+
const serializedBody = JSON.stringify(wirePayload);
|
|
342
|
+
await this.sendWithEvents(args.chatId, "head-start", {
|
|
343
|
+
messageId: args.messageId ?? args.messages.at(-1)?.id,
|
|
344
|
+
bodyBytes: byteLength(serializedBody),
|
|
345
|
+
}, async () => {
|
|
346
|
+
response = await fetch(this.headStart, {
|
|
347
|
+
method: "POST",
|
|
348
|
+
headers: {
|
|
349
|
+
"Content-Type": "application/json",
|
|
350
|
+
...this.extraHeaders,
|
|
351
|
+
},
|
|
352
|
+
body: serializedBody,
|
|
353
|
+
signal: args.abortSignal,
|
|
354
|
+
});
|
|
355
|
+
if (!response.ok) {
|
|
356
|
+
const err = new Error(`chat.handover endpoint returned ${response.status} ${response.statusText}`);
|
|
357
|
+
err.status = response.status;
|
|
358
|
+
throw err;
|
|
359
|
+
}
|
|
335
360
|
});
|
|
336
|
-
if (!response.ok) {
|
|
337
|
-
throw new Error(`chat.handover endpoint returned ${response.status} ${response.statusText}`);
|
|
338
|
-
}
|
|
339
361
|
if (!response.body) {
|
|
340
362
|
throw new Error("chat.handover endpoint returned no response body");
|
|
341
363
|
}
|
|
@@ -389,7 +411,17 @@ class TriggerChatTransport {
|
|
|
389
411
|
notifyChange(chatId, state);
|
|
390
412
|
}
|
|
391
413
|
};
|
|
392
|
-
|
|
414
|
+
const emit = (event) => this.emitEvent(event);
|
|
415
|
+
const attribution = () => this.turnAttribution(chatId);
|
|
416
|
+
let sawFirstChunk = false;
|
|
417
|
+
emit({
|
|
418
|
+
type: "stream-connected",
|
|
419
|
+
chatId,
|
|
420
|
+
timestamp: Date.now(),
|
|
421
|
+
resumed: false,
|
|
422
|
+
messageId: this.lastTurnSends.get(chatId)?.messageId,
|
|
423
|
+
});
|
|
424
|
+
const piped = response.body
|
|
393
425
|
.pipeThrough(new TextDecoderStream())
|
|
394
426
|
.pipeThrough(parseUIMessageSseTransform())
|
|
395
427
|
.pipeThrough(new TransformStream({
|
|
@@ -398,6 +430,13 @@ class TriggerChatTransport {
|
|
|
398
430
|
const type = chunk.type;
|
|
399
431
|
if (type === TRIGGER_TURN_COMPLETE) {
|
|
400
432
|
clearStreaming();
|
|
433
|
+
emit({
|
|
434
|
+
type: "turn-completed",
|
|
435
|
+
chatId,
|
|
436
|
+
timestamp: Date.now(),
|
|
437
|
+
lastEventId: sessions.get(chatId)?.lastEventId,
|
|
438
|
+
...attribution(),
|
|
439
|
+
});
|
|
401
440
|
return; // drop — not a real UIMessageChunk
|
|
402
441
|
}
|
|
403
442
|
if (type === TRIGGER_SESSION_STATE) {
|
|
@@ -408,12 +447,61 @@ class TriggerChatTransport {
|
|
|
408
447
|
return; // drop
|
|
409
448
|
}
|
|
410
449
|
}
|
|
450
|
+
if (!sawFirstChunk) {
|
|
451
|
+
sawFirstChunk = true;
|
|
452
|
+
emit({
|
|
453
|
+
type: "first-chunk",
|
|
454
|
+
chatId,
|
|
455
|
+
timestamp: Date.now(),
|
|
456
|
+
chunkType: chunk?.type,
|
|
457
|
+
...attribution(),
|
|
458
|
+
});
|
|
459
|
+
}
|
|
411
460
|
controller.enqueue(chunk);
|
|
412
461
|
},
|
|
413
462
|
flush() {
|
|
414
463
|
clearStreaming();
|
|
415
464
|
},
|
|
416
465
|
}));
|
|
466
|
+
// Pump wrapper: a TransformStream can't observe upstream errors, so
|
|
467
|
+
// read here to emit stream-error (aborts close cleanly, matching the
|
|
468
|
+
// session subscribe path).
|
|
469
|
+
const pipedReader = piped.getReader();
|
|
470
|
+
return new ReadableStream({
|
|
471
|
+
async pull(controller) {
|
|
472
|
+
try {
|
|
473
|
+
const next = await pipedReader.read();
|
|
474
|
+
if (next.done) {
|
|
475
|
+
controller.close();
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
controller.enqueue(next.value);
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
482
|
+
try {
|
|
483
|
+
controller.close();
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
/* already closed */
|
|
487
|
+
}
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
const errorStatus = error.status;
|
|
491
|
+
emit({
|
|
492
|
+
type: "stream-error",
|
|
493
|
+
chatId,
|
|
494
|
+
timestamp: Date.now(),
|
|
495
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
496
|
+
status: typeof errorStatus === "number" ? errorStatus : undefined,
|
|
497
|
+
});
|
|
498
|
+
controller.error(error);
|
|
499
|
+
}
|
|
500
|
+
},
|
|
501
|
+
cancel(reason) {
|
|
502
|
+
return pipedReader.cancel(reason);
|
|
503
|
+
},
|
|
504
|
+
});
|
|
417
505
|
}
|
|
418
506
|
/**
|
|
419
507
|
* Send a steering message during an active stream without disrupting
|
|
@@ -434,11 +522,12 @@ class TriggerChatTransport {
|
|
|
434
522
|
metadata: mergedMetadata,
|
|
435
523
|
};
|
|
436
524
|
const partId = crypto.randomUUID();
|
|
525
|
+
const serializedBody = this.serializeInputChunk({ kind: "message", payload: wirePayload });
|
|
437
526
|
const send = async (token) => {
|
|
438
|
-
await this.appendInputChunk(chatId, token,
|
|
527
|
+
await this.appendInputChunk(chatId, token, serializedBody, partId);
|
|
439
528
|
};
|
|
440
529
|
try {
|
|
441
|
-
await this.callWithAuthRetry(chatId, state, send);
|
|
530
|
+
await this.sendWithEvents(chatId, "steer", { messageId: message.id, partId, bodyBytes: byteLength(serializedBody) }, () => this.callWithAuthRetry(chatId, state, send));
|
|
442
531
|
return true;
|
|
443
532
|
}
|
|
444
533
|
catch {
|
|
@@ -464,6 +553,7 @@ class TriggerChatTransport {
|
|
|
464
553
|
? AbortSignal.any([options.abortSignal, abortController.signal])
|
|
465
554
|
: abortController.signal;
|
|
466
555
|
return this.subscribeToSessionStream(state, abortSignal, options.chatId, {
|
|
556
|
+
resumed: true,
|
|
467
557
|
sendStopOnAbort: !!options.abortSignal,
|
|
468
558
|
// Reconnect-on-reload opts into the server's settled-peek shortcut
|
|
469
559
|
// so the SSE doesn't hang for 60s when no turn is in flight. Active
|
|
@@ -482,11 +572,12 @@ class TriggerChatTransport {
|
|
|
482
572
|
if (!state)
|
|
483
573
|
return false;
|
|
484
574
|
const partId = crypto.randomUUID();
|
|
575
|
+
const serializedBody = this.serializeInputChunk({ kind: "stop" });
|
|
485
576
|
const send = async (token) => {
|
|
486
|
-
await this.appendInputChunk(chatId, token,
|
|
577
|
+
await this.appendInputChunk(chatId, token, serializedBody, partId);
|
|
487
578
|
};
|
|
488
579
|
try {
|
|
489
|
-
await this.callWithAuthRetry(chatId, state, send);
|
|
580
|
+
await this.sendWithEvents(chatId, "stop", { partId, bodyBytes: byteLength(serializedBody) }, () => this.callWithAuthRetry(chatId, state, send));
|
|
490
581
|
}
|
|
491
582
|
catch {
|
|
492
583
|
return false;
|
|
@@ -532,7 +623,7 @@ class TriggerChatTransport {
|
|
|
532
623
|
const send = async (token) => {
|
|
533
624
|
await this.appendInputChunk(chatId, token, body, partId);
|
|
534
625
|
};
|
|
535
|
-
await this.callWithAuthRetry(chatId, state, send);
|
|
626
|
+
await this.sendWithEvents(chatId, "action", { partId, bodyBytes: byteLength(body) }, () => this.callWithAuthRetry(chatId, state, send));
|
|
536
627
|
// Supersede any in-flight reader before subscribing — same as
|
|
537
628
|
// `sendMessages`. Two concurrent readers both write `state.lastEventId`
|
|
538
629
|
// and the slower one can regress the cursor, replaying records on the
|
|
@@ -568,6 +659,61 @@ class TriggerChatTransport {
|
|
|
568
659
|
setOnSessionChange(callback) {
|
|
569
660
|
this._onSessionChange = callback;
|
|
570
661
|
}
|
|
662
|
+
/** Update the `onEvent` callback without recreating the transport. */
|
|
663
|
+
setOnEvent(callback) {
|
|
664
|
+
this._onEvent = callback;
|
|
665
|
+
}
|
|
666
|
+
emitEvent(event) {
|
|
667
|
+
const cb = this._onEvent;
|
|
668
|
+
if (!cb)
|
|
669
|
+
return;
|
|
670
|
+
try {
|
|
671
|
+
cb(event);
|
|
672
|
+
}
|
|
673
|
+
catch {
|
|
674
|
+
// observability must never break the chat
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
/** Run a send op, emitting the terminal message-sent / message-send-failed event. */
|
|
678
|
+
async sendWithEvents(chatId, source, extras, op) {
|
|
679
|
+
const startedAt = Date.now();
|
|
680
|
+
try {
|
|
681
|
+
await op();
|
|
682
|
+
const turnProducing = source === "submit-message" || source === "regenerate-message" || source === "head-start";
|
|
683
|
+
if (turnProducing) {
|
|
684
|
+
this.lastTurnSends.set(chatId, { messageId: extras.messageId, at: Date.now() });
|
|
685
|
+
}
|
|
686
|
+
this.emitEvent({
|
|
687
|
+
type: "message-sent",
|
|
688
|
+
chatId,
|
|
689
|
+
timestamp: Date.now(),
|
|
690
|
+
source,
|
|
691
|
+
durationMs: Date.now() - startedAt,
|
|
692
|
+
...extras,
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
catch (error) {
|
|
696
|
+
const status = error.status;
|
|
697
|
+
this.emitEvent({
|
|
698
|
+
type: "message-send-failed",
|
|
699
|
+
chatId,
|
|
700
|
+
timestamp: Date.now(),
|
|
701
|
+
source,
|
|
702
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
703
|
+
status: typeof status === "number" ? status : undefined,
|
|
704
|
+
durationMs: Date.now() - startedAt,
|
|
705
|
+
...extras,
|
|
706
|
+
});
|
|
707
|
+
throw error;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
/** Attribution fields for response-side events. */
|
|
711
|
+
turnAttribution(chatId) {
|
|
712
|
+
const lastSend = this.lastTurnSends.get(chatId);
|
|
713
|
+
if (!lastSend)
|
|
714
|
+
return {};
|
|
715
|
+
return { messageId: lastSend.messageId, sinceSendMs: Date.now() - lastSend.at };
|
|
716
|
+
}
|
|
571
717
|
/**
|
|
572
718
|
* Update the transport's `clientData`. Used by `useTriggerChatTransport`
|
|
573
719
|
* to keep the latest value reachable from inside `startSession` and
|
|
@@ -934,6 +1080,15 @@ class TriggerChatTransport {
|
|
|
934
1080
|
throw e;
|
|
935
1081
|
}
|
|
936
1082
|
}
|
|
1083
|
+
this.emitEvent({
|
|
1084
|
+
type: "stream-connected",
|
|
1085
|
+
chatId,
|
|
1086
|
+
timestamp: Date.now(),
|
|
1087
|
+
resumed: options?.resumed ?? false,
|
|
1088
|
+
lastEventId: state.lastEventId,
|
|
1089
|
+
messageId: this.lastTurnSends.get(chatId)?.messageId,
|
|
1090
|
+
});
|
|
1091
|
+
let sawFirstChunk = false;
|
|
937
1092
|
while (true) {
|
|
938
1093
|
let value;
|
|
939
1094
|
if (primed !== undefined) {
|
|
@@ -1005,12 +1160,22 @@ class TriggerChatTransport {
|
|
|
1005
1160
|
if (refreshedToken) {
|
|
1006
1161
|
state.publicAccessToken = refreshedToken;
|
|
1007
1162
|
}
|
|
1163
|
+
this.emitEvent({
|
|
1164
|
+
type: "turn-completed",
|
|
1165
|
+
chatId,
|
|
1166
|
+
timestamp: Date.now(),
|
|
1167
|
+
lastEventId: state.lastEventId,
|
|
1168
|
+
sessionInEventId: (0, v3_1.headerValue)(value.headers, v3_1.SESSION_IN_EVENT_ID_HEADER),
|
|
1169
|
+
...this.turnAttribution(chatId),
|
|
1170
|
+
});
|
|
1008
1171
|
state.isStreaming = false;
|
|
1009
1172
|
this.notifySessionChange(chatId, state);
|
|
1010
1173
|
this.coordinator?.release(chatId);
|
|
1011
1174
|
this.coordinator?.broadcastSession(chatId, {
|
|
1012
1175
|
lastEventId: state.lastEventId,
|
|
1013
1176
|
});
|
|
1177
|
+
// Re-arm per-turn events for watch mode's next turn.
|
|
1178
|
+
sawFirstChunk = false;
|
|
1014
1179
|
if (this.watchMode)
|
|
1015
1180
|
continue;
|
|
1016
1181
|
internalAbort.abort();
|
|
@@ -1027,6 +1192,17 @@ class TriggerChatTransport {
|
|
|
1027
1192
|
// JSON unwrap). Drop empty/malformed payloads defensively.
|
|
1028
1193
|
if (value.chunk == null)
|
|
1029
1194
|
continue;
|
|
1195
|
+
if (!sawFirstChunk) {
|
|
1196
|
+
sawFirstChunk = true;
|
|
1197
|
+
this.emitEvent({
|
|
1198
|
+
type: "first-chunk",
|
|
1199
|
+
chatId,
|
|
1200
|
+
timestamp: Date.now(),
|
|
1201
|
+
chunkType: value.chunk.type,
|
|
1202
|
+
lastEventId: value.id || undefined,
|
|
1203
|
+
...this.turnAttribution(chatId),
|
|
1204
|
+
});
|
|
1205
|
+
}
|
|
1030
1206
|
controller.enqueue(value.chunk);
|
|
1031
1207
|
}
|
|
1032
1208
|
}
|
|
@@ -1040,6 +1216,14 @@ class TriggerChatTransport {
|
|
|
1040
1216
|
}
|
|
1041
1217
|
return;
|
|
1042
1218
|
}
|
|
1219
|
+
const errorStatus = error.status;
|
|
1220
|
+
this.emitEvent({
|
|
1221
|
+
type: "stream-error",
|
|
1222
|
+
chatId,
|
|
1223
|
+
timestamp: Date.now(),
|
|
1224
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
1225
|
+
status: typeof errorStatus === "number" ? errorStatus : undefined,
|
|
1226
|
+
});
|
|
1043
1227
|
controller.error(error);
|
|
1044
1228
|
}
|
|
1045
1229
|
finally {
|