@langchain/angular 0.0.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.
@@ -0,0 +1,72 @@
1
+ import * as _angular_core0 from "@angular/core";
2
+ import * as _langchain_langgraph_sdk_ui0 from "@langchain/langgraph-sdk/ui";
3
+ import { AgentTypeConfigLike, AnyStreamOptions, BaseStream, BaseSubagentState, CompiledSubAgentLike, DeepAgentTypeConfigLike, DefaultSubagentStates, ExtractAgentConfig, ExtractDeepAgentConfig, ExtractSubAgentMiddleware, FetchStreamTransport, GetConfigurableType, GetInterruptType, GetToolCallsType, InferAgentToolCalls, InferBag, InferBag as InferBag$1, InferDeepAgentSubagents, InferNodeNames, InferStateType, InferStateType as InferStateType$1, InferSubagentByName, InferSubagentNames, InferSubagentState, InferSubagentStates, InferToolCalls, IsAgentLike, IsDeepAgentLike, MessageMetadata, MessageMetadata as MessageMetadata$1, QueueEntry, QueueInterface, ResolveStreamInterface, ResolveStreamInterface as ResolveStreamInterface$1, ResolveStreamOptions, ResolveStreamOptions as ResolveStreamOptions$1, SubAgentLike, SubagentManager, SubagentStateMap, SubagentStatus, SubagentToolCall, SubmitOptions, UseAgentStream, UseAgentStreamOptions, UseDeepAgentStream, UseDeepAgentStreamOptions, UseStreamCustomOptions, UseStreamCustomOptions as UseStreamCustomOptions$1, UseStreamOptions, UseStreamThread, UseStreamTransport, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace } from "@langchain/langgraph-sdk/ui";
4
+ import * as _langchain_langgraph_sdk0 from "@langchain/langgraph-sdk";
5
+ import { BagTemplate, Client, DefaultToolCall, DefaultToolCall as DefaultToolCall$1, Interrupt, Message, StreamEvent, StreamMode, ThreadState, ToolCallFromTool, ToolCallState, ToolCallWithResult as ToolCallWithResult$1, ToolCallsFromTools } from "@langchain/langgraph-sdk";
6
+ import { AIMessage, BaseMessage, ToolMessage } from "@langchain/core/messages";
7
+
8
+ //#region src/index.d.ts
9
+ type ClassToolCallWithResult<T> = T extends ToolCallWithResult$1<infer TC, unknown, unknown> ? ToolCallWithResult$1<TC, ToolMessage, AIMessage> : T;
10
+ type WithClassMessages<T> = Omit<T, "messages" | "getMessagesMetadata" | "toolCalls" | "getToolCalls"> & {
11
+ messages: BaseMessage[];
12
+ getMessagesMetadata: (message: BaseMessage, index?: number) => MessageMetadata$1<Record<string, unknown>> | undefined;
13
+ } & ("toolCalls" extends keyof T ? {
14
+ toolCalls: T extends {
15
+ toolCalls: (infer TC)[];
16
+ } ? ClassToolCallWithResult<TC>[] : never;
17
+ } : unknown) & ("getToolCalls" extends keyof T ? {
18
+ getToolCalls: T extends {
19
+ getToolCalls: (message: infer _M) => (infer TC)[];
20
+ } ? (message: AIMessage) => ClassToolCallWithResult<TC>[] : never;
21
+ } : unknown);
22
+ declare function useStream<T = Record<string, unknown>, Bag extends BagTemplate = BagTemplate>(options: ResolveStreamOptions$1<T, InferBag$1<T, Bag>>): WithClassMessages<ResolveStreamInterface$1<T, InferBag$1<T, Bag>>>;
23
+ declare function useStream<T = Record<string, unknown>, Bag extends BagTemplate = BagTemplate>(options: UseStreamCustomOptions$1<InferStateType$1<T>, InferBag$1<T, Bag>>): WithClassMessages<ResolveStreamInterface$1<T, InferBag$1<T, Bag>>>;
24
+ declare function useStreamLGP<StateType extends Record<string, unknown> = Record<string, unknown>, Bag extends {
25
+ ConfigurableType?: Record<string, unknown>;
26
+ InterruptType?: unknown;
27
+ CustomEventType?: unknown;
28
+ UpdateType?: unknown;
29
+ } = BagTemplate>(options: AnyStreamOptions<StateType, Bag>): {
30
+ assistantId: string;
31
+ client: Client<_langchain_langgraph_sdk0.DefaultValues, _langchain_langgraph_sdk0.DefaultValues, unknown>;
32
+ values: _angular_core0.Signal<any>;
33
+ error: _angular_core0.Signal<unknown>;
34
+ isLoading: _angular_core0.WritableSignal<boolean>;
35
+ branch: _angular_core0.WritableSignal<string>;
36
+ setBranch: (value: string) => void;
37
+ messages: _angular_core0.Signal<Message[]>;
38
+ toolCalls: _angular_core0.Signal<ToolCallWithResult$1<DefaultToolCall$1>[]>;
39
+ getToolCalls: (message: Message) => ToolCallWithResult$1<DefaultToolCall$1>[];
40
+ interrupt: _angular_core0.Signal<Interrupt<GetInterruptType<Bag>> | undefined>;
41
+ interrupts: _angular_core0.Signal<Interrupt<GetInterruptType<Bag>>[]>;
42
+ history: _angular_core0.Signal<ThreadState<any>[]>;
43
+ isThreadLoading: _angular_core0.Signal<boolean>;
44
+ experimental_branchTree: _angular_core0.Signal<_langchain_langgraph_sdk_ui0.Sequence<any>>;
45
+ getMessagesMetadata: (message: Message, index?: number | undefined) => MessageMetadata$1<StateType> | undefined;
46
+ submit: (values: StateType, submitOptions?: SubmitOptions<StateType, GetConfigurableType<Bag>> | undefined) => Promise<void>;
47
+ stop: () => Promise<void>;
48
+ joinStream: (runId: string, lastEventId?: string | undefined, joinOptions?: {
49
+ streamMode?: StreamMode[] | StreamMode | undefined;
50
+ filter?: ((event: {
51
+ id?: string | undefined;
52
+ event: StreamEvent;
53
+ data: unknown;
54
+ }) => boolean) | undefined;
55
+ } | undefined) => Promise<void>;
56
+ queue: {
57
+ entries: _angular_core0.WritableSignal<readonly _langchain_langgraph_sdk_ui0.QueueEntry<StateType, SubmitOptions<StateType, GetConfigurableType<Bag>>>[]>;
58
+ size: _angular_core0.WritableSignal<number>;
59
+ cancel(id: string): Promise<boolean>;
60
+ clear(): Promise<void>;
61
+ };
62
+ switchThread(newThreadId: string | null): void;
63
+ readonly subagents: Map<string, _langchain_langgraph_sdk_ui0.SubagentStreamInterface<Record<string, unknown>, DefaultToolCall$1, string>>;
64
+ readonly activeSubagents: _langchain_langgraph_sdk_ui0.SubagentStreamInterface<Record<string, unknown>, DefaultToolCall$1, string>[];
65
+ getSubagent(toolCallId: string): _langchain_langgraph_sdk_ui0.SubagentStreamInterface<Record<string, unknown>, DefaultToolCall$1, string> | undefined;
66
+ getSubagentsByType(type: string): _langchain_langgraph_sdk_ui0.SubagentStreamInterface<Record<string, unknown>, DefaultToolCall$1, string>[];
67
+ getSubagentsByMessage(messageId: string): _langchain_langgraph_sdk_ui0.SubagentStreamInterface<Record<string, unknown>, DefaultToolCall$1, string>[];
68
+ };
69
+ type ToolCallWithResult<ToolCall = DefaultToolCall$1> = ToolCallWithResult$1<ToolCall, ToolMessage, AIMessage>;
70
+ //#endregion
71
+ export { type AgentTypeConfigLike, type BaseStream, type BaseSubagentState, type CompiledSubAgentLike, type DeepAgentTypeConfigLike, type DefaultSubagentStates, type DefaultToolCall, type ExtractAgentConfig, type ExtractDeepAgentConfig, type ExtractSubAgentMiddleware, FetchStreamTransport, type GetToolCallsType, type InferAgentToolCalls, type InferBag, type InferDeepAgentSubagents, type InferNodeNames, type InferStateType, type InferSubagentByName, type InferSubagentNames, type InferSubagentState, type InferSubagentStates, type InferToolCalls, type IsAgentLike, type IsDeepAgentLike, type MessageMetadata, type QueueEntry, type QueueInterface, type ResolveStreamInterface, type ResolveStreamOptions, type SubAgentLike, SubagentManager, type SubagentStateMap, type SubagentStatus, type SubagentToolCall, type ToolCallFromTool, type ToolCallState, ToolCallWithResult, type ToolCallsFromTools, type UseAgentStream, type UseAgentStreamOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStreamCustomOptions, type UseStreamOptions, type UseStreamThread, type UseStreamTransport, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace, useStream, useStreamLGP };
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;KAiDK,uBAAA,MACH,CAAA,SAAU,oBAAA,+BACN,oBAAA,CAAoB,EAAA,EAAI,WAAA,EAAiB,SAAA,IACzC,CAAA;AAAA,KAED,iBAAA,MAAuB,IAAA,CAC1B,CAAA;EAGA,QAAA,EAAU,WAAA;EACV,mBAAA,GACE,OAAA,EAAS,WAAA,EACT,KAAA,cACG,iBAAA,CAAgB,MAAA;AAAA,+BACQ,CAAA;EAEvB,SAAA,EAAW,CAAA;IAAY,SAAA;EAAA,IACnB,uBAAA,CAAwB,EAAA;AAAA,6CAIJ,CAAA;EAExB,YAAA,EAAc,CAAA;IACZ,YAAA,GAAe,OAAA;EAAA,KAEZ,OAAA,EAAS,SAAA,KAAkB,uBAAA,CAAwB,EAAA;AAAA;AAAA,iBAqBhD,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,sBAAA,CAAqB,CAAA,EAAG,UAAA,CAAS,CAAA,EAAG,GAAA,KAC5C,iBAAA,CAAkB,wBAAA,CAAuB,CAAA,EAAG,UAAA,CAAS,CAAA,EAAG,GAAA;AAAA,iBAE3C,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,wBAAA,CAAuB,gBAAA,CAAe,CAAA,GAAI,UAAA,CAAS,CAAA,EAAG,GAAA,KAC9D,iBAAA,CAAkB,wBAAA,CAAuB,CAAA,EAAG,UAAA,CAAS,CAAA,EAAG,GAAA;AAAA,iBAmB3C,YAAA,mBACI,MAAA,oBAA0B,MAAA;EAE1C,gBAAA,GAAmB,MAAA;EACnB,aAAA;EACA,eAAA;EACA,UAAA;AAAA,IACE,WAAA,CAAA,CACJ,OAAA,EAAS,gBAAA,CAAiB,SAAA,EAAW,GAAA;;iBAAZ,yBAAA,CAAA,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsqBf,kBAAA,YAA8B,iBAAA,IACxC,oBAAA,CAAoB,QAAA,EAAU,WAAA,EAAiB,SAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,433 @@
1
+ import { useStreamCustom } from "./stream.custom.js";
2
+ import { computed, effect, signal } from "@angular/core";
3
+ import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass } from "@langchain/langgraph-sdk/ui";
4
+ import { Client } from "@langchain/langgraph-sdk";
5
+ import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
6
+
7
+ //#region src/index.ts
8
+ function fetchHistory(client, threadId, options) {
9
+ if (options?.limit === false) return client.threads.getState(threadId).then((state) => {
10
+ if (state.checkpoint == null) return [];
11
+ return [state];
12
+ });
13
+ const limit = typeof options?.limit === "number" ? options.limit : 10;
14
+ return client.threads.getHistory(threadId, { limit });
15
+ }
16
+ function useStream(options) {
17
+ if ("transport" in options) return useStreamCustom(options);
18
+ return useStreamLGP(options);
19
+ }
20
+ function resolveRunMetadataStorage(reconnectOnMount) {
21
+ if (typeof globalThis.window === "undefined") return null;
22
+ if (reconnectOnMount === true) return globalThis.window.sessionStorage;
23
+ if (typeof reconnectOnMount === "function") return reconnectOnMount();
24
+ return null;
25
+ }
26
+ function useStreamLGP(options) {
27
+ const runMetadataStorage = resolveRunMetadataStorage(options.reconnectOnMount);
28
+ const getMessages = (value) => {
29
+ const messagesKey = options.messagesKey ?? "messages";
30
+ return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
31
+ };
32
+ const setMessages = (current, messages) => {
33
+ const messagesKey = options.messagesKey ?? "messages";
34
+ return {
35
+ ...current,
36
+ [messagesKey]: messages
37
+ };
38
+ };
39
+ const historyLimit = typeof options.fetchStateHistory === "object" && options.fetchStateHistory != null ? options.fetchStateHistory.limit ?? false : options.fetchStateHistory ?? false;
40
+ const threadId = signal(void 0);
41
+ const client = options.client ?? new Client({ apiUrl: options.apiUrl });
42
+ const history = signal({
43
+ data: void 0,
44
+ error: void 0,
45
+ isLoading: false,
46
+ mutate: async () => void 0
47
+ });
48
+ async function mutate(mutateId) {
49
+ const tid = mutateId ?? threadId();
50
+ if (!tid) return void 0;
51
+ try {
52
+ const data = await fetchHistory(client, tid, { limit: historyLimit });
53
+ history.set({
54
+ data,
55
+ error: void 0,
56
+ isLoading: false,
57
+ mutate
58
+ });
59
+ return data;
60
+ } catch (err) {
61
+ history.update((prev) => ({
62
+ ...prev,
63
+ error: err,
64
+ isLoading: false
65
+ }));
66
+ options.onError?.(err, void 0);
67
+ return;
68
+ }
69
+ }
70
+ history.update((prev) => ({
71
+ ...prev,
72
+ mutate
73
+ }));
74
+ const branch = signal("");
75
+ const branchContext = computed(() => getBranchContext(branch(), history().data ?? void 0));
76
+ const messageManager = new MessageTupleManager();
77
+ const stream = new StreamManager(messageManager, {
78
+ throttle: options.throttle ?? false,
79
+ subagentToolNames: options.subagentToolNames,
80
+ filterSubagentMessages: options.filterSubagentMessages,
81
+ toMessage: toMessageClass
82
+ });
83
+ const pendingRuns = new PendingRunsTracker();
84
+ const queueEntries = signal(pendingRuns.entries);
85
+ const queueSize = signal(pendingRuns.size);
86
+ const historyValues = computed(() => branchContext().threadHead?.values ?? options.initialValues ?? {});
87
+ const historyError = computed(() => {
88
+ const error = branchContext().threadHead?.tasks?.at(-1)?.error;
89
+ if (error == null) return void 0;
90
+ try {
91
+ const parsed = JSON.parse(error);
92
+ if (StreamError.isStructuredError(parsed)) return new StreamError(parsed);
93
+ return parsed;
94
+ } catch {}
95
+ return error;
96
+ });
97
+ const streamValues = signal(stream.values);
98
+ const streamError = signal(stream.error);
99
+ const isLoading = signal(stream.isLoading);
100
+ const values = computed(() => streamValues() ?? historyValues());
101
+ const error = computed(() => streamError() ?? historyError() ?? history().error);
102
+ const messageMetadata = computed(() => getMessagesMetadataMap({
103
+ initialValues: options.initialValues,
104
+ history: history().data,
105
+ getMessages,
106
+ branchContext: branchContext()
107
+ }));
108
+ effect((onCleanup) => {
109
+ const unsubscribe = stream.subscribe(() => {
110
+ streamValues.set(stream.values);
111
+ streamError.set(stream.error);
112
+ isLoading.set(stream.isLoading);
113
+ });
114
+ onCleanup(() => unsubscribe());
115
+ });
116
+ pendingRuns.subscribe(() => {
117
+ queueEntries.set(pendingRuns.entries);
118
+ queueSize.set(pendingRuns.size);
119
+ });
120
+ effect(() => {
121
+ const hvMessages = getMessages(historyValues());
122
+ if (options.filterSubagentMessages && !isLoading() && !history().isLoading && hvMessages.length > 0) stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });
123
+ });
124
+ function stop() {
125
+ return stream.stop(historyValues(), { onStop: (args) => {
126
+ if (runMetadataStorage && threadId()) {
127
+ const tid = threadId();
128
+ const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);
129
+ if (runId) client.runs.cancel(tid, runId);
130
+ runMetadataStorage.removeItem(`lg:stream:${tid}`);
131
+ }
132
+ options.onStop?.(args);
133
+ } });
134
+ }
135
+ function setBranch(value) {
136
+ branch.set(value);
137
+ }
138
+ function submitDirect(values, submitOptions) {
139
+ const currentBranchContext = branchContext();
140
+ const checkpointId = submitOptions?.checkpoint?.checkpoint_id;
141
+ branch.set(checkpointId != null ? currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? "" : "");
142
+ const includeImplicitBranch = historyLimit === true || typeof historyLimit === "number";
143
+ const shouldRefetch = options.onFinish != null || includeImplicitBranch;
144
+ let checkpoint = submitOptions?.checkpoint ?? (includeImplicitBranch ? currentBranchContext.threadHead?.checkpoint : void 0) ?? void 0;
145
+ if (submitOptions?.checkpoint === null) checkpoint = void 0;
146
+ if (checkpoint != null) delete checkpoint.thread_id;
147
+ const streamResumable = submitOptions?.streamResumable ?? !!runMetadataStorage;
148
+ let callbackMeta;
149
+ let rejoinKey;
150
+ let usableThreadId;
151
+ return stream.start(async (signal) => {
152
+ usableThreadId = threadId();
153
+ if (!usableThreadId) {
154
+ usableThreadId = (await client.threads.create({
155
+ threadId: submitOptions?.threadId,
156
+ metadata: submitOptions?.metadata
157
+ })).thread_id;
158
+ threadId.set(usableThreadId);
159
+ options.onThreadId?.(usableThreadId);
160
+ }
161
+ const streamMode = new Set([
162
+ ...submitOptions?.streamMode ?? [],
163
+ "values",
164
+ "messages-tuple"
165
+ ]);
166
+ if (options.onUpdateEvent) streamMode.add("updates");
167
+ if (options.onCustomEvent) streamMode.add("custom");
168
+ if (options.onCheckpointEvent) streamMode.add("checkpoints");
169
+ if (options.onTaskEvent) streamMode.add("tasks");
170
+ if ("onDebugEvent" in options && options.onDebugEvent) streamMode.add("debug");
171
+ if ("onLangChainEvent" in options && options.onLangChainEvent) streamMode.add("events");
172
+ stream.setStreamValues(() => {
173
+ const prev = {
174
+ ...historyValues(),
175
+ ...stream.values
176
+ };
177
+ if (submitOptions?.optimisticValues != null) return {
178
+ ...prev,
179
+ ...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(prev) : submitOptions.optimisticValues
180
+ };
181
+ return { ...prev };
182
+ });
183
+ return client.runs.stream(usableThreadId, options.assistantId, {
184
+ input: values,
185
+ config: submitOptions?.config,
186
+ context: submitOptions?.context,
187
+ command: submitOptions?.command,
188
+ interruptBefore: submitOptions?.interruptBefore,
189
+ interruptAfter: submitOptions?.interruptAfter,
190
+ metadata: submitOptions?.metadata,
191
+ multitaskStrategy: submitOptions?.multitaskStrategy,
192
+ onCompletion: submitOptions?.onCompletion,
193
+ onDisconnect: submitOptions?.onDisconnect ?? (streamResumable ? "continue" : "cancel"),
194
+ signal,
195
+ checkpoint,
196
+ streamMode: [...streamMode],
197
+ streamSubgraphs: submitOptions?.streamSubgraphs,
198
+ streamResumable,
199
+ durability: submitOptions?.durability,
200
+ onRunCreated(params) {
201
+ callbackMeta = {
202
+ run_id: params.run_id,
203
+ thread_id: params.thread_id ?? usableThreadId
204
+ };
205
+ if (runMetadataStorage) {
206
+ rejoinKey = `lg:stream:${usableThreadId}`;
207
+ runMetadataStorage.setItem(rejoinKey, callbackMeta.run_id);
208
+ }
209
+ options.onCreated?.(callbackMeta);
210
+ }
211
+ });
212
+ }, {
213
+ getMessages,
214
+ setMessages,
215
+ initialValues: historyValues(),
216
+ callbacks: options,
217
+ async onSuccess() {
218
+ if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);
219
+ if (shouldRefetch && usableThreadId) {
220
+ const lastHead = (await mutate(usableThreadId))?.at(0);
221
+ if (lastHead) {
222
+ options.onFinish?.(lastHead, callbackMeta);
223
+ return null;
224
+ }
225
+ }
226
+ },
227
+ onError: (error) => options.onError?.(error, callbackMeta),
228
+ onFinish: () => {}
229
+ });
230
+ }
231
+ let submitting = false;
232
+ effect(() => {
233
+ if (!isLoading() && !submitting && pendingRuns.size > 0) {
234
+ const next = pendingRuns.shift();
235
+ if (next) {
236
+ submitting = true;
237
+ joinStream(next.id).finally(() => {
238
+ submitting = false;
239
+ });
240
+ }
241
+ }
242
+ });
243
+ async function submit(values, submitOptions) {
244
+ if (stream.isLoading || submitting) {
245
+ if (submitOptions?.multitaskStrategy === "interrupt" || submitOptions?.multitaskStrategy === "rollback") {
246
+ submitting = true;
247
+ try {
248
+ await submitDirect(values, submitOptions);
249
+ } finally {
250
+ submitting = false;
251
+ }
252
+ return;
253
+ }
254
+ const usableThreadId = threadId();
255
+ if (usableThreadId) {
256
+ const run = await client.runs.create(usableThreadId, options.assistantId, {
257
+ input: values,
258
+ config: submitOptions?.config,
259
+ context: submitOptions?.context,
260
+ command: submitOptions?.command,
261
+ interruptBefore: submitOptions?.interruptBefore,
262
+ interruptAfter: submitOptions?.interruptAfter,
263
+ metadata: submitOptions?.metadata,
264
+ multitaskStrategy: "enqueue",
265
+ streamResumable: true,
266
+ streamSubgraphs: submitOptions?.streamSubgraphs,
267
+ durability: submitOptions?.durability
268
+ });
269
+ pendingRuns.add({
270
+ id: run.run_id,
271
+ values,
272
+ options: submitOptions,
273
+ createdAt: new Date(run.created_at)
274
+ });
275
+ return;
276
+ }
277
+ }
278
+ submitting = true;
279
+ const result = submitDirect(values, submitOptions);
280
+ Promise.resolve(result).finally(() => {
281
+ submitting = false;
282
+ });
283
+ return result;
284
+ }
285
+ async function joinStream(runId, lastEventId, joinOptions) {
286
+ lastEventId ??= "-1";
287
+ const tid = threadId();
288
+ if (!tid) return;
289
+ const callbackMeta = {
290
+ thread_id: tid,
291
+ run_id: runId
292
+ };
293
+ await stream.start(async (signal) => {
294
+ const rawStream = client.runs.joinStream(tid, runId, {
295
+ signal,
296
+ lastEventId,
297
+ streamMode: joinOptions?.streamMode
298
+ });
299
+ return joinOptions?.filter != null ? filterStream(rawStream, joinOptions.filter) : rawStream;
300
+ }, {
301
+ getMessages,
302
+ setMessages,
303
+ initialValues: historyValues(),
304
+ callbacks: options,
305
+ async onSuccess() {
306
+ runMetadataStorage?.removeItem(`lg:stream:${tid}`);
307
+ const lastHead = (await mutate(tid))?.at(0);
308
+ if (lastHead) options.onFinish?.(lastHead, callbackMeta);
309
+ },
310
+ onError(error) {
311
+ options.onError?.(error, callbackMeta);
312
+ },
313
+ onFinish() {}
314
+ });
315
+ }
316
+ const shouldReconnect = !!runMetadataStorage;
317
+ let hasReconnected = false;
318
+ effect(() => {
319
+ const tid = threadId();
320
+ if (!hasReconnected && shouldReconnect && runMetadataStorage && tid && !isLoading()) {
321
+ const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);
322
+ if (runId) {
323
+ hasReconnected = true;
324
+ joinStream(runId);
325
+ }
326
+ }
327
+ });
328
+ const messages = computed(() => getMessages(values()));
329
+ const toolCalls = computed(() => getToolCallsWithResults(getMessages(values())));
330
+ function getToolCalls(message) {
331
+ return getToolCallsWithResults(getMessages(values())).filter((tc) => tc.aiMessage.id === message.id);
332
+ }
333
+ const interrupt = computed(() => extractInterrupts(values(), {
334
+ isLoading: isLoading(),
335
+ threadState: branchContext().threadHead,
336
+ error: error()
337
+ }));
338
+ const interrupts = computed(() => {
339
+ const vals = values();
340
+ if (vals != null && "__interrupt__" in vals && Array.isArray(vals.__interrupt__)) {
341
+ const valueInterrupts = vals.__interrupt__;
342
+ if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
343
+ return valueInterrupts;
344
+ }
345
+ if (isLoading()) return [];
346
+ const allInterrupts = (branchContext().threadHead?.tasks ?? []).flatMap((t) => t.interrupts ?? []);
347
+ if (allInterrupts.length > 0) return allInterrupts;
348
+ if (!(branchContext().threadHead?.next ?? []).length || error() != null) return [];
349
+ return [{ when: "breakpoint" }];
350
+ });
351
+ const historyList = computed(() => {
352
+ if (historyLimit === false) throw new Error("`fetchStateHistory` must be set to `true` to use `history`");
353
+ return branchContext().flatHistory;
354
+ });
355
+ const isThreadLoading = computed(() => history().isLoading && history().data == null);
356
+ const experimentalBranchTree = computed(() => {
357
+ if (historyLimit === false) throw new Error("`fetchStateHistory` must be set to `true` to use `experimental_branchTree`");
358
+ return branchContext().branchTree;
359
+ });
360
+ function getMessagesMetadata(message, index) {
361
+ const streamMetadata = messageManager.get(message.id)?.metadata;
362
+ const historyMetadata = messageMetadata().find((m) => m.messageId === (message.id ?? index));
363
+ if (streamMetadata != null || historyMetadata != null) return {
364
+ ...historyMetadata,
365
+ streamMetadata
366
+ };
367
+ }
368
+ return {
369
+ assistantId: options.assistantId,
370
+ client,
371
+ values,
372
+ error,
373
+ isLoading,
374
+ branch,
375
+ setBranch,
376
+ messages,
377
+ toolCalls,
378
+ getToolCalls,
379
+ interrupt,
380
+ interrupts,
381
+ history: historyList,
382
+ isThreadLoading,
383
+ experimental_branchTree: experimentalBranchTree,
384
+ getMessagesMetadata,
385
+ submit,
386
+ stop,
387
+ joinStream,
388
+ queue: {
389
+ entries: queueEntries,
390
+ size: queueSize,
391
+ async cancel(id) {
392
+ const tid = threadId();
393
+ const removed = pendingRuns.remove(id);
394
+ if (removed && tid) await client.runs.cancel(tid, id);
395
+ return removed;
396
+ },
397
+ async clear() {
398
+ const tid = threadId();
399
+ const removed = pendingRuns.removeAll();
400
+ if (tid && removed.length > 0) await Promise.all(removed.map((e) => client.runs.cancel(tid, e.id)));
401
+ }
402
+ },
403
+ switchThread(newThreadId) {
404
+ if (newThreadId !== (threadId() ?? null)) {
405
+ const prevThreadId = threadId();
406
+ threadId.set(newThreadId ?? void 0);
407
+ stream.clear();
408
+ const removed = pendingRuns.removeAll();
409
+ if (prevThreadId && removed.length > 0) Promise.all(removed.map((e) => client.runs.cancel(prevThreadId, e.id)));
410
+ if (newThreadId != null) options.onThreadId?.(newThreadId);
411
+ }
412
+ },
413
+ get subagents() {
414
+ return stream.getSubagents();
415
+ },
416
+ get activeSubagents() {
417
+ return stream.getActiveSubagents();
418
+ },
419
+ getSubagent(toolCallId) {
420
+ return stream.getSubagent(toolCallId);
421
+ },
422
+ getSubagentsByType(type) {
423
+ return stream.getSubagentsByType(type);
424
+ },
425
+ getSubagentsByMessage(messageId) {
426
+ return stream.getSubagentsByMessage(messageId);
427
+ }
428
+ };
429
+ }
430
+
431
+ //#endregion
432
+ export { FetchStreamTransport, SubagentManager, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace, useStream, useStreamLGP };
433
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { signal, computed, effect } from \"@angular/core\";\nimport type {\n BaseMessage,\n ToolMessage as CoreToolMessage,\n AIMessage as CoreAIMessage,\n} from \"@langchain/core/messages\";\nimport {\n StreamManager,\n MessageTupleManager,\n PendingRunsTracker,\n filterStream,\n getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\n toMessageClass,\n type UseStreamThread,\n type GetConfigurableType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetUpdateType,\n type MessageMetadata,\n type AnyStreamOptions,\n type SubmitOptions,\n type EventStreamEvent,\n type RunCallbackMeta,\n type ResolveStreamOptions,\n type ResolveStreamInterface,\n type InferBag,\n type InferStateType,\n type UseStreamCustomOptions,\n} from \"@langchain/langgraph-sdk/ui\";\n\nimport {\n Client,\n type StreamEvent,\n type StreamMode,\n type Message,\n type Interrupt,\n type BagTemplate,\n type ThreadState,\n type ToolCallWithResult as _ToolCallWithResult,\n type DefaultToolCall,\n} from \"@langchain/langgraph-sdk\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport { useStreamCustom } from \"./stream.custom.js\";\n\nexport { FetchStreamTransport } from \"@langchain/langgraph-sdk/ui\";\n\ntype ClassToolCallWithResult<T> =\n T extends _ToolCallWithResult<infer TC, unknown, unknown>\n ? _ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\ntype WithClassMessages<T> = Omit<\n T,\n \"messages\" | \"getMessagesMetadata\" | \"toolCalls\" | \"getToolCalls\"\n> & {\n messages: BaseMessage[];\n getMessagesMetadata: (\n message: BaseMessage,\n index?: number,\n ) => MessageMetadata<Record<string, unknown>> | undefined;\n} & (\"toolCalls\" extends keyof T\n ? {\n toolCalls: T extends { toolCalls: (infer TC)[] }\n ? ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown) &\n (\"getToolCalls\" extends keyof T\n ? {\n getToolCalls: T extends {\n getToolCalls: (message: infer _M) => (infer TC)[];\n }\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown);\n\nfunction fetchHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string,\n options?: { limit?: boolean | number },\n) {\n if (options?.limit === false) {\n return client.threads.getState<StateType>(threadId).then((state) => {\n if (state.checkpoint == null) return [];\n return [state];\n });\n }\n\n const limit = typeof options?.limit === \"number\" ? options.limit : 10;\n return client.threads.getHistory<StateType>(threadId, { limit });\n}\n\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: ResolveStreamOptions<T, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useStream(options: any): any {\n if (\"transport\" in options) {\n return useStreamCustom(options);\n }\n return useStreamLGP(options);\n}\n\nfunction resolveRunMetadataStorage(\n reconnectOnMount: AnyStreamOptions[\"reconnectOnMount\"],\n) {\n if (typeof globalThis.window === \"undefined\") return null;\n if (reconnectOnMount === true) return globalThis.window.sessionStorage;\n if (typeof reconnectOnMount === \"function\") return reconnectOnMount();\n return null;\n}\n\nexport function useStreamLGP<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends {\n ConfigurableType?: Record<string, unknown>;\n InterruptType?: unknown;\n CustomEventType?: unknown;\n UpdateType?: unknown;\n } = BagTemplate,\n>(options: AnyStreamOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n\n const runMetadataStorage = resolveRunMetadataStorage(\n options.reconnectOnMount,\n );\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];\n };\n\n const setMessages = (current: StateType, messages: Message[]): StateType => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return { ...current, [messagesKey]: messages };\n };\n\n const historyLimit =\n typeof options.fetchStateHistory === \"object\" &&\n options.fetchStateHistory != null\n ? (options.fetchStateHistory.limit ?? false)\n : (options.fetchStateHistory ?? false);\n\n const threadId = signal<string | undefined>(undefined);\n\n const client = options.client ?? new Client({ apiUrl: options.apiUrl });\n\n const history = signal<UseStreamThread<StateType>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n mutate: async () => undefined,\n });\n\n async function mutate(\n mutateId?: string,\n ): Promise<ThreadState<StateType>[] | undefined> {\n const tid = mutateId ?? threadId();\n if (!tid) return undefined;\n try {\n const data = await fetchHistory<StateType>(client, tid, {\n limit: historyLimit,\n });\n history.set({\n data,\n error: undefined,\n isLoading: false,\n mutate,\n });\n return data;\n } catch (err) {\n history.update((prev) => ({\n ...prev,\n error: err,\n isLoading: false,\n }));\n options.onError?.(err, undefined);\n return undefined;\n }\n }\n\n history.update((prev) => ({ ...prev, mutate }));\n\n const branch = signal<string>(\"\");\n const branchContext = computed(() =>\n getBranchContext(branch(), history().data ?? undefined),\n );\n\n const messageManager = new MessageTupleManager();\n const stream = new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n toMessage: toMessageClass,\n });\n\n const pendingRuns = new PendingRunsTracker<\n StateType,\n SubmitOptions<StateType, ConfigurableType>\n >();\n const queueEntries = signal(pendingRuns.entries);\n const queueSize = signal(pendingRuns.size);\n\n const historyValues = computed(\n () =>\n branchContext().threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = computed(() => {\n const error = branchContext().threadHead?.tasks?.at(-1)?.error;\n if (error == null) return undefined;\n try {\n const parsed = JSON.parse(error) as unknown;\n if (StreamError.isStructuredError(parsed)) return new StreamError(parsed);\n return parsed;\n } catch {\n // do nothing\n }\n return error;\n });\n\n const streamValues = signal<StateType | null>(stream.values);\n const streamError = signal<unknown>(stream.error);\n const isLoading = signal(stream.isLoading);\n\n const values = computed(() => streamValues() ?? historyValues());\n const error = computed(\n () => streamError() ?? historyError() ?? history().error,\n );\n\n const messageMetadata = computed(() =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: history().data,\n getMessages,\n branchContext: branchContext(),\n }),\n );\n\n effect((onCleanup) => {\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n });\n\n onCleanup(() => unsubscribe());\n });\n\n pendingRuns.subscribe(() => {\n queueEntries.set(pendingRuns.entries);\n queueSize.set(pendingRuns.size);\n });\n\n effect(() => {\n const hvMessages = getMessages(historyValues());\n const should =\n options.filterSubagentMessages &&\n !isLoading() &&\n !history().isLoading &&\n hvMessages.length > 0;\n if (should) {\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n });\n\n function stop() {\n return stream.stop(historyValues(), {\n onStop: (args) => {\n if (runMetadataStorage && threadId()) {\n const tid = threadId()!;\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) void client.runs.cancel(tid, runId);\n runMetadataStorage.removeItem(`lg:stream:${tid}`);\n }\n\n options.onStop?.(args);\n },\n });\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function submitDirect(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentBranchContext = branchContext();\n\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n branch.set(\n checkpointId != null\n ? (currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\",\n );\n\n const includeImplicitBranch =\n historyLimit === true || typeof historyLimit === \"number\";\n\n const shouldRefetch = options.onFinish != null || includeImplicitBranch;\n\n let checkpoint =\n submitOptions?.checkpoint ??\n (includeImplicitBranch\n ? currentBranchContext.threadHead?.checkpoint\n : undefined) ??\n undefined;\n\n if (submitOptions?.checkpoint === null) checkpoint = undefined;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (checkpoint != null) delete checkpoint.thread_id;\n\n const streamResumable =\n submitOptions?.streamResumable ?? !!runMetadataStorage;\n\n let callbackMeta: RunCallbackMeta | undefined;\n let rejoinKey: `lg:stream:${string}` | undefined;\n let usableThreadId: string | undefined;\n\n return stream.start(\n async (signal) => {\n usableThreadId = threadId();\n if (!usableThreadId) {\n const thread = await client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n });\n\n usableThreadId = thread.thread_id;\n threadId.set(usableThreadId);\n options.onThreadId?.(usableThreadId);\n }\n\n const streamMode = new Set<StreamMode>([\n ...(submitOptions?.streamMode ?? []),\n \"values\",\n \"messages-tuple\",\n ]);\n if (options.onUpdateEvent) streamMode.add(\"updates\");\n if (options.onCustomEvent) streamMode.add(\"custom\");\n if (options.onCheckpointEvent) streamMode.add(\"checkpoints\");\n if (options.onTaskEvent) streamMode.add(\"tasks\");\n if (\"onDebugEvent\" in options && options.onDebugEvent)\n streamMode.add(\"debug\");\n if (\"onLangChainEvent\" in options && options.onLangChainEvent)\n streamMode.add(\"events\");\n\n stream.setStreamValues(() => {\n const prev = { ...historyValues(), ...stream.values };\n\n if (submitOptions?.optimisticValues != null) {\n return {\n ...prev,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(prev)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...prev };\n });\n\n return client.runs.stream(usableThreadId!, options.assistantId, {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: submitOptions?.multitaskStrategy,\n onCompletion: submitOptions?.onCompletion,\n onDisconnect:\n submitOptions?.onDisconnect ??\n (streamResumable ? \"continue\" : \"cancel\"),\n\n signal,\n\n checkpoint,\n streamMode: [...streamMode],\n streamSubgraphs: submitOptions?.streamSubgraphs,\n streamResumable,\n durability: submitOptions?.durability,\n onRunCreated(params) {\n callbackMeta = {\n run_id: params.run_id,\n thread_id: params.thread_id ?? usableThreadId!,\n };\n\n if (runMetadataStorage) {\n rejoinKey = `lg:stream:${usableThreadId}`;\n runMetadataStorage.setItem(rejoinKey, callbackMeta.run_id);\n }\n\n options.onCreated?.(callbackMeta);\n },\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues(),\n callbacks: options,\n\n async onSuccess() {\n if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);\n\n if (shouldRefetch && usableThreadId) {\n const newHistory = await mutate(usableThreadId);\n const lastHead = newHistory?.at(0);\n if (lastHead) {\n options.onFinish?.(lastHead, callbackMeta);\n return null;\n }\n }\n return undefined;\n },\n onError: (error) => options.onError?.(error, callbackMeta),\n onFinish: () => {},\n },\n );\n }\n\n let submitting = false;\n\n effect(() => {\n if (!isLoading() && !submitting && pendingRuns.size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submitting = true;\n void joinStream(next.id).finally(() => {\n submitting = false;\n });\n }\n }\n });\n\n async function submit(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n if (stream.isLoading || submitting) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submitting = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submitting = false;\n }\n return;\n }\n\n const usableThreadId = threadId();\n if (usableThreadId) {\n const run = await client.runs.create(\n usableThreadId,\n options.assistantId,\n {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: \"enqueue\",\n streamResumable: true,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n durability: submitOptions?.durability,\n },\n );\n\n pendingRuns.add({\n id: run.run_id,\n values: values as Partial<StateType> | null | undefined,\n options: submitOptions,\n createdAt: new Date(run.created_at),\n });\n return;\n }\n }\n\n submitting = true;\n const result = submitDirect(values, submitOptions);\n void Promise.resolve(result).finally(() => {\n submitting = false;\n });\n return result;\n }\n\n async function joinStream(\n runId: string,\n lastEventId?: string,\n joinOptions?: {\n streamMode?: StreamMode | StreamMode[];\n filter?: (event: {\n id?: string;\n event: StreamEvent;\n data: unknown;\n }) => boolean;\n },\n ) {\n // eslint-disable-next-line no-param-reassign\n lastEventId ??= \"-1\";\n const tid = threadId();\n if (!tid) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: tid,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n const rawStream = client.runs.joinStream(tid, runId, {\n signal,\n lastEventId,\n streamMode: joinOptions?.streamMode,\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n\n return joinOptions?.filter != null\n ? filterStream(rawStream, joinOptions.filter)\n : rawStream;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues(),\n callbacks: options,\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${tid}`);\n const newHistory = await mutate(tid);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish() {},\n },\n );\n }\n\n const shouldReconnect = !!runMetadataStorage;\n let hasReconnected = false;\n\n effect(() => {\n const tid = threadId();\n if (\n !hasReconnected &&\n shouldReconnect &&\n runMetadataStorage &&\n tid &&\n !isLoading()\n ) {\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) {\n hasReconnected = true;\n void joinStream(runId);\n }\n }\n });\n\n const messages = computed(() => getMessages(values()));\n\n const toolCalls = computed(() =>\n getToolCallsWithResults(getMessages(values())),\n );\n\n function getToolCalls(message: Message) {\n const allToolCalls = getToolCallsWithResults(getMessages(values()));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const interrupt = computed(() =>\n extractInterrupts<InterruptType>(values(), {\n isLoading: isLoading(),\n threadState: branchContext().threadHead,\n error: error(),\n }),\n );\n\n const interrupts = computed((): Interrupt<InterruptType>[] => {\n const vals = values();\n if (\n vals != null &&\n \"__interrupt__\" in vals &&\n Array.isArray(vals.__interrupt__)\n ) {\n const valueInterrupts = vals.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n if (isLoading()) return [];\n\n const allTasks = branchContext().threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n\n if (allInterrupts.length > 0) {\n return allInterrupts as Interrupt<InterruptType>[];\n }\n\n const next = branchContext().threadHead?.next ?? [];\n if (!next.length || error() != null) return [];\n return [{ when: \"breakpoint\" }];\n });\n\n const historyList = computed(() => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n return branchContext().flatHistory;\n });\n\n const isThreadLoading = computed(\n () => history().isLoading && history().data == null,\n );\n\n const experimentalBranchTree = computed(() => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\",\n );\n }\n return branchContext().branchTree;\n });\n\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata().find(\n (m) => m.messageId === (message.id ?? index),\n );\n\n if (streamMetadata != null || historyMetadata != null) {\n return {\n ...historyMetadata,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n\n return undefined;\n }\n\n return {\n assistantId: options.assistantId,\n client,\n\n values,\n error,\n isLoading,\n\n branch,\n setBranch,\n\n messages,\n toolCalls,\n getToolCalls,\n\n interrupt,\n interrupts,\n\n history: historyList,\n isThreadLoading,\n experimental_branchTree: experimentalBranchTree,\n\n getMessagesMetadata,\n\n submit,\n stop,\n joinStream,\n\n queue: {\n entries: queueEntries,\n size: queueSize,\n async cancel(id: string) {\n const tid = threadId();\n const removed = pendingRuns.remove(id);\n if (removed && tid) {\n await client.runs.cancel(tid, id);\n }\n return removed;\n },\n async clear() {\n const tid = threadId();\n const removed = pendingRuns.removeAll();\n if (tid && removed.length > 0) {\n await Promise.all(\n removed.map((e) => client.runs.cancel(tid!, e.id)),\n );\n }\n },\n },\n\n switchThread(newThreadId: string | null) {\n const current = threadId() ?? null;\n if (newThreadId !== current) {\n const prevThreadId = threadId();\n threadId.set(newThreadId ?? undefined);\n stream.clear();\n\n const removed = pendingRuns.removeAll();\n if (prevThreadId && removed.length > 0) {\n void Promise.all(\n removed.map((e) => client.runs.cancel(prevThreadId, e.id)),\n );\n }\n\n if (newThreadId != null) {\n options.onThreadId?.(newThreadId);\n }\n }\n },\n\n get subagents() {\n return stream.getSubagents();\n },\n get activeSubagents() {\n return stream.getActiveSubagents();\n },\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\n getSubagentsByMessage(messageId: string) {\n return stream.getSubagentsByMessage(messageId);\n },\n };\n}\n\nexport type {\n BaseStream,\n UseAgentStream,\n UseAgentStreamOptions,\n UseDeepAgentStream,\n UseDeepAgentStreamOptions,\n ResolveStreamInterface,\n ResolveStreamOptions,\n InferStateType,\n InferToolCalls,\n InferSubagentStates,\n InferNodeNames,\n InferBag,\n MessageMetadata,\n UseStreamOptions,\n UseStreamCustomOptions,\n UseStreamTransport,\n UseStreamThread,\n GetToolCallsType,\n AgentTypeConfigLike,\n IsAgentLike,\n ExtractAgentConfig,\n InferAgentToolCalls,\n SubagentToolCall,\n SubagentStatus,\n SubAgentLike,\n CompiledSubAgentLike,\n DeepAgentTypeConfigLike,\n IsDeepAgentLike,\n ExtractDeepAgentConfig,\n ExtractSubAgentMiddleware,\n InferDeepAgentSubagents,\n InferSubagentByName,\n InferSubagentState,\n InferSubagentNames,\n SubagentStateMap,\n DefaultSubagentStates,\n BaseSubagentState,\n QueueEntry,\n QueueInterface,\n} from \"@langchain/langgraph-sdk/ui\";\n\nexport type ToolCallWithResult<ToolCall = DefaultToolCall> =\n _ToolCallWithResult<ToolCall, CoreToolMessage, CoreAIMessage>;\nexport type {\n ToolCallState,\n DefaultToolCall,\n ToolCallFromTool,\n ToolCallsFromTools,\n} from \"@langchain/langgraph-sdk\";\n\nexport {\n SubagentManager,\n extractToolCallIdFromNamespace,\n calculateDepthFromNamespace,\n extractParentIdFromNamespace,\n isSubagentNamespace,\n} from \"@langchain/langgraph-sdk/ui\";\n"],"mappings":"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"}