@langchain/langgraph-sdk 1.6.4 → 1.7.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 (187) hide show
  1. package/dist/client.cjs +4 -2
  2. package/dist/client.cjs.map +1 -1
  3. package/dist/client.d.cts +7 -0
  4. package/dist/client.d.cts.map +1 -1
  5. package/dist/client.d.ts +7 -0
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +4 -2
  8. package/dist/client.js.map +1 -1
  9. package/dist/index.d.cts +4 -4
  10. package/dist/index.d.ts +4 -4
  11. package/dist/react/index.cjs +46 -10
  12. package/dist/react/index.cjs.map +1 -0
  13. package/dist/react/index.d.cts +14 -11
  14. package/dist/react/index.d.cts.map +1 -0
  15. package/dist/react/index.d.ts +14 -11
  16. package/dist/react/index.d.ts.map +1 -0
  17. package/dist/react/index.js +14 -4
  18. package/dist/react/index.js.map +1 -0
  19. package/dist/react-ui/index.cjs +38 -13
  20. package/dist/react-ui/index.d.cts +1 -2
  21. package/dist/react-ui/index.d.ts +1 -2
  22. package/dist/react-ui/index.js +2 -8
  23. package/dist/react-ui/server/index.cjs +14 -4
  24. package/dist/react-ui/server/index.d.cts +1 -2
  25. package/dist/react-ui/server/index.d.ts +1 -2
  26. package/dist/react-ui/server/index.js +1 -2
  27. package/dist/schema.d.cts +2 -0
  28. package/dist/schema.d.cts.map +1 -1
  29. package/dist/schema.d.ts +2 -0
  30. package/dist/schema.d.ts.map +1 -1
  31. package/dist/types.messages.d.cts +5 -3
  32. package/dist/types.messages.d.cts.map +1 -1
  33. package/dist/types.messages.d.ts +5 -3
  34. package/dist/types.messages.d.ts.map +1 -1
  35. package/dist/types.stream.d.cts +40 -2
  36. package/dist/types.stream.d.cts.map +1 -1
  37. package/dist/types.stream.d.ts +40 -2
  38. package/dist/types.stream.d.ts.map +1 -1
  39. package/dist/ui/branching.cjs +24 -0
  40. package/dist/ui/branching.cjs.map +1 -1
  41. package/dist/ui/branching.d.cts +26 -1
  42. package/dist/ui/branching.d.cts.map +1 -1
  43. package/dist/ui/branching.d.ts +26 -1
  44. package/dist/ui/branching.d.ts.map +1 -1
  45. package/dist/ui/branching.js +25 -1
  46. package/dist/ui/branching.js.map +1 -1
  47. package/dist/ui/index.cjs +30 -0
  48. package/dist/ui/index.d.cts +15 -0
  49. package/dist/ui/index.d.ts +15 -0
  50. package/dist/ui/index.js +11 -0
  51. package/dist/ui/interrupts.cjs +21 -0
  52. package/dist/ui/interrupts.cjs.map +1 -0
  53. package/dist/ui/interrupts.d.cts +11 -0
  54. package/dist/ui/interrupts.d.cts.map +1 -0
  55. package/dist/ui/interrupts.d.ts +11 -0
  56. package/dist/ui/interrupts.d.ts.map +1 -0
  57. package/dist/ui/interrupts.js +20 -0
  58. package/dist/ui/interrupts.js.map +1 -0
  59. package/dist/ui/manager.cjs +12 -3
  60. package/dist/ui/manager.cjs.map +1 -1
  61. package/dist/ui/manager.d.cts +224 -0
  62. package/dist/ui/manager.d.cts.map +1 -0
  63. package/dist/ui/manager.d.ts +224 -0
  64. package/dist/ui/manager.d.ts.map +1 -0
  65. package/dist/ui/manager.js +12 -3
  66. package/dist/ui/manager.js.map +1 -1
  67. package/dist/ui/messages.cjs +19 -0
  68. package/dist/ui/messages.cjs.map +1 -1
  69. package/dist/ui/messages.d.cts +36 -0
  70. package/dist/ui/messages.d.cts.map +1 -0
  71. package/dist/ui/messages.d.ts +36 -0
  72. package/dist/ui/messages.d.ts.map +1 -0
  73. package/dist/ui/messages.js +18 -1
  74. package/dist/ui/messages.js.map +1 -1
  75. package/dist/ui/queue.cjs +75 -0
  76. package/dist/ui/queue.cjs.map +1 -0
  77. package/dist/ui/queue.d.cts +72 -0
  78. package/dist/ui/queue.d.cts.map +1 -0
  79. package/dist/ui/queue.d.ts +72 -0
  80. package/dist/ui/queue.d.ts.map +1 -0
  81. package/dist/ui/queue.js +74 -0
  82. package/dist/ui/queue.js.map +1 -0
  83. package/dist/ui/stream/base.d.cts +17 -1
  84. package/dist/ui/stream/base.d.cts.map +1 -1
  85. package/dist/ui/stream/base.d.ts +17 -1
  86. package/dist/ui/stream/base.d.ts.map +1 -1
  87. package/dist/ui/stream/index.d.cts +4 -4
  88. package/dist/ui/stream/index.d.cts.map +1 -1
  89. package/dist/ui/stream/index.d.ts +4 -4
  90. package/dist/ui/stream/index.d.ts.map +1 -1
  91. package/dist/ui/subagents.cjs +4 -1
  92. package/dist/ui/subagents.cjs.map +1 -1
  93. package/dist/ui/subagents.d.cts +7 -0
  94. package/dist/ui/subagents.d.cts.map +1 -1
  95. package/dist/ui/subagents.d.ts +7 -0
  96. package/dist/ui/subagents.d.ts.map +1 -1
  97. package/dist/ui/subagents.js +4 -1
  98. package/dist/ui/subagents.js.map +1 -1
  99. package/dist/ui/transport.cjs +31 -0
  100. package/dist/ui/transport.cjs.map +1 -0
  101. package/dist/{react/stream.custom.d.cts → ui/transport.d.cts} +3 -3
  102. package/dist/ui/transport.d.cts.map +1 -0
  103. package/dist/{react/stream.custom.d.ts → ui/transport.d.ts} +3 -3
  104. package/dist/ui/transport.d.ts.map +1 -0
  105. package/dist/ui/transport.js +31 -0
  106. package/dist/ui/transport.js.map +1 -0
  107. package/dist/ui/types.d.cts +134 -18
  108. package/dist/ui/types.d.cts.map +1 -1
  109. package/dist/ui/types.d.ts +134 -18
  110. package/dist/ui/types.d.ts.map +1 -1
  111. package/dist/ui/utils.d.cts +7 -0
  112. package/dist/ui/utils.d.cts.map +1 -0
  113. package/dist/ui/utils.d.ts +7 -0
  114. package/dist/ui/utils.d.ts.map +1 -0
  115. package/dist/utils/index.cjs +9 -0
  116. package/dist/utils/index.d.cts +4 -0
  117. package/dist/utils/index.d.ts +4 -0
  118. package/dist/utils/index.js +5 -0
  119. package/dist/utils/sse.d.cts +11 -0
  120. package/dist/utils/sse.d.cts.map +1 -0
  121. package/dist/utils/sse.d.ts +11 -0
  122. package/dist/utils/sse.d.ts.map +1 -0
  123. package/dist/utils/stream.d.cts +19 -0
  124. package/dist/utils/stream.d.cts.map +1 -0
  125. package/dist/utils/stream.d.ts +19 -0
  126. package/dist/utils/stream.d.ts.map +1 -0
  127. package/dist/utils/tools.cjs +26 -17
  128. package/dist/utils/tools.cjs.map +1 -1
  129. package/dist/utils/tools.d.cts +7 -0
  130. package/dist/utils/tools.d.cts.map +1 -0
  131. package/dist/utils/tools.d.ts +7 -0
  132. package/dist/utils/tools.d.ts.map +1 -0
  133. package/dist/utils/tools.js +26 -17
  134. package/dist/utils/tools.js.map +1 -1
  135. package/package.json +42 -13
  136. package/dist/react/stream.cjs +0 -18
  137. package/dist/react/stream.cjs.map +0 -1
  138. package/dist/react/stream.custom.cjs +0 -164
  139. package/dist/react/stream.custom.cjs.map +0 -1
  140. package/dist/react/stream.custom.d.cts.map +0 -1
  141. package/dist/react/stream.custom.d.ts.map +0 -1
  142. package/dist/react/stream.custom.js +0 -162
  143. package/dist/react/stream.custom.js.map +0 -1
  144. package/dist/react/stream.d.cts +0 -174
  145. package/dist/react/stream.d.cts.map +0 -1
  146. package/dist/react/stream.d.ts +0 -174
  147. package/dist/react/stream.d.ts.map +0 -1
  148. package/dist/react/stream.js +0 -17
  149. package/dist/react/stream.js.map +0 -1
  150. package/dist/react/stream.lgp.cjs +0 -482
  151. package/dist/react/stream.lgp.cjs.map +0 -1
  152. package/dist/react/stream.lgp.js +0 -481
  153. package/dist/react/stream.lgp.js.map +0 -1
  154. package/dist/react/thread.cjs +0 -21
  155. package/dist/react/thread.cjs.map +0 -1
  156. package/dist/react/thread.js +0 -20
  157. package/dist/react/thread.js.map +0 -1
  158. package/dist/react/types.d.cts +0 -75
  159. package/dist/react/types.d.cts.map +0 -1
  160. package/dist/react/types.d.ts +0 -75
  161. package/dist/react/types.d.ts.map +0 -1
  162. package/dist/react-ui/client.cjs +0 -138
  163. package/dist/react-ui/client.cjs.map +0 -1
  164. package/dist/react-ui/client.d.cts +0 -76
  165. package/dist/react-ui/client.d.cts.map +0 -1
  166. package/dist/react-ui/client.d.ts +0 -76
  167. package/dist/react-ui/client.d.ts.map +0 -1
  168. package/dist/react-ui/client.js +0 -132
  169. package/dist/react-ui/client.js.map +0 -1
  170. package/dist/react-ui/index.cjs.map +0 -1
  171. package/dist/react-ui/index.js.map +0 -1
  172. package/dist/react-ui/server/server.cjs +0 -57
  173. package/dist/react-ui/server/server.cjs.map +0 -1
  174. package/dist/react-ui/server/server.d.cts +0 -54
  175. package/dist/react-ui/server/server.d.cts.map +0 -1
  176. package/dist/react-ui/server/server.d.ts +0 -54
  177. package/dist/react-ui/server/server.d.ts.map +0 -1
  178. package/dist/react-ui/server/server.js +0 -56
  179. package/dist/react-ui/server/server.js.map +0 -1
  180. package/dist/react-ui/types.cjs +0 -38
  181. package/dist/react-ui/types.cjs.map +0 -1
  182. package/dist/react-ui/types.d.cts +0 -25
  183. package/dist/react-ui/types.d.cts.map +0 -1
  184. package/dist/react-ui/types.d.ts +0 -25
  185. package/dist/react-ui/types.d.ts.map +0 -1
  186. package/dist/react-ui/types.js +0 -35
  187. 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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"}
@@ -15,6 +15,7 @@ var StreamManager = class {
15
15
  listeners = /* @__PURE__ */ new Set();
16
16
  throttle;
17
17
  filterSubagentMessages;
18
+ toMessage;
18
19
  queue = Promise.resolve();
19
20
  queueSize = 0;
20
21
  state;
@@ -28,9 +29,11 @@ var StreamManager = class {
28
29
  };
29
30
  this.throttle = options.throttle;
30
31
  this.filterSubagentMessages = options.filterSubagentMessages ?? false;
32
+ this.toMessage = options.toMessage ?? toMessageDict;
31
33
  this.subagentManager = new SubagentManager({
32
34
  subagentToolNames: options.subagentToolNames,
33
- onSubagentChange: () => this.bumpVersion()
35
+ onSubagentChange: () => this.bumpVersion(),
36
+ toMessage: this.toMessage
34
37
  });
35
38
  }
36
39
  /**
@@ -215,6 +218,10 @@ var StreamManager = class {
215
218
  if (this.matchEventType("checkpoints", event, data)) options.callbacks.onCheckpointEvent?.(data, { namespace });
216
219
  if (this.matchEventType("tasks", event, data)) options.callbacks.onTaskEvent?.(data, { namespace });
217
220
  if (this.matchEventType("debug", event, data)) options.callbacks.onDebugEvent?.(data, { namespace });
221
+ if (this.matchEventType("tools", event, data)) options.callbacks.onToolEvent?.(data, {
222
+ namespace,
223
+ mutate
224
+ });
218
225
  if (event === "values" || event.startsWith("values|")) if (namespace && isSubagentNamespace(namespace)) {
219
226
  const namespaceId = extractToolCallIdFromNamespace(namespace);
220
227
  if (namespaceId && this.filterSubagentMessages) {
@@ -259,7 +266,7 @@ var StreamManager = class {
259
266
  if (chunk.getType() === "remove") if (chunk.id === REMOVE_ALL_MESSAGES) messages = [];
260
267
  else messages.splice(index, 1);
261
268
  else {
262
- const msgDict = toMessageDict(chunk);
269
+ const msgDict = this.toMessage(chunk);
263
270
  messages[index] = msgDict;
264
271
  if (!isFromSubagent && msgDict.type === "ai" && "tool_calls" in msgDict && Array.isArray(msgDict.tool_calls)) this.subagentManager.registerFromToolCalls(msgDict.tool_calls, msgDict.id);
265
272
  if (!isFromSubagent && msgDict.type === "tool" && "tool_call_id" in msgDict) {
@@ -293,7 +300,9 @@ var StreamManager = class {
293
300
  start = async (action, options, startOptions) => {
294
301
  if (startOptions?.abortPrevious) this.abortRef.abort();
295
302
  this.queueSize += 1;
296
- this.queue = this.queue.then(() => this.enqueue(action, options));
303
+ const queued = this.queue.then(() => this.enqueue(action, options));
304
+ this.queue = queued;
305
+ await queued;
297
306
  };
298
307
  stop = async (historyValues, options) => {
299
308
  this.abortRef.abort();