@statechange/council 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +207 -0
  2. package/council/creative/ABOUT.md +23 -0
  3. package/council/critic/ABOUT.md +23 -0
  4. package/council/strategist/ABOUT.md +21 -0
  5. package/dist/backends/anthropic.d.ts +2 -0
  6. package/dist/backends/anthropic.js +57 -0
  7. package/dist/backends/anthropic.js.map +1 -0
  8. package/dist/backends/google.d.ts +2 -0
  9. package/dist/backends/google.js +68 -0
  10. package/dist/backends/google.js.map +1 -0
  11. package/dist/backends/index.d.ts +3 -0
  12. package/dist/backends/index.js +47 -0
  13. package/dist/backends/index.js.map +1 -0
  14. package/dist/backends/ollama.d.ts +2 -0
  15. package/dist/backends/ollama.js +68 -0
  16. package/dist/backends/ollama.js.map +1 -0
  17. package/dist/backends/openai.d.ts +2 -0
  18. package/dist/backends/openai.js +62 -0
  19. package/dist/backends/openai.js.map +1 -0
  20. package/dist/backends/types.d.ts +1 -0
  21. package/dist/backends/types.js +2 -0
  22. package/dist/backends/types.js.map +1 -0
  23. package/dist/cli.d.ts +2 -0
  24. package/dist/cli.js +152 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/commands/config.d.ts +7 -0
  27. package/dist/commands/config.js +118 -0
  28. package/dist/commands/config.js.map +1 -0
  29. package/dist/commands/counsellor.d.ts +7 -0
  30. package/dist/commands/counsellor.js +98 -0
  31. package/dist/commands/counsellor.js.map +1 -0
  32. package/dist/commands/discuss.d.ts +12 -0
  33. package/dist/commands/discuss.js +154 -0
  34. package/dist/commands/discuss.js.map +1 -0
  35. package/dist/commands/history.d.ts +5 -0
  36. package/dist/commands/history.js +46 -0
  37. package/dist/commands/history.js.map +1 -0
  38. package/dist/commands/list.d.ts +5 -0
  39. package/dist/commands/list.js +40 -0
  40. package/dist/commands/list.js.map +1 -0
  41. package/dist/core/conversation-engine.d.ts +13 -0
  42. package/dist/core/conversation-engine.js +226 -0
  43. package/dist/core/conversation-engine.js.map +1 -0
  44. package/dist/core/counsellor-loader.d.ts +4 -0
  45. package/dist/core/counsellor-loader.js +97 -0
  46. package/dist/core/counsellor-loader.js.map +1 -0
  47. package/dist/core/counsellor-registry.d.ts +12 -0
  48. package/dist/core/counsellor-registry.js +131 -0
  49. package/dist/core/counsellor-registry.js.map +1 -0
  50. package/dist/core/excalidraw-cheatsheet.d.ts +5 -0
  51. package/dist/core/excalidraw-cheatsheet.js +65 -0
  52. package/dist/core/excalidraw-cheatsheet.js.map +1 -0
  53. package/dist/core/history.d.ts +16 -0
  54. package/dist/core/history.js +74 -0
  55. package/dist/core/history.js.map +1 -0
  56. package/dist/core/infographic.d.ts +4 -0
  57. package/dist/core/infographic.js +81 -0
  58. package/dist/core/infographic.js.map +1 -0
  59. package/dist/core/key-scanner.d.ts +8 -0
  60. package/dist/core/key-scanner.js +79 -0
  61. package/dist/core/key-scanner.js.map +1 -0
  62. package/dist/core/logger.d.ts +5 -0
  63. package/dist/core/logger.js +38 -0
  64. package/dist/core/logger.js.map +1 -0
  65. package/dist/core/output-formatter.d.ts +2 -0
  66. package/dist/core/output-formatter.js +47 -0
  67. package/dist/core/output-formatter.js.map +1 -0
  68. package/dist/core/secretary.d.ts +23 -0
  69. package/dist/core/secretary.js +171 -0
  70. package/dist/core/secretary.js.map +1 -0
  71. package/dist/core/skill-loader.d.ts +2 -0
  72. package/dist/core/skill-loader.js +32 -0
  73. package/dist/core/skill-loader.js.map +1 -0
  74. package/dist/electron/ipc-handlers.d.ts +3 -0
  75. package/dist/electron/ipc-handlers.js +477 -0
  76. package/dist/electron/ipc-handlers.js.map +1 -0
  77. package/dist/electron/main.d.ts +1 -0
  78. package/dist/electron/main.js +85 -0
  79. package/dist/electron/main.js.map +1 -0
  80. package/dist/electron/preload.d.ts +1 -0
  81. package/dist/electron/preload.js +38 -0
  82. package/dist/electron/preload.js.map +1 -0
  83. package/dist/types.d.ts +184 -0
  84. package/dist/types.js +12 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist-electron/main.js +1635 -0
  87. package/package.json +87 -0
  88. package/skills/council-manage/SKILL.md +214 -0
  89. package/skills/council-setup-keys/SKILL.md +127 -0
@@ -0,0 +1,477 @@
1
+ import { dialog, shell } from "electron";
2
+ import { readFile, writeFile, mkdir, rm } from "node:fs/promises";
3
+ import { execFile } from "node:child_process";
4
+ import { promisify } from "node:util";
5
+ import { join, basename } from "node:path";
6
+ import { homedir } from "node:os";
7
+ import matter from "gray-matter";
8
+ import { loadCounsellors } from "../core/counsellor-loader.js";
9
+ import { getRegisteredPaths, addLocalCounsellor, addRemoteCounsellor, removeCounsellor, } from "../core/counsellor-registry.js";
10
+ import { runConversation } from "../core/conversation-engine.js";
11
+ import { clearCaches } from "../backends/index.js";
12
+ import { saveToHistory, listHistory, getHistoryEntry, deleteHistoryEntry, addInfographicToHistory, deleteInfographicFromHistory } from "../core/history.js";
13
+ import { runSecretary, generateTitle } from "../core/secretary.js";
14
+ import { generateInfographic } from "../core/infographic.js";
15
+ import { log } from "../core/logger.js";
16
+ // Load dotenv for API keys
17
+ import "dotenv/config";
18
+ // Default base URLs for each backend
19
+ const DEFAULT_URLS = {
20
+ anthropic: "https://api.anthropic.com",
21
+ openai: "https://api.openai.com/v1",
22
+ google: "https://generativelanguage.googleapis.com",
23
+ ollama: "http://localhost:11434",
24
+ };
25
+ // Well-known models for backends that don't have a list endpoint
26
+ const KNOWN_ANTHROPIC_MODELS = [
27
+ "claude-opus-4-20250514",
28
+ "claude-sonnet-4-5-20250514",
29
+ "claude-sonnet-4-20250514",
30
+ "claude-haiku-4-20250414",
31
+ "claude-3-5-haiku-20241022",
32
+ ];
33
+ const KNOWN_GOOGLE_MODELS = [
34
+ "gemini-2.5-pro",
35
+ "gemini-2.5-flash",
36
+ "gemini-2.0-flash",
37
+ "gemini-2.0-flash-lite",
38
+ "gemini-1.5-pro",
39
+ "gemini-1.5-flash",
40
+ ];
41
+ async function probeBackend(name, config) {
42
+ try {
43
+ switch (name) {
44
+ case "ollama": {
45
+ const { Ollama } = await import("ollama");
46
+ const client = new Ollama({ host: config.baseUrl || DEFAULT_URLS.ollama });
47
+ const response = await client.list();
48
+ const models = response.models.map((m) => m.name).sort();
49
+ return { connected: true, models };
50
+ }
51
+ case "openai": {
52
+ const { default: OpenAI } = await import("openai");
53
+ const client = new OpenAI({
54
+ apiKey: config.apiKey || process.env.OPENAI_API_KEY,
55
+ ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),
56
+ });
57
+ const response = await client.models.list();
58
+ const models = response.data
59
+ .map((m) => m.id)
60
+ .filter((id) => id.startsWith("gpt-") || id.startsWith("o") || id.startsWith("chatgpt-"))
61
+ .sort();
62
+ return { connected: true, models };
63
+ }
64
+ case "anthropic": {
65
+ const { default: Anthropic } = await import("@anthropic-ai/sdk");
66
+ const client = new Anthropic({
67
+ apiKey: config.apiKey || process.env.ANTHROPIC_API_KEY,
68
+ ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),
69
+ });
70
+ // Anthropic has a models list endpoint
71
+ try {
72
+ const response = await client.models.list({ limit: 100 });
73
+ const models = response.data.map((m) => m.id).sort();
74
+ return { connected: true, models };
75
+ }
76
+ catch {
77
+ // Fall back to known models if list endpoint fails (e.g. older API)
78
+ return { connected: true, models: KNOWN_ANTHROPIC_MODELS };
79
+ }
80
+ }
81
+ case "google": {
82
+ const apiKey = config.apiKey || process.env.GOOGLE_API_KEY || "";
83
+ if (!apiKey)
84
+ return { connected: false, models: KNOWN_GOOGLE_MODELS, error: "No API key" };
85
+ // Use REST API to list models — the SDK doesn't expose listModels
86
+ const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`);
87
+ if (!res.ok) {
88
+ const body = await res.json().catch(() => ({}));
89
+ const msg = body?.error?.message || `HTTP ${res.status}`;
90
+ return { connected: false, models: KNOWN_GOOGLE_MODELS, error: msg };
91
+ }
92
+ const data = (await res.json());
93
+ const models = (data.models || [])
94
+ .filter((m) => m.name.includes("gemini") && m.supportedGenerationMethods?.includes("generateContent"))
95
+ .map((m) => m.name.replace("models/", ""))
96
+ .sort();
97
+ return { connected: true, models: models.length > 0 ? models : KNOWN_GOOGLE_MODELS };
98
+ }
99
+ default:
100
+ return { connected: false, models: [], error: `Unknown backend: ${name}` };
101
+ }
102
+ }
103
+ catch (err) {
104
+ const error = err instanceof Error ? err.message : String(err);
105
+ // Return known models even on connection failure so the UI can still show options
106
+ const fallbackModels = name === "anthropic" ? KNOWN_ANTHROPIC_MODELS
107
+ : name === "google" ? KNOWN_GOOGLE_MODELS
108
+ : [];
109
+ return { connected: false, models: fallbackModels, error };
110
+ }
111
+ }
112
+ let activeAbortController = null;
113
+ let injectionBuffer = [];
114
+ export function registerIpcHandlers(ipcMain, getWindow) {
115
+ // --- Counsellor CRUD ---
116
+ ipcMain.handle("counsellors:list", async (_event, councilDir) => {
117
+ const configPath = join(homedir(), ".ai-council", "config.json");
118
+ let config = { backends: {} };
119
+ try {
120
+ const raw = await readFile(configPath, "utf-8");
121
+ config = JSON.parse(raw);
122
+ }
123
+ catch { /* no config */ }
124
+ const registeredPaths = getRegisteredPaths(config);
125
+ const registry = config.counsellors ?? {};
126
+ const counsellors = await loadCounsellors(councilDir, registeredPaths);
127
+ return counsellors.map((c) => {
128
+ const regEntry = registry[c.id];
129
+ return {
130
+ id: c.id,
131
+ dirPath: c.dirPath,
132
+ name: c.frontmatter.name,
133
+ description: c.frontmatter.description,
134
+ backend: c.frontmatter.backend,
135
+ model: c.frontmatter.model,
136
+ temperature: c.frontmatter.temperature,
137
+ interests: c.frontmatter.interests,
138
+ avatarUrl: c.avatarUrl,
139
+ source: regEntry?.source,
140
+ registryUrl: regEntry?.url,
141
+ };
142
+ });
143
+ });
144
+ ipcMain.handle("counsellors:get", async (_event, dirPath) => {
145
+ const aboutPath = join(dirPath, "ABOUT.md");
146
+ const raw = await readFile(aboutPath, "utf-8");
147
+ const { data, content } = matter(raw);
148
+ return { frontmatter: data, body: content.trim(), raw };
149
+ });
150
+ ipcMain.handle("counsellors:save", async (_event, dirPath, aboutMd) => {
151
+ const aboutPath = join(dirPath, "ABOUT.md");
152
+ await writeFile(aboutPath, aboutMd, "utf-8");
153
+ return { success: true };
154
+ });
155
+ ipcMain.handle("counsellors:create", async (_event, councilDir, id, aboutMd) => {
156
+ const dirPath = join(councilDir, id);
157
+ await mkdir(dirPath, { recursive: true });
158
+ await writeFile(join(dirPath, "ABOUT.md"), aboutMd, "utf-8");
159
+ return { success: true, dirPath };
160
+ });
161
+ ipcMain.handle("counsellors:delete", async (_event, dirPath) => {
162
+ await rm(dirPath, { recursive: true, force: true });
163
+ return { success: true };
164
+ });
165
+ // --- Config ---
166
+ ipcMain.handle("config:get", async () => {
167
+ const configPath = join(homedir(), ".ai-council", "config.json");
168
+ let config = { backends: {} };
169
+ try {
170
+ const raw = await readFile(configPath, "utf-8");
171
+ config = JSON.parse(raw);
172
+ }
173
+ catch {
174
+ // No config file yet
175
+ }
176
+ const envStatus = {
177
+ ANTHROPIC_API_KEY: !!process.env.ANTHROPIC_API_KEY,
178
+ OPENAI_API_KEY: !!process.env.OPENAI_API_KEY,
179
+ GOOGLE_API_KEY: !!process.env.GOOGLE_API_KEY,
180
+ };
181
+ const suffix = (key) => key ? "..." + key.slice(-4) : undefined;
182
+ const envKeySuffix = {
183
+ ANTHROPIC_API_KEY: suffix(process.env.ANTHROPIC_API_KEY),
184
+ OPENAI_API_KEY: suffix(process.env.OPENAI_API_KEY),
185
+ GOOGLE_API_KEY: suffix(process.env.GOOGLE_API_KEY),
186
+ };
187
+ return { config, envStatus, envKeySuffix, defaultUrls: DEFAULT_URLS };
188
+ });
189
+ ipcMain.handle("backend:probe", async (_event, name, config) => {
190
+ return probeBackend(name, config);
191
+ });
192
+ ipcMain.handle("config:save", async (_event, config) => {
193
+ const configDir = join(homedir(), ".ai-council");
194
+ await mkdir(configDir, { recursive: true });
195
+ await writeFile(join(configDir, "config.json"), JSON.stringify(config, null, 2), "utf-8");
196
+ clearCaches();
197
+ return { success: true };
198
+ });
199
+ // --- Discussion ---
200
+ ipcMain.handle("discussion:start", async (_event, params) => {
201
+ const win = getWindow();
202
+ if (!win)
203
+ return { error: "No window" };
204
+ if (activeAbortController) {
205
+ activeAbortController.abort();
206
+ }
207
+ activeAbortController = new AbortController();
208
+ injectionBuffer = [];
209
+ const configPath = join(homedir(), ".ai-council", "config.json");
210
+ let config = { backends: {} };
211
+ try {
212
+ const raw = await readFile(configPath, "utf-8");
213
+ config = JSON.parse(raw);
214
+ }
215
+ catch { /* no config */ }
216
+ const registeredPaths = getRegisteredPaths(config);
217
+ const allCounsellors = await loadCounsellors(params.councilDir, registeredPaths);
218
+ const counsellors = params.counsellorIds?.length
219
+ ? allCounsellors.filter((c) => params.counsellorIds.includes(c.id))
220
+ : allCounsellors;
221
+ if (counsellors.length === 0) {
222
+ win.webContents.send("discussion:event", { type: "error", counsellorName: "", error: "No counsellors found" });
223
+ return;
224
+ }
225
+ const send = (event) => {
226
+ if (!win.isDestroyed()) {
227
+ win.webContents.send("discussion:event", event);
228
+ }
229
+ };
230
+ const beforeTurn = async () => {
231
+ if (injectionBuffer.length === 0)
232
+ return null;
233
+ const content = injectionBuffer.shift();
234
+ return {
235
+ round: 0,
236
+ counsellorId: "__user__",
237
+ counsellorName: "You",
238
+ content,
239
+ timestamp: new Date().toISOString(),
240
+ model: "human",
241
+ backend: "human",
242
+ };
243
+ };
244
+ const opts = {
245
+ topic: params.topic,
246
+ topicSource: params.topicSource,
247
+ counsellors,
248
+ rounds: params.rounds,
249
+ onEvent: send,
250
+ beforeTurn,
251
+ signal: activeAbortController.signal,
252
+ mode: params.mode,
253
+ config,
254
+ };
255
+ try {
256
+ const result = await runConversation(opts);
257
+ // Run secretary if configured
258
+ if (config.secretary?.backend) {
259
+ try {
260
+ send({ type: "summary_start" });
261
+ const secretaryResult = await runSecretary({
262
+ result,
263
+ config,
264
+ onChunk: (delta) => {
265
+ send({ type: "summary_chunk", delta });
266
+ },
267
+ signal: activeAbortController?.signal,
268
+ });
269
+ result.summary = secretaryResult.text;
270
+ if (secretaryResult.diagram) {
271
+ result.diagram = secretaryResult.diagram;
272
+ }
273
+ send({ type: "summary_complete", summary: secretaryResult.text, diagram: secretaryResult.diagram });
274
+ }
275
+ catch (err) {
276
+ log.error("ipc:discussion", "Secretary summary failed", err);
277
+ send({ type: "error", counsellorName: "Secretary", error: err instanceof Error ? err.message : String(err) });
278
+ }
279
+ }
280
+ // Generate title if secretary is configured
281
+ if (config.secretary?.backend) {
282
+ try {
283
+ const firstRoundTurns = result.turns.filter((t) => t.round === 1);
284
+ const title = await generateTitle({
285
+ topic: result.topic,
286
+ firstRoundTurns,
287
+ config,
288
+ });
289
+ result.title = title;
290
+ send({ type: "title_generated", title });
291
+ }
292
+ catch (err) {
293
+ log.error("ipc:discussion", "Title generation failed", err);
294
+ }
295
+ }
296
+ // Generate infographics if requested
297
+ if (params.infographicBackends?.length) {
298
+ for (const backend of params.infographicBackends) {
299
+ try {
300
+ send({ type: "infographic_start" });
301
+ const infographicData = await generateInfographic(result, config, backend);
302
+ if (!result.infographics)
303
+ result.infographics = [];
304
+ result.infographics.push(infographicData);
305
+ send({ type: "infographic_complete", infographic: infographicData });
306
+ }
307
+ catch (err) {
308
+ log.error("ipc:discussion", `Infographic generation failed (${backend})`, err);
309
+ send({ type: "infographic_error", error: err instanceof Error ? err.message : String(err) });
310
+ }
311
+ }
312
+ }
313
+ send({ type: "complete", result });
314
+ try {
315
+ await saveToHistory(result);
316
+ }
317
+ catch (err) {
318
+ log.error("ipc:discussion", "Failed to save to history", err);
319
+ }
320
+ }
321
+ catch (err) {
322
+ log.error("ipc:discussion", "Discussion failed", err);
323
+ send({ type: "error", counsellorName: "", error: err instanceof Error ? err.message : String(err) });
324
+ }
325
+ finally {
326
+ activeAbortController = null;
327
+ }
328
+ });
329
+ ipcMain.handle("discussion:stop", async () => {
330
+ if (activeAbortController) {
331
+ activeAbortController.abort();
332
+ activeAbortController = null;
333
+ }
334
+ return { success: true };
335
+ });
336
+ ipcMain.handle("discussion:inject", async (_event, content) => {
337
+ injectionBuffer.push(content);
338
+ return { success: true };
339
+ });
340
+ // --- Counsellor Registry ---
341
+ ipcMain.handle("registry:add-local", async (_event, dirPath) => {
342
+ return addLocalCounsellor(dirPath);
343
+ });
344
+ ipcMain.handle("registry:add-remote", async (_event, url) => {
345
+ return addRemoteCounsellor(url);
346
+ });
347
+ ipcMain.handle("registry:remove", async (_event, id, deleteFiles) => {
348
+ await removeCounsellor(id, deleteFiles);
349
+ return { success: true };
350
+ });
351
+ // --- Open-with ---
352
+ ipcMain.handle("shell:open-in-finder", async (_event, dirPath) => {
353
+ shell.showItemInFolder(join(dirPath, "ABOUT.md"));
354
+ });
355
+ ipcMain.handle("shell:open-in-terminal", async (_event, dirPath) => {
356
+ const execFileAsync = promisify(execFile);
357
+ // macOS: open Terminal.app at the directory
358
+ await execFileAsync("open", ["-a", "Terminal", dirPath]);
359
+ });
360
+ ipcMain.handle("shell:open-in-editor", async (_event, dirPath) => {
361
+ const execFileAsync = promisify(execFile);
362
+ // Try VS Code first, fall back to system open
363
+ try {
364
+ await execFileAsync("code", [dirPath]);
365
+ }
366
+ catch {
367
+ shell.openPath(dirPath);
368
+ }
369
+ });
370
+ // --- History ---
371
+ ipcMain.handle("history:list", async () => listHistory());
372
+ ipcMain.handle("history:get", async (_event, id) => getHistoryEntry(id));
373
+ ipcMain.handle("history:delete", async (_event, id) => {
374
+ await deleteHistoryEntry(id);
375
+ return { success: true };
376
+ });
377
+ ipcMain.handle("infographic:generate", async (_event, historyId, backend) => {
378
+ const configPath = join(homedir(), ".ai-council", "config.json");
379
+ let config = { backends: {} };
380
+ try {
381
+ const raw = await readFile(configPath, "utf-8");
382
+ config = JSON.parse(raw);
383
+ }
384
+ catch { /* no config */ }
385
+ const result = await getHistoryEntry(historyId);
386
+ const infographicData = await generateInfographic(result, config, backend);
387
+ await addInfographicToHistory(historyId, infographicData);
388
+ return { infographic: infographicData };
389
+ });
390
+ ipcMain.handle("infographic:delete", async (_event, historyId, index) => {
391
+ await deleteInfographicFromHistory(historyId, index);
392
+ return { success: true };
393
+ });
394
+ // --- File reading for attachments ---
395
+ ipcMain.handle("file:read-as-text", async (_event, filePath) => {
396
+ const name = basename(filePath);
397
+ const ext = name.includes(".") ? "." + name.split(".").pop().toLowerCase() : "";
398
+ const textExtensions = new Set([
399
+ ".txt", ".md", ".csv", ".json", ".yaml", ".yml", ".xml", ".html", ".htm",
400
+ ".js", ".ts", ".jsx", ".tsx", ".py", ".rb", ".go", ".rs", ".java", ".c",
401
+ ".cpp", ".h", ".hpp", ".css", ".scss", ".less", ".sql", ".sh", ".bash",
402
+ ".zsh", ".env", ".toml", ".ini", ".cfg", ".conf", ".log", ".svg",
403
+ ]);
404
+ // Formats that markitdown can convert to text/markdown
405
+ const markitdownExtensions = new Set([
406
+ ".pdf", ".docx", ".pptx", ".xlsx", ".xls", ".doc", ".ppt",
407
+ ".epub", ".rtf",
408
+ ]);
409
+ // Plain text files — read directly
410
+ if (textExtensions.has(ext)) {
411
+ try {
412
+ const content = await readFile(filePath, "utf-8");
413
+ return { name, content };
414
+ }
415
+ catch (err) {
416
+ return { name, content: `[Error reading file: ${err instanceof Error ? err.message : String(err)}]` };
417
+ }
418
+ }
419
+ // Rich document files — convert via markitdown
420
+ if (markitdownExtensions.has(ext)) {
421
+ const execFileAsync = promisify(execFile);
422
+ try {
423
+ const { stdout } = await execFileAsync("markitdown", [filePath], {
424
+ timeout: 30_000,
425
+ maxBuffer: 10 * 1024 * 1024, // 10 MB
426
+ });
427
+ return { name, content: stdout };
428
+ }
429
+ catch (err) {
430
+ const msg = err instanceof Error ? err.message : String(err);
431
+ if (msg.includes("ENOENT")) {
432
+ return {
433
+ name,
434
+ content: `[Cannot convert ${ext} file: markitdown is not installed. Run: pip install 'markitdown[all]']`,
435
+ };
436
+ }
437
+ return { name, content: `[Error converting file: ${msg}]` };
438
+ }
439
+ }
440
+ return { name, content: `[Unsupported file type: ${name}]` };
441
+ });
442
+ // --- Markitdown tool ---
443
+ ipcMain.handle("markitdown:check", async () => {
444
+ const execFileAsync = promisify(execFile);
445
+ try {
446
+ const { stdout } = await execFileAsync("markitdown", ["--version"], { timeout: 5_000 });
447
+ return { installed: true, version: stdout.trim() };
448
+ }
449
+ catch {
450
+ return { installed: false };
451
+ }
452
+ });
453
+ ipcMain.handle("markitdown:install", async () => {
454
+ const execFileAsync = promisify(execFile);
455
+ try {
456
+ await execFileAsync("pip", ["install", "markitdown[all]"], {
457
+ timeout: 120_000,
458
+ maxBuffer: 10 * 1024 * 1024,
459
+ });
460
+ return { success: true };
461
+ }
462
+ catch (err) {
463
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
464
+ }
465
+ });
466
+ // --- Dialog ---
467
+ ipcMain.handle("dialog:selectDirectory", async () => {
468
+ const win = getWindow();
469
+ if (!win)
470
+ return null;
471
+ const result = await dialog.showOpenDialog(win, {
472
+ properties: ["openDirectory"],
473
+ });
474
+ return result.canceled ? null : result.filePaths[0];
475
+ });
476
+ }
477
+ //# sourceMappingURL=ipc-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-handlers.js","sourceRoot":"","sources":["../../src/electron/ipc-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,85 @@
1
+ import { app, BrowserWindow, ipcMain, protocol, net } from "electron";
2
+ import { join, dirname } from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { appendFileSync, writeFileSync } from "node:fs";
5
+ import { registerIpcHandlers } from "./ipc-handlers.js";
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ const logFile = join(__dirname, "..", "electron-debug.log");
9
+ function log(source, ...args) {
10
+ const line = `[${new Date().toISOString()}] [${source}] ${args.map((a) => (typeof a === "string" ? a : JSON.stringify(a))).join(" ")}\n`;
11
+ appendFileSync(logFile, line);
12
+ }
13
+ // Clear log on startup
14
+ writeFileSync(logFile, `=== AI Council Electron — started ${new Date().toISOString()} ===\n`);
15
+ let mainWindow = null;
16
+ function createWindow() {
17
+ log("main", "Creating BrowserWindow");
18
+ mainWindow = new BrowserWindow({
19
+ width: 1200,
20
+ height: 800,
21
+ minWidth: 800,
22
+ minHeight: 600,
23
+ title: "AI Council",
24
+ webPreferences: {
25
+ contextIsolation: true,
26
+ nodeIntegration: false,
27
+ preload: join(__dirname, "preload.mjs"),
28
+ },
29
+ });
30
+ // Capture renderer console messages
31
+ mainWindow.webContents.on("console-message", (_event, level, message, line, sourceId) => {
32
+ const levelName = ["DEBUG", "INFO", "WARN", "ERROR"][level] || "LOG";
33
+ log(`renderer:${levelName}`, `${message} (${sourceId}:${line})`);
34
+ });
35
+ // Capture renderer crashes
36
+ mainWindow.webContents.on("render-process-gone", (_event, details) => {
37
+ log("main:CRASH", "Renderer process gone:", details);
38
+ });
39
+ // Capture page errors
40
+ mainWindow.webContents.on("did-fail-load", (_event, errorCode, errorDescription) => {
41
+ log("main:LOAD_ERROR", `Failed to load: ${errorCode} ${errorDescription}`);
42
+ });
43
+ const url = process.env.VITE_DEV_SERVER_URL;
44
+ if (url) {
45
+ log("main", `Loading dev server URL: ${url}`);
46
+ mainWindow.loadURL(url);
47
+ }
48
+ else {
49
+ const filePath = join(__dirname, "../dist-renderer/index.html");
50
+ log("main", `Loading file: ${filePath}`);
51
+ mainWindow.loadFile(filePath);
52
+ }
53
+ // Open DevTools in dev mode
54
+ if (process.env.VITE_DEV_SERVER_URL) {
55
+ mainWindow.webContents.openDevTools();
56
+ }
57
+ mainWindow.on("closed", () => {
58
+ mainWindow = null;
59
+ });
60
+ }
61
+ // Register custom protocol to serve local files (file:// is blocked when loaded via http dev server)
62
+ protocol.registerSchemesAsPrivileged([
63
+ { scheme: "council-file", privileges: { bypassCSP: true, supportFetchAPI: true } },
64
+ ]);
65
+ app.whenReady().then(() => {
66
+ log("main", "App ready, registering IPC handlers");
67
+ // Handle council-file:// URLs by mapping them to local files
68
+ protocol.handle("council-file", (request) => {
69
+ const filePath = decodeURIComponent(request.url.replace("council-file://", ""));
70
+ return net.fetch(pathToFileURL(filePath).href);
71
+ });
72
+ registerIpcHandlers(ipcMain, () => mainWindow);
73
+ createWindow();
74
+ app.on("activate", () => {
75
+ if (BrowserWindow.getAllWindows().length === 0) {
76
+ createWindow();
77
+ }
78
+ });
79
+ });
80
+ app.on("window-all-closed", () => {
81
+ if (process.platform !== "darwin") {
82
+ app.quit();
83
+ }
84
+ });
85
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/electron/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { contextBridge, ipcRenderer } from "electron";
2
+ const councilAPI = {
3
+ listCounsellors: (councilDir) => ipcRenderer.invoke("counsellors:list", councilDir),
4
+ getCounsellor: (dirPath) => ipcRenderer.invoke("counsellors:get", dirPath),
5
+ saveCounsellor: (dirPath, aboutMd) => ipcRenderer.invoke("counsellors:save", dirPath, aboutMd),
6
+ createCounsellor: (councilDir, id, aboutMd) => ipcRenderer.invoke("counsellors:create", councilDir, id, aboutMd),
7
+ deleteCounsellor: (dirPath) => ipcRenderer.invoke("counsellors:delete", dirPath),
8
+ getConfig: () => ipcRenderer.invoke("config:get"),
9
+ saveConfig: (config) => ipcRenderer.invoke("config:save", config),
10
+ probeBackend: (name, config) => ipcRenderer.invoke("backend:probe", name, config),
11
+ startDiscussion: (params) => ipcRenderer.invoke("discussion:start", params),
12
+ stopDiscussion: () => ipcRenderer.invoke("discussion:stop"),
13
+ injectMessage: (content) => ipcRenderer.invoke("discussion:inject", content),
14
+ onDiscussionEvent: (callback) => {
15
+ const handler = (_event, data) => callback(data);
16
+ ipcRenderer.on("discussion:event", handler);
17
+ return () => {
18
+ ipcRenderer.removeListener("discussion:event", handler);
19
+ };
20
+ },
21
+ listHistory: () => ipcRenderer.invoke("history:list"),
22
+ getHistoryEntry: (id) => ipcRenderer.invoke("history:get", id),
23
+ deleteHistoryEntry: (id) => ipcRenderer.invoke("history:delete", id),
24
+ selectDirectory: () => ipcRenderer.invoke("dialog:selectDirectory"),
25
+ openInFinder: (dirPath) => ipcRenderer.invoke("shell:open-in-finder", dirPath),
26
+ openInTerminal: (dirPath) => ipcRenderer.invoke("shell:open-in-terminal", dirPath),
27
+ openInEditor: (dirPath) => ipcRenderer.invoke("shell:open-in-editor", dirPath),
28
+ registryAddLocal: (dirPath) => ipcRenderer.invoke("registry:add-local", dirPath),
29
+ registryAddRemote: (url) => ipcRenderer.invoke("registry:add-remote", url),
30
+ registryRemove: (id, deleteFiles) => ipcRenderer.invoke("registry:remove", id, deleteFiles),
31
+ readFileAsText: (filePath) => ipcRenderer.invoke("file:read-as-text", filePath),
32
+ checkMarkitdown: () => ipcRenderer.invoke("markitdown:check"),
33
+ installMarkitdown: () => ipcRenderer.invoke("markitdown:install"),
34
+ generateInfographic: (historyId, backend) => ipcRenderer.invoke("infographic:generate", historyId, backend),
35
+ deleteInfographic: (historyId, index) => ipcRenderer.invoke("infographic:delete", historyId, index),
36
+ };
37
+ contextBridge.exposeInMainWorld("councilAPI", councilAPI);
38
+ //# sourceMappingURL=preload.js.map