- Use ExecAction for ExecCell.kind() and MergedExecCell::from_exec
- Switch exec_render_parts_parsed to ExecAction for status/style logic
- Preserve text labels and styling; behavior unchanged
Builds green via ./build-fast.sh
- Add newtypes: ExecCallId, ToolCallId, StreamId
- Migrate ChatWidget state maps/sets to newtypes and update call sites
- Switch remaining stream-id guards to newtype wrappers
- Use ExecAction in exec begin/end; leave deep history_cell formatting on strings for now
Build: ./build-fast.sh passing (no warnings).
- Add and
- Use in exec completion paths to encapsulate merge heuristics
- Continue to centralize invalidation/redraw in helpers
Validated with ./build-fast.sh (no warnings).
Also update fallback detection:
- fix(tui/theme): treat Windows Terminal as truecolor using TERM_PROGRAM/WT_SESSION.
This prevents misclassifying light/dark themes on non-truecolor terminals and avoids unnecessary 256-color fallback on Windows Terminal.
- Composer now inserts a placeholder instead of a full temp path when an image
is pasted (from clipboard or base64/data-URI).
- Added AppEvent::RegisterPastedImage; composer notifies ChatWidget to map the
placeholder to its backing file so submit resolves to LocalImage.
- Keeps visual consistency with drag-and-drop and avoids leaking temp paths in
the visible message.
- Add decoder to recognize and common raw base64
(PNG/JPEG/GIF) payloads, decode with , and write a temp .png.
- Hook into composer paste path before large-paste placeholder logic so iTerm2’s
menu Paste (which pastes an iVBORw0K... blob) becomes an attached image
with a temp path and a footer notice, not raw base64 text.
Terminals like iTerm2 do not emit for non-text clipboards. When
users press common paste keys (Ctrl+V, Ctrl+Shift+V, Shift+Insert), dispatch an
empty paste to the composer. The composer already treats empty paste as a cue to
attempt via arboard+image and attach the PNG path.
This keeps normal text paste behavior (Cmd+V still triggers Event::Paste) and
adds a sensible fallback for image-only clipboards.
Clipboard reading uses arboard -> RGBA -> image::write_to(ImageFormat::Png), but the
crate disabled default features on and only enabled .
This meant encoding PNG failed at runtime and the paste path returned Err,
so pasting raw image data appeared to do nothing.
Enable the feature on for the TUI crate so we can encode the
clipboard image to PNG, insert the temp path, and flash the footer notice as intended.
- Coalesce scheduled redraws via atomic flag; send Redraw and clear pending\n- Remove ScheduleFrameIn from allowed AppEvent variants\n- Track full frame height to size HUD: 30% of terminal, min 15 rows (<=60%)\n- Simplify header copy and show dynamic "expand/collapse" hints\n- Change Agents toggle to Ctrl+A (was Ctrl+P); keep Browser on Ctrl+B
browser/manager: install JS console hook on connect to capture logs immediately for already-loaded pages; prefer CDP-captured buffer and fall back to JS hook.\n\nbrowser/page: enable CDP Runtime/Log and buffer console + log events; expose tail accessor.\n\nTUI/chatwidget: add HUD expand/collapse toggles (Ctrl+B for Browser, Ctrl+P for Agents), PageUp/PageDown to page transcript, and track external Chrome connection status for titles.\n\nTUI/height_manager: allow caller-provided HUD target height to support stacked/collapsed layout; keep legacy aspect estimate as fallback.\n\napp, app_event_sender, tui: wire height target and redraws.\n\nRationale: ensure reliable console capture regardless of page state and improve TUI ergonomics for HUD and scrolling.