import type { AgentHomeStore, AgentRuntime, JobPublisher, MessagingSurface, SandboxProvider, } from "@rakazo/adapter-kit"; import type { PrismaClient, ThreadEvents } from "@rakazo/db"; import { createLogger, createTestSink, installLogger } from "@rakazo/logging"; import { describe, expect, it, vi } from "vitest"; import { createBackgroundJobHandlers } from "./background-job-handlers.js"; import { createRunExecutor } from "./executor.js"; import { compactHistory } from "./history-compaction.js"; import { deliverMessagingOutbound, mirrorMessagingOutbound } from "./messaging-delivery.js"; import { consolidateProfile } from "./profile-consolidation.js"; import type { EncryptedSecretStore } from "./secrets.js"; vi.mock("./history-compaction.js", () => ({ compactHistory: vi.fn(async () => undefined) })); vi.mock("./profile-consolidation.js", () => ({ consolidateProfile: vi.fn(async () => undefined), })); vi.mock("./messaging-delivery.js", () => ({ deliverMessagingOutbound: vi.fn(async () => undefined), mirrorMessagingOutbound: vi.fn(async () => undefined), })); describe("createBackgroundJobHandlers", () => { it("delivers directly when shutdown rejects a completed run's mirror job", async () => { const enqueueError = new Error("Background job publisher is closing"); const jobs = { enqueue: vi.fn(async () => { throw enqueueError; }), } as unknown as JobPublisher; const sink = createTestSink(); installLogger(createLogger({ service: "rakazo-worker", sinks: [sink] })); const handlers = createBackgroundJobHandlers({ executor: { continueRun: vi.fn(async () => undefined), } as unknown as ReturnType, prisma: {} as unknown as PrismaClient, sandbox: {} as unknown as SandboxProvider, home: {} as unknown as AgentHomeStore, jobs, events: {} as unknown as ThreadEvents, workerId: "worker-1", runtime: {} as unknown as AgentRuntime, secretStore: {} as unknown as EncryptedSecretStore, memoryProviders: { resolve: vi.fn(async () => null) }, messaging: {} as unknown as MessagingSurface, }); await handlers["run.continue"]({ runId: "run-1" }); expect(mirrorMessagingOutbound).toHaveBeenCalledWith( expect.objectContaining({ prisma: expect.anything(), messaging: expect.anything(), jobs }), "run-1", ); expect(deliverMessagingOutbound).toHaveBeenCalledWith( expect.objectContaining({ prisma: expect.anything(), messaging: expect.anything(), jobs }), { runId: undefined }, expect.objectContaining({ operationId: "messaging.deliver:drain" }), ); expect(sink.events.some((event) => event.message === "messaging.deliver enqueue error")).toBe( true, ); installLogger(createLogger({ service: "rakazo-worker", level: "off", sinks: [] })); }); it("compacts the requested thread with the runtime, job publisher, and model key it was given", async () => { const prisma = {} as unknown as PrismaClient; const runtime = {} as unknown as AgentRuntime; const jobs = {} as unknown as JobPublisher; const secretStore = {} as unknown as EncryptedSecretStore; const memoryProviders = { resolve: vi.fn(async () => null) }; const resolveModel = vi.fn(); const handlers = createBackgroundJobHandlers({ executor: { resolveModel } as unknown as ReturnType, prisma, sandbox: {} as unknown as SandboxProvider, home: {} as unknown as AgentHomeStore, jobs, events: {} as unknown as ThreadEvents, workerId: "worker-1", runtime, secretStore, memoryProviders, deploymentModelKey: "openrouter-key", }); await handlers["history.compact"]({ threadId: "thread-1" }); expect(compactHistory).toHaveBeenCalledWith( { prisma, runtime, jobs, memoryProviders, deploymentModelKey: "openrouter-key", resolveModel, }, "thread-1", ); }); it("consolidates the requested user's profile with the executor's model resolution", async () => { const prisma = {} as unknown as PrismaClient; const runtime = {} as unknown as AgentRuntime; const jobs = {} as unknown as JobPublisher; const memoryProviders = { resolve: vi.fn(async () => null) }; const resolveModel = vi.fn(async () => ({ provider: "local", id: "qwen3" })); const handlers = createBackgroundJobHandlers({ executor: { resolveModel } as unknown as ReturnType, prisma, sandbox: {} as unknown as SandboxProvider, home: {} as unknown as AgentHomeStore, jobs, events: {} as unknown as ThreadEvents, workerId: "worker-1", runtime, secretStore: {} as unknown as EncryptedSecretStore, memoryProviders, }); await handlers["profile.consolidate"]({ userId: "user-1" }); expect(consolidateProfile).toHaveBeenCalledWith( { prisma, runtime, jobs, memoryProviders, resolveModel: expect.any(Function) }, "user-1", ); const passed = vi.mocked(consolidateProfile).mock.calls[0]![0]; await passed.resolveModel({ userId: "user-1", spaceId: "space-1", botId: "bot-1" }); expect(resolveModel).toHaveBeenCalledWith({ userId: "user-1", spaceId: "space-1", botId: "bot-1", }); }); it("resolves the deployment model when no user credential is configured", async () => { const prisma = { spaceModelPreference: { findFirst: vi.fn(async () => null) }, userModelCredential: { findFirst: vi.fn(async () => null) }, deploymentSettings: { findUnique: vi.fn(async () => null) }, } as unknown as PrismaClient; const executor = createRunExecutor({ prisma, deploymentModelKey: "deployment-key", } as Parameters[0]); await expect( executor.resolveModel({ userId: "user-1", spaceId: "workspace-1" }), ).resolves.toEqual({ provider: "openrouter", id: "openai/gpt-5.6-luna", apiKey: "deployment-key", baseUrl: undefined, thinkingLevel: null, oauth: undefined, }); }); it("preserves a configured local model when resolving background compaction", async () => { const prisma = { spaceModelPreference: { findFirst: vi.fn(async () => null) }, userModelCredential: { findFirst: vi.fn(async () => null) }, deploymentSettings: { findUnique: vi.fn(async () => ({ defaultModelProvider: "local", defaultModelId: "qwen3:4b", })), }, } as unknown as PrismaClient; const executor = createRunExecutor({ prisma, } as Parameters[0]); await expect( executor.resolveModel({ userId: "user-1", spaceId: "workspace-1" }), ).resolves.toEqual({ provider: "local", id: "qwen3:4b", apiKey: undefined, baseUrl: undefined, thinkingLevel: null, oauth: undefined, }); }); });