@trigger.dev/sdk 0.0.0-prerelease-20260909071038 → 0.0.0-prerelease-streamfix-20260909094302
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/imports/ai-runtime-cjs.cjs.map +1 -1
- package/dist/commonjs/imports/ai-runtime.js +0 -2
- package/dist/commonjs/v3/ai-shared.d.ts +0 -15
- package/dist/commonjs/v3/ai-shared.js +1 -35
- package/dist/commonjs/v3/ai-shared.js.map +1 -1
- package/dist/commonjs/v3/ai.d.ts +25 -275
- package/dist/commonjs/v3/ai.js +308 -1283
- package/dist/commonjs/v3/ai.js.map +1 -1
- package/dist/commonjs/v3/chat-client.d.ts +2 -11
- package/dist/commonjs/v3/chat-client.js +111 -227
- package/dist/commonjs/v3/chat-client.js.map +1 -1
- package/dist/commonjs/v3/chat-react.d.ts +0 -88
- package/dist/commonjs/v3/chat-react.js +1 -130
- package/dist/commonjs/v3/chat-react.js.map +1 -1
- package/dist/commonjs/v3/chat-server.d.ts +6 -42
- package/dist/commonjs/v3/chat-server.js +7 -52
- package/dist/commonjs/v3/chat-server.js.map +1 -1
- package/dist/commonjs/v3/chat.d.ts +10 -92
- package/dist/commonjs/v3/chat.js +73 -328
- package/dist/commonjs/v3/chat.js.map +1 -1
- package/dist/commonjs/v3/sessions.d.ts +2 -15
- package/dist/commonjs/v3/sessions.js +1 -12
- package/dist/commonjs/v3/sessions.js.map +1 -1
- package/dist/commonjs/v3/shared.js +36 -30
- package/dist/commonjs/v3/shared.js.map +1 -1
- package/dist/commonjs/v3/test/index.d.ts +0 -1
- package/dist/commonjs/v3/test/index.js +1 -3
- package/dist/commonjs/v3/test/index.js.map +1 -1
- package/dist/commonjs/v3/test/mock-chat-agent.d.ts +4 -47
- package/dist/commonjs/v3/test/mock-chat-agent.js +4 -115
- package/dist/commonjs/v3/test/mock-chat-agent.js.map +1 -1
- package/dist/commonjs/v3/test/test-session-handle.js +0 -6
- package/dist/commonjs/v3/test/test-session-handle.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/imports/ai-runtime.d.ts +2 -2
- package/dist/esm/imports/ai-runtime.js +2 -2
- package/dist/esm/imports/ai-runtime.js.map +1 -1
- package/dist/esm/v3/ai-shared.d.ts +0 -15
- package/dist/esm/v3/ai-shared.js +0 -33
- package/dist/esm/v3/ai-shared.js.map +1 -1
- package/dist/esm/v3/ai.d.ts +25 -275
- package/dist/esm/v3/ai.js +305 -1275
- package/dist/esm/v3/ai.js.map +1 -1
- package/dist/esm/v3/chat-client.d.ts +2 -11
- package/dist/esm/v3/chat-client.js +112 -228
- package/dist/esm/v3/chat-client.js.map +1 -1
- package/dist/esm/v3/chat-react.d.ts +0 -88
- package/dist/esm/v3/chat-react.js +1 -127
- package/dist/esm/v3/chat-react.js.map +1 -1
- package/dist/esm/v3/chat-server.d.ts +6 -42
- package/dist/esm/v3/chat-server.js +8 -53
- package/dist/esm/v3/chat-server.js.map +1 -1
- package/dist/esm/v3/chat.d.ts +10 -92
- package/dist/esm/v3/chat.js +74 -329
- package/dist/esm/v3/chat.js.map +1 -1
- package/dist/esm/v3/sessions.d.ts +2 -15
- package/dist/esm/v3/sessions.js +1 -11
- package/dist/esm/v3/sessions.js.map +1 -1
- package/dist/esm/v3/shared.js +23 -17
- package/dist/esm/v3/shared.js.map +1 -1
- package/dist/esm/v3/test/index.d.ts +0 -1
- package/dist/esm/v3/test/index.js +0 -1
- package/dist/esm/v3/test/index.js.map +1 -1
- package/dist/esm/v3/test/mock-chat-agent.d.ts +4 -47
- package/dist/esm/v3/test/mock-chat-agent.js +6 -117
- package/dist/esm/v3/test/mock-chat-agent.js.map +1 -1
- package/dist/esm/v3/test/test-session-handle.js +0 -6
- package/dist/esm/v3/test/test-session-handle.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/docs/ai-chat/actions.mdx +23 -55
- package/docs/ai-chat/anatomy.mdx +3 -3
- package/docs/ai-chat/backend.mdx +48 -125
- package/docs/ai-chat/background-injection.mdx +19 -69
- package/docs/ai-chat/client-protocol.mdx +4 -5
- package/docs/ai-chat/compaction.mdx +7 -13
- package/docs/ai-chat/custom-agents.mdx +0 -23
- package/docs/ai-chat/fast-starts.mdx +20 -27
- package/docs/ai-chat/frontend.mdx +14 -19
- package/docs/ai-chat/lifecycle-hooks.mdx +2 -6
- package/docs/ai-chat/migrating-from-a-route-handler.mdx +14 -16
- package/docs/ai-chat/patterns/database-persistence.mdx +2 -6
- package/docs/ai-chat/patterns/persistence-and-replay.mdx +23 -34
- package/docs/ai-chat/patterns/skills.mdx +10 -7
- package/docs/ai-chat/patterns/version-upgrades.mdx +6 -79
- package/docs/ai-chat/pending-messages.mdx +3 -3
- package/docs/ai-chat/prompt-caching.mdx +25 -23
- package/docs/ai-chat/quick-start.mdx +11 -11
- package/docs/ai-chat/reference.mdx +9 -67
- package/docs/ai-chat/sessions.mdx +1 -6
- package/docs/ai-chat/testing.mdx +1 -2
- package/docs/ai-chat/tools.mdx +13 -18
- package/docs/ai-chat/upgrade-guide.mdx +2 -2
- package/docs/apikeys.mdx +45 -27
- package/docs/config/extensions/syncEnvVars.mdx +0 -6
- package/docs/deploy-environment-variables.mdx +2 -23
- package/docs/deployment/overview.mdx +8 -4
- package/docs/deployment/preview-branches.mdx +4 -4
- package/docs/deployment/version-skew-protection.mdx +0 -62
- package/docs/manual-setup.mdx +7 -7
- package/docs/mcp-tools.mdx +0 -9
- package/docs/quick-start.mdx +3 -3
- package/docs/realtime/auth.mdx +1 -1
- package/docs/self-hosting/security.mdx +0 -5
- package/docs/tasks/scheduled.mdx +0 -24
- package/docs/triggering.mdx +1 -1
- package/package.json +4 -4
- package/skills/trigger-authoring-chat-agent/SKILL.md +29 -41
- package/skills/trigger-chat-agent-advanced/SKILL.md +12 -31
- package/dist/commonjs/v3/chatSnapshotIo.d.ts +0 -2
- package/dist/commonjs/v3/chatSnapshotIo.js +0 -174
- package/dist/commonjs/v3/chatSnapshotIo.js.map +0 -1
- package/dist/commonjs/v3/chatVersionSkew.d.ts +0 -12
- package/dist/commonjs/v3/chatVersionSkew.js +0 -30
- package/dist/commonjs/v3/chatVersionSkew.js.map +0 -1
- package/dist/commonjs/v3/externalDeploymentId.d.ts +0 -23
- package/dist/commonjs/v3/externalDeploymentId.js +0 -43
- package/dist/commonjs/v3/externalDeploymentId.js.map +0 -1
- package/dist/commonjs/v3/test/transcript-storage-tests.d.ts +0 -40
- package/dist/commonjs/v3/test/transcript-storage-tests.js +0 -258
- package/dist/commonjs/v3/test/transcript-storage-tests.js.map +0 -1
- package/dist/commonjs/v3/transcriptStorage.d.ts +0 -229
- package/dist/commonjs/v3/transcriptStorage.js +0 -321
- package/dist/commonjs/v3/transcriptStorage.js.map +0 -1
- package/dist/esm/v3/chatSnapshotIo.d.ts +0 -2
- package/dist/esm/v3/chatSnapshotIo.js +0 -166
- package/dist/esm/v3/chatSnapshotIo.js.map +0 -1
- package/dist/esm/v3/chatVersionSkew.d.ts +0 -12
- package/dist/esm/v3/chatVersionSkew.js +0 -27
- package/dist/esm/v3/chatVersionSkew.js.map +0 -1
- package/dist/esm/v3/externalDeploymentId.d.ts +0 -23
- package/dist/esm/v3/externalDeploymentId.js +0 -38
- package/dist/esm/v3/externalDeploymentId.js.map +0 -1
- package/dist/esm/v3/test/transcript-storage-tests.d.ts +0 -40
- package/dist/esm/v3/test/transcript-storage-tests.js +0 -255
- package/dist/esm/v3/test/transcript-storage-tests.js.map +0 -1
- package/dist/esm/v3/transcriptStorage.d.ts +0 -229
- package/dist/esm/v3/transcriptStorage.js +0 -309
- package/dist/esm/v3/transcriptStorage.js.map +0 -1
- package/docs/ai-chat/patterns/native-compaction.mdx +0 -310
- package/docs/ai-chat/transcript-storage.mdx +0 -233
- package/docs/reports.mdx +0 -157
- package/docs/troubleshooting-zod.mdx +0 -158
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { apiClientManager, logger, parseTranscriptSnapshot, } from "@trigger.dev/core/v3";
|
|
2
|
-
let readChatSnapshotImpl;
|
|
3
|
-
export function __setReadChatSnapshotImplForTests(impl) {
|
|
4
|
-
readChatSnapshotImpl = impl;
|
|
5
|
-
}
|
|
6
|
-
let writeChatSnapshotImpl;
|
|
7
|
-
export function __setWriteChatSnapshotImplForTests(impl) {
|
|
8
|
-
writeChatSnapshotImpl = impl;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Read the persisted snapshot for a session, in the version 2 shape
|
|
12
|
-
* whatever version was stored. Returns `undefined` on:
|
|
13
|
-
* - missing object (404 from the presigned GET: fresh session, never persisted)
|
|
14
|
-
* - presign failure (network/auth issue)
|
|
15
|
-
* - malformed JSON
|
|
16
|
-
* - a version this runtime does not know
|
|
17
|
-
*
|
|
18
|
-
* Always swallows errors via `logger.warn`. The agent boot loop must stay
|
|
19
|
-
* available even if S3 hiccups; the worst case is replaying more of
|
|
20
|
-
* `session.out` than strictly necessary.
|
|
21
|
-
* @internal
|
|
22
|
-
*/
|
|
23
|
-
export async function readChatSnapshot(sessionId) {
|
|
24
|
-
if (readChatSnapshotImpl) {
|
|
25
|
-
const seeded = await readChatSnapshotImpl(sessionId);
|
|
26
|
-
return seeded === undefined || seeded === null
|
|
27
|
-
? undefined
|
|
28
|
-
: parseTranscriptSnapshot(seeded);
|
|
29
|
-
}
|
|
30
|
-
const apiClient = apiClientManager.clientOrThrow();
|
|
31
|
-
let presignedUrl;
|
|
32
|
-
try {
|
|
33
|
-
const resp = await apiClient.getChatSnapshotUrl(sessionId);
|
|
34
|
-
presignedUrl = resp.presignedUrl;
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
logger.warn("chat.agent: snapshot presign (read) failed; continuing without snapshot", {
|
|
38
|
-
error: error instanceof Error ? error.message : String(error),
|
|
39
|
-
sessionId,
|
|
40
|
-
});
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
let response;
|
|
44
|
-
try {
|
|
45
|
-
response = await fetch(presignedUrl, { method: "GET" });
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
logger.warn("chat.agent: snapshot fetch failed; continuing without snapshot", {
|
|
49
|
-
error: error instanceof Error ? error.message : String(error),
|
|
50
|
-
sessionId,
|
|
51
|
-
});
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
if (response.status === 404) {
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
if (!response.ok) {
|
|
58
|
-
logger.warn("chat.agent: snapshot fetch returned non-OK; continuing without snapshot", {
|
|
59
|
-
status: response.status,
|
|
60
|
-
sessionId,
|
|
61
|
-
});
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
let parsed;
|
|
65
|
-
try {
|
|
66
|
-
parsed = await response.json();
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
logger.warn("chat.agent: snapshot JSON parse failed; continuing without snapshot", {
|
|
70
|
-
error: error instanceof Error ? error.message : String(error),
|
|
71
|
-
sessionId,
|
|
72
|
-
});
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
const snapshot = parseTranscriptSnapshot(parsed);
|
|
76
|
-
if (!snapshot) {
|
|
77
|
-
logger.warn("chat.agent: snapshot version/shape mismatch; ignoring", {
|
|
78
|
-
version: parsed?.version,
|
|
79
|
-
sessionId,
|
|
80
|
-
});
|
|
81
|
-
return undefined;
|
|
82
|
-
}
|
|
83
|
-
return snapshot;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Persist the snapshot for a session. Awaited by callers immediately after
|
|
87
|
-
* `onTurnComplete`: the agent may suspend right after this point, and
|
|
88
|
-
* fire-and-forget promises don't reliably complete on suspend.
|
|
89
|
-
*
|
|
90
|
-
* Errors are swallowed via `logger.warn`. A failed write means the next
|
|
91
|
-
* boot replays slightly more of `session.out` (back to the previous
|
|
92
|
-
* snapshot's cursor) instead of failing.
|
|
93
|
-
* @internal
|
|
94
|
-
*/
|
|
95
|
-
export async function writeChatSnapshot(sessionId, snapshot) {
|
|
96
|
-
if (writeChatSnapshotImpl) {
|
|
97
|
-
await writeChatSnapshotImpl(sessionId, snapshot);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
const apiClient = apiClientManager.clientOrThrow();
|
|
101
|
-
let presignedUrl;
|
|
102
|
-
try {
|
|
103
|
-
const resp = await apiClient.createChatSnapshotUploadUrl(sessionId);
|
|
104
|
-
presignedUrl = resp.presignedUrl;
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
logger.warn("chat.agent: snapshot presign (write) failed; next run will replay further", {
|
|
108
|
-
error: error instanceof Error ? error.message : String(error),
|
|
109
|
-
sessionId,
|
|
110
|
-
});
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
let response;
|
|
114
|
-
try {
|
|
115
|
-
response = await fetch(presignedUrl, {
|
|
116
|
-
method: "PUT",
|
|
117
|
-
headers: { "content-type": "application/json" },
|
|
118
|
-
body: JSON.stringify(snapshot),
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
logger.warn("chat.agent: snapshot upload failed; next run will replay further", {
|
|
123
|
-
error: error instanceof Error ? error.message : String(error),
|
|
124
|
-
sessionId,
|
|
125
|
-
});
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
if (!response.ok) {
|
|
129
|
-
logger.warn("chat.agent: snapshot upload returned non-OK; next run will replay further", {
|
|
130
|
-
status: response.status,
|
|
131
|
-
sessionId,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Test-only entry point that bypasses `__setReadChatSnapshotImplForTests`
|
|
137
|
-
* and reaches the real presign + `fetch` + parse path, so tests can drive
|
|
138
|
-
* the production code by mocking global `fetch` and the api client.
|
|
139
|
-
* @internal
|
|
140
|
-
*/
|
|
141
|
-
export async function __readChatSnapshotProductionPathForTests(sessionId) {
|
|
142
|
-
const saved = readChatSnapshotImpl;
|
|
143
|
-
readChatSnapshotImpl = undefined;
|
|
144
|
-
try {
|
|
145
|
-
return await readChatSnapshot(sessionId);
|
|
146
|
-
}
|
|
147
|
-
finally {
|
|
148
|
-
readChatSnapshotImpl = saved;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Test-only entry point that bypasses `__setWriteChatSnapshotImplForTests`
|
|
153
|
-
* and reaches the real presign + `fetch` PUT path.
|
|
154
|
-
* @internal
|
|
155
|
-
*/
|
|
156
|
-
export async function __writeChatSnapshotProductionPathForTests(sessionId, snapshot) {
|
|
157
|
-
const saved = writeChatSnapshotImpl;
|
|
158
|
-
writeChatSnapshotImpl = undefined;
|
|
159
|
-
try {
|
|
160
|
-
await writeChatSnapshot(sessionId, snapshot);
|
|
161
|
-
}
|
|
162
|
-
finally {
|
|
163
|
-
writeChatSnapshotImpl = saved;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=chatSnapshotIo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chatSnapshotIo.js","sourceRoot":"","sources":["../../../src/v3/chatSnapshotIo.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export type ChatVersionSkewPolicy = "follow" | "hold";
|
|
2
|
-
export type SessionVersionPin = {
|
|
3
|
-
externalDeploymentId?: string | null;
|
|
4
|
-
lockToVersion?: string;
|
|
5
|
-
};
|
|
6
|
-
export type ResolvePinToFollowOptions = {
|
|
7
|
-
policy: ChatVersionSkewPolicy | undefined;
|
|
8
|
-
deployedExternalId: string | undefined;
|
|
9
|
-
upgradeAlreadyRequested: boolean;
|
|
10
|
-
readPin: () => Promise<SessionVersionPin | undefined>;
|
|
11
|
-
};
|
|
12
|
-
export declare function resolvePinToFollow(options: ResolvePinToFollowOptions): Promise<string | undefined>;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { tryCatch } from "@trigger.dev/core/v3";
|
|
2
|
-
export async function resolvePinToFollow(options) {
|
|
3
|
-
if (options.policy === "hold") {
|
|
4
|
-
return undefined;
|
|
5
|
-
}
|
|
6
|
-
if (options.upgradeAlreadyRequested) {
|
|
7
|
-
return undefined;
|
|
8
|
-
}
|
|
9
|
-
if (!options.deployedExternalId) {
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
const [error, pin] = await tryCatch(options.readPin());
|
|
13
|
-
if (error || !pin) {
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
if (!pin.externalDeploymentId) {
|
|
17
|
-
return undefined;
|
|
18
|
-
}
|
|
19
|
-
if (pin.lockToVersion) {
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
if (pin.externalDeploymentId === options.deployedExternalId) {
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
return pin.externalDeploymentId;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=chatVersionSkew.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chatVersionSkew.js","sourceRoot":"","sources":["../../../src/v3/chatVersionSkew.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAgBhD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEvD,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,GAAG,CAAC,oBAAoB,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,CAAC,oBAAoB,CAAC;AAClC,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { type SessionTriggerConfig } from "@trigger.dev/core/v3";
|
|
2
|
-
/** Reads an env var unless the scope opted out of ambient context (`inheritContext: false`). */
|
|
3
|
-
export declare function scopedEnvVar(name: string): string | undefined;
|
|
4
|
-
/**
|
|
5
|
-
* Precedence: an explicit value, the client config, `TRIGGER_EXTERNAL_DEPLOYMENT_ID`, then
|
|
6
|
-
* platform/CI commit vars when automatic skew protection is on. `null` is an explicit opt-out.
|
|
7
|
-
*/
|
|
8
|
-
export declare function resolveTriggerExternalDeploymentId(explicit?: string | null): string | undefined;
|
|
9
|
-
/** A session trigger config as callers write it: the pin is optional, and `null` opts out. */
|
|
10
|
-
type TriggerConfigInput = Omit<SessionTriggerConfig, "externalDeploymentId"> & {
|
|
11
|
-
externalDeploymentId?: string | null;
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Fill in `triggerConfig.externalDeploymentId` on an outgoing session-create body, at each point
|
|
15
|
-
* one leaves the SDK. Discovery has to happen here rather than server-side: the commit SHA lives
|
|
16
|
-
* in the calling application's runtime, so the caller's build is what selects the agent version.
|
|
17
|
-
*/
|
|
18
|
-
export declare function withResolvedExternalDeploymentId<TBody extends {
|
|
19
|
-
triggerConfig: TriggerConfigInput;
|
|
20
|
-
}>(body: TBody): TBody & {
|
|
21
|
-
triggerConfig: SessionTriggerConfig;
|
|
22
|
-
};
|
|
23
|
-
export {};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { apiClientManager, getEnvVar, resolveExternalDeploymentId, sdkScope, } from "@trigger.dev/core/v3";
|
|
2
|
-
/** Reads an env var unless the scope opted out of ambient context (`inheritContext: false`). */
|
|
3
|
-
export function scopedEnvVar(name) {
|
|
4
|
-
const scope = sdkScope.getStore();
|
|
5
|
-
if (scope && !scope.inheritContext)
|
|
6
|
-
return undefined;
|
|
7
|
-
return getEnvVar(name);
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Precedence: an explicit value, the client config, `TRIGGER_EXTERNAL_DEPLOYMENT_ID`, then
|
|
11
|
-
* platform/CI commit vars when automatic skew protection is on. `null` is an explicit opt-out.
|
|
12
|
-
*/
|
|
13
|
-
export function resolveTriggerExternalDeploymentId(explicit) {
|
|
14
|
-
if (explicit === null)
|
|
15
|
-
return undefined;
|
|
16
|
-
return resolveExternalDeploymentId({
|
|
17
|
-
explicit,
|
|
18
|
-
clientConfig: apiClientManager.externalDeploymentId,
|
|
19
|
-
read: scopedEnvVar,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Fill in `triggerConfig.externalDeploymentId` on an outgoing session-create body, at each point
|
|
24
|
-
* one leaves the SDK. Discovery has to happen here rather than server-side: the commit SHA lives
|
|
25
|
-
* in the calling application's runtime, so the caller's build is what selects the agent version.
|
|
26
|
-
*/
|
|
27
|
-
export function withResolvedExternalDeploymentId(body) {
|
|
28
|
-
const resolved = resolveTriggerExternalDeploymentId(body.triggerConfig.externalDeploymentId);
|
|
29
|
-
const { externalDeploymentId: _omit, ...rest } = body.triggerConfig;
|
|
30
|
-
return {
|
|
31
|
-
...body,
|
|
32
|
-
triggerConfig: {
|
|
33
|
-
...rest,
|
|
34
|
-
...(resolved ? { externalDeploymentId: resolved } : {}),
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=externalDeploymentId.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"externalDeploymentId.js","sourceRoot":"","sources":["../../../src/v3/externalDeploymentId.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,2BAA2B,EAC3B,QAAQ,GAET,MAAM,sBAAsB,CAAC;AAE9B,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAClC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IACrD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAAC,QAAwB;IACzE,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAExC,OAAO,2BAA2B,CAAC;QACjC,QAAQ;QACR,YAAY,EAAE,gBAAgB,CAAC,oBAAoB;QACnD,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;AACL,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAE9C,IAAW;IACX,MAAM,QAAQ,GAAG,kCAAkC,CAAC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC7F,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;IAEpE,OAAO;QACL,GAAG,IAAI;QACP,aAAa,EAAE;YACb,GAAG,IAAI;YACP,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { type TranscriptStorage } from "../transcriptStorage.js";
|
|
2
|
-
type TestApi = {
|
|
3
|
-
describe: (name: string, fn: () => void) => void;
|
|
4
|
-
it: (name: string, fn: () => Promise<void> | void) => void;
|
|
5
|
-
expect: (actual: unknown) => {
|
|
6
|
-
toEqual: (expected: unknown) => void;
|
|
7
|
-
toBeNull: () => void;
|
|
8
|
-
toBeUndefined: () => void;
|
|
9
|
-
toBe: (expected: unknown) => void;
|
|
10
|
-
toHaveLength: (length: number) => void;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
export type TranscriptStorageTestOptions = {
|
|
14
|
-
/**
|
|
15
|
-
* The test framework's `describe`, `it` and `expect`. Defaults to the
|
|
16
|
-
* globals a vitest or jest run with `globals: true` provides.
|
|
17
|
-
*/
|
|
18
|
-
api?: TestApi;
|
|
19
|
-
/**
|
|
20
|
-
* A chat id the storage accepts. Each test appends a suffix so tests do
|
|
21
|
-
* not see each other's rows. Defaults to `"transcript-conformance"`.
|
|
22
|
-
*/
|
|
23
|
-
chatId?: string;
|
|
24
|
-
/** The `clientData` the storage expects in every scope and context. */
|
|
25
|
-
clientData?: unknown;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* The contract every `TranscriptStorage` has to meet, as a test suite. Point
|
|
29
|
-
* it at a factory for your storage and run it under vitest or jest:
|
|
30
|
-
*
|
|
31
|
-
* ```ts
|
|
32
|
-
* import { runTranscriptStorageTests } from "@trigger.dev/sdk/ai/test";
|
|
33
|
-
* runTranscriptStorageTests(() => myTranscriptStorage(testDatabaseUrl));
|
|
34
|
-
* ```
|
|
35
|
-
*
|
|
36
|
-
* The factory runs once per test. Return a fresh, empty storage, or one
|
|
37
|
-
* whose chats are isolated by the `chatId` option.
|
|
38
|
-
*/
|
|
39
|
-
export declare function runTranscriptStorageTests<TClientData = unknown>(makeStorage: () => TranscriptStorage<TClientData> | Promise<TranscriptStorage<TClientData>>, options?: TranscriptStorageTestOptions): void;
|
|
40
|
-
export {};
|
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
import { emptyTranscriptState, reduceTranscriptChanges, } from "../transcriptStorage.js";
|
|
2
|
-
function message(id, text, role = "user") {
|
|
3
|
-
return { id, role, parts: [{ type: "text", text }] };
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* The contract every `TranscriptStorage` has to meet, as a test suite. Point
|
|
7
|
-
* it at a factory for your storage and run it under vitest or jest:
|
|
8
|
-
*
|
|
9
|
-
* ```ts
|
|
10
|
-
* import { runTranscriptStorageTests } from "@trigger.dev/sdk/ai/test";
|
|
11
|
-
* runTranscriptStorageTests(() => myTranscriptStorage(testDatabaseUrl));
|
|
12
|
-
* ```
|
|
13
|
-
*
|
|
14
|
-
* The factory runs once per test. Return a fresh, empty storage, or one
|
|
15
|
-
* whose chats are isolated by the `chatId` option.
|
|
16
|
-
*/
|
|
17
|
-
export function runTranscriptStorageTests(makeStorage, options = {}) {
|
|
18
|
-
const globals = globalThis;
|
|
19
|
-
const api = options.api ?? {
|
|
20
|
-
describe: globals.describe,
|
|
21
|
-
it: globals.it,
|
|
22
|
-
expect: globals.expect,
|
|
23
|
-
};
|
|
24
|
-
if (!api.describe || !api.it || !api.expect) {
|
|
25
|
-
throw new Error("runTranscriptStorageTests: no test API found. Enable `globals: true` in your test " +
|
|
26
|
-
"config or pass `{ api: { describe, it, expect } }`.");
|
|
27
|
-
}
|
|
28
|
-
const { describe, it, expect } = api;
|
|
29
|
-
const baseChatId = options.chatId ?? "transcript-conformance";
|
|
30
|
-
const clientData = options.clientData;
|
|
31
|
-
const ctx = (chatId, turn = 0) => ({
|
|
32
|
-
chatId,
|
|
33
|
-
clientData,
|
|
34
|
-
turn,
|
|
35
|
-
trigger: "submit-message",
|
|
36
|
-
runId: "run_conformance",
|
|
37
|
-
ctx: {},
|
|
38
|
-
});
|
|
39
|
-
const scope = (chatId) => ({ chatId, clientData });
|
|
40
|
-
const ids = (messages) => messages.map((m) => m.id);
|
|
41
|
-
const expected = new WeakMap();
|
|
42
|
-
const save = async (storage, context, changeset) => {
|
|
43
|
-
let perChat = expected.get(storage);
|
|
44
|
-
if (!perChat) {
|
|
45
|
-
perChat = new Map();
|
|
46
|
-
expected.set(storage, perChat);
|
|
47
|
-
}
|
|
48
|
-
const transcript = reduceTranscriptChanges(perChat.get(context.chatId) ?? emptyTranscriptState(), changeset.changes);
|
|
49
|
-
perChat.set(context.chatId, transcript);
|
|
50
|
-
await storage.save(context, { ...changeset, transcript });
|
|
51
|
-
};
|
|
52
|
-
describe("TranscriptStorage conformance", () => {
|
|
53
|
-
it("loads an unknown chat as an empty transcript", async () => {
|
|
54
|
-
const storage = await makeStorage();
|
|
55
|
-
const loaded = await storage.load(scope(`${baseChatId}-empty`));
|
|
56
|
-
expect(loaded.messages).toEqual([]);
|
|
57
|
-
expect(loaded.state).toBeNull();
|
|
58
|
-
expect(loaded.nextCursor).toBeUndefined();
|
|
59
|
-
});
|
|
60
|
-
it("appends puts in changeset order and replaces a known id in place", async () => {
|
|
61
|
-
const storage = await makeStorage();
|
|
62
|
-
const chatId = `${baseChatId}-put`;
|
|
63
|
-
await save(storage, ctx(chatId), {
|
|
64
|
-
reason: "turn-complete",
|
|
65
|
-
changes: [
|
|
66
|
-
{ op: "put", message: message("u1", "one") },
|
|
67
|
-
{ op: "put", message: message("a1", "two", "assistant") },
|
|
68
|
-
{ op: "put", message: message("u2", "three") },
|
|
69
|
-
],
|
|
70
|
-
});
|
|
71
|
-
await save(storage, ctx(chatId, 1), {
|
|
72
|
-
reason: "turn-complete",
|
|
73
|
-
changes: [{ op: "put", message: message("a1", "two, edited", "assistant") }],
|
|
74
|
-
});
|
|
75
|
-
const loaded = await storage.load(scope(chatId));
|
|
76
|
-
expect(ids(loaded.messages)).toEqual(["u1", "a1", "u2"]);
|
|
77
|
-
expect(loaded.messages[1]).toEqual(message("a1", "two, edited", "assistant"));
|
|
78
|
-
});
|
|
79
|
-
it("removes by id and ignores an unknown id", async () => {
|
|
80
|
-
const storage = await makeStorage();
|
|
81
|
-
const chatId = `${baseChatId}-remove`;
|
|
82
|
-
await save(storage, ctx(chatId), {
|
|
83
|
-
reason: "turn-complete",
|
|
84
|
-
changes: [
|
|
85
|
-
{ op: "put", message: message("u1", "one") },
|
|
86
|
-
{ op: "put", message: message("a1", "two", "assistant") },
|
|
87
|
-
{ op: "put", message: message("u2", "three") },
|
|
88
|
-
],
|
|
89
|
-
});
|
|
90
|
-
await save(storage, ctx(chatId, 1), {
|
|
91
|
-
reason: "action",
|
|
92
|
-
changes: [
|
|
93
|
-
{ op: "remove", id: "a1" },
|
|
94
|
-
{ op: "remove", id: "never-existed" },
|
|
95
|
-
],
|
|
96
|
-
});
|
|
97
|
-
expect(ids((await storage.load(scope(chatId))).messages)).toEqual(["u1", "u2"]);
|
|
98
|
-
});
|
|
99
|
-
it("truncates after an id and ignores an unknown id", async () => {
|
|
100
|
-
const storage = await makeStorage();
|
|
101
|
-
const chatId = `${baseChatId}-truncate`;
|
|
102
|
-
await save(storage, ctx(chatId), {
|
|
103
|
-
reason: "turn-complete",
|
|
104
|
-
changes: ["u1", "a1", "u2", "a2"].map((id) => ({
|
|
105
|
-
op: "put",
|
|
106
|
-
message: message(id, id),
|
|
107
|
-
})),
|
|
108
|
-
});
|
|
109
|
-
await save(storage, ctx(chatId, 1), {
|
|
110
|
-
reason: "action",
|
|
111
|
-
changes: [{ op: "truncateAfter", afterId: "never-existed" }],
|
|
112
|
-
});
|
|
113
|
-
expect((await storage.load(scope(chatId))).messages).toHaveLength(4);
|
|
114
|
-
await save(storage, ctx(chatId, 1), {
|
|
115
|
-
reason: "action",
|
|
116
|
-
changes: [{ op: "truncateAfter", afterId: "a1" }],
|
|
117
|
-
});
|
|
118
|
-
expect(ids((await storage.load(scope(chatId))).messages)).toEqual(["u1", "a1"]);
|
|
119
|
-
});
|
|
120
|
-
it("appends after a truncate at the end of the transcript", async () => {
|
|
121
|
-
const storage = await makeStorage();
|
|
122
|
-
const chatId = `${baseChatId}-truncate-append`;
|
|
123
|
-
await save(storage, ctx(chatId), {
|
|
124
|
-
reason: "turn-complete",
|
|
125
|
-
changes: ["u1", "a1", "u2", "a2"].map((id) => ({
|
|
126
|
-
op: "put",
|
|
127
|
-
message: message(id, id),
|
|
128
|
-
})),
|
|
129
|
-
});
|
|
130
|
-
await save(storage, ctx(chatId, 1), {
|
|
131
|
-
reason: "action",
|
|
132
|
-
changes: [
|
|
133
|
-
{ op: "truncateAfter", afterId: "u2" },
|
|
134
|
-
{ op: "put", message: message("a2b", "regenerated", "assistant") },
|
|
135
|
-
],
|
|
136
|
-
});
|
|
137
|
-
expect(ids((await storage.load(scope(chatId))).messages)).toEqual(["u1", "a1", "u2", "a2b"]);
|
|
138
|
-
});
|
|
139
|
-
it("round-trips state and clears it with null", async () => {
|
|
140
|
-
const storage = await makeStorage();
|
|
141
|
-
const chatId = `${baseChatId}-state`;
|
|
142
|
-
await save(storage, ctx(chatId), {
|
|
143
|
-
reason: "turn-complete",
|
|
144
|
-
changes: [
|
|
145
|
-
{ op: "put", message: message("u1", "one") },
|
|
146
|
-
{ op: "state", value: { v: 1, summary: "so far" } },
|
|
147
|
-
],
|
|
148
|
-
});
|
|
149
|
-
expect((await storage.load(scope(chatId))).state).toEqual({ v: 1, summary: "so far" });
|
|
150
|
-
await save(storage, ctx(chatId, 1), {
|
|
151
|
-
reason: "turn-complete",
|
|
152
|
-
changes: [{ op: "put", message: message("u2", "two") }],
|
|
153
|
-
});
|
|
154
|
-
expect((await storage.load(scope(chatId))).state).toEqual({ v: 1, summary: "so far" });
|
|
155
|
-
await save(storage, ctx(chatId, 2), {
|
|
156
|
-
reason: "action",
|
|
157
|
-
changes: [{ op: "state", value: null }],
|
|
158
|
-
});
|
|
159
|
-
expect((await storage.load(scope(chatId))).state).toBeNull();
|
|
160
|
-
});
|
|
161
|
-
it("keeps the latest cursors it was given", async () => {
|
|
162
|
-
const storage = await makeStorage();
|
|
163
|
-
const chatId = `${baseChatId}-cursors`;
|
|
164
|
-
await save(storage, ctx(chatId), {
|
|
165
|
-
reason: "turn-complete",
|
|
166
|
-
changes: [{ op: "put", message: message("u1", "one") }],
|
|
167
|
-
cursors: { lastOutEventId: "10", lastInEventId: "2" },
|
|
168
|
-
});
|
|
169
|
-
await save(storage, ctx(chatId, 1), {
|
|
170
|
-
reason: "turn-complete",
|
|
171
|
-
changes: [{ op: "put", message: message("u2", "two") }],
|
|
172
|
-
cursors: { lastOutEventId: "20", lastInEventId: "4" },
|
|
173
|
-
});
|
|
174
|
-
const loaded = await storage.load(scope(chatId));
|
|
175
|
-
expect(loaded.cursors?.lastOutEventId).toBe("20");
|
|
176
|
-
expect(loaded.cursors?.lastInEventId).toBe("4");
|
|
177
|
-
});
|
|
178
|
-
it("keeps a partial answer's non-final status when the storage reports it", async () => {
|
|
179
|
-
const storage = await makeStorage();
|
|
180
|
-
const chatId = `${baseChatId}-final`;
|
|
181
|
-
await save(storage, ctx(chatId), {
|
|
182
|
-
reason: "turn-error",
|
|
183
|
-
changes: [
|
|
184
|
-
{ op: "put", message: message("u1", "one") },
|
|
185
|
-
{ op: "put", message: message("a1", "partial", "assistant"), final: false },
|
|
186
|
-
],
|
|
187
|
-
});
|
|
188
|
-
const partial = await storage.load(scope(chatId));
|
|
189
|
-
if (partial.nonFinalIds !== undefined) {
|
|
190
|
-
expect(partial.nonFinalIds).toEqual(["a1"]);
|
|
191
|
-
}
|
|
192
|
-
await save(storage, ctx(chatId, 1), {
|
|
193
|
-
reason: "turn-complete",
|
|
194
|
-
changes: [{ op: "put", message: message("a1", "the finished answer", "assistant") }],
|
|
195
|
-
});
|
|
196
|
-
const finalized = await storage.load(scope(chatId));
|
|
197
|
-
expect(ids(finalized.messages)).toEqual(["u1", "a1"]);
|
|
198
|
-
if (finalized.nonFinalIds !== undefined) {
|
|
199
|
-
expect(finalized.nonFinalIds).toEqual([]);
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
it("converges when the same changeset is saved twice", async () => {
|
|
203
|
-
const storage = await makeStorage();
|
|
204
|
-
const chatId = `${baseChatId}-replay`;
|
|
205
|
-
const changeset = {
|
|
206
|
-
reason: "turn-complete",
|
|
207
|
-
changes: [
|
|
208
|
-
{ op: "put", message: message("u1", "one") },
|
|
209
|
-
{ op: "put", message: message("a1", "two", "assistant") },
|
|
210
|
-
{ op: "state", value: { v: 1 } },
|
|
211
|
-
],
|
|
212
|
-
cursors: { lastOutEventId: "7" },
|
|
213
|
-
};
|
|
214
|
-
await save(storage, ctx(chatId), changeset);
|
|
215
|
-
await save(storage, ctx(chatId), changeset);
|
|
216
|
-
const loaded = await storage.load(scope(chatId));
|
|
217
|
-
expect(ids(loaded.messages)).toEqual(["u1", "a1"]);
|
|
218
|
-
expect(loaded.state).toEqual({ v: 1 });
|
|
219
|
-
});
|
|
220
|
-
it("pages from the most recent message backwards with limit and before", async () => {
|
|
221
|
-
const storage = await makeStorage();
|
|
222
|
-
const chatId = `${baseChatId}-paging`;
|
|
223
|
-
await save(storage, ctx(chatId), {
|
|
224
|
-
reason: "turn-complete",
|
|
225
|
-
changes: ["m1", "m2", "m3", "m4", "m5"].map((id) => ({
|
|
226
|
-
op: "put",
|
|
227
|
-
message: message(id, id),
|
|
228
|
-
})),
|
|
229
|
-
});
|
|
230
|
-
const last = await storage.load(scope(chatId), { limit: 2 });
|
|
231
|
-
expect(ids(last.messages)).toEqual(["m4", "m5"]);
|
|
232
|
-
expect(last.nextCursor).toBe("m4");
|
|
233
|
-
const middle = await storage.load(scope(chatId), { limit: 2, before: last.nextCursor });
|
|
234
|
-
expect(ids(middle.messages)).toEqual(["m2", "m3"]);
|
|
235
|
-
expect(middle.nextCursor).toBe("m2");
|
|
236
|
-
const first = await storage.load(scope(chatId), { limit: 2, before: middle.nextCursor });
|
|
237
|
-
expect(ids(first.messages)).toEqual(["m1"]);
|
|
238
|
-
expect(first.nextCursor).toBeUndefined();
|
|
239
|
-
});
|
|
240
|
-
it("keeps chats apart", async () => {
|
|
241
|
-
const storage = await makeStorage();
|
|
242
|
-
await save(storage, ctx(`${baseChatId}-a`), {
|
|
243
|
-
reason: "turn-complete",
|
|
244
|
-
changes: [{ op: "put", message: message("u1", "in a") }],
|
|
245
|
-
});
|
|
246
|
-
await save(storage, ctx(`${baseChatId}-b`), {
|
|
247
|
-
reason: "turn-complete",
|
|
248
|
-
changes: [{ op: "put", message: message("u1", "in b") }],
|
|
249
|
-
});
|
|
250
|
-
expect((await storage.load(scope(`${baseChatId}-a`))).messages[0]).toEqual(message("u1", "in a"));
|
|
251
|
-
expect((await storage.load(scope(`${baseChatId}-b`))).messages[0]).toEqual(message("u1", "in b"));
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
//# sourceMappingURL=transcript-storage-tests.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-storage-tests.js","sourceRoot":"","sources":["../../../../src/v3/test/transcript-storage-tests.ts"],"names":[],"mappings":"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"}
|