cowork-os 0.3.21 → 0.3.25

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 (252) hide show
  1. package/README.md +372 -10
  2. package/connectors/README.md +20 -0
  3. package/connectors/asana-mcp/README.md +24 -0
  4. package/connectors/asana-mcp/dist/index.js +427 -0
  5. package/connectors/asana-mcp/package.json +15 -0
  6. package/connectors/asana-mcp/src/index.ts +553 -0
  7. package/connectors/asana-mcp/tsconfig.json +13 -0
  8. package/connectors/hubspot-mcp/README.md +35 -0
  9. package/connectors/hubspot-mcp/dist/index.js +454 -0
  10. package/connectors/hubspot-mcp/package.json +15 -0
  11. package/connectors/hubspot-mcp/src/index.ts +562 -0
  12. package/connectors/hubspot-mcp/tsconfig.json +13 -0
  13. package/connectors/jira-mcp/README.md +49 -0
  14. package/connectors/jira-mcp/dist/index.js +588 -0
  15. package/connectors/jira-mcp/package.json +15 -0
  16. package/connectors/jira-mcp/src/index.ts +711 -0
  17. package/connectors/jira-mcp/tsconfig.json +13 -0
  18. package/connectors/linear-mcp/README.md +22 -0
  19. package/connectors/linear-mcp/dist/index.js +402 -0
  20. package/connectors/linear-mcp/package.json +15 -0
  21. package/connectors/linear-mcp/src/index.ts +522 -0
  22. package/connectors/linear-mcp/tsconfig.json +13 -0
  23. package/connectors/okta-mcp/README.md +24 -0
  24. package/connectors/okta-mcp/dist/index.js +411 -0
  25. package/connectors/okta-mcp/package.json +15 -0
  26. package/connectors/okta-mcp/src/index.ts +520 -0
  27. package/connectors/okta-mcp/tsconfig.json +13 -0
  28. package/connectors/salesforce-mcp/README.md +47 -0
  29. package/connectors/salesforce-mcp/dist/index.js +584 -0
  30. package/connectors/salesforce-mcp/package.json +15 -0
  31. package/connectors/salesforce-mcp/src/index.ts +722 -0
  32. package/connectors/salesforce-mcp/tsconfig.json +13 -0
  33. package/connectors/servicenow-mcp/README.md +26 -0
  34. package/connectors/servicenow-mcp/dist/index.js +400 -0
  35. package/connectors/servicenow-mcp/package.json +15 -0
  36. package/connectors/servicenow-mcp/src/index.ts +500 -0
  37. package/connectors/servicenow-mcp/tsconfig.json +13 -0
  38. package/connectors/templates/mcp-connector/README.md +31 -0
  39. package/connectors/templates/mcp-connector/package.json +15 -0
  40. package/connectors/templates/mcp-connector/src/index.ts +330 -0
  41. package/connectors/templates/mcp-connector/tsconfig.json +13 -0
  42. package/connectors/zendesk-mcp/README.md +40 -0
  43. package/connectors/zendesk-mcp/dist/index.js +431 -0
  44. package/connectors/zendesk-mcp/package.json +15 -0
  45. package/connectors/zendesk-mcp/src/index.ts +543 -0
  46. package/connectors/zendesk-mcp/tsconfig.json +13 -0
  47. package/dist/electron/electron/agent/custom-skill-loader.js +31 -1
  48. package/dist/electron/electron/agent/daemon.js +189 -13
  49. package/dist/electron/electron/agent/executor.js +895 -78
  50. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  51. package/dist/electron/electron/agent/llm/azure-openai-provider.js +328 -0
  52. package/dist/electron/electron/agent/llm/bedrock-provider.js +49 -9
  53. package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
  54. package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
  55. package/dist/electron/electron/agent/llm/index.js +13 -1
  56. package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
  57. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
  58. package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
  59. package/dist/electron/electron/agent/llm/openai-oauth.js +2 -1
  60. package/dist/electron/electron/agent/llm/openrouter-provider.js +1 -1
  61. package/dist/electron/electron/agent/llm/provider-factory.js +350 -4
  62. package/dist/electron/electron/agent/llm/types.js +66 -1
  63. package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
  64. package/dist/electron/electron/agent/search/provider-factory.js +38 -2
  65. package/dist/electron/electron/agent/tools/box-tools.js +231 -0
  66. package/dist/electron/electron/agent/tools/builtin-settings.js +28 -0
  67. package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
  68. package/dist/electron/electron/agent/tools/file-tools.js +66 -3
  69. package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
  70. package/dist/electron/electron/agent/tools/grep-tools.js +90 -10
  71. package/dist/electron/electron/agent/tools/image-tools.js +11 -1
  72. package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
  73. package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
  74. package/dist/electron/electron/agent/tools/registry.js +548 -10
  75. package/dist/electron/electron/agent/tools/search-tools.js +28 -10
  76. package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
  77. package/dist/electron/electron/agent/tools/shell-tools.js +12 -3
  78. package/dist/electron/electron/agent/tools/x-tools.js +1 -1
  79. package/dist/electron/electron/agents/agent-dispatch.js +63 -0
  80. package/dist/electron/electron/database/repositories.js +19 -5
  81. package/dist/electron/electron/database/schema.js +8 -0
  82. package/dist/electron/electron/gateway/channels/whatsapp.js +55 -0
  83. package/dist/electron/electron/gateway/index.js +75 -1
  84. package/dist/electron/electron/gateway/router.js +209 -154
  85. package/dist/electron/electron/ipc/canvas-handlers.js +5 -0
  86. package/dist/electron/electron/ipc/handlers.js +763 -267
  87. package/dist/electron/electron/main.js +63 -0
  88. package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
  89. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +503 -154
  90. package/dist/electron/electron/memory/MemoryService.js +2 -1
  91. package/dist/electron/electron/preload.js +78 -1
  92. package/dist/electron/electron/settings/appearance-manager.js +18 -1
  93. package/dist/electron/electron/settings/box-manager.js +54 -0
  94. package/dist/electron/electron/settings/dropbox-manager.js +54 -0
  95. package/dist/electron/electron/settings/google-drive-manager.js +54 -0
  96. package/dist/electron/electron/settings/notion-manager.js +56 -0
  97. package/dist/electron/electron/settings/onedrive-manager.js +54 -0
  98. package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
  99. package/dist/electron/electron/utils/box-api.js +153 -0
  100. package/dist/electron/electron/utils/dropbox-api.js +144 -0
  101. package/dist/electron/electron/utils/env-migration.js +19 -0
  102. package/dist/electron/electron/utils/google-drive-api.js +152 -0
  103. package/dist/electron/electron/utils/notion-api.js +103 -0
  104. package/dist/electron/electron/utils/onedrive-api.js +113 -0
  105. package/dist/electron/electron/utils/sharepoint-api.js +109 -0
  106. package/dist/electron/electron/utils/validation.js +98 -3
  107. package/dist/electron/electron/utils/x-cli.js +1 -1
  108. package/dist/electron/shared/channelMessages.js +284 -3
  109. package/dist/electron/shared/llm-provider-catalog.js +198 -0
  110. package/dist/electron/shared/types.js +90 -1
  111. package/package.json +14 -3
  112. package/resources/skills/nano-banana-pro.json +4 -4
  113. package/resources/skills/openai-image-gen.json +3 -3
  114. package/resources/skills/scripts/gen.py +163 -0
  115. package/resources/skills/scripts/generate_image.py +91 -0
  116. package/src/electron/agent/custom-skill-loader.ts +34 -1
  117. package/src/electron/agent/daemon.ts +210 -14
  118. package/src/electron/agent/executor.ts +1124 -85
  119. package/src/electron/agent/llm/anthropic-compatible-provider.ts +214 -0
  120. package/src/electron/agent/llm/azure-openai-provider.ts +388 -0
  121. package/src/electron/agent/llm/bedrock-provider.ts +62 -9
  122. package/src/electron/agent/llm/github-copilot-provider.ts +117 -0
  123. package/src/electron/agent/llm/groq-provider.ts +39 -0
  124. package/src/electron/agent/llm/index.ts +6 -0
  125. package/src/electron/agent/llm/kimi-provider.ts +39 -0
  126. package/src/electron/agent/llm/openai-compatible-provider.ts +153 -0
  127. package/src/electron/agent/llm/openai-compatible.ts +133 -0
  128. package/src/electron/agent/llm/openai-oauth.ts +2 -1
  129. package/src/electron/agent/llm/openrouter-provider.ts +2 -1
  130. package/src/electron/agent/llm/provider-factory.ts +459 -6
  131. package/src/electron/agent/llm/types.ts +95 -1
  132. package/src/electron/agent/llm/xai-provider.ts +39 -0
  133. package/src/electron/agent/search/provider-factory.ts +43 -2
  134. package/src/electron/agent/tools/box-tools.ts +239 -0
  135. package/src/electron/agent/tools/builtin-settings.ts +36 -0
  136. package/src/electron/agent/tools/dropbox-tools.ts +237 -0
  137. package/src/electron/agent/tools/file-tools.ts +66 -3
  138. package/src/electron/agent/tools/gmail-tools.ts +240 -0
  139. package/src/electron/agent/tools/google-calendar-tools.ts +258 -0
  140. package/src/electron/agent/tools/google-drive-tools.ts +228 -0
  141. package/src/electron/agent/tools/grep-tools.ts +97 -12
  142. package/src/electron/agent/tools/image-tools.ts +11 -1
  143. package/src/electron/agent/tools/notion-tools.ts +330 -0
  144. package/src/electron/agent/tools/onedrive-tools.ts +217 -0
  145. package/src/electron/agent/tools/registry.ts +794 -10
  146. package/src/electron/agent/tools/search-tools.ts +29 -11
  147. package/src/electron/agent/tools/sharepoint-tools.ts +247 -0
  148. package/src/electron/agent/tools/shell-tools.ts +11 -3
  149. package/src/electron/agent/tools/x-tools.ts +1 -1
  150. package/src/electron/agents/agent-dispatch.ts +79 -0
  151. package/src/electron/database/SecureSettingsRepository.ts +7 -1
  152. package/src/electron/database/repositories.ts +58 -6
  153. package/src/electron/database/schema.ts +8 -0
  154. package/src/electron/gateway/channels/discord.ts +4 -0
  155. package/src/electron/gateway/channels/google-chat.ts +3 -0
  156. package/src/electron/gateway/channels/line.ts +3 -0
  157. package/src/electron/gateway/channels/matrix-client.ts +15 -0
  158. package/src/electron/gateway/channels/matrix.ts +31 -0
  159. package/src/electron/gateway/channels/mattermost.ts +3 -0
  160. package/src/electron/gateway/channels/signal.ts +3 -0
  161. package/src/electron/gateway/channels/slack.ts +9 -4
  162. package/src/electron/gateway/channels/teams.ts +4 -0
  163. package/src/electron/gateway/channels/telegram.ts +2 -0
  164. package/src/electron/gateway/channels/twitch.ts +2 -0
  165. package/src/electron/gateway/channels/types.ts +8 -0
  166. package/src/electron/gateway/channels/whatsapp.ts +66 -0
  167. package/src/electron/gateway/index.ts +95 -2
  168. package/src/electron/gateway/router.ts +231 -161
  169. package/src/electron/gateway/security.ts +21 -9
  170. package/src/electron/ipc/canvas-handlers.ts +10 -0
  171. package/src/electron/ipc/handlers.ts +848 -292
  172. package/src/electron/main.ts +35 -0
  173. package/src/electron/mcp/oauth/connector-oauth.ts +448 -0
  174. package/src/electron/mcp/registry/MCPRegistryManager.ts +343 -12
  175. package/src/electron/memory/MemoryService.ts +7 -1
  176. package/src/electron/preload.ts +200 -5
  177. package/src/electron/settings/appearance-manager.ts +20 -2
  178. package/src/electron/settings/box-manager.ts +58 -0
  179. package/src/electron/settings/dropbox-manager.ts +58 -0
  180. package/src/electron/settings/google-workspace-manager.ts +59 -0
  181. package/src/electron/settings/notion-manager.ts +60 -0
  182. package/src/electron/settings/onedrive-manager.ts +58 -0
  183. package/src/electron/settings/sharepoint-manager.ts +58 -0
  184. package/src/electron/utils/box-api.ts +184 -0
  185. package/src/electron/utils/dropbox-api.ts +171 -0
  186. package/src/electron/utils/env-migration.ts +22 -0
  187. package/src/electron/utils/gmail-api.ts +121 -0
  188. package/src/electron/utils/google-calendar-api.ts +115 -0
  189. package/src/electron/utils/google-workspace-api.ts +228 -0
  190. package/src/electron/utils/google-workspace-auth.ts +109 -0
  191. package/src/electron/utils/google-workspace-oauth.ts +232 -0
  192. package/src/electron/utils/notion-api.ts +126 -0
  193. package/src/electron/utils/onedrive-api.ts +137 -0
  194. package/src/electron/utils/sharepoint-api.ts +132 -0
  195. package/src/electron/utils/validation.ts +128 -1
  196. package/src/electron/utils/x-cli.ts +1 -1
  197. package/src/renderer/App.tsx +119 -8
  198. package/src/renderer/components/ActivityFeedItem.tsx +34 -17
  199. package/src/renderer/components/AgentWorkingStatePanel.tsx +7 -5
  200. package/src/renderer/components/AppearanceSettings.tsx +37 -2
  201. package/src/renderer/components/BlueBubblesSettings.tsx +18 -7
  202. package/src/renderer/components/BoxSettings.tsx +203 -0
  203. package/src/renderer/components/BrowserView.tsx +101 -0
  204. package/src/renderer/components/BuiltinToolsSettings.tsx +105 -0
  205. package/src/renderer/components/CanvasPreview.tsx +68 -1
  206. package/src/renderer/components/ConnectorEnvModal.tsx +116 -0
  207. package/src/renderer/components/ConnectorSetupModal.tsx +566 -0
  208. package/src/renderer/components/ConnectorsSettings.tsx +397 -0
  209. package/src/renderer/components/ControlPlaneSettings.tsx +2 -0
  210. package/src/renderer/components/DiscordSettings.tsx +18 -7
  211. package/src/renderer/components/DropboxSettings.tsx +202 -0
  212. package/src/renderer/components/EmailSettings.tsx +18 -7
  213. package/src/renderer/components/FileViewer.tsx +21 -13
  214. package/src/renderer/components/GoogleChatSettings.tsx +17 -7
  215. package/src/renderer/components/GoogleWorkspaceSettings.tsx +332 -0
  216. package/src/renderer/components/ImessageSettings.tsx +22 -11
  217. package/src/renderer/components/LineIcons.tsx +376 -0
  218. package/src/renderer/components/LineSettings.tsx +18 -7
  219. package/src/renderer/components/MCPSettings.tsx +56 -0
  220. package/src/renderer/components/MainContent.tsx +740 -76
  221. package/src/renderer/components/MatrixSettings.tsx +18 -7
  222. package/src/renderer/components/MattermostSettings.tsx +18 -7
  223. package/src/renderer/components/NodesSettings.tsx +58 -99
  224. package/src/renderer/components/NotificationPanel.tsx +25 -11
  225. package/src/renderer/components/NotionSettings.tsx +231 -0
  226. package/src/renderer/components/Onboarding/Onboarding.tsx +13 -1
  227. package/src/renderer/components/OnboardingModal.tsx +70 -1
  228. package/src/renderer/components/OneDriveSettings.tsx +212 -0
  229. package/src/renderer/components/RightPanel.tsx +141 -28
  230. package/src/renderer/components/ScheduledTasksSettings.tsx +10 -62
  231. package/src/renderer/components/SearchSettings.tsx +118 -114
  232. package/src/renderer/components/Settings.tsx +1425 -651
  233. package/src/renderer/components/SharePointSettings.tsx +224 -0
  234. package/src/renderer/components/Sidebar.tsx +94 -19
  235. package/src/renderer/components/SignalSettings.tsx +18 -7
  236. package/src/renderer/components/SkillHubBrowser.tsx +144 -185
  237. package/src/renderer/components/SlackSettings.tsx +18 -7
  238. package/src/renderer/components/TaskQuickActions.tsx +11 -6
  239. package/src/renderer/components/TaskTimeline.tsx +58 -26
  240. package/src/renderer/components/TeamsSettings.tsx +18 -7
  241. package/src/renderer/components/TelegramSettings.tsx +18 -7
  242. package/src/renderer/components/ThemeIcon.tsx +16 -0
  243. package/src/renderer/components/TwitchSettings.tsx +18 -7
  244. package/src/renderer/components/VoiceSettings.tsx +30 -74
  245. package/src/renderer/components/WhatsAppSettings.tsx +48 -37
  246. package/src/renderer/components/WorkingStateHistory.tsx +7 -5
  247. package/src/renderer/components/WorkspaceSelector.tsx +42 -13
  248. package/src/renderer/hooks/useOnboardingFlow.ts +21 -0
  249. package/src/renderer/styles/index.css +2333 -209
  250. package/src/shared/channelMessages.ts +367 -4
  251. package/src/shared/llm-provider-catalog.ts +217 -0
  252. package/src/shared/types.ts +251 -2
@@ -1,4 +1,5 @@
1
1
  import { contextBridge, ipcRenderer } from 'electron';
2
+ import type { LLMProviderType } from '../shared/types';
2
3
 
3
4
  // IPC Channel names - inlined to avoid require() issues in sandboxed preload
4
5
  const IPC_CHANNELS = {
@@ -19,6 +20,7 @@ const IPC_CHANNELS = {
19
20
  WORKSPACE_LIST: 'workspace:list',
20
21
  WORKSPACE_CREATE: 'workspace:create',
21
22
  WORKSPACE_UPDATE_PERMISSIONS: 'workspace:updatePermissions',
23
+ WORKSPACE_TOUCH: 'workspace:touch',
22
24
  WORKSPACE_GET_TEMP: 'workspace:getTemp',
23
25
  APPROVAL_RESPOND: 'approval:respond',
24
26
  ARTIFACT_LIST: 'artifact:list',
@@ -35,6 +37,9 @@ const IPC_CHANNELS = {
35
37
  LLM_GET_GEMINI_MODELS: 'llm:getGeminiModels',
36
38
  LLM_GET_OPENROUTER_MODELS: 'llm:getOpenRouterModels',
37
39
  LLM_GET_OPENAI_MODELS: 'llm:getOpenAIModels',
40
+ LLM_GET_GROQ_MODELS: 'llm:getGroqModels',
41
+ LLM_GET_XAI_MODELS: 'llm:getXAIModels',
42
+ LLM_GET_KIMI_MODELS: 'llm:getKimiModels',
38
43
  LLM_OPENAI_OAUTH_START: 'llm:openaiOAuthStart',
39
44
  LLM_OPENAI_OAUTH_LOGOUT: 'llm:openaiOAuthLogout',
40
45
  LLM_GET_BEDROCK_MODELS: 'llm:getBedrockModels',
@@ -60,6 +65,37 @@ const IPC_CHANNELS = {
60
65
  X_SAVE_SETTINGS: 'x:saveSettings',
61
66
  X_TEST_CONNECTION: 'x:testConnection',
62
67
  X_GET_STATUS: 'x:getStatus',
68
+ // Notion Settings
69
+ NOTION_GET_SETTINGS: 'notion:getSettings',
70
+ NOTION_SAVE_SETTINGS: 'notion:saveSettings',
71
+ NOTION_TEST_CONNECTION: 'notion:testConnection',
72
+ NOTION_GET_STATUS: 'notion:getStatus',
73
+ // Box Settings
74
+ BOX_GET_SETTINGS: 'box:getSettings',
75
+ BOX_SAVE_SETTINGS: 'box:saveSettings',
76
+ BOX_TEST_CONNECTION: 'box:testConnection',
77
+ BOX_GET_STATUS: 'box:getStatus',
78
+ // OneDrive Settings
79
+ ONEDRIVE_GET_SETTINGS: 'onedrive:getSettings',
80
+ ONEDRIVE_SAVE_SETTINGS: 'onedrive:saveSettings',
81
+ ONEDRIVE_TEST_CONNECTION: 'onedrive:testConnection',
82
+ ONEDRIVE_GET_STATUS: 'onedrive:getStatus',
83
+ // Google Workspace Settings
84
+ GOOGLE_WORKSPACE_GET_SETTINGS: 'googleWorkspace:getSettings',
85
+ GOOGLE_WORKSPACE_SAVE_SETTINGS: 'googleWorkspace:saveSettings',
86
+ GOOGLE_WORKSPACE_TEST_CONNECTION: 'googleWorkspace:testConnection',
87
+ GOOGLE_WORKSPACE_GET_STATUS: 'googleWorkspace:getStatus',
88
+ GOOGLE_WORKSPACE_OAUTH_START: 'googleWorkspace:oauthStart',
89
+ // Dropbox Settings
90
+ DROPBOX_GET_SETTINGS: 'dropbox:getSettings',
91
+ DROPBOX_SAVE_SETTINGS: 'dropbox:saveSettings',
92
+ DROPBOX_TEST_CONNECTION: 'dropbox:testConnection',
93
+ DROPBOX_GET_STATUS: 'dropbox:getStatus',
94
+ // SharePoint Settings
95
+ SHAREPOINT_GET_SETTINGS: 'sharepoint:getSettings',
96
+ SHAREPOINT_SAVE_SETTINGS: 'sharepoint:saveSettings',
97
+ SHAREPOINT_TEST_CONNECTION: 'sharepoint:testConnection',
98
+ SHAREPOINT_GET_STATUS: 'sharepoint:getStatus',
63
99
  // App Updates
64
100
  APP_CHECK_UPDATES: 'app:checkUpdates',
65
101
  APP_DOWNLOAD_UPDATE: 'app:downloadUpdate',
@@ -127,6 +163,7 @@ const IPC_CHANNELS = {
127
163
  MCP_GET_SERVER_TOOLS: 'mcp:getServerTools',
128
164
  MCP_TEST_SERVER: 'mcp:testServer',
129
165
  MCP_SERVER_STATUS_CHANGE: 'mcp:serverStatusChange',
166
+ MCP_CONNECTOR_OAUTH_START: 'mcp:connectorOAuthStart',
130
167
  // MCP Registry
131
168
  MCP_REGISTRY_FETCH: 'mcp:registryFetch',
132
169
  MCP_REGISTRY_SEARCH: 'mcp:registrySearch',
@@ -228,6 +265,7 @@ const IPC_CHANNELS = {
228
265
  CANVAS_EXPORT_HTML: 'canvas:exportHTML',
229
266
  CANVAS_EXPORT_TO_FOLDER: 'canvas:exportToFolder',
230
267
  CANVAS_OPEN_IN_BROWSER: 'canvas:openInBrowser',
268
+ CANVAS_OPEN_URL: 'canvas:openUrl',
231
269
  CANVAS_GET_SESSION_DIR: 'canvas:getSessionDir',
232
270
  // Mobile Companion Nodes
233
271
  NODE_LIST: 'node:list',
@@ -606,6 +644,8 @@ interface BuiltinToolsSettings {
606
644
  image: ToolCategoryConfig;
607
645
  };
608
646
  toolOverrides: Record<string, { enabled: boolean; priority?: 'high' | 'normal' | 'low' }>;
647
+ toolTimeouts: Record<string, number>;
648
+ toolAutoApprove: Record<string, boolean>;
609
649
  version: string;
610
650
  }
611
651
 
@@ -744,7 +784,7 @@ interface CronEvent {
744
784
  }
745
785
 
746
786
  // Notification Types (inlined for sandboxed preload)
747
- type NotificationType = 'task_completed' | 'task_failed' | 'scheduled_task' | 'info' | 'warning' | 'error';
787
+ type NotificationType = 'task_completed' | 'task_failed' | 'scheduled_task' | 'input_required' | 'info' | 'warning' | 'error';
748
788
 
749
789
  interface AppNotification {
750
790
  id: string;
@@ -1388,11 +1428,15 @@ interface UpdateContextPolicyOptions {
1388
1428
  contextBridge.exposeInMainWorld('electronAPI', {
1389
1429
  // Dialog APIs
1390
1430
  selectFolder: () => ipcRenderer.invoke('dialog:selectFolder'),
1431
+ selectFiles: () => ipcRenderer.invoke('dialog:selectFiles'),
1391
1432
 
1392
1433
  // File APIs
1393
1434
  openFile: (filePath: string, workspacePath?: string) => ipcRenderer.invoke('file:open', filePath, workspacePath),
1394
1435
  showInFinder: (filePath: string, workspacePath?: string) => ipcRenderer.invoke('file:showInFinder', filePath, workspacePath),
1395
1436
  readFileForViewer: (filePath: string, workspacePath?: string) => ipcRenderer.invoke('file:readForViewer', { filePath, workspacePath }),
1437
+ importFilesToWorkspace: (data: { workspaceId: string; files: string[] }) => ipcRenderer.invoke('file:importToWorkspace', data),
1438
+ importDataToWorkspace: (data: { workspaceId: string; files: Array<{ name: string; data: string; mimeType?: string }> }) =>
1439
+ ipcRenderer.invoke('file:importDataToWorkspace', data),
1396
1440
 
1397
1441
  // Shell APIs
1398
1442
  openExternal: (url: string) => ipcRenderer.invoke('shell:openExternal', url),
@@ -1428,6 +1472,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
1428
1472
  listWorkspaces: () => ipcRenderer.invoke(IPC_CHANNELS.WORKSPACE_LIST),
1429
1473
  selectWorkspace: (id: string) => ipcRenderer.invoke(IPC_CHANNELS.WORKSPACE_SELECT, id),
1430
1474
  getTempWorkspace: () => ipcRenderer.invoke(IPC_CHANNELS.WORKSPACE_GET_TEMP),
1475
+ touchWorkspace: (id: string) => ipcRenderer.invoke(IPC_CHANNELS.WORKSPACE_TOUCH, id),
1431
1476
  updateWorkspacePermissions: (id: string, permissions: { shell?: boolean; network?: boolean }) =>
1432
1477
  ipcRenderer.invoke(IPC_CHANNELS.WORKSPACE_UPDATE_PERMISSIONS, id, permissions),
1433
1478
 
@@ -1451,8 +1496,11 @@ contextBridge.exposeInMainWorld('electronAPI', {
1451
1496
  setLLMModel: (modelKey: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_SET_MODEL, modelKey),
1452
1497
  getOllamaModels: (baseUrl?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OLLAMA_MODELS, baseUrl),
1453
1498
  getGeminiModels: (apiKey?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_GEMINI_MODELS, apiKey),
1454
- getOpenRouterModels: (apiKey?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OPENROUTER_MODELS, apiKey),
1499
+ getOpenRouterModels: (apiKey?: string, baseUrl?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OPENROUTER_MODELS, apiKey, baseUrl),
1455
1500
  getOpenAIModels: (apiKey?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OPENAI_MODELS, apiKey),
1501
+ getGroqModels: (apiKey?: string, baseUrl?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_GROQ_MODELS, apiKey, baseUrl),
1502
+ getXAIModels: (apiKey?: string, baseUrl?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_XAI_MODELS, apiKey, baseUrl),
1503
+ getKimiModels: (apiKey?: string, baseUrl?: string) => ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_KIMI_MODELS, apiKey, baseUrl),
1456
1504
  openaiOAuthStart: () => ipcRenderer.invoke(IPC_CHANNELS.LLM_OPENAI_OAUTH_START),
1457
1505
  openaiOAuthLogout: () => ipcRenderer.invoke(IPC_CHANNELS.LLM_OPENAI_OAUTH_LOGOUT),
1458
1506
  getBedrockModels: (config?: { region?: string; accessKeyId?: string; secretAccessKey?: string; profile?: string }) =>
@@ -1480,6 +1528,11 @@ contextBridge.exposeInMainWorld('electronAPI', {
1480
1528
  ipcRenderer.on('gateway:message', subscription);
1481
1529
  return () => ipcRenderer.removeListener('gateway:message', subscription);
1482
1530
  },
1531
+ onGatewayUsersUpdated: (callback: (data: { channelId: string; channelType: string }) => void) => {
1532
+ const subscription = (_: any, data: { channelId: string; channelType: string }) => callback(data);
1533
+ ipcRenderer.on('gateway:users-updated', subscription);
1534
+ return () => ipcRenderer.removeListener('gateway:users-updated', subscription);
1535
+ },
1483
1536
 
1484
1537
  // WhatsApp-specific APIs
1485
1538
  getWhatsAppInfo: () => ipcRenderer.invoke('whatsapp:get-info'),
@@ -1508,6 +1561,44 @@ contextBridge.exposeInMainWorld('electronAPI', {
1508
1561
  testXConnection: () => ipcRenderer.invoke(IPC_CHANNELS.X_TEST_CONNECTION),
1509
1562
  getXStatus: () => ipcRenderer.invoke(IPC_CHANNELS.X_GET_STATUS),
1510
1563
 
1564
+ // Notion Settings APIs
1565
+ getNotionSettings: () => ipcRenderer.invoke(IPC_CHANNELS.NOTION_GET_SETTINGS),
1566
+ saveNotionSettings: (settings: any) => ipcRenderer.invoke(IPC_CHANNELS.NOTION_SAVE_SETTINGS, settings),
1567
+ testNotionConnection: () => ipcRenderer.invoke(IPC_CHANNELS.NOTION_TEST_CONNECTION),
1568
+ getNotionStatus: () => ipcRenderer.invoke(IPC_CHANNELS.NOTION_GET_STATUS),
1569
+
1570
+ // Box Settings APIs
1571
+ getBoxSettings: () => ipcRenderer.invoke(IPC_CHANNELS.BOX_GET_SETTINGS),
1572
+ saveBoxSettings: (settings: any) => ipcRenderer.invoke(IPC_CHANNELS.BOX_SAVE_SETTINGS, settings),
1573
+ testBoxConnection: () => ipcRenderer.invoke(IPC_CHANNELS.BOX_TEST_CONNECTION),
1574
+ getBoxStatus: () => ipcRenderer.invoke(IPC_CHANNELS.BOX_GET_STATUS),
1575
+
1576
+ // OneDrive Settings APIs
1577
+ getOneDriveSettings: () => ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_GET_SETTINGS),
1578
+ saveOneDriveSettings: (settings: any) => ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_SAVE_SETTINGS, settings),
1579
+ testOneDriveConnection: () => ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_TEST_CONNECTION),
1580
+ getOneDriveStatus: () => ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_GET_STATUS),
1581
+
1582
+ // Google Workspace Settings APIs
1583
+ getGoogleWorkspaceSettings: () => ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_WORKSPACE_GET_SETTINGS),
1584
+ saveGoogleWorkspaceSettings: (settings: any) => ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_WORKSPACE_SAVE_SETTINGS, settings),
1585
+ testGoogleWorkspaceConnection: () => ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_WORKSPACE_TEST_CONNECTION),
1586
+ getGoogleWorkspaceStatus: () => ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_WORKSPACE_GET_STATUS),
1587
+ startGoogleWorkspaceOAuth: (payload: { clientId: string; clientSecret?: string; scopes?: string[] }) =>
1588
+ ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_WORKSPACE_OAUTH_START, payload),
1589
+
1590
+ // Dropbox Settings APIs
1591
+ getDropboxSettings: () => ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_GET_SETTINGS),
1592
+ saveDropboxSettings: (settings: any) => ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_SAVE_SETTINGS, settings),
1593
+ testDropboxConnection: () => ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_TEST_CONNECTION),
1594
+ getDropboxStatus: () => ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_GET_STATUS),
1595
+
1596
+ // SharePoint Settings APIs
1597
+ getSharePointSettings: () => ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_GET_SETTINGS),
1598
+ saveSharePointSettings: (settings: any) => ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_SAVE_SETTINGS, settings),
1599
+ testSharePointConnection: () => ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_TEST_CONNECTION),
1600
+ getSharePointStatus: () => ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_GET_STATUS),
1601
+
1511
1602
  // App Update APIs
1512
1603
  getAppVersion: () => ipcRenderer.invoke(IPC_CHANNELS.APP_GET_VERSION),
1513
1604
  checkForUpdates: () => ipcRenderer.invoke(IPC_CHANNELS.APP_CHECK_UPDATES),
@@ -1609,6 +1700,10 @@ contextBridge.exposeInMainWorld('electronAPI', {
1609
1700
  getMCPServerTools: (serverId: string) => ipcRenderer.invoke(IPC_CHANNELS.MCP_GET_SERVER_TOOLS, serverId),
1610
1701
  testMCPServer: (serverId: string) => ipcRenderer.invoke(IPC_CHANNELS.MCP_TEST_SERVER, serverId),
1611
1702
 
1703
+ // MCP Connector OAuth
1704
+ startConnectorOAuth: (payload: { provider: 'salesforce' | 'jira' | 'hubspot' | 'zendesk'; clientId: string; clientSecret?: string; scopes?: string[]; loginUrl?: string; subdomain?: string }) =>
1705
+ ipcRenderer.invoke(IPC_CHANNELS.MCP_CONNECTOR_OAUTH_START, payload),
1706
+
1612
1707
  // MCP Status change event listener
1613
1708
  onMCPStatusChange: (callback: (status: any[]) => void) => {
1614
1709
  const subscription = (_: any, data: any) => callback(data);
@@ -1692,6 +1787,8 @@ contextBridge.exposeInMainWorld('electronAPI', {
1692
1787
 
1693
1788
  // Notification APIs
1694
1789
  listNotifications: () => ipcRenderer.invoke(IPC_CHANNELS.NOTIFICATION_LIST),
1790
+ addNotification: (data: { type: NotificationType; title: string; message: string; taskId?: string; cronJobId?: string; workspaceId?: string }) =>
1791
+ ipcRenderer.invoke(IPC_CHANNELS.NOTIFICATION_ADD, data),
1695
1792
  getUnreadNotificationCount: () => ipcRenderer.invoke('notification:unreadCount'),
1696
1793
  markNotificationRead: (id: string) => ipcRenderer.invoke(IPC_CHANNELS.NOTIFICATION_MARK_READ, id),
1697
1794
  markAllNotificationsRead: () => ipcRenderer.invoke(IPC_CHANNELS.NOTIFICATION_MARK_ALL_READ),
@@ -1791,6 +1888,8 @@ contextBridge.exposeInMainWorld('electronAPI', {
1791
1888
  ipcRenderer.invoke(IPC_CHANNELS.CANVAS_EXPORT_TO_FOLDER, data),
1792
1889
  canvasOpenInBrowser: (sessionId: string) =>
1793
1890
  ipcRenderer.invoke(IPC_CHANNELS.CANVAS_OPEN_IN_BROWSER, sessionId),
1891
+ canvasOpenUrl: (data: { sessionId: string; url: string; show?: boolean }) =>
1892
+ ipcRenderer.invoke(IPC_CHANNELS.CANVAS_OPEN_URL, data),
1794
1893
  canvasGetSessionDir: (sessionId: string) =>
1795
1894
  ipcRenderer.invoke(IPC_CHANNELS.CANVAS_GET_SESSION_DIR, sessionId),
1796
1895
  onCanvasEvent: (callback: (event: CanvasEvent) => void) => {
@@ -2149,9 +2248,12 @@ export type {
2149
2248
 
2150
2249
  export interface ElectronAPI {
2151
2250
  selectFolder: () => Promise<string | null>;
2251
+ selectFiles: () => Promise<Array<{ path: string; name: string; size: number; mimeType?: string }>>;
2152
2252
  openFile: (filePath: string, workspacePath?: string) => Promise<string>;
2153
2253
  showInFinder: (filePath: string, workspacePath?: string) => Promise<void>;
2154
2254
  readFileForViewer: (filePath: string, workspacePath?: string) => Promise<FileViewerResult>;
2255
+ importFilesToWorkspace: (data: { workspaceId: string; files: string[] }) => Promise<Array<{ relativePath: string; fileName: string; size: number; mimeType?: string }>>;
2256
+ importDataToWorkspace: (data: { workspaceId: string; files: Array<{ name: string; data: string; mimeType?: string }> }) => Promise<Array<{ relativePath: string; fileName: string; size: number; mimeType?: string }>>;
2155
2257
  openExternal: (url: string) => Promise<void>;
2156
2258
  createTask: (data: any) => Promise<any>;
2157
2259
  getTask: (id: string) => Promise<any>;
@@ -2170,6 +2272,7 @@ export interface ElectronAPI {
2170
2272
  listWorkspaces: () => Promise<any[]>;
2171
2273
  selectWorkspace: (id: string) => Promise<any>;
2172
2274
  getTempWorkspace: () => Promise<any>;
2275
+ touchWorkspace: (id: string) => Promise<any>;
2173
2276
  updateWorkspacePermissions: (id: string, permissions: { shell?: boolean; network?: boolean }) => Promise<any>;
2174
2277
  respondToApproval: (data: any) => Promise<void>;
2175
2278
  listArtifacts: (taskId: string) => Promise<any[]>;
@@ -2182,16 +2285,24 @@ export interface ElectronAPI {
2182
2285
  testLLMProvider: (config: any) => Promise<{ success: boolean; error?: string }>;
2183
2286
  getLLMModels: () => Promise<Array<{ key: string; displayName: string; description: string }>>;
2184
2287
  getLLMConfigStatus: () => Promise<{
2185
- currentProvider: 'anthropic' | 'bedrock' | 'ollama';
2288
+ currentProvider: LLMProviderType;
2186
2289
  currentModel: string;
2187
- providers: Array<{ type: 'anthropic' | 'bedrock' | 'ollama'; name: string; configured: boolean; source?: string }>;
2290
+ providers: Array<{
2291
+ type: LLMProviderType;
2292
+ name: string;
2293
+ configured: boolean;
2294
+ source?: string;
2295
+ }>;
2188
2296
  models: Array<{ key: string; displayName: string; description: string }>;
2189
2297
  }>;
2190
2298
  setLLMModel: (modelKey: string) => Promise<{ success: boolean }>;
2191
2299
  getOllamaModels: (baseUrl?: string) => Promise<Array<{ name: string; size: number; modified: string }>>;
2192
2300
  getGeminiModels: (apiKey?: string) => Promise<Array<{ name: string; displayName: string; description: string }>>;
2193
- getOpenRouterModels: (apiKey?: string) => Promise<Array<{ id: string; name: string; context_length: number }>>;
2301
+ getOpenRouterModels: (apiKey?: string, baseUrl?: string) => Promise<Array<{ id: string; name: string; context_length: number }>>;
2194
2302
  getOpenAIModels: (apiKey?: string) => Promise<Array<{ id: string; name: string; description: string }>>;
2303
+ getGroqModels: (apiKey?: string, baseUrl?: string) => Promise<Array<{ id: string; name: string }>>;
2304
+ getXAIModels: (apiKey?: string, baseUrl?: string) => Promise<Array<{ id: string; name: string }>>;
2305
+ getKimiModels: (apiKey?: string, baseUrl?: string) => Promise<Array<{ id: string; name: string }>>;
2195
2306
  openaiOAuthStart: () => Promise<{ success: boolean; error?: string }>;
2196
2307
  openaiOAuthLogout: () => Promise<{ success: boolean }>;
2197
2308
  getBedrockModels: (config?: { region?: string; accessKeyId?: string; secretAccessKey?: string; profile?: string }) => Promise<Array<{ id: string; name: string; provider: string; description: string }>>;
@@ -2208,6 +2319,7 @@ export interface ElectronAPI {
2208
2319
  revokeGatewayAccess: (channelId: string, userId: string) => Promise<void>;
2209
2320
  generateGatewayPairing: (channelId: string, userId: string, displayName?: string) => Promise<string>;
2210
2321
  onGatewayMessage: (callback: (data: any) => void) => () => void;
2322
+ onGatewayUsersUpdated: (callback: (data: { channelId: string; channelType: string }) => void) => () => void;
2211
2323
  // WhatsApp-specific APIs
2212
2324
  getWhatsAppInfo: () => Promise<{ qrCode?: string; phoneNumber?: string; status?: string }>;
2213
2325
  whatsAppLogout: () => Promise<void>;
@@ -2250,6 +2362,76 @@ export interface ElectronAPI {
2250
2362
  saveXSettings: (settings: any) => Promise<{ success: boolean }>;
2251
2363
  testXConnection: () => Promise<{ success: boolean; error?: string; username?: string; userId?: string }>;
2252
2364
  getXStatus: () => Promise<{ installed: boolean; connected: boolean; username?: string; error?: string }>;
2365
+ // Notion Settings
2366
+ getNotionSettings: () => Promise<{
2367
+ enabled: boolean;
2368
+ apiKey?: string;
2369
+ notionVersion?: string;
2370
+ timeoutMs?: number;
2371
+ }>;
2372
+ saveNotionSettings: (settings: any) => Promise<{ success: boolean }>;
2373
+ testNotionConnection: () => Promise<{ success: boolean; error?: string; name?: string; userId?: string }>;
2374
+ getNotionStatus: () => Promise<{ configured: boolean; connected: boolean; name?: string; error?: string }>;
2375
+ // Box Settings
2376
+ getBoxSettings: () => Promise<{
2377
+ enabled: boolean;
2378
+ accessToken?: string;
2379
+ timeoutMs?: number;
2380
+ }>;
2381
+ saveBoxSettings: (settings: any) => Promise<{ success: boolean }>;
2382
+ testBoxConnection: () => Promise<{ success: boolean; error?: string; name?: string; userId?: string }>;
2383
+ getBoxStatus: () => Promise<{ configured: boolean; connected: boolean; name?: string; error?: string }>;
2384
+ // OneDrive Settings
2385
+ getOneDriveSettings: () => Promise<{
2386
+ enabled: boolean;
2387
+ accessToken?: string;
2388
+ driveId?: string;
2389
+ timeoutMs?: number;
2390
+ }>;
2391
+ saveOneDriveSettings: (settings: any) => Promise<{ success: boolean }>;
2392
+ testOneDriveConnection: () => Promise<{ success: boolean; error?: string; name?: string; userId?: string; driveId?: string }>;
2393
+ getOneDriveStatus: () => Promise<{ configured: boolean; connected: boolean; name?: string; error?: string }>;
2394
+ // Google Workspace Settings
2395
+ getGoogleWorkspaceSettings: () => Promise<{
2396
+ enabled: boolean;
2397
+ clientId?: string;
2398
+ clientSecret?: string;
2399
+ accessToken?: string;
2400
+ refreshToken?: string;
2401
+ tokenExpiresAt?: number;
2402
+ scopes?: string[];
2403
+ timeoutMs?: number;
2404
+ }>;
2405
+ saveGoogleWorkspaceSettings: (settings: any) => Promise<{ success: boolean }>;
2406
+ testGoogleWorkspaceConnection: () => Promise<{ success: boolean; error?: string; name?: string; userId?: string; email?: string }>;
2407
+ getGoogleWorkspaceStatus: () => Promise<{ configured: boolean; connected: boolean; name?: string; error?: string }>;
2408
+ startGoogleWorkspaceOAuth: (payload: { clientId: string; clientSecret?: string; scopes?: string[] }) => Promise<{
2409
+ accessToken: string;
2410
+ refreshToken?: string;
2411
+ expiresIn?: number;
2412
+ tokenType?: string;
2413
+ scopes?: string[];
2414
+ }>;
2415
+ // Dropbox Settings
2416
+ getDropboxSettings: () => Promise<{
2417
+ enabled: boolean;
2418
+ accessToken?: string;
2419
+ timeoutMs?: number;
2420
+ }>;
2421
+ saveDropboxSettings: (settings: any) => Promise<{ success: boolean }>;
2422
+ testDropboxConnection: () => Promise<{ success: boolean; error?: string; name?: string; userId?: string; email?: string }>;
2423
+ getDropboxStatus: () => Promise<{ configured: boolean; connected: boolean; name?: string; error?: string }>;
2424
+ // SharePoint Settings
2425
+ getSharePointSettings: () => Promise<{
2426
+ enabled: boolean;
2427
+ accessToken?: string;
2428
+ siteId?: string;
2429
+ driveId?: string;
2430
+ timeoutMs?: number;
2431
+ }>;
2432
+ saveSharePointSettings: (settings: any) => Promise<{ success: boolean }>;
2433
+ testSharePointConnection: () => Promise<{ success: boolean; error?: string; name?: string; userId?: string }>;
2434
+ getSharePointStatus: () => Promise<{ configured: boolean; connected: boolean; name?: string; error?: string }>;
2253
2435
  // App Updates
2254
2436
  getAppVersion: () => Promise<{
2255
2437
  version: string;
@@ -2316,6 +2498,7 @@ export interface ElectronAPI {
2316
2498
  // Appearance Settings
2317
2499
  getAppearanceSettings: () => Promise<{
2318
2500
  themeMode: 'light' | 'dark' | 'system';
2501
+ visualTheme: 'terminal' | 'warm' | 'oblivion';
2319
2502
  accentColor: 'cyan' | 'blue' | 'purple' | 'pink' | 'rose' | 'orange' | 'green' | 'teal' | 'coral';
2320
2503
  disclaimerAccepted?: boolean;
2321
2504
  onboardingCompleted?: boolean;
@@ -2324,6 +2507,7 @@ export interface ElectronAPI {
2324
2507
  }>;
2325
2508
  saveAppearanceSettings: (settings: {
2326
2509
  themeMode?: 'light' | 'dark' | 'system';
2510
+ visualTheme?: 'terminal' | 'warm' | 'oblivion';
2327
2511
  accentColor?: 'cyan' | 'blue' | 'purple' | 'pink' | 'rose' | 'orange' | 'green' | 'teal' | 'coral';
2328
2512
  disclaimerAccepted?: boolean;
2329
2513
  onboardingCompleted?: boolean;
@@ -2466,6 +2650,15 @@ export interface ElectronAPI {
2466
2650
  getMCPAllTools: () => Promise<MCPTool[]>;
2467
2651
  getMCPServerTools: (serverId: string) => Promise<MCPTool[]>;
2468
2652
  testMCPServer: (serverId: string) => Promise<{ success: boolean; error?: string; tools?: number }>;
2653
+ startConnectorOAuth: (payload: { provider: 'salesforce' | 'jira' | 'hubspot' | 'zendesk'; clientId: string; clientSecret?: string; scopes?: string[]; loginUrl?: string; subdomain?: string }) => Promise<{
2654
+ provider: 'salesforce' | 'jira' | 'hubspot' | 'zendesk';
2655
+ accessToken: string;
2656
+ refreshToken?: string;
2657
+ expiresIn?: number;
2658
+ tokenType?: string;
2659
+ instanceUrl?: string;
2660
+ resources?: Array<{ id: string; name: string; url: string; scopes?: string[] }>;
2661
+ }>;
2469
2662
  onMCPStatusChange: (callback: (status: MCPServerStatus[]) => void) => () => void;
2470
2663
  // MCP Registry
2471
2664
  fetchMCPRegistry: () => Promise<MCPRegistry>;
@@ -2508,6 +2701,7 @@ export interface ElectronAPI {
2508
2701
  getCronWebhookStatus: () => Promise<CronWebhookStatus>;
2509
2702
  // Notifications
2510
2703
  listNotifications: () => Promise<AppNotification[]>;
2704
+ addNotification: (data: { type: NotificationType; title: string; message: string; taskId?: string; cronJobId?: string; workspaceId?: string }) => Promise<AppNotification | null>;
2511
2705
  getUnreadNotificationCount: () => Promise<number>;
2512
2706
  markNotificationRead: (id: string) => Promise<AppNotification | null>;
2513
2707
  markAllNotificationsRead: () => Promise<void>;
@@ -2579,6 +2773,7 @@ export interface ElectronAPI {
2579
2773
  canvasExportHTML: (sessionId: string) => Promise<{ content: string; filename: string }>;
2580
2774
  canvasExportToFolder: (data: { sessionId: string; targetDir: string }) => Promise<{ files: string[]; targetDir: string }>;
2581
2775
  canvasOpenInBrowser: (sessionId: string) => Promise<{ success: boolean; path: string }>;
2776
+ canvasOpenUrl: (data: { sessionId: string; url: string; show?: boolean }) => Promise<{ success: boolean; url: string }>;
2582
2777
  canvasGetSessionDir: (sessionId: string) => Promise<string | null>;
2583
2778
  onCanvasEvent: (callback: (event: CanvasEvent) => void) => () => void;
2584
2779
 
@@ -8,13 +8,14 @@
8
8
  import { app } from 'electron';
9
9
  import * as fs from 'fs';
10
10
  import * as path from 'path';
11
- import { AppearanceSettings, ThemeMode, AccentColor } from '../../shared/types';
11
+ import { AppearanceSettings, ThemeMode, VisualTheme, AccentColor } from '../../shared/types';
12
12
  import { SecureSettingsRepository } from '../database/SecureSettingsRepository';
13
13
 
14
14
  const LEGACY_SETTINGS_FILE = 'appearance-settings.json';
15
15
 
16
16
  const DEFAULT_SETTINGS: AppearanceSettings = {
17
17
  themeMode: 'dark',
18
+ visualTheme: 'terminal',
18
19
  accentColor: 'cyan',
19
20
  disclaimerAccepted: false,
20
21
  onboardingCompleted: false,
@@ -121,6 +122,13 @@ export class AppearanceManager {
121
122
  if (!isValidThemeMode(settings.themeMode)) {
122
123
  settings.themeMode = DEFAULT_SETTINGS.themeMode;
123
124
  }
125
+ if (!isValidVisualTheme(settings.visualTheme)) {
126
+ settings.visualTheme = DEFAULT_SETTINGS.visualTheme;
127
+ }
128
+ // Normalize deprecated 'oblivion' theme to 'warm'
129
+ if (settings.visualTheme === 'oblivion') {
130
+ settings.visualTheme = 'warm';
131
+ }
124
132
  if (!isValidAccentColor(settings.accentColor)) {
125
133
  settings.accentColor = DEFAULT_SETTINGS.accentColor;
126
134
  }
@@ -146,8 +154,14 @@ export class AppearanceManager {
146
154
  const existingSettings = this.loadSettings();
147
155
 
148
156
  // Validate and merge with existing settings
157
+ // Normalize deprecated 'oblivion' to 'warm' before saving
158
+ let normalizedVisualTheme = isValidVisualTheme(settings.visualTheme) ? settings.visualTheme : existingSettings.visualTheme;
159
+ if (normalizedVisualTheme === 'oblivion') {
160
+ normalizedVisualTheme = 'warm';
161
+ }
149
162
  const validatedSettings: AppearanceSettings = {
150
163
  themeMode: isValidThemeMode(settings.themeMode) ? settings.themeMode : existingSettings.themeMode,
164
+ visualTheme: normalizedVisualTheme,
151
165
  accentColor: isValidAccentColor(settings.accentColor) ? settings.accentColor : existingSettings.accentColor,
152
166
  disclaimerAccepted: settings.disclaimerAccepted ?? existingSettings.disclaimerAccepted,
153
167
  onboardingCompleted: settings.onboardingCompleted ?? existingSettings.onboardingCompleted,
@@ -176,7 +190,11 @@ function isValidThemeMode(value: unknown): value is ThemeMode {
176
190
  return value === 'light' || value === 'dark' || value === 'system';
177
191
  }
178
192
 
193
+ function isValidVisualTheme(value: unknown): value is VisualTheme {
194
+ return value === 'terminal' || value === 'warm' || value === 'oblivion';
195
+ }
196
+
179
197
  function isValidAccentColor(value: unknown): value is AccentColor {
180
- const validColors: AccentColor[] = ['cyan', 'blue', 'purple', 'pink', 'rose', 'orange', 'green', 'teal'];
198
+ const validColors: AccentColor[] = ['cyan', 'blue', 'purple', 'pink', 'rose', 'orange', 'green', 'teal', 'coral'];
181
199
  return validColors.includes(value as AccentColor);
182
200
  }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Box Settings Manager
3
+ *
4
+ * Stores Box integration settings in encrypted database.
5
+ */
6
+
7
+ import { SecureSettingsRepository } from '../database/SecureSettingsRepository';
8
+ import { BoxSettingsData } from '../../shared/types';
9
+
10
+ const DEFAULT_SETTINGS: BoxSettingsData = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+
15
+ export class BoxSettingsManager {
16
+ private static cachedSettings: BoxSettingsData | null = null;
17
+
18
+ static loadSettings(): BoxSettingsData {
19
+ if (this.cachedSettings) {
20
+ return this.cachedSettings;
21
+ }
22
+
23
+ let settings: BoxSettingsData = { ...DEFAULT_SETTINGS };
24
+
25
+ try {
26
+ if (SecureSettingsRepository.isInitialized()) {
27
+ const repository = SecureSettingsRepository.getInstance();
28
+ const stored = repository.load<BoxSettingsData>('box');
29
+ if (stored) {
30
+ settings = { ...DEFAULT_SETTINGS, ...stored };
31
+ }
32
+ }
33
+ } catch (error) {
34
+ console.error('[BoxSettingsManager] Failed to load settings:', error);
35
+ }
36
+
37
+ this.cachedSettings = settings;
38
+ return settings;
39
+ }
40
+
41
+ static saveSettings(settings: BoxSettingsData): void {
42
+ try {
43
+ if (!SecureSettingsRepository.isInitialized()) {
44
+ throw new Error('SecureSettingsRepository not initialized');
45
+ }
46
+ const repository = SecureSettingsRepository.getInstance();
47
+ repository.save('box', settings);
48
+ this.cachedSettings = settings;
49
+ console.log('[BoxSettingsManager] Settings saved');
50
+ } catch (error) {
51
+ console.error('[BoxSettingsManager] Failed to save settings:', error);
52
+ }
53
+ }
54
+
55
+ static clearCache(): void {
56
+ this.cachedSettings = null;
57
+ }
58
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Dropbox Settings Manager
3
+ *
4
+ * Stores Dropbox integration settings in encrypted database.
5
+ */
6
+
7
+ import { SecureSettingsRepository } from '../database/SecureSettingsRepository';
8
+ import { DropboxSettingsData } from '../../shared/types';
9
+
10
+ const DEFAULT_SETTINGS: DropboxSettingsData = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+
15
+ export class DropboxSettingsManager {
16
+ private static cachedSettings: DropboxSettingsData | null = null;
17
+
18
+ static loadSettings(): DropboxSettingsData {
19
+ if (this.cachedSettings) {
20
+ return this.cachedSettings;
21
+ }
22
+
23
+ let settings: DropboxSettingsData = { ...DEFAULT_SETTINGS };
24
+
25
+ try {
26
+ if (SecureSettingsRepository.isInitialized()) {
27
+ const repository = SecureSettingsRepository.getInstance();
28
+ const stored = repository.load<DropboxSettingsData>('dropbox');
29
+ if (stored) {
30
+ settings = { ...DEFAULT_SETTINGS, ...stored };
31
+ }
32
+ }
33
+ } catch (error) {
34
+ console.error('[DropboxSettingsManager] Failed to load settings:', error);
35
+ }
36
+
37
+ this.cachedSettings = settings;
38
+ return settings;
39
+ }
40
+
41
+ static saveSettings(settings: DropboxSettingsData): void {
42
+ try {
43
+ if (!SecureSettingsRepository.isInitialized()) {
44
+ throw new Error('SecureSettingsRepository not initialized');
45
+ }
46
+ const repository = SecureSettingsRepository.getInstance();
47
+ repository.save('dropbox', settings);
48
+ this.cachedSettings = settings;
49
+ console.log('[DropboxSettingsManager] Settings saved');
50
+ } catch (error) {
51
+ console.error('[DropboxSettingsManager] Failed to save settings:', error);
52
+ }
53
+ }
54
+
55
+ static clearCache(): void {
56
+ this.cachedSettings = null;
57
+ }
58
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Google Workspace Settings Manager
3
+ *
4
+ * Stores Google Workspace integration settings in encrypted database.
5
+ */
6
+
7
+ import { SecureSettingsRepository } from '../database/SecureSettingsRepository';
8
+ import { GoogleWorkspaceSettingsData } from '../../shared/types';
9
+
10
+ const DEFAULT_SETTINGS: GoogleWorkspaceSettingsData = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+
15
+ export class GoogleWorkspaceSettingsManager {
16
+ private static cachedSettings: GoogleWorkspaceSettingsData | null = null;
17
+
18
+ static loadSettings(): GoogleWorkspaceSettingsData {
19
+ if (this.cachedSettings) {
20
+ return this.cachedSettings;
21
+ }
22
+
23
+ let settings: GoogleWorkspaceSettingsData = { ...DEFAULT_SETTINGS };
24
+
25
+ try {
26
+ if (SecureSettingsRepository.isInitialized()) {
27
+ const repository = SecureSettingsRepository.getInstance();
28
+ // Keep legacy category key for backwards compatibility with existing Google Drive settings.
29
+ const stored = repository.load<GoogleWorkspaceSettingsData>('google-drive');
30
+ if (stored) {
31
+ settings = { ...DEFAULT_SETTINGS, ...stored };
32
+ }
33
+ }
34
+ } catch (error) {
35
+ console.error('[GoogleWorkspaceSettingsManager] Failed to load settings:', error);
36
+ }
37
+
38
+ this.cachedSettings = settings;
39
+ return settings;
40
+ }
41
+
42
+ static saveSettings(settings: GoogleWorkspaceSettingsData): void {
43
+ try {
44
+ if (!SecureSettingsRepository.isInitialized()) {
45
+ throw new Error('SecureSettingsRepository not initialized');
46
+ }
47
+ const repository = SecureSettingsRepository.getInstance();
48
+ repository.save('google-drive', settings);
49
+ this.cachedSettings = settings;
50
+ console.log('[GoogleWorkspaceSettingsManager] Settings saved');
51
+ } catch (error) {
52
+ console.error('[GoogleWorkspaceSettingsManager] Failed to save settings:', error);
53
+ }
54
+ }
55
+
56
+ static clearCache(): void {
57
+ this.cachedSettings = null;
58
+ }
59
+ }