import { contextBridge, ipcRenderer, type IpcRendererEvent } from "electron"; import type { SDKMessage } from "@anthropic-ai/claude-agent-sdk"; import type { Project } from "./db/projects"; import type { Session, Message } from "./db/sessions"; import type { Phase, UserPermissionMode } from "./claude/phases"; import type { GitWorktreeInfo } from "./git/worktree"; export interface ClaudeFlowAPI { // Projects listProjects: () => Promise; createProject: (name: string, path: string) => Promise; deleteProject: (id: string) => Promise; // Sessions listSessions: (projectId: string) => Promise; createSession: (projectId: string, name: string) => Promise; deleteSession: (id: string) => Promise; getSession: (id: string) => Promise; // Messages listMessages: (sessionId: string) => Promise; // Chat sendMessage: (sessionId: string, message: string) => Promise; interruptSession: (sessionId: string) => Promise; // Workflow triggerReview: (sessionId: string) => Promise; advancePhase: (sessionId: string) => Promise; setPermissionMode: ( sessionId: string, mode: UserPermissionMode ) => Promise; // Session Artifacts (new session-specific) readSessionArtifact: ( projectPath: string, sessionId: string, filename: string ) => Promise; writeSessionArtifact: ( projectPath: string, sessionId: string, filename: string, content: string ) => Promise; // CLAUDE.md readClaudeMd: (projectPath: string) => Promise; writeClaudeMd: (projectPath: string, content: string) => Promise; // Legacy Artifacts (backward compat) readArtifact: ( projectPath: string, filename: string ) => Promise; writeArtifact: ( projectPath: string, filename: string, content: string ) => Promise; // Git isGitRepo: (projectPath: string) => Promise; getWorktreeInfo: (projectPath: string, sessionId: string) => Promise; commitChanges: (worktreePath: string, message: string, files?: string[]) => Promise; hasUncommittedChanges: (worktreePath: string) => Promise; // Events onClaudeMessage: ( callback: (sessionId: string, message: SDKMessage) => void ) => () => void; // Dialogs selectDirectory: () => Promise; } const api: ClaudeFlowAPI = { // Projects listProjects: () => ipcRenderer.invoke("projects:list"), createProject: (name, path) => ipcRenderer.invoke("projects:create", name, path), deleteProject: (id) => ipcRenderer.invoke("projects:delete", id), // Sessions listSessions: (projectId) => ipcRenderer.invoke("sessions:list", projectId), createSession: (projectId, name) => ipcRenderer.invoke("sessions:create", projectId, name), deleteSession: (id) => ipcRenderer.invoke("sessions:delete", id), getSession: (id) => ipcRenderer.invoke("sessions:get", id), // Messages listMessages: (sessionId) => ipcRenderer.invoke("messages:list", sessionId), // Chat sendMessage: (sessionId, message) => ipcRenderer.invoke("chat:send", sessionId, message), interruptSession: (sessionId) => ipcRenderer.invoke("chat:interrupt", sessionId), // Workflow triggerReview: (sessionId) => ipcRenderer.invoke("workflow:review", sessionId), advancePhase: (sessionId) => ipcRenderer.invoke("workflow:advance", sessionId), setPermissionMode: (sessionId, mode) => ipcRenderer.invoke("workflow:setPermissionMode", sessionId, mode), // Session Artifacts readSessionArtifact: (projectPath, sessionId, filename) => ipcRenderer.invoke("artifact:readSession", projectPath, sessionId, filename), writeSessionArtifact: (projectPath, sessionId, filename, content) => ipcRenderer.invoke("artifact:writeSession", projectPath, sessionId, filename, content), // CLAUDE.md readClaudeMd: (projectPath) => ipcRenderer.invoke("claudemd:read", projectPath), writeClaudeMd: (projectPath, content) => ipcRenderer.invoke("claudemd:write", projectPath, content), // Legacy Artifacts readArtifact: (projectPath, filename) => ipcRenderer.invoke("artifact:read", projectPath, filename), writeArtifact: (projectPath, filename, content) => ipcRenderer.invoke("artifact:write", projectPath, filename, content), // Git isGitRepo: (projectPath) => ipcRenderer.invoke("git:isRepo", projectPath), getWorktreeInfo: (projectPath, sessionId) => ipcRenderer.invoke("git:worktreeInfo", projectPath, sessionId), commitChanges: (worktreePath, message, files) => ipcRenderer.invoke("git:commit", worktreePath, message, files), hasUncommittedChanges: (worktreePath) => ipcRenderer.invoke("git:hasChanges", worktreePath), // Events onClaudeMessage: (callback) => { const handler = ( _: IpcRendererEvent, sessionId: string, message: SDKMessage ) => callback(sessionId, message); ipcRenderer.on("claude:message", handler); return () => ipcRenderer.removeListener("claude:message", handler); }, // Dialogs selectDirectory: async () => { const result = await ipcRenderer.invoke("dialog:selectDirectory"); return result; }, }; contextBridge.exposeInMainWorld("api", api); // Type declaration for renderer declare global { interface Window { api: ClaudeFlowAPI; } }