@trigger.dev/sdk 0.0.0-chat-prerelease-20260417152143 → 0.0.0-chat-prerelease-20260418083610

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.
@@ -112,12 +112,39 @@ function useMultiTabChat(transport, chatId, messages, setMessages) {
112
112
  }, [transport, chatId]);
113
113
  // Active tab: broadcast messages to other tabs on change.
114
114
  // Only broadcast when THIS tab holds the claim (is the current sender).
115
- // Using !isReadOnly alone causes a feedback loop when both tabs are idle.
115
+ // Deferred via requestIdleCallback so the structured clone in
116
+ // BroadcastChannel.postMessage never blocks rendering during streaming.
117
+ const idleRef = (0, react_1.useRef)(null);
118
+ const latestMessagesRef = (0, react_1.useRef)(messages);
119
+ latestMessagesRef.current = messages;
116
120
  (0, react_1.useEffect)(() => {
117
- if (transport.hasClaim(chatId) && messages.length > 0) {
118
- transport.broadcastMessages(chatId, messages);
119
- }
121
+ if (!transport.hasClaim(chatId) || messages.length === 0)
122
+ return;
123
+ if (idleRef.current !== null)
124
+ return; // Already scheduled
125
+ const schedule = typeof requestIdleCallback === "function"
126
+ ? requestIdleCallback
127
+ : (fn) => setTimeout(fn, 50);
128
+ idleRef.current = schedule(() => {
129
+ idleRef.current = null;
130
+ if (transport.hasClaim(chatId)) {
131
+ transport.broadcastMessages(chatId, latestMessagesRef.current);
132
+ }
133
+ });
120
134
  }, [transport, chatId, messages]);
135
+ // Flush final state when claim is released (turn complete)
136
+ (0, react_1.useEffect)(() => {
137
+ if (!transport.hasClaim(chatId) && latestMessagesRef.current.length > 0) {
138
+ if (idleRef.current !== null) {
139
+ const cancel = typeof cancelIdleCallback === "function"
140
+ ? cancelIdleCallback
141
+ : clearTimeout;
142
+ cancel(idleRef.current);
143
+ idleRef.current = null;
144
+ }
145
+ transport.broadcastMessages(chatId, latestMessagesRef.current);
146
+ }
147
+ }, [transport, chatId, isReadOnly]);
121
148
  // Read-only tab: receive messages from the active tab
122
149
  (0, react_1.useEffect)(() => {
123
150
  const listener = (id, msgs) => {
@@ -1 +1 @@
1
- {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import "./setup-catalog.js";
2
+ export { mockChatAgent, type MockChatAgentOptions, type MockChatAgentHarness, type MockChatAgentTurn, } from "./mock-chat-agent.js";
3
+ export { runInMockTaskContext, type MockTaskContextDrivers, type MockTaskContextOptions, } from "@trigger.dev/core/v3/test";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runInMockTaskContext = exports.mockChatAgent = void 0;
4
+ // Importing this module installs an in-memory resource catalog so that
5
+ // chat.agent() calls (which run at import time) register their task
6
+ // functions where the test harness can find them.
7
+ //
8
+ // Users should import `@trigger.dev/sdk/ai/test` BEFORE their agent
9
+ // modules so the registration side-effect runs first.
10
+ require("./setup-catalog.js");
11
+ var mock_chat_agent_js_1 = require("./mock-chat-agent.js");
12
+ Object.defineProperty(exports, "mockChatAgent", { enumerable: true, get: function () { return mock_chat_agent_js_1.mockChatAgent; } });
13
+ // Re-export the lower-level task context harness so consumers can build
14
+ // their own test helpers without adding a separate `@trigger.dev/core`
15
+ // dependency to their reference projects.
16
+ var test_1 = require("@trigger.dev/core/v3/test");
17
+ Object.defineProperty(exports, "runInMockTaskContext", { enumerable: true, get: function () { return test_1.runInMockTaskContext; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/v3/test/index.ts"],"names":[],"mappings":";;;AAAA,uEAAuE;AACvE,oEAAoE;AACpE,kDAAkD;AAClD,EAAE;AACF,oEAAoE;AACpE,sDAAsD;AACtD,8BAA4B;AAE5B,2DAK8B;AAJ5B,mHAAA,aAAa,OAAA;AAMf,wEAAwE;AACxE,uEAAuE;AACvE,0CAA0C;AAC1C,kDAImC;AAHjC,4GAAA,oBAAoB,OAAA"}
@@ -0,0 +1,121 @@
1
+ import type { UIMessage, UIMessageChunk } from "ai";
2
+ import type { LocalsKey } from "@trigger.dev/core/v3";
3
+ import { type MockTaskContextOptions } from "@trigger.dev/core/v3/test";
4
+ /** Pre-seed locals before the agent's `run()` starts. */
5
+ export type SetupLocals = (locals: {
6
+ set<T>(key: LocalsKey<T>, value: T): void;
7
+ }) => void | Promise<void>;
8
+ /** A reference to a `chat.agent` task returned by `chat.agent({ id, ... })`. */
9
+ type ChatAgentHandle = {
10
+ id: string;
11
+ };
12
+ /**
13
+ * Options for `mockChatAgent`.
14
+ */
15
+ export type MockChatAgentOptions = {
16
+ /** The chat session id passed into every wire payload. Defaults to `"test-chat"`. */
17
+ chatId?: string;
18
+ /** Client-provided metadata (`clientData`) for the session. */
19
+ clientData?: unknown;
20
+ /** Task context overrides passed through to {@link runInMockTaskContext}. */
21
+ taskContext?: MockTaskContextOptions;
22
+ /**
23
+ * Whether to start the task in preload mode. Defaults to `true` so the
24
+ * first `sendMessage()` triggers the first turn via the preload path.
25
+ * Set to `false` to skip preload — the first `sendMessage()` starts turn 0 directly.
26
+ */
27
+ preload?: boolean;
28
+ /**
29
+ * Callback that runs **before** the agent's `run()` is invoked, with a
30
+ * `set` function for pre-seeding locals. Use this to inject server-side
31
+ * dependencies (database clients, service stubs) that the agent reads
32
+ * via `locals.get()` in its hooks.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * import { dbKey } from "./db";
37
+ *
38
+ * const harness = mockChatAgent(agent, {
39
+ * chatId: "test-1",
40
+ * setupLocals: (locals) => {
41
+ * locals.set(dbKey, testDb);
42
+ * },
43
+ * });
44
+ * ```
45
+ */
46
+ setupLocals?: SetupLocals;
47
+ };
48
+ /**
49
+ * Result of a single turn, returned by driver methods like `sendMessage()`.
50
+ */
51
+ export type MockChatAgentTurn = {
52
+ /** UIMessageChunks emitted during this turn (excludes control chunks like turn-complete). */
53
+ chunks: UIMessageChunk[];
54
+ /** All raw chunks including control chunks (turn-complete, upgrade-required, etc.). */
55
+ rawChunks: unknown[];
56
+ };
57
+ /**
58
+ * Harness returned by `mockChatAgent`. Drives a `chat.agent` task end-to-end
59
+ * without network or task runtime.
60
+ */
61
+ export type MockChatAgentHarness = {
62
+ /** The chat session id used by this harness. */
63
+ readonly chatId: string;
64
+ /**
65
+ * Send a user message and wait for the next turn-complete. Returns the
66
+ * chunks produced during this turn.
67
+ */
68
+ sendMessage(message: UIMessage | UIMessage[]): Promise<MockChatAgentTurn>;
69
+ /** Send a regenerate signal with the messages and wait for the next turn-complete. */
70
+ sendRegenerate(messages: UIMessage[]): Promise<MockChatAgentTurn>;
71
+ /** Send a custom action and wait for the next turn-complete. */
72
+ sendAction(action: unknown): Promise<MockChatAgentTurn>;
73
+ /** Fire a stop signal. Does not wait for the turn — the task keeps running. */
74
+ sendStop(message?: string): Promise<void>;
75
+ /**
76
+ * Close the chat session cleanly. Sends `trigger: "close"` and awaits the
77
+ * task's `run()` function returning. Call this at the end of every test
78
+ * (or use `await using`) so the background task isn't left dangling.
79
+ */
80
+ close(): Promise<void>;
81
+ /** All UIMessageChunks emitted since the harness was created. */
82
+ readonly allChunks: UIMessageChunk[];
83
+ /** Every raw chunk (including control chunks) emitted since the harness was created. */
84
+ readonly allRawChunks: unknown[];
85
+ };
86
+ /**
87
+ * Create an offline test harness for a `chat.agent` task.
88
+ *
89
+ * The harness starts the agent's `run()` function in a mocked task context,
90
+ * waits in preload for the first message, then exposes driver methods for
91
+ * sending messages / actions / stop signals and awaiting turn completion.
92
+ *
93
+ * Users are responsible for mocking the language model themselves — use
94
+ * `MockLanguageModelV3` and `simulateReadableStream` from `ai/test` inside
95
+ * their agent's `run()` function (typically via DI through `clientData`).
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * import { mockChatAgent } from "@trigger.dev/sdk/ai/test";
100
+ * import { MockLanguageModelV3, simulateReadableStream } from "ai/test";
101
+ * import { myAgent } from "./my-agent";
102
+ *
103
+ * test("says hello", async () => {
104
+ * const harness = mockChatAgent(myAgent, { chatId: "test-1" });
105
+ * try {
106
+ * const turn = await harness.sendMessage({
107
+ * id: "m1",
108
+ * role: "user",
109
+ * parts: [{ type: "text", text: "hi" }],
110
+ * });
111
+ * expect(turn.chunks).toContainEqual(
112
+ * expect.objectContaining({ type: "text-delta", delta: "hello" })
113
+ * );
114
+ * } finally {
115
+ * await harness.close();
116
+ * }
117
+ * });
118
+ * ```
119
+ */
120
+ export declare function mockChatAgent(agent: ChatAgentHandle, options?: MockChatAgentOptions): MockChatAgentHarness;
121
+ export {};
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mockChatAgent = mockChatAgent;
4
+ const v3_1 = require("@trigger.dev/core/v3");
5
+ const test_1 = require("@trigger.dev/core/v3/test");
6
+ const chat_constants_js_1 = require("../chat-constants.js");
7
+ const CONTROL_CHUNK_TYPES = new Set([
8
+ "trigger:turn-complete",
9
+ "trigger:upgrade-required",
10
+ ]);
11
+ function isControlChunk(chunk) {
12
+ if (typeof chunk !== "object" || chunk === null)
13
+ return false;
14
+ const type = chunk.type;
15
+ return typeof type === "string" && CONTROL_CHUNK_TYPES.has(type);
16
+ }
17
+ /**
18
+ * Create an offline test harness for a `chat.agent` task.
19
+ *
20
+ * The harness starts the agent's `run()` function in a mocked task context,
21
+ * waits in preload for the first message, then exposes driver methods for
22
+ * sending messages / actions / stop signals and awaiting turn completion.
23
+ *
24
+ * Users are responsible for mocking the language model themselves — use
25
+ * `MockLanguageModelV3` and `simulateReadableStream` from `ai/test` inside
26
+ * their agent's `run()` function (typically via DI through `clientData`).
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { mockChatAgent } from "@trigger.dev/sdk/ai/test";
31
+ * import { MockLanguageModelV3, simulateReadableStream } from "ai/test";
32
+ * import { myAgent } from "./my-agent";
33
+ *
34
+ * test("says hello", async () => {
35
+ * const harness = mockChatAgent(myAgent, { chatId: "test-1" });
36
+ * try {
37
+ * const turn = await harness.sendMessage({
38
+ * id: "m1",
39
+ * role: "user",
40
+ * parts: [{ type: "text", text: "hi" }],
41
+ * });
42
+ * expect(turn.chunks).toContainEqual(
43
+ * expect.objectContaining({ type: "text-delta", delta: "hello" })
44
+ * );
45
+ * } finally {
46
+ * await harness.close();
47
+ * }
48
+ * });
49
+ * ```
50
+ */
51
+ function mockChatAgent(agent, options = {}) {
52
+ const chatId = options.chatId ?? "test-chat";
53
+ const preload = options.preload ?? true;
54
+ const clientData = options.clientData;
55
+ const taskEntry = v3_1.resourceCatalog.getTask(agent.id);
56
+ if (!taskEntry) {
57
+ throw new Error(`mockChatAgent: no task registered with id "${agent.id}". ` +
58
+ `Import "@trigger.dev/sdk/ai/test" before your agent module so tasks register correctly.`);
59
+ }
60
+ const runFn = taskEntry.fns.run;
61
+ // Buffers that survive across harness method calls
62
+ const allRawChunks = [];
63
+ const allChunks = [];
64
+ // Promise that resolves when the background task run() function returns.
65
+ let taskFinished;
66
+ // Drivers exposed by runInMockTaskContext — set inside the ctx callback
67
+ let sendToInput;
68
+ let closeInputStream;
69
+ let outputChunksSince;
70
+ let runSignal;
71
+ // A latch that resolves every time `trigger:turn-complete` appears on the chat stream.
72
+ // We use a shared pending promise and replace it after each completion.
73
+ let turnCompleteResolvers = [];
74
+ const waitForTurnComplete = () => new Promise((resolve) => {
75
+ turnCompleteResolvers.push(resolve);
76
+ });
77
+ // Signal that the caller is ready to observe output
78
+ let harnessReadyResolve;
79
+ const harnessReady = new Promise((resolve) => {
80
+ harnessReadyResolve = resolve;
81
+ });
82
+ taskFinished = (0, test_1.runInMockTaskContext)(async (drivers) => {
83
+ runSignal = new AbortController();
84
+ // Override the ctx.run.id so it matches the harness. Note:
85
+ // runInMockTaskContext already set a default — we just re-expose it.
86
+ const initialPayload = {
87
+ messages: [],
88
+ chatId,
89
+ trigger: preload ? "preload" : "submit-message",
90
+ metadata: clientData,
91
+ };
92
+ sendToInput = drivers.inputs.send;
93
+ closeInputStream = drivers.inputs.close;
94
+ // Subscribe to every chunk written to any realtime stream. We only
95
+ // care about the "chat" stream (where chat.agent pipes its output),
96
+ // but accepting all streams keeps the harness forward-compatible.
97
+ const unsubscribe = drivers.outputs.onWrite((streamId, chunk) => {
98
+ if (streamId !== "chat")
99
+ return;
100
+ allRawChunks.push(chunk);
101
+ if (!isControlChunk(chunk)) {
102
+ allChunks.push(chunk);
103
+ }
104
+ if (typeof chunk === "object" &&
105
+ chunk !== null &&
106
+ chunk.type === "trigger:turn-complete") {
107
+ const resolvers = turnCompleteResolvers;
108
+ turnCompleteResolvers = [];
109
+ for (const resolve of resolvers)
110
+ resolve();
111
+ }
112
+ });
113
+ outputChunksSince = (previousLength) => allRawChunks.slice(previousLength);
114
+ if (options.setupLocals) {
115
+ await options.setupLocals({ set: drivers.locals.set });
116
+ }
117
+ harnessReadyResolve();
118
+ try {
119
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
120
+ console.log("[mockChatAgent] Starting runFn with payload:", initialPayload);
121
+ }
122
+ await runFn(initialPayload, {
123
+ ctx: drivers.ctx,
124
+ signal: runSignal.signal,
125
+ });
126
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
127
+ console.log("[mockChatAgent] runFn returned");
128
+ }
129
+ }
130
+ catch (err) {
131
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
132
+ console.log("[mockChatAgent] runFn threw:", err);
133
+ }
134
+ throw err;
135
+ }
136
+ finally {
137
+ unsubscribe();
138
+ // Resolve any outstanding turn-complete waiters so callers don't hang
139
+ const resolvers = turnCompleteResolvers;
140
+ turnCompleteResolvers = [];
141
+ for (const resolve of resolvers)
142
+ resolve();
143
+ }
144
+ }, options.taskContext).catch((err) => {
145
+ // Propagate errors to pending turn waiters instead of dropping them
146
+ const resolvers = turnCompleteResolvers;
147
+ turnCompleteResolvers = [];
148
+ for (const resolve of resolvers)
149
+ resolve();
150
+ throw err;
151
+ });
152
+ const sendPayloadAndWait = async (payload) => {
153
+ await harnessReady;
154
+ const before = allRawChunks.length;
155
+ const turnComplete = waitForTurnComplete();
156
+ await sendToInput(chat_constants_js_1.CHAT_MESSAGES_STREAM_ID, payload);
157
+ await turnComplete;
158
+ const rawChunks = outputChunksSince(before);
159
+ const chunks = rawChunks.filter((c) => !isControlChunk(c));
160
+ return { chunks, rawChunks };
161
+ };
162
+ const harness = {
163
+ chatId,
164
+ async sendMessage(message) {
165
+ const messages = Array.isArray(message) ? message : [message];
166
+ return sendPayloadAndWait({
167
+ messages,
168
+ chatId,
169
+ trigger: "submit-message",
170
+ metadata: clientData,
171
+ });
172
+ },
173
+ async sendRegenerate(messages) {
174
+ return sendPayloadAndWait({
175
+ messages,
176
+ chatId,
177
+ trigger: "regenerate-message",
178
+ metadata: clientData,
179
+ });
180
+ },
181
+ async sendAction(action) {
182
+ return sendPayloadAndWait({
183
+ messages: [],
184
+ chatId,
185
+ trigger: "action",
186
+ action,
187
+ metadata: clientData,
188
+ });
189
+ },
190
+ async sendStop(message) {
191
+ await harnessReady;
192
+ await sendToInput(chat_constants_js_1.CHAT_STOP_STREAM_ID, { stop: true, message });
193
+ },
194
+ async close() {
195
+ await harnessReady;
196
+ // Send a close trigger. The turn loop checks for this after a
197
+ // successful turn and exits cleanly. On error-recovery paths the
198
+ // loop just loops back with the close payload, so we also close
199
+ // the input stream below to unblock any pending once() waiters.
200
+ try {
201
+ await sendToInput(chat_constants_js_1.CHAT_MESSAGES_STREAM_ID, {
202
+ messages: [],
203
+ chatId,
204
+ trigger: "close",
205
+ });
206
+ }
207
+ catch {
208
+ // best-effort
209
+ }
210
+ // Resolve any pending once() waiters on the chat-messages stream
211
+ // with a timeout error — that makes waitWithIdleTimeout return
212
+ // `{ ok: false }` and the turn loop exits cleanly.
213
+ closeInputStream?.(chat_constants_js_1.CHAT_MESSAGES_STREAM_ID);
214
+ // Also abort the run signal so anything downstream (streamText,
215
+ // deferred work) unwinds promptly.
216
+ runSignal?.abort("close");
217
+ // Wait for run() to return. The loop's error recovery path will
218
+ // see !next.ok and exit. Use a bounded wait so tests never hang.
219
+ await Promise.race([
220
+ taskFinished.catch(() => { }),
221
+ new Promise((resolve) => setTimeout(resolve, 1000)),
222
+ ]);
223
+ },
224
+ get allChunks() {
225
+ return allChunks.slice();
226
+ },
227
+ get allRawChunks() {
228
+ return allRawChunks.slice();
229
+ },
230
+ };
231
+ return harness;
232
+ }
233
+ //# sourceMappingURL=mock-chat-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-chat-agent.js","sourceRoot":"","sources":["../../../../src/v3/test/mock-chat-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const v3_1 = require("@trigger.dev/core/v3");
4
+ const workers_1 = require("@trigger.dev/core/v3/workers");
5
+ /**
6
+ * Installs an in-memory `StandardResourceCatalog` and seeds a fake file
7
+ * context so task definitions (`task()`, `chat.agent()`, etc.) register
8
+ * their run functions where the test harness can look them up.
9
+ *
10
+ * This is invoked as a side-effect of importing `@trigger.dev/sdk/ai/test`.
11
+ *
12
+ * Without this, `registerTaskMetadata` short-circuits on a missing
13
+ * `_currentFileContext` and tasks silently fail to register.
14
+ */
15
+ const catalog = new workers_1.StandardResourceCatalog();
16
+ v3_1.resourceCatalog.setGlobalResourceCatalog(catalog);
17
+ v3_1.resourceCatalog.setCurrentFileContext("__test__.ts", "__test__");
18
+ //# sourceMappingURL=setup-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-catalog.js","sourceRoot":"","sources":["../../../../src/v3/test/setup-catalog.ts"],"names":[],"mappings":";;AAAA,6CAAuD;AACvD,0DAAuE;AAEvE;;;;;;;;;GASG;AACH,MAAM,OAAO,GAAG,IAAI,iCAAuB,EAAE,CAAC;AAC9C,oBAAe,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClD,oBAAe,CAAC,qBAAqB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "0.0.0-chat-prerelease-20260417152143";
4
+ exports.VERSION = "0.0.0-chat-prerelease-20260418083610";
5
5
  //# sourceMappingURL=version.js.map
@@ -107,12 +107,39 @@ export function useMultiTabChat(transport, chatId, messages, setMessages) {
107
107
  }, [transport, chatId]);
108
108
  // Active tab: broadcast messages to other tabs on change.
109
109
  // Only broadcast when THIS tab holds the claim (is the current sender).
110
- // Using !isReadOnly alone causes a feedback loop when both tabs are idle.
110
+ // Deferred via requestIdleCallback so the structured clone in
111
+ // BroadcastChannel.postMessage never blocks rendering during streaming.
112
+ const idleRef = useRef(null);
113
+ const latestMessagesRef = useRef(messages);
114
+ latestMessagesRef.current = messages;
111
115
  useEffect(() => {
112
- if (transport.hasClaim(chatId) && messages.length > 0) {
113
- transport.broadcastMessages(chatId, messages);
114
- }
116
+ if (!transport.hasClaim(chatId) || messages.length === 0)
117
+ return;
118
+ if (idleRef.current !== null)
119
+ return; // Already scheduled
120
+ const schedule = typeof requestIdleCallback === "function"
121
+ ? requestIdleCallback
122
+ : (fn) => setTimeout(fn, 50);
123
+ idleRef.current = schedule(() => {
124
+ idleRef.current = null;
125
+ if (transport.hasClaim(chatId)) {
126
+ transport.broadcastMessages(chatId, latestMessagesRef.current);
127
+ }
128
+ });
115
129
  }, [transport, chatId, messages]);
130
+ // Flush final state when claim is released (turn complete)
131
+ useEffect(() => {
132
+ if (!transport.hasClaim(chatId) && latestMessagesRef.current.length > 0) {
133
+ if (idleRef.current !== null) {
134
+ const cancel = typeof cancelIdleCallback === "function"
135
+ ? cancelIdleCallback
136
+ : clearTimeout;
137
+ cancel(idleRef.current);
138
+ idleRef.current = null;
139
+ }
140
+ transport.broadcastMessages(chatId, latestMessagesRef.current);
141
+ }
142
+ }, [transport, chatId, isReadOnly]);
116
143
  // Read-only tab: receive messages from the active tab
117
144
  useEffect(() => {
118
145
  const listener = (id, msgs) => {
@@ -1 +1 @@
1
- {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import "./setup-catalog.js";
2
+ export { mockChatAgent, type MockChatAgentOptions, type MockChatAgentHarness, type MockChatAgentTurn, } from "./mock-chat-agent.js";
3
+ export { runInMockTaskContext, type MockTaskContextDrivers, type MockTaskContextOptions, } from "@trigger.dev/core/v3/test";
@@ -0,0 +1,13 @@
1
+ // Importing this module installs an in-memory resource catalog so that
2
+ // chat.agent() calls (which run at import time) register their task
3
+ // functions where the test harness can find them.
4
+ //
5
+ // Users should import `@trigger.dev/sdk/ai/test` BEFORE their agent
6
+ // modules so the registration side-effect runs first.
7
+ import "./setup-catalog.js";
8
+ export { mockChatAgent, } from "./mock-chat-agent.js";
9
+ // Re-export the lower-level task context harness so consumers can build
10
+ // their own test helpers without adding a separate `@trigger.dev/core`
11
+ // dependency to their reference projects.
12
+ export { runInMockTaskContext, } from "@trigger.dev/core/v3/test";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/v3/test/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,kDAAkD;AAClD,EAAE;AACF,oEAAoE;AACpE,sDAAsD;AACtD,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,GAId,MAAM,sBAAsB,CAAC;AAE9B,wEAAwE;AACxE,uEAAuE;AACvE,0CAA0C;AAC1C,OAAO,EACL,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,121 @@
1
+ import type { UIMessage, UIMessageChunk } from "ai";
2
+ import type { LocalsKey } from "@trigger.dev/core/v3";
3
+ import { type MockTaskContextOptions } from "@trigger.dev/core/v3/test";
4
+ /** Pre-seed locals before the agent's `run()` starts. */
5
+ export type SetupLocals = (locals: {
6
+ set<T>(key: LocalsKey<T>, value: T): void;
7
+ }) => void | Promise<void>;
8
+ /** A reference to a `chat.agent` task returned by `chat.agent({ id, ... })`. */
9
+ type ChatAgentHandle = {
10
+ id: string;
11
+ };
12
+ /**
13
+ * Options for `mockChatAgent`.
14
+ */
15
+ export type MockChatAgentOptions = {
16
+ /** The chat session id passed into every wire payload. Defaults to `"test-chat"`. */
17
+ chatId?: string;
18
+ /** Client-provided metadata (`clientData`) for the session. */
19
+ clientData?: unknown;
20
+ /** Task context overrides passed through to {@link runInMockTaskContext}. */
21
+ taskContext?: MockTaskContextOptions;
22
+ /**
23
+ * Whether to start the task in preload mode. Defaults to `true` so the
24
+ * first `sendMessage()` triggers the first turn via the preload path.
25
+ * Set to `false` to skip preload — the first `sendMessage()` starts turn 0 directly.
26
+ */
27
+ preload?: boolean;
28
+ /**
29
+ * Callback that runs **before** the agent's `run()` is invoked, with a
30
+ * `set` function for pre-seeding locals. Use this to inject server-side
31
+ * dependencies (database clients, service stubs) that the agent reads
32
+ * via `locals.get()` in its hooks.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * import { dbKey } from "./db";
37
+ *
38
+ * const harness = mockChatAgent(agent, {
39
+ * chatId: "test-1",
40
+ * setupLocals: (locals) => {
41
+ * locals.set(dbKey, testDb);
42
+ * },
43
+ * });
44
+ * ```
45
+ */
46
+ setupLocals?: SetupLocals;
47
+ };
48
+ /**
49
+ * Result of a single turn, returned by driver methods like `sendMessage()`.
50
+ */
51
+ export type MockChatAgentTurn = {
52
+ /** UIMessageChunks emitted during this turn (excludes control chunks like turn-complete). */
53
+ chunks: UIMessageChunk[];
54
+ /** All raw chunks including control chunks (turn-complete, upgrade-required, etc.). */
55
+ rawChunks: unknown[];
56
+ };
57
+ /**
58
+ * Harness returned by `mockChatAgent`. Drives a `chat.agent` task end-to-end
59
+ * without network or task runtime.
60
+ */
61
+ export type MockChatAgentHarness = {
62
+ /** The chat session id used by this harness. */
63
+ readonly chatId: string;
64
+ /**
65
+ * Send a user message and wait for the next turn-complete. Returns the
66
+ * chunks produced during this turn.
67
+ */
68
+ sendMessage(message: UIMessage | UIMessage[]): Promise<MockChatAgentTurn>;
69
+ /** Send a regenerate signal with the messages and wait for the next turn-complete. */
70
+ sendRegenerate(messages: UIMessage[]): Promise<MockChatAgentTurn>;
71
+ /** Send a custom action and wait for the next turn-complete. */
72
+ sendAction(action: unknown): Promise<MockChatAgentTurn>;
73
+ /** Fire a stop signal. Does not wait for the turn — the task keeps running. */
74
+ sendStop(message?: string): Promise<void>;
75
+ /**
76
+ * Close the chat session cleanly. Sends `trigger: "close"` and awaits the
77
+ * task's `run()` function returning. Call this at the end of every test
78
+ * (or use `await using`) so the background task isn't left dangling.
79
+ */
80
+ close(): Promise<void>;
81
+ /** All UIMessageChunks emitted since the harness was created. */
82
+ readonly allChunks: UIMessageChunk[];
83
+ /** Every raw chunk (including control chunks) emitted since the harness was created. */
84
+ readonly allRawChunks: unknown[];
85
+ };
86
+ /**
87
+ * Create an offline test harness for a `chat.agent` task.
88
+ *
89
+ * The harness starts the agent's `run()` function in a mocked task context,
90
+ * waits in preload for the first message, then exposes driver methods for
91
+ * sending messages / actions / stop signals and awaiting turn completion.
92
+ *
93
+ * Users are responsible for mocking the language model themselves — use
94
+ * `MockLanguageModelV3` and `simulateReadableStream` from `ai/test` inside
95
+ * their agent's `run()` function (typically via DI through `clientData`).
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * import { mockChatAgent } from "@trigger.dev/sdk/ai/test";
100
+ * import { MockLanguageModelV3, simulateReadableStream } from "ai/test";
101
+ * import { myAgent } from "./my-agent";
102
+ *
103
+ * test("says hello", async () => {
104
+ * const harness = mockChatAgent(myAgent, { chatId: "test-1" });
105
+ * try {
106
+ * const turn = await harness.sendMessage({
107
+ * id: "m1",
108
+ * role: "user",
109
+ * parts: [{ type: "text", text: "hi" }],
110
+ * });
111
+ * expect(turn.chunks).toContainEqual(
112
+ * expect.objectContaining({ type: "text-delta", delta: "hello" })
113
+ * );
114
+ * } finally {
115
+ * await harness.close();
116
+ * }
117
+ * });
118
+ * ```
119
+ */
120
+ export declare function mockChatAgent(agent: ChatAgentHandle, options?: MockChatAgentOptions): MockChatAgentHarness;
121
+ export {};
@@ -0,0 +1,230 @@
1
+ import { resourceCatalog } from "@trigger.dev/core/v3";
2
+ import { runInMockTaskContext, } from "@trigger.dev/core/v3/test";
3
+ import { CHAT_MESSAGES_STREAM_ID, CHAT_STOP_STREAM_ID } from "../chat-constants.js";
4
+ const CONTROL_CHUNK_TYPES = new Set([
5
+ "trigger:turn-complete",
6
+ "trigger:upgrade-required",
7
+ ]);
8
+ function isControlChunk(chunk) {
9
+ if (typeof chunk !== "object" || chunk === null)
10
+ return false;
11
+ const type = chunk.type;
12
+ return typeof type === "string" && CONTROL_CHUNK_TYPES.has(type);
13
+ }
14
+ /**
15
+ * Create an offline test harness for a `chat.agent` task.
16
+ *
17
+ * The harness starts the agent's `run()` function in a mocked task context,
18
+ * waits in preload for the first message, then exposes driver methods for
19
+ * sending messages / actions / stop signals and awaiting turn completion.
20
+ *
21
+ * Users are responsible for mocking the language model themselves — use
22
+ * `MockLanguageModelV3` and `simulateReadableStream` from `ai/test` inside
23
+ * their agent's `run()` function (typically via DI through `clientData`).
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { mockChatAgent } from "@trigger.dev/sdk/ai/test";
28
+ * import { MockLanguageModelV3, simulateReadableStream } from "ai/test";
29
+ * import { myAgent } from "./my-agent";
30
+ *
31
+ * test("says hello", async () => {
32
+ * const harness = mockChatAgent(myAgent, { chatId: "test-1" });
33
+ * try {
34
+ * const turn = await harness.sendMessage({
35
+ * id: "m1",
36
+ * role: "user",
37
+ * parts: [{ type: "text", text: "hi" }],
38
+ * });
39
+ * expect(turn.chunks).toContainEqual(
40
+ * expect.objectContaining({ type: "text-delta", delta: "hello" })
41
+ * );
42
+ * } finally {
43
+ * await harness.close();
44
+ * }
45
+ * });
46
+ * ```
47
+ */
48
+ export function mockChatAgent(agent, options = {}) {
49
+ const chatId = options.chatId ?? "test-chat";
50
+ const preload = options.preload ?? true;
51
+ const clientData = options.clientData;
52
+ const taskEntry = resourceCatalog.getTask(agent.id);
53
+ if (!taskEntry) {
54
+ throw new Error(`mockChatAgent: no task registered with id "${agent.id}". ` +
55
+ `Import "@trigger.dev/sdk/ai/test" before your agent module so tasks register correctly.`);
56
+ }
57
+ const runFn = taskEntry.fns.run;
58
+ // Buffers that survive across harness method calls
59
+ const allRawChunks = [];
60
+ const allChunks = [];
61
+ // Promise that resolves when the background task run() function returns.
62
+ let taskFinished;
63
+ // Drivers exposed by runInMockTaskContext — set inside the ctx callback
64
+ let sendToInput;
65
+ let closeInputStream;
66
+ let outputChunksSince;
67
+ let runSignal;
68
+ // A latch that resolves every time `trigger:turn-complete` appears on the chat stream.
69
+ // We use a shared pending promise and replace it after each completion.
70
+ let turnCompleteResolvers = [];
71
+ const waitForTurnComplete = () => new Promise((resolve) => {
72
+ turnCompleteResolvers.push(resolve);
73
+ });
74
+ // Signal that the caller is ready to observe output
75
+ let harnessReadyResolve;
76
+ const harnessReady = new Promise((resolve) => {
77
+ harnessReadyResolve = resolve;
78
+ });
79
+ taskFinished = runInMockTaskContext(async (drivers) => {
80
+ runSignal = new AbortController();
81
+ // Override the ctx.run.id so it matches the harness. Note:
82
+ // runInMockTaskContext already set a default — we just re-expose it.
83
+ const initialPayload = {
84
+ messages: [],
85
+ chatId,
86
+ trigger: preload ? "preload" : "submit-message",
87
+ metadata: clientData,
88
+ };
89
+ sendToInput = drivers.inputs.send;
90
+ closeInputStream = drivers.inputs.close;
91
+ // Subscribe to every chunk written to any realtime stream. We only
92
+ // care about the "chat" stream (where chat.agent pipes its output),
93
+ // but accepting all streams keeps the harness forward-compatible.
94
+ const unsubscribe = drivers.outputs.onWrite((streamId, chunk) => {
95
+ if (streamId !== "chat")
96
+ return;
97
+ allRawChunks.push(chunk);
98
+ if (!isControlChunk(chunk)) {
99
+ allChunks.push(chunk);
100
+ }
101
+ if (typeof chunk === "object" &&
102
+ chunk !== null &&
103
+ chunk.type === "trigger:turn-complete") {
104
+ const resolvers = turnCompleteResolvers;
105
+ turnCompleteResolvers = [];
106
+ for (const resolve of resolvers)
107
+ resolve();
108
+ }
109
+ });
110
+ outputChunksSince = (previousLength) => allRawChunks.slice(previousLength);
111
+ if (options.setupLocals) {
112
+ await options.setupLocals({ set: drivers.locals.set });
113
+ }
114
+ harnessReadyResolve();
115
+ try {
116
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
117
+ console.log("[mockChatAgent] Starting runFn with payload:", initialPayload);
118
+ }
119
+ await runFn(initialPayload, {
120
+ ctx: drivers.ctx,
121
+ signal: runSignal.signal,
122
+ });
123
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
124
+ console.log("[mockChatAgent] runFn returned");
125
+ }
126
+ }
127
+ catch (err) {
128
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
129
+ console.log("[mockChatAgent] runFn threw:", err);
130
+ }
131
+ throw err;
132
+ }
133
+ finally {
134
+ unsubscribe();
135
+ // Resolve any outstanding turn-complete waiters so callers don't hang
136
+ const resolvers = turnCompleteResolvers;
137
+ turnCompleteResolvers = [];
138
+ for (const resolve of resolvers)
139
+ resolve();
140
+ }
141
+ }, options.taskContext).catch((err) => {
142
+ // Propagate errors to pending turn waiters instead of dropping them
143
+ const resolvers = turnCompleteResolvers;
144
+ turnCompleteResolvers = [];
145
+ for (const resolve of resolvers)
146
+ resolve();
147
+ throw err;
148
+ });
149
+ const sendPayloadAndWait = async (payload) => {
150
+ await harnessReady;
151
+ const before = allRawChunks.length;
152
+ const turnComplete = waitForTurnComplete();
153
+ await sendToInput(CHAT_MESSAGES_STREAM_ID, payload);
154
+ await turnComplete;
155
+ const rawChunks = outputChunksSince(before);
156
+ const chunks = rawChunks.filter((c) => !isControlChunk(c));
157
+ return { chunks, rawChunks };
158
+ };
159
+ const harness = {
160
+ chatId,
161
+ async sendMessage(message) {
162
+ const messages = Array.isArray(message) ? message : [message];
163
+ return sendPayloadAndWait({
164
+ messages,
165
+ chatId,
166
+ trigger: "submit-message",
167
+ metadata: clientData,
168
+ });
169
+ },
170
+ async sendRegenerate(messages) {
171
+ return sendPayloadAndWait({
172
+ messages,
173
+ chatId,
174
+ trigger: "regenerate-message",
175
+ metadata: clientData,
176
+ });
177
+ },
178
+ async sendAction(action) {
179
+ return sendPayloadAndWait({
180
+ messages: [],
181
+ chatId,
182
+ trigger: "action",
183
+ action,
184
+ metadata: clientData,
185
+ });
186
+ },
187
+ async sendStop(message) {
188
+ await harnessReady;
189
+ await sendToInput(CHAT_STOP_STREAM_ID, { stop: true, message });
190
+ },
191
+ async close() {
192
+ await harnessReady;
193
+ // Send a close trigger. The turn loop checks for this after a
194
+ // successful turn and exits cleanly. On error-recovery paths the
195
+ // loop just loops back with the close payload, so we also close
196
+ // the input stream below to unblock any pending once() waiters.
197
+ try {
198
+ await sendToInput(CHAT_MESSAGES_STREAM_ID, {
199
+ messages: [],
200
+ chatId,
201
+ trigger: "close",
202
+ });
203
+ }
204
+ catch {
205
+ // best-effort
206
+ }
207
+ // Resolve any pending once() waiters on the chat-messages stream
208
+ // with a timeout error — that makes waitWithIdleTimeout return
209
+ // `{ ok: false }` and the turn loop exits cleanly.
210
+ closeInputStream?.(CHAT_MESSAGES_STREAM_ID);
211
+ // Also abort the run signal so anything downstream (streamText,
212
+ // deferred work) unwinds promptly.
213
+ runSignal?.abort("close");
214
+ // Wait for run() to return. The loop's error recovery path will
215
+ // see !next.ok and exit. Use a bounded wait so tests never hang.
216
+ await Promise.race([
217
+ taskFinished.catch(() => { }),
218
+ new Promise((resolve) => setTimeout(resolve, 1000)),
219
+ ]);
220
+ },
221
+ get allChunks() {
222
+ return allChunks.slice();
223
+ },
224
+ get allRawChunks() {
225
+ return allRawChunks.slice();
226
+ },
227
+ };
228
+ return harness;
229
+ }
230
+ //# sourceMappingURL=mock-chat-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-chat-agent.js","sourceRoot":"","sources":["../../../../src/v3/test/mock-chat-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import { resourceCatalog } from "@trigger.dev/core/v3";
2
+ import { StandardResourceCatalog } from "@trigger.dev/core/v3/workers";
3
+ /**
4
+ * Installs an in-memory `StandardResourceCatalog` and seeds a fake file
5
+ * context so task definitions (`task()`, `chat.agent()`, etc.) register
6
+ * their run functions where the test harness can look them up.
7
+ *
8
+ * This is invoked as a side-effect of importing `@trigger.dev/sdk/ai/test`.
9
+ *
10
+ * Without this, `registerTaskMetadata` short-circuits on a missing
11
+ * `_currentFileContext` and tasks silently fail to register.
12
+ */
13
+ const catalog = new StandardResourceCatalog();
14
+ resourceCatalog.setGlobalResourceCatalog(catalog);
15
+ resourceCatalog.setCurrentFileContext("__test__.ts", "__test__");
16
+ //# sourceMappingURL=setup-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-catalog.js","sourceRoot":"","sources":["../../../../src/v3/test/setup-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE;;;;;;;;;GASG;AACH,MAAM,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;AAC9C,eAAe,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClD,eAAe,CAAC,qBAAqB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC"}
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.0.0-chat-prerelease-20260417152143";
1
+ export const VERSION = "0.0.0-chat-prerelease-20260418083610";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trigger.dev/sdk",
3
- "version": "0.0.0-chat-prerelease-20260417152143",
3
+ "version": "0.0.0-chat-prerelease-20260418083610",
4
4
  "description": "trigger.dev Node.JS SDK",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -25,6 +25,7 @@
25
25
  ".": "./src/v3/index.ts",
26
26
  "./v3": "./src/v3/index.ts",
27
27
  "./ai": "./src/v3/ai.ts",
28
+ "./ai/test": "./src/v3/test/index.ts",
28
29
  "./chat": "./src/v3/chat.ts",
29
30
  "./chat/react": "./src/v3/chat-react.ts"
30
31
  },
@@ -40,6 +41,9 @@
40
41
  "ai": [
41
42
  "dist/commonjs/v3/ai.d.ts"
42
43
  ],
44
+ "ai/test": [
45
+ "dist/commonjs/v3/test/index.d.ts"
46
+ ],
43
47
  "chat": [
44
48
  "dist/commonjs/v3/chat.d.ts"
45
49
  ],
@@ -51,7 +55,7 @@
51
55
  "dependencies": {
52
56
  "@opentelemetry/api": "1.9.0",
53
57
  "@opentelemetry/semantic-conventions": "1.36.0",
54
- "@trigger.dev/core": "0.0.0-chat-prerelease-20260417152143",
58
+ "@trigger.dev/core": "0.0.0-chat-prerelease-20260418083610",
55
59
  "chalk": "^5.2.0",
56
60
  "cronstrue": "^2.21.0",
57
61
  "debug": "^4.3.4",
@@ -63,6 +67,7 @@
63
67
  "ws": "^8.11.0"
64
68
  },
65
69
  "devDependencies": {
70
+ "@ai-sdk/provider": "3.0.8",
66
71
  "@arethetypeswrong/cli": "^0.15.4",
67
72
  "@types/debug": "^4.1.7",
68
73
  "@types/react": "^19.2.14",
@@ -128,6 +133,17 @@
128
133
  "default": "./dist/commonjs/v3/ai.js"
129
134
  }
130
135
  },
136
+ "./ai/test": {
137
+ "import": {
138
+ "@triggerdotdev/source": "./src/v3/test/index.ts",
139
+ "types": "./dist/esm/v3/test/index.d.ts",
140
+ "default": "./dist/esm/v3/test/index.js"
141
+ },
142
+ "require": {
143
+ "types": "./dist/commonjs/v3/test/index.d.ts",
144
+ "default": "./dist/commonjs/v3/test/index.js"
145
+ }
146
+ },
131
147
  "./chat": {
132
148
  "import": {
133
149
  "@triggerdotdev/source": "./src/v3/chat.ts",