Files
wehub-resource-sync f99010fae1
CI / lint (push) Failing after 1s
CI / frontend (push) Failing after 1s
CI / scripts (push) Failing after 1s
CI / Go Test (ubuntu-latest) (push) Failing after 0s
CI / frontend-node-25 (push) Failing after 1s
CI / docs (push) Failing after 0s
CI / coverage (push) Failing after 0s
CI / e2e (push) Failing after 0s
Docker / build-and-push (push) Failing after 1s
CI / integration (push) Failing after 4m43s
CI / Go Test (windows-latest) (push) Has been cancelled
CI / Desktop Unit Tests (Windows) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux (arm64)) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Windows) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (aarch64)) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (x86_64)) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:36 +08:00

1300 lines
50 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Usage Guide
description: Complete guide to the AgentsView web interface
---
AgentsView serves a full-featured web application for browsing,
searching, and analyzing your AI agent sessions. This page walks
through every part of the interface.
## Dashboard
When you open AgentsView with no session selected, you see the
analytics dashboard. It provides a high-level overview of your
agent activity across all projects.
![Analytics dashboard](/assets/generated/screenshots/dashboard.png)
The dashboard header includes:
- **Project filter** — typeahead to scope everything to a single
project. Type to filter by name; each entry shows its session
count. Navigate with arrow keys, select with Enter, and close
with Escape.
- **Search bar** — opens the command palette (`Cmd+K`)
- **Sync button** — triggers a manual sync of session files
- **Theme toggle** — switch between light and dark mode
- **Import button** — opens the [Chat Import](/chat-import/)
dialog for importing Claude.ai or ChatGPT conversations
- **Shortcuts button** (`?`) — shows all keyboard shortcuts
The status bar at the bottom shows session count, message count,
project count, last sync time, and the build version.
On the normal local `agentsview serve` runtime, the session lists in
the sidebar update automatically from a global SSE event stream
(debounced during busy syncs). The dashboard, Usage page, and
Activity page do not refetch their charts on every sync event —
each pairs a manual refresh button with a relative "Updated…"
timestamp, and the Analytics dashboard also refreshes periodically
on its own. Click refresh, or change the date range, to pull the
latest numbers.
For range-based concurrency and agent-minutes reporting, use the
top-level [Activity](/activity/) page.
### Summary Cards
Six cards at the top of the dashboard show key metrics for the
selected date range:
![Summary cards](/assets/generated/screenshots/summary-cards.png)
| Card | Description |
|------|-------------|
| Sessions | Total session count |
| Messages | Total message count |
| Projects | Number of active projects |
| Active Days | Days with at least one session |
| Messages/Session | Average with median and p90 |
| Concentration | Most active project and its share |
### Date Range Picker
Quick presets for 7 days, 30 days, 90 days, 1 year, and All,
plus custom start/end date inputs. The **All** preset shows
every session regardless of age. All charts update when the
range changes. The same range picker is used on the dashboard,
the [Usage](/token-usage/#usage-dashboard) page, and the
[Activity](/activity/) page so presets and behavior stay
consistent across panels.
![Date range picker](/assets/generated/screenshots/date-range.png)
Preset ranges are **rolling** by default: a page left open across midnight rolls
the window forward at the next refresh tick, sync event, or manual refresh,
instead of staying anchored to the day it loaded. Manually editing either date
input pins the range. On Usage and Activity, explicit date parameters remain
authoritative. A bare Usage URL returns to its rolling 30-day default; a bare
Activity URL returns to its current-day calendar default unless an enabled
shared range supplies another selection. The `All` preset always pins to
`(earliest_session, today)`.
Bare pages use independent defaults: the Sessions dashboard opens
to a rolling 1-year range, Usage opens to a rolling 30-day range,
and Activity opens to the current day. Cross-page linking is
disabled by default because applying a broad range automatically
can make some pages run substantially more expensive queries.
To carry selections among Sessions, Usage, Activity, Trends, and
Insights, enable **Settings > Date ranges > Link date ranges across
pages**. An explicit dated URL always controls the target page. With
linking enabled, that selection can then carry to date-aware pages
opened later at their bare URLs.
### Model Filter
The dashboard toolbar includes a **Model** dropdown that scopes
every panel to one or more AI models. By default the button reads
**Model: All** and nothing is filtered.
![Dashboard model filter](/assets/generated/screenshots/analytics-model-filter.png)
Open the dropdown for a searchable list of the models found in
your sessions, then click models to include them. The button then
shows the chosen model — for example **Model: gpt-4o** — or
**Model: 3 selected** once several are active. Click the
**All models** row at the top of the list to clear the filter and
return to every model. Selected models also appear as removable
chips beneath the toolbar.
While a model filter is active, every dashboard panel reflects
only the selected model(s): the summary cards, activity chart,
heatmap, hour-of-week grid, projects, session shape, velocity,
tools, skills, top sessions, and the Session Health rollup.
Model filtering is **message-grain**, unlike the session-grain
project and agent filters, because a single session can switch
models across turns. A session is included when it has at least
one message from a selected model, and most panels count only the
matching messages. The user turn paired with a matching assistant
turn is kept alongside it — even though a user message carries no
model of its own — so prompts and their responses stay aligned in
the counts and in the top-session evidence.
**Session Health** is the exception. It is scoped to whole
sessions that used the selected model, but its health scores,
outcomes, tool-failure rates, and compaction counts stay
whole-session aggregates — they are not recomputed from only that
model's messages.
!!! note "Dashboard-only scope"
The model filter applies only to the analytics dashboard. The
[Session Insights](/insights/) page and the session list are
not scoped by it, so a model selected here does not silently
narrow those views. The [Usage](/token-usage/) page keeps its
own separate model filter.
### Activity Heatmap
A GitHub-style contribution graph showing daily activity. Toggle
between message count and session count.
![Activity heatmap](/assets/generated/screenshots/heatmap.png)
#### Click-to-Filter
Click any heatmap cell to filter all charts and the session list
to that single day. The selected cell gets a highlighted border,
and an active filter chip appears in the toolbar. Click the same
cell again (or dismiss the filter chip) to deselect.
![Heatmap filtered to a single day](/assets/generated/screenshots/heatmap-filtered.png)
### Hour of Week Heatmap
A 7x24 grid showing when you use agents most. Rows are days of
the week, columns are hours. Color intensity represents message
volume.
![Hour of week heatmap](/assets/generated/screenshots/hour-of-week.png)
### Activity Timeline
A stacked chart showing messages, sessions, tool calls, and
thinking blocks over time. Toggle between daily, weekly, and
monthly granularity. Includes breakdown by agent.
![Activity timeline](/assets/generated/screenshots/activity-timeline.png)
### Top Sessions
A ranked list of your longest sessions by message count or
duration. Click any session to jump directly to it in the
session viewer.
![Top sessions](/assets/generated/screenshots/top-sessions.png)
### Project Breakdown
Bar chart of all projects sorted by session or message count.
Shows average and median messages per session for each project.
Click any project bar to filter the dashboard and session list
to that project.
![Project breakdown](/assets/generated/screenshots/project-breakdown.png)
### Session Shape Distribution
Three histograms showing the distribution of:
1. **Session length** — number of messages per session
2. **Session duration** — time in minutes
3. **Session autonomy** — ratio of tool calls to conversation turns
![Session shape](/assets/generated/screenshots/session-shape.png)
### Tool Usage
Total tool call count with breakdowns by category (Read, Edit,
Write, Bash, Search, Web, Task) and by agent. Includes a trend
chart showing tool usage over time.
![Tool usage](/assets/generated/screenshots/tool-usage.png)
### Top Skills
The Top Skills panel ranks skill-backed tool calls by call count,
session count, recency, agent mix, project mix, and week-by-week
trend. It is populated from normalized `skill_name` metadata on
tool calls and from inferred skill names when Codex or Cursor reads
a `SKILL.md` file through a read-like tool call. It appears when
your local transcripts include either explicit skill metadata or
enough `SKILL.md` reads for AgentsView to infer the skill name.
![Top Skills](/assets/generated/screenshots/top-skills.png)
### Velocity Metrics
Performance metrics including:
- Turn cycle time (p50, p90)
- First response time (p50, p90)
- Messages, characters, and tool calls per active minute
- Breakdown by agent and by session complexity
![Velocity metrics](/assets/generated/screenshots/velocity.png)
### Agent Comparison
Side-by-side metrics across agents: session count, total
messages, average response time, tool usage patterns, and
concentration metrics.
![Agent comparison](/assets/generated/screenshots/agent-comparison.png)
### Session Health
The 0.23.0 dashboard adds a **Session Health** section that rolls up
the new session-intelligence signals. It shows:
- average health score and derived grade
- headline counts for the `completed` and `errored` outcomes
(`abandoned` and `unknown` sessions are not counted here, but are
visible in the dashboard's outcome-distribution chart alongside
them)
- tool-failure rate and sessions with failures
- compaction counts, including mid-task compactions
- score trend over time
- by-agent and by-project score tables
![Session Health section on the dashboard](/assets/generated/screenshots/session-health.png)
See [Session Intelligence](/session-intelligence/#outcome-classification)
for the full four-outcome model that both this section and
`agentsview stats` derive from.
### CSV Export
Click **Export CSV** in the dashboard toolbar to download all
analytics data as a CSV file. Includes summary, activity,
projects, tools, and velocity sections.
---
## Session Insights
AgentsView can generate AI-powered summaries and analysis of your
coding sessions using Claude, Codex, Copilot, or Gemini. Click
**More → Insights** in the header navigation to open the Insights
page, where you can generate daily activity digests, multi-day
summaries, and deeper analyses of your agent workflow patterns —
scoped by project or across everything.
See the [Session Insights](/insights/) page for full
documentation.
---
## Trends
Open **More → Trends** in the header navigation for ad-hoc
term-frequency line charts over your session history. Type one
term per line into the textarea, hit **Refresh**, and AgentsView
counts how often each term appears in user and assistant message
content over the selected window.
![Trends page](/assets/generated/screenshots/trends.png)
Use Trends to track topics or technologies as your work shifts
over time — for example, plotting `rust`, `typescript`, and
`python` to see which language you've been spending the most
time in this quarter, or watching whether mentions of a problem
keyword like `flaky` or `timeout` are trending up or down.
The toolbar controls the window and resolution:
- **From / To** — date inputs at the top of the page; defaults
cover the last year.
- **Granularity** — `day`, `week`, or `month`. Pick coarser
buckets for longer windows.
- **Normalize by number of messages** — toggle to chart per-term
rate instead of raw counts, so a busy week doesn't drown out
a quiet one.
Each line in the **Terms** textarea is a separate term, capped
at 12 terms per chart. Within a line, pipe-separated variants
fold into a single series. AgentsView also adds a simple
plural form (just appending `s`) for each variant, and for
single-word variants ending in `c` it expands the silent-`e`
stem (`slic` matches `slice`, `slices`, `sliced`, `slicing`) —
beyond those two cases, spell out other forms explicitly as
pipe variants:
```text
rust
type|types|typing
docker|kubernetes|k8s
```
Matching is case-insensitive. Single-word matchers honor word
boundaries — `cat` won't match `catalog`. Multi-word matchers
match as substrings. Each line accepts up to 8 variants.
The chart panel uses one color per term. Hover a line to
highlight that term's series and draw point markers at each
bucket; for exact per-bucket counts, switch granularities or
read off the y-axis. The companion table below the chart lists
each term's color swatch, expanded variants, and total — `Count`
in raw mode or `Per 1k messages` in normalized mode.
Page state lives in the URL — `from`, `to`, `granularity`,
`normalized`, and repeated `term=` parameters — so any view is
shareable and bookmarkable.
The same data is available through the
`GET /api/v1/trends/terms` endpoint for scripting, and works
under both local `agentsview serve` and shared
[`pg serve`](/pg-sync/) deployments.
---
## Session Browser
The left sidebar lists all sessions with virtual scrolling for
smooth performance even with thousands of sessions. On desktop,
drag the resize handle between the sidebar and the content pane
to adjust the sidebar width. The width is constrained between
220px and 520px, always leaving at least 480px for the content
area. Your preferred width is saved in localStorage and restored
on next visit.
As of 0.30.0, the sidebar loads from a skinny session-index
endpoint and hydrates the visible rows on demand, so large
refresh storms (e.g. after a bulk import or `resync`) no
longer freeze the list while the full payloads arrive.
![Session list](/assets/generated/screenshots/session-list.png)
Each session item shows:
- **Status indicator** — small dot on the left whose color and
animation reflect both how recently the session was active and
whether it ended cleanly. See
[Session status indicator](#session-status-indicator) for the
full state set.
- **Session name** — display name if set, otherwise first message
text. OpenCode sessions use their native session titles. As of
0.27.0, Copilot CLI sessions use the `name` field from the
session's `workspace.yaml` when present, falling back to the
first user message otherwise. As of 0.33.0, labels are no
longer hard-truncated at 50 characters — the full label is
clipped responsively to the sidebar width instead.
- **Agent-provided session names** — several agents record a
session title themselves (Claude Code's `/rename`, Codex
`session_index.jsonl` thread names, Claude.ai and ChatGPT
conversation names, Forge, Hermes, Kiro, Piebald, Cortex Code,
and Command Code's `.meta.json` titles). As of 0.33.0, the
sidebar shows these titles automatically when
present. Manual in-app renames always take precedence and are
never overwritten by an agent-provided name. As of 0.34.0, Codex
titles renamed by the agent are imported from `session_index.jsonl`
for both current and archived sessions.
- **Model name** — the AI model used for the session, shown when
available (including Codex session models).
- **Star button** — click the star icon or press `s` to star
a session. Starred sessions persist in the SQLite database
so they survive server restarts.
- **Agent tag** — agent name on the right side, tinted with the
agent's accent color.
- **Machine label** — when using [PostgreSQL sync](/pg-sync/),
sessions from other machines show a machine name tag. Only
visible in shared multi-host deployments.
- **Project name** — abbreviated, right-aligned
- **Relative time** — "2h ago", "Mon", "Dec 1"
- **User prompt count** — number of user messages in the session
When a session has a native resume target, the sidebar also exposes
a direct native session link so supported agents can reopen their own
session instead of only navigating inside AgentsView.
### Session Status Indicator
As of 0.27.0, the small dot at the left edge of each session
row encodes how recently the session was written to and how it
last ended. The same indicator appears in the dashboard's
**Top Sessions** list. Hover the dot for a tooltip explaining
the current state.
| State | Indicator | Meaning |
|-------|-----------|---------|
| Working | Pulsing green | Last write within the last minute |
| Waiting | Tan speech bubble | Session ended on the agent's "your turn" stop reason and was active in the last 10 minutes |
| Idle | Muted green | 110 minutes idle, not awaiting user input |
| Stale | Amber | 1060 minutes idle and last assistant message has an unresolved tool call (or the session file was truncated mid-write) |
| Unclean | Red | Same flagged state as Stale, but idle for more than an hour |
| Quiet | Hidden | Cleanly-ended sessions older than 10 minutes; no dot is rendered |
The "flagged" tier (Stale and Unclean) is meant to surface
sessions that look like an agent crashed mid tool call or had
its session file truncated, so they're easy to pick out from
sessions that simply haven't been touched in a while.
Termination classification currently runs for **Claude Code**
and **Codex** sessions — those parsers read the per-message
`stop_reason` (Claude) or task lifecycle events (Codex). Other
agents render as plain time-based states (Working / Idle /
Quiet) without the flagged tier.
When a parent session has subagents or a continuation chain,
the dot reflects the freshest activity across the group: a
parent in `tool_call_pending` whose subagent is currently
writing rolls up to Working green. The parent's parser status
still wins for the Waiting state — a fork running in parallel
doesn't change that the parent has said *"your turn"*.
### Group by Agent
Click the group-by-agent toggle in the sidebar header to
organize sessions into collapsible sections by agent type.
Each agent group shows a color-coded dot, agent name, and
session count. Click an agent header to expand or collapse
its section. Groups start collapsed when first enabled.
### Sub-Agent Tree
When a session spawns sub-agents or teams, the sidebar
organizes them in a collapsible tree view. Parent sessions
show a disclosure triangle; click to expand and see child
agents nested underneath. This makes complex multi-agent
workflows easier to navigate without leaving the session list.
![Sub-agent tree view](/assets/generated/screenshots/subagent-tree.png)
### Forks and Subagent Sessions
AgentsView automatically detects conversation forks in Claude
Code sessions — for example, when you use "retry from here" to
branch a conversation. Large forks (more than 3 user turns)
appear as separate session entries grouped with their parent.
Small retries fold into the main session.
Subagent sessions spawned by the Task tool are organized
under their parent in the sidebar's
[sub-agent tree](#sub-agent-tree) and are also viewable
inline through the parent session's tool blocks (see
[Subagent Linking](#subagent-linking) below). Claude companion
session layouts are also linked when the parent can be inferred
from the companion directory structure, including externalized tool
result content stored beside the transcript.
### Session Filters
Click the filter icon next to the session count to open a
dropdown with several filter categories that can be combined:
![Session filter dropdown](/assets/generated/screenshots/session-filters.png)
- **Starred** — toggle to show only starred sessions
- **Recently Active** — toggle to show only sessions updated
within the last 24 hours
- **Agent** — searchable multi-select of
[supported agents](/configuration/#session-discovery). Click an
agent to toggle its selection; multiple agents can be active
at once.
- **Machine** — searchable multi-select of machine names.
Surfaces in shared [PostgreSQL sync](/pg-sync/) deployments
when more than five machines have pushed sessions.
- **Status** — three-pill multi-select of the
[status](#session-status-indicator) recency tiers (**Active**,
**Stale**, **Unclean**), tinted to match the indicator colors.
The underlying `?termination=` URL parameter and API also accept
the parser-side values `clean` and `awaiting_user`, but those
aren't exposed as sidebar pills.
- **Min Prompts** — filter to sessions with at least 2, 3, 5,
or 10 user messages
- **Include single-turn** — toggle to include sessions with one
or fewer user messages (excluded by default to reduce noise)
- **Include automated** — toggle to include sessions classified
as automation (roborev runs, title generation, AgentsView's own
internal prompts, and any patterns you've added to
[`[automated] prefixes`](/configuration/#automated-session-detection))
- **Hide unknown** — toggle to hide sessions whose project
could not be determined
When any filter is active, a green dot appears on the filter
button. Click **Clear filters** at the bottom of the dropdown
to reset all filters at once.
As of 0.27.0, the sidebar filter store is shared with the
analytics dashboard and the Usage page: agent, machine, project,
min user-message threshold, hide-single-turn, and include-automated
selections applied in the sidebar carry across to the dashboard
panels and the Usage page header, which mounts the same filter
widget. The **Status** filter is sidebar- and dashboard-only —
the Usage page does not currently filter by termination status.
Filter state is also persisted to localStorage and serialized
into the URL.
### Direct Session Links
Each session has a shareable URL. Click the session ID in the
detail header to copy the link, or use the URL bar directly:
```
/sessions/550e8400-e29b-41d4-a716-446655440000
```
Session URLs work as bookmarks and can be shared with teammates
when using [PostgreSQL sync](/pg-sync/) for shared deployments.
### URL Filters
URL parameters are supported for direct linking:
```
/sessions?project=myapp&agent=claude&date_from=2025-01-01
```
Available URL filters:
| Parameter | Value |
|-----------|-------|
| `project` | comma-separated project names |
| `agent` | comma-separated agent ids |
| `machine` | comma-separated machine names |
| `termination` | comma-separated [status](#session-status-indicator) tiers — any of `active`, `stale`, `unclean`, `clean`, `awaiting_user` |
| `date`, `date_from`, `date_to` | ISO date or activity-overlap range bounds |
| `active_since` | `true` to limit to the last 24 hours |
| `min_messages`, `max_messages` | numeric message count bounds |
| `min_user_messages` | numeric user-message threshold |
| `include_one_shot` | `false` to hide single-turn sessions (default) |
| `include_automated` | `true` to include automated sessions |
| `exclude_project` | comma-separated projects to hide (e.g. `unknown`) |
### Navigation
Use `]` and `[` to move between sessions in the list. The
selected session is highlighted with a left border accent.
---
## Message Viewer
Selecting a session opens the message viewer in the main content
area. Messages display in a scrollable list with virtual
rendering for large sessions.
![Message viewer](/assets/generated/screenshots/message-viewer.png)
The session detail header shows the session name, agent, project, a
health grade badge, and a copyable **Session ID**. Click the ID to
copy it to the clipboard for sharing or lookup. Click the grade
badge to toggle the signal panel.
If a parser skipped malformed source lines while still recovering
the session, the header shows a malformed-lines badge with the
persisted count (for example "3 malformed lines"). For Antigravity IDE and
CLI sessions decoded from an unrecognized SQLite schema fingerprint,
the header also shows **Unverified schema**. That badge means the
session was decoded heuristically from a newer schema and may be
incomplete.
### Message Layouts
Four layouts control how messages are rendered. Cycle between
them with the `l` key or the layout button in the header, or pick
one directly in Settings > Appearance:
| Layout | Description |
|--------|-------------|
| Default | Full card layout with colored borders and spacing |
| Compact | Condensed view with minimal spacing |
| Stream | Continuous flow optimized for reading |
| Skim | Collapses tool calls to summary headers for fast skimming |
### Focused Transcript Mode
Focused mode strips intermediate tool calls, thinking blocks,
and partial assistant messages, showing only user prompts and
final assistant responses. This makes long sessions easier to
read as a clean conversation transcript.
![Focused transcript mode](/assets/generated/screenshots/focused-transcript.png)
Toggle between Normal and Focused mode using the transcript
mode button in the session header. The header adjusts
responsively to fit the available space. The mode preference
is saved in localStorage.
### Message Display
Each message has a colored left border indicating role:
- **Blue** — user messages
- **Purple** — assistant messages
The header shows the role label, timestamp, and a **copy
button** that appears on hover. Click it to copy the full
message content to the clipboard — a checkmark confirms the
copy for 1.5 seconds.
Claude Code sessions also show a fork action on each message header
when the local server can launch or return a command. Clicking it
starts a new Claude run from the selected point by rendering the
transcript through that message ordinal into a temporary prompt,
starting `claude` in the session working directory, and removing the
temporary prompt after launch. In read-only local mode the action
copies the command instead of launching it; remote sessions cannot be
forked from the browser.
### Thinking Blocks
Assistant thinking blocks appear as collapsible sections with a
purple left border. Toggle visibility for thinking blocks using
the [block-type filter](#block-type-filtering) in the header.
### Tool Blocks
Tool invocations display as collapsible amber-bordered sections
showing the tool name, arguments, and output. When collapsed,
the header surfaces the most meaningful input field rather than
the first line of the rendered content. `TodoWrite` shows the
in-progress (or last) todo with a `→` prefix; `TaskCreate`
shows the subject; `TaskUpdate` shows `#<id> · <status> ·
<subject>`; `Skill` shows the skill name; `ToolSearch` shows
the first line of the query; and `Task`/`Agent`/subagent calls
show the description (falling back to the prompt). For tools
without a structured preview, the header falls back to the
first line of content, the `command`/`cmd` (Bash), or the
`file_path`/`pattern` (Read, Edit, Write, Glob).
![Tool blocks](/assets/generated/screenshots/tool-blocks.png)
When expanded, tool blocks display structured metadata tags
extracted from the tool call input. For task management tools
(TaskCreate, TaskUpdate, TaskGet), these tags show the task
subject, status, and ID at a glance. Bash tool blocks show
the full command text, including multi-line commands like
heredocs that would otherwise be truncated. Tool result content
is stored alongside the tool call when available, giving a
complete view of input and output.
Hover or focus a tool block to reveal copy buttons for the
structured input and, when present, the tool output.
![Copy buttons on a tool block](/assets/generated/screenshots/tool-block-copy-btn.png)
Codex tool calls receive special formatting: bash commands,
write_stdin operations, and apply_patch calls display with
structured argument previews and categorized detail labels.
Cursor `ApplyPatch` tool calls render as patch/diff content instead
of plain JSON when the Cursor transcript exposes the patch payload.
When a Codex tool call has subagent result events — status
updates captured during execution — an expandable **history**
section appears below the tool output. Click it to see the
full chronological timeline of status changes (e.g. "wait",
"completed", "failed") with source and content for each
event. The latest event summary is shown by default.
### Subagent Linking
When a Task or Agent tool block is linked to a subagent
session, it shows an expandable toggle. Click it to view the
subagent's full transcript inline without leaving the parent
session. Messages load on demand when the section is expanded,
showing the complete subagent conversation with role labels
and timestamps.
### Tool Call Groups
Consecutive tool-only assistant messages are grouped into
compact "N tool calls" sections with a gear icon and timestamp.
Click to expand individual tool blocks within the group.
![Tool call groups](/assets/generated/screenshots/tool-groups.png)
### Code Blocks
Fenced code blocks render with language labels, monospace
formatting, and horizontal scrolling for long lines. Hover or
focus a code block to reveal a **copy button** in the corner;
clicking it copies the raw code (no fences or language tag)
to the clipboard.
As of 0.33.0, labeled code fences get **syntax highlighting**
powered by Shiki. Twelve common languages are bundled —
JavaScript, TypeScript, Python, Bash, JSON, YAML, Markdown,
HTML, CSS, Rust, Go, and SQL (plus their usual aliases like
`py`, `sh`, and `yml`). Unlabeled or unrecognized languages
fall back to plain text. To keep large sessions fast,
highlighting is skipped for blocks over 50 KB or 800 lines,
and the highlighter loads lazily so it costs nothing until the
first code fence renders.
Fenced code blocks labeled `mermaid` render as Mermaid diagrams
in an interactive viewer with source-copy and expanded-view
controls. If the Mermaid runtime cannot load, AgentsView keeps
the escaped diagram source readable in the message. When
in-session search is active, Mermaid fences render as source code
so matches can be highlighted.
![Copy button on a code block](/assets/generated/screenshots/code-block-copy-btn.png)
### Block-Type Filtering
Click the filter icon in the message viewer header to open a
dropdown that toggles visibility of five content categories:
| Category | What It Controls |
|----------|-----------------|
| User | User messages |
| Assistant | Assistant responses |
| Thinking | Thinking/reasoning blocks |
| Tool | Tool call blocks |
| Code | Code blocks |
All categories are visible by default. When any are hidden,
a badge on the filter button shows the count of hidden types.
Click **Show all** to restore visibility.
### Sorting
Toggle between newest-first and oldest-first with the `o` key
or the sort button in the header. The arrow icon indicates the
current direction.
### Message Navigation
- `j` or `↓` — next message
- `k` or `↑` — previous message
- Click a message to select it (blue outline)
### In-Session Search
Press `Cmd+F` (or `Ctrl+F`) to open a search bar within the
current session. Type to find matching text across all visible
messages. The match count and current position are shown in the
search bar.
![In-session search](/assets/generated/screenshots/in-session-search.png)
Use the arrow buttons or `Enter` / `Shift+Enter` to jump
between matches. The matching message scrolls into view and the
search term is highlighted. Press `Esc` to close the search bar.
### Token Usage
The session detail header displays token usage when available,
showing input and output token counts for the session. This
gives a quick view of how much context the agent consumed
and how much it generated.
![Token usage display](/assets/generated/screenshots/token-usage.png)
As of 0.33.0, the header also shows the session's **estimated
cost** next to the token summary, computed from the same data
as [`agentsview session usage`](/session-api/#agentsview-session-usage).
Costs under a cent display as `<$0.01`, costs up to $100 with
two decimals, and larger costs as whole dollars. The badge is
hidden when the session has no token data or its models have
no pricing.
As of 0.37.1, sessions with per-step usage rows also show a
**step count** next to the token summary. Click it to expand a
per-step breakdown: each row lists the prompt or usage event,
the model that served it, its context size (input tokens plus
cache reads and writes), its output tokens, and a per-step cost
estimate when the model is priced. The rows come from the same
session usage API with `?breakdown=true` — see
[`agentsview session usage`](/session-api/#agentsview-session-usage).
For aggregate token usage and estimated cost reports across
all sessions, see the
[Token Usage & Costs](/token-usage/) page and the
[`agentsview usage daily`](/commands/#agentsview-usage-daily)
CLI command.
For a scriptable report on the current session, use
[`agentsview session usage <id>`](/session-api/#agentsview-session-usage)
or the matching
[`GET /api/v1/sessions/{id}/usage`](/session-api/#agentsview-session-usage)
REST endpoint.
### Signal Panel
Click the health grade badge in the session header to open the
signal panel for the current session. The panel shows:
- grade and numeric score
- outcome icon and confidence
- basis tags showing whether outcome, tool health, and context
pressure contributed to the score
- compaction summary, including mid-task compactions
- penalty chips for the deductions that were applied
When a session does not have enough usable data, the panel shows a
small empty state instead of a score. See
[Session Intelligence](/session-intelligence/) for the full model.
### Session Vital Signs
The right column of an open session shows a **Session Vital
Signs** panel with timing data derived from the message
timestamps. Toggle it from the session header.
![Session Vital Signs in context](/assets/generated/screenshots/session-vital-signs.png)
It has four stacked sections:
- **Session summary** — total wall-clock, turn count, tool call
count, sub-agent count, and the slowest call as a clickable
link that scrolls the conversation to that call. Live sessions
show a `running …+` indicator that ticks forward.
- **Time spent** — per-category aggregate bars across the
normalized taxonomy (`Read`, `Edit`, `Write`, `Bash`, `Grep`,
`Glob`, `Task`, `Tool`, `Other`, plus a `Mixed` bucket for
turns split across categories). Click a row to filter the rest
of the panel to that category.
- **Timeline** — turns lane plus per-category lanes plus an
activity lane, with a legend. Hover a turn segment to see its
primary category and duration (e.g. `Task · 2m`); click to
scroll the conversation to that turn.
- **Calls** — chronological list of tool calls with horizontal
duration bars. Parallel `tool_use` runs are bracketed as a
single group. Sub-agent rows expand inline to show the child
session's calls.
![Vital Signs panel detail](/assets/generated/screenshots/vital-signs-panel.png)
Inline in the conversation column, each `ToolBlock` header gets
a duration badge, and each assistant message gets a turn-summary
line ("turn 2m 18s · 3 calls"). Parallel non-sub-agent calls
render with a striped bar and a `≤duration` upper bound — the
JSONL source has only one timestamp per assistant message, so
per-call precision inside parallel groups isn't recoverable for
non-sub-agent calls. Tool labels are normalized across agents,
so Codex's `exec_command` and Claude's `Bash` show up under the
same "Bash" category in headers and in the Calls list.
Call duration bars in the Calls list are scaled relative to the
longest call in scope, not total session wall-clock — so even in
long sessions where any single call is a small fraction of the
total, call-vs-call comparison stays legible. Very short calls
floor at 4% width to remain visible.
### Progressive Loading
Sessions with more than 3,000 messages load the most recent
1,000 messages first. Older pages load automatically as you
scroll up. Smaller sessions load all messages at once.
### Live Updates
When viewing an active session, AgentsView uses Server-Sent
Events to stream new messages in real time. The message list
updates incrementally — only new activity is fetched, rather
than reloading the entire session — so updates arrive faster
and with less overhead.
### Follow Latest Message
As of 0.30.0, the session header has a **Follow latest
messages** toggle. When active, the message list auto-scrolls
to the newest message as updates stream in, so a long-running
session stays pinned to the tail without manual scrolling.
The toggle is also handy after a sync that rebuilt the
session — it snaps back to the latest message once the
re-rendered list settles.
![Follow latest toggle in the session header](/assets/generated/screenshots/follow-latest-toggle.png)
Cancellation is automatic: scrolling up by hand or clicking a
specific message turns follow mode off. Clicking the toggle
again re-engages it and jumps to the latest message. The
preference is persisted in localStorage, so a session you
opened in follow mode comes back in follow mode.
---
## Command Palette
Press `Cmd+K` (or `Ctrl+K`) to open the command palette — a
full-screen search overlay.
![Command palette](/assets/generated/screenshots/command-palette.png)
### Recent Sessions
With an empty or short query (under 3 characters), the palette
shows your 10 most recent sessions. Type to filter by project
name or first message.
### Search Modes
Type 3 or more characters to search in one of three modes:
- **Full text** searches indexed message content with FTS5. It
also matches session display names and first messages.
- **Semantic** ranks message content by meaning using the active
embeddings index.
- **Hybrid** combines semantic and full-text rankings so that
both conceptual and exact-term matches can surface.
The palette remembers the last mode you selected across openings
and browser sessions. Results update after a 300ms typing pause.
!!! tip
For deeper searches across full transcripts — including tool
inputs, tool result content, and regex patterns — use the
[`agentsview session search`](/session-api/#agentsview-session-search)
CLI or the `GET /api/v1/search/content` HTTP endpoint added
in 0.30.0. The command palette indexes message bodies via
FTS5 for fast scoring; the content-search endpoints add
substring and regex modes and cover tool I/O as well.
![Search results](/assets/generated/screenshots/search-results.png)
Results are grouped by session — each session shows its best
matching result. This prevents a single long session from
dominating the results list. Full text also matches against
session display names and first messages, so you can find
sessions by title.
In Full text mode, use the sort toggle in the palette header to
switch between **Relevance** (best matches first) and **Recency**
(newest sessions first). Semantic and Hybrid use their backend
rankings, so this toggle is hidden in those modes.
Semantic and Hybrid require an enabled [`[vector]`](semantic-search.md#enabling-vector)
configuration and an active embeddings index. If setup, index
state, or the embeddings service prevents a search, the palette
keeps the selected mode and shows actionable remediation rather
than silently falling back to Full text.
Results use a compact row:
- **Full text** may show the session name and a sanitized snippet
with highlighted search terms.
- **Semantic and Hybrid** lead with a plain-text matching snippet.
Content search does not return a session name or highlight
markup.
- **All modes** show an agent-colored dot, project and result
time, and a copyable session ID.
Select a result to jump to that session and scroll directly to
the matching message.
### Keyboard Navigation
- `↑` / `↓` — navigate results
- `Enter` — select current result
- `Esc` — close palette
---
## Session Management
### Renaming Sessions
Double-click a session name in the sidebar to rename it inline.
You can also right-click a session to open a context menu and
select **Rename**. Press Enter to save or Escape to cancel. The
custom name persists as a `display_name` in the database and
overrides the default first-message title.
### Trash
Press `Del` (or `Backspace`) with a session selected, or
right-click and select **Delete**, to move it to the trash.
An undo toast appears briefly to let you recover the session
immediately. Trashed sessions are hidden from all listings
and analytics.
Click **More → Trash** in the header navigation to view
trashed sessions. From the trash page you can restore
individual sessions or permanently delete them. Use **Empty
trash** to permanently delete all trashed sessions at once.
### Batch Selection
Click the **Multi-select** toggle in the sidebar header to enter
selection mode. A checkbox appears on each session; click
sessions to check them, or use **All** to select every visible
session and **Clear** to deselect. The batch toolbar shows how
many are selected and a **Delete** action that moves the whole
selection to the trash at once. Toggle multi-select off to return
to normal browsing.
### Pinned Messages
Click the pin icon on any message header to pin it. Pinned
messages are saved to the database and accessible from
**More → Pinned** in the header navigation.
The pinned page shows a gallery-style grid of pinned messages.
Each card shows the message content (expandable for long
messages), the session and project it belongs to, and actions
to copy the content, unpin, or navigate back to the source
message in its session.
### Session Resume Menu
Right-click a session in the sidebar to open a context menu
with three resume actions:
- **Reopen** — reopen the session in the agent that created it
- **Terminal** — launch a terminal in the session's working
directory
- **Open Directory** — open the session's working directory in
Finder (macOS) or Explorer (Windows)
GitHub Copilot CLI and Cursor sessions also appear in the
resume dropdown. Cursor resume resolves the original workspace
path automatically and passes it as `--workspace` to
`cursor agent --resume`.
For Claude sessions on macOS, a **Claude Desktop** option
appears at the bottom of the resume menu. It opens the session
in Claude Desktop's Code tab via the `claude://resume` URL
scheme.
The `agentsview session list --resume` and `--active` CLI modes use
the same recent-activity signal to produce a compact terminal table
for picking up in-flight work.
These actions let you quickly pick up where you left off
without manually navigating to the project directory.
---
## Session Export
Press `e` or open the export menu in the header to download the
current session as a standalone HTML file. The exported file
includes styled message rendering and works offline. As of
0.30.0, the export ships with a **Normal / Focused** radio
toggle in the document header so the recipient can flip into
[focused mode](#focused-transcript-mode) — only user prompts
and final assistant responses — without re-running the export.
The same menu also includes **Copy markdown export link**, which
copies a URL for the session's markdown export endpoint. That link
can be used in scripts, notes, or shared internal tooling when you
want a text-oriented representation instead of the standalone HTML
export. When the active session has a source file path, the menu
also offers **Copy source file path** for quick handoff to another
tool or terminal. The markdown export is particularly well-suited
for handing session context to another agent.
The markdown export route is:
```text
GET /api/v1/sessions/{id}/md
```
By default, it exports only the current session. Add the
`depth` query parameter to inline descendants:
- `?depth=1` — include direct child sessions
- `?depth=all` — include the full descendant tree
Subagent children are embedded inline near the tool call that
spawned them. Other child sessions are appended after the parent
transcript in `<child_session>` blocks. The markdown payload also
includes XML-style tags for metadata, thinking blocks, tool
calls, code blocks, and child-session boundaries.
Typical agent handoff flow:
```bash
curl "http://127.0.0.1:8080/api/v1/sessions/<session-id>/md?depth=all" \
-o session-context.md
```
Then attach `session-context.md` to another agent run or paste
its contents into a prompt so the next agent can inspect the
full session tree without opening the AgentsView UI.
---
## Publish to Gist
Press `p` or click the publish button to share a session via
GitHub Gist. As of 0.33.0, the publish button is a dropdown
with two entries: **Publish public Gist** and **Publish secret
Gist**. The `p` shortcut publishes publicly.
![Publish modal](/assets/generated/screenshots/publish-modal.png)
AgentsView prefers your existing GitHub CLI login for local
publishing. If no token is saved in AgentsView and
`AGENTSVIEW_GITHUB_TOKEN` is not set, it runs `gh auth token` and
uses that token to create the gist. Run `gh auth login` once if
the GitHub CLI is not authenticated yet.
For remote or proxied AgentsView access, save a GitHub token in
AgentsView before publishing. Remote requests do not use the server
process environment or GitHub CLI credential as a fallback.
If neither a saved token, `AGENTSVIEW_GITHUB_TOKEN`, nor
`gh auth token` is available for local publishing, the publish
modal prompts for a GitHub personal access token with the `gist`
scope. That token is saved to your config file and reused for
future publishes.
!!! warning
Secret gists are unlisted, not access-controlled: they don't
appear in your public gist list or in search, but anyone who
has the URL can read them.
After publishing, the modal shows two URLs:
- **View URL** — rendered view of the gist
- **Gist URL** — direct GitHub link
Both have copy buttons and an "Open in Browser" action.
---
## Session Upload
Upload session JSONL files from other machines via the API:
```bash
curl -F "file=@session.jsonl" \
"http://127.0.0.1:8080/api/v1/sessions/upload?project=myapp"
```
Uploaded files are stored in `~/.agentsview/uploads/` and
synced into the database.
---
## Keyboard Shortcuts
Press `?` to see all shortcuts in a modal overlay.
| Key | Action |
|-----|--------|
| `Cmd+K` | Open command palette |
| `Cmd+F` | Search within current session |
| `Esc` | Close modal / deselect session |
| `j` / `↓` | Next message |
| `k` / `↑` | Previous message |
| `]` | Next session |
| `[` | Previous session |
| `o` | Toggle sort order |
| `l` | Cycle message layout |
| `s` | Star / unstar current session |
| `Del` | Delete / archive selected session |
| `r` | Trigger sync |
| `e` | Export session |
| `p` | Publish to Gist |
| `?` | Show shortcuts |
Shortcuts are disabled when typing in an input field. `Esc`
always works.
---
## Settings
Click the gear icon in the header to open the Settings page.
Settings are organized into sections:
![Settings page](/assets/generated/screenshots/settings.png)
| Section | What You Can Configure |
|---------|----------------------|
| Language | Interface language (English, Simplified Chinese, Traditional Chinese, or Korean) |
| Appearance | Theme (light/dark), high-contrast mode, message layout, text size, block visibility, desktop zoom level |
| Date ranges | Browser-local checkbox for linking date selections across Sessions, Usage, Activity, Trends, and Insights |
| Agent Directories | Custom paths for each agent's session files. For Devin CLI, point at the local root that contains `cli/` (for example a redacted `.../Application Support/devin` path), not copied config or OAuth files. |
| Terminal | Default terminal emulator for session resume |
| Worktree Mappings | Map worktree paths back to their main project (see [Worktree Project Mappings](/configuration/#worktree-project-mappings)) |
| GitHub | Personal access token for Gist publishing |
| Remote Access | Remote connections toggle, auth token, connect to remote server |
![Settings remote access section](/assets/generated/screenshots/settings-remote.png)
Language, Appearance, and Date ranges preferences are stored in the browser and
do not write `~/.agentsview/config.toml`. Agent directory overrides, terminal
settings, the saved GitHub token, and the local server's remote-access
authentication settings use `~/.agentsview/config.toml`. Worktree Mappings live
separately in the local archive database. See
[Remote Access](/remote-access/) for details on the remote access settings.
---
## About Dialog
Click the version number in the status bar or select **About**
from the header menu to open the About dialog. It shows the
current version, build date, git commit, and links to the
changelog and GitHub repository.
![About dialog](/assets/generated/screenshots/about-dialog.png)
---
## Desktop Zoom
In the desktop app, use `Cmd+Plus` and `Cmd+Minus` (or
`Ctrl+Plus` / `Ctrl+Minus` on Windows) to zoom in and out.
`Cmd+0` resets to the default zoom level. The zoom level can
also be set in the Settings page under the **Appearance** tab.
---
## Theme
Click the theme toggle in the header or go to Settings >
Appearance to switch between light and dark mode. The
preference is saved and persists across sessions.
![Light theme](/assets/generated/screenshots/theme-light.png)
![Dark theme](/assets/generated/screenshots/theme-dark.png)
Settings > Appearance also offers a **high-contrast** mode for
greater legibility and a **text size** control (90130%) that
scales message and interface text. Both preferences are saved
and persist across sessions.
### Iframe Embedding
When embedding AgentsView in an iframe, the parent page can
control the theme via `postMessage`:
```javascript
iframe.contentWindow.postMessage(
{ type: "theme:set", theme: "dark" },
"*"
);
```
Accepted values for `theme` are `"light"` and `"dark"`.
---
## Sync
AgentsView automatically syncs session files on startup and
watches for changes in real time. The sync status is shown in
the status bar:
- **Syncing indicator** — green text showing progress percentage
and phase (`Scanning [project]...` or parse progress)
- **Last sync time** — relative timestamp ("synced 2h ago")
that updates automatically. Hover to see the exact sync
timestamp.
Press `r` to trigger a manual sync. The sync button in the
header shows a spinning animation while syncing.
The status bar also shows a version mismatch warning (red) if
the frontend and backend versions differ. Click it to reload.
### Full Resync
![Resync modal](/assets/generated/screenshots/resync-modal.png)
Click the **gear icon** in the header to open the Full Resync
modal. This re-parses all session files from scratch using a
non-destructive flow — existing session data is preserved and
orphaned sessions (those no longer present on disk) are carried
forward. This is useful after upgrading AgentsView or when
sessions appear to be parsed incorrectly.
The modal shows live progress as sessions are processed:
1. **Confirm** — describes what the resync does, with Start and
Cancel buttons
2. **Progress** — live counter and progress bar ("Syncing X / Y
sessions..."). The modal stays open until the resync finishes.
3. **Done** — shows synced, skipped, and total session counts
4. **Error** — if the resync fails, shows the error with Retry
and Close buttons