@intentic/desktop-automation 1.326.0 → 1.328.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 (83) hide show
  1. package/README.md +37 -8
  2. package/dist/actions.d.ts +21 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +76 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/cua.d.ts +49 -0
  7. package/dist/cua.d.ts.map +1 -0
  8. package/dist/cua.js +315 -0
  9. package/dist/cua.js.map +1 -0
  10. package/dist/frames.d.ts +42 -0
  11. package/dist/frames.d.ts.map +1 -0
  12. package/dist/frames.js +91 -0
  13. package/dist/frames.js.map +1 -0
  14. package/dist/index.d.ts +13 -4
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +97 -11
  17. package/dist/index.js.map +1 -1
  18. package/dist/{apps-linux.d.ts → linux/apps-linux.d.ts} +1 -1
  19. package/dist/linux/apps-linux.d.ts.map +1 -0
  20. package/dist/{apps-linux.js → linux/apps-linux.js} +10 -9
  21. package/dist/linux/apps-linux.js.map +1 -0
  22. package/dist/{input-linux.d.ts → linux/input-linux.d.ts} +2 -1
  23. package/dist/linux/input-linux.d.ts.map +1 -0
  24. package/dist/{input-linux.js → linux/input-linux.js} +10 -5
  25. package/dist/linux/input-linux.js.map +1 -0
  26. package/dist/parse.d.ts +9 -1
  27. package/dist/parse.d.ts.map +1 -1
  28. package/dist/parse.js +120 -1
  29. package/dist/parse.js.map +1 -1
  30. package/dist/png.d.ts +11 -0
  31. package/dist/png.d.ts.map +1 -0
  32. package/dist/png.js +348 -0
  33. package/dist/png.js.map +1 -0
  34. package/dist/run.d.ts +8 -1
  35. package/dist/run.d.ts.map +1 -1
  36. package/dist/run.js +10 -5
  37. package/dist/run.js.map +1 -1
  38. package/dist/screen.d.ts +4 -2
  39. package/dist/screen.d.ts.map +1 -1
  40. package/dist/screen.js +56 -15
  41. package/dist/screen.js.map +1 -1
  42. package/dist/types.d.ts +38 -7
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js.map +1 -1
  45. package/dist/view.d.ts +46 -0
  46. package/dist/view.d.ts.map +1 -0
  47. package/dist/view.js +114 -0
  48. package/dist/view.js.map +1 -0
  49. package/dist/{apps-windows.d.ts → windows/apps-windows.d.ts} +3 -1
  50. package/dist/windows/apps-windows.d.ts.map +1 -0
  51. package/dist/{apps-windows.js → windows/apps-windows.js} +13 -7
  52. package/dist/windows/apps-windows.js.map +1 -0
  53. package/dist/windows/elements-windows.d.ts +8 -0
  54. package/dist/windows/elements-windows.d.ts.map +1 -0
  55. package/dist/windows/elements-windows.js +223 -0
  56. package/dist/windows/elements-windows.js.map +1 -0
  57. package/dist/{input-windows.d.ts → windows/input-windows.d.ts} +2 -1
  58. package/dist/windows/input-windows.d.ts.map +1 -0
  59. package/dist/{input-windows.js → windows/input-windows.js} +16 -13
  60. package/dist/windows/input-windows.js.map +1 -0
  61. package/dist/{notice-windows.d.ts → windows/notice-windows.d.ts} +1 -1
  62. package/dist/windows/notice-windows.d.ts.map +1 -0
  63. package/dist/{notice-windows.js → windows/notice-windows.js} +1 -1
  64. package/dist/windows/notice-windows.js.map +1 -0
  65. package/dist/windows/powershell.d.ts +2 -0
  66. package/dist/windows/powershell.d.ts.map +1 -0
  67. package/dist/windows/powershell.js +2 -0
  68. package/dist/windows/powershell.js.map +1 -0
  69. package/dist/windows/windows-dpi.d.ts +2 -0
  70. package/dist/windows/windows-dpi.d.ts.map +1 -0
  71. package/dist/windows/windows-dpi.js +5 -0
  72. package/dist/windows/windows-dpi.js.map +1 -0
  73. package/package.json +4 -3
  74. package/dist/apps-linux.d.ts.map +0 -1
  75. package/dist/apps-linux.js.map +0 -1
  76. package/dist/apps-windows.d.ts.map +0 -1
  77. package/dist/apps-windows.js.map +0 -1
  78. package/dist/input-linux.d.ts.map +0 -1
  79. package/dist/input-linux.js.map +0 -1
  80. package/dist/input-windows.d.ts.map +0 -1
  81. package/dist/input-windows.js.map +0 -1
  82. package/dist/notice-windows.d.ts.map +0 -1
  83. 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 { run } from "./run.js";
6
+ import { parseDisplaysJson, parseSwayOutputs, parseXrandrMonitors } from "./parse.js";
7
+ import { environment, has, run } from "./run.js";
6
8
  import { DesktopError } from "./types.js";
7
- const pngPath = () => join(tmpdir(), `intentic-desktop-${process.pid}-${Date.now()}.png`);
8
- const WINDOWS_CAPTURE = (out) => [
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
- "$bmp = New-Object System.Drawing.Bitmap $b.Width, $b.Height;",
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($b.Left, $b.Top, 0, 0, $bmp.Size);",
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 = () => process.env["XDG_SESSION_TYPE"] === "wayland" || process.env["WAYLAND_DISPLAY"] !== undefined;
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" || process.env["DISPLAY"] !== undefined || process.env["WAYLAND_DISPLAY"] !== undefined;
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 = "Add-Type -AssemblyName System.Windows.Forms; " +
86
- "$b = [System.Windows.Forms.SystemInformation]::VirtualScreen; " +
87
- 'Write-Output "$($b.Width) $($b.Height) $($b.Left) $($b.Top)"';
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
@@ -1 +1 @@
1
- {"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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"}
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;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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":"AA+FA,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"}
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
@@ -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 "./types.js";
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 "./parse.js";
2
- import { run } from "./run.js";
3
- import { DesktopError } from "./types.js";
4
- const SHIM = `
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(`Start-Process -FilePath ${JSON.stringify(target)};`);
141
+ await powershell(launchScript(target));
136
142
  },
137
143
  readClipboard: async () => await powershell("Get-Clipboard -Raw;"),
138
144
  writeClipboard: async (text) => {
139
- await powershell(`Set-Clipboard -Value '${text.replace(/'/g, "''")}';`);
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"}