openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
68 lines (67 loc) • 2.8 kB
JavaScript
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
import { r as truncateUtf16Safe } from "./utf16-slice-D_ngcYKd.js";
import "./string-coerce-runtime-GQa0ehRA.js";
import "./text-utility-runtime-BjzvUG99.js";
//#region extensions/anthropic/session-catalog-transcript.ts
const MAX_TRANSCRIPT_ITEM_BYTES = 4194304;
const MAX_TRANSCRIPT_TEXT_LENGTH = 1e6;
function transcriptItemType(role, content) {
if (!Array.isArray(content)) return role === "user" ? "userMessage" : "agentMessage";
const types = content.flatMap((block) => isRecord(block) && typeof block.type === "string" ? [block.type] : []);
if (types.length > 0 && types.every((type) => type === "tool_result")) return "toolResult";
if (types.length > 0 && types.every((type) => type === "tool_use")) return "toolCall";
if (types.length > 0 && types.every((type) => type === "thinking")) return "reasoning";
return role === "user" ? "userMessage" : "agentMessage";
}
function collectTranscriptText(value, fragments) {
if (typeof value === "string") {
if (value.trim()) fragments.push(value);
return;
}
if (Array.isArray(value)) {
for (const item of value) collectTranscriptText(item, fragments);
return;
}
if (!isRecord(value)) return;
for (const key of [
"text",
"thinking",
"content",
"input"
]) if (key in value) collectTranscriptText(value[key], fragments);
}
function parseTranscriptLine(line, optionalString) {
let raw;
try {
raw = JSON.parse(line.toString("utf8"));
} catch {
return;
}
if (!isRecord(raw) || raw.isSidechain === true || raw.isMeta === true || !isRecord(raw.message)) return;
const role = raw.message.role;
if (role !== "user" && role !== "assistant" || raw.type !== role) return;
const content = raw.message.content;
if (typeof content !== "string" && !Array.isArray(content)) return;
const fragments = [];
collectTranscriptText(content, fragments);
const text = [...new Set(fragments)].join("\n\n");
const item = {
type: transcriptItemType(role, content),
...text ? { text } : {},
content,
...optionalString(raw.timestamp, 128) ? { timestamp: optionalString(raw.timestamp, 128) } : {},
...optionalString(raw.message.model, 256) ? { model: optionalString(raw.message.model, 256) } : {},
...optionalString(raw.uuid, 256) ? { uuid: optionalString(raw.uuid, 256) } : {}
};
if (Buffer.byteLength(JSON.stringify(item), "utf8") <= MAX_TRANSCRIPT_ITEM_BYTES) return item;
return {
type: item.type,
text: `${truncateUtf16Safe(text, MAX_TRANSCRIPT_TEXT_LENGTH)}\n\n[oversized Claude item truncated]`,
...item.timestamp ? { timestamp: item.timestamp } : {},
...item.model ? { model: item.model } : {},
...item.uuid ? { uuid: item.uuid } : {},
truncated: true
};
}
//#endregion
export { parseTranscriptLine as n, collectTranscriptText as t };