@trigger.dev/sdk 4.5.0-rc.0 → 4.5.0-rc.2

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 (57) hide show
  1. package/dist/commonjs/v3/ai-shared.d.ts +70 -0
  2. package/dist/commonjs/v3/ai-shared.js +144 -0
  3. package/dist/commonjs/v3/ai-shared.js.map +1 -1
  4. package/dist/commonjs/v3/ai.d.ts +21 -5
  5. package/dist/commonjs/v3/ai.js +153 -17
  6. package/dist/commonjs/v3/ai.js.map +1 -1
  7. package/dist/commonjs/v3/auth.d.ts +1 -0
  8. package/dist/commonjs/v3/auth.js +1 -0
  9. package/dist/commonjs/v3/auth.js.map +1 -1
  10. package/dist/commonjs/v3/chat-client.js +8 -3
  11. package/dist/commonjs/v3/chat-client.js.map +1 -1
  12. package/dist/commonjs/v3/chat.js +10 -2
  13. package/dist/commonjs/v3/chat.js.map +1 -1
  14. package/dist/commonjs/v3/index.d.ts +1 -0
  15. package/dist/commonjs/v3/index.js +3 -1
  16. package/dist/commonjs/v3/index.js.map +1 -1
  17. package/dist/commonjs/v3/shared.js +13 -7
  18. package/dist/commonjs/v3/shared.js.map +1 -1
  19. package/dist/commonjs/v3/triggerClient.d.ts +45 -0
  20. package/dist/commonjs/v3/triggerClient.js +104 -0
  21. package/dist/commonjs/v3/triggerClient.js.map +1 -0
  22. package/dist/commonjs/v3/triggerClient.test.d.ts +1 -0
  23. package/dist/commonjs/v3/triggerClient.test.js +226 -0
  24. package/dist/commonjs/v3/triggerClient.test.js.map +1 -0
  25. package/dist/commonjs/v3/triggerClient.types.test.d.ts +1 -0
  26. package/dist/commonjs/v3/triggerClient.types.test.js +113 -0
  27. package/dist/commonjs/v3/triggerClient.types.test.js.map +1 -0
  28. package/dist/commonjs/version.js +1 -1
  29. package/dist/esm/v3/ai-shared.d.ts +70 -0
  30. package/dist/esm/v3/ai-shared.js +142 -0
  31. package/dist/esm/v3/ai-shared.js.map +1 -1
  32. package/dist/esm/v3/ai.d.ts +21 -5
  33. package/dist/esm/v3/ai.js +152 -17
  34. package/dist/esm/v3/ai.js.map +1 -1
  35. package/dist/esm/v3/auth.d.ts +1 -0
  36. package/dist/esm/v3/auth.js +1 -0
  37. package/dist/esm/v3/auth.js.map +1 -1
  38. package/dist/esm/v3/chat-client.js +8 -3
  39. package/dist/esm/v3/chat-client.js.map +1 -1
  40. package/dist/esm/v3/chat.js +10 -2
  41. package/dist/esm/v3/chat.js.map +1 -1
  42. package/dist/esm/v3/index.d.ts +1 -0
  43. package/dist/esm/v3/index.js +1 -0
  44. package/dist/esm/v3/index.js.map +1 -1
  45. package/dist/esm/v3/shared.js +14 -8
  46. package/dist/esm/v3/shared.js.map +1 -1
  47. package/dist/esm/v3/triggerClient.d.ts +45 -0
  48. package/dist/esm/v3/triggerClient.js +77 -0
  49. package/dist/esm/v3/triggerClient.js.map +1 -0
  50. package/dist/esm/v3/triggerClient.test.d.ts +1 -0
  51. package/dist/esm/v3/triggerClient.test.js +224 -0
  52. package/dist/esm/v3/triggerClient.test.js.map +1 -0
  53. package/dist/esm/v3/triggerClient.types.test.d.ts +1 -0
  54. package/dist/esm/v3/triggerClient.types.test.js +88 -0
  55. package/dist/esm/v3/triggerClient.types.test.js.map +1 -0
  56. package/dist/esm/version.js +1 -1
  57. package/package.json +3 -2
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const v3_1 = require("@trigger.dev/core/v3");
5
+ const auth_js_1 = require("./auth.js");
6
+ const runs_js_1 = require("./runs.js");
7
+ const triggerClient_js_1 = require("./triggerClient.js");
8
+ function installFetchSpy() {
9
+ const captured = [];
10
+ const originalFetch = globalThis.fetch;
11
+ globalThis.fetch = (async (input, init) => {
12
+ const url = typeof input === "string" ? input : input?.url ?? String(input);
13
+ const headers = new Headers(init?.headers);
14
+ captured.push({
15
+ url,
16
+ authorization: headers.get("authorization") ?? undefined,
17
+ branch: headers.get("x-trigger-branch") ?? undefined,
18
+ });
19
+ // Return a fake successful response shaped like an empty run retrieval.
20
+ return new Response(JSON.stringify({}), {
21
+ status: 200,
22
+ headers: { "content-type": "application/json" },
23
+ });
24
+ });
25
+ return {
26
+ captured,
27
+ restore: () => {
28
+ globalThis.fetch = originalFetch;
29
+ },
30
+ };
31
+ }
32
+ (0, vitest_1.describe)("TriggerClient", () => {
33
+ let fetchSpy;
34
+ (0, vitest_1.beforeEach)(() => {
35
+ v3_1.apiClientManager.disable();
36
+ fetchSpy = installFetchSpy();
37
+ });
38
+ (0, vitest_1.afterEach)(() => {
39
+ fetchSpy.restore();
40
+ v3_1.apiClientManager.disable();
41
+ v3_1.taskContext.disable();
42
+ vitest_1.vi.unstubAllEnvs();
43
+ });
44
+ (0, vitest_1.it)("throws on first API call when no accessToken is configured anywhere", () => {
45
+ const client = new triggerClient_js_1.TriggerClient();
46
+ (0, vitest_1.expect)(() => client.runs.list({ limit: 1 })).toThrow(/TRIGGER_SECRET_KEY/);
47
+ });
48
+ (0, vitest_1.it)("falls back to env vars when constructor config is empty", async () => {
49
+ vitest_1.vi.stubEnv("TRIGGER_SECRET_KEY", "tr_dev_env_token");
50
+ vitest_1.vi.stubEnv("TRIGGER_PREVIEW_BRANCH", "env-branch");
51
+ const client = new triggerClient_js_1.TriggerClient();
52
+ await client.runs.retrieve("run_abc").catch(() => undefined);
53
+ (0, vitest_1.expect)(fetchSpy.captured).toHaveLength(1);
54
+ (0, vitest_1.expect)(fetchSpy.captured[0].authorization).toBe("Bearer tr_dev_env_token");
55
+ (0, vitest_1.expect)(fetchSpy.captured[0].branch).toBe("env-branch");
56
+ });
57
+ (0, vitest_1.it)("uses the instance accessToken and previewBranch on outgoing requests", async () => {
58
+ const client = new triggerClient_js_1.TriggerClient({
59
+ accessToken: "tr_preview_instance_token",
60
+ previewBranch: "signup-flow",
61
+ });
62
+ await client.runs.retrieve("run_abc").catch(() => undefined);
63
+ (0, vitest_1.expect)(fetchSpy.captured).toHaveLength(1);
64
+ const req = fetchSpy.captured[0];
65
+ (0, vitest_1.expect)(req.authorization).toBe("Bearer tr_preview_instance_token");
66
+ (0, vitest_1.expect)(req.branch).toBe("signup-flow");
67
+ });
68
+ (0, vitest_1.it)("fills missing fields from env, but explicit constructor values still win", async () => {
69
+ vitest_1.vi.stubEnv("TRIGGER_SECRET_KEY", "tr_env_token");
70
+ vitest_1.vi.stubEnv("TRIGGER_PREVIEW_BRANCH", "env-branch");
71
+ vitest_1.vi.stubEnv("TRIGGER_API_URL", "https://env.example.com");
72
+ const explicit = new triggerClient_js_1.TriggerClient({
73
+ accessToken: "tr_explicit",
74
+ previewBranch: "explicit-branch",
75
+ });
76
+ const fromEnv = new triggerClient_js_1.TriggerClient();
77
+ await Promise.all([
78
+ explicit.runs.retrieve("run_a").catch(() => undefined),
79
+ fromEnv.runs.retrieve("run_b").catch(() => undefined),
80
+ ]);
81
+ const byRun = Object.fromEntries(fetchSpy.captured.map((r) => [r.url.split("/runs/")[1]?.split(/[/?]/)[0], r]));
82
+ (0, vitest_1.expect)(byRun["run_a"].authorization).toBe("Bearer tr_explicit");
83
+ (0, vitest_1.expect)(byRun["run_a"].branch).toBe("explicit-branch");
84
+ (0, vitest_1.expect)(byRun["run_b"].authorization).toBe("Bearer tr_env_token");
85
+ (0, vitest_1.expect)(byRun["run_b"].branch).toBe("env-branch");
86
+ (0, vitest_1.expect)(byRun["run_a"].url.startsWith("https://env.example.com/")).toBe(true);
87
+ });
88
+ (0, vitest_1.it)("does not leak instance config to the global apiClientManager", async () => {
89
+ (0, auth_js_1.configure)({ accessToken: "tr_dev_global_token" });
90
+ const client = new triggerClient_js_1.TriggerClient({
91
+ accessToken: "tr_preview_instance_token",
92
+ previewBranch: "signup-flow",
93
+ });
94
+ await client.runs.retrieve("run_instance").catch(() => undefined);
95
+ await runs_js_1.runs.retrieve("run_global").catch(() => undefined);
96
+ (0, vitest_1.expect)(fetchSpy.captured).toHaveLength(2);
97
+ (0, vitest_1.expect)(fetchSpy.captured[0].authorization).toBe("Bearer tr_preview_instance_token");
98
+ (0, vitest_1.expect)(fetchSpy.captured[0].branch).toBe("signup-flow");
99
+ (0, vitest_1.expect)(fetchSpy.captured[1].authorization).toBe("Bearer tr_dev_global_token");
100
+ (0, vitest_1.expect)(fetchSpy.captured[1].branch).toBeUndefined();
101
+ });
102
+ (0, vitest_1.it)("keeps two concurrent instances isolated from each other", async () => {
103
+ const prod = new triggerClient_js_1.TriggerClient({ accessToken: "tr_prod_key" });
104
+ const preview = new triggerClient_js_1.TriggerClient({
105
+ accessToken: "tr_preview_key",
106
+ previewBranch: "feature-x",
107
+ });
108
+ await Promise.all([
109
+ prod.runs.retrieve("run_a").catch(() => undefined),
110
+ preview.runs.retrieve("run_b").catch(() => undefined),
111
+ prod.runs.retrieve("run_c").catch(() => undefined),
112
+ preview.runs.retrieve("run_d").catch(() => undefined),
113
+ ]);
114
+ (0, vitest_1.expect)(fetchSpy.captured).toHaveLength(4);
115
+ const byPath = Object.fromEntries(fetchSpy.captured.map((r) => [r.url.split("/runs/")[1]?.split(/[/?]/)[0], r]));
116
+ (0, vitest_1.expect)(byPath["run_a"].authorization).toBe("Bearer tr_prod_key");
117
+ (0, vitest_1.expect)(byPath["run_a"].branch).toBeUndefined();
118
+ (0, vitest_1.expect)(byPath["run_c"].authorization).toBe("Bearer tr_prod_key");
119
+ (0, vitest_1.expect)(byPath["run_c"].branch).toBeUndefined();
120
+ (0, vitest_1.expect)(byPath["run_b"].authorization).toBe("Bearer tr_preview_key");
121
+ (0, vitest_1.expect)(byPath["run_b"].branch).toBe("feature-x");
122
+ (0, vitest_1.expect)(byPath["run_d"].authorization).toBe("Bearer tr_preview_key");
123
+ (0, vitest_1.expect)(byPath["run_d"].branch).toBe("feature-x");
124
+ });
125
+ (0, vitest_1.it)("masks taskContext.ctx inside an isolated scope (default)", () => {
126
+ const fakeCtx = {
127
+ run: { id: "run_parent", isTest: true },
128
+ project: { ref: "proj_xyz" },
129
+ environment: { slug: "preview" },
130
+ };
131
+ v3_1.taskContext.setGlobalTaskContext({ ctx: fakeCtx });
132
+ (0, vitest_1.expect)(v3_1.taskContext.ctx).toBe(fakeCtx);
133
+ const observed = v3_1.sdkScope.withScope({ apiClientConfig: { accessToken: "x" }, inheritContext: false }, () => v3_1.taskContext.ctx);
134
+ (0, vitest_1.expect)(observed).toBeUndefined();
135
+ });
136
+ (0, vitest_1.it)("exposes taskContext.ctx inside a scope when inheritContext is true", () => {
137
+ const fakeCtx = {
138
+ run: { id: "run_parent", isTest: true },
139
+ project: { ref: "proj_xyz" },
140
+ environment: { slug: "preview" },
141
+ };
142
+ v3_1.taskContext.setGlobalTaskContext({ ctx: fakeCtx });
143
+ const observed = v3_1.sdkScope.withScope({ apiClientConfig: { accessToken: "x" }, inheritContext: true }, () => v3_1.taskContext.ctx);
144
+ (0, vitest_1.expect)(observed).toBe(fakeCtx);
145
+ });
146
+ });
147
+ (0, vitest_1.describe)("configure()", () => {
148
+ (0, vitest_1.beforeEach)(() => {
149
+ v3_1.apiClientManager.disable();
150
+ });
151
+ (0, vitest_1.afterEach)(() => {
152
+ v3_1.apiClientManager.disable();
153
+ });
154
+ (0, vitest_1.it)("overrides previously-set configuration on a second call", async () => {
155
+ (0, auth_js_1.configure)({ accessToken: "tr_first" });
156
+ (0, vitest_1.expect)(v3_1.apiClientManager.accessToken).toBe("tr_first");
157
+ (0, auth_js_1.configure)({ accessToken: "tr_second", previewBranch: "branch-b" });
158
+ (0, vitest_1.expect)(v3_1.apiClientManager.accessToken).toBe("tr_second");
159
+ (0, vitest_1.expect)(v3_1.apiClientManager.branchName).toBe("branch-b");
160
+ });
161
+ });
162
+ (0, vitest_1.describe)("auth.withAuth", () => {
163
+ (0, vitest_1.beforeEach)(() => {
164
+ v3_1.apiClientManager.disable();
165
+ });
166
+ (0, vitest_1.afterEach)(() => {
167
+ v3_1.apiClientManager.disable();
168
+ });
169
+ (0, vitest_1.it)("inherits TRIGGER_SECRET_KEY from env when called with a partial config", async () => {
170
+ vitest_1.vi.stubEnv("TRIGGER_SECRET_KEY", "tr_dev_env_token");
171
+ let observed;
172
+ await auth_js_1.auth.withAuth({ baseURL: "https://override.example.com" }, async () => {
173
+ observed = v3_1.apiClientManager.accessToken;
174
+ });
175
+ // The scoped `inheritContext: true` path falls back to TRIGGER_SECRET_KEY
176
+ // so callers can override only baseURL without re-passing the token.
177
+ (0, vitest_1.expect)(observed).toBe("tr_dev_env_token");
178
+ // baseURL override still applies.
179
+ (0, vitest_1.expect)(await auth_js_1.auth.withAuth({ baseURL: "https://override.example.com" }, async () => v3_1.apiClientManager.baseURL)).toBe("https://override.example.com");
180
+ });
181
+ (0, vitest_1.it)("composes nested withAuth: outer-scope fields flow into the inner scope", async () => {
182
+ vitest_1.vi.stubEnv("TRIGGER_SECRET_KEY", "tr_env_token");
183
+ let observedBaseURL;
184
+ let observedAuth;
185
+ await auth_js_1.auth.withAuth({ baseURL: "https://outer.example.com" }, async () => {
186
+ await auth_js_1.auth.withAuth({ accessToken: "tr_inner_token" }, async () => {
187
+ observedBaseURL = v3_1.apiClientManager.baseURL;
188
+ observedAuth = v3_1.apiClientManager.accessToken;
189
+ });
190
+ });
191
+ (0, vitest_1.expect)(observedBaseURL).toBe("https://outer.example.com");
192
+ (0, vitest_1.expect)(observedAuth).toBe("tr_inner_token");
193
+ });
194
+ (0, vitest_1.it)("does not stomp on a parallel withAuth call with a different config", async () => {
195
+ (0, auth_js_1.configure)({ accessToken: "tr_global" });
196
+ const tokenA = "tr_concurrent_a";
197
+ const tokenB = "tr_concurrent_b";
198
+ const settle = {
199
+ resolveA: () => { },
200
+ resolveB: () => { },
201
+ };
202
+ const gateA = new Promise((r) => (settle.resolveA = r));
203
+ const gateB = new Promise((r) => (settle.resolveB = r));
204
+ const runA = auth_js_1.auth.withAuth({ accessToken: tokenA }, async () => {
205
+ // Suspend mid-scope so the parallel B scope opens while A is still pending.
206
+ await gateA;
207
+ return v3_1.apiClientManager.accessToken;
208
+ });
209
+ const runB = auth_js_1.auth.withAuth({ accessToken: tokenB }, async () => {
210
+ // Open B's scope first, then unblock A. If withAuth used the old
211
+ // mutate-and-restore pattern, A would observe tokenB or B's
212
+ // .finally would restore the wrong "original".
213
+ const seenInB = v3_1.apiClientManager.accessToken;
214
+ settle.resolveA();
215
+ await gateB;
216
+ return seenInB;
217
+ });
218
+ settle.resolveB(); // let B finish after A reads
219
+ const [seenInA, seenInB] = await Promise.all([runA, runB]);
220
+ (0, vitest_1.expect)(seenInA).toBe(tokenA);
221
+ (0, vitest_1.expect)(seenInB).toBe(tokenB);
222
+ // Global remains unchanged after both scopes exit.
223
+ (0, vitest_1.expect)(v3_1.apiClientManager.accessToken).toBe("tr_global");
224
+ });
225
+ });
226
+ //# sourceMappingURL=triggerClient.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggerClient.test.js","sourceRoot":"","sources":["../../../src/v3/triggerClient.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const vitest_1 = require("vitest");
27
+ const batch_js_1 = require("./batch.js");
28
+ const schedules = __importStar(require("./schedules/index.js"));
29
+ const prompts = __importStar(require("./prompts.js"));
30
+ const auth_js_1 = require("./auth.js");
31
+ const triggerClient_js_1 = require("./triggerClient.js");
32
+ const client = new triggerClient_js_1.TriggerClient({ accessToken: "tr_x" });
33
+ (0, vitest_1.describe)("TriggerClient surface — type-level guarantees", () => {
34
+ (0, vitest_1.it)("preserves generic inference on tasks.trigger<typeof t>", () => {
35
+ (0, vitest_1.expectTypeOf)().resolves.toHaveProperty("id");
36
+ (0, vitest_1.expectTypeOf)().resolves.toHaveProperty("taskIdentifier");
37
+ });
38
+ (0, vitest_1.it)("preserves return type on runs.retrieve (no double-wrap)", () => {
39
+ // bindToScope wraps the impl as () => sdkScope.withScope(...). If the
40
+ // wrapper were typed loosely it could surface as Promise<ApiPromise<...>>.
41
+ // We want the original ApiPromise<...> to flow through unchanged.
42
+ const handle = client.runs.retrieve("run_x");
43
+ (0, vitest_1.expectTypeOf)(handle).toEqualTypeOf();
44
+ // And it should be assignable to a plain Promise (since ApiPromise extends Promise).
45
+ (0, vitest_1.expectTypeOf)(handle).toMatchTypeOf();
46
+ });
47
+ (0, vitest_1.it)("preserves envvars.list overloads (projectRef+slug form AND zero-arg form)", () => {
48
+ // Two-arg form
49
+ (0, vitest_1.expectTypeOf)(client.envvars.list).toBeCallableWith("proj_1234", "dev");
50
+ // Zero-arg form (uses task context — still typeable at the call site)
51
+ (0, vitest_1.expectTypeOf)(client.envvars.list).toBeCallableWith();
52
+ });
53
+ });
54
+ (0, vitest_1.describe)("TriggerClient surface — curated subsets", () => {
55
+ (0, vitest_1.it)("instance.tasks drops inside-task-only and definition-time helpers", () => {
56
+ (0, vitest_1.expectTypeOf)().toEqualTypeOf();
57
+ // @ts-expect-error — triggerAndWait is not on the instance surface.
58
+ client.tasks.triggerAndWait;
59
+ // @ts-expect-error — batchTriggerAndWait is not on the instance surface.
60
+ client.tasks.batchTriggerAndWait;
61
+ // @ts-expect-error — triggerAndSubscribe requires a task context; not on the instance surface.
62
+ client.tasks.triggerAndSubscribe;
63
+ // @ts-expect-error — hooks like onStart are task-definition-time, not on the client.
64
+ client.tasks.onStart;
65
+ });
66
+ (0, vitest_1.it)("instance.batch drops the *AndWait variants that depend on the runtime", () => {
67
+ (0, vitest_1.expectTypeOf)().toEqualTypeOf();
68
+ // @ts-expect-error
69
+ client.batch.triggerAndWait;
70
+ // @ts-expect-error
71
+ client.batch.triggerByTaskAndWait;
72
+ // The module-level export still has them — sanity check we didn't change that.
73
+ (0, vitest_1.expectTypeOf)(batch_js_1.batch).toHaveProperty("triggerAndWait");
74
+ });
75
+ (0, vitest_1.it)("instance.schedules drops `task` definition helper and `timezones` stateless helper", () => {
76
+ (0, vitest_1.expectTypeOf)().toEqualTypeOf();
77
+ // @ts-expect-error
78
+ client.schedules.task;
79
+ // @ts-expect-error
80
+ client.schedules.timezones;
81
+ // Module-level export still has them.
82
+ (0, vitest_1.expectTypeOf)(schedules).toHaveProperty("task");
83
+ (0, vitest_1.expectTypeOf)(schedules).toHaveProperty("timezones");
84
+ });
85
+ (0, vitest_1.it)("instance.prompts drops `define`", () => {
86
+ // @ts-expect-error
87
+ client.prompts.define;
88
+ // Module-level export still has it.
89
+ (0, vitest_1.expectTypeOf)(prompts).toHaveProperty("define");
90
+ });
91
+ (0, vitest_1.it)("instance.auth is the public-token subset only (no configure/withAuth)", () => {
92
+ (0, vitest_1.expectTypeOf)().toEqualTypeOf();
93
+ // @ts-expect-error — configure is global-only, not on the instance.
94
+ client.auth.configure;
95
+ // @ts-expect-error — withAuth is global-only.
96
+ client.auth.withAuth;
97
+ // Module-level export still has them.
98
+ (0, vitest_1.expectTypeOf)(auth_js_1.auth).toHaveProperty("configure");
99
+ (0, vitest_1.expectTypeOf)(auth_js_1.auth).toHaveProperty("withAuth");
100
+ });
101
+ });
102
+ (0, vitest_1.describe)("TriggerClient surface — namespaces match their module sources", () => {
103
+ // These are the load-bearing assertions for the bindToScope cast. If the
104
+ // `as unknown as Pick<T, K>` ever drops or widens the underlying signatures,
105
+ // these break.
106
+ (0, vitest_1.it)("client.runs is structurally `typeof runs`", () => {
107
+ (0, vitest_1.expectTypeOf)(client.runs).toEqualTypeOf();
108
+ });
109
+ (0, vitest_1.it)("client.envvars is structurally `typeof envvars`", () => {
110
+ (0, vitest_1.expectTypeOf)(client.envvars).toEqualTypeOf();
111
+ });
112
+ });
113
+ //# sourceMappingURL=triggerClient.types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggerClient.types.test.js","sourceRoot":"","sources":["../../../src/v3/triggerClient.types.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "4.5.0-rc.0";
4
+ exports.VERSION = "4.5.0-rc.2";
5
5
  //# sourceMappingURL=version.js.map
@@ -171,3 +171,73 @@ export type InferChatClientData<TTask extends AnyTask> = TTask extends Task<stri
171
171
  * ```
172
172
  */
173
173
  export type InferChatUIMessage<TTask extends AnyTask> = TTask extends Task<string, ChatTaskWirePayload<infer TUIM extends UIMessage, any>, any> ? TUIM : UIMessage;
174
+ /**
175
+ * Upsert an incoming wire message into the customer's DB-backed chain
176
+ * inside a `hydrateMessages` hook. Returns `true` iff the chain was
177
+ * mutated (the caller should persist).
178
+ *
179
+ * Handles the three cases that matter:
180
+ *
181
+ * - **Non-submit-message trigger** (`regenerate-message` / `action`,
182
+ * or `submit-message` with no incoming): no-op. Returns `false`.
183
+ * - **Incoming id already in `stored`** (HITL `addToolOutput` /
184
+ * `addToolApproveResponse` continuation — the wire carries the
185
+ * existing assistant's id with a slim resolution payload): no-op.
186
+ * The runtime's per-turn merge overlays the new tool-state advance
187
+ * onto the existing entry; pushing again would duplicate the row
188
+ * in the chain you return, and the duplicate slim copy would hit
189
+ * `toModelMessages` with no `input`. Returns `false`.
190
+ * - **Incoming id not in `stored`** (typically a fresh user message
191
+ * on a new turn): push. Returns `true`.
192
+ *
193
+ * Mutates `stored` in place. The caller persists `stored`, not the
194
+ * return value.
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * import { chat, upsertIncomingMessage } from "@trigger.dev/sdk/ai";
199
+ *
200
+ * chat.agent({
201
+ * hydrateMessages: async ({ chatId, trigger, incomingMessages }) => {
202
+ * const record = await db.chat.findUnique({ where: { id: chatId } });
203
+ * const stored = record?.messages ?? [];
204
+ * if (upsertIncomingMessage(stored, { trigger, incomingMessages })) {
205
+ * await db.chat.update({ where: { id: chatId }, data: { messages: stored } });
206
+ * }
207
+ * return stored;
208
+ * },
209
+ * });
210
+ * ```
211
+ */
212
+ export declare function upsertIncomingMessage<TMsg extends UIMessage = UIMessage>(stored: TMsg[], event: {
213
+ trigger: "submit-message" | "regenerate-message" | "action";
214
+ incomingMessages: TMsg[];
215
+ }): boolean;
216
+ /**
217
+ * Slim an outgoing assistant message before it ships on `submit-message`.
218
+ *
219
+ * When the client calls `addToolOutput(...)` to resolve a HITL tool (or
220
+ * `addToolApproveResponse(...)` to approve/deny one), the AI SDK turns
221
+ * it into a `submit-message` whose `messages.at(-1)` is the existing
222
+ * assistant message with the new state stitched onto a single tool
223
+ * part. On a reasoning-heavy multi-step turn, that full assistant
224
+ * message can be 600 KB – 1 MB (encrypted reasoning blobs, reasoning
225
+ * text, full tool `input` JSON, prior tool outputs) — well over the
226
+ * `.in/append` cap.
227
+ *
228
+ * The agent runtime only consumes the wire-advanced fields of those
229
+ * tool parts (state + output / errorText / approval). Everything else
230
+ * (text, reasoning, tool `input`) is rebuilt server-side from the
231
+ * durable snapshot or `hydrateMessages`. So we drop everything but
232
+ * the advanced tool parts here, and reduce those to just the fields
233
+ * the server overlays.
234
+ *
235
+ * The slim only fires when the assistant message carries at least one
236
+ * wire-advanceable tool part. Plain assistant resends (no resolved /
237
+ * approval-responded tool) and non-assistant messages pass through
238
+ * untouched.
239
+ *
240
+ * Pairs with the per-turn merge on the agent side
241
+ * (`mergeIncomingIntoHydrated` in `ai.ts`).
242
+ */
243
+ export declare function slimSubmitMessageForWire<TMsg extends UIMessage | undefined>(message: TMsg): TMsg;
@@ -19,4 +19,146 @@
19
19
  * injects when a follow-up message arrives mid-turn.
20
20
  */
21
21
  export const PENDING_MESSAGE_INJECTED_TYPE = "data-pending-message-injected";
22
+ /**
23
+ * Upsert an incoming wire message into the customer's DB-backed chain
24
+ * inside a `hydrateMessages` hook. Returns `true` iff the chain was
25
+ * mutated (the caller should persist).
26
+ *
27
+ * Handles the three cases that matter:
28
+ *
29
+ * - **Non-submit-message trigger** (`regenerate-message` / `action`,
30
+ * or `submit-message` with no incoming): no-op. Returns `false`.
31
+ * - **Incoming id already in `stored`** (HITL `addToolOutput` /
32
+ * `addToolApproveResponse` continuation — the wire carries the
33
+ * existing assistant's id with a slim resolution payload): no-op.
34
+ * The runtime's per-turn merge overlays the new tool-state advance
35
+ * onto the existing entry; pushing again would duplicate the row
36
+ * in the chain you return, and the duplicate slim copy would hit
37
+ * `toModelMessages` with no `input`. Returns `false`.
38
+ * - **Incoming id not in `stored`** (typically a fresh user message
39
+ * on a new turn): push. Returns `true`.
40
+ *
41
+ * Mutates `stored` in place. The caller persists `stored`, not the
42
+ * return value.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * import { chat, upsertIncomingMessage } from "@trigger.dev/sdk/ai";
47
+ *
48
+ * chat.agent({
49
+ * hydrateMessages: async ({ chatId, trigger, incomingMessages }) => {
50
+ * const record = await db.chat.findUnique({ where: { id: chatId } });
51
+ * const stored = record?.messages ?? [];
52
+ * if (upsertIncomingMessage(stored, { trigger, incomingMessages })) {
53
+ * await db.chat.update({ where: { id: chatId }, data: { messages: stored } });
54
+ * }
55
+ * return stored;
56
+ * },
57
+ * });
58
+ * ```
59
+ */
60
+ export function upsertIncomingMessage(stored, event) {
61
+ if (event.trigger !== "submit-message")
62
+ return false;
63
+ if (event.incomingMessages.length === 0)
64
+ return false;
65
+ const newMsg = event.incomingMessages[event.incomingMessages.length - 1];
66
+ if (!newMsg)
67
+ return false;
68
+ if (newMsg.id) {
69
+ const existingIdx = stored.findIndex((m) => m.id === newMsg.id);
70
+ if (existingIdx !== -1)
71
+ return false;
72
+ }
73
+ stored.push(newMsg);
74
+ return true;
75
+ }
76
+ /**
77
+ * Tool-part states that the client advances and ships back over the wire.
78
+ * Covers HITL `addToolOutput` (output-available / output-error) and the
79
+ * approval flow (approval-responded / output-denied). `input-streaming` /
80
+ * `input-available` / `approval-requested` are server-emitted only — if
81
+ * we see them on the wire we treat them as no-ops and skip the slim/merge.
82
+ */
83
+ function isWireAdvanceableToolState(state) {
84
+ return (state === "output-available" ||
85
+ state === "output-error" ||
86
+ state === "approval-responded" ||
87
+ state === "output-denied");
88
+ }
89
+ /** Whether a tool-UI part is a static (`tool-${name}`) or dynamic tool. */
90
+ function isToolPartType(type) {
91
+ return typeof type === "string" && (type.startsWith("tool-") || type === "dynamic-tool");
92
+ }
93
+ /**
94
+ * Slim an outgoing assistant message before it ships on `submit-message`.
95
+ *
96
+ * When the client calls `addToolOutput(...)` to resolve a HITL tool (or
97
+ * `addToolApproveResponse(...)` to approve/deny one), the AI SDK turns
98
+ * it into a `submit-message` whose `messages.at(-1)` is the existing
99
+ * assistant message with the new state stitched onto a single tool
100
+ * part. On a reasoning-heavy multi-step turn, that full assistant
101
+ * message can be 600 KB – 1 MB (encrypted reasoning blobs, reasoning
102
+ * text, full tool `input` JSON, prior tool outputs) — well over the
103
+ * `.in/append` cap.
104
+ *
105
+ * The agent runtime only consumes the wire-advanced fields of those
106
+ * tool parts (state + output / errorText / approval). Everything else
107
+ * (text, reasoning, tool `input`) is rebuilt server-side from the
108
+ * durable snapshot or `hydrateMessages`. So we drop everything but
109
+ * the advanced tool parts here, and reduce those to just the fields
110
+ * the server overlays.
111
+ *
112
+ * The slim only fires when the assistant message carries at least one
113
+ * wire-advanceable tool part. Plain assistant resends (no resolved /
114
+ * approval-responded tool) and non-assistant messages pass through
115
+ * untouched.
116
+ *
117
+ * Pairs with the per-turn merge on the agent side
118
+ * (`mergeIncomingIntoHydrated` in `ai.ts`).
119
+ */
120
+ export function slimSubmitMessageForWire(message) {
121
+ if (!message)
122
+ return message;
123
+ if (message.role !== "assistant")
124
+ return message;
125
+ const parts = (message.parts ?? []);
126
+ const advancedToolParts = parts.filter((p) => p &&
127
+ typeof p === "object" &&
128
+ isToolPartType(p.type) &&
129
+ isWireAdvanceableToolState(p.state));
130
+ if (advancedToolParts.length === 0)
131
+ return message;
132
+ const slimParts = advancedToolParts.map((p) => {
133
+ const base = {
134
+ type: p.type,
135
+ toolCallId: p.toolCallId,
136
+ state: p.state,
137
+ };
138
+ if (p.type === "dynamic-tool" && typeof p.toolName === "string") {
139
+ base.toolName = p.toolName;
140
+ }
141
+ if (p.state === "output-available") {
142
+ base.output = p.output;
143
+ if (p.approval !== undefined)
144
+ base.approval = p.approval;
145
+ }
146
+ else if (p.state === "output-error") {
147
+ if (p.errorText !== undefined)
148
+ base.errorText = p.errorText;
149
+ if (p.approval !== undefined)
150
+ base.approval = p.approval;
151
+ }
152
+ else if (p.state === "approval-responded" || p.state === "output-denied") {
153
+ if (p.approval !== undefined)
154
+ base.approval = p.approval;
155
+ }
156
+ return base;
157
+ });
158
+ return {
159
+ id: message.id,
160
+ role: message.role,
161
+ parts: slimParts,
162
+ };
163
+ }
22
164
  //# sourceMappingURL=ai-shared.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"ai-shared.js","sourceRoot":"","sources":["../../../src/v3/ai-shared.ts"],"names":[],"mappings":"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"}