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
@@ -0,0 +1,224 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { SharePointSettingsData } from '../../shared/types';
3
+
4
+ export function SharePointSettings() {
5
+ const [settings, setSettings] = useState<SharePointSettingsData | 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 } | 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.getSharePointSettings();
20
+ setSettings(loaded);
21
+ } catch (error) {
22
+ console.error('Failed to load SharePoint settings:', error);
23
+ }
24
+ };
25
+
26
+ const updateSettings = (updates: Partial<SharePointSettingsData>) => {
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: SharePointSettingsData = { ...settings };
37
+ await window.electronAPI.saveSharePointSettings(payload);
38
+ setSettings(payload);
39
+ await refreshStatus();
40
+ } catch (error) {
41
+ console.error('Failed to save SharePoint 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.getSharePointStatus();
51
+ setStatus(result);
52
+ } catch (error) {
53
+ console.error('Failed to load SharePoint 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.testSharePointConnection();
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 SharePoint 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="sharepoint-settings">
91
+ <div className="settings-section">
92
+ <div className="settings-section-header">
93
+ <div className="settings-title-with-badge">
94
+ <h3>Connect SharePoint</h3>
95
+ {status && (
96
+ <span
97
+ className={`sharepoint-status-badge ${statusClass}`}
98
+ title={!status.configured ? 'Access token not configured' : status.connected ? 'Connected to SharePoint' : 'Configured'}
99
+ >
100
+ {statusLabel}
101
+ </span>
102
+ )}
103
+ {statusLoading && !status && (
104
+ <span className="sharepoint-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 SharePoint using a Microsoft Graph access token, then use the built-in `sharepoint_action`
113
+ tool to search sites and manage drive items.
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 a token with Sites.ReadWrite.All or Files.ReadWrite.All scope.</p>
151
+ </div>
152
+
153
+ <div className="settings-field">
154
+ <label>Site ID (optional)</label>
155
+ <input
156
+ type="text"
157
+ className="settings-input"
158
+ placeholder="SharePoint site ID"
159
+ value={settings.siteId || ''}
160
+ onChange={(e) => updateSettings({ siteId: e.target.value || undefined })}
161
+ />
162
+ </div>
163
+
164
+ <div className="settings-field">
165
+ <label>Drive ID (optional)</label>
166
+ <input
167
+ type="text"
168
+ className="settings-input"
169
+ placeholder="Default drive ID"
170
+ value={settings.driveId || ''}
171
+ onChange={(e) => updateSettings({ driveId: e.target.value || undefined })}
172
+ />
173
+ <p className="settings-hint">Set a default drive to simplify tool calls.</p>
174
+ </div>
175
+
176
+ <div className="settings-field">
177
+ <label>Timeout (ms)</label>
178
+ <input
179
+ type="number"
180
+ className="settings-input"
181
+ min={1000}
182
+ max={120000}
183
+ value={settings.timeoutMs ?? 20000}
184
+ onChange={(e) => updateSettings({ timeoutMs: Number(e.target.value) })}
185
+ />
186
+ </div>
187
+
188
+ <div className="settings-actions">
189
+ <button className="btn-secondary btn-sm" onClick={handleTestConnection} disabled={testing}>
190
+ {testing ? 'Testing...' : 'Test Connection'}
191
+ </button>
192
+ <button className="btn-primary btn-sm" onClick={handleSave} disabled={saving}>
193
+ {saving ? 'Saving...' : 'Save Settings'}
194
+ </button>
195
+ </div>
196
+
197
+ {testResult && (
198
+ <div className={`test-result ${testResult.success ? 'success' : 'error'}`}>
199
+ {testResult.success ? (
200
+ <span>Connected{testResult.name ? ` as ${testResult.name}` : ''}</span>
201
+ ) : (
202
+ <span>Connection failed: {testResult.error}</span>
203
+ )}
204
+ </div>
205
+ )}
206
+ </div>
207
+
208
+ <div className="settings-section">
209
+ <h4>Quick Usage</h4>
210
+ <pre className="settings-info-box">{`// Search sites
211
+ sharepoint_action({
212
+ action: "search_sites",
213
+ query: "Marketing"
214
+ });
215
+
216
+ // Upload a file to the default drive
217
+ sharepoint_action({
218
+ action: "upload_file",
219
+ file_path: "reports/summary.pdf"
220
+ });`}</pre>
221
+ </div>
222
+ </div>
223
+ );
224
+ }
@@ -7,6 +7,7 @@ interface SidebarProps {
7
7
  selectedTaskId: string | null;
8
8
  onSelectTask: (id: string | null) => void;
9
9
  onOpenSettings: () => void;
10
+ onOpenMissionControl: () => void;
10
11
  onTasksChanged: () => void;
11
12
  }
12
13
 
@@ -22,6 +23,7 @@ export function Sidebar({
22
23
  selectedTaskId,
23
24
  onSelectTask,
24
25
  onOpenSettings,
26
+ onOpenMissionControl,
25
27
  onTasksChanged,
26
28
  }: SidebarProps) {
27
29
  const [menuOpenTaskId, setMenuOpenTaskId] = useState<string | null>(null);
@@ -302,12 +304,24 @@ export function Sidebar({
302
304
  <div className="sidebar cli-sidebar">
303
305
  {/* New Session Button */}
304
306
  <div className="sidebar-header">
305
- <button className="new-task-btn cli-new-task-btn" onClick={handleNewTask}>
306
- <span className="cli-btn-bracket">[</span>
307
- <span className="cli-btn-plus">+</span>
308
- <span className="cli-btn-bracket">]</span>
309
- <span className="cli-btn-text">new_session</span>
310
- </button>
307
+ <div className="cli-header-actions">
308
+ <button
309
+ className="cli-action-btn cli-mission-control-btn"
310
+ onClick={onOpenMissionControl}
311
+ title="Mission Control"
312
+ >
313
+ <span className="cli-btn-bracket">[</span>
314
+ <span className="cli-btn-accent">MC</span>
315
+ <span className="cli-btn-bracket">]</span>
316
+ <span className="cli-btn-text">mission_control</span>
317
+ </button>
318
+ <button className="new-task-btn cli-new-task-btn cli-action-btn" onClick={handleNewTask}>
319
+ <span className="cli-btn-bracket">[</span>
320
+ <span className="cli-btn-plus">+</span>
321
+ <span className="cli-btn-bracket">]</span>
322
+ <span className="cli-btn-text">new_session</span>
323
+ </button>
324
+ </div>
311
325
  </div>
312
326
 
313
327
  {/* Sessions List */}
@@ -335,9 +349,11 @@ export function Sidebar({
335
349
  <span className="cli-footer-label">SYS:</span>
336
350
  <span className="cli-footer-value">CoWork OS</span>
337
351
  </div>
338
- <button className="settings-btn cli-settings-btn" onClick={onOpenSettings} title="Settings">
339
- [cfg]
340
- </button>
352
+ <div className="cli-footer-actions">
353
+ <button className="settings-btn cli-settings-btn" onClick={onOpenSettings} title="Settings">
354
+ [cfg]
355
+ </button>
356
+ </div>
341
357
  </div>
342
358
  </div>
343
359
  );
@@ -69,6 +69,9 @@ const SCRIPT = {
69
69
  ollama: "Local with Ollama. I like the privacy.",
70
70
  openrouter: "OpenRouter. Lots of options to explore.",
71
71
  bedrock: "AWS Bedrock. Enterprise-ready.",
72
+ groq: "Groq. Speedy and efficient.",
73
+ xai: "Grok. Let's put xAI to work.",
74
+ kimi: "Kimi. Solid choice.",
72
75
  };
73
76
  return responses[provider] || "Good choice.";
74
77
  },
@@ -344,6 +347,12 @@ export function useOnboardingFlow({ onComplete }: UseOnboardingOptions) {
344
347
  return 'anthropic/claude-3.5-sonnet';
345
348
  case 'bedrock':
346
349
  return 'sonnet-4-5';
350
+ case 'groq':
351
+ return 'llama-3.1-8b-instant';
352
+ case 'xai':
353
+ return 'grok-4-fast-non-reasoning';
354
+ case 'kimi':
355
+ return 'kimi-k2.5';
347
356
  default:
348
357
  return 'sonnet-4';
349
358
  }
@@ -366,6 +375,12 @@ export function useOnboardingFlow({ onComplete }: UseOnboardingOptions) {
366
375
  testConfig.openrouter = { apiKey };
367
376
  } else if (provider === 'ollama') {
368
377
  testConfig.ollama = { baseUrl: data.ollamaUrl };
378
+ } else if (provider === 'groq') {
379
+ testConfig.groq = { apiKey };
380
+ } else if (provider === 'xai') {
381
+ testConfig.xai = { apiKey };
382
+ } else if (provider === 'kimi') {
383
+ testConfig.kimi = { apiKey };
369
384
  }
370
385
 
371
386
  return testConfig;
@@ -393,6 +408,12 @@ export function useOnboardingFlow({ onComplete }: UseOnboardingOptions) {
393
408
  settings.ollama = { baseUrl: data.ollamaUrl, model: 'llama3.2' };
394
409
  } else if (provider === 'bedrock') {
395
410
  settings.bedrock = { region: 'us-east-1', useDefaultCredentials: true };
411
+ } else if (provider === 'groq') {
412
+ settings.groq = { apiKey, model: 'llama-3.1-8b-instant' };
413
+ } else if (provider === 'xai') {
414
+ settings.xai = { apiKey, model: 'grok-4-fast-non-reasoning' };
415
+ } else if (provider === 'kimi') {
416
+ settings.kimi = { apiKey, model: 'kimi-k2.5' };
396
417
  }
397
418
 
398
419
  return settings;