@langchain/langgraph-sdk 1.6.5 → 1.7.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 (223) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +7 -13
  2. package/dist/auth/error.cjs +1 -2
  3. package/dist/auth/error.cjs.map +1 -1
  4. package/dist/auth/error.js +1 -1
  5. package/dist/auth/index.cjs +3 -4
  6. package/dist/auth/index.cjs.map +1 -1
  7. package/dist/auth/index.js +1 -2
  8. package/dist/auth/index.js.map +1 -1
  9. package/dist/client.cjs +9 -9
  10. package/dist/client.cjs.map +1 -1
  11. package/dist/client.d.cts.map +1 -1
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +3 -3
  14. package/dist/client.js.map +1 -1
  15. package/dist/index.cjs +5 -6
  16. package/dist/index.d.cts +4 -4
  17. package/dist/index.d.ts +4 -4
  18. package/dist/index.js +1 -2
  19. package/dist/logging/index.cjs +2 -3
  20. package/dist/logging/index.cjs.map +1 -1
  21. package/dist/logging/index.js +1 -1
  22. package/dist/react/index.cjs +46 -11
  23. package/dist/react/index.cjs.map +1 -0
  24. package/dist/react/index.d.cts +14 -11
  25. package/dist/react/index.d.cts.map +1 -0
  26. package/dist/react/index.d.ts +14 -11
  27. package/dist/react/index.d.ts.map +1 -0
  28. package/dist/react/index.js +13 -4
  29. package/dist/react/index.js.map +1 -0
  30. package/dist/react-ui/index.cjs +39 -15
  31. package/dist/react-ui/index.d.cts +1 -2
  32. package/dist/react-ui/index.d.ts +1 -2
  33. package/dist/react-ui/index.js +1 -8
  34. package/dist/react-ui/server/index.cjs +15 -6
  35. package/dist/react-ui/server/index.d.cts +1 -2
  36. package/dist/react-ui/server/index.d.ts +1 -2
  37. package/dist/react-ui/server/index.js +2 -4
  38. package/dist/singletons/fetch.cjs +1 -2
  39. package/dist/singletons/fetch.cjs.map +1 -1
  40. package/dist/singletons/fetch.js +1 -1
  41. package/dist/singletons/fetch.js.map +1 -1
  42. package/dist/types.messages.d.cts +5 -3
  43. package/dist/types.messages.d.cts.map +1 -1
  44. package/dist/types.messages.d.ts +5 -3
  45. package/dist/types.messages.d.ts.map +1 -1
  46. package/dist/ui/branching.cjs +25 -2
  47. package/dist/ui/branching.cjs.map +1 -1
  48. package/dist/ui/branching.d.cts +26 -1
  49. package/dist/ui/branching.d.cts.map +1 -1
  50. package/dist/ui/branching.d.ts +26 -1
  51. package/dist/ui/branching.d.ts.map +1 -1
  52. package/dist/ui/branching.js +25 -2
  53. package/dist/ui/branching.js.map +1 -1
  54. package/dist/ui/errors.cjs +1 -2
  55. package/dist/ui/errors.cjs.map +1 -1
  56. package/dist/ui/errors.js +1 -1
  57. package/dist/ui/index.cjs +30 -0
  58. package/dist/ui/index.d.cts +15 -0
  59. package/dist/ui/index.d.ts +15 -0
  60. package/dist/ui/index.js +10 -0
  61. package/dist/ui/interrupts.cjs +20 -0
  62. package/dist/ui/interrupts.cjs.map +1 -0
  63. package/dist/ui/interrupts.d.cts +11 -0
  64. package/dist/ui/interrupts.d.cts.map +1 -0
  65. package/dist/ui/interrupts.d.ts +11 -0
  66. package/dist/ui/interrupts.d.ts.map +1 -0
  67. package/dist/ui/interrupts.js +20 -0
  68. package/dist/ui/interrupts.js.map +1 -0
  69. package/dist/ui/manager.cjs +13 -15
  70. package/dist/ui/manager.cjs.map +1 -1
  71. package/dist/ui/manager.d.cts +224 -0
  72. package/dist/ui/manager.d.cts.map +1 -0
  73. package/dist/ui/manager.d.ts +224 -0
  74. package/dist/ui/manager.d.ts.map +1 -0
  75. package/dist/ui/manager.js +10 -12
  76. package/dist/ui/manager.js.map +1 -1
  77. package/dist/ui/messages.cjs +40 -3
  78. package/dist/ui/messages.cjs.map +1 -1
  79. package/dist/ui/messages.d.cts +56 -0
  80. package/dist/ui/messages.d.cts.map +1 -0
  81. package/dist/ui/messages.d.ts +56 -0
  82. package/dist/ui/messages.d.ts.map +1 -0
  83. package/dist/ui/messages.js +37 -3
  84. package/dist/ui/messages.js.map +1 -1
  85. package/dist/ui/queue.cjs +74 -0
  86. package/dist/ui/queue.cjs.map +1 -0
  87. package/dist/ui/queue.d.cts +72 -0
  88. package/dist/ui/queue.d.cts.map +1 -0
  89. package/dist/ui/queue.d.ts +72 -0
  90. package/dist/ui/queue.d.ts.map +1 -0
  91. package/dist/ui/queue.js +74 -0
  92. package/dist/ui/queue.js.map +1 -0
  93. package/dist/ui/stream/base.d.cts +11 -0
  94. package/dist/ui/stream/base.d.cts.map +1 -1
  95. package/dist/ui/stream/base.d.ts +11 -0
  96. package/dist/ui/stream/base.d.ts.map +1 -1
  97. package/dist/ui/stream/index.d.cts +4 -4
  98. package/dist/ui/stream/index.d.cts.map +1 -1
  99. package/dist/ui/stream/index.d.ts +4 -4
  100. package/dist/ui/stream/index.d.ts.map +1 -1
  101. package/dist/ui/subagents.cjs +7 -5
  102. package/dist/ui/subagents.cjs.map +1 -1
  103. package/dist/ui/subagents.d.cts +7 -0
  104. package/dist/ui/subagents.d.cts.map +1 -1
  105. package/dist/ui/subagents.d.ts +7 -0
  106. package/dist/ui/subagents.d.ts.map +1 -1
  107. package/dist/ui/subagents.js +5 -3
  108. package/dist/ui/subagents.js.map +1 -1
  109. package/dist/ui/transport.cjs +30 -0
  110. package/dist/ui/transport.cjs.map +1 -0
  111. package/dist/{react/stream.custom.d.cts → ui/transport.d.cts} +3 -3
  112. package/dist/ui/transport.d.cts.map +1 -0
  113. package/dist/{react/stream.custom.d.ts → ui/transport.d.ts} +3 -3
  114. package/dist/ui/transport.d.ts.map +1 -0
  115. package/dist/ui/transport.js +30 -0
  116. package/dist/ui/transport.js.map +1 -0
  117. package/dist/ui/types.d.cts +125 -16
  118. package/dist/ui/types.d.cts.map +1 -1
  119. package/dist/ui/types.d.ts +125 -16
  120. package/dist/ui/types.d.ts.map +1 -1
  121. package/dist/ui/utils.cjs +1 -2
  122. package/dist/ui/utils.cjs.map +1 -1
  123. package/dist/ui/utils.d.cts +7 -0
  124. package/dist/ui/utils.d.cts.map +1 -0
  125. package/dist/ui/utils.d.ts +7 -0
  126. package/dist/ui/utils.d.ts.map +1 -0
  127. package/dist/ui/utils.js +1 -1
  128. package/dist/utils/async_caller.cjs +3 -4
  129. package/dist/utils/async_caller.cjs.map +1 -1
  130. package/dist/utils/async_caller.js +1 -2
  131. package/dist/utils/async_caller.js.map +1 -1
  132. package/dist/utils/env.cjs +1 -2
  133. package/dist/utils/env.cjs.map +1 -1
  134. package/dist/utils/env.js +1 -1
  135. package/dist/utils/env.js.map +1 -1
  136. package/dist/utils/error.cjs +1 -2
  137. package/dist/utils/error.cjs.map +1 -1
  138. package/dist/utils/error.js +1 -1
  139. package/dist/utils/index.cjs +8 -0
  140. package/dist/utils/index.d.cts +4 -0
  141. package/dist/utils/index.d.ts +4 -0
  142. package/dist/utils/index.js +4 -0
  143. package/dist/utils/signals.cjs +1 -2
  144. package/dist/utils/signals.cjs.map +1 -1
  145. package/dist/utils/signals.js +1 -1
  146. package/dist/utils/signals.js.map +1 -1
  147. package/dist/utils/sse.cjs +1 -2
  148. package/dist/utils/sse.cjs.map +1 -1
  149. package/dist/utils/sse.d.cts +11 -0
  150. package/dist/utils/sse.d.cts.map +1 -0
  151. package/dist/utils/sse.d.ts +11 -0
  152. package/dist/utils/sse.d.ts.map +1 -0
  153. package/dist/utils/sse.js +1 -1
  154. package/dist/utils/sse.js.map +1 -1
  155. package/dist/utils/stream.cjs +2 -3
  156. package/dist/utils/stream.cjs.map +1 -1
  157. package/dist/utils/stream.d.cts +19 -0
  158. package/dist/utils/stream.d.cts.map +1 -0
  159. package/dist/utils/stream.d.ts +19 -0
  160. package/dist/utils/stream.d.ts.map +1 -0
  161. package/dist/utils/stream.js +1 -2
  162. package/dist/utils/stream.js.map +1 -1
  163. package/dist/utils/tools.cjs +27 -19
  164. package/dist/utils/tools.cjs.map +1 -1
  165. package/dist/utils/tools.d.cts +7 -0
  166. package/dist/utils/tools.d.cts.map +1 -0
  167. package/dist/utils/tools.d.ts +7 -0
  168. package/dist/utils/tools.d.ts.map +1 -0
  169. package/dist/utils/tools.js +27 -18
  170. package/dist/utils/tools.js.map +1 -1
  171. package/package.json +41 -12
  172. package/dist/react/stream.cjs +0 -18
  173. package/dist/react/stream.cjs.map +0 -1
  174. package/dist/react/stream.custom.cjs +0 -164
  175. package/dist/react/stream.custom.cjs.map +0 -1
  176. package/dist/react/stream.custom.d.cts.map +0 -1
  177. package/dist/react/stream.custom.d.ts.map +0 -1
  178. package/dist/react/stream.custom.js +0 -162
  179. package/dist/react/stream.custom.js.map +0 -1
  180. package/dist/react/stream.d.cts +0 -174
  181. package/dist/react/stream.d.cts.map +0 -1
  182. package/dist/react/stream.d.ts +0 -174
  183. package/dist/react/stream.d.ts.map +0 -1
  184. package/dist/react/stream.js +0 -17
  185. package/dist/react/stream.js.map +0 -1
  186. package/dist/react/stream.lgp.cjs +0 -544
  187. package/dist/react/stream.lgp.cjs.map +0 -1
  188. package/dist/react/stream.lgp.js +0 -543
  189. package/dist/react/stream.lgp.js.map +0 -1
  190. package/dist/react/thread.cjs +0 -21
  191. package/dist/react/thread.cjs.map +0 -1
  192. package/dist/react/thread.js +0 -20
  193. package/dist/react/thread.js.map +0 -1
  194. package/dist/react/types.d.cts +0 -79
  195. package/dist/react/types.d.cts.map +0 -1
  196. package/dist/react/types.d.ts +0 -79
  197. package/dist/react/types.d.ts.map +0 -1
  198. package/dist/react-ui/client.cjs +0 -138
  199. package/dist/react-ui/client.cjs.map +0 -1
  200. package/dist/react-ui/client.d.cts +0 -76
  201. package/dist/react-ui/client.d.cts.map +0 -1
  202. package/dist/react-ui/client.d.ts +0 -76
  203. package/dist/react-ui/client.d.ts.map +0 -1
  204. package/dist/react-ui/client.js +0 -132
  205. package/dist/react-ui/client.js.map +0 -1
  206. package/dist/react-ui/index.cjs.map +0 -1
  207. package/dist/react-ui/index.js.map +0 -1
  208. package/dist/react-ui/server/server.cjs +0 -57
  209. package/dist/react-ui/server/server.cjs.map +0 -1
  210. package/dist/react-ui/server/server.d.cts +0 -54
  211. package/dist/react-ui/server/server.d.cts.map +0 -1
  212. package/dist/react-ui/server/server.d.ts +0 -54
  213. package/dist/react-ui/server/server.d.ts.map +0 -1
  214. package/dist/react-ui/server/server.js +0 -56
  215. package/dist/react-ui/server/server.js.map +0 -1
  216. package/dist/react-ui/types.cjs +0 -38
  217. package/dist/react-ui/types.cjs.map +0 -1
  218. package/dist/react-ui/types.d.cts +0 -25
  219. package/dist/react-ui/types.d.cts.map +0 -1
  220. package/dist/react-ui/types.d.ts +0 -25
  221. package/dist/react-ui/types.d.ts.map +0 -1
  222. package/dist/react-ui/types.js +0 -35
  223. package/dist/react-ui/types.js.map +0 -1
@@ -0,0 +1,224 @@
1
+ import { Message } from "../types.messages.cjs";
2
+ import { CheckpointsStreamEvent, CustomStreamEvent, DebugStreamEvent, ErrorStreamEvent, EventsStreamEvent, FeedbackStreamEvent, MessagesTupleStreamEvent, MetadataStreamEvent, TasksStreamEvent, ToolsStreamEvent, UpdatesStreamEvent, ValuesStreamEvent } from "../types.stream.cjs";
3
+ import { BagTemplate } from "../types.template.cjs";
4
+ import { SubagentStreamInterface } from "./types.cjs";
5
+ import { MessageTupleManager } from "./messages.cjs";
6
+ import { BaseMessage } from "@langchain/core/messages";
7
+
8
+ //#region src/ui/manager.d.ts
9
+ type GetUpdateType<Bag extends BagTemplate, StateType extends Record<string, unknown>> = Bag extends {
10
+ UpdateType: unknown;
11
+ } ? Bag["UpdateType"] : Partial<StateType>;
12
+ type GetCustomEventType<Bag extends BagTemplate> = Bag extends {
13
+ CustomEventType: unknown;
14
+ } ? Bag["CustomEventType"] : unknown;
15
+ type EventStreamMap<StateType, UpdateType, CustomType> = {
16
+ values: ValuesStreamEvent<StateType>;
17
+ updates: UpdatesStreamEvent<UpdateType>;
18
+ custom: CustomStreamEvent<CustomType>;
19
+ debug: DebugStreamEvent;
20
+ messages: MessagesTupleStreamEvent;
21
+ events: EventsStreamEvent;
22
+ metadata: MetadataStreamEvent;
23
+ checkpoints: CheckpointsStreamEvent<StateType>;
24
+ tasks: TasksStreamEvent<StateType, UpdateType>;
25
+ error: ErrorStreamEvent;
26
+ feedback: FeedbackStreamEvent;
27
+ tools: ToolsStreamEvent;
28
+ };
29
+ type EventStreamEvent<StateType, UpdateType, CustomType> = EventStreamMap<StateType, UpdateType, CustomType>[keyof EventStreamMap<StateType, UpdateType, CustomType>];
30
+ interface StreamManagerEventCallbacks<StateType extends Record<string, unknown>, Bag extends BagTemplate = BagTemplate> {
31
+ onUpdateEvent?: (data: UpdatesStreamEvent<GetUpdateType<Bag, StateType>>["data"], options: {
32
+ namespace: string[] | undefined;
33
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
34
+ }) => void;
35
+ onCustomEvent?: (data: GetCustomEventType<Bag>, options: {
36
+ namespace: string[] | undefined;
37
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
38
+ }) => void;
39
+ onMetadataEvent?: (data: MetadataStreamEvent["data"]) => void;
40
+ onLangChainEvent?: (data: EventsStreamEvent["data"]) => void;
41
+ onDebugEvent?: (data: DebugStreamEvent["data"], options: {
42
+ namespace: string[] | undefined;
43
+ }) => void;
44
+ onCheckpointEvent?: (data: CheckpointsStreamEvent<StateType>["data"], options: {
45
+ namespace: string[] | undefined;
46
+ }) => void;
47
+ onTaskEvent?: (data: TasksStreamEvent<StateType, GetUpdateType<Bag, StateType>>["data"], options: {
48
+ namespace: string[] | undefined;
49
+ }) => void;
50
+ onToolEvent?: (data: ToolsStreamEvent["data"], options: {
51
+ namespace: string[] | undefined;
52
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
53
+ }) => void;
54
+ }
55
+ /**
56
+ * Options for StreamManager constructor.
57
+ */
58
+ interface StreamManagerOptions {
59
+ /**
60
+ * Throttle the stream updates.
61
+ * If a number is provided, updates are throttled to the given milliseconds.
62
+ * If `true`, updates are batched in a single macrotask.
63
+ * If `false`, updates are not throttled.
64
+ */
65
+ throttle: number | boolean;
66
+ /**
67
+ * Tool names that indicate subagent invocation.
68
+ *
69
+ * When an AI message contains tool calls with these names, they are
70
+ * automatically tracked as subagent executions. This enables the
71
+ * `subagents`, `activeSubagents`, `getSubagent()`, and `getSubagentsByType()`
72
+ * properties on the stream.
73
+ *
74
+ * @default ["task"]
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Track both "task" and "delegate" as subagent tools
79
+ * subagentToolNames: ["task", "delegate", "spawn_agent"]
80
+ * ```
81
+ */
82
+ subagentToolNames?: string[];
83
+ /**
84
+ * Filter out messages from subagent streams in the main messages array.
85
+ *
86
+ * When enabled, messages from subagraph executions (those with a `tools:` namespace)
87
+ * are excluded from `stream.messages`. Instead, these messages are tracked
88
+ * per-subagent and accessible via `stream.subagents.get(id).messages`.
89
+ *
90
+ * This is useful for deep agent architectures where you want to display
91
+ * the main conversation separately from subagent activity.
92
+ *
93
+ * @default false
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const stream = useStream({
98
+ * assistantId: "my-agent",
99
+ * filterSubagentMessages: true,
100
+ * });
101
+ *
102
+ * // Main thread messages only (no subagent messages)
103
+ * stream.messages
104
+ *
105
+ * // Access subagent messages individually
106
+ * stream.subagents.get("call_xyz").messages
107
+ * ```
108
+ */
109
+ filterSubagentMessages?: boolean;
110
+ /**
111
+ * Converts a @langchain/core BaseMessage to the desired output format.
112
+ *
113
+ * Defaults to `toMessageDict` which produces plain Message objects.
114
+ * Framework SDKs pass `toMessageClass` (identity) to keep class instances.
115
+ */
116
+ toMessage?: (chunk: BaseMessage) => Message | BaseMessage;
117
+ }
118
+ declare class StreamManager<StateType extends Record<string, unknown>, Bag extends BagTemplate = BagTemplate> {
119
+ private abortRef;
120
+ private messages;
121
+ private subagentManager;
122
+ private listeners;
123
+ private throttle;
124
+ private filterSubagentMessages;
125
+ private toMessage;
126
+ private queue;
127
+ private queueSize;
128
+ private state;
129
+ constructor(messages: MessageTupleManager, options: StreamManagerOptions);
130
+ /**
131
+ * Increment version counter to trigger React re-renders.
132
+ * Called when subagent state changes.
133
+ */
134
+ private bumpVersion;
135
+ /**
136
+ * Get all subagents as a Map.
137
+ */
138
+ getSubagents(): Map<string, SubagentStreamInterface>;
139
+ /**
140
+ * Get all currently running subagents.
141
+ */
142
+ getActiveSubagents(): SubagentStreamInterface[];
143
+ /**
144
+ * Get a specific subagent by tool call ID.
145
+ */
146
+ getSubagent(toolCallId: string): SubagentStreamInterface | undefined;
147
+ /**
148
+ * Get all subagents of a specific type.
149
+ */
150
+ getSubagentsByType(type: string): SubagentStreamInterface[];
151
+ /**
152
+ * Get all subagents triggered by a specific AI message.
153
+ */
154
+ getSubagentsByMessage(messageId: string): SubagentStreamInterface[];
155
+ /**
156
+ * Reconstruct subagent state from historical messages.
157
+ *
158
+ * This method should be called when loading thread history to restore
159
+ * subagent visualization after:
160
+ * - Page refresh (when stream has already completed)
161
+ * - Loading thread history
162
+ * - Navigating between threads
163
+ *
164
+ * @param messages - Array of messages from thread history
165
+ * @param options - Optional configuration
166
+ * @param options.skipIfPopulated - If true, skip reconstruction if subagents already exist
167
+ */
168
+ reconstructSubagents(messages: Message[], options?: {
169
+ skipIfPopulated?: boolean;
170
+ }): void;
171
+ /**
172
+ * Check if any subagents are currently tracked.
173
+ */
174
+ hasSubagents(): boolean;
175
+ private setState;
176
+ private notifyListeners;
177
+ subscribe: (listener: () => void) => () => void;
178
+ getSnapshot: () => {
179
+ isLoading: boolean;
180
+ values: [values: StateType, kind: "stop" | "stream"] | null;
181
+ error: unknown; /** Version counter to force React re-renders on subagent changes */
182
+ version: number;
183
+ };
184
+ get isLoading(): boolean;
185
+ get values(): StateType | null;
186
+ get error(): unknown;
187
+ setStreamValues: (values: StateType | ((prev: StateType | null, kind: "stop" | "stream") => StateType | null) | null, kind?: "stop" | "stream") => void;
188
+ private getMutateFn;
189
+ private matchEventType;
190
+ protected enqueue: (action: (signal: AbortSignal) => Promise<AsyncGenerator<EventStreamEvent<StateType, GetUpdateType<Bag, StateType>, GetCustomEventType<Bag>>, any, any>>, options: {
191
+ getMessages: (values: StateType) => Message[];
192
+ setMessages: (current: StateType, messages: Message[]) => StateType;
193
+ initialValues: StateType;
194
+ callbacks: StreamManagerEventCallbacks<StateType, Bag>;
195
+ onSuccess: () => void | StateType | Promise<void | StateType | null | undefined> | null | undefined;
196
+ onError: (error: unknown) => void | Promise<void>;
197
+ onFinish?: (() => void) | undefined;
198
+ }) => Promise<void>;
199
+ start: (action: (signal: AbortSignal) => Promise<AsyncGenerator<EventStreamEvent<StateType, GetUpdateType<Bag, StateType>, GetCustomEventType<Bag>>, any, any>>, options: {
200
+ getMessages: (values: StateType) => Message[];
201
+ setMessages: (current: StateType, messages: Message[]) => StateType;
202
+ initialValues: StateType;
203
+ callbacks: StreamManagerEventCallbacks<StateType, Bag>;
204
+ onSuccess: () => void | StateType | Promise<void | StateType | null | undefined> | null | undefined;
205
+ onError: (error: unknown) => void | Promise<void>;
206
+ onFinish?: (() => void) | undefined;
207
+ }, startOptions?: {
208
+ /**
209
+ * If true, abort any currently running stream before starting this one.
210
+ * Used for multitask_strategy: "interrupt" and "rollback" to unblock
211
+ * the queue so the new run request can proceed immediately.
212
+ */
213
+ abortPrevious?: boolean | undefined;
214
+ } | undefined) => Promise<void>;
215
+ stop: (historyValues: StateType, options: {
216
+ onStop?: ((options: {
217
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
218
+ }) => void) | undefined;
219
+ }) => Promise<void>;
220
+ clear: () => void;
221
+ }
222
+ //#endregion
223
+ export { EventStreamEvent, StreamManager };
224
+ //# sourceMappingURL=manager.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.cts","names":[],"sources":["../../src/ui/manager.ts"],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ import { Message } from "../types.messages.js";
2
+ import { CheckpointsStreamEvent, CustomStreamEvent, DebugStreamEvent, ErrorStreamEvent, EventsStreamEvent, FeedbackStreamEvent, MessagesTupleStreamEvent, MetadataStreamEvent, TasksStreamEvent, ToolsStreamEvent, UpdatesStreamEvent, ValuesStreamEvent } from "../types.stream.js";
3
+ import { BagTemplate } from "../types.template.js";
4
+ import { SubagentStreamInterface } from "./types.js";
5
+ import { MessageTupleManager } from "./messages.js";
6
+ import { BaseMessage } from "@langchain/core/messages";
7
+
8
+ //#region src/ui/manager.d.ts
9
+ type GetUpdateType<Bag extends BagTemplate, StateType extends Record<string, unknown>> = Bag extends {
10
+ UpdateType: unknown;
11
+ } ? Bag["UpdateType"] : Partial<StateType>;
12
+ type GetCustomEventType<Bag extends BagTemplate> = Bag extends {
13
+ CustomEventType: unknown;
14
+ } ? Bag["CustomEventType"] : unknown;
15
+ type EventStreamMap<StateType, UpdateType, CustomType> = {
16
+ values: ValuesStreamEvent<StateType>;
17
+ updates: UpdatesStreamEvent<UpdateType>;
18
+ custom: CustomStreamEvent<CustomType>;
19
+ debug: DebugStreamEvent;
20
+ messages: MessagesTupleStreamEvent;
21
+ events: EventsStreamEvent;
22
+ metadata: MetadataStreamEvent;
23
+ checkpoints: CheckpointsStreamEvent<StateType>;
24
+ tasks: TasksStreamEvent<StateType, UpdateType>;
25
+ error: ErrorStreamEvent;
26
+ feedback: FeedbackStreamEvent;
27
+ tools: ToolsStreamEvent;
28
+ };
29
+ type EventStreamEvent<StateType, UpdateType, CustomType> = EventStreamMap<StateType, UpdateType, CustomType>[keyof EventStreamMap<StateType, UpdateType, CustomType>];
30
+ interface StreamManagerEventCallbacks<StateType extends Record<string, unknown>, Bag extends BagTemplate = BagTemplate> {
31
+ onUpdateEvent?: (data: UpdatesStreamEvent<GetUpdateType<Bag, StateType>>["data"], options: {
32
+ namespace: string[] | undefined;
33
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
34
+ }) => void;
35
+ onCustomEvent?: (data: GetCustomEventType<Bag>, options: {
36
+ namespace: string[] | undefined;
37
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
38
+ }) => void;
39
+ onMetadataEvent?: (data: MetadataStreamEvent["data"]) => void;
40
+ onLangChainEvent?: (data: EventsStreamEvent["data"]) => void;
41
+ onDebugEvent?: (data: DebugStreamEvent["data"], options: {
42
+ namespace: string[] | undefined;
43
+ }) => void;
44
+ onCheckpointEvent?: (data: CheckpointsStreamEvent<StateType>["data"], options: {
45
+ namespace: string[] | undefined;
46
+ }) => void;
47
+ onTaskEvent?: (data: TasksStreamEvent<StateType, GetUpdateType<Bag, StateType>>["data"], options: {
48
+ namespace: string[] | undefined;
49
+ }) => void;
50
+ onToolEvent?: (data: ToolsStreamEvent["data"], options: {
51
+ namespace: string[] | undefined;
52
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
53
+ }) => void;
54
+ }
55
+ /**
56
+ * Options for StreamManager constructor.
57
+ */
58
+ interface StreamManagerOptions {
59
+ /**
60
+ * Throttle the stream updates.
61
+ * If a number is provided, updates are throttled to the given milliseconds.
62
+ * If `true`, updates are batched in a single macrotask.
63
+ * If `false`, updates are not throttled.
64
+ */
65
+ throttle: number | boolean;
66
+ /**
67
+ * Tool names that indicate subagent invocation.
68
+ *
69
+ * When an AI message contains tool calls with these names, they are
70
+ * automatically tracked as subagent executions. This enables the
71
+ * `subagents`, `activeSubagents`, `getSubagent()`, and `getSubagentsByType()`
72
+ * properties on the stream.
73
+ *
74
+ * @default ["task"]
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Track both "task" and "delegate" as subagent tools
79
+ * subagentToolNames: ["task", "delegate", "spawn_agent"]
80
+ * ```
81
+ */
82
+ subagentToolNames?: string[];
83
+ /**
84
+ * Filter out messages from subagent streams in the main messages array.
85
+ *
86
+ * When enabled, messages from subagraph executions (those with a `tools:` namespace)
87
+ * are excluded from `stream.messages`. Instead, these messages are tracked
88
+ * per-subagent and accessible via `stream.subagents.get(id).messages`.
89
+ *
90
+ * This is useful for deep agent architectures where you want to display
91
+ * the main conversation separately from subagent activity.
92
+ *
93
+ * @default false
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const stream = useStream({
98
+ * assistantId: "my-agent",
99
+ * filterSubagentMessages: true,
100
+ * });
101
+ *
102
+ * // Main thread messages only (no subagent messages)
103
+ * stream.messages
104
+ *
105
+ * // Access subagent messages individually
106
+ * stream.subagents.get("call_xyz").messages
107
+ * ```
108
+ */
109
+ filterSubagentMessages?: boolean;
110
+ /**
111
+ * Converts a @langchain/core BaseMessage to the desired output format.
112
+ *
113
+ * Defaults to `toMessageDict` which produces plain Message objects.
114
+ * Framework SDKs pass `toMessageClass` (identity) to keep class instances.
115
+ */
116
+ toMessage?: (chunk: BaseMessage) => Message | BaseMessage;
117
+ }
118
+ declare class StreamManager<StateType extends Record<string, unknown>, Bag extends BagTemplate = BagTemplate> {
119
+ private abortRef;
120
+ private messages;
121
+ private subagentManager;
122
+ private listeners;
123
+ private throttle;
124
+ private filterSubagentMessages;
125
+ private toMessage;
126
+ private queue;
127
+ private queueSize;
128
+ private state;
129
+ constructor(messages: MessageTupleManager, options: StreamManagerOptions);
130
+ /**
131
+ * Increment version counter to trigger React re-renders.
132
+ * Called when subagent state changes.
133
+ */
134
+ private bumpVersion;
135
+ /**
136
+ * Get all subagents as a Map.
137
+ */
138
+ getSubagents(): Map<string, SubagentStreamInterface>;
139
+ /**
140
+ * Get all currently running subagents.
141
+ */
142
+ getActiveSubagents(): SubagentStreamInterface[];
143
+ /**
144
+ * Get a specific subagent by tool call ID.
145
+ */
146
+ getSubagent(toolCallId: string): SubagentStreamInterface | undefined;
147
+ /**
148
+ * Get all subagents of a specific type.
149
+ */
150
+ getSubagentsByType(type: string): SubagentStreamInterface[];
151
+ /**
152
+ * Get all subagents triggered by a specific AI message.
153
+ */
154
+ getSubagentsByMessage(messageId: string): SubagentStreamInterface[];
155
+ /**
156
+ * Reconstruct subagent state from historical messages.
157
+ *
158
+ * This method should be called when loading thread history to restore
159
+ * subagent visualization after:
160
+ * - Page refresh (when stream has already completed)
161
+ * - Loading thread history
162
+ * - Navigating between threads
163
+ *
164
+ * @param messages - Array of messages from thread history
165
+ * @param options - Optional configuration
166
+ * @param options.skipIfPopulated - If true, skip reconstruction if subagents already exist
167
+ */
168
+ reconstructSubagents(messages: Message[], options?: {
169
+ skipIfPopulated?: boolean;
170
+ }): void;
171
+ /**
172
+ * Check if any subagents are currently tracked.
173
+ */
174
+ hasSubagents(): boolean;
175
+ private setState;
176
+ private notifyListeners;
177
+ subscribe: (listener: () => void) => () => void;
178
+ getSnapshot: () => {
179
+ isLoading: boolean;
180
+ values: [values: StateType, kind: "stop" | "stream"] | null;
181
+ error: unknown; /** Version counter to force React re-renders on subagent changes */
182
+ version: number;
183
+ };
184
+ get isLoading(): boolean;
185
+ get values(): StateType | null;
186
+ get error(): unknown;
187
+ setStreamValues: (values: StateType | ((prev: StateType | null, kind: "stop" | "stream") => StateType | null) | null, kind?: "stop" | "stream") => void;
188
+ private getMutateFn;
189
+ private matchEventType;
190
+ protected enqueue: (action: (signal: AbortSignal) => Promise<AsyncGenerator<EventStreamEvent<StateType, GetUpdateType<Bag, StateType>, GetCustomEventType<Bag>>, any, any>>, options: {
191
+ getMessages: (values: StateType) => Message[];
192
+ setMessages: (current: StateType, messages: Message[]) => StateType;
193
+ initialValues: StateType;
194
+ callbacks: StreamManagerEventCallbacks<StateType, Bag>;
195
+ onSuccess: () => void | StateType | Promise<void | StateType | null | undefined> | null | undefined;
196
+ onError: (error: unknown) => void | Promise<void>;
197
+ onFinish?: (() => void) | undefined;
198
+ }) => Promise<void>;
199
+ start: (action: (signal: AbortSignal) => Promise<AsyncGenerator<EventStreamEvent<StateType, GetUpdateType<Bag, StateType>, GetCustomEventType<Bag>>, any, any>>, options: {
200
+ getMessages: (values: StateType) => Message[];
201
+ setMessages: (current: StateType, messages: Message[]) => StateType;
202
+ initialValues: StateType;
203
+ callbacks: StreamManagerEventCallbacks<StateType, Bag>;
204
+ onSuccess: () => void | StateType | Promise<void | StateType | null | undefined> | null | undefined;
205
+ onError: (error: unknown) => void | Promise<void>;
206
+ onFinish?: (() => void) | undefined;
207
+ }, startOptions?: {
208
+ /**
209
+ * If true, abort any currently running stream before starting this one.
210
+ * Used for multitask_strategy: "interrupt" and "rollback" to unblock
211
+ * the queue so the new run request can proceed immediately.
212
+ */
213
+ abortPrevious?: boolean | undefined;
214
+ } | undefined) => Promise<void>;
215
+ stop: (historyValues: StateType, options: {
216
+ onStop?: ((options: {
217
+ mutate: (update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)) => void;
218
+ }) => void) | undefined;
219
+ }) => Promise<void>;
220
+ clear: () => void;
221
+ }
222
+ //#endregion
223
+ export { EventStreamEvent, StreamManager };
224
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","names":[],"sources":["../../src/ui/manager.ts"],"mappings":"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"}
@@ -1,13 +1,6 @@
1
1
  import { StreamError } from "./errors.js";
2
2
  import { toMessageDict } from "./messages.js";
3
3
  import { SubagentManager, extractToolCallIdFromNamespace, isSubagentNamespace } from "./subagents.js";
4
-
5
- //#region src/ui/manager.ts
6
- /**
7
- * Special ID used by LangGraph's messagesStateReducer to signal
8
- * that all messages should be removed from the state.
9
- */
10
- const REMOVE_ALL_MESSAGES = "__remove_all__";
11
4
  var StreamManager = class {
12
5
  abortRef = new AbortController();
13
6
  messages;
@@ -15,6 +8,7 @@ var StreamManager = class {
15
8
  listeners = /* @__PURE__ */ new Set();
16
9
  throttle;
17
10
  filterSubagentMessages;
11
+ toMessage;
18
12
  queue = Promise.resolve();
19
13
  queueSize = 0;
20
14
  state;
@@ -28,9 +22,11 @@ var StreamManager = class {
28
22
  };
29
23
  this.throttle = options.throttle;
30
24
  this.filterSubagentMessages = options.filterSubagentMessages ?? false;
25
+ this.toMessage = options.toMessage ?? toMessageDict;
31
26
  this.subagentManager = new SubagentManager({
32
27
  subagentToolNames: options.subagentToolNames,
33
- onSubagentChange: () => this.bumpVersion()
28
+ onSubagentChange: () => this.bumpVersion(),
29
+ toMessage: this.toMessage
34
30
  });
35
31
  }
36
32
  /**
@@ -260,10 +256,10 @@ var StreamManager = class {
260
256
  let messages = options.getMessages(values).slice();
261
257
  const { chunk, index } = this.messages.get(messageId, messages.length) ?? {};
262
258
  if (!chunk || index == null) return values;
263
- if (chunk.getType() === "remove") if (chunk.id === REMOVE_ALL_MESSAGES) messages = [];
259
+ if (chunk.getType() === "remove") if (chunk.id === "__remove_all__") messages = [];
264
260
  else messages.splice(index, 1);
265
261
  else {
266
- const msgDict = toMessageDict(chunk);
262
+ const msgDict = this.toMessage(chunk);
267
263
  messages[index] = msgDict;
268
264
  if (!isFromSubagent && msgDict.type === "ai" && "tool_calls" in msgDict && Array.isArray(msgDict.tool_calls)) this.subagentManager.registerFromToolCalls(msgDict.tool_calls, msgDict.id);
269
265
  if (!isFromSubagent && msgDict.type === "tool" && "tool_call_id" in msgDict) {
@@ -297,7 +293,9 @@ var StreamManager = class {
297
293
  start = async (action, options, startOptions) => {
298
294
  if (startOptions?.abortPrevious) this.abortRef.abort();
299
295
  this.queueSize += 1;
300
- this.queue = this.queue.then(() => this.enqueue(action, options));
296
+ const queued = this.queue.then(() => this.enqueue(action, options));
297
+ this.queue = queued;
298
+ await queued;
301
299
  };
302
300
  stop = async (historyValues, options) => {
303
301
  this.abortRef.abort();
@@ -316,7 +314,7 @@ var StreamManager = class {
316
314
  this.subagentManager.clear();
317
315
  };
318
316
  };
319
-
320
317
  //#endregion
321
318
  export { StreamManager };
319
+
322
320
  //# sourceMappingURL=manager.js.map