@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.
Files changed (142) hide show
  1. package/dist/commonjs/imports/ai-runtime-cjs.cjs.map +1 -1
  2. package/dist/commonjs/imports/ai-runtime.js +0 -2
  3. package/dist/commonjs/v3/ai-shared.d.ts +0 -15
  4. package/dist/commonjs/v3/ai-shared.js +1 -35
  5. package/dist/commonjs/v3/ai-shared.js.map +1 -1
  6. package/dist/commonjs/v3/ai.d.ts +25 -275
  7. package/dist/commonjs/v3/ai.js +308 -1283
  8. package/dist/commonjs/v3/ai.js.map +1 -1
  9. package/dist/commonjs/v3/chat-client.d.ts +2 -11
  10. package/dist/commonjs/v3/chat-client.js +111 -227
  11. package/dist/commonjs/v3/chat-client.js.map +1 -1
  12. package/dist/commonjs/v3/chat-react.d.ts +0 -88
  13. package/dist/commonjs/v3/chat-react.js +1 -130
  14. package/dist/commonjs/v3/chat-react.js.map +1 -1
  15. package/dist/commonjs/v3/chat-server.d.ts +6 -42
  16. package/dist/commonjs/v3/chat-server.js +7 -52
  17. package/dist/commonjs/v3/chat-server.js.map +1 -1
  18. package/dist/commonjs/v3/chat.d.ts +10 -92
  19. package/dist/commonjs/v3/chat.js +73 -328
  20. package/dist/commonjs/v3/chat.js.map +1 -1
  21. package/dist/commonjs/v3/sessions.d.ts +2 -15
  22. package/dist/commonjs/v3/sessions.js +1 -12
  23. package/dist/commonjs/v3/sessions.js.map +1 -1
  24. package/dist/commonjs/v3/shared.js +36 -30
  25. package/dist/commonjs/v3/shared.js.map +1 -1
  26. package/dist/commonjs/v3/test/index.d.ts +0 -1
  27. package/dist/commonjs/v3/test/index.js +1 -3
  28. package/dist/commonjs/v3/test/index.js.map +1 -1
  29. package/dist/commonjs/v3/test/mock-chat-agent.d.ts +4 -47
  30. package/dist/commonjs/v3/test/mock-chat-agent.js +4 -115
  31. package/dist/commonjs/v3/test/mock-chat-agent.js.map +1 -1
  32. package/dist/commonjs/v3/test/test-session-handle.js +0 -6
  33. package/dist/commonjs/v3/test/test-session-handle.js.map +1 -1
  34. package/dist/commonjs/version.js +1 -1
  35. package/dist/esm/imports/ai-runtime.d.ts +2 -2
  36. package/dist/esm/imports/ai-runtime.js +2 -2
  37. package/dist/esm/imports/ai-runtime.js.map +1 -1
  38. package/dist/esm/v3/ai-shared.d.ts +0 -15
  39. package/dist/esm/v3/ai-shared.js +0 -33
  40. package/dist/esm/v3/ai-shared.js.map +1 -1
  41. package/dist/esm/v3/ai.d.ts +25 -275
  42. package/dist/esm/v3/ai.js +305 -1275
  43. package/dist/esm/v3/ai.js.map +1 -1
  44. package/dist/esm/v3/chat-client.d.ts +2 -11
  45. package/dist/esm/v3/chat-client.js +112 -228
  46. package/dist/esm/v3/chat-client.js.map +1 -1
  47. package/dist/esm/v3/chat-react.d.ts +0 -88
  48. package/dist/esm/v3/chat-react.js +1 -127
  49. package/dist/esm/v3/chat-react.js.map +1 -1
  50. package/dist/esm/v3/chat-server.d.ts +6 -42
  51. package/dist/esm/v3/chat-server.js +8 -53
  52. package/dist/esm/v3/chat-server.js.map +1 -1
  53. package/dist/esm/v3/chat.d.ts +10 -92
  54. package/dist/esm/v3/chat.js +74 -329
  55. package/dist/esm/v3/chat.js.map +1 -1
  56. package/dist/esm/v3/sessions.d.ts +2 -15
  57. package/dist/esm/v3/sessions.js +1 -11
  58. package/dist/esm/v3/sessions.js.map +1 -1
  59. package/dist/esm/v3/shared.js +23 -17
  60. package/dist/esm/v3/shared.js.map +1 -1
  61. package/dist/esm/v3/test/index.d.ts +0 -1
  62. package/dist/esm/v3/test/index.js +0 -1
  63. package/dist/esm/v3/test/index.js.map +1 -1
  64. package/dist/esm/v3/test/mock-chat-agent.d.ts +4 -47
  65. package/dist/esm/v3/test/mock-chat-agent.js +6 -117
  66. package/dist/esm/v3/test/mock-chat-agent.js.map +1 -1
  67. package/dist/esm/v3/test/test-session-handle.js +0 -6
  68. package/dist/esm/v3/test/test-session-handle.js.map +1 -1
  69. package/dist/esm/version.js +1 -1
  70. package/docs/ai-chat/actions.mdx +23 -55
  71. package/docs/ai-chat/anatomy.mdx +3 -3
  72. package/docs/ai-chat/backend.mdx +48 -125
  73. package/docs/ai-chat/background-injection.mdx +19 -69
  74. package/docs/ai-chat/client-protocol.mdx +4 -5
  75. package/docs/ai-chat/compaction.mdx +7 -13
  76. package/docs/ai-chat/custom-agents.mdx +0 -23
  77. package/docs/ai-chat/fast-starts.mdx +20 -27
  78. package/docs/ai-chat/frontend.mdx +14 -19
  79. package/docs/ai-chat/lifecycle-hooks.mdx +2 -6
  80. package/docs/ai-chat/migrating-from-a-route-handler.mdx +14 -16
  81. package/docs/ai-chat/patterns/database-persistence.mdx +2 -6
  82. package/docs/ai-chat/patterns/persistence-and-replay.mdx +23 -34
  83. package/docs/ai-chat/patterns/skills.mdx +10 -7
  84. package/docs/ai-chat/patterns/version-upgrades.mdx +6 -79
  85. package/docs/ai-chat/pending-messages.mdx +3 -3
  86. package/docs/ai-chat/prompt-caching.mdx +25 -23
  87. package/docs/ai-chat/quick-start.mdx +11 -11
  88. package/docs/ai-chat/reference.mdx +9 -67
  89. package/docs/ai-chat/sessions.mdx +1 -6
  90. package/docs/ai-chat/testing.mdx +1 -2
  91. package/docs/ai-chat/tools.mdx +13 -18
  92. package/docs/ai-chat/upgrade-guide.mdx +2 -2
  93. package/docs/apikeys.mdx +45 -27
  94. package/docs/config/extensions/syncEnvVars.mdx +0 -6
  95. package/docs/deploy-environment-variables.mdx +2 -23
  96. package/docs/deployment/overview.mdx +8 -4
  97. package/docs/deployment/preview-branches.mdx +4 -4
  98. package/docs/deployment/version-skew-protection.mdx +0 -62
  99. package/docs/manual-setup.mdx +7 -7
  100. package/docs/mcp-tools.mdx +0 -9
  101. package/docs/quick-start.mdx +3 -3
  102. package/docs/realtime/auth.mdx +1 -1
  103. package/docs/self-hosting/security.mdx +0 -5
  104. package/docs/tasks/scheduled.mdx +0 -24
  105. package/docs/triggering.mdx +1 -1
  106. package/package.json +4 -4
  107. package/skills/trigger-authoring-chat-agent/SKILL.md +29 -41
  108. package/skills/trigger-chat-agent-advanced/SKILL.md +12 -31
  109. package/dist/commonjs/v3/chatSnapshotIo.d.ts +0 -2
  110. package/dist/commonjs/v3/chatSnapshotIo.js +0 -174
  111. package/dist/commonjs/v3/chatSnapshotIo.js.map +0 -1
  112. package/dist/commonjs/v3/chatVersionSkew.d.ts +0 -12
  113. package/dist/commonjs/v3/chatVersionSkew.js +0 -30
  114. package/dist/commonjs/v3/chatVersionSkew.js.map +0 -1
  115. package/dist/commonjs/v3/externalDeploymentId.d.ts +0 -23
  116. package/dist/commonjs/v3/externalDeploymentId.js +0 -43
  117. package/dist/commonjs/v3/externalDeploymentId.js.map +0 -1
  118. package/dist/commonjs/v3/test/transcript-storage-tests.d.ts +0 -40
  119. package/dist/commonjs/v3/test/transcript-storage-tests.js +0 -258
  120. package/dist/commonjs/v3/test/transcript-storage-tests.js.map +0 -1
  121. package/dist/commonjs/v3/transcriptStorage.d.ts +0 -229
  122. package/dist/commonjs/v3/transcriptStorage.js +0 -321
  123. package/dist/commonjs/v3/transcriptStorage.js.map +0 -1
  124. package/dist/esm/v3/chatSnapshotIo.d.ts +0 -2
  125. package/dist/esm/v3/chatSnapshotIo.js +0 -166
  126. package/dist/esm/v3/chatSnapshotIo.js.map +0 -1
  127. package/dist/esm/v3/chatVersionSkew.d.ts +0 -12
  128. package/dist/esm/v3/chatVersionSkew.js +0 -27
  129. package/dist/esm/v3/chatVersionSkew.js.map +0 -1
  130. package/dist/esm/v3/externalDeploymentId.d.ts +0 -23
  131. package/dist/esm/v3/externalDeploymentId.js +0 -38
  132. package/dist/esm/v3/externalDeploymentId.js.map +0 -1
  133. package/dist/esm/v3/test/transcript-storage-tests.d.ts +0 -40
  134. package/dist/esm/v3/test/transcript-storage-tests.js +0 -255
  135. package/dist/esm/v3/test/transcript-storage-tests.js.map +0 -1
  136. package/dist/esm/v3/transcriptStorage.d.ts +0 -229
  137. package/dist/esm/v3/transcriptStorage.js +0 -309
  138. package/dist/esm/v3/transcriptStorage.js.map +0 -1
  139. package/docs/ai-chat/patterns/native-compaction.mdx +0 -310
  140. package/docs/ai-chat/transcript-storage.mdx +0 -233
  141. package/docs/reports.mdx +0 -157
  142. 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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"}