Skip to content

cli-v0.12.0

Latest

Choose a tag to compare

@github-actions github-actions released this 09 Nov 20:58

Added

  • Estimated session cost in the inspector and TUI (#145). The session
    header and the TUI summary show an Est. cost row when the session has a
    cost: the total (— when nothing is priced), who reported it, the
    subagents' share and any unpriced models, all as visible text.
  • Keyboard navigation (#160). The session list is one Tab stop moved by
    the arrows or j / k, / focuses search, [ and ] step between turns,
    ? opens a shortcuts sheet, and skip links lead to the content and the open
    session.
  • Jump from the summary into the transcript (#164). The dumb-zone,
    compaction and subagent chips and the growth timeline land on their turn or
    call, a "Jump to history" button sits at the top, and the history toolbar
    stays in view with a way back to the summary.
  • Search the full history text (#148). The history search matches the
    full text of every event, not just what is on screen. Enter and the arrow
    buttons step through matches, a counter shows the current hit, and the
    query clears when you switch sessions.
  • Pause live (#147) holds live reloads while you read, and the header says
    when updates are waiting.
  • Create the first memory from an empty Memory page (#142). "New memory
    in…" asks for a Claude project, most recently used first. The Agent selector
    is gone.
  • Loading, retry, empty and read-only states (#159). Failed queries offer
    Retry, the first stats load shows a report skeleton with elapsed time, an
    empty session list names the folders it scanned, and a read-only server
    shows a lock badge and hides edits.
  • peektrace mcp (#153), a stdio MCP server for Claude Code, Codex and
    other clients, with five read-only tools: stats_report, stats_drill,
    sessions_list, sessions_search and sessions_analyze. Each returns the
    same text as its CLI command, or the --json payload with
    format: "json". Redaction cannot be turned off from a tool call, and
    memory and settings writes are blocked. It runs locally only and adds
    about 12 KB to the binary. The README shows the client config.
  • Search across sessions (#154). peektrace sessions search <q> (and the
    sessions.search RPC) scans transcripts newest first and prints one row
    per matching session, with up to 3 snippets and the full match count. The
    query is a case-insensitive phrase matched against text fields only, so
    ids, paths and other metadata never match. Snippets are redacted by
    default, and the query never reaches telemetry. Flags: --agent,
    --project, --since, --limit (default 20) and --no-redact.
  • Export a session (#141). peektrace sessions export writes HTML,
    Markdown or JSON, to a file with --out or to stdout. Secrets are replaced
    and home directories collapse to ~ unless --no-redact is passed, and
    the transcript's path is never written. HTML is a single file with inline
    CSS and no scripts. JSON is a versioned format. The inspector gets matching
    download buttons.
  • Estimated API cost per session (#138). sessions ls has an EST COST
    column and sessions analyze an est. cost row, priced from list prices
    per model generation. 1-hour cache writes are priced at their own rate, and
    long-prompt tiers apply per call. A model with no known price adds nothing
    and is named, so the figure is marked as too low instead of guessed. The
    stats corpus panel uses the same table.
  • Usage over time (#132). peektrace stats usage --by day|month|block
    totals tokens and cost per day, per month or per Claude 5-hour block, with
    --days, --agent, --tz and --json, and a stats.usage RPC. Each call
    is priced on its own and deduplicated by request id. A warm run takes about
    2.3 s. There is no inspector chart yet.
  • Analyze the current session and show it in a status line (#129).
    sessions analyze --latest and --cwd <dir> pick the newest session
    without an id. peektrace statusline reads Claude Code's status line JSON
    and prints one line such as ctx 42% Healthy, from current fill, so a
    /compact clears a "Rotting" label. On any failure it prints ctx -- and
    exits 0.
  • sessions ls lists every agent and filters (#120). --agent takes
    claude, codex, pi, opencode or all (default), and the table gains
    an agent column. New --since (date or 12h/7d/2w), --cwd and
    --limit (default 30, 0 for all). Rows are sorted newest first, and a
    cut list says how many rows are hidden on stderr. Breaking for scripts: the
    new column shifts TSV indexes, and --json is sorted and capped at 30 too.
  • Workflow subagents link to their Workflow call (#125). Agents started by
    the Workflow tool used to show as loose subagents. They now carry the call
    that launched them, their run id, phase and phase index, and nested agents
    keep their parent agent.

Changed

  • A compact session list (#150). Rows are two lines, newest activity
    first, with a dot on sessions written in the last 5 minutes, and only the
    rows in view are drawn.
  • Session list filters live in the URL (#157), so search and filters
    survive reload, Back, opening a session and leaving the section.
  • Session links are real links (#152). Rail rows, subagent and parent
    links and stats chips open in a new tab or copy like any link, and each tab
    is titled by its page or session.
  • Stats chips name sessions by title (#163), and samples of one session
    fold into one chip with ×N. Unchanged repeated context chips in the chat
    fold into one, and Capabilities moved from the sidebar into Settings.
  • Session detail fits a 390 px phone (#135). The stat grid uses 2, 3 or 6
    columns by width, and narrow tool cards move the preview to a second row.
  • Accessibility fixes (#166). Chat toggles report aria-expanded and
    aria-controls, the search boxes are labelled, and light-theme muted text
    is darker so it passes AA.
  • Non-loopback binds require a token (#130). serve --host 0.0.0.0 (and
    tui --host) used to expose every transcript, and writes, to anyone who
    could reach the port. Every route now needs a token, random per start or
    set with PEEKTRACE_TOKEN. The printed ?token= URL sets a cookie in the
    browser; scripts send Authorization: Bearer. These binds are read-only
    unless --allow-write is passed. --remote accepts a token URL or
    PEEKTRACE_TOKEN. Loopback is unchanged. Traffic is still plain HTTP, so
    the docs recommend ssh -L or a tailnet.
  • History follows the live branch (#144). After a Claude rewind, the
    abandoned prompt's rows no longer show as turns the model saw, though their
    billed calls still count in tokens and cost. Pi tree sessions follow the
    active branch, so off-branch entries and context_edits drop out.
  • Context files load like Claude Code (#144): the global CLAUDE.md and
    user rules, then each directory down to the cwd (CLAUDE.md,
    .claude/CLAUDE.md, .claude/rules, CLAUDE.local.md), with AGENTS.md
    only when there is no CLAUDE file. Only memory/MEMORY.md loads, capped
    at 200 lines and 25,000 characters, so memory is no longer overcounted.
  • Attachments the model never sees cost zero (#124). Metadata-only
    Claude attachments (structured_output, deferred_tools_record and
    others) used to count their raw JSON as context. More reminder types are
    categorized as reminders, and a prompt typed while the agent was busy shows
    as a user prompt and counts as a user message.
  • <synthetic> is not a model (#128). It no longer appears in model
    lists, headers or stats, though its error text stays in the timeline. A
    [1m] model key sets the 1M context window. The parser also reads the
    1-hour vs 5-minute cache-write split and compaction sizes, and counts
    record types it does not know.
  • MSGS counts messages, not lines (#127). Claude writes one line per
    content block, so one reply used to count several times. Sessions that
    fail to read no longer vanish silently: sessions ls and doctor print
    how many could not be read.
  • --help describes every command (#151). The root page lists each
    command with a one-line summary, global options and examples, and drops
    from 144 to 51 lines. Subcommand pages no longer show --wizard or a
    doubled "optional" note.
  • Context chips open in place (#71). An opened chip grows into a card
    where it sits in the run, with chips before it above and chips after it
    below, so the load order holds. Its header is the chip, with the
    attachment type and token count; clicking it folds the card back. Opened
    bodies used to stack under the whole cluster in click order.
  • The inspector bundles Geist and Geist Mono (#72) instead of relying on
    system fonts, so it looks the same on every OS. On Linux without the usual
    fonts, monospace labels fell back to DejaVu and sat above their icons. The
    fonts ship inside the binary, about 150 KB in total, and nothing is
    fetched from the network. Geist covers Cyrillic too.
  • GitHub release notes come from this changelog (#131), and the website
    footer shows the latest version. The npm page, CLI banner, READMEs and
    website describe the current product, including OpenCode, npm installs and
    Stats (#123).
  • Stats shards re-extract once (extractor version 13): output tokens,
    user-message counts, models, usage rows and live branches changed.

Fixed

  • Streamed Claude replies keep their final output tokens (#117). Claude
    writes one line per content block with a growing output_tokens, and only
    the first, smallest count was kept, so output and thinking were
    under-counted, most of all on subagent turns.
  • Compaction no longer double counts listings (#118). Listings
    re-attached after the summary were added to the old count, and memory
    loaded before a compaction stayed in the breakdown after it.
  • Redacted output keeps no part of a dashed username (#162). A project
    slug such as -home-jane-doe-work came out as -~-doe-work in
    sessions search and sessions export. The known home now collapses
    exactly, and Pi slugs and lowercase Windows paths collapse too.
  • Stats redacts cluster keys and survives a corrupt shard (#139). A
    shard written under older redaction rules could ship a secret in a cluster
    row's key. One corrupt or truncated shard used to fail the whole pass; it
    is now re-extracted.
  • serve no longer hangs at startup (#156) when a client connects to
    its port during the port probe, such as a browser tab still polling after
    a restart. This covers tui too.
  • Remote errors and the update hint (#121). A wrong --remote URL prints
    one line that names the URL and the fix, not a stack of internals. npm,
    pnpm and bun installs are told to run npm i -g peektrace@latest, and dev
    builds skip the update check. The sessions table shows the dumb-zone turn
    1-based or never, and estimated tokens no longer print as long floats.

Performance

  • Long transcripts are virtualized (#140). Chat and table mount only the
    rows in view, so long sessions open and scroll without stalling. Transcripts
    of 150 items or fewer still render in full, so find-in-page works.
  • A growing live session no longer freezes the inspector (#147). Reloads
    are debounced (1.5 s, at most 4 s), and unchanged sessions keep their rows,
    so one changed session re-renders one row.
  • Session lists are cached (#122). Each list re-read and re-parsed every
    transcript. Headers are now reused while a file's size and mtime match, and
    an agent filter reads only that agent's files. On a ~480-session corpus a
    repeat list drops from about 800 ms to about 40 ms, and peak memory from
    942 MB to 547 MB. A cold list costs the same.
  • A scoped stats run keeps the cache warm (#119). After
    stats --agent codex, the next full stats ran cold (20.2 s); it now
    stays warm (5.4 s). Shards of deleted transcripts are removed, and a scoped
    refresh --force leaves other agents cached.
  • Warm stats skips repeated work (#133). Binaries are stored at
    extraction, redaction runs only on what ships, and shards with nothing
    inside --days are not read. Warm --days 60 drops from 5.3 s to 3.5 s,
    --days 7 from 2.6 s to 1.9 s.
  • Cold stats is faster and shows progress (#126). A failure-detector
    regex was quadratic on long paths, and stats no longer renders system
    prompt tools it never reads: about 5% faster (22.0 s to 20.9 s). On a
    terminal it prints scanning N/M transcripts… after 250 ms.
  • Smaller Linux binaries (#149). The bundled native library is stripped
    of debug info and unused tree-sitter assets are left out: linux-x64 drops
    from 116.2 MB to 102.9 MB (-11.5%), 41.2 MB to 38.1 MB gzipped. The upgrade
    from v0.11.0 may fall back to a full download.