diff --git a/.release-please-manifest.json b/.release-please-manifest.json index f1c1e588..bcd05228 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.5.0" + ".": "0.6.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index f567b599..c134e433 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,48 @@ ## [Unreleased] +## [0.6.0] - 2026-11-04 + +### Added + +- Mode-aware native mouse input: new `mouse` CLI/RPC command and batch step encode clicks, drags, and wheel events through the libghostty-vt backend, with `input_mouse` event-log entries and a new `CAPABILITY_UNAVAILABLE` error (exit 12) when the native encoder is missing. Bumps `@coder/libghostty-vt-node` to `0.1.0-beta.5` ([#179](https://github.com/coder/agent-tty/pull/179) by @pmarreck). +- `wait --scope cursor-line` matches `--text`/`--regex` against only the cursor row, so prompt waits like `--regex 'READY> $'` no longer false-positive on the echoed command line ([#169](https://github.com/coder/agent-tty/pull/169)). +- `record diff ` prints a unified-style or JSON diff of two sessions' visible screens, replayed offline, with `--at-seq-a`/`--at-seq-b` for intra-session diffs ([#170](https://github.com/coder/agent-tty/pull/170)). +- `screenshot --out ` writes the PNG to a chosen path while still publishing it in the session manifest ([#241](https://github.com/coder/agent-tty/pull/241)). `screenshot --out` and `record export --out` now create missing parent directories (never inside session storage) ([#290](https://github.com/coder/agent-tty/pull/290)). +- `screenshot --json` reports glyphs drawn as `.notdef` boxes in a new `missingGlyphs` array with cells, and `missingGlyphsTruncated` when the check is cut off ([#240](https://github.com/coder/agent-tty/pull/240)). `record export --format webm` gets the same field, the check now judges per face so one family can cover a cluster across faces, and the built-in font stack bundles Noto Sans Symbols 2 and Noto Sans Math subsets ([#278](https://github.com/coder/agent-tty/pull/278)). +- Spawned PTYs get `AGENT_TTY_ACTIVE=true` and `AGENT_TTY_SESSION_ID=` so scripts can detect the managed session ([#166](https://github.com/coder/agent-tty/pull/166)). +- The PTY answers XTGETTCAP (`Tc`, `RGB`, `setrgbf`/`setrgbb`) and declines DECRQSS SGR, so `env -i nvim` and `--env COLORTERM=` turn on `termguicolors` ([#271](https://github.com/coder/agent-tty/pull/271)). + +### Changed + +- `COLORTERM=truecolor` is now set by default for every session program; inherited `COLORTERM` from the outer shell no longer leaks through. Opt out with `--env COLORTERM=` ([#231](https://github.com/coder/agent-tty/pull/231)). +- Standalone `wait` now defaults to a 30 s timeout (was 600 s) and prints it in `--help`; `--timeout 0` keeps the "wait forever" behavior ([#236](https://github.com/coder/agent-tty/pull/236)). Batch `wait` steps default to the same 30 s ([#250](https://github.com/coder/agent-tty/pull/250)). +- A timed-out `wait` now returns `ok: false` with `error.code: WAIT_TIMEOUT` while keeping the existing `.result.timedOut` field; fail-fast `batch --json` now prints an error envelope on step failure ([#232](https://github.com/coder/agent-tty/pull/232)). Human-mode timeouts name the effective timeout and the default-opt-out hint ([#273](https://github.com/coder/agent-tty/pull/273)). Batch step messages name the timeout too ([#301](https://github.com/coder/agent-tty/pull/301)). +- `wait` now rejects windows that cannot complete inside the timeout (`--idle-ms`/`--screen-stable-ms` ≥ timeout) up front with `INVALID_DURATION` ([#277](https://github.com/coder/agent-tty/pull/277)). +- Session RPC sockets moved under a per-uid root (`/tmp/agent-tty-`) with a one-release fallback to the old path; `gc` and `destroy` clean up sockets left by a dead host ([#288](https://github.com/coder/agent-tty/pull/288), [#239](https://github.com/coder/agent-tty/pull/239), [#142f779](https://github.com/coder/agent-tty/commit/142f779)). +- RPC response buffer raised to 64 MiB so `snapshot --include-cells` works on large live screens; a larger success now returns `PROTOCOL_ERROR` instead of a retryable `RPC_ERROR` ([#320](https://github.com/coder/agent-tty/pull/320), [#322](https://github.com/coder/agent-tty/pull/322)). Live `snapshot --include-cells` gets a 60 s RPC timeout. +- `CliError.details` now travel over the host RPC, so live `snapshot`/`screenshot` errors carry the same `details.path`/`details.errno` as offline ones ([#313](https://github.com/coder/agent-tty/pull/313)). +- An unsupported Node version prints a startup warning citing `engines.node` (`>=24 <27`), and `doctor` checks the real range ([#245](https://github.com/coder/agent-tty/pull/245)). + +### Fixed + +- Unexpected errors and invalid session IDs now produce one `INTERNAL_ERROR` or `INVALID_SESSION_ID` JSON envelope instead of a Node stack trace, and the CLI exits promptly after `INTERNAL_ERROR` instead of hanging on open handles ([#237](https://github.com/coder/agent-tty/pull/237), [#287](https://github.com/coder/agent-tty/pull/287)). +- `snapshot`, `screenshot`, and render waits now handle a session that has printed nothing: they return an empty screen or blank PNG with `capturedAtSeq: -1` instead of exiting 9 `RPC_ERROR` ([#235](https://github.com/coder/agent-tty/pull/235)). `record export --format asciicast`/`webm` match: empty logs produce header-only or blank output at seq -1 ([#270](https://github.com/coder/agent-tty/pull/270)). +- `screenshot --show-cursor`/`--hide-cursor` now actually toggle the cursor in the PNG; previously every screenshot drew the block cursor ([#289](https://github.com/coder/agent-tty/pull/289)). +- WebM exports show output at its recorded time; a program printing 15 lines 200 ms apart used to flush all at once at the next non-output event ([#285](https://github.com/coder/agent-tty/pull/285)). +- Concurrent `screenshot`, `snapshot`, and `record export` captures no longer drop entries from `artifacts/manifest.json`: a file lock serialises appends across processes ([#282](https://github.com/coder/agent-tty/pull/282)). A second export at the same `--out` replaces the earlier manifest entry rather than leaving two ([#300](https://github.com/coder/agent-tty/pull/300)). A failed `screenshot --out` copy rolls back the in-session capture ([#300](https://github.com/coder/agent-tty/pull/300)). Repeat screenshot/snapshot captures preserve earlier files when a later append fails ([#191](https://github.com/coder/agent-tty/pull/191)). +- `--out` paths are re-checked just before the rename and reject parents you can write to but not search; folder swaps during the write fail with `EXPORT_ERROR` instead of writing into the swapped folder ([#279](https://github.com/coder/agent-tty/pull/279)). WebM size and SHA-256 are read from the temp file so a third-party write between rename and manifest can't poison the result ([#321](https://github.com/coder/agent-tty/pull/321)). +- Render waits now surface renderer errors (e.g. repeated Chromium launch failures) as `RPC_ERROR` instead of masquerading as `WAIT_TIMEOUT` ([#301](https://github.com/coder/agent-tty/pull/301)). +- Large host responses are parsed in linear time by searching only new chunks for the newline, and request IDs are capped at 128 characters; shortened error messages no longer end with half of a surrogate pair ([#319](https://github.com/coder/agent-tty/pull/319), [#320](https://github.com/coder/agent-tty/pull/320)). +- Session lifecycle races closed between `create`, `reconcile`, `destroy`, and `gc`: the host is launched first and the manifest always names it; a failed `create` stops its host and attaches `details.sessionId` to the error envelope; `destroy --force` ends sessions whose program group cannot be read; `gc` keeps a session whose program group still runs instead of orphaning the leftover; and the TLA+ lifecycle model now runs in CI ([#181](https://github.com/coder/agent-tty/pull/181), [#247](https://github.com/coder/agent-tty/pull/247), [#294](https://github.com/coder/agent-tty/pull/294), [#324](https://github.com/coder/agent-tty/pull/324), [#327](https://github.com/coder/agent-tty/pull/327), [#302](https://github.com/coder/agent-tty/pull/302)). +- `destroy` typed into the session's own shell re-runs in a new session and now forwards SIGINT/SIGTERM to the detached copy, exiting 130/143 as `batch` does ([#281](https://github.com/coder/agent-tty/pull/281)). +- The session-less `doctor` PTY probe no longer inherits `AGENT_TTY_ACTIVE`/`AGENT_TTY_SESSION_ID` from an outer session ([#178](https://github.com/coder/agent-tty/pull/178)). +- Waited `run` input is logged in PTY byte order, and native mouse dedup state survives renderer swaps by using a dedicated renderer manager for mouse input ([#234](https://github.com/coder/agent-tty/pull/234)). Same-cell motion stays deduplicated after program output ([#293](https://github.com/coder/agent-tty/pull/293)). + +### Internal + +- `release-please` now raises Communique's `max_tokens` to 16384 so release notes stop being cut off on releases of this size ([#295](https://github.com/coder/agent-tty/pull/295)). + ## [0.5.0] - 2026-06-23 ### Added diff --git a/README.md b/README.md index f54981b0..b3a6c5bd 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ See [`docs/AGENT-SKILLS.md`](./docs/AGENT-SKILLS.md). ## Status & platform support -`agent-tty` is `0.5.0` and focused on reliable, isolated, reviewable terminal and TUI automation through a stable CLI. +`agent-tty` is `0.6.0` and focused on reliable, isolated, reviewable terminal and TUI automation through a stable CLI. - Linux and macOS are tier-1; Windows is tier-2 and not CI-tested. - Semantic snapshots and render-backed waits prefer the optional `libghostty-vt` backend when it is available, then fall back to `ghostty-web`. diff --git a/package.json b/package.json index b8903200..ceae6049 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "agent-tty", - "version": "0.5.0", + "version": "0.6.0", "description": "Terminal automation CLI for AI agents and humans", "license": "Apache-2.0", "keywords": [