| import fs from "node:fs"; |
| import os from "node:os"; |
| import path from "node:path"; |
| import { afterEach, beforeEach, describe, expect, it } from "vitest"; |
| import { |
| appendAssistantMessageToSessionTranscript, |
| resolveMirroredTranscriptText, |
| } from "./transcript.js"; |
|
|
| describe("resolveMirroredTranscriptText", () => { |
| it("prefers media filenames over text", () => { |
| const result = resolveMirroredTranscriptText({ |
| text: "caption here", |
| mediaUrls: ["https://example.com/files/report.pdf?sig=123"], |
| }); |
| expect(result).toBe("report.pdf"); |
| }); |
|
|
| it("returns trimmed text when no media", () => { |
| const result = resolveMirroredTranscriptText({ text: " hello " }); |
| expect(result).toBe("hello"); |
| }); |
| }); |
|
|
| describe("appendAssistantMessageToSessionTranscript", () => { |
| let tempDir: string; |
| let storePath: string; |
| let sessionsDir: string; |
|
|
| beforeEach(() => { |
| tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "transcript-test-")); |
| sessionsDir = path.join(tempDir, "agents", "main", "sessions"); |
| fs.mkdirSync(sessionsDir, { recursive: true }); |
| storePath = path.join(sessionsDir, "sessions.json"); |
| }); |
|
|
| afterEach(() => { |
| fs.rmSync(tempDir, { recursive: true, force: true }); |
| }); |
|
|
| it("returns error for missing sessionKey", async () => { |
| const result = await appendAssistantMessageToSessionTranscript({ |
| sessionKey: "", |
| text: "test", |
| storePath, |
| }); |
| expect(result.ok).toBe(false); |
| if (!result.ok) { |
| expect(result.reason).toBe("missing sessionKey"); |
| } |
| }); |
|
|
| it("returns error for empty text", async () => { |
| const result = await appendAssistantMessageToSessionTranscript({ |
| sessionKey: "test-session", |
| text: " ", |
| storePath, |
| }); |
| expect(result.ok).toBe(false); |
| if (!result.ok) { |
| expect(result.reason).toBe("empty text"); |
| } |
| }); |
|
|
| it("returns error for unknown sessionKey", async () => { |
| fs.writeFileSync(storePath, JSON.stringify({}), "utf-8"); |
| const result = await appendAssistantMessageToSessionTranscript({ |
| sessionKey: "nonexistent", |
| text: "test message", |
| storePath, |
| }); |
| expect(result.ok).toBe(false); |
| if (!result.ok) { |
| expect(result.reason).toContain("unknown sessionKey"); |
| } |
| }); |
|
|
| it("creates transcript file and appends message for valid session", async () => { |
| const sessionId = "test-session-id"; |
| const sessionKey = "test-session"; |
| const store = { |
| [sessionKey]: { |
| sessionId, |
| chatType: "direct", |
| channel: "discord", |
| }, |
| }; |
| fs.writeFileSync(storePath, JSON.stringify(store), "utf-8"); |
|
|
| const result = await appendAssistantMessageToSessionTranscript({ |
| sessionKey, |
| text: "Hello from delivery mirror!", |
| storePath, |
| }); |
|
|
| expect(result.ok).toBe(true); |
| if (result.ok) { |
| expect(fs.existsSync(result.sessionFile)).toBe(true); |
|
|
| const lines = fs.readFileSync(result.sessionFile, "utf-8").trim().split("\n"); |
| expect(lines.length).toBe(2); |
|
|
| const header = JSON.parse(lines[0]); |
| expect(header.type).toBe("session"); |
| expect(header.id).toBe(sessionId); |
|
|
| const messageLine = JSON.parse(lines[1]); |
| expect(messageLine.type).toBe("message"); |
| expect(messageLine.message.role).toBe("assistant"); |
| expect(messageLine.message.content[0].type).toBe("text"); |
| expect(messageLine.message.content[0].text).toBe("Hello from delivery mirror!"); |
| } |
| }); |
| }); |
|
|