























@@ -8,7 +8,6 @@ import type { OpenClawConfig } from "../config.js";
88import { resolveStorePath } from "./paths.js";
99import {
1010resolveAgentSessionStoreTargetsSync,
11-resolveAllAgentSessionStoreTargets,
1211resolveAllAgentSessionStoreTargetsSync,
1312resolveSessionStoreTargets,
1413} from "./targets.js";
@@ -57,7 +56,7 @@ async function resolveTargetsForCustomRoot(home: string, agentIds: string[]) {
5756const customRoot = path.join(home, "custom-state");
5857const storePaths = await createAgentSessionStores(customRoot, agentIds);
5958const cfg = createCustomRootCfg(customRoot);
60-const targets = await resolveAllAgentSessionStoreTargets(cfg, { env: process.env });
59+const targets = resolveAllAgentSessionStoreTargetsSync(cfg, { env: process.env });
6160return { storePaths, targets };
6261}
6362@@ -72,19 +71,6 @@ function expectTargetsToContainStores(
7271}
7372}
747375-const discoveryResolvers = [
76-{
77-label: "async",
78-resolve: async (cfg: OpenClawConfig, env: NodeJS.ProcessEnv) =>
79-await resolveAllAgentSessionStoreTargets(cfg, { env }),
80-},
81-{
82-label: "sync",
83-resolve: async (cfg: OpenClawConfig, env: NodeJS.ProcessEnv) =>
84-resolveAllAgentSessionStoreTargetsSync(cfg, { env }),
85-},
86-] as const;
87-8874describe("resolveSessionStoreTargets", () => {
8975it("resolves all configured agent stores", async () => {
9076await withTempHome(async () => {
@@ -226,7 +212,7 @@ describe("resolveAgentSessionStoreTargetsSync", () => {
226212});
227213});
228214229-describe("resolveAllAgentSessionStoreTargets", () => {
215+describe("resolveAllAgentSessionStoreTargetsSync", () => {
230216it("includes discovered on-disk agent stores alongside configured targets", async () => {
231217await withTempHome(async (home) => {
232218const stateDir = path.join(home, ".openclaw");
@@ -238,7 +224,7 @@ describe("resolveAllAgentSessionStoreTargets", () => {
238224},
239225};
240226241-const targets = await resolveAllAgentSessionStoreTargets(cfg, { env: process.env });
227+const targets = resolveAllAgentSessionStoreTargetsSync(cfg, { env: process.env });
242228243229expectTargetsToContainStores(targets, storePaths);
244230expect(countMatching(targets, (target) => target.storePath === storePaths.ops)).toBe(1);
@@ -288,7 +274,7 @@ describe("resolveAllAgentSessionStoreTargets", () => {
288274const mainStorePath = await resolveRealStorePath(mainSessionsDir);
289275const retiredStorePath = await resolveRealStorePath(retiredSessionsDir);
290276291-const targets = await resolveAllAgentSessionStoreTargets(cfg, { env });
277+const targets = resolveAllAgentSessionStoreTargetsSync(cfg, { env });
292278293279expect(
294280targets.some((target) => target.agentId === "main" && target.storePath === mainStorePath),
@@ -301,52 +287,52 @@ describe("resolveAllAgentSessionStoreTargets", () => {
301287});
302288});
303289304-for (const resolver of discoveryResolvers) {
305-it(`skips unreadable or invalid discovery roots when other roots are still readable (${resolver.label})`, async () => {
306-await withTempHome(async (home) => {
307-const customRoot = path.join(home, "custom-state");
308-await fs.mkdir(customRoot, { recursive: true });
309-await fs.writeFile(path.join(customRoot, "agents"), "not-a-directory", "utf8");
310-311-const envStateDir = path.join(home, "env-state");
312-const storePaths = await createAgentSessionStores(envStateDir, ["main", "retired"]);
313-const cfg = createCustomRootCfg(customRoot, "main");
314-const env = {
315- ...process.env,
316-OPENCLAW_STATE_DIR: envStateDir,
317-};
318-319-const targets = await resolver.resolve(cfg, env);
320-expect(
321-targets.some(
322-(target) => target.agentId === "retired" && target.storePath === storePaths.retired,
323-),
324-).toBe(true);
325-});
290+it("skips unreadable or invalid discovery roots when other roots are still readable", async () => {
291+await withTempHome(async (home) => {
292+const customRoot = path.join(home, "custom-state");
293+await fs.mkdir(customRoot, { recursive: true });
294+await fs.writeFile(path.join(customRoot, "agents"), "not-a-directory", "utf8");
295+296+const envStateDir = path.join(home, "env-state");
297+const storePaths = await createAgentSessionStores(envStateDir, ["main", "retired"]);
298+const cfg = createCustomRootCfg(customRoot, "main");
299+const env = {
300+ ...process.env,
301+OPENCLAW_STATE_DIR: envStateDir,
302+};
303+304+const targets = resolveAllAgentSessionStoreTargetsSync(cfg, { env });
305+expect(
306+targets.some(
307+(target) => target.agentId === "retired" && target.storePath === storePaths.retired,
308+),
309+).toBe(true);
326310});
311+});
327312328-it(`skips symlinked discovered stores under templated agents roots (${resolver.label})`, async () => {
329-await withTempHome(async (home) => {
330-if (process.platform === "win32") {
331-return;
332-}
333-const customRoot = path.join(home, "custom-state");
334-const opsSessionsDir = path.join(customRoot, "agents", "ops", "sessions");
335-const leakedFile = path.join(home, "outside.json");
336-await fs.mkdir(opsSessionsDir, { recursive: true });
337-await fs.writeFile(leakedFile, JSON.stringify({ leak: { secret: "x" } }), "utf8");
338-await fs.symlink(leakedFile, path.join(opsSessionsDir, "sessions.json"));
339-340-const targets = await resolver.resolve(createCustomRootCfg(customRoot), process.env);
341-const symlinkStoreSuffix = path.join("ops", "sessions", "sessions.json");
342-expect(
343-targets.some(
344-(target) => target.agentId === "ops" && target.storePath.includes(symlinkStoreSuffix),
345-),
346-).toBe(false);
313+it("skips symlinked discovered stores under templated agents roots", async () => {
314+await withTempHome(async (home) => {
315+if (process.platform === "win32") {
316+return;
317+}
318+const customRoot = path.join(home, "custom-state");
319+const opsSessionsDir = path.join(customRoot, "agents", "ops", "sessions");
320+const leakedFile = path.join(home, "outside.json");
321+await fs.mkdir(opsSessionsDir, { recursive: true });
322+await fs.writeFile(leakedFile, JSON.stringify({ leak: { secret: "x" } }), "utf8");
323+await fs.symlink(leakedFile, path.join(opsSessionsDir, "sessions.json"));
324+325+const targets = resolveAllAgentSessionStoreTargetsSync(createCustomRootCfg(customRoot), {
326+env: process.env,
347327});
328+const symlinkStoreSuffix = path.join("ops", "sessions", "sessions.json");
329+expect(
330+targets.some(
331+(target) => target.agentId === "ops" && target.storePath.includes(symlinkStoreSuffix),
332+),
333+).toBe(false);
348334});
349-}
335+});
350336351337it("skips discovered directories that only normalize into the default main agent", async () => {
352338await withTempHome(async (home) => {
@@ -360,7 +346,7 @@ describe("resolveAllAgentSessionStoreTargets", () => {
360346361347const cfg: OpenClawConfig = {};
362348const mainStorePath = await resolveRealStorePath(mainSessionsDir);
363-const targets = await resolveAllAgentSessionStoreTargets(cfg, { env: process.env });
349+const targets = resolveAllAgentSessionStoreTargetsSync(cfg, { env: process.env });
364350365351expect(targets).toEqual([
366352{
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。