@kaiserlich-dev/pi-session-search
Full-text search across pi sessions with FTS5 index and overlay UI
Package details
Install @kaiserlich-dev/pi-session-search from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@kaiserlich-dev/pi-session-search- Package
@kaiserlich-dev/pi-session-search- Version
1.1.3- Published
- May 3, 2026
- Downloads
- 4,217/mo · 337/wk
- Author
- jksr194
- License
- MIT
- Types
- extension
- Size
- 72.5 KB
- Dependencies
- 1 dependency · 2 peers
Pi manifest JSON
{
"extensions": [
"./extensions/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@kaiserlich-dev/pi-session-search
Full-text search across all pi sessions with a SQLite FTS5 index and overlay UI.
Install
npm (recommended)
pi install npm:@kaiserlich-dev/pi-session-search
git (alternative)
pi install git:github.com/kaiserlich-dev/pi-session-search
By default this writes to
~/.pi/agent/settings.json. Use-lto install into.pi/settings.jsonfor a project.
Then restart pi or run /reload.
To configure OpenRouter for session summaries, run:
/session-search-register-key
Features
- FTS5 index — indexes user messages, assistant responses, tool results, and session metadata. Sub-100ms queries regardless of session count.
- Browse recent sessions — opening search shows your most recent sessions immediately, no typing required.
- Incremental indexing — only processes new/changed sessions. Runs async in background on startup with cooperative yielding.
- Overlay search palette — theme-aware UI matching pi-skill-picker / pi-queue-picker style.
- Preview — see matched snippets with highlighted search terms before deciding.
- Resume — switch to a found session directly from the preview.
- Summarize & inject — ask the LLM to read the full session and inject a summary into your current context.
- Custom focus prompt — optionally provide a focus (e.g. "focus on the auth decisions") before summarizing, so the summary targets what you care about.
- New session with context — start a fresh session with summarized context from a previous one, seeded directly into the new session.
- Smart project names — resolves
~/code/owner/repopaths into readableowner/repoproject labels.
Usage
| Shortcut / Command | Action |
|---|---|
Ctrl+Shift+F |
Open search overlay |
/search |
Open search overlay |
/session-search-register-key |
Prompt locally for the OpenRouter API key used for summaries |
/search resume "<sessionPath>" |
Resume a specific session by file path |
/search new-context "<sessionPath>" ["focus prompt"] |
Start a fresh session seeded with summary context from a prior session |
/search reindex |
Clear and rebuild index from scratch |
/search stats |
Show index statistics |
Search screen
| Key | Action |
|---|---|
| Type | Search query (debounced) |
← / → |
Move cursor within query |
Home / Ctrl+A |
Jump to start of query |
End / Ctrl+E |
Jump to end of query |
Delete |
Delete character after cursor |
Ctrl+W / Alt+Backspace |
Delete word before cursor |
| Paste | Insert clipboard text at cursor |
↑ / ↓ |
Navigate results |
Enter |
Open preview for selected result |
Esc |
Close |
When opened with an empty query, recent sessions are shown (most recent first).
Preview screen
| Key | Action |
|---|---|
Tab / ← → |
Cycle actions: Resume · Summarize · New + Context · Back |
Enter |
Execute selected action |
Esc |
Back to search |
Summary Focus screen
When choosing Summarize or New + Context, a prompt screen appears:
| Key | Action |
|---|---|
Enter |
Use default summary (no custom focus) |
Type + Enter |
Summarize with custom focus prompt |
Esc |
Back to preview |
The custom focus is passed to the LLM alongside the session content, steering the summary toward what matters to you.
When calling /search subcommands manually, use double-quoted arguments:
/search resume "<sessionPath>"/search new-context "<sessionPath>" ["focus prompt"]
Summary model setup
/session-search-register-key stores your OpenRouter key in:
~/.session-search/secrets.json
with this shape:
{
"apiKey": "YOUR_OPENROUTER_API_KEY"
}
The command prompts locally, so you do not need to paste the key into a normal LLM prompt.
How it works
- On
session_start, the indexer scans~/.pi/agent/sessions/for JSONL files. - Files with a newer
mtimethan last indexed are parsed — user messages, assistant text (no thinking blocks), and tool results are extracted. - Text is chunked into ~4KB segments and inserted into a SQLite FTS5 table with Porter stemming.
- Searches use FTS5
MATCHwith BM25 ranking, deduplicated per session at the SQL level. - The index lives at
~/.pi-session-search/index.db(~5–10MB for hundreds of sessions). - Summaries are generated via OpenRouter (Gemini Flash) and injected as assistant messages.
Development
# Run locally without installing
pi -e ./extensions/index.ts