

























@@ -1,4 +1,4 @@
1-import fs from "node:fs/promises";
1+import fsSync from "node:fs";
22import os from "node:os";
33import path from "node:path";
44import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -19,21 +19,21 @@ import {
1919let sharedTempRoot = "";
2020let sharedTempId = 0;
212122-beforeAll(async () => {
23-sharedTempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "memory-host-sdk-tests-"));
22+beforeAll(() => {
23+sharedTempRoot = fsSync.mkdtempSync(path.join(os.tmpdir(), "memory-host-sdk-tests-"));
2424});
252526-afterAll(async () => {
26+afterAll(() => {
2727if (sharedTempRoot) {
28-await fs.rm(sharedTempRoot, { recursive: true, force: true });
28+fsSync.rmSync(sharedTempRoot, { recursive: true, force: true });
2929}
3030});
31313232function setupTempDirLifecycle(prefix: string): () => string {
3333let tmpDir = "";
34-beforeEach(async () => {
34+beforeEach(() => {
3535tmpDir = path.join(sharedTempRoot, `${prefix}${sharedTempId++}`);
36-await fs.mkdir(tmpDir, { recursive: true });
36+fsSync.mkdirSync(tmpDir, { recursive: true });
3737});
3838return () => tmpDir;
3939}
@@ -63,12 +63,12 @@ describe("listMemoryFiles", () => {
63636464it("includes files from additional paths (directory)", async () => {
6565const tmpDir = getTmpDir();
66-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
66+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
6767const extraDir = path.join(tmpDir, "extra-notes");
68-await fs.mkdir(extraDir, { recursive: true });
69-await fs.writeFile(path.join(extraDir, "note1.md"), "# Note 1");
70-await fs.writeFile(path.join(extraDir, "note2.md"), "# Note 2");
71-await fs.writeFile(path.join(extraDir, "ignore.txt"), "Not a markdown file");
68+fsSync.mkdirSync(extraDir, { recursive: true });
69+fsSync.writeFileSync(path.join(extraDir, "note1.md"), "# Note 1");
70+fsSync.writeFileSync(path.join(extraDir, "note2.md"), "# Note 2");
71+fsSync.writeFileSync(path.join(extraDir, "ignore.txt"), "Not a markdown file");
72727373const files = await listMemoryFiles(tmpDir, [extraDir]);
7474expect(files).toHaveLength(3);
@@ -80,9 +80,9 @@ describe("listMemoryFiles", () => {
80808181it("includes files from additional paths (single file)", async () => {
8282const tmpDir = getTmpDir();
83-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
83+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
8484const singleFile = path.join(tmpDir, "standalone.md");
85-await fs.writeFile(singleFile, "# Standalone");
85+fsSync.writeFileSync(singleFile, "# Standalone");
86868787const files = await listMemoryFiles(tmpDir, [singleFile]);
8888expect(files).toHaveLength(2);
@@ -91,7 +91,7 @@ describe("listMemoryFiles", () => {
91919292it("ignores lowercase root memory.md when canonical MEMORY.md is absent", async () => {
9393const tmpDir = getTmpDir();
94-await fs.writeFile(path.join(tmpDir, "memory.md"), "# Legacy memory");
94+fsSync.writeFileSync(path.join(tmpDir, "memory.md"), "# Legacy memory");
95959696const files = await listMemoryFiles(tmpDir, [path.join(tmpDir, "memory.md")]);
9797@@ -100,8 +100,8 @@ describe("listMemoryFiles", () => {
100100101101it("prefers MEMORY.md when both root files exist", async () => {
102102const tmpDir = getTmpDir();
103-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
104-await fs.writeFile(path.join(tmpDir, "memory.md"), "# Legacy memory");
103+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
104+fsSync.writeFileSync(path.join(tmpDir, "memory.md"), "# Legacy memory");
105105106106const files = await listMemoryFiles(tmpDir, [path.join(tmpDir, "memory.md"), tmpDir]);
107107@@ -110,10 +110,10 @@ describe("listMemoryFiles", () => {
110110111111it("skips root-memory repair backups from extra workspace paths", async () => {
112112const tmpDir = getTmpDir();
113-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
113+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
114114const repairDir = path.join(tmpDir, ".openclaw-repair", "root-memory", "2026-04-23");
115-await fs.mkdir(repairDir, { recursive: true });
116-await fs.writeFile(path.join(repairDir, "memory.md"), "# Archived legacy memory");
115+fsSync.mkdirSync(repairDir, { recursive: true });
116+fsSync.writeFileSync(path.join(repairDir, "memory.md"), "# Archived legacy memory");
117117118118const files = await listMemoryFiles(tmpDir, [tmpDir]);
119119@@ -123,10 +123,10 @@ describe("listMemoryFiles", () => {
123123124124it("handles relative paths in additional paths", async () => {
125125const tmpDir = getTmpDir();
126-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
126+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
127127const extraDir = path.join(tmpDir, "subdir");
128-await fs.mkdir(extraDir, { recursive: true });
129-await fs.writeFile(path.join(extraDir, "nested.md"), "# Nested");
128+fsSync.mkdirSync(extraDir, { recursive: true });
129+fsSync.writeFileSync(path.join(extraDir, "nested.md"), "# Nested");
130130131131const files = await listMemoryFiles(tmpDir, ["subdir"]);
132132expect(files).toHaveLength(2);
@@ -135,32 +135,32 @@ describe("listMemoryFiles", () => {
135135136136it("ignores non-existent additional paths", async () => {
137137const tmpDir = getTmpDir();
138-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
138+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
139139140140const files = await listMemoryFiles(tmpDir, ["/does/not/exist"]);
141141expect(files).toHaveLength(1);
142142});
143143144144it("ignores symlinked files and directories", async () => {
145145const tmpDir = getTmpDir();
146-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
146+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
147147const extraDir = path.join(tmpDir, "extra");
148-await fs.mkdir(extraDir, { recursive: true });
149-await fs.writeFile(path.join(extraDir, "note.md"), "# Note");
148+fsSync.mkdirSync(extraDir, { recursive: true });
149+fsSync.writeFileSync(path.join(extraDir, "note.md"), "# Note");
150150151151const targetFile = path.join(tmpDir, "target.md");
152-await fs.writeFile(targetFile, "# Target");
152+fsSync.writeFileSync(targetFile, "# Target");
153153const linkFile = path.join(extraDir, "linked.md");
154154155155const targetDir = path.join(tmpDir, "target-dir");
156-await fs.mkdir(targetDir, { recursive: true });
157-await fs.writeFile(path.join(targetDir, "nested.md"), "# Nested");
156+fsSync.mkdirSync(targetDir, { recursive: true });
157+fsSync.writeFileSync(path.join(targetDir, "nested.md"), "# Nested");
158158const linkDir = path.join(tmpDir, "linked-dir");
159159160160let symlinksOk = true;
161161try {
162-await fs.symlink(targetFile, linkFile, "file");
163-await fs.symlink(targetDir, linkDir, "dir");
162+fsSync.symlinkSync(targetFile, linkFile, "file");
163+fsSync.symlinkSync(targetDir, linkDir, "dir");
164164} catch (err) {
165165const code = (err as NodeJS.ErrnoException).code;
166166if (code === "EPERM" || code === "EACCES") {
@@ -180,7 +180,7 @@ describe("listMemoryFiles", () => {
180180181181it("dedupes overlapping extra paths that resolve to the same file", async () => {
182182const tmpDir = getTmpDir();
183-await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");
183+fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");
184184const files = await listMemoryFiles(tmpDir, [tmpDir, ".", path.join(tmpDir, "MEMORY.md")]);
185185const memoryMatches = files.filter((file) => file.endsWith("MEMORY.md"));
186186expect(memoryMatches).toHaveLength(1);
@@ -189,10 +189,10 @@ describe("listMemoryFiles", () => {
189189it("includes image and audio files from extra paths when multimodal is enabled", async () => {
190190const tmpDir = getTmpDir();
191191const extraDir = path.join(tmpDir, "media");
192-await fs.mkdir(extraDir, { recursive: true });
193-await fs.writeFile(path.join(extraDir, "diagram.png"), Buffer.from("png"));
194-await fs.writeFile(path.join(extraDir, "note.wav"), Buffer.from("wav"));
195-await fs.writeFile(path.join(extraDir, "ignore.bin"), Buffer.from("bin"));
192+fsSync.mkdirSync(extraDir, { recursive: true });
193+fsSync.writeFileSync(path.join(extraDir, "diagram.png"), Buffer.from("png"));
194+fsSync.writeFileSync(path.join(extraDir, "note.wav"), Buffer.from("wav"));
195+fsSync.writeFileSync(path.join(extraDir, "ignore.bin"), Buffer.from("bin"));
196196197197const files = await listMemoryFiles(tmpDir, [extraDir], multimodal);
198198expect(files.some((file) => file.endsWith("diagram.png"))).toBe(true);
@@ -218,16 +218,16 @@ describe("buildFileEntry", () => {
218218it("returns null when the file disappears before reading", async () => {
219219const tmpDir = getTmpDir();
220220const target = path.join(tmpDir, "ghost.md");
221-await fs.writeFile(target, "ghost", "utf-8");
222-await fs.rm(target);
221+fsSync.writeFileSync(target, "ghost", "utf-8");
222+fsSync.rmSync(target);
223223const entry = await buildFileEntry(target, tmpDir);
224224expect(entry).toBeNull();
225225});
226226227227it("returns metadata when the file exists", async () => {
228228const tmpDir = getTmpDir();
229229const target = path.join(tmpDir, "note.md");
230-await fs.writeFile(target, "hello", "utf-8");
230+fsSync.writeFileSync(target, "hello", "utf-8");
231231const entry = await buildFileEntry(target, tmpDir);
232232expect(entry).not.toBeNull();
233233expect(entry?.path).toBe("note.md");
@@ -237,7 +237,7 @@ describe("buildFileEntry", () => {
237237it("returns multimodal metadata for eligible image files", async () => {
238238const tmpDir = getTmpDir();
239239const target = path.join(tmpDir, "diagram.png");
240-await fs.writeFile(target, Buffer.from("png"));
240+fsSync.writeFileSync(target, Buffer.from("png"));
241241242242const entry = await buildFileEntry(target, tmpDir, multimodal);
243243@@ -253,7 +253,7 @@ describe("buildFileEntry", () => {
253253it("builds a multimodal chunk lazily for indexing", async () => {
254254const tmpDir = getTmpDir();
255255const target = path.join(tmpDir, "diagram.png");
256-await fs.writeFile(target, Buffer.from("png"));
256+fsSync.writeFileSync(target, Buffer.from("png"));
257257258258const entry = await buildFileEntry(target, tmpDir, multimodal);
259259const built = await buildMultimodalChunkForIndexing(entry!);
@@ -269,24 +269,24 @@ describe("buildFileEntry", () => {
269269for (const testCase of [
270270{
271271name: "grows",
272-mutate: async (target: string, entrySize: number) => {
273-await fs.writeFile(target, Buffer.alloc(entrySize + 32, 1));
272+mutate: (target: string, entrySize: number) => {
273+fsSync.writeFileSync(target, Buffer.alloc(entrySize + 32, 1));
274274},
275275},
276276{
277277name: "bytes change",
278-mutate: async (target: string) => {
279-await fs.writeFile(target, Buffer.from("gif"));
278+mutate: (target: string) => {
279+fsSync.writeFileSync(target, Buffer.from("gif"));
280280},
281281},
282282] as const) {
283283const tmpDir = getTmpDir();
284284const target = path.join(tmpDir, `${testCase.name}.png`);
285-await fs.writeFile(target, Buffer.from("png"));
285+fsSync.writeFileSync(target, Buffer.from("png"));
286286287287const entry = await buildFileEntry(target, tmpDir, multimodal);
288288expect(entry, testCase.name).not.toBeNull();
289-await testCase.mutate(target, entry!.size);
289+testCase.mutate(target, entry!.size);
290290291291await expect(buildMultimodalChunkForIndexing(entry!), testCase.name).resolves.toBeNull();
292292}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。