@trigger.dev/sdk 4.4.6 → 4.5.0-rc.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 (161) hide show
  1. package/dist/commonjs/v3/agentSkillsRuntime.d.ts +28 -0
  2. package/dist/commonjs/v3/agentSkillsRuntime.js +163 -0
  3. package/dist/commonjs/v3/agentSkillsRuntime.js.map +1 -0
  4. package/dist/commonjs/v3/ai-shared.d.ts +173 -0
  5. package/dist/commonjs/v3/ai-shared.js +25 -0
  6. package/dist/commonjs/v3/ai-shared.js.map +1 -0
  7. package/dist/commonjs/v3/ai.d.ts +2823 -5
  8. package/dist/commonjs/v3/ai.js +6197 -13
  9. package/dist/commonjs/v3/ai.js.map +1 -1
  10. package/dist/commonjs/v3/auth.d.ts +9 -0
  11. package/dist/commonjs/v3/auth.js.map +1 -1
  12. package/dist/commonjs/v3/chat-client.d.ts +301 -0
  13. package/dist/commonjs/v3/chat-client.js +624 -0
  14. package/dist/commonjs/v3/chat-client.js.map +1 -0
  15. package/dist/commonjs/v3/chat-react.d.ts +155 -0
  16. package/dist/commonjs/v3/chat-react.js +330 -0
  17. package/dist/commonjs/v3/chat-react.js.map +1 -0
  18. package/dist/commonjs/v3/chat-server.d.ts +206 -0
  19. package/dist/commonjs/v3/chat-server.js +737 -0
  20. package/dist/commonjs/v3/chat-server.js.map +1 -0
  21. package/dist/commonjs/v3/chat-server.test.d.ts +1 -0
  22. package/dist/commonjs/v3/chat-server.test.js +518 -0
  23. package/dist/commonjs/v3/chat-server.test.js.map +1 -0
  24. package/dist/commonjs/v3/chat-tab-coordinator.d.ts +65 -0
  25. package/dist/commonjs/v3/chat-tab-coordinator.js +235 -0
  26. package/dist/commonjs/v3/chat-tab-coordinator.js.map +1 -0
  27. package/dist/commonjs/v3/chat-tab-coordinator.test.d.ts +1 -0
  28. package/dist/commonjs/v3/chat-tab-coordinator.test.js +140 -0
  29. package/dist/commonjs/v3/chat-tab-coordinator.test.js.map +1 -0
  30. package/dist/commonjs/v3/chat.d.ts +437 -0
  31. package/dist/commonjs/v3/chat.js +968 -0
  32. package/dist/commonjs/v3/chat.js.map +1 -0
  33. package/dist/commonjs/v3/chat.test.d.ts +1 -0
  34. package/dist/commonjs/v3/chat.test.js +1180 -0
  35. package/dist/commonjs/v3/chat.test.js.map +1 -0
  36. package/dist/commonjs/v3/createStartSessionAction.test.d.ts +1 -0
  37. package/dist/commonjs/v3/createStartSessionAction.test.js +113 -0
  38. package/dist/commonjs/v3/createStartSessionAction.test.js.map +1 -0
  39. package/dist/commonjs/v3/deployments.d.ts +26 -0
  40. package/dist/commonjs/v3/deployments.js +37 -0
  41. package/dist/commonjs/v3/deployments.js.map +1 -0
  42. package/dist/commonjs/v3/index.d.ts +6 -3
  43. package/dist/commonjs/v3/index.js +7 -1
  44. package/dist/commonjs/v3/index.js.map +1 -1
  45. package/dist/commonjs/v3/runs.d.ts +22 -7
  46. package/dist/commonjs/v3/runs.js +1 -0
  47. package/dist/commonjs/v3/runs.js.map +1 -1
  48. package/dist/commonjs/v3/sessions.d.ts +228 -0
  49. package/dist/commonjs/v3/sessions.js +664 -0
  50. package/dist/commonjs/v3/sessions.js.map +1 -0
  51. package/dist/commonjs/v3/sessions.test.d.ts +1 -0
  52. package/dist/commonjs/v3/sessions.test.js +154 -0
  53. package/dist/commonjs/v3/sessions.test.js.map +1 -0
  54. package/dist/commonjs/v3/shared.d.ts +24 -2
  55. package/dist/commonjs/v3/shared.js +189 -1
  56. package/dist/commonjs/v3/shared.js.map +1 -1
  57. package/dist/commonjs/v3/skill.d.ts +99 -0
  58. package/dist/commonjs/v3/skill.js +155 -0
  59. package/dist/commonjs/v3/skill.js.map +1 -0
  60. package/dist/commonjs/v3/skills.d.ts +2 -0
  61. package/dist/commonjs/v3/skills.js +6 -0
  62. package/dist/commonjs/v3/skills.js.map +1 -0
  63. package/dist/commonjs/v3/streams.js +127 -19
  64. package/dist/commonjs/v3/streams.js.map +1 -1
  65. package/dist/commonjs/v3/tasks.d.ts +2 -1
  66. package/dist/commonjs/v3/tasks.js +1 -0
  67. package/dist/commonjs/v3/tasks.js.map +1 -1
  68. package/dist/commonjs/v3/test/index.d.ts +3 -0
  69. package/dist/commonjs/v3/test/index.js +18 -0
  70. package/dist/commonjs/v3/test/index.js.map +1 -0
  71. package/dist/commonjs/v3/test/mock-chat-agent.d.ts +259 -0
  72. package/dist/commonjs/v3/test/mock-chat-agent.js +468 -0
  73. package/dist/commonjs/v3/test/mock-chat-agent.js.map +1 -0
  74. package/dist/commonjs/v3/test/setup-catalog.d.ts +1 -0
  75. package/dist/commonjs/v3/test/setup-catalog.js +18 -0
  76. package/dist/commonjs/v3/test/setup-catalog.js.map +1 -0
  77. package/dist/commonjs/v3/test/test-session-handle.d.ts +53 -0
  78. package/dist/commonjs/v3/test/test-session-handle.js +256 -0
  79. package/dist/commonjs/v3/test/test-session-handle.js.map +1 -0
  80. package/dist/commonjs/version.js +1 -1
  81. package/dist/esm/v3/agentSkillsRuntime.d.ts +28 -0
  82. package/dist/esm/v3/agentSkillsRuntime.js +136 -0
  83. package/dist/esm/v3/agentSkillsRuntime.js.map +1 -0
  84. package/dist/esm/v3/ai-shared.d.ts +173 -0
  85. package/dist/esm/v3/ai-shared.js +22 -0
  86. package/dist/esm/v3/ai-shared.js.map +1 -0
  87. package/dist/esm/v3/ai.d.ts +2823 -5
  88. package/dist/esm/v3/ai.js +6187 -14
  89. package/dist/esm/v3/ai.js.map +1 -1
  90. package/dist/esm/v3/auth.d.ts +9 -0
  91. package/dist/esm/v3/auth.js.map +1 -1
  92. package/dist/esm/v3/chat-client.d.ts +301 -0
  93. package/dist/esm/v3/chat-client.js +619 -0
  94. package/dist/esm/v3/chat-client.js.map +1 -0
  95. package/dist/esm/v3/chat-react.d.ts +155 -0
  96. package/dist/esm/v3/chat-react.js +325 -0
  97. package/dist/esm/v3/chat-react.js.map +1 -0
  98. package/dist/esm/v3/chat-server.d.ts +206 -0
  99. package/dist/esm/v3/chat-server.js +734 -0
  100. package/dist/esm/v3/chat-server.js.map +1 -0
  101. package/dist/esm/v3/chat-server.test.d.ts +1 -0
  102. package/dist/esm/v3/chat-server.test.js +516 -0
  103. package/dist/esm/v3/chat-server.test.js.map +1 -0
  104. package/dist/esm/v3/chat-tab-coordinator.d.ts +65 -0
  105. package/dist/esm/v3/chat-tab-coordinator.js +231 -0
  106. package/dist/esm/v3/chat-tab-coordinator.js.map +1 -0
  107. package/dist/esm/v3/chat-tab-coordinator.test.d.ts +1 -0
  108. package/dist/esm/v3/chat-tab-coordinator.test.js +138 -0
  109. package/dist/esm/v3/chat-tab-coordinator.test.js.map +1 -0
  110. package/dist/esm/v3/chat.d.ts +437 -0
  111. package/dist/esm/v3/chat.js +961 -0
  112. package/dist/esm/v3/chat.js.map +1 -0
  113. package/dist/esm/v3/chat.test.d.ts +1 -0
  114. package/dist/esm/v3/chat.test.js +1178 -0
  115. package/dist/esm/v3/chat.test.js.map +1 -0
  116. package/dist/esm/v3/createStartSessionAction.test.d.ts +1 -0
  117. package/dist/esm/v3/createStartSessionAction.test.js +111 -0
  118. package/dist/esm/v3/createStartSessionAction.test.js.map +1 -0
  119. package/dist/esm/v3/deployments.d.ts +26 -0
  120. package/dist/esm/v3/deployments.js +34 -0
  121. package/dist/esm/v3/deployments.js.map +1 -0
  122. package/dist/esm/v3/index.d.ts +6 -3
  123. package/dist/esm/v3/index.js +4 -1
  124. package/dist/esm/v3/index.js.map +1 -1
  125. package/dist/esm/v3/runs.d.ts +15 -0
  126. package/dist/esm/v3/runs.js +1 -0
  127. package/dist/esm/v3/runs.js.map +1 -1
  128. package/dist/esm/v3/sessions.d.ts +228 -0
  129. package/dist/esm/v3/sessions.js +656 -0
  130. package/dist/esm/v3/sessions.js.map +1 -0
  131. package/dist/esm/v3/sessions.test.d.ts +1 -0
  132. package/dist/esm/v3/sessions.test.js +152 -0
  133. package/dist/esm/v3/sessions.test.js.map +1 -0
  134. package/dist/esm/v3/shared.d.ts +24 -2
  135. package/dist/esm/v3/shared.js +188 -1
  136. package/dist/esm/v3/shared.js.map +1 -1
  137. package/dist/esm/v3/skill.d.ts +99 -0
  138. package/dist/esm/v3/skill.js +128 -0
  139. package/dist/esm/v3/skill.js.map +1 -0
  140. package/dist/esm/v3/skills.d.ts +2 -0
  141. package/dist/esm/v3/skills.js +2 -0
  142. package/dist/esm/v3/skills.js.map +1 -0
  143. package/dist/esm/v3/streams.js +127 -20
  144. package/dist/esm/v3/streams.js.map +1 -1
  145. package/dist/esm/v3/tasks.d.ts +2 -1
  146. package/dist/esm/v3/tasks.js +2 -1
  147. package/dist/esm/v3/tasks.js.map +1 -1
  148. package/dist/esm/v3/test/index.d.ts +3 -0
  149. package/dist/esm/v3/test/index.js +13 -0
  150. package/dist/esm/v3/test/index.js.map +1 -0
  151. package/dist/esm/v3/test/mock-chat-agent.d.ts +259 -0
  152. package/dist/esm/v3/test/mock-chat-agent.js +465 -0
  153. package/dist/esm/v3/test/mock-chat-agent.js.map +1 -0
  154. package/dist/esm/v3/test/setup-catalog.d.ts +1 -0
  155. package/dist/esm/v3/test/setup-catalog.js +16 -0
  156. package/dist/esm/v3/test/setup-catalog.js.map +1 -0
  157. package/dist/esm/v3/test/test-session-handle.d.ts +53 -0
  158. package/dist/esm/v3/test/test-session-handle.js +251 -0
  159. package/dist/esm/v3/test/test-session-handle.js.map +1 -0
  160. package/dist/esm/version.js +1 -1
  161. package/package.json +87 -6
@@ -0,0 +1,624 @@
1
+ "use strict";
2
+ /**
3
+ * Server-side API for chatting with Trigger.dev agents.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { AgentChat } from "@trigger.dev/sdk/chat";
8
+ *
9
+ * const chat = new AgentChat<typeof myAgent>({
10
+ * agent: "my-agent",
11
+ * clientData: { userId: "user_123" },
12
+ * });
13
+ *
14
+ * const stream = await chat.sendMessage("Review PR #1");
15
+ * const text = await stream.text();
16
+ * await chat.close();
17
+ * ```
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.AgentChat = exports.ChatStream = void 0;
21
+ const ai_1 = require("ai");
22
+ const v3_1 = require("@trigger.dev/core/v3");
23
+ const sessions_js_1 = require("./sessions.js");
24
+ /**
25
+ * A single turn's response stream from an agent.
26
+ *
27
+ * Pick one consumption mode:
28
+ * - `for await (const chunk of stream)` — typed UIMessageChunk iteration
29
+ * - `await stream.result()` — accumulated `{ text, toolCalls, toolResults }`
30
+ * - `await stream.text()` — just the text
31
+ * - `yield* stream.messages()` — sub-agent pattern (yields UIMessage snapshots)
32
+ */
33
+ class ChatStream {
34
+ _consumerStream;
35
+ _messageCollector;
36
+ resultPromise;
37
+ /** @internal Last UIMessage snapshot from the assistant's response. */
38
+ lastAssistantMessage;
39
+ /** @internal Callback to capture the assistant's response message for accumulation. */
40
+ onAssistantMessage;
41
+ constructor(stream, onAssistantMessage) {
42
+ this.onAssistantMessage = onAssistantMessage;
43
+ if (onAssistantMessage) {
44
+ // Tee the stream: one branch for the consumer, one for message collection
45
+ const [consumer, collector] = stream.tee();
46
+ this._consumerStream = consumer;
47
+ this._messageCollector = (async () => {
48
+ for await (const msg of (0, ai_1.readUIMessageStream)({ stream: collector })) {
49
+ this.lastAssistantMessage = msg;
50
+ }
51
+ if (this.lastAssistantMessage) {
52
+ onAssistantMessage(this.lastAssistantMessage);
53
+ }
54
+ })();
55
+ }
56
+ else {
57
+ this._consumerStream = stream;
58
+ }
59
+ }
60
+ /** The raw ReadableStream for direct use with AI SDK utilities. */
61
+ get stream() {
62
+ return this._consumerStream;
63
+ }
64
+ async *[Symbol.asyncIterator]() {
65
+ const reader = this._consumerStream.getReader();
66
+ try {
67
+ while (true) {
68
+ const { done, value } = await reader.read();
69
+ if (done)
70
+ break;
71
+ yield value;
72
+ }
73
+ }
74
+ finally {
75
+ reader.releaseLock();
76
+ }
77
+ }
78
+ /**
79
+ * Yields accumulated UIMessage snapshots for the sub-agent tool pattern.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * const stream = await chat.sendMessage("Research this topic");
84
+ * yield* stream.messages();
85
+ * ```
86
+ */
87
+ async *messages() {
88
+ for await (const message of (0, ai_1.readUIMessageStream)({ stream: this._consumerStream })) {
89
+ this.lastAssistantMessage = message;
90
+ yield message;
91
+ }
92
+ // When the constructor set up `_messageCollector` (because
93
+ // `onAssistantMessage` was provided), that collector IIFE owns
94
+ // firing the callback. Skipping it here prevents a double-invoke.
95
+ if (this.lastAssistantMessage && this.onAssistantMessage && !this._messageCollector) {
96
+ this.onAssistantMessage(this.lastAssistantMessage);
97
+ }
98
+ }
99
+ /** Consume the stream and return the accumulated result. */
100
+ result() {
101
+ if (!this.resultPromise) {
102
+ this.resultPromise = this.consumeStream();
103
+ }
104
+ return this.resultPromise;
105
+ }
106
+ /** Consume the stream and return just the text. */
107
+ async text() {
108
+ return (await this.result()).text;
109
+ }
110
+ async consumeStream() {
111
+ let text = "";
112
+ const toolCalls = [];
113
+ const toolResults = [];
114
+ for await (const chunk of this) {
115
+ if (chunk.type === "text-delta") {
116
+ text += chunk.delta;
117
+ }
118
+ else if (chunk.type === "tool-input-available") {
119
+ toolCalls.push({
120
+ toolName: chunk.toolName,
121
+ toolCallId: chunk.toolCallId,
122
+ input: chunk.input,
123
+ });
124
+ }
125
+ else if (chunk.type === "tool-output-available") {
126
+ toolResults.push({
127
+ toolCallId: chunk.toolCallId,
128
+ output: chunk.output,
129
+ });
130
+ }
131
+ }
132
+ return { text, toolCalls, toolResults };
133
+ }
134
+ }
135
+ exports.ChatStream = ChatStream;
136
+ // ─── AgentChat ─────────────────────────────────────────────────────
137
+ /**
138
+ * A chat conversation with a Trigger.dev agent.
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * // Simple usage
143
+ * const chat = new AgentChat<typeof myAgent>({ agent: "my-agent" });
144
+ * const text = await (await chat.sendMessage("Hello")).text();
145
+ * await chat.close();
146
+ *
147
+ * // Stateless request handler — persist and restore session
148
+ * const chat = new AgentChat<typeof myAgent>({
149
+ * agent: "my-agent",
150
+ * id: chatId,
151
+ * session: { lastEventId: savedLastEventId },
152
+ * onTriggered: ({ runId }) => db.save(chatId, { runId }),
153
+ * onTurnComplete: ({ lastEventId }) => db.update(chatId, { lastEventId }),
154
+ * });
155
+ * ```
156
+ */
157
+ class AgentChat {
158
+ taskId;
159
+ chatId;
160
+ streamTimeoutSeconds;
161
+ clientData;
162
+ triggerConfigDefault;
163
+ onTriggered;
164
+ onTurnComplete;
165
+ baseURLResolver;
166
+ fetchOverride;
167
+ state;
168
+ constructor(options) {
169
+ this.taskId = options.agent;
170
+ this.chatId = options.id ?? crypto.randomUUID();
171
+ this.streamTimeoutSeconds = options.streamTimeoutSeconds ?? 120;
172
+ this.clientData = options.clientData;
173
+ this.triggerConfigDefault = options.triggerConfig;
174
+ this.onTriggered = options.onTriggered;
175
+ this.onTurnComplete = options.onTurnComplete;
176
+ const baseURLOption = options.baseURL;
177
+ this.baseURLResolver = typeof baseURLOption === "function"
178
+ ? baseURLOption
179
+ : () => baseURLOption ?? v3_1.apiClientManager.baseURL ?? "https://api.trigger.dev";
180
+ this.fetchOverride = options.fetch;
181
+ // Hydration: a non-empty `session` means the caller knows the
182
+ // session already exists (started in a previous request). Mark
183
+ // `started` so we don't re-`sessions.start()` on first message.
184
+ const hydrated = !!options.session;
185
+ this.state = {
186
+ lastEventId: options.session?.lastEventId,
187
+ started: hydrated,
188
+ };
189
+ }
190
+ /** The conversation ID. */
191
+ get id() {
192
+ return this.chatId;
193
+ }
194
+ /** Persistable session state — pass back via `options.session` to resume. */
195
+ get session() {
196
+ return { lastEventId: this.state.lastEventId };
197
+ }
198
+ /**
199
+ * Eagerly start the session — creates the row and triggers the first
200
+ * run. The agent's `onPreload` hook fires immediately. Idempotent: a
201
+ * second call is a no-op.
202
+ */
203
+ async preload(options) {
204
+ await this.ensureStarted({ idleTimeoutInSeconds: options?.idleTimeoutInSeconds });
205
+ return this.session;
206
+ }
207
+ /**
208
+ * Send a text message and get the response stream.
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * const stream = await chat.sendMessage("Review PR #1");
213
+ * const text = await stream.text();
214
+ * ```
215
+ */
216
+ async sendMessage(text, options) {
217
+ const msgId = `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
218
+ const message = {
219
+ id: msgId,
220
+ role: "user",
221
+ parts: [{ type: "text", text }],
222
+ };
223
+ const rawStream = await this.sendRaw([message], { abortSignal: options?.abortSignal });
224
+ return new ChatStream(rawStream);
225
+ }
226
+ /** Send raw UIMessage-like objects. Use `sendMessage()` for simple text. */
227
+ async sendRaw(messages, options) {
228
+ const triggerType = options?.trigger ?? "submit-message";
229
+ // Make sure the session exists (and a run is alive). The .in/append
230
+ // handler on the server probes currentRunId on every call and
231
+ // re-triggers if needed — so we don't need to track runId here.
232
+ await this.ensureStarted();
233
+ // Slim wire — at most ONE message per record. The agent rebuilds prior
234
+ // history from its durable S3 snapshot + session.out replay at run
235
+ // boot. `regenerate-message` omits `message` (the agent slices its own
236
+ // history). See plan vivid-humming-bonbon.
237
+ if (triggerType === "submit-message" && messages.length === 0) {
238
+ throw new Error("AgentChat.sendRaw: 'submit-message' trigger requires at least one message");
239
+ }
240
+ const lastIfSubmit = triggerType === "submit-message"
241
+ ? messages.at(-1)
242
+ : undefined;
243
+ const payload = {
244
+ ...(lastIfSubmit ? { message: lastIfSubmit } : {}),
245
+ chatId: this.chatId,
246
+ trigger: triggerType,
247
+ metadata: this.clientData,
248
+ };
249
+ await this.appendInputChunk(serializeInputChunk({ kind: "message", payload }));
250
+ return this.subscribeToSessionStream(options?.abortSignal);
251
+ }
252
+ /** Send a steering message during an active stream. */
253
+ async steer(text) {
254
+ if (!this.state.started)
255
+ return false;
256
+ const payload = {
257
+ message: {
258
+ id: `steer-${Date.now()}`,
259
+ role: "user",
260
+ parts: [{ type: "text", text }],
261
+ },
262
+ chatId: this.chatId,
263
+ trigger: "submit-message",
264
+ metadata: this.clientData,
265
+ };
266
+ try {
267
+ await this.appendInputChunk(serializeInputChunk({ kind: "message", payload }));
268
+ return true;
269
+ }
270
+ catch {
271
+ return false;
272
+ }
273
+ }
274
+ /** Stop the current generation (agent stays alive for next turn). */
275
+ async stop() {
276
+ if (!this.state.started)
277
+ return;
278
+ this.state.skipToTurnComplete = true;
279
+ await this.appendInputChunk(serializeInputChunk({ kind: "stop" })).catch(() => { });
280
+ }
281
+ /**
282
+ * Hand over from a `chat.handover` route handler to a parked
283
+ * `handover-prepare` agent run. Wakes the run, which seeds its
284
+ * accumulators with `partialAssistantMessage` and continues from
285
+ * tool execution onward — the model call for step 1 is skipped.
286
+ *
287
+ * Used internally by `chat.handover`; not part of the customer
288
+ * surface.
289
+ */
290
+ async sendHandover(args) {
291
+ await this.appendInputChunk(serializeInputChunk({
292
+ kind: "handover",
293
+ partialAssistantMessage: args.partialAssistantMessage,
294
+ messageId: args.messageId,
295
+ isFinal: args.isFinal,
296
+ }));
297
+ }
298
+ /**
299
+ * Tell a parked `handover-prepare` agent run that the customer's
300
+ * first turn finished pure-text (no tool calls) — the run exits
301
+ * cleanly without making an LLM call.
302
+ *
303
+ * Used internally by `chat.handover`; not part of the customer
304
+ * surface.
305
+ */
306
+ async sendHandoverSkip() {
307
+ await this.appendInputChunk(serializeInputChunk({ kind: "handover-skip" }));
308
+ }
309
+ /**
310
+ * Send a custom action to the agent.
311
+ *
312
+ * Actions are not turns. They wake the agent, fire `hydrateMessages`
313
+ * (if configured) and `onAction` only — no `onTurnStart` /
314
+ * `prepareMessages` / `onBeforeTurnComplete` / `onTurnComplete`, no
315
+ * `run()` invocation.
316
+ *
317
+ * The action payload is validated against the agent's `actionSchema`
318
+ * on the backend. Use `chat.history.*` inside `onAction` to mutate
319
+ * state. To produce a model response from the action, return a
320
+ * `StreamTextResult` (or `string` / `UIMessage`) from `onAction` —
321
+ * the returned stream is auto-piped over this stream. When `onAction`
322
+ * returns `void`, the action is side-effect-only and the returned
323
+ * stream completes immediately with `trigger:turn-complete`.
324
+ *
325
+ * @returns A `ChatStream`. For void actions the stream completes
326
+ * immediately. For actions that return a model response, the stream
327
+ * carries the assistant chunks.
328
+ *
329
+ * @example
330
+ * ```ts
331
+ * const stream = await agentChat.sendAction({ type: "undo" });
332
+ * for await (const chunk of stream) {
333
+ * if (chunk.type === "text-delta") process.stdout.write(chunk.delta);
334
+ * }
335
+ * ```
336
+ */
337
+ async sendAction(action, options) {
338
+ await this.ensureStarted();
339
+ const payload = {
340
+ chatId: this.chatId,
341
+ trigger: "action",
342
+ action,
343
+ metadata: this.clientData,
344
+ };
345
+ try {
346
+ await this.appendInputChunk(serializeInputChunk({ kind: "message", payload }));
347
+ }
348
+ catch {
349
+ throw new Error("Failed to send action. The session may have ended.");
350
+ }
351
+ const rawStream = this.subscribeToSessionStream(options?.abortSignal);
352
+ return new ChatStream(rawStream);
353
+ }
354
+ /** Close the conversation — agent exits its loop gracefully. */
355
+ async close() {
356
+ if (!this.state.started)
357
+ return false;
358
+ try {
359
+ await this.appendInputChunk(serializeInputChunk({
360
+ kind: "message",
361
+ payload: {
362
+ chatId: this.chatId,
363
+ trigger: "close",
364
+ },
365
+ }));
366
+ this.state = { ...this.state, started: false };
367
+ return true;
368
+ }
369
+ catch {
370
+ return false;
371
+ }
372
+ }
373
+ /** Reconnect to the response stream (e.g. after a disconnect). */
374
+ async reconnect(abortSignal) {
375
+ if (!this.state.started)
376
+ return null;
377
+ return this.subscribeToSessionStream(abortSignal, { sendStopOnAbort: false });
378
+ }
379
+ // ─── Private ───────────────────────────────────────────────────
380
+ resolveBaseURL(endpoint) {
381
+ return this.baseURLResolver({ endpoint, chatId: this.chatId }).replace(/\/$/, "");
382
+ }
383
+ async doFetch(ctx, url, init) {
384
+ return this.fetchOverride ? this.fetchOverride(url, init, ctx) : fetch(url, init);
385
+ }
386
+ async appendInputChunk(body) {
387
+ const accessToken = v3_1.apiClientManager.accessToken ?? "";
388
+ const ctx = { endpoint: "in", chatId: this.chatId };
389
+ const url = `${this.resolveBaseURL("in")}/realtime/v1/sessions/${encodeURIComponent(this.chatId)}/in/append`;
390
+ const headers = {
391
+ "Content-Type": "application/json",
392
+ Authorization: `Bearer ${accessToken}`,
393
+ "x-trigger-source": "sdk",
394
+ };
395
+ const response = await this.doFetch(ctx, url, { method: "POST", headers, body });
396
+ if (!response.ok) {
397
+ const text = await response.text().catch(() => "");
398
+ // Match the error shape that ApiClient/zodfetch produced before the
399
+ // inline-POST refactor so callers inspecting `error.name ===
400
+ // "TriggerApiError"` or `error.status` keep working.
401
+ const err = new Error(`appendToSessionStream failed: ${response.status} ${text}`);
402
+ err.name = "TriggerApiError";
403
+ err.status = response.status;
404
+ throw err;
405
+ }
406
+ }
407
+ /**
408
+ * Idempotent: `sessions.start` upserts on `(env, externalId)`. Two
409
+ * concurrent AgentChat instances on the same chatId converge to the
410
+ * same session.
411
+ */
412
+ async ensureStarted(options) {
413
+ if (this.state.started)
414
+ return;
415
+ const triggerConfig = {
416
+ basePayload: {
417
+ // `trigger: "preload"` mirrors the browser-mediated
418
+ // `chat.createStartSessionAction` shape so the agent runtime fires
419
+ // `onPreload` (not `onChatStart` with `preloaded: true`). Without
420
+ // this, AgentChat's first run skips both preload and start hooks,
421
+ // which is where customer apps typically upsert their Chat row.
422
+ // Slim wire — preload carries no message body.
423
+ trigger: "preload",
424
+ ...(this.triggerConfigDefault?.basePayload ?? {}),
425
+ chatId: this.chatId,
426
+ ...(this.clientData ? { metadata: this.clientData } : {}),
427
+ },
428
+ ...(this.triggerConfigDefault?.machine
429
+ ? { machine: this.triggerConfigDefault.machine }
430
+ : {}),
431
+ ...(this.triggerConfigDefault?.queue
432
+ ? { queue: this.triggerConfigDefault.queue }
433
+ : {}),
434
+ ...(this.triggerConfigDefault?.tags
435
+ ? { tags: this.triggerConfigDefault.tags }
436
+ : {}),
437
+ ...(this.triggerConfigDefault?.maxAttempts !== undefined
438
+ ? { maxAttempts: this.triggerConfigDefault.maxAttempts }
439
+ : {}),
440
+ ...(options?.idleTimeoutInSeconds !== undefined ||
441
+ this.triggerConfigDefault?.idleTimeoutInSeconds !== undefined
442
+ ? {
443
+ idleTimeoutInSeconds: options?.idleTimeoutInSeconds ??
444
+ this.triggerConfigDefault?.idleTimeoutInSeconds,
445
+ }
446
+ : {}),
447
+ };
448
+ const created = await sessions_js_1.sessions.start({
449
+ type: "chat.agent",
450
+ externalId: this.chatId,
451
+ taskIdentifier: this.taskId,
452
+ triggerConfig,
453
+ });
454
+ this.state.started = true;
455
+ await this.onTriggered?.({
456
+ runId: created.runId,
457
+ chatId: this.chatId,
458
+ });
459
+ }
460
+ subscribeToSessionStream(abortSignal, options) {
461
+ const state = this.state;
462
+ const accessToken = v3_1.apiClientManager.accessToken ?? "";
463
+ const onTurnComplete = this.onTurnComplete;
464
+ const chatId = this.chatId;
465
+ const sseCtx = { endpoint: "out", chatId };
466
+ const fetchOverride = this.fetchOverride;
467
+ const sseFetchClient = fetchOverride
468
+ ? ((input, init) => {
469
+ if (typeof input === "string") {
470
+ return fetchOverride(input, init ?? {}, sseCtx);
471
+ }
472
+ if (input instanceof URL) {
473
+ return fetchOverride(input.toString(), init ?? {}, sseCtx);
474
+ }
475
+ // Request — preserve its url + intrinsic init, let any provided
476
+ // init override on top (matches fetch(Request, init) semantics).
477
+ return fetchOverride(input.url, {
478
+ method: input.method,
479
+ headers: input.headers,
480
+ signal: input.signal,
481
+ ...(init ?? {}),
482
+ }, sseCtx);
483
+ })
484
+ : undefined;
485
+ const internalAbort = new AbortController();
486
+ const combinedSignal = abortSignal
487
+ ? AbortSignal.any([abortSignal, internalAbort.signal])
488
+ : internalAbort.signal;
489
+ if (abortSignal) {
490
+ abortSignal.addEventListener("abort", () => {
491
+ if (options?.sendStopOnAbort !== false) {
492
+ state.skipToTurnComplete = true;
493
+ this.appendInputChunk(serializeInputChunk({ kind: "stop" })).catch(() => { });
494
+ }
495
+ internalAbort.abort();
496
+ }, { once: true });
497
+ }
498
+ const streamUrl = `${this.resolveBaseURL("out")}/realtime/v1/sessions/${encodeURIComponent(chatId)}/out`;
499
+ return new ReadableStream({
500
+ start: async (controller) => {
501
+ try {
502
+ const subscription = new v3_1.SSEStreamSubscription(streamUrl, {
503
+ headers: {
504
+ Authorization: `Bearer ${accessToken}`,
505
+ },
506
+ signal: combinedSignal,
507
+ timeoutInSeconds: this.streamTimeoutSeconds,
508
+ lastEventId: state.lastEventId,
509
+ fetchClient: sseFetchClient,
510
+ });
511
+ const sseStream = await subscription.subscribe();
512
+ const reader = sseStream.getReader();
513
+ try {
514
+ while (true) {
515
+ const next = await reader.read();
516
+ if (next.done) {
517
+ controller.close();
518
+ return;
519
+ }
520
+ if (combinedSignal.aborted) {
521
+ internalAbort.abort();
522
+ await reader.cancel();
523
+ controller.close();
524
+ return;
525
+ }
526
+ const value = next.value;
527
+ if (value.id)
528
+ state.lastEventId = value.id;
529
+ // Trigger control records (turn-complete, upgrade-required)
530
+ // route by header — see `client-protocol.mdx`. Their bodies
531
+ // are empty; everything substantive is on `value.headers`.
532
+ //
533
+ // Cross-version bridge: an old agent SDK still writing
534
+ // turn-complete / upgrade-required as `chunk.type` data
535
+ // records would otherwise stall this loop. Fall back to
536
+ // the legacy chunk-type form when no header is present
537
+ // so the deploy-skew window between an `AgentChat`
538
+ // consumer and a not-yet-redeployed agent doesn't hang.
539
+ let controlValue = (0, v3_1.controlSubtype)(value.headers);
540
+ if (!controlValue && value.chunk && typeof value.chunk === "object") {
541
+ const chunk = value.chunk;
542
+ if (chunk.type === "trigger:turn-complete") {
543
+ controlValue = v3_1.TRIGGER_CONTROL_SUBTYPE.TURN_COMPLETE;
544
+ }
545
+ else if (chunk.type === "trigger:upgrade-required") {
546
+ controlValue = v3_1.TRIGGER_CONTROL_SUBTYPE.UPGRADE_REQUIRED;
547
+ }
548
+ else if (typeof chunk.type === "string" && chunk.type.startsWith("trigger:")) {
549
+ // Future / unknown `trigger:*` legacy control type —
550
+ // drop so it doesn't leak as a UIMessageChunk.
551
+ continue;
552
+ }
553
+ }
554
+ if (state.skipToTurnComplete) {
555
+ if (controlValue === v3_1.TRIGGER_CONTROL_SUBTYPE.TURN_COMPLETE) {
556
+ state.skipToTurnComplete = false;
557
+ }
558
+ continue;
559
+ }
560
+ if (controlValue === v3_1.TRIGGER_CONTROL_SUBTYPE.UPGRADE_REQUIRED) {
561
+ // Server has already triggered the new run via
562
+ // `end-and-continue`; v2's chunks arrive on the same
563
+ // S2 stream. Filter the marker for cleanliness and
564
+ // keep reading.
565
+ continue;
566
+ }
567
+ if (controlValue === v3_1.TRIGGER_CONTROL_SUBTYPE.TURN_COMPLETE) {
568
+ // Customer's callback may be async (e.g. persisting
569
+ // lastEventId to a DB). Wrap so a rejected Promise
570
+ // doesn't surface as an unhandled rejection — that
571
+ // would crash Node under `--unhandled-rejections=throw`.
572
+ Promise.resolve(onTurnComplete?.({
573
+ chatId,
574
+ lastEventId: state.lastEventId,
575
+ })).catch(() => { });
576
+ internalAbort.abort();
577
+ try {
578
+ controller.close();
579
+ }
580
+ catch {
581
+ // Controller may already be closed
582
+ }
583
+ return;
584
+ }
585
+ // Data record — `value.chunk` is the parsed UIMessageChunk
586
+ // (the SSE parser does the JSON envelope unwrap). Drop
587
+ // empty/malformed payloads defensively.
588
+ if (value.chunk == null)
589
+ continue;
590
+ controller.enqueue(value.chunk);
591
+ }
592
+ }
593
+ catch (readError) {
594
+ reader.releaseLock();
595
+ throw readError;
596
+ }
597
+ }
598
+ catch (error) {
599
+ if (error instanceof Error && error.name === "AbortError") {
600
+ try {
601
+ controller.close();
602
+ }
603
+ catch {
604
+ // Controller may already be closed
605
+ }
606
+ return;
607
+ }
608
+ controller.error(error);
609
+ }
610
+ },
611
+ });
612
+ }
613
+ }
614
+ exports.AgentChat = AgentChat;
615
+ /**
616
+ * Serialize a {@link ChatInputChunk} for `POST …/sessions/:session/:io/append`.
617
+ * Session channel records are raw JSON strings — the server wraps them
618
+ * in `{ data: <body>, id }` for S2 storage and the subscribe side
619
+ * parses the string back for consumers.
620
+ */
621
+ function serializeInputChunk(chunk) {
622
+ return JSON.stringify(chunk);
623
+ }
624
+ //# sourceMappingURL=chat-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-client.js","sourceRoot":"","sources":["../../../src/v3/chat-client.ts"],"names":[],"mappings":"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"}