File size: 1,644 Bytes
4e23b01 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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<C> {
readonly fallbackTool?: C;
}
export class ViewRegistry<C = unknown> {
readonly #toolRenderers = new Map<string, C>();
readonly #inputRenderers = new Map<string, C>();
readonly #markerRenderers = new Map<string, C>();
readonly #fallbackTool: C | undefined;
constructor(options: ViewRegistryOptions<C> = {}) {
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);
}
}
|