Files

234 lines
8.2 KiB
Markdown
Raw Permalink Normal View History

0.39.0 (#274) - **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.
2026-08-29 13:21:22 +03:00
# UX Nodes
Build interactive user-facing elements from graphs: choice menus, notices and text inputs, emitted to the interface and styled with **Style Element**.
<!-- glossary:generated - everything below this line is generated by `python -m talemate.game.engine.nodes.tools glossary --write` - do not edit -->
_5 nodes._
| Node | Registry path |
| --- | --- |
| [Build Choice Element](#build-choice-element) | `ux/BuildChoiceElement` |
| [Build Notice Element](#build-notice-element) | `ux/BuildNoticeElement` |
| [Build Text Input Element](#build-text-input-element) | `ux/BuildTextInputElement` |
| [Emit UX Element](#emit-ux-element) | `ux/EmitElement` |
| [Style UX Element](#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. |