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);
  }
}