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
|
@@ -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
|
-
<
|
|
306
|
-
<
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
<
|
|
339
|
-
|
|
340
|
-
|
|
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;
|