@minicor/mcp-server 4.19.2 → 4.19.5

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 (53) hide show
  1. package/README.md +5 -2
  2. package/dist/__tests__/agent-service-client.test.d.ts +2 -0
  3. package/dist/__tests__/agent-service-client.test.d.ts.map +1 -0
  4. package/dist/__tests__/agent-service-client.test.js +24 -0
  5. package/dist/__tests__/agent-service-client.test.js.map +1 -0
  6. package/dist/__tests__/dev-mode-draft.test.js +3 -1
  7. package/dist/__tests__/dev-mode-draft.test.js.map +1 -1
  8. package/dist/__tests__/http-server.test.js +2 -2
  9. package/dist/__tests__/http-server.test.js.map +1 -1
  10. package/dist/__tests__/laminar-client.test.js +5 -3
  11. package/dist/__tests__/laminar-client.test.js.map +1 -1
  12. package/dist/__tests__/vm-broker.test.js +38 -10
  13. package/dist/__tests__/vm-broker.test.js.map +1 -1
  14. package/dist/__tests__/vm-management.test.js +13 -14
  15. package/dist/__tests__/vm-management.test.js.map +1 -1
  16. package/dist/agent-service-client.d.ts +4 -0
  17. package/dist/agent-service-client.d.ts.map +1 -1
  18. package/dist/agent-service-client.js.map +1 -1
  19. package/dist/laminar-client.d.ts +1 -0
  20. package/dist/laminar-client.d.ts.map +1 -1
  21. package/dist/laminar-client.js.map +1 -1
  22. package/dist/server-surface.d.ts.map +1 -1
  23. package/dist/server-surface.js +5 -2
  24. package/dist/server-surface.js.map +1 -1
  25. package/dist/tools/agents.d.ts.map +1 -1
  26. package/dist/tools/agents.js +7 -2
  27. package/dist/tools/agents.js.map +1 -1
  28. package/dist/tools/desktop-settlement.d.ts +5 -0
  29. package/dist/tools/desktop-settlement.d.ts.map +1 -0
  30. package/dist/tools/desktop-settlement.js +28 -0
  31. package/dist/tools/desktop-settlement.js.map +1 -0
  32. package/dist/tools/dev-mode-draft.d.ts.map +1 -1
  33. package/dist/tools/dev-mode-draft.js +11 -2
  34. package/dist/tools/dev-mode-draft.js.map +1 -1
  35. package/dist/tools/vm-desktop.d.ts +3 -0
  36. package/dist/tools/vm-desktop.d.ts.map +1 -0
  37. package/dist/tools/vm-desktop.js +532 -0
  38. package/dist/tools/vm-desktop.js.map +1 -0
  39. package/dist/tools/vm-rpa.d.ts.map +1 -1
  40. package/dist/tools/vm-rpa.js +33 -17
  41. package/dist/tools/vm-rpa.js.map +1 -1
  42. package/dist/tools/vm.d.ts.map +1 -1
  43. package/dist/tools/vm.js +24 -544
  44. package/dist/tools/vm.js.map +1 -1
  45. package/dist/vm-service-client.d.ts +4 -4
  46. package/dist/vm-service-client.d.ts.map +1 -1
  47. package/dist/vm-service-client.js +34 -4
  48. package/dist/vm-service-client.js.map +1 -1
  49. package/dist/vm-target.d.ts +1 -1
  50. package/dist/vm-target.d.ts.map +1 -1
  51. package/dist/vm-target.js +4 -13
  52. package/dist/vm-target.js.map +1 -1
  53. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ import type { ToolDeps } from "../types.js";
2
+ export declare function register(deps: ToolDeps, directVmTools?: boolean): void;
3
+ //# sourceMappingURL=vm-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vm-desktop.d.ts","sourceRoot":"","sources":["../../src/tools/vm-desktop.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsB5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,UAAO,QAgnB5D"}
@@ -0,0 +1,532 @@
1
+ /**
2
+ * Direct desktop access: connections, screenshots, scripts, inspection and sessions.
3
+ * Resolves targets through the VM service and calls MDS; connections live in session state.
4
+ */
5
+ import { z } from "zod";
6
+ import { desktopRejected, desktopResult } from "./desktop-settlement.js";
7
+ import { ok, text, json, DIRECT_VM_TOOLS_DISABLED_HOSTED, } from "../helpers.js";
8
+ import * as lds from "../lds-client.js";
9
+ import { generateInspectScript } from "../inspect-scripts.js";
10
+ import { fetchVmCredentials, fetchVmCredentialsSoft, resolveVmTarget, vmTargetParams, } from "../vm-target.js";
11
+ const regionParam = z
12
+ .enum(["us", "ca"])
13
+ .optional()
14
+ .describe("Region (us or ca). Auto-detected from workspace if omitted.");
15
+ const targetUserParam = z
16
+ .string()
17
+ .optional()
18
+ .describe("Windows account whose session runs this (broker/multi-session VMs only — REQUIRED there, MDS never picks a user). Omit on standalone VMs. vm_list_sessions shows the registered users.");
19
+ export function register(deps, directVmTools = true) {
20
+ const { server, state } = deps;
21
+ function requireDirect() {
22
+ if (!directVmTools)
23
+ return text(DIRECT_VM_TOOLS_DISABLED_HOSTED);
24
+ return null;
25
+ }
26
+ async function requireTarget(args) {
27
+ const disabled = requireDirect();
28
+ if (disabled)
29
+ return { ok: false, res: disabled };
30
+ const resolved = await resolveVmTarget(deps, args);
31
+ if (!resolved.ok)
32
+ return { ok: false, res: text(resolved.message) };
33
+ return { ok: true, target: resolved.target };
34
+ }
35
+ function refreshStoredMode(target, mode) {
36
+ if (state.ldsConnection?.url === target.url)
37
+ state.ldsConnection.mode = mode;
38
+ }
39
+ // ── Connection management ─────────────────────────────────
40
+ server.tool("vm_connect", "Connect to a VM. Provide vmId (from vm_list) to auto-fill credentials, or provide url directly. Discovers the MDS mode from /health: on a multi-session (broker) VM, execute/screenshot calls additionally need targetUser. The connection is remembered only by servers that outlive one call (stdio/embedded) — on the hosted server, pass vmId + workspaceId to each vm_* tool instead.", {
41
+ vmId: z.number().optional().describe("VM ID from vm_list — auto-fills url, apiKey, serviceId"),
42
+ workspaceId: z
43
+ .number()
44
+ .optional()
45
+ .describe("Workspace that owns the VM. With vmId, resolves the VM straight from the VM service — no prior vm_list needed."),
46
+ url: z.string().optional().describe("MDS base URL (Cloudflare Tunnel) — use this OR vmId"),
47
+ apiKey: z.string().optional().describe("MDS API key (not needed with vmId)"),
48
+ serviceId: z.string().optional().describe("MDS service ID (not needed with vmId)"),
49
+ region: regionParam,
50
+ }, async ({ vmId, workspaceId, url, apiKey, serviceId, region }) => {
51
+ const disabled = requireDirect();
52
+ if (disabled)
53
+ return disabled;
54
+ let connectUrl = url;
55
+ let connectApiKey = apiKey;
56
+ let connectServiceId = serviceId;
57
+ let vmName;
58
+ if (vmId) {
59
+ const vm = state.getCachedVm(vmId);
60
+ if (vm) {
61
+ if (!vm.tunnel_url) {
62
+ return text(`VM "${vm.vm_name}" has no tunnel URL — it may not be running.`);
63
+ }
64
+ connectUrl = vm.tunnel_url;
65
+ connectApiKey = vm.api_key ?? undefined;
66
+ connectServiceId = vm.service_id ?? undefined;
67
+ vmName = vm.vm_name;
68
+ // Redacted list (newer VM service): resolve the MDS credentials via
69
+ // the per-VM credentials endpoint instead of failing auth later.
70
+ if (!connectApiKey && vm.workspace_id) {
71
+ const wsId = Number(vm.workspace_id);
72
+ const creds = await fetchVmCredentialsSoft(deps, vm.workspace_id, vmId, region ??
73
+ (Number.isNaN(wsId) ? undefined : state.getWorkspaceRegion(wsId)));
74
+ connectApiKey = creds.apiKey;
75
+ connectServiceId = connectServiceId ?? creds.serviceId;
76
+ }
77
+ }
78
+ else if (workspaceId !== undefined) {
79
+ const wsRegion = region ?? state.getWorkspaceRegion(workspaceId);
80
+ const resolved = await fetchVmCredentials(deps, workspaceId, vmId, wsRegion);
81
+ if (!resolved.ok)
82
+ return text(resolved.message);
83
+ if (!resolved.creds.tunnelUrl) {
84
+ return text(`VM ${vmId} has no tunnel URL — MDS may not be installed or running. Check vm_list, or get_install_status if an install is in flight.`);
85
+ }
86
+ connectUrl = resolved.creds.tunnelUrl;
87
+ connectApiKey = resolved.creds.apiKey;
88
+ connectServiceId = resolved.creds.serviceId;
89
+ vmName = resolved.creds.vmName;
90
+ }
91
+ else {
92
+ return text("VM not found in cache. Run vm_list first to discover available VMs, or pass workspaceId alongside vmId to resolve it directly.");
93
+ }
94
+ }
95
+ if (!connectUrl) {
96
+ return text("Provide either vmId (from vm_list) or url to connect.");
97
+ }
98
+ try {
99
+ const health = await lds.health(connectUrl);
100
+ const mode = lds.modeFromHealth(health);
101
+ state.setLdsConnection({
102
+ url: connectUrl,
103
+ apiKey: connectApiKey,
104
+ serviceId: connectServiceId,
105
+ vmId,
106
+ vmName,
107
+ mode,
108
+ });
109
+ const brokerMode = mode === "broker";
110
+ let registeredUsers;
111
+ if (brokerMode) {
112
+ try {
113
+ const status = await lds.status(connectUrl, state.ldsAuth());
114
+ registeredUsers = status.users.map((u) => u.user);
115
+ }
116
+ catch {
117
+ /* surface users lazily via vm_list_sessions instead */
118
+ }
119
+ }
120
+ return ok({
121
+ connected: true,
122
+ url: connectUrl,
123
+ vmId,
124
+ vmName,
125
+ mode,
126
+ authenticated: !!(connectApiKey && connectServiceId),
127
+ service: health,
128
+ ...(registeredUsers ? { registeredUsers } : {}),
129
+ next_steps: [
130
+ ...(brokerMode
131
+ ? [
132
+ "This VM is a multi-session broker: EVERY vm_execute_script / vm_screenshot / debug_rpa_step call must include targetUser (MDS never picks a user itself)",
133
+ "Use vm_list_sessions to see registered users and their session/agent state, then ask the user which account to target",
134
+ "Use vm_start_session / vm_stop_session to manage user sessions",
135
+ ]
136
+ : [
137
+ "Take vm_screenshot to see the current desktop state",
138
+ "Use vm_inspect_ui mode 'window_list' to see running apps",
139
+ "Use the build-rpa-workflow prompt for guided automation building",
140
+ "Run Python scripts via vm_execute_script (CDP for browsers, uiautomation for desktop)",
141
+ ]),
142
+ ...(vmId !== undefined
143
+ ? [
144
+ `Pass vmId ${vmId}${workspaceId !== undefined ? ` + workspaceId ${workspaceId}` : " + workspaceId"} on each vm_* call to target this VM without depending on the connection persisting (required on the hosted server)`,
145
+ ]
146
+ : []),
147
+ ],
148
+ automation_approaches: {
149
+ browser: "CDP via Python websocket to Chrome on port 9222 → vm_execute_script",
150
+ desktop: "uiautomation/pywinauto/pyautogui → vm_execute_script",
151
+ api: "Python requests/httpx when APIs are available → vm_execute_script",
152
+ },
153
+ });
154
+ }
155
+ catch (e) {
156
+ return text(`Failed to connect to VM at ${connectUrl}: ${e.message}`);
157
+ }
158
+ });
159
+ server.tool("vm_disconnect", "Disconnect from the current VM", {}, async () => {
160
+ const disabled = requireDirect();
161
+ if (disabled)
162
+ return disabled;
163
+ state.setLdsConnection(null);
164
+ return text("Disconnected from VM.");
165
+ });
166
+ server.tool("vm_status", "Check health/status of a VM, including its MDS mode (standalone or broker)", {
167
+ ...vmTargetParams,
168
+ region: regionParam,
169
+ }, async ({ vmId, workspaceId, region }) => {
170
+ const t = await requireTarget({ vmId, workspaceId, region: region });
171
+ if (!t.ok)
172
+ return t.res;
173
+ const { target } = t;
174
+ try {
175
+ const health = await lds.health(target.url);
176
+ const mode = lds.modeFromHealth(health);
177
+ // Keep the stored mode fresh across MDS restarts.
178
+ refreshStoredMode(target, mode);
179
+ return ok({
180
+ connected: true,
181
+ url: target.url,
182
+ vmId: target.vmId,
183
+ vmName: target.vmName,
184
+ mode,
185
+ ...health,
186
+ });
187
+ }
188
+ catch (e) {
189
+ return text(`VM unreachable: ${e.message}`);
190
+ }
191
+ });
192
+ // ── Screenshot ────────────────────────────────────────────
193
+ server.tool("vm_screenshot", "Take a full-screen screenshot of the VM. Use for verifying actions worked and seeing the current desktop/browser state. For reading small text, prefer vm_screenshot_region. On a broker VM, pass targetUser to capture that user's session desktop.", {
194
+ targetUser: targetUserParam,
195
+ ...vmTargetParams,
196
+ region: regionParam,
197
+ }, async ({ targetUser, vmId, workspaceId, region }) => {
198
+ const t = await requireTarget({ vmId, workspaceId, region: region });
199
+ if (!t.ok)
200
+ return desktopResult(t.res);
201
+ const { target } = t;
202
+ let settled = false;
203
+ try {
204
+ const res = await lds.screenshot(target.url, target.auth, targetUser);
205
+ settled = true;
206
+ const { width, height, size_bytes, capture_duration_ms, timestamp } = res.metadata;
207
+ return desktopResult({
208
+ content: [
209
+ {
210
+ type: "image",
211
+ data: res.image,
212
+ mimeType: "image/png",
213
+ },
214
+ {
215
+ type: "text",
216
+ text: json({
217
+ width,
218
+ height,
219
+ size_bytes,
220
+ capture_duration_ms,
221
+ timestamp,
222
+ }),
223
+ },
224
+ ],
225
+ });
226
+ }
227
+ catch (e) {
228
+ return desktopResult(text(`Screenshot failed: ${e.message}`), settled || desktopRejected(e));
229
+ }
230
+ });
231
+ server.tool("vm_screenshot_region", "Zoom into a specific screen region. Use for reading small text or verifying specific UI elements with better resolution than full screenshots.", {
232
+ x: z.number().describe("Left X coordinate"),
233
+ y: z.number().describe("Top Y coordinate"),
234
+ width: z.number().describe("Region width in pixels"),
235
+ height: z.number().describe("Region height in pixels"),
236
+ targetUser: targetUserParam,
237
+ ...vmTargetParams,
238
+ region: z
239
+ .enum(["us", "ca"])
240
+ .optional()
241
+ .describe("Minicor region (us or ca) the workspace lives in — NOT the screen region. Auto-detected from workspace if omitted."),
242
+ }, async ({ x, y, width, height, targetUser, vmId, workspaceId, region }) => {
243
+ const t = await requireTarget({ vmId, workspaceId, region: region });
244
+ if (!t.ok)
245
+ return desktopResult(t.res);
246
+ const { target } = t;
247
+ const x2 = x + width;
248
+ const y2 = y + height;
249
+ const script = `
250
+ import json, base64, io
251
+ from PIL import ImageGrab
252
+
253
+ img = ImageGrab.grab(bbox=(${x}, ${y}, ${x2}, ${y2}))
254
+ buf = io.BytesIO()
255
+ img.save(buf, format="PNG")
256
+ b64 = base64.b64encode(buf.getvalue()).decode("utf-8")
257
+ print(json.dumps({"image": b64, "width": img.width, "height": img.height}))
258
+ `.trim();
259
+ let settled = false;
260
+ try {
261
+ const res = await lds.execute(target.url, script, { targetUser }, target.auth);
262
+ settled = true;
263
+ if (!res.success) {
264
+ return desktopResult(text(`Region screenshot failed: ${res.stderr || "unknown error"}`));
265
+ }
266
+ const parsed = JSON.parse(res.stdout);
267
+ return desktopResult({
268
+ content: [
269
+ {
270
+ type: "image",
271
+ data: parsed.image,
272
+ mimeType: "image/png",
273
+ },
274
+ {
275
+ type: "text",
276
+ text: json({
277
+ width: parsed.width,
278
+ height: parsed.height,
279
+ region: { x, y, width, height },
280
+ }),
281
+ },
282
+ ],
283
+ });
284
+ }
285
+ catch (e) {
286
+ return desktopResult(text(`Region screenshot failed: ${e.message}`), settled || desktopRejected(e));
287
+ }
288
+ });
289
+ // ── Script execution ──────────────────────────────────────
290
+ server.tool("vm_execute_script", "Execute a Python script on the VM. This is the primary tool for ALL automation: CDP websocket for browser control, uiautomation/pyautogui for desktop apps, requests/httpx for API calls. Returns stdout, stderr, exit code, and timing. On a broker VM, targetUser is required — MDS routes the script to that user's session.", {
291
+ script: z.string().describe("Python script to execute"),
292
+ executionId: z.string().optional().describe("Execution ID for tracking"),
293
+ flowId: z.string().optional().describe("Flow ID for tracking"),
294
+ targetUser: targetUserParam,
295
+ ...vmTargetParams,
296
+ region: regionParam,
297
+ }, async ({ script, executionId, flowId, targetUser, vmId, workspaceId, region }) => {
298
+ const t = await requireTarget({ vmId, workspaceId, region: region });
299
+ if (!t.ok)
300
+ return desktopResult(t.res);
301
+ const { target } = t;
302
+ let settled = false;
303
+ try {
304
+ const res = await lds.execute(target.url, script, { executionId, flowId, targetUser }, target.auth);
305
+ settled = true;
306
+ return desktopResult(ok({
307
+ success: res.success,
308
+ exitCode: res.exitCode,
309
+ stdout: res.stdout,
310
+ stderr: res.stderr,
311
+ executionTimeMs: res.executionTimeMs,
312
+ skipped: res.skipped,
313
+ stopped: res.stopped,
314
+ resultData: res.resultData,
315
+ // Broker attribution (absent on standalone).
316
+ ...(res.targetUser !== undefined ? { targetUser: res.targetUser } : {}),
317
+ }));
318
+ }
319
+ catch (e) {
320
+ return desktopResult(text(`Execution failed: ${e.message}`), settled || desktopRejected(e));
321
+ }
322
+ });
323
+ // ── Execution status ──────────────────────────────────────
324
+ // vm_execution_control is gone (MDS removed /execute/control); do not re-add.
325
+ server.tool("vm_execution_status", "Get current execution status on the VM (active script, progress, queue). On a broker VM the plain call returns the router-wide status for every user; pass targetUser (and optionally executionId) to read one user's live execution progress instead.", {
326
+ targetUser: targetUserParam,
327
+ executionId: z
328
+ .string()
329
+ .optional()
330
+ .describe("Look up progress for a specific executionId (with or without targetUser)"),
331
+ ...vmTargetParams,
332
+ region: regionParam,
333
+ }, async ({ targetUser, executionId, vmId, workspaceId, region }) => {
334
+ const t = await requireTarget({ vmId, workspaceId, region: region });
335
+ if (!t.ok)
336
+ return t.res;
337
+ const { target } = t;
338
+ try {
339
+ // A targeted lookup routes to /execute/progress, which brokers
340
+ // forward to that user's agent; the untargeted call stays on
341
+ // /execute/status (router-wide on brokers, slots on standalone).
342
+ if (targetUser || executionId) {
343
+ const progress = await lds.executionProgress(target.url, target.auth, {
344
+ targetUser,
345
+ executionId,
346
+ });
347
+ return ok(progress);
348
+ }
349
+ const status = await lds.executionStatus(target.url, target.auth);
350
+ return ok(status);
351
+ }
352
+ catch (e) {
353
+ return text(`Failed to get execution status: ${e.message}`);
354
+ }
355
+ });
356
+ // ── User sessions (multi-session / broker VMs) ─────────────
357
+ server.tool("vm_list_sessions", "List the registered users on a multi-session (broker) VM with their session and agent state (GET /status). Use this to pick a targetUser for vm_execute_script / vm_screenshot, or to show the user which accounts are available. Requires API-key auth (target by vmId + workspaceId, or connect with vmId or apiKey+serviceId).", {
358
+ ...vmTargetParams,
359
+ region: regionParam,
360
+ }, async ({ vmId, workspaceId, region }) => {
361
+ const t = await requireTarget({ vmId, workspaceId, region: region });
362
+ if (!t.ok)
363
+ return t.res;
364
+ const { target } = t;
365
+ try {
366
+ // /status only exists on brokers; probe mode so a standalone 404 reads clearly.
367
+ const mode = await lds.discoverMode(target.url);
368
+ refreshStoredMode(target, mode);
369
+ if (mode !== "broker") {
370
+ return text(`This VM runs MDS in '${mode}' mode — per-user sessions only exist on multi-session (broker) VMs. Standalone tools work without targetUser.`);
371
+ }
372
+ const status = await lds.status(target.url, target.auth);
373
+ return ok({
374
+ mode,
375
+ broker: status.broker,
376
+ users: status.users,
377
+ queues: status.queues,
378
+ hint: "Pass one of these users as targetUser to vm_execute_script / vm_screenshot / debug_rpa_step. State 'active' means a live agent; 'stopped'/'provisioned' users need vm_start_session (or any job) first.",
379
+ });
380
+ }
381
+ catch (e) {
382
+ return text(`Failed to list sessions: ${e.message}`);
383
+ }
384
+ });
385
+ server.tool("vm_start_session", "Start (or reconnect) a registered user's session on the connected broker VM (POST /sessions/{user}/start). Blocks until the session is up and its agent is registered. Fails with a typed error when the session keeper is disabled (session_start_disabled) or the user is not registered.", {
386
+ user: z.string().describe("Registered Windows account name (see vm_list_sessions)"),
387
+ ...vmTargetParams,
388
+ region: regionParam,
389
+ }, async ({ user, vmId, workspaceId, region }) => {
390
+ const t = await requireTarget({ vmId, workspaceId, region: region });
391
+ if (!t.ok)
392
+ return desktopResult(t.res);
393
+ let settled = false;
394
+ try {
395
+ const result = await lds.sessionStart(t.target.url, user, t.target.auth);
396
+ settled = true;
397
+ return desktopResult(ok({
398
+ ...result,
399
+ hint: `Session for '${user}' is up — target it with targetUser='${user}'.`,
400
+ }));
401
+ }
402
+ catch (e) {
403
+ return desktopResult(text(`Failed to start session for '${user}': ${e.message}`), settled || desktopRejected(e));
404
+ }
405
+ });
406
+ server.tool("vm_stop_session", "Disconnect a registered user's session on the connected broker VM (POST /sessions/{user}/stop). The user STAYS logged in but the session goes dark and stays dark until an explicit start or a new job re-arms it; browser jobs keep working, desktop jobs are refused while dark. The keeper-host user cannot be stopped through MDS.", {
407
+ user: z.string().describe("Registered Windows account name (see vm_list_sessions)"),
408
+ ...vmTargetParams,
409
+ region: regionParam,
410
+ }, async ({ user, vmId, workspaceId, region }) => {
411
+ const t = await requireTarget({ vmId, workspaceId, region: region });
412
+ if (!t.ok)
413
+ return desktopResult(t.res);
414
+ let settled = false;
415
+ try {
416
+ const result = await lds.sessionStop(t.target.url, user, t.target.auth);
417
+ settled = true;
418
+ return desktopResult(ok(result));
419
+ }
420
+ catch (e) {
421
+ return desktopResult(text(`Failed to stop session for '${user}': ${e.message}`), settled || desktopRejected(e));
422
+ }
423
+ });
424
+ // ── UI inspection ─────────────────────────────────────────
425
+ server.tool("vm_inspect_ui", "X-ray the VM screen: list windows, get element trees with coordinates and properties, find elements at a point, or get the focused element. Use element_tree to map all interactive elements before writing desktop automation scripts.", {
426
+ mode: z
427
+ .enum([
428
+ "window_list",
429
+ "screen_info",
430
+ "element_at_point",
431
+ "element_tree",
432
+ "focused_element",
433
+ ])
434
+ .describe("Inspection mode"),
435
+ x: z.number().optional().describe("X coordinate (for element_at_point)"),
436
+ y: z.number().optional().describe("Y coordinate (for element_at_point)"),
437
+ windowTitle: z
438
+ .string()
439
+ .optional()
440
+ .describe("Window title filter (for element_tree)"),
441
+ framework: z
442
+ .enum(["auto", "uiautomation", "pywinauto", "jab"])
443
+ .optional()
444
+ .describe("Automation framework (default: auto → uiautomation)"),
445
+ depth: z
446
+ .number()
447
+ .optional()
448
+ .describe("Max tree depth (for element_tree, default 3)"),
449
+ targetUser: targetUserParam,
450
+ ...vmTargetParams,
451
+ region: regionParam,
452
+ }, async ({ mode, x, y, windowTitle, framework, depth, targetUser, vmId, workspaceId, region }) => {
453
+ const t = await requireTarget({ vmId, workspaceId, region: region });
454
+ if (!t.ok)
455
+ return desktopResult(t.res);
456
+ const { target } = t;
457
+ const script = generateInspectScript({
458
+ mode,
459
+ x,
460
+ y,
461
+ windowTitle,
462
+ framework,
463
+ depth,
464
+ });
465
+ let settled = false;
466
+ try {
467
+ const res = await lds.execute(target.url, script, { targetUser }, target.auth);
468
+ settled = true;
469
+ if (!res.success) {
470
+ return desktopResult(text(`UI inspection failed (exit ${res.exitCode}): ${res.stderr || res.stdout}`));
471
+ }
472
+ try {
473
+ return desktopResult(ok(JSON.parse(res.stdout)));
474
+ }
475
+ catch {
476
+ return desktopResult(text(res.stdout));
477
+ }
478
+ }
479
+ catch (e) {
480
+ return desktopResult(text(`UI inspection failed: ${e.message}`), settled || desktopRejected(e));
481
+ }
482
+ });
483
+ // ── Clipboard ─────────────────────────────────────────────
484
+ server.tool("vm_read_clipboard", "Read the current clipboard contents from the VM", {
485
+ targetUser: targetUserParam,
486
+ ...vmTargetParams,
487
+ region: regionParam,
488
+ }, async ({ targetUser, vmId, workspaceId, region }) => {
489
+ const t = await requireTarget({ vmId, workspaceId, region: region });
490
+ if (!t.ok)
491
+ return desktopResult(t.res);
492
+ const { target } = t;
493
+ const script = `
494
+ import json
495
+
496
+ clipboard_text = ""
497
+ try:
498
+ import win32clipboard
499
+ win32clipboard.OpenClipboard()
500
+ try:
501
+ clipboard_text = win32clipboard.GetClipboardData()
502
+ except TypeError:
503
+ clipboard_text = ""
504
+ finally:
505
+ win32clipboard.CloseClipboard()
506
+ except ImportError:
507
+ import subprocess
508
+ result = subprocess.run(["powershell", "-command", "Get-Clipboard"], capture_output=True, text=True)
509
+ clipboard_text = result.stdout.strip()
510
+
511
+ print(json.dumps({"clipboard": clipboard_text}))
512
+ `.trim();
513
+ let settled = false;
514
+ try {
515
+ const res = await lds.execute(target.url, script, { targetUser }, target.auth);
516
+ settled = true;
517
+ if (!res.success) {
518
+ return desktopResult(text(`Clipboard read failed: ${res.stderr || "unknown error"}`));
519
+ }
520
+ try {
521
+ return desktopResult(ok(JSON.parse(res.stdout)));
522
+ }
523
+ catch {
524
+ return desktopResult(text(res.stdout));
525
+ }
526
+ }
527
+ catch (e) {
528
+ return desktopResult(text(`Clipboard read failed: ${e.message}`), settled || desktopRejected(e));
529
+ }
530
+ });
531
+ }
532
+ //# sourceMappingURL=vm-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vm-desktop.js","sourceRoot":"","sources":["../../src/tools/vm-desktop.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"vm-rpa.d.ts","sourceRoot":"","sources":["../../src/tools/vm-rpa.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoB5C,8HAA8H;AAC9H,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,UAAO,QA6lB5D"}
1
+ {"version":3,"file":"vm-rpa.d.ts","sourceRoot":"","sources":["../../src/tools/vm-rpa.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoB5C,8HAA8H;AAC9H,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,UAAO,QAwnB5D"}