@langchain/langgraph-sdk 1.9.3 → 1.9.5

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 (83) hide show
  1. package/README.md +20 -20
  2. package/dist/client/base.cjs.map +1 -1
  3. package/dist/client/base.d.cts +37 -0
  4. package/dist/client/base.d.cts.map +1 -1
  5. package/dist/client/base.d.ts +37 -0
  6. package/dist/client/base.d.ts.map +1 -1
  7. package/dist/client/base.js.map +1 -1
  8. package/dist/client/index.d.cts +1 -1
  9. package/dist/client/index.d.ts +1 -1
  10. package/dist/client/stream/handles/index.d.ts +1 -1
  11. package/dist/client/stream/handles/subagents.cjs +1 -1
  12. package/dist/client/stream/handles/subagents.cjs.map +1 -1
  13. package/dist/client/stream/handles/subagents.d.cts +2 -2
  14. package/dist/client/stream/handles/subagents.d.cts.map +1 -1
  15. package/dist/client/stream/handles/subagents.d.ts +2 -2
  16. package/dist/client/stream/handles/subagents.d.ts.map +1 -1
  17. package/dist/client/stream/handles/subagents.js +2 -2
  18. package/dist/client/stream/handles/subagents.js.map +1 -1
  19. package/dist/client/stream/handles/subgraphs.cjs +1 -1
  20. package/dist/client/stream/handles/subgraphs.cjs.map +1 -1
  21. package/dist/client/stream/handles/subgraphs.d.cts +2 -2
  22. package/dist/client/stream/handles/subgraphs.d.cts.map +1 -1
  23. package/dist/client/stream/handles/subgraphs.d.ts +2 -2
  24. package/dist/client/stream/handles/subgraphs.d.ts.map +1 -1
  25. package/dist/client/stream/handles/subgraphs.js +2 -2
  26. package/dist/client/stream/handles/subgraphs.js.map +1 -1
  27. package/dist/client/stream/handles/tools.cjs +124 -52
  28. package/dist/client/stream/handles/tools.cjs.map +1 -1
  29. package/dist/client/stream/handles/tools.d.cts +59 -13
  30. package/dist/client/stream/handles/tools.d.cts.map +1 -1
  31. package/dist/client/stream/handles/tools.d.ts +59 -13
  32. package/dist/client/stream/handles/tools.d.ts.map +1 -1
  33. package/dist/client/stream/handles/tools.js +122 -53
  34. package/dist/client/stream/handles/tools.js.map +1 -1
  35. package/dist/client/stream/index.cjs +2 -2
  36. package/dist/client/stream/index.cjs.map +1 -1
  37. package/dist/client/stream/index.d.cts +3 -3
  38. package/dist/client/stream/index.d.cts.map +1 -1
  39. package/dist/client/stream/index.d.ts +3 -3
  40. package/dist/client/stream/index.d.ts.map +1 -1
  41. package/dist/client/stream/index.js +3 -3
  42. package/dist/client/stream/index.js.map +1 -1
  43. package/dist/headless-tools.cjs +3 -0
  44. package/dist/headless-tools.cjs.map +1 -1
  45. package/dist/headless-tools.js +3 -0
  46. package/dist/headless-tools.js.map +1 -1
  47. package/dist/index.d.cts +2 -2
  48. package/dist/index.d.ts +2 -2
  49. package/dist/stream/controller.cjs +51 -1
  50. package/dist/stream/controller.cjs.map +1 -1
  51. package/dist/stream/controller.d.cts.map +1 -1
  52. package/dist/stream/controller.d.ts.map +1 -1
  53. package/dist/stream/controller.js +51 -1
  54. package/dist/stream/controller.js.map +1 -1
  55. package/dist/stream/index.cjs +3 -0
  56. package/dist/stream/index.d.cts +5 -5
  57. package/dist/stream/index.d.ts +5 -5
  58. package/dist/stream/index.js +2 -1
  59. package/dist/stream/lifecycle-loading-tracker.cjs +1 -1
  60. package/dist/stream/lifecycle-loading-tracker.cjs.map +1 -1
  61. package/dist/stream/lifecycle-loading-tracker.js +1 -1
  62. package/dist/stream/lifecycle-loading-tracker.js.map +1 -1
  63. package/dist/stream/projections/tool-calls.cjs.map +1 -1
  64. package/dist/stream/projections/tool-calls.js.map +1 -1
  65. package/dist/stream/submit-coordinator.cjs +37 -4
  66. package/dist/stream/submit-coordinator.cjs.map +1 -1
  67. package/dist/stream/submit-coordinator.d.cts.map +1 -1
  68. package/dist/stream/submit-coordinator.d.ts.map +1 -1
  69. package/dist/stream/submit-coordinator.js +37 -4
  70. package/dist/stream/submit-coordinator.js.map +1 -1
  71. package/dist/stream/types-inference.d.cts +65 -7
  72. package/dist/stream/types-inference.d.cts.map +1 -1
  73. package/dist/stream/types-inference.d.ts +65 -7
  74. package/dist/stream/types-inference.d.ts.map +1 -1
  75. package/dist/stream/types.d.cts +40 -21
  76. package/dist/stream/types.d.cts.map +1 -1
  77. package/dist/stream/types.d.ts +40 -21
  78. package/dist/stream/types.d.ts.map +1 -1
  79. package/dist/types.messages.d.cts +38 -1
  80. package/dist/types.messages.d.cts.map +1 -1
  81. package/dist/types.messages.d.ts +38 -1
  82. package/dist/types.messages.d.ts.map +1 -1
  83. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"subagents.js","names":["#session","#messagesIterable","#startProjection","#toolCallsIterable","#ensureMediaDispatcher","#audioBuffer","#imagesBuffer","#videoBuffer","#filesBuffer","#mediaDispatcherStarted","#subgraphsIterable","#source","#queue","#waiters","#pending","#sourcePump","#processEvent","#closed","#start"],"sources":["../../../../src/client/stream/handles/subagents.ts"],"sourcesContent":["import type {\n Channel,\n Event,\n MessagesEvent,\n SubscribeParams,\n ToolsEvent,\n} from \"@langchain/protocol\";\nimport type { SubscriptionHandle } from \"../index.js\";\nimport { MultiCursorBuffer } from \"../multi-cursor-buffer.js\";\nimport { StreamingMessageAssembler } from \"../messages.js\";\nimport type { StreamingMessage, StreamingMessageHandle } from \"../messages.js\";\nimport { ToolCallAssembler } from \"./tools.js\";\nimport type { AssembledToolCall } from \"./tools.js\";\nimport { MediaAssembler } from \"../media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../media.js\";\nimport type {\n EventForChannel,\n EventForChannels,\n SubscribeOptions,\n YieldForChannel,\n YieldForChannels,\n} from \"../types.js\";\nimport {\n type Subscribable,\n type SubgraphHandle,\n SubgraphDiscoveryHandle,\n} from \"./subgraphs.js\";\n\n/**\n * Discovered subagent within a streaming session. Mirrors the\n * in-process `SubagentRunStream` from DeepAgent.\n *\n * Each subagent is discovered when a `tool-started` event with\n * `tool_name === \"task\"` is observed. The `taskInput` and `output`\n * promises resolve from the task tool's lifecycle events.\n *\n * Use lazy getters (`sub.messages`, `sub.toolCalls`, etc.) for\n * namespace-scoped projections.\n */\nexport class SubagentHandle {\n readonly name: string;\n readonly callId: string;\n readonly taskInput: Promise<string>;\n readonly output: Promise<unknown>;\n readonly namespace: string[];\n readonly #session: Subscribable;\n\n #messagesIterable?: AsyncIterable<StreamingMessage>;\n #toolCallsIterable?: AsyncIterable<AssembledToolCall>;\n #subgraphsIterable?: AsyncIterable<SubgraphHandle>;\n\n #mediaDispatcherStarted = false;\n #audioBuffer?: MultiCursorBuffer<AudioMedia>;\n #imagesBuffer?: MultiCursorBuffer<ImageMedia>;\n #videoBuffer?: MultiCursorBuffer<VideoMedia>;\n #filesBuffer?: MultiCursorBuffer<FileMedia>;\n\n constructor(\n name: string,\n callId: string,\n namespace: string[],\n taskInput: Promise<string>,\n output: Promise<unknown>,\n session: Subscribable\n ) {\n this.name = name;\n this.callId = callId;\n this.namespace = namespace;\n this.taskInput = taskInput;\n this.output = output;\n this.#session = session;\n }\n\n get messages(): AsyncIterable<StreamingMessageHandle> {\n if (this.#messagesIterable) return this.#messagesIterable;\n const buffer = new MultiCursorBuffer<StreamingMessage>();\n this.#messagesIterable = buffer;\n const assembler = new StreamingMessageAssembler();\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n const msg = assembler.consume(event as MessagesEvent);\n if (msg) buffer.push(msg);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get toolCalls(): AsyncIterable<AssembledToolCall> {\n if (this.#toolCallsIterable) return this.#toolCallsIterable;\n const buffer = new MultiCursorBuffer<AssembledToolCall>();\n this.#toolCallsIterable = buffer;\n const assembler = new ToolCallAssembler();\n void this.#startProjection(\n [\"tools\"],\n (event) => {\n if (event.method !== \"tools\") return;\n const tc = assembler.consume(event as ToolsEvent);\n if (tc) buffer.push(tc);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get audio(): AsyncIterable<AudioMedia> {\n this.#ensureMediaDispatcher();\n return this.#audioBuffer!;\n }\n\n get images(): AsyncIterable<ImageMedia> {\n this.#ensureMediaDispatcher();\n return this.#imagesBuffer!;\n }\n\n get video(): AsyncIterable<VideoMedia> {\n this.#ensureMediaDispatcher();\n return this.#videoBuffer!;\n }\n\n get files(): AsyncIterable<FileMedia> {\n this.#ensureMediaDispatcher();\n return this.#filesBuffer!;\n }\n\n #ensureMediaDispatcher(): void {\n if (this.#mediaDispatcherStarted) return;\n this.#mediaDispatcherStarted = true;\n const audio = new MultiCursorBuffer<AudioMedia>();\n const images = new MultiCursorBuffer<ImageMedia>();\n const video = new MultiCursorBuffer<VideoMedia>();\n const files = new MultiCursorBuffer<FileMedia>();\n this.#audioBuffer = audio;\n this.#imagesBuffer = images;\n this.#videoBuffer = video;\n this.#filesBuffer = files;\n const assembler = new MediaAssembler({\n onAudio: (m: AudioMedia) => audio.push(m),\n onImage: (m: ImageMedia) => images.push(m),\n onVideo: (m: VideoMedia) => video.push(m),\n onFile: (m: FileMedia) => files.push(m),\n });\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n () => {\n assembler.close();\n audio.close();\n images.close();\n video.close();\n files.close();\n }\n );\n }\n\n get subgraphs(): AsyncIterable<SubgraphHandle> {\n if (this.#subgraphsIterable) return this.#subgraphsIterable;\n const buffer = new MultiCursorBuffer<SubgraphHandle>();\n this.#subgraphsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"lifecycle\"],\n namespaces: [this.namespace],\n });\n const discovery = new SubgraphDiscoveryHandle(\n rawHandle,\n this.#session,\n this.namespace\n );\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n /**\n * Create a raw channel subscription scoped to this subagent's namespace.\n */\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n subscribe(\n paramsOrChannels: SubscribeParams | Channel | string | readonly Channel[],\n options: SubscribeOptions = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n if (\n typeof paramsOrChannels === \"object\" &&\n !Array.isArray(paramsOrChannels) &&\n \"channels\" in paramsOrChannels\n ) {\n return this.#session.subscribe({\n ...paramsOrChannels,\n namespaces: paramsOrChannels.namespaces ?? [this.namespace],\n });\n }\n\n return this.#session.subscribe(paramsOrChannels as Channel, {\n ...options,\n namespaces: options.namespaces ?? [this.namespace],\n });\n }\n\n async #startProjection(\n channels: Channel[],\n onEvent: (event: Event) => void,\n onDone: () => void\n ): Promise<void> {\n try {\n const rawHandle = await this.#session.subscribe({\n channels,\n namespaces: [this.namespace],\n });\n for await (const event of rawHandle) {\n onEvent(event);\n }\n } finally {\n onDone();\n }\n }\n}\n\n/**\n * Async iterable that yields {@link SubagentHandle} instances as task\n * tool calls are discovered from the `tools` channel.\n *\n * Mirrors the in-process `createSubagentTransformer` from DeepAgent:\n * watches for `tool_name === \"task\"` with `tool-started`, extracts\n * `subagent_type` and `description` from the input, and resolves\n * `output` on `tool-finished`.\n */\nexport class SubagentDiscoveryHandle implements AsyncIterable<SubagentHandle> {\n readonly #source: SubscriptionHandle<Event>;\n readonly #session: Subscribable;\n readonly #queue: SubagentHandle[] = [];\n readonly #waiters: Array<(value: IteratorResult<SubagentHandle>) => void> =\n [];\n readonly #pending = new Map<\n string,\n {\n resolveOutput: (v: unknown) => void;\n rejectOutput: (e: unknown) => void;\n }\n >();\n #sourcePump?: Promise<void>;\n #closed = false;\n\n constructor(source: SubscriptionHandle<Event>, session: Subscribable) {\n this.#source = source;\n this.#session = session;\n }\n\n #processEvent(event: Event): SubagentHandle | undefined {\n if (event.method !== \"tools\") return undefined;\n const tools = event as ToolsEvent;\n const data = tools.params.data;\n const toolCallId = (data as Record<string, unknown>).tool_call_id as string;\n const toolName = (data as Record<string, unknown>).tool_name as string;\n\n if (toolName === \"task\" && data.event === \"tool-started\") {\n const rawInput = (data as Record<string, unknown>).input;\n const input: { description?: string; subagent_type?: string } =\n typeof rawInput === \"string\"\n ? JSON.parse(rawInput)\n : ((rawInput as Record<string, unknown>) ?? {});\n\n const name = input.subagent_type ?? \"unknown\";\n const description = input.description ?? \"\";\n\n let resolveTaskInput!: (v: string) => void;\n let resolveOutput!: (v: unknown) => void;\n let rejectOutput!: (e: unknown) => void;\n\n const taskInput = new Promise<string>((r) => {\n resolveTaskInput = r;\n });\n const output = new Promise<unknown>((res, rej) => {\n resolveOutput = res;\n rejectOutput = rej;\n });\n\n resolveTaskInput(description);\n this.#pending.set(toolCallId, { resolveOutput, rejectOutput });\n\n const namespace = [...tools.params.namespace];\n\n return new SubagentHandle(\n name,\n toolCallId,\n namespace,\n taskInput,\n output,\n this.#session\n );\n }\n\n if (toolCallId) {\n const pending = this.#pending.get(toolCallId);\n if (pending) {\n if (data.event === \"tool-finished\") {\n pending.resolveOutput((data as Record<string, unknown>).output);\n this.#pending.delete(toolCallId);\n } else if (data.event === \"tool-error\") {\n const message =\n ((data as Record<string, unknown>).message as string) ??\n \"unknown error\";\n pending.rejectOutput(new Error(message));\n this.#pending.delete(toolCallId);\n }\n }\n }\n\n return undefined;\n }\n\n #start(): void {\n if (this.#sourcePump) return;\n this.#sourcePump = (async () => {\n for await (const event of this.#source) {\n const handle = this.#processEvent(event);\n if (!handle) continue;\n\n const waiter = this.#waiters.shift();\n if (waiter) {\n waiter({ done: false, value: handle });\n } else {\n this.#queue.push(handle);\n }\n }\n this.#closed = true;\n for (const pending of this.#pending.values()) {\n pending.resolveOutput(undefined);\n }\n this.#pending.clear();\n while (this.#waiters.length > 0) {\n this.#waiters.shift()?.({ done: true, value: undefined });\n }\n })();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.#source.unsubscribe();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubagentHandle> {\n this.#start();\n return {\n next: async () => {\n if (this.#queue.length > 0) {\n return { done: false, value: this.#queue.shift()! };\n }\n if (this.#closed) {\n return { done: true, value: undefined };\n }\n return await new Promise<IteratorResult<SubagentHandle>>((resolve) => {\n this.#waiters.push(resolve);\n });\n },\n return: async () => {\n await this.close();\n return { done: true, value: undefined };\n },\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"subagents.js","names":["#session","#messagesIterable","#startProjection","#toolCallsIterable","#ensureMediaDispatcher","#audioBuffer","#imagesBuffer","#videoBuffer","#filesBuffer","#mediaDispatcherStarted","#subgraphsIterable","#source","#queue","#waiters","#pending","#sourcePump","#processEvent","#closed","#start"],"sources":["../../../../src/client/stream/handles/subagents.ts"],"sourcesContent":["import type {\n Channel,\n Event,\n MessagesEvent,\n SubscribeParams,\n ToolsEvent,\n} from \"@langchain/protocol\";\nimport type { SubscriptionHandle } from \"../index.js\";\nimport { MultiCursorBuffer } from \"../multi-cursor-buffer.js\";\nimport { StreamingMessageAssembler } from \"../messages.js\";\nimport type { StreamingMessage, StreamingMessageHandle } from \"../messages.js\";\nimport { ToolCallAssembler, toClientAssembledToolCall } from \"./tools.js\";\nimport type { ClientAssembledToolCall } from \"./tools.js\";\nimport { MediaAssembler } from \"../media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../media.js\";\nimport type {\n EventForChannel,\n EventForChannels,\n SubscribeOptions,\n YieldForChannel,\n YieldForChannels,\n} from \"../types.js\";\nimport {\n type Subscribable,\n type SubgraphHandle,\n SubgraphDiscoveryHandle,\n} from \"./subgraphs.js\";\n\n/**\n * Discovered subagent within a streaming session. Mirrors the\n * in-process `SubagentRunStream` from DeepAgent.\n *\n * Each subagent is discovered when a `tool-started` event with\n * `tool_name === \"task\"` is observed. The `taskInput` and `output`\n * promises resolve from the task tool's lifecycle events.\n *\n * Use lazy getters (`sub.messages`, `sub.toolCalls`, etc.) for\n * namespace-scoped projections.\n */\nexport class SubagentHandle {\n readonly name: string;\n readonly callId: string;\n readonly taskInput: Promise<string>;\n readonly output: Promise<unknown>;\n readonly namespace: string[];\n readonly #session: Subscribable;\n\n #messagesIterable?: AsyncIterable<StreamingMessage>;\n #toolCallsIterable?: AsyncIterable<ClientAssembledToolCall>;\n #subgraphsIterable?: AsyncIterable<SubgraphHandle>;\n\n #mediaDispatcherStarted = false;\n #audioBuffer?: MultiCursorBuffer<AudioMedia>;\n #imagesBuffer?: MultiCursorBuffer<ImageMedia>;\n #videoBuffer?: MultiCursorBuffer<VideoMedia>;\n #filesBuffer?: MultiCursorBuffer<FileMedia>;\n\n constructor(\n name: string,\n callId: string,\n namespace: string[],\n taskInput: Promise<string>,\n output: Promise<unknown>,\n session: Subscribable\n ) {\n this.name = name;\n this.callId = callId;\n this.namespace = namespace;\n this.taskInput = taskInput;\n this.output = output;\n this.#session = session;\n }\n\n get messages(): AsyncIterable<StreamingMessageHandle> {\n if (this.#messagesIterable) return this.#messagesIterable;\n const buffer = new MultiCursorBuffer<StreamingMessage>();\n this.#messagesIterable = buffer;\n const assembler = new StreamingMessageAssembler();\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n const msg = assembler.consume(event as MessagesEvent);\n if (msg) buffer.push(msg);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get toolCalls(): AsyncIterable<ClientAssembledToolCall> {\n if (this.#toolCallsIterable) return this.#toolCallsIterable;\n const buffer = new MultiCursorBuffer<ClientAssembledToolCall>();\n this.#toolCallsIterable = buffer;\n const assembler = new ToolCallAssembler();\n void this.#startProjection(\n [\"tools\"],\n (event) => {\n if (event.method !== \"tools\") return;\n const tc = assembler.consume(event as ToolsEvent);\n if (tc) buffer.push(toClientAssembledToolCall(tc));\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get audio(): AsyncIterable<AudioMedia> {\n this.#ensureMediaDispatcher();\n return this.#audioBuffer!;\n }\n\n get images(): AsyncIterable<ImageMedia> {\n this.#ensureMediaDispatcher();\n return this.#imagesBuffer!;\n }\n\n get video(): AsyncIterable<VideoMedia> {\n this.#ensureMediaDispatcher();\n return this.#videoBuffer!;\n }\n\n get files(): AsyncIterable<FileMedia> {\n this.#ensureMediaDispatcher();\n return this.#filesBuffer!;\n }\n\n #ensureMediaDispatcher(): void {\n if (this.#mediaDispatcherStarted) return;\n this.#mediaDispatcherStarted = true;\n const audio = new MultiCursorBuffer<AudioMedia>();\n const images = new MultiCursorBuffer<ImageMedia>();\n const video = new MultiCursorBuffer<VideoMedia>();\n const files = new MultiCursorBuffer<FileMedia>();\n this.#audioBuffer = audio;\n this.#imagesBuffer = images;\n this.#videoBuffer = video;\n this.#filesBuffer = files;\n const assembler = new MediaAssembler({\n onAudio: (m: AudioMedia) => audio.push(m),\n onImage: (m: ImageMedia) => images.push(m),\n onVideo: (m: VideoMedia) => video.push(m),\n onFile: (m: FileMedia) => files.push(m),\n });\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n () => {\n assembler.close();\n audio.close();\n images.close();\n video.close();\n files.close();\n }\n );\n }\n\n get subgraphs(): AsyncIterable<SubgraphHandle> {\n if (this.#subgraphsIterable) return this.#subgraphsIterable;\n const buffer = new MultiCursorBuffer<SubgraphHandle>();\n this.#subgraphsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"lifecycle\"],\n namespaces: [this.namespace],\n });\n const discovery = new SubgraphDiscoveryHandle(\n rawHandle,\n this.#session,\n this.namespace\n );\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n /**\n * Create a raw channel subscription scoped to this subagent's namespace.\n */\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n subscribe(\n paramsOrChannels: SubscribeParams | Channel | string | readonly Channel[],\n options: SubscribeOptions = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n if (\n typeof paramsOrChannels === \"object\" &&\n !Array.isArray(paramsOrChannels) &&\n \"channels\" in paramsOrChannels\n ) {\n return this.#session.subscribe({\n ...paramsOrChannels,\n namespaces: paramsOrChannels.namespaces ?? [this.namespace],\n });\n }\n\n return this.#session.subscribe(paramsOrChannels as Channel, {\n ...options,\n namespaces: options.namespaces ?? [this.namespace],\n });\n }\n\n async #startProjection(\n channels: Channel[],\n onEvent: (event: Event) => void,\n onDone: () => void\n ): Promise<void> {\n try {\n const rawHandle = await this.#session.subscribe({\n channels,\n namespaces: [this.namespace],\n });\n for await (const event of rawHandle) {\n onEvent(event);\n }\n } finally {\n onDone();\n }\n }\n}\n\n/**\n * Async iterable that yields {@link SubagentHandle} instances as task\n * tool calls are discovered from the `tools` channel.\n *\n * Mirrors the in-process `createSubagentTransformer` from DeepAgent:\n * watches for `tool_name === \"task\"` with `tool-started`, extracts\n * `subagent_type` and `description` from the input, and resolves\n * `output` on `tool-finished`.\n */\nexport class SubagentDiscoveryHandle implements AsyncIterable<SubagentHandle> {\n readonly #source: SubscriptionHandle<Event>;\n readonly #session: Subscribable;\n readonly #queue: SubagentHandle[] = [];\n readonly #waiters: Array<(value: IteratorResult<SubagentHandle>) => void> =\n [];\n readonly #pending = new Map<\n string,\n {\n resolveOutput: (v: unknown) => void;\n rejectOutput: (e: unknown) => void;\n }\n >();\n #sourcePump?: Promise<void>;\n #closed = false;\n\n constructor(source: SubscriptionHandle<Event>, session: Subscribable) {\n this.#source = source;\n this.#session = session;\n }\n\n #processEvent(event: Event): SubagentHandle | undefined {\n if (event.method !== \"tools\") return undefined;\n const tools = event as ToolsEvent;\n const data = tools.params.data;\n const toolCallId = (data as Record<string, unknown>).tool_call_id as string;\n const toolName = (data as Record<string, unknown>).tool_name as string;\n\n if (toolName === \"task\" && data.event === \"tool-started\") {\n const rawInput = (data as Record<string, unknown>).input;\n const input: { description?: string; subagent_type?: string } =\n typeof rawInput === \"string\"\n ? JSON.parse(rawInput)\n : ((rawInput as Record<string, unknown>) ?? {});\n\n const name = input.subagent_type ?? \"unknown\";\n const description = input.description ?? \"\";\n\n let resolveTaskInput!: (v: string) => void;\n let resolveOutput!: (v: unknown) => void;\n let rejectOutput!: (e: unknown) => void;\n\n const taskInput = new Promise<string>((r) => {\n resolveTaskInput = r;\n });\n const output = new Promise<unknown>((res, rej) => {\n resolveOutput = res;\n rejectOutput = rej;\n });\n\n resolveTaskInput(description);\n this.#pending.set(toolCallId, { resolveOutput, rejectOutput });\n\n const namespace = [...tools.params.namespace];\n\n return new SubagentHandle(\n name,\n toolCallId,\n namespace,\n taskInput,\n output,\n this.#session\n );\n }\n\n if (toolCallId) {\n const pending = this.#pending.get(toolCallId);\n if (pending) {\n if (data.event === \"tool-finished\") {\n pending.resolveOutput((data as Record<string, unknown>).output);\n this.#pending.delete(toolCallId);\n } else if (data.event === \"tool-error\") {\n const message =\n ((data as Record<string, unknown>).message as string) ??\n \"unknown error\";\n pending.rejectOutput(new Error(message));\n this.#pending.delete(toolCallId);\n }\n }\n }\n\n return undefined;\n }\n\n #start(): void {\n if (this.#sourcePump) return;\n this.#sourcePump = (async () => {\n for await (const event of this.#source) {\n const handle = this.#processEvent(event);\n if (!handle) continue;\n\n const waiter = this.#waiters.shift();\n if (waiter) {\n waiter({ done: false, value: handle });\n } else {\n this.#queue.push(handle);\n }\n }\n this.#closed = true;\n for (const pending of this.#pending.values()) {\n pending.resolveOutput(undefined);\n }\n this.#pending.clear();\n while (this.#waiters.length > 0) {\n this.#waiters.shift()?.({ done: true, value: undefined });\n }\n })();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.#source.unsubscribe();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubagentHandle> {\n this.#start();\n return {\n next: async () => {\n if (this.#queue.length > 0) {\n return { done: false, value: this.#queue.shift()! };\n }\n if (this.#closed) {\n return { done: true, value: undefined };\n }\n return await new Promise<IteratorResult<SubagentHandle>>((resolve) => {\n this.#waiters.push(resolve);\n });\n },\n return: async () => {\n await this.close();\n return { done: true, value: undefined };\n },\n };\n }\n}\n"],"mappings":"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"}
@@ -102,7 +102,7 @@ var SubgraphHandle = class {
102
102
  this.#startProjection(["tools"], (event) => {
103
103
  if (event.method !== "tools") return;
104
104
  const tc = assembler.consume(event);
105
- if (tc) buffer.push(tc);
105
+ if (tc) buffer.push(require_tools.toClientAssembledToolCall(tc));
106
106
  }, () => buffer.close());
107
107
  return buffer;
108
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subgraphs.cjs","names":["#session","#messagesIterable","MultiCursorBuffer","StreamingMessageAssembler","#startProjection","#valuesProjection","#outputPromise","#toolCallsIterable","ToolCallAssembler","#subgraphsIterable","#subagentsIterable","#ensureMediaDispatcher","#audioBuffer","#imagesBuffer","#videoBuffer","#filesBuffer","#mediaDispatcherStarted","MediaAssembler","#source","#parentNamespace","#discovered","#pendingToolStarts","#pendingToolCallHandles","#queue","#waiters","#processToolEvent","#sourcePump","#processEvent","#emit","#closed","#start"],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"sourcesContent":["import type {\n Channel,\n Event,\n LifecycleCause,\n LifecycleEvent,\n MessagesEvent,\n SubscribeParams,\n ToolsEvent,\n ValuesEvent,\n} from \"@langchain/protocol\";\nimport type { SubscriptionHandle } from \"../index.js\";\nimport { MultiCursorBuffer } from \"../multi-cursor-buffer.js\";\nimport { StreamingMessageAssembler } from \"../messages.js\";\nimport type { StreamingMessage, StreamingMessageHandle } from \"../messages.js\";\nimport { ToolCallAssembler } from \"./tools.js\";\nimport type { AssembledToolCall } from \"./tools.js\";\nimport { MediaAssembler } from \"../media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../media.js\";\nimport type {\n EventForChannel,\n EventForChannels,\n SubscribeOptions,\n YieldForChannel,\n YieldForChannels,\n} from \"../types.js\";\nimport type { SubagentHandle } from \"./subagents.js\";\n\n/**\n * Minimal subscription surface that {@link SubgraphHandle} and\n * {@link SubagentHandle} delegate to. Typed to match the\n * `Session.subscribe` raw-channel overloads without importing the\n * full `Session` class (avoids circular dependency).\n */\nexport interface Subscribable {\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n}\n\n/**\n * Discovered subgraph within a streaming session.\n *\n * Mirrors the in-process `SubgraphRunStream` pattern: each subgraph\n * has `name`, `index`, `namespace`, and lazy getters for projections\n * scoped to this subgraph's namespace.\n *\n * ```ts\n * for await (const sub of session.subgraphs) {\n * for await (const msg of sub.messages) { ... }\n * const state = await sub.output;\n * }\n * ```\n */\nexport class SubgraphHandle {\n readonly name: string;\n readonly index: number;\n readonly namespace: string[];\n /**\n * Non-empty when upstream attached a `cause` to this subgraph's\n * `lifecycle.started` event. Population is product-specific and\n * performed by stream transformers on the runtime side (e.g.\n * deepagents' `SubagentTransformer` emits\n * `{ type: \"toolCall\", tool_call_id }`). Generic clients should\n * treat `cause.type` as an open enum — the protocol allows future\n * variants (`send`, `edge`, ...) to be forwarded verbatim without\n * a SDK bump.\n */\n readonly cause?: LifecycleCause;\n readonly graphName?: string;\n /**\n * Raw `tool-started` event that triggered this subgraph, when\n * `cause.type === \"toolCall\"` and the matching event has been\n * observed on the `tools` channel.\n */\n toolStartedEvent?: ToolsEvent;\n readonly #session: Subscribable;\n\n #messagesIterable?: AsyncIterable<StreamingMessage>;\n #valuesProjection?: AsyncIterable<unknown> & PromiseLike<unknown>;\n #toolCallsIterable?: AsyncIterable<AssembledToolCall>;\n #subgraphsIterable?: AsyncIterable<SubgraphHandle>;\n #subagentsIterable?: AsyncIterable<SubagentHandle>;\n #outputPromise?: Promise<unknown>;\n\n #mediaDispatcherStarted = false;\n #audioBuffer?: MultiCursorBuffer<AudioMedia>;\n #imagesBuffer?: MultiCursorBuffer<ImageMedia>;\n #videoBuffer?: MultiCursorBuffer<VideoMedia>;\n #filesBuffer?: MultiCursorBuffer<FileMedia>;\n\n constructor(\n name: string,\n index: number,\n namespace: string[],\n session: Subscribable,\n options?: {\n cause?: LifecycleCause;\n graphName?: string;\n toolStartedEvent?: ToolsEvent;\n }\n ) {\n this.name = name;\n this.index = index;\n this.namespace = namespace;\n this.cause = options?.cause;\n this.graphName = options?.graphName;\n this.toolStartedEvent = options?.toolStartedEvent;\n this.#session = session;\n }\n\n get messages(): AsyncIterable<StreamingMessageHandle> {\n if (this.#messagesIterable) return this.#messagesIterable;\n const buffer = new MultiCursorBuffer<StreamingMessage>();\n this.#messagesIterable = buffer;\n const assembler = new StreamingMessageAssembler();\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n const msg = assembler.consume(event as MessagesEvent);\n if (msg) buffer.push(msg);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get values(): AsyncIterable<unknown> & PromiseLike<unknown> {\n if (this.#valuesProjection) return this.#valuesProjection;\n const buffer = new MultiCursorBuffer<unknown>();\n let lastValue: unknown;\n let resolveOutput!: (value: unknown) => void;\n const outputPromise = new Promise<unknown>((resolve) => {\n resolveOutput = resolve;\n });\n this.#outputPromise = outputPromise;\n const projection = Object.assign(buffer, {\n then: <TResult1 = unknown, TResult2 = never>(\n onfulfilled?:\n | ((value: unknown) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null\n ): Promise<TResult1 | TResult2> =>\n outputPromise.then(onfulfilled, onrejected),\n }) as AsyncIterable<unknown> & PromiseLike<unknown>;\n this.#valuesProjection = projection;\n void this.#startProjection(\n [\"values\"],\n (event) => {\n if (event.method !== \"values\") return;\n const data = (event as ValuesEvent).params.data;\n lastValue = data;\n buffer.push(data);\n },\n () => {\n resolveOutput(lastValue);\n buffer.close();\n }\n );\n return projection;\n }\n\n get toolCalls(): AsyncIterable<AssembledToolCall> {\n if (this.#toolCallsIterable) return this.#toolCallsIterable;\n const buffer = new MultiCursorBuffer<AssembledToolCall>();\n this.#toolCallsIterable = buffer;\n const assembler = new ToolCallAssembler();\n void this.#startProjection(\n [\"tools\"],\n (event) => {\n if (event.method !== \"tools\") return;\n const tc = assembler.consume(event as ToolsEvent);\n if (tc) buffer.push(tc);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get subgraphs(): AsyncIterable<SubgraphHandle> {\n if (this.#subgraphsIterable) return this.#subgraphsIterable;\n const buffer = new MultiCursorBuffer<SubgraphHandle>();\n this.#subgraphsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"lifecycle\", \"tools\"],\n namespaces: [this.namespace],\n });\n const discovery = new SubgraphDiscoveryHandle(\n rawHandle,\n this.#session,\n this.namespace\n );\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get subagents(): AsyncIterable<SubagentHandle> {\n if (this.#subagentsIterable) return this.#subagentsIterable;\n const buffer = new MultiCursorBuffer<SubagentHandle>();\n this.#subagentsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"tools\", \"lifecycle\"],\n namespaces: [this.namespace],\n });\n const { SubagentDiscoveryHandle: Discovery } =\n await import(\"./subagents.js\");\n const discovery = new Discovery(rawHandle, this.#session);\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get audio(): AsyncIterable<AudioMedia> {\n this.#ensureMediaDispatcher();\n return this.#audioBuffer!;\n }\n\n get images(): AsyncIterable<ImageMedia> {\n this.#ensureMediaDispatcher();\n return this.#imagesBuffer!;\n }\n\n get video(): AsyncIterable<VideoMedia> {\n this.#ensureMediaDispatcher();\n return this.#videoBuffer!;\n }\n\n get files(): AsyncIterable<FileMedia> {\n this.#ensureMediaDispatcher();\n return this.#filesBuffer!;\n }\n\n get output(): Promise<unknown> {\n void this.values;\n return this.#outputPromise!;\n }\n\n #ensureMediaDispatcher(): void {\n if (this.#mediaDispatcherStarted) return;\n this.#mediaDispatcherStarted = true;\n const audio = new MultiCursorBuffer<AudioMedia>();\n const images = new MultiCursorBuffer<ImageMedia>();\n const video = new MultiCursorBuffer<VideoMedia>();\n const files = new MultiCursorBuffer<FileMedia>();\n this.#audioBuffer = audio;\n this.#imagesBuffer = images;\n this.#videoBuffer = video;\n this.#filesBuffer = files;\n const assembler = new MediaAssembler({\n onAudio: (m: AudioMedia) => audio.push(m),\n onImage: (m: ImageMedia) => images.push(m),\n onVideo: (m: VideoMedia) => video.push(m),\n onFile: (m: FileMedia) => files.push(m),\n });\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n () => {\n assembler.close();\n audio.close();\n images.close();\n video.close();\n files.close();\n }\n );\n }\n\n /**\n * Create a raw channel subscription scoped to this subgraph's namespace.\n */\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n subscribe(\n paramsOrChannels: SubscribeParams | Channel | string | readonly Channel[],\n options: SubscribeOptions = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n if (\n typeof paramsOrChannels === \"object\" &&\n !Array.isArray(paramsOrChannels) &&\n \"channels\" in paramsOrChannels\n ) {\n return this.#session.subscribe({\n ...paramsOrChannels,\n namespaces: paramsOrChannels.namespaces ?? [this.namespace],\n });\n }\n\n return this.#session.subscribe(paramsOrChannels as Channel, {\n ...options,\n namespaces: options.namespaces ?? [this.namespace],\n });\n }\n\n async #startProjection(\n channels: Channel[],\n onEvent: (event: Event) => void,\n onDone: () => void\n ): Promise<void> {\n try {\n const rawHandle = await this.#session.subscribe({\n channels,\n namespaces: [this.namespace],\n });\n for await (const event of rawHandle) {\n onEvent(event);\n }\n } finally {\n onDone();\n }\n }\n}\n\n/**\n * Async iterable that yields {@link SubgraphHandle} instances as new\n * subgraph namespaces are discovered from `lifecycle` events.\n *\n * Mirrors the in-process `run.subgraphs` pattern. A new subgraph is\n * discovered when a `lifecycle` event with `event: \"started\"` is\n * received at a namespace depth of exactly `parentDepth + 1`.\n */\nexport class SubgraphDiscoveryHandle implements AsyncIterable<SubgraphHandle> {\n readonly #source: SubscriptionHandle<Event>;\n readonly #session: Subscribable;\n readonly #parentNamespace: string[];\n readonly #discovered = new Set<string>();\n readonly #pendingToolStarts = new Map<string, ToolsEvent>();\n readonly #pendingToolCallHandles = new Map<string, SubgraphHandle>();\n readonly #queue: SubgraphHandle[] = [];\n readonly #waiters: Array<(value: IteratorResult<SubgraphHandle>) => void> =\n [];\n #sourcePump?: Promise<void>;\n #closed = false;\n\n constructor(\n source: SubscriptionHandle<Event>,\n session: Subscribable,\n parentNamespace: string[] = []\n ) {\n this.#source = source;\n this.#session = session;\n this.#parentNamespace = parentNamespace;\n }\n\n #emit(handle: SubgraphHandle): void {\n const waiter = this.#waiters.shift();\n if (waiter) {\n waiter({ done: false, value: handle });\n } else {\n this.#queue.push(handle);\n }\n }\n\n #processToolEvent(event: Event): boolean {\n if (event.method !== \"tools\") return false;\n const tools = event as ToolsEvent;\n const data = tools.params.data as Record<string, unknown>;\n if (data.event !== \"tool-started\") return true;\n\n const toolCallId = data.tool_call_id as string | undefined;\n if (!toolCallId) return true;\n\n const pendingHandle = this.#pendingToolCallHandles.get(toolCallId);\n if (pendingHandle) {\n pendingHandle.toolStartedEvent = tools;\n this.#pendingToolCallHandles.delete(toolCallId);\n return true;\n }\n\n this.#pendingToolStarts.set(toolCallId, tools);\n return true;\n }\n\n #processEvent(event: Event): SubgraphHandle | undefined {\n if (this.#processToolEvent(event)) return undefined;\n if (event.method !== \"lifecycle\") return undefined;\n const lifecycle = event as LifecycleEvent;\n if (lifecycle.params.data.event !== \"started\") return undefined;\n\n const ns = event.params.namespace;\n if (ns.length !== this.#parentNamespace.length + 1) return undefined;\n\n const isChild = this.#parentNamespace.every((seg, i) => ns[i] === seg);\n if (!isChild) return undefined;\n\n const nsKey = ns.join(\"/\");\n if (this.#discovered.has(nsKey)) return undefined;\n this.#discovered.add(nsKey);\n\n const lastSegment = ns[ns.length - 1] ?? \"\";\n const colonIdx = lastSegment.lastIndexOf(\":\");\n let name: string;\n let index: number;\n if (colonIdx >= 0) {\n name = lastSegment.slice(0, colonIdx);\n const suffix = lastSegment.slice(colonIdx + 1);\n index = /^\\d+$/.test(suffix) ? Number(suffix) : 0;\n } else {\n name = lastSegment;\n index = 0;\n }\n\n const data = lifecycle.params.data as unknown as Record<string, unknown>;\n const cause =\n data.cause && typeof data.cause === \"object\"\n ? (data.cause as LifecycleCause)\n : undefined;\n let toolStartedEvent: ToolsEvent | undefined;\n if (cause?.type === \"toolCall\") {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) {\n toolStartedEvent = this.#pendingToolStarts.get(toolCallId);\n this.#pendingToolStarts.delete(toolCallId);\n }\n }\n\n const handle = new SubgraphHandle(name, index, [...ns], this.#session, {\n cause,\n graphName: data.graph_name as string | undefined,\n toolStartedEvent,\n });\n if (cause?.type === \"toolCall\" && toolStartedEvent == null) {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) this.#pendingToolCallHandles.set(toolCallId, handle);\n }\n return handle;\n }\n\n #start(): void {\n if (this.#sourcePump) return;\n this.#sourcePump = (async () => {\n for await (const event of this.#source) {\n const handle = this.#processEvent(event);\n if (!handle) continue;\n this.#emit(handle);\n }\n this.#pendingToolStarts.clear();\n this.#pendingToolCallHandles.clear();\n this.#closed = true;\n while (this.#waiters.length > 0) {\n this.#waiters.shift()?.({ done: true, value: undefined });\n }\n })();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.#source.unsubscribe();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubgraphHandle> {\n this.#start();\n return {\n next: async () => {\n if (this.#queue.length > 0) {\n return { done: false, value: this.#queue.shift()! };\n }\n if (this.#closed) {\n return { done: true, value: undefined };\n }\n return await new Promise<IteratorResult<SubgraphHandle>>((resolve) => {\n this.#waiters.push(resolve);\n });\n },\n return: async () => {\n await this.close();\n return { done: true, value: undefined };\n },\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"subgraphs.cjs","names":["#session","#messagesIterable","MultiCursorBuffer","StreamingMessageAssembler","#startProjection","#valuesProjection","#outputPromise","#toolCallsIterable","ToolCallAssembler","toClientAssembledToolCall","#subgraphsIterable","#subagentsIterable","#ensureMediaDispatcher","#audioBuffer","#imagesBuffer","#videoBuffer","#filesBuffer","#mediaDispatcherStarted","MediaAssembler","#source","#parentNamespace","#discovered","#pendingToolStarts","#pendingToolCallHandles","#queue","#waiters","#processToolEvent","#sourcePump","#processEvent","#emit","#closed","#start"],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"sourcesContent":["import type {\n Channel,\n Event,\n LifecycleCause,\n LifecycleEvent,\n MessagesEvent,\n SubscribeParams,\n ToolsEvent,\n ValuesEvent,\n} from \"@langchain/protocol\";\nimport type { SubscriptionHandle } from \"../index.js\";\nimport { MultiCursorBuffer } from \"../multi-cursor-buffer.js\";\nimport { StreamingMessageAssembler } from \"../messages.js\";\nimport type { StreamingMessage, StreamingMessageHandle } from \"../messages.js\";\nimport { ToolCallAssembler, toClientAssembledToolCall } from \"./tools.js\";\nimport type { ClientAssembledToolCall } from \"./tools.js\";\nimport { MediaAssembler } from \"../media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../media.js\";\nimport type {\n EventForChannel,\n EventForChannels,\n SubscribeOptions,\n YieldForChannel,\n YieldForChannels,\n} from \"../types.js\";\nimport type { SubagentHandle } from \"./subagents.js\";\n\n/**\n * Minimal subscription surface that {@link SubgraphHandle} and\n * {@link SubagentHandle} delegate to. Typed to match the\n * `Session.subscribe` raw-channel overloads without importing the\n * full `Session` class (avoids circular dependency).\n */\nexport interface Subscribable {\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n}\n\n/**\n * Discovered subgraph within a streaming session.\n *\n * Mirrors the in-process `SubgraphRunStream` pattern: each subgraph\n * has `name`, `index`, `namespace`, and lazy getters for projections\n * scoped to this subgraph's namespace.\n *\n * ```ts\n * for await (const sub of session.subgraphs) {\n * for await (const msg of sub.messages) { ... }\n * const state = await sub.output;\n * }\n * ```\n */\nexport class SubgraphHandle {\n readonly name: string;\n readonly index: number;\n readonly namespace: string[];\n /**\n * Non-empty when upstream attached a `cause` to this subgraph's\n * `lifecycle.started` event. Population is product-specific and\n * performed by stream transformers on the runtime side (e.g.\n * deepagents' `SubagentTransformer` emits\n * `{ type: \"toolCall\", tool_call_id }`). Generic clients should\n * treat `cause.type` as an open enum — the protocol allows future\n * variants (`send`, `edge`, ...) to be forwarded verbatim without\n * a SDK bump.\n */\n readonly cause?: LifecycleCause;\n readonly graphName?: string;\n /**\n * Raw `tool-started` event that triggered this subgraph, when\n * `cause.type === \"toolCall\"` and the matching event has been\n * observed on the `tools` channel.\n */\n toolStartedEvent?: ToolsEvent;\n readonly #session: Subscribable;\n\n #messagesIterable?: AsyncIterable<StreamingMessage>;\n #valuesProjection?: AsyncIterable<unknown> & PromiseLike<unknown>;\n #toolCallsIterable?: AsyncIterable<ClientAssembledToolCall>;\n #subgraphsIterable?: AsyncIterable<SubgraphHandle>;\n #subagentsIterable?: AsyncIterable<SubagentHandle>;\n #outputPromise?: Promise<unknown>;\n\n #mediaDispatcherStarted = false;\n #audioBuffer?: MultiCursorBuffer<AudioMedia>;\n #imagesBuffer?: MultiCursorBuffer<ImageMedia>;\n #videoBuffer?: MultiCursorBuffer<VideoMedia>;\n #filesBuffer?: MultiCursorBuffer<FileMedia>;\n\n constructor(\n name: string,\n index: number,\n namespace: string[],\n session: Subscribable,\n options?: {\n cause?: LifecycleCause;\n graphName?: string;\n toolStartedEvent?: ToolsEvent;\n }\n ) {\n this.name = name;\n this.index = index;\n this.namespace = namespace;\n this.cause = options?.cause;\n this.graphName = options?.graphName;\n this.toolStartedEvent = options?.toolStartedEvent;\n this.#session = session;\n }\n\n get messages(): AsyncIterable<StreamingMessageHandle> {\n if (this.#messagesIterable) return this.#messagesIterable;\n const buffer = new MultiCursorBuffer<StreamingMessage>();\n this.#messagesIterable = buffer;\n const assembler = new StreamingMessageAssembler();\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n const msg = assembler.consume(event as MessagesEvent);\n if (msg) buffer.push(msg);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get values(): AsyncIterable<unknown> & PromiseLike<unknown> {\n if (this.#valuesProjection) return this.#valuesProjection;\n const buffer = new MultiCursorBuffer<unknown>();\n let lastValue: unknown;\n let resolveOutput!: (value: unknown) => void;\n const outputPromise = new Promise<unknown>((resolve) => {\n resolveOutput = resolve;\n });\n this.#outputPromise = outputPromise;\n const projection = Object.assign(buffer, {\n then: <TResult1 = unknown, TResult2 = never>(\n onfulfilled?:\n | ((value: unknown) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null\n ): Promise<TResult1 | TResult2> =>\n outputPromise.then(onfulfilled, onrejected),\n }) as AsyncIterable<unknown> & PromiseLike<unknown>;\n this.#valuesProjection = projection;\n void this.#startProjection(\n [\"values\"],\n (event) => {\n if (event.method !== \"values\") return;\n const data = (event as ValuesEvent).params.data;\n lastValue = data;\n buffer.push(data);\n },\n () => {\n resolveOutput(lastValue);\n buffer.close();\n }\n );\n return projection;\n }\n\n get toolCalls(): AsyncIterable<ClientAssembledToolCall> {\n if (this.#toolCallsIterable) return this.#toolCallsIterable;\n const buffer = new MultiCursorBuffer<ClientAssembledToolCall>();\n this.#toolCallsIterable = buffer;\n const assembler = new ToolCallAssembler();\n void this.#startProjection(\n [\"tools\"],\n (event) => {\n if (event.method !== \"tools\") return;\n const tc = assembler.consume(event as ToolsEvent);\n if (tc) buffer.push(toClientAssembledToolCall(tc));\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get subgraphs(): AsyncIterable<SubgraphHandle> {\n if (this.#subgraphsIterable) return this.#subgraphsIterable;\n const buffer = new MultiCursorBuffer<SubgraphHandle>();\n this.#subgraphsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"lifecycle\", \"tools\"],\n namespaces: [this.namespace],\n });\n const discovery = new SubgraphDiscoveryHandle(\n rawHandle,\n this.#session,\n this.namespace\n );\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get subagents(): AsyncIterable<SubagentHandle> {\n if (this.#subagentsIterable) return this.#subagentsIterable;\n const buffer = new MultiCursorBuffer<SubagentHandle>();\n this.#subagentsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"tools\", \"lifecycle\"],\n namespaces: [this.namespace],\n });\n const { SubagentDiscoveryHandle: Discovery } =\n await import(\"./subagents.js\");\n const discovery = new Discovery(rawHandle, this.#session);\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get audio(): AsyncIterable<AudioMedia> {\n this.#ensureMediaDispatcher();\n return this.#audioBuffer!;\n }\n\n get images(): AsyncIterable<ImageMedia> {\n this.#ensureMediaDispatcher();\n return this.#imagesBuffer!;\n }\n\n get video(): AsyncIterable<VideoMedia> {\n this.#ensureMediaDispatcher();\n return this.#videoBuffer!;\n }\n\n get files(): AsyncIterable<FileMedia> {\n this.#ensureMediaDispatcher();\n return this.#filesBuffer!;\n }\n\n get output(): Promise<unknown> {\n void this.values;\n return this.#outputPromise!;\n }\n\n #ensureMediaDispatcher(): void {\n if (this.#mediaDispatcherStarted) return;\n this.#mediaDispatcherStarted = true;\n const audio = new MultiCursorBuffer<AudioMedia>();\n const images = new MultiCursorBuffer<ImageMedia>();\n const video = new MultiCursorBuffer<VideoMedia>();\n const files = new MultiCursorBuffer<FileMedia>();\n this.#audioBuffer = audio;\n this.#imagesBuffer = images;\n this.#videoBuffer = video;\n this.#filesBuffer = files;\n const assembler = new MediaAssembler({\n onAudio: (m: AudioMedia) => audio.push(m),\n onImage: (m: ImageMedia) => images.push(m),\n onVideo: (m: VideoMedia) => video.push(m),\n onFile: (m: FileMedia) => files.push(m),\n });\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n () => {\n assembler.close();\n audio.close();\n images.close();\n video.close();\n files.close();\n }\n );\n }\n\n /**\n * Create a raw channel subscription scoped to this subgraph's namespace.\n */\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n subscribe(\n paramsOrChannels: SubscribeParams | Channel | string | readonly Channel[],\n options: SubscribeOptions = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n if (\n typeof paramsOrChannels === \"object\" &&\n !Array.isArray(paramsOrChannels) &&\n \"channels\" in paramsOrChannels\n ) {\n return this.#session.subscribe({\n ...paramsOrChannels,\n namespaces: paramsOrChannels.namespaces ?? [this.namespace],\n });\n }\n\n return this.#session.subscribe(paramsOrChannels as Channel, {\n ...options,\n namespaces: options.namespaces ?? [this.namespace],\n });\n }\n\n async #startProjection(\n channels: Channel[],\n onEvent: (event: Event) => void,\n onDone: () => void\n ): Promise<void> {\n try {\n const rawHandle = await this.#session.subscribe({\n channels,\n namespaces: [this.namespace],\n });\n for await (const event of rawHandle) {\n onEvent(event);\n }\n } finally {\n onDone();\n }\n }\n}\n\n/**\n * Async iterable that yields {@link SubgraphHandle} instances as new\n * subgraph namespaces are discovered from `lifecycle` events.\n *\n * Mirrors the in-process `run.subgraphs` pattern. A new subgraph is\n * discovered when a `lifecycle` event with `event: \"started\"` is\n * received at a namespace depth of exactly `parentDepth + 1`.\n */\nexport class SubgraphDiscoveryHandle implements AsyncIterable<SubgraphHandle> {\n readonly #source: SubscriptionHandle<Event>;\n readonly #session: Subscribable;\n readonly #parentNamespace: string[];\n readonly #discovered = new Set<string>();\n readonly #pendingToolStarts = new Map<string, ToolsEvent>();\n readonly #pendingToolCallHandles = new Map<string, SubgraphHandle>();\n readonly #queue: SubgraphHandle[] = [];\n readonly #waiters: Array<(value: IteratorResult<SubgraphHandle>) => void> =\n [];\n #sourcePump?: Promise<void>;\n #closed = false;\n\n constructor(\n source: SubscriptionHandle<Event>,\n session: Subscribable,\n parentNamespace: string[] = []\n ) {\n this.#source = source;\n this.#session = session;\n this.#parentNamespace = parentNamespace;\n }\n\n #emit(handle: SubgraphHandle): void {\n const waiter = this.#waiters.shift();\n if (waiter) {\n waiter({ done: false, value: handle });\n } else {\n this.#queue.push(handle);\n }\n }\n\n #processToolEvent(event: Event): boolean {\n if (event.method !== \"tools\") return false;\n const tools = event as ToolsEvent;\n const data = tools.params.data as Record<string, unknown>;\n if (data.event !== \"tool-started\") return true;\n\n const toolCallId = data.tool_call_id as string | undefined;\n if (!toolCallId) return true;\n\n const pendingHandle = this.#pendingToolCallHandles.get(toolCallId);\n if (pendingHandle) {\n pendingHandle.toolStartedEvent = tools;\n this.#pendingToolCallHandles.delete(toolCallId);\n return true;\n }\n\n this.#pendingToolStarts.set(toolCallId, tools);\n return true;\n }\n\n #processEvent(event: Event): SubgraphHandle | undefined {\n if (this.#processToolEvent(event)) return undefined;\n if (event.method !== \"lifecycle\") return undefined;\n const lifecycle = event as LifecycleEvent;\n if (lifecycle.params.data.event !== \"started\") return undefined;\n\n const ns = event.params.namespace;\n if (ns.length !== this.#parentNamespace.length + 1) return undefined;\n\n const isChild = this.#parentNamespace.every((seg, i) => ns[i] === seg);\n if (!isChild) return undefined;\n\n const nsKey = ns.join(\"/\");\n if (this.#discovered.has(nsKey)) return undefined;\n this.#discovered.add(nsKey);\n\n const lastSegment = ns[ns.length - 1] ?? \"\";\n const colonIdx = lastSegment.lastIndexOf(\":\");\n let name: string;\n let index: number;\n if (colonIdx >= 0) {\n name = lastSegment.slice(0, colonIdx);\n const suffix = lastSegment.slice(colonIdx + 1);\n index = /^\\d+$/.test(suffix) ? Number(suffix) : 0;\n } else {\n name = lastSegment;\n index = 0;\n }\n\n const data = lifecycle.params.data as unknown as Record<string, unknown>;\n const cause =\n data.cause && typeof data.cause === \"object\"\n ? (data.cause as LifecycleCause)\n : undefined;\n let toolStartedEvent: ToolsEvent | undefined;\n if (cause?.type === \"toolCall\") {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) {\n toolStartedEvent = this.#pendingToolStarts.get(toolCallId);\n this.#pendingToolStarts.delete(toolCallId);\n }\n }\n\n const handle = new SubgraphHandle(name, index, [...ns], this.#session, {\n cause,\n graphName: data.graph_name as string | undefined,\n toolStartedEvent,\n });\n if (cause?.type === \"toolCall\" && toolStartedEvent == null) {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) this.#pendingToolCallHandles.set(toolCallId, handle);\n }\n return handle;\n }\n\n #start(): void {\n if (this.#sourcePump) return;\n this.#sourcePump = (async () => {\n for await (const event of this.#source) {\n const handle = this.#processEvent(event);\n if (!handle) continue;\n this.#emit(handle);\n }\n this.#pendingToolStarts.clear();\n this.#pendingToolCallHandles.clear();\n this.#closed = true;\n while (this.#waiters.length > 0) {\n this.#waiters.shift()?.({ done: true, value: undefined });\n }\n })();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.#source.unsubscribe();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubgraphHandle> {\n this.#start();\n return {\n next: async () => {\n if (this.#queue.length > 0) {\n return { done: false, value: this.#queue.shift()! };\n }\n if (this.#closed) {\n return { done: true, value: undefined };\n }\n return await new Promise<IteratorResult<SubgraphHandle>>((resolve) => {\n this.#waiters.push(resolve);\n });\n },\n return: async () => {\n await this.close();\n return { done: true, value: undefined };\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoEA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;;;;;;;;;;;CAWA;CACA;;;;;;CAMA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA,0BAA0B;CAC1B;CACA;CACA;CACA;CAEA,YACE,MACA,OACA,WACA,SACA,SAKA;AACA,OAAK,OAAO;AACZ,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,QAAQ,SAAS;AACtB,OAAK,YAAY,SAAS;AAC1B,OAAK,mBAAmB,SAAS;AACjC,QAAA,UAAgB;;CAGlB,IAAI,WAAkD;AACpD,MAAI,MAAA,iBAAwB,QAAO,MAAA;EACnC,MAAM,SAAS,IAAIE,4BAAAA,mBAAqC;AACxD,QAAA,mBAAyB;EACzB,MAAM,YAAY,IAAIC,iBAAAA,2BAA2B;AAC5C,QAAA,gBACH,CAAC,WAAW,GACX,UAAU;AACT,OAAI,MAAM,WAAW,WAAY;GACjC,MAAM,MAAM,UAAU,QAAQ,MAAuB;AACrD,OAAI,IAAK,QAAO,KAAK,IAAI;WAErB,OAAO,OAAO,CACrB;AACD,SAAO;;CAGT,IAAI,SAAwD;AAC1D,MAAI,MAAA,iBAAwB,QAAO,MAAA;EACnC,MAAM,SAAS,IAAID,4BAAAA,mBAA4B;EAC/C,IAAI;EACJ,IAAI;EACJ,MAAM,gBAAgB,IAAI,SAAkB,YAAY;AACtD,mBAAgB;IAChB;AACF,QAAA,gBAAsB;EACtB,MAAM,aAAa,OAAO,OAAO,QAAQ,EACvC,OACE,aAGA,eAIA,cAAc,KAAK,aAAa,WAAW,EAC9C,CAAC;AACF,QAAA,mBAAyB;AACpB,QAAA,gBACH,CAAC,SAAS,GACT,UAAU;AACT,OAAI,MAAM,WAAW,SAAU;GAC/B,MAAM,OAAQ,MAAsB,OAAO;AAC3C,eAAY;AACZ,UAAO,KAAK,KAAK;WAEb;AACJ,iBAAc,UAAU;AACxB,UAAO,OAAO;IAEjB;AACD,SAAO;;CAGT,IAAI,YAAoD;AACtD,MAAI,MAAA,kBAAyB,QAAO,MAAA;EACpC,MAAM,SAAS,IAAIA,4BAAAA,mBAA4C;AAC/D,QAAA,oBAA0B;EAC1B,MAAM,YAAY,IAAIM,cAAAA,mBAAmB;AACpC,QAAA,gBACH,CAAC,QAAQ,GACR,UAAU;AACT,OAAI,MAAM,WAAW,QAAS;GAC9B,MAAM,KAAK,UAAU,QAAQ,MAAoB;AACjD,OAAI,GAAI,QAAO,KAAKC,cAAAA,0BAA0B,GAAG,CAAC;WAE9C,OAAO,OAAO,CACrB;AACD,SAAO;;CAGT,IAAI,YAA2C;AAC7C,MAAI,MAAA,kBAAyB,QAAO,MAAA;EACpC,MAAM,SAAS,IAAIP,4BAAAA,mBAAmC;AACtD,QAAA,oBAA0B;AAC1B,GAAM,YAAY;GAKhB,MAAM,YAAY,IAAI,wBAJJ,MAAM,MAAA,QAAc,UAAU;IAC9C,UAAU,CAAC,aAAa,QAAQ;IAChC,YAAY,CAAC,KAAK,UAAU;IAC7B,CAAC,EAGA,MAAA,SACA,KAAK,UACN;AACD,cAAW,MAAM,OAAO,UACtB,QAAO,KAAK,IAAI;AAElB,UAAO,OAAO;MACZ;AACJ,SAAO;;CAGT,IAAI,YAA2C;AAC7C,MAAI,MAAA,kBAAyB,QAAO,MAAA;EACpC,MAAM,SAAS,IAAIA,4BAAAA,mBAAmC;AACtD,QAAA,oBAA0B;AAC1B,GAAM,YAAY;GAChB,MAAM,YAAY,MAAM,MAAA,QAAc,UAAU;IAC9C,UAAU,CAAC,SAAS,YAAY;IAChC,YAAY,CAAC,KAAK,UAAU;IAC7B,CAAC;GACF,MAAM,EAAE,yBAAyB,cAC/B,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,kBAAA,CAAA;GACR,MAAM,YAAY,IAAI,UAAU,WAAW,MAAA,QAAc;AACzD,cAAW,MAAM,OAAO,UACtB,QAAO,KAAK,IAAI;AAElB,UAAO,OAAO;MACZ;AACJ,SAAO;;CAGT,IAAI,QAAmC;AACrC,QAAA,uBAA6B;AAC7B,SAAO,MAAA;;CAGT,IAAI,SAAoC;AACtC,QAAA,uBAA6B;AAC7B,SAAO,MAAA;;CAGT,IAAI,QAAmC;AACrC,QAAA,uBAA6B;AAC7B,SAAO,MAAA;;CAGT,IAAI,QAAkC;AACpC,QAAA,uBAA6B;AAC7B,SAAO,MAAA;;CAGT,IAAI,SAA2B;AACxB,OAAK;AACV,SAAO,MAAA;;CAGT,yBAA+B;AAC7B,MAAI,MAAA,uBAA8B;AAClC,QAAA,yBAA+B;EAC/B,MAAM,QAAQ,IAAIA,4BAAAA,mBAA+B;EACjD,MAAM,SAAS,IAAIA,4BAAAA,mBAA+B;EAClD,MAAM,QAAQ,IAAIA,4BAAAA,mBAA+B;EACjD,MAAM,QAAQ,IAAIA,4BAAAA,mBAA8B;AAChD,QAAA,cAAoB;AACpB,QAAA,eAAqB;AACrB,QAAA,cAAoB;AACpB,QAAA,cAAoB;EACpB,MAAM,YAAY,IAAIgB,cAAAA,eAAe;GACnC,UAAU,MAAkB,MAAM,KAAK,EAAE;GACzC,UAAU,MAAkB,OAAO,KAAK,EAAE;GAC1C,UAAU,MAAkB,MAAM,KAAK,EAAE;GACzC,SAAS,MAAiB,MAAM,KAAK,EAAE;GACxC,CAAC;AACG,QAAA,gBACH,CAAC,WAAW,GACX,UAAU;AACT,OAAI,MAAM,WAAW,WAAY;AACjC,aAAU,QAAQ,MAAuB;WAErC;AACJ,aAAU,OAAO;AACjB,SAAM,OAAO;AACb,UAAO,OAAO;AACd,SAAM,OAAO;AACb,SAAM,OAAO;IAEhB;;CAmBH,UACE,kBACA,UAA4B,EAAE,EAEhB;AACd,MACE,OAAO,qBAAqB,YAC5B,CAAC,MAAM,QAAQ,iBAAiB,IAChC,cAAc,iBAEd,QAAO,MAAA,QAAc,UAAU;GAC7B,GAAG;GACH,YAAY,iBAAiB,cAAc,CAAC,KAAK,UAAU;GAC5D,CAAC;AAGJ,SAAO,MAAA,QAAc,UAAU,kBAA6B;GAC1D,GAAG;GACH,YAAY,QAAQ,cAAc,CAAC,KAAK,UAAU;GACnD,CAAC;;CAGJ,OAAA,gBACE,UACA,SACA,QACe;AACf,MAAI;GACF,MAAM,YAAY,MAAM,MAAA,QAAc,UAAU;IAC9C;IACA,YAAY,CAAC,KAAK,UAAU;IAC7B,CAAC;AACF,cAAW,MAAM,SAAS,UACxB,SAAQ,MAAM;YAER;AACR,WAAQ;;;;;;;;;;;;AAad,IAAa,0BAAb,MAA8E;CAC5E;CACA;CACA;CACA,8BAAuB,IAAI,KAAa;CACxC,qCAA8B,IAAI,KAAyB;CAC3D,0CAAmC,IAAI,KAA6B;CACpE,SAAoC,EAAE;CACtC,WACE,EAAE;CACJ;CACA,UAAU;CAEV,YACE,QACA,SACA,kBAA4B,EAAE,EAC9B;AACA,QAAA,SAAe;AACf,QAAA,UAAgB;AAChB,QAAA,kBAAwB;;CAG1B,MAAM,QAA8B;EAClC,MAAM,SAAS,MAAA,QAAc,OAAO;AACpC,MAAI,OACF,QAAO;GAAE,MAAM;GAAO,OAAO;GAAQ,CAAC;MAEtC,OAAA,MAAY,KAAK,OAAO;;CAI5B,kBAAkB,OAAuB;AACvC,MAAI,MAAM,WAAW,QAAS,QAAO;EACrC,MAAM,QAAQ;EACd,MAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,KAAK,UAAU,eAAgB,QAAO;EAE1C,MAAM,aAAa,KAAK;AACxB,MAAI,CAAC,WAAY,QAAO;EAExB,MAAM,gBAAgB,MAAA,uBAA6B,IAAI,WAAW;AAClE,MAAI,eAAe;AACjB,iBAAc,mBAAmB;AACjC,SAAA,uBAA6B,OAAO,WAAW;AAC/C,UAAO;;AAGT,QAAA,kBAAwB,IAAI,YAAY,MAAM;AAC9C,SAAO;;CAGT,cAAc,OAA0C;AACtD,MAAI,MAAA,iBAAuB,MAAM,CAAE,QAAO,KAAA;AAC1C,MAAI,MAAM,WAAW,YAAa,QAAO,KAAA;EACzC,MAAM,YAAY;AAClB,MAAI,UAAU,OAAO,KAAK,UAAU,UAAW,QAAO,KAAA;EAEtD,MAAM,KAAK,MAAM,OAAO;AACxB,MAAI,GAAG,WAAW,MAAA,gBAAsB,SAAS,EAAG,QAAO,KAAA;AAG3D,MAAI,CADY,MAAA,gBAAsB,OAAO,KAAK,MAAM,GAAG,OAAO,IAAI,CACxD,QAAO,KAAA;EAErB,MAAM,QAAQ,GAAG,KAAK,IAAI;AAC1B,MAAI,MAAA,WAAiB,IAAI,MAAM,CAAE,QAAO,KAAA;AACxC,QAAA,WAAiB,IAAI,MAAM;EAE3B,MAAM,cAAc,GAAG,GAAG,SAAS,MAAM;EACzC,MAAM,WAAW,YAAY,YAAY,IAAI;EAC7C,IAAI;EACJ,IAAI;AACJ,MAAI,YAAY,GAAG;AACjB,UAAO,YAAY,MAAM,GAAG,SAAS;GACrC,MAAM,SAAS,YAAY,MAAM,WAAW,EAAE;AAC9C,WAAQ,QAAQ,KAAK,OAAO,GAAG,OAAO,OAAO,GAAG;SAC3C;AACL,UAAO;AACP,WAAQ;;EAGV,MAAM,OAAO,UAAU,OAAO;EAC9B,MAAM,QACJ,KAAK,SAAS,OAAO,KAAK,UAAU,WAC/B,KAAK,QACN,KAAA;EACN,IAAI;AACJ,MAAI,OAAO,SAAS,YAAY;GAC9B,MAAM,aAAc,MAAoC;AACxD,OAAI,YAAY;AACd,uBAAmB,MAAA,kBAAwB,IAAI,WAAW;AAC1D,UAAA,kBAAwB,OAAO,WAAW;;;EAI9C,MAAM,SAAS,IAAI,eAAe,MAAM,OAAO,CAAC,GAAG,GAAG,EAAE,MAAA,SAAe;GACrE;GACA,WAAW,KAAK;GAChB;GACD,CAAC;AACF,MAAI,OAAO,SAAS,cAAc,oBAAoB,MAAM;GAC1D,MAAM,aAAc,MAAoC;AACxD,OAAI,WAAY,OAAA,uBAA6B,IAAI,YAAY,OAAO;;AAEtE,SAAO;;CAGT,SAAe;AACb,MAAI,MAAA,WAAkB;AACtB,QAAA,cAAoB,YAAY;AAC9B,cAAW,MAAM,SAAS,MAAA,QAAc;IACtC,MAAM,SAAS,MAAA,aAAmB,MAAM;AACxC,QAAI,CAAC,OAAQ;AACb,UAAA,KAAW,OAAO;;AAEpB,SAAA,kBAAwB,OAAO;AAC/B,SAAA,uBAA6B,OAAO;AACpC,SAAA,SAAe;AACf,UAAO,MAAA,QAAc,SAAS,EAC5B,OAAA,QAAc,OAAO,GAAG;IAAE,MAAM;IAAM,OAAO,KAAA;IAAW,CAAC;MAEzD;;CAGN,MAAM,QAAuB;AAC3B,QAAA,SAAe;AACf,QAAM,MAAA,OAAa,aAAa;;CAGlC,CAAC,OAAO,iBAAgD;AACtD,QAAA,OAAa;AACb,SAAO;GACL,MAAM,YAAY;AAChB,QAAI,MAAA,MAAY,SAAS,EACvB,QAAO;KAAE,MAAM;KAAO,OAAO,MAAA,MAAY,OAAO;KAAG;AAErD,QAAI,MAAA,OACF,QAAO;KAAE,MAAM;KAAM,OAAO,KAAA;KAAW;AAEzC,WAAO,MAAM,IAAI,SAAyC,YAAY;AACpE,WAAA,QAAc,KAAK,QAAQ;MAC3B;;GAEJ,QAAQ,YAAY;AAClB,UAAM,KAAK,OAAO;AAClB,WAAO;KAAE,MAAM;KAAM,OAAO,KAAA;KAAW;;GAE1C"}
@@ -1,4 +1,4 @@
1
- import { AssembledToolCall } from "./tools.cjs";
1
+ import { ClientAssembledToolCall } from "./tools.cjs";
2
2
  import { StreamingMessageHandle } from "../messages.cjs";
3
3
  import { AudioMedia, FileMedia, ImageMedia, VideoMedia } from "../media.cjs";
4
4
  import { EventForChannel, EventForChannels, SubscribeOptions, YieldForChannel, YieldForChannels } from "../types.cjs";
@@ -62,7 +62,7 @@ declare class SubgraphHandle {
62
62
  });
63
63
  get messages(): AsyncIterable<StreamingMessageHandle>;
64
64
  get values(): AsyncIterable<unknown> & PromiseLike<unknown>;
65
- get toolCalls(): AsyncIterable<AssembledToolCall>;
65
+ get toolCalls(): AsyncIterable<ClientAssembledToolCall>;
66
66
  get subgraphs(): AsyncIterable<SubgraphHandle>;
67
67
  get subagents(): AsyncIterable<SubagentHandle>;
68
68
  get audio(): AsyncIterable<AudioMedia>;
@@ -1 +1 @@
1
- {"version":3,"file":"subgraphs.d.cts","names":[],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"mappings":";;;;;;;;;;;AAsCA;;;;UAAiB,YAAA;EACf,SAAA,kBAA2B,OAAA,EACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,IACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA;;;;;;;;;;;;;;;cAiBpD,cAAA;EAAA;WACF,IAAA;EAAA,SACA,KAAA;EAAA,SACA,SAAA;EAhCC;;;;;;;;;;EAAA,SA2CD,KAAA,GAAQ,cAAA;EAAA,SACR,SAAA;EAtCT;;;;;EA4CA,gBAAA,GAAmB,UAAA;EAgBnB,WAAA,CACE,IAAA,UACA,KAAA,UACA,SAAA,YACA,OAAA,EAAS,YAAA,EACT,OAAA;IACE,KAAA,GAAQ,cAAA;IACR,SAAA;IACA,gBAAA,GAAmB,UAAA;EAAA;EAAA,IAYnB,QAAA,CAAA,GAAY,aAAA,CAAc,sBAAA;EAAA,IAiB1B,MAAA,CAAA,GAAU,aAAA,YAAyB,WAAA;EAAA,IAqCnC,SAAA,CAAA,GAAa,aAAA,CAAc,iBAAA;EAAA,IAiB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAsB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAoB3B,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,aAAA,CAAc,UAAA;EAAA,IAKxB,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,KAAA,CAAA,GAAS,aAAA,CAAc,SAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,OAAA;EA9LH;;;EAuOX,SAAA,kBAA2B,OAAA,CAAA,CACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,GAAA,CACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA"}
1
+ {"version":3,"file":"subgraphs.d.cts","names":[],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"mappings":";;;;;;;;;;;AAsCA;;;;UAAiB,YAAA;EACf,SAAA,kBAA2B,OAAA,EACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,IACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA;;;;;;;;;;;;;;;cAiBpD,cAAA;EAAA;WACF,IAAA;EAAA,SACA,KAAA;EAAA,SACA,SAAA;EAhCC;;;;;;;;;;EAAA,SA2CD,KAAA,GAAQ,cAAA;EAAA,SACR,SAAA;EAtCT;;;;;EA4CA,gBAAA,GAAmB,UAAA;EAgBnB,WAAA,CACE,IAAA,UACA,KAAA,UACA,SAAA,YACA,OAAA,EAAS,YAAA,EACT,OAAA;IACE,KAAA,GAAQ,cAAA;IACR,SAAA;IACA,gBAAA,GAAmB,UAAA;EAAA;EAAA,IAYnB,QAAA,CAAA,GAAY,aAAA,CAAc,sBAAA;EAAA,IAiB1B,MAAA,CAAA,GAAU,aAAA,YAAyB,WAAA;EAAA,IAqCnC,SAAA,CAAA,GAAa,aAAA,CAAc,uBAAA;EAAA,IAiB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAsB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAoB3B,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,aAAA,CAAc,UAAA;EAAA,IAKxB,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,KAAA,CAAA,GAAS,aAAA,CAAc,SAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,OAAA;EA9LH;;;EAuOX,SAAA,kBAA2B,OAAA,CAAA,CACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,GAAA,CACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- import { AssembledToolCall } from "./tools.js";
1
+ import { ClientAssembledToolCall } from "./tools.js";
2
2
  import { StreamingMessageHandle } from "../messages.js";
3
3
  import { AudioMedia, FileMedia, ImageMedia, VideoMedia } from "../media.js";
4
4
  import { EventForChannel, EventForChannels, SubscribeOptions, YieldForChannel, YieldForChannels } from "../types.js";
@@ -62,7 +62,7 @@ declare class SubgraphHandle {
62
62
  });
63
63
  get messages(): AsyncIterable<StreamingMessageHandle>;
64
64
  get values(): AsyncIterable<unknown> & PromiseLike<unknown>;
65
- get toolCalls(): AsyncIterable<AssembledToolCall>;
65
+ get toolCalls(): AsyncIterable<ClientAssembledToolCall>;
66
66
  get subgraphs(): AsyncIterable<SubgraphHandle>;
67
67
  get subagents(): AsyncIterable<SubagentHandle>;
68
68
  get audio(): AsyncIterable<AudioMedia>;
@@ -1 +1 @@
1
- {"version":3,"file":"subgraphs.d.ts","names":[],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"mappings":";;;;;;;;;;;AAsCA;;;;UAAiB,YAAA;EACf,SAAA,kBAA2B,OAAA,EACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,IACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA;;;;;;;;;;;;;;;cAiBpD,cAAA;EAAA;WACF,IAAA;EAAA,SACA,KAAA;EAAA,SACA,SAAA;EAhCC;;;;;;;;;;EAAA,SA2CD,KAAA,GAAQ,cAAA;EAAA,SACR,SAAA;EAtCT;;;;;EA4CA,gBAAA,GAAmB,UAAA;EAgBnB,WAAA,CACE,IAAA,UACA,KAAA,UACA,SAAA,YACA,OAAA,EAAS,YAAA,EACT,OAAA;IACE,KAAA,GAAQ,cAAA;IACR,SAAA;IACA,gBAAA,GAAmB,UAAA;EAAA;EAAA,IAYnB,QAAA,CAAA,GAAY,aAAA,CAAc,sBAAA;EAAA,IAiB1B,MAAA,CAAA,GAAU,aAAA,YAAyB,WAAA;EAAA,IAqCnC,SAAA,CAAA,GAAa,aAAA,CAAc,iBAAA;EAAA,IAiB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAsB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAoB3B,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,aAAA,CAAc,UAAA;EAAA,IAKxB,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,KAAA,CAAA,GAAS,aAAA,CAAc,SAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,OAAA;EA9LH;;;EAuOX,SAAA,kBAA2B,OAAA,CAAA,CACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,GAAA,CACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA"}
1
+ {"version":3,"file":"subgraphs.d.ts","names":[],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"mappings":";;;;;;;;;;;AAsCA;;;;UAAiB,YAAA;EACf,SAAA,kBAA2B,OAAA,EACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,IACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA;;;;;;;;;;;;;;;cAiBpD,cAAA;EAAA;WACF,IAAA;EAAA,SACA,KAAA;EAAA,SACA,SAAA;EAhCC;;;;;;;;;;EAAA,SA2CD,KAAA,GAAQ,cAAA;EAAA,SACR,SAAA;EAtCT;;;;;EA4CA,gBAAA,GAAmB,UAAA;EAgBnB,WAAA,CACE,IAAA,UACA,KAAA,UACA,SAAA,YACA,OAAA,EAAS,YAAA,EACT,OAAA;IACE,KAAA,GAAQ,cAAA;IACR,SAAA;IACA,gBAAA,GAAmB,UAAA;EAAA;EAAA,IAYnB,QAAA,CAAA,GAAY,aAAA,CAAc,sBAAA;EAAA,IAiB1B,MAAA,CAAA,GAAU,aAAA,YAAyB,WAAA;EAAA,IAqCnC,SAAA,CAAA,GAAa,aAAA,CAAc,uBAAA;EAAA,IAiB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAsB3B,SAAA,CAAA,GAAa,aAAA,CAAc,cAAA;EAAA,IAoB3B,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,aAAA,CAAc,UAAA;EAAA,IAKxB,KAAA,CAAA,GAAS,aAAA,CAAc,UAAA;EAAA,IAKvB,KAAA,CAAA,GAAS,aAAA,CAAc,SAAA;EAAA,IAKvB,MAAA,CAAA,GAAU,OAAA;EA9LH;;;EAuOX,SAAA,kBAA2B,OAAA,CAAA,CACzB,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,eAAA,CAAgB,QAAA,GAAW,eAAA,CAAgB,QAAA;EAEhE,SAAA,kCAA2C,OAAA,GAAA,CACzC,QAAA,EAAU,SAAA,EACV,OAAA,GAAU,gBAAA,GACT,OAAA,CACD,kBAAA,CAAmB,gBAAA,CAAiB,SAAA,GAAY,gBAAA,CAAiB,SAAA;EAEnE,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,KAAA;AAAA"}
@@ -1,5 +1,5 @@
1
1
  import { MultiCursorBuffer } from "../multi-cursor-buffer.js";
2
- import { ToolCallAssembler } from "./tools.js";
2
+ import { ToolCallAssembler, toClientAssembledToolCall } from "./tools.js";
3
3
  import { StreamingMessageAssembler } from "../messages.js";
4
4
  import { MediaAssembler } from "../media.js";
5
5
  //#region src/client/stream/handles/subgraphs.ts
@@ -102,7 +102,7 @@ var SubgraphHandle = class {
102
102
  this.#startProjection(["tools"], (event) => {
103
103
  if (event.method !== "tools") return;
104
104
  const tc = assembler.consume(event);
105
- if (tc) buffer.push(tc);
105
+ if (tc) buffer.push(toClientAssembledToolCall(tc));
106
106
  }, () => buffer.close());
107
107
  return buffer;
108
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subgraphs.js","names":["#session","#messagesIterable","#startProjection","#valuesProjection","#outputPromise","#toolCallsIterable","#subgraphsIterable","#subagentsIterable","#ensureMediaDispatcher","#audioBuffer","#imagesBuffer","#videoBuffer","#filesBuffer","#mediaDispatcherStarted","#source","#parentNamespace","#discovered","#pendingToolStarts","#pendingToolCallHandles","#queue","#waiters","#processToolEvent","#sourcePump","#processEvent","#emit","#closed","#start"],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"sourcesContent":["import type {\n Channel,\n Event,\n LifecycleCause,\n LifecycleEvent,\n MessagesEvent,\n SubscribeParams,\n ToolsEvent,\n ValuesEvent,\n} from \"@langchain/protocol\";\nimport type { SubscriptionHandle } from \"../index.js\";\nimport { MultiCursorBuffer } from \"../multi-cursor-buffer.js\";\nimport { StreamingMessageAssembler } from \"../messages.js\";\nimport type { StreamingMessage, StreamingMessageHandle } from \"../messages.js\";\nimport { ToolCallAssembler } from \"./tools.js\";\nimport type { AssembledToolCall } from \"./tools.js\";\nimport { MediaAssembler } from \"../media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../media.js\";\nimport type {\n EventForChannel,\n EventForChannels,\n SubscribeOptions,\n YieldForChannel,\n YieldForChannels,\n} from \"../types.js\";\nimport type { SubagentHandle } from \"./subagents.js\";\n\n/**\n * Minimal subscription surface that {@link SubgraphHandle} and\n * {@link SubagentHandle} delegate to. Typed to match the\n * `Session.subscribe` raw-channel overloads without importing the\n * full `Session` class (avoids circular dependency).\n */\nexport interface Subscribable {\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n}\n\n/**\n * Discovered subgraph within a streaming session.\n *\n * Mirrors the in-process `SubgraphRunStream` pattern: each subgraph\n * has `name`, `index`, `namespace`, and lazy getters for projections\n * scoped to this subgraph's namespace.\n *\n * ```ts\n * for await (const sub of session.subgraphs) {\n * for await (const msg of sub.messages) { ... }\n * const state = await sub.output;\n * }\n * ```\n */\nexport class SubgraphHandle {\n readonly name: string;\n readonly index: number;\n readonly namespace: string[];\n /**\n * Non-empty when upstream attached a `cause` to this subgraph's\n * `lifecycle.started` event. Population is product-specific and\n * performed by stream transformers on the runtime side (e.g.\n * deepagents' `SubagentTransformer` emits\n * `{ type: \"toolCall\", tool_call_id }`). Generic clients should\n * treat `cause.type` as an open enum — the protocol allows future\n * variants (`send`, `edge`, ...) to be forwarded verbatim without\n * a SDK bump.\n */\n readonly cause?: LifecycleCause;\n readonly graphName?: string;\n /**\n * Raw `tool-started` event that triggered this subgraph, when\n * `cause.type === \"toolCall\"` and the matching event has been\n * observed on the `tools` channel.\n */\n toolStartedEvent?: ToolsEvent;\n readonly #session: Subscribable;\n\n #messagesIterable?: AsyncIterable<StreamingMessage>;\n #valuesProjection?: AsyncIterable<unknown> & PromiseLike<unknown>;\n #toolCallsIterable?: AsyncIterable<AssembledToolCall>;\n #subgraphsIterable?: AsyncIterable<SubgraphHandle>;\n #subagentsIterable?: AsyncIterable<SubagentHandle>;\n #outputPromise?: Promise<unknown>;\n\n #mediaDispatcherStarted = false;\n #audioBuffer?: MultiCursorBuffer<AudioMedia>;\n #imagesBuffer?: MultiCursorBuffer<ImageMedia>;\n #videoBuffer?: MultiCursorBuffer<VideoMedia>;\n #filesBuffer?: MultiCursorBuffer<FileMedia>;\n\n constructor(\n name: string,\n index: number,\n namespace: string[],\n session: Subscribable,\n options?: {\n cause?: LifecycleCause;\n graphName?: string;\n toolStartedEvent?: ToolsEvent;\n }\n ) {\n this.name = name;\n this.index = index;\n this.namespace = namespace;\n this.cause = options?.cause;\n this.graphName = options?.graphName;\n this.toolStartedEvent = options?.toolStartedEvent;\n this.#session = session;\n }\n\n get messages(): AsyncIterable<StreamingMessageHandle> {\n if (this.#messagesIterable) return this.#messagesIterable;\n const buffer = new MultiCursorBuffer<StreamingMessage>();\n this.#messagesIterable = buffer;\n const assembler = new StreamingMessageAssembler();\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n const msg = assembler.consume(event as MessagesEvent);\n if (msg) buffer.push(msg);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get values(): AsyncIterable<unknown> & PromiseLike<unknown> {\n if (this.#valuesProjection) return this.#valuesProjection;\n const buffer = new MultiCursorBuffer<unknown>();\n let lastValue: unknown;\n let resolveOutput!: (value: unknown) => void;\n const outputPromise = new Promise<unknown>((resolve) => {\n resolveOutput = resolve;\n });\n this.#outputPromise = outputPromise;\n const projection = Object.assign(buffer, {\n then: <TResult1 = unknown, TResult2 = never>(\n onfulfilled?:\n | ((value: unknown) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null\n ): Promise<TResult1 | TResult2> =>\n outputPromise.then(onfulfilled, onrejected),\n }) as AsyncIterable<unknown> & PromiseLike<unknown>;\n this.#valuesProjection = projection;\n void this.#startProjection(\n [\"values\"],\n (event) => {\n if (event.method !== \"values\") return;\n const data = (event as ValuesEvent).params.data;\n lastValue = data;\n buffer.push(data);\n },\n () => {\n resolveOutput(lastValue);\n buffer.close();\n }\n );\n return projection;\n }\n\n get toolCalls(): AsyncIterable<AssembledToolCall> {\n if (this.#toolCallsIterable) return this.#toolCallsIterable;\n const buffer = new MultiCursorBuffer<AssembledToolCall>();\n this.#toolCallsIterable = buffer;\n const assembler = new ToolCallAssembler();\n void this.#startProjection(\n [\"tools\"],\n (event) => {\n if (event.method !== \"tools\") return;\n const tc = assembler.consume(event as ToolsEvent);\n if (tc) buffer.push(tc);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get subgraphs(): AsyncIterable<SubgraphHandle> {\n if (this.#subgraphsIterable) return this.#subgraphsIterable;\n const buffer = new MultiCursorBuffer<SubgraphHandle>();\n this.#subgraphsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"lifecycle\", \"tools\"],\n namespaces: [this.namespace],\n });\n const discovery = new SubgraphDiscoveryHandle(\n rawHandle,\n this.#session,\n this.namespace\n );\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get subagents(): AsyncIterable<SubagentHandle> {\n if (this.#subagentsIterable) return this.#subagentsIterable;\n const buffer = new MultiCursorBuffer<SubagentHandle>();\n this.#subagentsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"tools\", \"lifecycle\"],\n namespaces: [this.namespace],\n });\n const { SubagentDiscoveryHandle: Discovery } =\n await import(\"./subagents.js\");\n const discovery = new Discovery(rawHandle, this.#session);\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get audio(): AsyncIterable<AudioMedia> {\n this.#ensureMediaDispatcher();\n return this.#audioBuffer!;\n }\n\n get images(): AsyncIterable<ImageMedia> {\n this.#ensureMediaDispatcher();\n return this.#imagesBuffer!;\n }\n\n get video(): AsyncIterable<VideoMedia> {\n this.#ensureMediaDispatcher();\n return this.#videoBuffer!;\n }\n\n get files(): AsyncIterable<FileMedia> {\n this.#ensureMediaDispatcher();\n return this.#filesBuffer!;\n }\n\n get output(): Promise<unknown> {\n void this.values;\n return this.#outputPromise!;\n }\n\n #ensureMediaDispatcher(): void {\n if (this.#mediaDispatcherStarted) return;\n this.#mediaDispatcherStarted = true;\n const audio = new MultiCursorBuffer<AudioMedia>();\n const images = new MultiCursorBuffer<ImageMedia>();\n const video = new MultiCursorBuffer<VideoMedia>();\n const files = new MultiCursorBuffer<FileMedia>();\n this.#audioBuffer = audio;\n this.#imagesBuffer = images;\n this.#videoBuffer = video;\n this.#filesBuffer = files;\n const assembler = new MediaAssembler({\n onAudio: (m: AudioMedia) => audio.push(m),\n onImage: (m: ImageMedia) => images.push(m),\n onVideo: (m: VideoMedia) => video.push(m),\n onFile: (m: FileMedia) => files.push(m),\n });\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n () => {\n assembler.close();\n audio.close();\n images.close();\n video.close();\n files.close();\n }\n );\n }\n\n /**\n * Create a raw channel subscription scoped to this subgraph's namespace.\n */\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n subscribe(\n paramsOrChannels: SubscribeParams | Channel | string | readonly Channel[],\n options: SubscribeOptions = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n if (\n typeof paramsOrChannels === \"object\" &&\n !Array.isArray(paramsOrChannels) &&\n \"channels\" in paramsOrChannels\n ) {\n return this.#session.subscribe({\n ...paramsOrChannels,\n namespaces: paramsOrChannels.namespaces ?? [this.namespace],\n });\n }\n\n return this.#session.subscribe(paramsOrChannels as Channel, {\n ...options,\n namespaces: options.namespaces ?? [this.namespace],\n });\n }\n\n async #startProjection(\n channels: Channel[],\n onEvent: (event: Event) => void,\n onDone: () => void\n ): Promise<void> {\n try {\n const rawHandle = await this.#session.subscribe({\n channels,\n namespaces: [this.namespace],\n });\n for await (const event of rawHandle) {\n onEvent(event);\n }\n } finally {\n onDone();\n }\n }\n}\n\n/**\n * Async iterable that yields {@link SubgraphHandle} instances as new\n * subgraph namespaces are discovered from `lifecycle` events.\n *\n * Mirrors the in-process `run.subgraphs` pattern. A new subgraph is\n * discovered when a `lifecycle` event with `event: \"started\"` is\n * received at a namespace depth of exactly `parentDepth + 1`.\n */\nexport class SubgraphDiscoveryHandle implements AsyncIterable<SubgraphHandle> {\n readonly #source: SubscriptionHandle<Event>;\n readonly #session: Subscribable;\n readonly #parentNamespace: string[];\n readonly #discovered = new Set<string>();\n readonly #pendingToolStarts = new Map<string, ToolsEvent>();\n readonly #pendingToolCallHandles = new Map<string, SubgraphHandle>();\n readonly #queue: SubgraphHandle[] = [];\n readonly #waiters: Array<(value: IteratorResult<SubgraphHandle>) => void> =\n [];\n #sourcePump?: Promise<void>;\n #closed = false;\n\n constructor(\n source: SubscriptionHandle<Event>,\n session: Subscribable,\n parentNamespace: string[] = []\n ) {\n this.#source = source;\n this.#session = session;\n this.#parentNamespace = parentNamespace;\n }\n\n #emit(handle: SubgraphHandle): void {\n const waiter = this.#waiters.shift();\n if (waiter) {\n waiter({ done: false, value: handle });\n } else {\n this.#queue.push(handle);\n }\n }\n\n #processToolEvent(event: Event): boolean {\n if (event.method !== \"tools\") return false;\n const tools = event as ToolsEvent;\n const data = tools.params.data as Record<string, unknown>;\n if (data.event !== \"tool-started\") return true;\n\n const toolCallId = data.tool_call_id as string | undefined;\n if (!toolCallId) return true;\n\n const pendingHandle = this.#pendingToolCallHandles.get(toolCallId);\n if (pendingHandle) {\n pendingHandle.toolStartedEvent = tools;\n this.#pendingToolCallHandles.delete(toolCallId);\n return true;\n }\n\n this.#pendingToolStarts.set(toolCallId, tools);\n return true;\n }\n\n #processEvent(event: Event): SubgraphHandle | undefined {\n if (this.#processToolEvent(event)) return undefined;\n if (event.method !== \"lifecycle\") return undefined;\n const lifecycle = event as LifecycleEvent;\n if (lifecycle.params.data.event !== \"started\") return undefined;\n\n const ns = event.params.namespace;\n if (ns.length !== this.#parentNamespace.length + 1) return undefined;\n\n const isChild = this.#parentNamespace.every((seg, i) => ns[i] === seg);\n if (!isChild) return undefined;\n\n const nsKey = ns.join(\"/\");\n if (this.#discovered.has(nsKey)) return undefined;\n this.#discovered.add(nsKey);\n\n const lastSegment = ns[ns.length - 1] ?? \"\";\n const colonIdx = lastSegment.lastIndexOf(\":\");\n let name: string;\n let index: number;\n if (colonIdx >= 0) {\n name = lastSegment.slice(0, colonIdx);\n const suffix = lastSegment.slice(colonIdx + 1);\n index = /^\\d+$/.test(suffix) ? Number(suffix) : 0;\n } else {\n name = lastSegment;\n index = 0;\n }\n\n const data = lifecycle.params.data as unknown as Record<string, unknown>;\n const cause =\n data.cause && typeof data.cause === \"object\"\n ? (data.cause as LifecycleCause)\n : undefined;\n let toolStartedEvent: ToolsEvent | undefined;\n if (cause?.type === \"toolCall\") {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) {\n toolStartedEvent = this.#pendingToolStarts.get(toolCallId);\n this.#pendingToolStarts.delete(toolCallId);\n }\n }\n\n const handle = new SubgraphHandle(name, index, [...ns], this.#session, {\n cause,\n graphName: data.graph_name as string | undefined,\n toolStartedEvent,\n });\n if (cause?.type === \"toolCall\" && toolStartedEvent == null) {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) this.#pendingToolCallHandles.set(toolCallId, handle);\n }\n return handle;\n }\n\n #start(): void {\n if (this.#sourcePump) return;\n this.#sourcePump = (async () => {\n for await (const event of this.#source) {\n const handle = this.#processEvent(event);\n if (!handle) continue;\n this.#emit(handle);\n }\n this.#pendingToolStarts.clear();\n this.#pendingToolCallHandles.clear();\n this.#closed = true;\n while (this.#waiters.length > 0) {\n this.#waiters.shift()?.({ done: true, value: undefined });\n }\n })();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.#source.unsubscribe();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubgraphHandle> {\n this.#start();\n return {\n next: async () => {\n if (this.#queue.length > 0) {\n return { done: false, value: this.#queue.shift()! };\n }\n if (this.#closed) {\n return { done: true, value: undefined };\n }\n return await new Promise<IteratorResult<SubgraphHandle>>((resolve) => {\n this.#waiters.push(resolve);\n });\n },\n return: async () => {\n await this.close();\n return { done: true, value: undefined };\n },\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"subgraphs.js","names":["#session","#messagesIterable","#startProjection","#valuesProjection","#outputPromise","#toolCallsIterable","#subgraphsIterable","#subagentsIterable","#ensureMediaDispatcher","#audioBuffer","#imagesBuffer","#videoBuffer","#filesBuffer","#mediaDispatcherStarted","#source","#parentNamespace","#discovered","#pendingToolStarts","#pendingToolCallHandles","#queue","#waiters","#processToolEvent","#sourcePump","#processEvent","#emit","#closed","#start"],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"sourcesContent":["import type {\n Channel,\n Event,\n LifecycleCause,\n LifecycleEvent,\n MessagesEvent,\n SubscribeParams,\n ToolsEvent,\n ValuesEvent,\n} from \"@langchain/protocol\";\nimport type { SubscriptionHandle } from \"../index.js\";\nimport { MultiCursorBuffer } from \"../multi-cursor-buffer.js\";\nimport { StreamingMessageAssembler } from \"../messages.js\";\nimport type { StreamingMessage, StreamingMessageHandle } from \"../messages.js\";\nimport { ToolCallAssembler, toClientAssembledToolCall } from \"./tools.js\";\nimport type { ClientAssembledToolCall } from \"./tools.js\";\nimport { MediaAssembler } from \"../media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../media.js\";\nimport type {\n EventForChannel,\n EventForChannels,\n SubscribeOptions,\n YieldForChannel,\n YieldForChannels,\n} from \"../types.js\";\nimport type { SubagentHandle } from \"./subagents.js\";\n\n/**\n * Minimal subscription surface that {@link SubgraphHandle} and\n * {@link SubagentHandle} delegate to. Typed to match the\n * `Session.subscribe` raw-channel overloads without importing the\n * full `Session` class (avoids circular dependency).\n */\nexport interface Subscribable {\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n}\n\n/**\n * Discovered subgraph within a streaming session.\n *\n * Mirrors the in-process `SubgraphRunStream` pattern: each subgraph\n * has `name`, `index`, `namespace`, and lazy getters for projections\n * scoped to this subgraph's namespace.\n *\n * ```ts\n * for await (const sub of session.subgraphs) {\n * for await (const msg of sub.messages) { ... }\n * const state = await sub.output;\n * }\n * ```\n */\nexport class SubgraphHandle {\n readonly name: string;\n readonly index: number;\n readonly namespace: string[];\n /**\n * Non-empty when upstream attached a `cause` to this subgraph's\n * `lifecycle.started` event. Population is product-specific and\n * performed by stream transformers on the runtime side (e.g.\n * deepagents' `SubagentTransformer` emits\n * `{ type: \"toolCall\", tool_call_id }`). Generic clients should\n * treat `cause.type` as an open enum — the protocol allows future\n * variants (`send`, `edge`, ...) to be forwarded verbatim without\n * a SDK bump.\n */\n readonly cause?: LifecycleCause;\n readonly graphName?: string;\n /**\n * Raw `tool-started` event that triggered this subgraph, when\n * `cause.type === \"toolCall\"` and the matching event has been\n * observed on the `tools` channel.\n */\n toolStartedEvent?: ToolsEvent;\n readonly #session: Subscribable;\n\n #messagesIterable?: AsyncIterable<StreamingMessage>;\n #valuesProjection?: AsyncIterable<unknown> & PromiseLike<unknown>;\n #toolCallsIterable?: AsyncIterable<ClientAssembledToolCall>;\n #subgraphsIterable?: AsyncIterable<SubgraphHandle>;\n #subagentsIterable?: AsyncIterable<SubagentHandle>;\n #outputPromise?: Promise<unknown>;\n\n #mediaDispatcherStarted = false;\n #audioBuffer?: MultiCursorBuffer<AudioMedia>;\n #imagesBuffer?: MultiCursorBuffer<ImageMedia>;\n #videoBuffer?: MultiCursorBuffer<VideoMedia>;\n #filesBuffer?: MultiCursorBuffer<FileMedia>;\n\n constructor(\n name: string,\n index: number,\n namespace: string[],\n session: Subscribable,\n options?: {\n cause?: LifecycleCause;\n graphName?: string;\n toolStartedEvent?: ToolsEvent;\n }\n ) {\n this.name = name;\n this.index = index;\n this.namespace = namespace;\n this.cause = options?.cause;\n this.graphName = options?.graphName;\n this.toolStartedEvent = options?.toolStartedEvent;\n this.#session = session;\n }\n\n get messages(): AsyncIterable<StreamingMessageHandle> {\n if (this.#messagesIterable) return this.#messagesIterable;\n const buffer = new MultiCursorBuffer<StreamingMessage>();\n this.#messagesIterable = buffer;\n const assembler = new StreamingMessageAssembler();\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n const msg = assembler.consume(event as MessagesEvent);\n if (msg) buffer.push(msg);\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get values(): AsyncIterable<unknown> & PromiseLike<unknown> {\n if (this.#valuesProjection) return this.#valuesProjection;\n const buffer = new MultiCursorBuffer<unknown>();\n let lastValue: unknown;\n let resolveOutput!: (value: unknown) => void;\n const outputPromise = new Promise<unknown>((resolve) => {\n resolveOutput = resolve;\n });\n this.#outputPromise = outputPromise;\n const projection = Object.assign(buffer, {\n then: <TResult1 = unknown, TResult2 = never>(\n onfulfilled?:\n | ((value: unknown) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null\n ): Promise<TResult1 | TResult2> =>\n outputPromise.then(onfulfilled, onrejected),\n }) as AsyncIterable<unknown> & PromiseLike<unknown>;\n this.#valuesProjection = projection;\n void this.#startProjection(\n [\"values\"],\n (event) => {\n if (event.method !== \"values\") return;\n const data = (event as ValuesEvent).params.data;\n lastValue = data;\n buffer.push(data);\n },\n () => {\n resolveOutput(lastValue);\n buffer.close();\n }\n );\n return projection;\n }\n\n get toolCalls(): AsyncIterable<ClientAssembledToolCall> {\n if (this.#toolCallsIterable) return this.#toolCallsIterable;\n const buffer = new MultiCursorBuffer<ClientAssembledToolCall>();\n this.#toolCallsIterable = buffer;\n const assembler = new ToolCallAssembler();\n void this.#startProjection(\n [\"tools\"],\n (event) => {\n if (event.method !== \"tools\") return;\n const tc = assembler.consume(event as ToolsEvent);\n if (tc) buffer.push(toClientAssembledToolCall(tc));\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get subgraphs(): AsyncIterable<SubgraphHandle> {\n if (this.#subgraphsIterable) return this.#subgraphsIterable;\n const buffer = new MultiCursorBuffer<SubgraphHandle>();\n this.#subgraphsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"lifecycle\", \"tools\"],\n namespaces: [this.namespace],\n });\n const discovery = new SubgraphDiscoveryHandle(\n rawHandle,\n this.#session,\n this.namespace\n );\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get subagents(): AsyncIterable<SubagentHandle> {\n if (this.#subagentsIterable) return this.#subagentsIterable;\n const buffer = new MultiCursorBuffer<SubagentHandle>();\n this.#subagentsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"tools\", \"lifecycle\"],\n namespaces: [this.namespace],\n });\n const { SubagentDiscoveryHandle: Discovery } =\n await import(\"./subagents.js\");\n const discovery = new Discovery(rawHandle, this.#session);\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get audio(): AsyncIterable<AudioMedia> {\n this.#ensureMediaDispatcher();\n return this.#audioBuffer!;\n }\n\n get images(): AsyncIterable<ImageMedia> {\n this.#ensureMediaDispatcher();\n return this.#imagesBuffer!;\n }\n\n get video(): AsyncIterable<VideoMedia> {\n this.#ensureMediaDispatcher();\n return this.#videoBuffer!;\n }\n\n get files(): AsyncIterable<FileMedia> {\n this.#ensureMediaDispatcher();\n return this.#filesBuffer!;\n }\n\n get output(): Promise<unknown> {\n void this.values;\n return this.#outputPromise!;\n }\n\n #ensureMediaDispatcher(): void {\n if (this.#mediaDispatcherStarted) return;\n this.#mediaDispatcherStarted = true;\n const audio = new MultiCursorBuffer<AudioMedia>();\n const images = new MultiCursorBuffer<ImageMedia>();\n const video = new MultiCursorBuffer<VideoMedia>();\n const files = new MultiCursorBuffer<FileMedia>();\n this.#audioBuffer = audio;\n this.#imagesBuffer = images;\n this.#videoBuffer = video;\n this.#filesBuffer = files;\n const assembler = new MediaAssembler({\n onAudio: (m: AudioMedia) => audio.push(m),\n onImage: (m: ImageMedia) => images.push(m),\n onVideo: (m: VideoMedia) => video.push(m),\n onFile: (m: FileMedia) => files.push(m),\n });\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n () => {\n assembler.close();\n audio.close();\n images.close();\n video.close();\n files.close();\n }\n );\n }\n\n /**\n * Create a raw channel subscription scoped to this subgraph's namespace.\n */\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n subscribe(\n paramsOrChannels: SubscribeParams | Channel | string | readonly Channel[],\n options: SubscribeOptions = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n if (\n typeof paramsOrChannels === \"object\" &&\n !Array.isArray(paramsOrChannels) &&\n \"channels\" in paramsOrChannels\n ) {\n return this.#session.subscribe({\n ...paramsOrChannels,\n namespaces: paramsOrChannels.namespaces ?? [this.namespace],\n });\n }\n\n return this.#session.subscribe(paramsOrChannels as Channel, {\n ...options,\n namespaces: options.namespaces ?? [this.namespace],\n });\n }\n\n async #startProjection(\n channels: Channel[],\n onEvent: (event: Event) => void,\n onDone: () => void\n ): Promise<void> {\n try {\n const rawHandle = await this.#session.subscribe({\n channels,\n namespaces: [this.namespace],\n });\n for await (const event of rawHandle) {\n onEvent(event);\n }\n } finally {\n onDone();\n }\n }\n}\n\n/**\n * Async iterable that yields {@link SubgraphHandle} instances as new\n * subgraph namespaces are discovered from `lifecycle` events.\n *\n * Mirrors the in-process `run.subgraphs` pattern. A new subgraph is\n * discovered when a `lifecycle` event with `event: \"started\"` is\n * received at a namespace depth of exactly `parentDepth + 1`.\n */\nexport class SubgraphDiscoveryHandle implements AsyncIterable<SubgraphHandle> {\n readonly #source: SubscriptionHandle<Event>;\n readonly #session: Subscribable;\n readonly #parentNamespace: string[];\n readonly #discovered = new Set<string>();\n readonly #pendingToolStarts = new Map<string, ToolsEvent>();\n readonly #pendingToolCallHandles = new Map<string, SubgraphHandle>();\n readonly #queue: SubgraphHandle[] = [];\n readonly #waiters: Array<(value: IteratorResult<SubgraphHandle>) => void> =\n [];\n #sourcePump?: Promise<void>;\n #closed = false;\n\n constructor(\n source: SubscriptionHandle<Event>,\n session: Subscribable,\n parentNamespace: string[] = []\n ) {\n this.#source = source;\n this.#session = session;\n this.#parentNamespace = parentNamespace;\n }\n\n #emit(handle: SubgraphHandle): void {\n const waiter = this.#waiters.shift();\n if (waiter) {\n waiter({ done: false, value: handle });\n } else {\n this.#queue.push(handle);\n }\n }\n\n #processToolEvent(event: Event): boolean {\n if (event.method !== \"tools\") return false;\n const tools = event as ToolsEvent;\n const data = tools.params.data as Record<string, unknown>;\n if (data.event !== \"tool-started\") return true;\n\n const toolCallId = data.tool_call_id as string | undefined;\n if (!toolCallId) return true;\n\n const pendingHandle = this.#pendingToolCallHandles.get(toolCallId);\n if (pendingHandle) {\n pendingHandle.toolStartedEvent = tools;\n this.#pendingToolCallHandles.delete(toolCallId);\n return true;\n }\n\n this.#pendingToolStarts.set(toolCallId, tools);\n return true;\n }\n\n #processEvent(event: Event): SubgraphHandle | undefined {\n if (this.#processToolEvent(event)) return undefined;\n if (event.method !== \"lifecycle\") return undefined;\n const lifecycle = event as LifecycleEvent;\n if (lifecycle.params.data.event !== \"started\") return undefined;\n\n const ns = event.params.namespace;\n if (ns.length !== this.#parentNamespace.length + 1) return undefined;\n\n const isChild = this.#parentNamespace.every((seg, i) => ns[i] === seg);\n if (!isChild) return undefined;\n\n const nsKey = ns.join(\"/\");\n if (this.#discovered.has(nsKey)) return undefined;\n this.#discovered.add(nsKey);\n\n const lastSegment = ns[ns.length - 1] ?? \"\";\n const colonIdx = lastSegment.lastIndexOf(\":\");\n let name: string;\n let index: number;\n if (colonIdx >= 0) {\n name = lastSegment.slice(0, colonIdx);\n const suffix = lastSegment.slice(colonIdx + 1);\n index = /^\\d+$/.test(suffix) ? Number(suffix) : 0;\n } else {\n name = lastSegment;\n index = 0;\n }\n\n const data = lifecycle.params.data as unknown as Record<string, unknown>;\n const cause =\n data.cause && typeof data.cause === \"object\"\n ? (data.cause as LifecycleCause)\n : undefined;\n let toolStartedEvent: ToolsEvent | undefined;\n if (cause?.type === \"toolCall\") {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) {\n toolStartedEvent = this.#pendingToolStarts.get(toolCallId);\n this.#pendingToolStarts.delete(toolCallId);\n }\n }\n\n const handle = new SubgraphHandle(name, index, [...ns], this.#session, {\n cause,\n graphName: data.graph_name as string | undefined,\n toolStartedEvent,\n });\n if (cause?.type === \"toolCall\" && toolStartedEvent == null) {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) this.#pendingToolCallHandles.set(toolCallId, handle);\n }\n return handle;\n }\n\n #start(): void {\n if (this.#sourcePump) return;\n this.#sourcePump = (async () => {\n for await (const event of this.#source) {\n const handle = this.#processEvent(event);\n if (!handle) continue;\n this.#emit(handle);\n }\n this.#pendingToolStarts.clear();\n this.#pendingToolCallHandles.clear();\n this.#closed = true;\n while (this.#waiters.length > 0) {\n this.#waiters.shift()?.({ done: true, value: undefined });\n }\n })();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.#source.unsubscribe();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubgraphHandle> {\n this.#start();\n return {\n next: async () => {\n if (this.#queue.length > 0) {\n return { done: false, value: this.#queue.shift()! };\n }\n if (this.#closed) {\n return { done: true, value: undefined };\n }\n return await new Promise<IteratorResult<SubgraphHandle>>((resolve) => {\n this.#waiters.push(resolve);\n });\n },\n return: async () => {\n await this.close();\n return { done: true, value: undefined };\n },\n };\n }\n}\n"],"mappings":"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"}
@@ -1,92 +1,164 @@
1
1
  //#region src/client/stream/handles/tools.ts
2
2
  /**
3
- * Incrementally assembles `tools` events into complete
4
- * {@link AssembledToolCall} objects with promise-based output/status/error.
3
+ * Project a runtime handle to the client SDK surface (promise-only
4
+ * {@link output}, no {@link status} / {@link error} fields).
5
+ */
6
+ function toClientAssembledToolCall(handle) {
7
+ return {
8
+ name: handle.name,
9
+ callId: handle.callId,
10
+ id: handle.id,
11
+ namespace: handle.namespace,
12
+ input: handle.input,
13
+ args: handle.args,
14
+ output: handle.outputPromise
15
+ };
16
+ }
17
+ /**
18
+ * Parse wire-format tool payloads into structured values.
19
+ *
20
+ * Tool events may carry JSON-encoded object strings on the wire; this
21
+ * helper normalises them to plain objects for consumers. Non-JSON strings
22
+ * are returned unchanged.
23
+ */
24
+ function parseToolPayload(value) {
25
+ if (typeof value !== "string") return value;
26
+ const trimmed = value.trim();
27
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return value;
28
+ try {
29
+ return JSON.parse(trimmed);
30
+ } catch {
31
+ return value;
32
+ }
33
+ }
34
+ function isToolMessageLike(value) {
35
+ if (!value || typeof value !== "object") return false;
36
+ const record = value;
37
+ if (record.type === "tool") return true;
38
+ return typeof record.tool_call_id === "string" && "content" in record;
39
+ }
40
+ function textFromContentBlocks(content) {
41
+ let out = "";
42
+ for (const block of content) {
43
+ if (!block || typeof block !== "object") continue;
44
+ const record = block;
45
+ if (record.type === "text" && typeof record.text === "string") out += record.text;
46
+ }
47
+ return out;
48
+ }
49
+ /**
50
+ * Normalise tool-result `content` from a wire ToolMessage into the value
51
+ * a tool implementation returned (object, string, etc.).
52
+ */
53
+ function parseToolResultContent(content) {
54
+ if (content == null) return null;
55
+ if (typeof content === "string") {
56
+ if (content.trim().length === 0) return null;
57
+ return parseToolPayload(content);
58
+ }
59
+ if (Array.isArray(content)) {
60
+ const text = textFromContentBlocks(content);
61
+ if (text.length === 0) return null;
62
+ return parseToolPayload(text);
63
+ }
64
+ if (typeof content === "object") return content;
65
+ return null;
66
+ }
67
+ /**
68
+ * Parse a `tool-finished` output payload into the tool's return value.
5
69
  *
6
- * Each `tool-started` event produces an {@link AssembledToolCall} whose
7
- * `output`, `status`, and `error` promises resolve when `tool-finished`
8
- * or `tool-error` arrives for the same `tool_call_id`.
70
+ * Wire events often wrap structured tool results in a ToolMessage-shaped
71
+ * object (`{ type: "tool", content: "..." }`). This unwraps that envelope,
72
+ * JSON-decodes string content when possible, and leaves plain strings as-is.
73
+ * Returns `null` when a ToolMessage envelope is present but its content
74
+ * cannot be normalised.
75
+ */
76
+ function parseToolOutput(value) {
77
+ const parsed = parseToolPayload(value);
78
+ if (isToolMessageLike(parsed)) return parseToolResultContent(parsed.content);
79
+ return parsed ?? null;
80
+ }
81
+ /**
82
+ * Incrementally assembles `tools` events into mutable tool-call handles.
83
+ *
84
+ * Framework consumers store the handle directly; client SDK consumers
85
+ * should map with {@link toClientAssembledToolCall} before yielding.
9
86
  */
10
87
  var ToolCallAssembler = class {
11
88
  active = /* @__PURE__ */ new Map();
12
89
  consume(event) {
13
90
  const data = event.params.data;
14
91
  if (data.event === "tool-started") return this.handleStarted(event, data);
15
- if (data.event === "tool-finished") {
16
- this.handleFinished(data);
17
- return;
18
- }
19
- if (data.event === "tool-error") {
20
- this.handleError(data);
21
- return;
22
- }
92
+ if (data.event === "tool-finished") return this.handleFinished(data);
93
+ if (data.event === "tool-error") return this.handleError(data);
23
94
  }
24
95
  /**
25
96
  * Reject any in-flight tool calls (e.g. on session close).
26
97
  */
27
98
  failAll(reason) {
28
- for (const tc of this.active.values()) {
29
- tc.rejectOutput(reason);
30
- tc.resolveStatus("error");
31
- tc.resolveError(reason.message);
99
+ for (const entry of this.active.values()) {
100
+ entry.rejectOutput(reason);
101
+ entry.handle.status = "error";
102
+ entry.handle.error = reason.message;
32
103
  }
33
104
  this.active.clear();
34
105
  }
35
106
  handleStarted(event, data) {
36
107
  let resolveOutput;
37
108
  let rejectOutput;
38
- let resolveStatus;
39
- let resolveError;
40
- const output = new Promise((resolve, reject) => {
109
+ const outputPromise = new Promise((resolve, reject) => {
41
110
  resolveOutput = resolve;
42
111
  rejectOutput = reject;
43
112
  });
44
- output.catch(() => void 0);
45
- const status = new Promise((resolve) => {
46
- resolveStatus = resolve;
47
- });
48
- const error = new Promise((resolve) => {
49
- resolveError = resolve;
50
- });
51
- const entry = {
52
- name: data.tool_name,
53
- callId: data.tool_call_id,
113
+ outputPromise.catch(() => void 0);
114
+ const input = parseToolPayload(data.input);
115
+ const name = data.tool_name;
116
+ const callId = data.tool_call_id;
117
+ const handle = {
118
+ name,
119
+ callId,
120
+ id: callId,
54
121
  namespace: [...event.params.namespace],
55
- input: data.input,
56
- resolveOutput,
57
- rejectOutput,
58
- resolveStatus,
59
- resolveError
60
- };
61
- this.active.set(data.tool_call_id, entry);
62
- return {
63
- name: entry.name,
64
- callId: entry.callId,
65
- namespace: entry.namespace,
66
- input: entry.input,
67
- output,
68
- status,
69
- error
122
+ input,
123
+ args: input,
124
+ output: null,
125
+ status: "running",
126
+ error: void 0,
127
+ outputPromise
70
128
  };
129
+ this.active.set(callId, {
130
+ handle,
131
+ resolveOutput,
132
+ rejectOutput
133
+ });
134
+ return handle;
71
135
  }
72
136
  handleFinished(data) {
73
137
  const entry = this.active.get(data.tool_call_id);
74
- if (!entry) return;
138
+ if (!entry) return void 0;
75
139
  this.active.delete(data.tool_call_id);
76
- entry.resolveOutput(data.output);
77
- entry.resolveStatus("finished");
78
- entry.resolveError(void 0);
140
+ const value = parseToolOutput(data.output);
141
+ entry.resolveOutput(value);
142
+ entry.handle.output = value;
143
+ entry.handle.status = "finished";
144
+ entry.handle.error = void 0;
145
+ return entry.handle;
79
146
  }
80
147
  handleError(data) {
81
148
  const entry = this.active.get(data.tool_call_id);
82
- if (!entry) return;
149
+ if (!entry) return void 0;
83
150
  this.active.delete(data.tool_call_id);
84
151
  entry.rejectOutput(new Error(data.message));
85
- entry.resolveStatus("error");
86
- entry.resolveError(data.message);
152
+ entry.handle.output = null;
153
+ entry.handle.status = "error";
154
+ entry.handle.error = data.message;
155
+ return entry.handle;
87
156
  }
88
157
  };
89
158
  //#endregion
90
159
  exports.ToolCallAssembler = ToolCallAssembler;
160
+ exports.parseToolOutput = parseToolOutput;
161
+ exports.parseToolPayload = parseToolPayload;
162
+ exports.toClientAssembledToolCall = toClientAssembledToolCall;
91
163
 
92
164
  //# sourceMappingURL=tools.cjs.map