@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.
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,468 @@
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 sessions_js_1 = require("../sessions.js");
7
+ const ai_js_1 = require("../ai.js");
8
+ const test_session_handle_js_1 = require("./test-session-handle.js");
9
+ const CONTROL_CHUNK_TYPES = new Set([
10
+ "trigger:turn-complete",
11
+ "trigger:upgrade-required",
12
+ ]);
13
+ function isControlChunk(chunk) {
14
+ if (typeof chunk !== "object" || chunk === null)
15
+ return false;
16
+ const type = chunk.type;
17
+ return typeof type === "string" && CONTROL_CHUNK_TYPES.has(type);
18
+ }
19
+ /**
20
+ * Create an offline test harness for a `chat.agent` task.
21
+ *
22
+ * The harness starts the agent's `run()` function in a mocked task context,
23
+ * waits in preload for the first message, then exposes driver methods for
24
+ * sending messages / actions / stop signals and awaiting turn completion.
25
+ *
26
+ * Users are responsible for mocking the language model themselves — use
27
+ * `MockLanguageModelV3` and `simulateReadableStream` from `ai/test` inside
28
+ * their agent's `run()` function (typically via DI through `clientData`).
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { mockChatAgent } from "@trigger.dev/sdk/ai/test";
33
+ * import { MockLanguageModelV3, simulateReadableStream } from "ai/test";
34
+ * import { myAgent } from "./my-agent";
35
+ *
36
+ * test("says hello", async () => {
37
+ * const harness = mockChatAgent(myAgent, { chatId: "test-1" });
38
+ * try {
39
+ * const turn = await harness.sendMessage({
40
+ * id: "m1",
41
+ * role: "user",
42
+ * parts: [{ type: "text", text: "hi" }],
43
+ * });
44
+ * expect(turn.chunks).toContainEqual(
45
+ * expect.objectContaining({ type: "text-delta", delta: "hello" })
46
+ * );
47
+ * } finally {
48
+ * await harness.close();
49
+ * }
50
+ * });
51
+ * ```
52
+ */
53
+ function mockChatAgent(agent, options = {}) {
54
+ const chatId = options.chatId ?? "test-chat";
55
+ // The agent opens the session with `payload.sessionId ?? payload.chatId`.
56
+ // We pass no sessionId, so it falls back to chatId.
57
+ const sessionId = chatId;
58
+ // `continuation: true` without an explicit mode auto-selects "continuation"
59
+ // — the canonical shape for a continuation-run boot.
60
+ const mode = options.mode ??
61
+ (options.continuation === true
62
+ ? "continuation"
63
+ : options.preload === false
64
+ ? "submit-message"
65
+ : "preload");
66
+ const clientData = options.clientData;
67
+ const taskEntry = v3_1.resourceCatalog.getTask(agent.id);
68
+ if (!taskEntry) {
69
+ throw new Error(`mockChatAgent: no task registered with id "${agent.id}". ` +
70
+ `Import "@trigger.dev/sdk/ai/test" before your agent module so tasks register correctly.`);
71
+ }
72
+ const runFn = taskEntry.fns.run;
73
+ // Session .out state: chunks + listener registry. Shared between the
74
+ // harness and the TestSessionOutputChannel installed via the open-override.
75
+ const sessionOutState = {
76
+ chunks: [],
77
+ listeners: new Set(),
78
+ };
79
+ // Buffers that survive across harness method calls
80
+ const allRawChunks = [];
81
+ const allChunks = [];
82
+ // Promise that resolves when the background task run() function returns.
83
+ let taskFinished;
84
+ let sendSessionInput;
85
+ let closeSessionInput;
86
+ let runSignal;
87
+ // A latch that resolves every time `trigger:turn-complete` appears on the chat stream.
88
+ // We use a shared pending promise and replace it after each completion.
89
+ let turnCompleteResolvers = [];
90
+ const waitForTurnComplete = () => new Promise((resolve) => {
91
+ turnCompleteResolvers.push(resolve);
92
+ });
93
+ // Signal that the caller is ready to observe output
94
+ let harnessReadyResolve;
95
+ const harnessReady = new Promise((resolve) => {
96
+ harnessReadyResolve = resolve;
97
+ });
98
+ // ── Snapshot read/write override state ───────────────────────────────
99
+ // The runtime's snapshot read returns whatever `seededSnapshot` is at
100
+ // boot time. The runtime's snapshot write captures into
101
+ // `lastWrittenSnapshot` for harness consumers to assert via
102
+ // `getSnapshot()`. Installed below alongside the session overrides;
103
+ // cleared on close in the same finally block.
104
+ let seededSnapshot = options.snapshot;
105
+ let lastWrittenSnapshot;
106
+ let seededReplayChunks = [];
107
+ let seededReplayPartial;
108
+ let seededSessionInMessages = [];
109
+ (0, ai_js_1.__setReadChatSnapshotImplForTests)((_id) => {
110
+ return seededSnapshot;
111
+ });
112
+ (0, ai_js_1.__setWriteChatSnapshotImplForTests)((_id, snapshot) => {
113
+ lastWrittenSnapshot = snapshot;
114
+ });
115
+ // Replay override: install a default that returns whatever
116
+ // `seededReplayChunks` reduces to. `mockChatAgent` doesn't model the
117
+ // settled-vs-partial split — seeded chunks always reduce to the
118
+ // `settled` array with `partial: undefined`. Recovery-specific
119
+ // tests can install their own override to seed a partial.
120
+ // Cleared in the same `finally` block as the other test overrides.
121
+ (0, ai_js_1.__setReplaySessionOutTailImplForTests)(async () => {
122
+ const settled = seededReplayChunks.length === 0
123
+ ? []
124
+ : (await reduceChunksToMessages(seededReplayChunks));
125
+ // For the mock harness, `partialRaw` is the same as `partial` — we
126
+ // don't model cleanupAbortedParts separately. Recovery tests that
127
+ // need a partialRaw distinct from partial install their own stub.
128
+ return {
129
+ settled,
130
+ partial: seededReplayPartial,
131
+ partialRaw: seededReplayPartial,
132
+ };
133
+ });
134
+ // session.in tail override: each seeded UIMessage becomes a
135
+ // { message, metadata: undefined, seqNum: i+1 } entry. Mirrors the
136
+ // seq-num pattern from the out-tail stub so cursor-advance logic is
137
+ // exercised correctly. `metadata` is `undefined` for seeded users —
138
+ // the boot path falls back to `payload.metadata` for those.
139
+ (0, ai_js_1.__setReplaySessionInTailImplForTests)(async () => {
140
+ return seededSessionInMessages.map((message, i) => ({
141
+ message,
142
+ metadata: undefined,
143
+ seqNum: i + 1,
144
+ }));
145
+ });
146
+ // Install the session open override so `sessions.open(id)` returns a
147
+ // SessionHandle with an in-memory `.out` that captures writes. The
148
+ // `.in` channel routes record subscriptions (`on`/`once`/`peek`)
149
+ // through the `sessionStreams` global — the mock task context
150
+ // installs a `TestSessionStreamManager` there — and stubs `wait()`
151
+ // so the suspend path resolves cleanly on `runSignal.abort()` without
152
+ // touching the api client.
153
+ (0, sessions_js_1.__setSessionOpenImplForTests)((id) => (0, test_session_handle_js_1.createTestSessionHandle)(id, sessionOutState, () => runSignal?.signal));
154
+ // Install the session start override so any test path that invokes
155
+ // `sessions.start()` (typically through a server action shim like
156
+ // `chat.createStartSessionAction`) becomes a no-op fixture instead of
157
+ // hitting a real API. Most chat.agent tests trigger the run directly
158
+ // via `sendPayloadAndWait` and never go through this path, but the
159
+ // stub keeps the API safe to call from inside tested code.
160
+ (0, sessions_js_1.__setSessionStartImplForTests)((body) => {
161
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
162
+ console.log("[mockChatAgent] sessions.start override:", body);
163
+ }
164
+ const fakeRunId = `run_test_${body.externalId ?? "anon"}`;
165
+ return {
166
+ id: `session_test_${body.externalId ?? "anon"}`,
167
+ externalId: body.externalId ?? null,
168
+ type: body.type,
169
+ taskIdentifier: body.taskIdentifier,
170
+ triggerConfig: body.triggerConfig,
171
+ currentRunId: fakeRunId,
172
+ runId: fakeRunId,
173
+ publicAccessToken: "tr_test_session_pat",
174
+ tags: body.tags ?? [],
175
+ metadata: (body.metadata ?? null),
176
+ closedAt: null,
177
+ closedReason: null,
178
+ expiresAt: null,
179
+ createdAt: new Date(0),
180
+ updatedAt: new Date(0),
181
+ isCached: false,
182
+ };
183
+ });
184
+ taskFinished = (0, test_1.runInMockTaskContext)(async (drivers) => {
185
+ runSignal = new AbortController();
186
+ // For `mode: "continuation"`, omit `trigger` from the wire payload —
187
+ // mirrors what the server's `ensureRunForSession` / `swapSessionRun`
188
+ // produces (the continuation overrides clear `trigger` so the SDK
189
+ // boot path falls into the continuation-wait branch instead of
190
+ // re-firing the basePayload's stale first-run trigger). `continuation:
191
+ // true` is set unconditionally for this mode so the boot path's
192
+ // continuation-wait condition matches.
193
+ const isContinuationMode = mode === "continuation";
194
+ const initialPayload = {
195
+ chatId,
196
+ ...(isContinuationMode
197
+ ? { trigger: undefined, continuation: true }
198
+ : { trigger: mode }),
199
+ metadata: clientData,
200
+ ...(!isContinuationMode && options.continuation ? { continuation: true } : {}),
201
+ ...(options.previousRunId ? { previousRunId: options.previousRunId } : {}),
202
+ };
203
+ sendSessionInput = drivers.sessions.in.send;
204
+ closeSessionInput = drivers.sessions.in.close;
205
+ // Record every chunk written to session.out, detect turn-complete.
206
+ const listener = (chunk) => {
207
+ allRawChunks.push(chunk);
208
+ if (!isControlChunk(chunk)) {
209
+ allChunks.push(chunk);
210
+ }
211
+ if (typeof chunk === "object" &&
212
+ chunk !== null &&
213
+ chunk.type === "trigger:turn-complete") {
214
+ const resolvers = turnCompleteResolvers;
215
+ turnCompleteResolvers = [];
216
+ for (const resolve of resolvers)
217
+ resolve();
218
+ }
219
+ };
220
+ sessionOutState.listeners.add(listener);
221
+ const unsubscribe = () => sessionOutState.listeners.delete(listener);
222
+ if (options.setupLocals) {
223
+ await options.setupLocals({ set: drivers.locals.set });
224
+ }
225
+ harnessReadyResolve();
226
+ try {
227
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
228
+ console.log("[mockChatAgent] Starting runFn with payload:", initialPayload);
229
+ }
230
+ await runFn(initialPayload, {
231
+ ctx: drivers.ctx,
232
+ signal: runSignal.signal,
233
+ });
234
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
235
+ console.log("[mockChatAgent] runFn returned");
236
+ }
237
+ }
238
+ catch (err) {
239
+ if (process.env.TRIGGER_CHAT_TEST_DEBUG === "1") {
240
+ console.log("[mockChatAgent] runFn threw:", err);
241
+ }
242
+ throw err;
243
+ }
244
+ finally {
245
+ unsubscribe();
246
+ // Resolve any outstanding turn-complete waiters so callers don't hang
247
+ const resolvers = turnCompleteResolvers;
248
+ turnCompleteResolvers = [];
249
+ for (const resolve of resolvers)
250
+ resolve();
251
+ }
252
+ }, options.taskContext)
253
+ .catch((err) => {
254
+ // Propagate errors to pending turn waiters instead of dropping them
255
+ const resolvers = turnCompleteResolvers;
256
+ turnCompleteResolvers = [];
257
+ for (const resolve of resolvers)
258
+ resolve();
259
+ throw err;
260
+ })
261
+ .finally(() => {
262
+ // Always clear the test overrides, even if the task threw.
263
+ (0, sessions_js_1.__setSessionOpenImplForTests)(undefined);
264
+ (0, sessions_js_1.__setSessionStartImplForTests)(undefined);
265
+ (0, ai_js_1.__setReadChatSnapshotImplForTests)(undefined);
266
+ (0, ai_js_1.__setWriteChatSnapshotImplForTests)(undefined);
267
+ (0, ai_js_1.__setReplaySessionOutTailImplForTests)(undefined);
268
+ (0, ai_js_1.__setReplaySessionInTailImplForTests)(undefined);
269
+ });
270
+ const sendPayloadAndWait = async (payload) => {
271
+ await harnessReady;
272
+ const before = allRawChunks.length;
273
+ const turnComplete = waitForTurnComplete();
274
+ await sendSessionInput(sessionId, { kind: "message", payload });
275
+ await turnComplete;
276
+ const rawChunks = allRawChunks.slice(before);
277
+ const chunks = rawChunks.filter((c) => !isControlChunk(c));
278
+ return { chunks, rawChunks };
279
+ };
280
+ const harness = {
281
+ chatId,
282
+ async sendMessage(message) {
283
+ return sendPayloadAndWait({
284
+ message,
285
+ chatId,
286
+ trigger: "submit-message",
287
+ metadata: clientData,
288
+ });
289
+ },
290
+ async sendRegenerate() {
291
+ return sendPayloadAndWait({
292
+ chatId,
293
+ trigger: "regenerate-message",
294
+ metadata: clientData,
295
+ });
296
+ },
297
+ async sendHeadStart({ messages }) {
298
+ return sendPayloadAndWait({
299
+ headStartMessages: messages,
300
+ chatId,
301
+ trigger: "handover-prepare",
302
+ metadata: clientData,
303
+ });
304
+ },
305
+ async sendAction(action) {
306
+ return sendPayloadAndWait({
307
+ chatId,
308
+ trigger: "action",
309
+ action,
310
+ metadata: clientData,
311
+ });
312
+ },
313
+ async sendStop(message) {
314
+ await harnessReady;
315
+ await sendSessionInput(sessionId, { kind: "stop", message });
316
+ },
317
+ async sendHandover(args) {
318
+ await harnessReady;
319
+ const before = allRawChunks.length;
320
+ const turnComplete = waitForTurnComplete();
321
+ await sendSessionInput(sessionId, {
322
+ kind: "handover",
323
+ partialAssistantMessage: args.partialAssistantMessage,
324
+ messageId: args.messageId,
325
+ isFinal: args.isFinal ?? false,
326
+ });
327
+ await turnComplete;
328
+ const rawChunks = allRawChunks.slice(before);
329
+ const chunks = rawChunks.filter((c) => !isControlChunk(c));
330
+ return { chunks, rawChunks };
331
+ },
332
+ async sendHandoverSkip() {
333
+ await harnessReady;
334
+ // No turn-complete on skip — the agent exits without firing hooks.
335
+ // Send the chunk and wait for the run to finish.
336
+ await sendSessionInput(sessionId, { kind: "handover-skip" });
337
+ await Promise.race([
338
+ taskFinished.catch(() => { }),
339
+ new Promise((resolve) => setTimeout(resolve, 1000)),
340
+ ]);
341
+ },
342
+ seedSnapshot(snapshot) {
343
+ seededSnapshot = snapshot;
344
+ },
345
+ seedSessionOutTail(chunks) {
346
+ seededReplayChunks = chunks ?? [];
347
+ },
348
+ seedSessionOutPartial(partial) {
349
+ seededReplayPartial = partial;
350
+ },
351
+ seedSessionInTail(messages) {
352
+ seededSessionInMessages = messages;
353
+ },
354
+ getSnapshot() {
355
+ return lastWrittenSnapshot;
356
+ },
357
+ async close() {
358
+ await harnessReady;
359
+ // Send a close trigger wrapped as a `kind: "message"` ChatInputChunk.
360
+ // The turn loop checks for this after a successful turn and exits
361
+ // cleanly. On error-recovery paths the loop just loops back with
362
+ // the close payload, so we also close the session input below to
363
+ // unblock any pending once() waiters.
364
+ try {
365
+ await sendSessionInput(sessionId, {
366
+ kind: "message",
367
+ payload: {
368
+ chatId,
369
+ trigger: "close",
370
+ },
371
+ });
372
+ }
373
+ catch {
374
+ // best-effort
375
+ }
376
+ // Resolve any pending once() waiters on the session input with a
377
+ // timeout error — that makes waitWithIdleTimeout return
378
+ // `{ ok: false }` and the turn loop exits cleanly.
379
+ closeSessionInput?.(sessionId);
380
+ // Also abort the run signal so anything downstream (streamText,
381
+ // deferred work) unwinds promptly.
382
+ runSignal?.abort("close");
383
+ // Wait for run() to return. The loop's error recovery path will
384
+ // see !next.ok and exit. Use a bounded wait so tests never hang.
385
+ await Promise.race([
386
+ taskFinished.catch(() => { }),
387
+ new Promise((resolve) => setTimeout(resolve, 1000)),
388
+ ]);
389
+ },
390
+ get allChunks() {
391
+ return allChunks.slice();
392
+ },
393
+ get allRawChunks() {
394
+ return allRawChunks.slice();
395
+ },
396
+ };
397
+ return harness;
398
+ }
399
+ /**
400
+ * Reduce a synthetic UIMessageChunk[] sequence into the UIMessage[] that
401
+ * the runtime's `replaySessionOutTail` would produce. Splits chunks at
402
+ * `start` boundaries and feeds each segment through AI SDK's
403
+ * `readUIMessageStream`. The trailing un-finished segment goes through
404
+ * `cleanupAbortedParts`. Mirrors the production reducer used in
405
+ * `ai.ts:replaySessionOutTail`.
406
+ */
407
+ async function reduceChunksToMessages(chunks) {
408
+ if (chunks.length === 0)
409
+ return [];
410
+ const aiModule = (await import("ai"));
411
+ const readUIMessageStream = aiModule.readUIMessageStream;
412
+ const cleanupAbortedParts = aiModule.cleanupAbortedParts;
413
+ if (!readUIMessageStream)
414
+ return [];
415
+ const segments = [];
416
+ let current;
417
+ for (const chunk of chunks) {
418
+ if (chunk.type === "start") {
419
+ current = { chunks: [chunk], closed: false };
420
+ segments.push(current);
421
+ continue;
422
+ }
423
+ if (!current) {
424
+ current = { chunks: [], closed: false };
425
+ segments.push(current);
426
+ }
427
+ current.chunks.push(chunk);
428
+ if (chunk.type === "finish") {
429
+ current.closed = true;
430
+ current = undefined;
431
+ }
432
+ }
433
+ const out = [];
434
+ for (let i = 0; i < segments.length; i++) {
435
+ const seg = segments[i];
436
+ const isTrailing = i === segments.length - 1 && !seg.closed;
437
+ const segmentStream = new ReadableStream({
438
+ start(controller) {
439
+ for (const c of seg.chunks)
440
+ controller.enqueue(c);
441
+ controller.close();
442
+ },
443
+ });
444
+ let last;
445
+ try {
446
+ for await (const snapshot of readUIMessageStream({ stream: segmentStream })) {
447
+ last = snapshot;
448
+ }
449
+ }
450
+ catch {
451
+ // Skip malformed segment — tests can assert by inspecting what makes it through.
452
+ continue;
453
+ }
454
+ if (!last)
455
+ continue;
456
+ if (isTrailing && cleanupAbortedParts) {
457
+ const cleaned = cleanupAbortedParts(last);
458
+ if (!cleaned.parts || cleaned.parts.length === 0)
459
+ continue;
460
+ out.push(cleaned);
461
+ }
462
+ else {
463
+ out.push(last);
464
+ }
465
+ }
466
+ return out;
467
+ }
468
+ //# 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"}
@@ -0,0 +1,53 @@
1
+ import type { AsyncIterableStream, PipeStreamResult, StreamWriteResult, WriterStreamOptions } from "@trigger.dev/core/v3";
2
+ import { SessionHandle, SessionOutputChannel, SessionPipeStreamOptions, SessionSubscribeOptions } from "../sessions.js";
3
+ /**
4
+ * Per-session in-memory state collected from `.out` writes during a test.
5
+ * Owned by the mock-chat-agent harness; updated by {@link TestSessionOutputChannel}.
6
+ */
7
+ export type TestSessionOutState = {
8
+ /** Every chunk written to `.out`, in order of write. */
9
+ chunks: unknown[];
10
+ /** Registered write listeners (fired for each chunk). */
11
+ listeners: Set<(chunk: unknown) => void>;
12
+ };
13
+ /**
14
+ * `.out` channel that captures writes in memory instead of piping to S2.
15
+ * Mirrors {@link SessionOutputChannel}'s public shape — `pipe` / `writer`
16
+ * / `append` / `read` — so the agent's existing code paths work unchanged.
17
+ */
18
+ export declare class TestSessionOutputChannel extends SessionOutputChannel {
19
+ private readonly state;
20
+ constructor(sessionId: string, state: TestSessionOutState);
21
+ append<T>(value: T, _options?: SessionPipeStreamOptions): Promise<void>;
22
+ pipe<T>(value: AsyncIterable<T> | ReadableStream<T>, _options?: SessionPipeStreamOptions): PipeStreamResult<T>;
23
+ writer<T>(options: WriterStreamOptions<T>): PipeStreamResult<T>;
24
+ read<T>(_options?: SessionSubscribeOptions<T>): Promise<AsyncIterableStream<T>>;
25
+ /**
26
+ * Override the one-shot control-record path. In production this goes
27
+ * direct to S2 with header-form records; in tests we project it back
28
+ * into the chunk-shape the harness already understands (the listener
29
+ * watches for `{type: "trigger:turn-complete"}` to drive turn-complete
30
+ * latches). Returns an empty `StreamWriteResult` — tests don't observe
31
+ * the seq_num, and trim seeding only matters in production.
32
+ */
33
+ writeControl(subtype: string, extraHeaders?: ReadonlyArray<readonly [string, string]>): Promise<StreamWriteResult>;
34
+ /**
35
+ * No-op in the mock harness. Production trims keep `session.out` bounded;
36
+ * the in-memory `state.chunks` array doesn't need trimming and tests
37
+ * that care about trim behaviour exercise it via the real S2 code path.
38
+ */
39
+ trimTo(_earliestSeqNum: number): Promise<void>;
40
+ }
41
+ /**
42
+ * Construct a {@link SessionHandle} whose `.out` channel captures writes in
43
+ * memory and whose `.in` channel routes through the `sessionStreams`
44
+ * global for record subscriptions (`on` / `once` / `peek`) but stubs
45
+ * `wait()` to skip the apiClient round-trip — see
46
+ * {@link TestSessionInputChannel}.
47
+ *
48
+ * `getAbortSignal` lets the channel observe the harness's run signal so
49
+ * `wait()` resolves cleanly on close. Pass a getter (not the signal
50
+ * directly) so the channel reads it lazily — the harness creates its
51
+ * `AbortController` after the override is installed.
52
+ */
53
+ export declare function createTestSessionHandle(sessionId: string, state: TestSessionOutState, getAbortSignal?: () => AbortSignal | undefined): SessionHandle;