Sidebar history of every workspace and agent, including archived ones, with filters and ranked search over on-disk conversation transcripts.
From the plugin's README
beat does not find heartbeat) and cannot take a regular expression.grep -i folds case according to the daemon's locale. A grep hit inside a very long line (a
large tool result) shows a snippet cut from the first megabyte of that line. grep returns
the first hits in file order, and a query that also appears in a record's fields (a branch
name, a directory, a session id) matches every line of that transcript; such hits are labelled
meta and shown only when nothing said in the conversation matched.grep on the daemon's PATH. Windows ships none, so when PATH
has no grep the one bundled with Git for Windows is used, looked up under %ProgramFiles%,
%ProgramFiles(x86)%, %LOCALAPPDATA%, scoop, and C:\msys64. On a host with neither,
Ranked search still …Exact install target unavailable. Refresh after the next successful scan.
Git security status and fallback installation are pinned to commit 004c6a80c6aa.
From the plugin's README
paseo plugin add panrafal/paseo-plugins:agents-history
From a checkout:
npm install # from the monorepo root
npm run typecheck
paseo plugin install /absolute/path/to/paseo-plugins/agents-history
paseo plugin ls # expect "running"
After editing:
npm run typecheck
paseo plugin reload agents-history
paseo plugin logs agents-history # "search index at …" and "index sync" lines once the surface is opened
README
Paseo plugin that adds an Agents history entry to the app sidebar. It lists every workspace
the selected daemon has ever had, archived ones included, with the agents that ran in each, and
searches what was said in those conversations through a ranked full-text index of the providers'
transcript files on the daemon host (falling back to grep -E over the raw transcripts for
regular expressions, and wherever the index is not available yet — see Limitations).
Paseo's own History screen searches agent titles and hides archived workspaces; this surface is for finding the workspace where something was discussed weeks ago.
Every workspace in the daemon's registry, newest activity first, grouped into Active and Archived when the archived filter is set to all. Each card carries:
archived badge
when the workspace or its project is archived, and how long ago anything in it last moved.
Below, each with a small icon: project, branch, worktree name, agent count, and labels. Pressing the head opens
the workspace; for an archived one Paseo shows its recovery screen and offers to unarchive.archived badge, the last activity, and under it, each with a small
icon, provider, model, and last status.
Pressing an active row opens the agent. Pressing an archived row asks whether to restore it.
Restore and open restores its provider session, then opens that agent; Cancel leaves
it archived. A failed restore shows an error and keeps the dialog open for retry.Agents whose workspace record no longer exists are grouped under a "Workspace record missing" card so they stay reachable.
The header sums what is showing: how many workspaces and agents, and, with filters on, out of how many.
Typing in the search box does two things:
you or agent), the text around the match, and the match itself in bold.
"+ N more matching lines" means more exist than are shown.Ranked (the default) answers from the search index. Every word must occur, in any order and
any form (schedule finds scheduled, heartbeat finds heartbeats); the last word may be a
prefix so results fill in while typing. When no conversation has every word, any word is accepted
and the note under the filters says so. Names count more than what was said: a hit in an agent
title, workspace name, branch, project, label, directory segment, model, or provider is weighted
above hits in the conversation text, and such agents show "matches workspace name, branch" above
their snippets. Letter case is ignored, so Aa is muted.
Regex treats the text as an extended regular expression and runs grep -E over the raw
transcript files instead; Aa then makes it case-sensitive. Grep also answers when the index
has not been built yet (the note says so) or when the daemon's Node.js has no SQLite with FTS5.
Grep hits are listed in file order, not ranked, and also cover tool output and provider
bookkeeping (tool and meta lines), which the index leaves out.
A line under the filters says how many conversations matched across how many agents, how many agents could not be searched or are not indexed yet, and whether the search was cut short. An invalid regular expression is reported there as well. A second line shows the state of the index.
On a desktop-sized window the dropdowns open as popovers under their trigger; on a phone they open in Paseo's sheet.
The search text and filter choices are kept while you navigate around the app, so opening a workspace you found and coming back shows the same results; they reset when the app restarts.
Paseo does not store conversations itself; it replays the provider's own transcript. The plugin searches those files directly:
| Provider | File |
|---|---|
| Claude Code | ~/.claude/projects/<encoded cwd>/<session id>.jsonl plus the subagent files under <session id>/subagents/ (CLAUDE_CONFIG_DIR respected) |
| Codex | ~/.codex/sessions/<date>/rollout-*-<thread id>.jsonl, or ~/.codex/archived_sessions/ once the agent is archived (CODEX_HOME respected) |
| OMP, Pi | the session file the daemon recorded as the agent's native handle |
| Cursor, Kilo, Copilot, other ACP providers | nothing on disk; these agents are listed but say "keeps no conversation file to search" during a search |
$PASEO_HOME/projects/workspaces.json, projects.json, and one JSON file per agent under
$PASEO_HOME/agents. Files are re-parsed only when their size or modification time changes;
the client re-reads the census every 30 seconds. Agent records also hold provider credentials;
the server never returns or logs those fields.$PASEO_HOME/plugin-data/agents-history/search.sqlite, using
Node's built-in node:sqlite and its FTS5 extension (present in Node 24 and in Node 22.16 or
later). Nothing is installed. It holds one row per user or assistant message (chunks) and one
row of metadata per agent (agent_meta: title, workspace, project, branch, labels, paths,
model, provider), both with the porter stemmer.snippet().node:sqlite or without FTS5 leaves every search on grep; the note under the
filters says so.beat does not find heartbeat) and cannot take a regular expression.grep -i folds case according to the daemon's locale. A grep hit inside a very long line (a
large tool result) shows a snippet cut from the first megabyte of that line. grep returns
the first hits in file order, and a query that also appears in a record's fields (a branch
name, a directory, a session id) matches every line of that transcript; such hits are labelled
meta and shown only when nothing said in the conversation matched.grep on the daemon's PATH. Windows ships none, so when PATH
has no grep the one bundled with Git for Windows is used, looked up under %ProgramFiles%,
%ProgramFiles(x86)%, %LOCALAPPDATA%, scoop, and C:\msys64. On a host with neither,
Ranked search still works once the index is built, but the first search after a fresh install
fails with a message saying which executable is missing. Set AGENTS_HISTORY_GREP to a grep
binary to override the search.agent reload) to unarchive
the selected agent and restore its provider session. This may also recover its owning workspace.
The CLI must be available as paseo or through PASEO_CLI_PATH.paseo plugin add panrafal/paseo-plugins:agents-history
From a checkout:
npm install # from the monorepo root
npm run typecheck
paseo plugin install /absolute/path/to/paseo-plugins/agents-history
paseo plugin ls # expect "running"
After editing:
npm run typecheck
paseo plugin reload agents-history
paseo plugin logs agents-history # "search index at …" and "index sync" lines once the surface is opened
Scanned 15 Oct 2026, 12:29 UTC from panrafal/paseo-plugins/agents-history.