@langchain/vue 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/README.md +54 -6
- package/dist/index.cjs +80 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +18 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +82 -44
- package/dist/index.js.map +1 -1
- package/dist/stream.custom.cjs +30 -6
- package/dist/stream.custom.cjs.map +1 -1
- package/dist/stream.custom.js +32 -8
- package/dist/stream.custom.js.map +1 -1
- package/package.json +23 -22
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useStreamCustom } from "./stream.custom.js";
|
|
2
|
-
import { computed,
|
|
3
|
-
import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass, unique } from "@langchain/langgraph-sdk/ui";
|
|
2
|
+
import { computed, onScopeDispose, ref, shallowRef, watch } from "vue";
|
|
3
|
+
import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, ensureMessageInstances, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass, unique } from "@langchain/langgraph-sdk/ui";
|
|
4
4
|
import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
|
|
5
5
|
import { Client } from "@langchain/langgraph-sdk";
|
|
6
6
|
|
|
@@ -34,6 +34,7 @@ function useStreamLGP(options) {
|
|
|
34
34
|
};
|
|
35
35
|
const historyLimit = typeof options.fetchStateHistory === "object" && options.fetchStateHistory != null ? options.fetchStateHistory.limit ?? false : options.fetchStateHistory ?? false;
|
|
36
36
|
const threadId = ref(void 0);
|
|
37
|
+
let threadIdPromise = null;
|
|
37
38
|
const client = options.client ?? new Client({ apiUrl: options.apiUrl });
|
|
38
39
|
const history = shallowRef({
|
|
39
40
|
data: void 0,
|
|
@@ -79,6 +80,17 @@ function useStreamLGP(options) {
|
|
|
79
80
|
const pendingRuns = new PendingRunsTracker();
|
|
80
81
|
const queueEntries = shallowRef(pendingRuns.entries);
|
|
81
82
|
const queueSize = ref(pendingRuns.size);
|
|
83
|
+
const trackedStreamModes = [];
|
|
84
|
+
function trackStreamMode(...modes) {
|
|
85
|
+
for (const mode of modes) if (!trackedStreamModes.includes(mode)) trackedStreamModes.push(mode);
|
|
86
|
+
}
|
|
87
|
+
const callbackStreamModes = [];
|
|
88
|
+
if (options.onUpdateEvent) callbackStreamModes.push("updates");
|
|
89
|
+
if (options.onCustomEvent) callbackStreamModes.push("custom");
|
|
90
|
+
if (options.onCheckpointEvent) callbackStreamModes.push("checkpoints");
|
|
91
|
+
if (options.onTaskEvent) callbackStreamModes.push("tasks");
|
|
92
|
+
if ("onDebugEvent" in options && options.onDebugEvent) callbackStreamModes.push("debug");
|
|
93
|
+
if ("onLangChainEvent" in options && options.onLangChainEvent) callbackStreamModes.push("events");
|
|
82
94
|
const historyValues = computed(() => branchContext.value.threadHead?.values ?? options.initialValues ?? {});
|
|
83
95
|
const historyError = computed(() => {
|
|
84
96
|
const error = branchContext.value.threadHead?.tasks?.at(-1)?.error;
|
|
@@ -101,18 +113,21 @@ function useStreamLGP(options) {
|
|
|
101
113
|
getMessages,
|
|
102
114
|
branchContext: branchContext.value
|
|
103
115
|
}));
|
|
116
|
+
const subagentVersion = shallowRef(0);
|
|
104
117
|
const unsubscribe = stream.subscribe(() => {
|
|
105
118
|
streamValues.value = stream.values;
|
|
106
119
|
streamError.value = stream.error;
|
|
107
120
|
isLoading.value = stream.isLoading;
|
|
121
|
+
subagentVersion.value += 1;
|
|
108
122
|
});
|
|
109
123
|
const unsubQueue = pendingRuns.subscribe(() => {
|
|
110
124
|
queueEntries.value = pendingRuns.entries;
|
|
111
125
|
queueSize.value = pendingRuns.size;
|
|
112
126
|
});
|
|
113
|
-
|
|
127
|
+
onScopeDispose(() => {
|
|
114
128
|
unsubscribe();
|
|
115
129
|
unsubQueue();
|
|
130
|
+
stop();
|
|
116
131
|
});
|
|
117
132
|
watch(() => {
|
|
118
133
|
const hvMessages = getMessages(historyValues.value);
|
|
@@ -183,24 +198,22 @@ function useStreamLGP(options) {
|
|
|
183
198
|
return stream.start(async (signal) => {
|
|
184
199
|
usableThreadId = threadId.value;
|
|
185
200
|
if (!usableThreadId) {
|
|
186
|
-
|
|
201
|
+
const threadPromise = client.threads.create({
|
|
187
202
|
threadId: submitOptions?.threadId,
|
|
188
203
|
metadata: submitOptions?.metadata
|
|
189
|
-
})
|
|
204
|
+
});
|
|
205
|
+
threadIdPromise = threadPromise.then((t) => t.thread_id);
|
|
206
|
+
usableThreadId = (await threadPromise).thread_id;
|
|
190
207
|
threadId.value = usableThreadId;
|
|
191
208
|
options.onThreadId?.(usableThreadId);
|
|
192
209
|
}
|
|
193
210
|
const streamMode = unique([
|
|
194
|
-
...submitOptions?.streamMode ?? [],
|
|
195
211
|
"values",
|
|
196
|
-
"
|
|
212
|
+
"updates",
|
|
213
|
+
...submitOptions?.streamMode ?? [],
|
|
214
|
+
...trackedStreamModes,
|
|
215
|
+
...callbackStreamModes
|
|
197
216
|
]);
|
|
198
|
-
if (options.onUpdateEvent && !streamMode.includes("updates")) streamMode.push("updates");
|
|
199
|
-
if (options.onCustomEvent && !streamMode.includes("custom")) streamMode.push("custom");
|
|
200
|
-
if (options.onCheckpointEvent && !streamMode.includes("checkpoints")) streamMode.push("checkpoints");
|
|
201
|
-
if (options.onTaskEvent && !streamMode.includes("tasks")) streamMode.push("tasks");
|
|
202
|
-
if ("onDebugEvent" in options && options.onDebugEvent && !streamMode.includes("debug")) streamMode.push("debug");
|
|
203
|
-
if ("onLangChainEvent" in options && options.onLangChainEvent && !streamMode.includes("events")) streamMode.push("events");
|
|
204
217
|
stream.setStreamValues(() => {
|
|
205
218
|
const prev = {
|
|
206
219
|
...historyValues.value,
|
|
@@ -257,25 +270,32 @@ function useStreamLGP(options) {
|
|
|
257
270
|
}
|
|
258
271
|
}
|
|
259
272
|
},
|
|
260
|
-
onError: (error) =>
|
|
273
|
+
onError: (error) => {
|
|
274
|
+
options.onError?.(error, callbackMeta);
|
|
275
|
+
submitOptions?.onError?.(error, callbackMeta);
|
|
276
|
+
},
|
|
261
277
|
onFinish: () => {}
|
|
262
278
|
});
|
|
263
279
|
}
|
|
264
280
|
const submitting = ref(false);
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
submitting: submitting.value,
|
|
268
|
-
size: pendingRuns.size
|
|
269
|
-
}), ({ loading, submitting: s, size }) => {
|
|
270
|
-
if (!loading && !s && size > 0) {
|
|
281
|
+
function drainQueue() {
|
|
282
|
+
if (!isLoading.value && !submitting.value && pendingRuns.size > 0) {
|
|
271
283
|
const next = pendingRuns.shift();
|
|
272
284
|
if (next) {
|
|
273
285
|
submitting.value = true;
|
|
274
286
|
joinStream(next.id).finally(() => {
|
|
275
287
|
submitting.value = false;
|
|
288
|
+
drainQueue();
|
|
276
289
|
});
|
|
277
290
|
}
|
|
278
291
|
}
|
|
292
|
+
}
|
|
293
|
+
watch(() => ({
|
|
294
|
+
loading: isLoading.value,
|
|
295
|
+
submitting: submitting.value,
|
|
296
|
+
size: pendingRuns.size
|
|
297
|
+
}), () => {
|
|
298
|
+
drainQueue();
|
|
279
299
|
});
|
|
280
300
|
async function submit(values, submitOptions) {
|
|
281
301
|
if (stream.isLoading || submitting.value) {
|
|
@@ -288,27 +308,33 @@ function useStreamLGP(options) {
|
|
|
288
308
|
}
|
|
289
309
|
return;
|
|
290
310
|
}
|
|
291
|
-
|
|
311
|
+
let usableThreadId = threadId.value;
|
|
312
|
+
if (!usableThreadId && threadIdPromise) usableThreadId = await threadIdPromise;
|
|
292
313
|
if (usableThreadId) {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
314
|
+
try {
|
|
315
|
+
const run = await client.runs.create(usableThreadId, options.assistantId, {
|
|
316
|
+
input: values,
|
|
317
|
+
config: submitOptions?.config,
|
|
318
|
+
context: submitOptions?.context,
|
|
319
|
+
command: submitOptions?.command,
|
|
320
|
+
interruptBefore: submitOptions?.interruptBefore,
|
|
321
|
+
interruptAfter: submitOptions?.interruptAfter,
|
|
322
|
+
metadata: submitOptions?.metadata,
|
|
323
|
+
multitaskStrategy: "enqueue",
|
|
324
|
+
streamResumable: true,
|
|
325
|
+
streamSubgraphs: submitOptions?.streamSubgraphs,
|
|
326
|
+
durability: submitOptions?.durability
|
|
327
|
+
});
|
|
328
|
+
pendingRuns.add({
|
|
329
|
+
id: run.run_id,
|
|
330
|
+
values,
|
|
331
|
+
options: submitOptions,
|
|
332
|
+
createdAt: new Date(run.created_at)
|
|
333
|
+
});
|
|
334
|
+
} catch (error) {
|
|
335
|
+
options.onError?.(error, void 0);
|
|
336
|
+
submitOptions?.onError?.(error, void 0);
|
|
337
|
+
}
|
|
312
338
|
return;
|
|
313
339
|
}
|
|
314
340
|
}
|
|
@@ -316,11 +342,12 @@ function useStreamLGP(options) {
|
|
|
316
342
|
const result = submitDirect(values, submitOptions);
|
|
317
343
|
Promise.resolve(result).finally(() => {
|
|
318
344
|
submitting.value = false;
|
|
345
|
+
drainQueue();
|
|
319
346
|
});
|
|
320
347
|
return result;
|
|
321
348
|
}
|
|
322
349
|
let shouldReconnect = !!runMetadataStorage;
|
|
323
|
-
|
|
350
|
+
function tryReconnect() {
|
|
324
351
|
if (shouldReconnect && runMetadataStorage && threadId.value) {
|
|
325
352
|
const runId = runMetadataStorage.getItem(`lg:stream:${threadId.value}`);
|
|
326
353
|
if (runId) {
|
|
@@ -328,12 +355,18 @@ function useStreamLGP(options) {
|
|
|
328
355
|
joinStream(runId);
|
|
329
356
|
}
|
|
330
357
|
}
|
|
331
|
-
}
|
|
358
|
+
}
|
|
359
|
+
tryReconnect();
|
|
332
360
|
watch(() => threadId.value, () => {
|
|
333
361
|
shouldReconnect = !!runMetadataStorage;
|
|
362
|
+
tryReconnect();
|
|
363
|
+
});
|
|
364
|
+
const toolCalls = computed(() => {
|
|
365
|
+
trackStreamMode("messages-tuple");
|
|
366
|
+
return getToolCallsWithResults(getMessages(values.value));
|
|
334
367
|
});
|
|
335
|
-
const toolCalls = computed(() => getToolCallsWithResults(getMessages(values.value)));
|
|
336
368
|
function getToolCalls(message) {
|
|
369
|
+
trackStreamMode("messages-tuple");
|
|
337
370
|
return getToolCallsWithResults(getMessages(values.value)).filter((tc) => tc.aiMessage.id === message.id);
|
|
338
371
|
}
|
|
339
372
|
const interrupts = computed(() => {
|
|
@@ -366,7 +399,10 @@ function useStreamLGP(options) {
|
|
|
366
399
|
isLoading,
|
|
367
400
|
branch,
|
|
368
401
|
setBranch,
|
|
369
|
-
messages: computed(() =>
|
|
402
|
+
messages: computed(() => {
|
|
403
|
+
trackStreamMode("messages-tuple");
|
|
404
|
+
return ensureMessageInstances(getMessages(streamValues.value ?? historyValues.value));
|
|
405
|
+
}),
|
|
370
406
|
toolCalls,
|
|
371
407
|
getToolCalls,
|
|
372
408
|
interrupt: computed(() => extractInterrupts(streamValues.value, {
|
|
@@ -415,9 +451,11 @@ function useStreamLGP(options) {
|
|
|
415
451
|
}
|
|
416
452
|
},
|
|
417
453
|
get subagents() {
|
|
454
|
+
subagentVersion.value;
|
|
418
455
|
return stream.getSubagents();
|
|
419
456
|
},
|
|
420
457
|
get activeSubagents() {
|
|
458
|
+
subagentVersion.value;
|
|
421
459
|
return stream.getActiveSubagents();
|
|
422
460
|
},
|
|
423
461
|
getSubagent(toolCallId) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\n computed,\n onMounted,\n onUnmounted,\n ref,\n shallowRef,\n watch,\n type ComputedRef,\n type Ref,\n} from \"vue\";\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 unique,\n getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\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 { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\n\nimport {\n Client,\n type StreamMode,\n type StreamEvent,\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\";\n\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\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 = ref<string | undefined>(undefined);\n\n const client = options.client ?? new Client({ apiUrl: options.apiUrl });\n\n const history = shallowRef<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.value;\n if (!tid) return undefined;\n try {\n const data = await fetchHistory<StateType>(client, tid, {\n limit: historyLimit,\n });\n history.value = {\n data,\n error: undefined,\n isLoading: false,\n mutate,\n };\n return data;\n } catch (err) {\n history.value = {\n ...history.value,\n error: err,\n isLoading: false,\n };\n options.onError?.(err, undefined);\n return undefined;\n }\n }\n\n history.value = { ...history.value, mutate };\n\n const branch = ref<string>(\"\");\n const branchContext = computed(() =>\n getBranchContext(branch.value, history.value.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 = shallowRef(pendingRuns.entries);\n const queueSize = ref(pendingRuns.size);\n\n const historyValues = computed(\n () =>\n branchContext.value.threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = computed(() => {\n const error = branchContext.value.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 = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const values = computed(() => streamValues.value ?? historyValues.value);\n const error = computed(\n () => streamError.value ?? historyError.value ?? history.value.error,\n );\n\n const messageMetadata = computed(() =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: history.value.data,\n getMessages,\n branchContext: branchContext.value,\n }),\n );\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n });\n\n const unsubQueue = pendingRuns.subscribe(() => {\n queueEntries.value = pendingRuns.entries;\n queueSize.value = pendingRuns.size;\n });\n\n onUnmounted(() => {\n unsubscribe();\n unsubQueue();\n });\n\n watch(\n () => {\n const hvMessages = getMessages(historyValues.value);\n return {\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n !history.value.isLoading &&\n hvMessages.length > 0,\n len: hvMessages.length,\n };\n },\n ({ should }) => {\n if (should) {\n const hvMessages = getMessages(historyValues.value);\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n },\n { immediate: true },\n );\n\n function stop() {\n return stream.stop(historyValues.value, {\n onStop: (args) => {\n if (runMetadataStorage && threadId.value) {\n const runId = runMetadataStorage.getItem(\n `lg:stream:${threadId.value}`,\n );\n if (runId) void client.runs.cancel(threadId.value, runId);\n runMetadataStorage.removeItem(`lg:stream:${threadId.value}`);\n }\n\n options.onStop?.(args);\n },\n });\n }\n\n function setBranch(value: string) {\n branch.value = value;\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 if (!threadId.value) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: threadId.value,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n const rawStream = client.runs.joinStream(threadId.value!, 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.value,\n callbacks: options,\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${threadId.value}`);\n const newHistory = await mutate(threadId.value);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n },\n );\n }\n\n function submitDirect(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentBranchContext = branchContext.value;\n\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n branch.value =\n checkpointId != null\n ? (currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\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 = threadId.value;\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.value = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n const streamMode = unique([\n ...(submitOptions?.streamMode ?? []),\n \"values\" as StreamMode,\n \"messages-tuple\" as StreamMode,\n ]);\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 = { ...historyValues.value, ...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: historyValues.value,\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 const submitting = ref(false);\n\n watch(\n () => ({\n loading: isLoading.value,\n submitting: submitting.value,\n size: pendingRuns.size,\n }),\n ({ loading, submitting: s, size }) => {\n if (!loading && !s && size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submitting.value = true;\n void joinStream(next.id).finally(() => {\n submitting.value = false;\n });\n }\n }\n },\n );\n\n async function submit(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n if (stream.isLoading || submitting.value) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submitting.value = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submitting.value = false;\n }\n return;\n }\n\n const usableThreadId = threadId.value;\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.value = true;\n const result = submitDirect(values, submitOptions);\n void Promise.resolve(result).finally(() => {\n submitting.value = false;\n });\n return result;\n }\n\n // --- Auto-reconnect on mount ---\n let shouldReconnect = !!runMetadataStorage;\n\n onMounted(() => {\n if (shouldReconnect && runMetadataStorage && threadId.value) {\n const runId = runMetadataStorage.getItem(`lg:stream:${threadId.value}`);\n if (runId) {\n shouldReconnect = false;\n void joinStream(runId);\n }\n }\n });\n\n watch(\n () => threadId.value,\n () => {\n shouldReconnect = !!runMetadataStorage;\n },\n );\n\n const toolCalls = computed(() =>\n getToolCallsWithResults(getMessages(values.value)),\n );\n\n function getToolCalls(message: Message) {\n const allToolCalls = getToolCallsWithResults(getMessages(values.value));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const interrupts = computed((): Interrupt<InterruptType>[] => {\n const v = values.value;\n if (v != null && \"__interrupt__\" in v && Array.isArray(v.__interrupt__)) {\n const valueInterrupts = v.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n if (isLoading.value) return [];\n\n const allTasks = branchContext.value.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.value.threadHead?.next ?? [];\n if (!next.length || error.value != null) return [];\n return [{ when: \"breakpoint\" }];\n });\n\n const flatHistory = computed(() => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n return branchContext.value.flatHistory;\n });\n\n const isThreadLoading = computed(\n () => history.value.isLoading && history.value.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.value.branchTree;\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: computed(() =>\n getMessages(streamValues.value ?? historyValues.value),\n ),\n\n toolCalls,\n getToolCalls,\n\n interrupt: computed(() =>\n extractInterrupts<InterruptType>(streamValues.value, {\n isLoading: isLoading.value,\n threadState: branchContext.value.threadHead,\n error: streamError.value,\n }),\n ),\n\n interrupts,\n history: flatHistory,\n isThreadLoading,\n experimental_branchTree: experimentalBranchTree,\n\n getMessagesMetadata: (\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined => {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata.value?.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 submit,\n stop,\n joinStream,\n\n queue: {\n entries: queueEntries,\n size: queueSize,\n async cancel(id: string) {\n const tid = threadId.value;\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.value;\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.value ?? null;\n if (newThreadId !== current) {\n const prevThreadId = threadId.value;\n threadId.value = 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\ntype ClassToolCallWithResult<T> =\n T extends _ToolCallWithResult<infer TC, unknown, unknown>\n ? _ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\n/**\n * Maps a stream interface to Vue-reactive types:\n * - `messages` becomes `ComputedRef<BaseMessage[]>`\n * - `getMessagesMetadata` accepts `BaseMessage`\n * - `toolCalls` uses `@langchain/core` message classes, wrapped in `Ref`\n * - `getToolCalls` accepts `CoreAIMessage`, returns class-based tool call results\n * - Functions remain unchanged\n * - All other properties are wrapped in `Ref<T>` to match Vue's reactivity\n */\ntype WithClassMessages<T> = {\n [K in keyof T]: K extends \"messages\"\n ? ComputedRef<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 ? Ref<ClassToolCallWithResult<TC>[]>\n : Ref<T[K]>\n : K extends \"getToolCalls\"\n ? T[K] extends (message: infer _M) => (infer TC)[]\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : T[K]\n : T[K] extends (...args: infer A) => infer R\n ? (...args: A) => R\n : Ref<T[K]>;\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\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 {\n computed,\n onScopeDispose,\n ref,\n shallowRef,\n watch,\n type ComputedRef,\n type Ref,\n} from \"vue\";\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 unique,\n getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\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 { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\n\nimport {\n Client,\n type StreamMode,\n type StreamEvent,\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\";\n\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\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 = ref<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 = shallowRef<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.value;\n if (!tid) return undefined;\n try {\n const data = await fetchHistory<StateType>(client, tid, {\n limit: historyLimit,\n });\n history.value = {\n data,\n error: undefined,\n isLoading: false,\n mutate,\n };\n return data;\n } catch (err) {\n history.value = {\n ...history.value,\n error: err,\n isLoading: false,\n };\n options.onError?.(err, undefined);\n return undefined;\n }\n }\n\n history.value = { ...history.value, mutate };\n\n const branch = ref<string>(\"\");\n const branchContext = computed(() =>\n getBranchContext(branch.value, history.value.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 = shallowRef(pendingRuns.entries);\n const queueSize = ref(pendingRuns.size);\n\n const trackedStreamModes: StreamMode[] = [];\n function trackStreamMode(...modes: StreamMode[]) {\n for (const mode of modes) {\n if (!trackedStreamModes.includes(mode)) {\n trackedStreamModes.push(mode);\n }\n }\n }\n\n const callbackStreamModes: StreamMode[] = [];\n if (options.onUpdateEvent) callbackStreamModes.push(\"updates\");\n if (options.onCustomEvent) callbackStreamModes.push(\"custom\");\n if (options.onCheckpointEvent) callbackStreamModes.push(\"checkpoints\");\n if (options.onTaskEvent) callbackStreamModes.push(\"tasks\");\n if (\"onDebugEvent\" in options && options.onDebugEvent)\n callbackStreamModes.push(\"debug\");\n if (\"onLangChainEvent\" in options && options.onLangChainEvent)\n callbackStreamModes.push(\"events\");\n\n const historyValues = computed(\n () =>\n branchContext.value.threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = computed(() => {\n const error = branchContext.value.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 = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const values = computed(() => streamValues.value ?? historyValues.value);\n const error = computed(\n () => streamError.value ?? historyError.value ?? history.value.error,\n );\n\n const messageMetadata = computed(() =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: history.value.data,\n getMessages,\n branchContext: branchContext.value,\n }),\n );\n\n const subagentVersion = shallowRef(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n subagentVersion.value += 1;\n });\n\n const unsubQueue = pendingRuns.subscribe(() => {\n queueEntries.value = pendingRuns.entries;\n queueSize.value = pendingRuns.size;\n });\n\n onScopeDispose(() => {\n unsubscribe();\n unsubQueue();\n void stop();\n });\n\n watch(\n () => {\n const hvMessages = getMessages(historyValues.value);\n return {\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n !history.value.isLoading &&\n hvMessages.length > 0,\n len: hvMessages.length,\n };\n },\n ({ should }) => {\n if (should) {\n const hvMessages = getMessages(historyValues.value);\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n },\n { immediate: true },\n );\n\n function stop() {\n return stream.stop(historyValues.value, {\n onStop: (args) => {\n if (runMetadataStorage && threadId.value) {\n const runId = runMetadataStorage.getItem(\n `lg:stream:${threadId.value}`,\n );\n if (runId) void client.runs.cancel(threadId.value, runId);\n runMetadataStorage.removeItem(`lg:stream:${threadId.value}`);\n }\n\n options.onStop?.(args);\n },\n });\n }\n\n function setBranch(value: string) {\n branch.value = value;\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 if (!threadId.value) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: threadId.value,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n const rawStream = client.runs.joinStream(threadId.value!, 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.value,\n callbacks: options,\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${threadId.value}`);\n const newHistory = await mutate(threadId.value);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n },\n );\n }\n\n function submitDirect(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentBranchContext = branchContext.value;\n\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n branch.value =\n checkpointId != null\n ? (currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\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 = threadId.value;\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.value = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n const streamMode = unique([\n \"values\" as StreamMode,\n \"updates\" as StreamMode,\n ...(submitOptions?.streamMode ?? []),\n ...trackedStreamModes,\n ...callbackStreamModes,\n ]);\n\n stream.setStreamValues(() => {\n const prev = { ...historyValues.value, ...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: historyValues.value,\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 const submitting = ref(false);\n\n function drainQueue() {\n if (!isLoading.value && !submitting.value && pendingRuns.size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submitting.value = true;\n void joinStream(next.id).finally(() => {\n submitting.value = false;\n drainQueue();\n });\n }\n }\n }\n\n watch(\n () => ({\n loading: isLoading.value,\n submitting: submitting.value,\n size: pendingRuns.size,\n }),\n () => {\n drainQueue();\n },\n );\n\n async function submit(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n if (stream.isLoading || submitting.value) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submitting.value = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submitting.value = false;\n }\n return;\n }\n\n let usableThreadId: string | undefined = threadId.value;\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.value = true;\n const result = submitDirect(values, submitOptions);\n void Promise.resolve(result).finally(() => {\n submitting.value = false;\n drainQueue();\n });\n return result;\n }\n\n // --- Auto-reconnect ---\n let shouldReconnect = !!runMetadataStorage;\n\n function tryReconnect() {\n if (shouldReconnect && runMetadataStorage && threadId.value) {\n const runId = runMetadataStorage.getItem(`lg:stream:${threadId.value}`);\n if (runId) {\n shouldReconnect = false;\n void joinStream(runId);\n }\n }\n }\n\n tryReconnect();\n\n watch(\n () => threadId.value,\n () => {\n shouldReconnect = !!runMetadataStorage;\n tryReconnect();\n },\n );\n\n const toolCalls = computed(() => {\n trackStreamMode(\"messages-tuple\");\n return getToolCallsWithResults(getMessages(values.value));\n });\n\n function getToolCalls(message: Message) {\n trackStreamMode(\"messages-tuple\");\n const allToolCalls = getToolCallsWithResults(getMessages(values.value));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const interrupts = computed((): Interrupt<InterruptType>[] => {\n const v = values.value;\n if (v != null && \"__interrupt__\" in v && Array.isArray(v.__interrupt__)) {\n const valueInterrupts = v.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n if (isLoading.value) return [];\n\n const allTasks = branchContext.value.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.value.threadHead?.next ?? [];\n if (!next.length || error.value != null) return [];\n return [{ when: \"breakpoint\" }];\n });\n\n const flatHistory = computed(() => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n return branchContext.value.flatHistory;\n });\n\n const isThreadLoading = computed(\n () => history.value.isLoading && history.value.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.value.branchTree;\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: computed(() => {\n trackStreamMode(\"messages-tuple\");\n return ensureMessageInstances(\n getMessages(streamValues.value ?? historyValues.value),\n );\n }),\n\n toolCalls,\n getToolCalls,\n\n interrupt: computed(() =>\n extractInterrupts<InterruptType>(streamValues.value, {\n isLoading: isLoading.value,\n threadState: branchContext.value.threadHead,\n error: streamError.value,\n }),\n ),\n\n interrupts,\n history: flatHistory,\n isThreadLoading,\n experimental_branchTree: experimentalBranchTree,\n\n getMessagesMetadata: (\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined => {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata.value?.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 submit,\n stop,\n joinStream,\n\n queue: {\n entries: queueEntries,\n size: queueSize,\n async cancel(id: string) {\n const tid = threadId.value;\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.value;\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 = threadId.value ?? null;\n if (newThreadId !== current) {\n const prevThreadId = threadId.value;\n threadId.value = 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 void subagentVersion.value;\n return stream.getSubagents();\n },\n get activeSubagents() {\n void subagentVersion.value;\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\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 Vue-reactive types:\n * - `messages` becomes `ComputedRef<BaseMessage[]>`\n * - `getMessagesMetadata` accepts `BaseMessage`\n * - `toolCalls` uses `@langchain/core` message classes, wrapped in `Ref`\n * - `getToolCalls` accepts `CoreAIMessage`, returns class-based tool call results\n * - `queue` properties are individually mapped (reactive → `Ref`, functions unchanged)\n * - `client`, `assistantId`, `subagents`, `activeSubagents` remain unwrapped\n * - Functions remain unchanged\n * - All other properties are wrapped in `Ref<T>` to match Vue's reactivity\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 ? ComputedRef<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 ? Ref<ClassToolCallWithResult<TC>[]>\n : Ref<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 : Ref<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 : Ref<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\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 SubagentStream,\n SubagentApi,\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":";;;;;;;AA+DA,SAAS,aACP,QACA,UACA,SACA;AACA,KAAI,SAAS,UAAU,MACrB,QAAO,OAAO,QAAQ,SAAoB,SAAS,CAAC,MAAM,UAAU;AAClE,MAAI,MAAM,cAAc,KAAM,QAAO,EAAE;AACvC,SAAO,CAAC,MAAM;GACd;CAGJ,MAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AACnE,QAAO,OAAO,QAAQ,WAAsB,UAAU,EAAE,OAAO,CAAC;;AAGlE,SAAS,aAQP,SAA2C;CAM3C,MAAM,4BAA4B;AAChC,MAAI,OAAO,WAAW,YAAa,QAAO;EAC1C,MAAM,UAAU,QAAQ;AACxB,MAAI,YAAY,KAAM,QAAO,OAAO;AACpC,MAAI,OAAO,YAAY,WAAY,QAAO,SAAS;AACnD,SAAO;KACL;CAEJ,MAAM,eAAe,UAAgC;EACnD,MAAM,cAAc,QAAQ,eAAe;AAC3C,SAAO,MAAM,QAAQ,MAAM,aAAa,GAAG,MAAM,eAAe,EAAE;;CAGpE,MAAM,eAAe,SAAoB,aAAmC;EAC1E,MAAM,cAAc,QAAQ,eAAe;AAC3C,SAAO;GAAE,GAAG;IAAU,cAAc;GAAU;;CAGhD,MAAM,eACJ,OAAO,QAAQ,sBAAsB,YACrC,QAAQ,qBAAqB,OACxB,QAAQ,kBAAkB,SAAS,QACnC,QAAQ,qBAAqB;CAEpC,MAAM,WAAW,IAAwB,OAAU;CACnD,IAAI,kBAA0C;CAE9C,MAAM,SAAS,QAAQ,UAAU,IAAI,OAAO,EAAE,QAAQ,QAAQ,QAAQ,CAAC;CAEvE,MAAM,UAAU,WAAuC;EACrD,MAAM;EACN,OAAO;EACP,WAAW;EACX,QAAQ,YAAY;EACrB,CAAC;CAEF,eAAe,OACb,UAC+C;EAC/C,MAAM,MAAM,YAAY,SAAS;AACjC,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;GACF,MAAM,OAAO,MAAM,aAAwB,QAAQ,KAAK,EACtD,OAAO,cACR,CAAC;AACF,WAAQ,QAAQ;IACd;IACA,OAAO;IACP,WAAW;IACX;IACD;AACD,UAAO;WACA,KAAK;AACZ,WAAQ,QAAQ;IACd,GAAG,QAAQ;IACX,OAAO;IACP,WAAW;IACZ;AACD,WAAQ,UAAU,KAAK,OAAU;AACjC;;;AAIJ,SAAQ,QAAQ;EAAE,GAAG,QAAQ;EAAO;EAAQ;CAE5C,MAAM,SAAS,IAAY,GAAG;CAC9B,MAAM,gBAAgB,eACpB,iBAAiB,OAAO,OAAO,QAAQ,MAAM,QAAQ,OAAU,CAChE;CAED,MAAM,iBAAiB,IAAI,qBAAqB;CAChD,MAAM,SAAS,IAAI,cAA8B,gBAAgB;EAC/D,UAAU,QAAQ,YAAY;EAC9B,mBAAmB,QAAQ;EAC3B,wBAAwB,QAAQ;EAChC,WAAW;EACZ,CAAC;CAEF,MAAM,cAAc,IAAI,oBAGrB;CACH,MAAM,eAAe,WAAW,YAAY,QAAQ;CACpD,MAAM,YAAY,IAAI,YAAY,KAAK;CAEvC,MAAM,qBAAmC,EAAE;CAC3C,SAAS,gBAAgB,GAAG,OAAqB;AAC/C,OAAK,MAAM,QAAQ,MACjB,KAAI,CAAC,mBAAmB,SAAS,KAAK,CACpC,oBAAmB,KAAK,KAAK;;CAKnC,MAAM,sBAAoC,EAAE;AAC5C,KAAI,QAAQ,cAAe,qBAAoB,KAAK,UAAU;AAC9D,KAAI,QAAQ,cAAe,qBAAoB,KAAK,SAAS;AAC7D,KAAI,QAAQ,kBAAmB,qBAAoB,KAAK,cAAc;AACtE,KAAI,QAAQ,YAAa,qBAAoB,KAAK,QAAQ;AAC1D,KAAI,kBAAkB,WAAW,QAAQ,aACvC,qBAAoB,KAAK,QAAQ;AACnC,KAAI,sBAAsB,WAAW,QAAQ,iBAC3C,qBAAoB,KAAK,SAAS;CAEpC,MAAM,gBAAgB,eAElB,cAAc,MAAM,YAAY,UAChC,QAAQ,iBACP,EAAE,CACN;CAED,MAAM,eAAe,eAAe;EAClC,MAAM,QAAQ,cAAc,MAAM,YAAY,OAAO,GAAG,GAAG,EAAE;AAC7D,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI;GACF,MAAM,SAAS,KAAK,MAAM,MAAM;AAChC,OAAI,YAAY,kBAAkB,OAAO,CAAE,QAAO,IAAI,YAAY,OAAO;AACzE,UAAO;UACD;AAGR,SAAO;GACP;CAEF,MAAM,eAAe,WAA6B,OAAO,OAAO;CAChE,MAAM,cAAc,WAAoB,OAAO,MAAM;CACrD,MAAM,YAAY,WAAW,OAAO,UAAU;CAE9C,MAAM,SAAS,eAAe,aAAa,SAAS,cAAc,MAAM;CACxE,MAAM,QAAQ,eACN,YAAY,SAAS,aAAa,SAAS,QAAQ,MAAM,MAChE;CAED,MAAM,kBAAkB,eACtB,uBAAuB;EACrB,eAAe,QAAQ;EACvB,SAAS,QAAQ,MAAM;EACvB;EACA,eAAe,cAAc;EAC9B,CAAC,CACH;CAED,MAAM,kBAAkB,WAAW,EAAE;CAErC,MAAM,cAAc,OAAO,gBAAgB;AACzC,eAAa,QAAQ,OAAO;AAC5B,cAAY,QAAQ,OAAO;AAC3B,YAAU,QAAQ,OAAO;AACzB,kBAAgB,SAAS;GACzB;CAEF,MAAM,aAAa,YAAY,gBAAgB;AAC7C,eAAa,QAAQ,YAAY;AACjC,YAAU,QAAQ,YAAY;GAC9B;AAEF,sBAAqB;AACnB,eAAa;AACb,cAAY;AACZ,EAAK,MAAM;GACX;AAEF,aACQ;EACJ,MAAM,aAAa,YAAY,cAAc,MAAM;AACnD,SAAO;GACL,QACE,QAAQ,0BACR,CAAC,UAAU,SACX,CAAC,QAAQ,MAAM,aACf,WAAW,SAAS;GACtB,KAAK,WAAW;GACjB;KAEF,EAAE,aAAa;AACd,MAAI,QAAQ;GACV,MAAM,aAAa,YAAY,cAAc,MAAM;AACnD,UAAO,qBAAqB,YAAY,EAAE,iBAAiB,MAAM,CAAC;;IAGtE,EAAE,WAAW,MAAM,CACpB;CAED,SAAS,OAAO;AACd,SAAO,OAAO,KAAK,cAAc,OAAO,EACtC,SAAS,SAAS;AAChB,OAAI,sBAAsB,SAAS,OAAO;IACxC,MAAM,QAAQ,mBAAmB,QAC/B,aAAa,SAAS,QACvB;AACD,QAAI,MAAO,CAAK,OAAO,KAAK,OAAO,SAAS,OAAO,MAAM;AACzD,uBAAmB,WAAW,aAAa,SAAS,QAAQ;;AAG9D,WAAQ,SAAS,KAAK;KAEzB,CAAC;;CAGJ,SAAS,UAAU,OAAe;AAChC,SAAO,QAAQ;;CAGjB,eAAe,WACb,OACA,aACA,aAQA;AAEA,kBAAgB;AAChB,MAAI,CAAC,SAAS,MAAO;EAErB,MAAM,eAAgC;GACpC,WAAW,SAAS;GACpB,QAAQ;GACT;AAED,QAAM,OAAO,MACX,OAAO,WAAwB;GAC7B,MAAM,YAAY,OAAO,KAAK,WAAW,SAAS,OAAQ,OAAO;IAC/D;IACA;IACA,YAAY,aAAa;IAC1B,CAAC;AAIF,UAAO,aAAa,UAAU,OAC1B,aAAa,WAAW,YAAY,OAAO,GAC3C;KAEN;GACE;GACA;GAEA,eAAe,cAAc;GAC7B,WAAW;GACX,MAAM,YAAY;AAChB,wBAAoB,WAAW,aAAa,SAAS,QAAQ;IAE7D,MAAM,YADa,MAAM,OAAO,SAAS,MAAM,GAClB,GAAG,EAAE;AAClC,QAAI,SAAU,SAAQ,WAAW,UAAU,aAAa;;GAE1D,QAAQ,OAAO;AACb,YAAQ,UAAU,OAAO,aAAa;;GAEzC,CACF;;CAGH,SAAS,aACP,QACA,eACA;EACA,MAAM,uBAAuB,cAAc;EAE3C,MAAM,eAAe,eAAe,YAAY;AAChD,SAAO,QACL,gBAAgB,OACX,qBAAqB,mBAAmB,eAAe,UAAU,KAClE;EAEN,MAAM,wBACJ,iBAAiB,QAAQ,OAAO,iBAAiB;EAEnD,MAAM,gBAAgB,QAAQ,YAAY,QAAQ;EAElD,IAAI,aACF,eAAe,eACd,wBACG,qBAAqB,YAAY,aACjC,WACJ;AAEF,MAAI,eAAe,eAAe,KAAM,cAAa;AAGrD,MAAI,cAAc,KAAM,QAAO,WAAW;EAE1C,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,SAAO,OAAO,MACZ,OAAO,WAAW;AAChB,oBAAiB,SAAS;AAC1B,OAAI,CAAC,gBAAgB;IACnB,MAAM,gBAAgB,OAAO,QAAQ,OAAO;KAC1C,UAAU,eAAe;KACzB,UAAU,eAAe;KAC1B,CAAC;AAEF,sBAAkB,cAAc,MAAM,MAAM,EAAE,UAAU;AAIxD,sBAFe,MAAM,eAEG;AACxB,aAAS,QAAQ;AACjB,YAAQ,aAAa,eAAe;;GAGtC,MAAM,aAAa,OAAO;IACxB;IACA;IACA,GAAI,eAAe,cAAc,EAAE;IACnC,GAAG;IACH,GAAG;IACJ,CAAC;AAEF,UAAO,sBAAsB;IAC3B,MAAM,OAAO;KAAE,GAAG,cAAc;KAAO,GAAG,OAAO;KAAQ;AAEzD,QAAI,eAAe,oBAAoB,KACrC,QAAO;KACL,GAAG;KACH,GAAI,OAAO,cAAc,qBAAqB,aAC1C,cAAc,iBAAiB,KAAK,GACpC,cAAc;KACnB;AAGH,WAAO,EAAE,GAAG,MAAM;KAClB;GAEF,MAAM,kBACJ,eAAe,mBAAmB,CAAC,CAAC;AAEtC,UAAO,OAAO,KAAK,OAAO,gBAAiB,QAAQ,aAAa;IAC9D,OAAO;IACP,QAAQ,eAAe;IACvB,SAAS,eAAe;IACxB,SAAS,eAAe;IAExB,iBAAiB,eAAe;IAChC,gBAAgB,eAAe;IAC/B,UAAU,eAAe;IACzB,mBAAmB,eAAe;IAClC,cAAc,eAAe;IAC7B,cACE,eAAe,iBACd,kBAAkB,aAAa;IAElC;IAEA;IACA;IACA,iBAAiB,eAAe;IAChC;IACA,YAAY,eAAe;IAC3B,aAAa,QAAQ;AACnB,oBAAe;MACb,QAAQ,OAAO;MACf,WAAW,OAAO,aAAa;MAChC;AAED,SAAI,oBAAoB;AACtB,kBAAY,aAAa;AACzB,yBAAmB,QAAQ,WAAW,aAAa,OAAO;;AAG5D,aAAQ,YAAY,aAAa;;IAEpC,CAAC;KAIJ;GACE;GACA;GAEA,eAAe,cAAc;GAC7B,WAAW;GAEX,MAAM,YAAY;AAChB,QAAI,UAAW,qBAAoB,WAAW,UAAU;AAExD,QAAI,iBAAiB,gBAAgB;KAEnC,MAAM,YADa,MAAM,OAAO,eAAe,GAClB,GAAG,EAAE;AAClC,SAAI,UAAU;AACZ,cAAQ,WAAW,UAAU,aAAa;AAC1C,aAAO;;;;GAKb,UAAU,UAAU;AAClB,YAAQ,UAAU,OAAO,aAAa;AACtC,mBAAe,UAAU,OAAO,aAAa;;GAE/C,gBAAgB;GACjB,CACF;;CAGH,MAAM,aAAa,IAAI,MAAM;CAE7B,SAAS,aAAa;AACpB,MAAI,CAAC,UAAU,SAAS,CAAC,WAAW,SAAS,YAAY,OAAO,GAAG;GACjE,MAAM,OAAO,YAAY,OAAO;AAChC,OAAI,MAAM;AACR,eAAW,QAAQ;AACnB,IAAK,WAAW,KAAK,GAAG,CAAC,cAAc;AACrC,gBAAW,QAAQ;AACnB,iBAAY;MACZ;;;;AAKR,cACS;EACL,SAAS,UAAU;EACnB,YAAY,WAAW;EACvB,MAAM,YAAY;EACnB,SACK;AACJ,cAAY;GAEf;CAED,eAAe,OACb,QACA,eACA;AACA,MAAI,OAAO,aAAa,WAAW,OAAO;AAKxC,OAHE,eAAe,sBAAsB,eACrC,eAAe,sBAAsB,YAEtB;AACf,eAAW,QAAQ;AACnB,QAAI;AACF,WAAM,aAAa,QAAQ,cAAc;cACjC;AACR,gBAAW,QAAQ;;AAErB;;GAGF,IAAI,iBAAqC,SAAS;AAClD,OAAI,CAAC,kBAAkB,gBACrB,kBAAiB,MAAM;AAEzB,OAAI,gBAAgB;AAClB,QAAI;KACF,MAAM,MAAM,MAAM,OAAO,KAAK,OAC5B,gBACA,QAAQ,aACR;MACE,OAAO;MACP,QAAQ,eAAe;MACvB,SAAS,eAAe;MACxB,SAAS,eAAe;MACxB,iBAAiB,eAAe;MAChC,gBAAgB,eAAe;MAC/B,UAAU,eAAe;MACzB,mBAAmB;MACnB,iBAAiB;MACjB,iBAAiB,eAAe;MAChC,YAAY,eAAe;MAC5B,CACF;AAED,iBAAY,IAAI;MACd,IAAI,IAAI;MACA;MACR,SAAS;MACT,WAAW,IAAI,KAAK,IAAI,WAAW;MACpC,CAAC;aACK,OAAO;AACd,aAAQ,UAAU,OAAO,OAAU;AACnC,oBAAe,UAAU,OAAO,OAAU;;AAE5C;;;AAIJ,aAAW,QAAQ;EACnB,MAAM,SAAS,aAAa,QAAQ,cAAc;AAClD,EAAK,QAAQ,QAAQ,OAAO,CAAC,cAAc;AACzC,cAAW,QAAQ;AACnB,eAAY;IACZ;AACF,SAAO;;CAIT,IAAI,kBAAkB,CAAC,CAAC;CAExB,SAAS,eAAe;AACtB,MAAI,mBAAmB,sBAAsB,SAAS,OAAO;GAC3D,MAAM,QAAQ,mBAAmB,QAAQ,aAAa,SAAS,QAAQ;AACvE,OAAI,OAAO;AACT,sBAAkB;AAClB,IAAK,WAAW,MAAM;;;;AAK5B,eAAc;AAEd,aACQ,SAAS,aACT;AACJ,oBAAkB,CAAC,CAAC;AACpB,gBAAc;GAEjB;CAED,MAAM,YAAY,eAAe;AAC/B,kBAAgB,iBAAiB;AACjC,SAAO,wBAAwB,YAAY,OAAO,MAAM,CAAC;GACzD;CAEF,SAAS,aAAa,SAAkB;AACtC,kBAAgB,iBAAiB;AAEjC,SADqB,wBAAwB,YAAY,OAAO,MAAM,CAAC,CACnD,QAAQ,OAAO,GAAG,UAAU,OAAO,QAAQ,GAAG;;CAGpE,MAAM,aAAa,eAA2C;EAC5D,MAAM,IAAI,OAAO;AACjB,MAAI,KAAK,QAAQ,mBAAmB,KAAK,MAAM,QAAQ,EAAE,cAAc,EAAE;GACvE,MAAM,kBAAkB,EAAE;AAC1B,OAAI,gBAAgB,WAAW,EAAG,QAAO,CAAC,EAAE,MAAM,cAAc,CAAC;AACjE,UAAO;;AAGT,MAAI,UAAU,MAAO,QAAO,EAAE;EAG9B,MAAM,iBADW,cAAc,MAAM,YAAY,SAAS,EAAE,EAC7B,SAAS,MAAM,EAAE,cAAc,EAAE,CAAC;AAEjE,MAAI,cAAc,SAAS,EACzB,QAAO;AAIT,MAAI,EADS,cAAc,MAAM,YAAY,QAAQ,EAAE,EAC7C,UAAU,MAAM,SAAS,KAAM,QAAO,EAAE;AAClD,SAAO,CAAC,EAAE,MAAM,cAAc,CAAC;GAC/B;CAEF,MAAM,cAAc,eAAe;AACjC,MAAI,iBAAiB,MACnB,OAAM,IAAI,MACR,6DACD;AAEH,SAAO,cAAc,MAAM;GAC3B;CAEF,MAAM,kBAAkB,eAChB,QAAQ,MAAM,aAAa,QAAQ,MAAM,QAAQ,KACxD;CAED,MAAM,yBAAyB,eAAe;AAC5C,MAAI,iBAAiB,MACnB,OAAM,IAAI,MACR,6EACD;AAEH,SAAO,cAAc,MAAM;GAC3B;AAEF,QAAO;EACL,aAAa,QAAQ;EACrB;EAEA;EACA;EACA;EAEA;EACA;EAEA,UAAU,eAAe;AACvB,mBAAgB,iBAAiB;AACjC,UAAO,uBACL,YAAY,aAAa,SAAS,cAAc,MAAM,CACvD;IACD;EAEF;EACA;EAEA,WAAW,eACT,kBAAiC,aAAa,OAAO;GACnD,WAAW,UAAU;GACrB,aAAa,cAAc,MAAM;GACjC,OAAO,YAAY;GACpB,CAAC,CACH;EAED;EACA,SAAS;EACT;EACA,yBAAyB;EAEzB,sBACE,SACA,UAC2C;GAC3C,MAAM,iBAAiB,eAAe,IAAI,QAAQ,GAAG,EAAE;GACvD,MAAM,kBAAkB,gBAAgB,OAAO,MAC5C,MAAM,EAAE,eAAe,QAAQ,MAAM,OACvC;AAED,OAAI,kBAAkB,QAAQ,mBAAmB,KAC/C,QAAO;IACL,GAAG;IACH;IACD;;EAML;EACA;EACA;EAEA,OAAO;GACL,SAAS;GACT,MAAM;GACN,MAAM,OAAO,IAAY;IACvB,MAAM,MAAM,SAAS;IACrB,MAAM,UAAU,YAAY,OAAO,GAAG;AACtC,QAAI,WAAW,IACb,OAAM,OAAO,KAAK,OAAO,KAAK,GAAG;AAEnC,WAAO;;GAET,MAAM,QAAQ;IACZ,MAAM,MAAM,SAAS;IACrB,MAAM,UAAU,YAAY,WAAW;AACvC,QAAI,OAAO,QAAQ,SAAS,EAC1B,OAAM,QAAQ,IAAI,QAAQ,KAAK,MAAM,OAAO,KAAK,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC;;GAGzE;EAED,aAAa,aAA4B;AAEvC,OAAI,iBADY,SAAS,SAAS,OACL;IAC3B,MAAM,eAAe,SAAS;AAC9B,aAAS,QAAQ,eAAe;AAChC,WAAO,OAAO;IAEd,MAAM,UAAU,YAAY,WAAW;AACvC,QAAI,gBAAgB,QAAQ,SAAS,EACnC,CAAK,QAAQ,IACX,QAAQ,KAAK,MAAM,OAAO,KAAK,OAAO,cAAc,EAAE,GAAG,CAAC,CAC3D;AAGH,QAAI,eAAe,KACjB,SAAQ,aAAa,YAAY;;;EAKvC,IAAI,YAAY;AACd,GAAK,gBAAgB;AACrB,UAAO,OAAO,cAAc;;EAE9B,IAAI,kBAAkB;AACpB,GAAK,gBAAgB;AACrB,UAAO,OAAO,oBAAoB;;EAEpC,YAAY,YAAoB;AAC9B,UAAO,OAAO,YAAY,WAAW;;EAEvC,mBAAmB,MAAc;AAC/B,UAAO,OAAO,mBAAmB,KAAK;;EAExC,sBAAsB,WAAmB;AACvC,UAAO,OAAO,sBAAsB,UAAU;;EAEjD;;AAuIH,SAAgB,UAAU,SAAmB;AAC3C,KAAI,eAAe,QACjB,QAAO,gBAAgB,QAAQ;AAEjC,QAAO,aAAa,QAAQ"}
|
package/dist/stream.custom.cjs
CHANGED
|
@@ -4,7 +4,8 @@ let _langchain_langgraph_sdk_utils = require("@langchain/langgraph-sdk/utils");
|
|
|
4
4
|
|
|
5
5
|
//#region src/stream.custom.ts
|
|
6
6
|
function useStreamCustom(options) {
|
|
7
|
-
const
|
|
7
|
+
const messageManager = new _langchain_langgraph_sdk_ui.MessageTupleManager();
|
|
8
|
+
const stream = new _langchain_langgraph_sdk_ui.StreamManager(messageManager, {
|
|
8
9
|
throttle: options.throttle ?? false,
|
|
9
10
|
subagentToolNames: options.subagentToolNames,
|
|
10
11
|
filterSubagentMessages: options.filterSubagentMessages,
|
|
@@ -13,14 +14,14 @@ function useStreamCustom(options) {
|
|
|
13
14
|
const streamValues = (0, vue.shallowRef)(stream.values);
|
|
14
15
|
const streamError = (0, vue.shallowRef)(stream.error);
|
|
15
16
|
const isLoading = (0, vue.shallowRef)(stream.isLoading);
|
|
17
|
+
const subagentVersion = (0, vue.shallowRef)(0);
|
|
16
18
|
const unsubscribe = stream.subscribe(() => {
|
|
17
19
|
streamValues.value = stream.values;
|
|
18
20
|
streamError.value = stream.error;
|
|
19
21
|
isLoading.value = stream.isLoading;
|
|
22
|
+
subagentVersion.value += 1;
|
|
20
23
|
});
|
|
21
|
-
(0, vue.
|
|
22
|
-
unsubscribe();
|
|
23
|
-
});
|
|
24
|
+
const branch = (0, vue.ref)("");
|
|
24
25
|
let threadId = options.threadId ?? null;
|
|
25
26
|
(0, vue.watch)(() => options.threadId, (newId) => {
|
|
26
27
|
const resolved = newId ?? null;
|
|
@@ -28,7 +29,7 @@ function useStreamCustom(options) {
|
|
|
28
29
|
threadId = resolved;
|
|
29
30
|
stream.clear();
|
|
30
31
|
}
|
|
31
|
-
});
|
|
32
|
+
}, { flush: "sync" });
|
|
32
33
|
const getMessages = (value) => {
|
|
33
34
|
const messagesKey = options.messagesKey ?? "messages";
|
|
34
35
|
return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
|
|
@@ -41,6 +42,10 @@ function useStreamCustom(options) {
|
|
|
41
42
|
};
|
|
42
43
|
};
|
|
43
44
|
const historyValues = options.initialValues ?? {};
|
|
45
|
+
(0, vue.onScopeDispose)(() => {
|
|
46
|
+
unsubscribe();
|
|
47
|
+
stream.stop(historyValues, { onStop: options.onStop });
|
|
48
|
+
});
|
|
44
49
|
const historyMessages = getMessages(historyValues);
|
|
45
50
|
options.filterSubagentMessages && !stream.isLoading && historyMessages.length;
|
|
46
51
|
(0, vue.watch)(() => ({
|
|
@@ -98,12 +103,26 @@ function useStreamCustom(options) {
|
|
|
98
103
|
onSuccess: () => void 0,
|
|
99
104
|
onError(error) {
|
|
100
105
|
options.onError?.(error, void 0);
|
|
106
|
+
submitOptions?.onError?.(error, void 0);
|
|
101
107
|
}
|
|
102
108
|
});
|
|
103
109
|
}
|
|
104
110
|
async function submit(values, submitOptions) {
|
|
105
111
|
await submitDirect(values, submitOptions);
|
|
106
112
|
}
|
|
113
|
+
function setBranch(value) {
|
|
114
|
+
branch.value = value;
|
|
115
|
+
}
|
|
116
|
+
function getMessagesMetadata(message, index) {
|
|
117
|
+
const streamMetadata = messageManager.get(message.id)?.metadata;
|
|
118
|
+
if (streamMetadata != null) return {
|
|
119
|
+
messageId: message.id ?? String(index),
|
|
120
|
+
firstSeenState: void 0,
|
|
121
|
+
branch: void 0,
|
|
122
|
+
branchOptions: void 0,
|
|
123
|
+
streamMetadata
|
|
124
|
+
};
|
|
125
|
+
}
|
|
107
126
|
return {
|
|
108
127
|
get values() {
|
|
109
128
|
return streamValues.value ?? {};
|
|
@@ -113,6 +132,9 @@ function useStreamCustom(options) {
|
|
|
113
132
|
stop,
|
|
114
133
|
submit,
|
|
115
134
|
switchThread,
|
|
135
|
+
branch,
|
|
136
|
+
setBranch,
|
|
137
|
+
getMessagesMetadata,
|
|
116
138
|
queue: {
|
|
117
139
|
entries: [],
|
|
118
140
|
size: 0,
|
|
@@ -134,7 +156,7 @@ function useStreamCustom(options) {
|
|
|
134
156
|
},
|
|
135
157
|
get messages() {
|
|
136
158
|
if (!streamValues.value) return [];
|
|
137
|
-
return getMessages(streamValues.value);
|
|
159
|
+
return (0, _langchain_langgraph_sdk_ui.ensureMessageInstances)(getMessages(streamValues.value));
|
|
138
160
|
},
|
|
139
161
|
get toolCalls() {
|
|
140
162
|
if (!streamValues.value) return [];
|
|
@@ -145,9 +167,11 @@ function useStreamCustom(options) {
|
|
|
145
167
|
return (0, _langchain_langgraph_sdk_utils.getToolCallsWithResults)(getMessages(streamValues.value)).filter((tc) => tc.aiMessage.id === message.id);
|
|
146
168
|
},
|
|
147
169
|
get subagents() {
|
|
170
|
+
subagentVersion.value;
|
|
148
171
|
return stream.getSubagents();
|
|
149
172
|
},
|
|
150
173
|
get activeSubagents() {
|
|
174
|
+
subagentVersion.value;
|
|
151
175
|
return stream.getActiveSubagents();
|
|
152
176
|
},
|
|
153
177
|
getSubagent(toolCallId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.custom.cjs","names":["StreamManager","MessageTupleManager","toMessageClass"],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { onUnmounted, shallowRef, watch } from \"vue\";\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 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\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 streamValues = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n });\n\n onUnmounted(() => {\n unsubscribe();\n });\n\n let threadId: string | null = options.threadId ?? null;\n\n watch(\n () => options.threadId,\n (newId) => {\n const resolved = newId ?? null;\n if (resolved !== threadId) {\n threadId = resolved;\n stream.clear();\n }\n },\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 // @ts-expect-error used in watch callback below\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n watch(\n () => ({\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n getMessages(historyValues).length > 0,\n len: getMessages(historyValues).length,\n }),\n ({ should }) => {\n if (should) {\n stream.reconstructSubagents(getMessages(historyValues), {\n skipIfPopulated: true,\n });\n }\n },\n { immediate: 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 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 (!threadId) {\n threadId = crypto.randomUUID();\n options.onThreadId?.(threadId);\n }\n\n if (!threadId) {\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: threadId,\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 return {\n get values() {\n return streamValues.value ?? ({} as StateType);\n },\n\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n queue: {\n entries: [],\n size: 0,\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n streamValues.value != null &&\n \"__interrupt__\" in streamValues.value &&\n Array.isArray(streamValues.value.__interrupt__)\n ) {\n const valueInterrupts = streamValues.value.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n return extractInterrupts<InterruptType>(streamValues.value);\n },\n\n get messages(): Message[] {\n if (!streamValues.value) return [];\n return getMessages(streamValues.value);\n },\n\n get toolCalls() {\n if (!streamValues.value) return [];\n return getToolCallsWithResults(getMessages(streamValues.value));\n },\n\n getToolCalls(message: Message) {\n if (!streamValues.value) return [];\n const allToolCalls = getToolCallsWithResults(\n getMessages(streamValues.value),\n );\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n get subagents() {\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\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 { onScopeDispose, ref, shallowRef, watch } from \"vue\";\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 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\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 streamValues = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const subagentVersion = shallowRef(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n subagentVersion.value += 1;\n });\n\n const branch = ref<string>(\"\");\n\n let threadId: string | null = options.threadId ?? null;\n\n watch(\n () => options.threadId,\n (newId) => {\n const resolved = newId ?? null;\n if (resolved !== threadId) {\n threadId = resolved;\n stream.clear();\n }\n },\n { flush: \"sync\" },\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 onScopeDispose(() => {\n unsubscribe();\n void stream.stop(historyValues, { onStop: options.onStop });\n });\n\n const historyMessages = getMessages(historyValues);\n // @ts-expect-error used in watch callback below\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n watch(\n () => ({\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n getMessages(historyValues).length > 0,\n len: getMessages(historyValues).length,\n }),\n ({ should }) => {\n if (should) {\n stream.reconstructSubagents(getMessages(historyValues), {\n skipIfPopulated: true,\n });\n }\n },\n { immediate: 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 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 (!threadId) {\n threadId = crypto.randomUUID();\n options.onThreadId?.(threadId);\n }\n\n if (!threadId) {\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: threadId,\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 function setBranch(value: string) {\n branch.value = 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 get values() {\n return streamValues.value ?? ({} as StateType);\n },\n\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: [],\n size: 0,\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n streamValues.value != null &&\n \"__interrupt__\" in streamValues.value &&\n Array.isArray(streamValues.value.__interrupt__)\n ) {\n const valueInterrupts = streamValues.value.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n return extractInterrupts<InterruptType>(streamValues.value);\n },\n\n get messages() {\n if (!streamValues.value) return [];\n return ensureMessageInstances(getMessages(streamValues.value));\n },\n\n get toolCalls() {\n if (!streamValues.value) return [];\n return getToolCallsWithResults(getMessages(streamValues.value));\n },\n\n getToolCalls(message: Message) {\n if (!streamValues.value) return [];\n const allToolCalls = getToolCallsWithResults(\n getMessages(streamValues.value),\n );\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n get subagents() {\n void subagentVersion.value;\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n void subagentVersion.value;\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\n\n getSubagentsByMessage(messageId: string) {\n return stream.getSubagentsByMessage(messageId);\n },\n };\n}\n"],"mappings":"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"}
|