settings → api log · PR #98

Who asked whom to do what, and in whose words

Two views over /api/operations. Screens are the real component against the run the operator described: my-claude creates poet, tasks it, then waits for the result.

The list

The list: one call per line, coloured status, duration and payload columns.

One call per line. show user calls is off, so what is left is what the agents did to each other. The GET rows are waits that resolved, carrying the time they blocked for.

The lanes, and the call in full

Swimlanes with a create, a prompt and a wait span; the card below shows the prompt text and the entry as JSON.

Callers above the agents they call. Solid arrows are work going out, dashed ones are waits coming back — shaded from where the wait was issued to where it resolved. A create ends in an open mark and the lane is faint before it, because that agent did not exist yet. Clicking a call keeps its card open; the body is shown as it was sent, with the checksum still beside it so a repeated prompt stands out.

Even, or by the clock

Dragging a window across the plot: a shaded selection with its time range above it.

Even spacing is the default and keeps a sparse trace readable. By the clock, a burst bunches up and a quiet stretch opens out — so you drag across the plot to zoom into the part you care about. The selection names its range while you drag it.

…and the window you land on

The zoomed plot: axis ends naming the slice, with a reset zoom button and the range in the bar.

The axis ends name the slice, the bar says 10:31:54 → 10:34:19 · 4 of 8 calls, and reset zoom (or a double-click) puts it back. Lanes stay honest inside the window: one born before it is solid across it, one born after is faint, and a wait that started outside still draws its span up to the edge. Brushing is mouse and pen only — a horizontal drag on a phone is how you scroll, so touch is left alone.

When an entry is enormous

The card for a 392,000-character file write, painting the first 20,000 and saying so.

Each entry now keeps the call whole, so a file write is hundreds of thousands of characters on one line. Nothing is cut on disk — the viewer decides how much to paint, and says how much it is holding back. The list row for the same call is a size on one line.

What the log now is

operations.jsonl lives on the bucket, is append-only, has no rotation, and stores every API call in full — bodies included. Yesterday it held no content at all.