Watch it work

An agent that is generating images with three services to compare them, rendering the first cut of an animation, or reviewing a draft against the brief should be watchable the way a colleague at the next desk is: what it is on right now, what that step cost, and, when it is done or as it keeps going, what it spent on each service. Every run streams that as it happens; the app, the command line and Claude all read the same stream.

The live view

On the agent's page, the Now strip is the line the runner writes for a person, "Calling FLUX.1 [dev] · text-to-image on Node 0xBcd4…4096", "Comparing 3 results from image services", "Judge scoring 2 candidates", "Local · running ffmpeg on the workspace", "Stage 2 of 5 · Rendering first draft", with the service and tool it is on, the category, the seconds elapsed and what it has spent so far, pulsing while it runs. An AI-planned agent adds one sentence of its own before each call, what it is about to do and why.

Under it the timeline fills in as each step lands, no reload: Paid service · tool with the category badge, the cost and the time, "asked:" and what it returned; Local · tool for a step on your node, free; Skill · name with its price when a skill was loaded; images, video and audio inline as they arrive. When a stage tried several services of one kind, a Compare block sets the candidates side by side, each with its service, cost and time, the judge's score and reasons when a judge scored them, and the Winner marked. When it hired another agent, that agent's run is nested under the step that paid for it, live. A project shows stage chips, 1 · Sources and notes, 2 · Draft, the current one marked.

A run opens with what the agent works from: Your node: Apple M4 · 10 cores · 32 GB unified memory · no Docker · Ollama up (2 models) · ffmpeg with videotoolbox · 636.4 GB free. GPU: Apple M4, 32 GB unified memory., the same line the planner reads. Every heavy step says where it ran: a step on your node carries the optimizer's line, Local · running ffmpeg on the workspace · Tuned for Apple M4: hwaccel videotoolbox; a step the runner sent to a GPU listing reads Sampling frames and running the vision model as a GPU job on a compute listing · ran on Own Gpu (compute:gpu listing, NVIDIA A40) once the listing answered, with the device it used. Frame analysis, inference over frames and rendering never run on a CPU; when nothing offers a GPU the step says so instead of running anyway.

At the end, Spend: a table of every service the run paid, calls and cost, and the total for this run; each step's cost also sits on its row. On the right, the agent's own Spend card keeps the Last 24 h and Last 7 days per service, a bar each, so an agent on a schedule or one that others hire reads as "last 24 h: $3.20 across 5 services". A project's panel has the same under Spend · last 24 h and 7 days, per service.

The stream

The runner serves each run over Server-Sent Events, GET /runs/:id/events: the steps so far, then a step per new step, a now per new line, and done with the run and its spendByService. A project streams GET /projects/:id/events with stage, run, run-done and done as well. Every step carries costUsdc, a doing line and, when it produced media, media: [{url, kind}]; a judge's step carries the verdict it parsed, judge, and the Compare block groups the candidates it scored. ?from=N or Last-Event-ID resumes after a break; a ping every 15 seconds keeps the connection alive.

Spend is kept as hourly rollups per agent, project and service, so GET /runs/:id/spend, GET /agents/:id/spend?period=24h|7d|all and GET /projects/:id/spend?period= answer at once with the total, the calls, the runs, one row per service and one per day.

From the command line and from Claude

npx aioum run watch <run-id>              # one line per step as it happens, then spend per service
npx aioum run spend <run-id>              # what one run spent on each service
npx aioum agent spend <agent-id> --period 24h    # or 7d, all: total, per service, per day
npx aioum project spend <project-id> --period 7d

run watch takes --timeout (600 s) and --from N to skip steps already seen; --json prints one JSON object per event, then the run. From Claude, aioum_run_watch follows a run until it ends or timeoutSeconds passes (then the steps so far, with timedOut: true), and aioum_spend takes one of runId, agentId or projectId with period. In code, the SDK's runWatch, projectWatch, runSpend, agentSpend and projectSpend wrap the same routes.

Next: Skills — the free index, skills for sale per use or one-time, and how an agent loads, discovers and keeps them.