server/automatic-recovery.test.ts
Rama main · réplica de lectura del repositorio original.
import { describe, expect, it } from "vitest";
import { recoveryCapabilityError, startupBackups } from "./automatic-recovery.ts";
describe("automatic recovery capabilities", () => {
const engine = { driverKind: "qwenAgent", capabilities: {
sessionModelSwitch: "unsupported" as const, agentsMcp: true, browserMcp: true,
customMcp: true, dataMcp: true, emailMcp: true, images: true,
} };
it("keeps a compatible local workspace and rejects losing a tool or attachment", () => {
expect(recoveryCapabilityError(engine, { ...engine, driverKind: "claudeAgent" })).toBeUndefined();
for (const key of ["agentsMcp", "browserMcp", "customMcp", "dataMcp", "emailMcp", "images"] as const) {
expect(recoveryCapabilityError(engine, { ...engine, capabilities: { ...engine.capabilities, [key]: false } })).toMatch(/tools and attachments/);
}
});
it("lets a limited Claude bot carry on with an engine that has every tool but a USB phone", () => {
const claude = { driverKind: "claudeAgent", capabilities: { sessionModelSwitch: "in-session" as const, agentsMcp: true, customMcp: true,
computerMcp: true, composioMcp: true, phoneMcp: true, browserMcp: true, dataMcp: true, emailMcp: true, deviceMcp: true, images: true } };
const { phoneMcp: _phone, ...rest } = claude.capabilities;
const opencode = { driverKind: "opencodeAgent", capabilities: { ...rest, sessionModelSwitch: "unsupported" as const, localComputerMcp: true } };
expect(recoveryCapabilityError(claude, opencode)).toBeUndefined();
expect(recoveryCapabilityError(claude, { ...opencode, capabilities: { ...opencode.capabilities, browserMcp: false } })).toMatch(/tools and attachments/);
});
it("does not silently move work to a file-less engine", () => {
expect(recoveryCapabilityError(engine, { ...engine, driverKind: "openai-compat" })).toMatch(/same workspace/);
});
});
describe("startup backups", () => {
const own = [{ instanceId: "codex", model: "gpt-5.5" }, { instanceId: "gemini", model: "gemini-3-pro" }];
const app = { instanceId: "qwen", model: "qwen3-coder" };
it("tries a bot's own backups in order whether or not Automatic recovery is on", () => {
expect(startupBackups({ fallback: own }, { enabled: false })).toEqual(own);
expect(startupBackups({ fallback: own }, { enabled: false, backup: app })).toEqual(own);
expect(startupBackups({ fallback: own }, { enabled: true, backup: app })).toEqual(own);
expect(startupBackups({ fallback: own })).toEqual(own);
});
it("uses the installation's backup only while Automatic recovery is on, for a bot with none of its own", () => {
expect(startupBackups({ fallback: [] }, { enabled: true, backup: app })).toEqual([app]);
expect(startupBackups({}, { enabled: true, backup: app })).toEqual([app]);
expect(startupBackups({}, { enabled: false, backup: app })).toEqual([]);
expect(startupBackups({}, { enabled: false })).toEqual([]);
expect(startupBackups({})).toEqual([]);
});
});