cowork-os 0.3.21 → 0.3.23

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 (170) hide show
  1. package/README.md +293 -6
  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/daemon.js +25 -0
  48. package/dist/electron/electron/agent/executor.js +181 -26
  49. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  50. package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
  51. package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
  52. package/dist/electron/electron/agent/llm/index.js +11 -1
  53. package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
  54. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
  55. package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
  56. package/dist/electron/electron/agent/llm/openai-oauth.js +2 -1
  57. package/dist/electron/electron/agent/llm/openrouter-provider.js +1 -1
  58. package/dist/electron/electron/agent/llm/provider-factory.js +318 -4
  59. package/dist/electron/electron/agent/llm/types.js +66 -1
  60. package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
  61. package/dist/electron/electron/agent/tools/box-tools.js +231 -0
  62. package/dist/electron/electron/agent/tools/builtin-settings.js +28 -0
  63. package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
  64. package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
  65. package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
  66. package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
  67. package/dist/electron/electron/agent/tools/registry.js +541 -0
  68. package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
  69. package/dist/electron/electron/agent/tools/shell-tools.js +12 -3
  70. package/dist/electron/electron/agent/tools/x-tools.js +1 -1
  71. package/dist/electron/electron/gateway/index.js +1 -0
  72. package/dist/electron/electron/gateway/router.js +123 -143
  73. package/dist/electron/electron/ipc/canvas-handlers.js +5 -0
  74. package/dist/electron/electron/ipc/handlers.js +627 -158
  75. package/dist/electron/electron/main.js +63 -0
  76. package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
  77. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +503 -154
  78. package/dist/electron/electron/memory/MemoryService.js +1 -1
  79. package/dist/electron/electron/preload.js +74 -1
  80. package/dist/electron/electron/settings/box-manager.js +54 -0
  81. package/dist/electron/electron/settings/dropbox-manager.js +54 -0
  82. package/dist/electron/electron/settings/google-drive-manager.js +54 -0
  83. package/dist/electron/electron/settings/notion-manager.js +56 -0
  84. package/dist/electron/electron/settings/onedrive-manager.js +54 -0
  85. package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
  86. package/dist/electron/electron/utils/box-api.js +153 -0
  87. package/dist/electron/electron/utils/dropbox-api.js +144 -0
  88. package/dist/electron/electron/utils/env-migration.js +19 -0
  89. package/dist/electron/electron/utils/google-drive-api.js +152 -0
  90. package/dist/electron/electron/utils/notion-api.js +103 -0
  91. package/dist/electron/electron/utils/onedrive-api.js +113 -0
  92. package/dist/electron/electron/utils/sharepoint-api.js +109 -0
  93. package/dist/electron/electron/utils/validation.js +82 -3
  94. package/dist/electron/electron/utils/x-cli.js +1 -1
  95. package/dist/electron/shared/channelMessages.js +284 -3
  96. package/dist/electron/shared/llm-provider-catalog.js +198 -0
  97. package/dist/electron/shared/types.js +88 -1
  98. package/package.json +12 -2
  99. package/src/electron/agent/executor.ts +205 -28
  100. package/src/electron/agent/llm/anthropic-compatible-provider.ts +214 -0
  101. package/src/electron/agent/llm/github-copilot-provider.ts +117 -0
  102. package/src/electron/agent/llm/groq-provider.ts +39 -0
  103. package/src/electron/agent/llm/index.ts +5 -0
  104. package/src/electron/agent/llm/kimi-provider.ts +39 -0
  105. package/src/electron/agent/llm/openai-compatible-provider.ts +153 -0
  106. package/src/electron/agent/llm/openai-compatible.ts +133 -0
  107. package/src/electron/agent/llm/openai-oauth.ts +2 -1
  108. package/src/electron/agent/llm/openrouter-provider.ts +2 -1
  109. package/src/electron/agent/llm/provider-factory.ts +414 -6
  110. package/src/electron/agent/llm/types.ts +90 -1
  111. package/src/electron/agent/llm/xai-provider.ts +39 -0
  112. package/src/electron/agent/tools/box-tools.ts +239 -0
  113. package/src/electron/agent/tools/builtin-settings.ts +34 -0
  114. package/src/electron/agent/tools/dropbox-tools.ts +237 -0
  115. package/src/electron/agent/tools/google-drive-tools.ts +228 -0
  116. package/src/electron/agent/tools/notion-tools.ts +330 -0
  117. package/src/electron/agent/tools/onedrive-tools.ts +217 -0
  118. package/src/electron/agent/tools/registry.ts +565 -0
  119. package/src/electron/agent/tools/sharepoint-tools.ts +247 -0
  120. package/src/electron/agent/tools/shell-tools.ts +11 -3
  121. package/src/electron/agent/tools/x-tools.ts +1 -1
  122. package/src/electron/database/SecureSettingsRepository.ts +7 -1
  123. package/src/electron/gateway/index.ts +1 -0
  124. package/src/electron/gateway/router.ts +134 -149
  125. package/src/electron/ipc/canvas-handlers.ts +10 -0
  126. package/src/electron/ipc/handlers.ts +673 -153
  127. package/src/electron/main.ts +35 -0
  128. package/src/electron/mcp/oauth/connector-oauth.ts +448 -0
  129. package/src/electron/mcp/registry/MCPRegistryManager.ts +343 -12
  130. package/src/electron/memory/MemoryService.ts +5 -1
  131. package/src/electron/preload.ts +167 -4
  132. package/src/electron/settings/box-manager.ts +58 -0
  133. package/src/electron/settings/dropbox-manager.ts +58 -0
  134. package/src/electron/settings/google-drive-manager.ts +58 -0
  135. package/src/electron/settings/notion-manager.ts +60 -0
  136. package/src/electron/settings/onedrive-manager.ts +58 -0
  137. package/src/electron/settings/sharepoint-manager.ts +58 -0
  138. package/src/electron/utils/box-api.ts +184 -0
  139. package/src/electron/utils/dropbox-api.ts +171 -0
  140. package/src/electron/utils/env-migration.ts +22 -0
  141. package/src/electron/utils/google-drive-api.ts +183 -0
  142. package/src/electron/utils/notion-api.ts +126 -0
  143. package/src/electron/utils/onedrive-api.ts +137 -0
  144. package/src/electron/utils/sharepoint-api.ts +132 -0
  145. package/src/electron/utils/validation.ts +102 -1
  146. package/src/electron/utils/x-cli.ts +1 -1
  147. package/src/renderer/App.tsx +20 -2
  148. package/src/renderer/components/BoxSettings.tsx +203 -0
  149. package/src/renderer/components/BrowserView.tsx +101 -0
  150. package/src/renderer/components/BuiltinToolsSettings.tsx +105 -0
  151. package/src/renderer/components/CanvasPreview.tsx +68 -1
  152. package/src/renderer/components/ConnectorEnvModal.tsx +116 -0
  153. package/src/renderer/components/ConnectorSetupModal.tsx +566 -0
  154. package/src/renderer/components/ConnectorsSettings.tsx +397 -0
  155. package/src/renderer/components/DropboxSettings.tsx +202 -0
  156. package/src/renderer/components/GoogleDriveSettings.tsx +201 -0
  157. package/src/renderer/components/MCPSettings.tsx +56 -0
  158. package/src/renderer/components/MainContent.tsx +270 -34
  159. package/src/renderer/components/NotionSettings.tsx +231 -0
  160. package/src/renderer/components/Onboarding/Onboarding.tsx +13 -1
  161. package/src/renderer/components/OnboardingModal.tsx +70 -1
  162. package/src/renderer/components/OneDriveSettings.tsx +212 -0
  163. package/src/renderer/components/Settings.tsx +611 -8
  164. package/src/renderer/components/SharePointSettings.tsx +224 -0
  165. package/src/renderer/components/Sidebar.tsx +25 -9
  166. package/src/renderer/hooks/useOnboardingFlow.ts +21 -0
  167. package/src/renderer/styles/index.css +438 -25
  168. package/src/shared/channelMessages.ts +367 -4
  169. package/src/shared/llm-provider-catalog.ts +217 -0
  170. package/src/shared/types.ts +226 -1
@@ -276,7 +276,7 @@ class MemoryService {
276
276
  // Get LLM provider for compression
277
277
  const provider = llm_1.LLMProviderFactory.createProvider();
278
278
  const settings = llm_1.LLMProviderFactory.getSettings();
279
- const modelId = llm_1.LLMProviderFactory.getModelId(settings.modelKey, settings.providerType, settings.ollama?.model, settings.gemini?.model, settings.openrouter?.model, settings.openai?.model);
279
+ const modelId = llm_1.LLMProviderFactory.getModelId(settings.modelKey, settings.providerType, settings.ollama?.model, settings.gemini?.model, settings.openrouter?.model, settings.openai?.model, settings.groq?.model, settings.xai?.model, settings.kimi?.model, settings.customProviders);
280
280
  const response = await provider.createMessage({
281
281
  model: modelId,
282
282
  maxTokens: 100,
@@ -36,6 +36,9 @@ const IPC_CHANNELS = {
36
36
  LLM_GET_GEMINI_MODELS: 'llm:getGeminiModels',
37
37
  LLM_GET_OPENROUTER_MODELS: 'llm:getOpenRouterModels',
38
38
  LLM_GET_OPENAI_MODELS: 'llm:getOpenAIModels',
39
+ LLM_GET_GROQ_MODELS: 'llm:getGroqModels',
40
+ LLM_GET_XAI_MODELS: 'llm:getXAIModels',
41
+ LLM_GET_KIMI_MODELS: 'llm:getKimiModels',
39
42
  LLM_OPENAI_OAUTH_START: 'llm:openaiOAuthStart',
40
43
  LLM_OPENAI_OAUTH_LOGOUT: 'llm:openaiOAuthLogout',
41
44
  LLM_GET_BEDROCK_MODELS: 'llm:getBedrockModels',
@@ -61,6 +64,36 @@ const IPC_CHANNELS = {
61
64
  X_SAVE_SETTINGS: 'x:saveSettings',
62
65
  X_TEST_CONNECTION: 'x:testConnection',
63
66
  X_GET_STATUS: 'x:getStatus',
67
+ // Notion Settings
68
+ NOTION_GET_SETTINGS: 'notion:getSettings',
69
+ NOTION_SAVE_SETTINGS: 'notion:saveSettings',
70
+ NOTION_TEST_CONNECTION: 'notion:testConnection',
71
+ NOTION_GET_STATUS: 'notion:getStatus',
72
+ // Box Settings
73
+ BOX_GET_SETTINGS: 'box:getSettings',
74
+ BOX_SAVE_SETTINGS: 'box:saveSettings',
75
+ BOX_TEST_CONNECTION: 'box:testConnection',
76
+ BOX_GET_STATUS: 'box:getStatus',
77
+ // OneDrive Settings
78
+ ONEDRIVE_GET_SETTINGS: 'onedrive:getSettings',
79
+ ONEDRIVE_SAVE_SETTINGS: 'onedrive:saveSettings',
80
+ ONEDRIVE_TEST_CONNECTION: 'onedrive:testConnection',
81
+ ONEDRIVE_GET_STATUS: 'onedrive:getStatus',
82
+ // Google Drive Settings
83
+ GOOGLE_DRIVE_GET_SETTINGS: 'googleDrive:getSettings',
84
+ GOOGLE_DRIVE_SAVE_SETTINGS: 'googleDrive:saveSettings',
85
+ GOOGLE_DRIVE_TEST_CONNECTION: 'googleDrive:testConnection',
86
+ GOOGLE_DRIVE_GET_STATUS: 'googleDrive:getStatus',
87
+ // Dropbox Settings
88
+ DROPBOX_GET_SETTINGS: 'dropbox:getSettings',
89
+ DROPBOX_SAVE_SETTINGS: 'dropbox:saveSettings',
90
+ DROPBOX_TEST_CONNECTION: 'dropbox:testConnection',
91
+ DROPBOX_GET_STATUS: 'dropbox:getStatus',
92
+ // SharePoint Settings
93
+ SHAREPOINT_GET_SETTINGS: 'sharepoint:getSettings',
94
+ SHAREPOINT_SAVE_SETTINGS: 'sharepoint:saveSettings',
95
+ SHAREPOINT_TEST_CONNECTION: 'sharepoint:testConnection',
96
+ SHAREPOINT_GET_STATUS: 'sharepoint:getStatus',
64
97
  // App Updates
65
98
  APP_CHECK_UPDATES: 'app:checkUpdates',
66
99
  APP_DOWNLOAD_UPDATE: 'app:downloadUpdate',
@@ -128,6 +161,7 @@ const IPC_CHANNELS = {
128
161
  MCP_GET_SERVER_TOOLS: 'mcp:getServerTools',
129
162
  MCP_TEST_SERVER: 'mcp:testServer',
130
163
  MCP_SERVER_STATUS_CHANGE: 'mcp:serverStatusChange',
164
+ MCP_CONNECTOR_OAUTH_START: 'mcp:connectorOAuthStart',
131
165
  // MCP Registry
132
166
  MCP_REGISTRY_FETCH: 'mcp:registryFetch',
133
167
  MCP_REGISTRY_SEARCH: 'mcp:registrySearch',
@@ -229,6 +263,7 @@ const IPC_CHANNELS = {
229
263
  CANVAS_EXPORT_HTML: 'canvas:exportHTML',
230
264
  CANVAS_EXPORT_TO_FOLDER: 'canvas:exportToFolder',
231
265
  CANVAS_OPEN_IN_BROWSER: 'canvas:openInBrowser',
266
+ CANVAS_OPEN_URL: 'canvas:openUrl',
232
267
  CANVAS_GET_SESSION_DIR: 'canvas:getSessionDir',
233
268
  // Mobile Companion Nodes
234
269
  NODE_LIST: 'node:list',
@@ -351,10 +386,12 @@ const IPC_CHANNELS = {
351
386
  electron_1.contextBridge.exposeInMainWorld('electronAPI', {
352
387
  // Dialog APIs
353
388
  selectFolder: () => electron_1.ipcRenderer.invoke('dialog:selectFolder'),
389
+ selectFiles: () => electron_1.ipcRenderer.invoke('dialog:selectFiles'),
354
390
  // File APIs
355
391
  openFile: (filePath, workspacePath) => electron_1.ipcRenderer.invoke('file:open', filePath, workspacePath),
356
392
  showInFinder: (filePath, workspacePath) => electron_1.ipcRenderer.invoke('file:showInFinder', filePath, workspacePath),
357
393
  readFileForViewer: (filePath, workspacePath) => electron_1.ipcRenderer.invoke('file:readForViewer', { filePath, workspacePath }),
394
+ importFilesToWorkspace: (data) => electron_1.ipcRenderer.invoke('file:importToWorkspace', data),
358
395
  // Shell APIs
359
396
  openExternal: (url) => electron_1.ipcRenderer.invoke('shell:openExternal', url),
360
397
  // Task APIs
@@ -401,8 +438,11 @@ electron_1.contextBridge.exposeInMainWorld('electronAPI', {
401
438
  setLLMModel: (modelKey) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_SET_MODEL, modelKey),
402
439
  getOllamaModels: (baseUrl) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OLLAMA_MODELS, baseUrl),
403
440
  getGeminiModels: (apiKey) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_GEMINI_MODELS, apiKey),
404
- getOpenRouterModels: (apiKey) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OPENROUTER_MODELS, apiKey),
441
+ getOpenRouterModels: (apiKey, baseUrl) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OPENROUTER_MODELS, apiKey, baseUrl),
405
442
  getOpenAIModels: (apiKey) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_OPENAI_MODELS, apiKey),
443
+ getGroqModels: (apiKey, baseUrl) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_GROQ_MODELS, apiKey, baseUrl),
444
+ getXAIModels: (apiKey, baseUrl) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_XAI_MODELS, apiKey, baseUrl),
445
+ getKimiModels: (apiKey, baseUrl) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_KIMI_MODELS, apiKey, baseUrl),
406
446
  openaiOAuthStart: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_OPENAI_OAUTH_START),
407
447
  openaiOAuthLogout: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_OPENAI_OAUTH_LOGOUT),
408
448
  getBedrockModels: (config) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.LLM_GET_BEDROCK_MODELS, config),
@@ -447,6 +487,36 @@ electron_1.contextBridge.exposeInMainWorld('electronAPI', {
447
487
  saveXSettings: (settings) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.X_SAVE_SETTINGS, settings),
448
488
  testXConnection: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.X_TEST_CONNECTION),
449
489
  getXStatus: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.X_GET_STATUS),
490
+ // Notion Settings APIs
491
+ getNotionSettings: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.NOTION_GET_SETTINGS),
492
+ saveNotionSettings: (settings) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.NOTION_SAVE_SETTINGS, settings),
493
+ testNotionConnection: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.NOTION_TEST_CONNECTION),
494
+ getNotionStatus: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.NOTION_GET_STATUS),
495
+ // Box Settings APIs
496
+ getBoxSettings: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.BOX_GET_SETTINGS),
497
+ saveBoxSettings: (settings) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.BOX_SAVE_SETTINGS, settings),
498
+ testBoxConnection: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.BOX_TEST_CONNECTION),
499
+ getBoxStatus: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.BOX_GET_STATUS),
500
+ // OneDrive Settings APIs
501
+ getOneDriveSettings: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_GET_SETTINGS),
502
+ saveOneDriveSettings: (settings) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_SAVE_SETTINGS, settings),
503
+ testOneDriveConnection: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_TEST_CONNECTION),
504
+ getOneDriveStatus: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.ONEDRIVE_GET_STATUS),
505
+ // Google Drive Settings APIs
506
+ getGoogleDriveSettings: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_DRIVE_GET_SETTINGS),
507
+ saveGoogleDriveSettings: (settings) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_DRIVE_SAVE_SETTINGS, settings),
508
+ testGoogleDriveConnection: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_DRIVE_TEST_CONNECTION),
509
+ getGoogleDriveStatus: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.GOOGLE_DRIVE_GET_STATUS),
510
+ // Dropbox Settings APIs
511
+ getDropboxSettings: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_GET_SETTINGS),
512
+ saveDropboxSettings: (settings) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_SAVE_SETTINGS, settings),
513
+ testDropboxConnection: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_TEST_CONNECTION),
514
+ getDropboxStatus: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.DROPBOX_GET_STATUS),
515
+ // SharePoint Settings APIs
516
+ getSharePointSettings: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_GET_SETTINGS),
517
+ saveSharePointSettings: (settings) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_SAVE_SETTINGS, settings),
518
+ testSharePointConnection: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_TEST_CONNECTION),
519
+ getSharePointStatus: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.SHAREPOINT_GET_STATUS),
450
520
  // App Update APIs
451
521
  getAppVersion: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.APP_GET_VERSION),
452
522
  checkForUpdates: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.APP_CHECK_UPDATES),
@@ -533,6 +603,8 @@ electron_1.contextBridge.exposeInMainWorld('electronAPI', {
533
603
  getMCPAllTools: () => electron_1.ipcRenderer.invoke(IPC_CHANNELS.MCP_GET_ALL_TOOLS),
534
604
  getMCPServerTools: (serverId) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.MCP_GET_SERVER_TOOLS, serverId),
535
605
  testMCPServer: (serverId) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.MCP_TEST_SERVER, serverId),
606
+ // MCP Connector OAuth
607
+ startConnectorOAuth: (payload) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.MCP_CONNECTOR_OAUTH_START, payload),
536
608
  // MCP Status change event listener
537
609
  onMCPStatusChange: (callback) => {
538
610
  const subscription = (_, data) => callback(data);
@@ -684,6 +756,7 @@ electron_1.contextBridge.exposeInMainWorld('electronAPI', {
684
756
  canvasExportHTML: (sessionId) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.CANVAS_EXPORT_HTML, sessionId),
685
757
  canvasExportToFolder: (data) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.CANVAS_EXPORT_TO_FOLDER, data),
686
758
  canvasOpenInBrowser: (sessionId) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.CANVAS_OPEN_IN_BROWSER, sessionId),
759
+ canvasOpenUrl: (data) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.CANVAS_OPEN_URL, data),
687
760
  canvasGetSessionDir: (sessionId) => electron_1.ipcRenderer.invoke(IPC_CHANNELS.CANVAS_GET_SESSION_DIR, sessionId),
688
761
  onCanvasEvent: (callback) => {
689
762
  const subscription = (_, data) => callback(data);
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Box Settings Manager
4
+ *
5
+ * Stores Box integration settings in encrypted database.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BoxSettingsManager = void 0;
9
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
10
+ const DEFAULT_SETTINGS = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+ class BoxSettingsManager {
15
+ static loadSettings() {
16
+ if (this.cachedSettings) {
17
+ return this.cachedSettings;
18
+ }
19
+ let settings = { ...DEFAULT_SETTINGS };
20
+ try {
21
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
22
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
23
+ const stored = repository.load('box');
24
+ if (stored) {
25
+ settings = { ...DEFAULT_SETTINGS, ...stored };
26
+ }
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.error('[BoxSettingsManager] Failed to load settings:', error);
31
+ }
32
+ this.cachedSettings = settings;
33
+ return settings;
34
+ }
35
+ static saveSettings(settings) {
36
+ try {
37
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
38
+ throw new Error('SecureSettingsRepository not initialized');
39
+ }
40
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
41
+ repository.save('box', settings);
42
+ this.cachedSettings = settings;
43
+ console.log('[BoxSettingsManager] Settings saved');
44
+ }
45
+ catch (error) {
46
+ console.error('[BoxSettingsManager] Failed to save settings:', error);
47
+ }
48
+ }
49
+ static clearCache() {
50
+ this.cachedSettings = null;
51
+ }
52
+ }
53
+ exports.BoxSettingsManager = BoxSettingsManager;
54
+ BoxSettingsManager.cachedSettings = null;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Dropbox Settings Manager
4
+ *
5
+ * Stores Dropbox integration settings in encrypted database.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DropboxSettingsManager = void 0;
9
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
10
+ const DEFAULT_SETTINGS = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+ class DropboxSettingsManager {
15
+ static loadSettings() {
16
+ if (this.cachedSettings) {
17
+ return this.cachedSettings;
18
+ }
19
+ let settings = { ...DEFAULT_SETTINGS };
20
+ try {
21
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
22
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
23
+ const stored = repository.load('dropbox');
24
+ if (stored) {
25
+ settings = { ...DEFAULT_SETTINGS, ...stored };
26
+ }
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.error('[DropboxSettingsManager] Failed to load settings:', error);
31
+ }
32
+ this.cachedSettings = settings;
33
+ return settings;
34
+ }
35
+ static saveSettings(settings) {
36
+ try {
37
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
38
+ throw new Error('SecureSettingsRepository not initialized');
39
+ }
40
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
41
+ repository.save('dropbox', settings);
42
+ this.cachedSettings = settings;
43
+ console.log('[DropboxSettingsManager] Settings saved');
44
+ }
45
+ catch (error) {
46
+ console.error('[DropboxSettingsManager] Failed to save settings:', error);
47
+ }
48
+ }
49
+ static clearCache() {
50
+ this.cachedSettings = null;
51
+ }
52
+ }
53
+ exports.DropboxSettingsManager = DropboxSettingsManager;
54
+ DropboxSettingsManager.cachedSettings = null;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Google Drive Settings Manager
4
+ *
5
+ * Stores Google Drive integration settings in encrypted database.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.GoogleDriveSettingsManager = void 0;
9
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
10
+ const DEFAULT_SETTINGS = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+ class GoogleDriveSettingsManager {
15
+ static loadSettings() {
16
+ if (this.cachedSettings) {
17
+ return this.cachedSettings;
18
+ }
19
+ let settings = { ...DEFAULT_SETTINGS };
20
+ try {
21
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
22
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
23
+ const stored = repository.load('google-drive');
24
+ if (stored) {
25
+ settings = { ...DEFAULT_SETTINGS, ...stored };
26
+ }
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.error('[GoogleDriveSettingsManager] Failed to load settings:', error);
31
+ }
32
+ this.cachedSettings = settings;
33
+ return settings;
34
+ }
35
+ static saveSettings(settings) {
36
+ try {
37
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
38
+ throw new Error('SecureSettingsRepository not initialized');
39
+ }
40
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
41
+ repository.save('google-drive', settings);
42
+ this.cachedSettings = settings;
43
+ console.log('[GoogleDriveSettingsManager] Settings saved');
44
+ }
45
+ catch (error) {
46
+ console.error('[GoogleDriveSettingsManager] Failed to save settings:', error);
47
+ }
48
+ }
49
+ static clearCache() {
50
+ this.cachedSettings = null;
51
+ }
52
+ }
53
+ exports.GoogleDriveSettingsManager = GoogleDriveSettingsManager;
54
+ GoogleDriveSettingsManager.cachedSettings = null;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /**
3
+ * Notion Settings Manager
4
+ *
5
+ * Stores Notion integration settings in encrypted database.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.NotionSettingsManager = void 0;
9
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
10
+ const notion_api_1 = require("../utils/notion-api");
11
+ const DEFAULT_SETTINGS = {
12
+ enabled: false,
13
+ notionVersion: notion_api_1.DEFAULT_NOTION_VERSION,
14
+ timeoutMs: 20000,
15
+ };
16
+ class NotionSettingsManager {
17
+ static loadSettings() {
18
+ if (this.cachedSettings) {
19
+ return this.cachedSettings;
20
+ }
21
+ let settings = { ...DEFAULT_SETTINGS };
22
+ try {
23
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
24
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
25
+ const stored = repository.load('notion');
26
+ if (stored) {
27
+ settings = { ...DEFAULT_SETTINGS, ...stored };
28
+ }
29
+ }
30
+ }
31
+ catch (error) {
32
+ console.error('[NotionSettingsManager] Failed to load settings:', error);
33
+ }
34
+ this.cachedSettings = settings;
35
+ return settings;
36
+ }
37
+ static saveSettings(settings) {
38
+ try {
39
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
40
+ throw new Error('SecureSettingsRepository not initialized');
41
+ }
42
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
43
+ repository.save('notion', settings);
44
+ this.cachedSettings = settings;
45
+ console.log('[NotionSettingsManager] Settings saved');
46
+ }
47
+ catch (error) {
48
+ console.error('[NotionSettingsManager] Failed to save settings:', error);
49
+ }
50
+ }
51
+ static clearCache() {
52
+ this.cachedSettings = null;
53
+ }
54
+ }
55
+ exports.NotionSettingsManager = NotionSettingsManager;
56
+ NotionSettingsManager.cachedSettings = null;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * OneDrive Settings Manager
4
+ *
5
+ * Stores OneDrive integration settings in encrypted database.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OneDriveSettingsManager = void 0;
9
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
10
+ const DEFAULT_SETTINGS = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+ class OneDriveSettingsManager {
15
+ static loadSettings() {
16
+ if (this.cachedSettings) {
17
+ return this.cachedSettings;
18
+ }
19
+ let settings = { ...DEFAULT_SETTINGS };
20
+ try {
21
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
22
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
23
+ const stored = repository.load('onedrive');
24
+ if (stored) {
25
+ settings = { ...DEFAULT_SETTINGS, ...stored };
26
+ }
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.error('[OneDriveSettingsManager] Failed to load settings:', error);
31
+ }
32
+ this.cachedSettings = settings;
33
+ return settings;
34
+ }
35
+ static saveSettings(settings) {
36
+ try {
37
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
38
+ throw new Error('SecureSettingsRepository not initialized');
39
+ }
40
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
41
+ repository.save('onedrive', settings);
42
+ this.cachedSettings = settings;
43
+ console.log('[OneDriveSettingsManager] Settings saved');
44
+ }
45
+ catch (error) {
46
+ console.error('[OneDriveSettingsManager] Failed to save settings:', error);
47
+ }
48
+ }
49
+ static clearCache() {
50
+ this.cachedSettings = null;
51
+ }
52
+ }
53
+ exports.OneDriveSettingsManager = OneDriveSettingsManager;
54
+ OneDriveSettingsManager.cachedSettings = null;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * SharePoint Settings Manager
4
+ *
5
+ * Stores SharePoint integration settings in encrypted database.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SharePointSettingsManager = void 0;
9
+ const SecureSettingsRepository_1 = require("../database/SecureSettingsRepository");
10
+ const DEFAULT_SETTINGS = {
11
+ enabled: false,
12
+ timeoutMs: 20000,
13
+ };
14
+ class SharePointSettingsManager {
15
+ static loadSettings() {
16
+ if (this.cachedSettings) {
17
+ return this.cachedSettings;
18
+ }
19
+ let settings = { ...DEFAULT_SETTINGS };
20
+ try {
21
+ if (SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
22
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
23
+ const stored = repository.load('sharepoint');
24
+ if (stored) {
25
+ settings = { ...DEFAULT_SETTINGS, ...stored };
26
+ }
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.error('[SharePointSettingsManager] Failed to load settings:', error);
31
+ }
32
+ this.cachedSettings = settings;
33
+ return settings;
34
+ }
35
+ static saveSettings(settings) {
36
+ try {
37
+ if (!SecureSettingsRepository_1.SecureSettingsRepository.isInitialized()) {
38
+ throw new Error('SecureSettingsRepository not initialized');
39
+ }
40
+ const repository = SecureSettingsRepository_1.SecureSettingsRepository.getInstance();
41
+ repository.save('sharepoint', settings);
42
+ this.cachedSettings = settings;
43
+ console.log('[SharePointSettingsManager] Settings saved');
44
+ }
45
+ catch (error) {
46
+ console.error('[SharePointSettingsManager] Failed to save settings:', error);
47
+ }
48
+ }
49
+ static clearCache() {
50
+ this.cachedSettings = null;
51
+ }
52
+ }
53
+ exports.SharePointSettingsManager = SharePointSettingsManager;
54
+ SharePointSettingsManager.cachedSettings = null;
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /**
3
+ * Box API helpers
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BOX_UPLOAD_BASE = exports.BOX_API_BASE = void 0;
7
+ exports.boxRequest = boxRequest;
8
+ exports.boxUploadFile = boxUploadFile;
9
+ exports.testBoxConnection = testBoxConnection;
10
+ exports.BOX_API_BASE = 'https://api.box.com/2.0';
11
+ exports.BOX_UPLOAD_BASE = 'https://upload.box.com/api/2.0';
12
+ const DEFAULT_TIMEOUT_MS = 20000;
13
+ function parseJsonSafe(text) {
14
+ const trimmed = text.trim();
15
+ if (!trimmed)
16
+ return undefined;
17
+ try {
18
+ return JSON.parse(trimmed);
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
24
+ function formatBoxError(status, data, fallback) {
25
+ const message = data?.message ||
26
+ data?.error?.message ||
27
+ data?.error_description ||
28
+ fallback ||
29
+ 'Box API error';
30
+ return `Box API error ${status}: ${message}`;
31
+ }
32
+ async function boxRequest(settings, options) {
33
+ if (!settings.accessToken) {
34
+ throw new Error('Box access token not configured. Add it in Settings > Integrations > Box.');
35
+ }
36
+ const params = new URLSearchParams();
37
+ if (options.query) {
38
+ for (const [key, value] of Object.entries(options.query)) {
39
+ if (value === undefined || value === null)
40
+ continue;
41
+ params.set(key, String(value));
42
+ }
43
+ }
44
+ const queryString = params.toString();
45
+ const url = `${exports.BOX_API_BASE}${options.path}${queryString ? `?${queryString}` : ''}`;
46
+ const headers = {
47
+ Authorization: `Bearer ${settings.accessToken}`,
48
+ };
49
+ if (options.method !== 'GET' && options.method !== 'DELETE') {
50
+ headers['Content-Type'] = 'application/json';
51
+ }
52
+ const timeoutMs = options.timeoutMs ?? settings.timeoutMs ?? DEFAULT_TIMEOUT_MS;
53
+ const controller = new AbortController();
54
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
55
+ try {
56
+ const response = await fetch(url, {
57
+ method: options.method,
58
+ headers,
59
+ body: options.body ? JSON.stringify(options.body) : undefined,
60
+ signal: controller.signal,
61
+ });
62
+ const rawText = typeof response.text === 'function' ? await response.text() : '';
63
+ const data = rawText ? parseJsonSafe(rawText) : undefined;
64
+ if (!response.ok) {
65
+ throw new Error(formatBoxError(response.status, data, response.statusText));
66
+ }
67
+ return {
68
+ status: response.status,
69
+ data: data ?? undefined,
70
+ raw: rawText || undefined,
71
+ };
72
+ }
73
+ catch (error) {
74
+ if (error?.name === 'AbortError') {
75
+ throw new Error('Box API request timed out');
76
+ }
77
+ throw error;
78
+ }
79
+ finally {
80
+ clearTimeout(timeout);
81
+ }
82
+ }
83
+ async function boxUploadFile(settings, opts) {
84
+ if (!settings.accessToken) {
85
+ throw new Error('Box access token not configured. Add it in Settings > Integrations > Box.');
86
+ }
87
+ if (typeof FormData === 'undefined') {
88
+ throw new Error('FormData not available in this environment');
89
+ }
90
+ const form = new FormData();
91
+ form.append('attributes', JSON.stringify({ name: opts.fileName, parent: { id: opts.parentId } }));
92
+ // Create a copy with a regular ArrayBuffer to satisfy BlobPart type requirements
93
+ const fileData = new Uint8Array(opts.data);
94
+ form.append('file', new Blob([fileData]), opts.fileName);
95
+ const url = `${exports.BOX_UPLOAD_BASE}/files/content`;
96
+ const headers = {
97
+ Authorization: `Bearer ${settings.accessToken}`,
98
+ };
99
+ const timeoutMs = opts.timeoutMs ?? settings.timeoutMs ?? DEFAULT_TIMEOUT_MS;
100
+ const controller = new AbortController();
101
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
102
+ try {
103
+ const response = await fetch(url, {
104
+ method: 'POST',
105
+ headers,
106
+ body: form,
107
+ signal: controller.signal,
108
+ });
109
+ const rawText = typeof response.text === 'function' ? await response.text() : '';
110
+ const data = rawText ? parseJsonSafe(rawText) : undefined;
111
+ if (!response.ok) {
112
+ throw new Error(formatBoxError(response.status, data, response.statusText));
113
+ }
114
+ return {
115
+ status: response.status,
116
+ data: data ?? undefined,
117
+ raw: rawText || undefined,
118
+ };
119
+ }
120
+ catch (error) {
121
+ if (error?.name === 'AbortError') {
122
+ throw new Error('Box upload request timed out');
123
+ }
124
+ throw error;
125
+ }
126
+ finally {
127
+ clearTimeout(timeout);
128
+ }
129
+ }
130
+ function extractUserInfo(data) {
131
+ if (!data || typeof data !== 'object')
132
+ return {};
133
+ const name = data.name || data.login || undefined;
134
+ const userId = data.id || data.user_id || undefined;
135
+ return { name, userId };
136
+ }
137
+ async function testBoxConnection(settings) {
138
+ try {
139
+ const result = await boxRequest(settings, { method: 'GET', path: '/users/me' });
140
+ const extracted = extractUserInfo(result.data);
141
+ return {
142
+ success: true,
143
+ name: extracted.name,
144
+ userId: extracted.userId,
145
+ };
146
+ }
147
+ catch (error) {
148
+ return {
149
+ success: false,
150
+ error: error?.message || 'Failed to connect to Box',
151
+ };
152
+ }
153
+ }