Frontend components (agency-ui)
agency-ui maps each schema type string to a Vue component via
componentRegistry in src/renderer/registry.ts. UiRenderer looks up
node.type and renders recursively.
Source of truth for the type list is that registry (and src/schema/ui.ts).
This page summarises what each registration is for.
Self-rendering types
These nodes iterate children themselves (no default child slot from
UiRenderer): page, split, desktop, window.
Layout
Schema |
Vue component |
Role |
|---|---|---|
|
|
Top-level page chrome |
|
|
Generic panel container |
|
|
Padded content region |
|
|
Splitpanes (see UI Schema for |
|
|
Side navigation region |
|
|
Toolbar strip |
|
|
Menu container |
|
|
Single menu entry |
Primitives
Schema |
Vue component |
Role |
|---|---|---|
|
|
Card surface with optional title |
|
|
Button; optional |
|
|
One mission instance ( |
|
|
Progress / indeterminate bar |
|
|
Plain text |
|
|
Markdown body |
Desktop chrome
Schema |
Vue component |
Role |
|---|---|---|
|
|
Root desktop surface (icons + floating windows) |
|
|
Desktop launcher icon |
|
|
Registers window state; hosts child schema |
|
|
Schema stub (no UI; kept for fixtures compatibility) |
(chrome) |
|
128×128 agent portrait + CSS overlay (eyes / mouth). Moods: idle, thinking, speaking (South Park jaw). First desktop icon (chrome, not schema) and Agents explorer. Not a schema node. |
Window chrome (not schema types)
Native Vue MDI — no WinBox. State lives in Pinia windowsStore
(agency-ui/src/stores/windows.ts). Chrome pose (z / rotation /
scale) is on the store + desktop snapshot, not overlay. DSM
desktop.projection flat | perspective is a thin 3D stage (drawer
/ deck / Options). In perspective the seat is an FPS helm: triple glass
2 · 1 · 3, world origin at the center pane’s bottom edge, identity
camera { x: 0, y: -400, z: 72 }. WASD walks; Space is mouselook +
pointer lock (no RMB look); wheel is head height; Ctrl crouches from
the current Y. Sit / Home resets the camera and does not move windows.
There is no desk, orbit gizmo, or pistol mode. Windows carry
screen (left / center / right) and hop on release past a hinge.
2D minimize is a top-right
quarter-width column (the stack scales if it does not fit); 3D minimize
is a bottom carousel. Min / restore / maximize interpolate left /
top / size / scale.
Restore seeds minimized before openAddress so F5 does not dump
shelved windows back onto the desktop.
The body is transform-style: flat. Wheel on maximize changes chrome
pose.scale (CSS 3D, origin center) 5%, anchored on the cursor so the
window grows under the mouse, never larger than the viewport. On F5 a
window under the app bar is pushed down; overflow on two sides pins to
those edges. Scale is in the desktop snapshot.
Mosaic (tileMosaic) lays out every open window in a CCTV grid; the
active window gets the featured pane.
Component |
File |
Role |
|---|---|---|
|
|
Title bar, drag, resize, min / max / close |
|
|
Open-window list for the shell drawer (Windows tab) |
|
|
Drawer profile (48px avatar + name) + Media preview |
|
|
Theme, mosaic, 3D stage, labeled Install |
|
|
App-bar System icon: channel glyph (two PCs) while idle; REST / telemetry glyphs during recent activity. Click opens System. |
|
|
Drawer Inbox tab (pending HITL; opens reply dialog) |
|
|
External links in |
|
|
Pointer drag on the title bar |
Lifecycle (persistent windows):
State |
Meaning |
|---|---|
|
|
floating |
|
maximized |
Same chrome as mobile: fills below the app bar, no window title bar, title + min/close in the app bar (desktop also has restore). Flat app bar (no shadow). Only one maximized window. |
minimized |
2D: top-right shelf (¼ width). 3D: bottom carousel. Listed dimmed in the drawer. |
Ephemeral windows (props.ephemeral) are removed from schema + store on close.
Typography — the Agency desktop uses a compact scale inside window bodies:
13px body, 12px labels/captions (styles/main.scss, styles/explorer.scss).
System pane toolbars use icon-only actions with title tooltips.
Explorer form styling
Shared field chrome lives in agency-ui/src/styles/explorer.scss (imported
from main.scss). Do not add per-component scoped CSS for Vuetify
v-text-field / v-select / v-textarea sizing in explorers or admin
windows — use the markup hooks below so every surface matches.
Hook class |
Use |
|---|---|
|
Root on list+ficha explorers (Agents, Missions, Models, …). Layout:
|
|
Shared 40px header / footer ( |
|
Right-hand CRUD column. Flex column; children are full-width Vuetify
fields with |
|
Sidebar toolbar, 40px (same as window tabs). |
|
Top-bar run cluster, right side, hide-detail last. Photos: Open in Media. Missions: Agent (plain) + play. Agents: Chat. Tools: Sync (icon). Selected title in the chrome-bar title slot. |
|
Fixed-width filter select in a horizontal toolbar (Executions). |
|
Two-column grid row inside |
|
|
|
Multi-select with chips (Tools); natural height, wraps chips. |
|
Admin Options and similar preference forms (not inside
|
CSS variables (on detail-form, agency-form-fields, list-toolbar):
--agency-field-input-size— 13px value text--agency-field-label-size— 11px labels--agency-field-min-height— 28px single-line input (detail-form only)
Domain-only layout (flags row, file upload row, etc.) may stay in component scoped CSS; field paint does not.
Workbench chrome (split tool windows)
Tool windows that pair a navigation tree with a detail pane — UI Schema,
Help — share agency-ui/src/styles/workbench.scss (imported from
main.scss). Explorers keep explorer.scss; the two are separate chromes
for different shapes.
Hook class |
Use |
|---|---|
|
Root |
|
Column inside a |
|
Pane header, 40px (same as window tabs), uppercase muted title. Use a
plain |
|
Scrolling region. |
|
On |
|
On an AG Grid host ( |
Palette is the Vuetify theme in agency-ui/src/theme/agency.ts —
background (canvas) and surface (raised sheet). Shared as
--agency-wb-canvas / --agency-wb-subtle. Light/dark is the user
toggle. Do not add a second hex palette.
Window title bars, AgencyChromeBar headers/footers, explorer
list-toolbars, System pane toolbars, Help pane toolbars, and window tabs
are all 40px (--agency-chrome-height). Buttons inside windows use
--agency-btn-font-size (0.875rem — Image / Speak). Tab labels are 13px
with a 2px primary underline. Explorer v-btn height rules must exclude
.v-tab. Header UUID / agent face is 26px. The shell app bar is always
flat (no drop shadow).
Vuetify 4 emits its component CSS inside @layer vuetify-components, so
these unlayered rules win without !important.
Data display
Schema |
Vue component |
Role |
|---|---|---|
|
|
Simple list |
|
|
Table |
|
|
Tree |
|
|
AG Grid table |
Agents & missions
Schema |
Vue component |
Role |
|---|---|---|
|
|
Agent catalog: Filter + namespace list, hideable tabs (Properties, Tools, Executions). Top bar: selected name; Chat then hide-detail. |
|
|
Alias of |
|
|
Persistent secretary conversation with the user’s active Agent.
Hydrates from REST |
|
|
Multi-turn test chat on |
|
|
Agent status indicator |
|
|
Task progress UI |
|
|
Simple log panel |
|
|
Mission catalog + dispatch; Filter + namespace list, hideable tabs Properties / Prompt / Loop / Executions. Top bar: title; Agent + play then hide-detail. |
|
|
Execution list |
|
|
Mission Control execution window: chat + collapsible steps + continue turn; HITL via channel overlay |
|
|
Stored execution result view |
Models & providers
Schema |
Vue component |
Role |
|---|---|---|
|
|
LLM Model catalog |
|
|
Provider catalog (kind, key env, sync) |
|
|
Tool catalog; ids are |
Corpus / RAG
Schema |
Vue component |
Role |
|---|---|---|
|
|
Document catalog |
|
|
Workspace search / ask UI |
|
|
Extraction detail for a document |
|
|
User photo library. Origin select (All / Uploads / Generated) in the chrome; list filter + hideable Image / Data split. Drag a row onto Veronica, Media, or the wallpaper (thumbnail pin). |
|
|
One photo on the desktop (legacy ephemeral Open; Photos now sends Media) |
|
|
Singleton Media player (images + YouTube). Letterboxed stage; library
pane on the right, closed by default. Download on the chrome for the
current image. Drop |
Staff administration
Schema |
Vue component |
Role |
|---|---|---|
|
|
Staff-only Users explorer. Filter + list left, detail tabs right
(Profile, Preferences, Groups). Manage user accounts, preferences,
and group assignments. Menu → Configuration → Users (visible only
when |
|
|
Ephemeral public lobby room (not a catalog explorer) |
Tools / System / shell
Schema |
Vue component |
Role |
|---|---|---|
|
|
System window: Info (sibling collapsibles Versions / Inference / System), Console, Channels, Tasks, Data, Logs (ops SSE: errors, tracebacks, restarts, GPU) |
|
|
Channel chat surface |
|
|
Raw channel / monitor console |
|
|
Terminal widget |
|
|
Inspect current UI schema JSON |
|
|
Signed-in user window (User · Options · Sites); opened from drawer profile header |
|
|
Options / preferences panel |
|
|
Helm nav ( |
|
|
Local webcam preview + device selector; Ask agent (JPEG frame + prompt) and
Portero watch loop over |
|
|
Operator map: dark Carto Aire basemap, Esri satellite past zoom 13, click-to-fly cursor, optional Satellite split pane (lat/lng/alt) |
|
|
Sphinx singlehtml manual (fetch + sanitize, no iframe) |
|
|
Ephemeral public chat (Lobby). Desktop icon |
Adding a component
Implement the Vue SFC under
agency-ui/src/components/…Add a TypeScript node type in
src/schema/ui.tsif props are typedRegister
type→ component insrc/renderer/registry.tsProduce nodes from Django / host schema (desktop JSON or dynamic producers)
Publish with
npm run build:django/./dev ui
Do not introduce one-off host Vue pages for Agency desktop surfaces.