* refactor(transcripts): move meeting transcripts to sqlite * perf(transcripts): batch legacy utterance staging * fix(transcripts): report recovery moves on migration failure * fix(transcripts): refresh archive membership after recovery * fix(transcripts): omit failed summary export paths * fix(transcripts): type restore metadata tuple * fix(transcripts): align migration contract gates * fix(transcripts): verify case-aliased export ownership * fix(transcripts): allowlist doctor verifier sqlite query * fix(transcripts): preflight partial artifact recovery * fix(transcripts): stabilize exports and legacy path checks * fix(transcripts): resolve case-renamed doctor ownership * fix(transcripts): harden canonical export recovery * fix(transcripts): preserve pending import boundaries * refactor(transcripts): split migration insert transaction * perf(transcripts): query selected summary existence
5.6 KiB
summary, read_when, title
| summary | read_when | title | |||
|---|---|---|---|---|---|
| CLI reference for `openclaw transcripts` (list, show, and export stored transcripts) |
|
Transcripts CLI |
openclaw transcripts
Inspector and export command for transcripts written by the transcripts agent
tool. Capture, import, and summarization run through that tool, not this CLI.
Canonical transcript state lives in the shared SQLite database at
$OPENCLAW_STATE_DIR/state/openclaw.sqlite. show and path explicitly
materialize user-facing artifacts under the state directory:
$OPENCLAW_STATE_DIR/transcripts/YYYY-MM-DD/<session>/
metadata.json
transcript.jsonl
summary.json
summary.md
These files are exports, not a second runtime store. OpenClaw does not read them
back during capture, summarization, or listing. Default state directory is
~/.openclaw; override with OPENCLAW_STATE_DIR. The date directory comes
from the session start time; the session directory is a filesystem-safe slug
derived from the session id.
Commands
openclaw transcripts list
openclaw transcripts show <session>
openclaw transcripts show YYYY-MM-DD/<session>
openclaw transcripts path <session>
openclaw transcripts path YYYY-MM-DD/<session>
openclaw transcripts path <session> --dir
openclaw transcripts path <session> --metadata
openclaw transcripts path <session> --transcript
openclaw transcripts list --json
openclaw transcripts show <session> --json
openclaw transcripts path <session> --json
| Command | Description |
|---|---|
list |
List stored sessions. |
show <session> |
Print and materialize summary.md. |
path <session> |
Materialize and print the summary.md path. |
path <session> --dir |
Materialize all artifacts and print their directory. |
path <session> --metadata |
Materialize and print metadata.json. |
path <session> --transcript |
Materialize and print transcript.jsonl. |
--json |
Print machine-readable output (any subcommand). |
<session> accepts either a bare session id or a date-qualified selector
(YYYY-MM-DD/<session>). Use the qualified form when the same session id
occurs on more than one day, for example openclaw transcripts show 2026-05-22/standup. Default session ids include a timestamp and random
suffix; give a session a fixed id only when that id is unique within the day.
Output
list prints one tab-separated line per session: selector, start time, title,
summary path.
2026-05-22/standup 2026-05-22T09:00:00.000Z Weekly standup /Users/user/.openclaw/transcripts/2026-05-22/standup/summary.md
The selector is the safest value to pass back to show or path.
list --json returns objects with sessionId, selector, date, title,
startedAt, stoppedAt, source, path, summaryPath, hasSummary.
show --json returns the stored session metadata, selector, session
directory, summary path, and summary Markdown text.
path --json returns the selected path and whether that artifact could be
materialized. Metadata and transcript exports always exist for a stored
session; a summary path reports exists: false until the session has a summary.
Many sessions per day
Sessions group by date, then by session id. Ten meetings on one day become ten sibling folders:
~/.openclaw/transcripts/2026-05-22/
transcript-2026-05-22T09-00-00-000Z-a1b2c3d4/
transcript-2026-05-22T10-30-00-000Z-b2c3d4e5/
standup/
Use default generated ids for automation. Use a fixed id like standup only
when it will not repeat on the same date.
Missing summaries
Live sessions store and materialize summary.md when the session stops;
imported transcripts do so immediately after import. A session can appear in
list without a summary while capture is still active, if a provider failed
during stop, or if metadata was stored before any utterances arrived.
Use path <session> --transcript to inspect the raw append-only transcript,
or run the transcripts tool's summarize action to regenerate the Markdown
summary.
Upgrading the legacy file store
OpenClaw releases that predate the SQLite store wrote canonical runtime state
directly beneath $OPENCLAW_STATE_DIR/transcripts/. Run:
openclaw doctor --fix
Doctor imports the complete legacy tree into SQLite, verifies row counts and
ordering, records migration receipts, and moves the verified source tree to a
timestamped transcripts.migrated-* archive. Runtime commands do not fall back
to the legacy files. Keep the archive until you have verified the imported
sessions and any exports you rely on.
Configuration
Capture is opt-in (live sources can join and record meeting audio). Enable it with:
{
"transcripts": {
"enabled": true
}
}
enabled(defaultfalse): turn the tool on. Configure auto-start sources withtranscripts.autoStart. Each entry is enabled by being present; omit an entry to disable that source.discord-voiceis the bundled auto-start-capable source and requiresguildIdandchannelId:
{
"transcripts": {
"enabled": true,
"autoStart": [
{
"providerId": "discord-voice",
"guildId": "1234567890",
"channelId": "2345678901"
}
]
}
}