import type { ToolCallFrame } from '../model/frame'; import type { TranscriptTask } from '../model/task'; import type { TurnOrigin } from '../model/turn'; export interface ToolViewContext { readonly frame: ToolCallFrame; readonly task?: TranscriptTask; } export interface InputViewContext { readonly origin: TurnOrigin; readonly prompt?: string; } export interface MarkerViewContext { readonly marker: string; readonly payload?: unknown; } export interface ViewRegistryOptions { readonly fallbackTool?: C; } export class ViewRegistry { readonly #toolRenderers = new Map(); readonly #inputRenderers = new Map(); readonly #markerRenderers = new Map(); readonly #fallbackTool: C | undefined; constructor(options: ViewRegistryOptions = {}) { this.#fallbackTool = options.fallbackTool; } registerTool(key: string, renderer: C): this { this.#toolRenderers.set(key.toLowerCase(), renderer); return this; } registerInput(originKind: string, renderer: C): this { this.#inputRenderers.set(originKind, renderer); return this; } registerMarker(marker: string, renderer: C): this { this.#markerRenderers.set(marker, renderer); return this; } resolveTool(frame: ToolCallFrame): C | undefined { const key = (frame.view ?? frame.name).toLowerCase(); return this.#toolRenderers.get(key) ?? this.#fallbackTool; } resolveInput(origin: TurnOrigin): C | undefined { return this.#inputRenderers.get(origin.kind); } resolveMarker(marker: string): C | undefined { return this.#markerRenderers.get(marker); } }