@cloudcli-ai/cloudcli 1.35.0 → 1.35.1

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 (94) hide show
  1. package/README.md +12 -7
  2. package/dist/assets/index-BvX30NW5.css +32 -0
  3. package/dist/assets/{index-CtwxqzGG.js → index-D1IdCTT6.js} +269 -258
  4. package/dist/index.html +12 -4
  5. package/dist-server/server/index.js +0 -13
  6. package/dist-server/server/index.js.map +1 -1
  7. package/dist-server/server/modules/websocket/services/websocket-server.service.js +0 -5
  8. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
  9. package/electron/desktopWindow.js +0 -15
  10. package/electron/launcher/launcher.js +1 -143
  11. package/electron/main.js +1 -117
  12. package/electron/preload.cjs +0 -3
  13. package/package.json +3 -8
  14. package/scripts/release/prepare-desktop-app.js +0 -6
  15. package/server/index.js +0 -14
  16. package/server/modules/websocket/services/websocket-server.service.ts +0 -6
  17. package/dist/assets/index-DlvtxFyt.css +0 -32
  18. package/dist-server/server/computer-use-agent.js +0 -242
  19. package/dist-server/server/computer-use-agent.js.map +0 -1
  20. package/dist-server/server/computer-use-mcp.js +0 -519
  21. package/dist-server/server/computer-use-mcp.js.map +0 -1
  22. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js +0 -55
  23. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js.map +0 -1
  24. package/dist-server/server/modules/computer-use/actions/raw-action-types.js +0 -2
  25. package/dist-server/server/modules/computer-use/actions/raw-action-types.js.map +0 -1
  26. package/dist-server/server/modules/computer-use/computer-executor.js +0 -212
  27. package/dist-server/server/modules/computer-use/computer-executor.js.map +0 -1
  28. package/dist-server/server/modules/computer-use/computer-semantics.service.js +0 -422
  29. package/dist-server/server/modules/computer-use/computer-semantics.service.js.map +0 -1
  30. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js +0 -126
  31. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js.map +0 -1
  32. package/dist-server/server/modules/computer-use/computer-use.routes.js +0 -196
  33. package/dist-server/server/modules/computer-use/computer-use.routes.js.map +0 -1
  34. package/dist-server/server/modules/computer-use/computer-use.service.js +0 -759
  35. package/dist-server/server/modules/computer-use/computer-use.service.js.map +0 -1
  36. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js +0 -126
  37. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js.map +0 -1
  38. package/dist-server/server/modules/computer-use/index.js +0 -3
  39. package/dist-server/server/modules/computer-use/index.js.map +0 -1
  40. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js +0 -59
  41. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js.map +0 -1
  42. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js +0 -5
  43. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js.map +0 -1
  44. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js +0 -2
  45. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js.map +0 -1
  46. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js +0 -5
  47. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js.map +0 -1
  48. package/dist-server/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  49. package/dist-server/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  50. package/dist-server/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  51. package/dist-server/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  52. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js +0 -106
  53. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js.map +0 -1
  54. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js +0 -78
  55. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js.map +0 -1
  56. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js +0 -68
  57. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js.map +0 -1
  58. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js +0 -16
  59. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js.map +0 -1
  60. package/dist-server/server/modules/computer-use/semantics/semantic-types.js +0 -2
  61. package/dist-server/server/modules/computer-use/semantics/semantic-types.js.map +0 -1
  62. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js +0 -39
  63. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js.map +0 -1
  64. package/electron/computerAgent.js +0 -290
  65. package/scripts/build-computer-semantics.mjs +0 -133
  66. package/scripts/copy-computer-semantics-bin.mjs +0 -24
  67. package/server/computer-use-agent.ts +0 -279
  68. package/server/computer-use-mcp.ts +0 -574
  69. package/server/modules/computer-use/actions/raw-action-dispatcher.ts +0 -67
  70. package/server/modules/computer-use/actions/raw-action-types.ts +0 -28
  71. package/server/modules/computer-use/computer-executor.ts +0 -242
  72. package/server/modules/computer-use/computer-semantics.service.ts +0 -460
  73. package/server/modules/computer-use/computer-use-mcp.routes.ts +0 -141
  74. package/server/modules/computer-use/computer-use.routes.ts +0 -211
  75. package/server/modules/computer-use/computer-use.service.ts +0 -920
  76. package/server/modules/computer-use/desktop-agent-relay.service.ts +0 -158
  77. package/server/modules/computer-use/index.ts +0 -2
  78. package/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.ts +0 -82
  79. package/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.ts +0 -5
  80. package/server/modules/computer-use/semantics/adapters/semantic-adapter.ts +0 -23
  81. package/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.ts +0 -5
  82. package/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  83. package/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  84. package/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  85. package/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  86. package/server/modules/computer-use/semantics/helpers/macos/CloudCLISemantics.swift +0 -467
  87. package/server/modules/computer-use/semantics/helpers/semantic-helper-process.ts +0 -124
  88. package/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.ts +0 -97
  89. package/server/modules/computer-use/semantics/helpers/windows/CloudCLISemantics.csproj +0 -11
  90. package/server/modules/computer-use/semantics/helpers/windows/Program.cs +0 -534
  91. package/server/modules/computer-use/semantics/semantic-session-store.ts +0 -87
  92. package/server/modules/computer-use/semantics/semantic-tool-dispatcher.ts +0 -17
  93. package/server/modules/computer-use/semantics/semantic-types.ts +0 -58
  94. package/server/modules/websocket/services/desktop-agent-websocket.service.ts +0 -51
@@ -1,141 +0,0 @@
1
- import express from 'express';
2
-
3
- import { computerUseService } from '@/modules/computer-use/computer-use.service.js';
4
- import { semanticOperationForMcpTool } from '@/modules/computer-use/semantics/semantic-tool-dispatcher.js';
5
-
6
- const router = express.Router();
7
-
8
- function readBearerToken(header: unknown): string | null {
9
- if (typeof header !== 'string') {
10
- return null;
11
- }
12
- const trimmed = header.trim();
13
- const scheme = 'Bearer';
14
- if (trimmed.slice(0, scheme.length).toLowerCase() !== scheme.toLowerCase()) {
15
- return null;
16
- }
17
-
18
- const separator = trimmed[scheme.length];
19
- if (separator !== ' ' && separator !== '\t') {
20
- return null;
21
- }
22
-
23
- return trimmed.slice(scheme.length + 1).trimStart() || null;
24
- }
25
-
26
- function toButton(value: unknown): 'left' | 'right' | 'middle' {
27
- return value === 'right' || value === 'middle' ? value : 'left';
28
- }
29
-
30
- function toScrollDirection(value: unknown): 'up' | 'down' | 'left' | 'right' {
31
- return value === 'down' || value === 'left' || value === 'right' ? value : 'up';
32
- }
33
-
34
- function point(input: Record<string, unknown>): { x: number; y: number } | undefined {
35
- return typeof input.x === 'number' && typeof input.y === 'number'
36
- ? { x: input.x, y: input.y }
37
- : undefined;
38
- }
39
-
40
- function requireNumber(input: Record<string, unknown>, name: string): number {
41
- const value = input[name];
42
- if (typeof value !== 'number' || !Number.isFinite(value)) {
43
- throw new Error(`${name} is required and must be a finite number.`);
44
- }
45
- return value;
46
- }
47
-
48
- function requirePoint(input: Record<string, unknown>): { x: number; y: number } {
49
- return { x: requireNumber(input, 'x'), y: requireNumber(input, 'y') };
50
- }
51
-
52
- function requireNamedPoint(input: Record<string, unknown>, xName: string, yName: string): { x: number; y: number } {
53
- return { x: requireNumber(input, xName), y: requireNumber(input, yName) };
54
- }
55
-
56
- router.use((req, res, next) => {
57
- const expected = computerUseService.getMcpToken();
58
- const token = readBearerToken(req.headers.authorization) || String(req.headers['x-computer-use-mcp-token'] || '');
59
- if (!token || token !== expected) {
60
- res.status(401).json({ success: false, error: 'Invalid Computer Use MCP token.' });
61
- return;
62
- }
63
- next();
64
- });
65
-
66
- router.post('/tools/:toolName', async (req, res) => {
67
- try {
68
- const input = (req.body && typeof req.body === 'object' ? req.body : {}) as Record<string, unknown>;
69
- const sessionId = typeof input.sessionId === 'string' ? input.sessionId : undefined;
70
- const toolName = req.params.toolName;
71
- const semanticOperation = semanticOperationForMcpTool(toolName);
72
- let result: unknown;
73
-
74
- if (semanticOperation) {
75
- result = await computerUseService.callSemanticTool(semanticOperation, input);
76
- res.json({ success: true, data: result });
77
- return;
78
- }
79
-
80
- switch (toolName) {
81
- case 'computer_screenshot':
82
- result = await computerUseService.agentScreenshot(sessionId);
83
- break;
84
- case 'computer_cursor_position':
85
- result = await computerUseService.agentCursorPosition(sessionId);
86
- break;
87
- case 'computer_mouse_move':
88
- result = await computerUseService.agentMouseMove(sessionId, requirePoint(input));
89
- break;
90
- case 'computer_click':
91
- result = await computerUseService.agentUnifiedClick(sessionId, {
92
- button: toButton(input.mouseButton ?? input.mouse_button ?? input.button),
93
- point: point(input),
94
- clickCount: typeof input.clickCount === 'number'
95
- ? input.clickCount
96
- : typeof input.click_count === 'number'
97
- ? input.click_count
98
- : 1,
99
- });
100
- break;
101
- case 'computer_drag': {
102
- const from = requireNamedPoint(input, 'startX', 'startY');
103
- const to = requireNamedPoint(input, 'endX', 'endY');
104
- result = await computerUseService.agentDrag(sessionId, from, to, toButton(input.mouseButton ?? input.mouse_button ?? input.button));
105
- break;
106
- }
107
- case 'computer_type':
108
- result = await computerUseService.agentType(sessionId, String(input.text || ''));
109
- break;
110
- case 'computer_key':
111
- result = await computerUseService.agentKey(sessionId, String(input.key || ''));
112
- break;
113
- case 'computer_scroll':
114
- result = await computerUseService.agentScroll(sessionId, {
115
- direction: toScrollDirection(input.direction),
116
- amount: typeof input.amount === 'number' ? input.amount : undefined,
117
- x: typeof input.x === 'number' ? input.x : undefined,
118
- y: typeof input.y === 'number' ? input.y : undefined,
119
- });
120
- break;
121
- case 'computer_wait':
122
- result = await computerUseService.agentWait(sessionId, typeof input.timeoutMs === 'number' ? input.timeoutMs : undefined);
123
- break;
124
- case 'computer_close_session':
125
- result = await computerUseService.agentStopSession(sessionId);
126
- break;
127
- default:
128
- res.status(404).json({ success: false, error: `Unknown Computer Use MCP tool "${toolName}".` });
129
- return;
130
- }
131
-
132
- res.json({ success: true, data: result });
133
- } catch (error) {
134
- res.status(400).json({
135
- success: false,
136
- error: error instanceof Error ? error.message : 'Computer Use MCP tool failed.',
137
- });
138
- }
139
- });
140
-
141
- export default router;
@@ -1,211 +0,0 @@
1
- import express from 'express';
2
-
3
- import { computerUseService } from '@/modules/computer-use/computer-use.service.js';
4
- import { AppError } from '@/shared/utils.js';
5
-
6
- const router = express.Router();
7
-
8
- type AuthenticatedRequest = express.Request & {
9
- user?: {
10
- id?: string | number;
11
- };
12
- };
13
-
14
- function requireUser(req: AuthenticatedRequest): { id: string | number } {
15
- const userId = req.user?.id;
16
- if (userId === undefined || userId === null || String(userId).trim() === '') {
17
- throw new AppError('Authenticated user is required.', {
18
- code: 'AUTHENTICATED_USER_REQUIRED',
19
- statusCode: 401,
20
- });
21
- }
22
- return { id: userId };
23
- }
24
-
25
- function getErrorStatusCode(error: unknown, fallbackStatusCode: number): number {
26
- if (error instanceof AppError) {
27
- return error.statusCode;
28
- }
29
-
30
- if (error && typeof error === 'object') {
31
- const statusCode = 'statusCode' in error ? error.statusCode : 'status' in error ? error.status : undefined;
32
- if (typeof statusCode === 'number' && Number.isInteger(statusCode) && statusCode >= 400 && statusCode <= 599) {
33
- return statusCode;
34
- }
35
- }
36
-
37
- return fallbackStatusCode;
38
- }
39
-
40
- function readParam(value: string | string[] | undefined): string {
41
- return Array.isArray(value) ? value[0] || '' : value || '';
42
- }
43
-
44
- function toButton(value: unknown): 'left' | 'right' | 'middle' {
45
- return value === 'right' || value === 'middle' ? value : 'left';
46
- }
47
-
48
- router.get('/status', async (_req, res) => {
49
- try {
50
- res.json({ success: true, data: await computerUseService.getStatus() });
51
- } catch (error) {
52
- res.status(500).json({
53
- success: false,
54
- error: error instanceof Error ? error.message : 'Failed to load Computer Use status.',
55
- });
56
- }
57
- });
58
-
59
- router.get('/settings', async (req: AuthenticatedRequest, res) => {
60
- try {
61
- requireUser(req);
62
- res.json({ success: true, data: { settings: await computerUseService.getSettings() } });
63
- } catch (error) {
64
- res.status(getErrorStatusCode(error, 500)).json({
65
- success: false,
66
- error: error instanceof Error ? error.message : 'Failed to load Computer Use settings.',
67
- });
68
- }
69
- });
70
-
71
- router.put('/settings', async (req: AuthenticatedRequest, res) => {
72
- try {
73
- requireUser(req);
74
- const settings = await computerUseService.updateSettings(req.body || {});
75
- res.json({ success: true, data: { settings } });
76
- } catch (error) {
77
- res.status(getErrorStatusCode(error, 400)).json({
78
- success: false,
79
- error: error instanceof Error ? error.message : 'Failed to save Computer Use settings.',
80
- });
81
- }
82
- });
83
-
84
- router.post('/runtime/install', async (req: AuthenticatedRequest, res) => {
85
- try {
86
- requireUser(req);
87
- const result = await computerUseService.installRuntime();
88
- res.status(result.success ? 200 : 500).json({
89
- success: result.success,
90
- data: result,
91
- error: result.success ? undefined : result.message,
92
- });
93
- } catch (error) {
94
- res.status(getErrorStatusCode(error, 500)).json({
95
- success: false,
96
- error: error instanceof Error ? error.message : 'Failed to install Computer Use runtime.',
97
- });
98
- }
99
- });
100
-
101
- router.get('/sessions', async (req: AuthenticatedRequest, res) => {
102
- try {
103
- res.json({ success: true, data: { sessions: await computerUseService.listSessions(requireUser(req)) } });
104
- } catch (error) {
105
- res.status(getErrorStatusCode(error, 500)).json({
106
- success: false,
107
- error: error instanceof Error ? error.message : 'Failed to list Computer Use sessions.',
108
- });
109
- }
110
- });
111
-
112
- router.post('/sessions/:sessionId/screenshot', async (req: AuthenticatedRequest, res) => {
113
- try {
114
- const session = await computerUseService.userScreenshot(requireUser(req), readParam(req.params.sessionId));
115
- res.json({ success: true, data: { session } });
116
- } catch (error) {
117
- res.status(400).json({
118
- success: false,
119
- error: error instanceof Error ? error.message : 'Failed to capture the screen.',
120
- });
121
- }
122
- });
123
-
124
- router.post('/sessions/:sessionId/click', async (req: AuthenticatedRequest, res) => {
125
- try {
126
- const x = Number(req.body?.x);
127
- const y = Number(req.body?.y);
128
- if (!Number.isFinite(x) || !Number.isFinite(y)) {
129
- res.status(400).json({
130
- success: false,
131
- error: 'Valid numeric coordinates are required.',
132
- });
133
- return;
134
- }
135
-
136
- const session = await computerUseService.userClick(requireUser(req), readParam(req.params.sessionId), {
137
- x,
138
- y,
139
- button: toButton(req.body?.button),
140
- double: req.body?.double === true,
141
- });
142
- res.json({ success: true, data: { session } });
143
- } catch (error) {
144
- res.status(400).json({
145
- success: false,
146
- error: error instanceof Error ? error.message : 'Failed to click.',
147
- });
148
- }
149
- });
150
-
151
- router.post('/sessions/:sessionId/press-key', async (req: AuthenticatedRequest, res) => {
152
- try {
153
- const session = await computerUseService.userPressKey(requireUser(req), readParam(req.params.sessionId), String(req.body?.key || ''));
154
- res.json({ success: true, data: { session } });
155
- } catch (error) {
156
- res.status(400).json({
157
- success: false,
158
- error: error instanceof Error ? error.message : 'Failed to send key input.',
159
- });
160
- }
161
- });
162
-
163
- router.post('/sessions/:sessionId/consent/grant', async (req: AuthenticatedRequest, res) => {
164
- try {
165
- const session = await computerUseService.grantAgentAccess(requireUser(req), readParam(req.params.sessionId));
166
- res.json({ success: true, data: { session } });
167
- } catch (error) {
168
- res.status(400).json({
169
- success: false,
170
- error: error instanceof Error ? error.message : 'Failed to grant control.',
171
- });
172
- }
173
- });
174
-
175
- router.post('/sessions/:sessionId/consent/revoke', async (req: AuthenticatedRequest, res) => {
176
- try {
177
- const session = await computerUseService.revokeAgentAccess(requireUser(req), readParam(req.params.sessionId));
178
- res.json({ success: true, data: { session } });
179
- } catch (error) {
180
- res.status(400).json({
181
- success: false,
182
- error: error instanceof Error ? error.message : 'Failed to revoke control.',
183
- });
184
- }
185
- });
186
-
187
- router.post('/sessions/:sessionId/stop', async (req: AuthenticatedRequest, res) => {
188
- try {
189
- const result = await computerUseService.stopSession(requireUser(req), readParam(req.params.sessionId));
190
- res.json({ success: true, data: result });
191
- } catch (error) {
192
- res.status(400).json({
193
- success: false,
194
- error: error instanceof Error ? error.message : 'Failed to stop Computer Use session.',
195
- });
196
- }
197
- });
198
-
199
- router.delete('/sessions/:sessionId', async (req: AuthenticatedRequest, res) => {
200
- try {
201
- const result = await computerUseService.deleteSession(requireUser(req), readParam(req.params.sessionId));
202
- res.json({ success: true, data: result });
203
- } catch (error) {
204
- res.status(400).json({
205
- success: false,
206
- error: error instanceof Error ? error.message : 'Failed to delete Computer Use session.',
207
- });
208
- }
209
- });
210
-
211
- export default router;