What changed, release by release.
Every release's mods API against the one before it: which nouns, verbs, events and types it added, which it removed, and which changed shape, with the lines that moved. A removal is marked breaking; a change that took something out may break a mod; one that only added to a shape is marked extended.
v2.1.260
+26 added · 0 removed · 11 changed · 11 docs only since 2.1.259The engine
-
Commands on the host, run as the user the session runs as. CLI only.
-
Runs a command on the host by its argument vector (no shell) and resolves
{ exitCode, stdout, stderr }once it exits, any exit code.
Events
-
Fires when an
Inputa render hook drew changes or is submitted;eis{ plugin, element, component, surface, kind, value }. -
{ element, value }: the field whose handler the input reached, and the text it received. -
Fires when a
Selecta render hook drew is picked from;eis{ plugin, element, component, surface, value }. -
{ element, value }: the picker whose handler the pick reached, and the value it received.
Types
-
The element constructors each surface draws, by
e.surface: what$.ui.resolve(e)resolves to, and what aui.resolvehook passes on.div: ElementConstructor<DomProps>; span: ElementConstructor<DomProps>; b: ElementConstructor<DomProps>; Button: ElementConstructor<ButtonProps>; Input: ElementConstructor<InputProps>; Select: ElementConstructor<SelectProps>; Link: ElementConstructor<LinkProps>; }; desktop: { div: ElementConstructor<DomProps>;… b: ElementConstructor<DomProps>; Box: ElementConstructor<BoxProps>; Text: ElementConstructor<TextProps>; Button: ElementConstructor<ButtonProps>; Input: ElementConstructor<InputProps>; Select: ElementConstructor<SelectProps>; Svg: ElementConstructor<SvgProps>; Link: ElementConstructor<LinkProps>; };}; -
The events as calls on
$, one signature each:$.<noun>.<event>(input)takes the event's input and resolves to its result, from either side.export type EventCalls = { tool: { call: (input: ToolCallArgs) => Promise<ToolCallResult>; call: ToolCallOverloads; describe: (input: ToolDescribeInput) => Promise<ToolDescribeResult>; }; prompt: { -
span: DomProps & { children?: Children } b: DomProps & { children?: Children } Svg: SvgProps Link: LinkProps & { children?: Children } Button: { key?: string label?: string… onPress: () => void children?: string } Input: InputProps Select: SelectProps } interface ElementChildrenAttribute { children: unknown -
The rest of the chain, as one hook receives it: made once per dispatch per hook, frozen;
next(e)resolves to the downstream result.} = { [K in N]: Args<K>;}> = { <T extends string>(e: E & ToolNamed<T>): Promise<NextResultFor<N, O, T>>; (e: E): Promise<O>; readonly signal: AbortSignal; readonly is: <M extends N>(name: M, e: unknown) => e is S[M]; -
What each call on
$answers (thevalueof its event's result), by event name.'store.delete': void; 'store.keys': string[]; 'http.fetch': HttpResponse; 'process.run': ProcessRunResult;}; -
What a render hook returns, and what
next(e)resolves to: a plain-data tree of elements, strings allowed as children of Text and Box.handle: number; };} | { type: 'Input'; props: { key: string; label?: string; placeholder?: string; value?: string; submitLabel?: string; }; press: { plugin: string; handle: number; }; children?: undefined;} | { type: 'Select'; props: { key: string; label?: string; options: readonly SelectOption[]; value?: string; }; press: { plugin: string; handle: number; }; children?: undefined;} | { type: 'Link'; props: LinkProps; children?: RenderNode[];} | { type: 'Svg'; props: SvgProps; children?: undefined; -
The plain-data props of each renderable component, as
ui.rendersees them undere.props; a hook rewrites them withnext({ ...e, props }).firstOfReply: boolean; }; ToolUse: { tool_use_id: string; toolName: string; input: unknown; running: boolean;… output?: unknown; }; ToolResult: { tool_use_id: string; toolName: string; output: unknown; errored: boolean;… AbovePrompt: { hasSurvey: boolean; isWorking: boolean; maxRows: number; };}; -
What a
tool.callhook returns and whatnext(e)and$.tool.call(input)resolve to: the tool's result ({ result, context? }) or{ deny }.export type ToolCallResult = {export type ToolCallResult<Name extends string = string> = { deny: string; result?: undefined; context?: undefined;… text?: undefined; isError?: undefined;} | { result: unknown; result: ToolResultOf<Name>; context?: readonly string[]; ref?: number; text?: string; isError?: true; isError?: undefined; deny?: undefined;} | { isError: true; result: unknown; text?: string; ref?: number; context?: readonly string[]; deny?: undefined;}; -
One tool call of a ToolGroup, as
ui.rendersees it undercalls.export type ToolGroupCall = { tool_use_id?: string; toolName: string; input: unknown; running: boolean; -
One tool_result block of a user message.
id: string; text: string; isError: boolean; result?: unknown;}; -
One tool_use block of an assistant message, with its outcome once the transcript holds the call's tool_result (paired by
id).id: string; name: string; input: Record<string, unknown>; result?: unknown; text?: string; isError?: true;}; -
What an Agent call a plugin raised (
$.tool.call({ tool: "Agent", ... })) answers asresultonce the agent settles;textis its final answer. -
The structured result of each built-in tool by name, for declaration merging; empty until a declaration file adds entries, then after
e.tool === "Bash"theresultofnext(e)is Bash's record. -
The props of
Button, every surface's pressable leaf: an address, a label, and the closure a press runs. - added
Inputconst<Input key="reply" onSubmit={text => ...} />: a one-line text field; a change and Enter raiseui.inputwithe.elementthe key,e.kindwhich ande.valuethe text. -
The props of
Input, every surface's one-line text field: an address, optional texts, and the closures a change and a submit run. A leaf. - added
Linkconst<Link href="https://...">label</Link>: a hyperlink; an OSC-8 span on the terminal, an anchor on the desktop. -
The props of
Link, a hyperlink both surfaces draw: an OSC 8 span on the terminal (else its text then the URL in dim), an anchor on desktop. -
What
next(e)resolves to oncee.toolis the literalT: ontool.callthe result typed for that tool; on every other event,Oas declared. -
Options of
$.process.run. -
What
$.process.runresolves with once the child has exited. -
<Select key="peer" options={[...]} onSelect={value => ...} />: a one-of-several picker; a pick raisesui.selectwithe.elementthe key ande.valuethe option's value. -
One option of a
Select: the valueonSelectandui.selectcarry, and the text drawn for it (the value when absent). -
The props of
Select, every surface's one-of-several picker: an address, a label, the options, the one selected, the closure a pick runs. A leaf. -
$.tool.call(input): resolves withresulttyped for the toolinputnames (ToolCallResult), or loosely for an input that names none literally. -
An input that names its tool as the literal
T: whatnextand$.tool.callread to type the call's result per tool (NextResultFor). -
The structured result of the tool named
Name: its BuiltinToolResults entry for a built-in tool, elseunknown. -
The argument of
ui.input: a change of, or a submit from, anInputa render hook drew. Flat and frozen like every event's. -
What a
ui.inputhook returns and whatnext(e)resolves to. -
The argument of
ui.select: a pick from aSelecta render hook drew. Flat and frozen like every event's. -
What a
ui.selecthook returns and whatnext(e)resolves to.
11 docs only: reworded, same shape
$.http.fetchverbFetches
urlthrough the host (never the plugin's own network) and resolves{ status, ok, headers, text }once the body is read.$.model.classifyverbPicks one of
labelsfortextwith one completion over$.model.completeand a fixed classifier prompt.$.session.messagesverbReturns the transcript so far, one entry per user or assistant message; progress rows,
$.ui.loglines and notices are not messages.$.tool.registerverbDeclares a tool the model can call from the next prompt on: the name, description and input schema of
mcp__<plugin>__<name>.session.starteventFires once per process for each loaded plugin, before the first prompt, and again for one that loads or reloads later;
next(e)is{ cwd }.ui.rendereventFires when the engine is about to draw a component: once per input value (props, viewport width), plugin load or
$.ui.invalidate("ui.render").AgentSpawnInputtypeThe input of
agent.spawn(agent-spawn/): what the Agent tool decided about the subagent it is about to start, before its model is resolved.PluginOptionstypeA plugin's options as
register(on, options)receives them: the values of the fields its manifest'suserConfigdeclares, defaults filled in.PromptOrigintypeWhere a
prompt.submitsubmission came from, as the engine knows it at the site it was queued from; a closed set, never a text prefix.PromptSubmitInputtypeThe input of
prompt.submit(prompt-submit/): the prompt as typed, after the input became a user message and before the turn starts.SessionMessagetypeOne message of the transcript as
$.session.messages()returns it.
v2.1.259
The first published surfaceThe first surface the pipeline mined, so nothing here is a change: 44 verbs on 14 nouns, 31 events and 186 types. A symbol whose stamp says it was in the first published surface was already here.