API signature
registerSurface returns a cleanup function. Call it to remove the surface registration and trigger a re-render.
Available slots
| Slot | Location |
|---|---|
app.overlay | Full application overlay |
chat.top | Under the chat top bar |
chat.empty | Empty-conversation surface |
chat.list.start | Before committed messages |
chat.list.end | After messages and pending work |
chat.composer.top | Directly above the composer |
settings.hub | Top of the settings hub |
drawer | Conversation drawer |
SurfaceDefinition fields
Unique identifier for this surface registration. Aether uses this to track and de-duplicate registrations from the same extension.
Controls the rendering order when multiple extensions register the same slot. Lower values render first. Defaults to
0 when omitted.A factory function that receives a render context and returns a
ui node tree. The function may be synchronous or async.Render context
Aether passes the following fields to yourrender function on every render cycle:
| Field | Type | Description |
|---|---|---|
is_running | boolean | Whether the agent is currently generating a response |
draft_input | string | The current text in the composer input |
storage | object | A snapshot of your extension’s persisted storage at render time |
Example
index.ts
Call
aether.invalidate() to force a re-render of all surfaces when your extension’s internal state changes. Aether does not automatically re-render surfaces on arbitrary extension-side mutations — only on storage writes, action invocations, and explicit invalidation.