



























@@ -27,13 +27,23 @@ vi.mock("../../config/sessions/paths.js", () => ({
2727resolveStorePath: mocks.resolveStorePath,
2828}));
292930-vi.mock("../../agents/agent-scope.js", () => ({
31-listAgentIds: mocks.listAgentIds,
32-}));
30+vi.mock("../../agents/agent-scope.js", async () => {
31+const { normalizeAgentId } = await vi.importActual<
32+typeof import("../../routing/session-key.js")
33+>("../../routing/session-key.js");
34+return {
35+listAgentIds: mocks.listAgentIds,
36+resolveDefaultAgentId: (cfg: OpenClawConfig) => {
37+const agents = cfg.agents?.list ?? [];
38+return normalizeAgentId(agents.find((agent) => agent?.default)?.id ?? agents[0]?.id);
39+},
40+};
41+});
33423443describe("resolveSessionKeyForRequest", () => {
3544const MAIN_STORE_PATH = "/tmp/main-store.json";
3645const MYBOT_STORE_PATH = "/tmp/mybot-store.json";
46+const SHARED_STORE_PATH = "/tmp/shared-store.json";
3747type SessionStoreEntry = { sessionId: string; updatedAt: number };
3848type SessionStoreMap = Record<string, SessionStoreEntry>;
3949@@ -74,6 +84,96 @@ describe("resolveSessionKeyForRequest", () => {
7484expect(result.sessionKey).toBe("agent:main:main");
7585});
768687+it("uses the configured default agent store for new --to sessions", async () => {
88+setupMainAndMybotStorePaths();
89+mockStoresByPath({
90+[MAIN_STORE_PATH]: {},
91+[MYBOT_STORE_PATH]: {},
92+});
93+94+const result = resolveSessionKeyForRequest({
95+cfg: {
96+agents: { list: [{ id: "mybot", default: true }] },
97+} satisfies OpenClawConfig,
98+to: "+15551234567",
99+});
100+101+expect(result.sessionKey).toBe("agent:mybot:main");
102+expect(result.storePath).toBe(MYBOT_STORE_PATH);
103+});
104+105+it("migrates legacy main-store main-key sessions for plain --to default-agent requests", async () => {
106+setupMainAndMybotStorePaths();
107+const mainStore = {
108+"agent:main:main": { sessionId: "legacy-session-id", updatedAt: 1 },
109+};
110+const mybotStore = {};
111+mockStoresByPath({
112+[MAIN_STORE_PATH]: mainStore,
113+[MYBOT_STORE_PATH]: mybotStore,
114+});
115+116+const result = resolveSessionKeyForRequest({
117+cfg: {
118+agents: { list: [{ id: "mybot", default: true }] },
119+} satisfies OpenClawConfig,
120+to: "+15551234567",
121+});
122+123+expect(result.sessionKey).toBe("agent:mybot:main");
124+expect(result.sessionStore).toBe(mybotStore);
125+expect(result.storePath).toBe(MYBOT_STORE_PATH);
126+expect(result.sessionStore["agent:mybot:main"]?.sessionId).toBe("legacy-session-id");
127+});
128+129+it("migrates legacy main-key sessions for plain --to default-agent requests with a literal shared store", async () => {
130+const sharedStore = {
131+"agent:main:main": { sessionId: "legacy-session-id", updatedAt: 1 },
132+};
133+mocks.listAgentIds.mockReturnValue(["main", "mybot"]);
134+mocks.resolveStorePath.mockReturnValue(SHARED_STORE_PATH);
135+mocks.loadSessionStore.mockReturnValue(sharedStore);
136+137+const result = resolveSessionKeyForRequest({
138+cfg: {
139+agents: { list: [{ id: "mybot", default: true }] },
140+session: { store: SHARED_STORE_PATH },
141+} satisfies OpenClawConfig,
142+to: "+15551234567",
143+});
144+145+expect(result.sessionKey).toBe("agent:mybot:main");
146+expect(result.sessionStore).toBe(sharedStore);
147+expect(result.storePath).toBe(SHARED_STORE_PATH);
148+expect(result.sessionStore["agent:mybot:main"]?.sessionId).toBe("legacy-session-id");
149+expect(mocks.loadSessionStore).toHaveBeenCalledTimes(1);
150+expect(mocks.loadSessionStore).toHaveBeenCalledWith(SHARED_STORE_PATH);
151+});
152+153+it("prefers the configured default-agent session over legacy main-store rows", async () => {
154+setupMainAndMybotStorePaths();
155+const mybotStore = {
156+"agent:mybot:main": { sessionId: "current-session-id", updatedAt: 2 },
157+};
158+mockStoresByPath({
159+[MAIN_STORE_PATH]: {
160+"agent:main:main": { sessionId: "legacy-session-id", updatedAt: 1 },
161+},
162+[MYBOT_STORE_PATH]: mybotStore,
163+});
164+165+const result = resolveSessionKeyForRequest({
166+cfg: {
167+agents: { list: [{ id: "mybot", default: true }] },
168+} satisfies OpenClawConfig,
169+to: "+15551234567",
170+});
171+172+expect(result.sessionKey).toBe("agent:mybot:main");
173+expect(result.sessionStore).toBe(mybotStore);
174+expect(result.storePath).toBe(MYBOT_STORE_PATH);
175+});
176+77177it("finds session by sessionId via reverse lookup in primary store", async () => {
78178mocks.resolveStorePath.mockReturnValue(MAIN_STORE_PATH);
79179mocks.loadSessionStore.mockReturnValue({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。