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

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,155 @@
1
+ import { TriggerChatTransport, type TriggerChatTransportOptions } from "./chat.js";
2
+ import type { AnyTask, TaskIdentifier } from "@trigger.dev/core/v3";
3
+ import { type InferChatClientData, type InferChatUIMessage } from "./ai-shared.js";
4
+ import type { UIMessage, ChatRequestOptions } from "ai";
5
+ /**
6
+ * Options for `useTriggerChatTransport`, with a type-safe `task` field.
7
+ *
8
+ * Pass a task type parameter to get compile-time validation of the task ID:
9
+ * ```ts
10
+ * useTriggerChatTransport<typeof myTask>({ task: "my-task", ... })
11
+ * ```
12
+ */
13
+ export type UseTriggerChatTransportOptions<TTask extends AnyTask = AnyTask> = Omit<TriggerChatTransportOptions<InferChatClientData<TTask>>, "task"> & {
14
+ /** The task ID. Strongly typed when a task type parameter is provided. */
15
+ task: TaskIdentifier<TTask>;
16
+ };
17
+ export type { InferChatUIMessage };
18
+ /**
19
+ * React hook that creates and memoizes a `TriggerChatTransport` instance.
20
+ *
21
+ * The transport is created once on first render and reused for the lifetime
22
+ * of the component. This avoids the need for `useMemo` and ensures the
23
+ * transport's internal session state (run IDs, lastEventId, etc.)
24
+ * is preserved across re-renders.
25
+ *
26
+ * For dynamic access tokens, pass a function — it will be called on each
27
+ * request without needing to recreate the transport.
28
+ *
29
+ * The `onSessionChange` callback is kept in a ref so the transport always
30
+ * calls the latest version without needing to be recreated.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * import { useChat } from "@ai-sdk/react";
35
+ * import { useTriggerChatTransport } from "@trigger.dev/sdk/chat/react";
36
+ * import type { chat } from "@/trigger/chat";
37
+ *
38
+ * function Chat() {
39
+ * const transport = useTriggerChatTransport<typeof chat>({
40
+ * task: "ai-chat",
41
+ * accessToken: ({ chatId }) => fetchToken(chatId),
42
+ * });
43
+ *
44
+ * const { messages, sendMessage } = useChat({ transport });
45
+ * }
46
+ * ```
47
+ */
48
+ export declare function useTriggerChatTransport<TTask extends AnyTask = AnyTask>(options: UseTriggerChatTransportOptions<TTask>): TriggerChatTransport;
49
+ /**
50
+ * Sync chat messages across browser tabs.
51
+ *
52
+ * Requires `multiTab: true` on the transport. Handles:
53
+ * - Tracking read-only state (`isReadOnly`) when another tab is active
54
+ * - Broadcasting messages from the active tab to other tabs
55
+ * - Receiving messages from other tabs and updating local state via `setMessages`
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * const transport = useTriggerChatTransport({ task: "my-chat", multiTab: true, accessToken });
60
+ * const { messages, setMessages } = useChat({ id: chatId, transport });
61
+ * const { isReadOnly } = useMultiTabChat(transport, chatId, messages, setMessages);
62
+ *
63
+ * <input disabled={isReadOnly} placeholder={isReadOnly ? "Active in another tab" : "Type a message..."} />
64
+ * ```
65
+ */
66
+ export declare function useMultiTabChat<T = unknown>(transport: TriggerChatTransport, chatId: string, messages: T[], setMessages: (messages: T[]) => void): {
67
+ isReadOnly: boolean;
68
+ };
69
+ /** A pending message tracked by `usePendingMessages`. */
70
+ export type PendingMessage = {
71
+ id: string;
72
+ text: string;
73
+ /** How this message is being handled. */
74
+ mode: "steering" | "queued";
75
+ /** Whether the backend confirmed this message was injected mid-response. */
76
+ injected: boolean;
77
+ };
78
+ /** Options for `usePendingMessages`. */
79
+ export type UsePendingMessagesOptions<TUIMessage extends UIMessage = UIMessage> = {
80
+ /** The chat transport instance. */
81
+ transport: TriggerChatTransport;
82
+ /** The chat session ID. */
83
+ chatId: string;
84
+ /** The current useChat status. */
85
+ status: string;
86
+ /** The current messages from useChat. */
87
+ messages: TUIMessage[];
88
+ /** The setMessages function from useChat. */
89
+ setMessages: (fn: TUIMessage[] | ((prev: TUIMessage[]) => TUIMessage[])) => void;
90
+ /** The sendMessage function from useChat. */
91
+ sendMessage: (message: {
92
+ text: string;
93
+ }, options?: ChatRequestOptions) => void;
94
+ /** Metadata to include when sending (e.g. `{ model }` for model selection). */
95
+ metadata?: Record<string, unknown>;
96
+ };
97
+ /** A message embedded in an injection point data part. */
98
+ export type InjectedMessage = {
99
+ id: string;
100
+ text: string;
101
+ };
102
+ /** Return value of `usePendingMessages`. */
103
+ export type UsePendingMessagesReturn = {
104
+ /** Current pending messages with their mode and injection status. */
105
+ pending: PendingMessage[];
106
+ /** Send a steering message during streaming, or a normal message when ready. */
107
+ steer: (text: string) => void;
108
+ /** Queue a message for the next turn (sent after current response finishes). */
109
+ queue: (text: string) => void;
110
+ /** Promote a queued message to a steering message (sends via input stream immediately). */
111
+ promoteToSteering: (id: string) => void;
112
+ /** Check if an assistant message part is an injection point. */
113
+ isInjectionPoint: (part: unknown) => boolean;
114
+ /** Get the injected message IDs from an injection point part. */
115
+ getInjectedMessageIds: (part: unknown) => string[];
116
+ /** Get the injected messages (id + text) from an injection point part. Self-contained — works after turn complete. */
117
+ getInjectedMessages: (part: unknown) => InjectedMessage[];
118
+ };
119
+ /**
120
+ * React hook for managing pending messages (steering) during streaming.
121
+ *
122
+ * Handles:
123
+ * - Sending messages via input stream during streaming (bypassing useChat)
124
+ * - Tracking which messages were injected mid-response vs queued for next turn
125
+ * - Inserting injected messages into the conversation on turn complete
126
+ * - Auto-sending non-injected messages as the next turn
127
+ *
128
+ * @example
129
+ * ```tsx
130
+ * const pending = usePendingMessages({
131
+ * transport, chatId, status, messages, setMessages, sendMessage,
132
+ * metadata: { model },
133
+ * });
134
+ *
135
+ * // In the form:
136
+ * <form onSubmit={(e) => {
137
+ * e.preventDefault();
138
+ * pending.send(input);
139
+ * setInput("");
140
+ * }}>
141
+ *
142
+ * // Render pending messages:
143
+ * {pending.pending.map(msg => (
144
+ * <div key={msg.id}>{msg.text} — {msg.injected ? "Injected" : "Pending"}</div>
145
+ * ))}
146
+ *
147
+ * // Render injection points inline in assistant messages:
148
+ * {msg.parts.map((part, i) =>
149
+ * pending.isInjectionPoint(part)
150
+ * ? <InjectionMarker key={i} ids={pending.getInjectedMessageIds(part)} />
151
+ * : <Part key={i} part={part} />
152
+ * )}
153
+ * ```
154
+ */
155
+ export declare function usePendingMessages<TUIMessage extends UIMessage = UIMessage>(options: UsePendingMessagesOptions<TUIMessage>): UsePendingMessagesReturn;
@@ -0,0 +1,330 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useTriggerChatTransport = useTriggerChatTransport;
5
+ exports.useMultiTabChat = useMultiTabChat;
6
+ exports.usePendingMessages = usePendingMessages;
7
+ /**
8
+ * @module @trigger.dev/sdk/chat/react
9
+ *
10
+ * React hooks for AI SDK chat transport integration.
11
+ * Use alongside `@trigger.dev/sdk/chat` for a type-safe, ergonomic DX.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * import { useChat } from "@ai-sdk/react";
16
+ * import { useTriggerChatTransport } from "@trigger.dev/sdk/chat/react";
17
+ * import type { chat } from "@/trigger/chat";
18
+ *
19
+ * function Chat() {
20
+ * const transport = useTriggerChatTransport<typeof chat>({
21
+ * task: "ai-chat",
22
+ * accessToken: ({ chatId }) => fetchToken(chatId),
23
+ * });
24
+ *
25
+ * const { messages, sendMessage } = useChat({ transport });
26
+ * }
27
+ * ```
28
+ */
29
+ const react_1 = require("react");
30
+ const chat_js_1 = require("./chat.js");
31
+ const ai_shared_js_1 = require("./ai-shared.js");
32
+ /**
33
+ * React hook that creates and memoizes a `TriggerChatTransport` instance.
34
+ *
35
+ * The transport is created once on first render and reused for the lifetime
36
+ * of the component. This avoids the need for `useMemo` and ensures the
37
+ * transport's internal session state (run IDs, lastEventId, etc.)
38
+ * is preserved across re-renders.
39
+ *
40
+ * For dynamic access tokens, pass a function — it will be called on each
41
+ * request without needing to recreate the transport.
42
+ *
43
+ * The `onSessionChange` callback is kept in a ref so the transport always
44
+ * calls the latest version without needing to be recreated.
45
+ *
46
+ * @example
47
+ * ```tsx
48
+ * import { useChat } from "@ai-sdk/react";
49
+ * import { useTriggerChatTransport } from "@trigger.dev/sdk/chat/react";
50
+ * import type { chat } from "@/trigger/chat";
51
+ *
52
+ * function Chat() {
53
+ * const transport = useTriggerChatTransport<typeof chat>({
54
+ * task: "ai-chat",
55
+ * accessToken: ({ chatId }) => fetchToken(chatId),
56
+ * });
57
+ *
58
+ * const { messages, sendMessage } = useChat({ transport });
59
+ * }
60
+ * ```
61
+ */
62
+ function useTriggerChatTransport(options) {
63
+ const ref = (0, react_1.useRef)(null);
64
+ if (ref.current === null) {
65
+ ref.current = new chat_js_1.TriggerChatTransport(options);
66
+ }
67
+ // Keep callbacks up to date without recreating the transport.
68
+ const { onSessionChange, clientData } = options;
69
+ (0, react_1.useEffect)(() => {
70
+ ref.current?.setOnSessionChange(onSessionChange);
71
+ }, [onSessionChange]);
72
+ // Keep `clientData` up to date so the transport's per-turn merge and
73
+ // `startSession` callback both see the latest value without
74
+ // reconstructing the transport.
75
+ (0, react_1.useEffect)(() => {
76
+ ref.current?.setClientData(clientData);
77
+ }, [clientData]);
78
+ // Note: dispose() is NOT called in effect cleanup because React strict mode
79
+ // runs cleanup+re-setup, but the transport lives in a ref and isn't recreated.
80
+ // Calling dispose() would permanently close the BroadcastChannel.
81
+ // The coordinator's beforeunload handler handles tab close cleanup instead.
82
+ return ref.current;
83
+ }
84
+ /**
85
+ * Sync chat messages across browser tabs.
86
+ *
87
+ * Requires `multiTab: true` on the transport. Handles:
88
+ * - Tracking read-only state (`isReadOnly`) when another tab is active
89
+ * - Broadcasting messages from the active tab to other tabs
90
+ * - Receiving messages from other tabs and updating local state via `setMessages`
91
+ *
92
+ * @example
93
+ * ```tsx
94
+ * const transport = useTriggerChatTransport({ task: "my-chat", multiTab: true, accessToken });
95
+ * const { messages, setMessages } = useChat({ id: chatId, transport });
96
+ * const { isReadOnly } = useMultiTabChat(transport, chatId, messages, setMessages);
97
+ *
98
+ * <input disabled={isReadOnly} placeholder={isReadOnly ? "Active in another tab" : "Type a message..."} />
99
+ * ```
100
+ */
101
+ function useMultiTabChat(transport, chatId, messages, setMessages) {
102
+ const [isReadOnly, setIsReadOnly] = (0, react_1.useState)(() => transport.isReadOnly(chatId));
103
+ // Track read-only state
104
+ (0, react_1.useEffect)(() => {
105
+ const listener = (id, readOnly) => {
106
+ if (id === chatId)
107
+ setIsReadOnly(readOnly);
108
+ };
109
+ transport.addReadOnlyListener(listener);
110
+ setIsReadOnly(transport.isReadOnly(chatId));
111
+ return () => transport.removeReadOnlyListener(listener);
112
+ }, [transport, chatId]);
113
+ // Active tab: broadcast messages to other tabs on change.
114
+ // Only broadcast when THIS tab holds the claim (is the current sender).
115
+ // Deferred via requestIdleCallback so the structured clone in
116
+ // BroadcastChannel.postMessage never blocks rendering during streaming.
117
+ const idleRef = (0, react_1.useRef)(null);
118
+ const latestMessagesRef = (0, react_1.useRef)(messages);
119
+ latestMessagesRef.current = messages;
120
+ (0, react_1.useEffect)(() => {
121
+ if (!transport.hasClaim(chatId) || messages.length === 0)
122
+ return;
123
+ if (idleRef.current !== null)
124
+ return; // Already scheduled
125
+ const schedule = typeof requestIdleCallback === "function"
126
+ ? requestIdleCallback
127
+ : (fn) => setTimeout(fn, 50);
128
+ idleRef.current = schedule(() => {
129
+ idleRef.current = null;
130
+ if (transport.hasClaim(chatId)) {
131
+ transport.broadcastMessages(chatId, latestMessagesRef.current);
132
+ }
133
+ });
134
+ }, [transport, chatId, messages]);
135
+ // Flush final state when claim is released (turn complete)
136
+ (0, react_1.useEffect)(() => {
137
+ if (!transport.hasClaim(chatId) && latestMessagesRef.current.length > 0) {
138
+ if (idleRef.current !== null) {
139
+ const cancel = typeof cancelIdleCallback === "function"
140
+ ? cancelIdleCallback
141
+ : clearTimeout;
142
+ cancel(idleRef.current);
143
+ idleRef.current = null;
144
+ }
145
+ transport.broadcastMessages(chatId, latestMessagesRef.current);
146
+ }
147
+ }, [transport, chatId, isReadOnly]);
148
+ // Read-only tab: receive messages from the active tab
149
+ (0, react_1.useEffect)(() => {
150
+ const listener = (id, msgs) => {
151
+ if (id === chatId) {
152
+ setMessages(msgs);
153
+ }
154
+ };
155
+ transport.addMessagesListener(listener);
156
+ return () => transport.removeMessagesListener(listener);
157
+ }, [transport, chatId, setMessages]);
158
+ return { isReadOnly };
159
+ }
160
+ /**
161
+ * React hook for managing pending messages (steering) during streaming.
162
+ *
163
+ * Handles:
164
+ * - Sending messages via input stream during streaming (bypassing useChat)
165
+ * - Tracking which messages were injected mid-response vs queued for next turn
166
+ * - Inserting injected messages into the conversation on turn complete
167
+ * - Auto-sending non-injected messages as the next turn
168
+ *
169
+ * @example
170
+ * ```tsx
171
+ * const pending = usePendingMessages({
172
+ * transport, chatId, status, messages, setMessages, sendMessage,
173
+ * metadata: { model },
174
+ * });
175
+ *
176
+ * // In the form:
177
+ * <form onSubmit={(e) => {
178
+ * e.preventDefault();
179
+ * pending.send(input);
180
+ * setInput("");
181
+ * }}>
182
+ *
183
+ * // Render pending messages:
184
+ * {pending.pending.map(msg => (
185
+ * <div key={msg.id}>{msg.text} — {msg.injected ? "Injected" : "Pending"}</div>
186
+ * ))}
187
+ *
188
+ * // Render injection points inline in assistant messages:
189
+ * {msg.parts.map((part, i) =>
190
+ * pending.isInjectionPoint(part)
191
+ * ? <InjectionMarker key={i} ids={pending.getInjectedMessageIds(part)} />
192
+ * : <Part key={i} part={part} />
193
+ * )}
194
+ * ```
195
+ */
196
+ function usePendingMessages(options) {
197
+ const { transport, chatId, status, messages, setMessages, sendMessage, metadata } = options;
198
+ const [pendingMsgs, setPendingMsgs] = (0, react_1.useState)([]);
199
+ const injectedIdsRef = (0, react_1.useRef)(new Set());
200
+ const prevStatusRef = (0, react_1.useRef)(status);
201
+ // Watch for injection confirmation chunks in streaming messages
202
+ (0, react_1.useEffect)(() => {
203
+ if (status !== "streaming")
204
+ return;
205
+ let newlyInjected = false;
206
+ for (const msg of messages) {
207
+ if (msg.role !== "assistant")
208
+ continue;
209
+ for (const part of msg.parts ?? []) {
210
+ if (part.type === ai_shared_js_1.PENDING_MESSAGE_INJECTED_TYPE) {
211
+ const messageIds = part.data?.messageIds;
212
+ if (Array.isArray(messageIds)) {
213
+ for (const id of messageIds) {
214
+ if (!injectedIdsRef.current.has(id)) {
215
+ injectedIdsRef.current.add(id);
216
+ newlyInjected = true;
217
+ }
218
+ }
219
+ }
220
+ }
221
+ }
222
+ }
223
+ // Remove injected steering messages from the pending overlay immediately
224
+ if (newlyInjected) {
225
+ setPendingMsgs((prev) => prev.filter((m) => !injectedIdsRef.current.has(m.id)));
226
+ }
227
+ }, [status, messages]);
228
+ // Handle turn completion
229
+ (0, react_1.useEffect)(() => {
230
+ const turnCompleted = prevStatusRef.current === "streaming" && status === "ready";
231
+ prevStatusRef.current = status;
232
+ if (!turnCompleted)
233
+ return;
234
+ // Auto-send non-injected messages as the next turn.
235
+ // This includes queued messages AND steering messages that weren't
236
+ // injected (arrived too late, no prepareStep boundary, etc.).
237
+ // Note: steering messages were also sent via sendPendingMessage to
238
+ // the backend's wire buffer, so the backend may already have them.
239
+ // Calling sendMessage here ensures useChat subscribes to the response.
240
+ const toSend = pendingMsgs.filter((m) => !injectedIdsRef.current.has(m.id));
241
+ // Clean up
242
+ setPendingMsgs([]);
243
+ injectedIdsRef.current.clear();
244
+ promotedIdsRef.current.clear();
245
+ // Auto-send as next turn
246
+ if (toSend.length > 0) {
247
+ const text = toSend.map((m) => m.parts?.[0]?.text ?? "").join("\n");
248
+ sendMessage({ text }, metadata ? { metadata } : undefined);
249
+ }
250
+ }, [status, pendingMsgs, sendMessage, metadata, messages]);
251
+ // Send a steering message (injected mid-response via prepareStep)
252
+ const steer = (0, react_1.useCallback)((text) => {
253
+ if (status === "streaming") {
254
+ const msg = {
255
+ id: crypto.randomUUID(),
256
+ role: "user",
257
+ parts: [{ type: "text", text }],
258
+ _mode: "steering",
259
+ };
260
+ transport.sendPendingMessage(chatId, msg, metadata);
261
+ setPendingMsgs((prev) => [...prev, msg]);
262
+ }
263
+ else {
264
+ // Not streaming — just send normally
265
+ sendMessage({ text }, metadata ? { metadata } : undefined);
266
+ }
267
+ }, [status, transport, chatId, sendMessage, metadata]);
268
+ // Queue a message for the next turn (no injection attempt)
269
+ const queue = (0, react_1.useCallback)((text) => {
270
+ if (status === "streaming") {
271
+ const msg = {
272
+ id: crypto.randomUUID(),
273
+ role: "user",
274
+ parts: [{ type: "text", text }],
275
+ _mode: "queued",
276
+ };
277
+ setPendingMsgs((prev) => [...prev, msg]);
278
+ }
279
+ else {
280
+ sendMessage({ text }, metadata ? { metadata } : undefined);
281
+ }
282
+ }, [status, sendMessage, metadata]);
283
+ // Promote a queued message to steering (send via input stream immediately)
284
+ const promotedIdsRef = (0, react_1.useRef)(new Set());
285
+ const promoteToSteering = (0, react_1.useCallback)((id) => {
286
+ // Guard against double-click — ref check is synchronous
287
+ if (promotedIdsRef.current.has(id)) {
288
+ return;
289
+ }
290
+ promotedIdsRef.current.add(id);
291
+ setPendingMsgs((prev) => {
292
+ const msg = prev.find((m) => m.id === id);
293
+ if (!msg || msg._mode !== "queued")
294
+ return prev;
295
+ transport.sendPendingMessage(chatId, msg, metadata);
296
+ return prev.map((m) => (m.id === id ? { ...m, _mode: "steering" } : m));
297
+ });
298
+ }, [transport, chatId, metadata]);
299
+ const isInjectionPoint = (0, react_1.useCallback)((part) => typeof part === "object" &&
300
+ part !== null &&
301
+ part.type === ai_shared_js_1.PENDING_MESSAGE_INJECTED_TYPE, []);
302
+ const getInjectedMessageIds = (0, react_1.useCallback)((part) => {
303
+ if (!isInjectionPoint(part))
304
+ return [];
305
+ const ids = part.data?.messageIds;
306
+ return Array.isArray(ids) ? ids : [];
307
+ }, [isInjectionPoint]);
308
+ const getInjectedMessages = (0, react_1.useCallback)((part) => {
309
+ if (!isInjectionPoint(part))
310
+ return [];
311
+ const msgs = part.data?.messages;
312
+ return Array.isArray(msgs) ? msgs : [];
313
+ }, [isInjectionPoint]);
314
+ const pending = pendingMsgs.map((m) => ({
315
+ id: m.id,
316
+ text: m.parts?.[0]?.text ?? "",
317
+ mode: m._mode,
318
+ injected: injectedIdsRef.current.has(m.id),
319
+ }));
320
+ return {
321
+ pending,
322
+ steer,
323
+ queue,
324
+ promoteToSteering,
325
+ isInjectionPoint,
326
+ getInjectedMessageIds,
327
+ getInjectedMessages,
328
+ };
329
+ }
330
+ //# sourceMappingURL=chat-react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-react.js","sourceRoot":"","sources":["../../../src/v3/chat-react.ts"],"names":[],"mappings":"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"}