v0.3.2 - 2026-08-13
Added
- IPC hardening - optional
GPTY_SECRETshared-secret authentication for the IPC channel; mismatched or missing secrets are rejected with-32001 - IPC hardening - request-size cap (64 KiB,
-32600on overflow) and connection cap (16 concurrent, 30 s timeout) on the IPC server - Workspace cleanup script -
scripts/cleanremoves stale IPC sockets (skipping live listeners), Godot import caches, and standalonedist/outputs;--dry-runpreview and--alldeep mode; user data never touched - Standalone app builder -
scripts/buildproduces a runnable application bundle for the host platform
Security
- Concept command injection fixed -
{payload}/{N}template values are shell-quoted (POSIX single quotes) before injection, and substitution is single-pass so payload text cannot trigger nested substitutions. Existing user templates that pre-quote values (echo '{payload}') must drop their own quotes. - Concept cost bounded - concept count (128), trigger/command lengths, action counts, and
stop_timeout_msare capped at parse time; output lines over 16 KiB are never regex-matched; capture buffers finalize early past 4 MiB. - PTY env sanitized - dynamic-loader variables (
LD_PRELOAD,LD_AUDIT,LD_LIBRARY_PATH,DYLD_*) and malformed keys are dropped from pane/profile envs at spawn. GPTY_SOCKET/GPTY_GUIhijacking mitigated - the CLI/MCP refuse insecure socket files (wrong owner or open permissions) before sending anything, andGPTY_GUIauto-spawn validates the binary.- Layout restore hardened - malformed tile data (wrong types, unknown pane types, out-of-range grid geometry) is skipped or clamped instead of crashing; code viewer and file tree pane paths must be absolute.
Changed
- Default IPC socket path moved from
/tmp/gpty.sockto a per-user runtime directory ($XDG_RUNTIME_DIR/gpty.sock, fallbacks/run/user/<uid>/gpty.sockand/tmp/gpty-<uid>.sock; macOS$TMPDIR); the socket file is chmod 0600 and cross-UID peers are rejected on Linux/macOS gpty daemonauto-spawn no longer launches a second GUI when the running one requires authentication;daemon statusreports the auth state- App name displayed as gPTY across the UI, docs, and tooling
- Documentation overhaul - MCP integration section in the root README, accurate GDExtension API tables, IPC architecture and method docs, and a test-coverage guide with explicit gaps; the superseded CLI architecture plan was consolidated into the crate READMEs
- Test suite expansion - capture lifecycle extracted into a unit-testable
CaptureSession, CLI commands round-trip against a mock IPC server, concept routing extracted into a GUT-testableConceptRouter, gdext IPC tests serialized with per-test sockets, and a GDExtension FFI smoke test (135 GUT tests total)
Fixed
- Keyboard - printable keys no longer collide with special-key scancodes in the Godot→evdev mapping (
z/Zsent a keypad-multiply sequence,;<=>?@sent F1–F6,`sent keypad-enter); they now reach the shell as themselves - Terminal shortcuts documented -
Ctrl+Vis passed through to the shell as a literal^V(readline quoted-insert, vim visual-block); paste remainsCtrl+Shift+V - Shortcut decoupling -
Ctrl+Shift+Cis now copy-only (silent no-op without a selection); code-viewer spawn moved toCtrl+Shift+D. The dual copy-or-spawn binding is gone. - Text selection survives modifier presses - pressing Shift/Ctrl/Alt no longer clears the current selection
- Global settings apply to every terminal, and the titlebar setting is honored in all spawn and restore paths
- Cursor blink toggle redraws the terminal immediately
- Concept editor no longer crashes when opened with an empty workspace (no terminal panes) - the Add Concept button is disabled until a terminal exists