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