@langchain/langgraph-sdk 1.9.25 → 1.9.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/client/base.cjs.map +1 -1
  2. package/dist/client/base.d.cts.map +1 -1
  3. package/dist/client/base.d.ts.map +1 -1
  4. package/dist/client/base.js.map +1 -1
  5. package/dist/client/crons/index.cjs +18 -17
  6. package/dist/client/crons/index.cjs.map +1 -1
  7. package/dist/client/crons/index.d.cts.map +1 -1
  8. package/dist/client/crons/index.d.ts.map +1 -1
  9. package/dist/client/crons/index.js +18 -17
  10. package/dist/client/crons/index.js.map +1 -1
  11. package/dist/client/index.cjs +1 -1
  12. package/dist/client/index.js +1 -1
  13. package/dist/client/stream/index.cjs +1 -1
  14. package/dist/client/stream/index.js +1 -1
  15. package/dist/client/stream/transport/agent-server.cjs +1 -1
  16. package/dist/client/stream/transport/agent-server.js +1 -1
  17. package/dist/client/stream/transport/http.cjs +7 -11
  18. package/dist/client/stream/transport/http.cjs.map +1 -1
  19. package/dist/client/stream/transport/http.d.cts.map +1 -1
  20. package/dist/client/stream/transport/http.d.ts.map +1 -1
  21. package/dist/client/stream/transport/http.js +7 -11
  22. package/dist/client/stream/transport/http.js.map +1 -1
  23. package/dist/client/stream/transport/index.cjs +1 -1
  24. package/dist/client/stream/transport/index.js +1 -1
  25. package/dist/client/stream/transport/types.d.cts +20 -10
  26. package/dist/client/stream/transport/types.d.cts.map +1 -1
  27. package/dist/client/stream/transport/types.d.ts +20 -10
  28. package/dist/client/stream/transport/types.d.ts.map +1 -1
  29. package/dist/client/stream/transport/websocket.cjs +2 -9
  30. package/dist/client/stream/transport/websocket.cjs.map +1 -1
  31. package/dist/client/stream/transport/websocket.d.cts.map +1 -1
  32. package/dist/client/stream/transport/websocket.d.ts.map +1 -1
  33. package/dist/client/stream/transport/websocket.js +3 -9
  34. package/dist/client/stream/transport/websocket.js.map +1 -1
  35. package/dist/client/stream/types.d.cts +9 -6
  36. package/dist/client/stream/types.d.cts.map +1 -1
  37. package/dist/client/stream/types.d.ts +9 -6
  38. package/dist/client/stream/types.d.ts.map +1 -1
  39. package/dist/client/threads/index.cjs +1 -1
  40. package/dist/client/threads/index.cjs.map +1 -1
  41. package/dist/client/threads/index.d.cts.map +1 -1
  42. package/dist/client/threads/index.d.ts.map +1 -1
  43. package/dist/client/threads/index.js +1 -1
  44. package/dist/client/threads/index.js.map +1 -1
  45. package/dist/client.cjs +1 -1
  46. package/dist/client.js +1 -1
  47. package/dist/index.cjs +3 -2
  48. package/dist/index.d.cts +2 -2
  49. package/dist/index.d.ts +2 -2
  50. package/dist/index.js +3 -3
  51. package/dist/react/stream.custom.cjs +1 -0
  52. package/dist/react/stream.custom.cjs.map +1 -1
  53. package/dist/react/stream.custom.d.cts.map +1 -1
  54. package/dist/react/stream.custom.d.ts.map +1 -1
  55. package/dist/react/stream.custom.js +1 -0
  56. package/dist/react/stream.custom.js.map +1 -1
  57. package/dist/react/stream.lgp.cjs +1 -0
  58. package/dist/react/stream.lgp.cjs.map +1 -1
  59. package/dist/react/stream.lgp.js +1 -0
  60. package/dist/react/stream.lgp.js.map +1 -1
  61. package/dist/stream/constants.cjs +6 -0
  62. package/dist/stream/constants.cjs.map +1 -1
  63. package/dist/stream/constants.d.cts +6 -1
  64. package/dist/stream/constants.d.cts.map +1 -1
  65. package/dist/stream/constants.d.ts +6 -1
  66. package/dist/stream/constants.d.ts.map +1 -1
  67. package/dist/stream/constants.js +6 -1
  68. package/dist/stream/constants.js.map +1 -1
  69. package/dist/stream/controller.cjs +7 -3
  70. package/dist/stream/controller.cjs.map +1 -1
  71. package/dist/stream/controller.js +7 -3
  72. package/dist/stream/controller.js.map +1 -1
  73. package/dist/stream/discovery/namespace-from-history.cjs +2 -2
  74. package/dist/stream/discovery/namespace-from-history.cjs.map +1 -1
  75. package/dist/stream/discovery/namespace-from-history.js +2 -2
  76. package/dist/stream/discovery/namespace-from-history.js.map +1 -1
  77. package/dist/stream/index.cjs +2 -1
  78. package/dist/stream/index.d.cts +2 -2
  79. package/dist/stream/index.d.ts +2 -2
  80. package/dist/stream/index.js +2 -2
  81. package/dist/stream/projections/values.cjs +2 -1
  82. package/dist/stream/projections/values.cjs.map +1 -1
  83. package/dist/stream/projections/values.d.cts.map +1 -1
  84. package/dist/stream/projections/values.d.ts.map +1 -1
  85. package/dist/stream/projections/values.js +2 -1
  86. package/dist/stream/projections/values.js.map +1 -1
  87. package/dist/stream/types.d.cts +40 -2
  88. package/dist/stream/types.d.cts.map +1 -1
  89. package/dist/stream/types.d.ts +40 -2
  90. package/dist/stream/types.d.ts.map +1 -1
  91. package/dist/types.d.cts +5 -1
  92. package/dist/types.d.cts.map +1 -1
  93. package/dist/types.d.ts +5 -1
  94. package/dist/types.d.ts.map +1 -1
  95. package/dist/ui/manager.cjs +1 -0
  96. package/dist/ui/manager.cjs.map +1 -1
  97. package/dist/ui/manager.d.cts.map +1 -1
  98. package/dist/ui/manager.d.ts.map +1 -1
  99. package/dist/ui/manager.js +1 -0
  100. package/dist/ui/manager.js.map +1 -1
  101. package/dist/ui/messages.cjs +2 -1
  102. package/dist/ui/messages.cjs.map +1 -1
  103. package/dist/ui/messages.d.cts.map +1 -1
  104. package/dist/ui/messages.d.ts.map +1 -1
  105. package/dist/ui/messages.js +2 -1
  106. package/dist/ui/messages.js.map +1 -1
  107. package/dist/ui/orchestrator-custom.cjs +1 -0
  108. package/dist/ui/orchestrator-custom.cjs.map +1 -1
  109. package/dist/ui/orchestrator-custom.d.cts.map +1 -1
  110. package/dist/ui/orchestrator-custom.d.ts.map +1 -1
  111. package/dist/ui/orchestrator-custom.js +1 -0
  112. package/dist/ui/orchestrator-custom.js.map +1 -1
  113. package/dist/utils/reconnect.cjs +18 -0
  114. package/dist/utils/reconnect.cjs.map +1 -0
  115. package/dist/utils/reconnect.js +18 -0
  116. package/dist/utils/reconnect.js.map +1 -0
  117. package/dist/utils/stream.cjs +9 -1
  118. package/dist/utils/stream.cjs.map +1 -1
  119. package/dist/utils/stream.d.cts.map +1 -1
  120. package/dist/utils/stream.d.ts.map +1 -1
  121. package/dist/utils/stream.js +9 -2
  122. package/dist/utils/stream.js.map +1 -1
  123. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import { overrideFetchImplementation } from "./singletons/fetch.js";
2
2
  import { getApiKey } from "./client/base.js";
3
+ import { DEFAULT_MESSAGES_KEY, NAMESPACE_SEPARATOR } from "./stream/constants.js";
3
4
  import { MessageAssembler } from "./client/stream/messages.js";
4
5
  import { MediaAssembler, MediaAssemblyError } from "./client/stream/media.js";
5
6
  import { ProtocolError } from "./client/stream/error.js";
6
- import { NAMESPACE_SEPARATOR } from "./stream/constants.js";
7
7
  import { applyHeadlessToolResumeCommand, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, scheduleCoalescedHeadlessToolFlush } from "./headless-tools.js";
8
8
  import { SubscriptionHandle, ThreadStream } from "./client/stream/index.js";
9
- import { ProtocolWebSocketTransportAdapter } from "./client/stream/transport/websocket.js";
10
9
  import { ProtocolSseTransportAdapter } from "./client/stream/transport/http.js";
10
+ import { ProtocolWebSocketTransportAdapter } from "./client/stream/transport/websocket.js";
11
11
  import { HttpAgentServerAdapter } from "./client/stream/transport/agent-server.js";
12
12
  import { Client } from "./client/index.js";
13
13
  import "./client.js";
14
14
  import "./stream/index.js";
15
15
  import { StreamError } from "./ui/errors.js";
16
- export { Client, HttpAgentServerAdapter, MediaAssembler, MediaAssemblyError, MessageAssembler, NAMESPACE_SEPARATOR, ProtocolError, ProtocolSseTransportAdapter, ProtocolWebSocketTransportAdapter, StreamError, SubscriptionHandle, ThreadStream, applyHeadlessToolResumeCommand, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getApiKey, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, overrideFetchImplementation, parseHeadlessToolInterruptPayload, scheduleCoalescedHeadlessToolFlush };
16
+ export { Client, DEFAULT_MESSAGES_KEY, HttpAgentServerAdapter, MediaAssembler, MediaAssemblyError, MessageAssembler, NAMESPACE_SEPARATOR, ProtocolError, ProtocolSseTransportAdapter, ProtocolWebSocketTransportAdapter, StreamError, SubscriptionHandle, ThreadStream, applyHeadlessToolResumeCommand, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getApiKey, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, overrideFetchImplementation, parseHeadlessToolInterruptPayload, scheduleCoalescedHeadlessToolFlush };
@@ -2,6 +2,7 @@
2
2
  require("../_virtual/_rolldown/runtime.cjs");
3
3
  const require_sse = require("../utils/sse.cjs");
4
4
  const require_stream = require("../utils/stream.cjs");
5
+ require("../stream/constants.cjs");
5
6
  const require_messages = require("../ui/messages.cjs");
6
7
  const require_headless_tools = require("../headless-tools.cjs");
7
8
  const require_interrupts = require("../ui/interrupts.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.cjs","names":["BytesLineDecoder","SSEDecoder","IterableReadableStream","MessageTupleManager","StreamManager","useControllableThreadId","userFacingInterruptsFromValuesArray","getToolCallsWithResults"],"sources":["../../src/react/stream.custom.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { EventStreamEvent, StreamManager } from \"../ui/manager.js\";\nimport type {\n GetUpdateType,\n GetCustomEventType,\n GetInterruptType,\n GetToolCallsType,\n GetConfigurableType,\n UseStreamTransport,\n AnyStreamCustomOptions,\n CustomSubmitOptions,\n} from \"../ui/types.js\";\nimport type { UseStreamCustom } from \"./types.js\";\nimport { type Message } from \"../types.messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\nimport { MessageTupleManager } from \"../ui/messages.js\";\nimport { userFacingInterruptsFromValuesArray } from \"../ui/interrupts.js\";\nimport { Interrupt, type ThreadState } from \"../schema.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../utils/sse.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport { Command } from \"../types.js\";\nimport type { BagTemplate } from \"../types.template.js\";\nimport { flushPendingHeadlessToolInterrupts } from \"../headless-tools.js\";\n\ninterface FetchStreamTransportOptions {\n /**\n * The URL of the API to use.\n */\n apiUrl: string;\n\n /**\n * Default headers to send with requests.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Specify a custom fetch implementation.\n */\n fetch?: typeof fetch | ((...args: any[]) => any); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n /**\n * Callback that is called before the request is made.\n */\n onRequest?: (\n url: string,\n init: RequestInit\n ) => Promise<RequestInit> | RequestInit;\n}\n\nexport class FetchStreamTransport<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n> implements UseStreamTransport<StateType, Bag> {\n constructor(private readonly options: FetchStreamTransportOptions) {}\n\n async stream(payload: {\n input: GetUpdateType<Bag, StateType> | null | undefined;\n context: GetConfigurableType<Bag> | undefined;\n command: Command | undefined;\n signal: AbortSignal;\n }): Promise<AsyncGenerator<{ id?: string; event: string; data: unknown }>> {\n const { signal, ...body } = payload;\n\n let requestInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.options.defaultHeaders,\n },\n body: JSON.stringify(body),\n signal,\n };\n\n if (this.options.onRequest) {\n requestInit = await this.options.onRequest(\n this.options.apiUrl,\n requestInit\n );\n }\n const fetchFn = this.options.fetch ?? fetch;\n\n const response = await fetchFn(this.options.apiUrl, requestInit);\n if (!response.ok) {\n throw new Error(`Failed to stream: ${response.statusText}`);\n }\n\n const stream = (\n response.body || new ReadableStream({ start: (ctrl) => ctrl.close() })\n )\n .pipeThrough(BytesLineDecoder())\n .pipeThrough(SSEDecoder());\n\n return IterableReadableStream.fromReadableStream(stream);\n }\n}\n\nfunction createCustomTransportThreadState<\n StateType extends Record<string, unknown>,\n>(values: StateType, threadId: string): ThreadState<StateType> {\n return {\n values,\n next: [],\n tasks: [],\n metadata: undefined,\n created_at: null,\n checkpoint: {\n thread_id: threadId,\n checkpoint_id: null,\n checkpoint_ns: \"\",\n checkpoint_map: null,\n },\n parent_checkpoint: null,\n };\n}\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: AnyStreamCustomOptions<StateType, Bag>\n): UseStreamCustom<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] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n })\n );\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n const threadIdRef = useRef<string | null>(threadId);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\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 // Reconstruct subagents from initialValues when:\n // 1. Subagent filtering is enabled\n // 2. Not currently streaming\n // 3. initialValues has messages\n // This ensures subagent visualization works with cached/persisted state\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const stop = () => stream.stop(historyValues, { onStop: options.onStop });\n\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>\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 // generate random thread id\n usableThreadId = crypto.randomUUID();\n threadIdRef.current = usableThreadId;\n 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: () => {\n if (!usableThreadId) return undefined;\n\n const finalValues = stream.values ?? historyValues;\n options.onFinish?.(\n createCustomTransportThreadState(finalValues, usableThreadId),\n undefined\n );\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, undefined);\n },\n }\n );\n };\n\n const handledToolsRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n handledToolsRef.current.clear();\n }, [threadId]);\n\n useEffect(() => {\n flushPendingHeadlessToolInterrupts(\n stream.values as Record<string, unknown> | null,\n options.tools,\n handledToolsRef.current,\n {\n onTool: options.onTool,\n defer: (run) => {\n void Promise.resolve().then(run);\n },\n resumeSubmit: (command) =>\n submit(null, {\n command,\n }),\n }\n );\n }, [options.onTool, options.tools, stream.values, submit]);\n\n return {\n get values() {\n return stream.values ?? ({} as StateType);\n },\n\n error: stream.error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n stream.values != null &&\n \"__interrupt__\" in stream.values &&\n Array.isArray(stream.values.__interrupt__)\n ) {\n return userFacingInterruptsFromValuesArray<InterruptType>(\n stream.values.__interrupt__ as Interrupt<InterruptType>[]\n );\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n const all = this.interrupts;\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n\n // Multiple interrupts: return the array for backward compat\n return all as Interrupt<InterruptType>;\n },\n\n get messages(): Message<ToolCallType>[] {\n if (!stream.values) return [];\n return getMessages(stream.values);\n },\n\n get toolCalls() {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n getToolCalls(message) {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\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":["BytesLineDecoder","SSEDecoder","IterableReadableStream","MessageTupleManager","StreamManager","useControllableThreadId","userFacingInterruptsFromValuesArray","getToolCallsWithResults"],"sources":["../../src/react/stream.custom.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { EventStreamEvent, StreamManager } from \"../ui/manager.js\";\nimport { DEFAULT_MESSAGES_KEY } from \"../stream/constants.js\";\nimport type {\n GetUpdateType,\n GetCustomEventType,\n GetInterruptType,\n GetToolCallsType,\n GetConfigurableType,\n UseStreamTransport,\n AnyStreamCustomOptions,\n CustomSubmitOptions,\n} from \"../ui/types.js\";\nimport type { UseStreamCustom } from \"./types.js\";\nimport { type Message } from \"../types.messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\nimport { MessageTupleManager } from \"../ui/messages.js\";\nimport { userFacingInterruptsFromValuesArray } from \"../ui/interrupts.js\";\nimport { Interrupt, type ThreadState } from \"../schema.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../utils/sse.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport { Command } from \"../types.js\";\nimport type { BagTemplate } from \"../types.template.js\";\nimport { flushPendingHeadlessToolInterrupts } from \"../headless-tools.js\";\n\ninterface FetchStreamTransportOptions {\n /**\n * The URL of the API to use.\n */\n apiUrl: string;\n\n /**\n * Default headers to send with requests.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Specify a custom fetch implementation.\n */\n fetch?: typeof fetch | ((...args: any[]) => any); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n /**\n * Callback that is called before the request is made.\n */\n onRequest?: (\n url: string,\n init: RequestInit\n ) => Promise<RequestInit> | RequestInit;\n}\n\nexport class FetchStreamTransport<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n> implements UseStreamTransport<StateType, Bag> {\n constructor(private readonly options: FetchStreamTransportOptions) {}\n\n async stream(payload: {\n input: GetUpdateType<Bag, StateType> | null | undefined;\n context: GetConfigurableType<Bag> | undefined;\n command: Command | undefined;\n signal: AbortSignal;\n }): Promise<AsyncGenerator<{ id?: string; event: string; data: unknown }>> {\n const { signal, ...body } = payload;\n\n let requestInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.options.defaultHeaders,\n },\n body: JSON.stringify(body),\n signal,\n };\n\n if (this.options.onRequest) {\n requestInit = await this.options.onRequest(\n this.options.apiUrl,\n requestInit\n );\n }\n const fetchFn = this.options.fetch ?? fetch;\n\n const response = await fetchFn(this.options.apiUrl, requestInit);\n if (!response.ok) {\n throw new Error(`Failed to stream: ${response.statusText}`);\n }\n\n const stream = (\n response.body || new ReadableStream({ start: (ctrl) => ctrl.close() })\n )\n .pipeThrough(BytesLineDecoder())\n .pipeThrough(SSEDecoder());\n\n return IterableReadableStream.fromReadableStream(stream);\n }\n}\n\nfunction createCustomTransportThreadState<\n StateType extends Record<string, unknown>,\n>(values: StateType, threadId: string): ThreadState<StateType> {\n return {\n values,\n next: [],\n tasks: [],\n metadata: undefined,\n created_at: null,\n checkpoint: {\n thread_id: threadId,\n checkpoint_id: null,\n checkpoint_ns: \"\",\n checkpoint_map: null,\n },\n parent_checkpoint: null,\n };\n}\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: AnyStreamCustomOptions<StateType, Bag>\n): UseStreamCustom<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] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n })\n );\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n const threadIdRef = useRef<string | null>(threadId);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? DEFAULT_MESSAGES_KEY;\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 ?? DEFAULT_MESSAGES_KEY;\n return { ...current, [messagesKey]: messages };\n };\n\n const historyValues = options.initialValues ?? ({} as StateType);\n\n // Reconstruct subagents from initialValues when:\n // 1. Subagent filtering is enabled\n // 2. Not currently streaming\n // 3. initialValues has messages\n // This ensures subagent visualization works with cached/persisted state\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const stop = () => stream.stop(historyValues, { onStop: options.onStop });\n\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>\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 // generate random thread id\n usableThreadId = crypto.randomUUID();\n threadIdRef.current = usableThreadId;\n 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: () => {\n if (!usableThreadId) return undefined;\n\n const finalValues = stream.values ?? historyValues;\n options.onFinish?.(\n createCustomTransportThreadState(finalValues, usableThreadId),\n undefined\n );\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, undefined);\n },\n }\n );\n };\n\n const handledToolsRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n handledToolsRef.current.clear();\n }, [threadId]);\n\n useEffect(() => {\n flushPendingHeadlessToolInterrupts(\n stream.values as Record<string, unknown> | null,\n options.tools,\n handledToolsRef.current,\n {\n onTool: options.onTool,\n defer: (run) => {\n void Promise.resolve().then(run);\n },\n resumeSubmit: (command) =>\n submit(null, {\n command,\n }),\n }\n );\n }, [options.onTool, options.tools, stream.values, submit]);\n\n return {\n get values() {\n return stream.values ?? ({} as StateType);\n },\n\n error: stream.error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n stream.values != null &&\n \"__interrupt__\" in stream.values &&\n Array.isArray(stream.values.__interrupt__)\n ) {\n return userFacingInterruptsFromValuesArray<InterruptType>(\n stream.values.__interrupt__ as Interrupt<InterruptType>[]\n );\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n const all = this.interrupts;\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n\n // Multiple interrupts: return the array for backward compat\n return all as Interrupt<InterruptType>;\n },\n\n get messages(): Message<ToolCallType>[] {\n if (!stream.values) return [];\n return getMessages(stream.values);\n },\n\n get toolCalls() {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n getToolCalls(message) {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\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 +1 @@
1
- {"version":3,"file":"stream.custom.d.cts","names":[],"sources":["../../src/react/stream.custom.tsx"],"mappings":";;;;;UA6BU,2BAAA;EAAA;;;EAIR,MAAA;EAUe;;;EALf,cAAA,GAAiB,WAAA;EAaW;;;EAR5B,KAAA,UAAe,KAAA,QAAa,IAAA;EAL5B;;;EAUA,SAAA,IACE,GAAA,UACA,IAAA,EAAM,WAAA,KACH,OAAA,CAAQ,WAAA,IAAe,WAAA;AAAA;AAAA,cAGjB,oBAAA,mBACO,MAAA,oBAA0B,MAAA,+BAChC,WAAA,GAAc,WAAA,aACf,kBAAA,CAAmB,SAAA,EAAW,GAAA;EAAA,iBACZ,OAAA;EAA7B,WAAA,CAA6B,OAAA,EAAS,2BAAA;EAEhC,MAAA,CAAO,OAAA;IACX,KAAA,EAAO,aAAA,CAAc,GAAA,EAAK,SAAA;IAC1B,OAAA,EAAS,mBAAA,CAAoB,GAAA;IAC7B,OAAA,EAAS,OAAA;IACT,MAAA,EAAQ,WAAA;EAAA,IACN,OAAA,CAAQ,cAAA;IAAiB,EAAA;IAAa,KAAA;IAAe,IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"stream.custom.d.cts","names":[],"sources":["../../src/react/stream.custom.tsx"],"mappings":";;;;;UA8BU,2BAAA;EAAA;;;EAIR,MAAA;EAUe;;;EALf,cAAA,GAAiB,WAAA;EAaW;;;EAR5B,KAAA,UAAe,KAAA,QAAa,IAAA;EAL5B;;;EAUA,SAAA,IACE,GAAA,UACA,IAAA,EAAM,WAAA,KACH,OAAA,CAAQ,WAAA,IAAe,WAAA;AAAA;AAAA,cAGjB,oBAAA,mBACO,MAAA,oBAA0B,MAAA,+BAChC,WAAA,GAAc,WAAA,aACf,kBAAA,CAAmB,SAAA,EAAW,GAAA;EAAA,iBACZ,OAAA;EAA7B,WAAA,CAA6B,OAAA,EAAS,2BAAA;EAEhC,MAAA,CAAO,OAAA;IACX,KAAA,EAAO,aAAA,CAAc,GAAA,EAAK,SAAA;IAC1B,OAAA,EAAS,mBAAA,CAAoB,GAAA;IAC7B,OAAA,EAAS,OAAA;IACT,MAAA,EAAQ,WAAA;EAAA,IACN,OAAA,CAAQ,cAAA;IAAiB,EAAA;IAAa,KAAA;IAAe,IAAA;EAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.d.ts","names":[],"sources":["../../src/react/stream.custom.tsx"],"mappings":";;;;UA6BU,2BAAA;;AAH8C;;EAOtD,MAAA;EAKiB;;;EAAjB,cAAA,GAAiB,WAAA;EAaZ;;;EARL,KAAA,UAAe,KAAA,QAAa,IAAA;EAV5B;;;EAeA,SAAA,IACE,GAAA,UACA,IAAA,EAAM,WAAA,KACH,OAAA,CAAQ,WAAA,IAAe,WAAA;AAAA;AAAA,cAGjB,oBAAA,mBACO,MAAA,oBAA0B,MAAA,+BAChC,WAAA,GAAc,WAAA,aACf,kBAAA,CAAmB,SAAA,EAAW,GAAA;EAAA,iBACZ,OAAA;EAA7B,WAAA,CAA6B,OAAA,EAAS,2BAAA;EAEhC,MAAA,CAAO,OAAA;IACX,KAAA,EAAO,aAAA,CAAc,GAAA,EAAK,SAAA;IAC1B,OAAA,EAAS,mBAAA,CAAoB,GAAA;IAC7B,OAAA,EAAS,OAAA;IACT,MAAA,EAAQ,WAAA;EAAA,IACN,OAAA,CAAQ,cAAA;IAAiB,EAAA;IAAa,KAAA;IAAe,IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"stream.custom.d.ts","names":[],"sources":["../../src/react/stream.custom.tsx"],"mappings":";;;;UA8BU,2BAAA;;AAH8C;;EAOtD,MAAA;EAKiB;;;EAAjB,cAAA,GAAiB,WAAA;EAaZ;;;EARL,KAAA,UAAe,KAAA,QAAa,IAAA;EAV5B;;;EAeA,SAAA,IACE,GAAA,UACA,IAAA,EAAM,WAAA,KACH,OAAA,CAAQ,WAAA,IAAe,WAAA;AAAA;AAAA,cAGjB,oBAAA,mBACO,MAAA,oBAA0B,MAAA,+BAChC,WAAA,GAAc,WAAA,aACf,kBAAA,CAAmB,SAAA,EAAW,GAAA;EAAA,iBACZ,OAAA;EAA7B,WAAA,CAA6B,OAAA,EAAS,2BAAA;EAEhC,MAAA,CAAO,OAAA;IACX,KAAA,EAAO,aAAA,CAAc,GAAA,EAAK,SAAA;IAC1B,OAAA,EAAS,mBAAA,CAAoB,GAAA;IAC7B,OAAA,EAAS,OAAA;IACT,MAAA,EAAQ,WAAA;EAAA,IACN,OAAA,CAAQ,cAAA;IAAiB,EAAA;IAAa,KAAA;IAAe,IAAA;EAAA;AAAA"}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { BytesLineDecoder, SSEDecoder } from "../utils/sse.js";
3
3
  import { IterableReadableStream } from "../utils/stream.js";
4
+ import "../stream/constants.js";
4
5
  import { MessageTupleManager } from "../ui/messages.js";
5
6
  import { flushPendingHeadlessToolInterrupts } from "../headless-tools.js";
6
7
  import { userFacingInterruptsFromValuesArray } from "../ui/interrupts.js";
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.js","names":[],"sources":["../../src/react/stream.custom.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { EventStreamEvent, StreamManager } from \"../ui/manager.js\";\nimport type {\n GetUpdateType,\n GetCustomEventType,\n GetInterruptType,\n GetToolCallsType,\n GetConfigurableType,\n UseStreamTransport,\n AnyStreamCustomOptions,\n CustomSubmitOptions,\n} from \"../ui/types.js\";\nimport type { UseStreamCustom } from \"./types.js\";\nimport { type Message } from \"../types.messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\nimport { MessageTupleManager } from \"../ui/messages.js\";\nimport { userFacingInterruptsFromValuesArray } from \"../ui/interrupts.js\";\nimport { Interrupt, type ThreadState } from \"../schema.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../utils/sse.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport { Command } from \"../types.js\";\nimport type { BagTemplate } from \"../types.template.js\";\nimport { flushPendingHeadlessToolInterrupts } from \"../headless-tools.js\";\n\ninterface FetchStreamTransportOptions {\n /**\n * The URL of the API to use.\n */\n apiUrl: string;\n\n /**\n * Default headers to send with requests.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Specify a custom fetch implementation.\n */\n fetch?: typeof fetch | ((...args: any[]) => any); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n /**\n * Callback that is called before the request is made.\n */\n onRequest?: (\n url: string,\n init: RequestInit\n ) => Promise<RequestInit> | RequestInit;\n}\n\nexport class FetchStreamTransport<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n> implements UseStreamTransport<StateType, Bag> {\n constructor(private readonly options: FetchStreamTransportOptions) {}\n\n async stream(payload: {\n input: GetUpdateType<Bag, StateType> | null | undefined;\n context: GetConfigurableType<Bag> | undefined;\n command: Command | undefined;\n signal: AbortSignal;\n }): Promise<AsyncGenerator<{ id?: string; event: string; data: unknown }>> {\n const { signal, ...body } = payload;\n\n let requestInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.options.defaultHeaders,\n },\n body: JSON.stringify(body),\n signal,\n };\n\n if (this.options.onRequest) {\n requestInit = await this.options.onRequest(\n this.options.apiUrl,\n requestInit\n );\n }\n const fetchFn = this.options.fetch ?? fetch;\n\n const response = await fetchFn(this.options.apiUrl, requestInit);\n if (!response.ok) {\n throw new Error(`Failed to stream: ${response.statusText}`);\n }\n\n const stream = (\n response.body || new ReadableStream({ start: (ctrl) => ctrl.close() })\n )\n .pipeThrough(BytesLineDecoder())\n .pipeThrough(SSEDecoder());\n\n return IterableReadableStream.fromReadableStream(stream);\n }\n}\n\nfunction createCustomTransportThreadState<\n StateType extends Record<string, unknown>,\n>(values: StateType, threadId: string): ThreadState<StateType> {\n return {\n values,\n next: [],\n tasks: [],\n metadata: undefined,\n created_at: null,\n checkpoint: {\n thread_id: threadId,\n checkpoint_id: null,\n checkpoint_ns: \"\",\n checkpoint_map: null,\n },\n parent_checkpoint: null,\n };\n}\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: AnyStreamCustomOptions<StateType, Bag>\n): UseStreamCustom<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] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n })\n );\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n const threadIdRef = useRef<string | null>(threadId);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\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 // Reconstruct subagents from initialValues when:\n // 1. Subagent filtering is enabled\n // 2. Not currently streaming\n // 3. initialValues has messages\n // This ensures subagent visualization works with cached/persisted state\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const stop = () => stream.stop(historyValues, { onStop: options.onStop });\n\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>\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 // generate random thread id\n usableThreadId = crypto.randomUUID();\n threadIdRef.current = usableThreadId;\n 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: () => {\n if (!usableThreadId) return undefined;\n\n const finalValues = stream.values ?? historyValues;\n options.onFinish?.(\n createCustomTransportThreadState(finalValues, usableThreadId),\n undefined\n );\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, undefined);\n },\n }\n );\n };\n\n const handledToolsRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n handledToolsRef.current.clear();\n }, [threadId]);\n\n useEffect(() => {\n flushPendingHeadlessToolInterrupts(\n stream.values as Record<string, unknown> | null,\n options.tools,\n handledToolsRef.current,\n {\n onTool: options.onTool,\n defer: (run) => {\n void Promise.resolve().then(run);\n },\n resumeSubmit: (command) =>\n submit(null, {\n command,\n }),\n }\n );\n }, [options.onTool, options.tools, stream.values, submit]);\n\n return {\n get values() {\n return stream.values ?? ({} as StateType);\n },\n\n error: stream.error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n stream.values != null &&\n \"__interrupt__\" in stream.values &&\n Array.isArray(stream.values.__interrupt__)\n ) {\n return userFacingInterruptsFromValuesArray<InterruptType>(\n stream.values.__interrupt__ as Interrupt<InterruptType>[]\n );\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n const all = this.interrupts;\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n\n // Multiple interrupts: return the array for backward compat\n return all as Interrupt<InterruptType>;\n },\n\n get messages(): Message<ToolCallType>[] {\n if (!stream.values) return [];\n return getMessages(stream.values);\n },\n\n get toolCalls() {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n getToolCalls(message) {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\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.js","names":[],"sources":["../../src/react/stream.custom.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { EventStreamEvent, StreamManager } from \"../ui/manager.js\";\nimport { DEFAULT_MESSAGES_KEY } from \"../stream/constants.js\";\nimport type {\n GetUpdateType,\n GetCustomEventType,\n GetInterruptType,\n GetToolCallsType,\n GetConfigurableType,\n UseStreamTransport,\n AnyStreamCustomOptions,\n CustomSubmitOptions,\n} from \"../ui/types.js\";\nimport type { UseStreamCustom } from \"./types.js\";\nimport { type Message } from \"../types.messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\nimport { MessageTupleManager } from \"../ui/messages.js\";\nimport { userFacingInterruptsFromValuesArray } from \"../ui/interrupts.js\";\nimport { Interrupt, type ThreadState } from \"../schema.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../utils/sse.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport { Command } from \"../types.js\";\nimport type { BagTemplate } from \"../types.template.js\";\nimport { flushPendingHeadlessToolInterrupts } from \"../headless-tools.js\";\n\ninterface FetchStreamTransportOptions {\n /**\n * The URL of the API to use.\n */\n apiUrl: string;\n\n /**\n * Default headers to send with requests.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Specify a custom fetch implementation.\n */\n fetch?: typeof fetch | ((...args: any[]) => any); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n /**\n * Callback that is called before the request is made.\n */\n onRequest?: (\n url: string,\n init: RequestInit\n ) => Promise<RequestInit> | RequestInit;\n}\n\nexport class FetchStreamTransport<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n> implements UseStreamTransport<StateType, Bag> {\n constructor(private readonly options: FetchStreamTransportOptions) {}\n\n async stream(payload: {\n input: GetUpdateType<Bag, StateType> | null | undefined;\n context: GetConfigurableType<Bag> | undefined;\n command: Command | undefined;\n signal: AbortSignal;\n }): Promise<AsyncGenerator<{ id?: string; event: string; data: unknown }>> {\n const { signal, ...body } = payload;\n\n let requestInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.options.defaultHeaders,\n },\n body: JSON.stringify(body),\n signal,\n };\n\n if (this.options.onRequest) {\n requestInit = await this.options.onRequest(\n this.options.apiUrl,\n requestInit\n );\n }\n const fetchFn = this.options.fetch ?? fetch;\n\n const response = await fetchFn(this.options.apiUrl, requestInit);\n if (!response.ok) {\n throw new Error(`Failed to stream: ${response.statusText}`);\n }\n\n const stream = (\n response.body || new ReadableStream({ start: (ctrl) => ctrl.close() })\n )\n .pipeThrough(BytesLineDecoder())\n .pipeThrough(SSEDecoder());\n\n return IterableReadableStream.fromReadableStream(stream);\n }\n}\n\nfunction createCustomTransportThreadState<\n StateType extends Record<string, unknown>,\n>(values: StateType, threadId: string): ThreadState<StateType> {\n return {\n values,\n next: [],\n tasks: [],\n metadata: undefined,\n created_at: null,\n checkpoint: {\n thread_id: threadId,\n checkpoint_id: null,\n checkpoint_ns: \"\",\n checkpoint_map: null,\n },\n parent_checkpoint: null,\n };\n}\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: AnyStreamCustomOptions<StateType, Bag>\n): UseStreamCustom<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] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n })\n );\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n const threadIdRef = useRef<string | null>(threadId);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? DEFAULT_MESSAGES_KEY;\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 ?? DEFAULT_MESSAGES_KEY;\n return { ...current, [messagesKey]: messages };\n };\n\n const historyValues = options.initialValues ?? ({} as StateType);\n\n // Reconstruct subagents from initialValues when:\n // 1. Subagent filtering is enabled\n // 2. Not currently streaming\n // 3. initialValues has messages\n // This ensures subagent visualization works with cached/persisted state\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const stop = () => stream.stop(historyValues, { onStop: options.onStop });\n\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>\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 // generate random thread id\n usableThreadId = crypto.randomUUID();\n threadIdRef.current = usableThreadId;\n 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: () => {\n if (!usableThreadId) return undefined;\n\n const finalValues = stream.values ?? historyValues;\n options.onFinish?.(\n createCustomTransportThreadState(finalValues, usableThreadId),\n undefined\n );\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, undefined);\n },\n }\n );\n };\n\n const handledToolsRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n handledToolsRef.current.clear();\n }, [threadId]);\n\n useEffect(() => {\n flushPendingHeadlessToolInterrupts(\n stream.values as Record<string, unknown> | null,\n options.tools,\n handledToolsRef.current,\n {\n onTool: options.onTool,\n defer: (run) => {\n void Promise.resolve().then(run);\n },\n resumeSubmit: (command) =>\n submit(null, {\n command,\n }),\n }\n );\n }, [options.onTool, options.tools, stream.values, submit]);\n\n return {\n get values() {\n return stream.values ?? ({} as StateType);\n },\n\n error: stream.error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n stream.values != null &&\n \"__interrupt__\" in stream.values &&\n Array.isArray(stream.values.__interrupt__)\n ) {\n return userFacingInterruptsFromValuesArray<InterruptType>(\n stream.values.__interrupt__ as Interrupt<InterruptType>[]\n );\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n const all = this.interrupts;\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n\n // Multiple interrupts: return the array for backward compat\n return all as Interrupt<InterruptType>;\n },\n\n get messages(): Message<ToolCallType>[] {\n if (!stream.values) return [];\n return getMessages(stream.values);\n },\n\n get toolCalls() {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n getToolCalls(message) {\n if (!stream.values) return [];\n const msgs = getMessages(stream.values);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\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,5 +1,6 @@
1
1
  "use client";
2
2
  require("../_virtual/_rolldown/runtime.cjs");
3
+ require("../stream/constants.cjs");
3
4
  const require_messages = require("../ui/messages.cjs");
4
5
  const require_headless_tools = require("../headless-tools.cjs");
5
6
  const require_index = require("../client/index.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"stream.lgp.cjs","names":["getClientConfigHash","Client","MessageTupleManager","StreamManager","useControllableThreadId","getBranchContext","StreamError","findLast","onFinishRequiresThreadState","unique","filterStream","userFacingInterruptsFromValuesArray","userFacingInterruptsFromThreadTasks","getToolCallsWithResults"],"sources":["../../src/react/stream.lgp.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport {\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport {\n filterStream,\n findLast,\n onFinishRequiresThreadState,\n unique,\n} from \"../ui/utils.js\";\nimport { StreamError } from \"../ui/errors.js\";\nimport { getBranchContext } from \"../ui/branching.js\";\nimport { EventStreamEvent, StreamManager } from \"../ui/manager.js\";\nimport type {\n AnyStreamOptions,\n GetUpdateType,\n GetCustomEventType,\n GetInterruptType,\n GetConfigurableType,\n GetToolCallsType,\n RunCallbackMeta,\n MessageMetadata,\n UseStreamThread,\n} from \"../ui/types.js\";\nimport type { UseStream, SubmitOptions } from \"./types.js\";\n\nimport { Client, getClientConfigHash } from \"../client.js\";\nimport { type Message } from \"../types.messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\nimport type { Interrupt, ThreadState } from \"../schema.js\";\nimport type {\n StreamMode,\n ToolProgress,\n ToolsStreamEvent,\n} from \"../types.stream.js\";\nimport { MessageTupleManager } from \"../ui/messages.js\";\nimport {\n userFacingInterruptsFromThreadTasks,\n userFacingInterruptsFromValuesArray,\n} from \"../ui/interrupts.js\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport type { StreamEvent } from \"../types.js\";\nimport type { BagTemplate } from \"../types.template.js\";\nimport { flushPendingHeadlessToolInterrupts } from \"../headless-tools.js\";\n\nfunction getFetchHistoryKey(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number\n) {\n return [getClientConfigHash(client), threadId, limit].join(\":\");\n}\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 useThreadHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number,\n options: {\n passthrough: boolean;\n submittingRef: RefObject<string | null>;\n onError?: (error: unknown, run?: RunCallbackMeta) => void;\n }\n): UseStreamThread<StateType> {\n const key = getFetchHistoryKey(client, threadId, limit);\n const [state, setState] = useState<{\n key: string | undefined;\n data: ThreadState<StateType>[] | undefined;\n error: unknown | undefined;\n isLoading: boolean;\n }>(() => ({\n key: undefined,\n data: undefined,\n error: undefined,\n isLoading: threadId != null,\n }));\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const onErrorRef = useRef(options?.onError);\n onErrorRef.current = options?.onError;\n\n const fetcher = useCallback(\n (\n threadId: string | undefined | null,\n limit: boolean | number\n ): Promise<ThreadState<StateType>[]> => {\n // If only passthrough is enabled, don't fetch history\n if (options.passthrough) return Promise.resolve([]);\n\n const client = clientRef.current;\n const key = getFetchHistoryKey(client, threadId, limit);\n\n if (threadId != null) {\n setState((state) => {\n if (state.key === key) return { ...state, isLoading: true };\n return { key, data: undefined, error: undefined, isLoading: true };\n });\n return fetchHistory<StateType>(client, threadId, { limit }).then(\n (data) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data, error: undefined, isLoading: false };\n });\n return data;\n },\n (error) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data: state.data, error, isLoading: false };\n });\n onErrorRef.current?.(error);\n return Promise.reject(error);\n }\n );\n }\n\n setState({ key, data: undefined, error: undefined, isLoading: false });\n return Promise.resolve([]);\n },\n [options.passthrough]\n );\n\n useEffect(() => {\n // Skip if a stream is already in progress, no need to fetch history\n if (\n options.submittingRef.current != null &&\n options.submittingRef.current === threadId\n ) {\n return;\n }\n\n void fetcher(threadId, limit);\n // The `threadId` and `limit` arguments are already present in `key`\n // Thus we don't need to include them in the dependency array\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fetcher, key]);\n\n return {\n data: state.data,\n error: state.error,\n isLoading: state.isLoading,\n mutate: (mutateId?: string) => fetcher(mutateId ?? threadId, limit),\n };\n}\n\nexport function useStreamLGP<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamOptions<StateType, Bag>): UseStream<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 reconnectOnMountRef = useRef(options.reconnectOnMount);\n const runMetadataStorage = useMemo(() => {\n if (typeof window === \"undefined\") return null;\n const storage = reconnectOnMountRef.current;\n if (storage === true) return window.sessionStorage;\n if (typeof storage === \"function\") return storage();\n return null;\n }, []);\n\n const client = useMemo(\n () =>\n options.client ??\n new Client({\n apiUrl: options.apiUrl,\n apiKey: options.apiKey,\n callerOptions: options.callerOptions,\n defaultHeaders: options.defaultHeaders,\n }),\n [\n options.client,\n options.apiKey,\n options.apiUrl,\n options.callerOptions,\n options.defaultHeaders,\n ]\n );\n\n const [messageManager] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n })\n );\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n const trackStreamModeRef = useRef<Exclude<StreamMode, \"messages\">[]>([]);\n\n const trackStreamMode = useCallback(\n (...mode: Exclude<StreamMode, \"messages\">[]) => {\n const ref = trackStreamModeRef.current;\n for (const m of mode) {\n if (!ref.includes(m)) ref.push(m);\n }\n },\n []\n );\n\n const hasUpdateListener = options.onUpdateEvent != null;\n const hasCustomListener = options.onCustomEvent != null;\n const hasLangChainListener = options.onLangChainEvent != null;\n const hasDebugListener = options.onDebugEvent != null;\n const hasCheckpointListener = options.onCheckpointEvent != null;\n const hasTaskListener = options.onTaskEvent != null;\n const hasToolListener = options.onToolEvent != null;\n\n const callbackStreamMode = useMemo(() => {\n const modes: Exclude<StreamMode, \"messages\">[] = [];\n if (hasUpdateListener) modes.push(\"updates\");\n if (hasCustomListener) modes.push(\"custom\");\n if (hasLangChainListener) modes.push(\"events\");\n if (hasDebugListener) modes.push(\"debug\");\n if (hasCheckpointListener) modes.push(\"checkpoints\");\n if (hasTaskListener) modes.push(\"tasks\");\n if (hasToolListener) modes.push(\"tools\");\n return modes;\n }, [\n hasUpdateListener,\n hasCustomListener,\n hasLangChainListener,\n hasDebugListener,\n hasCheckpointListener,\n hasTaskListener,\n hasToolListener,\n ]);\n\n const threadIdRef = useRef<string | null>(threadId);\n const threadIdStreamingRef = useRef<string | null>(null);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\n\n const switchThread = useCallback(\n (newThreadId: string | null) => {\n if (newThreadId !== threadIdRef.current) {\n threadIdRef.current = newThreadId;\n stream.clear();\n onThreadId(newThreadId as string);\n }\n },\n [stream, onThreadId]\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 builtInHistory = useThreadHistory<StateType>(\n client,\n threadId,\n historyLimit,\n {\n passthrough: options.thread != null,\n submittingRef: threadIdStreamingRef,\n onError: options.onError,\n }\n );\n const history = options.thread ?? builtInHistory;\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 [branch, setBranch] = useState<string>(\"\");\n const branchContext = getBranchContext(branch, history.data ?? undefined);\n\n const [toolProgressMap, setToolProgressMap] = useState<\n Map<string, ToolProgress>\n >(new Map());\n\n const handleToolEvent = useCallback((data: ToolsStreamEvent[\"data\"]) => {\n setToolProgressMap((prev) => {\n const next = new Map(prev);\n const key = data.toolCallId ?? data.name;\n const existing = next.get(key);\n\n switch (data.event) {\n case \"on_tool_start\": {\n next.set(key, {\n toolCallId: data.toolCallId,\n name: data.name,\n state: \"starting\",\n input: data.input,\n });\n break;\n }\n case \"on_tool_event\": {\n if (existing) {\n next.set(key, { ...existing, state: \"running\", data: data.data });\n }\n break;\n }\n case \"on_tool_end\": {\n if (existing) {\n next.set(key, {\n ...existing,\n state: \"completed\",\n result: data.output,\n });\n }\n break;\n }\n case \"on_tool_error\": {\n if (existing) {\n next.set(key, { ...existing, state: \"error\", error: data.error });\n }\n break;\n }\n default: {\n throw new Error(\n `Unexpected tool event: ${(data as { event: string }).event}`\n );\n }\n }\n\n return next;\n });\n }, []);\n\n const historyValues =\n branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType);\n\n // Reconstruct subagents from history when:\n // 1. History is loaded (not loading, has data)\n // 2. No active stream is running\n // 3. Subagent filtering is enabled (otherwise subagents aren't tracked)\n // This ensures subagent visualization persists after page refresh or stream completion\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n !history.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n // Fetch internal messages for each subagent from their subgraph checkpoints.\n // These messages are not in the main thread state but are persisted in the\n // checkpointer under a subgraph-specific checkpoint_ns (e.g. tools:call_abc123).\n if (historyLimit !== false && threadId) {\n const controller = new AbortController();\n void stream.fetchSubagentHistory(client.threads, threadId, {\n messagesKey: options.messagesKey ?? \"messages\",\n historyLimit:\n typeof historyLimit === \"number\" ? historyLimit : undefined,\n signal: controller.signal,\n });\n return () => controller.abort();\n }\n }\n\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n return undefined;\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const historyError = (() => {\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 messageMetadata = (() => {\n const alreadyShown = new Set<string>();\n return getMessages(historyValues).map(\n (message, idx): Omit<MessageMetadata<StateType>, \"streamMetadata\"> => {\n const messageId = message.id ?? idx;\n\n // Find the first checkpoint where the message was seen\n const firstSeenState = findLast(\n history.data ?? [],\n (state) =>\n state.values != null &&\n getMessages(state.values)\n .map((m, idx) => m.id ?? idx)\n .includes(messageId)\n );\n\n const checkpointId = firstSeenState?.checkpoint?.checkpoint_id;\n let branch =\n checkpointId != null\n ? branchContext.branchByCheckpoint[checkpointId]\n : undefined;\n if (!branch?.branch?.length) branch = undefined;\n\n // serialize branches\n const optionsShown = branch?.branchOptions?.flat(2).join(\",\");\n if (optionsShown) {\n if (alreadyShown.has(optionsShown)) branch = undefined;\n alreadyShown.add(optionsShown);\n }\n\n return {\n messageId: messageId.toString(),\n firstSeenState,\n\n branch: branch?.branch,\n branchOptions: branch?.branchOptions,\n };\n }\n );\n })();\n\n const stop = () =>\n stream.stop(historyValues, {\n onStop: (args) => {\n if (runMetadataStorage && threadId) {\n const runId = runMetadataStorage.getItem(`lg:stream:${threadId}`);\n if (runId) void client.runs.cancel(threadId, runId);\n runMetadataStorage.removeItem(`lg:stream:${threadId}`);\n }\n\n options.onStop?.(args);\n },\n });\n\n // --- TRANSPORT ---\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>\n ) => {\n setToolProgressMap(new Map());\n\n // Unbranch things\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n setBranch(\n checkpointId != null\n ? (branchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\"\n );\n\n // When `fetchStateHistory` is requested, thus we assume that branching\n // is enabled. We then need to include the implicit branch.\n const includeImplicitBranch =\n historyLimit === true || typeof historyLimit === \"number\";\n\n const shouldRefetch =\n includeImplicitBranch || onFinishRequiresThreadState(options.onFinish);\n\n let callbackMeta: RunCallbackMeta | undefined;\n let rejoinKey: `lg:stream:${string}` | undefined;\n let usableThreadId = threadId;\n\n const shouldAbortPrevious =\n (submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\") &&\n stream.isLoading;\n\n await stream.start(\n async (signal: AbortSignal) => {\n stream.setStreamValues((values) => {\n const prev = { ...historyValues, ...values };\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 if (!usableThreadId) {\n const thread = await client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n signal,\n });\n\n usableThreadId = thread.thread_id;\n\n // Pre-emptively update the thread ID before\n // stream cancellation is kicked off and thread\n // is being refetched\n threadIdRef.current = usableThreadId;\n threadIdStreamingRef.current = usableThreadId;\n\n onThreadId(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n threadIdStreamingRef.current = usableThreadId;\n\n const streamMode = unique([\n ...(submitOptions?.streamMode ?? []),\n ...trackStreamModeRef.current,\n ...callbackStreamMode,\n ]);\n\n let checkpoint =\n submitOptions?.checkpoint ??\n (includeImplicitBranch\n ? branchContext.threadHead?.checkpoint\n : undefined) ??\n undefined;\n\n // Avoid specifying a checkpoint if user explicitly set it to null\n if (submitOptions?.checkpoint === null) checkpoint = undefined;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (checkpoint != null) delete checkpoint.thread_id;\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,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n\n async onSuccess() {\n if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);\n\n if (shouldRefetch) {\n const newHistory = await history.mutate(usableThreadId!);\n const lastHead = newHistory?.at(0);\n if (lastHead) {\n // We now have the latest update from /history\n // Thus we can clear the local stream state\n options.onFinish?.(lastHead, callbackMeta);\n return null;\n }\n } else if (\n options.onFinish != null &&\n !onFinishRequiresThreadState(options.onFinish)\n ) {\n options.onFinish(\n undefined as unknown as ThreadState<StateType>,\n callbackMeta\n );\n }\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish() {\n threadIdStreamingRef.current = null;\n },\n },\n { abortPrevious: shouldAbortPrevious }\n );\n };\n\n const joinStream = async (\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 setToolProgressMap(new Map());\n\n // eslint-disable-next-line no-param-reassign\n lastEventId ??= \"-1\";\n if (!threadId) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: threadId,\n run_id: runId,\n };\n\n const includeImplicitBranchJoin =\n historyLimit === true || typeof historyLimit === \"number\";\n const shouldRefetchJoin =\n includeImplicitBranchJoin ||\n onFinishRequiresThreadState(options.onFinish);\n\n await stream.start(\n async (signal: AbortSignal) => {\n threadIdStreamingRef.current = threadId;\n const stream = client.runs.joinStream(threadId, 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(stream, joinOptions.filter)\n : stream;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${threadId}`);\n if (!shouldRefetchJoin) {\n if (\n options.onFinish != null &&\n !onFinishRequiresThreadState(options.onFinish)\n ) {\n options.onFinish(\n undefined as unknown as ThreadState<StateType>,\n callbackMeta\n );\n }\n return;\n }\n const newHistory = await history.mutate(threadId);\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 threadIdStreamingRef.current = null;\n },\n }\n );\n };\n\n const reconnectKey = useMemo(() => {\n if (!runMetadataStorage || stream.isLoading) return undefined;\n if (typeof window === \"undefined\") return undefined;\n const runId = runMetadataStorage?.getItem(`lg:stream:${threadId}`);\n if (!runId) return undefined;\n return { runId, threadId };\n }, [runMetadataStorage, stream.isLoading, threadId]);\n\n const shouldReconnect = !!runMetadataStorage;\n const reconnectRef = useRef({ threadId, shouldReconnect });\n\n const joinStreamRef = useRef<typeof joinStream>(joinStream);\n joinStreamRef.current = joinStream;\n\n useEffect(() => {\n // reset shouldReconnect when switching threads\n if (reconnectRef.current.threadId !== threadId) {\n reconnectRef.current = { threadId, shouldReconnect };\n }\n }, [threadId, shouldReconnect]);\n\n useEffect(() => {\n if (reconnectKey && reconnectRef.current.shouldReconnect) {\n reconnectRef.current.shouldReconnect = false;\n void joinStreamRef.current?.(reconnectKey.runId);\n }\n }, [reconnectKey]);\n\n const error = stream.error ?? historyError ?? history.error;\n const values = stream.values ?? historyValues;\n\n const handledToolsRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n handledToolsRef.current.clear();\n }, [threadId]);\n\n useEffect(() => {\n flushPendingHeadlessToolInterrupts(\n values as Record<string, unknown>,\n options.tools,\n handledToolsRef.current,\n {\n onTool: options.onTool,\n defer: (run) => {\n void Promise.resolve().then(run);\n },\n resumeSubmit: (command) =>\n submit(null, {\n multitaskStrategy: \"interrupt\",\n command,\n }),\n }\n );\n }, [options.onTool, options.tools, submit, values]);\n\n const streamHandle: UseStream<StateType, Bag> = {\n get values() {\n trackStreamMode(\"values\");\n return values;\n },\n\n client,\n assistantId: options.assistantId,\n\n error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n switchThread,\n\n joinStream,\n\n branch,\n setBranch,\n\n get history() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\"\n );\n }\n\n return branchContext.flatHistory;\n },\n\n isThreadLoading: history.isLoading && history.data == null,\n\n get experimental_branchTree() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\"\n );\n }\n\n return branchContext.branchTree;\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n return userFacingInterruptsFromValuesArray<InterruptType>(\n values.__interrupt__ as Interrupt<InterruptType>[]\n );\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (stream.isLoading) return [];\n\n // Collect interrupts from ALL tasks (not just the last one)\n const allTasks = branchContext.threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n\n const taskInterrupts = userFacingInterruptsFromThreadTasks<InterruptType>(\n allInterrupts as Interrupt<InterruptType>[]\n );\n if (taskInterrupts != null) return taskInterrupts;\n\n // check if there's a next task present (breakpoint-style interrupt)\n const next = branchContext.threadHead?.next ?? [];\n if (!next.length || error != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n\n get interrupt() {\n const all = this.interrupts;\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n\n // Multiple interrupts: return the array for backward compat\n return all as Interrupt<InterruptType>;\n },\n\n get messages(): Message<ToolCallType>[] {\n trackStreamMode(\"messages-tuple\", \"values\");\n return getMessages(values);\n },\n\n get toolCalls() {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n get toolProgress(): ToolProgress[] {\n trackStreamMode(\"tools\");\n return Array.from(toolProgressMap.values());\n },\n\n getToolCalls(message: Message<ToolCallType>) {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n getMessagesMetadata(\n message: Message<ToolCallType>,\n index?: number\n ): MessageMetadata<StateType> | undefined {\n trackStreamMode(\"values\");\n\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata?.find(\n (m) => m.messageId === (message.id ?? index)\n );\n\n if (streamMetadata != null || historyMetadata != null) {\n return {\n ...historyMetadata,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n\n return undefined;\n },\n\n get subagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByType(type);\n },\n\n getSubagentsByMessage(messageId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByMessage(messageId);\n },\n };\n\n // Avoid eager getter evaluation during object spread/rest destructuring.\n // These accessors are opt-in and should only run when explicitly read.\n const nonEnumerableAccessors = [\n \"history\",\n \"experimental_branchTree\",\n \"toolProgress\",\n \"subagents\",\n \"activeSubagents\",\n ] as const;\n for (const key of nonEnumerableAccessors) {\n const descriptor = Object.getOwnPropertyDescriptor(streamHandle, key);\n if (descriptor?.get) {\n Object.defineProperty(streamHandle, key, {\n ...descriptor,\n enumerable: false,\n });\n }\n }\n\n return streamHandle;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream.lgp.cjs","names":["getClientConfigHash","Client","MessageTupleManager","StreamManager","useControllableThreadId","getBranchContext","StreamError","findLast","onFinishRequiresThreadState","unique","filterStream","userFacingInterruptsFromValuesArray","userFacingInterruptsFromThreadTasks","getToolCallsWithResults"],"sources":["../../src/react/stream.lgp.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport {\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport {\n filterStream,\n findLast,\n onFinishRequiresThreadState,\n unique,\n} from \"../ui/utils.js\";\nimport { StreamError } from \"../ui/errors.js\";\nimport { getBranchContext } from \"../ui/branching.js\";\nimport { EventStreamEvent, StreamManager } from \"../ui/manager.js\";\nimport type {\n AnyStreamOptions,\n GetUpdateType,\n GetCustomEventType,\n GetInterruptType,\n GetConfigurableType,\n GetToolCallsType,\n RunCallbackMeta,\n MessageMetadata,\n UseStreamThread,\n} from \"../ui/types.js\";\nimport type { UseStream, SubmitOptions } from \"./types.js\";\n\nimport { Client, getClientConfigHash } from \"../client.js\";\nimport { DEFAULT_MESSAGES_KEY } from \"../stream/constants.js\";\nimport { type Message } from \"../types.messages.js\";\nimport { getToolCallsWithResults } from \"../utils/tools.js\";\nimport type { Interrupt, ThreadState } from \"../schema.js\";\nimport type {\n StreamMode,\n ToolProgress,\n ToolsStreamEvent,\n} from \"../types.stream.js\";\nimport { MessageTupleManager } from \"../ui/messages.js\";\nimport {\n userFacingInterruptsFromThreadTasks,\n userFacingInterruptsFromValuesArray,\n} from \"../ui/interrupts.js\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport type { StreamEvent } from \"../types.js\";\nimport type { BagTemplate } from \"../types.template.js\";\nimport { flushPendingHeadlessToolInterrupts } from \"../headless-tools.js\";\n\nfunction getFetchHistoryKey(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number\n) {\n return [getClientConfigHash(client), threadId, limit].join(\":\");\n}\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 useThreadHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number,\n options: {\n passthrough: boolean;\n submittingRef: RefObject<string | null>;\n onError?: (error: unknown, run?: RunCallbackMeta) => void;\n }\n): UseStreamThread<StateType> {\n const key = getFetchHistoryKey(client, threadId, limit);\n const [state, setState] = useState<{\n key: string | undefined;\n data: ThreadState<StateType>[] | undefined;\n error: unknown | undefined;\n isLoading: boolean;\n }>(() => ({\n key: undefined,\n data: undefined,\n error: undefined,\n isLoading: threadId != null,\n }));\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const onErrorRef = useRef(options?.onError);\n onErrorRef.current = options?.onError;\n\n const fetcher = useCallback(\n (\n threadId: string | undefined | null,\n limit: boolean | number\n ): Promise<ThreadState<StateType>[]> => {\n // If only passthrough is enabled, don't fetch history\n if (options.passthrough) return Promise.resolve([]);\n\n const client = clientRef.current;\n const key = getFetchHistoryKey(client, threadId, limit);\n\n if (threadId != null) {\n setState((state) => {\n if (state.key === key) return { ...state, isLoading: true };\n return { key, data: undefined, error: undefined, isLoading: true };\n });\n return fetchHistory<StateType>(client, threadId, { limit }).then(\n (data) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data, error: undefined, isLoading: false };\n });\n return data;\n },\n (error) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data: state.data, error, isLoading: false };\n });\n onErrorRef.current?.(error);\n return Promise.reject(error);\n }\n );\n }\n\n setState({ key, data: undefined, error: undefined, isLoading: false });\n return Promise.resolve([]);\n },\n [options.passthrough]\n );\n\n useEffect(() => {\n // Skip if a stream is already in progress, no need to fetch history\n if (\n options.submittingRef.current != null &&\n options.submittingRef.current === threadId\n ) {\n return;\n }\n\n void fetcher(threadId, limit);\n // The `threadId` and `limit` arguments are already present in `key`\n // Thus we don't need to include them in the dependency array\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fetcher, key]);\n\n return {\n data: state.data,\n error: state.error,\n isLoading: state.isLoading,\n mutate: (mutateId?: string) => fetcher(mutateId ?? threadId, limit),\n };\n}\n\nexport function useStreamLGP<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamOptions<StateType, Bag>): UseStream<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 reconnectOnMountRef = useRef(options.reconnectOnMount);\n const runMetadataStorage = useMemo(() => {\n if (typeof window === \"undefined\") return null;\n const storage = reconnectOnMountRef.current;\n if (storage === true) return window.sessionStorage;\n if (typeof storage === \"function\") return storage();\n return null;\n }, []);\n\n const client = useMemo(\n () =>\n options.client ??\n new Client({\n apiUrl: options.apiUrl,\n apiKey: options.apiKey,\n callerOptions: options.callerOptions,\n defaultHeaders: options.defaultHeaders,\n }),\n [\n options.client,\n options.apiKey,\n options.apiUrl,\n options.callerOptions,\n options.defaultHeaders,\n ]\n );\n\n const [messageManager] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n })\n );\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n const trackStreamModeRef = useRef<Exclude<StreamMode, \"messages\">[]>([]);\n\n const trackStreamMode = useCallback(\n (...mode: Exclude<StreamMode, \"messages\">[]) => {\n const ref = trackStreamModeRef.current;\n for (const m of mode) {\n if (!ref.includes(m)) ref.push(m);\n }\n },\n []\n );\n\n const hasUpdateListener = options.onUpdateEvent != null;\n const hasCustomListener = options.onCustomEvent != null;\n const hasLangChainListener = options.onLangChainEvent != null;\n const hasDebugListener = options.onDebugEvent != null;\n const hasCheckpointListener = options.onCheckpointEvent != null;\n const hasTaskListener = options.onTaskEvent != null;\n const hasToolListener = options.onToolEvent != null;\n\n const callbackStreamMode = useMemo(() => {\n const modes: Exclude<StreamMode, \"messages\">[] = [];\n if (hasUpdateListener) modes.push(\"updates\");\n if (hasCustomListener) modes.push(\"custom\");\n if (hasLangChainListener) modes.push(\"events\");\n if (hasDebugListener) modes.push(\"debug\");\n if (hasCheckpointListener) modes.push(\"checkpoints\");\n if (hasTaskListener) modes.push(\"tasks\");\n if (hasToolListener) modes.push(\"tools\");\n return modes;\n }, [\n hasUpdateListener,\n hasCustomListener,\n hasLangChainListener,\n hasDebugListener,\n hasCheckpointListener,\n hasTaskListener,\n hasToolListener,\n ]);\n\n const threadIdRef = useRef<string | null>(threadId);\n const threadIdStreamingRef = useRef<string | null>(null);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\n\n const switchThread = useCallback(\n (newThreadId: string | null) => {\n if (newThreadId !== threadIdRef.current) {\n threadIdRef.current = newThreadId;\n stream.clear();\n onThreadId(newThreadId as string);\n }\n },\n [stream, onThreadId]\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 builtInHistory = useThreadHistory<StateType>(\n client,\n threadId,\n historyLimit,\n {\n passthrough: options.thread != null,\n submittingRef: threadIdStreamingRef,\n onError: options.onError,\n }\n );\n const history = options.thread ?? builtInHistory;\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? DEFAULT_MESSAGES_KEY;\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 ?? DEFAULT_MESSAGES_KEY;\n return { ...current, [messagesKey]: messages };\n };\n\n const [branch, setBranch] = useState<string>(\"\");\n const branchContext = getBranchContext(branch, history.data ?? undefined);\n\n const [toolProgressMap, setToolProgressMap] = useState<\n Map<string, ToolProgress>\n >(new Map());\n\n const handleToolEvent = useCallback((data: ToolsStreamEvent[\"data\"]) => {\n setToolProgressMap((prev) => {\n const next = new Map(prev);\n const key = data.toolCallId ?? data.name;\n const existing = next.get(key);\n\n switch (data.event) {\n case \"on_tool_start\": {\n next.set(key, {\n toolCallId: data.toolCallId,\n name: data.name,\n state: \"starting\",\n input: data.input,\n });\n break;\n }\n case \"on_tool_event\": {\n if (existing) {\n next.set(key, { ...existing, state: \"running\", data: data.data });\n }\n break;\n }\n case \"on_tool_end\": {\n if (existing) {\n next.set(key, {\n ...existing,\n state: \"completed\",\n result: data.output,\n });\n }\n break;\n }\n case \"on_tool_error\": {\n if (existing) {\n next.set(key, { ...existing, state: \"error\", error: data.error });\n }\n break;\n }\n default: {\n throw new Error(\n `Unexpected tool event: ${(data as { event: string }).event}`\n );\n }\n }\n\n return next;\n });\n }, []);\n\n const historyValues =\n branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType);\n\n // Reconstruct subagents from history when:\n // 1. History is loaded (not loading, has data)\n // 2. No active stream is running\n // 3. Subagent filtering is enabled (otherwise subagents aren't tracked)\n // This ensures subagent visualization persists after page refresh or stream completion\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n !history.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n // Fetch internal messages for each subagent from their subgraph checkpoints.\n // These messages are not in the main thread state but are persisted in the\n // checkpointer under a subgraph-specific checkpoint_ns (e.g. tools:call_abc123).\n if (historyLimit !== false && threadId) {\n const controller = new AbortController();\n void stream.fetchSubagentHistory(client.threads, threadId, {\n messagesKey: options.messagesKey ?? DEFAULT_MESSAGES_KEY,\n historyLimit:\n typeof historyLimit === \"number\" ? historyLimit : undefined,\n signal: controller.signal,\n });\n return () => controller.abort();\n }\n }\n\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n return undefined;\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const historyError = (() => {\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 messageMetadata = (() => {\n const alreadyShown = new Set<string>();\n return getMessages(historyValues).map(\n (message, idx): Omit<MessageMetadata<StateType>, \"streamMetadata\"> => {\n const messageId = message.id ?? idx;\n\n // Find the first checkpoint where the message was seen\n const firstSeenState = findLast(\n history.data ?? [],\n (state) =>\n state.values != null &&\n getMessages(state.values)\n .map((m, idx) => m.id ?? idx)\n .includes(messageId)\n );\n\n const checkpointId = firstSeenState?.checkpoint?.checkpoint_id;\n let branch =\n checkpointId != null\n ? branchContext.branchByCheckpoint[checkpointId]\n : undefined;\n if (!branch?.branch?.length) branch = undefined;\n\n // serialize branches\n const optionsShown = branch?.branchOptions?.flat(2).join(\",\");\n if (optionsShown) {\n if (alreadyShown.has(optionsShown)) branch = undefined;\n alreadyShown.add(optionsShown);\n }\n\n return {\n messageId: messageId.toString(),\n firstSeenState,\n\n branch: branch?.branch,\n branchOptions: branch?.branchOptions,\n };\n }\n );\n })();\n\n const stop = () =>\n stream.stop(historyValues, {\n onStop: (args) => {\n if (runMetadataStorage && threadId) {\n const runId = runMetadataStorage.getItem(`lg:stream:${threadId}`);\n if (runId) void client.runs.cancel(threadId, runId);\n runMetadataStorage.removeItem(`lg:stream:${threadId}`);\n }\n\n options.onStop?.(args);\n },\n });\n\n // --- TRANSPORT ---\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>\n ) => {\n setToolProgressMap(new Map());\n\n // Unbranch things\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n setBranch(\n checkpointId != null\n ? (branchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\"\n );\n\n // When `fetchStateHistory` is requested, thus we assume that branching\n // is enabled. We then need to include the implicit branch.\n const includeImplicitBranch =\n historyLimit === true || typeof historyLimit === \"number\";\n\n const shouldRefetch =\n includeImplicitBranch || onFinishRequiresThreadState(options.onFinish);\n\n let callbackMeta: RunCallbackMeta | undefined;\n let rejoinKey: `lg:stream:${string}` | undefined;\n let usableThreadId = threadId;\n\n const shouldAbortPrevious =\n (submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\") &&\n stream.isLoading;\n\n await stream.start(\n async (signal: AbortSignal) => {\n stream.setStreamValues((values) => {\n const prev = { ...historyValues, ...values };\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 if (!usableThreadId) {\n const thread = await client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n signal,\n });\n\n usableThreadId = thread.thread_id;\n\n // Pre-emptively update the thread ID before\n // stream cancellation is kicked off and thread\n // is being refetched\n threadIdRef.current = usableThreadId;\n threadIdStreamingRef.current = usableThreadId;\n\n onThreadId(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n threadIdStreamingRef.current = usableThreadId;\n\n const streamMode = unique([\n ...(submitOptions?.streamMode ?? []),\n ...trackStreamModeRef.current,\n ...callbackStreamMode,\n ]);\n\n let checkpoint =\n submitOptions?.checkpoint ??\n (includeImplicitBranch\n ? branchContext.threadHead?.checkpoint\n : undefined) ??\n undefined;\n\n // Avoid specifying a checkpoint if user explicitly set it to null\n if (submitOptions?.checkpoint === null) checkpoint = undefined;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (checkpoint != null) delete checkpoint.thread_id;\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,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n\n async onSuccess() {\n if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);\n\n if (shouldRefetch) {\n const newHistory = await history.mutate(usableThreadId!);\n const lastHead = newHistory?.at(0);\n if (lastHead) {\n // We now have the latest update from /history\n // Thus we can clear the local stream state\n options.onFinish?.(lastHead, callbackMeta);\n return null;\n }\n } else if (\n options.onFinish != null &&\n !onFinishRequiresThreadState(options.onFinish)\n ) {\n options.onFinish(\n undefined as unknown as ThreadState<StateType>,\n callbackMeta\n );\n }\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish() {\n threadIdStreamingRef.current = null;\n },\n },\n { abortPrevious: shouldAbortPrevious }\n );\n };\n\n const joinStream = async (\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 setToolProgressMap(new Map());\n\n // eslint-disable-next-line no-param-reassign\n lastEventId ??= \"-1\";\n if (!threadId) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: threadId,\n run_id: runId,\n };\n\n const includeImplicitBranchJoin =\n historyLimit === true || typeof historyLimit === \"number\";\n const shouldRefetchJoin =\n includeImplicitBranchJoin ||\n onFinishRequiresThreadState(options.onFinish);\n\n await stream.start(\n async (signal: AbortSignal) => {\n threadIdStreamingRef.current = threadId;\n const stream = client.runs.joinStream(threadId, 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(stream, joinOptions.filter)\n : stream;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${threadId}`);\n if (!shouldRefetchJoin) {\n if (\n options.onFinish != null &&\n !onFinishRequiresThreadState(options.onFinish)\n ) {\n options.onFinish(\n undefined as unknown as ThreadState<StateType>,\n callbackMeta\n );\n }\n return;\n }\n const newHistory = await history.mutate(threadId);\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 threadIdStreamingRef.current = null;\n },\n }\n );\n };\n\n const reconnectKey = useMemo(() => {\n if (!runMetadataStorage || stream.isLoading) return undefined;\n if (typeof window === \"undefined\") return undefined;\n const runId = runMetadataStorage?.getItem(`lg:stream:${threadId}`);\n if (!runId) return undefined;\n return { runId, threadId };\n }, [runMetadataStorage, stream.isLoading, threadId]);\n\n const shouldReconnect = !!runMetadataStorage;\n const reconnectRef = useRef({ threadId, shouldReconnect });\n\n const joinStreamRef = useRef<typeof joinStream>(joinStream);\n joinStreamRef.current = joinStream;\n\n useEffect(() => {\n // reset shouldReconnect when switching threads\n if (reconnectRef.current.threadId !== threadId) {\n reconnectRef.current = { threadId, shouldReconnect };\n }\n }, [threadId, shouldReconnect]);\n\n useEffect(() => {\n if (reconnectKey && reconnectRef.current.shouldReconnect) {\n reconnectRef.current.shouldReconnect = false;\n void joinStreamRef.current?.(reconnectKey.runId);\n }\n }, [reconnectKey]);\n\n const error = stream.error ?? historyError ?? history.error;\n const values = stream.values ?? historyValues;\n\n const handledToolsRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n handledToolsRef.current.clear();\n }, [threadId]);\n\n useEffect(() => {\n flushPendingHeadlessToolInterrupts(\n values as Record<string, unknown>,\n options.tools,\n handledToolsRef.current,\n {\n onTool: options.onTool,\n defer: (run) => {\n void Promise.resolve().then(run);\n },\n resumeSubmit: (command) =>\n submit(null, {\n multitaskStrategy: \"interrupt\",\n command,\n }),\n }\n );\n }, [options.onTool, options.tools, submit, values]);\n\n const streamHandle: UseStream<StateType, Bag> = {\n get values() {\n trackStreamMode(\"values\");\n return values;\n },\n\n client,\n assistantId: options.assistantId,\n\n error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n switchThread,\n\n joinStream,\n\n branch,\n setBranch,\n\n get history() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\"\n );\n }\n\n return branchContext.flatHistory;\n },\n\n isThreadLoading: history.isLoading && history.data == null,\n\n get experimental_branchTree() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\"\n );\n }\n\n return branchContext.branchTree;\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n return userFacingInterruptsFromValuesArray<InterruptType>(\n values.__interrupt__ as Interrupt<InterruptType>[]\n );\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (stream.isLoading) return [];\n\n // Collect interrupts from ALL tasks (not just the last one)\n const allTasks = branchContext.threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n\n const taskInterrupts = userFacingInterruptsFromThreadTasks<InterruptType>(\n allInterrupts as Interrupt<InterruptType>[]\n );\n if (taskInterrupts != null) return taskInterrupts;\n\n // check if there's a next task present (breakpoint-style interrupt)\n const next = branchContext.threadHead?.next ?? [];\n if (!next.length || error != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n\n get interrupt() {\n const all = this.interrupts;\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n\n // Multiple interrupts: return the array for backward compat\n return all as Interrupt<InterruptType>;\n },\n\n get messages(): Message<ToolCallType>[] {\n trackStreamMode(\"messages-tuple\", \"values\");\n return getMessages(values);\n },\n\n get toolCalls() {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n get toolProgress(): ToolProgress[] {\n trackStreamMode(\"tools\");\n return Array.from(toolProgressMap.values());\n },\n\n getToolCalls(message: Message<ToolCallType>) {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n getMessagesMetadata(\n message: Message<ToolCallType>,\n index?: number\n ): MessageMetadata<StateType> | undefined {\n trackStreamMode(\"values\");\n\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata?.find(\n (m) => m.messageId === (message.id ?? index)\n );\n\n if (streamMetadata != null || historyMetadata != null) {\n return {\n ...historyMetadata,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n\n return undefined;\n },\n\n get subagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByType(type);\n },\n\n getSubagentsByMessage(messageId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByMessage(messageId);\n },\n };\n\n // Avoid eager getter evaluation during object spread/rest destructuring.\n // These accessors are opt-in and should only run when explicitly read.\n const nonEnumerableAccessors = [\n \"history\",\n \"experimental_branchTree\",\n \"toolProgress\",\n \"subagents\",\n \"activeSubagents\",\n ] as const;\n for (const key of nonEnumerableAccessors) {\n const descriptor = Object.getOwnPropertyDescriptor(streamHandle, key);\n if (descriptor?.get) {\n Object.defineProperty(streamHandle, key, {\n ...descriptor,\n enumerable: false,\n });\n }\n }\n\n return streamHandle;\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import "../stream/constants.js";
2
3
  import { MessageTupleManager } from "../ui/messages.js";
3
4
  import { flushPendingHeadlessToolInterrupts } from "../headless-tools.js";
4
5
  import { Client, getClientConfigHash } from "../client/index.js";