Spaces:
Sleeping
Sleeping
| import path from "node:path"; | |
| import { describe, expect, it, vi } from "vitest"; | |
| import { withTempHome as withTempHomeBase } from "../../test/helpers/temp-home.js"; | |
| import { runEmbeddedPiAgent } from "../agents/pi-embedded.js"; | |
| import { getReplyFromConfig } from "./reply.js"; | |
| vi.mock("../agents/pi-embedded.js", () => ({ | |
| abortEmbeddedPiRun: vi.fn().mockReturnValue(false), | |
| runEmbeddedPiAgent: vi.fn(), | |
| queueEmbeddedPiMessage: vi.fn().mockReturnValue(false), | |
| resolveEmbeddedSessionLane: (key: string) => `session:${key.trim() || "main"}`, | |
| isEmbeddedPiRunActive: vi.fn().mockReturnValue(false), | |
| isEmbeddedPiRunStreaming: vi.fn().mockReturnValue(false), | |
| })); | |
| function makeResult(text: string) { | |
| return { | |
| payloads: [{ text }], | |
| meta: { | |
| durationMs: 5, | |
| agentMeta: { sessionId: "s", provider: "p", model: "m" }, | |
| }, | |
| }; | |
| } | |
| async function withTempHome<T>(fn: (home: string) => Promise<T>): Promise<T> { | |
| return withTempHomeBase( | |
| async (home) => { | |
| vi.mocked(runEmbeddedPiAgent).mockReset(); | |
| return await fn(home); | |
| }, | |
| { | |
| env: { | |
| OPENCLAW_BUNDLED_SKILLS_DIR: (home) => path.join(home, "bundled-skills"), | |
| }, | |
| prefix: "openclaw-media-note-", | |
| }, | |
| ); | |
| } | |
| function makeCfg(home: string) { | |
| return { | |
| agents: { | |
| defaults: { | |
| model: "anthropic/claude-opus-4-5", | |
| workspace: path.join(home, "openclaw"), | |
| }, | |
| }, | |
| channels: { whatsapp: { allowFrom: ["*"] } }, | |
| session: { store: path.join(home, "sessions.json") }, | |
| }; | |
| } | |
| describe("getReplyFromConfig media note plumbing", () => { | |
| it("includes all MediaPaths in the agent prompt", async () => { | |
| await withTempHome(async (home) => { | |
| let seenPrompt: string | undefined; | |
| vi.mocked(runEmbeddedPiAgent).mockImplementation(async (params) => { | |
| seenPrompt = params.prompt; | |
| return makeResult("ok"); | |
| }); | |
| const cfg = makeCfg(home); | |
| const res = await getReplyFromConfig( | |
| { | |
| Body: "hello", | |
| From: "+1001", | |
| To: "+2000", | |
| MediaPaths: ["/tmp/a.png", "/tmp/b.png"], | |
| MediaUrls: ["/tmp/a.png", "/tmp/b.png"], | |
| }, | |
| {}, | |
| cfg, | |
| ); | |
| const text = Array.isArray(res) ? res[0]?.text : res?.text; | |
| expect(text).toBe("ok"); | |
| expect(seenPrompt).toBeTruthy(); | |
| expect(seenPrompt).toContain("[media attached: 2 files]"); | |
| const idxA = seenPrompt?.indexOf("[media attached 1/2: /tmp/a.png"); | |
| const idxB = seenPrompt?.indexOf("[media attached 2/2: /tmp/b.png"); | |
| expect(typeof idxA).toBe("number"); | |
| expect(typeof idxB).toBe("number"); | |
| expect((idxA ?? -1) >= 0).toBe(true); | |
| expect((idxB ?? -1) >= 0).toBe(true); | |
| expect((idxA ?? 0) < (idxB ?? 0)).toBe(true); | |
| }); | |
| }); | |
| }); | |