67 lines
1.7 KiB
TypeScript
67 lines
1.7 KiB
TypeScript
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { resolveOpenClawStateDir, resolveWorkspaceRoot } from "@/lib/workspace";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
type MemoryFile = {
|
|
name: string;
|
|
path: string;
|
|
sizeBytes: number;
|
|
};
|
|
|
|
export async function GET() {
|
|
const stateDir = resolveOpenClawStateDir();
|
|
const workspaceDir = resolveWorkspaceRoot() ?? join(stateDir, "workspace");
|
|
let mainMemory: string | null = null;
|
|
const dailyLogs: MemoryFile[] = [];
|
|
|
|
// Read main MEMORY.md
|
|
for (const filename of ["MEMORY.md", "memory.md"]) {
|
|
const memPath = join(workspaceDir, filename);
|
|
if (existsSync(memPath)) {
|
|
try {
|
|
mainMemory = readFileSync(memPath, "utf-8");
|
|
} catch {
|
|
// skip unreadable
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Scan daily log files
|
|
const memoryDir = join(workspaceDir, "memory");
|
|
if (existsSync(memoryDir)) {
|
|
try {
|
|
const entries = readdirSync(memoryDir, { withFileTypes: true });
|
|
for (const entry of entries) {
|
|
if (!entry.isFile() || !entry.name.endsWith(".md")) {
|
|
continue;
|
|
}
|
|
const filePath = join(memoryDir, entry.name);
|
|
try {
|
|
const content = readFileSync(filePath, "utf-8");
|
|
dailyLogs.push({
|
|
name: entry.name,
|
|
path: filePath,
|
|
sizeBytes: Buffer.byteLength(content, "utf-8"),
|
|
});
|
|
} catch {
|
|
// skip
|
|
}
|
|
}
|
|
} catch {
|
|
// dir unreadable
|
|
}
|
|
}
|
|
|
|
// Sort daily logs by name (date-based filenames sort chronologically)
|
|
dailyLogs.sort((a, b) => b.name.localeCompare(a.name));
|
|
|
|
return Response.json({
|
|
mainMemory,
|
|
dailyLogs,
|
|
workspaceDir,
|
|
});
|
|
}
|