CLI commands
Sessions
openclaw sessions
List stored conversation sessions.
Session lists are not channel/provider liveness checks. They show persisted
conversation rows from session stores. A quiet Discord, Slack, Telegram, or
other channel can reconnect successfully without creating a new session row
until a message is processed. Use openclaw channels status --probe,
openclaw status --deep, or openclaw health --verbose when you need live
channel connectivity.
openclaw sessions and Gateway sessions.list responses are bounded by
default so large long-lived stores cannot monopolize the CLI process or Gateway
event loop. The CLI returns the newest 100 sessions by default; pass
--limit <n> for a smaller/larger window or --limit all when you intentionally
need the full store. JSON responses include totalCount, limitApplied, and
hasMore when callers need to show that more rows exist.
RPC clients can pass configuredAgentsOnly: true to keep the broad combined
discovery source but return only rows for agents currently present in config.
Control UI uses that mode by default so deleted or disk-only agent stores do
not reappear in the Sessions view.
openclaw sessionsopenclaw sessions --agent workopenclaw sessions --all-agentsopenclaw sessions --active 120openclaw sessions --limit 25openclaw sessions --verboseopenclaw sessions --jsonScope selection:
- default: configured default agent store
--verbose: verbose logging--agent <id>: one configured agent store--all-agents: aggregate all configured agent stores--store <path>: explicit store path (cannot be combined with--agentor--all-agents)--limit <n|all>: max rows to output (default100;allrestores full output)
Tail human-readable trajectory progress for stored sessions:
openclaw sessions tailopenclaw sessions tail --followopenclaw sessions tail --session-key "agent:main:telegram:direct:123" --tail 25openclaw sessions --agent work tail --followopenclaw sessions --all-agents tail --followopenclaw sessions tail renders recent trajectory JSONL events as compact progress lines. Without --session-key, it tails running sessions first, then the latest stored session. --tail <count> controls how many existing events print before follow mode; the default is 80, and 0 starts at the current end. --follow keeps watching the selected trajectory files, including relocated files referenced by <session>.trajectory-path.json.
The progress view is intentionally conservative: prompt text, tool arguments, and tool result bodies are not printed. Tool calls show the tool name with {...redacted...}; tool results show status such as ok, error, or done; model completion lines show provider/model and terminal status.
Export a trajectory bundle for a stored session:
openclaw sessions export-trajectory --session-key "agent:main:telegram:direct:123" --workspace .openclaw sessions export-trajectory --session-key "agent:main:telegram:direct:123" --output bug-123 --jsonThis is the command path used by the /export-trajectory slash command after
the owner approves the exec request. The output directory is always resolved
inside .openclaw/trajectory-exports/ under the selected workspace.
openclaw sessions --all-agents reads configured agent stores. Gateway and ACP
session discovery are broader: they also include disk-only stores found under
the default agents/ root or a templated session.store root. Those
discovered stores must resolve to regular sessions.json files inside the
agent root; symlinks and out-of-root paths are skipped.
JSON examples:
openclaw sessions --all-agents --json:
{ "path": null, "stores": [ { "agentId": "main", "path": "/home/user/.openclaw/agents/main/sessions/sessions.json" }, { "agentId": "work", "path": "/home/user/.openclaw/agents/work/sessions/sessions.json" } ], "allAgents": true, "count": 2, "totalCount": 2, "limitApplied": 100, "hasMore": false, "activeMinutes": null, "sessions": [ { "agentId": "main", "key": "agent:main:main", "model": "gpt-5" }, { "agentId": "work", "key": "agent:work:main", "model": "claude-opus-4-6" } ]}Cleanup maintenance
Run maintenance now (instead of waiting for the next write cycle):
openclaw sessions cleanup --dry-runopenclaw sessions cleanup --agent work --dry-runopenclaw sessions cleanup --all-agents --dry-runopenclaw sessions cleanup --enforceopenclaw sessions cleanup --enforce --active-key "agent:main:telegram:direct:123"openclaw sessions cleanup --dry-run --fix-dm-scopeopenclaw sessions cleanup --jsonopenclaw sessions cleanup uses session.maintenance settings from config:
-
Scope note:
openclaw sessions cleanupmaintains session stores, transcripts, and trajectory sidecars. It does not prune cron run history, which is managed bycron.runLog.keepLinesin Cron configuration and explained in Cron maintenance. -
Cleanup also prunes unreferenced primary transcripts, compaction checkpoints, and trajectory sidecars older than
session.maintenance.pruneAfter; files still referenced bysessions.jsonare preserved. -
Cleanup reports short-lived gateway model-run probe cleanup separately as
modelRunPruned. This only matches strict explicit keys shaped likeagent:*:explicit:model-run-<uuid>. The fixed retention is24h, but it is pressure-gated: it only removes stale probe rows when session-entry maintenance/cap pressure is reached. When it runs, model-run cleanup happens before global stale cleanup and capping. -
--dry-run: preview how many entries would be pruned/capped without writing.- In text mode, dry-run prints a per-session action table (
Action,Key,Age,Model,Flags) plus a summary grouped by session label so you can see what would be kept vs removed.
- In text mode, dry-run prints a per-session action table (
-
--enforce: apply maintenance even whensession.maintenance.modeiswarn. -
--fix-missing: remove entries whose transcript files are missing or header-only/empty, even if they would not normally age/count out yet. -
--fix-dm-scope: whensession.dmScopeismain, retire stale peer-keyed direct-DM rows left behind by earlierper-peer,per-channel-peer, orper-account-channel-peerrouting. Use--dry-runfirst; applying the cleanup removes those rows fromsessions.jsonand preserves their transcripts as deleted archives. -
--active-key <key>: protect a specific active key from disk-budget eviction. Durable external conversation pointers, such as group sessions and thread-scoped chat sessions, are also kept by age/count/disk-budget maintenance. -
--agent <id>: run cleanup for one configured agent store. -
--all-agents: run cleanup for all configured agent stores. -
--store <path>: run against a specificsessions.jsonfile. -
--json: print a JSON summary. With--all-agents, output includes one summary per store.
When a Gateway is reachable, non-dry-run cleanup for configured agent stores is
sent through the Gateway so it shares the same session-store writer as runtime
traffic. Use --store <path> for explicit offline repair of a store file.
openclaw sessions cleanup --all-agents --dry-run --json:
{ "allAgents": true, "mode": "warn", "dryRun": true, "stores": [ { "agentId": "main", "storePath": "/home/user/.openclaw/agents/main/sessions/sessions.json", "beforeCount": 120, "afterCount": 80, "missing": 0, "dmScopeRetired": 0, "pruned": 40, "capped": 0 }, { "agentId": "work", "storePath": "/home/user/.openclaw/agents/work/sessions/sessions.json", "beforeCount": 18, "afterCount": 18, "missing": 0, "dmScopeRetired": 0, "pruned": 0, "capped": 0 } ]}Compact a session
Reclaim context budget for a wedged or oversized session. openclaw sessions compact <key> is the first-class wrapper around the sessions.compact gateway RPC and requires a running gateway.
openclaw sessions compact "agent:main:main"openclaw sessions compact "agent:main:main" --max-lines 200openclaw sessions compact "agent:work:main" --agent work --json- Without
--max-lines, the gateway LLM-summarizes the transcript. This can be slow, so the default--timeoutis180000ms. - With
--max-lines <n>, it truncates to the lastntranscript lines and archives the prior transcript as a.baksidecar. --agent <id>: agent that owns the session; required forglobalkeys.--url/--token/--password: gateway connection overrides.--timeout <ms>: RPC timeout in milliseconds.--json: print the raw RPC payload.
The command exits non-zero when the gateway reports a failed compaction or is unreachable, so crons and scripts never mistake a silent no-op for success.
Note:
openclaw agent --message '/compact ...'is not a compaction path. Slash commands from the CLI are rejected by the authorized-sender check; that invocation exits non-zero with guidance pointing here instead of silently no-opping.
sessions.compact RPC
openclaw gateway call sessions.compact --params '<json>' accepts:
| Field | Type | Required | Description |
|---|---|---|---|
key |
string | yes | Session key to compact (for example agent:main:main). |
agentId |
string | no | Agent id that owns the session (for global keys). |
maxLines |
integer ≥ 1 | no | Truncate to the last N lines instead of LLM summarization. |
Example LLM-summarize response:
{ "ok": true, "key": "agent:main:main", "compacted": true, "result": { "tokensBefore": 243868, "tokensAfter": 34941 }}Example truncate response (--max-lines 200):
{ "ok": true, "key": "agent:main:main", "compacted": true, "archived": "/home/user/.openclaw/agents/main/sessions/transcripts/<id>.jsonl.bak", "kept": 200}Related
- Session config: Configuration reference
- CLI reference
- Session management