{"version":3,"file":"tanstack-ai-angular.mjs","sources":["../../src/internal/to-reactive.ts","../../src/inject-chat.ts","../../src/inject-byok.ts","../../src/inject-generation.ts","../../src/inject-generate-image.ts","../../src/inject-generate-audio.ts","../../src/inject-generate-speech.ts","../../src/inject-transcription.ts","../../src/inject-audio-recorder.ts","../../src/inject-summarize.ts","../../src/inject-generate-video.ts","../../src/index.ts","../../src/tanstack-ai-angular.ts"],"sourcesContent":["import { computed, isSignal } from '@angular/core'\nimport type { Signal } from '@angular/core'\n\n/**\n * A value that may be supplied to `injectChat` either as a static value, an\n * Angular `Signal`, or a zero-arg getter. The getter form lets callers read\n * other signals so the option stays reactive.\n */\nexport type ReactiveOption<T> = T | Signal<T> | (() => T)\n\n/**\n * Normalize a {@link ReactiveOption} into a `Signal`-like getter `() => T`.\n *\n * - A `Signal` is returned as-is (already a getter that tracks reads).\n * - A zero-arg function is wrapped in `computed` so reads inside it are tracked.\n * - A plain value becomes a constant non-reactive fn (never re-fires).\n */\nexport function toReactive<T>(value: ReactiveOption<T>): () => T {\n  if (isSignal(value)) {\n    return value\n  }\n  if (typeof value === 'function') {\n    return computed(value as () => T)\n  }\n  return () => value\n}\n","import { ChatClient } from '@tanstack/ai-client'\nimport { createChatDevtoolsBridge } from '@tanstack/ai-client/devtools'\nimport {\n  DestroyRef,\n  Injector,\n  afterNextRender,\n  assertInInjectionContext,\n  computed,\n  effect,\n  inject,\n  signal,\n} from '@angular/core'\nimport { toReactive } from './internal/to-reactive'\nimport type {\n  AnyClientTool,\n  InterruptDefinition,\n  InferSchemaType,\n  ModelMessage,\n  RunAgentResumeItem,\n  SchemaInput,\n  StreamChunk,\n} from '@tanstack/ai'\nimport type {\n  ChatClientState,\n  ResolvableChatInterrupt,\n  ChatInterruptState,\n  ChatResumeState,\n  ConnectionStatus,\n  InferredClientContext,\n  QueuedMessage,\n  SendMessageOptions,\n  StructuredOutputPart,\n} from '@tanstack/ai-client'\nimport type {\n  DeepPartial,\n  InjectChatOptions,\n  InjectChatResult,\n  MultimodalContent,\n  UIMessage,\n} from './types'\n\nconst EMPTY_INTERRUPTS = Object.freeze([])\nconst EMPTY_INTERRUPT_ERRORS = Object.freeze([])\n\nexport function injectChat<\n  const TTools extends ReadonlyArray<AnyClientTool> = any,\n  TSchema extends SchemaInput | undefined = undefined,\n  TContext = InferredClientContext<TTools>,\n  const TInterrupts extends ReadonlyArray<\n    InterruptDefinition<any, any, any, any>\n  > = readonly [],\n>(\n  options: InjectChatOptions<\n    TTools,\n    TSchema,\n    TContext,\n    TInterrupts\n  > = {} as InjectChatOptions<TTools, TSchema, TContext, TInterrupts>,\n): InjectChatResult<TTools, TSchema, TInterrupts> {\n  assertInInjectionContext(injectChat)\n\n  type Partial = DeepPartial<InferSchemaType<NonNullable<TSchema>>>\n  type Final = InferSchemaType<NonNullable<TSchema>>\n\n  const destroyRef = inject(DestroyRef)\n  const injector = inject(Injector)\n\n  const messages = signal<Array<UIMessage<TTools>>>(\n    options.initialMessages || [],\n  )\n  const isLoading = signal(false)\n  const error = signal<Error | undefined>(undefined)\n  const status = signal<ChatClientState>('ready')\n  const isSubscribed = signal(false)\n  const connectionStatus = signal<ConnectionStatus>('disconnected')\n  const sessionGenerating = signal(false)\n  const queue = signal<Array<QueuedMessage>>([])\n  const runId = signal<string | null>(null)\n  const interruptState = signal<ChatInterruptState<TTools, TInterrupts>>({\n    interrupts: EMPTY_INTERRUPTS,\n    pendingInterrupts: EMPTY_INTERRUPTS,\n    interruptErrors: EMPTY_INTERRUPT_ERRORS,\n    resuming: false,\n  })\n\n  // Reactive option sources. Plain values become constant computeds.\n  const bodySource =\n    options.body !== undefined ? toReactive(options.body) : undefined\n  const forwardedPropsSource =\n    options.forwardedProps !== undefined\n      ? toReactive(options.forwardedProps)\n      : undefined\n  const contextSource =\n    options.context !== undefined ? toReactive(options.context) : undefined\n  const liveSource =\n    options.live !== undefined ? toReactive(options.live) : undefined\n\n  const transport = options.connection\n    ? { connection: options.connection }\n    : { fetcher: options.fetcher }\n\n  const client = new ChatClient<TTools, TContext, TInterrupts>({\n    devtoolsBridgeFactory: createChatDevtoolsBridge,\n    ...transport,\n    ...(options.initialMessages !== undefined && {\n      initialMessages: options.initialMessages,\n    }),\n    ...(typeof options.threadId === 'string' && options.persistence\n      ? {\n          persistence: options.persistence,\n          threadId: options.threadId,\n        }\n      : {\n          ...(options.threadId !== undefined && { threadId: options.threadId }),\n        }),\n    ...(options.initialResumeSnapshot !== undefined && {\n      initialResumeSnapshot: options.initialResumeSnapshot,\n    }),\n    ...(bodySource !== undefined && { body: bodySource() }),\n    ...(forwardedPropsSource !== undefined && {\n      forwardedProps: forwardedPropsSource(),\n    }),\n    ...(options.byok !== undefined && { byok: options.byok }),\n    byokProvider: () => options.byokProvider?.(),\n    ...(contextSource !== undefined && { context: contextSource() }),\n    devtools: {\n      ...options.devtools,\n      framework: 'angular',\n      hookName: 'injectChat',\n      outputKind: options.outputSchema ? 'structured' : 'chat',\n    },\n    onResponse: (response) => options.onResponse?.(response),\n    onChunk: (chunk: StreamChunk) => options.onChunk?.(chunk),\n    onFinish: (message) => options.onFinish?.(message),\n    onError: (err) => options.onError?.(err),\n    onRunIdChange: (nextRunId) => runId.set(nextRunId),\n    // No `onResumeStateChange`: the run identity is surfaced as the `runId`\n    // signal (via `onRunIdChange`) and pending interrupts arrive through\n    // `onInterruptStateChange`, so there is nothing left for it to do — and it\n    // is not a public option here, matching the other framework packages.\n    onInterruptStateChange: (nextInterruptState, context) => {\n      interruptState.set(nextInterruptState)\n      options.onInterruptStateChange?.(nextInterruptState, context)\n    },\n    tools: options.tools,\n    ...(options.interrupts !== undefined && {\n      interrupts: options.interrupts,\n    }),\n    onCustomEvent: (eventType, data, context) =>\n      options.onCustomEvent?.(eventType, data, context),\n    ...(options.streamProcessor !== undefined && {\n      streamProcessor: options.streamProcessor,\n    }),\n    onMessagesChange: (m: Array<UIMessage<TTools>>) => messages.set(m),\n    onLoadingChange: (v: boolean) => isLoading.set(v),\n    onStatusChange: (v: ChatClientState) => status.set(v),\n    onErrorChange: (v: Error | undefined) => error.set(v),\n    onSubscriptionChange: (v: boolean) => isSubscribed.set(v),\n    onConnectionStatusChange: (v: ConnectionStatus) => connectionStatus.set(v),\n    onSessionGeneratingChange: (v: boolean) => sessionGenerating.set(v),\n    ...(options.queue !== undefined && { queue: options.queue }),\n    onQueueChange: (nextQueue: Array<QueuedMessage>) => queue.set(nextQueue),\n  })\n\n  messages.set(client.getMessages())\n  interruptState.set(client.getInterruptState())\n\n  // START TAILING HERE, not in the constructor. A client is idle until something\n  // attaches it, so a client that gets built and thrown away never opens a\n  // connection — an unreachable stream would hold one of the browser's ~6\n  // connections per origin until the page reloaded. `inject*` runs in an injection\n  // context tied to the consumer's lifetime, and `destroyRef.onDestroy` below is the\n  // matching `detach`.\n  client.attach()\n\n  // Sync reactive body / forwardedProps / context to the client.\n  if (bodySource || forwardedPropsSource || contextSource) {\n    effect(\n      () => {\n        const newBody = bodySource?.()\n        const newForwardedProps = forwardedPropsSource?.()\n        const newContext = contextSource?.()\n        client.updateOptions({\n          ...(newBody !== undefined && { body: newBody }),\n          ...(newForwardedProps !== undefined && {\n            forwardedProps: newForwardedProps,\n          }),\n          ...(newContext !== undefined && { context: newContext }),\n        })\n      },\n      { injector },\n    )\n  }\n\n  // Subscribe / unsubscribe based on reactive `live`.\n  if (liveSource) {\n    effect(\n      () => {\n        if (liveSource()) {\n          client.subscribe()\n        } else {\n          client.unsubscribe()\n        }\n      },\n      { injector },\n    )\n  }\n\n  afterNextRender(\n    () => {\n      client.mountDevtools()\n      // Delivery-durability resume is transparent: the resumable SSE\n      // connection adapter reattaches via the browser's native Last-Event-ID\n      // on reconnect. No client-side auto-resume wiring is needed.\n    },\n    { injector },\n  )\n\n  destroyRef.onDestroy(() => {\n    // Release the connection first: the counterpart of the `attach` above.\n    client.detach()\n    if (liveSource?.()) {\n      client.unsubscribe()\n    } else {\n      client.stop()\n    }\n    client.dispose()\n  })\n\n  // Active structured-output part = the one on the assistant message after the\n  // latest user message. Ported from ai-vue/src/use-chat.ts.\n  const activeStructuredPart = computed<StructuredOutputPart | null>(() => {\n    const list = messages()\n    let lastUserIndex = -1\n    for (let i = list.length - 1; i >= 0; i--) {\n      if (list[i]?.role === 'user') {\n        lastUserIndex = i\n        break\n      }\n    }\n    if (lastUserIndex === -1) return null\n    for (let i = list.length - 1; i > lastUserIndex; i--) {\n      const m = list[i]\n      if (m?.role !== 'assistant') continue\n      const part = m.parts.find(\n        (p): p is StructuredOutputPart => p.type === 'structured-output',\n      )\n      if (part) return part\n    }\n    return null\n  })\n\n  const partial = computed<Partial>(() => {\n    const part = activeStructuredPart()\n    if (!part) return {} as Partial\n    const v = part.partial ?? part.data\n    return (v ?? {}) as Partial\n  })\n\n  const final = computed<Final | null>(() => {\n    const part = activeStructuredPart()\n    if (!part || part.status !== 'complete') return null\n    return part.data as Final\n  })\n\n  const sendMessage = async (\n    content: string | MultimodalContent,\n    sendOptions?: SendMessageOptions,\n  ) => {\n    await client.sendMessage(content, undefined, sendOptions)\n  }\n  const cancelQueued = (id: string) => client.cancelQueued(id)\n  const append = async (message: ModelMessage | UIMessage<TTools>) => {\n    await client.append(message)\n  }\n  const reload = async () => {\n    await client.reload()\n  }\n  const stop = () => client.stop()\n  const clear = () => client.clear()\n  const setMessages = (m: Array<UIMessage<TTools>>) =>\n    client.setMessagesManually(m)\n  const addToolResult = async (result: {\n    toolCallId: string\n    tool: string\n    output: any\n    state?: 'output-available' | 'output-error'\n    errorText?: string\n  }) => {\n    await client.addToolResult(result)\n  }\n  const addToolApprovalResponse = async (response: {\n    id: string\n    approved: boolean\n  }) => {\n    await client.addToolApprovalResponse(response)\n  }\n  const interrupts = computed(() => interruptState().interrupts)\n  const pendingInterrupts = computed(() => interruptState().interrupts)\n  const interruptErrors = computed(() => interruptState().interruptErrors)\n  const resuming = computed(() => interruptState().resuming)\n  const resolveInterrupts = (\n    resolution:\n      | boolean\n      | ((\n          interrupt: ResolvableChatInterrupt<TTools, TInterrupts>,\n        ) => undefined),\n  ) => {\n    if (typeof resolution === 'boolean') {\n      client.resolveInterrupts(resolution)\n    } else {\n      client.resolveInterrupts(resolution)\n    }\n  }\n  const cancelInterrupts = () => client.cancelInterrupts()\n  const retryInterrupts = () => client.retryInterrupts()\n  const resumeInterruptsUnsafe = (\n    resumeItems: Array<RunAgentResumeItem>,\n    state?: ChatResumeState,\n  ) => client.resumeInterruptsUnsafe(resumeItems, state)\n\n  // oxlint-disable-next-line eslint-js/no-restricted-syntax -- return shape diverges from conditional InjectChatResult<TTools, TSchema>; TS can't structurally narrow the TSchema-gated partial/final signals\n  return {\n    messages: messages.asReadonly(),\n    sendMessage,\n    queue: queue.asReadonly(),\n    cancelQueued,\n    append,\n    reload,\n    stop,\n    isLoading: isLoading.asReadonly(),\n    error: error.asReadonly(),\n    status: status.asReadonly(),\n    isSubscribed: isSubscribed.asReadonly(),\n    connectionStatus: connectionStatus.asReadonly(),\n    sessionGenerating: sessionGenerating.asReadonly(),\n    setMessages,\n    clear,\n    addToolResult,\n    addToolApprovalResponse,\n    runId: runId.asReadonly(),\n    interrupts,\n    pendingInterrupts,\n    interruptErrors,\n    resuming,\n    resolveInterrupts,\n    cancelInterrupts,\n    retryInterrupts,\n    resumeInterruptsUnsafe,\n    partial,\n    final,\n  } as unknown as InjectChatResult<TTools, TSchema, TInterrupts>\n}\n","import {\n  DestroyRef,\n  assertInInjectionContext,\n  inject,\n  signal,\n} from '@angular/core'\nimport type { Signal } from '@angular/core'\nimport type { ByokClient, ByokSnapshot } from '@tanstack/ai-client/byok'\n\nexport function injectByok(client: ByokClient): Signal<ByokSnapshot> {\n  assertInInjectionContext(injectByok)\n  const destroyRef = inject(DestroyRef)\n  const snapshot = signal(client.getSnapshot())\n  const unsubscribe = client.subscribe(() => {\n    snapshot.set(client.getSnapshot())\n  })\n  destroyRef.onDestroy(unsubscribe)\n  return snapshot.asReadonly()\n}\n","import { GenerationClient } from '@tanstack/ai-client'\nimport { createGenerationDevtoolsBridge } from '@tanstack/ai-client/devtools'\nimport {\n  DestroyRef,\n  Injector,\n  afterNextRender,\n  assertInInjectionContext,\n  effect,\n  inject,\n  signal,\n} from '@angular/core'\nimport { toReactive } from './internal/to-reactive'\nimport type { Signal } from '@angular/core'\nimport type { StreamChunk } from '@tanstack/ai'\nimport type {\n  AIDevtoolsDisplayOptions,\n  ConnectConnectionAdapter,\n  GenerationClientOptions,\n  GenerationClientState,\n  GenerationFetcher,\n  GenerationPersistenceOptions,\n  GenerationRestoredResult,\n  InferGenerationOutputFromReturn,\n} from '@tanstack/ai-client'\nimport type { ByokClient } from '@tanstack/ai-client/byok'\nimport type { ProviderId } from '@tanstack/ai/byok'\nimport type { ReactiveOption } from './internal/to-reactive'\n\nexport interface InjectGenerationOptions<TInput, TResult, TOutput = TResult> {\n  /** Connect-based adapter for streaming transport (SSE, HTTP stream, custom) */\n  connection?: ConnectConnectionAdapter\n  /** Direct async function for one-shot generation (no streaming protocol needed) */\n  fetcher?: GenerationFetcher<TInput, TResult>\n  /** Additional request body params. Reactive. */\n  body?: ReactiveOption<Record<string, any>>\n  /** Optional BYOK keyring. Keys go in `x-byok-*` headers, never the body. */\n  byok?: ByokClient\n  /** Optional provider id. If it returns a slug, only that key is sent. If no slug resolves (`byokProvider`, then `body.provider`), generate throws. */\n  byokProvider?: () => ProviderId | undefined\n  /** Display options for TanStack AI Devtools. */\n  devtools?: AIDevtoolsDisplayOptions\n  /**\n   * How this generation persists across reloads.\n   * - Omit / `false`: ephemeral, in-memory only.\n   * - `true`: server-driven — on mount the client hydrates the last generation\n   *   for its `threadId` from the server (needs a connection with a\n   *   `hydrateGeneration` handler) and repaints it; it never auto-starts a run.\n   */\n  persistence?: boolean\n  /**\n   * The **scope** this generation belongs to: a stable, app-chosen name for the\n   * slot successive runs fill — not a link to a chat conversation.\n   *\n   * The hook starts empty and produces many runs over its life; each gets its\n   * own `runId`, but all belong to one scope. Persistence keys on this, so\n   * derive it from your own domain and keep it identical across reloads (e.g.\n   * `` `video-${videoId}-start-frame` ``). It is also sent as the AG-UI thread\n   * id on the wire, which the protocol requires.\n   *\n   * **Required whenever `persistence` is set** — an app that cannot name the\n   * scope has nothing to restore to. Optional for ephemeral generations. If\n   * omitted, the client mints a wire id after mount.\n   */\n  threadId?: string\n  /**\n   * Server-driven hydration handler for `persistence: true` when the\n   * connection doesn't carry one (e.g. alongside `fetcher`, or a `stream()` /\n   * `rpcStream()` adapter built without handlers) — typically a one-line\n   * server-function call. The connection's own handler takes precedence.\n   */\n  hydrateGeneration?: ConnectConnectionAdapter['hydrateGeneration']\n  /**\n   * Re-attach handler that replays a run still generating to completion on\n   * mount, when the connection doesn't carry one. Without it, a restored\n   * `running` snapshot surfaces as an (interrupted) error. The connection's\n   * own handler takes precedence.\n   */\n  joinRun?: ConnectConnectionAdapter['joinRun']\n  /**\n   * Callback when a result is received. Can optionally return a transformed value.\n   *\n   * - Return a non-null value to transform and store it as the result\n   * - Return `null` to keep the previous result unchanged\n   * - Return nothing (`void`) to store the raw result as-is\n   */\n  onResult?: (result: TResult) => TOutput | null | void\n  /** Callback when an error occurs */\n  onError?: (error: Error) => void\n  /** Callback when progress is reported (0-100) */\n  onProgress?: (progress: number, message?: string) => void\n  /** Callback for each stream chunk (connect-based adapter mode only) */\n  onChunk?: (chunk: StreamChunk) => void\n  /**\n   * @internal Rebuild a typed result from a restored snapshot, injected by each\n   * specialized injectable (image / speech / audio / transcription / summarize).\n   * Forwarded to the client so a server-hydrate restore repaints `result`.\n   */\n  reconstructResult?: (restored: GenerationRestoredResult) => TResult | null\n}\n\n/**\n * Return type for the injectGeneration function.\n *\n * @template TOutput - The output type (after optional transform)\n * @template TInput - The input type accepted by `generate` (defaults to any object)\n */\nexport interface InjectGenerationResult<\n  TOutput,\n  TInput extends Record<string, any> = Record<string, any>,\n> {\n  /** Trigger a generation request */\n  generate: (input: TInput) => Promise<void>\n  /** The generation result, or null if not yet generated */\n  result: Signal<TOutput | null>\n  /** Whether a generation is currently in progress */\n  isLoading: Signal<boolean>\n  /** Current error, if any */\n  error: Signal<Error | undefined>\n  /** Current state of the generation client */\n  status: Signal<GenerationClientState>\n  /** Abort the current generation */\n  stop: () => void\n  /** Clear result, error, and return to idle */\n  reset: () => void\n  /** Identity of the in-flight run while one is streaming, or null after it ends */\n  /**\n   * The id of the generation job currently running, or `null` when nothing is in\n   * flight. Each call to `generate` is one job with its own id. Pass it to your\n   * own endpoint to cancel or poll the provider job — `stop()` only aborts the\n   * local stream, it does not stop work already running on the provider.\n   */\n  runId: Signal<string | null>\n}\n\n// `TTransformed` infers from the `onResult` return position (a covariant\n// inference site that works even for an optional nested property), which types\n// the callback parameter as `TResult` and narrows `result`. Inferring the\n// whole callback as a defaulted type parameter instead collapses to the\n// default, leaving the parameter `any` — a hard error under `strict`. See\n// issue #848.\nexport function injectGeneration<\n  TInput extends Record<string, any>,\n  TResult,\n  TTransformed = void,\n>(\n  options: Omit<\n    InjectGenerationOptions<TInput, TResult>,\n    'onResult' | 'persistence' | 'threadId'\n  > & {\n    onResult?: (result: TResult) => TTransformed\n  } & GenerationPersistenceOptions,\n): InjectGenerationResult<\n  InferGenerationOutputFromReturn<TResult, TTransformed>,\n  TInput\n> {\n  assertInInjectionContext(injectGeneration)\n\n  type TOutput = InferGenerationOutputFromReturn<TResult, TTransformed>\n\n  const destroyRef = inject(DestroyRef)\n  const injector = inject(Injector)\n\n  const result = signal<TOutput | null>(null)\n  const isLoading = signal(false)\n  const error = signal<Error | undefined>(undefined)\n  const status = signal<GenerationClientState>('idle')\n  const runId = signal<string | null>(null)\n  let disposed = false\n\n  const bodySource =\n    options.body !== undefined ? toReactive(options.body) : undefined\n\n  const clientOptions: Omit<\n    GenerationClientOptions<TInput, TResult, TOutput>,\n    'persistence' | 'threadId'\n  > = {\n    ...(bodySource !== undefined && { body: bodySource() }),\n    ...(options.hydrateGeneration !== undefined && {\n      hydrateGeneration: options.hydrateGeneration,\n    }),\n    ...(options.joinRun !== undefined && { joinRun: options.joinRun }),\n    ...(options.byok !== undefined && { byok: options.byok }),\n    byokProvider: () => options.byokProvider?.(),\n    ...(options.reconstructResult\n      ? { reconstructResult: options.reconstructResult }\n      : {}),\n    devtoolsBridgeFactory: createGenerationDevtoolsBridge,\n    devtools: {\n      ...options.devtools,\n      framework: 'angular',\n      hookName: 'injectGeneration',\n    },\n    // The transform's raw return type (`TTransformed`) and the stored output\n    // (`TOutput`, with null/void/undefined stripped) are identical at runtime;\n    // the cast bridges the relationship that the conditional type hides.\n    onResult: ((r: TResult) => options.onResult?.(r)) as (\n      result: TResult,\n    ) => TOutput | null | void,\n    onError: (e: Error) => {\n      if (!disposed) options.onError?.(e)\n    },\n    onProgress: (p: number, m?: string) => {\n      if (!disposed) options.onProgress?.(p, m)\n    },\n    onChunk: (c: StreamChunk) => {\n      if (!disposed) options.onChunk?.(c)\n    },\n    onResultChange: (r: TOutput | null) => {\n      if (!disposed) result.set(r)\n    },\n    onLoadingChange: (l: boolean) => {\n      if (!disposed) isLoading.set(l)\n    },\n    onErrorChange: (e: Error | undefined) => {\n      if (!disposed) error.set(e)\n    },\n    onStatusChange: (s: GenerationClientState) => {\n      if (!disposed) status.set(s)\n    },\n    onResumeStateChange: (rs) => {\n      if (!disposed) runId.set(rs?.runId ?? null)\n    },\n  }\n\n  const persistenceProps =\n    typeof options.threadId === 'string' && options.persistence\n      ? {\n          persistence: options.persistence,\n          threadId: options.threadId,\n        }\n      : {\n          ...(options.threadId !== undefined && {\n            threadId: options.threadId,\n          }),\n        }\n\n  let client: GenerationClient<TInput, TResult, TOutput>\n  if (options.connection) {\n    client = new GenerationClient({\n      ...clientOptions,\n      ...persistenceProps,\n      connection: options.connection,\n    })\n  } else if (options.fetcher) {\n    client = new GenerationClient({\n      ...clientOptions,\n      ...persistenceProps,\n      fetcher: options.fetcher,\n    })\n  } else {\n    throw new Error(\n      'injectGeneration requires either a connection or fetcher option',\n    )\n  }\n\n  if (bodySource) {\n    effect(\n      () => {\n        client.updateOptions({\n          body: bodySource(),\n        })\n      },\n      { injector },\n    )\n  }\n\n  // Mount devtools only. Generation runs are never auto-started after render —\n  // persisted state is read-only for display.\n  afterNextRender(\n    () => {\n      client.mountDevtools()\n    },\n    { injector },\n  )\n  destroyRef.onDestroy(() => {\n    disposed = true\n    client.dispose()\n  })\n\n  return {\n    generate: (input: TInput) => client.generate(input),\n    result: result.asReadonly(),\n    isLoading: isLoading.asReadonly(),\n    error: error.asReadonly(),\n    status: status.asReadonly(),\n    stop: () => client.stop(),\n    reset: () => client.reset(),\n    runId: runId.asReadonly(),\n  }\n}\n","import { injectGeneration } from './inject-generation'\nimport { reconstructImageResult } from '@tanstack/ai-client'\nimport type { Signal } from '@angular/core'\nimport type { ImageGenerationResult } from '@tanstack/ai'\nimport type {\n  GenerationClientState,\n  GenerationPersistenceOptions,\n  ImageGenerateInput,\n  InferGenerationOutputFromReturn,\n} from '@tanstack/ai-client'\nimport type {\n  InjectGenerationOptions,\n  InjectGenerationResult,\n} from './inject-generation'\n\nexport type InjectGenerateImageOptions<TOutput = ImageGenerationResult> = Omit<\n  InjectGenerationOptions<ImageGenerateInput, ImageGenerationResult, TOutput>,\n  'onResult' | 'reconstructResult'\n> & {\n  onResult?: (result: ImageGenerationResult) => TOutput | null | void\n}\n\nexport interface InjectGenerateImageResult<\n  TOutput = ImageGenerationResult,\n> extends Omit<InjectGenerationResult<TOutput>, 'generate'> {\n  generate: (input: ImageGenerateInput) => Promise<void>\n  result: Signal<TOutput | null>\n  isLoading: Signal<boolean>\n  error: Signal<Error | undefined>\n  status: Signal<GenerationClientState>\n}\n\nexport function injectGenerateImage<TTransformed = void>(\n  options: Omit<\n    InjectGenerateImageOptions,\n    'onResult' | 'persistence' | 'threadId'\n  > & {\n    onResult?: (result: ImageGenerationResult) => TTransformed\n  } & GenerationPersistenceOptions,\n): InjectGenerateImageResult<\n  InferGenerationOutputFromReturn<ImageGenerationResult, TTransformed>\n> {\n  const devtools = {\n    ...options.devtools,\n    framework: 'angular' as const,\n    hookName: 'injectGenerateImage',\n    outputKind: 'image' as const,\n  }\n  const generation = injectGeneration<\n    ImageGenerateInput,\n    ImageGenerationResult,\n    TTransformed\n  >({\n    ...options,\n    devtools,\n    reconstructResult: reconstructImageResult,\n  })\n  return generation\n}\n","import { injectGeneration } from './inject-generation'\nimport { reconstructAudioResult } from '@tanstack/ai-client'\nimport type { AudioGenerationResult, StreamChunk } from '@tanstack/ai'\nimport type {\n  AIDevtoolsDisplayOptions,\n  AudioGenerateInput,\n  ConnectConnectionAdapter,\n  GenerationClientState,\n  GenerationFetcher,\n  GenerationPersistenceOptions,\n  InferGenerationOutputFromReturn,\n} from '@tanstack/ai-client'\nimport type { Signal } from '@angular/core'\nimport type { ReactiveOption } from './internal/to-reactive'\nimport type {\n  InjectGenerationOptions,\n  InjectGenerationResult,\n} from './inject-generation'\n\n/**\n * Options for the injectGenerateAudio injectable.\n *\n * @template TOutput - The output type after optional transform (defaults to AudioGenerationResult)\n */\nexport interface InjectGenerateAudioOptions<\n  TOutput = AudioGenerationResult,\n> extends Pick<\n  InjectGenerationOptions<AudioGenerateInput, AudioGenerationResult, TOutput>,\n  | 'persistence'\n  | 'threadId'\n  | 'hydrateGeneration'\n  | 'joinRun'\n  | 'byok'\n  | 'byokProvider'\n> {\n  /** Connect-based adapter for streaming transport (SSE, HTTP stream, custom) */\n  connection?: ConnectConnectionAdapter\n  /** Direct async function for audio generation */\n  fetcher?: GenerationFetcher<AudioGenerateInput, AudioGenerationResult>\n  /** Additional body parameters to send with connect-based adapter requests. Reactive. */\n  body?: ReactiveOption<Record<string, any>>\n  /** Display options for TanStack AI Devtools. */\n  devtools?: AIDevtoolsDisplayOptions\n  /**\n   * Callback when audio is generated. Can optionally return a transformed value.\n   *\n   * - Return a non-null value to transform and store it as the result\n   * - Return `null` to keep the previous result unchanged\n   * - Return nothing (`void`) to store the raw result as-is\n   */\n  onResult?: (result: AudioGenerationResult) => TOutput | null | void\n  /** Callback when an error occurs */\n  onError?: (error: Error) => void\n  /** Callback when progress is reported (0-100) */\n  onProgress?: (progress: number, message?: string) => void\n  /** Callback for each stream chunk (connect-based adapter mode only) */\n  onChunk?: (chunk: StreamChunk) => void\n}\n\n/**\n * Return type for the injectGenerateAudio injectable.\n *\n * @template TOutput - The output type (after optional transform)\n */\nexport interface InjectGenerateAudioResult<\n  TOutput = AudioGenerationResult,\n> extends Omit<InjectGenerationResult<TOutput>, 'generate'> {\n  /** Trigger audio generation */\n  generate: (input: AudioGenerateInput) => Promise<void>\n  /** The generation result containing audio, or null */\n  result: Signal<TOutput | null>\n  /** Whether generation is in progress */\n  isLoading: Signal<boolean>\n  /** Current error, if any */\n  error: Signal<Error | undefined>\n  /** Current state of the generation */\n  status: Signal<GenerationClientState>\n}\n\n/**\n * Angular injectable for generating audio (music, sound effects) using AI models.\n *\n * @example\n * ```typescript\n * import { Component } from '@angular/core'\n * import { injectGenerateAudio } from '@tanstack/ai-angular'\n * import { fetchServerSentEvents } from '@tanstack/ai-client'\n *\n * @Component({\n *   selector: 'app-audio',\n *   template: `\n *     <button (click)=\"generate({ prompt: 'An upbeat electronic track', duration: 10 })\">\n *       Generate\n *     </button>\n *     @if (result()) {\n *       <audio [src]=\"result()!.audio.url\" controls></audio>\n *     }\n *   `,\n * })\n * export class AudioComponent {\n *   private gen = injectGenerateAudio({\n *     connection: fetchServerSentEvents('/api/generate/audio'),\n *   })\n *\n *   generate = this.gen.generate\n *   result = this.gen.result\n *   isLoading = this.gen.isLoading\n * }\n * ```\n */\nexport function injectGenerateAudio<TTransformed = void>(\n  options: Omit<\n    InjectGenerateAudioOptions,\n    'onResult' | 'persistence' | 'threadId'\n  > & {\n    onResult?: (result: AudioGenerationResult) => TTransformed\n  } & GenerationPersistenceOptions,\n): InjectGenerateAudioResult<\n  InferGenerationOutputFromReturn<AudioGenerationResult, TTransformed>\n> {\n  const devtools = {\n    ...options.devtools,\n    framework: 'angular',\n    hookName: 'injectGenerateAudio',\n    outputKind: 'audio' as const,\n  }\n  const generation = injectGeneration<\n    AudioGenerateInput,\n    AudioGenerationResult,\n    TTransformed\n  >({\n    ...options,\n    devtools,\n    reconstructResult: reconstructAudioResult,\n  })\n\n  return generation\n}\n","import { injectGeneration } from './inject-generation'\nimport { reconstructSpeechResult } from '@tanstack/ai-client'\nimport type { Signal } from '@angular/core'\nimport type { TTSResult } from '@tanstack/ai'\nimport type {\n  GenerationClientState,\n  GenerationPersistenceOptions,\n  InferGenerationOutputFromReturn,\n  SpeechGenerateInput,\n} from '@tanstack/ai-client'\nimport type {\n  InjectGenerationOptions,\n  InjectGenerationResult,\n} from './inject-generation'\n\nexport type InjectGenerateSpeechOptions<TOutput = TTSResult> = Omit<\n  InjectGenerationOptions<SpeechGenerateInput, TTSResult, TOutput>,\n  'onResult' | 'reconstructResult'\n> & {\n  onResult?: (result: TTSResult) => TOutput | null | void\n}\n\nexport interface InjectGenerateSpeechResult<TOutput = TTSResult> extends Omit<\n  InjectGenerationResult<TOutput>,\n  'generate'\n> {\n  generate: (input: SpeechGenerateInput) => Promise<void>\n  result: Signal<TOutput | null>\n  isLoading: Signal<boolean>\n  error: Signal<Error | undefined>\n  status: Signal<GenerationClientState>\n}\n\nexport function injectGenerateSpeech<TTransformed = void>(\n  options: Omit<\n    InjectGenerateSpeechOptions,\n    'onResult' | 'persistence' | 'threadId'\n  > & {\n    onResult?: (result: TTSResult) => TTransformed\n  } & GenerationPersistenceOptions,\n): InjectGenerateSpeechResult<\n  InferGenerationOutputFromReturn<TTSResult, TTransformed>\n> {\n  const devtools = {\n    ...options.devtools,\n    framework: 'angular' as const,\n    hookName: 'injectGenerateSpeech',\n    outputKind: 'audio' as const,\n  }\n  const generation = injectGeneration<\n    SpeechGenerateInput,\n    TTSResult,\n    TTransformed\n  >({\n    ...options,\n    devtools,\n    reconstructResult: reconstructSpeechResult,\n  })\n  return generation\n}\n","import { injectGeneration } from './inject-generation'\nimport { reconstructTranscriptionResult } from '@tanstack/ai-client'\nimport type { Signal } from '@angular/core'\nimport type { TranscriptionResult } from '@tanstack/ai'\nimport type {\n  GenerationClientState,\n  GenerationPersistenceOptions,\n  InferGenerationOutputFromReturn,\n  TranscriptionGenerateInput,\n} from '@tanstack/ai-client'\nimport type {\n  InjectGenerationOptions,\n  InjectGenerationResult,\n} from './inject-generation'\n\nexport type InjectTranscriptionOptions<TOutput = TranscriptionResult> = Omit<\n  InjectGenerationOptions<\n    TranscriptionGenerateInput,\n    TranscriptionResult,\n    TOutput\n  >,\n  'onResult' | 'reconstructResult'\n> & {\n  onResult?: (result: TranscriptionResult) => TOutput | null | void\n}\n\nexport interface InjectTranscriptionResult<\n  TOutput = TranscriptionResult,\n> extends Omit<InjectGenerationResult<TOutput>, 'generate'> {\n  generate: (input: TranscriptionGenerateInput) => Promise<void>\n  result: Signal<TOutput | null>\n  isLoading: Signal<boolean>\n  error: Signal<Error | undefined>\n  status: Signal<GenerationClientState>\n}\n\nexport function injectTranscription<TTransformed = void>(\n  options: Omit<\n    InjectTranscriptionOptions,\n    'onResult' | 'persistence' | 'threadId'\n  > & {\n    onResult?: (result: TranscriptionResult) => TTransformed\n  } & GenerationPersistenceOptions,\n): InjectTranscriptionResult<\n  InferGenerationOutputFromReturn<TranscriptionResult, TTransformed>\n> {\n  const devtools = {\n    ...options.devtools,\n    framework: 'angular' as const,\n    hookName: 'injectTranscription',\n    outputKind: 'text' as const,\n  }\n  const generation = injectGeneration<\n    TranscriptionGenerateInput,\n    TranscriptionResult,\n    TTransformed\n  >({\n    ...options,\n    devtools,\n    reconstructResult: reconstructTranscriptionResult,\n  })\n  return generation\n}\n","import {\n  DestroyRef,\n  assertInInjectionContext,\n  inject,\n  signal,\n} from '@angular/core'\nimport { AudioRecorder } from '@tanstack/ai-client'\nimport type { Signal } from '@angular/core'\nimport type {\n  AudioRecorderOptions,\n  AudioRecording,\n  InferAudioRecordingOutput,\n} from '@tanstack/ai-client'\n\nexport type InjectAudioRecorderOptions<TOnComplete> = AudioRecorderOptions & {\n  /**\n   * Optional transform applied to the recording when `stop()` resolves. Its\n   * (awaited) return value becomes `recording` and the resolved value of\n   * `stop()`. Return nothing to keep the raw `AudioRecording`.\n   */\n  onComplete?: TOnComplete\n}\n\nexport interface InjectAudioRecorderResult<TOutput> {\n  /** Reactive: latest recording (transformed if `onComplete` provided), or null. */\n  recording: Signal<TOutput | null>\n  /** Reactive: true while actively capturing audio. */\n  isRecording: Signal<boolean>\n  /** Whether the browser supports recording. */\n  isSupported: boolean\n  start: () => Promise<void>\n  /** Stop and resolve with the completed recording (transformed if `onComplete` provided). */\n  stop: () => Promise<TOutput>\n  /** Discard the in-progress recording and release the mic. */\n  cancel: () => void\n}\n\n/**\n * Angular injectable for recording an audio message. The resolved recording\n * carries `.part` (for `injectChat`'s `sendMessage`) and `.base64` (for the\n * generation injectables). Must be called in an injection context.\n *\n * Errors are delivered via `onError`. `start()` and `stop()` also reject on\n * failure (and `stop()` rejects with `Recording cancelled` if `cancel()` runs\n * while a stop is in flight, e.g. on destroy) — handle one channel, not both.\n */\n// The transforming overload requires `onComplete`. Without that constraint an\n// options object carrying only unrelated keys (`injectAudioRecorder({ onError })`)\n// still matches it, `TOnComplete` infers as `unknown`, and `recording`/`stop()`\n// collapse to `unknown` — so passing any option would silently cost you the\n// `AudioRecording` type. Requiring it here sends those calls to the second\n// overload instead (issue #1001).\nexport function injectAudioRecorder<\n  TOnComplete extends (recording: AudioRecording) => unknown,\n>(\n  options: InjectAudioRecorderOptions<TOnComplete> & {\n    onComplete: TOnComplete\n  },\n): InjectAudioRecorderResult<InferAudioRecordingOutput<TOnComplete>>\nexport function injectAudioRecorder(\n  options?: InjectAudioRecorderOptions<undefined>,\n): InjectAudioRecorderResult<AudioRecording>\nexport function injectAudioRecorder(\n  options: InjectAudioRecorderOptions<\n    (recording: AudioRecording) => unknown\n  > = {},\n): InjectAudioRecorderResult<unknown> {\n  assertInInjectionContext(injectAudioRecorder)\n  const destroyRef = inject(DestroyRef)\n  const recorder = new AudioRecorder({\n    ...(options.audio !== undefined && { audio: options.audio }),\n    ...(options.mimeType !== undefined && { mimeType: options.mimeType }),\n    ...(options.onError !== undefined && { onError: options.onError }),\n  })\n  const isRecording = signal(false)\n  const recording = signal<unknown>(null)\n\n  const unsubscribe = recorder.subscribe((state) => {\n    isRecording.set(state === 'recording')\n  })\n  destroyRef.onDestroy(() => {\n    unsubscribe()\n    recorder.cancel()\n  })\n\n  const stop = async (): Promise<unknown> => {\n    const rawRecording = await recorder.stop()\n    const transformed = await options.onComplete?.(rawRecording)\n    // Only `undefined` (returning nothing) keeps the raw recording; a returned\n    // null is a real value, matching the inferred output type.\n    const output = transformed === undefined ? rawRecording : transformed\n    recording.set(output)\n    return output\n  }\n\n  return {\n    recording: recording.asReadonly(),\n    isRecording: isRecording.asReadonly(),\n    isSupported: AudioRecorder.isSupported(),\n    start: () => recorder.start(),\n    stop,\n    cancel: () => recorder.cancel(),\n  }\n}\n","import { injectGeneration } from './inject-generation'\nimport { reconstructSummarizeResult } from '@tanstack/ai-client'\nimport type { Signal } from '@angular/core'\nimport type { SummarizationResult } from '@tanstack/ai'\nimport type {\n  GenerationClientState,\n  GenerationPersistenceOptions,\n  InferGenerationOutputFromReturn,\n  SummarizeGenerateInput,\n} from '@tanstack/ai-client'\nimport type {\n  InjectGenerationOptions,\n  InjectGenerationResult,\n} from './inject-generation'\n\nexport type InjectSummarizeOptions<TOutput = SummarizationResult> = Omit<\n  InjectGenerationOptions<SummarizeGenerateInput, SummarizationResult, TOutput>,\n  'onResult' | 'reconstructResult'\n> & {\n  onResult?: (result: SummarizationResult) => TOutput | null | void\n}\n\nexport interface InjectSummarizeResult<\n  TOutput = SummarizationResult,\n> extends Omit<InjectGenerationResult<TOutput>, 'generate'> {\n  generate: (input: SummarizeGenerateInput) => Promise<void>\n  result: Signal<TOutput | null>\n  isLoading: Signal<boolean>\n  error: Signal<Error | undefined>\n  status: Signal<GenerationClientState>\n}\n\nexport function injectSummarize<TTransformed = void>(\n  options: Omit<\n    InjectSummarizeOptions,\n    'onResult' | 'persistence' | 'threadId'\n  > & {\n    onResult?: (result: SummarizationResult) => TTransformed\n  } & GenerationPersistenceOptions,\n): InjectSummarizeResult<\n  InferGenerationOutputFromReturn<SummarizationResult, TTransformed>\n> {\n  const devtools = {\n    ...options.devtools,\n    framework: 'angular' as const,\n    hookName: 'injectSummarize',\n    outputKind: 'text' as const,\n  }\n  const generation = injectGeneration<\n    SummarizeGenerateInput,\n    SummarizationResult,\n    TTransformed\n  >({\n    ...options,\n    devtools,\n    reconstructResult: reconstructSummarizeResult,\n  })\n  return generation\n}\n","import { VideoGenerationClient } from '@tanstack/ai-client'\nimport { createVideoDevtoolsBridge } from '@tanstack/ai-client/devtools'\nimport {\n  DestroyRef,\n  Injector,\n  afterNextRender,\n  assertInInjectionContext,\n  effect,\n  inject,\n  signal,\n} from '@angular/core'\nimport { toReactive } from './internal/to-reactive'\nimport type { Signal } from '@angular/core'\nimport type { ReactiveOption } from './internal/to-reactive'\nimport type {\n  AIDevtoolsDisplayOptions,\n  ConnectConnectionAdapter,\n  GenerationClientState,\n  GenerationFetcher,\n  GenerationPersistenceOptions,\n  InferGenerationOutputFromReturn,\n  VideoGenerateInput,\n  VideoGenerateResult,\n  VideoStatusInfo,\n} from '@tanstack/ai-client'\nimport type { ByokClient } from '@tanstack/ai-client/byok'\nimport type { ProviderId } from '@tanstack/ai/byok'\nimport type { StreamChunk } from '@tanstack/ai'\n\nexport interface InjectGenerateVideoOptions<TOutput = VideoGenerateResult> {\n  connection?: ConnectConnectionAdapter\n  fetcher?: GenerationFetcher<VideoGenerateInput, VideoGenerateResult>\n  body?: ReactiveOption<Record<string, any>>\n  /** Optional BYOK keyring. Keys go in `x-byok-*` headers, never the body. */\n  byok?: ByokClient\n  /** Optional provider id. If it returns a slug, only that key is sent. If no slug resolves (`byokProvider`, then `body.provider`), generate throws. */\n  byokProvider?: () => ProviderId | undefined\n  devtools?: AIDevtoolsDisplayOptions\n  /**\n   * How this generation persists across reloads.\n   * - Omit / `false`: ephemeral, in-memory only.\n   * - `true`: server-driven — on mount the client hydrates the last generation\n   *   for its `threadId` from the server (needs a connection with a\n   *   `hydrateGeneration` handler) and repaints it; it never auto-starts a run.\n   */\n  persistence?: boolean\n  /**\n   * The **scope** this generation belongs to: a stable, app-chosen name for the\n   * slot successive runs fill — not a link to a chat conversation.\n   *\n   * The hook starts empty and produces many runs over its life; each gets its\n   * own `runId`, but all belong to one scope. Persistence keys on this, so\n   * derive it from your own domain and keep it identical across reloads (e.g.\n   * `` `video-${videoId}-start-frame` ``). It is also sent as the AG-UI thread\n   * id on the wire, which the protocol requires.\n   *\n   * **Required whenever `persistence` is set** — an app that cannot name the\n   * scope has nothing to restore to. Optional for ephemeral generations. If\n   * omitted, the client mints a wire id after mount.\n   */\n  threadId?: string\n  /**\n   * Server-driven hydration handler for `persistence: true` when the\n   * connection doesn't carry one (e.g. alongside `fetcher`, or a `stream()` /\n   * `rpcStream()` adapter built without handlers) — typically a one-line\n   * server-function call. The connection's own handler takes precedence.\n   */\n  hydrateGeneration?: ConnectConnectionAdapter['hydrateGeneration']\n  /**\n   * Re-attach handler that replays a run still generating to completion on\n   * mount, when the connection doesn't carry one. Without it, a restored\n   * `running` snapshot surfaces as an (interrupted) error. The connection's\n   * own handler takes precedence.\n   */\n  joinRun?: ConnectConnectionAdapter['joinRun']\n  onResult?: (result: VideoGenerateResult) => TOutput | null | void\n  onError?: (error: Error) => void\n  onProgress?: (progress: number, message?: string) => void\n  onJobCreated?: (jobId: string) => void\n  onStatusUpdate?: (status: VideoStatusInfo) => void\n  onChunk?: (chunk: StreamChunk) => void\n}\n\nexport interface InjectGenerateVideoResult<TOutput = VideoGenerateResult> {\n  generate: (input: VideoGenerateInput) => Promise<void>\n  result: Signal<TOutput | null>\n  jobId: Signal<string | null>\n  videoStatus: Signal<VideoStatusInfo | null>\n  isLoading: Signal<boolean>\n  error: Signal<Error | undefined>\n  status: Signal<GenerationClientState>\n  stop: () => void\n  reset: () => void\n  /**\n   * The id of the generation job currently running, or `null` when nothing is in\n   * flight. Each call to `generate` is one job with its own id. Pass it to your\n   * own endpoint to cancel or poll the provider job — `stop()` only aborts the\n   * local stream, it does not stop work already running on the provider.\n   */\n  runId: Signal<string | null>\n}\n\n// `TTransformed` infers from the `onResult` return position so the callback\n// parameter is typed as `VideoGenerateResult` and `result` narrows to the\n// transform's return. See issue #848.\nexport function injectGenerateVideo<TTransformed = void>(\n  options: Omit<\n    InjectGenerateVideoOptions,\n    'onResult' | 'persistence' | 'threadId'\n  > & {\n    onResult?: (result: VideoGenerateResult) => TTransformed\n  } & GenerationPersistenceOptions,\n): InjectGenerateVideoResult<\n  InferGenerationOutputFromReturn<VideoGenerateResult, TTransformed>\n> {\n  assertInInjectionContext(injectGenerateVideo)\n\n  type TOutput = InferGenerationOutputFromReturn<\n    VideoGenerateResult,\n    TTransformed\n  >\n\n  const destroyRef = inject(DestroyRef)\n  const injector = inject(Injector)\n\n  const result = signal<TOutput | null>(null)\n  const jobId = signal<string | null>(null)\n  const videoStatus = signal<VideoStatusInfo | null>(null)\n  const isLoading = signal(false)\n  const error = signal<Error | undefined>(undefined)\n  const status = signal<GenerationClientState>('idle')\n  const runId = signal<string | null>(null)\n  let disposed = false\n\n  const bodySource =\n    options.body !== undefined ? toReactive(options.body) : undefined\n\n  const baseOptions = {\n    ...(bodySource !== undefined && { body: bodySource() }),\n    ...(typeof options.threadId === 'string' && options.persistence\n      ? {\n          persistence: options.persistence,\n          threadId: options.threadId,\n        }\n      : {\n          ...(options.threadId !== undefined && {\n            threadId: options.threadId,\n          }),\n        }),\n    ...(options.hydrateGeneration !== undefined && {\n      hydrateGeneration: options.hydrateGeneration,\n    }),\n    ...(options.joinRun !== undefined && { joinRun: options.joinRun }),\n    ...(options.byok !== undefined && { byok: options.byok }),\n    byokProvider: () => options.byokProvider?.(),\n    devtoolsBridgeFactory: createVideoDevtoolsBridge,\n    devtools: {\n      ...options.devtools,\n      framework: 'angular',\n      hookName: 'injectGenerateVideo',\n      outputKind: 'video' as const,\n    },\n    // The transform's raw return type (`TTransformed`) and the stored output\n    // (`TOutput`, with null/void/undefined stripped) are identical at runtime;\n    // the cast bridges the relationship that the conditional type hides.\n    onResult: ((r: VideoGenerateResult) => options.onResult?.(r)) as (\n      result: VideoGenerateResult,\n    ) => TOutput | null | void,\n    onError: (e: Error) => {\n      if (!disposed) options.onError?.(e)\n    },\n    onProgress: (p: number, m?: string) => {\n      if (!disposed) options.onProgress?.(p, m)\n    },\n    onChunk: (c: StreamChunk) => {\n      if (!disposed) options.onChunk?.(c)\n    },\n    onJobCreated: (id: string) => {\n      if (!disposed) options.onJobCreated?.(id)\n    },\n    onStatusUpdate: (s: VideoStatusInfo) => {\n      if (!disposed) options.onStatusUpdate?.(s)\n    },\n    onResultChange: (r: TOutput | null) => {\n      if (!disposed) result.set(r)\n    },\n    onLoadingChange: (l: boolean) => {\n      if (!disposed) isLoading.set(l)\n    },\n    onErrorChange: (e: Error | undefined) => {\n      if (!disposed) error.set(e)\n    },\n    onStatusChange: (s: GenerationClientState) => {\n      if (!disposed) status.set(s)\n    },\n    onJobIdChange: (id: string | null) => {\n      if (!disposed) jobId.set(id)\n    },\n    onVideoStatusChange: (s: VideoStatusInfo | null) => {\n      if (!disposed) videoStatus.set(s)\n    },\n    onResumeStateChange: (rs: { runId: string } | null) => {\n      if (!disposed) runId.set(rs?.runId ?? null)\n    },\n  }\n\n  let client: VideoGenerationClient<TOutput>\n  if (options.connection) {\n    client = new VideoGenerationClient({\n      ...baseOptions,\n      connection: options.connection,\n    })\n  } else if (options.fetcher) {\n    client = new VideoGenerationClient({\n      ...baseOptions,\n      fetcher: options.fetcher,\n    })\n  } else {\n    throw new Error(\n      'injectGenerateVideo requires either a connection or fetcher option',\n    )\n  }\n\n  if (bodySource) {\n    effect(\n      () => {\n        client.updateOptions({\n          body: bodySource(),\n        })\n      },\n      { injector },\n    )\n  }\n\n  // Mount devtools only. Generation runs are never auto-started after render —\n  // persisted state is read-only for display.\n  afterNextRender(\n    () => {\n      client.mountDevtools()\n    },\n    { injector },\n  )\n  destroyRef.onDestroy(() => {\n    disposed = true\n    client.dispose()\n  })\n\n  return {\n    generate: (input: VideoGenerateInput) => client.generate(input),\n    result: result.asReadonly(),\n    jobId: jobId.asReadonly(),\n    videoStatus: videoStatus.asReadonly(),\n    isLoading: isLoading.asReadonly(),\n    error: error.asReadonly(),\n    status: status.asReadonly(),\n    stop: () => client.stop(),\n    reset: () => client.reset(),\n    runId: runId.asReadonly(),\n  }\n}\n","// Chat\nexport { injectChat } from './inject-chat'\nexport { injectByok } from './inject-byok'\n\n// Generation\nexport { injectGeneration } from './inject-generation'\nexport type {\n  InjectGenerationOptions,\n  InjectGenerationResult,\n} from './inject-generation'\n\n// Generate Image\nexport { injectGenerateImage } from './inject-generate-image'\nexport type {\n  InjectGenerateImageOptions,\n  InjectGenerateImageResult,\n} from './inject-generate-image'\n\n// Generate Audio\nexport { injectGenerateAudio } from './inject-generate-audio'\nexport type {\n  InjectGenerateAudioOptions,\n  InjectGenerateAudioResult,\n} from './inject-generate-audio'\n\n// Generate Speech\nexport { injectGenerateSpeech } from './inject-generate-speech'\nexport type {\n  InjectGenerateSpeechOptions,\n  InjectGenerateSpeechResult,\n} from './inject-generate-speech'\n\n// Transcription\nexport { injectTranscription } from './inject-transcription'\nexport type {\n  InjectTranscriptionOptions,\n  InjectTranscriptionResult,\n} from './inject-transcription'\n\n// Audio Recorder\nexport { injectAudioRecorder } from './inject-audio-recorder'\nexport type {\n  InjectAudioRecorderOptions,\n  InjectAudioRecorderResult,\n} from './inject-audio-recorder'\n\n// Summarize\nexport { injectSummarize } from './inject-summarize'\nexport type {\n  InjectSummarizeOptions,\n  InjectSummarizeResult,\n} from './inject-summarize'\n\n// Generate Video\nexport { injectGenerateVideo } from './inject-generate-video'\nexport type {\n  InjectGenerateVideoOptions,\n  InjectGenerateVideoResult,\n} from './inject-generate-video'\n\n// Types from ./types\nexport type {\n  DeepPartial,\n  InjectChatOptions,\n  InjectChatResult,\n  UIMessage,\n  ChatRequestBody,\n  MultimodalContent,\n  QueueConfig,\n  QueuedMessage,\n  QueueOption,\n  QueueStrategy,\n  SendMessageOptions,\n  WhenBusy,\n  ReactiveOption,\n} from './types'\n\n// Re-export from @tanstack/ai-client for convenience\nexport {\n  fetchServerSentEvents,\n  localStoragePersistence,\n  sessionStoragePersistence,\n  indexedDBPersistence,\n  StorageUnavailableError,\n  type ChatClientPersistence,\n  type ChatPersistedState,\n  type ChatPersistenceOption,\n  type ChatStorageAdapter,\n  type WebStoragePersistenceOptions,\n  type IndexedDBPersistenceOptions,\n  fetchHttpStream,\n  xhrServerSentEvents,\n  xhrHttpStream,\n  stream,\n  rpcStream,\n  webSocket,\n  createChatClientOptions,\n  type ConnectionAdapter,\n  type ConnectConnectionAdapter,\n  type SubscribeConnectionAdapter,\n  type RunAgentInputContext,\n  type FetchConnectionOptions,\n  type XhrConnectionOptions,\n  type WebSocketConnectionOptions,\n  type InferChatMessages,\n  type GenerationClientState,\n  type ImageGenerateInput,\n  type AudioGenerateInput,\n  type SpeechGenerateInput,\n  type TranscriptionGenerateInput,\n  type SummarizeGenerateInput,\n  type VideoGenerateInput,\n  type VideoGenerateResult,\n  type VideoStatusInfo,\n} from '@tanstack/ai-client'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}