






















@@ -118,6 +118,115 @@ describe("appendAssistantMessageToSessionTranscript", () => {
118118return event;
119119}
120120121+it("uses configured session.store when storePath is omitted", async () => {
122+const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "transcript-config-store-"));
123+const previousStateDir = process.env.OPENCLAW_STATE_DIR;
124+try {
125+process.env.OPENCLAW_STATE_DIR = path.join(tempDir, "default-state");
126+const sessionsDir = path.join(tempDir, "configured", "sessions");
127+fs.mkdirSync(sessionsDir, { recursive: true });
128+const storePath = path.join(sessionsDir, "sessions.json");
129+const configuredSessionKey = "agent:main:configured-store";
130+fs.writeFileSync(
131+storePath,
132+JSON.stringify({
133+[configuredSessionKey]: {
134+sessionId: "configured-session-id",
135+chatType: "direct",
136+},
137+}),
138+"utf-8",
139+);
140+141+const result = await appendAssistantMessageToSessionTranscript({
142+agentId: "main",
143+sessionKey: configuredSessionKey,
144+text: "mirrored configured store reply",
145+config: { session: { store: storePath } },
146+});
147+148+expect(result.ok).toBe(true);
149+if (!result.ok) {
150+throw new Error(result.reason);
151+}
152+expect(path.basename(result.sessionFile)).toBe("configured-session-id.jsonl");
153+expect(fs.realpathSync.native(path.dirname(result.sessionFile))).toBe(
154+fs.realpathSync.native(sessionsDir),
155+);
156+await expect(fs.promises.readFile(result.sessionFile, "utf-8")).resolves.toContain(
157+"mirrored configured store reply",
158+);
159+} finally {
160+if (previousStateDir === undefined) {
161+delete process.env.OPENCLAW_STATE_DIR;
162+} else {
163+process.env.OPENCLAW_STATE_DIR = previousStateDir;
164+}
165+fs.rmSync(tempDir, { recursive: true, force: true });
166+}
167+});
168+169+it("uses the session key agent for configured session.store templates", async () => {
170+const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "transcript-agent-store-"));
171+const previousStateDir = process.env.OPENCLAW_STATE_DIR;
172+const emitSpy = vi.spyOn(transcriptEvents, "emitSessionTranscriptUpdate");
173+try {
174+process.env.OPENCLAW_STATE_DIR = path.join(tempDir, "default-state");
175+const storeTemplate = path.join(tempDir, "agents", "{agentId}", "sessions", "sessions.json");
176+const sessionsDir = path.join(tempDir, "agents", "worker", "sessions");
177+fs.mkdirSync(sessionsDir, { recursive: true });
178+const storePath = path.join(sessionsDir, "sessions.json");
179+const configuredSessionKey = "agent:worker:configured-store";
180+fs.writeFileSync(
181+storePath,
182+JSON.stringify({
183+[configuredSessionKey]: {
184+sessionId: "worker-session-id",
185+chatType: "direct",
186+},
187+}),
188+"utf-8",
189+);
190+const beforeMessageWrite = vi.fn(({ message }: BeforeMessageWriteParams) => message);
191+192+const result = await appendAssistantMessageToSessionTranscript({
193+sessionKey: configuredSessionKey,
194+text: "mirrored worker store reply",
195+config: { session: { store: storeTemplate } },
196+ beforeMessageWrite,
197+});
198+199+expect(result.ok).toBe(true);
200+if (!result.ok) {
201+throw new Error(result.reason);
202+}
203+expect(path.basename(result.sessionFile)).toBe("worker-session-id.jsonl");
204+expect(fs.realpathSync.native(path.dirname(result.sessionFile))).toBe(
205+fs.realpathSync.native(sessionsDir),
206+);
207+await expect(fs.promises.readFile(result.sessionFile, "utf-8")).resolves.toContain(
208+"mirrored worker store reply",
209+);
210+expect(beforeMessageWrite).toHaveBeenCalledWith(
211+expect.objectContaining({
212+agentId: "worker",
213+sessionKey: configuredSessionKey,
214+}),
215+);
216+const event = requireTranscriptUpdateCall(emitSpy);
217+expect(event.agentId).toBe("worker");
218+expect(event.sessionKey).toBe(configuredSessionKey);
219+} finally {
220+emitSpy.mockRestore();
221+if (previousStateDir === undefined) {
222+delete process.env.OPENCLAW_STATE_DIR;
223+} else {
224+process.env.OPENCLAW_STATE_DIR = previousStateDir;
225+}
226+fs.rmSync(tempDir, { recursive: true, force: true });
227+}
228+});
229+121230it("creates transcript file and appends message for valid session", async () => {
122231writeTranscriptStore();
123232此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。