thunc-watch
A live dashboard in the terminal for a program's thunc calls and agent runs. It shows:
- calls in flight
- retries, and why each reply was rejected
- timings for each function
- each agent's steps as they happen
- the
--profilereport when the program ends
It's a compiled binary in its own package, so thunc itself stays pure Python with no
dependencies. Install it as an extra:
pip install "thunc[watch]"
Then run your program through it:
thunc watch app.py # run a script and watch it
thunc watch -m examples.hello # a module, as python -m does
thunc watch -- uv run app.py # any command
thunc watch --agents # agent runs in ./.thunc_agents, from any process
thunc watch --events events.jsonl # a file another process writes with THUNC_EVENTS=events.jsonl
thunc watch --replay events.jsonl # play back a saved events file, or one agent's session record
thunc watch --plain app.py # one line per event, for CI logs and pipes
thunc watch runs scripts with the Python that thunc is installed in. The binary is also on your
PATH as thunc-watch, which takes the same arguments. thunc watch --help lists the options.
Using it
Everything works with the mouse or the keyboard. Click a tab, or press 1–5 or ← →. Click a
row to select it (or use ↑ ↓), and click it again (or press ⏎) to open it. esc goes back to
where you opened it from. ? shows every key.
| Screen | What's on it | Opening a row shows |
|---|---|---|
| Overview | calls in flight, a table per function, running agents, results per second, recent events | a function's calls, one call, or an agent run |
| Agents | every run, and the selected run's steps, time split, changed files and denials | |
| Calls | recent calls, and each attempt of the selected one: the reply and why it was rejected | |
| Summary | the same tables as thunc run --profile. It opens by itself when the program ends |
a function's calls, or an agent run |
| Output | what the program printed (while it runs, the dashboard owns the terminal) |
The buttons at the bottom also have keys:
- p Pause freezes the display. The program keeps running, and its events wait until you resume.
- f Failures shows only retries, failures and denials. Filters show as tags at the top right; click a tag's ✕ to clear it.
- ? Help lists every key.
- q Quit asks first if the program is still running, because quitting stops it.
Ctrl+C stops the program, as it would in its own terminal.
When the dashboard closes, it prints the program's output and then the report. It exits with the program's exit code.
While the dashboard has the mouse, select text by holding Shift (Option on macOS) as you drag.
Start it with --no-mouse to leave the mouse to the terminal.
Which agents it sees
| Mode | Agents shown |
|---|---|
thunc watch app.py |
the program's own agent runs, from its events |
thunc watch --agents [DIR] |
runs recorded in DIR, by default THUNC_AGENTS_DIR or ./.thunc_agents in the directory you start it in |
Agent folders are found the same way thunc finds them, so a configure(agents_dir=...) in your
code isn't visible here: pass the same folder as DIR.
In --agents mode, a run is live while its session record has no end and the process holding the
agent's .lock is alive. A record whose process died partway through shows as interrupted.
Session records are written to the second and don't time the model, so in this mode a step's time
is the time between its line and the one before, and model and tool time aren't split.
How it gets its data
thunc writes events when THUNC_EVENTS names a file (see
thunc/events.py). There's one JSON
line per call start, model reply, call end, agent step and agent end. When thunc-watch runs a
program, it sets THUNC_EVENTS to a temporary file and reads that file as it grows. Each line
carries a format version, so a dashboard and a thunc of different releases notice if they don't
match.
Inputs, replies and values are cut to 120-character previews. --capture sends them whole. They
can contain personal data, as a trace can.
Developing
cargo test
cargo clippy --all-targets -- -D warnings
cargo fmt --check
thunc watch runs the binary named by THUNC_WATCH_BIN when that's set, so you can try a build
from this folder with the thunc in your checkout:
cargo build && THUNC_WATCH_BIN=watch/target/debug/thunc-watch .venv/bin/python -m thunc watch app.py
To build the wheel that goes to PyPI: uvx maturin build --release (it lands in target/wheels/).
demo/demo_app.py runs the support-inbox functions and an agent against a scripted fake backend,
with delays and some bad replies. It makes no model calls. Run it from the repository root:
cargo run --manifest-path watch/Cargo.toml -- --python .venv/bin/python watch/demo/demo_app.py
To see a screen as text (useful in bug reports and tests), record the events and draw every screen at a moment in the run:
watch/target/debug/thunc-watch --plain --save-events /tmp/e.jsonl --python .venv/bin/python watch/demo/demo_app.py
watch/target/debug/thunc-watch --replay /tmp/e.jsonl --dump-screens 110x34 --at 9
Releasing
thunc-watch has its own version (in Cargo.toml) and its own releases. Publishing a GitHub release
tagged watch-vX.Y.Z runs .github/workflows/publish-watch.yml. It builds wheels for macOS, Linux
(glibc and musl) and Windows, checks that the tag matches Cargo.toml, and publishes them to PyPI.
thunc's own vX.Y.Z releases skip it. The extra in thunc's pyproject.toml pins the versions
that speak the same events format, so release a new thunc-watch before a thunc that needs it.
Not in this version
- Controls beyond watching. Stopping a single agent run, holding new calls, re-running a call,
and approving agent actions live (
ask:permissions) all need changes in thunc first. --all. Agent runs from every project on the machine would need a registry of running runs.- Stopping on Windows. Ctrl+C and quitting end the program at once there, without the KeyboardInterrupt it gets on macOS and Linux.
Metadata
Release files for thunc-watch 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| thunc_watch-0.1.0.tar.gz | 60.8 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| thunc_watch-0.1.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| thunc_watch-0.1.0-py3-none-musllinux_1_2_x86_64.whl | Python 3 | none | Linux musl 1.2+ x86-64 | Details |
| thunc_watch-0.1.0-py3-none-musllinux_1_2_aarch64.whl | Python 3 | none | Linux musl 1.2+ ARM64 | Details |
| thunc_watch-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| thunc_watch-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| thunc_watch-0.1.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| thunc_watch-0.1.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 4.4 MB
Release files / thunc_watch-0.1.0.tar.gz
| Download URL | thunc_watch-0.1.0.tar.gz |
|---|---|
| Size | 60.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
83f042d08fa34ce948178eb99372f58e857277c8dba45257d5090d290516e5c3
|
|
BLAKE2b-256 checksum How to use checksums |
995e6ca7a50d98626829e576c01780e68571d7674300daac96d6c207bf354d93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / thunc_watch-0.1.0-py3-none-win_amd64.whl
| Download URL | thunc_watch-0.1.0-py3-none-win_amd64.whl |
|---|---|
| Size | 575.5 kB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bc6f75e8f9f880284a5e8cf769c6f916a1bcd6c40f83c03890a3fe5fea22f83b
|
|
BLAKE2b-256 checksum How to use checksums |
05ff951a8273844a9b170116eee9fed32c07a5f673c4c8c0d4ac401c2b1b3a42
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / thunc_watch-0.1.0-py3-none-musllinux_1_2_x86_64.whl
| Download URL | thunc_watch-0.1.0-py3-none-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 695.2 kB |
| Tags | Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
9b30e24925011c42be7dcb6dea47f417132d18bbe931ad1fd526366253e6297c
|
|
BLAKE2b-256 checksum How to use checksums |
5e6ffb6e5b9b724bc9c3fa1233765cb616557c0ec6a145c3f5d14e9aab8ddcdf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / thunc_watch-0.1.0-py3-none-musllinux_1_2_aarch64.whl
| Download URL | thunc_watch-0.1.0-py3-none-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 644.4 kB |
| Tags | Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
5a63c610d14fa3b300a61d161fd60b5bde8fffaacc7891377e9af254a30d2419
|
|
BLAKE2b-256 checksum How to use checksums |
eab47f9e5a5abb825899dcd260ad8492777b92e09db255036f7793871a4bfb05
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / thunc_watch-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | thunc_watch-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 635.8 kB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
e387f4c3b2adb0b09f3e214064296ee8125a052ff35f4c7ceedb5d30c4c6a788
|
|
BLAKE2b-256 checksum How to use checksums |
bce53de70be79f25988b8bdddeb91ffb05df56c8597b477775aef2ad251c9d15
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / thunc_watch-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | thunc_watch-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 590.1 kB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
e84d9fcecfb766981d861df25d4d82659ffc501b9ab560e69bd0d2b6c24f88de
|
|
BLAKE2b-256 checksum How to use checksums |
06521415fdd60bd65773b9f1bc48f5618df88f71eb29ede24c24736b2f4f07da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / thunc_watch-0.1.0-py3-none-macosx_11_0_arm64.whl
| Download URL | thunc_watch-0.1.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 568.8 kB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ededbf25707b1a4c2fc96ff5c337206d85d4e982707ef05d9adc6d7c139b13fa
|
|
BLAKE2b-256 checksum How to use checksums |
2129ea48d285c53867d95ce12610ff7472966365f5861044ceb0c0bc2100c08f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / thunc_watch-0.1.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | thunc_watch-0.1.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 615.6 kB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
59c7c9580d487eff317cdea5e5c0e8b6cd2a0dab095c004a45d49848af0ee8f6
|
|
BLAKE2b-256 checksum How to use checksums |
5479acd535aaf68561f0b70d00466ce3d36a8b17e586cf8e55ea104cb8d7a426
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency log