UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

112 lines (111 loc) 5.01 kB
import { w as resolveStateDir } from "./paths-D2sRr1a_.js"; import { n as sanitizeTerminalText } from "./safe-text-BGBqp1a4.js"; import { s as normalizeExportText, t as TranscriptsStore } from "./store-CU1KZD9W.js"; import path from "node:path"; //#region src/cli/program/register.transcripts.ts function createStore() { const stateDir = resolveStateDir(); return new TranscriptsStore(path.join(stateDir, "transcripts"), { env: { ...process.env, OPENCLAW_STATE_DIR: stateDir } }); } function writeLine(value) { process.stdout.write(`${value}\n`); } function writeJson(value) { writeLine(JSON.stringify(value, null, 2).replace(/[\u007f-\u009f]/g, (char) => `\\u${char.charCodeAt(0).toString(16).padStart(4, "0")}`)); } function sanitizeMarkdownForTerminal(markdown) { return markdown.split("\n").map(sanitizeTerminalText).join("\n"); } function formatSessionLine(entry) { const title = sanitizeTerminalText(entry.session.title?.trim() || "Transcripts"); const started = sanitizeTerminalText(entry.session.startedAt || "unknown"); const summary = sanitizeTerminalText(entry.hasSummary ? entry.summaryPath : "no summary.md"); return `${entry.selector}\t${started}\t${title}\t${summary}`; } async function listCommand(options) { const sessions = await createStore().listSessionEntries(); if (options.json) { writeJson(sessions.map((entry) => ({ sessionId: entry.session.sessionId, selector: entry.selector, date: entry.selector.slice(0, 10), title: entry.session.title, startedAt: entry.session.startedAt, stoppedAt: entry.session.stoppedAt, source: entry.session.source, path: entry.sessionDir, summaryPath: entry.summaryPath, hasSummary: entry.hasSummary }))); return; } if (sessions.length === 0) { writeLine("No transcripts found."); return; } for (const session of sessions) writeLine(formatSessionLine(session)); } async function showCommand(sessionSelector, options) { const store = createStore(); const entry = await store.readSessionEntry(sessionSelector); if (!entry) throw new Error(`transcripts session not found: ${sessionSelector}`); const storedSummary = await store.readSummary(entry.session); const materializedMarkdown = storedSummary.markdown === void 0 ? void 0 : normalizeExportText(storedSummary.markdown); await store.materializeSessionArtifacts(entry.session, "summary"); if (options.json) { writeJson({ session: entry.session, selector: entry.selector, path: entry.sessionDir, summaryPath: entry.summaryPath, summary: materializedMarkdown ?? null }); return; } if (materializedMarkdown === void 0) throw new Error(`summary.md not found for transcripts session: ${sessionSelector}`); process.stdout.write(sanitizeMarkdownForTerminal(materializedMarkdown)); } function selectedArtifactKind(options) { if (options.dir) return "all"; if (options.metadata) return "metadata"; if (options.transcript) return "transcript"; return "summary"; } async function pathCommand(selector, options) { const store = createStore(); const entry = await store.readSessionEntry(selector); if (!entry) throw new Error(`transcripts session not found: ${selector}`); const kind = selectedArtifactKind(options); const artifacts = await store.materializeSessionArtifacts(entry.session, kind); const selectedPath = options.dir ? artifacts.sessionDir : options.metadata ? artifacts.metadataPath : options.transcript ? artifacts.transcriptPath : artifacts.summaryPath; const exists = kind !== "summary" || artifacts.hasSummary; if (options.json) { writeJson({ sessionId: entry.session.sessionId, selector: entry.selector, path: selectedPath, exists }); return; } if (!exists) throw new Error(`summary.md not found for transcripts session: ${selector}`); writeLine(selectedPath); } /** Register transcript list/show/path inspection and export commands. */ function registerTranscriptsCli(program) { const transcripts = program.command("transcripts").description("Inspect stored transcripts"); transcripts.command("list").description("List stored transcript sessions").option("--json", "Print JSON").action(async (options) => { await listCommand(options); }); transcripts.command("show").description("Print and materialize a transcript summary").argument("<session>", "Transcripts session id or YYYY-MM-DD/session selector").option("--json", "Print JSON").action(async (sessionId, options) => { await showCommand(sessionId, options); }); transcripts.command("path").description("Materialize and print a stored transcripts artifact path").argument("<session>", "Transcripts session id or YYYY-MM-DD/session selector").option("--dir", "Materialize all artifacts and print the session directory").option("--metadata", "Materialize and print metadata.json").option("--transcript", "Materialize and print transcript.jsonl").option("--json", "Print JSON").action(async (sessionId, options) => { await pathCommand(sessionId, options); }); } //#endregion export { registerTranscriptsCli };