@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.
Files changed (126) hide show
  1. package/README.md +12 -7
  2. package/dist/api-docs.html +8 -2
  3. package/dist/assets/{index-CtwxqzGG.js → index-S6cIy7hj.js} +271 -260
  4. package/dist/assets/index-uLUE6Qt1.css +32 -0
  5. package/dist/index.html +12 -4
  6. package/dist-server/server/claude-sdk.js +25 -26
  7. package/dist-server/server/claude-sdk.js.map +1 -1
  8. package/dist-server/server/index.js +0 -13
  9. package/dist-server/server/index.js.map +1 -1
  10. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +70 -1
  11. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
  12. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +52 -11
  13. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
  14. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +138 -1
  15. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
  16. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +5 -0
  17. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
  18. package/dist-server/server/modules/providers/services/provider-models.service.js +1 -1
  19. package/dist-server/server/modules/providers/tests/opencode-models.test.js +58 -1
  20. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
  21. package/dist-server/server/modules/websocket/services/websocket-server.service.js +0 -5
  22. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
  23. package/dist-server/server/openai-codex.js +9 -8
  24. package/dist-server/server/openai-codex.js.map +1 -1
  25. package/dist-server/server/opencode-cli.js +20 -2
  26. package/dist-server/server/opencode-cli.js.map +1 -1
  27. package/dist-server/server/routes/agent.js +14 -3
  28. package/dist-server/server/routes/agent.js.map +1 -1
  29. package/electron/desktopWindow.js +0 -15
  30. package/electron/launcher/launcher.js +1 -143
  31. package/electron/main.js +1 -117
  32. package/electron/preload.cjs +0 -3
  33. package/package.json +3 -8
  34. package/public/api-docs.html +8 -2
  35. package/scripts/release/prepare-desktop-app.js +0 -6
  36. package/server/claude-sdk.js +32 -26
  37. package/server/index.js +0 -14
  38. package/server/modules/providers/list/claude/claude-models.provider.ts +73 -1
  39. package/server/modules/providers/list/codex/codex-models.provider.ts +59 -11
  40. package/server/modules/providers/list/opencode/opencode-models.provider.ts +180 -1
  41. package/server/modules/providers/services/provider-capabilities.service.ts +7 -0
  42. package/server/modules/providers/services/provider-models.service.ts +1 -1
  43. package/server/modules/providers/tests/opencode-models.test.ts +62 -0
  44. package/server/modules/websocket/services/websocket-server.service.ts +0 -6
  45. package/server/openai-codex.js +9 -7
  46. package/server/opencode-cli.js +21 -2
  47. package/server/routes/agent.js +14 -3
  48. package/server/shared/types.ts +7 -0
  49. package/dist/assets/index-DlvtxFyt.css +0 -32
  50. package/dist-server/server/computer-use-agent.js +0 -242
  51. package/dist-server/server/computer-use-agent.js.map +0 -1
  52. package/dist-server/server/computer-use-mcp.js +0 -519
  53. package/dist-server/server/computer-use-mcp.js.map +0 -1
  54. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js +0 -55
  55. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js.map +0 -1
  56. package/dist-server/server/modules/computer-use/actions/raw-action-types.js +0 -2
  57. package/dist-server/server/modules/computer-use/actions/raw-action-types.js.map +0 -1
  58. package/dist-server/server/modules/computer-use/computer-executor.js +0 -212
  59. package/dist-server/server/modules/computer-use/computer-executor.js.map +0 -1
  60. package/dist-server/server/modules/computer-use/computer-semantics.service.js +0 -422
  61. package/dist-server/server/modules/computer-use/computer-semantics.service.js.map +0 -1
  62. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js +0 -126
  63. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js.map +0 -1
  64. package/dist-server/server/modules/computer-use/computer-use.routes.js +0 -196
  65. package/dist-server/server/modules/computer-use/computer-use.routes.js.map +0 -1
  66. package/dist-server/server/modules/computer-use/computer-use.service.js +0 -759
  67. package/dist-server/server/modules/computer-use/computer-use.service.js.map +0 -1
  68. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js +0 -126
  69. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js.map +0 -1
  70. package/dist-server/server/modules/computer-use/index.js +0 -3
  71. package/dist-server/server/modules/computer-use/index.js.map +0 -1
  72. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js +0 -59
  73. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js.map +0 -1
  74. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js +0 -5
  75. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js.map +0 -1
  76. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js +0 -2
  77. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js.map +0 -1
  78. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js +0 -5
  79. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js.map +0 -1
  80. package/dist-server/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  81. package/dist-server/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  82. package/dist-server/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  83. package/dist-server/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  84. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js +0 -106
  85. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js.map +0 -1
  86. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js +0 -78
  87. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js.map +0 -1
  88. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js +0 -68
  89. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js.map +0 -1
  90. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js +0 -16
  91. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js.map +0 -1
  92. package/dist-server/server/modules/computer-use/semantics/semantic-types.js +0 -2
  93. package/dist-server/server/modules/computer-use/semantics/semantic-types.js.map +0 -1
  94. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js +0 -39
  95. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js.map +0 -1
  96. package/electron/computerAgent.js +0 -290
  97. package/scripts/build-computer-semantics.mjs +0 -133
  98. package/scripts/copy-computer-semantics-bin.mjs +0 -24
  99. package/server/computer-use-agent.ts +0 -279
  100. package/server/computer-use-mcp.ts +0 -574
  101. package/server/modules/computer-use/actions/raw-action-dispatcher.ts +0 -67
  102. package/server/modules/computer-use/actions/raw-action-types.ts +0 -28
  103. package/server/modules/computer-use/computer-executor.ts +0 -242
  104. package/server/modules/computer-use/computer-semantics.service.ts +0 -460
  105. package/server/modules/computer-use/computer-use-mcp.routes.ts +0 -141
  106. package/server/modules/computer-use/computer-use.routes.ts +0 -211
  107. package/server/modules/computer-use/computer-use.service.ts +0 -920
  108. package/server/modules/computer-use/desktop-agent-relay.service.ts +0 -158
  109. package/server/modules/computer-use/index.ts +0 -2
  110. package/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.ts +0 -82
  111. package/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.ts +0 -5
  112. package/server/modules/computer-use/semantics/adapters/semantic-adapter.ts +0 -23
  113. package/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.ts +0 -5
  114. package/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  115. package/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  116. package/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  117. package/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  118. package/server/modules/computer-use/semantics/helpers/macos/CloudCLISemantics.swift +0 -467
  119. package/server/modules/computer-use/semantics/helpers/semantic-helper-process.ts +0 -124
  120. package/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.ts +0 -97
  121. package/server/modules/computer-use/semantics/helpers/windows/CloudCLISemantics.csproj +0 -11
  122. package/server/modules/computer-use/semantics/helpers/windows/Program.cs +0 -534
  123. package/server/modules/computer-use/semantics/semantic-session-store.ts +0 -87
  124. package/server/modules/computer-use/semantics/semantic-tool-dispatcher.ts +0 -17
  125. package/server/modules/computer-use/semantics/semantic-types.ts +0 -58
  126. 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, systemPreferences } from 'electron';
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();
@@ -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.35.0",
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:semantics && npm run build:client && npm run build:server",
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 && npm run build:semantics",
54
+ "postinstall": "node scripts/fix-node-pty.js",
60
55
  "prepare": "husky",
61
56
  "update:platform": "./update-platform.sh"
62
57
  },
@@ -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 Codex) to work on a project.</p>
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>codex</code> (default: <code>claude</code>)</td>
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');