@cloudcli-ai/cloudcli 1.35.0 → 1.36.0
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 +12 -7
- package/dist/api-docs.html +8 -2
- package/dist/assets/{index-CtwxqzGG.js → index-S6cIy7hj.js} +271 -260
- package/dist/assets/index-uLUE6Qt1.css +32 -0
- package/dist/index.html +12 -4
- package/dist-server/server/claude-sdk.js +25 -26
- package/dist-server/server/claude-sdk.js.map +1 -1
- package/dist-server/server/index.js +0 -13
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +70 -1
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +52 -11
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +138 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js +5 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-models.service.js +1 -1
- package/dist-server/server/modules/providers/tests/opencode-models.test.js +58 -1
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
- package/dist-server/server/modules/websocket/services/websocket-server.service.js +0 -5
- package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
- package/dist-server/server/openai-codex.js +9 -8
- package/dist-server/server/openai-codex.js.map +1 -1
- package/dist-server/server/opencode-cli.js +20 -2
- package/dist-server/server/opencode-cli.js.map +1 -1
- package/dist-server/server/routes/agent.js +14 -3
- package/dist-server/server/routes/agent.js.map +1 -1
- package/electron/desktopWindow.js +0 -15
- package/electron/launcher/launcher.js +1 -143
- package/electron/main.js +1 -117
- package/electron/preload.cjs +0 -3
- package/package.json +3 -8
- package/public/api-docs.html +8 -2
- package/scripts/release/prepare-desktop-app.js +0 -6
- package/server/claude-sdk.js +32 -26
- package/server/index.js +0 -14
- package/server/modules/providers/list/claude/claude-models.provider.ts +73 -1
- package/server/modules/providers/list/codex/codex-models.provider.ts +59 -11
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +180 -1
- package/server/modules/providers/services/provider-capabilities.service.ts +7 -0
- package/server/modules/providers/services/provider-models.service.ts +1 -1
- package/server/modules/providers/tests/opencode-models.test.ts +62 -0
- package/server/modules/websocket/services/websocket-server.service.ts +0 -6
- package/server/openai-codex.js +9 -7
- package/server/opencode-cli.js +21 -2
- package/server/routes/agent.js +14 -3
- package/server/shared/types.ts +7 -0
- package/dist/assets/index-DlvtxFyt.css +0 -32
- package/dist-server/server/computer-use-agent.js +0 -242
- package/dist-server/server/computer-use-agent.js.map +0 -1
- package/dist-server/server/computer-use-mcp.js +0 -519
- package/dist-server/server/computer-use-mcp.js.map +0 -1
- package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js +0 -55
- package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js.map +0 -1
- package/dist-server/server/modules/computer-use/actions/raw-action-types.js +0 -2
- package/dist-server/server/modules/computer-use/actions/raw-action-types.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-executor.js +0 -212
- package/dist-server/server/modules/computer-use/computer-executor.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-semantics.service.js +0 -422
- package/dist-server/server/modules/computer-use/computer-semantics.service.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js +0 -126
- package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-use.routes.js +0 -196
- package/dist-server/server/modules/computer-use/computer-use.routes.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-use.service.js +0 -759
- package/dist-server/server/modules/computer-use/computer-use.service.js.map +0 -1
- package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js +0 -126
- package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js.map +0 -1
- package/dist-server/server/modules/computer-use/index.js +0 -3
- package/dist-server/server/modules/computer-use/index.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js +0 -59
- package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js +0 -5
- package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js +0 -2
- package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js +0 -5
- package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
- package/dist-server/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
- package/dist-server/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
- package/dist-server/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js +0 -106
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js +0 -78
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js +0 -68
- package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js +0 -16
- package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/semantic-types.js +0 -2
- package/dist-server/server/modules/computer-use/semantics/semantic-types.js.map +0 -1
- package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js +0 -39
- package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js.map +0 -1
- package/electron/computerAgent.js +0 -290
- package/scripts/build-computer-semantics.mjs +0 -133
- package/scripts/copy-computer-semantics-bin.mjs +0 -24
- package/server/computer-use-agent.ts +0 -279
- package/server/computer-use-mcp.ts +0 -574
- package/server/modules/computer-use/actions/raw-action-dispatcher.ts +0 -67
- package/server/modules/computer-use/actions/raw-action-types.ts +0 -28
- package/server/modules/computer-use/computer-executor.ts +0 -242
- package/server/modules/computer-use/computer-semantics.service.ts +0 -460
- package/server/modules/computer-use/computer-use-mcp.routes.ts +0 -141
- package/server/modules/computer-use/computer-use.routes.ts +0 -211
- package/server/modules/computer-use/computer-use.service.ts +0 -920
- package/server/modules/computer-use/desktop-agent-relay.service.ts +0 -158
- package/server/modules/computer-use/index.ts +0 -2
- package/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.ts +0 -82
- package/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.ts +0 -5
- package/server/modules/computer-use/semantics/adapters/semantic-adapter.ts +0 -23
- package/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.ts +0 -5
- package/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
- package/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
- package/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
- package/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
- package/server/modules/computer-use/semantics/helpers/macos/CloudCLISemantics.swift +0 -467
- package/server/modules/computer-use/semantics/helpers/semantic-helper-process.ts +0 -124
- package/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.ts +0 -97
- package/server/modules/computer-use/semantics/helpers/windows/CloudCLISemantics.csproj +0 -11
- package/server/modules/computer-use/semantics/helpers/windows/Program.cs +0 -534
- package/server/modules/computer-use/semantics/semantic-session-store.ts +0 -87
- package/server/modules/computer-use/semantics/semantic-tool-dispatcher.ts +0 -17
- package/server/modules/computer-use/semantics/semantic-types.ts +0 -58
- package/server/modules/websocket/services/desktop-agent-websocket.service.ts +0 -51
|
@@ -8,14 +8,6 @@ window.__MOCK_STATE__ = {
|
|
|
8
8
|
shareableWebUrl: 'http://localhost:3001',
|
|
9
9
|
localServerRunning: false,
|
|
10
10
|
localStartupLogs: [],
|
|
11
|
-
computerUse: { enabled: false, consentMode: 'ask', running: false, connectedCount: 0, targetCount: 0 },
|
|
12
|
-
computerUsePermissions: {
|
|
13
|
-
platform: 'darwin',
|
|
14
|
-
supported: true,
|
|
15
|
-
accessibility: 'not_granted',
|
|
16
|
-
screenRecording: 'not_determined',
|
|
17
|
-
message: 'macOS requires Accessibility and Screen Recording for Computer Use.',
|
|
18
|
-
},
|
|
19
11
|
environments: [
|
|
20
12
|
{ id: 'env-api', name: 'api-gateway', subdomain: 'api-gateway', access_url: 'https://api-gateway.cloudcli.ai', status: 'running', region: 'fra1', agent: 'Claude Code' },
|
|
21
13
|
{ id: 'env-web', name: 'web-frontend', subdomain: 'web-frontend', access_url: 'https://web-frontend.cloudcli.ai', status: 'stopped', region: 'sfo1', agent: 'Codex' },
|
|
@@ -62,7 +54,6 @@ window.__MOCK_STATE__ = {
|
|
|
62
54
|
refreshEnvironments: function () { return Promise.resolve(clone(mockState)); },
|
|
63
55
|
refreshActiveTab: function () { return Promise.resolve(clone(mockState)); },
|
|
64
56
|
copyDiagnostics: function () { return Promise.resolve(clone(mockState)); },
|
|
65
|
-
showComputerAccess: function () { return Promise.resolve(clone(mockState)); },
|
|
66
57
|
showEnvironmentPicker: function () { return Promise.resolve(clone(mockState)); },
|
|
67
58
|
showLauncher: function () { return Promise.resolve(clone(mockState)); },
|
|
68
59
|
showLocalSettings: function () { return Promise.resolve(clone(mockState)); },
|
|
@@ -82,23 +73,6 @@ window.__MOCK_STATE__ = {
|
|
|
82
73
|
mockState.desktopSettings[key] = key === 'themeMode' ? value : !!value;
|
|
83
74
|
return Promise.resolve(clone(mockState));
|
|
84
75
|
},
|
|
85
|
-
updateComputerUse: function (settings) {
|
|
86
|
-
mockState.computerUse = mockState.computerUse || { enabled: false, consentMode: 'ask', running: false, connectedCount: 0, targetCount: 0 };
|
|
87
|
-
if (typeof settings.enabled === 'boolean') mockState.computerUse.enabled = settings.enabled;
|
|
88
|
-
if (settings.consentMode === 'auto' || settings.consentMode === 'ask') mockState.computerUse.consentMode = settings.consentMode;
|
|
89
|
-
mockState.computerUse.running = mockState.computerUse.enabled;
|
|
90
|
-
return Promise.resolve(clone(mockState));
|
|
91
|
-
},
|
|
92
|
-
requestComputerUsePermission: function (permission) {
|
|
93
|
-
mockState.computerUsePermissions = mockState.computerUsePermissions || {};
|
|
94
|
-
if (permission === 'accessibility') mockState.computerUsePermissions.accessibility = 'granted';
|
|
95
|
-
if (permission === 'screen') mockState.computerUsePermissions.screenRecording = 'granted';
|
|
96
|
-
if (permission === 'all') {
|
|
97
|
-
mockState.computerUsePermissions.accessibility = 'granted';
|
|
98
|
-
mockState.computerUsePermissions.screenRecording = 'granted';
|
|
99
|
-
}
|
|
100
|
-
return Promise.resolve(clone(mockState));
|
|
101
|
-
},
|
|
102
76
|
openEnvironment: function (id) {
|
|
103
77
|
var env = (mockState.environments || []).filter(function (item) { return item.id === id; })[0];
|
|
104
78
|
if (env) {
|
|
@@ -189,22 +163,6 @@ window.__MOCK_STATE__ = {
|
|
|
189
163
|
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
190
164
|
}
|
|
191
165
|
|
|
192
|
-
function computerUseStatus(state) {
|
|
193
|
-
var computerUse = state && state.computerUse ? state.computerUse : {};
|
|
194
|
-
var connectedCount = computerUse.connectedCount || 0;
|
|
195
|
-
var environmentLabel = connectedCount + ' environment' + (connectedCount === 1 ? '' : 's');
|
|
196
|
-
if (!computerUse.enabled) {
|
|
197
|
-
return { label: 'Disabled', tone: 'idle', detail: 'CloudCLI cannot use this computer.' };
|
|
198
|
-
}
|
|
199
|
-
if (!connectedCount) {
|
|
200
|
-
return { label: 'Not connected', tone: 'warn', detail: 'No environment connected.' };
|
|
201
|
-
}
|
|
202
|
-
if (computerUse.consentMode === 'auto') {
|
|
203
|
-
return { label: 'Connected', tone: 'warn', detail: environmentLabel + ' connected. Unattended access is on.' };
|
|
204
|
-
}
|
|
205
|
-
return { label: 'Connected', tone: 'ok', detail: environmentLabel + ' connected.' };
|
|
206
|
-
}
|
|
207
|
-
|
|
208
166
|
var CC = {
|
|
209
167
|
icon: icon,
|
|
210
168
|
esc: esc,
|
|
@@ -214,7 +172,6 @@ window.__MOCK_STATE__ = {
|
|
|
214
172
|
accountLabel: accountLabel,
|
|
215
173
|
localUrl: localUrl,
|
|
216
174
|
envCount: envCount,
|
|
217
|
-
computerUseStatus: computerUseStatus,
|
|
218
175
|
version: VERSION,
|
|
219
176
|
logoUrl: LOGO_URL,
|
|
220
177
|
platform: 'win',
|
|
@@ -352,42 +309,12 @@ window.__MOCK_STATE__ = {
|
|
|
352
309
|
return CC.run('Saved', function () { return bridge.updateSetting(node.key, node.value); });
|
|
353
310
|
case 'set-theme-mode':
|
|
354
311
|
return CC.run('Saved', function () { return bridge.updateSetting('themeMode', node.value); });
|
|
355
|
-
case 'set-computer-mode':
|
|
356
|
-
CC.state.computerUse = {
|
|
357
|
-
...((CC.state && CC.state.computerUse) || {}),
|
|
358
|
-
enabled: true,
|
|
359
|
-
consentMode: node.value === 'auto' ? 'auto' : 'ask',
|
|
360
|
-
};
|
|
361
|
-
return CC.run('Saved', function () {
|
|
362
|
-
return bridge.updateComputerUse({
|
|
363
|
-
enabled: true,
|
|
364
|
-
consentMode: node.value,
|
|
365
|
-
});
|
|
366
|
-
});
|
|
367
|
-
case 'set-computer-enabled':
|
|
368
|
-
CC.state.computerUse = {
|
|
369
|
-
...((CC.state && CC.state.computerUse) || {}),
|
|
370
|
-
enabled: !!node.value,
|
|
371
|
-
};
|
|
372
|
-
return CC.run('Saved', function () {
|
|
373
|
-
var current = (CC.state && CC.state.computerUse) || { consentMode: 'ask' };
|
|
374
|
-
return bridge.updateComputerUse({
|
|
375
|
-
enabled: !!node.value,
|
|
376
|
-
consentMode: current.consentMode === 'auto' ? 'auto' : 'ask',
|
|
377
|
-
});
|
|
378
|
-
});
|
|
379
|
-
case 'computer-permission':
|
|
380
|
-
return CC.run('Opening permission settings...', function () {
|
|
381
|
-
return bridge.requestComputerUsePermission(node.getAttribute('data-cc-computer-permission'));
|
|
382
|
-
});
|
|
383
312
|
case 'settings-toggle':
|
|
384
313
|
return CC.run('Opening desktop settings...', function () { return bridge.showDesktopSettings(); });
|
|
385
314
|
case 'desktop-settings-toggle':
|
|
386
315
|
return CC.run('Opening desktop settings...', function () { return bridge.showDesktopSettings(); });
|
|
387
316
|
case 'local-settings-toggle':
|
|
388
317
|
return CC.run('Opening local settings...', function () { return bridge.showLocalSettings(); });
|
|
389
|
-
case 'computer-settings-toggle':
|
|
390
|
-
return CC.run('Opening desktop settings...', function () { return bridge.showDesktopSettings(); });
|
|
391
318
|
case 'settings-close':
|
|
392
319
|
return CC.closeSheet();
|
|
393
320
|
case 'dashboard':
|
|
@@ -541,62 +468,6 @@ window.__MOCK_STATE__ = {
|
|
|
541
468
|
);
|
|
542
469
|
};
|
|
543
470
|
|
|
544
|
-
function permissionLabel(value) {
|
|
545
|
-
if (value === 'granted') return 'Granted';
|
|
546
|
-
if (value === 'denied' || value === 'restricted') return 'Needs attention';
|
|
547
|
-
if (value === 'not_applicable') return 'Not required';
|
|
548
|
-
return 'Not granted';
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
function permissionTone(value) {
|
|
552
|
-
if (value === 'granted' || value === 'not_applicable') return 'ok';
|
|
553
|
-
if (value === 'denied' || value === 'restricted') return 'warn';
|
|
554
|
-
return 'idle';
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
// TODO: Re-enable Computer Use menus after fixing the MCP server connection
|
|
558
|
-
// between the desktop app and the web UI.
|
|
559
|
-
var COMPUTER_USE_MENUS_ENABLED = false;
|
|
560
|
-
|
|
561
|
-
function renderComputerPermissionRow(key, label, detail, status) {
|
|
562
|
-
return '<div class="cc-permission-row">' +
|
|
563
|
-
'<div><div class="cc-permission-title">' + CC.esc(label) + '</div><div class="cc-permission-detail">' + CC.esc(detail) + '</div></div>' +
|
|
564
|
-
'<div class="cc-permission-actions"><span class="badge ' + permissionTone(status) + '">' + CC.esc(permissionLabel(status)) + '</span>' +
|
|
565
|
-
(status === 'granted' || status === 'not_applicable'
|
|
566
|
-
? ''
|
|
567
|
-
: '<button class="btn sm" data-cc-action="computer-permission" data-cc-computer-permission="' + CC.esc(key) + '">Open settings</button>') +
|
|
568
|
-
'</div>' +
|
|
569
|
-
'</div>';
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
function renderComputerPermissions(state) {
|
|
573
|
-
var permissions = state.computerUsePermissions || {};
|
|
574
|
-
if (!permissions.supported) {
|
|
575
|
-
return '<div class="cc-note">' + CC.esc(permissions.message || 'No additional OS permission setup is required from CloudCLI on this platform.') + '</div>';
|
|
576
|
-
}
|
|
577
|
-
return '<div class="cc-note">' + CC.esc(permissions.message || 'Grant the required OS permissions before approving agent control.') + '</div>' +
|
|
578
|
-
renderComputerPermissionRow('accessibility', 'Accessibility', 'Allows CloudCLI to click, type, and use accessibility actions.', permissions.accessibility) +
|
|
579
|
-
renderComputerPermissionRow('screen', 'Screen Recording', 'Allows CloudCLI to capture screenshots for agent observation.', permissions.screenRecording);
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
CC.buildComputerUseSection = function (state) {
|
|
583
|
-
var computerUse = state.computerUse || {};
|
|
584
|
-
var status = computerUseStatus(state);
|
|
585
|
-
var body =
|
|
586
|
-
'<div class="cc-surface">' +
|
|
587
|
-
'<label class="cc-toggle"><input type="checkbox" data-cc-computer-enabled="true"' + (computerUse.enabled ? ' checked' : '') + '><span><b>Enable Computer Use</b><br>Let CloudCLI use the computer. Agents cannot act until you approve a session.</span></label>' +
|
|
588
|
-
'<div class="cc-row2"><span class="badge ' + CC.esc(status.tone) + '">' + CC.esc(status.label) + '</span><span class="cc-meta">' + CC.esc(status.detail) + '</span><button class="btn sm" data-cc-action="refresh-environments">' + CC.icon('refresh', 14) + 'Refresh / relink</button></div>';
|
|
589
|
-
if (computerUse.enabled) {
|
|
590
|
-
body += '<div class="cc-permissions">' + renderComputerPermissions(state) + '</div>';
|
|
591
|
-
body += '<div class="cc-choice-group">' +
|
|
592
|
-
CC.renderRadioOption('computer-access-mode', 'ask', computerUse.consentMode !== 'auto', 'Ask before each session', 'Agents can request control, but you approve every session.') +
|
|
593
|
-
CC.renderRadioOption('computer-access-mode', 'auto', computerUse.consentMode === 'auto', 'Unattended access', 'Trusted agents can use this computer without a local approval prompt.') +
|
|
594
|
-
'</div>';
|
|
595
|
-
}
|
|
596
|
-
body += '</div>';
|
|
597
|
-
return CC.renderSection('COMPUTER USE', 'Control how agents can use this computer', body);
|
|
598
|
-
};
|
|
599
|
-
|
|
600
471
|
CC.renderLocalSettings = function () {
|
|
601
472
|
var state = CC.state || {};
|
|
602
473
|
var sections = [
|
|
@@ -612,13 +483,9 @@ window.__MOCK_STATE__ = {
|
|
|
612
483
|
};
|
|
613
484
|
|
|
614
485
|
CC.renderDesktopSettings = function () {
|
|
615
|
-
var state = CC.state || {};
|
|
616
486
|
var sections = [
|
|
617
|
-
CC.buildThemeSection(state),
|
|
487
|
+
CC.buildThemeSection(CC.state || {}),
|
|
618
488
|
];
|
|
619
|
-
if (COMPUTER_USE_MENUS_ENABLED) {
|
|
620
|
-
sections.push(CC.buildComputerUseSection(state));
|
|
621
|
-
}
|
|
622
489
|
CC.renderSheet('Desktop Settings', 'Manage the desktop app appearance.', sections);
|
|
623
490
|
};
|
|
624
491
|
|
|
@@ -681,15 +548,6 @@ window.__MOCK_STATE__ = {
|
|
|
681
548
|
CC.act('set-theme-mode', { value: theme.value });
|
|
682
549
|
return;
|
|
683
550
|
}
|
|
684
|
-
var computerMode = event.target.closest('[name="computer-access-mode"]');
|
|
685
|
-
if (computerMode) {
|
|
686
|
-
CC.act('set-computer-mode', { value: computerMode.value });
|
|
687
|
-
return;
|
|
688
|
-
}
|
|
689
|
-
var computerEnabled = event.target.closest('[data-cc-computer-enabled]');
|
|
690
|
-
if (computerEnabled) {
|
|
691
|
-
CC.act('set-computer-enabled', { value: computerEnabled.checked });
|
|
692
|
-
}
|
|
693
551
|
});
|
|
694
552
|
|
|
695
553
|
document.addEventListener('keydown', function (event) {
|
package/electron/main.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { app, BrowserWindow, clipboard, dialog, ipcMain, session, shell
|
|
1
|
+
import { app, BrowserWindow, clipboard, dialog, ipcMain, session, shell } from 'electron';
|
|
2
2
|
import { spawn } from 'node:child_process';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
|
|
6
6
|
import { CloudController } from './cloud.js';
|
|
7
|
-
import { ComputerAgentController } from './computerAgent.js';
|
|
8
7
|
import { DesktopWindowManager } from './desktopWindow.js';
|
|
9
8
|
import { DesktopNotificationsController } from './desktopNotifications.js';
|
|
10
9
|
import { LocalServerController } from './localServer.js';
|
|
@@ -30,7 +29,6 @@ let activeTarget = { kind: 'launcher', name: APP_NAME, url: null };
|
|
|
30
29
|
let desktopWindow = null;
|
|
31
30
|
let localServer = null;
|
|
32
31
|
let cloud = null;
|
|
33
|
-
let computerAgent = null;
|
|
34
32
|
let desktopNotifications = null;
|
|
35
33
|
let isQuitting = false;
|
|
36
34
|
let isRefreshingCloud = false;
|
|
@@ -63,10 +61,6 @@ function getSettingsPath() {
|
|
|
63
61
|
return path.join(app.getPath('userData'), 'desktop-settings.json');
|
|
64
62
|
}
|
|
65
63
|
|
|
66
|
-
function getComputerUseSettingsPath() {
|
|
67
|
-
return path.join(app.getPath('userData'), 'computer-use-settings.json');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
64
|
function getDesktopNotificationsSettingsPath() {
|
|
71
65
|
return path.join(app.getPath('userData'), 'desktop-notifications-settings.json');
|
|
72
66
|
}
|
|
@@ -78,23 +72,6 @@ function getRunningEnvironmentUrls() {
|
|
|
78
72
|
.filter(Boolean);
|
|
79
73
|
}
|
|
80
74
|
|
|
81
|
-
async function promptComputerUseConsent(sessionId) {
|
|
82
|
-
const { response } = await dialog.showMessageBox(desktopWindow?.getMainWindow() || undefined, {
|
|
83
|
-
type: 'warning',
|
|
84
|
-
buttons: ['Allow this session', 'Deny'],
|
|
85
|
-
defaultId: 0,
|
|
86
|
-
cancelId: 1,
|
|
87
|
-
title: 'Computer Use request',
|
|
88
|
-
message: 'An agent wants to control this computer',
|
|
89
|
-
detail: [
|
|
90
|
-
'A cloud agent is requesting control of your mouse, keyboard, and screen for this session.',
|
|
91
|
-
'Approval lasts for this session only. You can stop it any time from the Computer panel.',
|
|
92
|
-
sessionId ? `\nSession: ${sessionId}` : '',
|
|
93
|
-
].join('\n'),
|
|
94
|
-
});
|
|
95
|
-
return response === 0;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
75
|
function getDisplayTargetName() {
|
|
99
76
|
return activeTarget?.name || APP_NAME;
|
|
100
77
|
}
|
|
@@ -151,66 +128,10 @@ function getDesktopState() {
|
|
|
151
128
|
tabs: tabs.getSerializableTabs(),
|
|
152
129
|
activeTabId: tabs.activeTabId,
|
|
153
130
|
environments: cloud.getEnvironments().map(serializeEnvironment),
|
|
154
|
-
computerUse: computerAgent?.getState() || { enabled: false, consentMode: 'ask', running: false, connectedCount: 0, targetCount: 0 },
|
|
155
131
|
desktopNotifications: desktopNotifications?.getState() || { enabled: false, supported: false, connectedCount: 0, targetCount: 0 },
|
|
156
|
-
computerUsePermissions: getComputerUsePermissions(),
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function getComputerUsePermissions() {
|
|
161
|
-
if (process.platform !== 'darwin') {
|
|
162
|
-
return {
|
|
163
|
-
platform: process.platform,
|
|
164
|
-
supported: false,
|
|
165
|
-
accessibility: 'not_applicable',
|
|
166
|
-
screenRecording: 'not_applicable',
|
|
167
|
-
message: 'No OS permission onboarding is required from CloudCLI on this platform.',
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
let accessibility;
|
|
172
|
-
let screenRecording;
|
|
173
|
-
try {
|
|
174
|
-
accessibility = systemPreferences.isTrustedAccessibilityClient(false) ? 'granted' : 'not_granted';
|
|
175
|
-
} catch {
|
|
176
|
-
accessibility = 'unknown';
|
|
177
|
-
}
|
|
178
|
-
try {
|
|
179
|
-
screenRecording = systemPreferences.getMediaAccessStatus('screen');
|
|
180
|
-
} catch {
|
|
181
|
-
screenRecording = 'unknown';
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return {
|
|
185
|
-
platform: 'darwin',
|
|
186
|
-
supported: true,
|
|
187
|
-
accessibility,
|
|
188
|
-
screenRecording,
|
|
189
|
-
message: accessibility === 'granted' && screenRecording === 'granted'
|
|
190
|
-
? 'macOS permissions are granted.'
|
|
191
|
-
: 'macOS requires Accessibility and Screen Recording for Computer Use.',
|
|
192
132
|
};
|
|
193
133
|
}
|
|
194
134
|
|
|
195
|
-
async function requestComputerUsePermission(permission) {
|
|
196
|
-
if (process.platform !== 'darwin') {
|
|
197
|
-
return getDesktopState();
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
if (permission === 'accessibility') {
|
|
201
|
-
systemPreferences.isTrustedAccessibilityClient(true);
|
|
202
|
-
} else if (permission === 'screen') {
|
|
203
|
-
await shell.openExternal('x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture');
|
|
204
|
-
} else if (permission === 'all') {
|
|
205
|
-
systemPreferences.isTrustedAccessibilityClient(true);
|
|
206
|
-
await shell.openExternal('x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture');
|
|
207
|
-
} else {
|
|
208
|
-
throw new Error(`Unknown Computer Use permission: ${permission}`);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return getDesktopState();
|
|
212
|
-
}
|
|
213
|
-
|
|
214
135
|
async function openExternalUrl(url) {
|
|
215
136
|
if (String(url).startsWith(CALLBACK_PROTOCOL + "://")) {
|
|
216
137
|
await handleDeepLink(url);
|
|
@@ -316,8 +237,6 @@ function getDiagnosticsText() {
|
|
|
316
237
|
cloudEnvironmentCount: cloud.getEnvironments().length,
|
|
317
238
|
cloudRunningEnvironmentCount: getRunningEnvironmentUrls().length,
|
|
318
239
|
cloudAuthState: cloud.getAuthState(),
|
|
319
|
-
computerUse: computerAgent?.getState() || null,
|
|
320
|
-
computerUseSettingsPath: getComputerUseSettingsPath(),
|
|
321
240
|
cloudAccountPath: getStorePath(),
|
|
322
241
|
controlPlaneUrl: CLOUDCLI_CONTROL_PLANE_URL,
|
|
323
242
|
}, null, 2);
|
|
@@ -332,22 +251,6 @@ async function copyDiagnostics() {
|
|
|
332
251
|
});
|
|
333
252
|
}
|
|
334
253
|
|
|
335
|
-
async function showComputerAccess() {
|
|
336
|
-
await desktopWindow?.showDesktopSettings();
|
|
337
|
-
return getDesktopState();
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
async function updateComputerUse(settings) {
|
|
341
|
-
const current = computerAgent?.getSettings() || { enabled: false, consentMode: 'ask' };
|
|
342
|
-
const next = {
|
|
343
|
-
enabled: typeof settings?.enabled === 'boolean' ? settings.enabled : current.enabled,
|
|
344
|
-
consentMode: settings?.consentMode === 'auto' ? 'auto' : 'ask',
|
|
345
|
-
};
|
|
346
|
-
await computerAgent?.saveSettings(next);
|
|
347
|
-
syncDesktopState();
|
|
348
|
-
return getDesktopState();
|
|
349
|
-
}
|
|
350
|
-
|
|
351
254
|
async function refreshCloudEnvironments({ showErrors = false } = {}) {
|
|
352
255
|
isRefreshingCloud = true;
|
|
353
256
|
syncDesktopState();
|
|
@@ -370,7 +273,6 @@ async function refreshCloudEnvironments({ showErrors = false } = {}) {
|
|
|
370
273
|
throw error;
|
|
371
274
|
} finally {
|
|
372
275
|
isRefreshingCloud = false;
|
|
373
|
-
void computerAgent?.sync().catch((error) => console.error('[ComputerAgent] sync failed:', error?.message || error));
|
|
374
276
|
void desktopNotifications?.sync().catch((error) => console.error('[DesktopNotifications] sync failed:', error?.message || error));
|
|
375
277
|
syncDesktopState();
|
|
376
278
|
}
|
|
@@ -852,16 +754,10 @@ function registerIpcHandlers() {
|
|
|
852
754
|
await desktopWindow.showLauncher();
|
|
853
755
|
return getDesktopState();
|
|
854
756
|
});
|
|
855
|
-
ipcMain.handle('cloudcli-desktop:show-computer-access', async () => {
|
|
856
|
-
await showComputerAccess();
|
|
857
|
-
return getDesktopState();
|
|
858
|
-
});
|
|
859
|
-
ipcMain.handle('cloudcli-desktop:update-computer-use', async (_event, settings) => updateComputerUse(settings));
|
|
860
757
|
ipcMain.handle('cloudcli-desktop:update-desktop-notifications', async (_event, settings) => {
|
|
861
758
|
await desktopNotifications?.saveSettings(settings);
|
|
862
759
|
return getDesktopState();
|
|
863
760
|
});
|
|
864
|
-
ipcMain.handle('cloudcli-desktop:request-computer-use-permission', async (_event, permission) => requestComputerUsePermission(permission));
|
|
865
761
|
ipcMain.handle('cloudcli-desktop:show-desktop-settings', async () => desktopWindow.showDesktopSettings());
|
|
866
762
|
ipcMain.handle('cloudcli-desktop:show-local-settings', async () => desktopWindow.showLocalSettings());
|
|
867
763
|
ipcMain.handle('cloudcli-desktop:close-settings-window', async () => {
|
|
@@ -899,7 +795,6 @@ function registerAppEvents() {
|
|
|
899
795
|
});
|
|
900
796
|
|
|
901
797
|
app.on('before-quit', () => {
|
|
902
|
-
computerAgent?.stop();
|
|
903
798
|
desktopNotifications?.stop();
|
|
904
799
|
});
|
|
905
800
|
|
|
@@ -951,7 +846,6 @@ async function createDesktopWindow() {
|
|
|
951
846
|
openCloudDashboard,
|
|
952
847
|
refreshCloudEnvironments: () => refreshCloudEnvironments({ showErrors: true }),
|
|
953
848
|
setActiveTarget,
|
|
954
|
-
showComputerAccess,
|
|
955
849
|
showEnvironmentPicker,
|
|
956
850
|
showError,
|
|
957
851
|
startEnvironment,
|
|
@@ -1017,15 +911,6 @@ async function bootstrap() {
|
|
|
1017
911
|
callbackUrl: CALLBACK_URL,
|
|
1018
912
|
onChange: syncDesktopState,
|
|
1019
913
|
});
|
|
1020
|
-
computerAgent = new ComputerAgentController({
|
|
1021
|
-
appRoot: getAppRoot(),
|
|
1022
|
-
settingsPath: getComputerUseSettingsPath(),
|
|
1023
|
-
isPackaged: app.isPackaged,
|
|
1024
|
-
getRunningEnvironmentUrls,
|
|
1025
|
-
getApiKey: () => cloud.getAccount()?.apiKey || '',
|
|
1026
|
-
promptConsent: promptComputerUseConsent,
|
|
1027
|
-
onChange: syncDesktopState,
|
|
1028
|
-
});
|
|
1029
914
|
desktopNotifications = new DesktopNotificationsController({
|
|
1030
915
|
settingsPath: getDesktopNotificationsSettingsPath(),
|
|
1031
916
|
appVersion: app.getVersion(),
|
|
@@ -1042,7 +927,6 @@ async function bootstrap() {
|
|
|
1042
927
|
|
|
1043
928
|
await localServer.loadDesktopSettings();
|
|
1044
929
|
await cloud.loadCloudAccount();
|
|
1045
|
-
await computerAgent.loadSettings();
|
|
1046
930
|
await desktopNotifications.loadSettings();
|
|
1047
931
|
|
|
1048
932
|
registerProtocolHandler();
|
package/electron/preload.cjs
CHANGED
|
@@ -44,10 +44,7 @@ if (window.location.protocol === 'file:') {
|
|
|
44
44
|
refreshActiveTab: () => ipcRenderer.invoke('cloudcli-desktop:reload-active-tab'),
|
|
45
45
|
showEnvironmentPicker: () => ipcRenderer.invoke('cloudcli-desktop:show-environment-picker'),
|
|
46
46
|
showLauncher: () => ipcRenderer.invoke('cloudcli-desktop:show-launcher'),
|
|
47
|
-
showComputerAccess: () => ipcRenderer.invoke('cloudcli-desktop:show-computer-access'),
|
|
48
47
|
showLocalSettings: () => ipcRenderer.invoke('cloudcli-desktop:show-local-settings'),
|
|
49
|
-
updateComputerUse: (settings) => ipcRenderer.invoke('cloudcli-desktop:update-computer-use', settings),
|
|
50
|
-
requestComputerUsePermission: (permission) => ipcRenderer.invoke('cloudcli-desktop:request-computer-use-permission', permission),
|
|
51
48
|
showDesktopSettings: () => ipcRenderer.invoke('cloudcli-desktop:show-desktop-settings'),
|
|
52
49
|
closeSettingsWindow: () => ipcRenderer.invoke('cloudcli-desktop:close-settings-window'),
|
|
53
50
|
showActiveEnvironmentActionsMenu: () => ipcRenderer.invoke('cloudcli-desktop:show-active-environment-actions-menu'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcli-ai/cloudcli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.36.0",
|
|
4
4
|
"productName": "CloudCLI",
|
|
5
5
|
"description": "A web-based UI for Claude Code CLI",
|
|
6
6
|
"type": "module",
|
|
@@ -29,13 +29,10 @@
|
|
|
29
29
|
"scripts": {
|
|
30
30
|
"dev": "concurrently --kill-others \"npm run server:dev\" \"npm run client\"",
|
|
31
31
|
"server": "node dist-server/server/index.js",
|
|
32
|
-
"preserver:dev": "npm run build:semantics",
|
|
33
32
|
"server:dev": "tsx --tsconfig server/tsconfig.json server/index.js",
|
|
34
|
-
"preserver:dev-watch": "npm run build:semantics",
|
|
35
33
|
"server:dev-watch": "tsx watch --tsconfig server/tsconfig.json server/index.js",
|
|
36
34
|
"client": "vite",
|
|
37
35
|
"desktop": "electron electron/main.js",
|
|
38
|
-
"predesktop:dev": "npm run build:semantics",
|
|
39
36
|
"desktop:dev": "cross-env ELECTRON_DEV_URL=http://127.0.0.1:5173 electron electron/main.js",
|
|
40
37
|
"desktop:stage": "node scripts/release/prepare-desktop-app.js",
|
|
41
38
|
"desktop:pack": "npm run build && npm run desktop:stage && electron-builder --projectDir .desktop-build/desktop-app --dir",
|
|
@@ -43,12 +40,10 @@
|
|
|
43
40
|
"desktop:dist:win": "npm run build && npm run desktop:stage && electron-builder --projectDir .desktop-build/desktop-app --win nsis",
|
|
44
41
|
"server:bundle": "npm run build && node scripts/release/build-server-bundle.js",
|
|
45
42
|
"desktop:icon:mac": "node electron/scripts/generate-macos-icon.js",
|
|
46
|
-
"build": "npm run build:
|
|
43
|
+
"build": "npm run build:client && npm run build:server",
|
|
47
44
|
"build:client": "vite build",
|
|
48
|
-
"build:semantics": "node scripts/build-computer-semantics.mjs",
|
|
49
45
|
"prebuild:server": "node -e \"require('node:fs').rmSync('dist-server', { recursive: true, force: true })\"",
|
|
50
46
|
"build:server": "tsc -p server/tsconfig.json && tsc-alias -p server/tsconfig.json",
|
|
51
|
-
"postbuild:server": "node scripts/copy-computer-semantics-bin.mjs",
|
|
52
47
|
"preview": "vite preview",
|
|
53
48
|
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p server/tsconfig.json",
|
|
54
49
|
"lint": "eslint src/ server/",
|
|
@@ -56,7 +51,7 @@
|
|
|
56
51
|
"start": "npm run build && npm run server",
|
|
57
52
|
"release": "./release.sh",
|
|
58
53
|
"prepublishOnly": "npm run build",
|
|
59
|
-
"postinstall": "node scripts/fix-node-pty.js
|
|
54
|
+
"postinstall": "node scripts/fix-node-pty.js",
|
|
60
55
|
"prepare": "husky",
|
|
61
56
|
"update:platform": "./update-platform.sh"
|
|
62
57
|
},
|
package/public/api-docs.html
CHANGED
|
@@ -489,7 +489,7 @@
|
|
|
489
489
|
<span class="endpoint-path"><span class="api-url">http://localhost:3001</span>/api/agent</span>
|
|
490
490
|
</div>
|
|
491
491
|
|
|
492
|
-
<p>Trigger an AI agent (Claude, Cursor, or
|
|
492
|
+
<p>Trigger an AI agent (Claude, Cursor, Codex, Gemini, or OpenCode) to work on a project.</p>
|
|
493
493
|
|
|
494
494
|
<h4>Request Body Parameters</h4>
|
|
495
495
|
<table>
|
|
@@ -524,7 +524,7 @@
|
|
|
524
524
|
<td><code>provider</code></td>
|
|
525
525
|
<td>string</td>
|
|
526
526
|
<td><span class="badge badge-optional">Optional</span></td>
|
|
527
|
-
<td><code>claude</code>, <code>cursor</code>, or <code>
|
|
527
|
+
<td><code>claude</code>, <code>cursor</code>, <code>codex</code>, <code>gemini</code>, or <code>opencode</code> (default: <code>claude</code>)</td>
|
|
528
528
|
</tr>
|
|
529
529
|
<tr>
|
|
530
530
|
<td><code>stream</code></td>
|
|
@@ -540,6 +540,12 @@
|
|
|
540
540
|
Model identifier for the AI provider (loading from constants...)
|
|
541
541
|
</td>
|
|
542
542
|
</tr>
|
|
543
|
+
<tr>
|
|
544
|
+
<td><code>effort</code></td>
|
|
545
|
+
<td>string</td>
|
|
546
|
+
<td><span class="badge badge-optional">Optional</span></td>
|
|
547
|
+
<td>Reasoning effort for Claude, Codex, and OpenCode models that expose effort metadata. Use <code>default</code> or omit it to let the provider decide.</td>
|
|
548
|
+
</tr>
|
|
543
549
|
<tr>
|
|
544
550
|
<td><code>cleanup</code></td>
|
|
545
551
|
<td>boolean</td>
|
|
@@ -113,12 +113,6 @@ await copyRequired('electron');
|
|
|
113
113
|
await copyRequired('dist');
|
|
114
114
|
await copyRequired('public');
|
|
115
115
|
|
|
116
|
-
// The desktop app still ships the standalone Computer Use desktop agent, but
|
|
117
|
-
// not the full local server. Local CloudCLI is downloaded on demand.
|
|
118
|
-
await copyRequired('dist-server/server/computer-use-agent.js');
|
|
119
|
-
await copyIfExists('dist-server/server/computer-use-agent.js.map');
|
|
120
|
-
await copyRequired('dist-server/server/modules/computer-use');
|
|
121
|
-
|
|
122
116
|
const copiedRuntimeDependencies = [];
|
|
123
117
|
if (await copyNodeModule('ws')) {
|
|
124
118
|
copiedRuntimeDependencies.push('ws');
|