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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/commonjs/v3/agentSkillsRuntime.d.ts +28 -0
  2. package/dist/commonjs/v3/agentSkillsRuntime.js +163 -0
  3. package/dist/commonjs/v3/agentSkillsRuntime.js.map +1 -0
  4. package/dist/commonjs/v3/ai-shared.d.ts +173 -0
  5. package/dist/commonjs/v3/ai-shared.js +25 -0
  6. package/dist/commonjs/v3/ai-shared.js.map +1 -0
  7. package/dist/commonjs/v3/ai.d.ts +2823 -5
  8. package/dist/commonjs/v3/ai.js +6197 -13
  9. package/dist/commonjs/v3/ai.js.map +1 -1
  10. package/dist/commonjs/v3/auth.d.ts +9 -0
  11. package/dist/commonjs/v3/auth.js.map +1 -1
  12. package/dist/commonjs/v3/chat-client.d.ts +301 -0
  13. package/dist/commonjs/v3/chat-client.js +624 -0
  14. package/dist/commonjs/v3/chat-client.js.map +1 -0
  15. package/dist/commonjs/v3/chat-react.d.ts +155 -0
  16. package/dist/commonjs/v3/chat-react.js +330 -0
  17. package/dist/commonjs/v3/chat-react.js.map +1 -0
  18. package/dist/commonjs/v3/chat-server.d.ts +206 -0
  19. package/dist/commonjs/v3/chat-server.js +737 -0
  20. package/dist/commonjs/v3/chat-server.js.map +1 -0
  21. package/dist/commonjs/v3/chat-server.test.d.ts +1 -0
  22. package/dist/commonjs/v3/chat-server.test.js +518 -0
  23. package/dist/commonjs/v3/chat-server.test.js.map +1 -0
  24. package/dist/commonjs/v3/chat-tab-coordinator.d.ts +65 -0
  25. package/dist/commonjs/v3/chat-tab-coordinator.js +235 -0
  26. package/dist/commonjs/v3/chat-tab-coordinator.js.map +1 -0
  27. package/dist/commonjs/v3/chat-tab-coordinator.test.d.ts +1 -0
  28. package/dist/commonjs/v3/chat-tab-coordinator.test.js +140 -0
  29. package/dist/commonjs/v3/chat-tab-coordinator.test.js.map +1 -0
  30. package/dist/commonjs/v3/chat.d.ts +437 -0
  31. package/dist/commonjs/v3/chat.js +968 -0
  32. package/dist/commonjs/v3/chat.js.map +1 -0
  33. package/dist/commonjs/v3/chat.test.d.ts +1 -0
  34. package/dist/commonjs/v3/chat.test.js +1180 -0
  35. package/dist/commonjs/v3/chat.test.js.map +1 -0
  36. package/dist/commonjs/v3/createStartSessionAction.test.d.ts +1 -0
  37. package/dist/commonjs/v3/createStartSessionAction.test.js +113 -0
  38. package/dist/commonjs/v3/createStartSessionAction.test.js.map +1 -0
  39. package/dist/commonjs/v3/deployments.d.ts +26 -0
  40. package/dist/commonjs/v3/deployments.js +37 -0
  41. package/dist/commonjs/v3/deployments.js.map +1 -0
  42. package/dist/commonjs/v3/index.d.ts +6 -3
  43. package/dist/commonjs/v3/index.js +7 -1
  44. package/dist/commonjs/v3/index.js.map +1 -1
  45. package/dist/commonjs/v3/runs.d.ts +22 -7
  46. package/dist/commonjs/v3/runs.js +1 -0
  47. package/dist/commonjs/v3/runs.js.map +1 -1
  48. package/dist/commonjs/v3/sessions.d.ts +228 -0
  49. package/dist/commonjs/v3/sessions.js +664 -0
  50. package/dist/commonjs/v3/sessions.js.map +1 -0
  51. package/dist/commonjs/v3/sessions.test.d.ts +1 -0
  52. package/dist/commonjs/v3/sessions.test.js +154 -0
  53. package/dist/commonjs/v3/sessions.test.js.map +1 -0
  54. package/dist/commonjs/v3/shared.d.ts +24 -2
  55. package/dist/commonjs/v3/shared.js +189 -1
  56. package/dist/commonjs/v3/shared.js.map +1 -1
  57. package/dist/commonjs/v3/skill.d.ts +99 -0
  58. package/dist/commonjs/v3/skill.js +155 -0
  59. package/dist/commonjs/v3/skill.js.map +1 -0
  60. package/dist/commonjs/v3/skills.d.ts +2 -0
  61. package/dist/commonjs/v3/skills.js +6 -0
  62. package/dist/commonjs/v3/skills.js.map +1 -0
  63. package/dist/commonjs/v3/streams.js +127 -19
  64. package/dist/commonjs/v3/streams.js.map +1 -1
  65. package/dist/commonjs/v3/tasks.d.ts +2 -1
  66. package/dist/commonjs/v3/tasks.js +1 -0
  67. package/dist/commonjs/v3/tasks.js.map +1 -1
  68. package/dist/commonjs/v3/test/index.d.ts +3 -0
  69. package/dist/commonjs/v3/test/index.js +18 -0
  70. package/dist/commonjs/v3/test/index.js.map +1 -0
  71. package/dist/commonjs/v3/test/mock-chat-agent.d.ts +259 -0
  72. package/dist/commonjs/v3/test/mock-chat-agent.js +468 -0
  73. package/dist/commonjs/v3/test/mock-chat-agent.js.map +1 -0
  74. package/dist/commonjs/v3/test/setup-catalog.d.ts +1 -0
  75. package/dist/commonjs/v3/test/setup-catalog.js +18 -0
  76. package/dist/commonjs/v3/test/setup-catalog.js.map +1 -0
  77. package/dist/commonjs/v3/test/test-session-handle.d.ts +53 -0
  78. package/dist/commonjs/v3/test/test-session-handle.js +256 -0
  79. package/dist/commonjs/v3/test/test-session-handle.js.map +1 -0
  80. package/dist/commonjs/version.js +1 -1
  81. package/dist/esm/v3/agentSkillsRuntime.d.ts +28 -0
  82. package/dist/esm/v3/agentSkillsRuntime.js +136 -0
  83. package/dist/esm/v3/agentSkillsRuntime.js.map +1 -0
  84. package/dist/esm/v3/ai-shared.d.ts +173 -0
  85. package/dist/esm/v3/ai-shared.js +22 -0
  86. package/dist/esm/v3/ai-shared.js.map +1 -0
  87. package/dist/esm/v3/ai.d.ts +2823 -5
  88. package/dist/esm/v3/ai.js +6187 -14
  89. package/dist/esm/v3/ai.js.map +1 -1
  90. package/dist/esm/v3/auth.d.ts +9 -0
  91. package/dist/esm/v3/auth.js.map +1 -1
  92. package/dist/esm/v3/chat-client.d.ts +301 -0
  93. package/dist/esm/v3/chat-client.js +619 -0
  94. package/dist/esm/v3/chat-client.js.map +1 -0
  95. package/dist/esm/v3/chat-react.d.ts +155 -0
  96. package/dist/esm/v3/chat-react.js +325 -0
  97. package/dist/esm/v3/chat-react.js.map +1 -0
  98. package/dist/esm/v3/chat-server.d.ts +206 -0
  99. package/dist/esm/v3/chat-server.js +734 -0
  100. package/dist/esm/v3/chat-server.js.map +1 -0
  101. package/dist/esm/v3/chat-server.test.d.ts +1 -0
  102. package/dist/esm/v3/chat-server.test.js +516 -0
  103. package/dist/esm/v3/chat-server.test.js.map +1 -0
  104. package/dist/esm/v3/chat-tab-coordinator.d.ts +65 -0
  105. package/dist/esm/v3/chat-tab-coordinator.js +231 -0
  106. package/dist/esm/v3/chat-tab-coordinator.js.map +1 -0
  107. package/dist/esm/v3/chat-tab-coordinator.test.d.ts +1 -0
  108. package/dist/esm/v3/chat-tab-coordinator.test.js +138 -0
  109. package/dist/esm/v3/chat-tab-coordinator.test.js.map +1 -0
  110. package/dist/esm/v3/chat.d.ts +437 -0
  111. package/dist/esm/v3/chat.js +961 -0
  112. package/dist/esm/v3/chat.js.map +1 -0
  113. package/dist/esm/v3/chat.test.d.ts +1 -0
  114. package/dist/esm/v3/chat.test.js +1178 -0
  115. package/dist/esm/v3/chat.test.js.map +1 -0
  116. package/dist/esm/v3/createStartSessionAction.test.d.ts +1 -0
  117. package/dist/esm/v3/createStartSessionAction.test.js +111 -0
  118. package/dist/esm/v3/createStartSessionAction.test.js.map +1 -0
  119. package/dist/esm/v3/deployments.d.ts +26 -0
  120. package/dist/esm/v3/deployments.js +34 -0
  121. package/dist/esm/v3/deployments.js.map +1 -0
  122. package/dist/esm/v3/index.d.ts +6 -3
  123. package/dist/esm/v3/index.js +4 -1
  124. package/dist/esm/v3/index.js.map +1 -1
  125. package/dist/esm/v3/runs.d.ts +15 -0
  126. package/dist/esm/v3/runs.js +1 -0
  127. package/dist/esm/v3/runs.js.map +1 -1
  128. package/dist/esm/v3/sessions.d.ts +228 -0
  129. package/dist/esm/v3/sessions.js +656 -0
  130. package/dist/esm/v3/sessions.js.map +1 -0
  131. package/dist/esm/v3/sessions.test.d.ts +1 -0
  132. package/dist/esm/v3/sessions.test.js +152 -0
  133. package/dist/esm/v3/sessions.test.js.map +1 -0
  134. package/dist/esm/v3/shared.d.ts +24 -2
  135. package/dist/esm/v3/shared.js +188 -1
  136. package/dist/esm/v3/shared.js.map +1 -1
  137. package/dist/esm/v3/skill.d.ts +99 -0
  138. package/dist/esm/v3/skill.js +128 -0
  139. package/dist/esm/v3/skill.js.map +1 -0
  140. package/dist/esm/v3/skills.d.ts +2 -0
  141. package/dist/esm/v3/skills.js +2 -0
  142. package/dist/esm/v3/skills.js.map +1 -0
  143. package/dist/esm/v3/streams.js +127 -20
  144. package/dist/esm/v3/streams.js.map +1 -1
  145. package/dist/esm/v3/tasks.d.ts +2 -1
  146. package/dist/esm/v3/tasks.js +2 -1
  147. package/dist/esm/v3/tasks.js.map +1 -1
  148. package/dist/esm/v3/test/index.d.ts +3 -0
  149. package/dist/esm/v3/test/index.js +13 -0
  150. package/dist/esm/v3/test/index.js.map +1 -0
  151. package/dist/esm/v3/test/mock-chat-agent.d.ts +259 -0
  152. package/dist/esm/v3/test/mock-chat-agent.js +465 -0
  153. package/dist/esm/v3/test/mock-chat-agent.js.map +1 -0
  154. package/dist/esm/v3/test/setup-catalog.d.ts +1 -0
  155. package/dist/esm/v3/test/setup-catalog.js +16 -0
  156. package/dist/esm/v3/test/setup-catalog.js.map +1 -0
  157. package/dist/esm/v3/test/test-session-handle.d.ts +53 -0
  158. package/dist/esm/v3/test/test-session-handle.js +251 -0
  159. package/dist/esm/v3/test/test-session-handle.js.map +1 -0
  160. package/dist/esm/version.js +1 -1
  161. package/package.json +87 -6
@@ -0,0 +1,28 @@
1
+ export type BashSkillInput = {
2
+ /** Absolute path to the skill's root (used as `cwd`). */
3
+ skillPath: string;
4
+ /** The bash command to run. */
5
+ command: string;
6
+ /** Optional abort signal forwarded to `spawn()`. */
7
+ abortSignal?: AbortSignal;
8
+ };
9
+ export type BashSkillResult = {
10
+ exitCode: number | null;
11
+ stdout: string;
12
+ stderr: string;
13
+ } | {
14
+ error: string;
15
+ };
16
+ export type ReadFileInSkillInput = {
17
+ /** Absolute path to the skill's root — the relative path must resolve inside it. */
18
+ skillPath: string;
19
+ /** Relative path the tool caller supplied. */
20
+ relativePath: string;
21
+ };
22
+ export type ReadFileInSkillResult = {
23
+ content: string;
24
+ } | {
25
+ error: string;
26
+ };
27
+ export declare function readFileInSkill({ skillPath, relativePath, }: ReadFileInSkillInput): Promise<ReadFileInSkillResult>;
28
+ export declare function runBashInSkill({ skillPath, command, abortSignal, }: BashSkillInput): Promise<BashSkillResult>;
@@ -0,0 +1,163 @@
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
+ exports.readFileInSkill = readFileInSkill;
27
+ exports.runBashInSkill = runBashInSkill;
28
+ const node_child_process_1 = require("node:child_process");
29
+ const fs = __importStar(require("node:fs/promises"));
30
+ const nodePath = __importStar(require("node:path"));
31
+ /**
32
+ * Server-only runtime for the auto-injected skill tools
33
+ * (`loadSkill` / `readFile` / `bash`) that `chat.agent({ skills })`
34
+ * wires up. Split off from `./ai.ts` so the chat-agent surface in
35
+ * `@trigger.dev/sdk/ai` stays importable from client bundles —
36
+ * Next.js + Webpack reject top-level `node:*` imports anywhere in a
37
+ * client graph, even when a consumer only pulls in types.
38
+ *
39
+ * The SDK's `ai.ts` loads this module via a computed-string dynamic
40
+ * import inside each tool's `execute` — webpack treats the
41
+ * expression as an unknown dependency and skips static tracing, so
42
+ * the node-only symbols here never surface in a client build. The
43
+ * module resolves fine at runtime on a server worker because the
44
+ * relative path (`./agentSkillsRuntime.js`) lands next to `ai.js` in
45
+ * the emitted dist.
46
+ *
47
+ * Public subpath: `@trigger.dev/sdk/ai/skills-runtime`. Customers
48
+ * who want to eagerly bundle the runtime server-side (e.g. warming
49
+ * it on worker bootstrap) can import from there.
50
+ */
51
+ const DEFAULT_BASH_OUTPUT_BYTES = 64 * 1024;
52
+ const DEFAULT_READ_FILE_BYTES = 1024 * 1024;
53
+ function truncate(s, limit) {
54
+ if (s.length <= limit)
55
+ return s;
56
+ return s.slice(0, limit) + `\n…[truncated ${s.length - limit} bytes]`;
57
+ }
58
+ /**
59
+ * Path-traversal guard: confirm `relative` resolves inside `root`,
60
+ * even after symlinks are followed. Throws if it escapes via `..`, an
61
+ * absolute prefix, or a symlink that points outside. Returns the
62
+ * resolved real path.
63
+ *
64
+ * `fs.realpath` only works on paths that exist, so when the resolved
65
+ * path doesn't exist yet (e.g. writing a new file) we fall back to
66
+ * the lexical check — a non-existent path can't traverse a symlink
67
+ * to escape since the symlink doesn't exist either.
68
+ */
69
+ async function safeJoinInside(root, relative) {
70
+ if (nodePath.isAbsolute(relative)) {
71
+ throw new Error(`Path must be relative to the skill directory: ${relative}`);
72
+ }
73
+ const realRoot = await fs.realpath(nodePath.resolve(root));
74
+ const resolved = nodePath.resolve(realRoot, relative);
75
+ let real = resolved;
76
+ try {
77
+ real = await fs.realpath(resolved);
78
+ }
79
+ catch (err) {
80
+ if (err.code !== "ENOENT") {
81
+ throw err;
82
+ }
83
+ // Path doesn't exist yet; fall through with the lexical resolve.
84
+ }
85
+ const normalized = realRoot + nodePath.sep;
86
+ if (real !== realRoot && !real.startsWith(normalized)) {
87
+ throw new Error(`Path escapes the skill directory: ${relative}`);
88
+ }
89
+ return real;
90
+ }
91
+ async function readFileInSkill({ skillPath, relativePath, }) {
92
+ let absolute;
93
+ try {
94
+ absolute = await safeJoinInside(skillPath, relativePath);
95
+ }
96
+ catch (err) {
97
+ return { error: err.message };
98
+ }
99
+ try {
100
+ const content = await fs.readFile(absolute, "utf8");
101
+ return { content: truncate(content, DEFAULT_READ_FILE_BYTES) };
102
+ }
103
+ catch (err) {
104
+ return { error: err.message };
105
+ }
106
+ }
107
+ async function runBashInSkill({ skillPath, command, abortSignal, }) {
108
+ return new Promise((resolvePromise) => {
109
+ let child;
110
+ try {
111
+ child = (0, node_child_process_1.spawn)("bash", ["-c", command], {
112
+ cwd: skillPath,
113
+ signal: abortSignal,
114
+ });
115
+ }
116
+ catch (err) {
117
+ resolvePromise({ error: err.message });
118
+ return;
119
+ }
120
+ // Cap stdout/stderr accumulation at the byte budget so an
121
+ // LLM-generated command (`cat /dev/zero`, `yes`) can't OOM the
122
+ // worker. Track total seen length separately so the truncation
123
+ // notice still reports how much was dropped.
124
+ let stdout = "";
125
+ let stderr = "";
126
+ let stdoutSeen = 0;
127
+ let stderrSeen = 0;
128
+ const limit = DEFAULT_BASH_OUTPUT_BYTES;
129
+ child.stdout?.on("data", (chunk) => {
130
+ const text = chunk.toString();
131
+ stdoutSeen += text.length;
132
+ if (stdout.length >= limit)
133
+ return;
134
+ const remaining = limit - stdout.length;
135
+ stdout += text.length > remaining ? text.slice(0, remaining) : text;
136
+ });
137
+ child.stderr?.on("data", (chunk) => {
138
+ const text = chunk.toString();
139
+ stderrSeen += text.length;
140
+ if (stderr.length >= limit)
141
+ return;
142
+ const remaining = limit - stderr.length;
143
+ stderr += text.length > remaining ? text.slice(0, remaining) : text;
144
+ });
145
+ child.once("close", (code) => {
146
+ const stdoutFinal = stdoutSeen > stdout.length
147
+ ? `${stdout}\n…[truncated ${stdoutSeen - stdout.length} bytes]`
148
+ : stdout;
149
+ const stderrFinal = stderrSeen > stderr.length
150
+ ? `${stderr}\n…[truncated ${stderrSeen - stderr.length} bytes]`
151
+ : stderr;
152
+ resolvePromise({
153
+ exitCode: code,
154
+ stdout: stdoutFinal,
155
+ stderr: stderrFinal,
156
+ });
157
+ });
158
+ child.once("error", (err) => {
159
+ resolvePromise({ error: err.message });
160
+ });
161
+ });
162
+ }
163
+ //# sourceMappingURL=agentSkillsRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentSkillsRuntime.js","sourceRoot":"","sources":["../../../src/v3/agentSkillsRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Browser-safe primitives shared between `@trigger.dev/sdk/ai` (server) and
3
+ * `@trigger.dev/sdk/chat` / `@trigger.dev/sdk/chat/react` (client).
4
+ *
5
+ * This module exists to keep `ai.ts` reachable only from the server graph.
6
+ * `ai.ts` weighs in at ~7000 lines and statically imports the agent-skills
7
+ * runtime (which uses `node:child_process` / `node:fs/promises`). When a
8
+ * browser bundle imports a runtime value from `ai.ts` — historically the
9
+ * `PENDING_MESSAGE_INJECTED_TYPE` constant in `chat-react.ts` — the bundler
10
+ * traces `ai.ts`'s entire module graph into the client chunk and hits the
11
+ * `node:` builtins, which Turbopack rejects outright (and webpack flags as
12
+ * a "Critical dependency" warning).
13
+ *
14
+ * Anything in this file MUST stay free of `node:*` imports and free of any
15
+ * import from `ai.ts`.
16
+ */
17
+ import type { Task, AnyTask } from "@trigger.dev/core/v3";
18
+ import type { ModelMessage, UIMessage } from "ai";
19
+ /**
20
+ * Message-part `type` value for the pending-message data part the agent
21
+ * injects when a follow-up message arrives mid-turn.
22
+ */
23
+ export declare const PENDING_MESSAGE_INJECTED_TYPE: "data-pending-message-injected";
24
+ /**
25
+ * The wire payload shape sent by `TriggerChatTransport`.
26
+ * Uses `metadata` to match the AI SDK's `ChatRequestOptions` field name.
27
+ *
28
+ * Slim wire: at most ONE message per record. The agent runtime
29
+ * reconstructs prior history at run boot from a durable S3 snapshot +
30
+ * `session.out` replay (or `hydrateMessages` if registered). The wire is
31
+ * delta-only — see plan `vivid-humming-bonbon.md`.
32
+ */
33
+ export type ChatTaskWirePayload<TMessage extends UIMessage = UIMessage, TMetadata = unknown> = {
34
+ /**
35
+ * The single message being delivered on this trigger. Set for:
36
+ * - `submit-message`: the new user message OR a tool-approval-responded
37
+ * assistant message (with `state: "approval-responded"` tool parts).
38
+ * - `regenerate-message`: omitted (the agent slices its own history).
39
+ * - `preload` / `close` / `action`: omitted.
40
+ * - `handover-prepare`: omitted (use `headStartMessages` instead).
41
+ */
42
+ message?: TMessage;
43
+ /**
44
+ * Bespoke escape hatch for `chat.headStart`. The customer's HTTP route
45
+ * handler ships full `UIMessage[]` history at the very first turn — before
46
+ * any snapshot exists. The route handler isn't subject to the
47
+ * `MAX_APPEND_BODY_BYTES` cap on `/in/append` because it goes through the
48
+ * customer's own HTTP endpoint. Used ONLY by `trigger: "handover-prepare"`.
49
+ * Ignored on every other trigger.
50
+ */
51
+ headStartMessages?: TMessage[];
52
+ chatId: string;
53
+ trigger: "submit-message" | "regenerate-message" | "preload" | "close" | "action"
54
+ /**
55
+ * The customer's `chat.handover` route handler kicked us off in
56
+ * parallel with the first-turn `streamText` running in the warm
57
+ * Next.js process. The run sits idle on `session.in` waiting for
58
+ * a `kind: "handover"` (continue from tool execution) or
59
+ * `kind: "handover-skip"` (handler finished pure-text, exit
60
+ * cleanly). See `chat.handover` in `@trigger.dev/sdk/chat-server`.
61
+ */
62
+ | "handover-prepare";
63
+ messageId?: string;
64
+ metadata?: TMetadata;
65
+ /** Custom action payload when `trigger` is `"action"`. Validated against `actionSchema` on the backend. */
66
+ action?: unknown;
67
+ /** Whether this run is continuing an existing chat whose previous run ended. */
68
+ continuation?: boolean;
69
+ /** The run ID of the previous run (only set when `continuation` is true). */
70
+ previousRunId?: string;
71
+ /** Override idle timeout for this run (seconds). Set by transport.preload(). */
72
+ idleTimeoutInSeconds?: number;
73
+ /**
74
+ * The friendlyId of the Session primitive backing this chat. The
75
+ * transport opens (or lazy-creates) the session with
76
+ * `externalId = chatId` on first message, then sends this friendlyId
77
+ * through to the run so the agent can attach to `.in` / `.out`
78
+ * without needing to round-trip through the control plane again.
79
+ * Optional for backward-compat while the migration is in flight;
80
+ * required once the legacy run-scoped stream path is removed.
81
+ */
82
+ sessionId?: string;
83
+ };
84
+ /**
85
+ * One chunk on the chat input stream. `kind` discriminates the variants —
86
+ * a single ordered stream now carries all the signals the old three-stream
87
+ * split did (`chat-messages`, `chat-stop`, plus action messages piggybacked
88
+ * on `chat-messages`).
89
+ */
90
+ export type ChatInputChunk<TMessage extends UIMessage = UIMessage, TMetadata = unknown> = {
91
+ kind: "message";
92
+ /**
93
+ * Full wire payload for a new user message or regeneration. Mirrors
94
+ * what the legacy `chat-messages` input stream carried.
95
+ */
96
+ payload: ChatTaskWirePayload<TMessage, TMetadata>;
97
+ } | {
98
+ kind: "stop";
99
+ /** Optional human-readable reason. Maps to the legacy `chat-stop` record. */
100
+ message?: string;
101
+ } | {
102
+ /**
103
+ * Sent by `chat.headStart` when the customer's first-turn
104
+ * `streamText` finishes. The agent run (currently parked in
105
+ * `handover-prepare`) wakes, seeds its accumulators with
106
+ * `partialAssistantMessage`, and runs the normal turn loop
107
+ * (`onChatStart` → `onTurnStart` → … → `onTurnComplete`).
108
+ *
109
+ * What happens after that depends on `isFinal`:
110
+ *
111
+ * - `isFinal: false` — step 1 ended with `finishReason:
112
+ * "tool-calls"`. The partial carries the assistant's
113
+ * tool-call(s) wrapped in AI SDK's tool-approval round. The
114
+ * agent's `streamText` runs the approved tools and continues
115
+ * from step 2.
116
+ * - `isFinal: true` — step 1 ended pure-text (no tool calls).
117
+ * The partial carries the final assistant text. The agent
118
+ * skips the LLM call entirely (the response is already
119
+ * complete on the customer side) and runs `onTurnComplete`
120
+ * with the partial as `responseMessage` so persistence and
121
+ * any post-turn work fire normally.
122
+ */
123
+ kind: "handover";
124
+ /** Customer's step-1 response messages (ModelMessage form). */
125
+ partialAssistantMessage: ModelMessage[];
126
+ /**
127
+ * The UI messageId the customer's handler used for its step-1
128
+ * assistant message. The agent reuses this so any post-handover
129
+ * chunks (tool-output-available, step-2 text, data-* parts
130
+ * written by hooks) merge into the SAME assistant message on
131
+ * the browser side instead of starting a new one.
132
+ */
133
+ messageId?: string;
134
+ /**
135
+ * Whether the customer's step 1 is the final response. See
136
+ * `kind` description above for the two branches.
137
+ */
138
+ isFinal: boolean;
139
+ } | {
140
+ /**
141
+ * Sent by `chat.headStart` only when the customer's handler
142
+ * ABORTS before producing a finishReason (e.g., dispatch error,
143
+ * stream cancelled before any tokens). The agent run exits
144
+ * cleanly without firing turn hooks. Normal pure-text and
145
+ * tool-call finishes go through `kind: "handover"` with the
146
+ * appropriate `isFinal` flag.
147
+ */
148
+ kind: "handover-skip";
149
+ };
150
+ /**
151
+ * Extracts the client-data (`metadata`) type from a chat task.
152
+ *
153
+ * @example
154
+ * ```ts
155
+ * import type { InferChatClientData } from "@trigger.dev/sdk/ai";
156
+ * import type { myChat } from "@/trigger/chat";
157
+ *
158
+ * type MyClientData = InferChatClientData<typeof myChat>;
159
+ * ```
160
+ */
161
+ export type InferChatClientData<TTask extends AnyTask> = TTask extends Task<string, ChatTaskWirePayload<any, infer TMetadata>, any> ? TMetadata : unknown;
162
+ /**
163
+ * Extracts the UI message type from a chat task (wire payload `message` items).
164
+ *
165
+ * @example
166
+ * ```ts
167
+ * import type { InferChatUIMessage } from "@trigger.dev/sdk/ai";
168
+ * import type { myChat } from "@/trigger/chat";
169
+ *
170
+ * type Msg = InferChatUIMessage<typeof myChat>;
171
+ * ```
172
+ */
173
+ export type InferChatUIMessage<TTask extends AnyTask> = TTask extends Task<string, ChatTaskWirePayload<infer TUIM extends UIMessage, any>, any> ? TUIM : UIMessage;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * Browser-safe primitives shared between `@trigger.dev/sdk/ai` (server) and
4
+ * `@trigger.dev/sdk/chat` / `@trigger.dev/sdk/chat/react` (client).
5
+ *
6
+ * This module exists to keep `ai.ts` reachable only from the server graph.
7
+ * `ai.ts` weighs in at ~7000 lines and statically imports the agent-skills
8
+ * runtime (which uses `node:child_process` / `node:fs/promises`). When a
9
+ * browser bundle imports a runtime value from `ai.ts` — historically the
10
+ * `PENDING_MESSAGE_INJECTED_TYPE` constant in `chat-react.ts` — the bundler
11
+ * traces `ai.ts`'s entire module graph into the client chunk and hits the
12
+ * `node:` builtins, which Turbopack rejects outright (and webpack flags as
13
+ * a "Critical dependency" warning).
14
+ *
15
+ * Anything in this file MUST stay free of `node:*` imports and free of any
16
+ * import from `ai.ts`.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.PENDING_MESSAGE_INJECTED_TYPE = void 0;
20
+ /**
21
+ * Message-part `type` value for the pending-message data part the agent
22
+ * injects when a follow-up message arrives mid-turn.
23
+ */
24
+ exports.PENDING_MESSAGE_INJECTED_TYPE = "data-pending-message-injected";
25
+ //# sourceMappingURL=ai-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-shared.js","sourceRoot":"","sources":["../../../src/v3/ai-shared.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAKH;;;GAGG;AACU,QAAA,6BAA6B,GAAG,+BAAwC,CAAC"}