@trigger.dev/sdk 4.4.6 → 4.5.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/v3/agentSkillsRuntime.d.ts +28 -0
- package/dist/commonjs/v3/agentSkillsRuntime.js +163 -0
- package/dist/commonjs/v3/agentSkillsRuntime.js.map +1 -0
- package/dist/commonjs/v3/ai-shared.d.ts +173 -0
- package/dist/commonjs/v3/ai-shared.js +25 -0
- package/dist/commonjs/v3/ai-shared.js.map +1 -0
- package/dist/commonjs/v3/ai.d.ts +2823 -5
- package/dist/commonjs/v3/ai.js +6197 -13
- package/dist/commonjs/v3/ai.js.map +1 -1
- package/dist/commonjs/v3/auth.d.ts +9 -0
- package/dist/commonjs/v3/auth.js.map +1 -1
- package/dist/commonjs/v3/chat-client.d.ts +301 -0
- package/dist/commonjs/v3/chat-client.js +624 -0
- package/dist/commonjs/v3/chat-client.js.map +1 -0
- package/dist/commonjs/v3/chat-react.d.ts +155 -0
- package/dist/commonjs/v3/chat-react.js +330 -0
- package/dist/commonjs/v3/chat-react.js.map +1 -0
- package/dist/commonjs/v3/chat-server.d.ts +206 -0
- package/dist/commonjs/v3/chat-server.js +737 -0
- package/dist/commonjs/v3/chat-server.js.map +1 -0
- package/dist/commonjs/v3/chat-server.test.d.ts +1 -0
- package/dist/commonjs/v3/chat-server.test.js +518 -0
- package/dist/commonjs/v3/chat-server.test.js.map +1 -0
- package/dist/commonjs/v3/chat-tab-coordinator.d.ts +65 -0
- package/dist/commonjs/v3/chat-tab-coordinator.js +235 -0
- package/dist/commonjs/v3/chat-tab-coordinator.js.map +1 -0
- package/dist/commonjs/v3/chat-tab-coordinator.test.d.ts +1 -0
- package/dist/commonjs/v3/chat-tab-coordinator.test.js +140 -0
- package/dist/commonjs/v3/chat-tab-coordinator.test.js.map +1 -0
- package/dist/commonjs/v3/chat.d.ts +437 -0
- package/dist/commonjs/v3/chat.js +968 -0
- package/dist/commonjs/v3/chat.js.map +1 -0
- package/dist/commonjs/v3/chat.test.d.ts +1 -0
- package/dist/commonjs/v3/chat.test.js +1180 -0
- package/dist/commonjs/v3/chat.test.js.map +1 -0
- package/dist/commonjs/v3/createStartSessionAction.test.d.ts +1 -0
- package/dist/commonjs/v3/createStartSessionAction.test.js +113 -0
- package/dist/commonjs/v3/createStartSessionAction.test.js.map +1 -0
- package/dist/commonjs/v3/deployments.d.ts +26 -0
- package/dist/commonjs/v3/deployments.js +37 -0
- package/dist/commonjs/v3/deployments.js.map +1 -0
- package/dist/commonjs/v3/index.d.ts +6 -3
- package/dist/commonjs/v3/index.js +7 -1
- package/dist/commonjs/v3/index.js.map +1 -1
- package/dist/commonjs/v3/runs.d.ts +22 -7
- package/dist/commonjs/v3/runs.js +1 -0
- package/dist/commonjs/v3/runs.js.map +1 -1
- package/dist/commonjs/v3/sessions.d.ts +228 -0
- package/dist/commonjs/v3/sessions.js +664 -0
- package/dist/commonjs/v3/sessions.js.map +1 -0
- package/dist/commonjs/v3/sessions.test.d.ts +1 -0
- package/dist/commonjs/v3/sessions.test.js +154 -0
- package/dist/commonjs/v3/sessions.test.js.map +1 -0
- package/dist/commonjs/v3/shared.d.ts +24 -2
- package/dist/commonjs/v3/shared.js +189 -1
- package/dist/commonjs/v3/shared.js.map +1 -1
- package/dist/commonjs/v3/skill.d.ts +99 -0
- package/dist/commonjs/v3/skill.js +155 -0
- package/dist/commonjs/v3/skill.js.map +1 -0
- package/dist/commonjs/v3/skills.d.ts +2 -0
- package/dist/commonjs/v3/skills.js +6 -0
- package/dist/commonjs/v3/skills.js.map +1 -0
- package/dist/commonjs/v3/streams.js +127 -19
- package/dist/commonjs/v3/streams.js.map +1 -1
- package/dist/commonjs/v3/tasks.d.ts +2 -1
- package/dist/commonjs/v3/tasks.js +1 -0
- package/dist/commonjs/v3/tasks.js.map +1 -1
- package/dist/commonjs/v3/test/index.d.ts +3 -0
- package/dist/commonjs/v3/test/index.js +18 -0
- package/dist/commonjs/v3/test/index.js.map +1 -0
- package/dist/commonjs/v3/test/mock-chat-agent.d.ts +259 -0
- package/dist/commonjs/v3/test/mock-chat-agent.js +468 -0
- package/dist/commonjs/v3/test/mock-chat-agent.js.map +1 -0
- package/dist/commonjs/v3/test/setup-catalog.d.ts +1 -0
- package/dist/commonjs/v3/test/setup-catalog.js +18 -0
- package/dist/commonjs/v3/test/setup-catalog.js.map +1 -0
- package/dist/commonjs/v3/test/test-session-handle.d.ts +53 -0
- package/dist/commonjs/v3/test/test-session-handle.js +256 -0
- package/dist/commonjs/v3/test/test-session-handle.js.map +1 -0
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/agentSkillsRuntime.d.ts +28 -0
- package/dist/esm/v3/agentSkillsRuntime.js +136 -0
- package/dist/esm/v3/agentSkillsRuntime.js.map +1 -0
- package/dist/esm/v3/ai-shared.d.ts +173 -0
- package/dist/esm/v3/ai-shared.js +22 -0
- package/dist/esm/v3/ai-shared.js.map +1 -0
- package/dist/esm/v3/ai.d.ts +2823 -5
- package/dist/esm/v3/ai.js +6187 -14
- package/dist/esm/v3/ai.js.map +1 -1
- package/dist/esm/v3/auth.d.ts +9 -0
- package/dist/esm/v3/auth.js.map +1 -1
- package/dist/esm/v3/chat-client.d.ts +301 -0
- package/dist/esm/v3/chat-client.js +619 -0
- package/dist/esm/v3/chat-client.js.map +1 -0
- package/dist/esm/v3/chat-react.d.ts +155 -0
- package/dist/esm/v3/chat-react.js +325 -0
- package/dist/esm/v3/chat-react.js.map +1 -0
- package/dist/esm/v3/chat-server.d.ts +206 -0
- package/dist/esm/v3/chat-server.js +734 -0
- package/dist/esm/v3/chat-server.js.map +1 -0
- package/dist/esm/v3/chat-server.test.d.ts +1 -0
- package/dist/esm/v3/chat-server.test.js +516 -0
- package/dist/esm/v3/chat-server.test.js.map +1 -0
- package/dist/esm/v3/chat-tab-coordinator.d.ts +65 -0
- package/dist/esm/v3/chat-tab-coordinator.js +231 -0
- package/dist/esm/v3/chat-tab-coordinator.js.map +1 -0
- package/dist/esm/v3/chat-tab-coordinator.test.d.ts +1 -0
- package/dist/esm/v3/chat-tab-coordinator.test.js +138 -0
- package/dist/esm/v3/chat-tab-coordinator.test.js.map +1 -0
- package/dist/esm/v3/chat.d.ts +437 -0
- package/dist/esm/v3/chat.js +961 -0
- package/dist/esm/v3/chat.js.map +1 -0
- package/dist/esm/v3/chat.test.d.ts +1 -0
- package/dist/esm/v3/chat.test.js +1178 -0
- package/dist/esm/v3/chat.test.js.map +1 -0
- package/dist/esm/v3/createStartSessionAction.test.d.ts +1 -0
- package/dist/esm/v3/createStartSessionAction.test.js +111 -0
- package/dist/esm/v3/createStartSessionAction.test.js.map +1 -0
- package/dist/esm/v3/deployments.d.ts +26 -0
- package/dist/esm/v3/deployments.js +34 -0
- package/dist/esm/v3/deployments.js.map +1 -0
- package/dist/esm/v3/index.d.ts +6 -3
- package/dist/esm/v3/index.js +4 -1
- package/dist/esm/v3/index.js.map +1 -1
- package/dist/esm/v3/runs.d.ts +15 -0
- package/dist/esm/v3/runs.js +1 -0
- package/dist/esm/v3/runs.js.map +1 -1
- package/dist/esm/v3/sessions.d.ts +228 -0
- package/dist/esm/v3/sessions.js +656 -0
- package/dist/esm/v3/sessions.js.map +1 -0
- package/dist/esm/v3/sessions.test.d.ts +1 -0
- package/dist/esm/v3/sessions.test.js +152 -0
- package/dist/esm/v3/sessions.test.js.map +1 -0
- package/dist/esm/v3/shared.d.ts +24 -2
- package/dist/esm/v3/shared.js +188 -1
- package/dist/esm/v3/shared.js.map +1 -1
- package/dist/esm/v3/skill.d.ts +99 -0
- package/dist/esm/v3/skill.js +128 -0
- package/dist/esm/v3/skill.js.map +1 -0
- package/dist/esm/v3/skills.d.ts +2 -0
- package/dist/esm/v3/skills.js +2 -0
- package/dist/esm/v3/skills.js.map +1 -0
- package/dist/esm/v3/streams.js +127 -20
- package/dist/esm/v3/streams.js.map +1 -1
- package/dist/esm/v3/tasks.d.ts +2 -1
- package/dist/esm/v3/tasks.js +2 -1
- package/dist/esm/v3/tasks.js.map +1 -1
- package/dist/esm/v3/test/index.d.ts +3 -0
- package/dist/esm/v3/test/index.js +13 -0
- package/dist/esm/v3/test/index.js.map +1 -0
- package/dist/esm/v3/test/mock-chat-agent.d.ts +259 -0
- package/dist/esm/v3/test/mock-chat-agent.js +465 -0
- package/dist/esm/v3/test/mock-chat-agent.js.map +1 -0
- package/dist/esm/v3/test/setup-catalog.d.ts +1 -0
- package/dist/esm/v3/test/setup-catalog.js +16 -0
- package/dist/esm/v3/test/setup-catalog.js.map +1 -0
- package/dist/esm/v3/test/test-session-handle.d.ts +53 -0
- package/dist/esm/v3/test/test-session-handle.js +251 -0
- package/dist/esm/v3/test/test-session-handle.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/package.json +87 -6
|
@@ -0,0 +1,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;
|