import type { AgentConfig, AgentExit, OutputChunk } from "./agent"; import type { GitCheckoutInput, GitCreateBranchInput, GitCreateWorktreeInput, GitCreateWorktreeResult, GitInitInput, GitListBranchesInput, GitListBranchesResult, GitRemoveWorktreeInput, GitRunStackedActionInput, GitRunStackedActionResult, GitStatusInput, GitStatusResult, } from "./git"; import type { ProviderEvent, ProviderInterruptTurnInput, ProviderRespondToRequestInput, ProviderSendTurnInput, ProviderSession, ProviderSessionStartInput, ProviderStopSessionInput, ProviderTurnStartResult, } from "./provider"; import type { ProjectAddInput, ProjectAddResult, ProjectListResult, ProjectRemoveInput, } from "./project"; import type { TerminalClearInput, TerminalCloseInput, TerminalEvent, TerminalOpenInput, TerminalResizeInput, TerminalSessionSnapshot, TerminalWriteInput, } from "./terminal"; import type { NewTodoInput, Todo } from "./todo"; export const EDITORS = [ { id: "cursor", label: "Cursor", command: "cursor" }, { id: "file-manager", label: "File Manager", command: null }, ] as const; export type EditorId = (typeof EDITORS)[number]["id"]; export interface NativeApi { todos: { list: () => Promise; add: (input: NewTodoInput) => Promise; toggle: (id: string) => Promise; remove: (id: string) => Promise; }; dialogs: { pickFolder: () => Promise; confirm: (message: string) => Promise; }; terminal: { open: (input: TerminalOpenInput) => Promise; write: (input: TerminalWriteInput) => Promise; resize: (input: TerminalResizeInput) => Promise; clear: (input: TerminalClearInput) => Promise; restart: (input: TerminalOpenInput) => Promise; close: (input: TerminalCloseInput) => Promise; onEvent: (callback: (event: TerminalEvent) => void) => () => void; }; agent: { spawn: (config: AgentConfig) => Promise; kill: (sessionId: string) => Promise; write: (sessionId: string, data: string) => Promise; onOutput: (callback: (chunk: OutputChunk) => void) => () => void; onExit: (callback: (exit: AgentExit) => void) => () => void; }; providers: { startSession: (input: ProviderSessionStartInput) => Promise; sendTurn: (input: ProviderSendTurnInput) => Promise; interruptTurn: (input: ProviderInterruptTurnInput) => Promise; respondToRequest: (input: ProviderRespondToRequestInput) => Promise; stopSession: (input: ProviderStopSessionInput) => Promise; listSessions: () => Promise; onEvent: (callback: (event: ProviderEvent) => void) => () => void; }; projects: { list: () => Promise; add: (input: ProjectAddInput) => Promise; remove: (input: ProjectRemoveInput) => Promise; }; shell: { openInEditor: (cwd: string, editor: EditorId) => Promise; openExternal: (url: string) => Promise; }; git: { // Existing branch/worktree API listBranches: (input: GitListBranchesInput) => Promise; createWorktree: (input: GitCreateWorktreeInput) => Promise; removeWorktree: (input: GitRemoveWorktreeInput) => Promise; createBranch: (input: GitCreateBranchInput) => Promise; checkout: (input: GitCheckoutInput) => Promise; init: (input: GitInitInput) => Promise; // Stacked action API status: (input: GitStatusInput) => Promise; runStackedAction: ( input: GitRunStackedActionInput, ) => Promise; }; contextMenu: { show: ( items: readonly { id: T; label: string }[], position?: { x: number; y: number }, ) => Promise; }; }