import type { TaskWorkbenchAddSessionResponse, TaskWorkbenchChangeModelInput, TaskWorkbenchCreateTaskInput, TaskWorkbenchCreateTaskResponse, TaskWorkbenchDiffInput, TaskWorkbenchRenameInput, TaskWorkbenchRenameSessionInput, TaskWorkbenchSelectInput, TaskWorkbenchSetSessionUnreadInput, TaskWorkbenchSendMessageInput, TaskWorkbenchSnapshot, TaskWorkbenchSessionInput, TaskWorkbenchUpdateDraftInput, } from "@sandbox-agent/foundry-shared"; import type { BackendClient } from "./backend-client.js"; import { getSharedMockWorkbenchClient } from "./mock/workbench-client.js"; import { createRemoteWorkbenchClient } from "./remote/workbench-client.js"; export type TaskWorkbenchClientMode = "mock" | "remote"; export interface CreateTaskWorkbenchClientOptions { mode: TaskWorkbenchClientMode; backend?: BackendClient; organizationId?: string; } export interface TaskWorkbenchClient { getSnapshot(): TaskWorkbenchSnapshot; subscribe(listener: () => void): () => void; createTask(input: TaskWorkbenchCreateTaskInput): Promise; markTaskUnread(input: TaskWorkbenchSelectInput): Promise; renameTask(input: TaskWorkbenchRenameInput): Promise; renameBranch(input: TaskWorkbenchRenameInput): Promise; archiveTask(input: TaskWorkbenchSelectInput): Promise; publishPr(input: TaskWorkbenchSelectInput): Promise; revertFile(input: TaskWorkbenchDiffInput): Promise; updateDraft(input: TaskWorkbenchUpdateDraftInput): Promise; sendMessage(input: TaskWorkbenchSendMessageInput): Promise; stopAgent(input: TaskWorkbenchSessionInput): Promise; setSessionUnread(input: TaskWorkbenchSetSessionUnreadInput): Promise; renameSession(input: TaskWorkbenchRenameSessionInput): Promise; closeSession(input: TaskWorkbenchSessionInput): Promise; addSession(input: TaskWorkbenchSelectInput): Promise; changeModel(input: TaskWorkbenchChangeModelInput): Promise; } export function createTaskWorkbenchClient(options: CreateTaskWorkbenchClientOptions): TaskWorkbenchClient { if (options.mode === "mock") { return getSharedMockWorkbenchClient(); } if (!options.backend) { throw new Error("Remote task workbench client requires a backend client"); } if (!options.organizationId) { throw new Error("Remote task workbench client requires a organization id"); } return createRemoteWorkbenchClient({ backend: options.backend, organizationId: options.organizationId, }); }