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.
- package/README.md +293 -6
- package/connectors/README.md +20 -0
- package/connectors/asana-mcp/README.md +24 -0
- package/connectors/asana-mcp/dist/index.js +427 -0
- package/connectors/asana-mcp/package.json +15 -0
- package/connectors/asana-mcp/src/index.ts +553 -0
- package/connectors/asana-mcp/tsconfig.json +13 -0
- package/connectors/hubspot-mcp/README.md +35 -0
- package/connectors/hubspot-mcp/dist/index.js +454 -0
- package/connectors/hubspot-mcp/package.json +15 -0
- package/connectors/hubspot-mcp/src/index.ts +562 -0
- package/connectors/hubspot-mcp/tsconfig.json +13 -0
- package/connectors/jira-mcp/README.md +49 -0
- package/connectors/jira-mcp/dist/index.js +588 -0
- package/connectors/jira-mcp/package.json +15 -0
- package/connectors/jira-mcp/src/index.ts +711 -0
- package/connectors/jira-mcp/tsconfig.json +13 -0
- package/connectors/linear-mcp/README.md +22 -0
- package/connectors/linear-mcp/dist/index.js +402 -0
- package/connectors/linear-mcp/package.json +15 -0
- package/connectors/linear-mcp/src/index.ts +522 -0
- package/connectors/linear-mcp/tsconfig.json +13 -0
- package/connectors/okta-mcp/README.md +24 -0
- package/connectors/okta-mcp/dist/index.js +411 -0
- package/connectors/okta-mcp/package.json +15 -0
- package/connectors/okta-mcp/src/index.ts +520 -0
- package/connectors/okta-mcp/tsconfig.json +13 -0
- package/connectors/salesforce-mcp/README.md +47 -0
- package/connectors/salesforce-mcp/dist/index.js +584 -0
- package/connectors/salesforce-mcp/package.json +15 -0
- package/connectors/salesforce-mcp/src/index.ts +722 -0
- package/connectors/salesforce-mcp/tsconfig.json +13 -0
- package/connectors/servicenow-mcp/README.md +26 -0
- package/connectors/servicenow-mcp/dist/index.js +400 -0
- package/connectors/servicenow-mcp/package.json +15 -0
- package/connectors/servicenow-mcp/src/index.ts +500 -0
- package/connectors/servicenow-mcp/tsconfig.json +13 -0
- package/connectors/templates/mcp-connector/README.md +31 -0
- package/connectors/templates/mcp-connector/package.json +15 -0
- package/connectors/templates/mcp-connector/src/index.ts +330 -0
- package/connectors/templates/mcp-connector/tsconfig.json +13 -0
- package/connectors/zendesk-mcp/README.md +40 -0
- package/connectors/zendesk-mcp/dist/index.js +431 -0
- package/connectors/zendesk-mcp/package.json +15 -0
- package/connectors/zendesk-mcp/src/index.ts +543 -0
- package/connectors/zendesk-mcp/tsconfig.json +13 -0
- package/dist/electron/electron/agent/daemon.js +25 -0
- package/dist/electron/electron/agent/executor.js +181 -26
- package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
- package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
- package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
- package/dist/electron/electron/agent/llm/index.js +11 -1
- package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
- package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
- package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
- package/dist/electron/electron/agent/llm/openai-oauth.js +2 -1
- package/dist/electron/electron/agent/llm/openrouter-provider.js +1 -1
- package/dist/electron/electron/agent/llm/provider-factory.js +318 -4
- package/dist/electron/electron/agent/llm/types.js +66 -1
- package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
- package/dist/electron/electron/agent/tools/box-tools.js +231 -0
- package/dist/electron/electron/agent/tools/builtin-settings.js +28 -0
- package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
- package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
- package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
- package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
- package/dist/electron/electron/agent/tools/registry.js +541 -0
- package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
- package/dist/electron/electron/agent/tools/shell-tools.js +12 -3
- package/dist/electron/electron/agent/tools/x-tools.js +1 -1
- package/dist/electron/electron/gateway/index.js +1 -0
- package/dist/electron/electron/gateway/router.js +123 -143
- package/dist/electron/electron/ipc/canvas-handlers.js +5 -0
- package/dist/electron/electron/ipc/handlers.js +627 -158
- package/dist/electron/electron/main.js +63 -0
- package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
- package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +503 -154
- package/dist/electron/electron/memory/MemoryService.js +1 -1
- package/dist/electron/electron/preload.js +74 -1
- package/dist/electron/electron/settings/box-manager.js +54 -0
- package/dist/electron/electron/settings/dropbox-manager.js +54 -0
- package/dist/electron/electron/settings/google-drive-manager.js +54 -0
- package/dist/electron/electron/settings/notion-manager.js +56 -0
- package/dist/electron/electron/settings/onedrive-manager.js +54 -0
- package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
- package/dist/electron/electron/utils/box-api.js +153 -0
- package/dist/electron/electron/utils/dropbox-api.js +144 -0
- package/dist/electron/electron/utils/env-migration.js +19 -0
- package/dist/electron/electron/utils/google-drive-api.js +152 -0
- package/dist/electron/electron/utils/notion-api.js +103 -0
- package/dist/electron/electron/utils/onedrive-api.js +113 -0
- package/dist/electron/electron/utils/sharepoint-api.js +109 -0
- package/dist/electron/electron/utils/validation.js +82 -3
- package/dist/electron/electron/utils/x-cli.js +1 -1
- package/dist/electron/shared/channelMessages.js +284 -3
- package/dist/electron/shared/llm-provider-catalog.js +198 -0
- package/dist/electron/shared/types.js +88 -1
- package/package.json +12 -2
- package/src/electron/agent/executor.ts +205 -28
- package/src/electron/agent/llm/anthropic-compatible-provider.ts +214 -0
- package/src/electron/agent/llm/github-copilot-provider.ts +117 -0
- package/src/electron/agent/llm/groq-provider.ts +39 -0
- package/src/electron/agent/llm/index.ts +5 -0
- package/src/electron/agent/llm/kimi-provider.ts +39 -0
- package/src/electron/agent/llm/openai-compatible-provider.ts +153 -0
- package/src/electron/agent/llm/openai-compatible.ts +133 -0
- package/src/electron/agent/llm/openai-oauth.ts +2 -1
- package/src/electron/agent/llm/openrouter-provider.ts +2 -1
- package/src/electron/agent/llm/provider-factory.ts +414 -6
- package/src/electron/agent/llm/types.ts +90 -1
- package/src/electron/agent/llm/xai-provider.ts +39 -0
- package/src/electron/agent/tools/box-tools.ts +239 -0
- package/src/electron/agent/tools/builtin-settings.ts +34 -0
- package/src/electron/agent/tools/dropbox-tools.ts +237 -0
- package/src/electron/agent/tools/google-drive-tools.ts +228 -0
- package/src/electron/agent/tools/notion-tools.ts +330 -0
- package/src/electron/agent/tools/onedrive-tools.ts +217 -0
- package/src/electron/agent/tools/registry.ts +565 -0
- package/src/electron/agent/tools/sharepoint-tools.ts +247 -0
- package/src/electron/agent/tools/shell-tools.ts +11 -3
- package/src/electron/agent/tools/x-tools.ts +1 -1
- package/src/electron/database/SecureSettingsRepository.ts +7 -1
- package/src/electron/gateway/index.ts +1 -0
- package/src/electron/gateway/router.ts +134 -149
- package/src/electron/ipc/canvas-handlers.ts +10 -0
- package/src/electron/ipc/handlers.ts +673 -153
- package/src/electron/main.ts +35 -0
- package/src/electron/mcp/oauth/connector-oauth.ts +448 -0
- package/src/electron/mcp/registry/MCPRegistryManager.ts +343 -12
- package/src/electron/memory/MemoryService.ts +5 -1
- package/src/electron/preload.ts +167 -4
- package/src/electron/settings/box-manager.ts +58 -0
- package/src/electron/settings/dropbox-manager.ts +58 -0
- package/src/electron/settings/google-drive-manager.ts +58 -0
- package/src/electron/settings/notion-manager.ts +60 -0
- package/src/electron/settings/onedrive-manager.ts +58 -0
- package/src/electron/settings/sharepoint-manager.ts +58 -0
- package/src/electron/utils/box-api.ts +184 -0
- package/src/electron/utils/dropbox-api.ts +171 -0
- package/src/electron/utils/env-migration.ts +22 -0
- package/src/electron/utils/google-drive-api.ts +183 -0
- package/src/electron/utils/notion-api.ts +126 -0
- package/src/electron/utils/onedrive-api.ts +137 -0
- package/src/electron/utils/sharepoint-api.ts +132 -0
- package/src/electron/utils/validation.ts +102 -1
- package/src/electron/utils/x-cli.ts +1 -1
- package/src/renderer/App.tsx +20 -2
- package/src/renderer/components/BoxSettings.tsx +203 -0
- package/src/renderer/components/BrowserView.tsx +101 -0
- package/src/renderer/components/BuiltinToolsSettings.tsx +105 -0
- package/src/renderer/components/CanvasPreview.tsx +68 -1
- package/src/renderer/components/ConnectorEnvModal.tsx +116 -0
- package/src/renderer/components/ConnectorSetupModal.tsx +566 -0
- package/src/renderer/components/ConnectorsSettings.tsx +397 -0
- package/src/renderer/components/DropboxSettings.tsx +202 -0
- package/src/renderer/components/GoogleDriveSettings.tsx +201 -0
- package/src/renderer/components/MCPSettings.tsx +56 -0
- package/src/renderer/components/MainContent.tsx +270 -34
- package/src/renderer/components/NotionSettings.tsx +231 -0
- package/src/renderer/components/Onboarding/Onboarding.tsx +13 -1
- package/src/renderer/components/OnboardingModal.tsx +70 -1
- package/src/renderer/components/OneDriveSettings.tsx +212 -0
- package/src/renderer/components/Settings.tsx +611 -8
- package/src/renderer/components/SharePointSettings.tsx +224 -0
- package/src/renderer/components/Sidebar.tsx +25 -9
- package/src/renderer/hooks/useOnboardingFlow.ts +21 -0
- package/src/renderer/styles/index.css +438 -25
- package/src/shared/channelMessages.ts +367 -4
- package/src/shared/llm-provider-catalog.ts +217 -0
- 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
|
+
}
|