Skip to content
v0.4.0 - 2026-08-19

v0.4.0 - 2026-08-19

Release on GitHub

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 pane backend to omp (optional GPTY_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 only ompEvent, authenticated with a per-PTY capability injected at spawn. Shipped @gpty/omp-events extension is dormant unless all four GPTY_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_id for companion links across save/restore (not ephemeral labels like T1).
  • 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 observer layouts migrate before type validation: stream=thinking becomes Reasoning, otherwise Inspector. CLI --pane-type observer warns 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 behind accept_concept_captures (default off).
  • Child PTYs no longer inherit GPTY_SECRET, GPTY_SOCKET, or GPTY_GUI. Untrusted env cannot set GPTY_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: Resize is not treated as user input for stop_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.