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
|
@@ -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 =
|
|
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
|
+
}
|