{"version":3,"file":"messages.cjs","names":["#events","MultiCursorBuffer","#textPromise","#reasoningPromise","#resolveText","#resolveReasoning","#textChunks","#textWaiters","#textDone","#reasoningChunks","#reasoningWaiters","#reasoningDone","#usageIterator","#assembleMessage","AIMessage","#assembler","#activeStreaming"],"sources":["../../../src/client/stream/messages.ts"],"sourcesContent":["import {\n  AIMessage,\n  type ContentBlock as CoreContentBlock,\n  type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type {\n  ChatModelStreamEvent,\n  ContentBlockDelta as CoreContentBlockDelta,\n} from \"@langchain/core/language_models/event\";\nimport type {\n  ContentBlock,\n  FinalizedContentBlock,\n  MessageMetadata,\n  MessagesEvent,\n  UsageInfo,\n} from \"@langchain/protocol\";\n\nimport { MultiCursorBuffer } from \"./multi-cursor-buffer.js\";\n\ntype TextContentStream = AsyncIterable<string> &\n  PromiseLike<string> & { full: AsyncIterable<string> };\n\ntype UsageMetadataStream = AsyncIterable<UsageMetadata> &\n  PromiseLike<UsageMetadata | undefined>;\n\ntype ToolCallsStream = AsyncIterable<CoreContentBlock.Tools.ToolCall> &\n  PromiseLike<Array<CoreContentBlock.Tools.ToolCall>> & {\n    full: AsyncIterable<Array<CoreContentBlock.Tools.ToolCall>>;\n  };\n\nfunction applyCoreContentDelta(\n  target: CoreContentBlock,\n  delta: CoreContentBlock\n): CoreContentBlock {\n  if (target.type !== delta.type) {\n    return structuredClone(delta);\n  }\n\n  switch (delta.type) {\n    case \"text\":\n      return {\n        ...target,\n        ...delta,\n        text: `${\"text\" in target ? target.text : \"\"}${delta.text}`,\n      } as CoreContentBlock;\n    case \"reasoning\":\n      return {\n        ...target,\n        ...delta,\n        reasoning: `${\"reasoning\" in target ? target.reasoning : \"\"}${delta.reasoning}`,\n      } as CoreContentBlock;\n    case \"tool_call_chunk\":\n    case \"server_tool_call_chunk\": {\n      const merged = { ...target, ...delta } as Record<string, unknown>;\n      if (delta.id == null && \"id\" in target && target.id != null) {\n        merged.id = target.id;\n      }\n      if (delta.name == null && \"name\" in target && target.name != null) {\n        merged.name = target.name;\n      }\n      merged.args = `${(\"args\" in target ? target.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n      return merged as unknown as CoreContentBlock;\n    }\n    default:\n      return { ...target, ...delta } as CoreContentBlock;\n  }\n}\n\nfunction coreContentBlockFromDelta(\n  delta: CoreContentBlockDelta,\n  current?: CoreContentBlock\n): CoreContentBlock {\n  switch (delta.type) {\n    case \"text-delta\":\n      return { type: \"text\", text: delta.text } as CoreContentBlock;\n    case \"reasoning-delta\":\n      return {\n        type: \"reasoning\",\n        reasoning: delta.reasoning,\n      } as CoreContentBlock;\n    case \"data-delta\": {\n      const merged = { ...(current ?? {}), data: delta.data } as Record<\n        string,\n        unknown\n      >;\n      if (delta.encoding) merged.encoding = delta.encoding;\n      return merged as unknown as CoreContentBlock;\n    }\n    case \"block-delta\":\n      return delta.fields as CoreContentBlock;\n  }\n}\n\nfunction applyCoreEventDelta(\n  current: CoreContentBlock | undefined,\n  event: Extract<ChatModelStreamEvent, { event: \"content-block-delta\" }> & {\n    content?: CoreContentBlock;\n  }\n): CoreContentBlock {\n  if (event.content) {\n    return current\n      ? applyCoreContentDelta(current, event.content)\n      : event.content;\n  }\n\n  switch (event.delta.type) {\n    case \"text-delta\":\n      if (current?.type === \"text\") {\n        return {\n          ...current,\n          text: `${\"text\" in current ? current.text : \"\"}${event.delta.text}`,\n        } as CoreContentBlock;\n      }\n      return coreContentBlockFromDelta(event.delta, current);\n    case \"reasoning-delta\":\n      if (current?.type === \"reasoning\") {\n        return {\n          ...current,\n          reasoning: `${\"reasoning\" in current ? current.reasoning : \"\"}${event.delta.reasoning}`,\n        } as CoreContentBlock;\n      }\n      return coreContentBlockFromDelta(event.delta, current);\n    case \"data-delta\": {\n      const merged = { ...(current ?? {}) } as Record<string, unknown>;\n      merged.data = `${(merged.data as string | undefined) ?? \"\"}${event.delta.data}`;\n      if (event.delta.encoding) merged.encoding = event.delta.encoding;\n      return merged as unknown as CoreContentBlock;\n    }\n    case \"block-delta\":\n      return {\n        ...(current ?? {}),\n        ...event.delta.fields,\n      } as CoreContentBlock;\n  }\n}\n\nfunction normalizeUsage(\n  usage: UsageInfo | Partial<UsageMetadata> | undefined\n): UsageMetadata | undefined {\n  if (!usage) return undefined;\n  return {\n    ...usage,\n    input_tokens: usage.input_tokens ?? 0,\n    output_tokens: usage.output_tokens ?? 0,\n    total_tokens: usage.total_tokens ?? 0,\n  };\n}\n\n/**\n * Mutable view of a streamed message as message and content-block events are\n * assembled into a single structure.\n */\nexport interface AssembledMessage {\n  id: string;\n  namespace: string[];\n  blocks: ContentBlock[];\n  node?: string;\n  usage?: UsageInfo;\n  metadata?: MessageMetadata;\n  finishMetadata?: Record<string, any>;\n  error?: {\n    message: string;\n    code?: string;\n  };\n}\n\n/**\n * Symbol keys for assembler → StreamingMessage communication.\n * Module-private: invisible to external consumers, accessible to\n * {@link StreamingMessageAssembler} within this file.\n */\nconst PUSH_TEXT: unique symbol = Symbol(\"pushText\");\nconst PUSH_REASONING: unique symbol = Symbol(\"pushReasoning\");\nconst PUSH_EVENT: unique symbol = Symbol(\"pushEvent\");\nconst UPDATE_CONTEXT: unique symbol = Symbol(\"updateContext\");\nconst FINISH: unique symbol = Symbol(\"finish\");\nconst ERROR: unique symbol = Symbol(\"error\");\n\n/**\n * Live streaming view of a single message lifecycle, matching the\n * in-process `ChatModelStream` dual-interface pattern.\n *\n * - `text` / `reasoning`: iterate for streaming deltas, or await for\n *   the full concatenated string after the message completes.\n * - `usage`: promise that resolves with token usage on message-finish.\n * - `blocks`: the assembled content blocks (updated as deltas arrive).\n *\n * Created by {@link StreamingMessageAssembler} and yielded by\n * the `session.messages` lazy getter.\n */\nexport class StreamingMessage\n  implements AsyncIterable<ChatModelStreamEvent>, PromiseLike<AIMessage>\n{\n  readonly id: string;\n  readonly namespace: string[];\n  node: string | undefined;\n  readonly metadata: MessageMetadata | undefined;\n  readonly assembled: AssembledMessage;\n  readonly #events = new MultiCursorBuffer<ChatModelStreamEvent>();\n\n  #textChunks: string[] = [];\n  #reasoningChunks: string[] = [];\n  #textWaiters: Array<() => void> = [];\n  #reasoningWaiters: Array<() => void> = [];\n  #textDone = false;\n  #reasoningDone = false;\n\n  #resolveText!: (v: string) => void;\n  #resolveReasoning!: (v: string) => void;\n  readonly #textPromise: Promise<string>;\n  readonly #reasoningPromise: Promise<string>;\n\n  constructor(assembled: AssembledMessage) {\n    this.id = assembled.id;\n    this.assembled = assembled;\n    this.namespace = assembled.namespace;\n    this.node = assembled.node;\n    this.metadata = assembled.metadata;\n    this.#textPromise = new Promise<string>((r) => {\n      this.#resolveText = r;\n    });\n    this.#reasoningPromise = new Promise<string>((r) => {\n      this.#resolveReasoning = r;\n    });\n  }\n\n  get text(): TextContentStream {\n    const chunks = this.#textChunks;\n    const waiters = this.#textWaiters;\n    const getDone = () => this.#textDone;\n    let cursor = 0;\n    return {\n      [Symbol.asyncIterator]() {\n        return {\n          async next(): Promise<IteratorResult<string>> {\n            while (true) {\n              if (cursor < chunks.length) {\n                return { done: false, value: chunks[cursor++] };\n              }\n              if (getDone()) {\n                return { done: true, value: undefined };\n              }\n              await new Promise<void>((resolve) => {\n                waiters.push(resolve);\n              });\n            }\n          },\n        };\n      },\n      then: this.#textPromise.then.bind(this.#textPromise),\n      full: {\n        async *[Symbol.asyncIterator]() {\n          let accumulated = \"\";\n          for await (const chunk of {\n            [Symbol.asyncIterator]: () =>\n              ({\n                next: async (): Promise<IteratorResult<string>> => {\n                  while (true) {\n                    if (cursor < chunks.length) {\n                      return { done: false, value: chunks[cursor++] };\n                    }\n                    if (getDone()) {\n                      return { done: true, value: undefined };\n                    }\n                    await new Promise<void>((resolve) => {\n                      waiters.push(resolve);\n                    });\n                  }\n                },\n              }) satisfies AsyncIterator<string>,\n          }) {\n            accumulated += chunk;\n            yield accumulated;\n          }\n        },\n      },\n    };\n  }\n\n  get reasoning(): TextContentStream {\n    const chunks = this.#reasoningChunks;\n    const waiters = this.#reasoningWaiters;\n    const getDone = () => this.#reasoningDone;\n    let cursor = 0;\n    return {\n      [Symbol.asyncIterator]() {\n        return {\n          async next(): Promise<IteratorResult<string>> {\n            while (true) {\n              if (cursor < chunks.length) {\n                return { done: false, value: chunks[cursor++] };\n              }\n              if (getDone()) {\n                return { done: true, value: undefined };\n              }\n              await new Promise<void>((resolve) => {\n                waiters.push(resolve);\n              });\n            }\n          },\n        };\n      },\n      then: this.#reasoningPromise.then.bind(this.#reasoningPromise),\n      full: {\n        async *[Symbol.asyncIterator]() {\n          let accumulated = \"\";\n          for await (const chunk of {\n            [Symbol.asyncIterator]: () =>\n              ({\n                next: async (): Promise<IteratorResult<string>> => {\n                  while (true) {\n                    if (cursor < chunks.length) {\n                      return { done: false, value: chunks[cursor++] };\n                    }\n                    if (getDone()) {\n                      return { done: true, value: undefined };\n                    }\n                    await new Promise<void>((resolve) => {\n                      waiters.push(resolve);\n                    });\n                  }\n                },\n              }) satisfies AsyncIterator<string>,\n          }) {\n            accumulated += chunk;\n            yield accumulated;\n          }\n        },\n      },\n    };\n  }\n\n  get usage(): UsageMetadataStream {\n    const promise = (async () => {\n      let usage: UsageMetadata | undefined;\n      for await (const snapshot of this.#usageIterator()) {\n        usage = snapshot;\n      }\n      return usage;\n    })();\n    return {\n      [Symbol.asyncIterator]: () => this.#usageIterator(),\n      then: promise.then.bind(promise),\n    };\n  }\n\n  get toolCalls(): ToolCallsStream {\n    const events = this.#events;\n    const iterator = async function* () {\n      for await (const event of events) {\n        if (\n          event.event === \"content-block-finish\" &&\n          event.content.type === \"tool_call\"\n        ) {\n          yield event.content as CoreContentBlock.Tools.ToolCall;\n        }\n      }\n    };\n    return {\n      [Symbol.asyncIterator]: iterator,\n      then: async (onfulfilled, onrejected) => {\n        try {\n          const calls: CoreContentBlock.Tools.ToolCall[] = [];\n          for await (const call of iterator()) calls.push(call);\n          return onfulfilled ? onfulfilled(calls) : (calls as never);\n        } catch (err) {\n          if (onrejected) return onrejected(err);\n          throw err;\n        }\n      },\n      full: {\n        async *[Symbol.asyncIterator]() {\n          const calls: CoreContentBlock.Tools.ToolCall[] = [];\n          for await (const call of iterator()) {\n            calls.push(call);\n            yield [...calls];\n          }\n        },\n      },\n    };\n  }\n\n  get output(): PromiseLike<AIMessage> {\n    return { then: (onf, onr) => this.#assembleMessage().then(onf, onr) };\n  }\n\n  get blocks(): ContentBlock[] {\n    return this.assembled.blocks;\n  }\n\n  [Symbol.asyncIterator](): AsyncIterator<ChatModelStreamEvent> {\n    return this.#events[Symbol.asyncIterator]();\n  }\n\n  then<TResult1 = AIMessage, TResult2 = never>(\n    onfulfilled?:\n      | ((value: AIMessage) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n  ): PromiseLike<TResult1 | TResult2> {\n    return this.#assembleMessage().then(onfulfilled, onrejected);\n  }\n\n  async *#usageIterator(): AsyncGenerator<UsageMetadata> {\n    for await (const event of this.#events) {\n      if (event.event === \"message-start\" && event.usage) {\n        yield normalizeUsage(event.usage)!;\n      } else if (event.event === \"message-finish\" && event.usage) {\n        yield normalizeUsage(event.usage)!;\n      }\n    }\n  }\n\n  async #assembleMessage(): Promise<AIMessage> {\n    const contentBlocks: Array<CoreContentBlock | undefined> = [];\n    let id: string | undefined;\n    let usage: UsageMetadata | undefined;\n    let metadata: Record<string, unknown> = {};\n    let finishReason: string | undefined;\n\n    for await (const event of this.#events) {\n      switch (event.event) {\n        case \"message-start\":\n          id = event.id ?? id;\n          if (event.usage) usage = normalizeUsage(event.usage);\n          break;\n        case \"content-block-start\":\n          contentBlocks[event.index] = event.content;\n          break;\n        case \"content-block-delta\": {\n          const current = contentBlocks[event.index];\n          contentBlocks[event.index] = applyCoreEventDelta(current, event);\n          break;\n        }\n        case \"content-block-finish\":\n          contentBlocks[event.index] = event.content;\n          break;\n        case \"message-finish\":\n          finishReason = event.reason;\n          if (event.usage) usage = normalizeUsage(event.usage);\n          if (event.responseMetadata) {\n            metadata = {\n              ...metadata,\n              ...event.responseMetadata,\n            };\n          }\n          break;\n        default:\n          break;\n      }\n    }\n\n    return new AIMessage({\n      id,\n      content: contentBlocks.filter(\n        (block): block is CoreContentBlock => block != null\n      ),\n      usage_metadata: usage,\n      response_metadata: {\n        ...metadata,\n        ...(finishReason ? { finish_reason: finishReason } : {}),\n        output_version: \"v1\" as const,\n      },\n    });\n  }\n\n  [PUSH_EVENT](event: ChatModelStreamEvent): void {\n    this.#events.push(event);\n  }\n\n  [UPDATE_CONTEXT](event: MessagesEvent): void {\n    this.node = event.params.node ?? this.node;\n  }\n\n  [PUSH_TEXT](delta: string): void {\n    this.#textChunks.push(delta);\n    // Wake every caught-up iterator so each one advances its own cursor.\n    // Iterators re-check `chunks.length` before delivering, which keeps\n    // the cursor the single source of truth for what a consumer has seen.\n    const pending = this.#textWaiters.splice(0, this.#textWaiters.length);\n    for (const waiter of pending) waiter();\n  }\n\n  [PUSH_REASONING](delta: string): void {\n    this.#reasoningChunks.push(delta);\n    const pending = this.#reasoningWaiters.splice(\n      0,\n      this.#reasoningWaiters.length\n    );\n    for (const waiter of pending) waiter();\n  }\n\n  [FINISH](): void {\n    this.#textDone = true;\n    this.#reasoningDone = true;\n    this.#resolveText(this.#textChunks.join(\"\"));\n    this.#resolveReasoning(this.#reasoningChunks.join(\"\"));\n    const textPending = this.#textWaiters.splice(0, this.#textWaiters.length);\n    for (const waiter of textPending) waiter();\n    const reasoningPending = this.#reasoningWaiters.splice(\n      0,\n      this.#reasoningWaiters.length\n    );\n    for (const waiter of reasoningPending) waiter();\n    this.#events.close();\n  }\n\n  [ERROR](): void {\n    this[FINISH]();\n  }\n}\n\n/**\n * Public view yielded by message projections.\n *\n * `StreamingMessage` is PromiseLike so callers can still `await` a message\n * object directly, but TypeScript applies `Awaited<T>` to values produced by\n * `for await`. Exposing a non-thenable view keeps loop variables typed as the\n * streaming handle instead of as the finalized `AIMessage`.\n */\nexport type StreamingMessageHandle = Omit<StreamingMessage, \"then\">;\n\nexport function toStreamingMessageHandle(\n  message: StreamingMessage\n): StreamingMessageHandle {\n  return new Proxy(message, {\n    get(target, prop) {\n      if (prop === \"then\") return undefined;\n      const value = Reflect.get(target, prop, target);\n      return typeof value === \"function\" ? value.bind(target) : value;\n    },\n    has(target, prop) {\n      if (prop === \"then\") return false;\n      return prop in target;\n    },\n  }) as StreamingMessageHandle;\n}\n\n/**\n * Emitted by `MessageAssembler.consume()` to describe how a message changed in\n * response to a single protocol event.\n */\nexport type MessageAssemblyUpdate =\n  | {\n      kind: \"message-start\";\n      key: string;\n      message: AssembledMessage;\n      event: MessagesEvent;\n    }\n  | {\n      kind: \"content-block-start\" | \"content-block-delta\";\n      key: string;\n      message: AssembledMessage;\n      index: number;\n      block: ContentBlock;\n      event: MessagesEvent;\n    }\n  | {\n      kind: \"content-block-finish\";\n      key: string;\n      message: AssembledMessage;\n      index: number;\n      block: FinalizedContentBlock;\n      event: MessagesEvent;\n    }\n  | {\n      kind: \"usage\";\n      key: string;\n      message: AssembledMessage;\n      event: MessagesEvent;\n    }\n  | {\n      kind: \"message-finish\";\n      key: string;\n      message: AssembledMessage;\n      event: MessagesEvent;\n    }\n  | {\n      kind: \"message-error\";\n      key: string;\n      message: AssembledMessage;\n      event: MessagesEvent;\n    };\n\nfunction cloneBlock<T extends ContentBlock>(block: T): T {\n  return structuredClone(block);\n}\n\nfunction blockFromDelta(\n  delta: CoreContentBlockDelta,\n  current?: ContentBlock\n): ContentBlock {\n  return coreContentBlockFromDelta(\n    delta,\n    current as unknown as CoreContentBlock | undefined\n  ) as unknown as ContentBlock;\n}\n\nfunction applyContentDelta(\n  target: ContentBlock,\n  delta: ContentBlock\n): ContentBlock {\n  if (target.type !== delta.type) {\n    return cloneBlock(delta);\n  }\n\n  switch (delta.type) {\n    case \"text\":\n      return {\n        ...target,\n        ...delta,\n        text: `${\"text\" in target ? target.text : \"\"}${delta.text}`,\n      } as ContentBlock;\n    case \"reasoning\":\n      return {\n        ...target,\n        ...delta,\n        reasoning: `${\"reasoning\" in target ? target.reasoning : \"\"}${delta.reasoning}`,\n      } as ContentBlock;\n    case \"tool_call_chunk\":\n    case \"server_tool_call_chunk\": {\n      // Spread target first, then delta — but preserve target's\n      // ``id``/``name`` when the delta explicitly sets them to\n      // null/undefined.  Some providers (notably Anthropic via the\n      // langchain-core compat bridge) only attach the tool-call\n      // identifiers to the first ``content-block-start`` chunk; every\n      // subsequent ``input_json_delta`` chunk carries ``id=null,\n      // name=null``.  A naive ``{...target, ...delta}`` spread\n      // overwrites the captured identifiers with null, which in turn\n      // makes downstream consumers (e.g. ``extractToolCallChunks`` in\n      // ``assembled-to-message.ts``) drop the chunk on the floor until\n      // the final ``content-block-finish`` event promotes it to a\n      // finalized ``tool_call`` — causing tool-call cards to appear\n      // all-at-once at the end of the turn instead of incrementally.\n      const merged = { ...target, ...delta } as Record<string, unknown>;\n      if (delta.id == null && \"id\" in target && target.id != null) {\n        merged.id = target.id;\n      }\n      if (delta.name == null && \"name\" in target && target.name != null) {\n        merged.name = target.name;\n      }\n      merged.args = `${(\"args\" in target ? target.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n      return merged as unknown as ContentBlock;\n    }\n    default:\n      return {\n        ...target,\n        ...delta,\n      } as ContentBlock;\n  }\n}\n\nfunction messageKeyFor(event: MessagesEvent): string {\n  const { namespace, node, data } = event.params;\n  const namespaceKey = namespace.join(\"/\");\n  const messageId = data.event === \"message-start\" ? (data.id ?? \"\") : \"\";\n  return `${namespaceKey}::${node ?? \"\"}::${messageId}`;\n}\n\nfunction toChatModelStreamEvent(event: MessagesEvent): ChatModelStreamEvent {\n  return event.params.data as unknown as ChatModelStreamEvent;\n}\n\n/**\n * Incrementally assembles `messages` events into complete message objects.\n */\nexport class MessageAssembler {\n  private readonly activeMessages = new Map<string, AssembledMessage>();\n  private readonly activeByNamespaceNode = new Map<string, string>();\n  private readonly blockIndexByProtocolIndexAndType = new Map<string, number>();\n\n  /**\n   * Applies a single message event and returns the resulting assembly update.\n   *\n   * @param event - Incoming `messages` event to fold into the assembler state.\n   */\n  consume(event: MessagesEvent): MessageAssemblyUpdate {\n    const data = event.params.data;\n    const namespaceNodeKey = `${event.params.namespace.join(\"/\")}::${event.params.node ?? \"\"}`;\n\n    if (data.event === \"message-start\") {\n      const key = messageKeyFor(event);\n      this.activeByNamespaceNode.set(namespaceNodeKey, key);\n      const message: AssembledMessage = {\n        id: data.id,\n        namespace: [...event.params.namespace],\n        node: event.params.node,\n        metadata: data.metadata,\n        blocks: [],\n      };\n      this.activeMessages.set(key, message);\n      return { kind: \"message-start\", key, message, event };\n    }\n\n    const activeKey = this.activeByNamespaceNode.get(namespaceNodeKey);\n    if (!activeKey) {\n      // A continuation event (delta/finish/error) arrived without a\n      // prior `message-start`. This can happen on late-attaching\n      // subscriptions when the server has already trimmed the\n      // `message-start` from its replay buffer. Synthesize a minimal\n      // active message so the assembler can still fold subsequent\n      // events instead of hard-failing the caller.\n      const syntheticKey = `${namespaceNodeKey}::`;\n      this.activeByNamespaceNode.set(namespaceNodeKey, syntheticKey);\n      const synthetic: AssembledMessage = {\n        id: data.id,\n        namespace: [...event.params.namespace],\n        node: event.params.node,\n        blocks: [],\n      };\n      this.activeMessages.set(syntheticKey, synthetic);\n      return this.consume(event);\n    }\n\n    const message = this.activeMessages.get(activeKey);\n    if (!message) {\n      throw new Error(`No active message state found for key ${activeKey}`);\n    }\n\n    if ((data as { event?: string }).event === \"usage\") {\n      message.usage = (data as { usage?: UsageInfo }).usage;\n      return {\n        kind: \"usage\",\n        key: activeKey,\n        message,\n        event,\n      };\n    }\n\n    switch (data.event) {\n      case \"content-block-start\": {\n        message.blocks[data.index] = cloneBlock(data.content);\n        this.blockIndexByProtocolIndexAndType.set(\n          blockIndexKey(activeKey, data.index, data.content.type),\n          data.index\n        );\n        return {\n          kind: \"content-block-start\",\n          key: activeKey,\n          message,\n          index: data.index,\n          block: data.content,\n          event,\n        };\n      }\n      case \"content-block-delta\": {\n        const deltaEvent = data as typeof data & {\n          content?: ContentBlock;\n          delta?: CoreContentBlockDelta;\n        };\n        const deltaBlock =\n          deltaEvent.content ??\n          (deltaEvent.delta != null\n            ? blockFromDelta(deltaEvent.delta, message.blocks[data.index])\n            : undefined);\n        if (deltaBlock == null) {\n          throw new Error(\"Received content-block-delta without content\");\n        }\n        const targetIndex = this.resolveBlockIndex(\n          activeKey,\n          message.blocks,\n          data.index,\n          deltaBlock.type\n        );\n        const current = message.blocks[targetIndex];\n        message.blocks[targetIndex] =\n          deltaEvent.content != null\n            ? current == null\n              ? cloneBlock(deltaEvent.content)\n              : applyContentDelta(current, deltaEvent.content)\n            : (applyCoreEventDelta(\n                current as CoreContentBlock | undefined,\n                data as unknown as Extract<\n                  ChatModelStreamEvent,\n                  { event: \"content-block-delta\" }\n                >\n              ) as unknown as ContentBlock);\n        return {\n          kind: \"content-block-delta\",\n          key: activeKey,\n          message,\n          index: targetIndex,\n          block: deltaBlock,\n          event,\n        };\n      }\n      case \"content-block-finish\": {\n        const targetIndex = this.resolveFinishBlockIndex(\n          activeKey,\n          data.index,\n          data.content.type\n        );\n        message.blocks[targetIndex] = cloneBlock(data.content);\n        return {\n          kind: \"content-block-finish\",\n          key: activeKey,\n          message,\n          index: targetIndex,\n          block: data.content,\n          event,\n        };\n      }\n      case \"message-finish\": {\n        message.usage = data.usage;\n        message.finishMetadata = data.responseMetadata;\n        this.activeMessages.delete(activeKey);\n        this.activeByNamespaceNode.delete(namespaceNodeKey);\n        this.clearBlockIndexAliases(activeKey);\n        return {\n          kind: \"message-finish\",\n          key: activeKey,\n          message: structuredClone(message),\n          event,\n        };\n      }\n      case \"error\": {\n        message.error = { message: data.message, code: data.code };\n        this.activeMessages.delete(activeKey);\n        this.activeByNamespaceNode.delete(namespaceNodeKey);\n        this.clearBlockIndexAliases(activeKey);\n        return {\n          kind: \"message-error\",\n          key: activeKey,\n          message: structuredClone(message),\n          event,\n        };\n      }\n    }\n  }\n\n  private resolveBlockIndex(\n    activeKey: string,\n    blocks: ContentBlock[],\n    protocolIndex: number,\n    blockType: string\n  ): number {\n    const current = blocks[protocolIndex];\n    if (\n      current == null ||\n      current.type === blockType ||\n      areCompatibleBlockTypes(current.type, blockType)\n    ) {\n      this.blockIndexByProtocolIndexAndType.set(\n        blockIndexKey(activeKey, protocolIndex, blockType),\n        protocolIndex\n      );\n      return protocolIndex;\n    }\n\n    const key = blockIndexKey(activeKey, protocolIndex, blockType);\n    const existing = this.blockIndexByProtocolIndexAndType.get(key);\n    if (existing != null) return existing;\n\n    const nextIndex = blocks.length;\n    this.blockIndexByProtocolIndexAndType.set(key, nextIndex);\n    return nextIndex;\n  }\n\n  private resolveFinishBlockIndex(\n    activeKey: string,\n    protocolIndex: number,\n    blockType: string\n  ): number {\n    const key = blockIndexKey(activeKey, protocolIndex, blockType);\n    const existing = this.blockIndexByProtocolIndexAndType.get(key);\n    if (existing != null) return existing;\n\n    this.blockIndexByProtocolIndexAndType.set(key, protocolIndex);\n    return protocolIndex;\n  }\n\n  private clearBlockIndexAliases(activeKey: string): void {\n    const prefix = `${activeKey}::`;\n    for (const key of this.blockIndexByProtocolIndexAndType.keys()) {\n      if (key.startsWith(prefix))\n        this.blockIndexByProtocolIndexAndType.delete(key);\n    }\n  }\n}\n\nfunction blockIndexKey(\n  activeKey: string,\n  protocolIndex: number,\n  blockType: string\n): string {\n  return `${activeKey}::${protocolIndex}::${blockType}`;\n}\n\nfunction areCompatibleBlockTypes(\n  currentType: string,\n  nextType: string\n): boolean {\n  const toolCallTypes = new Set([\n    \"tool_call\",\n    \"tool_call_chunk\",\n    \"tool_use\",\n    \"input_json_delta\",\n  ]);\n  const serverToolCallTypes = new Set([\n    \"server_tool_call\",\n    \"server_tool_call_chunk\",\n  ]);\n\n  return (\n    (toolCallTypes.has(currentType) && toolCallTypes.has(nextType)) ||\n    (serverToolCallTypes.has(currentType) && serverToolCallTypes.has(nextType))\n  );\n}\n\n/**\n * Assembles `messages` events into {@link StreamingMessage} instances\n * with live text/reasoning delta streams, matching the in-process\n * `ChatModelStream` dual-interface pattern.\n */\nexport class StreamingMessageAssembler {\n  readonly #assembler = new MessageAssembler();\n  readonly #activeStreaming = new Map<string, StreamingMessage>();\n\n  /**\n   * Folds a single event and returns a new {@link StreamingMessage}\n   * when a `message-start` is seen, or `undefined` for continuation\n   * events (deltas, finish, error).\n   */\n  consume(event: MessagesEvent): StreamingMessage | undefined {\n    const update = this.#assembler.consume(event);\n    if (update == null) return undefined;\n\n    switch (update.kind) {\n      case \"message-start\": {\n        const streaming = new StreamingMessage(update.message);\n        streaming[UPDATE_CONTEXT](update.event);\n        streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n        this.#activeStreaming.set(update.key, streaming);\n        return streaming;\n      }\n      case \"content-block-start\": {\n        const streaming = this.#activeStreaming.get(update.key);\n        if (streaming) {\n          streaming[UPDATE_CONTEXT](update.event);\n          streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n        }\n        if (\n          streaming &&\n          update.block.type === \"text\" &&\n          \"text\" in update.block &&\n          update.block.text\n        ) {\n          streaming[PUSH_TEXT](update.block.text);\n        }\n        if (\n          streaming &&\n          update.block.type === \"reasoning\" &&\n          \"reasoning\" in update.block &&\n          update.block.reasoning\n        ) {\n          streaming[PUSH_REASONING](update.block.reasoning);\n        }\n        return undefined;\n      }\n      case \"content-block-delta\": {\n        const streaming = this.#activeStreaming.get(update.key);\n        if (!streaming) return undefined;\n        streaming[UPDATE_CONTEXT](update.event);\n        streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n        if (update.block.type === \"text\" && \"text\" in update.block) {\n          streaming[PUSH_TEXT](update.block.text);\n        }\n        if (update.block.type === \"reasoning\" && \"reasoning\" in update.block) {\n          streaming[PUSH_REASONING](update.block.reasoning);\n        }\n        return undefined;\n      }\n      case \"content-block-finish\": {\n        const streaming = this.#activeStreaming.get(update.key);\n        if (streaming) {\n          streaming[UPDATE_CONTEXT](update.event);\n          streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n        }\n        return undefined;\n      }\n      case \"usage\": {\n        const streaming = this.#activeStreaming.get(update.key);\n        if (streaming) {\n          streaming[UPDATE_CONTEXT](update.event);\n          streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n        }\n        return undefined;\n      }\n      case \"message-finish\": {\n        const streaming = this.#activeStreaming.get(update.key);\n        if (streaming) {\n          streaming[UPDATE_CONTEXT](update.event);\n          streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n          streaming[FINISH]();\n          this.#activeStreaming.delete(update.key);\n        }\n        return undefined;\n      }\n      case \"message-error\": {\n        const streaming = this.#activeStreaming.get(update.key);\n        if (streaming) {\n          streaming[UPDATE_CONTEXT](update.event);\n          streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n          streaming[ERROR]();\n          this.#activeStreaming.delete(update.key);\n        }\n        return undefined;\n      }\n    }\n  }\n}\n"],"mappings":"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"}