@langchain/svelte 0.0.1 → 0.1.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.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { useStreamCustom } from "./stream.custom.js";
2
2
  import { derived, get, writable } from "svelte/store";
3
3
  import { onDestroy, onMount } from "svelte";
4
- import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass } from "@langchain/langgraph-sdk/ui";
4
+ import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, ensureMessageInstances, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass } from "@langchain/langgraph-sdk/ui";
5
5
  import { Client } from "@langchain/langgraph-sdk";
6
6
  import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
7
7
 
@@ -39,6 +39,7 @@ function useStreamLGP(options) {
39
39
  };
40
40
  const historyLimit = typeof options.fetchStateHistory === "object" && options.fetchStateHistory != null ? options.fetchStateHistory.limit ?? false : options.fetchStateHistory ?? false;
41
41
  const threadId = writable(void 0);
42
+ let threadIdPromise = null;
42
43
  const client = options.client ?? new Client({ apiUrl: options.apiUrl });
43
44
  const history = writable({
44
45
  data: void 0,
@@ -110,10 +111,12 @@ function useStreamLGP(options) {
110
111
  getMessages,
111
112
  branchContext: $branchContext
112
113
  }));
114
+ const subagentVersion = writable(0);
113
115
  const unsubscribe = stream.subscribe(() => {
114
116
  streamValues.set(stream.values);
115
117
  streamError.set(stream.error);
116
118
  isLoading.set(stream.isLoading);
119
+ subagentVersion.update((v) => v + 1);
117
120
  });
118
121
  const unsubQueue = pendingRuns.subscribe(() => {
119
122
  queueEntries.set(pendingRuns.entries);
@@ -163,16 +166,19 @@ function useStreamLGP(options) {
163
166
  return stream.start(async (signal) => {
164
167
  usableThreadId = get(threadId);
165
168
  if (!usableThreadId) {
166
- usableThreadId = (await client.threads.create({
169
+ const threadPromise = client.threads.create({
167
170
  threadId: submitOptions?.threadId,
168
171
  metadata: submitOptions?.metadata
169
- })).thread_id;
172
+ });
173
+ threadIdPromise = threadPromise.then((t) => t.thread_id);
174
+ usableThreadId = (await threadPromise).thread_id;
170
175
  threadId.set(usableThreadId);
171
176
  options.onThreadId?.(usableThreadId);
172
177
  }
173
178
  const streamMode = [
174
179
  "values",
175
180
  "messages-tuple",
181
+ "updates",
176
182
  ...submitOptions?.streamMode ?? []
177
183
  ];
178
184
  if (options.onUpdateEvent && !streamMode.includes("updates")) streamMode.push("updates");
@@ -239,21 +245,26 @@ function useStreamLGP(options) {
239
245
  },
240
246
  onError(error) {
241
247
  options.onError?.(error, callbackMeta);
248
+ submitOptions?.onError?.(error, callbackMeta);
242
249
  },
243
250
  onFinish: () => {}
244
251
  });
245
252
  }
246
253
  let submitting = false;
247
- isLoading.subscribe(($isLoading) => {
248
- if (!$isLoading && !submitting && pendingRuns.size > 0) {
254
+ function drainQueue() {
255
+ if (!get(isLoading) && !submitting && pendingRuns.size > 0) {
249
256
  const next = pendingRuns.shift();
250
257
  if (next) {
251
258
  submitting = true;
252
259
  joinStream(next.id).finally(() => {
253
260
  submitting = false;
261
+ drainQueue();
254
262
  });
255
263
  }
256
264
  }
265
+ }
266
+ isLoading.subscribe(() => {
267
+ drainQueue();
257
268
  });
258
269
  async function submit(values, submitOptions) {
259
270
  if (stream.isLoading || submitting) {
@@ -266,27 +277,33 @@ function useStreamLGP(options) {
266
277
  }
267
278
  return;
268
279
  }
269
- const usableThreadId = get(threadId);
280
+ let usableThreadId = get(threadId);
281
+ if (!usableThreadId && threadIdPromise) usableThreadId = await threadIdPromise;
270
282
  if (usableThreadId) {
271
- const run = await client.runs.create(usableThreadId, options.assistantId, {
272
- input: values,
273
- config: submitOptions?.config,
274
- context: submitOptions?.context,
275
- command: submitOptions?.command,
276
- interruptBefore: submitOptions?.interruptBefore,
277
- interruptAfter: submitOptions?.interruptAfter,
278
- metadata: submitOptions?.metadata,
279
- multitaskStrategy: "enqueue",
280
- streamResumable: true,
281
- streamSubgraphs: submitOptions?.streamSubgraphs,
282
- durability: submitOptions?.durability
283
- });
284
- pendingRuns.add({
285
- id: run.run_id,
286
- values,
287
- options: submitOptions,
288
- createdAt: new Date(run.created_at)
289
- });
283
+ try {
284
+ const run = await client.runs.create(usableThreadId, options.assistantId, {
285
+ input: values,
286
+ config: submitOptions?.config,
287
+ context: submitOptions?.context,
288
+ command: submitOptions?.command,
289
+ interruptBefore: submitOptions?.interruptBefore,
290
+ interruptAfter: submitOptions?.interruptAfter,
291
+ metadata: submitOptions?.metadata,
292
+ multitaskStrategy: "enqueue",
293
+ streamResumable: true,
294
+ streamSubgraphs: submitOptions?.streamSubgraphs,
295
+ durability: submitOptions?.durability
296
+ });
297
+ pendingRuns.add({
298
+ id: run.run_id,
299
+ values,
300
+ options: submitOptions,
301
+ createdAt: new Date(run.created_at)
302
+ });
303
+ } catch (error) {
304
+ options.onError?.(error, void 0);
305
+ submitOptions?.onError?.(error, void 0);
306
+ }
290
307
  return;
291
308
  }
292
309
  }
@@ -294,6 +311,7 @@ function useStreamLGP(options) {
294
311
  const result = submitDirect(values, submitOptions);
295
312
  Promise.resolve(result).finally(() => {
296
313
  submitting = false;
314
+ drainQueue();
297
315
  });
298
316
  return result;
299
317
  }
@@ -339,7 +357,7 @@ function useStreamLGP(options) {
339
357
  }
340
358
  }
341
359
  });
342
- const messages = derived([streamValues, historyValues], ([$streamValues, $historyValues]) => getMessages($streamValues ?? $historyValues));
360
+ const messages = derived([streamValues, historyValues], ([$streamValues, $historyValues]) => ensureMessageInstances(getMessages($streamValues ?? $historyValues)));
343
361
  const interrupt = derived([
344
362
  streamValues,
345
363
  streamError,
@@ -436,12 +454,8 @@ function useStreamLGP(options) {
436
454
  if (newThreadId != null) options.onThreadId?.(newThreadId);
437
455
  }
438
456
  },
439
- get subagents() {
440
- return stream.getSubagents();
441
- },
442
- get activeSubagents() {
443
- return stream.getActiveSubagents();
444
- },
457
+ subagents: derived(subagentVersion, () => stream.getSubagents()),
458
+ activeSubagents: derived(subagentVersion, () => stream.getActiveSubagents()),
445
459
  getSubagent(toolCallId) {
446
460
  return stream.getSubagent(toolCallId);
447
461
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy, onMount } from \"svelte\";\n\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 getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\n filterStream,\n FetchStreamTransport,\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 ResolveStreamInterface,\n type ResolveStreamOptions,\n type InferBag,\n type InferStateType,\n type UseStreamCustomOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport {\n Client,\n type BagTemplate,\n type StreamMode,\n type StreamEvent,\n type Message,\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 };\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\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\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 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 = (() => {\n if (typeof window === \"undefined\") return null;\n const storage = options.reconnectOnMount;\n if (storage === true) return window.sessionStorage;\n if (typeof storage === \"function\") return storage();\n return null;\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 = writable<string | undefined>(undefined);\n\n const client = options.client ?? new Client({ apiUrl: options.apiUrl });\n\n const history = writable<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 ?? get(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 = writable<string>(\"\");\n const branchContext = derived([branch, history], ([$branch, $history]) =>\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\n const historyValues = derived(\n [branchContext],\n ([$branchContext]) =>\n $branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = derived([branchContext], ([$branchContext]) => {\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 = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const queueEntries = writable(pendingRuns.entries);\n const queueSize = writable(pendingRuns.size);\n\n const values = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) => $streamValues ?? $historyValues,\n );\n\n const error = derived(\n [streamError, historyError, history],\n ([$streamError, $historyError, $history]) =>\n $streamError ?? $historyError ?? $history.error,\n );\n\n const messageMetadata = derived(\n [history, branchContext],\n ([$history, $branchContext]) =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: $history.data,\n getMessages,\n branchContext: $branchContext,\n }),\n );\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n });\n\n const unsubQueue = pendingRuns.subscribe(() => {\n queueEntries.set(pendingRuns.entries);\n queueSize.set(pendingRuns.size);\n });\n\n const shouldReconstructSubagents = derived(\n [isLoading, history],\n ([$isLoading, $history]) => {\n if (!options.filterSubagentMessages) return false;\n if ($isLoading || $history.isLoading) return false;\n const hvMessages = getMessages(get(historyValues));\n return hvMessages.length > 0;\n },\n );\n\n const unsubReconstruct = shouldReconstructSubagents.subscribe(($should) => {\n if ($should) {\n const hvMessages = getMessages(get(historyValues));\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n });\n\n onDestroy(() => {\n unsubscribe();\n unsubReconstruct();\n unsubQueue();\n });\n\n function stop() {\n return stream.stop(get(historyValues), {\n onStop: (args) => {\n const tid = get(threadId);\n if (runMetadataStorage && tid) {\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 = get(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 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 = get(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: StreamMode[] = [\n \"values\",\n \"messages-tuple\",\n ...(submitOptions?.streamMode ?? []),\n ];\n if (options.onUpdateEvent && !streamMode.includes(\"updates\"))\n streamMode.push(\"updates\");\n if (options.onCustomEvent && !streamMode.includes(\"custom\"))\n streamMode.push(\"custom\");\n if (options.onCheckpointEvent && !streamMode.includes(\"checkpoints\"))\n streamMode.push(\"checkpoints\");\n if (options.onTaskEvent && !streamMode.includes(\"tasks\"))\n streamMode.push(\"tasks\");\n if (\n \"onDebugEvent\" in options &&\n options.onDebugEvent &&\n !streamMode.includes(\"debug\")\n )\n streamMode.push(\"debug\");\n if (\n \"onLangChainEvent\" in options &&\n options.onLangChainEvent &&\n !streamMode.includes(\"events\")\n )\n streamMode.push(\"events\");\n\n stream.setStreamValues(() => {\n const prev = { ...get(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 const streamResumable =\n submitOptions?.streamResumable ?? !!runMetadataStorage;\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,\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: get(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) {\n options.onError?.(error, callbackMeta);\n },\n onFinish: () => {},\n },\n );\n }\n\n let submitting = false;\n\n isLoading.subscribe(($isLoading) => {\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 = get(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 = get(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: get(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 let shouldReconnect = !!runMetadataStorage;\n\n onMount(() => {\n const tid = get(threadId);\n if (shouldReconnect && runMetadataStorage && tid) {\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) {\n shouldReconnect = false;\n void joinStream(runId);\n }\n }\n });\n\n const messages = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n getMessages($streamValues ?? $historyValues),\n );\n\n const interrupt = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n return extractInterrupts<InterruptType>($streamValues, {\n isLoading: $isLoading,\n threadState: $branchContext.threadHead,\n error: $streamError,\n });\n },\n );\n\n const interrupts = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n const vals = $streamValues ?? get(historyValues);\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 if (allInterrupts.length > 0) return allInterrupts;\n\n const next = $branchContext.threadHead?.next ?? [];\n if (!next.length || $streamError != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n );\n\n const toolCalls = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n getToolCallsWithResults(getMessages($streamValues ?? $historyValues)),\n );\n\n function getToolCalls(message: Message) {\n const currentValues = get(streamValues) ?? get(historyValues);\n const allToolCalls = getToolCallsWithResults(getMessages(currentValues));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const historyList = derived([branchContext], ([$branchContext]) => {\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 = derived(\n [history],\n ([$history]) => $history.isLoading && $history.data == null,\n );\n\n const experimentalBranchTree = derived(\n [branchContext],\n ([$branchContext]) => {\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\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = get(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 isThreadLoading,\n\n branch,\n setBranch,\n\n messages,\n toolCalls,\n getToolCalls,\n\n interrupt,\n interrupts,\n\n history: historyList,\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 = get(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 = get(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 = get(threadId) ?? null;\n if (newThreadId !== current) {\n const prevThreadId = get(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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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport type { Readable } from \"svelte/store\";\nimport { onDestroy, onMount } from \"svelte\";\n\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 getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\n filterStream,\n FetchStreamTransport,\n toMessageClass,\n ensureMessageInstances,\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 ResolveStreamInterface,\n type ResolveStreamOptions,\n type InferBag,\n type InferStateType,\n type AcceptBaseMessages,\n type UseStreamCustomOptions,\n type SubagentStreamInterface,\n} from \"@langchain/langgraph-sdk/ui\";\nimport {\n Client,\n type BagTemplate,\n type StreamMode,\n type StreamEvent,\n type Message,\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 };\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\ntype ClassToolCallWithResult<T> =\n T extends _ToolCallWithResult<infer TC, unknown, unknown>\n ? _ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\nexport type ClassSubagentStreamInterface<\n StateType = Record<string, unknown>,\n ToolCall = DefaultToolCall,\n SubagentName extends string = string,\n> = Omit<\n SubagentStreamInterface<StateType, ToolCall, SubagentName>,\n \"messages\"\n> & {\n messages: BaseMessage[];\n};\n\n/**\n * Maps a stream interface to Svelte-reactive types:\n * - `messages` becomes `Readable<BaseMessage[]>`\n * - `getMessagesMetadata` accepts `BaseMessage`\n * - `toolCalls` uses `@langchain/core` message classes, wrapped in `Readable`\n * - `getToolCalls` accepts `CoreAIMessage`, returns class-based tool call results\n * - `queue` properties are individually mapped (stores → `Readable`, functions unchanged)\n * - `client`, `assistantId`, `subagents`, `activeSubagents` remain unwrapped\n * - Functions remain unchanged\n * - All other properties are wrapped in `Readable<T>` to match Svelte's store system\n */\ntype WithClassMessages<T> = {\n [K in keyof T as K extends\n | \"getSubagent\"\n | \"getSubagentsByType\"\n | \"getSubagentsByMessage\"\n ? never\n : K]: K extends \"messages\"\n ? Readable<BaseMessage[]>\n : K extends \"getMessagesMetadata\"\n ? (\n message: BaseMessage,\n index?: number,\n ) => MessageMetadata<Record<string, unknown>> | undefined\n : K extends \"toolCalls\"\n ? T[K] extends (infer TC)[]\n ? Readable<ClassToolCallWithResult<TC>[]>\n : Readable<T[K]>\n : K extends \"getToolCalls\"\n ? T[K] extends (message: infer _M) => (infer TC)[]\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : T[K]\n : K extends \"queue\"\n ? {\n [QK in keyof T[K]]: T[K][QK] extends (\n ...args: infer A\n ) => infer R\n ? (...args: A) => R\n : Readable<T[K][QK]>;\n }\n : K extends \"client\" | \"assistantId\"\n ? T[K]\n : K extends \"subagents\"\n ? T[K] extends Map<\n string,\n SubagentStreamInterface<infer S, infer TC, infer N>\n >\n ? Map<string, ClassSubagentStreamInterface<S, TC, N>>\n : T[K]\n : K extends \"activeSubagents\"\n ? T[K] extends SubagentStreamInterface<\n infer S,\n infer TC,\n infer N\n >[]\n ? ClassSubagentStreamInterface<S, TC, N>[]\n : T[K]\n : K extends \"submit\"\n ? T[K] extends (\n values: infer V,\n options?: infer O,\n ) => infer Ret\n ? (\n values:\n | AcceptBaseMessages<Exclude<V, null | undefined>>\n | null\n | undefined,\n options?: O,\n ) => Ret\n : T[K]\n : T[K] extends (...args: infer A) => infer R\n ? (...args: A) => R\n : Readable<T[K]>;\n} & (\"subagents\" extends keyof T\n ? {\n getSubagent: T extends {\n getSubagent: (\n id: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N> | undefined;\n }\n ? (\n toolCallId: string,\n ) => ClassSubagentStreamInterface<S, TC, N> | undefined\n : never;\n getSubagentsByType: T extends {\n getSubagentsByType: (\n type: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N>[];\n }\n ? (type: string) => ClassSubagentStreamInterface<S, TC, N>[]\n : never;\n getSubagentsByMessage: T extends {\n getSubagentsByMessage: (\n id: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N>[];\n }\n ? (messageId: string) => ClassSubagentStreamInterface<S, TC, N>[]\n : never;\n }\n : unknown);\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 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 = (() => {\n if (typeof window === \"undefined\") return null;\n const storage = options.reconnectOnMount;\n if (storage === true) return window.sessionStorage;\n if (typeof storage === \"function\") return storage();\n return null;\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 = writable<string | undefined>(undefined);\n let threadIdPromise: Promise<string> | null = null;\n\n const client = options.client ?? new Client({ apiUrl: options.apiUrl });\n\n const history = writable<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 ?? get(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 = writable<string>(\"\");\n const branchContext = derived([branch, history], ([$branch, $history]) =>\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\n const historyValues = derived(\n [branchContext],\n ([$branchContext]) =>\n $branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = derived([branchContext], ([$branchContext]) => {\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 = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const queueEntries = writable(pendingRuns.entries);\n const queueSize = writable(pendingRuns.size);\n\n const values = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) => $streamValues ?? $historyValues,\n );\n\n const error = derived(\n [streamError, historyError, history],\n ([$streamError, $historyError, $history]) =>\n $streamError ?? $historyError ?? $history.error,\n );\n\n const messageMetadata = derived(\n [history, branchContext],\n ([$history, $branchContext]) =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: $history.data,\n getMessages,\n branchContext: $branchContext,\n }),\n );\n\n const subagentVersion = writable(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n subagentVersion.update((v) => v + 1);\n });\n\n const unsubQueue = pendingRuns.subscribe(() => {\n queueEntries.set(pendingRuns.entries);\n queueSize.set(pendingRuns.size);\n });\n\n const shouldReconstructSubagents = derived(\n [isLoading, history],\n ([$isLoading, $history]) => {\n if (!options.filterSubagentMessages) return false;\n if ($isLoading || $history.isLoading) return false;\n const hvMessages = getMessages(get(historyValues));\n return hvMessages.length > 0;\n },\n );\n\n const unsubReconstruct = shouldReconstructSubagents.subscribe(($should) => {\n if ($should) {\n const hvMessages = getMessages(get(historyValues));\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n });\n\n onDestroy(() => {\n unsubscribe();\n unsubReconstruct();\n unsubQueue();\n });\n\n function stop() {\n return stream.stop(get(historyValues), {\n onStop: (args) => {\n const tid = get(threadId);\n if (runMetadataStorage && tid) {\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 = get(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 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 = get(threadId);\n if (!usableThreadId) {\n const threadPromise = client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n });\n\n threadIdPromise = threadPromise.then((t) => t.thread_id);\n\n const thread = await threadPromise;\n\n usableThreadId = thread.thread_id;\n threadId.set(usableThreadId);\n options.onThreadId?.(usableThreadId);\n }\n\n const streamMode: StreamMode[] = [\n \"values\",\n \"messages-tuple\",\n \"updates\",\n ...(submitOptions?.streamMode ?? []),\n ];\n if (options.onUpdateEvent && !streamMode.includes(\"updates\"))\n streamMode.push(\"updates\");\n if (options.onCustomEvent && !streamMode.includes(\"custom\"))\n streamMode.push(\"custom\");\n if (options.onCheckpointEvent && !streamMode.includes(\"checkpoints\"))\n streamMode.push(\"checkpoints\");\n if (options.onTaskEvent && !streamMode.includes(\"tasks\"))\n streamMode.push(\"tasks\");\n if (\n \"onDebugEvent\" in options &&\n options.onDebugEvent &&\n !streamMode.includes(\"debug\")\n )\n streamMode.push(\"debug\");\n if (\n \"onLangChainEvent\" in options &&\n options.onLangChainEvent &&\n !streamMode.includes(\"events\")\n )\n streamMode.push(\"events\");\n\n stream.setStreamValues(() => {\n const prev = { ...get(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 const streamResumable =\n submitOptions?.streamResumable ?? !!runMetadataStorage;\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,\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: get(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) {\n options.onError?.(error, callbackMeta);\n submitOptions?.onError?.(error, callbackMeta);\n },\n onFinish: () => {},\n },\n );\n }\n\n let submitting = false;\n\n function drainQueue() {\n if (!get(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 drainQueue();\n });\n }\n }\n }\n\n isLoading.subscribe(() => {\n drainQueue();\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 let usableThreadId: string | undefined = get(threadId);\n if (!usableThreadId && threadIdPromise) {\n usableThreadId = await threadIdPromise;\n }\n if (usableThreadId) {\n try {\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 } catch (error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\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 drainQueue();\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 = get(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: get(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 let shouldReconnect = !!runMetadataStorage;\n\n onMount(() => {\n const tid = get(threadId);\n if (shouldReconnect && runMetadataStorage && tid) {\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) {\n shouldReconnect = false;\n void joinStream(runId);\n }\n }\n });\n\n const messages = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n ensureMessageInstances(getMessages($streamValues ?? $historyValues)),\n );\n\n const interrupt = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n return extractInterrupts<InterruptType>($streamValues, {\n isLoading: $isLoading,\n threadState: $branchContext.threadHead,\n error: $streamError,\n });\n },\n );\n\n const interrupts = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n const vals = $streamValues ?? get(historyValues);\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 if (allInterrupts.length > 0) return allInterrupts;\n\n const next = $branchContext.threadHead?.next ?? [];\n if (!next.length || $streamError != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n );\n\n const toolCalls = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n getToolCallsWithResults(getMessages($streamValues ?? $historyValues)),\n );\n\n function getToolCalls(message: Message) {\n const currentValues = get(streamValues) ?? get(historyValues);\n const allToolCalls = getToolCallsWithResults(getMessages(currentValues));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const historyList = derived([branchContext], ([$branchContext]) => {\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 = derived(\n [history],\n ([$history]) => $history.isLoading && $history.data == null,\n );\n\n const experimentalBranchTree = derived(\n [branchContext],\n ([$branchContext]) => {\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\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = get(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 isThreadLoading,\n\n branch,\n setBranch,\n\n messages,\n toolCalls,\n getToolCalls,\n\n interrupt,\n interrupts,\n\n history: historyList,\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 = get(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 = get(threadId);\n const removed = pendingRuns.removeAll();\n if (tid && removed.length > 0) {\n await Promise.all(removed.map((e) => client.runs.cancel(tid!, e.id)));\n }\n },\n },\n\n switchThread(newThreadId: string | null) {\n const current = get(threadId) ?? null;\n if (newThreadId !== current) {\n const prevThreadId = get(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 subagents: derived(subagentVersion, () => stream.getSubagents()),\n activeSubagents: derived(subagentVersion, () =>\n 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 SubagentApi,\n SubagentStream,\n SubagentStreamInterface,\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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"}
@@ -5,20 +5,24 @@ let _langchain_langgraph_sdk_utils = require("@langchain/langgraph-sdk/utils");
5
5
 
6
6
  //#region src/stream.custom.ts
7
7
  function useStreamCustom(options) {
8
- const stream = new _langchain_langgraph_sdk_ui.StreamManager(new _langchain_langgraph_sdk_ui.MessageTupleManager(), {
8
+ const messageManager = new _langchain_langgraph_sdk_ui.MessageTupleManager();
9
+ const stream = new _langchain_langgraph_sdk_ui.StreamManager(messageManager, {
9
10
  throttle: options.throttle ?? false,
10
11
  subagentToolNames: options.subagentToolNames,
11
12
  filterSubagentMessages: options.filterSubagentMessages,
12
13
  toMessage: _langchain_langgraph_sdk_ui.toMessageClass
13
14
  });
14
15
  let threadId = options.threadId ?? null;
16
+ const branch = (0, svelte_store.writable)("");
15
17
  const streamValues = (0, svelte_store.writable)(stream.values);
16
18
  const streamError = (0, svelte_store.writable)(stream.error);
17
19
  const isLoading = (0, svelte_store.writable)(stream.isLoading);
20
+ const subagentVersion = (0, svelte_store.writable)(0);
18
21
  const unsubscribe = stream.subscribe(() => {
19
22
  streamValues.set(stream.values);
20
23
  streamError.set(stream.error);
21
24
  isLoading.set(stream.isLoading);
25
+ subagentVersion.update((v) => v + 1);
22
26
  });
23
27
  (0, svelte.onDestroy)(() => {
24
28
  unsubscribe();
@@ -88,6 +92,7 @@ function useStreamCustom(options) {
88
92
  onSuccess: () => void 0,
89
93
  onError(error) {
90
94
  options.onError?.(error, void 0);
95
+ submitOptions?.onError?.(error, void 0);
91
96
  }
92
97
  });
93
98
  }
@@ -97,7 +102,7 @@ function useStreamCustom(options) {
97
102
  const values = (0, svelte_store.derived)([streamValues], ([$streamValues]) => $streamValues ?? {});
98
103
  const messages = (0, svelte_store.derived)([streamValues], ([$streamValues]) => {
99
104
  if (!$streamValues) return [];
100
- return getMessages($streamValues);
105
+ return (0, _langchain_langgraph_sdk_ui.ensureMessageInstances)(getMessages($streamValues));
101
106
  });
102
107
  const toolCalls = (0, svelte_store.derived)([streamValues], ([$streamValues]) => {
103
108
  if (!$streamValues) return [];
@@ -117,6 +122,19 @@ function useStreamCustom(options) {
117
122
  if (!$streamValues) return [];
118
123
  return (0, _langchain_langgraph_sdk_utils.getToolCallsWithResults)(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
119
124
  }
125
+ function setBranch(value) {
126
+ branch.set(value);
127
+ }
128
+ function getMessagesMetadata(message, index) {
129
+ const streamMetadata = messageManager.get(message.id)?.metadata;
130
+ if (streamMetadata != null) return {
131
+ messageId: message.id ?? String(index),
132
+ firstSeenState: void 0,
133
+ branch: void 0,
134
+ branchOptions: void 0,
135
+ streamMetadata
136
+ };
137
+ }
120
138
  return {
121
139
  values,
122
140
  error: streamError,
@@ -124,6 +142,9 @@ function useStreamCustom(options) {
124
142
  stop,
125
143
  submit,
126
144
  switchThread,
145
+ branch,
146
+ setBranch,
147
+ getMessagesMetadata,
127
148
  queue: {
128
149
  entries: (0, svelte_store.writable)([]),
129
150
  size: (0, svelte_store.writable)(0),
@@ -137,12 +158,8 @@ function useStreamCustom(options) {
137
158
  messages,
138
159
  toolCalls,
139
160
  getToolCalls,
140
- get subagents() {
141
- return stream.getSubagents();
142
- },
143
- get activeSubagents() {
144
- return stream.getActiveSubagents();
145
- },
161
+ subagents: (0, svelte_store.derived)(subagentVersion, () => stream.getSubagents()),
162
+ activeSubagents: (0, svelte_store.derived)(subagentVersion, () => stream.getActiveSubagents()),
146
163
  getSubagent(toolCallId) {
147
164
  return stream.getSubagent(toolCallId);
148
165
  },
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.cjs","names":["StreamManager","MessageTupleManager","toMessageClass"],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [] as Message<ToolCallType>[];\n return getMessages($streamValues) as Message<ToolCallType>[];\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\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"],"mappings":"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"}
1
+ {"version":3,"file":"stream.custom.cjs","names":["MessageTupleManager","StreamManager","toMessageClass"],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n ensureMessageInstances,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const branch = writable<string>(\"\");\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const subagentVersion = writable(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n subagentVersion.update((v) => v + 1);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n return ensureMessageInstances(getMessages($streamValues));\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n if (streamMetadata != null) {\n return {\n messageId: message.id ?? String(index),\n firstSeenState: undefined,\n branch: undefined,\n branchOptions: undefined,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n return undefined;\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\n\n subagents: derived(subagentVersion, () => stream.getSubagents()),\n\n activeSubagents: derived(subagentVersion, () =>\n 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"],"mappings":"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"}
@@ -1,24 +1,28 @@
1
1
  import { derived, get, writable } from "svelte/store";
2
2
  import { onDestroy } from "svelte";
3
- import { MessageTupleManager, StreamManager, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
3
+ import { MessageTupleManager, StreamManager, ensureMessageInstances, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
4
4
  import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
5
5
 
6
6
  //#region src/stream.custom.ts
7
7
  function useStreamCustom(options) {
8
- const stream = new StreamManager(new MessageTupleManager(), {
8
+ const messageManager = new MessageTupleManager();
9
+ const stream = new StreamManager(messageManager, {
9
10
  throttle: options.throttle ?? false,
10
11
  subagentToolNames: options.subagentToolNames,
11
12
  filterSubagentMessages: options.filterSubagentMessages,
12
13
  toMessage: toMessageClass
13
14
  });
14
15
  let threadId = options.threadId ?? null;
16
+ const branch = writable("");
15
17
  const streamValues = writable(stream.values);
16
18
  const streamError = writable(stream.error);
17
19
  const isLoading = writable(stream.isLoading);
20
+ const subagentVersion = writable(0);
18
21
  const unsubscribe = stream.subscribe(() => {
19
22
  streamValues.set(stream.values);
20
23
  streamError.set(stream.error);
21
24
  isLoading.set(stream.isLoading);
25
+ subagentVersion.update((v) => v + 1);
22
26
  });
23
27
  onDestroy(() => {
24
28
  unsubscribe();
@@ -88,6 +92,7 @@ function useStreamCustom(options) {
88
92
  onSuccess: () => void 0,
89
93
  onError(error) {
90
94
  options.onError?.(error, void 0);
95
+ submitOptions?.onError?.(error, void 0);
91
96
  }
92
97
  });
93
98
  }
@@ -97,7 +102,7 @@ function useStreamCustom(options) {
97
102
  const values = derived([streamValues], ([$streamValues]) => $streamValues ?? {});
98
103
  const messages = derived([streamValues], ([$streamValues]) => {
99
104
  if (!$streamValues) return [];
100
- return getMessages($streamValues);
105
+ return ensureMessageInstances(getMessages($streamValues));
101
106
  });
102
107
  const toolCalls = derived([streamValues], ([$streamValues]) => {
103
108
  if (!$streamValues) return [];
@@ -117,6 +122,19 @@ function useStreamCustom(options) {
117
122
  if (!$streamValues) return [];
118
123
  return getToolCallsWithResults(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
119
124
  }
125
+ function setBranch(value) {
126
+ branch.set(value);
127
+ }
128
+ function getMessagesMetadata(message, index) {
129
+ const streamMetadata = messageManager.get(message.id)?.metadata;
130
+ if (streamMetadata != null) return {
131
+ messageId: message.id ?? String(index),
132
+ firstSeenState: void 0,
133
+ branch: void 0,
134
+ branchOptions: void 0,
135
+ streamMetadata
136
+ };
137
+ }
120
138
  return {
121
139
  values,
122
140
  error: streamError,
@@ -124,6 +142,9 @@ function useStreamCustom(options) {
124
142
  stop,
125
143
  submit,
126
144
  switchThread,
145
+ branch,
146
+ setBranch,
147
+ getMessagesMetadata,
127
148
  queue: {
128
149
  entries: writable([]),
129
150
  size: writable(0),
@@ -137,12 +158,8 @@ function useStreamCustom(options) {
137
158
  messages,
138
159
  toolCalls,
139
160
  getToolCalls,
140
- get subagents() {
141
- return stream.getSubagents();
142
- },
143
- get activeSubagents() {
144
- return stream.getActiveSubagents();
145
- },
161
+ subagents: derived(subagentVersion, () => stream.getSubagents()),
162
+ activeSubagents: derived(subagentVersion, () => stream.getActiveSubagents()),
146
163
  getSubagent(toolCallId) {
147
164
  return stream.getSubagent(toolCallId);
148
165
  },
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [] as Message<ToolCallType>[];\n return getMessages($streamValues) as Message<ToolCallType>[];\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\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"],"mappings":"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"}
1
+ {"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n ensureMessageInstances,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const branch = writable<string>(\"\");\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const subagentVersion = writable(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n subagentVersion.update((v) => v + 1);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n return ensureMessageInstances(getMessages($streamValues));\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n if (streamMetadata != null) {\n return {\n messageId: message.id ?? String(index),\n firstSeenState: undefined,\n branch: undefined,\n branchOptions: undefined,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n return undefined;\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\n\n subagents: derived(subagentVersion, () => stream.getSubagents()),\n\n activeSubagents: derived(subagentVersion, () =>\n 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"],"mappings":"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"}