Skip to content

Observability

aos obs shows what this machine has been asked to do. Every command, typed at a terminal or called as an MCP tool, records one OpenTelemetry-shaped span in a local file.

Terminal window
$ aos obs stats
route calls errors p50ms p95ms maxms
commands 52 0 0 0 0
file delete 43 18 0 0 0
capture screenshot 16 0 142 160 160
system info 15 0 29 36 36
doctor 14 0 175 187 187
window list 14 0 38 45 45
Terminal window
$ aos obs tail --limit=3
01:05:30 ok cli 15ms network status
01:05:35 err cli 0ms file delete
01:05:36 err cli 0ms file delete
The most recent spans, newest last
aos obs tail --limit=8
Terminal window
aos obs audit --since=24h --source=mcp # everything an agent asked for, oldest first
aos obs audit --failed # only the commands that failed
aos obs summary --since=7d # how much the machine is used, and by what
aos obs stats --since=24h --source=mcp # calls, failures and latency per route
aos obs tail --limit=20 # the most recent spans
aos obs export --since=1h > spans.json # OTLP JSON, ready for a collector
aos obs path # where the file lives

--source=cli|mcp separates what you typed from what an agent called. That is the main reason this exists.

The route, the source (cli or mcp), the exit code, the duration, and the number of arguments. Never the arguments themselves. Arguments routinely carry paths, message bodies and clipboard text.

Terminal window
AOS_TELEMETRY=off aos window list # do not record this run
AOS_TELEMETRY_DIR=/tmp/t aos obs path # record somewhere else

Export either variable in your shell to make it permanent.

  • It is a file on your disk. Deleting it is fine. aos obs path shows where.
  • Nothing is uploaded. obs export writes to stdout. Sending it to a collector is your step.
  • Spans are per machine. Over SSH, run aos obs audit on the server to see what happened there.