glrs
    Preparing search index...

    Type Alias Ui

    type Ui = {
        capture: (spec: Capture) => { close: () => void; repaint: () => void };
        mount: (spec: MountSpec) => { close: () => void; repaint: () => void };
        notify: (message: string, tone?: Tone) => void;
        setInput: (text: string) => void;
        setTheme: (theme: Partial<Record<Tone, string>>) => { restore: () => void };
    }
    Index
    capture: (spec: Capture) => { close: () => void; repaint: () => void }

    Take over the composer area: draw your own lines there and receive every key, until you call close().

    This is the whole of glrs's input primitive, and it is deliberately the only one. There was an ask, a select, a confirm and an input here, which meant the core had an opinion about what a question looks like — a 234-line widget lived in the renderer for the sake of one tool, and the "generic" helpers around it were parsing the JSON that tool returned to the model. A coding agent's core does not need to know what asking is.

    The bundled ask-user extension is a question widget written against nothing but this. A picker, a form, a diff viewer are the same amount of work, and none of them is privileged over yours.

    mount: (spec: MountSpec) => { close: () => void; repaint: () => void }

    Mount a custom editor, widget, header, footer, or overlay.

    notify: (message: string, tone?: Tone) => void

    Show a transient or transcript-backed notification.

    setInput: (text: string) => void

    Put text in the composer, ready to edit.

    setTheme: (theme: Partial<Record<Tone, string>>) => { restore: () => void }

    Override theme colors until the returned handle restores them.