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