





















@@ -4,8 +4,13 @@ import type { RuntimeEnv } from "../runtime.js";
44import { exportTrajectoryCommand } from "./export-trajectory.js";
5566const mocks = vi.hoisted(() => ({
7+getRuntimeConfig: vi.fn(),
78loadSessionEntry: vi.fn(),
8-resolveDefaultSessionStorePath: vi.fn(),
9+resolveStorePath: vi.fn(),
10+}));
11+12+vi.mock("../config/config.js", () => ({
13+getRuntimeConfig: mocks.getRuntimeConfig,
914}));
10151116vi.mock("../config/sessions/session-accessor.js", () => ({
@@ -16,7 +21,7 @@ vi.mock("../config/sessions/paths.js", async (importOriginal) => {
1621const actual = await importOriginal<typeof import("../config/sessions/paths.js")>();
1722return {
1823 ...actual,
19-resolveDefaultSessionStorePath: mocks.resolveDefaultSessionStorePath,
24+resolveStorePath: mocks.resolveStorePath,
2025};
2126});
2227@@ -31,7 +36,8 @@ function createRuntime(): RuntimeEnv {
3136describe("exportTrajectoryCommand", () => {
3237beforeEach(() => {
3338vi.clearAllMocks();
34-mocks.resolveDefaultSessionStorePath.mockReturnValue("/tmp/openclaw/sessions.json");
39+mocks.getRuntimeConfig.mockReturnValue({});
40+mocks.resolveStorePath.mockReturnValue("/tmp/openclaw/sessions.json");
3541mocks.loadSessionEntry.mockReturnValue(undefined);
3642});
3743@@ -64,6 +70,7 @@ describe("exportTrajectoryCommand", () => {
6470JSON.stringify({ output: "/tmp/export.json" }),
6571"utf8",
6672).toString("base64url");
73+mocks.resolveStorePath.mockReturnValue("/tmp/direct-store.json");
67746875await exportTrajectoryCommand(
6976{
@@ -74,7 +81,10 @@ describe("exportTrajectoryCommand", () => {
7481runtime,
7582);
768377-expect(mocks.resolveDefaultSessionStorePath).not.toHaveBeenCalled();
84+expect(mocks.getRuntimeConfig).not.toHaveBeenCalled();
85+expect(mocks.resolveStorePath).toHaveBeenCalledWith("/tmp/direct-store.json", {
86+agentId: "main",
87+});
7888expect(mocks.loadSessionEntry).toHaveBeenCalledWith({
7989agentId: "main",
8090sessionKey: "agent:main:telegram:direct:123",
@@ -86,11 +96,91 @@ describe("exportTrajectoryCommand", () => {
8696expect(runtime.exit).toHaveBeenCalledWith(1);
8797});
889889-it("points missing session users at the sessions command", async () => {
99+it.each([
100+["home-prefixed", "~/x/sessions.json", "/home/demo/x/sessions.json"],
101+[
102+"agent template",
103+"/tmp/openclaw/agents/{agentId}/sessions/sessions.json",
104+"/tmp/openclaw/agents/work/sessions/sessions.json",
105+],
106+])(
107+"resolves explicit --store %s paths through the shared resolver",
108+async (_name, store, resolvedStore) => {
109+const runtime = createRuntime();
110+mocks.resolveStorePath.mockReturnValue(resolvedStore);
111+112+await exportTrajectoryCommand(
113+{ sessionKey: "agent:work:telegram:direct:123", store },
114+runtime,
115+);
116+117+expect(mocks.getRuntimeConfig).not.toHaveBeenCalled();
118+expect(mocks.resolveStorePath).toHaveBeenCalledWith(store, { agentId: "work" });
119+expect(mocks.loadSessionEntry).toHaveBeenCalledWith({
120+agentId: "work",
121+sessionKey: "agent:work:telegram:direct:123",
122+storePath: resolvedStore,
123+});
124+expect(runtime.error).toHaveBeenCalledWith(
125+"Session not found: agent:work:telegram:direct:123. Run openclaw sessions to see available sessions.",
126+);
127+expect(runtime.exit).toHaveBeenCalledWith(1);
128+},
129+);
130+131+it("uses configured session.store when no explicit store is provided", async () => {
132+const runtime = createRuntime();
133+mocks.getRuntimeConfig.mockReturnValue({
134+session: { store: "/tmp/openclaw/agents/{agentId}/sessions/sessions.json" },
135+});
136+mocks.resolveStorePath.mockReturnValue("/tmp/openclaw/agents/work/sessions/sessions.json");
137+138+await exportTrajectoryCommand({ sessionKey: "agent:work:telegram:direct:123" }, runtime);
139+140+expect(mocks.resolveStorePath).toHaveBeenCalledWith(
141+"/tmp/openclaw/agents/{agentId}/sessions/sessions.json",
142+{ agentId: "work" },
143+);
144+expect(mocks.loadSessionEntry).toHaveBeenCalledWith({
145+agentId: "work",
146+sessionKey: "agent:work:telegram:direct:123",
147+storePath: "/tmp/openclaw/agents/work/sessions/sessions.json",
148+});
149+expect(runtime.error).toHaveBeenCalledWith(
150+"Session not found: agent:work:telegram:direct:123. Run openclaw sessions to see available sessions.",
151+);
152+expect(runtime.exit).toHaveBeenCalledWith(1);
153+});
154+155+it("falls back through resolveStorePath when no session.store is configured", async () => {
156+const runtime = createRuntime();
157+158+await exportTrajectoryCommand({ sessionKey: "agent:main:telegram:direct:123" }, runtime);
159+160+expect(mocks.resolveStorePath).toHaveBeenCalledWith(undefined, { agentId: "main" });
161+expect(mocks.loadSessionEntry).toHaveBeenCalledWith({
162+agentId: "main",
163+sessionKey: "agent:main:telegram:direct:123",
164+storePath: "/tmp/openclaw/sessions.json",
165+});
166+expect(runtime.error).toHaveBeenCalledWith(
167+"Session not found: agent:main:telegram:direct:123. Run openclaw sessions to see available sessions.",
168+);
169+expect(runtime.exit).toHaveBeenCalledWith(1);
170+});
171+172+it("passes blank configured session.store through the default-store resolver", async () => {
90173const runtime = createRuntime();
174+mocks.getRuntimeConfig.mockReturnValue({ session: { store: "" } });
9117592176await exportTrajectoryCommand({ sessionKey: "agent:main:telegram:direct:123" }, runtime);
93177178+expect(mocks.resolveStorePath).toHaveBeenCalledWith("", { agentId: "main" });
179+expect(mocks.loadSessionEntry).toHaveBeenCalledWith({
180+agentId: "main",
181+sessionKey: "agent:main:telegram:direct:123",
182+storePath: "/tmp/openclaw/sessions.json",
183+});
94184expect(runtime.error).toHaveBeenCalledWith(
95185"Session not found: agent:main:telegram:direct:123. Run openclaw sessions to see available sessions.",
96186);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。