Files
openclaw/src/auto-reply/reply/commands-export-common.ts
2026-04-23 18:09:20 +01:00

66 lines
2.2 KiB
TypeScript

import {
resolveDefaultSessionStorePath,
resolveSessionFilePath,
resolveSessionFilePathOptions,
} from "../../config/sessions/paths.js";
import { loadSessionStore } from "../../config/sessions/store.js";
import type { SessionEntry } from "../../config/sessions/types.js";
import { formatErrorMessage } from "../../infra/errors.js";
import { resolveAgentIdFromSessionKey } from "../../routing/session-key.js";
import type { ReplyPayload } from "../types.js";
import type { HandleCommandsParams } from "./commands-types.js";
export interface ExportCommandSessionTarget {
entry: SessionEntry;
sessionFile: string;
}
function escapeRegExp(value: string): string {
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
export function parseExportCommandOutputPath(
commandBodyNormalized: string,
aliases: readonly string[],
): { outputPath?: string } {
const normalized = commandBodyNormalized.trim();
if (aliases.some((alias) => normalized === `/${alias}`)) {
return {};
}
const aliasPattern = aliases.map(escapeRegExp).join("|");
const args = normalized.replace(new RegExp(`^/(${aliasPattern})\\s*`), "").trim();
const outputPath = args.split(/\s+/).find((part) => !part.startsWith("-"));
return { outputPath };
}
export function resolveExportCommandSessionTarget(
params: HandleCommandsParams,
): ExportCommandSessionTarget | ReplyPayload {
const targetAgentId = resolveAgentIdFromSessionKey(params.sessionKey) || params.agentId;
const storePath = params.storePath ?? resolveDefaultSessionStorePath(targetAgentId);
const store = loadSessionStore(storePath, { skipCache: true });
const entry = store[params.sessionKey] as SessionEntry | undefined;
if (!entry?.sessionId) {
return { text: `❌ Session not found: ${params.sessionKey}` };
}
try {
const sessionFile = resolveSessionFilePath(
entry.sessionId,
entry,
resolveSessionFilePathOptions({ agentId: targetAgentId, storePath }),
);
return { entry, sessionFile };
} catch (err) {
return {
text: `❌ Failed to resolve session file: ${formatErrorMessage(err)}`,
};
}
}
export function isReplyPayload(
value: ExportCommandSessionTarget | ReplyPayload,
): value is ReplyPayload {
return "text" in value;
}