fix(compact): return clear error for CLI providers (#3874)

This commit is contained in:
ThanhNguyxn 2026-01-29 19:53:01 +07:00
parent 5f4715acfc
commit 9fc62cefa2
2 changed files with 82 additions and 0 deletions

View File

@ -0,0 +1,69 @@
import { describe, expect, it, vi, beforeEach } from "vitest";
// Mock model-selection to control isCliProvider behavior
vi.mock("../model-selection.js", () => ({
isCliProvider: vi.fn((provider: string) => {
return provider === "claude-cli" || provider === "codex-cli";
}),
}));
// Mock defaults
vi.mock("../defaults.js", () => ({
DEFAULT_PROVIDER: "anthropic",
DEFAULT_MODEL: "claude-sonnet-4",
}));
// Mock models-config - ensure async function returns
vi.mock("../models-config.js", () => ({
ensureMoltbotModelsJson: vi.fn(async () => {}),
}));
// Mock agent-paths
vi.mock("../agent-paths.js", () => ({
resolveMoltbotAgentDir: vi.fn(() => "/tmp/test-agent"),
}));
// Mock utils
vi.mock("../../utils.js", () => ({
resolveUserPath: vi.fn((p: string) => p),
}));
// Import after mocks are set up
import { compactEmbeddedPiSessionDirect } from "./compact.js";
describe("compactEmbeddedPiSessionDirect", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("returns error for CLI provider claude-cli", async () => {
const result = await compactEmbeddedPiSessionDirect({
sessionId: "test-session",
sessionFile: "/tmp/test.jsonl",
workspaceDir: "/tmp/workspace",
provider: "claude-cli",
model: "opus",
});
expect(result.ok).toBe(false);
expect(result.compacted).toBe(false);
expect(result.reason).toContain("Compaction is not supported for CLI providers");
expect(result.reason).toContain("claude-cli");
expect(result.reason).toContain("Use /model to switch to an API provider");
});
it("returns error for CLI provider codex-cli", async () => {
const result = await compactEmbeddedPiSessionDirect({
sessionId: "test-session",
sessionFile: "/tmp/test.jsonl",
workspaceDir: "/tmp/workspace",
provider: "codex-cli",
model: "default",
});
expect(result.ok).toBe(false);
expect(result.compacted).toBe(false);
expect(result.reason).toContain("Compaction is not supported for CLI providers");
expect(result.reason).toContain("codex-cli");
});
});

View File

@ -29,6 +29,7 @@ import { resolveMoltbotDocsPath } from "../docs-path.js";
import type { ExecElevatedDefaults } from "../bash-tools.js";
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../defaults.js";
import { getApiKeyForModel, resolveModelAuthMode } from "../model-auth.js";
import { isCliProvider } from "../model-selection.js";
import { ensureMoltbotModelsJson } from "../models-config.js";
import {
ensureSessionHeader,
@ -114,6 +115,18 @@ export async function compactEmbeddedPiSessionDirect(
const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
// CLI providers (claude-cli, codex-cli, etc.) are not supported for compaction
// because they don't use the embedded Pi runner. Users need to switch to an
// API provider before compacting.
if (isCliProvider(provider, params.config)) {
return {
ok: false,
compacted: false,
reason: `Compaction is not supported for CLI providers (${provider}/${modelId}). Use /model to switch to an API provider before compacting.`,
};
}
const agentDir = params.agentDir ?? resolveMoltbotAgentDir();
await ensureMoltbotModelsJson(params.config, agentDir);
const { model, error, authStorage, modelRegistry } = resolveModel(