@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.
- package/README.md +176 -0
- package/bin/opendesk-mcp.js +14 -0
- package/bin/opendesk.js +40 -0
- package/dist/client.d.ts +74 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +55 -0
- package/dist/client.js.map +1 -0
- package/dist/computer/sandbox.d.ts +31 -0
- package/dist/computer/sandbox.d.ts.map +1 -0
- package/dist/computer/sandbox.js +65 -0
- package/dist/computer/sandbox.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +10 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +49 -0
- package/dist/install.js.map +1 -0
- package/dist/mcp.d.ts +18 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +56 -0
- package/dist/mcp.js.map +1 -0
- package/dist/registry.d.ts +9 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +41 -0
- package/dist/registry.js.map +1 -0
- package/dist/tools/app.d.ts +21 -0
- package/dist/tools/app.d.ts.map +1 -0
- package/dist/tools/app.js +101 -0
- package/dist/tools/app.js.map +1 -0
- package/dist/tools/audit.d.ts +21 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +34 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/base.d.ts +33 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +22 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/clipboard.d.ts +21 -0
- package/dist/tools/clipboard.d.ts.map +1 -0
- package/dist/tools/clipboard.js +39 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/keyboard.d.ts +37 -0
- package/dist/tools/keyboard.d.ts.map +1 -0
- package/dist/tools/keyboard.js +62 -0
- package/dist/tools/keyboard.js.map +1 -0
- package/dist/tools/mouse.d.ts +37 -0
- package/dist/tools/mouse.d.ts.map +1 -0
- package/dist/tools/mouse.js +77 -0
- package/dist/tools/mouse.js.map +1 -0
- package/dist/tools/ocr.d.ts +19 -0
- package/dist/tools/ocr.d.ts.map +1 -0
- package/dist/tools/ocr.js +39 -0
- package/dist/tools/ocr.js.map +1 -0
- package/dist/tools/screenshot.d.ts +28 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +41 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/ui.d.ts +55 -0
- package/dist/tools/ui.d.ts.map +1 -0
- package/dist/tools/ui.js +173 -0
- package/dist/tools/ui.js.map +1 -0
- 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"}
|
package/dist/tools/ui.js
ADDED
|
@@ -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
|
+
}
|