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
@@ -12,7 +12,16 @@ interface OnboardingModalProps {
12
12
  type OnboardingStep = 'welcome' | 'llm' | 'channels';
13
13
 
14
14
  // LLM Provider types for the simplified setup
15
- type LLMProviderType = 'anthropic' | 'openai' | 'gemini' | 'ollama' | 'openrouter' | 'bedrock';
15
+ type LLMProviderType =
16
+ | 'anthropic'
17
+ | 'openai'
18
+ | 'gemini'
19
+ | 'ollama'
20
+ | 'openrouter'
21
+ | 'bedrock'
22
+ | 'groq'
23
+ | 'xai'
24
+ | 'kimi';
16
25
 
17
26
  interface ProviderOption {
18
27
  type: LLMProviderType;
@@ -105,6 +114,48 @@ const PROVIDER_OPTIONS: ProviderOption[] = [
105
114
  apiKeyPlaceholder: 'sk-or-...',
106
115
  apiKeyLink: 'https://openrouter.ai/keys',
107
116
  },
117
+ {
118
+ type: 'groq',
119
+ name: 'Groq',
120
+ description: 'Fast, low-latency models',
121
+ icon: (
122
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
123
+ <path d="M4 12h16" />
124
+ <path d="M12 4v16" />
125
+ <circle cx="12" cy="12" r="9" />
126
+ </svg>
127
+ ),
128
+ requiresApiKey: true,
129
+ apiKeyPlaceholder: 'gsk_...',
130
+ apiKeyLink: 'https://console.groq.com/keys',
131
+ },
132
+ {
133
+ type: 'xai',
134
+ name: 'xAI (Grok)',
135
+ description: 'Grok models from xAI',
136
+ icon: (
137
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
138
+ <path d="M4 4l16 16" />
139
+ <path d="M20 4L4 20" />
140
+ </svg>
141
+ ),
142
+ requiresApiKey: true,
143
+ apiKeyPlaceholder: 'xai-...',
144
+ apiKeyLink: 'https://console.x.ai/',
145
+ },
146
+ {
147
+ type: 'kimi',
148
+ name: 'Kimi',
149
+ description: 'Kimi models via Moonshot',
150
+ icon: (
151
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
152
+ <path d="M12 2l3 7 7 3-7 3-3 7-3-7-7-3 7-3 3-7z" />
153
+ </svg>
154
+ ),
155
+ requiresApiKey: true,
156
+ apiKeyPlaceholder: 'sk-...',
157
+ apiKeyLink: 'https://platform.moonshot.ai/',
158
+ },
108
159
  {
109
160
  type: 'bedrock',
110
161
  name: 'AWS Bedrock',
@@ -263,6 +314,12 @@ export function OnboardingModal({
263
314
  testConfig.openrouter = { apiKey };
264
315
  } else if (selectedProvider === 'ollama') {
265
316
  testConfig.ollama = { baseUrl: ollamaUrl };
317
+ } else if (selectedProvider === 'groq') {
318
+ testConfig.groq = { apiKey };
319
+ } else if (selectedProvider === 'xai') {
320
+ testConfig.xai = { apiKey };
321
+ } else if (selectedProvider === 'kimi') {
322
+ testConfig.kimi = { apiKey };
266
323
  }
267
324
 
268
325
  const result = await window.electronAPI.testLLMProvider(testConfig);
@@ -295,6 +352,12 @@ export function OnboardingModal({
295
352
  settings.ollama = { baseUrl: ollamaUrl, model: 'llama3.2' };
296
353
  } else if (selectedProvider === 'bedrock') {
297
354
  settings.bedrock = { region: 'us-east-1', useDefaultCredentials: true };
355
+ } else if (selectedProvider === 'groq') {
356
+ settings.groq = { apiKey, model: 'llama-3.1-8b-instant' };
357
+ } else if (selectedProvider === 'xai') {
358
+ settings.xai = { apiKey, model: 'grok-4-fast-non-reasoning' };
359
+ } else if (selectedProvider === 'kimi') {
360
+ settings.kimi = { apiKey, model: 'kimi-k2.5' };
298
361
  }
299
362
 
300
363
  await window.electronAPI.saveLLMSettings(settings);
@@ -339,6 +402,12 @@ export function OnboardingModal({
339
402
  return 'anthropic/claude-3.5-sonnet';
340
403
  case 'bedrock':
341
404
  return 'sonnet-4-5';
405
+ case 'groq':
406
+ return 'llama-3.1-8b-instant';
407
+ case 'xai':
408
+ return 'grok-4-fast-non-reasoning';
409
+ case 'kimi':
410
+ return 'kimi-k2.5';
342
411
  default:
343
412
  return 'sonnet-4';
344
413
  }
@@ -0,0 +1,212 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { OneDriveSettingsData } from '../../shared/types';
3
+
4
+ export function OneDriveSettings() {
5
+ const [settings, setSettings] = useState<OneDriveSettingsData | null>(null);
6
+ const [saving, setSaving] = useState(false);
7
+ const [testing, setTesting] = useState(false);
8
+ const [testResult, setTestResult] = useState<{ success: boolean; error?: string; name?: string; userId?: string; driveId?: string } | null>(null);
9
+ const [status, setStatus] = useState<{ configured: boolean; connected: boolean; name?: string; error?: string } | null>(null);
10
+ const [statusLoading, setStatusLoading] = useState(false);
11
+
12
+ useEffect(() => {
13
+ loadSettings();
14
+ refreshStatus();
15
+ }, []);
16
+
17
+ const loadSettings = async () => {
18
+ try {
19
+ const loaded = await window.electronAPI.getOneDriveSettings();
20
+ setSettings(loaded);
21
+ } catch (error) {
22
+ console.error('Failed to load OneDrive settings:', error);
23
+ }
24
+ };
25
+
26
+ const updateSettings = (updates: Partial<OneDriveSettingsData>) => {
27
+ if (!settings) return;
28
+ setSettings({ ...settings, ...updates });
29
+ };
30
+
31
+ const handleSave = async () => {
32
+ if (!settings) return;
33
+ setSaving(true);
34
+ setTestResult(null);
35
+ try {
36
+ const payload: OneDriveSettingsData = { ...settings };
37
+ await window.electronAPI.saveOneDriveSettings(payload);
38
+ setSettings(payload);
39
+ await refreshStatus();
40
+ } catch (error) {
41
+ console.error('Failed to save OneDrive settings:', error);
42
+ } finally {
43
+ setSaving(false);
44
+ }
45
+ };
46
+
47
+ const refreshStatus = async () => {
48
+ try {
49
+ setStatusLoading(true);
50
+ const result = await window.electronAPI.getOneDriveStatus();
51
+ setStatus(result);
52
+ } catch (error) {
53
+ console.error('Failed to load OneDrive status:', error);
54
+ } finally {
55
+ setStatusLoading(false);
56
+ }
57
+ };
58
+
59
+ const handleTestConnection = async () => {
60
+ setTesting(true);
61
+ setTestResult(null);
62
+ try {
63
+ const result = await window.electronAPI.testOneDriveConnection();
64
+ setTestResult(result);
65
+ await refreshStatus();
66
+ } catch (error: any) {
67
+ setTestResult({ success: false, error: error.message || 'Failed to test connection' });
68
+ } finally {
69
+ setTesting(false);
70
+ }
71
+ };
72
+
73
+ if (!settings) {
74
+ return <div className="settings-loading">Loading OneDrive settings...</div>;
75
+ }
76
+
77
+ const statusLabel = !status?.configured
78
+ ? 'Missing Token'
79
+ : status.connected
80
+ ? 'Connected'
81
+ : 'Configured';
82
+
83
+ const statusClass = !status?.configured
84
+ ? 'missing'
85
+ : status.connected
86
+ ? 'connected'
87
+ : 'configured';
88
+
89
+ return (
90
+ <div className="onedrive-settings">
91
+ <div className="settings-section">
92
+ <div className="settings-section-header">
93
+ <div className="settings-title-with-badge">
94
+ <h3>Connect OneDrive</h3>
95
+ {status && (
96
+ <span
97
+ className={`onedrive-status-badge ${statusClass}`}
98
+ title={!status.configured ? 'Access token not configured' : status.connected ? 'Connected to OneDrive' : 'Configured'}
99
+ >
100
+ {statusLabel}
101
+ </span>
102
+ )}
103
+ {statusLoading && !status && (
104
+ <span className="onedrive-status-badge configured">Checking…</span>
105
+ )}
106
+ </div>
107
+ <button className="btn-secondary btn-sm" onClick={refreshStatus} disabled={statusLoading}>
108
+ {statusLoading ? 'Checking...' : 'Refresh Status'}
109
+ </button>
110
+ </div>
111
+ <p className="settings-description">
112
+ Connect the agent to OneDrive using a Microsoft Graph access token, then use the built-in `onedrive_action`
113
+ tool to search and manage files.
114
+ </p>
115
+ {status?.error && (
116
+ <p className="settings-hint">Status check: {status.error}</p>
117
+ )}
118
+ <div className="settings-actions">
119
+ <button
120
+ className="btn-secondary btn-sm"
121
+ onClick={() => window.electronAPI.openExternal('https://portal.azure.com')}
122
+ >
123
+ Open Azure Portal
124
+ </button>
125
+ </div>
126
+ </div>
127
+
128
+ <div className="settings-section">
129
+ <div className="settings-field">
130
+ <label>Enable Integration</label>
131
+ <label className="settings-toggle">
132
+ <input
133
+ type="checkbox"
134
+ checked={settings.enabled}
135
+ onChange={(e) => updateSettings({ enabled: e.target.checked })}
136
+ />
137
+ <span className="toggle-slider" />
138
+ </label>
139
+ </div>
140
+
141
+ <div className="settings-field">
142
+ <label>Access Token</label>
143
+ <input
144
+ type="password"
145
+ className="settings-input"
146
+ placeholder="Microsoft Graph access token"
147
+ value={settings.accessToken || ''}
148
+ onChange={(e) => updateSettings({ accessToken: e.target.value || undefined })}
149
+ />
150
+ <p className="settings-hint">Use an access token with Files.ReadWrite or Files.Read scope.</p>
151
+ </div>
152
+
153
+ <div className="settings-field">
154
+ <label>Drive ID (optional)</label>
155
+ <input
156
+ type="text"
157
+ className="settings-input"
158
+ placeholder="Default: /me/drive"
159
+ value={settings.driveId || ''}
160
+ onChange={(e) => updateSettings({ driveId: e.target.value || undefined })}
161
+ />
162
+ <p className="settings-hint">Leave blank to use your default drive.</p>
163
+ </div>
164
+
165
+ <div className="settings-field">
166
+ <label>Timeout (ms)</label>
167
+ <input
168
+ type="number"
169
+ className="settings-input"
170
+ min={1000}
171
+ max={120000}
172
+ value={settings.timeoutMs ?? 20000}
173
+ onChange={(e) => updateSettings({ timeoutMs: Number(e.target.value) })}
174
+ />
175
+ </div>
176
+
177
+ <div className="settings-actions">
178
+ <button className="btn-secondary btn-sm" onClick={handleTestConnection} disabled={testing}>
179
+ {testing ? 'Testing...' : 'Test Connection'}
180
+ </button>
181
+ <button className="btn-primary btn-sm" onClick={handleSave} disabled={saving}>
182
+ {saving ? 'Saving...' : 'Save Settings'}
183
+ </button>
184
+ </div>
185
+
186
+ {testResult && (
187
+ <div className={`test-result ${testResult.success ? 'success' : 'error'}`}>
188
+ {testResult.success ? (
189
+ <span>Connected{testResult.name ? ` as ${testResult.name}` : ''}</span>
190
+ ) : (
191
+ <span>Connection failed: {testResult.error}</span>
192
+ )}
193
+ </div>
194
+ )}
195
+ </div>
196
+
197
+ <div className="settings-section">
198
+ <h4>Quick Usage</h4>
199
+ <pre className="settings-info-box">{`// List root items
200
+ onedrive_action({
201
+ action: "list_children"
202
+ });
203
+
204
+ // Upload a file to root
205
+ onedrive_action({
206
+ action: "upload_file",
207
+ file_path: "reports/summary.pdf"
208
+ });`}</pre>
209
+ </div>
210
+ </div>
211
+ );
212
+ }