@intentic/desktop-automation 1.326.0 → 1.327.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 +37 -8
- package/dist/actions.d.ts +21 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +76 -0
- package/dist/actions.js.map +1 -0
- package/dist/cua.d.ts +49 -0
- package/dist/cua.d.ts.map +1 -0
- package/dist/cua.js +315 -0
- package/dist/cua.js.map +1 -0
- package/dist/frames.d.ts +42 -0
- package/dist/frames.d.ts.map +1 -0
- package/dist/frames.js +91 -0
- package/dist/frames.js.map +1 -0
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +97 -11
- package/dist/index.js.map +1 -1
- package/dist/{apps-linux.d.ts → linux/apps-linux.d.ts} +1 -1
- package/dist/linux/apps-linux.d.ts.map +1 -0
- package/dist/{apps-linux.js → linux/apps-linux.js} +10 -9
- package/dist/linux/apps-linux.js.map +1 -0
- package/dist/{input-linux.d.ts → linux/input-linux.d.ts} +2 -1
- package/dist/linux/input-linux.d.ts.map +1 -0
- package/dist/{input-linux.js → linux/input-linux.js} +10 -5
- package/dist/linux/input-linux.js.map +1 -0
- package/dist/parse.d.ts +9 -1
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +120 -1
- package/dist/parse.js.map +1 -1
- package/dist/png.d.ts +11 -0
- package/dist/png.d.ts.map +1 -0
- package/dist/png.js +348 -0
- package/dist/png.js.map +1 -0
- package/dist/run.d.ts +8 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +10 -5
- package/dist/run.js.map +1 -1
- package/dist/screen.d.ts +4 -2
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +56 -15
- package/dist/screen.js.map +1 -1
- package/dist/types.d.ts +38 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/view.d.ts +46 -0
- package/dist/view.d.ts.map +1 -0
- package/dist/view.js +114 -0
- package/dist/view.js.map +1 -0
- package/dist/{apps-windows.d.ts → windows/apps-windows.d.ts} +3 -1
- package/dist/windows/apps-windows.d.ts.map +1 -0
- package/dist/{apps-windows.js → windows/apps-windows.js} +13 -7
- package/dist/windows/apps-windows.js.map +1 -0
- package/dist/windows/elements-windows.d.ts +8 -0
- package/dist/windows/elements-windows.d.ts.map +1 -0
- package/dist/windows/elements-windows.js +223 -0
- package/dist/windows/elements-windows.js.map +1 -0
- package/dist/{input-windows.d.ts → windows/input-windows.d.ts} +2 -1
- package/dist/windows/input-windows.d.ts.map +1 -0
- package/dist/{input-windows.js → windows/input-windows.js} +16 -13
- package/dist/windows/input-windows.js.map +1 -0
- package/dist/{notice-windows.d.ts → windows/notice-windows.d.ts} +1 -1
- package/dist/windows/notice-windows.d.ts.map +1 -0
- package/dist/{notice-windows.js → windows/notice-windows.js} +1 -1
- package/dist/windows/notice-windows.js.map +1 -0
- package/dist/windows/powershell.d.ts +2 -0
- package/dist/windows/powershell.d.ts.map +1 -0
- package/dist/windows/powershell.js +2 -0
- package/dist/windows/powershell.js.map +1 -0
- package/dist/windows/windows-dpi.d.ts +2 -0
- package/dist/windows/windows-dpi.d.ts.map +1 -0
- package/dist/windows/windows-dpi.js +5 -0
- package/dist/windows/windows-dpi.js.map +1 -0
- package/package.json +4 -3
- package/dist/apps-linux.d.ts.map +0 -1
- package/dist/apps-linux.js.map +0 -1
- package/dist/apps-windows.d.ts.map +0 -1
- package/dist/apps-windows.js.map +0 -1
- package/dist/input-linux.d.ts.map +0 -1
- package/dist/input-linux.js.map +0 -1
- package/dist/input-windows.d.ts.map +0 -1
- package/dist/input-windows.js.map +0 -1
- package/dist/notice-windows.d.ts.map +0 -1
- package/dist/notice-windows.js.map +0 -1
package/dist/screen.js
CHANGED
|
@@ -1,23 +1,30 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
2
3
|
import { readFile, rm } from "node:fs/promises";
|
|
3
4
|
import { tmpdir } from "node:os";
|
|
4
5
|
import { join } from "node:path";
|
|
5
|
-
import {
|
|
6
|
+
import { parseDisplaysJson, parseSwayOutputs, parseXrandrMonitors } from "./parse.js";
|
|
7
|
+
import { environment, has, run } from "./run.js";
|
|
6
8
|
import { DesktopError } from "./types.js";
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
+
import { WINDOWS_DPI_AWARE } from "./windows/windows-dpi.js";
|
|
10
|
+
export const pngPath = () => join(tmpdir(), `intentic-desktop-${process.pid}-${Date.now()}-${randomUUID()}.png`);
|
|
11
|
+
const WINDOWS_CAPTURE = (out, region) => [
|
|
12
|
+
WINDOWS_DPI_AWARE,
|
|
9
13
|
"Add-Type -AssemblyName System.Windows.Forms,System.Drawing;",
|
|
10
14
|
"$b = [System.Windows.Forms.SystemInformation]::VirtualScreen;",
|
|
11
|
-
|
|
15
|
+
region === undefined
|
|
16
|
+
? "$x = $b.Left; $y = $b.Top; $w = $b.Width; $h = $b.Height;"
|
|
17
|
+
: `$x = $b.Left + ${Math.round(region.x)}; $y = $b.Top + ${Math.round(region.y)}; $w = ${Math.round(region.width)}; $h = ${Math.round(region.height)};`,
|
|
18
|
+
"$bmp = New-Object System.Drawing.Bitmap $w, $h;",
|
|
12
19
|
"$g = [System.Drawing.Graphics]::FromImage($bmp);",
|
|
13
|
-
"$g.CopyFromScreen($
|
|
20
|
+
"$g.CopyFromScreen($x, $y, 0, 0, $bmp.Size);",
|
|
14
21
|
`$bmp.Save('${out}', [System.Drawing.Imaging.ImageFormat]::Png);`,
|
|
15
22
|
"$g.Dispose(); $bmp.Dispose();",
|
|
16
23
|
].join(" ");
|
|
17
|
-
export const isWayland = () =>
|
|
18
|
-
const grabbers = (out) => {
|
|
24
|
+
export const isWayland = () => environment()["XDG_SESSION_TYPE"] === "wayland" || environment()["WAYLAND_DISPLAY"] !== undefined;
|
|
25
|
+
const grabbers = (out, region) => {
|
|
19
26
|
if (process.platform === "win32") {
|
|
20
|
-
return [{ command: "powershell.exe", args: () => ["-NoProfile", "-NonInteractive", "-Command", WINDOWS_CAPTURE(out)], install: "" }];
|
|
27
|
+
return [{ command: "powershell.exe", args: () => ["-NoProfile", "-NonInteractive", "-Command", WINDOWS_CAPTURE(out, region)], install: "" }];
|
|
21
28
|
}
|
|
22
29
|
const waylandTools = [
|
|
23
30
|
{ command: "grim", args: (path) => [path], install: "sudo apt install grim (or your distro's package)" },
|
|
@@ -27,13 +34,18 @@ const grabbers = (out) => {
|
|
|
27
34
|
const x11Tools = [
|
|
28
35
|
{ command: "import", args: (path) => ["-window", "root", path], install: "sudo apt install imagemagick" },
|
|
29
36
|
{ command: "scrot", args: (path) => [path], install: "sudo apt install scrot" },
|
|
37
|
+
{
|
|
38
|
+
command: "ffmpeg",
|
|
39
|
+
args: (path) => ["-loglevel", "error", "-f", "x11grab", "-draw_mouse", "0", "-i", environment()["DISPLAY"] ?? ":0", "-frames:v", "1", "-y", path],
|
|
40
|
+
install: "sudo apt install ffmpeg",
|
|
41
|
+
},
|
|
30
42
|
{ command: "gnome-screenshot", args: (path) => ["-f", path], install: "sudo apt install gnome-screenshot" },
|
|
31
43
|
];
|
|
32
44
|
return isWayland() ? [...waylandTools, ...x11Tools] : [...x11Tools, ...waylandTools];
|
|
33
45
|
};
|
|
34
46
|
const MISSING = "missing";
|
|
35
47
|
const attempt = (command, args) => new Promise((resolvePromise) => {
|
|
36
|
-
const child = spawn(command, [...args], { windowsHide: true });
|
|
48
|
+
const child = spawn(command, [...args], { windowsHide: true, env: environment() });
|
|
37
49
|
let said = "";
|
|
38
50
|
child.stderr?.on("data", (chunk) => {
|
|
39
51
|
said += chunk.toString();
|
|
@@ -41,15 +53,15 @@ const attempt = (command, args) => new Promise((resolvePromise) => {
|
|
|
41
53
|
child.on("error", (error) => resolvePromise(error.code === "ENOENT" ? MISSING : error.message));
|
|
42
54
|
child.on("close", (code) => resolvePromise(code === 0 ? undefined : said.trim() === "" ? `exited with code ${code}` : said.trim().slice(-300)));
|
|
43
55
|
});
|
|
44
|
-
export const hasGraphicalSession = () => process.platform === "win32" ||
|
|
45
|
-
export const capture = async () => {
|
|
56
|
+
export const hasGraphicalSession = () => process.platform === "win32" || environment()["DISPLAY"] !== undefined || environment()["WAYLAND_DISPLAY"] !== undefined;
|
|
57
|
+
export const capture = async (region) => {
|
|
46
58
|
if (!hasGraphicalSession()) {
|
|
47
59
|
throw new DesktopError("This device has no graphical session right now (no DISPLAY or WAYLAND_DISPLAY), so there is no screen.");
|
|
48
60
|
}
|
|
49
61
|
const out = pngPath();
|
|
50
62
|
const failures = [];
|
|
51
63
|
try {
|
|
52
|
-
for (const grabber of grabbers(out)) {
|
|
64
|
+
for (const grabber of grabbers(out, region)) {
|
|
53
65
|
const failed = await attempt(grabber.command, grabber.args(out));
|
|
54
66
|
if (failed === MISSING) {
|
|
55
67
|
continue;
|
|
@@ -82,9 +94,9 @@ export const pngSize = (png) => {
|
|
|
82
94
|
}
|
|
83
95
|
return { width: png.readUInt32BE(16), height: png.readUInt32BE(20) };
|
|
84
96
|
};
|
|
85
|
-
const WINDOWS_FRAME =
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
const WINDOWS_FRAME = `${WINDOWS_DPI_AWARE}Add-Type -AssemblyName System.Windows.Forms; ` +
|
|
98
|
+
`$b = [System.Windows.Forms.SystemInformation]::VirtualScreen; ` +
|
|
99
|
+
`Write-Output "$($b.Width) $($b.Height) $($b.Left) $($b.Top)"`;
|
|
88
100
|
export const frame = async () => {
|
|
89
101
|
if (process.platform === "win32") {
|
|
90
102
|
const out = await run("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", WINDOWS_FRAME]);
|
|
@@ -103,4 +115,33 @@ export const frame = async () => {
|
|
|
103
115
|
}
|
|
104
116
|
return { ...pngSize(await capture()), origin: { x: 0, y: 0 } };
|
|
105
117
|
};
|
|
118
|
+
const WINDOWS_DISPLAYS = `${WINDOWS_DPI_AWARE}Add-Type -AssemblyName System.Windows.Forms; ` +
|
|
119
|
+
`$v = [System.Windows.Forms.SystemInformation]::VirtualScreen; ` +
|
|
120
|
+
`$list = @([System.Windows.Forms.Screen]::AllScreens | ForEach-Object { [pscustomobject]@{ name = $_.DeviceName; primary = $_.Primary; ` +
|
|
121
|
+
`x = $_.Bounds.X - $v.Left; y = $_.Bounds.Y - $v.Top; width = $_.Bounds.Width; height = $_.Bounds.Height } }); ` +
|
|
122
|
+
`ConvertTo-Json -Compress -Depth 3 -InputObject $list`;
|
|
123
|
+
const single = async () => {
|
|
124
|
+
const { width, height } = await frame();
|
|
125
|
+
return [{ name: "screen", primary: true, bounds: { x: 0, y: 0, width, height } }];
|
|
126
|
+
};
|
|
127
|
+
const primaryFirst = (displays) => displays.toSorted((a, b) => Number(b.primary) - Number(a.primary));
|
|
128
|
+
export const displays = async () => {
|
|
129
|
+
if (process.platform === "win32") {
|
|
130
|
+
const listed = parseDisplaysJson((await run("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", WINDOWS_DISPLAYS])).trim());
|
|
131
|
+
return listed.length === 0 ? await single() : primaryFirst(listed);
|
|
132
|
+
}
|
|
133
|
+
if (process.platform !== "linux") {
|
|
134
|
+
return await single();
|
|
135
|
+
}
|
|
136
|
+
const swaySocket = environment()["SWAYSOCK"] ?? environment()["I3SOCK"];
|
|
137
|
+
if (isWayland() && swaySocket !== undefined && (await has("swaymsg"))) {
|
|
138
|
+
const listed = parseSwayOutputs(await run("swaymsg", ["-t", "get_outputs"]));
|
|
139
|
+
return listed.length === 0 ? await single() : primaryFirst(listed);
|
|
140
|
+
}
|
|
141
|
+
if (!isWayland() && (await has("xrandr"))) {
|
|
142
|
+
const listed = parseXrandrMonitors(await run("xrandr", ["--listactivemonitors"]).catch(() => ""));
|
|
143
|
+
return listed.length === 0 ? await single() : primaryFirst(listed);
|
|
144
|
+
}
|
|
145
|
+
return await single();
|
|
146
|
+
};
|
|
106
147
|
//# sourceMappingURL=screen.js.map
|
package/dist/screen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,12 @@ export interface Point {
|
|
|
2
2
|
readonly x: number;
|
|
3
3
|
readonly y: number;
|
|
4
4
|
}
|
|
5
|
+
export interface Rect {
|
|
6
|
+
readonly x: number;
|
|
7
|
+
readonly y: number;
|
|
8
|
+
readonly width: number;
|
|
9
|
+
readonly height: number;
|
|
10
|
+
}
|
|
5
11
|
export type MouseButton = "left" | "right" | "middle";
|
|
6
12
|
export type ScrollDirection = "up" | "down" | "left" | "right";
|
|
7
13
|
export interface ScreenFrame {
|
|
@@ -13,14 +19,35 @@ export interface WindowInfo {
|
|
|
13
19
|
readonly id: string;
|
|
14
20
|
readonly title: string;
|
|
15
21
|
readonly app: string;
|
|
16
|
-
readonly bounds:
|
|
17
|
-
readonly x: number;
|
|
18
|
-
readonly y: number;
|
|
19
|
-
readonly width: number;
|
|
20
|
-
readonly height: number;
|
|
21
|
-
};
|
|
22
|
+
readonly bounds: Rect;
|
|
22
23
|
readonly focused: boolean;
|
|
23
24
|
}
|
|
25
|
+
export interface DisplayInfo {
|
|
26
|
+
readonly bounds: Rect;
|
|
27
|
+
readonly primary: boolean;
|
|
28
|
+
readonly name: string;
|
|
29
|
+
}
|
|
30
|
+
export type ElementAction = "invoke" | "set_value" | "toggle" | "expand" | "collapse" | "select" | "focus";
|
|
31
|
+
export interface UiElement {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly role: string;
|
|
34
|
+
readonly name: string;
|
|
35
|
+
readonly value: string | undefined;
|
|
36
|
+
readonly bounds: Rect;
|
|
37
|
+
readonly enabled: boolean;
|
|
38
|
+
readonly focused: boolean;
|
|
39
|
+
readonly actions: readonly ElementAction[];
|
|
40
|
+
readonly depth: number;
|
|
41
|
+
}
|
|
42
|
+
export interface ElementTree {
|
|
43
|
+
readonly window: {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly title: string;
|
|
46
|
+
readonly app: string;
|
|
47
|
+
};
|
|
48
|
+
readonly elements: readonly UiElement[];
|
|
49
|
+
readonly truncated: boolean;
|
|
50
|
+
}
|
|
24
51
|
export interface ForegroundWindow {
|
|
25
52
|
readonly id: string;
|
|
26
53
|
readonly title: string;
|
|
@@ -32,7 +59,8 @@ export interface SessionState {
|
|
|
32
59
|
}
|
|
33
60
|
export interface Desktop {
|
|
34
61
|
readonly frame: () => Promise<ScreenFrame>;
|
|
35
|
-
readonly capture: () => Promise<Buffer>;
|
|
62
|
+
readonly capture: (region?: Rect) => Promise<Buffer>;
|
|
63
|
+
readonly displays: () => Promise<DisplayInfo[]>;
|
|
36
64
|
readonly move: (to: Point) => Promise<void>;
|
|
37
65
|
readonly click: (at: Point, button: MouseButton) => Promise<void>;
|
|
38
66
|
readonly doubleClick: (at: Point) => Promise<void>;
|
|
@@ -45,6 +73,9 @@ export interface Desktop {
|
|
|
45
73
|
readonly launch: (target: string) => Promise<void>;
|
|
46
74
|
readonly readClipboard: () => Promise<string>;
|
|
47
75
|
readonly writeClipboard: (text: string) => Promise<void>;
|
|
76
|
+
readonly elements: (window?: string) => Promise<ElementTree>;
|
|
77
|
+
readonly element: (window: string, id: string) => Promise<UiElement | undefined>;
|
|
78
|
+
readonly elementAct: (window: string, id: string, action: ElementAction, value?: string) => Promise<void>;
|
|
48
79
|
}
|
|
49
80
|
export interface Notice {
|
|
50
81
|
readonly show: (text: string) => void;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AACtD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAI/D,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CAC1B;AAID,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsJA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC1B,OAAO,CAAqB;IACrC,YAAY,OAAe,EAAE,OAAgB;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;CACJ"}
|
package/dist/view.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type Frame, type FrameLog, type Shot } from "./frames.js";
|
|
2
|
+
import { type Desktop, type DisplayInfo, type Point, type Rect, type UiElement } from "./types.js";
|
|
3
|
+
export interface Pointing {
|
|
4
|
+
readonly point: (at: Point, name: string) => Promise<Point>;
|
|
5
|
+
readonly element: (ref: string) => Promise<Point>;
|
|
6
|
+
}
|
|
7
|
+
interface ElementRef {
|
|
8
|
+
readonly window: string;
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly role: string;
|
|
11
|
+
readonly name: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class ElementRefs {
|
|
14
|
+
#private;
|
|
15
|
+
mint(window: string, elements: readonly UiElement[]): string[];
|
|
16
|
+
resolve(ref: string): ElementRef;
|
|
17
|
+
}
|
|
18
|
+
export declare const elementNow: (screen: Desktop, refs: ElementRefs, ref: string) => Promise<{
|
|
19
|
+
element: UiElement;
|
|
20
|
+
described: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare const pointingFor: (screen: Desktop, log: FrameLog, named: string | undefined, refs: ElementRefs) => Pointing;
|
|
23
|
+
export declare const desktopPointing: (screen: Desktop, refs?: ElementRefs) => Pointing;
|
|
24
|
+
export type ScreenshotTarget = {
|
|
25
|
+
readonly kind: "desktop";
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "display";
|
|
28
|
+
readonly index: number;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: "window";
|
|
31
|
+
readonly id: string;
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: "region";
|
|
34
|
+
readonly rect: Rect;
|
|
35
|
+
};
|
|
36
|
+
export declare const regionFor: (screen: Desktop, log: FrameLog, target: ScreenshotTarget) => Promise<{
|
|
37
|
+
region: Rect | undefined;
|
|
38
|
+
what: string;
|
|
39
|
+
}>;
|
|
40
|
+
export declare const describeDisplays: (displays: readonly DisplayInfo[], frame: Frame) => string;
|
|
41
|
+
export declare const describeShot: (shot: Shot, what: string) => string;
|
|
42
|
+
export declare const reshoot: (screen: Desktop, log: FrameLog) => Promise<Shot>;
|
|
43
|
+
export declare const viewFrame: (screen: Desktop, log: FrameLog) => Promise<Frame>;
|
|
44
|
+
export declare const frameName: (frame: Frame) => string;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAmB,KAAK,IAAI,EAAsB,MAAM,aAAa,CAAC;AACtH,OAAO,EAAE,KAAK,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAUjH,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAE5D,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CACrD;AAcD,UAAU,UAAU;IAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAKD,qBAAa,WAAW;;IAKpB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,EAAE,CAQ7D;IAED,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAU/B;CACJ;AAID,eAAO,MAAM,UAAU,WAAkB,OAAO,QAAQ,WAAW,OAAO,MAAM,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQnI,CAAC;AAKF,eAAO,MAAM,WAAW,WAAY,OAAO,OAAO,QAAQ,SAAS,MAAM,GAAG,SAAS,QAAQ,WAAW,KAAG,QAe1G,CAAC;AAGF,eAAO,MAAM,eAAe,WAAY,OAAO,SAAQ,WAAW,KAAuB,QAGvF,CAAC;AAGH,MAAM,MAAM,gBAAgB,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAcvD,eAAO,MAAM,SAAS,WAAkB,OAAO,OAAO,QAAQ,UAAU,gBAAgB,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAwB5I,CAAC;AAEF,eAAO,MAAM,gBAAgB,aAAc,SAAS,WAAW,EAAE,SAAS,KAAK,KAAG,MAM/D,CAAC;AAGpB,eAAO,MAAM,YAAY,SAAU,IAAI,QAAQ,MAAM,KAAG,MASvD,CAAC;AAGF,eAAO,MAAM,OAAO,WAAkB,OAAO,OAAO,QAAQ,KAAG,OAAO,CAAC,IAAI,CAG1E,CAAC;AAMF,eAAO,MAAM,SAAS,WAAkB,OAAO,OAAO,QAAQ,KAAG,OAAO,CAAC,KAAK,CAAiD,CAAC;AAEhI,eAAO,MAAM,SAAS,UAAW,KAAK,KAAG,MAA4F,CAAC"}
|
package/dist/view.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { defaultFrame, regionOf, shoot, toDesktop, toImage } from "./frames.js";
|
|
3
|
+
import { DesktopError } from "./types.js";
|
|
4
|
+
const within = (at, size, name) => {
|
|
5
|
+
if (at.x < 0 || at.y < 0 || at.x >= size.width || at.y >= size.height) {
|
|
6
|
+
throw new DesktopError(`${name} (${at.x}, ${at.y}) is outside the screen, which is ${size.width}×${size.height}. Take a screenshot and read the coordinates off it.`);
|
|
7
|
+
}
|
|
8
|
+
return at;
|
|
9
|
+
};
|
|
10
|
+
const centre = (bounds) => ({ x: Math.floor(bounds.x + bounds.width / 2), y: Math.floor(bounds.y + bounds.height / 2) });
|
|
11
|
+
export class ElementRefs {
|
|
12
|
+
#prefix = "";
|
|
13
|
+
#refs = new Map();
|
|
14
|
+
mint(window, elements) {
|
|
15
|
+
this.#prefix = Array.from(randomBytes(2), (byte) => String.fromCharCode(97 + (byte % 26))).join("");
|
|
16
|
+
this.#refs = new Map();
|
|
17
|
+
return elements.map((element, index) => {
|
|
18
|
+
const ref = `${this.#prefix}${index + 1}`;
|
|
19
|
+
this.#refs.set(ref, { window, id: element.id, role: element.role, name: element.name });
|
|
20
|
+
return ref;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
resolve(ref) {
|
|
24
|
+
const found = this.#refs.get(ref.trim());
|
|
25
|
+
if (found !== undefined) {
|
|
26
|
+
return found;
|
|
27
|
+
}
|
|
28
|
+
throw new DesktopError(this.#prefix !== "" && /^[a-z]{2}\d+$/.test(ref.trim())
|
|
29
|
+
? `"${ref}" is from an older list of elements, or was never in one. List the window's elements again and use a ref from that list.`
|
|
30
|
+
: `"${ref}" is not an element ref. List a window's elements first (ui_elements) and pass a ref from it, like ${this.#prefix === "" ? "kd3" : `${this.#prefix}3`}.`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export const elementNow = async (screen, refs, ref) => {
|
|
34
|
+
const known = refs.resolve(ref);
|
|
35
|
+
const element = await screen.element(known.window, known.id);
|
|
36
|
+
const described = `${known.role} "${known.name}"`;
|
|
37
|
+
if (element === undefined) {
|
|
38
|
+
throw new DesktopError(`The ${described} (${ref}) is no longer in that window. List its elements again.`);
|
|
39
|
+
}
|
|
40
|
+
return { element, described };
|
|
41
|
+
};
|
|
42
|
+
export const pointingFor = (screen, log, named, refs) => {
|
|
43
|
+
let frame;
|
|
44
|
+
return {
|
|
45
|
+
point: async (at) => toDesktop(await (frame ??= (async () => log.resolve(named) ?? (await defaultFrame(screen)))()), at),
|
|
46
|
+
element: async (ref) => {
|
|
47
|
+
const { element, described } = await elementNow(screen, refs, ref);
|
|
48
|
+
if (element.bounds.width <= 0 || element.bounds.height <= 0) {
|
|
49
|
+
throw new DesktopError(`The ${described} (${ref}) has no place on the screen right now (scrolled away or collapsed). Act on it without the pointer, or scroll it into view first.`);
|
|
50
|
+
}
|
|
51
|
+
return centre(element.bounds);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export const desktopPointing = (screen, refs = new ElementRefs()) => ({
|
|
56
|
+
point: async (at, name) => within(at, await screen.frame(), name),
|
|
57
|
+
element: async (ref) => centre((await elementNow(screen, refs, ref)).element.bounds),
|
|
58
|
+
});
|
|
59
|
+
const clip = (rect, size) => {
|
|
60
|
+
const x = Math.max(0, rect.x);
|
|
61
|
+
const y = Math.max(0, rect.y);
|
|
62
|
+
const right = Math.min(size.width, rect.x + rect.width);
|
|
63
|
+
const bottom = Math.min(size.height, rect.y + rect.height);
|
|
64
|
+
if (right <= x || bottom <= y) {
|
|
65
|
+
throw new DesktopError("That part of the screen is not on any display.");
|
|
66
|
+
}
|
|
67
|
+
return { x, y, width: right - x, height: bottom - y };
|
|
68
|
+
};
|
|
69
|
+
export const regionFor = async (screen, log, target) => {
|
|
70
|
+
switch (target.kind) {
|
|
71
|
+
case "desktop":
|
|
72
|
+
return { region: undefined, what: "the whole desktop" };
|
|
73
|
+
case "display": {
|
|
74
|
+
const displays = await screen.displays();
|
|
75
|
+
const display = displays[target.index - 1];
|
|
76
|
+
if (display === undefined) {
|
|
77
|
+
throw new DesktopError(`There is no display ${target.index}: this device has ${displays.length}.`);
|
|
78
|
+
}
|
|
79
|
+
return { region: display.bounds, what: `display ${target.index}${display.primary ? " (primary)" : ""}` };
|
|
80
|
+
}
|
|
81
|
+
case "window": {
|
|
82
|
+
const window = (await screen.windows()).find((candidate) => candidate.id === target.id);
|
|
83
|
+
if (window === undefined) {
|
|
84
|
+
throw new DesktopError(`There is no window ${target.id} on this device now. List the windows again.`);
|
|
85
|
+
}
|
|
86
|
+
return { region: clip(window.bounds, await screen.frame()), what: `the window "${window.title}" [${window.app}]` };
|
|
87
|
+
}
|
|
88
|
+
case "region": {
|
|
89
|
+
const frame = log.latest() ?? (await defaultFrame(screen));
|
|
90
|
+
return { region: regionOf(frame, target.rect), what: `a region of screenshot ${frame.id === "" ? "of the whole desktop" : frame.id}` };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
export const describeDisplays = (displays, frame) => displays
|
|
95
|
+
.map((display, index) => {
|
|
96
|
+
const at = toImage(frame, display.bounds);
|
|
97
|
+
return `${index + 1}${display.primary ? " (primary)" : ""}: ${display.bounds.width}×${display.bounds.height}, at (${at.x}, ${at.y}) ${at.width}×${at.height} in this image`;
|
|
98
|
+
})
|
|
99
|
+
.join("; ");
|
|
100
|
+
export const describeShot = (shot, what) => {
|
|
101
|
+
const { frame } = shot;
|
|
102
|
+
const scale = frame.region.width / frame.width;
|
|
103
|
+
const shrunk = scale > 1.001 ? `, shown at 1/${scale.toFixed(2)} of its ${frame.region.width}×${frame.region.height} pixels` : "";
|
|
104
|
+
return (`Screenshot ${frame.id}: ${frame.width}×${frame.height}, ${what}${shrunk}. ` +
|
|
105
|
+
`Coordinates you give are pixels in this image; pass frame "${frame.id}" with them so a click is never read off an older one.${scale > 1.5 ? ` Small text here is hard to read: screenshot a display, a window or a region of this image to see it closer.` : ""}`);
|
|
106
|
+
};
|
|
107
|
+
export const reshoot = async (screen, log) => {
|
|
108
|
+
const latest = log.latest();
|
|
109
|
+
return await shoot(screen, log, latest === undefined || isWholeDesktop(latest, await screen.frame()) ? undefined : latest.region);
|
|
110
|
+
};
|
|
111
|
+
const isWholeDesktop = (frame, size) => frame.region.x === 0 && frame.region.y === 0 && frame.region.width === size.width && frame.region.height === size.height;
|
|
112
|
+
export const viewFrame = async (screen, log) => log.latest() ?? (await defaultFrame(screen));
|
|
113
|
+
export const frameName = (frame) => (frame.id === "" ? "a screenshot of the whole desktop" : `screenshot ${frame.id}`);
|
|
114
|
+
//# sourceMappingURL=view.js.map
|
package/dist/view.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { type SessionState, type WindowInfo } from "
|
|
1
|
+
import { type SessionState, type WindowInfo } from "../types.js";
|
|
2
2
|
export declare const windowsSession: () => Promise<SessionState>;
|
|
3
|
+
export declare const launchScript: (target: string) => string;
|
|
4
|
+
export declare const clipboardScript: (text: string) => string;
|
|
3
5
|
export declare const windowsApps: {
|
|
4
6
|
windows: () => Promise<WindowInfo[]>;
|
|
5
7
|
focusWindow: (id: string) => Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps-windows.d.ts","sourceRoot":"","sources":["../../src/windows/apps-windows.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AA+H/E,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,YAAY,CAO3D,CAAC;AAEF,eAAO,MAAM,YAAY,WAAY,MAAM,KAAG,MAAsD,CAAC;AAGrG,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,MAAiD,CAAC;AAEjG,eAAO,MAAM,WAAW;IACpB,OAAO,QAAY,OAAO,CAAC,UAAU,EAAE,CAAC;IAMxC,WAAW,OAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IA6C9C,MAAM,WAAiB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,aAAa,QAAY,OAAO,CAAC,MAAM,CAAC;IAExC,cAAc,SAAe,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAGtD,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { focusRefusal, parseSessionJson, parseWindowsJson } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { focusRefusal, parseSessionJson, parseWindowsJson } from "../parse.js";
|
|
2
|
+
import { psText } from "./powershell.js";
|
|
3
|
+
import { run } from "../run.js";
|
|
4
|
+
import { DesktopError } from "../types.js";
|
|
5
|
+
import { WINDOWS_DPI_AWARE } from "./windows-dpi.js";
|
|
6
|
+
const SHIM = `${WINDOWS_DPI_AWARE}
|
|
5
7
|
Add-Type -TypeDefinition @"
|
|
6
8
|
using System;
|
|
7
9
|
using System.Text;
|
|
@@ -28,6 +30,7 @@ public class IntenticWin {
|
|
|
28
30
|
[DllImport("user32.dll", EntryPoint = "SystemParametersInfoW")] public static extern bool ReadSetting(uint action, uint param, ref uint value, uint notify);
|
|
29
31
|
[DllImport("user32.dll", EntryPoint = "SystemParametersInfoW")] public static extern bool WriteSetting(uint action, uint param, IntPtr value, uint notify);
|
|
30
32
|
[DllImport("kernel32.dll")] public static extern uint GetCurrentThreadId();
|
|
33
|
+
[DllImport("user32.dll")] public static extern int GetSystemMetrics(int index);
|
|
31
34
|
}
|
|
32
35
|
"@ -ErrorAction SilentlyContinue;
|
|
33
36
|
`;
|
|
@@ -42,6 +45,7 @@ const FOCUS_POLLS = 20;
|
|
|
42
45
|
const FOCUS_POLL_MS = 50;
|
|
43
46
|
const LIST = `
|
|
44
47
|
$fg = [IntenticWin]::GetForegroundWindow();
|
|
48
|
+
$left = [IntenticWin]::GetSystemMetrics(76); $top = [IntenticWin]::GetSystemMetrics(77);
|
|
45
49
|
$items = [System.Collections.Generic.List[object]]::new();
|
|
46
50
|
$callback = [IntenticWin+EnumWindowsProc] {
|
|
47
51
|
param([IntPtr]$h, [IntPtr]$unused)
|
|
@@ -57,7 +61,7 @@ $callback = [IntenticWin+EnumWindowsProc] {
|
|
|
57
61
|
[void][IntenticWin]::GetWindowRect($h, [ref]$r);
|
|
58
62
|
$items.Add([pscustomobject]@{
|
|
59
63
|
id = [string]($h.ToInt64()); title = $text.ToString(); app = $app;
|
|
60
|
-
x = $r.Left; y = $r.Top; width = ($r.Right - $r.Left); height = ($r.Bottom - $r.Top);
|
|
64
|
+
x = ($r.Left - $left); y = ($r.Top - $top); width = ($r.Right - $r.Left); height = ($r.Bottom - $r.Top);
|
|
61
65
|
focused = ($h -eq $fg)
|
|
62
66
|
});
|
|
63
67
|
return $true
|
|
@@ -91,6 +95,8 @@ export const windowsSession = async () => {
|
|
|
91
95
|
}
|
|
92
96
|
return state;
|
|
93
97
|
};
|
|
98
|
+
export const launchScript = (target) => `Start-Process -FilePath ${psText(target)};`;
|
|
99
|
+
export const clipboardScript = (text) => `Set-Clipboard -Value ${psText(text)};`;
|
|
94
100
|
export const windowsApps = {
|
|
95
101
|
windows: async () => parseWindowsJson((await powershell(LIST)).trim()),
|
|
96
102
|
focusWindow: async (id) => {
|
|
@@ -132,11 +138,11 @@ export const windowsApps = {
|
|
|
132
138
|
throw new DesktopError(focusRefusal(id, FOCUS_ATTEMPTS, state));
|
|
133
139
|
},
|
|
134
140
|
launch: async (target) => {
|
|
135
|
-
await powershell(
|
|
141
|
+
await powershell(launchScript(target));
|
|
136
142
|
},
|
|
137
143
|
readClipboard: async () => await powershell("Get-Clipboard -Raw;"),
|
|
138
144
|
writeClipboard: async (text) => {
|
|
139
|
-
await powershell(
|
|
145
|
+
await powershell(clipboardScript(text));
|
|
140
146
|
},
|
|
141
147
|
};
|
|
142
148
|
//# sourceMappingURL=apps-windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps-windows.js","sourceRoot":"","sources":["../../src/windows/apps-windows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ElementAction, type ElementTree, type UiElement } from "../types.js";
|
|
2
|
+
export declare const actScript: (window: string, id: string, action: ElementAction, value?: string) => string;
|
|
3
|
+
export declare const windowsElements: {
|
|
4
|
+
elements: (window?: string) => Promise<ElementTree>;
|
|
5
|
+
element: (window: string, id: string) => Promise<UiElement | undefined>;
|
|
6
|
+
elementAct: (window: string, id: string, action: ElementAction, value?: string) => Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=elements-windows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elements-windows.d.ts","sourceRoot":"","sources":["../../src/windows/elements-windows.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAwNjG,eAAO,MAAM,SAAS,WAAY,MAAM,MAAM,MAAM,UAAU,aAAa,UAAU,MAAM,KAAG,MACkB,CAAC;AAEjH,eAAO,MAAM,eAAe;IACxB,QAAQ,YAAkB,MAAM,KAAG,OAAO,CAAC,WAAW,CAAC;IAWvD,OAAO,WAAiB,MAAM,MAAM,MAAM,KAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAK3E,UAAU,WAAiB,MAAM,MAAM,MAAM,UAAU,aAAa,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAevG,CAAC"}
|