pi-session-finder
Cross-project session search & jump for pi. Adds /find <keywords> that full-text searches every past session across all projects and switches to the match — like /resume, but driven by content search.
Package details
Install pi-session-finder from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-session-finder- Package
pi-session-finder- Version
0.5.6- Published
- Aug 2, 2026
- Downloads
- 2,499/mo · 2,499/wk
- Author
- ngsoftware
- License
- MIT
- Types
- extension
- Size
- 82.4 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-session-finder
Cross-project session search & jump for pi.
Adds a
/find [keywords…]command that full-text searches every past session across all projects, shows the matches with the keyword in context, and on selection switches to that session and its project directory — the same outcome as/resume, but driven by content search instead of a name picker.
Why
pi's built-in /resume picker filters sessions by name / first message only.
There is no way to "find the session where I worked on X." This extension
searches the full text of every session (via SessionManager.listAll(), which
already pre-extracts allMessagesText) and jumps you straight there.
Install
pi install npm:pi-session-finder
Or load it ad-hoc:
pi -e ./src/index.ts
Usage
/find stripe webhook # AND-match across name, cwd, and full message text
/find "stripe webhook" # quoted phrase → matched as a single substring
/find BusinessCentral # matches by project path too
/find # opens a search prompt (type to search)
/find-back # jump back to the previous session/project
Pick a result with the arrow keys + Enter to switch into that session and
its working directory (pi re-runs project trust for the target cwd, just like
/resume). Esc / Ctrl+C cancels.
Each result shows the session name (or first message), the project folder, how long ago it was modified, the message count, and a snippet of the matching text.
Going back: /find-back
Every time you switch sessions — via /find, /resume, /new, /fork, or
/clone — pi fires session_start with the file you just left. This extension
records that onto a small navigation stack so /find-back replays it in
reverse: a browser-style back across sessions and projects.
- Repeat
/find-backto walk further back through the chain. - Deleted sessions at the top of the stack are skipped automatically.
- A one-shot guard prevents ping-pong: the back-jump itself isn't re-recorded,
so the next
/find-backgoes one step further, not back to where you were.
The stack lives in ~/.pi/agent/session-finder/backstack.json (honours
PI_CODING_AGENT_DIR). It is on disk, not in memory, because a cross-project
jump reloads this extension module and would wipe in-memory state. It is capped
at 50 entries.
Where it works
/find is interactive (TUI and RPC modes). In print / JSON mode it is a no-op
that points you at the (planned) pi --find CLI flag.
How it matches & ranks
- Scope: every session, every project.
- Match targets: session
name,cwd, and the fullallMessagesText. - Default: case-insensitive AND of all terms (quoted phrases become one
term).
or/phrasemodes are implemented and ready for a settings hook. - Snippet: centered on the least-common matched term (a local IDF surrogate — rare terms disambiguate better), trimmed to token boundaries, whitespace-collapsed.
- Ranking: name hit first → more matched terms → more recent.
- Preview pane: focusing a match lazily parses that session's JSONL and
shows the models used, a tool histogram, files modified (from
edit/write calls), and cost · tokens consumed — above the keyword-centered
snippet. Set
PI_FIND_RICH_PREVIEW=0to keep the pane snippet-only. - Peek: once a row is focused,
</>page back/forward through the whole session transcript in the preview pane (step ≈ 0.8 of the window so context overlaps at the seam). The pane resets to the match anchor whenever you move to another row. - Experimental RRF: set
PI_FIND_RANK_MODE=rrfto fuse four independent signals (metadata, term coverage, recency, term frequency) via Reciprocal Rank Fusion instead of the hand-tuned order. Off by default — it becomes the default only if it beats the heuristic on the gold set. (bm25is reserved and currently behaves like the default.)
Configuration
Env-var knobs (pi extensions don't expose a config API yet):
| Variable | Default | Effect |
|---|---|---|
PI_FIND_RICH_PREVIEW |
1 |
0 disables the models/tools/files/cost facet pane (snippet-only). |
PI_FIND_RANK_MODE |
heuristic |
rrf fuses four signals via Reciprocal Rank Fusion; bm25 is reserved. |
PI_FIND_BACK_DEBUG |
0 |
1 appends a line per session_start / /find-back to session-finder/debug.log. |
Project layout
src/
├── index.ts # factory: registers /find + /find-back; scan → rank → select → switchSession
├── history.ts # pure back-navigation logic: record switches, suppress ping-pong, pop for /find-back
├── finder.ts # custom TUI component: scrollable list + live fuzzy filter + rich preview pane
├── parse.ts # JSONL parse → recap (intent/last action/outcome) + rich facets + match locator
└── search.ts # pure helpers: parseQuery / matchSession / rankMatches / extractSnippet (+ projName, ago)
test/
├── history.test.ts # unit tests for the pure back-navigation logic
├── search.test.ts # unit tests for the pure search logic
└── wiring.test.ts # smoke test: real module load + /find + /find-back registration + guards
search.ts has no pi imports, so the core logic is fully unit-testable.
Development
npm install
npm run check # typecheck (tsc --noEmit) + tests (vitest)
npm test
npm run typecheck
Status & roadmap
- MVP (this release):
/findviactx.ui.select; AND matching overallMessagesText+name+cwd; jump viaswitchSession. Usable & shippable. - Shipped beyond MVP: custom TUI finder with live filter + a rich preview
pane (models / tool histogram / files modified / cost — PLAN item 1),
</>peek paging through the transcript (item 5), RRF rank-fusion opt-in (item 6), recap-at-landing + match locator on jump (item 7), and/find-backuniversal back-navigation across sessions/projects. All in-memory (search) / on-disk (back stack), no DB/cache/index. SeePLAN.md. - v1: richer settings once pi exposes a config API; RRF default flip (gated on the gold-set benchmark, PRD §10).
- v1.1:
pi --findCLI flag;matchMode(or/phrase) +rankMode: "bm25". - v2: streaming results, fuzzy matching, optional content index.
See PRD.md for the full spec and RESEARCH.md for the evidence base behind
the design decisions.
License
MIT