Session History Enhanced
by @maverick-software
Session history system for OpenClaw — persistent, browsable, resumable chat sessions with SQLite index, archive/restore, migration, paginated UI, and chat dr...
clawhub install session-history-enhancements📖 About This Skill
name: session-history description: "Session history system for OpenClaw — persistent, browsable, resumable chat sessions with SQLite index, archive/restore, migration, paginated UI, and chat dropdown integration. Use when: (1) adding session archival/indexing to OpenClaw, (2) implementing session browsing/search in the dashboard, (3) adding session resume/rename/delete, (4) archiving active sessions from the dashboard, (5) adding pagination to session lists, or (6) integrating recent sessions into the chat dropdown."
Session History
Transforms OpenClaw's single-slot session model into a multi-session history system with SQLite indexing, archive/restore, and full dashboard UI.
Architecture
~/.openclaw/agents/{agentId}/sessions/
├── sessions.json # routing table (unchanged)
├── history.db # SQLite index (auto-created)
├── {activeSessionId}.jsonl # active transcript
└── archive/
└── {sessionId}.jsonl # archived transcripts
Lifecycle:
/new or session reset → old transcript moves to archive/, metadata indexed in SQLitearchive/, SQLite status flips to active.jsonl filesFile Map
Backend (new files)
| File | Reference | Purpose |
|------|-----------|---------|
| src/config/sessions/history-db.ts | references/backend-history-db.ts.txt | SQLite CRUD operations |
| src/config/sessions/history-migration.ts | references/backend-history-migration.ts.txt | One-time migration + initHistoryDbWithMigration |
| src/gateway/session-archive.ts | references/backend-session-archive.ts.txt | Archive/restore logic |
Backend (modified files)
| File | Reference | Purpose |
|------|-----------|---------|
| src/gateway/protocol/schema/sessions.ts | references/backend-protocol-schemas.ts.txt | TypeBox schemas for new RPCs |
| src/gateway/server-methods/sessions.ts | references/backend-rpc-handlers.ts.txt | 5 RPC handler implementations |
Frontend (modified files)
| File | Reference | Purpose |
|------|-----------|---------|
| ui/src/ui/controllers/sessions.ts | references/frontend-controllers-sessions.ts.txt | Full controller with archived session CRUD + pagination |
| ui/src/ui/views/sessions.ts | references/frontend-views-sessions.ts.txt | Full view with Session History section, Archive button, pagination |
| ui/src/ui/app-view-state.ts | references/frontend-state-changes.txt | State + app.ts + app-render.ts + app-chat.ts + app-settings.ts + app-render.helpers.ts wiring |
Installation
See references/INSTALL.md for step-by-step instructions.
RPC Endpoints
| Method | Params | Purpose |
|--------|--------|---------|
| sessions.archive | key | Archive active session — deactivates, moves transcript, indexes in SQLite, removes from store |
| sessions.archived | agentId?, limit?, offset?, search?, status? | List archived sessions with pagination and search |
| sessions.resume | sessionId, agentId? | Restore archived session to active |
| sessions.rename | sessionId, displayName, agentId? | Update session display name |
| sessions.deleteArchived | sessionId, agentId?, deleteTranscript? | Delete archived session + optional transcript |
UI Features
Sessions Page
Chat Dropdown
with 10 most recent archived sessionsKey Design Decisions
limit/offset to sessions.archived RPCsessionKey (agent:main:main), so the dropdown uses __archived__:{sessionId} as the option valuesessions.archive reuses sessions.delete param schema: Both need just { key }Common Pitfalls
1. RPC handler signature: Must use ({ params, respond }) destructuring, not (request, respond)
2. assertValidParams: Takes 4 args: (params, validator, "method.name", respond)
3. Sessions directory: Use resolveSessionTranscriptsDirForAgent(agentId) — NOT resolveGatewaySessionStoreTarget(config)
4. Pagination on every load: All loadArchivedSessions calls must pass limit and offset
5. Page reset: Changing page size or search query must reset page to 1
6. Archived session dropdown filtering: Filter by sessionId, not sessionKey (all archived sessions share the same sessionKey)