openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
107 lines (106 loc) • 3.94 kB
JavaScript
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs";
import { a as asOptionalRecord } from "./record-coerce-TIsquoVR.mjs";
import { r as jsonUtf8Bytes } from "./json-utf8-bytes-C0-PtdPX.mjs";
import "./chat-history-constants-BGgHv5E_.mjs";
import { a as projectChatDisplayMessage } from "./chat-display-projection.core-BOF-lEvI.mjs";
//#region src/gateway/server-methods/chat-history-reply-messages.ts
/** Batch label projection includes quoted originals without recursively following their replies. */
async function projectChatHistoryWithReplies(messages, project) {
const originals = [];
const references = messages.map((message) => {
const reply = asOptionalRecord(asOptionalRecord(message["__openclaw"])?.replyToMessage);
const original = asOptionalRecord(reply?.message);
return original ? {
reply,
index: originals.push(original) - 1
} : void 0;
});
const projected = await project([...messages, ...originals]);
const result = projected.slice(0, messages.length);
for (const [index, message] of result.entries()) {
const reference = references[index];
if (!reference) continue;
const original = projected[messages.length + reference.index];
result[index] = {
...message,
__openclaw: {
...asOptionalRecord(message["__openclaw"]),
replyToMessage: jsonUtf8Bytes(original) > 8192 ? {
ok: false,
unavailableReason: "oversized"
} : {
...reference.reply,
message: original
}
}
};
}
return result;
}
function readChatHistoryReplyMessageId(message) {
const record = asOptionalRecord(message);
return normalizeOptionalString(asOptionalRecord(record?.["__openclaw"])?.replyToId) ?? (record?.role === "assistant" ? normalizeOptionalString(asOptionalRecord(record.openclawDelivery)?.replyToId) : void 0);
}
/** Page-local reads share the admitted transcript owner and never start client RPCs. */
async function attachChatHistoryReplyMessages(messages, params, options) {
const replies = /* @__PURE__ */ new Map();
const result = [];
for (const message of messages) {
const record = asOptionalRecord(message);
const metadata = asOptionalRecord(record?.["__openclaw"]);
const messageId = readChatHistoryReplyMessageId(message);
if (!record || !messageId || !params.sessionId) {
result.push(message);
continue;
}
let reply = replies.get(messageId);
if (!reply && messageId.startsWith("pending:")) reply = {
ok: false,
unavailableReason: "not_found"
};
if (!reply) {
const original = await options.readers.readSessionMessageByIdAsync({
agentId: params.sessionAgentId,
sessionId: params.sessionId,
sessionKey: params.canonicalKey,
storePath: params.storePath,
sessionEntry: params.entry
}, messageId, {
allowResetArchiveFallback: true,
historyVisibility: { sessionStartedAt: params.entry?.sessionStartedAt }
});
const projected = original.message ? projectChatDisplayMessage(original.message, {
maxChars: 500,
subagentCoordination: options.readers.subagentCoordination,
resolveCronJobName: options.resolveCronJobName,
...options.deferProfileDisplay ? {} : { resolveCurrentUserProfileDisplay: options.resolveCurrentUserProfileDisplay }
}) : void 0;
const preview = projected ? { ...projected } : void 0;
if (preview) {
delete preview.provider;
delete preview.model;
}
reply = original.oversized || preview && jsonUtf8Bytes(preview) > 8192 ? {
ok: false,
unavailableReason: "oversized"
} : preview ? {
ok: true,
message: preview
} : {
ok: false,
unavailableReason: original.found ? "not_visible" : "not_found"
};
replies.set(messageId, reply);
}
result.push({
...record,
__openclaw: {
...metadata,
replyToMessage: reply
}
});
}
return result;
}
//#endregion
export { projectChatHistoryWithReplies as n, readChatHistoryReplyMessageId as r, attachChatHistoryReplyMessages as t };