@trigger.dev/sdk 4.4.5 → 4.5.0-rc.0
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,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestSessionOutputChannel = void 0;
|
|
4
|
+
exports.createTestSessionHandle = createTestSessionHandle;
|
|
5
|
+
const v3_1 = require("@trigger.dev/core/v3");
|
|
6
|
+
const sessions_js_1 = require("../sessions.js");
|
|
7
|
+
/**
|
|
8
|
+
* Stub for `SessionInputChannel.wait` that skips the apiClient round-trip
|
|
9
|
+
* the production path makes via `createSessionStreamWaitpoint`. Without
|
|
10
|
+
* this override, every test that exercises the suspend fallback (e.g.
|
|
11
|
+
* the `chat.handover` idle-timeout case) throws `ApiClientMissingError`
|
|
12
|
+
* because `apiClientManager.clientOrThrow()` runs in a test process that
|
|
13
|
+
* has no `TRIGGER_SECRET_KEY`.
|
|
14
|
+
*
|
|
15
|
+
* The promise resolves with `{ ok: false, error }` when the harness
|
|
16
|
+
* aborts its run signal — that mimics production semantics (suspended
|
|
17
|
+
* until something happens, returns cleanly on abort) without making a
|
|
18
|
+
* network call.
|
|
19
|
+
*/
|
|
20
|
+
class TestSessionInputChannel extends sessions_js_1.SessionInputChannel {
|
|
21
|
+
getAbortSignal;
|
|
22
|
+
constructor(sessionId, getAbortSignal) {
|
|
23
|
+
super(sessionId);
|
|
24
|
+
this.getAbortSignal = getAbortSignal;
|
|
25
|
+
}
|
|
26
|
+
// Override only the `wait` path. `on` / `once` / `peek` / `send`
|
|
27
|
+
// continue to flow through the real `sessionStreams` global, which
|
|
28
|
+
// the mock task context installs as a `TestSessionStreamManager`.
|
|
29
|
+
wait() {
|
|
30
|
+
return new v3_1.ManualWaitpointPromise((resolve) => {
|
|
31
|
+
const signal = this.getAbortSignal();
|
|
32
|
+
if (!signal) {
|
|
33
|
+
// Harness hasn't wired up its run signal yet — nothing to abort
|
|
34
|
+
// on. Stay pending; the run loop should never reach this state
|
|
35
|
+
// in practice but we don't want to throw here either.
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const onAbort = () => {
|
|
39
|
+
resolve({
|
|
40
|
+
ok: false,
|
|
41
|
+
error: new Error("session.in.wait() aborted by test harness"),
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
if (signal.aborted) {
|
|
45
|
+
onAbort();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function notify(state, chunk) {
|
|
53
|
+
state.chunks.push(chunk);
|
|
54
|
+
for (const listener of state.listeners) {
|
|
55
|
+
try {
|
|
56
|
+
listener(chunk);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Never let a listener error break stream writes
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function drainInto(source, state) {
|
|
64
|
+
const readable = (0, v3_1.ensureReadableStream)(source);
|
|
65
|
+
const reader = readable.getReader();
|
|
66
|
+
try {
|
|
67
|
+
while (true) {
|
|
68
|
+
const { done, value } = await reader.read();
|
|
69
|
+
if (done)
|
|
70
|
+
return;
|
|
71
|
+
notify(state, value);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
try {
|
|
76
|
+
reader.releaseLock();
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// ignore
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* `.out` channel that captures writes in memory instead of piping to S2.
|
|
85
|
+
* Mirrors {@link SessionOutputChannel}'s public shape — `pipe` / `writer`
|
|
86
|
+
* / `append` / `read` — so the agent's existing code paths work unchanged.
|
|
87
|
+
*/
|
|
88
|
+
class TestSessionOutputChannel extends sessions_js_1.SessionOutputChannel {
|
|
89
|
+
state;
|
|
90
|
+
constructor(sessionId, state) {
|
|
91
|
+
super(sessionId);
|
|
92
|
+
this.state = state;
|
|
93
|
+
}
|
|
94
|
+
async append(value, _options) {
|
|
95
|
+
notify(this.state, value);
|
|
96
|
+
}
|
|
97
|
+
pipe(value, _options) {
|
|
98
|
+
const state = this.state;
|
|
99
|
+
const readChunks = [];
|
|
100
|
+
let resolveDone;
|
|
101
|
+
const done = new Promise((resolve) => {
|
|
102
|
+
resolveDone = resolve;
|
|
103
|
+
});
|
|
104
|
+
(async () => {
|
|
105
|
+
const readable = (0, v3_1.ensureReadableStream)(value);
|
|
106
|
+
const reader = readable.getReader();
|
|
107
|
+
try {
|
|
108
|
+
while (true) {
|
|
109
|
+
const { done: d, value: v } = await reader.read();
|
|
110
|
+
if (d)
|
|
111
|
+
return;
|
|
112
|
+
readChunks.push(v);
|
|
113
|
+
notify(state, v);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
try {
|
|
118
|
+
reader.releaseLock();
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// ignore
|
|
122
|
+
}
|
|
123
|
+
resolveDone();
|
|
124
|
+
}
|
|
125
|
+
})().catch(() => {
|
|
126
|
+
resolveDone();
|
|
127
|
+
});
|
|
128
|
+
const replayStream = new ReadableStream({
|
|
129
|
+
async start(controller) {
|
|
130
|
+
await done;
|
|
131
|
+
for (const chunk of readChunks)
|
|
132
|
+
controller.enqueue(chunk);
|
|
133
|
+
controller.close();
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
const emptyResult = {};
|
|
137
|
+
return {
|
|
138
|
+
get stream() {
|
|
139
|
+
return replayStream;
|
|
140
|
+
},
|
|
141
|
+
waitUntilComplete: async () => {
|
|
142
|
+
await done;
|
|
143
|
+
return emptyResult;
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
writer(options) {
|
|
148
|
+
let controller;
|
|
149
|
+
const ongoing = [];
|
|
150
|
+
const state = this.state;
|
|
151
|
+
const stream = new ReadableStream({
|
|
152
|
+
start(c) {
|
|
153
|
+
controller = c;
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
const safeEnqueue = (data) => {
|
|
157
|
+
try {
|
|
158
|
+
controller.enqueue(data);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Stream already closed
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
try {
|
|
165
|
+
const result = options.execute({
|
|
166
|
+
write(part) {
|
|
167
|
+
safeEnqueue(part);
|
|
168
|
+
notify(state, part);
|
|
169
|
+
},
|
|
170
|
+
merge(streamArg) {
|
|
171
|
+
ongoing.push(drainInto(streamArg, state).catch(() => { }));
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
if (result) {
|
|
175
|
+
ongoing.push(result.catch(() => { }));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// Swallow — tests can inspect state.chunks
|
|
180
|
+
}
|
|
181
|
+
const done = (async () => {
|
|
182
|
+
while (ongoing.length > 0) {
|
|
183
|
+
await ongoing.shift();
|
|
184
|
+
}
|
|
185
|
+
})().finally(() => {
|
|
186
|
+
try {
|
|
187
|
+
controller.close();
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Already closed
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
const emptyResult = {};
|
|
194
|
+
return {
|
|
195
|
+
get stream() {
|
|
196
|
+
return stream;
|
|
197
|
+
},
|
|
198
|
+
waitUntilComplete: async () => {
|
|
199
|
+
await done;
|
|
200
|
+
return emptyResult;
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
async read(_options) {
|
|
205
|
+
throw new Error("TestSessionOutputChannel.read() is not supported in the mock-chat-agent harness — " +
|
|
206
|
+
"inspect `harness.allChunks` / `harness.allRawChunks` instead.");
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Override the one-shot control-record path. In production this goes
|
|
210
|
+
* direct to S2 with header-form records; in tests we project it back
|
|
211
|
+
* into the chunk-shape the harness already understands (the listener
|
|
212
|
+
* watches for `{type: "trigger:turn-complete"}` to drive turn-complete
|
|
213
|
+
* latches). Returns an empty `StreamWriteResult` — tests don't observe
|
|
214
|
+
* the seq_num, and trim seeding only matters in production.
|
|
215
|
+
*/
|
|
216
|
+
async writeControl(subtype, extraHeaders) {
|
|
217
|
+
const synthetic = { type: `trigger:${subtype}` };
|
|
218
|
+
if (extraHeaders) {
|
|
219
|
+
for (const [name, value] of extraHeaders) {
|
|
220
|
+
if (name === "public-access-token") {
|
|
221
|
+
synthetic.publicAccessToken = value;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
notify(this.state, synthetic);
|
|
226
|
+
return {};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* No-op in the mock harness. Production trims keep `session.out` bounded;
|
|
230
|
+
* the in-memory `state.chunks` array doesn't need trimming and tests
|
|
231
|
+
* that care about trim behaviour exercise it via the real S2 code path.
|
|
232
|
+
*/
|
|
233
|
+
async trimTo(_earliestSeqNum) {
|
|
234
|
+
// Intentionally a no-op for the mock harness.
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.TestSessionOutputChannel = TestSessionOutputChannel;
|
|
238
|
+
/**
|
|
239
|
+
* Construct a {@link SessionHandle} whose `.out` channel captures writes in
|
|
240
|
+
* memory and whose `.in` channel routes through the `sessionStreams`
|
|
241
|
+
* global for record subscriptions (`on` / `once` / `peek`) but stubs
|
|
242
|
+
* `wait()` to skip the apiClient round-trip — see
|
|
243
|
+
* {@link TestSessionInputChannel}.
|
|
244
|
+
*
|
|
245
|
+
* `getAbortSignal` lets the channel observe the harness's run signal so
|
|
246
|
+
* `wait()` resolves cleanly on close. Pass a getter (not the signal
|
|
247
|
+
* directly) so the channel reads it lazily — the harness creates its
|
|
248
|
+
* `AbortController` after the override is installed.
|
|
249
|
+
*/
|
|
250
|
+
function createTestSessionHandle(sessionId, state, getAbortSignal = () => undefined) {
|
|
251
|
+
return new sessions_js_1.SessionHandle(sessionId, {
|
|
252
|
+
in: new TestSessionInputChannel(sessionId, getAbortSignal),
|
|
253
|
+
out: new TestSessionOutputChannel(sessionId, state),
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=test-session-handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-session-handle.js","sourceRoot":"","sources":["../../../../src/v3/test/test-session-handle.ts"],"names":[],"mappings":";;;AAmSA,0DASC;AAtSD,6CAAoF;AACpF,gDAMwB;AAExB;;;;;;;;;;;;GAYG;AACH,MAAM,uBAAwB,SAAQ,iCAAmB;IACP;IAAhD,YAAY,SAAiB,EAAmB,cAA6C;QAC3F,KAAK,CAAC,SAAS,CAAC,CAAC;QAD6B,mBAAc,GAAd,cAAc,CAA+B;IAE7F,CAAC;IAED,iEAAiE;IACjE,mEAAmE;IACnE,kEAAkE;IAClE,IAAI;QACF,OAAO,IAAI,2BAAsB,CAAI,CAAC,OAAqD,EAAE,EAAE;YAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,gEAAgE;gBAChE,+DAA+D;gBAC/D,sDAAsD;gBACtD,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,OAAO,CAAC;oBACN,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,IAAI,KAAK,CAAC,2CAA2C,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC,CAAC;YACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAaD,SAAS,MAAM,CAAC,KAA0B,EAAE,KAAc;IACxD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAA4C,EAC5C,KAA0B;IAE1B,MAAM,QAAQ,GAAG,IAAA,yBAAoB,EAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,OAAO;YACjB,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAa,wBAAyB,SAAQ,kCAAoB;IAG7C;IAFnB,YACE,SAAiB,EACA,KAA0B;QAE3C,KAAK,CAAC,SAAS,CAAC,CAAC;QAFA,UAAK,GAAL,KAAK,CAAqB;IAG7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,KAAQ,EAAE,QAAmC;QAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CACF,KAA2C,EAC3C,QAAmC;QAEnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,UAAU,GAAQ,EAAE,CAAC;QAC3B,IAAI,WAAwB,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACzC,WAAW,GAAG,OAAO,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,QAAQ,GAAG,IAAA,yBAAoB,EAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAClD,IAAI,CAAC;wBAAE,OAAO;oBACd,UAAU,CAAC,IAAI,CAAC,CAAM,CAAC,CAAC;oBACxB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC;oBACH,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,cAAc,CAAI;YACzC,KAAK,CAAC,KAAK,CAAC,UAAU;gBACpB,MAAM,IAAI,CAAC;gBACX,KAAK,MAAM,KAAK,IAAI,UAAU;oBAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1D,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,GAAsB,EAAE,CAAC;QAE1C,OAAO;YACL,IAAI,MAAM;gBACR,OAAO,YAAsC,CAAC;YAChD,CAAC;YACD,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC5B,MAAM,IAAI,CAAC;gBACX,OAAO,WAAW,CAAC;YACrB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAI,OAA+B;QACvC,IAAI,UAA+C,CAAC;QACpD,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAI;YACnC,KAAK,CAAC,CAAC;gBACL,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,CAAC,IAAO,EAAE,EAAE;YAC9B,IAAI,CAAC;gBACH,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;gBAC7B,KAAK,CAAC,IAAI;oBACR,WAAW,CAAC,IAAI,CAAC,CAAC;oBAClB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACtB,CAAC;gBACD,KAAK,CAAC,SAAS;oBACb,OAAO,CAAC,IAAI,CACV,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAC5C,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;QAED,MAAM,IAAI,GAAkB,CAAC,KAAK,IAAI,EAAE;YACtC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,IAAI,CAAC;gBACH,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAsB,EAAE,CAAC;QAE1C,OAAO;YACL,IAAI,MAAM;gBACR,OAAO,MAAgC,CAAC;YAC1C,CAAC;YACD,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC5B,MAAM,IAAI,CAAC;gBACX,OAAO,WAAW,CAAC;YACrB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,QAAqC;QACjD,MAAM,IAAI,KAAK,CACb,oFAAoF;YAClF,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,OAAe,EACf,YAAuD;QAEvD,MAAM,SAAS,GAA4B,EAAE,IAAI,EAAE,WAAW,OAAO,EAAE,EAAE,CAAC;QAC1E,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;gBACzC,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;oBACnC,SAAS,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,eAAuB;QAClC,8CAA8C;IAChD,CAAC;CACF;AAzKD,4DAyKC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,uBAAuB,CACrC,SAAiB,EACjB,KAA0B,EAC1B,iBAAgD,GAAG,EAAE,CAAC,SAAS;IAE/D,OAAO,IAAI,2BAAa,CAAC,SAAS,EAAE;QAClC,EAAE,EAAE,IAAI,uBAAuB,CAAC,SAAS,EAAE,cAAc,CAAC;QAC1D,GAAG,EAAE,IAAI,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC;KACpD,CAAC,CAAC;AACL,CAAC"}
|
package/dist/commonjs/version.js
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type BashSkillInput = {
|
|
2
|
+
/** Absolute path to the skill's root (used as `cwd`). */
|
|
3
|
+
skillPath: string;
|
|
4
|
+
/** The bash command to run. */
|
|
5
|
+
command: string;
|
|
6
|
+
/** Optional abort signal forwarded to `spawn()`. */
|
|
7
|
+
abortSignal?: AbortSignal;
|
|
8
|
+
};
|
|
9
|
+
export type BashSkillResult = {
|
|
10
|
+
exitCode: number | null;
|
|
11
|
+
stdout: string;
|
|
12
|
+
stderr: string;
|
|
13
|
+
} | {
|
|
14
|
+
error: string;
|
|
15
|
+
};
|
|
16
|
+
export type ReadFileInSkillInput = {
|
|
17
|
+
/** Absolute path to the skill's root — the relative path must resolve inside it. */
|
|
18
|
+
skillPath: string;
|
|
19
|
+
/** Relative path the tool caller supplied. */
|
|
20
|
+
relativePath: string;
|
|
21
|
+
};
|
|
22
|
+
export type ReadFileInSkillResult = {
|
|
23
|
+
content: string;
|
|
24
|
+
} | {
|
|
25
|
+
error: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function readFileInSkill({ skillPath, relativePath, }: ReadFileInSkillInput): Promise<ReadFileInSkillResult>;
|
|
28
|
+
export declare function runBashInSkill({ skillPath, command, abortSignal, }: BashSkillInput): Promise<BashSkillResult>;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as nodePath from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Server-only runtime for the auto-injected skill tools
|
|
6
|
+
* (`loadSkill` / `readFile` / `bash`) that `chat.agent({ skills })`
|
|
7
|
+
* wires up. Split off from `./ai.ts` so the chat-agent surface in
|
|
8
|
+
* `@trigger.dev/sdk/ai` stays importable from client bundles —
|
|
9
|
+
* Next.js + Webpack reject top-level `node:*` imports anywhere in a
|
|
10
|
+
* client graph, even when a consumer only pulls in types.
|
|
11
|
+
*
|
|
12
|
+
* The SDK's `ai.ts` loads this module via a computed-string dynamic
|
|
13
|
+
* import inside each tool's `execute` — webpack treats the
|
|
14
|
+
* expression as an unknown dependency and skips static tracing, so
|
|
15
|
+
* the node-only symbols here never surface in a client build. The
|
|
16
|
+
* module resolves fine at runtime on a server worker because the
|
|
17
|
+
* relative path (`./agentSkillsRuntime.js`) lands next to `ai.js` in
|
|
18
|
+
* the emitted dist.
|
|
19
|
+
*
|
|
20
|
+
* Public subpath: `@trigger.dev/sdk/ai/skills-runtime`. Customers
|
|
21
|
+
* who want to eagerly bundle the runtime server-side (e.g. warming
|
|
22
|
+
* it on worker bootstrap) can import from there.
|
|
23
|
+
*/
|
|
24
|
+
const DEFAULT_BASH_OUTPUT_BYTES = 64 * 1024;
|
|
25
|
+
const DEFAULT_READ_FILE_BYTES = 1024 * 1024;
|
|
26
|
+
function truncate(s, limit) {
|
|
27
|
+
if (s.length <= limit)
|
|
28
|
+
return s;
|
|
29
|
+
return s.slice(0, limit) + `\n…[truncated ${s.length - limit} bytes]`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Path-traversal guard: confirm `relative` resolves inside `root`,
|
|
33
|
+
* even after symlinks are followed. Throws if it escapes via `..`, an
|
|
34
|
+
* absolute prefix, or a symlink that points outside. Returns the
|
|
35
|
+
* resolved real path.
|
|
36
|
+
*
|
|
37
|
+
* `fs.realpath` only works on paths that exist, so when the resolved
|
|
38
|
+
* path doesn't exist yet (e.g. writing a new file) we fall back to
|
|
39
|
+
* the lexical check — a non-existent path can't traverse a symlink
|
|
40
|
+
* to escape since the symlink doesn't exist either.
|
|
41
|
+
*/
|
|
42
|
+
async function safeJoinInside(root, relative) {
|
|
43
|
+
if (nodePath.isAbsolute(relative)) {
|
|
44
|
+
throw new Error(`Path must be relative to the skill directory: ${relative}`);
|
|
45
|
+
}
|
|
46
|
+
const realRoot = await fs.realpath(nodePath.resolve(root));
|
|
47
|
+
const resolved = nodePath.resolve(realRoot, relative);
|
|
48
|
+
let real = resolved;
|
|
49
|
+
try {
|
|
50
|
+
real = await fs.realpath(resolved);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err.code !== "ENOENT") {
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
// Path doesn't exist yet; fall through with the lexical resolve.
|
|
57
|
+
}
|
|
58
|
+
const normalized = realRoot + nodePath.sep;
|
|
59
|
+
if (real !== realRoot && !real.startsWith(normalized)) {
|
|
60
|
+
throw new Error(`Path escapes the skill directory: ${relative}`);
|
|
61
|
+
}
|
|
62
|
+
return real;
|
|
63
|
+
}
|
|
64
|
+
export async function readFileInSkill({ skillPath, relativePath, }) {
|
|
65
|
+
let absolute;
|
|
66
|
+
try {
|
|
67
|
+
absolute = await safeJoinInside(skillPath, relativePath);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
return { error: err.message };
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const content = await fs.readFile(absolute, "utf8");
|
|
74
|
+
return { content: truncate(content, DEFAULT_READ_FILE_BYTES) };
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return { error: err.message };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function runBashInSkill({ skillPath, command, abortSignal, }) {
|
|
81
|
+
return new Promise((resolvePromise) => {
|
|
82
|
+
let child;
|
|
83
|
+
try {
|
|
84
|
+
child = spawn("bash", ["-c", command], {
|
|
85
|
+
cwd: skillPath,
|
|
86
|
+
signal: abortSignal,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
resolvePromise({ error: err.message });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Cap stdout/stderr accumulation at the byte budget so an
|
|
94
|
+
// LLM-generated command (`cat /dev/zero`, `yes`) can't OOM the
|
|
95
|
+
// worker. Track total seen length separately so the truncation
|
|
96
|
+
// notice still reports how much was dropped.
|
|
97
|
+
let stdout = "";
|
|
98
|
+
let stderr = "";
|
|
99
|
+
let stdoutSeen = 0;
|
|
100
|
+
let stderrSeen = 0;
|
|
101
|
+
const limit = DEFAULT_BASH_OUTPUT_BYTES;
|
|
102
|
+
child.stdout?.on("data", (chunk) => {
|
|
103
|
+
const text = chunk.toString();
|
|
104
|
+
stdoutSeen += text.length;
|
|
105
|
+
if (stdout.length >= limit)
|
|
106
|
+
return;
|
|
107
|
+
const remaining = limit - stdout.length;
|
|
108
|
+
stdout += text.length > remaining ? text.slice(0, remaining) : text;
|
|
109
|
+
});
|
|
110
|
+
child.stderr?.on("data", (chunk) => {
|
|
111
|
+
const text = chunk.toString();
|
|
112
|
+
stderrSeen += text.length;
|
|
113
|
+
if (stderr.length >= limit)
|
|
114
|
+
return;
|
|
115
|
+
const remaining = limit - stderr.length;
|
|
116
|
+
stderr += text.length > remaining ? text.slice(0, remaining) : text;
|
|
117
|
+
});
|
|
118
|
+
child.once("close", (code) => {
|
|
119
|
+
const stdoutFinal = stdoutSeen > stdout.length
|
|
120
|
+
? `${stdout}\n…[truncated ${stdoutSeen - stdout.length} bytes]`
|
|
121
|
+
: stdout;
|
|
122
|
+
const stderrFinal = stderrSeen > stderr.length
|
|
123
|
+
? `${stderr}\n…[truncated ${stderrSeen - stderr.length} bytes]`
|
|
124
|
+
: stderr;
|
|
125
|
+
resolvePromise({
|
|
126
|
+
exitCode: code,
|
|
127
|
+
stdout: stdoutFinal,
|
|
128
|
+
stderr: stderrFinal,
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
child.once("error", (err) => {
|
|
132
|
+
resolvePromise({ error: err.message });
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=agentSkillsRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentSkillsRuntime.js","sourceRoot":"","sources":["../../../src/v3/agentSkillsRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe primitives shared between `@trigger.dev/sdk/ai` (server) and
|
|
3
|
+
* `@trigger.dev/sdk/chat` / `@trigger.dev/sdk/chat/react` (client).
|
|
4
|
+
*
|
|
5
|
+
* This module exists to keep `ai.ts` reachable only from the server graph.
|
|
6
|
+
* `ai.ts` weighs in at ~7000 lines and statically imports the agent-skills
|
|
7
|
+
* runtime (which uses `node:child_process` / `node:fs/promises`). When a
|
|
8
|
+
* browser bundle imports a runtime value from `ai.ts` — historically the
|
|
9
|
+
* `PENDING_MESSAGE_INJECTED_TYPE` constant in `chat-react.ts` — the bundler
|
|
10
|
+
* traces `ai.ts`'s entire module graph into the client chunk and hits the
|
|
11
|
+
* `node:` builtins, which Turbopack rejects outright (and webpack flags as
|
|
12
|
+
* a "Critical dependency" warning).
|
|
13
|
+
*
|
|
14
|
+
* Anything in this file MUST stay free of `node:*` imports and free of any
|
|
15
|
+
* import from `ai.ts`.
|
|
16
|
+
*/
|
|
17
|
+
import type { Task, AnyTask } from "@trigger.dev/core/v3";
|
|
18
|
+
import type { ModelMessage, UIMessage } from "ai";
|
|
19
|
+
/**
|
|
20
|
+
* Message-part `type` value for the pending-message data part the agent
|
|
21
|
+
* injects when a follow-up message arrives mid-turn.
|
|
22
|
+
*/
|
|
23
|
+
export declare const PENDING_MESSAGE_INJECTED_TYPE: "data-pending-message-injected";
|
|
24
|
+
/**
|
|
25
|
+
* The wire payload shape sent by `TriggerChatTransport`.
|
|
26
|
+
* Uses `metadata` to match the AI SDK's `ChatRequestOptions` field name.
|
|
27
|
+
*
|
|
28
|
+
* Slim wire: at most ONE message per record. The agent runtime
|
|
29
|
+
* reconstructs prior history at run boot from a durable S3 snapshot +
|
|
30
|
+
* `session.out` replay (or `hydrateMessages` if registered). The wire is
|
|
31
|
+
* delta-only — see plan `vivid-humming-bonbon.md`.
|
|
32
|
+
*/
|
|
33
|
+
export type ChatTaskWirePayload<TMessage extends UIMessage = UIMessage, TMetadata = unknown> = {
|
|
34
|
+
/**
|
|
35
|
+
* The single message being delivered on this trigger. Set for:
|
|
36
|
+
* - `submit-message`: the new user message OR a tool-approval-responded
|
|
37
|
+
* assistant message (with `state: "approval-responded"` tool parts).
|
|
38
|
+
* - `regenerate-message`: omitted (the agent slices its own history).
|
|
39
|
+
* - `preload` / `close` / `action`: omitted.
|
|
40
|
+
* - `handover-prepare`: omitted (use `headStartMessages` instead).
|
|
41
|
+
*/
|
|
42
|
+
message?: TMessage;
|
|
43
|
+
/**
|
|
44
|
+
* Bespoke escape hatch for `chat.headStart`. The customer's HTTP route
|
|
45
|
+
* handler ships full `UIMessage[]` history at the very first turn — before
|
|
46
|
+
* any snapshot exists. The route handler isn't subject to the
|
|
47
|
+
* `MAX_APPEND_BODY_BYTES` cap on `/in/append` because it goes through the
|
|
48
|
+
* customer's own HTTP endpoint. Used ONLY by `trigger: "handover-prepare"`.
|
|
49
|
+
* Ignored on every other trigger.
|
|
50
|
+
*/
|
|
51
|
+
headStartMessages?: TMessage[];
|
|
52
|
+
chatId: string;
|
|
53
|
+
trigger: "submit-message" | "regenerate-message" | "preload" | "close" | "action"
|
|
54
|
+
/**
|
|
55
|
+
* The customer's `chat.handover` route handler kicked us off in
|
|
56
|
+
* parallel with the first-turn `streamText` running in the warm
|
|
57
|
+
* Next.js process. The run sits idle on `session.in` waiting for
|
|
58
|
+
* a `kind: "handover"` (continue from tool execution) or
|
|
59
|
+
* `kind: "handover-skip"` (handler finished pure-text, exit
|
|
60
|
+
* cleanly). See `chat.handover` in `@trigger.dev/sdk/chat-server`.
|
|
61
|
+
*/
|
|
62
|
+
| "handover-prepare";
|
|
63
|
+
messageId?: string;
|
|
64
|
+
metadata?: TMetadata;
|
|
65
|
+
/** Custom action payload when `trigger` is `"action"`. Validated against `actionSchema` on the backend. */
|
|
66
|
+
action?: unknown;
|
|
67
|
+
/** Whether this run is continuing an existing chat whose previous run ended. */
|
|
68
|
+
continuation?: boolean;
|
|
69
|
+
/** The run ID of the previous run (only set when `continuation` is true). */
|
|
70
|
+
previousRunId?: string;
|
|
71
|
+
/** Override idle timeout for this run (seconds). Set by transport.preload(). */
|
|
72
|
+
idleTimeoutInSeconds?: number;
|
|
73
|
+
/**
|
|
74
|
+
* The friendlyId of the Session primitive backing this chat. The
|
|
75
|
+
* transport opens (or lazy-creates) the session with
|
|
76
|
+
* `externalId = chatId` on first message, then sends this friendlyId
|
|
77
|
+
* through to the run so the agent can attach to `.in` / `.out`
|
|
78
|
+
* without needing to round-trip through the control plane again.
|
|
79
|
+
* Optional for backward-compat while the migration is in flight;
|
|
80
|
+
* required once the legacy run-scoped stream path is removed.
|
|
81
|
+
*/
|
|
82
|
+
sessionId?: string;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* One chunk on the chat input stream. `kind` discriminates the variants —
|
|
86
|
+
* a single ordered stream now carries all the signals the old three-stream
|
|
87
|
+
* split did (`chat-messages`, `chat-stop`, plus action messages piggybacked
|
|
88
|
+
* on `chat-messages`).
|
|
89
|
+
*/
|
|
90
|
+
export type ChatInputChunk<TMessage extends UIMessage = UIMessage, TMetadata = unknown> = {
|
|
91
|
+
kind: "message";
|
|
92
|
+
/**
|
|
93
|
+
* Full wire payload for a new user message or regeneration. Mirrors
|
|
94
|
+
* what the legacy `chat-messages` input stream carried.
|
|
95
|
+
*/
|
|
96
|
+
payload: ChatTaskWirePayload<TMessage, TMetadata>;
|
|
97
|
+
} | {
|
|
98
|
+
kind: "stop";
|
|
99
|
+
/** Optional human-readable reason. Maps to the legacy `chat-stop` record. */
|
|
100
|
+
message?: string;
|
|
101
|
+
} | {
|
|
102
|
+
/**
|
|
103
|
+
* Sent by `chat.headStart` when the customer's first-turn
|
|
104
|
+
* `streamText` finishes. The agent run (currently parked in
|
|
105
|
+
* `handover-prepare`) wakes, seeds its accumulators with
|
|
106
|
+
* `partialAssistantMessage`, and runs the normal turn loop
|
|
107
|
+
* (`onChatStart` → `onTurnStart` → … → `onTurnComplete`).
|
|
108
|
+
*
|
|
109
|
+
* What happens after that depends on `isFinal`:
|
|
110
|
+
*
|
|
111
|
+
* - `isFinal: false` — step 1 ended with `finishReason:
|
|
112
|
+
* "tool-calls"`. The partial carries the assistant's
|
|
113
|
+
* tool-call(s) wrapped in AI SDK's tool-approval round. The
|
|
114
|
+
* agent's `streamText` runs the approved tools and continues
|
|
115
|
+
* from step 2.
|
|
116
|
+
* - `isFinal: true` — step 1 ended pure-text (no tool calls).
|
|
117
|
+
* The partial carries the final assistant text. The agent
|
|
118
|
+
* skips the LLM call entirely (the response is already
|
|
119
|
+
* complete on the customer side) and runs `onTurnComplete`
|
|
120
|
+
* with the partial as `responseMessage` so persistence and
|
|
121
|
+
* any post-turn work fire normally.
|
|
122
|
+
*/
|
|
123
|
+
kind: "handover";
|
|
124
|
+
/** Customer's step-1 response messages (ModelMessage form). */
|
|
125
|
+
partialAssistantMessage: ModelMessage[];
|
|
126
|
+
/**
|
|
127
|
+
* The UI messageId the customer's handler used for its step-1
|
|
128
|
+
* assistant message. The agent reuses this so any post-handover
|
|
129
|
+
* chunks (tool-output-available, step-2 text, data-* parts
|
|
130
|
+
* written by hooks) merge into the SAME assistant message on
|
|
131
|
+
* the browser side instead of starting a new one.
|
|
132
|
+
*/
|
|
133
|
+
messageId?: string;
|
|
134
|
+
/**
|
|
135
|
+
* Whether the customer's step 1 is the final response. See
|
|
136
|
+
* `kind` description above for the two branches.
|
|
137
|
+
*/
|
|
138
|
+
isFinal: boolean;
|
|
139
|
+
} | {
|
|
140
|
+
/**
|
|
141
|
+
* Sent by `chat.headStart` only when the customer's handler
|
|
142
|
+
* ABORTS before producing a finishReason (e.g., dispatch error,
|
|
143
|
+
* stream cancelled before any tokens). The agent run exits
|
|
144
|
+
* cleanly without firing turn hooks. Normal pure-text and
|
|
145
|
+
* tool-call finishes go through `kind: "handover"` with the
|
|
146
|
+
* appropriate `isFinal` flag.
|
|
147
|
+
*/
|
|
148
|
+
kind: "handover-skip";
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Extracts the client-data (`metadata`) type from a chat task.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```ts
|
|
155
|
+
* import type { InferChatClientData } from "@trigger.dev/sdk/ai";
|
|
156
|
+
* import type { myChat } from "@/trigger/chat";
|
|
157
|
+
*
|
|
158
|
+
* type MyClientData = InferChatClientData<typeof myChat>;
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export type InferChatClientData<TTask extends AnyTask> = TTask extends Task<string, ChatTaskWirePayload<any, infer TMetadata>, any> ? TMetadata : unknown;
|
|
162
|
+
/**
|
|
163
|
+
* Extracts the UI message type from a chat task (wire payload `message` items).
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* import type { InferChatUIMessage } from "@trigger.dev/sdk/ai";
|
|
168
|
+
* import type { myChat } from "@/trigger/chat";
|
|
169
|
+
*
|
|
170
|
+
* type Msg = InferChatUIMessage<typeof myChat>;
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export type InferChatUIMessage<TTask extends AnyTask> = TTask extends Task<string, ChatTaskWirePayload<infer TUIM extends UIMessage, any>, any> ? TUIM : UIMessage;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe primitives shared between `@trigger.dev/sdk/ai` (server) and
|
|
3
|
+
* `@trigger.dev/sdk/chat` / `@trigger.dev/sdk/chat/react` (client).
|
|
4
|
+
*
|
|
5
|
+
* This module exists to keep `ai.ts` reachable only from the server graph.
|
|
6
|
+
* `ai.ts` weighs in at ~7000 lines and statically imports the agent-skills
|
|
7
|
+
* runtime (which uses `node:child_process` / `node:fs/promises`). When a
|
|
8
|
+
* browser bundle imports a runtime value from `ai.ts` — historically the
|
|
9
|
+
* `PENDING_MESSAGE_INJECTED_TYPE` constant in `chat-react.ts` — the bundler
|
|
10
|
+
* traces `ai.ts`'s entire module graph into the client chunk and hits the
|
|
11
|
+
* `node:` builtins, which Turbopack rejects outright (and webpack flags as
|
|
12
|
+
* a "Critical dependency" warning).
|
|
13
|
+
*
|
|
14
|
+
* Anything in this file MUST stay free of `node:*` imports and free of any
|
|
15
|
+
* import from `ai.ts`.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Message-part `type` value for the pending-message data part the agent
|
|
19
|
+
* injects when a follow-up message arrives mid-turn.
|
|
20
|
+
*/
|
|
21
|
+
export const PENDING_MESSAGE_INJECTED_TYPE = "data-pending-message-injected";
|
|
22
|
+
//# sourceMappingURL=ai-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-shared.js","sourceRoot":"","sources":["../../../src/v3/ai-shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,+BAAwC,CAAC"}
|