/** * Shared test helpers for mocking SdkBackend in session tests. */ import { vi } from "vitest"; import type { SdkBackend } from "../src/sdk-backend.js"; export function makeSdkBackendStub(): { sdkBackend: SdkBackend; abort: ReturnType; dispose: ReturnType; prompt: ReturnType; } { const abort = vi.fn(async () => {}); const steeringMessages: string[] = []; const followUpMessages: string[] = []; const prompt = vi.fn((text: string, opts?: { streamingBehavior?: "steer" | "followUp" }) => { if (opts?.streamingBehavior === "steer") { steeringMessages.push(text); } else if (opts?.streamingBehavior === "followUp") { followUpMessages.push(text); } }); const session = { setThinkingLevel: vi.fn(), cycleModel: vi.fn(async () => undefined), cycleThinkingLevel: vi.fn(() => "high"), setSessionName: vi.fn(), messages: [], getSessionStats: vi.fn(() => ({})), compact: vi.fn(async () => ({})), setAutoCompactionEnabled: vi.fn(), newSession: vi.fn(async () => true), fork: vi.fn(async () => ({})), switchSession: vi.fn(async () => true), setSteeringMode: vi.fn(), setFollowUpMode: vi.fn(), setAutoRetryEnabled: vi.fn(), abortRetry: vi.fn(), abortBash: vi.fn(), steer: vi.fn(async (text: string) => { steeringMessages.push(text); }), followUp: vi.fn(async (text: string) => { followUpMessages.push(text); }), clearQueue: vi.fn(() => { steeringMessages.length = 0; followUpMessages.length = 0; return { steering: [], followUp: [] }; }), getSteeringMessages: vi.fn(() => [...steeringMessages]), getFollowUpMessages: vi.fn(() => [...followUpMessages]), }; let sdkBackend = { prompt, abort, setModel: vi.fn(async () => ({ success: true })), getStateSnapshot: vi.fn(() => ({ model: { provider: "anthropic", id: "claude-sonnet-4-0" }, thinkingLevel: "medium", isStreaming: false, })), session, respondToExtensionUIRequest: vi.fn(() => true), isDisposed: false, isStreaming: false, sessionFile: undefined, sessionId: "pi-session-1", dispose: vi.fn(), } as unknown as SdkBackend; const dispose = vi.fn(() => { (sdkBackend as { isDisposed: boolean }).isDisposed = true; }); (sdkBackend as { dispose: typeof dispose }).dispose = dispose; return { sdkBackend, abort, dispose, prompt }; }