Files
openclaw/extensions/memory-core/src/dreaming-markdown.test.ts
2026-04-06 05:21:45 +01:00

114 lines
3.9 KiB
TypeScript

import fs from "node:fs/promises";
import path from "node:path";
import { describe, expect, it } from "vitest";
import { writeDailyDreamingPhaseBlock, writeDeepDreamingReport } from "./dreaming-markdown.js";
import { createMemoryCoreTestHarness } from "./test-helpers.js";
const { createTempWorkspace } = createMemoryCoreTestHarness();
describe("dreaming markdown storage", () => {
const nowMs = Date.parse("2026-04-05T10:00:00Z");
const timezone = "UTC";
it("writes inline light dreaming output into the daily memory file", async () => {
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
const result = await writeDailyDreamingPhaseBlock({
workspaceDir,
phase: "light",
bodyLines: ["- Candidate: remember the API key is fake"],
nowMs,
timezone,
storage: {
mode: "inline",
separateReports: false,
},
});
expect(result.inlinePath).toBe(path.join(workspaceDir, "memory", "2026-04-05.md"));
const content = await fs.readFile(result.inlinePath!, "utf-8");
expect(content).toContain("## Light Sleep");
expect(content).toContain("- Candidate: remember the API key is fake");
});
it("keeps multiple inline phases in the shared daily memory file", async () => {
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
await writeDailyDreamingPhaseBlock({
workspaceDir,
phase: "light",
bodyLines: ["- Candidate: first block"],
nowMs,
timezone,
storage: {
mode: "inline",
separateReports: false,
},
});
await writeDailyDreamingPhaseBlock({
workspaceDir,
phase: "rem",
bodyLines: ["- Theme: `focus` kept surfacing."],
nowMs,
timezone,
storage: {
mode: "inline",
separateReports: false,
},
});
const dreamsPath = path.join(workspaceDir, "memory", "2026-04-05.md");
const content = await fs.readFile(dreamsPath, "utf-8");
expect(content).toContain("## Light Sleep");
expect(content).toContain("## REM Sleep");
expect(content).toContain("- Candidate: first block");
expect(content).toContain("- Theme: `focus` kept surfacing.");
});
it("keeps daily phase output separate from lowercase dreams.md diaries", async () => {
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
const lowercasePath = path.join(workspaceDir, "dreams.md");
await fs.writeFile(lowercasePath, "# Scratch\n\n", "utf-8");
const result = await writeDailyDreamingPhaseBlock({
workspaceDir,
phase: "rem",
bodyLines: ["- Theme: `glacier` kept surfacing."],
nowMs,
timezone,
storage: {
mode: "inline",
separateReports: false,
},
});
expect(result.inlinePath).toBe(path.join(workspaceDir, "memory", "2026-04-05.md"));
const content = await fs.readFile(result.inlinePath!, "utf-8");
expect(content).toContain("## REM Sleep");
expect(content).toContain("- Theme: `glacier` kept surfacing.");
await expect(fs.readFile(lowercasePath, "utf-8")).resolves.toBe("# Scratch\n\n");
});
it("still writes deep reports to the per-phase report directory", async () => {
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
const reportPath = await writeDeepDreamingReport({
workspaceDir,
bodyLines: ["- Promoted: durable preference"],
storage: {
mode: "separate",
separateReports: false,
},
nowMs: Date.parse("2026-04-05T10:00:00Z"),
timezone: "UTC",
});
expect(reportPath).toBe(path.join(workspaceDir, "memory", "dreaming", "deep", "2026-04-05.md"));
const content = await fs.readFile(reportPath!, "utf-8");
expect(content).toContain("# Deep Sleep");
expect(content).toContain("- Promoted: durable preference");
await expect(fs.access(path.join(workspaceDir, "DREAMS.md"))).rejects.toThrow();
});
});