Render persistent A2UI surfaces in chat #22

Closed
opened 2026-07-18 20:48:42 +00:00 by hugo · 1 comment
Owner

Goal

Add safe structured assistant surfaces to the completed Chat feature, including persistent interaction state and allow-listed application actions.

Current state

  • specs/editor_chat.allium defines the surface values and UI behavior.
  • specs/ai.allium defines structured render tools.
  • No A2UI renderer or surface state repository exists.
  • This issue depends on persistent conversational AI and streaming tool calls.

Required behavior

  • Recognize render_card, render_chart, render_form, render_list, render_metric, render_mindmap, render_table, and render_tabs tool results.
  • Render card, chart, form, list, metric, mindmap, table, tabs, text, and JSON using fixed native components; never execute assistant HTML or JavaScript.
  • Support bar, stacked-bar, line, area, pie, donut, and heatmap charts. Accept chartType and chart_type, default to bar, and treat invalid numeric values as zero.
  • Support text, textarea, select, checkbox, date, and number form fields.
  • Persist form values, selected tabs, and dismissed surfaces per conversation using stable message/tool-index identities.
  • Keep existing non-dismissed surfaces visible and expanded while later assistant output streams.
  • Include current form values in submitted action payloads.
  • Allow only open post/media/settings/chat, switch view, set view, and sidebar/panel toggles. Reject unknown actions and invalid identifiers visibly.
  • Render unknown nested content as text or inspectable JSON.

Implementation notes

  • Read docs/UI_STYLE_GUIDE.md before UI work.
  • Extend Chat state rather than creating a second message renderer.
  • Use native widgets and existing navigation messages.
  • Follow red/green TDD and compare ../bDS2 chat_editor/tool_surfaces.ex, chart_view.ex, and their tests when needed.

Acceptance criteria

  • Every surface, chart, and form type has focused rendering/state tests.
  • Conversation reopen restores fields, selected tabs, and dismissals against the same surface IDs.
  • Streaming a later response does not remove prior surfaces.
  • Action allow-list, invalid payloads, nested fallback, and raw HTML/script safety are tested.
  • Form action payloads contain the current persisted values.
  • All UI is localized and keyboard accessible.
  • cargo fmt --all -- --check, cargo build --workspace, and cargo test --workspace pass.
## Goal Add safe structured assistant surfaces to the completed Chat feature, including persistent interaction state and allow-listed application actions. ## Current state - specs/editor_chat.allium defines the surface values and UI behavior. - specs/ai.allium defines structured render tools. - No A2UI renderer or surface state repository exists. - This issue depends on persistent conversational AI and streaming tool calls. ## Required behavior - Recognize render_card, render_chart, render_form, render_list, render_metric, render_mindmap, render_table, and render_tabs tool results. - Render card, chart, form, list, metric, mindmap, table, tabs, text, and JSON using fixed native components; never execute assistant HTML or JavaScript. - Support bar, stacked-bar, line, area, pie, donut, and heatmap charts. Accept chartType and chart_type, default to bar, and treat invalid numeric values as zero. - Support text, textarea, select, checkbox, date, and number form fields. - Persist form values, selected tabs, and dismissed surfaces per conversation using stable message/tool-index identities. - Keep existing non-dismissed surfaces visible and expanded while later assistant output streams. - Include current form values in submitted action payloads. - Allow only open post/media/settings/chat, switch view, set view, and sidebar/panel toggles. Reject unknown actions and invalid identifiers visibly. - Render unknown nested content as text or inspectable JSON. ## Implementation notes - Read docs/UI_STYLE_GUIDE.md before UI work. - Extend Chat state rather than creating a second message renderer. - Use native widgets and existing navigation messages. - Follow red/green TDD and compare ../bDS2 chat_editor/tool_surfaces.ex, chart_view.ex, and their tests when needed. ## Acceptance criteria - Every surface, chart, and form type has focused rendering/state tests. - Conversation reopen restores fields, selected tabs, and dismissals against the same surface IDs. - Streaming a later response does not remove prior surfaces. - Action allow-list, invalid payloads, nested fallback, and raw HTML/script safety are tested. - Form action payloads contain the current persisted values. - All UI is localized and keyboard accessible. - cargo fmt --all -- --check, cargo build --workspace, and cargo test --workspace pass.
hugo added the enhancement label 2026-07-18 20:48:42 +00:00
Author
Owner

Implemented in fd4fd74. Added eight structured render tools; fixed native card, chart, form, list, metric, mind-map, table, tab, text, and JSON surfaces; all seven chart types and six form controls; stable per-conversation form, tab, and dismissal persistence; live streaming surfaces; safe nested fallbacks; inert assistant markup; and a strict visible action allow-list. Added the generated SQLite migration, five-locale UI strings, README and extension-plan updates, migration/reopen/streaming/action/rendering tests, and packaged-app inspection. Neutral comparison against issue #22, bDS2 ToolSurfaces/ChartView/ChatEditor, and editor_chat/ai Allium found and corrected heatmap-segment, tool-marker-order, and unknown-render fallback gaps. cargo fmt, workspace check, clippy with warnings denied, workspace build, all 47 Allium specs with zero findings, and cargo test --workspace all pass.

Implemented in fd4fd74. Added eight structured render tools; fixed native card, chart, form, list, metric, mind-map, table, tab, text, and JSON surfaces; all seven chart types and six form controls; stable per-conversation form, tab, and dismissal persistence; live streaming surfaces; safe nested fallbacks; inert assistant markup; and a strict visible action allow-list. Added the generated SQLite migration, five-locale UI strings, README and extension-plan updates, migration/reopen/streaming/action/rendering tests, and packaged-app inspection. Neutral comparison against issue #22, bDS2 ToolSurfaces/ChartView/ChatEditor, and editor_chat/ai Allium found and corrected heatmap-segment, tool-marker-order, and unknown-render fallback gaps. cargo fmt, workspace check, clippy with warnings denied, workspace build, all 47 Allium specs with zero findings, and cargo test --workspace all pass.
hugo closed this issue 2026-07-19 14:58:45 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: hugo/RuDS#22