- **Help Agent** — A new agent that answers questions about Talemate itself — settings, agents, clients, the world editor — grounded in the bundled documentation, and able to change agent and application settings on request. - **Timeline Rollback** — Scrub a slider across a scene's automatic version history, preview the message history at any revision, then roll the scene back in place or fork the revision into a new save. - **Pi Bridge Client** — A new client type that drives generations through the pi coding agent's headless RPC mode, making any model pi can reach usable in Talemate. - **Application Settings** — Settings move out of their modal into an always-available Settings tab, with a single topic-grouped sidebar, a settings search, all API keys on one page, and unsaved-change tracking. - **Scene Library** — The home screen is rebuilt as a full-page landing view with a file-tree scene library, cover thumbnails and per-save metadata, scene and save deletion, and a drag-and-drop import dropzone. - **Fast Character Creation** — Generate a character in a single request instead of one prompt per aspect, with a Consolidate multi-select, a token budget, and a Fill in misses pass. Off by default. - **Scene Backdrop** — Set any scene illustration as a backdrop filling the scene view behind the messages, saved with the scene, with configurable text legibility and an Immersive quick-toggle. - **Scene Visual Manager** — World Editor → Scene gains a Visuals tab to browse, upload, generate and delete the scene's backgrounds and illustrations, and set the cover image and backdrop. - **Visual Prompt Finalization** — Post-processing actions — match and replace, or a free-form AI instruction — rewrite image prompts right before they reach the image backend, with per-scene and per-character overrides and reusable template sets. - fixes #271 - fixes #275 Plus 25 improvements and 39 bug fixes — see [CHANGELOG.md](https://github.com/vegu-ai/talemate/blob/prep-0.39.0/CHANGELOG.md#0390) for the full list.
8.2 KiB
UX Nodes
Build interactive user-facing elements from graphs: choice menus, notices and text inputs, emitted to the interface and styled with Style Element.
5 nodes.
| Node | Registry path |
|---|---|
| Build Choice Element | ux/BuildChoiceElement |
| Build Notice Element | ux/BuildNoticeElement |
| Build Text Input Element | ux/BuildTextInputElement |
| Emit UX Element | ux/EmitElement |
| Style UX Element | ux/StyleElement |
Build Choice Element
ux/BuildChoiceElement
Builds a choice UX element payload.
A random id is generated when none is given. Raises an error if choices is
empty. Emit the resulting element with ux/EmitElement.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
any |
id |
str |
(optional) str (optional; auto-generated when not set) |
closable |
bool |
bool (optional) |
timeout_seconds |
int |
(optional) int (optional; 0 = no timeout) |
title |
str |
str (optional) |
body |
str |
str (optional) |
choices |
list |
list (required) |
multi_select |
bool |
bool (optional) |
default |
any |
str|list[str] (optional) |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
any |
id |
str |
the element id (resolved) |
closable |
bool |
bool (resolved) |
timeout_seconds |
int |
int (resolved) |
title |
str |
str (resolved) |
body |
str |
str (resolved) |
choices |
list |
list (passed through) |
multi_select |
bool |
bool (resolved) |
default |
any |
the resolved default selection |
ux_id |
str |
str |
ux_element |
ux_element |
dict |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
closable |
bool |
True |
Whether the user can dismiss the element (dismissal cancels waiting) |
timeout_seconds |
int |
0 |
Optional timeout for the interaction (0 = no timeout). Min: 0. |
element_title |
str |
"" |
Title for the element |
element_body |
text |
"" |
Body/description for the element |
multi_select |
bool |
False |
Allow selecting multiple choices |
default |
any |
None |
Default selection (string or list of strings) |
Build Notice Element
ux/BuildNoticeElement
Builds a notice (display-only) UX element payload.
Fire-and-forget: EmitElement emits and returns immediately. The frontend renders the notice until the user dismisses it (when closable) or the client-side timeout expires.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
any |
id |
str |
(optional) str (optional; auto-generated when not set) |
closable |
bool |
bool (optional) |
timeout_seconds |
int |
int (optional) |
title |
str |
str (optional) |
body |
str |
str (optional) |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
any |
id |
str |
the element id (resolved) |
closable |
bool |
bool (resolved) |
timeout_seconds |
int |
int (resolved) |
title |
str |
str (resolved) |
body |
str |
str (resolved) |
ux_id |
str |
str |
ux_element |
ux_element |
dict |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
closable |
bool |
True |
Whether the user can dismiss the element (dismissal cancels waiting) |
timeout_seconds |
int |
0 |
Optional timeout for the interaction (0 = no timeout). Min: 0. |
element_title |
str |
"" |
Title for the element |
element_body |
text |
"" |
Body/description for the element |
Build Text Input Element
ux/BuildTextInputElement
Builds a text input UX element payload.
A random id is generated when none is given. Emit the resulting element
with ux/EmitElement.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
any |
id |
str |
(optional) str (optional; auto-generated when not set) |
closable |
bool |
bool (optional) |
timeout_seconds |
int |
(optional) int (optional; 0 = no timeout) |
title |
str |
str (optional) |
body |
str |
str (optional) |
multiline |
bool |
bool (optional) |
rows |
int |
int (optional) |
placeholder |
str |
str (optional) |
default |
str |
str (optional) |
trim |
bool |
bool (optional) |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
any |
id |
str |
the element id (resolved) |
closable |
bool |
bool (resolved) |
timeout_seconds |
int |
int (resolved) |
title |
str |
str (resolved) |
body |
str |
str (resolved) |
multiline |
bool |
bool (resolved) |
rows |
int |
int (resolved) |
placeholder |
str |
str (resolved) |
default |
str |
str (resolved) |
trim |
bool |
bool (resolved) |
ux_id |
str |
str |
ux_element |
ux_element |
dict |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
closable |
bool |
True |
Whether the user can dismiss the element (dismissal cancels waiting) |
timeout_seconds |
int |
0 |
Optional timeout for the interaction (0 = no timeout). Min: 0. |
element_title |
str |
"" |
Title for the element |
element_body |
text |
"" |
Body/description for the element |
multiline |
bool |
False |
Render as textarea (true) or single-line input (false) |
rows |
int |
0 |
Textarea rows (only used when multiline). Min: 0. |
placeholder |
str |
"" |
Input placeholder text |
default |
str |
"" |
Default input value |
trim |
bool |
True |
Whether to trim input before submission |
Emit UX Element
ux/EmitElement
Emits a UX element to the frontend (websocket passthrough).
Choice and text input elements are awaitable by design: emitting one will
wait for the user to submit/cancel (with optional element-defined timeout),
then close the UX element and return the captured interaction values.
A timeout is reported as both timed_out and cancelled. Notice elements
are fire-and-forget and return immediately.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
any |
ux_element |
ux_element |
dict |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
any |
ux_id |
str |
str |
ux_element |
ux_element |
dict |
value |
any |
any |
values |
any |
dict |
cancelled |
bool |
bool |
timed_out |
bool |
bool |
Style UX Element
ux/StyleElement
Pass-through node for styling UX elements.
Intended usage: connect between ux/Build*Element nodes and ux/EmitElement.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
any |
ux_element |
ux_element |
dict |
tint |
str |
str (optional) - Vuetify color name |
icon |
str |
str (optional) - mdi-* icon name |
apply_scene_colors |
bool |
bool (optional) - render body through the scene-message parser for per-category colors |
compact |
bool |
bool (optional) - render the element in a condensed layout |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
any |
ux_id |
str |
str |
ux_element |
ux_element |
dict |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
tint |
str |
"muted" |
Color tint (Vuetify color name). Choices are generated at runtime. |
icon |
str |
"" |
Material Design Icon name (e.g., 'mdi-help-circle-outline', 'mdi-information'). Leave blank for no icon. |
apply_scene_colors |
bool |
False |
When true, the body text is rendered through the scene-message parser and gets its per-category colors (quotes/emphasis/parentheses/brackets). When false, body renders with markdown formatting but inherits the element's color. |
compact |
bool |
False |
When true, the frontend renders the element in a condensed layout: smaller icon and text, and the title leads inline into the body rather than sitting on its own row. |