diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 4f6340b..13913d1 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -11,6 +11,10 @@ "dist", "node_modules", "package-lock.json", - "aube-lock.yaml" + "aube-lock.yaml", + "dogfood/agent-uses-agent-tty/README.md", + "dogfood/agent-uses-agent-tty/promoted-run-summary.md", + "dogfood/agent-uses-agent-tty/manifest.json", + "dogfood/agent-uses-agent-tty/artifacts" ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 31ee942..36c0941 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ ## Changed +- The README hero GIF (`assets/hero.tape`) and the `dogfood/agent-uses-agent-tty/` Codex/Claude recordings now record inside a tmux two-pane split: the agent (or, in the hero, plain `agent-tty` CLI calls) drives a session on the left while `agent-tty dashboard` live-mirrors it on the right — showing the dashboard reacting as sessions are created and modified. 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. The hero hides the tmux split plumbing and instead launches the dashboard on camera — typing `agent-tty dashboard` into the right pane and hopping back with the tmux prefix — and its panes/session run `bash --norc` with a minimal prompt so the live mirror stays free of personal shell-prompt clutter. It runs against this checkout's freshly-built CLI, since `agent-tty dashboard` is unreleased. A new `mise run demo:hero` task (which `depends` on `build`) regenerates the hero GIF, joining `mise run demo:agent-uses-agent-tty` for the agent recordings. `tmux` (`>= 3.1`, pinned to `3.6` in `mise`) is now a recorder prerequisite alongside `vhs`/`ttyd`/`ffmpeg`. The agent recordings now run concurrently via a bounded worker pool (`--concurrency`, default `2`) — each run is mostly an idle review-window sleep, so overlapping the two agents roughly halves wall-clock; raising the cap also overlaps an agent's own retry attempts at the cost of more CPU and shared-account load, while same-agent attempts stay serialized so two sessions of one account never record at once. - 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 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' -- ` 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](https://github.com/coder/agent-tty/pull/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](https://github.com/coder/agent-tty/pull/104)). diff --git a/README.md b/README.md index 0228b99..0d25c64 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Drive and inspect long-lived terminal sessions from the CLI, with reviewable sna [![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./LICENSE) ![Node](https://img.shields.io/node/v/agent-tty) -![agent-tty: drive a terminal session and inspect it as reviewable text](./assets/hero.gif) +![agent-tty: drive a terminal session and watch it live in the dashboard](./assets/hero.gif) `agent-tty` keeps a real PTY-backed terminal session alive across separate CLI invocations. You `run` a command in it, `wait` for the screen to reach a condition instead of sleeping, then capture what happened as a semantic text snapshot, a PNG screenshot, an asciinema-compatible `.cast`, or a WebM. The recording is the point: a human — or an AI coding agent — can replay and verify exactly what the terminal did, instead of trusting a blind script. @@ -101,8 +101,8 @@ Real Codex and Claude TUIs discovering the `agent-tty` skill, driving `nvim --cl Claude - - + + diff --git a/assets/hero.gif b/assets/hero.gif index b5d20a1..d48c639 100644 Binary files a/assets/hero.gif and b/assets/hero.gif differ diff --git a/assets/hero.tape b/assets/hero.tape index a58b0fc..3e2a34e 100644 --- a/assets/hero.tape +++ b/assets/hero.tape @@ -1,81 +1,135 @@ # assets/hero.tape — generates the README hero GIF with VHS (charmbracelet/vhs). # -# Run from the repo root: -# vhs assets/hero.tape # writes assets/hero.gif +# Regenerate (from the repo root): +# mise run demo:hero # builds the dev CLI, then runs this tape # -# Prereqs (vhs 0.11.0 + jq are pinned in mise's [tools]): -# - `agent-tty` on PATH (npm i -g agent-tty, or `npm run build && npm link`) -# - `jq` -# It uses the fast, browser-free `libghostty-vt` renderer so the GIF stays short -# (no Chromium boot). For a crisper, tighter, more "terminal" look, tune -# FontFamily (must be installed!), FontSize, LineHeight, LetterSpacing, and -# Padding below, plus the per-step Sleeps. The session is sized to 72x18 so a -# 26pt font fills the frame without the 80-col default wrapping. Regenerate, -# then replace the HERO DEMO comment block in README.md with: -# ![agent-tty: drive a terminal session and inspect it as reviewable text](./assets/hero.gif) +# That task `depends` on `build` and puts vhs/ffmpeg/tmux/jq on PATH. To run the +# tape directly instead, build first and provide those tools yourself: +# npm run build && vhs assets/hero.tape +# +# Why build first: this hero shows `agent-tty dashboard`, which is unreleased — +# a globally-installed `agent-tty` (e.g. `npm i -g agent-tty`) won't have it. So +# the hidden setup below points PATH at THIS checkout's freshly-built CLI +# (dist/cli/main.js) instead of `Require agent-tty`. It also needs the +# dashboard's optional renderer `@coder/libghostty-vt-node` (a normal `npm i` +# fetches it; check with `agent-tty doctor`). +# +# Prereqs (jq + tmux are pinned in mise's [tools]; tmux >= 3.1 for `-l 50%`): +# - `npm run build` has been run in this checkout +# - `jq`, `tmux` +# - `ttyd` (VHS needs it): mise installs it on Linux, but it has no macOS +# binary — on macOS run `brew install ttyd` yourself (mise finds it on PATH). +# +# Structure: the hidden setup builds a clean tmux split (left = operator shell, +# right = idle shell). The panes and the agent-tty session all run `bash --norc` +# (with a minimal `$ ` prompt on the panes via PS1) so they — and the dashboard's +# live mirror — stay free of personal prompt clutter; `--norc` is what keeps the +# user's interactive shell config (e.g. zsh `%{…%}` prompt escapes) out of the +# frame. The visible recording then *types* `agent-tty dashboard` into the right +# pane (so viewers see how it's launched), hops back to the left with the tmux +# prefix, and drives a session whose changes the dashboard mirrors live. +# AGENT_TTY_HOME is exported before tmux so the server and both panes share it. +# (For a minimal `$ ` prompt in the mirror too, add `--env 'PS1=$ '` to create.) +# +# TUNING (do a visual pass after regenerating): Width/Height/FontSize and the +# split percentage (`-l 50%`) trade off readability of the two panes. The split +# is 50/50; FontSize is 18 so the longest CLI lines fit one un-split half — bump +# the font only if you also widen the frame, or the operator-pane lines wrap. +# The session defaults to 80x24, a touch wider than the half-width dashboard +# pane, so its mirror clips to the top-left (where the `echo` output lands); add +# `--cols/--rows` to `create` for a tighter, fully-visible mirror. FontFamily fallbacks if FiraCode +# isn't installed: "Menlo", "SF Mono", "JetBrains Mono". Keep the README hero +# pointing at ./assets/hero.gif: +# ![agent-tty: drive a terminal session and watch it live in the dashboard](./assets/hero.gif) Output assets/hero.gif -Require agent-tty Require jq +Require tmux Set Shell bash # Use a font that's actually installed (VHS silently falls back to an ugly # default otherwise). FiraCode Nerd Font Mono is on this machine and reads clean. -# Bulletproof alternatives: "Menlo", "SF Mono", "Monaco", "JetBrains Mono". Set FontFamily "FiraCode Nerd Font Mono" -Set FontSize 26 -Set Width 1280 -Set Height 640 -Set Padding 16 # tighter frame (was 28) -Set LineHeight 1.0 # tight lines; nudge to ~1.15 if they touch -Set LetterSpacing 0 # no extra tracking -Set Theme "Catppuccin Mocha" # any VHS theme works; try "Dracula", "Nord" +# 18pt (not 20) so each half of the 50/50 split is wide enough for the longest +# CLI lines (the `create … | jq` and `run --no-wait …` lines) without wrapping. +Set FontSize 18 +Set Width 1920 +Set Height 720 +Set Padding 16 +Set LineHeight 1.0 +Set LetterSpacing 0 +Set Theme "Catppuccin Mocha" Set TypingSpeed 40ms Set PlaybackSpeed 1.0 -# --- hidden setup: isolated home + fast native renderer, then a clean screen --- +# --- hidden setup: dev CLI on PATH + a clean tmux split (operator | idle) --- +# AGENT_TTY_HOME, PATH, and PS1 are exported BEFORE tmux so the server and both +# `bash --norc` panes inherit them. The split runs idle shells; the dashboard is +# launched visibly below. kill-server first makes regeneration idempotent. Hide Type "export AGENT_TTY_HOME=$(mktemp -d) AGENT_TTY_RENDERER=libghostty-vt" Enter -Type "clear" Enter +Type "export HERO_BIN=$(mktemp -d)" Enter +Type 'chmod +x dist/cli/main.js && ln -sf "$PWD/dist/cli/main.js" "$HERO_BIN/agent-tty"' Enter +Type 'export PATH="$HERO_BIN:$PATH"' Enter +Type "export PS1='$ '" Enter +Type "tmux -L hero kill-server 2>/dev/null; true" Enter +Type "tmux -f /dev/null -L hero new-session -d -s hero 'bash --norc' \; set -g status off \; split-window -h -l 50% -t hero 'bash --norc' \; select-pane -t hero.0 \; attach -t hero" Enter Show -Sleep 800ms -Type "# open a long-lived terminal session" Enter +Sleep 1000ms +Type "# drive a real terminal session with plain CLI calls" Enter Sleep 500ms -Type 'SID=$(agent-tty create --json --cols 72 --rows 18 -- bash | jq -r .result.sessionId)' Enter +Type 'SID=$(agent-tty create --json -- bash --norc | jq -r .result.sessionId)' Enter Sleep 1200ms -Type "# run a command inside it" Enter +Type "# open the dashboard on the right to watch it live →" Enter +Sleep 600ms +# hop to the right pane with the tmux prefix (Ctrl+B then o = next pane) +Ctrl+B +Type "o" +Sleep 500ms +Type "agent-tty dashboard --all" Enter +Sleep 2200ms +# hop back to the left pane to keep driving the session +Ctrl+B +Type "o" +Sleep 600ms + +Type "# run a command inside it — watch the dashboard mirror it live →" Enter Sleep 500ms Type 'agent-tty run "$SID" "echo hello from agent-tty"' Enter -Sleep 1500ms +Sleep 2200ms -Type "# wait for the screen — no sleeps, no grep" Enter +Type "# fire a slow command, then wait for its OUTPUT — no sleeps, no polling →" Enter Sleep 500ms -Type 'agent-tty wait "$SID" --text "hello from agent-tty"' Enter -Sleep 1500ms +# Two things make the wait meaningful here: +# 1. $RANDOM is single-quoted so the SESSION expands it — the echoed command +# line shows the literal "$RANDOM", not a number. +# 2. We therefore wait on a DIGIT after the colon (--regex), NOT the phrase +# "your random number is:". That phrase is already on screen from the echoed +# command, so a --text wait would match instantly and prove nothing; the +# digits only appear once the command actually prints, after the 6s sleep. +Type "agent-tty run --no-wait $SID 'sleep 6; echo your random number is: $RANDOM'" Enter +# `wait` is typed right after the fire (no comment between) so the bulk of the 6s +# sleep elapses WHILE wait blocks — the deterministic wait is visible on camera. +Sleep 400ms +Type 'agent-tty wait "$SID" --regex "random number is: [0-9]+"' Enter +Sleep 5000ms -Type "# inspect the rendered screen as text you can diff" Enter +Type "# and snapshot the result as text you can diff" Enter Sleep 500ms Type 'agent-tty snapshot "$SID" --format text' Enter Sleep 2800ms -Type "# screenshots, asciicasts and WebM export come from the same session" Enter -Sleep 1200ms - -# --- hidden teardown --- +# --- hidden teardown: stays hidden to the end, so the GIF's last frame is the +# split — NOT the bare outer shell that `kill-server` drops back to (a trailing +# `Show` here flashes that shell + a "[server exited]" line, which looks ugly) --- Hide Type 'agent-tty destroy "$SID" >/dev/null 2>&1' Enter -Show -Sleep 500ms - -# ----------------------------------------------------------------------------- -# ALTERNATIVE — dogfood it: record the loop with agent-tty itself, then convert. -# Drive the same create/run/wait/snapshot sequence, then: -# agent-tty record export "$SID" --format webm --out demo.webm -# ffmpeg -i demo.webm -vf "fps=12,scale=1200:-1:flags=lanczos" assets/hero.gif -# This makes the hero GIF literally the tool's own output ("recorded by the tool -# it documents"), at the cost of the Chromium-backed ghostty-web render path. -# ffmpeg isn't in mise's [tools] (it can't be cross-locked on Linux via conda); -# install it yourself for this path (brew install ffmpeg / apt-get install ffmpeg). +Type "tmux -L hero kill-server" Enter +# kill-server returns to the outer shell, which still holds these vars; clean up +# the temp home + bin so repeated local runs don't litter $TMPDIR. +Type 'rm -rf "$AGENT_TTY_HOME" "$HERO_BIN"' Enter +# Hidden settle time so the cleanup completes before the tape ends (no Show). +Sleep 1s diff --git a/dogfood/agent-uses-agent-tty/README.md b/dogfood/agent-uses-agent-tty/README.md index f56f690..40a0035 100644 --- a/dogfood/agent-uses-agent-tty/README.md +++ b/dogfood/agent-uses-agent-tty/README.md @@ -14,13 +14,13 @@ The Outer Hero Demo column embeds the uploaded H.264 MP4 recordings as inline Gi Codex - + cast, WebM proof Claude - + cast, WebM proof diff --git a/dogfood/agent-uses-agent-tty/VIDEO_PLAYBACK.md b/dogfood/agent-uses-agent-tty/VIDEO_PLAYBACK.md index af84857..b501fab 100644 --- a/dogfood/agent-uses-agent-tty/VIDEO_PLAYBACK.md +++ b/dogfood/agent-uses-agent-tty/VIDEO_PLAYBACK.md @@ -35,13 +35,16 @@ mise run demo:agent-uses-agent-tty:upload-assets The task uses the pinned `ffmpeg`/`ffprobe` from `mise.toml`. For each agent it prepends ~0.3s of `artifacts/-thumbnail.png` as the opening frames, encodes H.264 MP4, writes ffprobe metadata, and writes checksums under `.debug/video-upload/`. +The upload MP4 is encoded at the recording's own probed resolution, so it always +preserves the source aspect ratio (no squish if the recording dimensions change). -Expected constraints for the promoted 2026-05-21 recordings: +Expected constraints for the current promoted recordings (dimensions track the +recording resolution, currently 1920x900): | Agent | Upload file | Expected codec | Expected dimensions | Expected size | | ------ | ------------------------------------------- | ----------------- | ------------------- | ------------- | -| Codex | `.debug/video-upload/codex-outer-h264.mp4` | H.264 / `yuv420p` | 1600x900 | ~3.5 MB | -| Claude | `.debug/video-upload/claude-outer-h264.mp4` | H.264 / `yuv420p` | 1600x900 | ~3.4 MB | +| Codex | `.debug/video-upload/codex-outer-h264.mp4` | H.264 / `yuv420p` | 1920x900 | ~3.4 MB | +| Claude | `.debug/video-upload/claude-outer-h264.mp4` | H.264 / `yuv420p` | 1920x900 | ~4.0 MB | Both expected sizes are below GitHub's 10 MB video attachment limit for free plans. diff --git a/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.cast b/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.cast index fefcc28..2b6f740 100644 --- a/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.cast +++ b/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.cast @@ -1,10 +1,25 @@ -{"version":2,"width":80,"height":24,"timestamp":1779373919,"title":"01KS5F6JED589BEY4FMH09MJ50","sessionId":"01KS5F6JED589BEY4FMH09MJ50","env":{"TERM":"xterm-256color"},"toolVersion":"0.2.0"} -[0,"o","\u001b[?1049h\u001b[22;0;0t\u001b[22;0t\u001b[?1h\u001b=\u001b[H\u001b[2J\u001b]11;?\u0007\u001b[?2004h\u001b[?u\u001b[c\u001b[?25h"] -[0.019,"o","\u001b[?25l\u001b(B\u001b[m\u001b[H\u001b[2J\u001b[K\n\u001b[94m~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n\u001b(B\u001b[0;1;7mdemo-note.txt 0,0-1 All\u001b]112\u0007\u001b[2 q\u001b]112\u0007\u001b[2 q\u001b[H\u001b[?25h"] -[0.109,"o","\u001b[?25l\u001b[?1004h\u001b[?25h"] -[2.226,"o","\u001b[?25l\u001b[24;70H\u001b(B\u001b[mi \u001b[H\u001b[?25h\u001b[?25l\u001b[24;70H \u001b]112\u0007\u001b[6 q\u001b[H\u001b[?25h\u001b[?25l\u001b[23B\u001b(B\u001b[0;1m-- INSERT --\u001b(B\u001b[m\u001b[K\u001b[?25h\u001b[?25l\u001b[23;65H\u001b(B\u001b[0;1;7m1 \u001b[H\u001b[?25h"] -[2.618,"o","\u001b[?25l\u001b(B\u001b[magent-tty nested Neovim proof from a real coding agent.\u001b[23;15H\u001b(B\u001b[0;1;7m[+]\u001b[45C1,56\u001b[1;56H\u001b[?25h"] -[3.067,"o","\u001b[?25l\u001b(B\u001b[m\r\u001b[23B\u001b[12X\u001b[23;66H\u001b(B\u001b[0;1;7m5\u001b]112\u0007\u001b[2 q\u001b[1;55H\u001b[?25h"] -[3.402,"o","\u001b[?25l\r\u001b[23B\u001b(B\u001b[m:wq\u001b]112\u0007\u001b[2 q\u001b[?25h"] -[3.793,"o","\u001b[?25l\r\u001b[24;1H\u001b[?25h"] -[3.794,"o","\u001b[?25l\"demo-note.txt\"\u001b]112\u0007\u001b[2 q\u001b[?25h\u001b[?25l\u001b[C[New] 1L, 56B written\r\u001b[24;1H\u001b[?25h\u001b[?25l\u001b]112\u0007\u001b[2 q\u001b(B\u001b[m\u001b[?25h\u001b[?1l\u001b>\u001b[?1049l\u001b[23;0;0t\u001b[23;0t\u001b[?2004l\u001b[?1004l\u001b[?25h"] +{"version":2,"width":100,"height":30,"timestamp":1780499517,"title":"01KT70N3N9V2VEJFTM65K80AZA","sessionId":"01KT70N3N9V2VEJFTM65K80AZA","env":{"TERM":"xterm-256color"},"toolVersion":"0.2.0"} +[0,"o","\u001b[?1049h\u001b[?1h\u001b=\u001b[H\u001b[2J\u001b[?2004h\u001b[?69$p\u001b[?2026$p\u001b[?2027$p\u001b[?2031$p\u001b[?2048$p\u001b[?u\u001b[c\u001b]11;?\u0007\u001b[5n\u001b[?25h"] +[0.009,"o","\u001b]11;?\u0007\u001b[5n"] +[0.009,"o","\u001b[?25l\u001b(B\u001b[m\u001b[H \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "] +[0.009,"o"," \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "] +[0.009,"o"," \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "] +[0.009,"o"," \u001b[1 q\u001b[?1002h\u001b[?1006h\u001b[H\u001b[?25h"] +[0.098,"o","\u001b[?25l\u001b[?1004h\u001b[?25h"] +[0.122,"o","\u001b[c"] +[0.122,"o","\u001b[?25l\u001b(B\u001b[m\u001b[29B\u001b[J\u001b[93mE1568: Terminal did not respond to DSR request for 'background' color. Startup may be slower. :help \u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m\u001b[H \r\n\u001b(B\u001b[m\u001b[38;2;79;82;88m\u001b[48;2;20;22;27m~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~"] +[0.122,"o"," \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ "] +[0.122,"o"," \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n\u001b(B\u001b[m\u001b[3"] +[0.122,"o","8;2;224;226;234m\u001b[48;2;79;82;88mdemo-note.txt 0,0-1 All\u001b[2 q\u001b[2 q\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m\u001b[H \r\n\u001b(B\u001b[m\u001b[38;2;79;82;88m\u001b[48;2;20;22;27m~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ "] +[0.122,"o"," \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ "] +[0.122,"o"," \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ "] +[0.122,"o"," \r\n\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88mdemo-note.txt 0,0-1 All\r\n\u001b(B\u001b[m\u001b[38;2;252;224;148m\u001b[48;2;20;22;27mE1568: Terminal did not respond to DSR request for 'background' color. Startup may be slower. :help \u001b[H\u001b[?25h"] +[13.239,"o","\u001b[?25l\u001b[30;90H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27mi \u001b[H\u001b[?25h"] +[13.239,"o","\u001b[?25l\u001b[30;90H \r\u001b[30;1H\u001b(B\u001b[m\u001b[38;2;179;246;192m\u001b[48;2;20;22;27m-- INSERT --\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m \u001b[29;85H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88m1 \u001b[6 q\u001b[H\u001b[?25h"] +[23.03,"o","\u001b[?25l\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27magent-tty nested Neovim proof from a real coding agent.\u001b[29;15H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88m[+] 1,56\u001b[1;56H\u001b[?25h"] +[28.207,"o","\u001b[?25l\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m\r\u001b[29B \u001b[29;86H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88m5\u001b[2 q\u001b[1;55H\u001b[?25h"] +[36.428,"o","\u001b[?25l\r\u001b[29B\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m:wq\u001b[2 q\u001b[?1002l\u001b[?1006l\u001b[?25h"] +[36.727,"o","\u001b[?25l\r\u001b[30;1H\u001b[?25h\u001b]9;4;3\u001b\\\u001b[?25l \r\u001b[30;1H\"demo-note.txt\"\u001b[2 q\u001b[?1002h\u001b[?1006h\u001b[C\u001b[?25h"] +[36.732,"o","\u001b]9;4;0;0\u001b\\\u001b[?25l\r\u001b[30;1H \r\u001b[30;1H\"demo-note.txt\" [New] 1L, 56B written\u001b[?25h"] +[36.732,"o","\u001b[?25l\u001b[2 q\u001b[?1002l\u001b[?1006l\u001b(B\u001b[m\u001b[?25h\u001b[2 q\u001b[?1l\u001b>\u001b[>4;0m\u001b[?2004l\u001b[?1004l\u001b[c\u001b[?25h"] +[37.734,"o","\u001b[?25l\r\u001b[30;1H\u001b[?1049l\u001b[?25h"] diff --git a/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.webm b/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.webm index 2408822..c6b78bc 100644 Binary files a/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.webm and b/dogfood/agent-uses-agent-tty/artifacts/claude-inner-nvim.webm differ diff --git a/dogfood/agent-uses-agent-tty/artifacts/claude-outer-transcript.txt b/dogfood/agent-uses-agent-tty/artifacts/claude-outer-transcript.txt index c0a7c6f..f6651ef 100644 --- a/dogfood/agent-uses-agent-tty/artifacts/claude-outer-transcript.txt +++ b/dogfood/agent-uses-agent-tty/artifacts/claude-outer-transcript.txt @@ -357,673 +357,292 @@ ──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh - -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Accessing workspace: - - /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace - - Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, - take a moment to review what's in this folder first. - - Claude Code'll be able to read, edit, and execute files here. - - Security guide - - ❯ 1. Yes, I trust this folder - 2. No, exit - - Enter to confirm · Esc to cancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh - -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Accessing workspace: - - /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace - - Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, - take a moment to review what's in this folder first. - - Claude Code'll be able to read, edit, and execute files here. - - Security guide - - ❯ 1. Yes, I trust this folder - 2. No, exit - - Enter to confirm · Esc to cancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh - -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Accessing workspace: - - /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace - - Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, - take a moment to review what's in this folder first. - - Claude Code'll be able to read, edit, and execute files here. - - Security guide - - ❯ 1. Yes, I trust this folder - 2. No, exit - - Enter to confirm · Esc to cancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh - -───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Accessing workspace: - - /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace - - Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, - take a moment to review what's in this folder first. - - Claude Code'll be able to read, edit, and execute files here. - - Security guide - - ❯ 1. Yes, I trust this folder - 2. No, exit - - Enter to confirm · Esc to cancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate +╭─── Claude Code v2.1.161 ───────────────────────────────────────────────────────────────────────────────╮│agent-tty dashboard read-only · no session selected +│ │ Tips for getting started ││Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ +│ │ ───────────────────────────────────────────────── ││ │Waiting for output… │ +│ ▐▛███▜▌ │ What's new ││ ╰─────────────────────────────────────────────────────────╯ +│ ▝▜█████▛▘ │ `OTEL_RESOURCE_ATTRIBUTES` values are now includ… ││focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit +│ ▘▘ ▝▝ │ `claude agents` rows now show `done/total` befor… ││ +│ Opus 4.7 with max effort · Claude Enterprise · │ `/mcp` now collapses claude.ai connectors you've… ││ +│ Coder │ /release-notes for more ││ +│ /…/hero-demo-1780499459706/claude-1/workspace │ ││ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + │ + ⚠ 1 setup issue: MCP · /doctor │ + │ +❯ You are running inside a disposable workspace for an agent-tty Hero Demo. │ + │ + Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim │ + session. │ + Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in │ + the wild. │ + │ + Success criteria: │ + - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. │ + - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. │ + - Create an agent-tty session that launches nvim --clean -n demo-note.txt. │ + - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. │ + - Ensure the final file path in HERO_FINAL_FILE contains that exact text. │ + - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. │ + - Destroy the agent-tty session after exporting the proof artifacts. │ + - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then │ + summarize what you did. │ + │ + Use the HERO_* environment variables for all required paths and final text. Avoid changing files │ + outside this disposable workspace. │ + │ +✢ Whisking… (1s) │ + │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ +❯  │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ + ⏵⏵ bypass permissions on (shift+tab to cycle) · esc to interrupt │ + 0 tokens │ + You're now using usage credits · Your session limit resets 6:10pm (Europe/Berlin) │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate +╭─── Claude Code v2.1.161 ───────────────────────────────────────────────────────────────────────────────╮│agent-tty dashboard read-only · no session selected +│ │ Tips for getting started ││Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ +│ │ ───────────────────────────────────────────────── ││ │Waiting for output… │ +│ ▐▛███▜▌ │ What's new ││ ╰─────────────────────────────────────────────────────────╯ +│ ▝▜█████▛▘ │ `OTEL_RESOURCE_ATTRIBUTES` values are now includ… ││focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit +│ ▘▘ ▝▝ │ `claude agents` rows now show `done/total` befor… ││ +│ Opus 4.7 with max effort · Claude Enterprise · │ `/mcp` now collapses claude.ai connectors you've… ││ +│ Coder │ /release-notes for more ││ +│ /…/hero-demo-1780499459706/claude-1/workspace │ ││ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + │ + ⚠ 1 setup issue: MCP · /doctor │ + │ +❯ You are running inside a disposable workspace for an agent-tty Hero Demo. │ + │ + Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim │ + session. │ + Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in │ + the wild. │ + │ + Success criteria: │ + - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. │ + - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. │ + - Create an agent-tty session that launches nvim --clean -n demo-note.txt. │ + - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. │ + - Ensure the final file path in HERO_FINAL_FILE contains that exact text. │ + - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. │ + - Destroy the agent-tty session after exporting the proof artifacts. │ + - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then │ + summarize what you did. │ + │ + Use the HERO_* environment variables for all required paths and final text. Avoid changing files │ + outside this disposable workspace. │ + │ +✢ Whisking… (1s) │ + │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ +❯  │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ + ⏵⏵ bypass permissions on (shift+tab to cycle) · esc to interrupt │ + 0 tokens │ + You're now using usage credits · Your session limit resets 6:10pm (Europe/Berlin) │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate +╭─── Claude Code v2.1.161 ───────────────────────────────────────────────────────────────────────────────╮│agent-tty dashboard read-only · no session selected +│ │ Tips for getting started ││Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ +│ │ ───────────────────────────────────────────────── ││ │Waiting for output… │ +│ ▐▛███▜▌ │ What's new ││ ╰─────────────────────────────────────────────────────────╯ +│ ▝▜█████▛▘ │ `OTEL_RESOURCE_ATTRIBUTES` values are now includ… ││focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit +│ ▘▘ ▝▝ │ `claude agents` rows now show `done/total` befor… ││ +│ Opus 4.7 with max effort · Claude Enterprise · │ `/mcp` now collapses claude.ai connectors you've… ││ +│ Coder │ /release-notes for more ││ +│ /…/hero-demo-1780499459706/claude-1/workspace │ ││ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + │ + ⚠ 1 setup issue: MCP · /doctor │ + │ +❯ You are running inside a disposable workspace for an agent-tty Hero Demo. │ + │ + Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim │ + session. │ + Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in │ + the wild. │ + │ + Success criteria: │ + - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. │ + - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. │ + - Create an agent-tty session that launches nvim --clean -n demo-note.txt. │ + - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. │ + - Ensure the final file path in HERO_FINAL_FILE contains that exact text. │ + - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. │ + - Destroy the agent-tty session after exporting the proof artifacts. │ + - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then │ + summarize what you did. │ + │ + Use the HERO_* environment variables for all required paths and final text. Avoid changing files │ + outside this disposable workspace. │ + │ +✶ Whisking… (2s · thinking with max effort) │ + │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ +❯  │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ + ⏵⏵ bypass permissions on (shift+tab to cycle) · esc to interrupt │ + 0 tokens │ + You're now using usage credits · Your session limit resets 6:10pm (Europe/Berlin) │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate +╭─── Claude Code v2.1.161 ───────────────────────────────────────────────────────────────────────────────╮│agent-tty dashboard read-only · no session selected +│ │ Tips for getting started ││Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ +│ │ ───────────────────────────────────────────────── ││ │Waiting for output… │ +│ ▐▛███▜▌ │ What's new ││ ╰─────────────────────────────────────────────────────────╯ +│ ▝▜█████▛▘ │ `OTEL_RESOURCE_ATTRIBUTES` values are now includ… ││focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit +│ ▘▘ ▝▝ │ `claude agents` rows now show `done/total` befor… ││ +│ Opus 4.7 with max effort · Claude Enterprise · │ `/mcp` now collapses claude.ai connectors you've… ││ +│ Coder │ /release-notes for more ││ +│ /…/hero-demo-1780499459706/claude-1/workspace │ ││ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + │ + ⚠ 1 setup issue: MCP · /doctor │ + │ +❯ You are running inside a disposable workspace for an agent-tty Hero Demo. │ + │ + Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim │ + session. │ + Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in │ + the wild. │ + │ + Success criteria: │ + - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. │ + - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. │ + - Create an agent-tty session that launches nvim --clean -n demo-note.txt. │ + - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. │ + - Ensure the final file path in HERO_FINAL_FILE contains that exact text. │ + - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. │ + - Destroy the agent-tty session after exporting the proof artifacts. │ + - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then │ + summarize what you did. │ + │ + Use the HERO_* environment variables for all required paths and final text. Avoid changing files │ + outside this disposable workspace. │ + │ +✶ Whisking… (2s · thinking with max effort) │ + │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ +❯  │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ + ⏵⏵ bypass permissions on (shift+tab to cycle) · esc to interrupt │ + 0 tokens │ + You're now using usage credits · Your session limit resets 6:10pm (Europe/Berlin) │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate +╭─── Claude Code v2.1.161 ───────────────────────────────────────────────────────────────────────────────╮│agent-tty dashboard read-only · no session selected +│ │ Tips for getting started ││Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ +│ │ ───────────────────────────────────────────────── ││ │Waiting for output… │ +│ ▐▛███▜▌ │ What's new ││ ╰─────────────────────────────────────────────────────────╯ +│ ▝▜█████▛▘ │ `OTEL_RESOURCE_ATTRIBUTES` values are now includ… ││focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit +│ ▘▘ ▝▝ │ `claude agents` rows now show `done/total` befor… ││ +│ Opus 4.7 with max effort · Claude Enterprise · │ `/mcp` now collapses claude.ai connectors you've… ││ +│ Coder │ /release-notes for more ││ +│ /…/hero-demo-1780499459706/claude-1/workspace │ ││ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + │ + ⚠ 1 setup issue: MCP · /doctor │ + │ +❯ You are running inside a disposable workspace for an agent-tty Hero Demo. │ + │ + Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim │ + session. │ + Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in │ + the wild. │ + │ + Success criteria: │ + - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. │ + - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. │ + - Create an agent-tty session that launches nvim --clean -n demo-note.txt. │ + - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. │ + - Ensure the final file path in HERO_FINAL_FILE contains that exact text. │ + - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. │ + - Destroy the agent-tty session after exporting the proof artifacts. │ + - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then │ + summarize what you did. │ + │ + Use the HERO_* environment variables for all required paths and final text. Avoid changing files │ + outside this disposable workspace. │ + │ +✶ Whisking… (2s · thinking with max effort) │ + │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ +❯  │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ + ⏵⏵ bypass permissions on (shift+tab to cycle) · esc to interrupt │ + 0 tokens │ + You're now using usage credits · Your session limit resets 6:10pm (Europe/Berlin) │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/run-claude.sh -╭─── Claude Code v2.1.143 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ Tips for getting started │ -│ │ ──────────────────────────────────────────────────────────────────────────────────────────────────────── │ -│ ▐▛███▜▌ │ What's new │ -│ ▝▜█████▛▘ │ Added `claude agents --json` to list live Claude sessions as JSON for scripting (tmux-resurrect, status… │ -│ ▘▘ ▝▝ │ Added `agent_id` and `parent_agent_id` attributes to `claude_code.tool` OTEL spans, and fixed trace par… │ -│ Coder │ /release-notes for more │ -│ /…/hero-demo-1779369037179/claude-1/workspace │ │ -╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ - -❯ You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - -● Bash(env | grep -E "HERO_|AGENT_TTY" | sort) - ⎿  AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/inner-home - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/claude-1/workspace/demo-note.txt - … +2 lines (ctrl+o to expand) - -● Bash(which agent-tty && agent-tty --help 2>&1 | head -50) - ⎿  /tmp/agent-tty-hero-demo/hero-demo-1779369037179/install/bin/agent-tty - MANDATORY FOR CODING AGENTS: read the `agent-tty` skill first. If your agent already loaded that skill, follow it; otherwise run `agent-tty skills get - agent-tty` before any other agent-tty command. - … +29 lines (ctrl+o to expand) - - Listed 1 directory (ctrl+o to expand) - -● Bash(agent-tty skills get agent-tty 2>&1 | head -200) - ⎿  --- - name: agent-tty - description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate + "env": { │agent-tty dashboard read-only · …M65K80AZA exited + "TERM": "xterm-256color" │Sessions · all (1) ╭─────────────────────────────────────────────────────────╮ + }, │▸ ○ …M65K80AZA nvim-demo │screen 100×30 clip → · exited (code 0) │ + "toolVersion": "0.2.0" │ │ │ + } │ │ │ + [0,"o", │ │ │ + ---- webm magic ---- │ │ │ + 00000000: 1a45 dfa3 9f42 8681 0142 f781 0142 f281 .E...B...B...B.. │ │ │ + 00000010: 0442 f381 0842 8284 7765 626d 4287 8102 .B...B..webmB... │ │ │ + │ │ │ +⏺ Both artifacts are valid (asciicast v2 header, EBML/webm magic). Now I'll destroy the session. │ │ │ + │ │ │ +⏺ Bash(SESSION_ID=$(cat /tmp/hero-session-id) │ │ │ + agent-tty destroy "$SESSION_ID" --json 2>&1 | jq '{ok, destroyed: .result.destroyed, error}' │ │ │ + echo "---- remaining sessions ----" │ │ │ + agent-tty list --json 2>&1 | jq '.result.sessions | map({id, status})') │ │ │ + ⎿  { │ │ │ + "ok": true, │ │ │ + "destroyed": true, │ │ │ + "error": null │ │ │ + } │ │ │ + ---- remaining sessions ---- │ │ │ + [] │ │ │ + │ │ │ +⏺ Done. Here's what the run produced: │ │ │ + │ │ │ + Workflow (all via agent-tty on PATH against the preset AGENT_TTY_HOME): │ │ │ + 1. Loaded the packaged agent-tty skill with agent-tty skills get agent-tty (the CLI gates real commands │ │ │ + on this). │ │ │ + 2. doctor --json — all environment, renderer, and PTY checks passed. │ │ │ + 3. create --cols 100 --rows 30 -- nvim --clean -n demo-note.txt → session 01KT70N3N9V2VEJFTM65K80AZA. │ │ │ + 4. Drove nvim: send-keys i → wait --text INSERT → type "$HERO_EXPECTED_TEXT" → send-keys Escape → type │ │ │ + :wq + send-keys Enter. Each step gated on a wait observation, not sleep. │ │ │ + 5. record export twice (asciicast + webm) into the HERO paths. │ ╰─────────────────────────────────────────────────────────╯ + 6. destroy — list --json confirms zero remaining sessions. │focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit + │ + Proof artifacts: │ + - demo-note.txt — byte-exact diff against HERO_EXPECTED_TEXT clean. │ + - artifacts/inner-nvim.cast — 12 KB, valid asciicast v2 header. │ + - artifacts/inner-nvim.webm — 40 KB, valid EBML/webm magic. │ + │ +✻ Churned for 1m 50s │ + │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ +❯  │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ + ⏵⏵ bypass permissions on (shift+tab to cycle) · ← for agents 47983 tokens │ + │ ──────────────────────────────────────────────────────────────────────────────── diff --git a/dogfood/agent-uses-agent-tty/artifacts/claude-outer.webm b/dogfood/agent-uses-agent-tty/artifacts/claude-outer.webm index 1908099..72a165d 100644 Binary files a/dogfood/agent-uses-agent-tty/artifacts/claude-outer.webm and b/dogfood/agent-uses-agent-tty/artifacts/claude-outer.webm differ diff --git a/dogfood/agent-uses-agent-tty/artifacts/claude-prompt.md b/dogfood/agent-uses-agent-tty/artifacts/claude-prompt.md index 78e8ca6..6b4f574 100644 --- a/dogfood/agent-uses-agent-tty/artifacts/claude-prompt.md +++ b/dogfood/agent-uses-agent-tty/artifacts/claude-prompt.md @@ -4,7 +4,6 @@ Explore the installed agent-tty skill and CLI yourself, then use agent-tty to dr Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - Create an agent-tty session that launches nvim --clean -n demo-note.txt. @@ -14,4 +13,4 @@ Success criteria: - Destroy the agent-tty session after exporting the proof artifacts. - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. -Use the HERO\_\* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. +Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. diff --git a/dogfood/agent-uses-agent-tty/artifacts/claude-thumbnail.png b/dogfood/agent-uses-agent-tty/artifacts/claude-thumbnail.png index 12a36e7..29574e6 100644 Binary files a/dogfood/agent-uses-agent-tty/artifacts/claude-thumbnail.png and b/dogfood/agent-uses-agent-tty/artifacts/claude-thumbnail.png differ diff --git a/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.cast b/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.cast index 73dd9e7..db5c863 100644 --- a/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.cast +++ b/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.cast @@ -1,19 +1,22 @@ -{"version":2,"width":80,"height":24,"timestamp":1779369067,"title":"01KS5AJG5YSXJY31B228RXT3AF","sessionId":"01KS5AJG5YSXJY31B228RXT3AF","env":{"TERM":"xterm-256color"},"toolVersion":"0.2.0"} -[0,"o","\u001b[?1049h\u001b[22;0;0t\u001b[?1h\u001b=\u001b[H\u001b[2J\u001b[?2004h\u001b[?69$p\u001b[?2026$p\u001b[?2027$p\u001b[?2031$p\u001b[?2048$p\u001b[0m\u001b[4:3m\u001bP$qm\u001b\\\u001b[?u\u001b[c\u001b]11;?\u0007\u001b[5n\u001b[?25h"] -[0.004,"o","\u001b]11;?\u0007\u001b[5n"] -[0.004,"o","\u001b[?25l\u001b(B\u001b[m\u001b[H \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \u001b[1 q\u001b[?1002h\u001b[?1006h\u001b[H\u001b[?25h"] -[0.08,"o","\u001b[?25l\u001b[?1004h\u001b[?25h"] -[0.12,"o","\u001bP+q5463;524742;73657472676266;73657472676262\u001b\\\u001b[0m\u001b[48;2;1;2;3m\u001bP$qm\u001b\\\u001b[c\u001b[?25l\u001b(B\u001b[m\u001b[23B\u001b[J\u001b[93mE1568: Terminal did not respond to DSR request for 'background' color. Startup m\u001b(B\u001b[m\u001b[H\u001b[K\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n\u001b(B\u001b[0;7mdemo-note.txt 0,0-1 All\u001b[2 q\u001b[2 q\u001b(B\u001b[m\u001b[H\u001b[K\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n~\u001b[K\r\n\u001b(B\u001b[0;7mdemo-note.txt 0,0-1 All\r\n\u001b(B\u001b[m\u001b[93mE1568: Terminal did not respond to DSR request for 'background' color. Startup m\u001b[H\u001b[?25h"] -[14.156,"o","\u001b[?25l\u001b[24;70H\u001b(B\u001b[mi \u001b[H\u001b[?25h"] -[14.157,"o","\u001b[?25l\u001b[24;70H \r\u001b[24;1H\u001b[92m-- INSERT --\u001b(B\u001b[m\u001b[K\u001b[23;65H\u001b(B\u001b[0;7m1 \u001b[6 q\u001b[H\u001b[?25h"] -[16.308,"o","\u001b[?25l\u001b(B\u001b[magent-tty nested Neovim proof from a real coding agent.\u001b[23;15H\u001b(B\u001b[0;7m[+] 1,56\u001b[H\u001b[?25h"] -[16.308,"o","\u001b[?25l\u001b[55C\u001b[?25h"] -[20.748,"o","\u001b[?25l\u001b(B\u001b[m\r\u001b[23B\u001b[12X\u001b[23;66H\u001b(B\u001b[0;7m5\u001b[2 q\u001b[1;55H\u001b[?25h"] -[21.096,"o","\u001b[?25l\r\u001b[23B\u001b(B\u001b[m:wq\u001b[2 q\u001b[?1002l\u001b[?1006l\u001b[?25h"] -[21.506,"o","\u001b[?25l\r\u001b[24;1H\u001b[?25h"] -[21.506,"o","\u001b]9;4;3\u001b\\"] -[21.506,"o","\u001b[?25l\u001b[3X\"demo-note.txt\"\u001b[2 q\u001b[?1002h\u001b[?1006h\u001b[C\u001b[?25h"] -[21.511,"o","\u001b]9;4;0;0\u001b\\"] -[21.511,"o","\u001b[?25l\r\u001b[24;1H\u001b[15X\"demo-note.txt\" [New] 1L, 56B written\u001b[?25h"] -[21.513,"o","\u001b[?25l\u001b[2 q\u001b[?1002l\u001b[?1006l\u001b(B\u001b[m\u001b[?25h\u001b[2 q\u001b[?1l\u001b>\u001b[>4;0m\u001b[?2004l\u001b[?1004l\u001b[c\u001b[?25h"] -[22.519,"o","\u001b[?25l\r\u001b[24;1H\u001b[?1049l\u001b[23;0;0t\u001b[?25h"] +{"version":2,"width":80,"height":24,"timestamp":1780499821,"title":"01KT70YCX4KMF2KYT6QEFXY2R1","sessionId":"01KT70YCX4KMF2KYT6QEFXY2R1","env":{"TERM":"xterm-256color"},"toolVersion":"0.2.0"} +[0,"o","\u001b[?1049h\u001b[?1h\u001b=\u001b[H\u001b[2J\u001b[?2004h\u001b[?69$p\u001b[?2026$p\u001b[?2027$p\u001b[?2031$p\u001b[?2048$p\u001b[?u\u001b[c\u001b]11;?\u0007\u001b[5n\u001b[?25h"] +[0.006,"o","\u001b]11;?\u0007\u001b[5n"] +[0.006,"o","\u001b[?25l\u001b(B\u001b[m\u001b[H \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n "] +[0.006,"o"," \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \u001b[1 q\u001b[?1002h\u001b[?1006h\u001b[H\u001b[?25h"] +[0.098,"o","\u001b[?25l\u001b[?1004h\u001b[?25h"] +[0.122,"o","\u001b[c"] +[0.123,"o","\u001b[?25l\u001b(B\u001b[m\u001b[23B\u001b[J\u001b[93mE1568: Terminal did not respond to DSR request for 'background' color. Startup m\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m\u001b[H \r\n\u001b(B\u001b[m\u001b[38;2;79;82;88m\u001b[48;2;20;22;27m~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ "] +[0.123,"o"," \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88mdemo-note.txt "] +[0.123,"o"," 0,0-1 All\u001b[2 q\u001b[2 q\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m\u001b[H \r\n\u001b(B\u001b[m\u001b[38;2;79;82;88m\u001b[48;2;20;22;27m~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ "] +[0.123,"o"," \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n~ \r\n\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88mdemo-note.txt "] +[0.123,"o"," 0,0-1 All\r\n\u001b(B\u001b[m\u001b[38;2;252;224;148m\u001b[48;2;20;22;27mE1568: Terminal did not respond to DSR request for 'background' color. Startup m\u001b[H\u001b[?25h"] +[9.373,"o","\u001b[?25l\u001b[24;70H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27mi \u001b[H\u001b[?25h\u001b[?25l\u001b[24;70H \r\u001b[24;1H\u001b(B\u001b[m\u001b[38;2;179;246;192m\u001b[48;2;20;22;27m-- INSERT --\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m \u001b[23;65H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88m1 \u001b[6 q\u001b[H\u001b[?25h"] +[9.6,"o","\u001b[?25l\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27magent-tty nested Neovim proof from a real coding agent.\u001b[23;15H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88m[+] 1,56\u001b[H\u001b[?25h"] +[9.6,"o","\u001b[?25l\u001b[55C\u001b[?25h"] +[26.967,"o","\u001b[?25l\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m\r\u001b[23B \u001b[23;66H\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;79;82;88m5\u001b[2 q\u001b[1;55H\u001b[?25h"] +[27.157,"o","\u001b[?25l\r\u001b[23B\u001b(B\u001b[m\u001b[38;2;224;226;234m\u001b[48;2;20;22;27m:wq\u001b[2 q\u001b[?1002l\u001b[?1006l\u001b[?25h"] +[27.415,"o","\u001b[?25l\r\u001b[24;1H\u001b[?25h\u001b]9;4;3\u001b\\\u001b[?25l \r\u001b[24;1H\"demo-note.txt\"\u001b[2 q\u001b[?1002h\u001b[?1006h\u001b[C\u001b[?25h"] +[27.432,"o","\u001b]9;4;0;0\u001b\\"] +[27.432,"o","\u001b[?25l\r\u001b[24;1H \r\u001b[24;1H\"demo-note.txt\" [New] 1L, 56B written\u001b[?25h"] +[27.433,"o","\u001b[?25l\u001b[2 q\u001b[?1002l\u001b[?1006l\u001b(B\u001b[m\u001b[?25h\u001b[2 q\u001b[?1l\u001b>\u001b[>4;0m\u001b[?2004l\u001b[?1004l\u001b[c\u001b[?25h"] +[28.434,"o","\u001b[?25l\r\u001b[24;1H\u001b[?1049l\u001b[?25h"] diff --git a/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.webm b/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.webm index 8e2b333..9c76336 100644 Binary files a/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.webm and b/dogfood/agent-uses-agent-tty/artifacts/codex-inner-nvim.webm differ diff --git a/dogfood/agent-uses-agent-tty/artifacts/codex-outer-transcript.txt b/dogfood/agent-uses-agent-tty/artifacts/codex-outer-transcript.txt index 70564e9..cec93a3 100644 --- a/dogfood/agent-uses-agent-tty/artifacts/codex-outer-transcript.txt +++ b/dogfood/agent-uses-agent-tty/artifacts/codex-outer-transcript.txt @@ -357,689 +357,297 @@ ──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/run-codex.sh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> bash /tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/run-codex.sh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> You are in /tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace - - Do you trust the contents of this directory? Working with untrusted contents comes with higher risk of prompt injection. Trusting the directory allows - project-local config, hooks, and exec policies to load. - -› 1. Yes, continue - 2. No, quit - - Press enter to continue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────── -> You are in /tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace - - Do you trust the contents of this directory? Working with untrusted contents comes with higher risk of prompt injection. Trusting the directory allows - project-local config, hooks, and exec policies to load. - -› 1. Yes, continue - 2. No, quit - - Press enter to continue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +> You are in /var/folders/xk/64lk216n7cd7_7yk0dsd08xw0000gn/T/agent-tty-hero-demo/hero-demo-1780499459706/│agent-tty dashboard read-only · no session selected + │Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ + Do you trust the contents of this directory? Working with untrusted contents comes with higher risk of │no sessions │live view │ + prompt injection. Trusting the directory allows project-local config, hooks, and exec policies to load. │ │Waiting for output… │ + │ ╰─────────────────────────────────────────────────────────╯ +› 1. Yes, continue │focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit + 2. No, quit │ + │ + Press enter to continue │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── -> You are in /tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace - - Do you trust the contents of this directory? Working with untrusted contents comes with higher risk of prompt injection. Trusting the directory allows - project-local config, hooks, and exec policies to load. - -› 1. Yes, continue - 2. No, quit - - Press enter to continue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +> You are in /var/folders/xk/64lk216n7cd7_7yk0dsd08xw0000gn/T/agent-tty-hero-demo/hero-demo-1780499459706/│agent-tty dashboard read-only · no session selected + │Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ + Do you trust the contents of this directory? Working with untrusted contents comes with higher risk of │no sessions │live view │ + prompt injection. Trusting the directory allows project-local config, hooks, and exec policies to load. │ │Waiting for output… │ + │ ╰─────────────────────────────────────────────────────────╯ +› 1. Yes, continue │focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit + 2. No, quit │ + │ + Press enter to continue │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - - -› Run /review on my current changes - - gpt-5.5 low · /tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace - - - - - - +> You are in /var/folders/xk/64lk216n7cd7_7yk0dsd08xw0000gn/T/agent-tty-hero-demo/hero-demo-1780499459706/│agent-tty dashboard read-only · no session selected + │Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ + Do you trust the contents of this directory? Working with untrusted contents comes with higher risk of │no sessions │live view │ + prompt injection. Trusting the directory allows project-local config, hooks, and exec policies to load. │ │Waiting for output… │ + │ ╰─────────────────────────────────────────────────────────╯ +› 1. Yes, continue │focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit + 2. No, quit │ + │ + Press enter to continue │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' +> You are in /var/folders/xk/64lk216n7cd7_7yk0dsd08xw0000gn/T/agent-tty-hero-demo/hero-demo-1780499459706/│agent-tty dashboard read-only · no session selected + │Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ + Do you trust the contents of this directory? Working with untrusted contents comes with higher risk of │no sessions │live view │ + prompt injection. Trusting the directory allows project-local config, hooks, and exec policies to load. │ │Waiting for output… │ + │ ╰─────────────────────────────────────────────────────────╯ +› 1. Yes, continue │focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit + 2. No, quit │ + │ + Press enter to continue │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' -──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' + │agent-tty dashboard read-only · no session selected +╭──────────────────────────────────────────────────╮ │Sessions · all (0) ╭─────────────────────────────────────────────────────────╮ +│ >_ OpenAI Codex (v0.136.0) │ │no sessions │live view │ +│ │ │ │Waiting for output… │ +│ model: loading /model to change │ │ ╰─────────────────────────────────────────────────────────╯ +│ directory: /var/folders/xk/…/codex-1/workspace │ │focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit +│ permissions: YOLO mode │ │ +╰──────────────────────────────────────────────────╯ │ + │ + │ +› Implement {feature} │ + │ + gpt-5.5 default · /var/folders/xk/64lk216n7cd7_7yk0dsd08xw0000gn/T/agent-tty-hero-demo/hero-demo-178049…│ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ ──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' -──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' -──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' -──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' -──────────────────────────────────────────────────────────────────────────────── - -╭───────────────────────────────────────────────────────────────╮ -│ ✨ Update available! 0.130.0 -> 0.132.0 │ -│ See https://github.com/openai/codex for installation options. │ -│ │ -│ See full release notes: │ -│ https://github.com/openai/codex/releases/latest │ -╰───────────────────────────────────────────────────────────────╯ - -╭─────────────────────────────────────────────╮ -│ >_ OpenAI Codex (v0.130.0) │ -│ │ -│ model: gpt-5.5 low /model to change │ -│ directory: /tmp/…/codex-1/workspace │ -│ permissions: YOLO mode │ -╰─────────────────────────────────────────────╯ - - Tip: New Build faster with Codex. - - -› You are running inside a disposable workspace for an agent-tty Hero Demo. - - Explore the installed agent-tty skill and CLI yourself, then use agent-tty to drive a real Neovim session. - Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. - - Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - - Create an agent-tty session that launches nvim --clean -n demo-note.txt. - - Interact with Neovim through agent-tty and write exactly the text in HERO_EXPECTED_TEXT. - - Ensure the final file path in HERO_FINAL_FILE contains that exact text. - - Export the inner agent-tty recording to HERO_INNER_CAST and HERO_INNER_WEBM. - - Destroy the agent-tty session after exporting the proof artifacts. - - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. - - Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. - - -• I’ll inspect the local environment and the packaged agent-tty guidance first, then I’ll drive Neovim through the CLI and produce the requested artifacts. - -• Ran printenv | rg '^HERO_|^AGENT_TTY_HOME' - └ HERO_FINAL_FILE=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/demo-note.txt - HERO_INNER_WEBM=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.webm - HERO_INNER_CAST=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/workspace/artifacts/inner-nvim.cast - HERO_EXPECTED_TEXT=agent-tty nested Neovim proof from a real coding agent. - AGENT_TTY_HOME=/tmp/agent-tty-hero-demo/hero-demo-1779369037179/codex-1/inner-home - -• Ran rg --files /.agents/skills /.codex/skills 2>/dev/null | rg 'agent-tty|tty|SKILL.md' + │agent-tty dashboard read-only · …6QEFXY2R1 exited +• Ran SID=01KT70YCX4KMF2KYT6QEFXY2R1 │Sessions · all (1) ╭─────────────────────────────────────────────────────────╮ + │ agent-tty --home "$AGENT_TTY_HOME" send-keys "$SID" Escape --json │▸ ○ …6QEFXY2R1 hero-inner-n… │screen 80×24 clip → · exited (code 0) │ + │ agent-tty --home "$AGENT_TTY_HOME" type "$SID" ':wq' --json │ │ │ + │ … +3 lines │ │ │ + └ { │ │ │ + "ok": true, │ │ │ + … +37 lines (ctrl + t to view transcript) │ │ │ + FILE:agent-tty nested Neovim proof from a real coding agent. │ │ │ + │ │ │ + │ │ │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ │ │ + │ │ │ +• The editor exited cleanly and the target file contains the required line. I’m exporting both recording │ │ │ + formats to the requested artifact paths now, then I’ll destroy the session and do a final verification. │ │ │ + │ │ │ +• Ran SID=01KT70YCX4KMF2KYT6QEFXY2R1 │ │ │ + │ mkdir -p "$(dirname "$HERO_INNER_CAST")" "$(dirname "$HERO_INNER_WEBM")" │ │ │ + │ agent-tty --home "$AGENT_TTY_HOME" record export "$SID" --format asciicast --out "$HERO_INNER_CAST" │ │ │ + │ … +18 lines │ │ │ + └ { │ │ │ + "ok": true, │ │ │ + … +66 lines (ctrl + t to view transcript) │ │ │ + cast_exists_bytes True 9002 │ │ │ + webm_exists_bytes True 35448 │ │ │ + │ │ │ +──────────────────────────────────────────────────────────────────────────────────────────────────────────│ │ │ + │ ╰─────────────────────────────────────────────────────────╯ +• Completed. │focus:list · Tab switch · ↑/↓ j/k select · a scope · z overview · q quit + │ + I used the packaged agent-tty skill and CLI help, created a real agent-tty session running nvim --clean │ + -n demo-note.txt, inserted the HERO_EXPECTED_TEXT, saved and exited Neovim, exported both proof │ + artifacts, then destroyed the session. │ + │ + Verified: │ + │ + - Final file: demo-note.txt │ + - Text line matches HERO_EXPECTED_TEXT │ + - Cast exported: artifacts/inner-nvim.cast (9002 bytes) │ + - WebM exported: artifacts/inner-nvim.webm (35448 bytes) │ + - agent-tty list shows no remaining sessions. │ + │ +─ Worked for 1m 20s ──────────────────────────────────────────────────────────────────────────────────────│ + │ + │ +› Implement {feature} │ + │ + gpt-5.5 low · /var/folders/xk/64lk216n7cd7_7yk0dsd08xw0000gn/T/agent-tty-hero-demo/hero-demo-1780499459…│ ──────────────────────────────────────────────────────────────────────────────── diff --git a/dogfood/agent-uses-agent-tty/artifacts/codex-outer.webm b/dogfood/agent-uses-agent-tty/artifacts/codex-outer.webm index 91bc2c3..62530ba 100644 Binary files a/dogfood/agent-uses-agent-tty/artifacts/codex-outer.webm and b/dogfood/agent-uses-agent-tty/artifacts/codex-outer.webm differ diff --git a/dogfood/agent-uses-agent-tty/artifacts/codex-prompt.md b/dogfood/agent-uses-agent-tty/artifacts/codex-prompt.md index 78e8ca6..6b4f574 100644 --- a/dogfood/agent-uses-agent-tty/artifacts/codex-prompt.md +++ b/dogfood/agent-uses-agent-tty/artifacts/codex-prompt.md @@ -4,7 +4,6 @@ Explore the installed agent-tty skill and CLI yourself, then use agent-tty to dr Do not run a prewritten helper script; this run is meant to show how a coding agent uses agent-tty in the wild. Success criteria: - - Learn the available workflow from the packaged agent-tty skill and CLI help as needed. - Use the agent-tty binary on PATH and the already configured AGENT_TTY_HOME. - Create an agent-tty session that launches nvim --clean -n demo-note.txt. @@ -14,4 +13,4 @@ Success criteria: - Destroy the agent-tty session after exporting the proof artifacts. - The recorder stops after a fixed review window, so complete the proof artifacts promptly and then summarize what you did. -Use the HERO\_\* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. +Use the HERO_* environment variables for all required paths and final text. Avoid changing files outside this disposable workspace. diff --git a/dogfood/agent-uses-agent-tty/artifacts/codex-thumbnail.png b/dogfood/agent-uses-agent-tty/artifacts/codex-thumbnail.png index 62f0e44..d4db216 100644 Binary files a/dogfood/agent-uses-agent-tty/artifacts/codex-thumbnail.png and b/dogfood/agent-uses-agent-tty/artifacts/codex-thumbnail.png differ diff --git a/dogfood/agent-uses-agent-tty/manifest.json b/dogfood/agent-uses-agent-tty/manifest.json index d2db7e4..8bcedec 100644 --- a/dogfood/agent-uses-agent-tty/manifest.json +++ b/dogfood/agent-uses-agent-tty/manifest.json @@ -2,47 +2,47 @@ "bundle": "agent-uses-agent-tty", "title": "Agents use agent-tty: Codex and Claude Hero Demo", "description": "README-facing Hero Demo where VHS records real Codex and Claude TUIs while agent-tty produces inner proof artifacts.", - "createdAt": "2026-05-21T15:55:52.138Z", + "createdAt": "2026-06-03T15:42:44.685Z", "result": "pass", "commands": [ - "mise run demo:agent-uses-agent-tty -- --agent both --runs 3 --record-seconds 180 --promote" + "mise run demo:agent-uses-agent-tty -- --record-seconds 180" ], "artifacts": [ { "path": "artifacts/codex-outer.webm", "description": "Outer VHS WebM recording for codex", - "sha256": "349c9da276ea3817d393febfb01bb76b7019cd9421e94e0361c82b6f9255186e", - "bytes": 4584146 + "sha256": "92337026f3691843809c75df883d85cbdc85586f184e1b734f4e739f566fff28", + "bytes": 4917845 }, { "path": "artifacts/codex-thumbnail.png", "description": "Outer VHS thumbnail for codex", - "sha256": "a2429160222b759697ac7e4dd1ebe1480c74d257c6ee22efe3feadca24a87f43", - "bytes": 345770 + "sha256": "72847035ea8f6f5ed4cda51bb2a0c01d52be12bd3cf53c6178f2193e2acd21d4", + "bytes": 411179 }, { "path": "artifacts/codex-outer-transcript.txt", "description": "Outer transcript for codex", - "sha256": "b65afa738d8675ea5c419d6bfb9437a61ca3cce6c05fbd43634a0967ada627ea", - "bytes": 35843 + "sha256": "15ec9973fb07dd816d79040034abaef0a88fe2376389e344bb0200da35364124", + "bytes": 42578 }, { "path": "artifacts/codex-prompt.md", "description": "Prompt used for codex", - "sha256": "025f6c8c8f374aadcb1f3bbe39cff5669ebb58157b990f0a9a92b56ee84a3c3f", - "bytes": 1128 + "sha256": "512112476c7d51b32d4e199f1bc2b61c7a6580ec160451c30a9244e801270338", + "bytes": 1125 }, { "path": "artifacts/codex-inner-nvim.cast", "description": "Inner agent-tty asciicast for codex", - "sha256": "4ffb7cad68b3941654843c6fb0b7a9fea57596b66f55f8dcbaa5b3c16f5ea041", - "bytes": 5188 + "sha256": "40c70736b557ae75c0674dd56e43eb7d38bf9fe3b6e687803626354bfe1c0b6c", + "bytes": 9002 }, { "path": "artifacts/codex-inner-nvim.webm", "description": "Inner agent-tty WebM for codex", - "sha256": "264a3368b40d8f3e3b88351d429f23b87786babaa2e6c34ee8fe886c72f4ec63", - "bytes": 32978 + "sha256": "b8eda35b93055d6d969839c86b424553e97cfdc9f424affaccc66326aec8df12", + "bytes": 35448 }, { "path": "artifacts/codex-final-file-proof.txt", @@ -59,38 +59,38 @@ { "path": "artifacts/claude-outer.webm", "description": "Outer VHS WebM recording for claude", - "sha256": "e97de5e18ff3742fef9e72eee91b3f4c9c8cbd1919ad39fc0b3e1a2e2808c481", - "bytes": 4327998 + "sha256": "8855d91e319be92b21088adc7da6856b7228882765badc7fe8a4a976a1c82669", + "bytes": 5481899 }, { "path": "artifacts/claude-thumbnail.png", "description": "Outer VHS thumbnail for claude", - "sha256": "70cc66a6411a9ecaac48d327ce4de1a4dfe0c84de7e95e9f981fdfc44f3d2db6", - "bytes": 310294 + "sha256": "daebf2267afb0da05a5448fd3837c0ff536c5887d58911689705cd1d1adbec23", + "bytes": 424767 }, { "path": "artifacts/claude-outer-transcript.txt", "description": "Outer transcript for claude", - "sha256": "03ca6c0569ea24359d08acedad26a4c78b616a9b761aac5c44a785573033b191", - "bytes": 46943 + "sha256": "1ca35c99ab6d54cf37bbda928adb0aefce12b922a1c808957749ab5305312554", + "bytes": 46794 }, { "path": "artifacts/claude-prompt.md", "description": "Prompt used for claude", - "sha256": "025f6c8c8f374aadcb1f3bbe39cff5669ebb58157b990f0a9a92b56ee84a3c3f", - "bytes": 1128 + "sha256": "512112476c7d51b32d4e199f1bc2b61c7a6580ec160451c30a9244e801270338", + "bytes": 1125 }, { "path": "artifacts/claude-inner-nvim.cast", "description": "Inner agent-tty asciicast for claude", - "sha256": "6f44135e3a145adddbd178ff358e75abe88dce08916ade87b0f1e0ecd1d17a61", - "bytes": 1982 + "sha256": "6eb318450be9ac81d4fe00579cc0d700e92d126e0251cda05331dd3f08cb2529", + "bytes": 12377 }, { "path": "artifacts/claude-inner-nvim.webm", "description": "Inner agent-tty WebM for claude", - "sha256": "f7d4b1a5f3c107b0ee0d80602ca19309d7a93fde3a9afeb568a7d743185ee366", - "bytes": 22340 + "sha256": "c9df8cd4e40c35ffa4435beec54cda016d239bfebdbec2e20e5e50f0313ac4fd", + "bytes": 39546 }, { "path": "artifacts/claude-final-file-proof.txt", @@ -107,26 +107,26 @@ { "path": "promoted-run-summary.md", "description": "Promotion summary proving three successful Codex and Claude runs", - "sha256": "9efedb98544cfd8d4dcf1308e540913aa8b3119ba263655f3c51fcd83290ff68", - "bytes": 686 + "sha256": "c22c367178bdd69d284a8481afb2b091af852faab1cfeefbeffc6597d3cea7f0", + "bytes": 704 }, { "path": "README.md", "description": "Hero Demo bundle README", - "sha256": "5e884d11936bfc38343344b1dd95e4ebafb2b70f2a8e834fdb1fd97a900f6927", + "sha256": "d3a08b601263c2184d239f64883c3cf7f3dd761834d71b37d4df6823d0118909", "bytes": 1544 }, { "path": "VIDEO_PLAYBACK.md", "description": "GitHub video playback guidance for the Hero Demo", - "sha256": "e62744bd9dac50d97e99fb2d6377b5f09b8a8e1d4e64ada70ae537bb8c4d2f39", - "bytes": 4584 + "sha256": "ac6b74aa1382252b493c625d5a58f017b643e6813eee38142c566bcfd037039d", + "bytes": 4808 }, { "path": "reproduce.sh", "description": "Maintainer-facing reproduction wrapper for the Hero Demo", - "sha256": "92b69748b18cbb64b5d02c25cd98225e8cbc3f793b3d6fc7362d85d3aa8412a9", - "bytes": 276 + "sha256": "976d5d6b61439e7b0af04841d04997813cd38bb3a8c4884b35e46487a471f929", + "bytes": 244 } ], "scenario": "agent-uses-agent-tty-hero-demo" diff --git a/dogfood/agent-uses-agent-tty/promoted-run-summary.md b/dogfood/agent-uses-agent-tty/promoted-run-summary.md index dfac465..7e6ee23 100644 --- a/dogfood/agent-uses-agent-tty/promoted-run-summary.md +++ b/dogfood/agent-uses-agent-tty/promoted-run-summary.md @@ -1,30 +1,31 @@ # Promoted Hero Demo Run Summary -generatedAt: 2026-05-21T15:55:50.947Z +generatedAt: 2026-06-03T15:42:43.029Z debugRoot: codexModel: gpt-5.5 codexEffort: low claudeModel: claude-opus-4-7 claudeEffort: low recordSeconds: 180 -outerFrame: 1600x900 +outerFrame: 1920x900 outerFontSize: 14 ## Tool Versions - vhs: vhs version v0.11.0 (c6af91a) -- ttyd: ttyd version 1.7.7-40e79c7 +- tmux: tmux 3.6a +- ttyd: ttyd version 1.7.7-unknown - ffmpeg: ffmpeg version 8.1.1 Copyright (c) 2000-2026 the FFmpeg developers -- codex: codex-cli 0.130.0 -- claude: 2.1.143 (Claude Code) +- codex: codex-cli 0.136.0 +- claude: 2.1.161 (Claude Code) ## Runs - codex run 1: pass (selected) -- codex run 2: pass -- codex run 3: pass - claude run 1: pass (selected) +- codex run 2: pass - claude run 2: pass +- codex run 3: pass - claude run 3: pass Manual visual review required before merging promoted artifacts. diff --git a/dogfood/agent-uses-agent-tty/reproduce.sh b/dogfood/agent-uses-agent-tty/reproduce.sh index 177a3c8..3fce925 100755 --- a/dogfood/agent-uses-agent-tty/reproduce.sh +++ b/dogfood/agent-uses-agent-tty/reproduce.sh @@ -3,4 +3,4 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel)" cd "$REPO_ROOT" -exec mise run demo:agent-uses-agent-tty -- --agent both --runs 3 --record-seconds 180 --promote "$@" +exec mise run demo:agent-uses-agent-tty -- --record-seconds 180 "$@" diff --git a/mise.lock b/mise.lock index 215e719..13dfd9d 100644 --- a/mise.lock +++ b/mise.lock @@ -1426,6 +1426,54 @@ checksum = "sha256:4d26ade49e9571ccb3bd1a88cfc72c52b11a9a9f6e204a57f38592aed1375 url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260510/cpython-3.14.5+20260510-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" provenance = "github-attestations" +[[tools.tmux]] +version = "3.6a" +backend = "aqua:tmux/tmux-builds" + +[tools.tmux."platforms.linux-arm64"] +checksum = "sha256:bb5afd9d646df54a7d7c66e198aa22c7d293c7453534f1670f7c540534db8b5e" +url = "https://github.com/tmux/tmux-builds/releases/download/v3.6a/tmux-3.6a-linux-arm64.tar.gz" + +[tools.tmux."platforms.linux-arm64-musl"] +checksum = "sha256:bb5afd9d646df54a7d7c66e198aa22c7d293c7453534f1670f7c540534db8b5e" +url = "https://github.com/tmux/tmux-builds/releases/download/v3.6a/tmux-3.6a-linux-arm64.tar.gz" + +[tools.tmux."platforms.linux-x64"] +checksum = "sha256:c0a772a5e6ca8f129b0111d10029a52e02bcbc8352d5a8c0d3de8466a1e59c2e" +url = "https://github.com/tmux/tmux-builds/releases/download/v3.6a/tmux-3.6a-linux-x86_64.tar.gz" + +[tools.tmux."platforms.linux-x64-musl"] +checksum = "sha256:c0a772a5e6ca8f129b0111d10029a52e02bcbc8352d5a8c0d3de8466a1e59c2e" +url = "https://github.com/tmux/tmux-builds/releases/download/v3.6a/tmux-3.6a-linux-x86_64.tar.gz" + +[tools.tmux."platforms.macos-arm64"] +checksum = "sha256:12b5b9f8696e1286897d946649c0a80d0169dd76e018d34476a1fbd34de89a0f" +url = "https://github.com/tmux/tmux-builds/releases/download/v3.6a/tmux-3.6a-macos-arm64.tar.gz" + +[tools.tmux."platforms.macos-x64"] +checksum = "sha256:b9b12eaeba43acf5671acf3857d947525440b544185a8db34ea557199a090251" +url = "https://github.com/tmux/tmux-builds/releases/download/v3.6a/tmux-3.6a-macos-x86_64.tar.gz" + +[[tools.ttyd]] +version = "1.7.7" +backend = "aqua:tsl0922/ttyd" + +[tools.ttyd."platforms.linux-arm64"] +checksum = "sha256:b38acadd89d1d396a0f5649aa52c539edbad07f4bc7348b27b4f4b7219dd4165" +url = "https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.aarch64" + +[tools.ttyd."platforms.linux-arm64-musl"] +checksum = "sha256:b38acadd89d1d396a0f5649aa52c539edbad07f4bc7348b27b4f4b7219dd4165" +url = "https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.aarch64" + +[tools.ttyd."platforms.linux-x64"] +checksum = "sha256:8a217c968aba172e0dbf3f34447218dc015bc4d5e59bf51db2f2cd12b7be4f55" +url = "https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.x86_64" + +[tools.ttyd."platforms.linux-x64-musl"] +checksum = "sha256:8a217c968aba172e0dbf3f34447218dc015bc4d5e59bf51db2f2cd12b7be4f55" +url = "https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.x86_64" + [[tools.vhs]] version = "0.11.0" backend = "aqua:charmbracelet/vhs" diff --git a/mise.toml b/mise.toml index d7c1b37..b42ee0e 100644 --- a/mise.toml +++ b/mise.toml @@ -5,6 +5,10 @@ communique = "1.1.3" jq = "1.8.1" node = "26" python = "3" +tmux = "3.6a" +# VHS needs ttyd, but ttyd ships no macOS binary, so it's Linux/CI-only here. +# On macOS install it yourself: `brew install ttyd` (mise finds it on PATH). +ttyd = { version = "1.7.7", os = ["linux"] } vhs = "0.11.0" zizmor = "1.25.2" @@ -35,15 +39,30 @@ outputs = ["dist/**/*.js", "dist/**/*.d.ts", "dist/**/*.map"] description = "Validate the tarball route and check the current git-install caveat" run = "npm run smoke:install -- --skip-build" +[tasks."demo:hero"] +description = "Regenerate the README hero GIF (assets/hero.gif) from assets/hero.tape" +# Reuse the cached `build` task so assets/hero.tape can point PATH at this +# checkout's dev CLI (dist/cli/main.js) — the released agent-tty has no `dashboard`. +depends = ["build"] +run = ''' +PATH="$(mise bin-paths vhs@0.11.0 ffmpeg@8.1.1 tmux@3.6a jq@1.8.1 | paste -sd: -):$PATH" vhs assets/hero.tape +''' +tools.ffmpeg = "8.1.1" +tools.vhs = "0.11.0" +tools.tmux = "3.6a" + [tasks."demo:agent-uses-agent-tty"] description = "Regenerate the real-agent Hero Demo proof bundle" +# Defaults to a full promote run (both agents x3, 180s each). Runs record +# concurrently (--concurrency, default 2 = Codex + Claude overlapping); pass a +# higher value to also overlap an agent's own attempts, or e.g. +# `-- --no-promote --agent codex --runs 1 --record-seconds 30` for a fast smoke test. run = ''' -PATH="$(mise bin-paths vhs@0.11.0 ttyd@1.7.7 ffmpeg@8.1.1 | paste -sd: -):$PATH" \ - npx tsx src/tools/hero-demo.ts +PATH="$(mise bin-paths vhs@0.11.0 ffmpeg@8.1.1 tmux@3.6a | paste -sd: -):$PATH" npx tsx src/tools/hero-demo.ts ''' tools.ffmpeg = "8.1.1" tools.vhs = "0.11.0" -tools.ttyd = "1.7.7" +tools.tmux = "3.6a" [tasks."demo:agent-uses-agent-tty:upload-assets"] description = "Prepare H.264 MP4 upload assets for the Hero Demo" diff --git a/src/dashboard/app.tsx b/src/dashboard/app.tsx index ea57b01..5de3a03 100644 --- a/src/dashboard/app.tsx +++ b/src/dashboard/app.tsx @@ -18,12 +18,12 @@ import { type DashboardScope, type DashboardSession, } from './sessionScope.js'; +import { formatSessionId, listWidthFor, shortId } from './sessionListLayout.js'; // reference-dark profile defaults; cells matching these are left unstyled so the // terminal's own theme shows through instead of repainting every cell. const PROFILE_BG = '#1e1e2e'; const PROFILE_FG = '#cdd6f4'; -const LIST_WIDTH = 28; const FRAME_INTERVAL_MS = 33; const LIST_REFRESH_MS = 1500; const PAN_STEP = 1; @@ -190,22 +190,20 @@ function statusDot(status: string): React.ReactNode { return ; } -function shortId(sessionId: string): string { - return sessionId.length > 10 ? `…${sessionId.slice(-9)}` : sessionId; -} - function SessionList({ sessions, selectedIndex, scope, focused, height, + width, }: { sessions: DashboardSession[]; selectedIndex: number; scope: DashboardScope; focused: boolean; height: number; + width: number; }): React.ReactNode { // Scroll a window that keeps the selected row visible (centered when possible) // so navigating past the fold never hides the selection. @@ -220,7 +218,7 @@ function SessionList({ const windowed = sessions.slice(start, start + visible); return ( - + Sessions · {scope} ({sessions.length}){start > 0 ? ' ↑' : ''} {start + visible < sessions.length ? ' ↓' : ''} @@ -232,7 +230,8 @@ function SessionList({ return ( {selected ? '▸ ' : ' '} - {statusDot(session.status)} {shortId(session.sessionId)} {label} + {statusDot(session.status)}{' '} + {formatSessionId(session.sessionId, width)} {label} ); })} @@ -430,7 +429,10 @@ function App({ options }: { options: DashboardAppOptions }): React.ReactNode { const termCols = stdout.columns; const termRows = stdout.rows; - const paneCols = Math.max(10, termCols - LIST_WIDTH - 5); + // The list scales with the terminal (wide screens show full session ids); the + // Live View takes the rest, less a small gap for the divider. + const listWidth = listWidthFor(termCols); + const paneCols = Math.max(10, termCols - listWidth - 5); const paneRows = Math.max(4, termRows - 5); // Clamp a candidate pan to the current screen so stored pan never drifts past @@ -508,8 +510,12 @@ function App({ options }: { options: DashboardAppOptions }): React.ReactNode { return ( - - {' agent-tty dashboard '} + {/* Bold cyan, no background: a filled `backgroundColor="blue"` bar + renders light-on-light (washed out) under dark themes that remap + ANSI blue to a light shade (e.g. Catppuccin's #89b4fa). A bold + foreground accent stays readable on any terminal/theme. */} + + {'agent-tty dashboard'} {' read-only · '} @@ -526,6 +532,7 @@ function App({ options }: { options: DashboardAppOptions }): React.ReactNode { scope={scope} focused={focus === 'list'} height={paneRows} + width={listWidth} /> 10 ? `…${sessionId.slice(-9)}` : sessionId; +} + +// Per-row chrome around the id: the `▸ `/` ` selector (2) + the status dot (1) +// + the spaces flanking the id (2). The full id is shown only when the list is +// wide enough to fit `` without truncating the id itself. +const ROW_CHROME = 5; + +/** The full session id when the list is wide enough, else the short form. */ +export function formatSessionId(sessionId: string, listWidth: number): string { + return listWidth - ROW_CHROME >= sessionId.length + ? sessionId + : shortId(sessionId); +} diff --git a/src/tools/hero-demo.ts b/src/tools/hero-demo.ts index 7849ea9..7a9b549 100644 --- a/src/tools/hero-demo.ts +++ b/src/tools/hero-demo.ts @@ -25,6 +25,7 @@ import { CanonicalBundleManifestSchema } from './bundleManifestSchema.js'; import { canonicalBundleArtifactEntry } from './canonicalBundleArtifacts.js'; import { invariant } from '../util/assert.js'; import { isDirectExecution } from '../util/isDirectExecution.js'; +import { LIBGHOSTTY_VT_PACKAGE } from '../renderer/readiness.js'; const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../..'); const DEFAULT_BUNDLE_DIR = join(REPO_ROOT, 'dogfood/agent-uses-agent-tty'); @@ -34,12 +35,22 @@ const DEFAULT_EXPECTED_TEXT = const DEFAULT_RECORD_SECONDS = 3 * 60; const RECORD_TIMEOUT_BUFFER_SECONDS = 3 * 60; const AGENTS = ['codex', 'claude'] as const; - -const OUTER_WIDTH = 1600; +// Each run is mostly an idle review-window sleep, so overlapping runs is a big +// wall-clock win. Default to 2 so the two agents record concurrently without +// ever running two sessions of the *same* agent (same account) at once; bump +// --concurrency higher to also overlap an agent's own attempts (costs more CPU +// — each run drives its own headless browser + ffmpeg — and shared-account load). +const DEFAULT_CONCURRENCY = 2; + +// 1920 wide to match the README hero's canvas; 900 tall + 14pt keeps the +// content-heavy coding-agent TUI roomy (it gets the larger ~60% pane). +const OUTER_WIDTH = 1920; const OUTER_HEIGHT = 900; const OUTER_FONT_SIZE = 14; -const CLAUDE_VISUAL_REDACTION_HEIGHT = Math.floor(OUTER_HEIGHT / 5); -const CLAUDE_VISUAL_REDACTION_FILTER = `drawbox=x=0:y=0:w=iw:h=${String(CLAUDE_VISUAL_REDACTION_HEIGHT)}:color=black:t=fill`; +// The recording is a tmux split: LEFT = the coding agent, RIGHT = the live +// `agent-tty dashboard`. `-l` sizes the new (right/dashboard) pane, so a smaller +// percentage leaves the larger half for the agent — it is the star of the demo. +const DASHBOARD_PANE_PERCENT = 40; type AgentName = (typeof AGENTS)[number]; @@ -47,6 +58,7 @@ export interface HeroDemoOptions { agent: AgentName | 'both'; runs: number; promote: boolean; + concurrency: number; bundleDir: string; codexModel: string; codexEffort: string; @@ -60,9 +72,16 @@ export interface HeroDemoOptions { export interface GeneratedTapeInput { agent: AgentName; runnerPath: string; + dashboardRunnerPath: string; + socket: string; recordSeconds: number; } +export interface GeneratedDashboardRunnerInput { + installPrefix: string; + innerHome: string; +} + export interface GeneratedRunnerInput { agent: AgentName; workspace: string; @@ -123,11 +142,43 @@ export function selectedAgents(agent: AgentName | 'both'): AgentName[] { return agent === 'both' ? [...AGENTS] : [agent]; } +/** + * Runs `worker` over `items` with at most `limit` in flight at once, returning + * results in input order. Hero Demo runs are dominated by an idle review-window + * sleep, so overlapping them is a large wall-clock win; the cap keeps fan-out + * bounded (each run drives its own headless browser + ffmpeg). + */ +export async function mapWithConcurrency( + items: Item[], + limit: number, + worker: (item: Item, index: number) => Promise, +): Promise { + const results = new Array(items.length); + let cursor = 0; + const poolSize = Math.max(1, Math.min(limit, items.length)); + const runWorker = async (): Promise => { + for (;;) { + const index = cursor; + cursor += 1; + if (index >= items.length) { + return; + } + const item = items[index]; + invariant(item !== undefined, 'worker item index out of range'); + results[index] = await worker(item, index); + } + }; + await Promise.all(Array.from({ length: poolSize }, () => runWorker())); + return results; +} + /** Parses maintainer-facing Hero Demo generator arguments and environment defaults. */ export function parseHeroDemoArgs(argv: string[]): HeroDemoOptions { let agent: AgentName | 'both' = 'both'; - let runs = 1; - let promote = false; + // Default to the full promote regeneration so `mise run demo:agent-uses-agent-tty` + // (no flags) just rebuilds the bundle. Pass --no-promote for a quick test run. + let runs = 3; + let promote = true; let bundleDir = DEFAULT_BUNDLE_DIR; let codexModel = process.env.AGENT_TTY_HERO_CODEX_MODEL ?? 'gpt-5.5'; let codexEffort = process.env.AGENT_TTY_HERO_CODEX_EFFORT ?? 'low'; @@ -140,6 +191,9 @@ export function parseHeroDemoArgs(argv: string[]): HeroDemoOptions { let recordSeconds = Number( process.env.AGENT_TTY_HERO_RECORD_SECONDS ?? String(DEFAULT_RECORD_SECONDS), ); + let concurrency = Number( + process.env.AGENT_TTY_HERO_CONCURRENCY ?? String(DEFAULT_CONCURRENCY), + ); for (let index = 0; index < argv.length; index += 1) { const arg = argv[index]; @@ -161,6 +215,9 @@ export function parseHeroDemoArgs(argv: string[]): HeroDemoOptions { case '--promote': promote = true; break; + case '--no-promote': + promote = false; + break; case '--bundle-dir': { const value = argv[++index]; invariant(value !== undefined, '--bundle-dir requires a value'); @@ -200,6 +257,12 @@ export function parseHeroDemoArgs(argv: string[]): HeroDemoOptions { recordSeconds = Number(value); break; } + case '--concurrency': { + const value = argv[++index]; + invariant(value !== undefined, '--concurrency requires a value'); + concurrency = Number(value); + break; + } case '--help': case '-h': throw new Error(usage()); @@ -216,15 +279,26 @@ export function parseHeroDemoArgs(argv: string[]): HeroDemoOptions { Number.isInteger(recordSeconds) && recordSeconds > 0, '--record-seconds must be a positive integer', ); + invariant( + Number.isInteger(concurrency) && concurrency > 0, + '--concurrency must be a positive integer', + ); if (promote) { - invariant(runs >= 3, '--promote requires --runs >= 3'); - invariant(agent === 'both', '--promote requires --agent both'); + invariant( + runs >= 3, + '--promote requires --runs >= 3 (pass --no-promote for a quick test run)', + ); + invariant( + agent === 'both', + '--promote requires --agent both (pass --no-promote to test a single agent)', + ); } return { agent, runs, promote, + concurrency, bundleDir, codexModel, codexEffort, @@ -238,9 +312,16 @@ export function parseHeroDemoArgs(argv: string[]): HeroDemoOptions { function usage(): string { return [ - 'Usage: mise run demo:agent-uses-agent-tty -- [--agent both|codex|claude] [--runs N] [--record-seconds N] [--bundle-dir DIR] [--codex-model MODEL] [--codex-effort LEVEL] [--claude-model MODEL] [--claude-effort LEVEL] [--keep-debug] [--promote]', + 'Usage: mise run demo:agent-uses-agent-tty -- [--no-promote] [--agent both|codex|claude] [--runs N] [--record-seconds N] [--concurrency N] [--bundle-dir DIR] [--codex-model MODEL] [--codex-effort LEVEL] [--claude-model MODEL] [--claude-effort LEVEL] [--keep-debug]', '', 'Regenerates the real-agent Hero Demo with VHS as the outer camera.', + 'Defaults to a full promote run (--agent both --runs 3 --record-seconds 180).', + 'Runs record concurrently (--concurrency, default 2): each run is mostly an', + 'idle review-window sleep, so overlapping them is a large wall-clock win.', + "Higher concurrency also overlaps an agent's own attempts but costs more CPU", + '(each run drives its own headless browser + ffmpeg) and shared-account load.', + 'Pass --no-promote (optionally with --runs 1 --agent codex) for a quick test', + 'run that records into the debug dir without touching the bundle.', ].join('\n'); } @@ -255,6 +336,21 @@ export function generateTape(input: GeneratedTapeInput): string { ? 'OpenAI Codex|Codex' : 'Claude Code|Welcome|esc to interrupt'; const exitCommand = input.agent === 'codex' ? '/quit' : '/exit'; + // `-f /dev/null` ignores any host ~/.tmux.conf (so pane 0-indexing and defaults + // hold); `-L ` isolates this run's server so it can be reaped cleanly. + const tmuxNew = `tmux -f /dev/null -L ${input.socket}`; + // One hidden tmux command builds the whole split: pane 0 (LEFT) runs the agent + // directly, pane 1 (RIGHT) runs the dashboard; `split-window -d` keeps the + // agent pane focused, `set -g status off` drops the status bar, then `attach`. + // The recording opens directly on a clean two-pane split — like the README + // hero — instead of showing tmux plumbing or an `exec bash ` line. The + // dashboard runner exports the same AGENT_TTY_HOME, so it auto-follows the + // agent's newest session. + const splitSetup = + `${tmuxNew} new-session -d -s hero 'bash ${input.runnerPath}'` + + ` \\; set -g status off` + + ` \\; split-window -h -d -l ${String(DASHBOARD_PANE_PERCENT)}% -t hero 'bash ${input.dashboardRunnerPath}'` + + ` \\; attach -t hero`; return [ 'Output outer.webm', 'Output outer.ascii', @@ -265,13 +361,23 @@ export function generateTape(input: GeneratedTapeInput): string { 'Set TypingSpeed 10ms', 'Set Framerate 5', 'Set PlaybackSpeed 1.0', - `Type "bash ${input.runnerPath}"`, + // Build the split off-camera so the recording opens on it, not on tmux setup. + 'Hide', + `Type "${splitSetup}"`, 'Enter', + 'Sleep 2s', + 'Show', + // Now visible: the agent boots in the LEFT pane (trust prompt → accept → + // UI), then works for the review window while the dashboard mirrors it. `Wait+Screen@120s /${startupRegex}/`, 'Sleep 1s', 'Enter', `Wait+Screen@120s /${uiRegex}/`, `Sleep ${String(input.recordSeconds)}s`, + // Hidden teardown: exit the agent. Stays hidden so the GIF ends on the + // agent + dashboard, not on the bare shell the exit collapses tmux back to + // (the run's tmux server is reaped by killTmuxServer after VHS returns). + 'Hide', 'Ctrl+C', 'Sleep 1s', `Type "${exitCommand}"`, @@ -283,6 +389,23 @@ export function generateTape(input: GeneratedTapeInput): string { ].join('\n'); } +/** Builds the shell runner for the RIGHT pane: the live `agent-tty dashboard`. */ +export function generateDashboardRunner( + input: GeneratedDashboardRunnerInput, +): string { + return [ + '#!/usr/bin/env bash', + 'set -euo pipefail', + `export PATH=${quote(join(input.installPrefix, 'bin'))}:$PATH`, + // Same AGENT_TTY_HOME as the agent runner so the dashboard sees its sessions. + `export AGENT_TTY_HOME=${quote(input.innerHome)}`, + // --all keeps a session visible through its terminal state; the dashboard + // auto-selects the newest session, so it follows the agent without input. + 'exec agent-tty dashboard --all', + '', + ].join('\n'); +} + /** Builds the shell runner that launches the requested coding-agent CLI. */ export function generateRunner(input: GeneratedRunnerInput): string { if (input.agent === 'codex') { @@ -379,7 +502,6 @@ function isTextArtifact(path: string): boolean { async function copyPromotedArtifact( from: string, to: string, - agent: AgentName, relativePath: string, ): Promise { await mkdir(dirname(to), { recursive: true }); @@ -387,49 +509,6 @@ async function copyPromotedArtifact( await writeFile(to, sanitizePromotedText(await readFile(from, 'utf8'))); return; } - if (agent === 'claude' && relativePath.endsWith('-outer.webm')) { - runDemoTool('ffmpeg', [ - '-nostdin', - '-y', - '-hide_banner', - '-loglevel', - 'error', - '-i', - from, - '-vf', - CLAUDE_VISUAL_REDACTION_FILTER, - '-an', - '-c:v', - 'libvpx-vp9', - '-deadline', - 'good', - '-cpu-used', - '4', - '-b:v', - '0', - '-crf', - '34', - to, - ]); - return; - } - if (agent === 'claude' && relativePath.endsWith('-thumbnail.png')) { - runDemoTool('ffmpeg', [ - '-nostdin', - '-y', - '-hide_banner', - '-loglevel', - 'error', - '-i', - from, - '-vf', - CLAUDE_VISUAL_REDACTION_FILTER, - '-frames:v', - '1', - to, - ]); - return; - } await copyFile(from, to); } @@ -462,6 +541,46 @@ function run(command: string, args: string[], cwd = REPO_ROOT): string { }); } +/** Tears down a run's isolated tmux server; ignores an already-gone server. */ +function killTmuxServer(socket: string): void { + spawnSync('tmux', ['-L', socket, 'kill-server'], { stdio: 'ignore' }); +} + +/** + * Fail fast if the installed agent-tty cannot render the dashboard. The + * dashboard requires the optional native renderer; when it is absent the + * RIGHT pane's `agent-tty dashboard` exits at startup and its tmux pane + * closes, leaving a single-pane recording that would otherwise pass every + * downstream check. Confirm the capability before spending a recording on it. + */ +function assertDashboardRendererInstalled(installPrefix: string): void { + const binary = join(installPrefix, 'bin', 'agent-tty'); + // `doctor` exits non-zero when any check fails (e.g. Playwright), so we read + // stdout regardless of exit code and inspect only the dashboard capability. + const result = spawnSync(binary, ['doctor', '--json'], { + cwd: REPO_ROOT, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }); + let dashboard: { status?: string } | undefined; + try { + const parsed = JSON.parse(result.stdout) as { + result?: { capabilities?: Array<{ name: string; status: string }> }; + }; + dashboard = parsed.result?.capabilities?.find( + (capability) => capability.name === 'dashboard', + ); + } catch { + throw new Error( + 'agent-tty doctor --json did not return parseable JSON; cannot confirm the dashboard renderer', + ); + } + invariant( + dashboard?.status === 'available', + `the installed agent-tty dashboard renderer is unavailable (${LIBGHOSTTY_VT_PACKAGE}); the RIGHT recording pane would be blank. Reinstall agent-tty on a supported platform so the optional native package is fetched.`, + ); +} + function isNonEmptyFile(path: string): boolean { try { const stats = statSync(path); @@ -613,7 +732,11 @@ async function runOne( const innerWebm = join(workspaceArtifacts, 'inner-nvim.webm'); const promptPath = join(runDir, `${agent}-prompt.md`); const runnerPath = join(runDir, `run-${agent}.sh`); + const dashboardRunnerPath = join(runDir, `run-${agent}-dashboard.sh`); const tapePath = join(runDir, 'record.tape'); + // basename(debugRoot) carries a per-process timestamp, so concurrent demo + // invocations get distinct sockets and one run's teardown never reaps another. + const tmuxSocket = `hero-${agent}-${String(index)}-${basename(debugRoot)}`; await mkdir(workspaceArtifacts, { recursive: true }); run('git', ['init', '-q'], workspace); @@ -641,19 +764,35 @@ async function runOne( claudeEffort: options.claudeEffort, }), ); + await writeExecutable( + dashboardRunnerPath, + generateDashboardRunner({ installPrefix, innerHome }), + ); await writeFile( tapePath, - generateTape({ agent, runnerPath, recordSeconds: options.recordSeconds }), + generateTape({ + agent, + runnerPath, + dashboardRunnerPath, + socket: tmuxSocket, + recordSeconds: options.recordSeconds, + }), ); const vhsLog = join(runDir, 'vhs.log'); - runLogged( - 'vhs', - [basename(tapePath)], - runDir, - vhsLog, - (options.recordSeconds + RECORD_TIMEOUT_BUFFER_SECONDS) * 1000, - ); + try { + runLogged( + 'vhs', + [basename(tapePath)], + runDir, + vhsLog, + (options.recordSeconds + RECORD_TIMEOUT_BUFFER_SECONDS) * 1000, + ); + } finally { + // Reap this run's isolated tmux server (best-effort: it may already be gone + // when the agent and dashboard panes exited at teardown). + killTmuxServer(tmuxSocket); + } ensureThumbnail(runDir); await assertNonEmpty(join(runDir, 'outer.webm')); @@ -669,6 +808,14 @@ async function runOne( transcript.includes(tuiMarker), `outer transcript did not show ${tuiMarker}`, ); + // The whole point of the split is the live dashboard on the RIGHT. Its list + // header ("Sessions · ") is dashboard-only chrome the agent TUI never + // prints, so its absence means the dashboard pane died — fail rather than + // promote a single-pane recording. + invariant( + transcript.includes('Sessions ·'), + 'outer transcript did not show the dashboard pane (no "Sessions ·" header); the RIGHT pane likely failed to render', + ); const final = (await readFile(finalFile, 'utf8')).trimEnd(); invariant( final === options.expectedText, @@ -836,7 +983,7 @@ async function promote( ]; for (const [from, relative, description] of copies) { const to = join(options.bundleDir, relative); - await copyPromotedArtifact(from, to, record.agent, relative); + await copyPromotedArtifact(from, to, relative); promotedPaths.push({ path: relative, description }); } } @@ -888,7 +1035,7 @@ async function promote( scenario: 'agent-uses-agent-tty-hero-demo', result: 'pass', commands: [ - `mise run demo:agent-uses-agent-tty -- --agent both --runs 3 --record-seconds ${String(options.recordSeconds)} --promote`, + `mise run demo:agent-uses-agent-tty -- --record-seconds ${String(options.recordSeconds)}`, ], artifacts: manifestArtifacts, }); @@ -933,6 +1080,7 @@ function safeToolVersion( function collectToolVersions(): Array<[string, string]> { return [ ['vhs', safeToolVersion('vhs', ['--version'])], + ['tmux', safeToolVersion('tmux', ['-V'])], ['ttyd', safeToolVersion('ttyd', ['--version'])], ['ffmpeg', safeToolVersion('ffmpeg', ['-version'])], ['codex', safeToolVersion('codex', ['--version'])], @@ -977,18 +1125,39 @@ function renderSummary(options: HeroDemoOptions, records: RunRecord[]): string { return lines.join('\n'); } -function renderReadme(): string { +// One inline