Skip to content

Releases: coder/agent-tty

v0.3.0: Session Dashboard

03 Jun 18:23
a05d4e5

Choose a tag to compare

Added

  • agent-tty dashboard: a read-only, interactive Session Dashboard with a list of sessions and a live view of the selected one, sourced from events.jsonl via libghostty-vt replayTo/snapshot so it never queries the live host (ADR 0006). Tab toggles list vs. Live View focus, z switches to a block-glyph overview, a toggles active/all scope, and watched sessions pin-on-exit with a final-screen freeze and exit badge. Requires the optional libghostty-vt renderer (no ghostty-web fallback), so doctor now reports a dashboard readiness capability. Interactive-only — no --json, fails fast on non-interactive terminals; list --json remains the machine-readable path (#113, closes #109).
  • inspect --json now reports host.cliVersion, host.rpcSocketPath, rendererRuntime.profile, rendererRuntime.booted, rendererRuntime.bootInFlight (live mode), and eventLogBytes (live and offline replay). All fields are optional schema additions; existing consumers are unaffected (#104).
  • Canonical proof-bundle lock-down: a new CanonicalBundleManifestSchema requires sha256 and bytes on every artifact, npm run validate-bundle:canonical (also wired through mise run validate-bundles) runs eight drift-detection rules plus catalog parity across the four canonical bundles, and the linux-static CI job now fails on bundle drift (#104).
  • Hero Demo bundle (dogfood/agent-uses-agent-tty/) replaced with an external Outer Camera flow: VHS records real Codex (gpt-5.5) and Claude (claude-opus-4-7) TUIs while agent-tty produces the inner Neovim proof artifacts. A new mise run demo:agent-uses-agent-tty task regenerates and promotes the demo with pinned vhs/ttyd/ffmpeg (#105).
  • Hero Demo video playback workflow: mise run demo:agent-uses-agent-tty:upload-assets prepares H.264 MP4 upload assets (with the curated thumbnail held as the opening frames so GitHub's natural first-frame poster shows the end state), and mise run demo:agent-uses-agent-tty:apply-video-urls rewrites the inline <video> srcs in the root and bundle READMEs and refreshes the manifest. Full guidance lives in dogfood/agent-uses-agent-tty/VIDEO_PLAYBACK.md (#106).
  • README rebuild with one-line value prop, badge row, hero GIF, a "Why not tmux/expect/asciinema/Playwright?" comparison table, a two-backend "How it works" section (libghostty-vt + ghostty-web), and an origin story. Adds assets/hero.{gif,tape} and a Playwright-rendered 1200×630 social card under assets/social-preview.* (#108).
  • Session Dashboard planning docs: ADR 0006 (Event Log Follow + libghostty-vt backend), docs/prd/session-dashboard/PRD.md, and new glossary terms in CONTEXT.md for Session Dashboard, Live View, and Event Log Follow (#110).

Changed

  • README hero GIF and the dogfood/agent-uses-agent-tty/ Codex/Claude recordings now record inside a tmux two-pane split: the agent drives a session on the left while agent-tty dashboard live-mirrors it on the right. Both panes share one AGENT_TTY_HOME so the dashboard auto-follows the newest session; the status bar is disabled so VHS's whole-screen Wait+Screen scrape stays unambiguous, and each run uses an isolated, reaped tmux server socket. Panes run bash --norc with a minimal prompt to keep the mirror free of personal shell clutter, and the hero launches the dashboard on camera (typing agent-tty dashboard into the right pane, hopping back with the tmux prefix). A new mise run demo:hero task (which depends on build) regenerates the hero GIF; tmux (>= 3.1, pinned to 3.6 in mise) joins vhs/ttyd/ffmpeg as a recorder prerequisite. Agent recordings now run via a bounded worker pool (--concurrency, default 2) — since each run is mostly an idle review-window sleep, overlapping the two agents roughly halves wall-clock; same-agent attempts stay serialized so two sessions of one account never record at once (#116).
  • Spawned shells now default PROMPT_EOL_MARK= (empty) in the session environment, suppressing the inverse-video % end-of-partial-line marker that zsh prints when output lacks a trailing newline. agent-tty strips a hidden completion-marker postamble after each run, which desynced the rendered cursor and left that % in snapshots, screenshots, and recordings; the new default keeps captures clean. The marker is zsh-only and inert in other shells. Opt back in per session with agent-tty create --env PROMPT_EOL_MARK='%B%S%#%s%b' -- <shell> to restore zsh's styled default (a lone '%' expands to nothing), or pass any explicit --env PROMPT_EOL_MARK=... value. The default is applied at PTY spawn time and is not written to the manifest, so inspect, list, and create --json env maps are unchanged (#114).
  • inspect collects renderer state and the session snapshot in a single synchronous tick before awaiting, so concurrent RPC handlers cannot interleave a mutated renderer state with a stale session snapshot (#104).

Fixed

  • Wide characters (CJK/emoji) no longer misalign per-cell snapshot rendering. The libghostty-vt backend's mapNativeCells packed one array entry per native cell record and discarded the native col/width, so a width-2 glyph became a single entry with no spacer for its trailing column — shifting every cell after it one column left and offsetting the cursor-cell highlight in the Session Dashboard (which pins libghostty-vt). Cells are now column-indexed: each row places records at their true column and emits an empty spacer for a wide glyph's trailing column, matching the ghostty-web backend so snapshot --include-cells and the dashboard Live View stay aligned past wide glyphs. visibleLines text was already correct (#118, closes #112).
  • Restored the empty ## [Unreleased] heading on main after the v0.2.0 release-prep commit so the Update Unreleased Changelog workflow stops failing on every push. docs/RELEASE-PROCESS.md now documents the rename-and-insert rule that keeps both [Unreleased] and [v<version>] headings present after a release cut (#103).

Install from npm once the trusted publish job for this workflow completes:

npm install -g "agent-tty@0.3.0"
agent-tty version --json

If you need a registry-independent fallback, install the verified tarball asset from this release directly:

VERSION=0.3.0
RELEASE_TAG=v0.3.0
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.3.0/agent-tty-0.3.0.tgz

npm install -g "$TARBALL_URL"
agent-tty version --json

For private releases or environments that require authenticated downloads, fetch the asset first and then install locally:

gh release download "v0.3.0" --repo "coder/agent-tty" --pattern "agent-tty-0.3.0.tgz"
npm install -g "./agent-tty-0.3.0.tgz"
agent-tty version --json

SHA-256 checksum: 3db1110ec263a945865889f6cb3c6a9a339123c63fbe151cb6a510a8aef845dc (see agent-tty-0.3.0.tgz.sha256 for the portable checksum file).

This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.

v0.2.0: First stable release

13 May 11:24
28665dc

Choose a tag to compare

Added

  • New non-rendered run_complete event in the canonical event log carrying { marker, inputRunSeq }, so automation consumers can correlate input_run with completion without scanning rendered output (#55, tracking #21).
  • release:prep and release:finalize npm scripts plus a pinned release-it config that update version files, create a single release/<version> commit, and tag v${version} from a clean, synced main without publishing or creating GitHub Releases (#72).
  • "Agent Demo" section in the README and an evergreen dogfood/agent-uses-agent-tty/ bundle that records Codex and Claude TUIs driving nvim --clean through agent-tty, with outer/inner WebMs, asciicasts, transcripts, thumbnails, and a reproduce.sh script (#54).
  • dogfood/issue-21-run-completion-clean/ verification bundle proving snapshots, screenshots, asciicasts, WebM, and the output event stream contain no completion-marker bytes while the public run envelope still exposes marker, completed, and durationMs (#55).
  • AFK Triage maintainer flow under .sandcastle/ that fans out Claude Code triage agents across needs-triage and active needs-info GitHub issues, each in its own per-issue Coder workspace on dev.coder.com, governed by docs/adr/0004-afk-triage-apply-policy.md and the AFK comment marker policy (#86, #89).

Changed

  • run --wait no longer leaks its internal completion marker into rendered artifacts. Completion is signaled via an APC sentinel consumed by the host PTY ingestion path before output events are appended, with a defensive scrub for any echoed printf postamble. Waits resolve on the new run_complete event instead of polling rendered snapshots for marker text. The public run JSON envelope is unchanged (#55, tracking #21).
  • Asciicast export now explicitly skips non-rendered events (input_text, input_paste, input_keys, input_run, run_complete, signal, exit) so recordings only contain o, r, and m frames (#55).
  • wait --text / --regex / --screen-stable-ms / --cursor-row / --cursor-col validation is centralized in a shared render-wait matcher used by both live host polling and CLI offline replay fallback. Invalid, unsafe (nested-quantifier), or out-of-range patterns are rejected locally with INVALID_INPUT before any RPC or offline replay snapshot work. Public wait JSON shapes and human output are unchanged (#76).
  • Renderer dispose now uses a per-lifecycle ResourceScope for deterministic LIFO release of page, browser context, browser, and local server. Public dispose() remains best-effort and resolves successfully; individual cleanup failures are surfaced through the logger as warn entries with { name, error } instead of being silently swallowed. Concurrent artifact-manifest appends route through a generic KeyedSerializer<string> while preserving existing serialization semantics (#83).
  • AbortSignal is now threaded through host-side wait, waitForRender, run completion, lifecycle polling, and sendRpc, with timers, sockets, and listeners registered against ResourceScope. The RPC server also aborts the per-request context when a client socket closes, so abandoned RPC requests release host resources promptly. A bounded 1s liveness probe on the existing RPC socket avoids indefinite hangs during host startup when a stale socket neither accepts nor rejects a connection promptly. Public JSON envelopes and protocol schemas are unchanged (#94, fixes #84).
  • The supported Node range is now >=24.0.0 <27 and the project toolchain is pinned to Node 26.1.0. Playwright is bumped to 1.60.0, which ships the upstream fix for the Node 26 playwright install chromium extraction hang (microsoft/playwright#40724) that previously forced a Node 26 revert in #91. CLI behavior and JSON contracts are unchanged (#98).
  • Local and CI dependency bootstrap now uses aube: mise run bootstrap runs aube exec playwright install chromium and mise run bootstrap-ci runs aube ci. The mise-pinned aube was bumped to 1.10.4 (migrating from pnpm / npm lockfiles to aube-lock.yaml), and pnpm.allowBuilds permits native builds for @coder/libghostty-vt-node, esbuild, fsevents, node-pty, @parcel/watcher, and msgpackr-extract (#51, #57, #73, #91).
  • Internal session-status policy, event-log codec, snapshot capture, screenshot capture, command-target resolution, waited-run completion bookkeeping, and Zod result-validation parsing are centralized into shared modules. No CLI, protocol, JSON envelope, manifest entry, or rendererBackend reporting changes (#67, #68, #69, #70, #75, #78, #93).
  • Repository tooling switched from ESLint / Prettier to Oxc: npm run format / format:check now invoke oxfmt, and npm run lint / lint:fix invoke oxlint plus oxlint-tsgolint for type-aware checks. CI and mise task names are unchanged (#71).

Fixed

  • Default-location screenshot PNGs, snapshot JSON files, and record export artifacts are now rolled back when the subsequent artifact-manifest append fails, so a manifest-validation failure no longer leaves an orphaned, unmanifested file under the session's artifacts/ directory. Explicit --out paths supplied by the caller are preserved on failure because they belong to the user, not the session manifest (#95, fixes #79).
  • EventLog.open now closes the underlying file handle when validation (size-limit check or existing-content parsing) fails, preventing a file-descriptor leak on rejected session host startup (#51).
  • npm run release:prep and npm run release:finalize now work on aube-only checkouts where package-lock.json does not exist. readPackageVersions / assertPackageVersionsMatch skip the lockfile-coherence assertions when package-lock.json is absent, and release-prep.mjs stages only package.json in that case. The npm-lockfile path is still fully supported when a package-lock.json is present (#101).

Install from npm once the trusted publish job for this workflow completes:

npm install -g "agent-tty@0.2.0"
agent-tty version --json

If you need a registry-independent fallback, install the verified tarball asset from this release directly:

VERSION=0.2.0
RELEASE_TAG=v0.2.0
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.2.0/agent-tty-0.2.0.tgz

npm install -g "$TARBALL_URL"
agent-tty version --json

For private releases or environments that require authenticated downloads, fetch the asset first and then install locally:

gh release download "v0.2.0" --repo "coder/agent-tty" --pattern "agent-tty-0.2.0.tgz"
npm install -g "./agent-tty-0.2.0.tgz"
agent-tty version --json

SHA-256 checksum: 38d23f670a5159e983b46206c7f01a45188f8315094e4792738a3e9e5e548481 (see agent-tty-0.2.0.tgz.sha256 for the portable checksum file).

This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.

v0.1.1-beta.4: Selectable libghostty-vt renderer backend

25 Apr 09:29
704ae9d

Choose a tag to compare

This beta adds a selectable semantic renderer backend so snapshot, wait, and getVisibleText can run against either the existing ghostty-web Playwright pipeline or the new native libghostty-vt addon. PNG screenshots and WebM exports continue to use ghostty-web, and artifact metadata honestly reports the actual producer. The release also clarifies skill discovery in --help, declares an explicit Apache-2.0 license, and restructures the user-facing documentation.

Highlights

  • New --renderer <ghostty-web|libghostty-vt> flag (plus AGENT_TTY_RENDERER env var and defaultRenderer config key) for per-command renderer selection.
  • Optional @coder/libghostty-vt-node native addon, loaded lazily and only when explicitly selected.
  • Apache-2.0 license is now declared in the repo and in package.json metadata.

Added

  • Selectable libghostty-vt renderer backend (#42) by @ThomasK33. Adds @coder/libghostty-vt-node@0.1.0-beta.0 as an optionalDependency and wires a renderer registry through the host RPC, offline replay, and CLI commands.

    • Selection precedence: CLI flag → env var → config → ghostty-web (default).
    • Unknown renderer names fail fast before any backend is constructed.
    • Missing native addon produces an actionable error pointing at --renderer ghostty-web as recovery.
    • libghostty-vt is semantic-only in v1: screenshot and record export --format webm transparently fall back to ghostty-web, and rendererBackend in artifact metadata reports the actual producer (so a screenshot requested with --renderer libghostty-vt still reports ghostty-web).
    # Per-command selection
    agent-tty --renderer libghostty-vt snapshot <session-id> --json
    agent-tty --renderer libghostty-vt wait <session-id> --text "READY>" --json
    
    # Or as a default
    export AGENT_TTY_RENDERER=libghostty-vt
  • Skills-discoverability help footer (#38) by @ThomasK33. The top-level --help outro now reads: "Coding agents: after loading the core agent-tty skill, run agent-tty skills list to discover other bundled skills and agent-tty skills get <name> to load one."

  • Apache-2.0 LICENSE (#43) by @ThomasK33. The repository now ships an Apache-2.0 LICENSE file at the root and declares "license": "Apache-2.0" in package.json, so consumers and automation can detect the package license from npm metadata.

Changed

  • Documentation restructure (#41) by @ThomasK33. The root README is now a product-facing entry point (what agent-tty is, why it exists, quickstart, common usage, limitations, roadmap, license), with detailed material moved into focused docs for installation, usage, agent skills, and troubleshooting. As part of this pass, the doctor --json home-isolation diagnostic message was updated from the stale Agent-terminal name to agent-tty.

Notes

  • libghostty-vt is opt-in and its native addon is an optionalDependency. Default users on any platform are unaffected and never load the native code.
  • PNG screenshots and WebM exports continue to require the ghostty-web (Playwright) path even when --renderer libghostty-vt is selected.

Full Changelog: v0.1.1-beta.3...v0.1.1-beta.4


Install from npm once the trusted publish job for this workflow completes:

npm install -g "agent-tty@0.1.1-beta.4"
agent-tty version --json

If you need a registry-independent fallback, install the verified tarball asset from this release directly:

VERSION=0.1.1-beta.4
RELEASE_TAG=v0.1.1-beta.4
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.1.1-beta.4/agent-tty-0.1.1-beta.4.tgz

npm install -g "$TARBALL_URL"
agent-tty version --json

For private releases or environments that require authenticated downloads, fetch the asset first and then install locally:

gh release download "v0.1.1-beta.4" --repo "coder/agent-tty" --pattern "agent-tty-0.1.1-beta.4.tgz"
npm install -g "./agent-tty-0.1.1-beta.4.tgz"
agent-tty version --json

SHA-256 checksum: d987cdf1b4bc6af0b97033eb23d229f37c08f36dc39bba9fe7ccec2f4bf99bf6 (see agent-tty-0.1.1-beta.4.tgz.sha256 for the portable checksum file).

This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.

v0.1.1-beta.3: agent-tty rename & runtime-served skills

13 Apr 17:28
15bbcf1

Choose a tag to compare

This beta renames the public CLI to agent-tty across the board and replaces the singular bundled skill with a runtime-served multi-skill system. It also hardens several Darwin-specific runtime paths and fixes mux workspace bootstrap.

Highlights

  • 📦 Public package, binary, env vars, and default home directory are now agent-tty / AGENT_TTY_* / ~/.agent-tty
  • 🧰 New agent-tty skills list|get|path CLI with a built-in dogfood-tui skill for TUI QA
  • 🍎 macOS session startup, doctor cache checks, and PTY spawn are more robust
  • 🔧 Mux worktree workspaces no longer fail on mise install because of untrusted configs

Added

  • Runtime-served multi-skill system (#28) by @ThomasK33. The CLI now serves canonical skills from a packaged skill-data/ directory while skills/agent-tty/ remains a thin TanStack-discoverable bootstrap that redirects agents to the CLI. A new dogfood-tui skill ships alongside the core agent-tty skill for TUI QA/dogfooding discipline.

    agent-tty skills list [--json]        # List all bundled skills
    agent-tty skills get <name> [--json]  # Print a bundled skill's contents
    agent-tty skills path <name> [--json] # Print a bundled skill's directory

Changed

  • Public CLI surface renamed to agent-tty (#27) by @ThomasK33. This touches the npm package name, CLI binary, skill name, environment-variable prefix (AGENT_TTY_*), default home directory (~/.agent-tty), and all docs/release metadata. The repo is now coder/agent-tty.
  • Hardened Darwin runtime checks (#29) by @ThomasK33:
    • RPC sockets are placed under a short hashed path in /tmp/agent-tty to avoid macOS Unix socket path-length EINVAL errors under long isolated temp homes.
    • doctor now reuses the renderer's platform-aware Playwright browser-cache resolver, correctly reporting ~/Library/Caches/ms-playwright on macOS.
    • run injection writes executable shell input directly rather than relying on bracketed-paste control sequences, which could corrupt input in some bash configurations.

Fixed

  • Mux workspace hooks trust workspace-local mise.toml (#26) by @ThomasK33. New worktrees under ~/.mux/src/... no longer fail during .mux/init because the copied mise.toml is trusted before mise install/mise run bootstrap, and .mux/tool_env trusts the same config so bash commands that race ahead of the non-blocking init hook still work.
  • Darwin node-pty spawn-helper executable bit is now repaired at runtime before PTY spawn, resolving PTY startup failures on packaged macOS installs (#29).

Breaking Changes

  • The singular agent-tty skill command has been removed. Use agent-tty skills get agent-tty instead.
  • In skill result envelopes, the source field changed from 'packaged-file' to 'bundled', and results now include a new path field.
  • The npm package, CLI binary, env var prefix, and default home directory have all been renamed — see #27 for the full list.

v0.1.1-beta.0: Inaugural public beta of agent-terminal

10 Apr 16:23
14609b9

Choose a tag to compare

This is the first public prerelease of agent-terminal — a terminal automation CLI for AI agents and humans. The release lands the complete v1 session/renderer/export pipeline and ships it as a verified GitHub Release tarball asset with a SHA-256 checksum.

Install from the verified tarball attached to this release instead of the npm registry or a git dependency build. The .tgz and .tgz.sha256 assets below are produced by the new prepare-release workflow.

Highlights

  • 🖥️ Full session control plane with per-session host, PTY, and append-only event log — create, list, inspect, destroy, gc, plus type / paste / send-keys / resize / signal / run.
  • 🔍 Renderer-backed inspection: semantic snapshot, deterministic screenshot, and rich wait modes (--text, --regex, --screen-stable-ms, --idle-ms, --exit).
  • 🎞️ record export --format asciicast and --format webm with post-exit offline replay from persisted event logs.
  • 🤖 Public agent-terminal skill with TanStack Intent integration and an agent-terminal skill command for just-in-time agent loading.
  • 📦 Verified GitHub Release tarball with checksum and packaging metadata, ready for private/prerelease installs.

Added

  • Session lifecycle and control plane (#3). Real per-session background host process with PTY ownership, validated Zod protocol schemas, RPC over a Unix domain socket, and an append-only JSONL event log. Ships create, list, inspect, destroy, type, paste, send-keys, resize, signal, and wait --exit / --idle-ms.

  • Renderer-backed inspection slice (#4). Lazy ghostty-web renderer boot with deterministic event-log replay, semantic snapshot (structured and --format text), and renderer-backed wait --text / --regex / --screen-stable-ms. screenshot with built-in reference-dark and reference-light profiles, plus artifact manifest plumbing and renderer smoke checks in doctor.

  • Replay export and post-exit replay (#5). record export --format asciicast and --format webm for text and visual replay. snapshot and screenshot now fall back to offline replay from persisted event logs after a session exits, and gc safely cleans up stale sessions with --dry-run / --stale-only / --older-than. The artifact manifest gains sha256, byte size, renderer profile, and recording / video kinds.

  • run command for in-session command execution (#14). New first-class agent-terminal run <session-id> [command] with --timeout, --no-wait, --file, and --json. Uses paste-mode injection with split-marker completion detection so multi-line setup scripts run reliably without fragile keystroke simulation.

  • Doctor isolation diagnostics (#14). doctor --json now reports home_isolation and browser_cache_accessible, and the renderer auto-resolves PLAYWRIGHT_BROWSERS_PATH from the original host HOME so screenshots and WebM export work in isolated sessions out of the box.

  • Capability reporting and contract locks (#9, #10, #12). Stable JSON envelope surface with introspection, proof-bundle validation, and renderer capability reporting.

  • Bundled Nerd Font fallback (#11) so glyph-heavy TUIs (LazyVim, etc.) render correctly in screenshots and WebM exports without a system font dependency.

  • Public agent-terminal skill (#16). Distributable skill at skills/agent-terminal/SKILL.md with binary-first examples and a TanStack Intent keyword so agents can discover and activate it. Includes a prepublishOnly verify guard and a build step that copies renderer assets into dist/.

  • agent-terminal skill CLI command (#22). Prints the packaged skill markdown verbatim, or returns it inside the standard success envelope with --json. Top-level --help now steers coding agents to the preloaded-skill-or-fallback workflow.

    agent-terminal skill              # Raw skill markdown
    agent-terminal skill --json       # JSON envelope with skill content
  • Install smoke coverage and tarball install guidance (#19). New pack:private, prepare, and smoke:install scripts wired into npm run verify and CI, plus README and release-process documentation for the supported private/prerelease install paths.

  • GitHub Release tarball workflow (#23). New scripts/pack-release.mjs and .github/workflows/release.yml with prepare-release and publish-github-release jobs. Produces a verified .tgz, a SHA-256 checksum file, and machine-readable package metadata as GitHub Release assets, derived dynamically from package.json to stay package-name agnostic.

Changed

  • Artifact manifest entries are richer and deterministic: sha256, byte count, render profile, backend, capture dimensions, and — for exports — timing mode (#5).
  • Repository documentation reorganized and a new AGENTS.md contributor guide landed (#6, #17).

Fixed

  • Release workflow supports prerelease tags (#24). Version tests and tag validation now accept prerelease identifiers like 0.1.1-beta.0 and 0.1.1-rc.0, and the workflow fails fast if a release tag points to a commit that is not reachable from the default branch.

Install

Download the tarball asset attached to this release and install it locally:

npm install -g ./agent-terminal-0.1.1-beta.0.tgz

Verify the download against the published SHA-256:

sha256sum -c agent-terminal-0.1.1-beta.0.tgz.sha256

Npm publication is intentionally deferred; a future publish-npm job will reuse the same verified tarball produced by prepare-release.