Part of the Infinite Canvas epic: #61
Phase 2 — Core panels: Conversation + Terminal on the canvas
Make the two most important panel types fully live inside canvas PanelShape hosts.
Scope
- Conversation panel — host
src/features/conversation/ (renderer + use-streaming hook) inside a canvas panel. Streaming, sending prompts, scroll-to-bottom must work within a panel that can be moved/resized/zoomed.
- Terminal panel — host the existing PTY terminal (
src/features/terminal/ + terminal_commands.rs) inside a canvas panel. Spawn/stream/stdin/interrupt all functional; each terminal keyed by instance UUID.
- Panel chrome — per-panel header with title + controls (close, panel-type label); content stays interactive while panning/zooming.
- Lifecycle — opening a panel binds it to a session/PTY; closing tears down cleanly. Panel ↔ session/PTY mapping persisted in
canvas_panels.config.
- Performance baseline — gate/virtualize rendering or input for off-screen panels so multiple live panels don't jank.
Out of scope
Connections between panels (Phase 3), notes/drawing/editor (Phase 4), global controls (Phase 5).
Acceptance
- Multiple conversation and terminal panels run live on one canvas; survive mode toggle + restart (re-attaching to existing sessions/PTYs where applicable).
- Interactions stay smooth with several live panels open.
- Persistence/mapping changes covered by tests; lint/typecheck/test pass.
Part of the Infinite Canvas epic: #61
Phase 2 — Core panels: Conversation + Terminal on the canvas
Make the two most important panel types fully live inside canvas
PanelShapehosts.Scope
src/features/conversation/(renderer +use-streaminghook) inside a canvas panel. Streaming, sending prompts, scroll-to-bottom must work within a panel that can be moved/resized/zoomed.src/features/terminal/+terminal_commands.rs) inside a canvas panel. Spawn/stream/stdin/interrupt all functional; each terminal keyed by instance UUID.canvas_panels.config.Out of scope
Connections between panels (Phase 3), notes/drawing/editor (Phase 4), global controls (Phase 5).
Acceptance