@trigger.dev/sdk 4.5.0-rc.7 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/v3/ai-shared.js +1 -4
- package/dist/commonjs/v3/ai-shared.js.map +1 -1
- package/dist/commonjs/v3/ai.d.ts +7 -1
- package/dist/commonjs/v3/ai.js +110 -44
- package/dist/commonjs/v3/ai.js.map +1 -1
- package/dist/commonjs/v3/chat-client.js +18 -14
- package/dist/commonjs/v3/chat-client.js.map +1 -1
- package/dist/commonjs/v3/chat-react.js +1 -3
- package/dist/commonjs/v3/chat-react.js.map +1 -1
- package/dist/commonjs/v3/chat-server.d.ts +69 -1
- package/dist/commonjs/v3/chat-server.js +162 -14
- package/dist/commonjs/v3/chat-server.js.map +1 -1
- package/dist/commonjs/v3/chat-server.test.js +156 -12
- package/dist/commonjs/v3/chat-server.test.js.map +1 -1
- package/dist/commonjs/v3/chat.js +4 -3
- package/dist/commonjs/v3/chat.js.map +1 -1
- package/dist/commonjs/v3/chat.test.js +6 -18
- package/dist/commonjs/v3/chat.test.js.map +1 -1
- package/dist/commonjs/v3/idempotencyKeys.js.map +1 -1
- package/dist/commonjs/v3/prompt.js +2 -6
- package/dist/commonjs/v3/prompt.js.map +1 -1
- package/dist/commonjs/v3/promptManagement.js.map +1 -1
- package/dist/commonjs/v3/retry.js.map +1 -1
- package/dist/commonjs/v3/runs.d.ts +1 -1
- package/dist/commonjs/v3/sessions.js +1 -0
- package/dist/commonjs/v3/sessions.js.map +1 -1
- package/dist/commonjs/v3/shared.js.map +1 -1
- package/dist/commonjs/v3/skill.js.map +1 -1
- package/dist/commonjs/v3/streams.js +2 -3
- package/dist/commonjs/v3/streams.js.map +1 -1
- package/dist/commonjs/v3/streams.test.js.map +1 -1
- package/dist/commonjs/v3/test/mock-chat-agent.js +1 -4
- package/dist/commonjs/v3/test/mock-chat-agent.js.map +1 -1
- package/dist/commonjs/v3/test/test-session-handle.js.map +1 -1
- package/dist/commonjs/v3/triggerClient.test.js +1 -1
- package/dist/commonjs/v3/triggerClient.test.js.map +1 -1
- package/dist/commonjs/v3/triggerClient.types.test.js +11 -11
- package/dist/commonjs/v3/triggerClient.types.test.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/ai-shared.js +1 -4
- package/dist/esm/v3/ai-shared.js.map +1 -1
- package/dist/esm/v3/ai.d.ts +7 -1
- package/dist/esm/v3/ai.js +110 -44
- package/dist/esm/v3/ai.js.map +1 -1
- package/dist/esm/v3/chat-client.js +18 -14
- package/dist/esm/v3/chat-client.js.map +1 -1
- package/dist/esm/v3/chat-react.js +1 -3
- package/dist/esm/v3/chat-react.js.map +1 -1
- package/dist/esm/v3/chat-server.d.ts +69 -1
- package/dist/esm/v3/chat-server.js +162 -14
- package/dist/esm/v3/chat-server.js.map +1 -1
- package/dist/esm/v3/chat-server.test.js +156 -12
- package/dist/esm/v3/chat-server.test.js.map +1 -1
- package/dist/esm/v3/chat.js +4 -3
- package/dist/esm/v3/chat.js.map +1 -1
- package/dist/esm/v3/chat.test.js +6 -18
- package/dist/esm/v3/chat.test.js.map +1 -1
- package/dist/esm/v3/idempotencyKeys.js +1 -1
- package/dist/esm/v3/idempotencyKeys.js.map +1 -1
- package/dist/esm/v3/prompt.js +2 -6
- package/dist/esm/v3/prompt.js.map +1 -1
- package/dist/esm/v3/promptManagement.js.map +1 -1
- package/dist/esm/v3/retry.js.map +1 -1
- package/dist/esm/v3/sessions.js +1 -0
- package/dist/esm/v3/sessions.js.map +1 -1
- package/dist/esm/v3/shared.js.map +1 -1
- package/dist/esm/v3/skill.js.map +1 -1
- package/dist/esm/v3/streams.js +2 -3
- package/dist/esm/v3/streams.js.map +1 -1
- package/dist/esm/v3/streams.test.js.map +1 -1
- package/dist/esm/v3/test/mock-chat-agent.js +4 -7
- package/dist/esm/v3/test/mock-chat-agent.js.map +1 -1
- package/dist/esm/v3/test/test-session-handle.js.map +1 -1
- package/dist/esm/v3/triggerClient.test.js +1 -1
- package/dist/esm/v3/triggerClient.test.js.map +1 -1
- package/dist/esm/v3/triggerClient.types.test.js +11 -11
- package/dist/esm/v3/triggerClient.types.test.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/docs/ai/prompts.mdx +0 -4
- package/docs/ai-chat/actions.mdx +0 -4
- package/docs/ai-chat/anatomy.mdx +0 -4
- package/docs/ai-chat/backend.mdx +0 -4
- package/docs/ai-chat/background-injection.mdx +0 -4
- package/docs/ai-chat/changelog.mdx +109 -1
- package/docs/ai-chat/chat-local.mdx +0 -4
- package/docs/ai-chat/client-protocol.mdx +0 -4
- package/docs/ai-chat/compaction.mdx +0 -4
- package/docs/ai-chat/custom-agents.mdx +32 -4
- package/docs/ai-chat/error-handling.mdx +0 -4
- package/docs/ai-chat/fast-starts.mdx +86 -4
- package/docs/ai-chat/frontend.mdx +0 -4
- package/docs/ai-chat/how-it-works.mdx +0 -4
- package/docs/ai-chat/lifecycle-hooks.mdx +0 -4
- package/docs/ai-chat/mcp.mdx +0 -4
- package/docs/ai-chat/overview.mdx +0 -4
- package/docs/ai-chat/patterns/branching-conversations.mdx +0 -4
- package/docs/ai-chat/patterns/code-sandbox.mdx +0 -4
- package/docs/ai-chat/patterns/database-persistence.mdx +0 -4
- package/docs/ai-chat/patterns/human-in-the-loop.mdx +9 -5
- package/docs/ai-chat/patterns/large-payloads.mdx +0 -4
- package/docs/ai-chat/patterns/oom-resilience.mdx +0 -4
- package/docs/ai-chat/patterns/persistence-and-replay.mdx +0 -4
- package/docs/ai-chat/patterns/recovery-boot.mdx +0 -4
- package/docs/ai-chat/patterns/skills.mdx +0 -4
- package/docs/ai-chat/patterns/sub-agents.mdx +0 -4
- package/docs/ai-chat/patterns/tool-result-auditing.mdx +0 -4
- package/docs/ai-chat/patterns/trusted-edge-signals.mdx +0 -4
- package/docs/ai-chat/patterns/version-upgrades.mdx +0 -4
- package/docs/ai-chat/pending-messages.mdx +0 -4
- package/docs/ai-chat/prompt-caching.mdx +4 -4
- package/docs/ai-chat/quick-start.mdx +0 -4
- package/docs/ai-chat/reference.mdx +1 -5
- package/docs/ai-chat/server-chat.mdx +0 -4
- package/docs/ai-chat/sessions.mdx +0 -4
- package/docs/ai-chat/testing.mdx +0 -4
- package/docs/ai-chat/tools.mdx +0 -4
- package/docs/ai-chat/types.mdx +0 -4
- package/docs/ai-chat/upgrade-guide.mdx +0 -4
- package/docs/building-with-ai.mdx +1 -1
- package/docs/deploy-environment-variables.mdx +1 -1
- package/docs/deployment/dev-branches.mdx +92 -0
- package/docs/deployment/overview.mdx +1 -1
- package/docs/help-slack.mdx +1 -0
- package/docs/how-to-reduce-your-spend.mdx +14 -7
- package/docs/introduction.mdx +13 -13
- package/docs/mcp-agent-rules.mdx +1 -1
- package/docs/open-source-self-hosting.mdx +1 -1
- package/docs/self-hosting/overview.mdx +2 -1
- package/docs/tasks/scheduled.mdx +2 -2
- package/docs/troubleshooting-debugging-in-vscode.mdx +1 -0
- package/docs/troubleshooting-github-issues.mdx +1 -1
- package/docs/troubleshooting-uptime-status.mdx +1 -0
- package/docs/video-walkthrough.mdx +1 -1
- package/docs/wait-for.mdx +1 -1
- package/package.json +2 -2
- package/docs/cli-dev.mdx +0 -8
|
@@ -55,45 +55,45 @@ const client = new triggerClient_js_1.TriggerClient({ accessToken: "tr_x" });
|
|
|
55
55
|
(0, vitest_1.it)("instance.tasks drops inside-task-only and definition-time helpers", () => {
|
|
56
56
|
(0, vitest_1.expectTypeOf)().toEqualTypeOf();
|
|
57
57
|
// @ts-expect-error — triggerAndWait is not on the instance surface.
|
|
58
|
-
client.tasks.triggerAndWait;
|
|
58
|
+
void client.tasks.triggerAndWait;
|
|
59
59
|
// @ts-expect-error — batchTriggerAndWait is not on the instance surface.
|
|
60
|
-
client.tasks.batchTriggerAndWait;
|
|
60
|
+
void client.tasks.batchTriggerAndWait;
|
|
61
61
|
// @ts-expect-error — triggerAndSubscribe requires a task context; not on the instance surface.
|
|
62
|
-
client.tasks.triggerAndSubscribe;
|
|
62
|
+
void client.tasks.triggerAndSubscribe;
|
|
63
63
|
// @ts-expect-error — hooks like onStart are task-definition-time, not on the client.
|
|
64
|
-
client.tasks.onStart;
|
|
64
|
+
void client.tasks.onStart;
|
|
65
65
|
});
|
|
66
66
|
(0, vitest_1.it)("instance.batch drops the *AndWait variants that depend on the runtime", () => {
|
|
67
67
|
(0, vitest_1.expectTypeOf)().toEqualTypeOf();
|
|
68
68
|
// @ts-expect-error
|
|
69
|
-
client.batch.triggerAndWait;
|
|
69
|
+
void client.batch.triggerAndWait;
|
|
70
70
|
// @ts-expect-error
|
|
71
|
-
client.batch.triggerByTaskAndWait;
|
|
71
|
+
void client.batch.triggerByTaskAndWait;
|
|
72
72
|
// The module-level export still has them — sanity check we didn't change that.
|
|
73
73
|
(0, vitest_1.expectTypeOf)(batch_js_1.batch).toHaveProperty("triggerAndWait");
|
|
74
74
|
});
|
|
75
75
|
(0, vitest_1.it)("instance.schedules drops `task` definition helper and `timezones` stateless helper", () => {
|
|
76
76
|
(0, vitest_1.expectTypeOf)().toEqualTypeOf();
|
|
77
77
|
// @ts-expect-error
|
|
78
|
-
client.schedules.task;
|
|
78
|
+
void client.schedules.task;
|
|
79
79
|
// @ts-expect-error
|
|
80
|
-
client.schedules.timezones;
|
|
80
|
+
void client.schedules.timezones;
|
|
81
81
|
// Module-level export still has them.
|
|
82
82
|
(0, vitest_1.expectTypeOf)(schedules).toHaveProperty("task");
|
|
83
83
|
(0, vitest_1.expectTypeOf)(schedules).toHaveProperty("timezones");
|
|
84
84
|
});
|
|
85
85
|
(0, vitest_1.it)("instance.prompts drops `define`", () => {
|
|
86
86
|
// @ts-expect-error
|
|
87
|
-
client.prompts.define;
|
|
87
|
+
void client.prompts.define;
|
|
88
88
|
// Module-level export still has it.
|
|
89
89
|
(0, vitest_1.expectTypeOf)(prompts).toHaveProperty("define");
|
|
90
90
|
});
|
|
91
91
|
(0, vitest_1.it)("instance.auth is the public-token subset only (no configure/withAuth)", () => {
|
|
92
92
|
(0, vitest_1.expectTypeOf)().toEqualTypeOf();
|
|
93
93
|
// @ts-expect-error — configure is global-only, not on the instance.
|
|
94
|
-
client.auth.configure;
|
|
94
|
+
void client.auth.configure;
|
|
95
95
|
// @ts-expect-error — withAuth is global-only.
|
|
96
|
-
client.auth.withAuth;
|
|
96
|
+
void client.auth.withAuth;
|
|
97
97
|
// Module-level export still has them.
|
|
98
98
|
(0, vitest_1.expectTypeOf)(auth_js_1.auth).toHaveProperty("configure");
|
|
99
99
|
(0, vitest_1.expectTypeOf)(auth_js_1.auth).toHaveProperty("withAuth");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggerClient.types.test.js","sourceRoot":"","sources":["../../../src/v3/triggerClient.types.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAoD;AAEpD,yCAAmC;AAGnC,gEAAkD;AAClD,sDAAwC;AACxC,uCAAiC;AAEjC,yDAAmD;AAMnD,MAAM,MAAM,GAAG,IAAI,gCAAa,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;AAE1D,IAAA,iBAAQ,EAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAKhE,IAAA,qBAAY,GAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvD,IAAA,qBAAY,GAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,sEAAsE;QACtE,2EAA2E;QAC3E,kEAAkE;QAClE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAc,OAAO,CAAC,CAAC;QAC1D,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC,aAAa,EAAiD,CAAC;QACpF,qFAAqF;QACrF,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC,aAAa,EAAoB,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,eAAe;QACf,IAAA,qBAAY,EAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACvE,sEAAsE;QACtE,IAAA,qBAAY,EAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,IAAA,WAAE,EAAC,mEAAmE,EAAE,GAAG,EAAE;QAE3E,IAAA,qBAAY,GAAQ,CAAC,aAAa,EAA8B,CAAC;QACjE,oEAAoE;QACpE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"triggerClient.types.test.js","sourceRoot":"","sources":["../../../src/v3/triggerClient.types.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAoD;AAEpD,yCAAmC;AAGnC,gEAAkD;AAClD,sDAAwC;AACxC,uCAAiC;AAEjC,yDAAmD;AAMnD,MAAM,MAAM,GAAG,IAAI,gCAAa,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;AAE1D,IAAA,iBAAQ,EAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAKhE,IAAA,qBAAY,GAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvD,IAAA,qBAAY,GAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,sEAAsE;QACtE,2EAA2E;QAC3E,kEAAkE;QAClE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAc,OAAO,CAAC,CAAC;QAC1D,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC,aAAa,EAAiD,CAAC;QACpF,qFAAqF;QACrF,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC,aAAa,EAAoB,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,eAAe;QACf,IAAA,qBAAY,EAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACvE,sEAAsE;QACtE,IAAA,qBAAY,EAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,IAAA,WAAE,EAAC,mEAAmE,EAAE,GAAG,EAAE;QAE3E,IAAA,qBAAY,GAAQ,CAAC,aAAa,EAA8B,CAAC;QACjE,oEAAoE;QACpE,KAAK,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;QACjC,yEAAyE;QACzE,KAAK,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC;QACtC,+FAA+F;QAC/F,KAAK,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC;QACtC,qFAAqF;QACrF,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uEAAuE,EAAE,GAAG,EAAE;QAE/E,IAAA,qBAAY,GAAQ,CAAC,aAAa,EAA4C,CAAC;QAC/E,mBAAmB;QACnB,KAAK,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;QACjC,mBAAmB;QACnB,KAAK,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC;QACvC,+EAA+E;QAC/E,IAAA,qBAAY,EAAC,gBAAK,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oFAAoF,EAAE,GAAG,EAAE;QAE5F,IAAA,qBAAY,GAAQ,CAAC,aAAa,EAE/B,CAAC;QACJ,mBAAmB;QACnB,KAAK,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;QAC3B,mBAAmB;QACnB,KAAK,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;QAChC,sCAAsC;QACtC,IAAA,qBAAY,EAAC,SAAS,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAA,qBAAY,EAAC,SAAS,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,mBAAmB;QACnB,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3B,oCAAoC;QACpC,IAAA,qBAAY,EAAC,OAAO,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uEAAuE,EAAE,GAAG,EAAE;QAE/E,IAAA,qBAAY,GAAQ,CAAC,aAAa,EAE/B,CAAC;QACJ,oEAAoE;QACpE,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3B,8CAA8C;QAC9C,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1B,sCAAsC;QACtC,IAAA,qBAAY,EAAC,cAAI,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAA,qBAAY,EAAC,cAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,yEAAyE;IACzE,6EAA6E;IAC7E,eAAe;IACf,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,qBAAY,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAe,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,IAAA,qBAAY,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAkB,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/commonjs/version.js
CHANGED
package/dist/esm/v3/ai-shared.js
CHANGED
|
@@ -123,10 +123,7 @@ export function slimSubmitMessageForWire(message) {
|
|
|
123
123
|
if (message.role !== "assistant")
|
|
124
124
|
return message;
|
|
125
125
|
const parts = (message.parts ?? []);
|
|
126
|
-
const advancedToolParts = parts.filter((p) => p &&
|
|
127
|
-
typeof p === "object" &&
|
|
128
|
-
isToolPartType(p.type) &&
|
|
129
|
-
isWireAdvanceableToolState(p.state));
|
|
126
|
+
const advancedToolParts = parts.filter((p) => p && typeof p === "object" && isToolPartType(p.type) && isWireAdvanceableToolState(p.state));
|
|
130
127
|
if (advancedToolParts.length === 0)
|
|
131
128
|
return message;
|
|
132
129
|
const slimParts = advancedToolParts.map((p) => {
|
|
@@ -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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"}
|
package/dist/esm/v3/ai.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnyTask, type MachinePresetName, type RealtimeDefinedInputStream, type RealtimeDefinedStream, Task, type inferSchemaIn, type inferSchemaOut, type TaskIdentifier, type TaskOptions, type TaskSchema, type TaskRunContext, type TaskWithSchema } from "@trigger.dev/core/v3";
|
|
1
|
+
import { AnyTask, type MachinePresetName, type RealtimeDefinedInputStream, type RealtimeDefinedStream, type ApiClientConfiguration, Task, type inferSchemaIn, type inferSchemaOut, type TaskIdentifier, type TaskOptions, type TaskSchema, type TaskRunContext, type TaskWithSchema } from "@trigger.dev/core/v3";
|
|
2
2
|
import type { FinishReason, LanguageModelUsage, ModelMessage, ProviderMetadata, Tool, ToolSet, UIMessage, UIMessageChunk, UIMessageStreamOptions } from "ai";
|
|
3
3
|
type ToolCallOptions = {
|
|
4
4
|
toolCallId: string;
|
|
@@ -2839,6 +2839,12 @@ export type CreateChatStartSessionActionOptions = {
|
|
|
2839
2839
|
* custom retry. Applies to both session-create and JWT-claims POSTs.
|
|
2840
2840
|
*/
|
|
2841
2841
|
fetch?: ChatStartSessionFetchOverride;
|
|
2842
|
+
/**
|
|
2843
|
+
* API client config (baseURL / accessToken) to scope this action to a specific
|
|
2844
|
+
* environment, for callers that can't set a global `TRIGGER_SECRET_KEY`. The
|
|
2845
|
+
* returned action runs under this config.
|
|
2846
|
+
*/
|
|
2847
|
+
apiClient?: ApiClientConfiguration;
|
|
2842
2848
|
};
|
|
2843
2849
|
/**
|
|
2844
2850
|
* Params for the function returned by {@link createChatStartSessionAction}.
|
package/dist/esm/v3/ai.js
CHANGED
|
@@ -141,7 +141,9 @@ async function seedSessionInResumeCursorForCustomLoop(payload) {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
catch (error) {
|
|
144
|
-
logger.warn("chat session: session.in resume cursor lookup failed; old messages may replay", {
|
|
144
|
+
logger.warn("chat session: session.in resume cursor lookup failed; old messages may replay", {
|
|
145
|
+
error: error instanceof Error ? error.message : String(error),
|
|
146
|
+
});
|
|
145
147
|
}
|
|
146
148
|
}
|
|
147
149
|
let readChatSnapshotImpl;
|
|
@@ -1227,8 +1229,7 @@ const handoverInput = {
|
|
|
1227
1229
|
const result = await getChatSession().in.waitWithIdleTimeout(options);
|
|
1228
1230
|
if (!result.ok)
|
|
1229
1231
|
return result;
|
|
1230
|
-
if (result.output.kind === "handover" ||
|
|
1231
|
-
result.output.kind === "handover-skip") {
|
|
1232
|
+
if (result.output.kind === "handover" || result.output.kind === "handover-skip") {
|
|
1232
1233
|
return { ok: true, output: result.output };
|
|
1233
1234
|
}
|
|
1234
1235
|
// Other kinds (message, stop) are not expected during handover-prepare.
|
|
@@ -1939,6 +1940,55 @@ function isStepBoundarySafe(step) {
|
|
|
1939
1940
|
.map((p) => p.toolCallId));
|
|
1940
1941
|
return ![...callIds].some((id) => !settledIds.has(id));
|
|
1941
1942
|
}
|
|
1943
|
+
/**
|
|
1944
|
+
* True when a model message is a `tool` message carrying a
|
|
1945
|
+
* `tool-approval-response` part — the trailing row a head-start handover
|
|
1946
|
+
* reshapes a pending first-turn tool call into. AI SDK's `collectToolApprovals`
|
|
1947
|
+
* only inspects the conversation's last message, so this row must survive to
|
|
1948
|
+
* `streamText` intact for the agent to execute the handed-over call.
|
|
1949
|
+
* @internal
|
|
1950
|
+
*/
|
|
1951
|
+
function hasToolApprovalResponse(message) {
|
|
1952
|
+
return (message?.role === "tool" &&
|
|
1953
|
+
Array.isArray(message.content) &&
|
|
1954
|
+
message.content.some((part) => part != null &&
|
|
1955
|
+
typeof part === "object" &&
|
|
1956
|
+
part.type === "tool-approval-response"));
|
|
1957
|
+
}
|
|
1958
|
+
/**
|
|
1959
|
+
* Keep a head-start handover's tool-approval tail intact across `prepareMessages`.
|
|
1960
|
+
*
|
|
1961
|
+
* The handover reshapes the warm step-1's pending tool call into AI SDK's
|
|
1962
|
+
* tool-approval round: a `tool-approval-request` on the assistant plus a
|
|
1963
|
+
* trailing `tool` message with `tool-approval-response { approved: true }`. The
|
|
1964
|
+
* agent's next `streamText` runs `collectToolApprovals`, which ONLY looks at the
|
|
1965
|
+
* last message — so that tool row must stay last and unmodified for the pending
|
|
1966
|
+
* call to execute. A user `prepareMessages` hook that rewrites or drops the last
|
|
1967
|
+
* message (e.g. rolling a provider cache breakpoint onto it) silently breaks the
|
|
1968
|
+
* resume: the agent sends a bare `tool_use` and the turn dies with
|
|
1969
|
+
* "tool_use ids were found without tool_result". If the hook's input ended with
|
|
1970
|
+
* that approval tail, re-assert the original tail as the last message.
|
|
1971
|
+
*
|
|
1972
|
+
* No-op for every normal turn — only fires when the input genuinely ended with a
|
|
1973
|
+
* pending tool-approval response (i.e. a head-start resume).
|
|
1974
|
+
* @internal
|
|
1975
|
+
*/
|
|
1976
|
+
function preserveToolApprovalTail(original, prepared) {
|
|
1977
|
+
const originalTail = original[original.length - 1];
|
|
1978
|
+
if (!hasToolApprovalResponse(originalTail))
|
|
1979
|
+
return prepared;
|
|
1980
|
+
// Hook left the exact tail object in place — nothing to do.
|
|
1981
|
+
if (prepared[prepared.length - 1] === originalTail)
|
|
1982
|
+
return prepared;
|
|
1983
|
+
// Otherwise drop only the trailing approval tail the hook produced (the
|
|
1984
|
+
// original moved, or a rewritten copy) and re-append the original so it is
|
|
1985
|
+
// last and intact. Older approval rounds deeper in history must survive.
|
|
1986
|
+
const withoutMovedOriginal = prepared.filter((m) => m !== originalTail);
|
|
1987
|
+
while (hasToolApprovalResponse(withoutMovedOriginal[withoutMovedOriginal.length - 1])) {
|
|
1988
|
+
withoutMovedOriginal.pop();
|
|
1989
|
+
}
|
|
1990
|
+
return [...withoutMovedOriginal, originalTail];
|
|
1991
|
+
}
|
|
1942
1992
|
/**
|
|
1943
1993
|
* Apply the prepareMessages hook if one is set in locals.
|
|
1944
1994
|
* @internal
|
|
@@ -1948,7 +1998,7 @@ async function applyPrepareMessages(messages, reason) {
|
|
|
1948
1998
|
if (!hook)
|
|
1949
1999
|
return messages;
|
|
1950
2000
|
const turnCtx = locals.get(chatTurnContextKey);
|
|
1951
|
-
|
|
2001
|
+
const prepared = await tracer.startActiveSpan("prepareMessages()", async () => {
|
|
1952
2002
|
return hook({
|
|
1953
2003
|
messages,
|
|
1954
2004
|
reason,
|
|
@@ -1964,6 +2014,9 @@ async function applyPrepareMessages(messages, reason) {
|
|
|
1964
2014
|
"chat.prepareMessages.messageCount": messages.length,
|
|
1965
2015
|
},
|
|
1966
2016
|
});
|
|
2017
|
+
// A user hook must never be able to break the head-start handover resume by
|
|
2018
|
+
// disturbing the trailing tool-approval row (see preserveToolApprovalTail).
|
|
2019
|
+
return preserveToolApprovalTail(messages, prepared);
|
|
1967
2020
|
}
|
|
1968
2021
|
/**
|
|
1969
2022
|
* Resolve the `tools` option into a concrete `ToolSet` and cache it in locals so
|
|
@@ -2912,7 +2965,9 @@ function chatAgent(options) {
|
|
|
2912
2965
|
const replayOutPhase = async () => {
|
|
2913
2966
|
const replayOutStart = Date.now();
|
|
2914
2967
|
try {
|
|
2915
|
-
const replayResult = await replaySessionOutTail(sessionIdForSnapshot, {
|
|
2968
|
+
const replayResult = await replaySessionOutTail(sessionIdForSnapshot, {
|
|
2969
|
+
lastEventId: bootSnapshot?.lastOutEventId,
|
|
2970
|
+
});
|
|
2916
2971
|
replayedSettled = replayResult.settled;
|
|
2917
2972
|
replayedPartial = replayResult.partial;
|
|
2918
2973
|
replayedPartialRaw = replayResult.partialRaw;
|
|
@@ -3009,9 +3064,7 @@ function chatAgent(options) {
|
|
|
3009
3064
|
// crashed / was canceled / requested upgrade
|
|
3010
3065
|
// - Snapshot exists at all (catches edge cases where the wire
|
|
3011
3066
|
// didn't set `continuation` but a snapshot indicates prior turns)
|
|
3012
|
-
const needsResumeCursor = ctx.attempt.number > 1 ||
|
|
3013
|
-
payload.continuation === true ||
|
|
3014
|
-
bootSnapshot !== undefined;
|
|
3067
|
+
const needsResumeCursor = ctx.attempt.number > 1 || payload.continuation === true || bootSnapshot !== undefined;
|
|
3015
3068
|
if (needsResumeCursor) {
|
|
3016
3069
|
try {
|
|
3017
3070
|
// Reuse the cursor the boot block already resolved (snapshot
|
|
@@ -3358,9 +3411,7 @@ function chatAgent(options) {
|
|
|
3358
3411
|
// Wait for the first real message — task-level idle settings win over
|
|
3359
3412
|
// `transport.preload(..., { idleTimeoutInSeconds })` / wire payload so
|
|
3360
3413
|
// `chat.agent({ idleTimeoutInSeconds, preloadIdleTimeoutInSeconds })` is authoritative.
|
|
3361
|
-
const effectivePreloadIdleTimeout = preloadIdleTimeoutInSeconds ??
|
|
3362
|
-
idleTimeoutInSeconds ??
|
|
3363
|
-
payload.idleTimeoutInSeconds;
|
|
3414
|
+
const effectivePreloadIdleTimeout = preloadIdleTimeoutInSeconds ?? idleTimeoutInSeconds ?? payload.idleTimeoutInSeconds;
|
|
3364
3415
|
const effectivePreloadTimeout = metadata.get(TURN_TIMEOUT_METADATA_KEY) ??
|
|
3365
3416
|
preloadTimeout ??
|
|
3366
3417
|
turnTimeout;
|
|
@@ -3605,7 +3656,9 @@ function chatAgent(options) {
|
|
|
3605
3656
|
if (lastUserMessage) {
|
|
3606
3657
|
turnAttributes["chat.user_message"] = lastUserMessage;
|
|
3607
3658
|
// Show a truncated preview of the user message as an accessory
|
|
3608
|
-
const preview = lastUserMessage.length > 80
|
|
3659
|
+
const preview = lastUserMessage.length > 80
|
|
3660
|
+
? lastUserMessage.slice(0, 80) + "..."
|
|
3661
|
+
: lastUserMessage;
|
|
3609
3662
|
Object.assign(turnAttributes, accessoryAttributes({
|
|
3610
3663
|
items: [{ text: preview, variant: "normal" }],
|
|
3611
3664
|
style: "codepath",
|
|
@@ -3892,8 +3945,7 @@ function chatAgent(options) {
|
|
|
3892
3945
|
if (currentWirePayload.trigger === "submit-message" &&
|
|
3893
3946
|
cleanedUIMessages.length > 0) {
|
|
3894
3947
|
const lastUI = cleanedUIMessages[cleanedUIMessages.length - 1];
|
|
3895
|
-
const matchedExisting = lastUI.id !== undefined &&
|
|
3896
|
-
previouslyKnownMessageIds.has(lastUI.id);
|
|
3948
|
+
const matchedExisting = lastUI.id !== undefined && previouslyKnownMessageIds.has(lastUI.id);
|
|
3897
3949
|
if (!matchedExisting) {
|
|
3898
3950
|
turnNewUIMessages.push(lastUI);
|
|
3899
3951
|
const lastModel = (await toModelMessages([lastUI]))[0];
|
|
@@ -4228,7 +4280,8 @@ function chatAgent(options) {
|
|
|
4228
4280
|
// We call toUIMessageStream ourselves to attach onFinish for response capture.
|
|
4229
4281
|
// Pass originalMessages so the AI SDK reuses message IDs across turns
|
|
4230
4282
|
// (e.g. for tool approval continuations / HITL flows).
|
|
4231
|
-
if ((locals.get(chatPipeCountKey) ?? 0) === 0 &&
|
|
4283
|
+
if ((locals.get(chatPipeCountKey) ?? 0) === 0 &&
|
|
4284
|
+
isUIMessageStreamable(runResult)) {
|
|
4232
4285
|
onFinishAttached = true;
|
|
4233
4286
|
const resolvedOptions = resolveUIMessageStreamOptions();
|
|
4234
4287
|
// For action turns, don't pass originalMessages: the response
|
|
@@ -4241,9 +4294,7 @@ function chatAgent(options) {
|
|
|
4241
4294
|
// Pass originalMessages so the AI SDK reuses message IDs across
|
|
4242
4295
|
// turns (e.g. for tool approval continuations / HITL flows).
|
|
4243
4296
|
// Omit for action turns to force a fresh response ID.
|
|
4244
|
-
...(isActionTurn
|
|
4245
|
-
? {}
|
|
4246
|
-
: { originalMessages: accumulatedUIMessages }),
|
|
4297
|
+
...(isActionTurn ? {} : { originalMessages: accumulatedUIMessages }),
|
|
4247
4298
|
// Always provide generateMessageId so the start chunk carries a
|
|
4248
4299
|
// messageId. Without this, the frontend and backend generate IDs
|
|
4249
4300
|
// independently and they won't match for ID-based dedup.
|
|
@@ -4254,7 +4305,10 @@ function chatAgent(options) {
|
|
|
4254
4305
|
resolveOnFinish();
|
|
4255
4306
|
},
|
|
4256
4307
|
});
|
|
4257
|
-
await pipeChat(uiStream, {
|
|
4308
|
+
await pipeChat(uiStream, {
|
|
4309
|
+
signal: combinedSignal,
|
|
4310
|
+
spanName: "stream response",
|
|
4311
|
+
});
|
|
4258
4312
|
}
|
|
4259
4313
|
}
|
|
4260
4314
|
catch (error) {
|
|
@@ -4289,7 +4343,8 @@ function chatAgent(options) {
|
|
|
4289
4343
|
// never reports final usage), which would block the turn loop
|
|
4290
4344
|
// from ever firing onTurnComplete / writeTurnComplete.
|
|
4291
4345
|
let turnUsage;
|
|
4292
|
-
if (runResult != null &&
|
|
4346
|
+
if (runResult != null &&
|
|
4347
|
+
typeof runResult.totalUsage?.then === "function") {
|
|
4293
4348
|
try {
|
|
4294
4349
|
turnUsage = (await Promise.race([
|
|
4295
4350
|
runResult.totalUsage,
|
|
@@ -4375,7 +4430,10 @@ function chatAgent(options) {
|
|
|
4375
4430
|
// may produce a message with an empty ID since IDs are normally
|
|
4376
4431
|
// assigned by the frontend's useChat).
|
|
4377
4432
|
if (!capturedResponseMessage.id) {
|
|
4378
|
-
capturedResponseMessage = {
|
|
4433
|
+
capturedResponseMessage = {
|
|
4434
|
+
...capturedResponseMessage,
|
|
4435
|
+
id: generateMessageId(),
|
|
4436
|
+
};
|
|
4379
4437
|
}
|
|
4380
4438
|
// Append any non-transient data parts queued via chat.response or writer.write()
|
|
4381
4439
|
const queuedParts = locals.get(chatResponsePartsKey);
|
|
@@ -4676,7 +4734,9 @@ function chatAgent(options) {
|
|
|
4676
4734
|
? { "gen_ai.usage.total_tokens": turnUsage.totalTokens }
|
|
4677
4735
|
: {}),
|
|
4678
4736
|
...(cumulativeUsage.totalTokens != null
|
|
4679
|
-
? {
|
|
4737
|
+
? {
|
|
4738
|
+
"gen_ai.usage.cumulative_total_tokens": cumulativeUsage.totalTokens,
|
|
4739
|
+
}
|
|
4680
4740
|
: {}),
|
|
4681
4741
|
},
|
|
4682
4742
|
});
|
|
@@ -4708,9 +4768,7 @@ function chatAgent(options) {
|
|
|
4708
4768
|
savedAt: Date.now(),
|
|
4709
4769
|
messages: accumulatedUIMessages,
|
|
4710
4770
|
lastOutEventId: turnCompleteResult?.lastEventId,
|
|
4711
|
-
lastInEventId: snapshotInCursor !== undefined
|
|
4712
|
-
? String(snapshotInCursor)
|
|
4713
|
-
: undefined,
|
|
4771
|
+
lastInEventId: snapshotInCursor !== undefined ? String(snapshotInCursor) : undefined,
|
|
4714
4772
|
});
|
|
4715
4773
|
}, {
|
|
4716
4774
|
attributes: {
|
|
@@ -4752,8 +4810,7 @@ function chatAgent(options) {
|
|
|
4752
4810
|
// chat.requestUpgrade() was called — exit the loop so the
|
|
4753
4811
|
// transport triggers a new run on the latest version.
|
|
4754
4812
|
// chat.endRun() — same exit, no upgrade semantics.
|
|
4755
|
-
if (locals.get(chatUpgradeRequestedKey) ||
|
|
4756
|
-
locals.get(chatEndRunRequestedKey)) {
|
|
4813
|
+
if (locals.get(chatUpgradeRequestedKey) || locals.get(chatEndRunRequestedKey)) {
|
|
4757
4814
|
return "exit";
|
|
4758
4815
|
}
|
|
4759
4816
|
// Wait for the next message — stay idle briefly, then suspend
|
|
@@ -4833,7 +4890,9 @@ function chatAgent(options) {
|
|
|
4833
4890
|
// Turn error handler: write an error chunk + turn-complete to the stream
|
|
4834
4891
|
// so the client sees the error, then wait for the next message instead
|
|
4835
4892
|
// of killing the entire run. This keeps the conversation alive.
|
|
4836
|
-
if (turnError instanceof Error &&
|
|
4893
|
+
if (turnError instanceof Error &&
|
|
4894
|
+
turnError.name === "AbortError" &&
|
|
4895
|
+
runSignal.aborted) {
|
|
4837
4896
|
// Full run cancellation — exit immediately
|
|
4838
4897
|
throw turnError;
|
|
4839
4898
|
}
|
|
@@ -4929,9 +4988,7 @@ function chatAgent(options) {
|
|
|
4929
4988
|
savedAt: Date.now(),
|
|
4930
4989
|
messages: erroredUIMessages,
|
|
4931
4990
|
lastOutEventId: errorTurnCompleteResult?.lastEventId,
|
|
4932
|
-
lastInEventId: errorSnapshotInCursor !== undefined
|
|
4933
|
-
? String(errorSnapshotInCursor)
|
|
4934
|
-
: undefined,
|
|
4991
|
+
lastInEventId: errorSnapshotInCursor !== undefined ? String(errorSnapshotInCursor) : undefined,
|
|
4935
4992
|
});
|
|
4936
4993
|
}
|
|
4937
4994
|
catch (error) {
|
|
@@ -4942,8 +4999,7 @@ function chatAgent(options) {
|
|
|
4942
4999
|
}
|
|
4943
5000
|
}
|
|
4944
5001
|
// chat.requestUpgrade() / chat.endRun() — exit after error turn too
|
|
4945
|
-
if (locals.get(chatUpgradeRequestedKey) ||
|
|
4946
|
-
locals.get(chatEndRunRequestedKey)) {
|
|
5002
|
+
if (locals.get(chatUpgradeRequestedKey) || locals.get(chatEndRunRequestedKey)) {
|
|
4947
5003
|
return;
|
|
4948
5004
|
}
|
|
4949
5005
|
// Drain remaining recovered turns before idling — a thrown
|
|
@@ -4976,7 +5032,7 @@ function chatAgent(options) {
|
|
|
4976
5032
|
// cleanup so a missing subscription doesn't throw.
|
|
4977
5033
|
stopSub?.off();
|
|
4978
5034
|
}
|
|
4979
|
-
}
|
|
5035
|
+
},
|
|
4980
5036
|
});
|
|
4981
5037
|
// Register clientDataSchema so the CLI converts it to JSONSchema
|
|
4982
5038
|
// and stores it as payloadSchema — used by the Playground UI
|
|
@@ -5068,7 +5124,7 @@ function createChatBuilder(config) {
|
|
|
5068
5124
|
agent(options) {
|
|
5069
5125
|
const mergedUiStream = config.uiStreamOptions && options.uiMessageStreamOptions
|
|
5070
5126
|
? { ...config.uiStreamOptions, ...options.uiMessageStreamOptions }
|
|
5071
|
-
: options.uiMessageStreamOptions ?? config.uiStreamOptions;
|
|
5127
|
+
: (options.uiMessageStreamOptions ?? config.uiStreamOptions);
|
|
5072
5128
|
return chatAgent({
|
|
5073
5129
|
...options,
|
|
5074
5130
|
...(config.clientDataSchema ? { clientDataSchema: config.clientDataSchema } : {}),
|
|
@@ -5896,7 +5952,9 @@ function createChatSession(payload, options) {
|
|
|
5896
5952
|
if (turn === 0 && currentPayload.trigger === "handover-prepare") {
|
|
5897
5953
|
const signal = await waitForHandover({
|
|
5898
5954
|
payload: currentPayload,
|
|
5899
|
-
idleTimeoutInSeconds: sessionIdleTimeoutOpt ??
|
|
5955
|
+
idleTimeoutInSeconds: sessionIdleTimeoutOpt ??
|
|
5956
|
+
currentPayload.idleTimeoutInSeconds ??
|
|
5957
|
+
idleTimeoutInSeconds,
|
|
5900
5958
|
timeout,
|
|
5901
5959
|
});
|
|
5902
5960
|
if (!signal || signal.kind === "handover-skip" || runSignal.aborted) {
|
|
@@ -5915,7 +5973,8 @@ function createChatSession(payload, options) {
|
|
|
5915
5973
|
// arrive with the sticky boot-payload fields stripped, so running
|
|
5916
5974
|
// a turn immediately would invoke the model with no user input.
|
|
5917
5975
|
const isMessagelessContinuationBoot = currentPayload.continuation === true && !currentPayload.message;
|
|
5918
|
-
if (turn === 0 &&
|
|
5976
|
+
if (turn === 0 &&
|
|
5977
|
+
(currentPayload.trigger === "preload" || isMessagelessContinuationBoot)) {
|
|
5919
5978
|
const result = await messagesInput.waitWithIdleTimeout({
|
|
5920
5979
|
idleTimeoutInSeconds: sessionIdleTimeoutOpt ?? currentPayload.idleTimeoutInSeconds ?? 30,
|
|
5921
5980
|
timeout,
|
|
@@ -5939,8 +5998,7 @@ function createChatSession(payload, options) {
|
|
|
5939
5998
|
// Subsequent turns: wait for the next message
|
|
5940
5999
|
if (turn > 0) {
|
|
5941
6000
|
// chat.requestUpgrade() / chat.endRun() — exit before waiting
|
|
5942
|
-
if (locals.get(chatUpgradeRequestedKey) ||
|
|
5943
|
-
locals.get(chatEndRunRequestedKey)) {
|
|
6001
|
+
if (locals.get(chatUpgradeRequestedKey) || locals.get(chatEndRunRequestedKey)) {
|
|
5944
6002
|
stop.cleanup();
|
|
5945
6003
|
return { done: true, value: undefined };
|
|
5946
6004
|
}
|
|
@@ -6187,7 +6245,8 @@ function createChatSession(payload, options) {
|
|
|
6187
6245
|
},
|
|
6188
6246
|
];
|
|
6189
6247
|
if (sessionCompaction.compactUIMessages) {
|
|
6190
|
-
accumulator.uiMessages =
|
|
6248
|
+
accumulator.uiMessages =
|
|
6249
|
+
await sessionCompaction.compactUIMessages(compactEvent);
|
|
6191
6250
|
}
|
|
6192
6251
|
}
|
|
6193
6252
|
}
|
|
@@ -6199,7 +6258,10 @@ function createChatSession(payload, options) {
|
|
|
6199
6258
|
// Append any non-transient data parts queued via chat.response or writer.write()
|
|
6200
6259
|
const queuedParts = locals.get(chatResponsePartsKey);
|
|
6201
6260
|
if (queuedParts && queuedParts.length > 0) {
|
|
6202
|
-
response = {
|
|
6261
|
+
response = {
|
|
6262
|
+
...response,
|
|
6263
|
+
parts: [...(response.parts ?? []), ...queuedParts],
|
|
6264
|
+
};
|
|
6203
6265
|
locals.set(chatResponsePartsKey, []);
|
|
6204
6266
|
}
|
|
6205
6267
|
await accumulator.addResponse(response);
|
|
@@ -6468,6 +6530,12 @@ function createChatStartSessionAction(taskId, options) {
|
|
|
6468
6530
|
if (!params.chatId) {
|
|
6469
6531
|
throw new Error("chat.createStartSessionAction: params.chatId is required — used as the session externalId.");
|
|
6470
6532
|
}
|
|
6533
|
+
// Scope the action to `apiClient`'s env: re-enter without it so the body
|
|
6534
|
+
// runs once, under that config (read via apiClientManager.accessToken/.baseURL).
|
|
6535
|
+
if (options?.apiClient) {
|
|
6536
|
+
const { apiClient, ...rest } = options;
|
|
6537
|
+
return apiClientManager.runWithConfig(apiClient, () => createChatStartSessionAction(taskId, rest)(params));
|
|
6538
|
+
}
|
|
6471
6539
|
// The first run boots before the user's first message lands on
|
|
6472
6540
|
// `.in/append`, so it sees an empty `messages` array and `trigger:
|
|
6473
6541
|
// "preload"`. This matches the pre-Sessions preload semantics:
|
|
@@ -6575,9 +6643,7 @@ function createChatStartSessionAction(taskId, options) {
|
|
|
6575
6643
|
}
|
|
6576
6644
|
function resolveChatStartBaseURL(endpoint, chatId, option) {
|
|
6577
6645
|
const fallback = apiClientManager.baseURL ?? "https://api.trigger.dev";
|
|
6578
|
-
const raw = typeof option === "function"
|
|
6579
|
-
? option({ endpoint, chatId })
|
|
6580
|
-
: option ?? fallback;
|
|
6646
|
+
const raw = typeof option === "function" ? option({ endpoint, chatId }) : (option ?? fallback);
|
|
6581
6647
|
return raw.replace(/\/$/, "");
|
|
6582
6648
|
}
|
|
6583
6649
|
function overrideRequestHeaders(accessToken) {
|