@vitalops/opendesk-sdk 0.1.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 (64) hide show
  1. package/README.md +176 -0
  2. package/bin/opendesk-mcp.js +14 -0
  3. package/bin/opendesk.js +40 -0
  4. package/dist/client.d.ts +74 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +55 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/computer/sandbox.d.ts +31 -0
  9. package/dist/computer/sandbox.d.ts.map +1 -0
  10. package/dist/computer/sandbox.js +65 -0
  11. package/dist/computer/sandbox.js.map +1 -0
  12. package/dist/index.d.ts +8 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +8 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/install.d.ts +10 -0
  17. package/dist/install.d.ts.map +1 -0
  18. package/dist/install.js +49 -0
  19. package/dist/install.js.map +1 -0
  20. package/dist/mcp.d.ts +18 -0
  21. package/dist/mcp.d.ts.map +1 -0
  22. package/dist/mcp.js +56 -0
  23. package/dist/mcp.js.map +1 -0
  24. package/dist/registry.d.ts +9 -0
  25. package/dist/registry.d.ts.map +1 -0
  26. package/dist/registry.js +41 -0
  27. package/dist/registry.js.map +1 -0
  28. package/dist/tools/app.d.ts +21 -0
  29. package/dist/tools/app.d.ts.map +1 -0
  30. package/dist/tools/app.js +101 -0
  31. package/dist/tools/app.js.map +1 -0
  32. package/dist/tools/audit.d.ts +21 -0
  33. package/dist/tools/audit.d.ts.map +1 -0
  34. package/dist/tools/audit.js +34 -0
  35. package/dist/tools/audit.js.map +1 -0
  36. package/dist/tools/base.d.ts +33 -0
  37. package/dist/tools/base.d.ts.map +1 -0
  38. package/dist/tools/base.js +22 -0
  39. package/dist/tools/base.js.map +1 -0
  40. package/dist/tools/clipboard.d.ts +21 -0
  41. package/dist/tools/clipboard.d.ts.map +1 -0
  42. package/dist/tools/clipboard.js +39 -0
  43. package/dist/tools/clipboard.js.map +1 -0
  44. package/dist/tools/keyboard.d.ts +37 -0
  45. package/dist/tools/keyboard.d.ts.map +1 -0
  46. package/dist/tools/keyboard.js +62 -0
  47. package/dist/tools/keyboard.js.map +1 -0
  48. package/dist/tools/mouse.d.ts +37 -0
  49. package/dist/tools/mouse.d.ts.map +1 -0
  50. package/dist/tools/mouse.js +77 -0
  51. package/dist/tools/mouse.js.map +1 -0
  52. package/dist/tools/ocr.d.ts +19 -0
  53. package/dist/tools/ocr.d.ts.map +1 -0
  54. package/dist/tools/ocr.js +39 -0
  55. package/dist/tools/ocr.js.map +1 -0
  56. package/dist/tools/screenshot.d.ts +28 -0
  57. package/dist/tools/screenshot.d.ts.map +1 -0
  58. package/dist/tools/screenshot.js +41 -0
  59. package/dist/tools/screenshot.js.map +1 -0
  60. package/dist/tools/ui.d.ts +55 -0
  61. package/dist/tools/ui.d.ts.map +1 -0
  62. package/dist/tools/ui.js +173 -0
  63. package/dist/tools/ui.js.map +1 -0
  64. package/package.json +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../src/tools/mouse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Tool, ToolContext, ToolResult } from "./base.js";
2
+ export declare class OCRTool extends Tool {
3
+ name: string;
4
+ description: string;
5
+ schema: {
6
+ type: string;
7
+ properties: {
8
+ region: {
9
+ type: string;
10
+ items: {
11
+ type: string;
12
+ };
13
+ description: string;
14
+ };
15
+ };
16
+ };
17
+ execute(ctx: ToolContext, params: Record<string, unknown>): Promise<ToolResult>;
18
+ }
19
+ //# sourceMappingURL=ocr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocr.d.ts","sourceRoot":"","sources":["../../src/tools/ocr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AAG3E,qBAAa,OAAQ,SAAQ,IAAI;IAC/B,IAAI,SAAS;IACb,WAAW,SAAgE;IAE3E,MAAM;;;;;;;;;;;MAKJ;IAEI,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CA8BtF"}
@@ -0,0 +1,39 @@
1
+ import { Tool, checkPermission } from "./base.js";
2
+ import { getSandbox } from "../computer/sandbox.js";
3
+ export class OCRTool extends Tool {
4
+ name = "ocr";
5
+ description = "Extract text from the screen or a screen region using OCR.";
6
+ schema = {
7
+ type: "object",
8
+ properties: {
9
+ region: { type: "array", items: { type: "integer" }, description: "[x, y, width, height] — omit for full screen" },
10
+ },
11
+ };
12
+ async execute(ctx, params) {
13
+ await checkPermission(ctx, "ocr", "extract text", "Run OCR on screen");
14
+ try {
15
+ const screenshot = await import("screenshot-desktop");
16
+ const { createWorker } = await import("tesseract.js");
17
+ let imgBuffer = await screenshot.default({ format: "png" });
18
+ // Crop to region if specified
19
+ if (params.region && Array.isArray(params.region) && params.region.length === 4) {
20
+ const { default: Jimp } = await import("jimp").catch(() => ({ default: null }));
21
+ if (Jimp) {
22
+ const [x, y, w, h] = params.region;
23
+ const img = await Jimp.read(imgBuffer);
24
+ img.crop(x, y, w, h);
25
+ imgBuffer = await img.getBufferAsync("image/png");
26
+ }
27
+ }
28
+ const worker = await createWorker("eng");
29
+ const { data: { text } } = await worker.recognize(imgBuffer);
30
+ await worker.terminate();
31
+ getSandbox(ctx.sessionId).recordAction("ocr", params, `${text.trim().length} chars`);
32
+ return this.ok("OCR", text.trim() || "(no text detected)");
33
+ }
34
+ catch (e) {
35
+ return this.err("OCR error", `${e}`);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=ocr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocr.js","sourceRoot":"","sources":["../../src/tools/ocr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA2B,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,OAAO,OAAQ,SAAQ,IAAI;IAC/B,IAAI,GAAG,KAAK,CAAC;IACb,WAAW,GAAG,4DAA4D,CAAC;IAE3E,MAAM,GAAG;QACP,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE;SACnH;KACF,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,GAAgB,EAAE,MAA+B;QAC7D,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACtD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YAEtD,IAAI,SAAS,GAAW,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAEpE,8BAA8B;YAC9B,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChF,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAkB,CAAC;oBAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACvC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACrB,SAAS,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC7D,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAEzB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,QAAQ,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,oBAAoB,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import { Tool, ToolContext, ToolResult } from "./base.js";
2
+ export declare class ScreenshotTool extends Tool {
3
+ name: string;
4
+ description: string;
5
+ schema: {
6
+ type: string;
7
+ properties: {
8
+ marks: {
9
+ type: string;
10
+ description: string;
11
+ default: boolean;
12
+ };
13
+ savePath: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ region: {
18
+ type: string;
19
+ items: {
20
+ type: string;
21
+ };
22
+ description: string;
23
+ };
24
+ };
25
+ };
26
+ execute(ctx: ToolContext, params: Record<string, unknown>): Promise<ToolResult>;
27
+ }
28
+ //# sourceMappingURL=screenshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AAG3E,qBAAa,cAAe,SAAQ,IAAI;IACtC,IAAI,SAAgB;IACpB,WAAW,SAE2E;IAEtF,MAAM;;;;;;;;;;;;;;;;;;;;MAOJ;IAEI,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CA+BtF"}
@@ -0,0 +1,41 @@
1
+ import { Tool, checkPermission } from "./base.js";
2
+ import { getSandbox } from "../computer/sandbox.js";
3
+ export class ScreenshotTool extends Tool {
4
+ name = "screenshot";
5
+ description = "Capture a screenshot of the current screen or a sub-region. " +
6
+ "Pass marks=true to overlay numbered boxes on interactive elements (Set-of-Marks).";
7
+ schema = {
8
+ type: "object",
9
+ properties: {
10
+ marks: { type: "boolean", description: "Overlay Set-of-Marks on interactive elements", default: false },
11
+ savePath: { type: "string", description: "Absolute path to save the PNG on disk" },
12
+ region: { type: "array", items: { type: "integer" }, description: "[x, y, width, height]" },
13
+ },
14
+ };
15
+ async execute(ctx, params) {
16
+ await checkPermission(ctx, "screenshot", "capture screen", "Take a screenshot");
17
+ try {
18
+ const screenshot = await import("screenshot-desktop");
19
+ const { default: capture } = screenshot;
20
+ let imgBuffer = await capture({ format: "png" });
21
+ const sandbox = getSandbox(ctx.sessionId);
22
+ if (params.savePath && typeof params.savePath === "string") {
23
+ const { writeFileSync } = await import("node:fs");
24
+ writeFileSync(params.savePath, imgBuffer);
25
+ }
26
+ sandbox.lastScreenshot = imgBuffer;
27
+ sandbox.recordAction("screenshot", params, `captured`);
28
+ return {
29
+ title: "Screenshot",
30
+ output: "Screenshot captured. Pass image_width and image_height from metadata to the mouse tool for correct scaling.",
31
+ error: false,
32
+ attachments: [{ filename: "screenshot.png", mediaType: "image/png", content: imgBuffer }],
33
+ metadata: {},
34
+ };
35
+ }
36
+ catch (e) {
37
+ return this.err("Screenshot error", `Failed to capture screenshot: ${e}`);
38
+ }
39
+ }
40
+ }
41
+ //# sourceMappingURL=screenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA2B,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,OAAO,cAAe,SAAQ,IAAI;IACtC,IAAI,GAAG,YAAY,CAAC;IACpB,WAAW,GACT,8DAA8D;QAC9D,mFAAmF,CAAC;IAEtF,MAAM,GAAG;QACP,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,8CAA8C,EAAE,OAAO,EAAE,KAAK,EAAE;YACvG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;YAClF,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE;SAC5F;KACF,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,GAAgB,EAAE,MAA+B;QAC7D,MAAM,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;QAEhF,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACtD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;YAExC,IAAI,SAAS,GAAW,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE1C,IAAI,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC3D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClD,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;YACnC,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAEvD,OAAO;gBACL,KAAK,EAAE,YAAY;gBACnB,MAAM,EACJ,6GAA6G;gBAC/G,KAAK,EAAE,KAAK;gBACZ,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;gBACzF,QAAQ,EAAE,EAAE;aACb,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,55 @@
1
+ import { Tool, ToolContext, ToolResult } from "./base.js";
2
+ export declare class UITool extends Tool {
3
+ name: string;
4
+ description: string;
5
+ schema: {
6
+ type: string;
7
+ required: string[];
8
+ properties: {
9
+ action: {
10
+ type: string;
11
+ enum: string[];
12
+ };
13
+ app: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ title: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ role: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ menu: {
26
+ type: string;
27
+ description: string;
28
+ };
29
+ menuItem: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ text: {
34
+ type: string;
35
+ description: string;
36
+ };
37
+ key: {
38
+ type: string;
39
+ description: string;
40
+ };
41
+ modifiers: {
42
+ type: string;
43
+ items: {
44
+ type: string;
45
+ };
46
+ description: string;
47
+ };
48
+ };
49
+ };
50
+ execute(ctx: ToolContext, params: Record<string, unknown>): Promise<ToolResult>;
51
+ private executeMac;
52
+ private executeWin;
53
+ private executeLinux;
54
+ }
55
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/tools/ui.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AAK3E,qBAAa,MAAO,SAAQ,IAAI;IAC9B,IAAI,SAAQ;IACZ,WAAW,SAEsD;IAEjE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAcJ;IAEI,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;YAuBvE,UAAU;YA0FV,UAAU;YA+BV,YAAY;CAqB3B"}
@@ -0,0 +1,173 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { Tool, checkPermission } from "./base.js";
4
+ import { getSandbox } from "../computer/sandbox.js";
5
+ const exec = promisify(execFile);
6
+ export class UITool extends Tool {
7
+ name = "ui";
8
+ description = "Interact with UI elements by their accessible label — the primary interaction tool. " +
9
+ "No pixel coordinates needed. Use this before the mouse tool.";
10
+ schema = {
11
+ type: "object",
12
+ required: ["action", "app"],
13
+ properties: {
14
+ action: { type: "string", enum: ["get_tree", "click", "click_menu", "type", "press_key", "get_value"] },
15
+ app: { type: "string", description: "Target application name" },
16
+ title: { type: "string", description: "Element label — for click/get_value" },
17
+ role: { type: "string", description: "Element role — for click/get_value" },
18
+ menu: { type: "string", description: "Menu bar label — for click_menu" },
19
+ menuItem: { type: "string", description: "Menu item label — for click_menu" },
20
+ text: { type: "string", description: "Text to type — for type" },
21
+ key: { type: "string", description: "Key name — for press_key" },
22
+ modifiers: { type: "array", items: { type: "string" }, description: "Modifier keys — for press_key" },
23
+ },
24
+ };
25
+ async execute(ctx, params) {
26
+ const { action, app, title, role, menu, menuItem, text, key, modifiers = [] } = params;
27
+ await checkPermission(ctx, "ui", `${action} in ${app}`, `UI ${action} in ${app}`);
28
+ const platform = process.platform;
29
+ try {
30
+ if (platform === "darwin") {
31
+ return await this.executeMac({ action, app, title, role, menu, menuItem, text, key, modifiers }, ctx);
32
+ }
33
+ else if (platform === "win32") {
34
+ return await this.executeWin({ action, app, title, text, key }, ctx);
35
+ }
36
+ else {
37
+ return await this.executeLinux({ action, app, title, text, key }, ctx);
38
+ }
39
+ }
40
+ catch (e) {
41
+ return this.err("UI error", `${e}`);
42
+ }
43
+ }
44
+ async executeMac(p, ctx) {
45
+ const sandbox = getSandbox(ctx.sessionId);
46
+ switch (p.action) {
47
+ case "get_tree": {
48
+ const script = `
49
+ tell application "System Events"
50
+ tell process "${p.app}"
51
+ set allElements to every UI element of window 1
52
+ set result to {}
53
+ repeat with el in allElements
54
+ try
55
+ set result to result & {name of el & " [" & role of el & "]"}
56
+ end try
57
+ end repeat
58
+ return result
59
+ end tell
60
+ end tell`;
61
+ const { stdout } = await exec("osascript", ["-e", script]);
62
+ sandbox.recordAction("ui_get_tree", { app: p.app }, "ok");
63
+ return this.ok("UI tree", stdout.trim());
64
+ }
65
+ case "click": {
66
+ const by = p.title ? `whose name is "${p.title}"` : p.role ? `whose role is "${p.role}"` : "";
67
+ const script = `
68
+ tell application "System Events"
69
+ tell process "${p.app}"
70
+ click (first UI element of window 1 ${by})
71
+ end tell
72
+ end tell`;
73
+ await exec("osascript", ["-e", script]);
74
+ sandbox.recordAction("ui_click", { app: p.app, title: p.title }, "ok");
75
+ return this.ok("UI click", `Clicked '${p.title ?? p.role}' in ${p.app}.`);
76
+ }
77
+ case "click_menu": {
78
+ const script = `
79
+ tell application "System Events"
80
+ tell process "${p.app}"
81
+ click menu item "${p.menuItem}" of menu "${p.menu}" of menu bar 1
82
+ end tell
83
+ end tell`;
84
+ await exec("osascript", ["-e", script]);
85
+ sandbox.recordAction("ui_click_menu", { app: p.app, menu: p.menu, menuItem: p.menuItem }, "ok");
86
+ return this.ok("UI click menu", `Clicked ${p.app} > ${p.menu} > ${p.menuItem}.`);
87
+ }
88
+ case "type": {
89
+ const script = `
90
+ tell application "System Events"
91
+ tell process "${p.app}"
92
+ keystroke "${p.text?.replace(/"/g, '\\"')}"
93
+ end tell
94
+ end tell`;
95
+ await exec("osascript", ["-e", script]);
96
+ sandbox.recordAction("ui_type", { app: p.app }, "ok");
97
+ return this.ok("UI type", `Typed text in ${p.app}.`);
98
+ }
99
+ case "press_key": {
100
+ const modMap = { command: "command down", shift: "shift down", option: "option down", control: "control down" };
101
+ const using = (p.modifiers ?? []).map((m) => modMap[m] ?? m).join(", ");
102
+ const usingClause = using ? ` using {${using}}` : "";
103
+ const script = `
104
+ tell application "System Events"
105
+ tell process "${p.app}"
106
+ keystroke "${p.key}"${usingClause}
107
+ end tell
108
+ end tell`;
109
+ await exec("osascript", ["-e", script]);
110
+ sandbox.recordAction("ui_press_key", { app: p.app, key: p.key }, "ok");
111
+ return this.ok("UI press key", `Pressed ${p.key} in ${p.app}.`);
112
+ }
113
+ case "get_value": {
114
+ const by = p.title ? `whose name is "${p.title}"` : p.role ? `whose role is "${p.role}"` : "";
115
+ const script = `
116
+ tell application "System Events"
117
+ tell process "${p.app}"
118
+ get value of (first UI element of window 1 ${by})
119
+ end tell
120
+ end tell`;
121
+ const { stdout } = await exec("osascript", ["-e", script]);
122
+ sandbox.recordAction("ui_get_value", { app: p.app, title: p.title }, stdout.trim());
123
+ return this.ok("UI get value", stdout.trim());
124
+ }
125
+ default:
126
+ return this.err("UI error", `Unknown action: ${p.action}`);
127
+ }
128
+ }
129
+ async executeWin(p, ctx) {
130
+ const script = (ps) => exec("powershell", ["-Command", ps]);
131
+ const sandbox = getSandbox(ctx.sessionId);
132
+ switch (p.action) {
133
+ case "click": {
134
+ const ps = `
135
+ Add-Type -AssemblyName UIAutomationClient,UIAutomationTypes
136
+ $desktop = [System.Windows.Automation.AutomationElement]::RootElement
137
+ $cond = New-Object System.Windows.Automation.PropertyCondition([System.Windows.Automation.AutomationElement]::NameProperty, "${p.title}")
138
+ $el = $desktop.FindFirst([System.Windows.Automation.TreeScope]::Descendants, $cond)
139
+ $invokePattern = $el.GetCurrentPattern([System.Windows.Automation.InvokePattern]::Pattern)
140
+ $invokePattern.Invoke()`;
141
+ await script(ps);
142
+ sandbox.recordAction("ui_click", { app: p.app, title: p.title }, "ok");
143
+ return this.ok("UI click", `Clicked '${p.title}' in ${p.app}.`);
144
+ }
145
+ case "type": {
146
+ const ps = `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('${p.text}')`;
147
+ await script(ps);
148
+ sandbox.recordAction("ui_type", { app: p.app }, "ok");
149
+ return this.ok("UI type", `Typed text in ${p.app}.`);
150
+ }
151
+ default:
152
+ return this.err("UI error", `Action '${p.action}' not yet supported on Windows.`);
153
+ }
154
+ }
155
+ async executeLinux(p, ctx) {
156
+ const sandbox = getSandbox(ctx.sessionId);
157
+ switch (p.action) {
158
+ case "click": {
159
+ await exec("xdotool", ["search", "--name", p.title ?? p.app, "click", "1"]);
160
+ sandbox.recordAction("ui_click", { app: p.app, title: p.title }, "ok");
161
+ return this.ok("UI click", `Clicked '${p.title}' in ${p.app}.`);
162
+ }
163
+ case "type": {
164
+ await exec("xdotool", ["type", "--clearmodifiers", p.text ?? ""]);
165
+ sandbox.recordAction("ui_type", { app: p.app }, "ok");
166
+ return this.ok("UI type", `Typed text in ${p.app}.`);
167
+ }
168
+ default:
169
+ return this.err("UI error", `Action '${p.action}' not yet supported on Linux.`);
170
+ }
171
+ }
172
+ }
173
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/tools/ui.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@vitalops/opendesk-sdk",
3
+ "version": "0.1.0",
4
+ "description": "JavaScript/TypeScript SDK for opendesk — give any AI agent eyes and hands on your desktop",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "bin": {
15
+ "opendesk-js": "bin/opendesk.js",
16
+ "opendesk-js-mcp": "bin/opendesk-mcp.js"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "typecheck": "tsc --noEmit"
22
+ },
23
+ "files": ["dist", "bin", "README.md"],
24
+ "keywords": ["opendesk", "computer-use", "desktop-automation", "mcp", "ai-agent"],
25
+ "license": "MIT",
26
+ "dependencies": {
27
+ "@modelcontextprotocol/sdk": "^1.0.0",
28
+ "@nut-tree-fork/nut-js": "^4.2.0",
29
+ "clipboardy": "^4.0.0",
30
+ "node-cron": "^3.0.0",
31
+ "screenshot-desktop": "^1.15.0",
32
+ "tesseract.js": "^5.0.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^20.0.0",
36
+ "@types/node-cron": "^3.0.0",
37
+ "typescript": "^5.4.0"
38
+ },
39
+ "engines": { "node": ">=18.0.0" },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/vitalops/opendesk.git",
43
+ "directory": "js"
44
+ }
45
+ }