{"version":3,"file":"stream.cjs","names":["AIMessage"],"sources":["../../src/language_models/stream.ts"],"sourcesContent":["/**\n * Typed stream classes for chat model streaming.\n *\n * @module\n */\n\nimport { AIMessage } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { UsageMetadata } from \"../messages/metadata.js\";\nimport type { ChatModelStreamEvent, ContentBlockDelta } from \"./event.js\";\n\ntype UsageMetadataLike = Partial<UsageMetadata>;\n\n/**\n * A buffer that caches emitted events for replay.\n *\n * Multiple consumers can independently iterate the same buffer —\n * each gets its own cursor. Events are never consumed or removed.\n *\n * @internal\n */\nclass ReplayBuffer {\n  private events: ChatModelStreamEvent[] = [];\n  private finished = false;\n  private waiters: Array<() => void> = [];\n  private error: Error | null = null;\n\n  push(event: ChatModelStreamEvent): void {\n    this.events.push(event);\n    const toWake = this.waiters.splice(0);\n    for (const waiter of toWake) {\n      waiter();\n    }\n  }\n\n  finish(): void {\n    this.finished = true;\n    const toWake = this.waiters.splice(0);\n    for (const waiter of toWake) {\n      waiter();\n    }\n  }\n\n  setError(err: Error): void {\n    this.error = err;\n    this.finished = true;\n    const toWake = this.waiters.splice(0);\n    for (const waiter of toWake) {\n      waiter();\n    }\n  }\n\n  async *iterate(): AsyncGenerator<ChatModelStreamEvent> {\n    if (this.finished) {\n      if (this.error) throw this.error;\n      yield* this.events;\n      return;\n    }\n\n    let cursor = 0;\n    while (true) {\n      while (cursor < this.events.length) {\n        yield this.events[cursor]!;\n        cursor++;\n      }\n      if (this.finished) {\n        if (this.error) throw this.error;\n        return;\n      }\n      await new Promise<void>((resolve) => {\n        if (cursor < this.events.length || this.finished) {\n          resolve();\n          return;\n        }\n        this.waiters.push(resolve);\n      });\n    }\n  }\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n *\n * - `text-delta` → append text\n * - `reasoning-delta` → append reasoning text\n * - `data-delta` → append encoded data to `data`\n * - `block-delta` → shallow merge fields\n *\n * @internal\n */\nfunction applyDelta(\n  block: ContentBlock,\n  delta: ContentBlockDelta\n): ContentBlock {\n  switch (delta.type) {\n    case \"text-delta\":\n      if (block.type === \"text\") {\n        return {\n          ...block,\n          text: (block.text ?? \"\") + delta.text,\n        };\n      }\n      return block;\n    case \"reasoning-delta\":\n      if (block.type === \"thinking\") {\n        return {\n          ...block,\n          thinking: (block.thinking ?? \"\") + delta.reasoning,\n        };\n      }\n      if (block.type === \"reasoning\") {\n        return {\n          ...block,\n          reasoning: (block.reasoning ?? \"\") + delta.reasoning,\n        };\n      }\n      return block;\n    case \"data-delta\":\n      return {\n        ...block,\n        data: (block.data ?? \"\") + delta.data,\n      };\n    case \"block-delta\":\n      return { ...block, ...delta.fields } as ContentBlock;\n    default:\n      throw new Error(`Unknown delta type: ${JSON.stringify(delta)}`);\n  }\n}\n\n/**\n * Returns the typed delta carried by a content-block delta event.\n *\n * Stream protocol compliant language models store incremental updates in\n * `event.delta`, e.g. `{ type: \"text-delta\", text: \"hello\" }`. Some models and\n * adapters still emit the older content-shaped form on `event.content`, e.g.\n * `{ type: \"text\", text: \"hello\" }`, which predates explicit delta event\n * variants.\n *\n * Keep accepting that content-shaped form here so {@link ChatModelStream}\n * remains a tolerant consumer while producers migrate to protocol compliant\n * typed deltas.\n *\n * @internal\n */\nfunction getEventDelta(\n  event: ChatModelStreamEvent\n): ContentBlockDelta | undefined {\n  if (event.event !== \"content-block-delta\") return undefined;\n  if (\"delta\" in event && event.delta) return event.delta;\n\n  const content = (event as { content?: unknown }).content;\n  if (content == null || typeof content !== \"object\") return undefined;\n  const block = content as { type?: string } & Record<string, unknown>;\n  if (block.type === \"text\" && typeof block.text === \"string\") {\n    return { type: \"text-delta\", text: block.text };\n  }\n  if (block.type === \"reasoning\" && typeof block.reasoning === \"string\") {\n    return { type: \"reasoning-delta\", reasoning: block.reasoning };\n  }\n  if (block.type === \"thinking\" && typeof block.thinking === \"string\") {\n    return { type: \"reasoning-delta\", reasoning: block.thinking };\n  }\n  if (typeof block.data === \"string\") {\n    return { type: \"data-delta\", data: block.data, encoding: \"base64\" };\n  }\n  if (typeof block.type === \"string\") {\n    return { type: \"block-delta\", fields: { ...block, type: block.type } };\n  }\n  return undefined;\n}\n\nfunction getReasoningDelta(content: unknown): string | undefined {\n  if (content == null || typeof content !== \"object\") return undefined;\n  const block = content as {\n    type?: string;\n    reasoning?: unknown;\n    thinking?: unknown;\n  };\n  if (block.type === \"reasoning\" && typeof block.reasoning === \"string\") {\n    return block.reasoning;\n  }\n  if (block.type === \"thinking\" && typeof block.thinking === \"string\") {\n    return block.thinking;\n  }\n  return undefined;\n}\n\nfunction isReasoningContent(content: unknown): boolean {\n  if (content == null || typeof content !== \"object\") return false;\n  const type = (content as { type?: unknown }).type;\n  return type === \"reasoning\" || type === \"thinking\";\n}\n\n/**\n * Normalize protocol-compatible partial usage into Core's concrete usage shape.\n *\n * Some stream sources emit usage snapshots without every aggregate token field.\n * Keep the stream event input permissive, then normalize at read time so\n * high-level Core consumers always receive a complete {@link UsageMetadata}.\n */\nfunction normalizeUsage(\n  usage: UsageMetadataLike | 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\nfunction parseToolArgs(value: unknown): Record<string, unknown> {\n  if (value != null && typeof value === \"object\" && !Array.isArray(value)) {\n    return value as Record<string, unknown>;\n  }\n  if (typeof value !== \"string\" || value.length === 0) return {};\n  try {\n    const parsed = JSON.parse(value);\n    return parsed != null &&\n      typeof parsed === \"object\" &&\n      !Array.isArray(parsed)\n      ? (parsed as Record<string, unknown>)\n      : {};\n  } catch {\n    return {};\n  }\n}\n\nfunction standardizeToolBlock(block: ContentBlock): ContentBlock {\n  const record = block as Record<string, unknown>;\n  if (block.type === \"tool_call\") return block;\n  if (\n    block.type !== \"tool_call_chunk\" &&\n    block.type !== \"tool_use\" &&\n    block.type !== \"input_json_delta\"\n  ) {\n    return block;\n  }\n\n  const name = typeof record.name === \"string\" ? record.name : undefined;\n  if (name == null) return block;\n\n  const args = record.args ?? record.input;\n  return {\n    ...record,\n    type: \"tool_call\",\n    name,\n    args: parseToolArgs(args),\n  } as ContentBlock;\n}\n\n// ─── Sub-Stream: Text ───────────────────────────────────────────\n\n/**\n * Typed stream for text content.\n *\n * - **Iterate**: yields incremental text deltas.\n * - **Await**: resolves to the complete concatenated text.\n * - **`.full`**: yields the running accumulated text after each delta.\n */\nexport class TextContentStream\n  implements AsyncIterable<string>, PromiseLike<string>\n{\n  /** @internal */\n  private _buffer: ReplayBuffer;\n\n  /** @internal */\n  constructor(buffer: ReplayBuffer) {\n    this._buffer = buffer;\n  }\n\n  /** Yields the accumulated text so far after each delta. */\n  get full(): AsyncIterable<string> {\n    const buffer = this._buffer;\n    return {\n      async *[Symbol.asyncIterator]() {\n        let accumulated = \"\";\n        for await (const event of buffer.iterate()) {\n          const delta = getEventDelta(event);\n          if (delta?.type === \"text-delta\") {\n            accumulated += delta.text;\n            yield accumulated;\n          }\n        }\n      },\n    };\n  }\n\n  /** Yields incremental text deltas. */\n  [Symbol.asyncIterator](): AsyncIterator<string> {\n    const buffer = this._buffer;\n    async function* gen() {\n      for await (const event of buffer.iterate()) {\n        const delta = getEventDelta(event);\n        if (delta?.type === \"text-delta\") {\n          yield delta.text;\n        }\n      }\n    }\n    return gen();\n  }\n\n  then<TResult1 = string, TResult2 = never>(\n    onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n    onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n  ): PromiseLike<TResult1 | TResult2> {\n    const promise = (async () => {\n      let text = \"\";\n      for await (const delta of this) {\n        text += delta;\n      }\n      return text;\n    })();\n    return promise.then(onfulfilled, onrejected);\n  }\n}\n\n// ─── Sub-Stream: Tool Calls ─────────────────────────────────────\n\n/**\n * Typed stream for tool calls.\n *\n * - **Iterate**: yields individual `ToolCall` objects as each completes.\n * - **Await**: resolves to the full array.\n * - **`.full`**: yields the accumulated array after each new tool call.\n */\nexport class ToolCallsStream\n  implements\n    AsyncIterable<ContentBlock.Tools.ToolCall>,\n    PromiseLike<Array<ContentBlock.Tools.ToolCall>>\n{\n  /** @internal */\n  private _buffer: ReplayBuffer;\n\n  /** @internal */\n  constructor(buffer: ReplayBuffer) {\n    this._buffer = buffer;\n  }\n\n  get full(): AsyncIterable<Array<ContentBlock.Tools.ToolCall>> {\n    const buffer = this._buffer;\n    return {\n      async *[Symbol.asyncIterator]() {\n        const calls: Array<ContentBlock.Tools.ToolCall> = [];\n        for await (const event of buffer.iterate()) {\n          if (\n            event.event === \"content-block-finish\" &&\n            event.content.type === \"tool_call\"\n          ) {\n            calls.push(event.content as ContentBlock.Tools.ToolCall);\n            yield [...calls];\n          }\n        }\n      },\n    };\n  }\n\n  [Symbol.asyncIterator](): AsyncIterator<ContentBlock.Tools.ToolCall> {\n    const buffer = this._buffer;\n    async function* gen() {\n      for await (const event of buffer.iterate()) {\n        if (\n          event.event === \"content-block-finish\" &&\n          event.content.type === \"tool_call\"\n        ) {\n          yield event.content as ContentBlock.Tools.ToolCall;\n        }\n      }\n    }\n    return gen();\n  }\n\n  then<TResult1 = Array<ContentBlock.Tools.ToolCall>, TResult2 = never>(\n    onfulfilled?:\n      | ((\n          value: Array<ContentBlock.Tools.ToolCall>\n        ) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n  ): PromiseLike<TResult1 | TResult2> {\n    const promise = (async () => {\n      const calls: Array<ContentBlock.Tools.ToolCall> = [];\n      for await (const call of this) {\n        calls.push(call);\n      }\n      return calls;\n    })();\n    return promise.then(onfulfilled, onrejected);\n  }\n}\n\n// ─── Sub-Stream: Reasoning ──────────────────────────────────────\n\n/**\n * Typed stream for reasoning content (chain-of-thought).\n * Same interface as {@link TextContentStream} but for reasoning blocks.\n */\nexport class ReasoningContentStream\n  implements AsyncIterable<string>, PromiseLike<string>\n{\n  /** @internal */\n  private _buffer: ReplayBuffer;\n\n  /** @internal */\n  constructor(buffer: ReplayBuffer) {\n    this._buffer = buffer;\n  }\n\n  get full(): AsyncIterable<string> {\n    const buffer = this._buffer;\n    return {\n      async *[Symbol.asyncIterator]() {\n        let accumulated = \"\";\n        let seenReasoning = false;\n        for await (const event of buffer.iterate()) {\n          if (event.event === \"content-block-start\") {\n            if (!isReasoningContent(event.content)) {\n              if (seenReasoning) return;\n              continue;\n            }\n            seenReasoning = true;\n            const delta = getReasoningDelta(event.content);\n            if (delta == null || delta.length === 0) continue;\n            accumulated += delta;\n            yield accumulated;\n          } else if (event.event === \"content-block-delta\") {\n            const eventDelta = getEventDelta(event);\n            if (eventDelta?.type !== \"reasoning-delta\") continue;\n            seenReasoning = true;\n            const delta = eventDelta.reasoning;\n            if (delta == null || delta.length === 0) continue;\n            accumulated += delta;\n            yield accumulated;\n          } else if (\n            event.event === \"content-block-finish\" &&\n            isReasoningContent(event.content)\n          ) {\n            return;\n          } else if (event.event === \"message-finish\") {\n            return;\n          }\n        }\n      },\n    };\n  }\n\n  [Symbol.asyncIterator](): AsyncIterator<string> {\n    const buffer = this._buffer;\n    async function* gen() {\n      let seenReasoning = false;\n      for await (const event of buffer.iterate()) {\n        if (event.event === \"content-block-start\") {\n          if (!isReasoningContent(event.content)) {\n            if (seenReasoning) return;\n            continue;\n          }\n          seenReasoning = true;\n          const delta = getReasoningDelta(event.content);\n          if (delta != null && delta.length > 0) yield delta;\n        } else if (event.event === \"content-block-delta\") {\n          const eventDelta = getEventDelta(event);\n          if (eventDelta?.type !== \"reasoning-delta\") continue;\n          seenReasoning = true;\n          const delta = eventDelta.reasoning;\n          if (delta != null && delta.length > 0) yield delta;\n        } else if (\n          event.event === \"content-block-finish\" &&\n          isReasoningContent(event.content)\n        ) {\n          return;\n        } else if (event.event === \"message-finish\") {\n          return;\n        }\n      }\n    }\n    return gen();\n  }\n\n  then<TResult1 = string, TResult2 = never>(\n    onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n    onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n  ): PromiseLike<TResult1 | TResult2> {\n    const promise = (async () => {\n      let text = \"\";\n      for await (const delta of this) {\n        text += delta;\n      }\n      return text;\n    })();\n    return promise.then(onfulfilled, onrejected);\n  }\n}\n\n// ─── Sub-Stream: Usage ──────────────────────────────────────────\n\n/**\n * Typed stream for usage metadata.\n */\nexport class UsageMetadataStream\n  implements\n    AsyncIterable<UsageMetadata>,\n    PromiseLike<UsageMetadata | undefined>\n{\n  /** @internal */\n  private _buffer: ReplayBuffer;\n\n  /** @internal */\n  constructor(buffer: ReplayBuffer) {\n    this._buffer = buffer;\n  }\n\n  [Symbol.asyncIterator](): AsyncIterator<UsageMetadata> {\n    const buffer = this._buffer;\n    async function* gen() {\n      for await (const event of buffer.iterate()) {\n        if (event.event === \"usage\") {\n          const usage = normalizeUsage(event.usage);\n          if (usage) yield usage;\n        } else if (event.event === \"message-start\" && event.usage) {\n          const usage = normalizeUsage(event.usage);\n          if (usage) yield usage;\n        } else if (event.event === \"message-finish\" && event.usage) {\n          const usage = normalizeUsage(event.usage);\n          if (usage) yield usage;\n        }\n      }\n    }\n    return gen();\n  }\n\n  then<TResult1 = UsageMetadata | undefined, TResult2 = never>(\n    onfulfilled?:\n      | ((value: UsageMetadata | undefined) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n  ): PromiseLike<TResult1 | TResult2> {\n    const promise = (async () => {\n      let latest: UsageMetadata | undefined;\n      for await (const usage of this) {\n        latest = usage;\n      }\n      return latest;\n    })();\n    return promise.then(onfulfilled, onrejected);\n  }\n}\n\n// ─── ChatModelStream ────────────────────────────────────────────\n\n/**\n * The main stream object returned by chat model streaming.\n *\n * Implements `AsyncIterable<ChatModelStreamEvent>` for raw event access\n * and `PromiseLike<AIMessage>` for simple `await` usage.\n */\nexport class ChatModelStream\n  implements AsyncIterable<ChatModelStreamEvent>, PromiseLike<AIMessage>\n{\n  /** @internal */\n  private _buffer: ReplayBuffer;\n\n  /** @internal */\n  constructor(source: AsyncIterable<ChatModelStreamEvent>) {\n    this._buffer = new ReplayBuffer();\n    this._consume(source);\n  }\n\n  /** @internal */\n  private async _consume(\n    source: AsyncIterable<ChatModelStreamEvent>\n  ): Promise<void> {\n    try {\n      for await (const event of source) {\n        this._buffer.push(event);\n      }\n      this._buffer.finish();\n    } catch (err) {\n      this._buffer.setError(\n        err instanceof Error ? err : new Error(String(err))\n      );\n    }\n  }\n\n  [Symbol.asyncIterator](): AsyncIterator<ChatModelStreamEvent> {\n    return this._buffer.iterate();\n  }\n\n  get text(): TextContentStream {\n    return new TextContentStream(this._buffer);\n  }\n\n  get toolCalls(): ToolCallsStream {\n    return new ToolCallsStream(this._buffer);\n  }\n\n  get reasoning(): ReasoningContentStream {\n    return new ReasoningContentStream(this._buffer);\n  }\n\n  get usage(): UsageMetadataStream {\n    return new UsageMetadataStream(this._buffer);\n  }\n\n  get output(): PromiseLike<AIMessage> {\n    return this._assembleMessage();\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  /** @internal */\n  private async _assembleMessage(): Promise<AIMessage> {\n    const contentBlocks: Array<ContentBlock | 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._buffer.iterate()) {\n      switch (event.event) {\n        case \"message-start\":\n          id = event.id ?? id;\n          if (event.usage) usage = normalizeUsage(event.usage);\n          break;\n\n        case \"content-block-start\":\n          contentBlocks[event.index] = event.content;\n          break;\n\n        case \"content-block-delta\": {\n          const current = contentBlocks[event.index];\n          const delta = getEventDelta(event);\n          if (current) {\n            if (delta) contentBlocks[event.index] = applyDelta(current, delta);\n          }\n          break;\n        }\n\n        case \"content-block-finish\":\n          contentBlocks[event.index] = event.content;\n          break;\n\n        case \"usage\":\n          usage = normalizeUsage(event.usage);\n          break;\n\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\n        default:\n          break;\n      }\n    }\n\n    const filteredBlocks = contentBlocks\n      .filter((b): b is ContentBlock => b != null)\n      .map(standardizeToolBlock);\n\n    return new AIMessage({\n      id,\n      content: filteredBlocks,\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"],"mappings":"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"}