@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
@@ -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;