Performance browser and editor
Find and load content
Open #/performances. The browser shows folders and performance items, with Back, New performance and New folder controls where editable. Search finds performance/timeline content; pinning makes selected items easier to retrieve. Search exclusions and pin IDs are runtime settings, so check accepted setting results when changes do not persist.
Open an item and inspect the loaded name, timeline queue and runtime state. Loading into the viewer is not the same as saving a draft or starting execution. A running unsaved preview can differ from the file shown in the storage tree.
Playback controls
| Control | Meaning |
|---|---|
| Run/Play | Start loaded/current draft content from selected position |
| Pause / Resume | Change runtime playback state |
| Stop | Stop this performance runtime |
| Autopause | Toggle the runtime autopause setting |
| Loop | UI/runtime playback loop behavior for the selected content |
| Timeline view toggle | Switch full/compact representation where available |
| Zoom in/out | Change timeline display scale |
| Timeline Play | Run a selected timeline using its position/context |
Moving the indicator/seek position is distinct from changing a node's start time. Global performance time and timeline-local time are translated by the controller; use the visible timeline context when resuming or seeking. Runtime state is authoritative; optimistic control overlays settle on acknowledgements/events.
Enter editing and save
- Open the intended stored performance and choose Edit.
- Modify timeline/node content; the header marks unsaved changes.
- Preview only after reviewing the node effects and prepared robot state.
- Choose Save to persist. Done leaves editing mode; do not assume it means a successful save.
- Handle concurrent-save conflicts by reloading/reconciling. Force-save only when deliberately overwriting another revision.
Navigation can prompt about unsaved changes. A browser refresh can discard local draft edits while a previously sent runtime action continues.
Timelines and nodes
The timeline queue supports adding/deleting timelines, enabling/disabling them and playing a selected timeline. Timed nodes have start time, duration and type-specific options. Selection tools include copy, paste at the indicator, select all, select left/right of indicator and delete selected nodes. Copied nodes are normalized relative to the earliest copied start time and pasted with new node identities.
| Node type | Useful fields |
|---|---|
| Speech | Text, language, voice, speed, pitch, volume; duration estimation/preview |
| Pose | Expression and magnitude/duration |
| Animation | Gesture name, speed, magnitude |
| Arm Animation | Arm animation name, speed, magnitude |
| Head Tilt | Angle (radians in the editor), speed |
| LookAt / GazeAt | Target/attention region, coordinates/crosshair, speed, interval, duration |
| Pause | Timeout and pause behavior |
| Scene | Scene selection |
| Settings | Configuration node and values, with a schema-driven settings form |
Editor ranges differ from TeleOps ranges. For example, animation magnitude sliders in performance editing can extend beyond 1; this is not a physical safety guarantee. Duration/preview results depend on current runtime services and selected libraries/providers.
Folder, move and delete behavior
New folder creates a stored folder. Move/rename uses a save-target/delete-source flow, not a guaranteed transactional filesystem rename. Deleting a directory performance removes its contents. Multi-timeline saves can remove omitted timeline files. Back up content before bulk restructuring.
Common content is identified by the current ID/tree storage convention, including shared IDs; do not rely on an older query parameter that the current route ignores. Use IDs returned by the live tree.
Revisions and multiple clients
Storage revisions detect concurrent saves. Runtime revision/content revision describe active execution, and transient ticks carry the runtime revision they belong to. Clients discard stale ticks and fetch /api/performances/current for new content. This prevents progress updates from being mistaken for full content synchronization.
If the editor and another tab disagree, compare loaded storage revision, dirty draft, current runtime payload and last command result. Avoid replaying Run after a dropped acknowledgement without checking current state.
Failure diagnosis
- Empty browser: check selected robot root, permissions and performance files.
- Failed save: inspect HTTP 409/400, writable mounts and assembly/content paths.
- Runtime loaded but no action: inspect enabled timelines, node timing, required services and provider/catalog names.
- Stuck progress: compare runtime revision with ticks and reconnect snapshots.
- Speech duration wrong: check selected voice/provider and estimation response rather than manually changing every node blindly.
Evidence: webui/frontend/src/pages/{PerformancesPage.jsx,performanceUtils.js} and backend performance storage/adapter in head-ros-nodes/ros. Service and schemas.