Grammar
Every captured page becomes a tree of UINode objects. Each node carries a role (one of 22 primitives) and optional signals that describe its behavior, state, and visual intent.
UINode fields
Section titled “UINode fields”| Field | Type | Required | Purpose |
|---|---|---|---|
id |
string |
Yes | Stable ID within capture (content-addressed or path-based) |
role |
UIRole |
Yes | One of 22 primitives: PAGE, BUTTON, NAV, CARD, INPUT, MODAL, etc. |
bbox |
BBox01 |
Yes | Viewport-relative bounding box [x, y, w, h] in [0, 1] range |
interactive |
boolean |
Yes | Can the user click/type on this? |
visible |
boolean |
Yes | Is it actually on screen? |
semantic |
string |
No | Coarse hint like "login", "search", "checkout" |
name_hash |
string |
No | Hash of aria-label/name/id (not the actual value) |
text |
TextSignal |
No | Text shape: hash, length, classification (short, sentence, paragraph) |
z |
number |
No | Coarse z-index bucket (0-10) |
enabled |
boolean |
No | Not disabled |
focusable |
boolean |
No | Can receive keyboard focus |
handlers |
HandlerSignal[] |
No | Event-intent mappings: { event: "click", intent: "toggle_menu" } |
bindings |
BindingSignal[] |
No | Reactive bindings: { property: "value", expression: "state.email" } |
state |
StateSignal[] |
No | State tracking: { key: "cart.items", access: "read", scope: "global" } |
style |
StyleIntent |
No | Visual intent tokens: primary, destructive, elevated, muted, ghost |
pattern |
PatternSignal |
No | Reusable pattern: { kind: "auth_form", variant: "login", slot: "header" } |
children |
UINode[] |
No | Nested child nodes (semantic grouping, not DOM children) |
flags |
UINodeFlags |
No | Behavior/state flags (sticky, scrollable, repeated) |
Pattern kinds
Section titled “Pattern kinds”Patterns let LLMs recognize higher-level compositions beyond individual roles:
search_bar · auth_form · product_card · nav_menu · data_table · wizard_step · media_player · chat_thread · dashboard_widget · custom
Style intent tokens
Section titled “Style intent tokens”Design-system-level visual markers (not CSS):
primary · secondary · destructive · success · warning · info · muted · elevated · outlined · ghost · inverted · highlight · truncated · monospace · custom
Schema versioning
Section titled “Schema versioning”- Current version:
0.1 - Forward compatible: unknown fields are silently ignored
- Version check:
isSupportedSchemaVersion("0.1")returnstrue - Unsupported input: throws
WS_UNSUPPORTED_VERSION
Error codes
Section titled “Error codes”| Code | When it happens |
|---|---|
WS_INVALID_JSON |
Input isn’t valid JSON |
WS_INVALID_CAPTURE |
Capture fails schema validation |
WS_UNSUPPORTED_VERSION |
Capture version isn’t supported |
WS_LIMIT_EXCEEDED |
Too many nodes or too deep |
WS_INVALID_ARGS |
Missing or bad arguments |
WS_NOT_FOUND |
Resource not found |
WS_IO_ERROR |
I/O failure |
WS_PERMISSION_DENIED |
Insufficient permissions |
WS_INTERNAL |
Something unexpected went wrong |
Constants
Section titled “Constants”| Constant | Value | Meaning |
|---|---|---|
MAX_DEPTH |
8 |
Maximum tree depth |
MAX_CHILDREN |
200 |
Maximum children per node (overflow is summarized) |
BBOX_QUANT_STEP |
0.001 |
Quantization step for bbox hashing (~1px at 1000px viewport) |
COLLAPSE_TOLERANCE |
0.002 |
Nodes within this bbox difference are considered equal (~2px) |