惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
月光博客
月光博客
The Cloudflare Blog
量子位
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
D
DataBreaches.Net
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
U
Unit 42
博客园 - 聂微东
有赞技术团队
有赞技术团队
A
About on SuperTechFans

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
test(memory): speed up host fixture setup · openclaw/open...
steipete · 2026-04-26 · via Recent Commits to openclaw:main

@@ -1,4 +1,4 @@

1-

import fs from "node:fs/promises";

1+

import fsSync from "node:fs";

22

import os from "node:os";

33

import path from "node:path";

44

import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";

@@ -19,21 +19,21 @@ import {

1919

let sharedTempRoot = "";

2020

let 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(() => {

2727

if (sharedTempRoot) {

28-

await fs.rm(sharedTempRoot, { recursive: true, force: true });

28+

fsSync.rmSync(sharedTempRoot, { recursive: true, force: true });

2929

}

3030

});

31313232

function setupTempDirLifecycle(prefix: string): () => string {

3333

let tmpDir = "";

34-

beforeEach(async () => {

34+

beforeEach(() => {

3535

tmpDir = path.join(sharedTempRoot, `${prefix}${sharedTempId++}`);

36-

await fs.mkdir(tmpDir, { recursive: true });

36+

fsSync.mkdirSync(tmpDir, { recursive: true });

3737

});

3838

return () => tmpDir;

3939

}

@@ -63,12 +63,12 @@ describe("listMemoryFiles", () => {

63636464

it("includes files from additional paths (directory)", async () => {

6565

const tmpDir = getTmpDir();

66-

await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");

66+

fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");

6767

const 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");

72727373

const files = await listMemoryFiles(tmpDir, [extraDir]);

7474

expect(files).toHaveLength(3);

@@ -80,9 +80,9 @@ describe("listMemoryFiles", () => {

80808181

it("includes files from additional paths (single file)", async () => {

8282

const tmpDir = getTmpDir();

83-

await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");

83+

fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");

8484

const singleFile = path.join(tmpDir, "standalone.md");

85-

await fs.writeFile(singleFile, "# Standalone");

85+

fsSync.writeFileSync(singleFile, "# Standalone");

86868787

const files = await listMemoryFiles(tmpDir, [singleFile]);

8888

expect(files).toHaveLength(2);

@@ -91,7 +91,7 @@ describe("listMemoryFiles", () => {

91919292

it("ignores lowercase root memory.md when canonical MEMORY.md is absent", async () => {

9393

const tmpDir = getTmpDir();

94-

await fs.writeFile(path.join(tmpDir, "memory.md"), "# Legacy memory");

94+

fsSync.writeFileSync(path.join(tmpDir, "memory.md"), "# Legacy memory");

95959696

const files = await listMemoryFiles(tmpDir, [path.join(tmpDir, "memory.md")]);

9797

@@ -100,8 +100,8 @@ describe("listMemoryFiles", () => {

100100101101

it("prefers MEMORY.md when both root files exist", async () => {

102102

const 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");

105105106106

const files = await listMemoryFiles(tmpDir, [path.join(tmpDir, "memory.md"), tmpDir]);

107107

@@ -110,10 +110,10 @@ describe("listMemoryFiles", () => {

110110111111

it("skips root-memory repair backups from extra workspace paths", async () => {

112112

const tmpDir = getTmpDir();

113-

await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");

113+

fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");

114114

const 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");

117117118118

const files = await listMemoryFiles(tmpDir, [tmpDir]);

119119

@@ -123,10 +123,10 @@ describe("listMemoryFiles", () => {

123123124124

it("handles relative paths in additional paths", async () => {

125125

const tmpDir = getTmpDir();

126-

await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");

126+

fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");

127127

const 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");

130130131131

const files = await listMemoryFiles(tmpDir, ["subdir"]);

132132

expect(files).toHaveLength(2);

@@ -135,32 +135,32 @@ describe("listMemoryFiles", () => {

135135136136

it("ignores non-existent additional paths", async () => {

137137

const tmpDir = getTmpDir();

138-

await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");

138+

fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");

139139140140

const files = await listMemoryFiles(tmpDir, ["/does/not/exist"]);

141141

expect(files).toHaveLength(1);

142142

});

143143144144

it("ignores symlinked files and directories", async () => {

145145

const tmpDir = getTmpDir();

146-

await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");

146+

fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");

147147

const 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");

150150151151

const targetFile = path.join(tmpDir, "target.md");

152-

await fs.writeFile(targetFile, "# Target");

152+

fsSync.writeFileSync(targetFile, "# Target");

153153

const linkFile = path.join(extraDir, "linked.md");

154154155155

const 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");

158158

const linkDir = path.join(tmpDir, "linked-dir");

159159160160

let symlinksOk = true;

161161

try {

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) {

165165

const code = (err as NodeJS.ErrnoException).code;

166166

if (code === "EPERM" || code === "EACCES") {

@@ -180,7 +180,7 @@ describe("listMemoryFiles", () => {

180180181181

it("dedupes overlapping extra paths that resolve to the same file", async () => {

182182

const tmpDir = getTmpDir();

183-

await fs.writeFile(path.join(tmpDir, "MEMORY.md"), "# Default memory");

183+

fsSync.writeFileSync(path.join(tmpDir, "MEMORY.md"), "# Default memory");

184184

const files = await listMemoryFiles(tmpDir, [tmpDir, ".", path.join(tmpDir, "MEMORY.md")]);

185185

const memoryMatches = files.filter((file) => file.endsWith("MEMORY.md"));

186186

expect(memoryMatches).toHaveLength(1);

@@ -189,10 +189,10 @@ describe("listMemoryFiles", () => {

189189

it("includes image and audio files from extra paths when multimodal is enabled", async () => {

190190

const tmpDir = getTmpDir();

191191

const 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"));

196196197197

const files = await listMemoryFiles(tmpDir, [extraDir], multimodal);

198198

expect(files.some((file) => file.endsWith("diagram.png"))).toBe(true);

@@ -218,16 +218,16 @@ describe("buildFileEntry", () => {

218218

it("returns null when the file disappears before reading", async () => {

219219

const tmpDir = getTmpDir();

220220

const 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);

223223

const entry = await buildFileEntry(target, tmpDir);

224224

expect(entry).toBeNull();

225225

});

226226227227

it("returns metadata when the file exists", async () => {

228228

const tmpDir = getTmpDir();

229229

const target = path.join(tmpDir, "note.md");

230-

await fs.writeFile(target, "hello", "utf-8");

230+

fsSync.writeFileSync(target, "hello", "utf-8");

231231

const entry = await buildFileEntry(target, tmpDir);

232232

expect(entry).not.toBeNull();

233233

expect(entry?.path).toBe("note.md");

@@ -237,7 +237,7 @@ describe("buildFileEntry", () => {

237237

it("returns multimodal metadata for eligible image files", async () => {

238238

const tmpDir = getTmpDir();

239239

const target = path.join(tmpDir, "diagram.png");

240-

await fs.writeFile(target, Buffer.from("png"));

240+

fsSync.writeFileSync(target, Buffer.from("png"));

241241242242

const entry = await buildFileEntry(target, tmpDir, multimodal);

243243

@@ -253,7 +253,7 @@ describe("buildFileEntry", () => {

253253

it("builds a multimodal chunk lazily for indexing", async () => {

254254

const tmpDir = getTmpDir();

255255

const target = path.join(tmpDir, "diagram.png");

256-

await fs.writeFile(target, Buffer.from("png"));

256+

fsSync.writeFileSync(target, Buffer.from("png"));

257257258258

const entry = await buildFileEntry(target, tmpDir, multimodal);

259259

const built = await buildMultimodalChunkForIndexing(entry!);

@@ -269,24 +269,24 @@ describe("buildFileEntry", () => {

269269

for (const testCase of [

270270

{

271271

name: "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

{

277277

name: "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) {

283283

const tmpDir = getTmpDir();

284284

const target = path.join(tmpDir, `${testCase.name}.png`);

285-

await fs.writeFile(target, Buffer.from("png"));

285+

fsSync.writeFileSync(target, Buffer.from("png"));

286286287287

const entry = await buildFileEntry(target, tmpDir, multimodal);

288288

expect(entry, testCase.name).not.toBeNull();

289-

await testCase.mutate(target, entry!.size);

289+

testCase.mutate(target, entry!.size);

290290291291

await expect(buildMultimodalChunkForIndexing(entry!), testCase.name).resolves.toBeNull();

292292

}