aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/preload.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/preload.ts')
-rw-r--r--src/main/preload.ts115
1 files changed, 114 insertions, 1 deletions
diff --git a/src/main/preload.ts b/src/main/preload.ts
index 0b39d91..b3e3f8b 100644
--- a/src/main/preload.ts
+++ b/src/main/preload.ts
@@ -1 +1,114 @@
1// Expose nothing for now; keep the door open for future IPC-safe APIs. 1import { contextBridge, ipcRenderer, type IpcRendererEvent } from "electron";
2import type { SDKMessage } from "@anthropic-ai/claude-agent-sdk";
3import type { Project } from "./db/projects";
4import type { Session, Message } from "./db/sessions";
5import type { Phase, UserPermissionMode } from "./claude/phases";
6
7export interface ClaudeFlowAPI {
8 // Projects
9 listProjects: () => Promise<Project[]>;
10 createProject: (name: string, path: string) => Promise<Project>;
11 deleteProject: (id: string) => Promise<void>;
12
13 // Sessions
14 listSessions: (projectId: string) => Promise<Session[]>;
15 createSession: (projectId: string, name: string) => Promise<Session>;
16 deleteSession: (id: string) => Promise<void>;
17 getSession: (id: string) => Promise<Session | undefined>;
18
19 // Messages
20 listMessages: (sessionId: string) => Promise<Message[]>;
21
22 // Chat
23 sendMessage: (sessionId: string, message: string) => Promise<void>;
24 interruptSession: (sessionId: string) => Promise<void>;
25
26 // Workflow
27 triggerReview: (sessionId: string) => Promise<void>;
28 advancePhase: (sessionId: string) => Promise<Phase | null>;
29 setPermissionMode: (
30 sessionId: string,
31 mode: UserPermissionMode
32 ) => Promise<void>;
33
34 // Artifacts
35 readArtifact: (
36 projectPath: string,
37 filename: string
38 ) => Promise<string | null>;
39 writeArtifact: (
40 projectPath: string,
41 filename: string,
42 content: string
43 ) => Promise<void>;
44
45 // Events
46 onClaudeMessage: (
47 callback: (sessionId: string, message: SDKMessage) => void
48 ) => () => void;
49
50 // Dialogs
51 selectDirectory: () => Promise<string | null>;
52}
53
54const api: ClaudeFlowAPI = {
55 // Projects
56 listProjects: () => ipcRenderer.invoke("projects:list"),
57 createProject: (name, path) =>
58 ipcRenderer.invoke("projects:create", name, path),
59 deleteProject: (id) => ipcRenderer.invoke("projects:delete", id),
60
61 // Sessions
62 listSessions: (projectId) => ipcRenderer.invoke("sessions:list", projectId),
63 createSession: (projectId, name) =>
64 ipcRenderer.invoke("sessions:create", projectId, name),
65 deleteSession: (id) => ipcRenderer.invoke("sessions:delete", id),
66 getSession: (id) => ipcRenderer.invoke("sessions:get", id),
67
68 // Messages
69 listMessages: (sessionId) => ipcRenderer.invoke("messages:list", sessionId),
70
71 // Chat
72 sendMessage: (sessionId, message) =>
73 ipcRenderer.invoke("chat:send", sessionId, message),
74 interruptSession: (sessionId) =>
75 ipcRenderer.invoke("chat:interrupt", sessionId),
76
77 // Workflow
78 triggerReview: (sessionId) => ipcRenderer.invoke("workflow:review", sessionId),
79 advancePhase: (sessionId) => ipcRenderer.invoke("workflow:advance", sessionId),
80 setPermissionMode: (sessionId, mode) =>
81 ipcRenderer.invoke("workflow:setPermissionMode", sessionId, mode),
82
83 // Artifacts
84 readArtifact: (projectPath, filename) =>
85 ipcRenderer.invoke("artifact:read", projectPath, filename),
86 writeArtifact: (projectPath, filename, content) =>
87 ipcRenderer.invoke("artifact:write", projectPath, filename, content),
88
89 // Events
90 onClaudeMessage: (callback) => {
91 const handler = (
92 _: IpcRendererEvent,
93 sessionId: string,
94 message: SDKMessage
95 ) => callback(sessionId, message);
96 ipcRenderer.on("claude:message", handler);
97 return () => ipcRenderer.removeListener("claude:message", handler);
98 },
99
100 // Dialogs
101 selectDirectory: async () => {
102 const result = await ipcRenderer.invoke("dialog:selectDirectory");
103 return result;
104 },
105};
106
107contextBridge.exposeInMainWorld("api", api);
108
109// Type declaration for renderer
110declare global {
111 interface Window {
112 api: ClaudeFlowAPI;
113 }
114}