@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.
- package/dist/commonjs/v3/chat-react.js +31 -4
- package/dist/commonjs/v3/chat-react.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 +121 -0
- package/dist/commonjs/v3/test/mock-chat-agent.js +233 -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/version.js +1 -1
- package/dist/esm/v3/chat-react.js +31 -4
- package/dist/esm/v3/chat-react.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 +121 -0
- package/dist/esm/v3/test/mock-chat-agent.js +230 -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/version.js +1 -1
- package/package.json +18 -2
|
@@ -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
|
-
//
|
|
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)
|
|
118
|
-
|
|
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":"AAAA,YAAY,CAAC;;;AAmFb,0DA4BC;AAmBD,
|
|
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"}
|
package/dist/commonjs/version.js
CHANGED
|
@@ -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
|
-
//
|
|
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)
|
|
113
|
-
|
|
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":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAoC,MAAM,WAAW,CAAC;AAEnF,OAAO,EACL,6BAA6B,GAG9B,MAAM,SAAS,CAAC;AAqBjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAA8C;IAE9C,MAAM,GAAG,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,OAAsC,CAAC,CAAC;IACjF,CAAC;IAED,6DAA6D;IAC7D,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,4EAA4E;IAC5E,+EAA+E;IAC/E,kEAAkE;IAClE,4EAA4E;IAE5E,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAC7B,SAA+B,EAC/B,MAAc,EACd,QAAa,EACb,WAAoC;IAEpC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjF,wBAAwB;IACxB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,QAAiB,EAAE,EAAE;YACjD,IAAI,EAAE,KAAK,MAAM;gBAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC;QACF,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACxC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAExB,0DAA0D;IAC1D,wEAAwE;IACxE,
|
|
1
|
+
{"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAoC,MAAM,WAAW,CAAC;AAEnF,OAAO,EACL,6BAA6B,GAG9B,MAAM,SAAS,CAAC;AAqBjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAA8C;IAE9C,MAAM,GAAG,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,OAAsC,CAAC,CAAC;IACjF,CAAC;IAED,6DAA6D;IAC7D,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,4EAA4E;IAC5E,+EAA+E;IAC/E,kEAAkE;IAClE,4EAA4E;IAE5E,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAC7B,SAA+B,EAC/B,MAAc,EACd,QAAa,EACb,WAAoC;IAEpC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjF,wBAAwB;IACxB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,QAAiB,EAAE,EAAE;YACjD,IAAI,EAAE,KAAK,MAAM;gBAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC;QACF,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACxC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAExB,0DAA0D;IAC1D,wEAAwE;IACxE,8DAA8D;IAC9D,wEAAwE;IACxE,MAAM,OAAO,GAAG,MAAM,CAAgD,IAAI,CAAC,CAAC;IAC5E,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,iBAAiB,CAAC,OAAO,GAAG,QAAQ,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjE,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,CAAC,oBAAoB;QAE1D,MAAM,QAAQ,GACZ,OAAO,mBAAmB,KAAK,UAAU;YACvC,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,CAAC,EAAc,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE7C,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,OAAoB,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElC,2DAA2D;IAC3D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,MAAM,GACV,OAAO,kBAAkB,KAAK,UAAU;oBACtC,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,YAAY,CAAC;gBACnB,MAAM,CAAC,OAAO,CAAC,OAAc,CAAC,CAAC;gBAC/B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACzB,CAAC;YACD,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,OAAoB,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAEpC,sDAAsD;IACtD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,IAAe,EAAE,EAAE;YAC/C,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;gBAClB,WAAW,CAAC,IAAW,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QACF,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAErC,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC;AA0DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA8C;IAE9C,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAI5F,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,gEAAgE;IAChE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO;QACnC,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YACvC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gBACnC,IAAK,IAAY,CAAC,IAAI,KAAK,6BAA6B,EAAE,CAAC;oBACzD,MAAM,UAAU,GAAI,IAAY,CAAC,IAAI,EAAE,UAAU,CAAC;oBAClD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC9B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;4BAC5B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gCACpC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gCAC/B,aAAa,GAAG,IAAI,CAAC;4BACvB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,yEAAyE;QACzE,IAAI,aAAa,EAAE,CAAC;YAClB,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,yBAAyB;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,KAAK,OAAO,CAAC;QAClF,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,oDAAoD;QACpD,mEAAmE;QACnE,8DAA8D;QAC9D,mEAAmE;QACnE,mEAAmE;QACnE,uEAAuE;QACvE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5E,WAAW;QACX,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAE/B,yBAAyB;QACzB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7E,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3D,kEAAkE;IAClE,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,IAAY,EAAE,EAAE;QACf,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG;gBACV,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,IAAI,EAAE,MAAe;gBACrB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;gBACxC,KAAK,EAAE,UAAmB;aACR,CAAC;YACrB,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YACpD,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CACnD,CAAC;IAEF,2DAA2D;IAC3D,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,IAAY,EAAE,EAAE;QACf,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG;gBACV,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,IAAI,EAAE,MAAe;gBACrB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;gBACxC,KAAK,EAAE,QAAiB;aACN,CAAC;YACrB,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAChC,CAAC;IAEF,2EAA2E;IAC3E,MAAM,cAAc,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,EAAU,EAAE,EAAE;QACb,wDAAwD;QACxD,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,0DAA0D,EAAE,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;QACnD,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE/B,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAChD,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,UAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAC9B,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,IAAa,EAAW,EAAE,CACzB,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACZ,IAAY,CAAC,IAAI,KAAK,6BAA6B,EACtD,EAAE,CACH,CAAC;IAEF,MAAM,qBAAqB,GAAG,WAAW,CACvC,CAAC,IAAa,EAAY,EAAE;QAC1B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,GAAG,GAAI,IAAY,CAAC,IAAI,EAAE,UAAU,CAAC;QAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC,EACD,CAAC,gBAAgB,CAAC,CACnB,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,CAAC,IAAa,EAAqB,EAAE;QACnC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,IAAI,GAAI,IAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC,EACD,CAAC,gBAAgB,CAAC,CACnB,CAAC;IAEF,MAAM,OAAO,GAAqB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAS,EAAE,IAAI,IAAI,EAAE;QACvC,IAAI,EAAE,CAAC,CAAC,KAAK;QACb,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3C,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,OAAO;QACP,KAAK;QACL,KAAK;QACL,iBAAiB;QACjB,gBAAgB;QAChB,qBAAqB;QACrB,mBAAmB;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|
package/dist/esm/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = "0.0.0-chat-prerelease-
|
|
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-
|
|
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-
|
|
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",
|