v0.4.0 - 2026-08-19
Added
- Inspector pane - private, tool-free, iterative OMP Q&A via a session-owned
GptyAi(session_open/session_prompt/session_poll/session_cancel/session_close). It does not attach to a terminal-hosted OMP TUI. Set panebackendtoomp(optionalGPTY_OMP). - Reasoning pane - passive projection of documented OMP reasoning from one terminal, selected by
source_attachment_id. Never starts jobs or accepts concept captures. - OMP event channel - second local socket (
gpty-events.sock) accepting onlyompEvent, authenticated with a per-PTY capability injected at spawn. Shipped@gpty/omp-eventsextension is dormant unless all fourGPTY_EVENT_*variables are present. - Shipped “OMP Workspace” profile (Terminal + Inspector + Reasoning). Built-in profiles are not written to the user store and cannot be deleted from the sidebar.
- Stable pane
attachment_idfor companion links across save/restore (not ephemeral labels likeT1). - Safe Markdown rendering - CommonMark/GFM is converted to sanitized Godot BBCode in Rust, Inspector/Reasoning streams are render-debounced, and Markdown files in code-viewer panes support rendered/source toggling.
Changed
- Legacy
observerlayouts migrate before type validation:stream=thinkingbecomes Reasoning, otherwise Inspector. CLI--pane-type observerwarns and creates Inspector. Legacy observer-target concepts are disabled at merge/save time rather than migrated. - Concepts that target Inspector (
git_log,cargo_check) ship disabled so captured terminal output is not sent to a model without explicit opt-in; Inspector panes additionally gate captures behindaccept_concept_captures(default off). - Child PTYs no longer inherit
GPTY_SECRET,GPTY_SOCKET, orGPTY_GUI. Untrusted env cannot setGPTY_EVENT_*/ session ids. - Pane labels reuse the highest closed number only:
max(existing)+1- closing the newest pane recycles its number, middle gaps are never filled. - Reasoning turn caps are user settings (Settings → Reasoning): max turns (1–64) and max turn bytes (4 KiB–1 MiB), clamped and persisted.
- Toast notifications for unrouted captures name the source pane (
…from T1).
Fixed
- Concept routing now requires receivers to advertise capability and confirm delivery before captured bytes are acknowledged; Reasoning panes and failed Inspector starts fall through to another receiver or flush safely back to the terminal.
- Resize no longer triggers concept captures or toasts:
Resizeis not treated as user input forstop_on_input, and post-resize shell redraws are suppressed for 750 ms. Alternate-screen output (full-screen TUI redraws) is never concept-matched. - Terminal resize hardening: transient collapsed pane sizes during split/spawn churn can no longer collapse the grid (cell-dimension floors at event and apply time); redundant SIGWINCH is skipped when dimensions are unchanged; grid growth keeps the visible text and cursor anchored (xterm-style) without ever deleting rows from alternate- or primary-screen TUIs.
- Terminal emulator answers application queries: DSR cursor-position reports and mode reports generated by the emulator are forwarded to the child PTY. Full-screen TUIs that query the cursor after SIGWINCH (e.g. the OMP TUI) now re-render in place instead of re-anchoring their transcript.
- Reasoning accordion: width is viewport-aware (scrollbar accounted for, no right-edge clipping), truncation at the turn cap re-closes Markdown code fences, and auto-follow no longer yanks the view during a deliberate scroll-up.
- Code-viewer panes clear stale content when a configured file path is invalid, and rendered Markdown documents open at the top.