




















@@ -43,6 +43,7 @@ let providerCloseGate: Promise<void> | null = null;
4343let providerInitGate: Promise<void> | null = null;
4444let providerCalls: Array<{ provider?: string; model?: string; outputDimensionality?: number }> = [];
4545let forceNoProvider = false;
46+const originalMemoryIndexStateDir = process.env.OPENCLAW_STATE_DIR;
46474748const identityAliasFixture = vi.hoisted(() => ({
4849provider: "identity-alias-test",
@@ -58,6 +59,18 @@ function createLocalWorkerExitError(): Error {
5859});
5960}
606162+function setMemoryIndexStateDir(stateDir: string): void {
63+Reflect.set(process.env, "OPENCLAW_STATE_DIR", stateDir);
64+}
65+66+function restoreMemoryIndexStateDir(): void {
67+if (originalMemoryIndexStateDir === undefined) {
68+Reflect.deleteProperty(process.env, "OPENCLAW_STATE_DIR");
69+} else {
70+Reflect.set(process.env, "OPENCLAW_STATE_DIR", originalMemoryIndexStateDir);
71+}
72+}
73+6174vi.mock("./embeddings.js", () => {
6275const embedText = (text: string) => {
6376const lower = text.toLowerCase();
@@ -276,7 +289,7 @@ describe("memory index", () => {
276289closeOpenClawStateDatabaseForTest();
277290clearRegistry();
278291managersForCleanup.clear();
279-vi.unstubAllEnvs();
292+restoreMemoryIndexStateDir();
280293});
281294282295beforeEach(async () => {
@@ -298,7 +311,7 @@ describe("memory index", () => {
298311299312rmSync(workspaceDir, { recursive: true, force: true });
300313mkdirSync(memoryDir, { recursive: true });
301-vi.stubEnv("OPENCLAW_STATE_DIR", path.join(workspaceDir, ".state-memory-index"));
314+setMemoryIndexStateDir(path.join(workspaceDir, ".state-memory-index"));
302315await fs.writeFile(
303316path.join(memoryDir, "2026-01-12.md"),
304317"# Log\nAlpha memory line.\nZebra memory line.",
@@ -488,7 +501,7 @@ describe("memory index", () => {
488501stateDirName: string;
489502}): Promise<MemoryIndexManager | null> {
490503forceNoProvider = true;
491-vi.stubEnv("OPENCLAW_STATE_DIR", path.join(workspaceDir, params.stateDirName));
504+setMemoryIndexStateDir(path.join(workspaceDir, params.stateDirName));
492505const cfg = createCfg({
493506sources: ["memory", "sessions"],
494507sessionMemory: true,
@@ -573,7 +586,7 @@ describe("memory index", () => {
573586574587it("reindexes memory tables in place without deleting unrelated agent rows", async () => {
575588const stateDir = path.join(workspaceDir, "managed-memory-state");
576-vi.stubEnv("OPENCLAW_STATE_DIR", stateDir);
589+setMemoryIndexStateDir(stateDir);
577590const agentDbPath = resolveOpenClawAgentSqlitePath({ agentId: "main" });
578591const agentDb = openOpenClawAgentDatabase({ agentId: "main" });
579592agentDb.db
@@ -1117,7 +1130,7 @@ describe("memory index", () => {
1117113011181131it("clears dirty after sessions-only identity reindex", async () => {
11191132try {
1120-vi.stubEnv("OPENCLAW_STATE_DIR", path.join(workspaceDir, ".state-sessions-only-reindex"));
1133+setMemoryIndexStateDir(path.join(workspaceDir, ".state-sessions-only-reindex"));
11211134const sessionsDir = resolveSessionTranscriptsDirForAgent("main");
11221135await fs.mkdir(sessionsDir, { recursive: true });
11231136await fs.writeFile(
@@ -1167,13 +1180,13 @@ describe("memory index", () => {
11671180await nextManager.close?.();
11681181}
11691182} finally {
1170-vi.unstubAllEnvs();
1183+restoreMemoryIndexStateDir();
11711184}
11721185});
1173118611741187it("marks sessions-only indexes dirty when metadata is missing but chunks exist", async () => {
11751188try {
1176-vi.stubEnv("OPENCLAW_STATE_DIR", path.join(workspaceDir, ".state-sessions-missing-meta"));
1189+setMemoryIndexStateDir(path.join(workspaceDir, ".state-sessions-missing-meta"));
11771190const sessionsDir = resolveSessionTranscriptsDirForAgent("main");
11781191await fs.mkdir(sessionsDir, { recursive: true });
11791192await fs.writeFile(
@@ -1223,13 +1236,13 @@ describe("memory index", () => {
12231236await nextManager.close?.();
12241237}
12251238} finally {
1226-vi.unstubAllEnvs();
1239+restoreMemoryIndexStateDir();
12271240}
12281241});
1229124212301243it("keeps provider cutover vector search paused during targeted session sync", async () => {
12311244try {
1232-vi.stubEnv("OPENCLAW_STATE_DIR", path.join(workspaceDir, ".state-targeted-cutover"));
1245+setMemoryIndexStateDir(path.join(workspaceDir, ".state-targeted-cutover"));
12331246const sessionsDir = resolveSessionTranscriptsDirForAgent("main");
12341247await fs.mkdir(sessionsDir, { recursive: true });
12351248const sessionFile = path.join(sessionsDir, "session-targeted-cutover.jsonl");
@@ -1287,13 +1300,13 @@ describe("memory index", () => {
12871300await nextManager.close?.();
12881301}
12891302} finally {
1290-vi.unstubAllEnvs();
1303+restoreMemoryIndexStateDir();
12911304}
12921305});
1293130612941307it("preserves memory dirty events raised during session identity reindex", async () => {
12951308try {
1296-vi.stubEnv("OPENCLAW_STATE_DIR", path.join(workspaceDir, ".state-dirty-during-session"));
1309+setMemoryIndexStateDir(path.join(workspaceDir, ".state-dirty-during-session"));
12971310const sessionsDir = resolveSessionTranscriptsDirForAgent("main");
12981311await fs.mkdir(sessionsDir, { recursive: true });
12991312await fs.writeFile(
@@ -1351,7 +1364,7 @@ describe("memory index", () => {
13511364await nextManager.close?.();
13521365}
13531366} finally {
1354-vi.unstubAllEnvs();
1367+restoreMemoryIndexStateDir();
13551368}
13561369});
13571370@@ -2230,7 +2243,7 @@ describe("memory index", () => {
22302243expect(results[0]?.source).toBe("sessions");
22312244expect(results[0]?.snippet).toContain("ORBIT-10");
22322245} finally {
2233-vi.unstubAllEnvs();
2246+restoreMemoryIndexStateDir();
22342247}
22352248});
22362249@@ -2274,7 +2287,7 @@ describe("memory index", () => {
22742287expect(results[0]?.source).toBe("sessions");
22752288expect(results[0]?.snippet).toContain("ORBIT-10");
22762289} finally {
2277-vi.unstubAllEnvs();
2290+restoreMemoryIndexStateDir();
22782291}
22792292});
22802293});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。