mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-15 23:20:44 +00:00
66 lines
2.2 KiB
TypeScript
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;
|
|
}
|