mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-16 11:41:08 +00:00
114 lines
3.9 KiB
TypeScript
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();
|
|
});
|
|
});
|