import type { HandoffWorkbenchAddTabResponse, HandoffWorkbenchChangeModelInput, HandoffWorkbenchCreateHandoffInput, HandoffWorkbenchCreateHandoffResponse, HandoffWorkbenchDiffInput, HandoffWorkbenchRenameInput, HandoffWorkbenchRenameSessionInput, HandoffWorkbenchSelectInput, HandoffWorkbenchSetSessionUnreadInput, HandoffWorkbenchSendMessageInput, HandoffWorkbenchSnapshot, HandoffWorkbenchTabInput, HandoffWorkbenchUpdateDraftInput, } from "@openhandoff/shared"; import type { BackendClient } from "./backend-client.js"; import { getSharedMockWorkbenchClient } from "./mock/workbench-client.js"; import { createRemoteWorkbenchClient } from "./remote/workbench-client.js"; export type HandoffWorkbenchClientMode = "mock" | "remote"; export interface CreateHandoffWorkbenchClientOptions { mode: HandoffWorkbenchClientMode; backend?: BackendClient; workspaceId?: string; } export interface HandoffWorkbenchClient { getSnapshot(): HandoffWorkbenchSnapshot; subscribe(listener: () => void): () => void; createHandoff(input: HandoffWorkbenchCreateHandoffInput): Promise; markHandoffUnread(input: HandoffWorkbenchSelectInput): Promise; renameHandoff(input: HandoffWorkbenchRenameInput): Promise; renameBranch(input: HandoffWorkbenchRenameInput): Promise; archiveHandoff(input: HandoffWorkbenchSelectInput): Promise; publishPr(input: HandoffWorkbenchSelectInput): Promise; revertFile(input: HandoffWorkbenchDiffInput): Promise; updateDraft(input: HandoffWorkbenchUpdateDraftInput): Promise; sendMessage(input: HandoffWorkbenchSendMessageInput): Promise; stopAgent(input: HandoffWorkbenchTabInput): Promise; setSessionUnread(input: HandoffWorkbenchSetSessionUnreadInput): Promise; renameSession(input: HandoffWorkbenchRenameSessionInput): Promise; closeTab(input: HandoffWorkbenchTabInput): Promise; addTab(input: HandoffWorkbenchSelectInput): Promise; changeModel(input: HandoffWorkbenchChangeModelInput): Promise; } export function createHandoffWorkbenchClient( options: CreateHandoffWorkbenchClientOptions, ): HandoffWorkbenchClient { if (options.mode === "mock") { return getSharedMockWorkbenchClient(); } if (!options.backend) { throw new Error("Remote handoff workbench client requires a backend client"); } if (!options.workspaceId) { throw new Error("Remote handoff workbench client requires a workspace id"); } return createRemoteWorkbenchClient({ backend: options.backend, workspaceId: options.workspaceId, }); }