@epsilon-asi/actors 0.0.22 → 0.0.32

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 (193) hide show
  1. package/dist/browser/RuntimeConfig.d.ts +26 -0
  2. package/dist/browser/RuntimeConfig.d.ts.map +1 -1
  3. package/dist/browser/RuntimeConfig.js +29 -1
  4. package/dist/browser/RuntimeConfig.js.map +1 -1
  5. package/dist/core/ActorContext.d.ts +2 -0
  6. package/dist/core/ActorContext.d.ts.map +1 -1
  7. package/dist/core/ActorRunner.d.ts +3 -0
  8. package/dist/core/ActorRunner.d.ts.map +1 -1
  9. package/dist/core/ActorRunner.js +11 -1
  10. package/dist/core/ActorRunner.js.map +1 -1
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/native/CompositeNativeWindowDriver.d.ts +11 -0
  16. package/dist/native/CompositeNativeWindowDriver.d.ts.map +1 -0
  17. package/dist/native/CompositeNativeWindowDriver.js +31 -0
  18. package/dist/native/CompositeNativeWindowDriver.js.map +1 -0
  19. package/dist/native/NativeActionRegistry.d.ts +14 -0
  20. package/dist/native/NativeActionRegistry.d.ts.map +1 -0
  21. package/dist/native/NativeActionRegistry.js +101 -0
  22. package/dist/native/NativeActionRegistry.js.map +1 -0
  23. package/dist/native/NativeAutomation.d.ts +3 -0
  24. package/dist/native/NativeAutomation.d.ts.map +1 -0
  25. package/dist/native/NativeAutomation.js +12 -0
  26. package/dist/native/NativeAutomation.js.map +1 -0
  27. package/dist/native/NativeCoordinateMapper.d.ts +23 -0
  28. package/dist/native/NativeCoordinateMapper.d.ts.map +1 -0
  29. package/dist/native/NativeCoordinateMapper.js +201 -0
  30. package/dist/native/NativeCoordinateMapper.js.map +1 -0
  31. package/dist/native/NativeFileDialogService.d.ts +26 -0
  32. package/dist/native/NativeFileDialogService.d.ts.map +1 -0
  33. package/dist/native/NativeFileDialogService.js +121 -0
  34. package/dist/native/NativeFileDialogService.js.map +1 -0
  35. package/dist/native/NativeImageFinder.d.ts +12 -0
  36. package/dist/native/NativeImageFinder.d.ts.map +1 -0
  37. package/dist/native/NativeImageFinder.js +29 -0
  38. package/dist/native/NativeImageFinder.js.map +1 -0
  39. package/dist/native/NativeKeyboard.d.ts +10 -0
  40. package/dist/native/NativeKeyboard.d.ts.map +1 -0
  41. package/dist/native/NativeKeyboard.js +16 -0
  42. package/dist/native/NativeKeyboard.js.map +1 -0
  43. package/dist/native/NativeMouse.d.ts +38 -0
  44. package/dist/native/NativeMouse.d.ts.map +1 -0
  45. package/dist/native/NativeMouse.js +82 -0
  46. package/dist/native/NativeMouse.js.map +1 -0
  47. package/dist/native/NativeWindowService.d.ts +31 -0
  48. package/dist/native/NativeWindowService.d.ts.map +1 -0
  49. package/dist/native/NativeWindowService.js +183 -0
  50. package/dist/native/NativeWindowService.js.map +1 -0
  51. package/dist/native/UnsupportedNativeAutomation.d.ts +4 -0
  52. package/dist/native/UnsupportedNativeAutomation.d.ts.map +1 -0
  53. package/dist/native/UnsupportedNativeAutomation.js +77 -0
  54. package/dist/native/UnsupportedNativeAutomation.js.map +1 -0
  55. package/dist/native/WindowMatcher.d.ts +4 -0
  56. package/dist/native/WindowMatcher.d.ts.map +1 -0
  57. package/dist/native/WindowMatcher.js +39 -0
  58. package/dist/native/WindowMatcher.js.map +1 -0
  59. package/dist/native/drivers.d.ts +37 -0
  60. package/dist/native/drivers.d.ts.map +1 -0
  61. package/dist/native/drivers.js +2 -0
  62. package/dist/native/drivers.js.map +1 -0
  63. package/dist/native/errors.d.ts +23 -0
  64. package/dist/native/errors.d.ts.map +1 -0
  65. package/dist/native/errors.js +45 -0
  66. package/dist/native/errors.js.map +1 -0
  67. package/dist/native/index.d.ts +13 -0
  68. package/dist/native/index.d.ts.map +1 -0
  69. package/dist/native/index.js +13 -0
  70. package/dist/native/index.js.map +1 -0
  71. package/dist/native/macos/MacOSAccessibilityWindowDriver.d.ts +11 -0
  72. package/dist/native/macos/MacOSAccessibilityWindowDriver.d.ts.map +1 -0
  73. package/dist/native/macos/MacOSAccessibilityWindowDriver.js +180 -0
  74. package/dist/native/macos/MacOSAccessibilityWindowDriver.js.map +1 -0
  75. package/dist/native/macos/MacOSAppleScriptClient.d.ts +24 -0
  76. package/dist/native/macos/MacOSAppleScriptClient.d.ts.map +1 -0
  77. package/dist/native/macos/MacOSAppleScriptClient.js +163 -0
  78. package/dist/native/macos/MacOSAppleScriptClient.js.map +1 -0
  79. package/dist/native/macos/MacOSFileDialogAccessibilityStrategy.d.ts +10 -0
  80. package/dist/native/macos/MacOSFileDialogAccessibilityStrategy.d.ts.map +1 -0
  81. package/dist/native/macos/MacOSFileDialogAccessibilityStrategy.js +12 -0
  82. package/dist/native/macos/MacOSFileDialogAccessibilityStrategy.js.map +1 -0
  83. package/dist/native/macos/MacOSNativeAutomation.d.ts +3 -0
  84. package/dist/native/macos/MacOSNativeAutomation.d.ts.map +1 -0
  85. package/dist/native/macos/MacOSNativeAutomation.js +88 -0
  86. package/dist/native/macos/MacOSNativeAutomation.js.map +1 -0
  87. package/dist/native/nut/NutNativeImageFinder.d.ts +17 -0
  88. package/dist/native/nut/NutNativeImageFinder.d.ts.map +1 -0
  89. package/dist/native/nut/NutNativeImageFinder.js +84 -0
  90. package/dist/native/nut/NutNativeImageFinder.js.map +1 -0
  91. package/dist/native/nut/NutNativeKeyboardDriver.d.ts +8 -0
  92. package/dist/native/nut/NutNativeKeyboardDriver.d.ts.map +1 -0
  93. package/dist/native/nut/NutNativeKeyboardDriver.js +39 -0
  94. package/dist/native/nut/NutNativeKeyboardDriver.js.map +1 -0
  95. package/dist/native/nut/NutNativeMouseDriver.d.ts +8 -0
  96. package/dist/native/nut/NutNativeMouseDriver.d.ts.map +1 -0
  97. package/dist/native/nut/NutNativeMouseDriver.js +24 -0
  98. package/dist/native/nut/NutNativeMouseDriver.js.map +1 -0
  99. package/dist/native/nut/NutNativeScreenDriver.d.ts +6 -0
  100. package/dist/native/nut/NutNativeScreenDriver.d.ts.map +1 -0
  101. package/dist/native/nut/NutNativeScreenDriver.js +12 -0
  102. package/dist/native/nut/NutNativeScreenDriver.js.map +1 -0
  103. package/dist/native/nut/NutNativeWindowDriver.d.ts +6 -0
  104. package/dist/native/nut/NutNativeWindowDriver.d.ts.map +1 -0
  105. package/dist/native/nut/NutNativeWindowDriver.js +53 -0
  106. package/dist/native/nut/NutNativeWindowDriver.js.map +1 -0
  107. package/dist/native/nut/loadNut.d.ts +58 -0
  108. package/dist/native/nut/loadNut.d.ts.map +1 -0
  109. package/dist/native/nut/loadNut.js +25 -0
  110. package/dist/native/nut/loadNut.js.map +1 -0
  111. package/dist/native/types.d.ts +194 -0
  112. package/dist/native/types.d.ts.map +1 -0
  113. package/dist/native/types.js +2 -0
  114. package/dist/native/types.js.map +1 -0
  115. package/dist/native/utils/appleScriptEscape.d.ts +7 -0
  116. package/dist/native/utils/appleScriptEscape.d.ts.map +1 -0
  117. package/dist/native/utils/appleScriptEscape.js +11 -0
  118. package/dist/native/utils/appleScriptEscape.js.map +1 -0
  119. package/dist/native/utils/geometry.d.ts +12 -0
  120. package/dist/native/utils/geometry.d.ts.map +1 -0
  121. package/dist/native/utils/geometry.js +77 -0
  122. package/dist/native/utils/geometry.js.map +1 -0
  123. package/dist/native/utils/redactNative.d.ts +2 -0
  124. package/dist/native/utils/redactNative.d.ts.map +1 -0
  125. package/dist/native/utils/redactNative.js +7 -0
  126. package/dist/native/utils/redactNative.js.map +1 -0
  127. package/dist/native/utils/waitFor.d.ts +7 -0
  128. package/dist/native/utils/waitFor.d.ts.map +1 -0
  129. package/dist/native/utils/waitFor.js +17 -0
  130. package/dist/native/utils/waitFor.js.map +1 -0
  131. package/dist/sites/upwork-com/upwork-com.actor.d.ts +4 -1
  132. package/dist/sites/upwork-com/upwork-com.actor.d.ts.map +1 -1
  133. package/dist/sites/upwork-com/upwork-com.actor.js +30 -11
  134. package/dist/sites/upwork-com/upwork-com.actor.js.map +1 -1
  135. package/dist/sites/upwork-com/upwork-com.types.d.ts +3 -1
  136. package/dist/sites/upwork-com/upwork-com.types.d.ts.map +1 -1
  137. package/dist/sites/upwork-com/upwork-com.types.js.map +1 -1
  138. package/dist/sites/upwork-com/util/parseJobApplicationDetails.d.ts +70 -0
  139. package/dist/sites/upwork-com/util/parseJobApplicationDetails.d.ts.map +1 -0
  140. package/dist/sites/upwork-com/util/parseJobApplicationDetails.js +334 -0
  141. package/dist/sites/upwork-com/util/parseJobApplicationDetails.js.map +1 -0
  142. package/package.json +5 -1
  143. package/src/browser/RuntimeConfig.ts +57 -1
  144. package/src/core/ActorContext.ts +2 -0
  145. package/src/core/ActorRunner.ts +13 -1
  146. package/src/index.ts +2 -0
  147. package/src/native/CompositeNativeWindowDriver.ts +30 -0
  148. package/src/native/NativeActionRegistry.ts +114 -0
  149. package/src/native/NativeAutomation.ts +15 -0
  150. package/src/native/NativeCoordinateMapper.ts +258 -0
  151. package/src/native/NativeFileDialogService.ts +138 -0
  152. package/src/native/NativeImageFinder.ts +33 -0
  153. package/src/native/NativeKeyboard.ts +18 -0
  154. package/src/native/NativeMouse.ts +116 -0
  155. package/src/native/NativeWindowService.ts +229 -0
  156. package/src/native/UnsupportedNativeAutomation.ts +92 -0
  157. package/src/native/WindowMatcher.ts +31 -0
  158. package/src/native/drivers.ts +38 -0
  159. package/src/native/errors.ts +51 -0
  160. package/src/native/index.ts +12 -0
  161. package/src/native/macos/MacOSAccessibilityWindowDriver.ts +183 -0
  162. package/src/native/macos/MacOSAppleScriptClient.ts +182 -0
  163. package/src/native/macos/MacOSFileDialogAccessibilityStrategy.ts +11 -0
  164. package/src/native/macos/MacOSNativeAutomation.ts +86 -0
  165. package/src/native/nut/NutNativeImageFinder.ts +98 -0
  166. package/src/native/nut/NutNativeKeyboardDriver.ts +38 -0
  167. package/src/native/nut/NutNativeMouseDriver.ts +27 -0
  168. package/src/native/nut/NutNativeScreenDriver.ts +14 -0
  169. package/src/native/nut/NutNativeWindowDriver.ts +61 -0
  170. package/src/native/nut/loadNut.ts +86 -0
  171. package/src/native/types.ts +224 -0
  172. package/src/native/utils/appleScriptEscape.ts +11 -0
  173. package/src/native/utils/geometry.ts +88 -0
  174. package/src/native/utils/redactNative.ts +6 -0
  175. package/src/native/utils/waitFor.ts +25 -0
  176. package/src/sites/upwork-com/upwork-com.actor.ts +46 -14
  177. package/src/sites/upwork-com/upwork-com.types.ts +4 -1
  178. package/src/sites/upwork-com/util/parseJobApplicationDetails.ts +622 -0
  179. package/tests/fixtures/makeContext.ts +7 -2
  180. package/tests/fixtures/native/FakeNativeAutomation.ts +138 -0
  181. package/tests/unit/browser/RuntimeConfig.native.test.ts +63 -0
  182. package/tests/unit/core/ActorRunner.native.test.ts +69 -0
  183. package/tests/unit/native/MacOSAppleScriptClient.test.ts +35 -0
  184. package/tests/unit/native/NativeActionRegistry.test.ts +34 -0
  185. package/tests/unit/native/NativeCoordinateMapper.test.ts +92 -0
  186. package/tests/unit/native/NativeFileDialogService.test.ts +91 -0
  187. package/tests/unit/native/NativeMouse.test.ts +91 -0
  188. package/tests/unit/native/NativeWindowService.test.ts +87 -0
  189. package/tests/unit/native/WindowMatcher.test.ts +32 -0
  190. package/tests/unit/native/appleScriptEscape.test.ts +9 -0
  191. package/tests/unit/sites/myvistage-com.login.test.ts +1 -1
  192. package/tests/unit/sites/myvistage-com.postComment.test.ts +0 -1
  193. package/tests/unit/sites/upwork-com.login.test.ts +1 -1
@@ -0,0 +1,8 @@
1
+ import type { NativeKeyboardDriver } from '../drivers.js';
2
+ export declare class NutNativeKeyboardDriver implements NativeKeyboardDriver {
3
+ type(text: string): Promise<void>;
4
+ pressKey(key: string): Promise<void>;
5
+ pressShortcut(keys: readonly string[]): Promise<void>;
6
+ private resolveKey;
7
+ }
8
+ //# sourceMappingURL=NutNativeKeyboardDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeKeyboardDriver.d.ts","sourceRoot":"","sources":["../../../src/native/nut/NutNativeKeyboardDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAc1D,qBAAa,uBAAwB,YAAW,oBAAoB;IAC5D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpC,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D,OAAO,CAAC,UAAU;CAGnB"}
@@ -0,0 +1,39 @@
1
+ import { loadNut } from './loadNut.js';
2
+ function keyName(key) {
3
+ const normalized = key.toLowerCase();
4
+ if (normalized === 'enter' || normalized === 'return')
5
+ return 'ENTER';
6
+ if (normalized === 'escape' || normalized === 'esc')
7
+ return 'ESCAPE';
8
+ if (normalized === 'meta' || normalized === 'command' || normalized === 'cmd')
9
+ return 'LEFT_META';
10
+ if (normalized === 'control' || normalized === 'ctrl')
11
+ return 'LEFT_CONTROL';
12
+ if (normalized === 'shift')
13
+ return 'LEFT_SHIFT';
14
+ if (normalized === 'alt' || normalized === 'option')
15
+ return 'LEFT_ALT';
16
+ return key.toUpperCase();
17
+ }
18
+ export class NutNativeKeyboardDriver {
19
+ async type(text) {
20
+ const nut = await loadNut();
21
+ await nut.keyboard.type(text);
22
+ }
23
+ async pressKey(key) {
24
+ const nut = await loadNut();
25
+ await nut.keyboard.pressKey(this.resolveKey(nut.Key, key));
26
+ }
27
+ async pressShortcut(keys) {
28
+ const nut = await loadNut();
29
+ const resolved = keys.map(key => this.resolveKey(nut.Key, key));
30
+ await nut.keyboard.pressKey(...resolved);
31
+ if (nut.keyboard.releaseKey !== undefined) {
32
+ await nut.keyboard.releaseKey(...resolved.slice().reverse());
33
+ }
34
+ }
35
+ resolveKey(keyMap, key) {
36
+ return keyMap?.[keyName(key)] ?? key;
37
+ }
38
+ }
39
+ //# sourceMappingURL=NutNativeKeyboardDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeKeyboardDriver.js","sourceRoot":"","sources":["../../../src/native/nut/NutNativeKeyboardDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IACtE,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IACrE,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,WAAW,CAAC;IAClG,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,cAAc,CAAC;IAC7E,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,YAAY,CAAC;IAChD,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC;IACvE,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,OAAO,uBAAuB;IAClC,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAuB;QACzC,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,MAA2C,EAAE,GAAW;QACzE,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { NativeMouseDriver } from '../drivers.js';
2
+ import type { NativeMouseButton, NativePoint } from '../types.js';
3
+ export declare class NutNativeMouseDriver implements NativeMouseDriver {
4
+ getPosition(): Promise<NativePoint>;
5
+ move(point: NativePoint): Promise<void>;
6
+ click(button: NativeMouseButton): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=NutNativeMouseDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeMouseDriver.d.ts","sourceRoot":"","sources":["../../../src/native/nut/NutNativeMouseDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AASlE,qBAAa,oBAAqB,YAAW,iBAAiB;IACtD,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAKnC,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,KAAK,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAKtD"}
@@ -0,0 +1,24 @@
1
+ import { loadNut } from './loadNut.js';
2
+ function buttonName(button) {
3
+ if (button === 'left')
4
+ return 'LEFT';
5
+ if (button === 'right')
6
+ return 'RIGHT';
7
+ return 'MIDDLE';
8
+ }
9
+ export class NutNativeMouseDriver {
10
+ async getPosition() {
11
+ const nut = await loadNut();
12
+ return nut.mouse.getPosition();
13
+ }
14
+ async move(point) {
15
+ const nut = await loadNut();
16
+ await nut.mouse.move(nut.straightTo({ x: point.x, y: point.y }));
17
+ }
18
+ async click(button) {
19
+ const nut = await loadNut();
20
+ const nutButton = nut.Button?.[buttonName(button)] ?? button;
21
+ await nut.mouse.click(nutButton);
22
+ }
23
+ }
24
+ //# sourceMappingURL=NutNativeMouseDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeMouseDriver.js","sourceRoot":"","sources":["../../../src/native/nut/NutNativeMouseDriver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,SAAS,UAAU,CAAC,MAAyB;IAC3C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,oBAAoB;IAC/B,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAkB;QAC3B,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAyB;QACnC,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC;QAC7D,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { NativeScreenDriver } from '../drivers.js';
2
+ export declare class NutNativeScreenDriver implements NativeScreenDriver {
3
+ width(): Promise<number>;
4
+ height(): Promise<number>;
5
+ }
6
+ //# sourceMappingURL=NutNativeScreenDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeScreenDriver.d.ts","sourceRoot":"","sources":["../../../src/native/nut/NutNativeScreenDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,qBAAa,qBAAsB,YAAW,kBAAkB;IACxD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAKxB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;CAIhC"}
@@ -0,0 +1,12 @@
1
+ import { loadNut } from './loadNut.js';
2
+ export class NutNativeScreenDriver {
3
+ async width() {
4
+ const nut = await loadNut();
5
+ return nut.screen.width();
6
+ }
7
+ async height() {
8
+ const nut = await loadNut();
9
+ return nut.screen.height();
10
+ }
11
+ }
12
+ //# sourceMappingURL=NutNativeScreenDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeScreenDriver.js","sourceRoot":"","sources":["../../../src/native/nut/NutNativeScreenDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,qBAAqB;IAChC,KAAK,CAAC,KAAK;QACT,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { NativeWindowDriver, NativeWindowHandle } from '../drivers.js';
2
+ export declare class NutNativeWindowDriver implements NativeWindowDriver {
3
+ list(): Promise<NativeWindowHandle[]>;
4
+ active(): Promise<NativeWindowHandle | null>;
5
+ }
6
+ //# sourceMappingURL=NutNativeWindowDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeWindowDriver.d.ts","sourceRoot":"","sources":["../../../src/native/nut/NutNativeWindowDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAgD5E,qBAAa,qBAAsB,YAAW,kBAAkB;IACxD,IAAI,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAMrC,MAAM,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;CAKnD"}
@@ -0,0 +1,53 @@
1
+ import { loadNut } from './loadNut.js';
2
+ function toRegion(region) {
3
+ return {
4
+ x: region.left ?? region.x ?? 0,
5
+ y: region.top ?? region.y ?? 0,
6
+ width: region.width,
7
+ height: region.height
8
+ };
9
+ }
10
+ class NutNativeWindowHandle {
11
+ window;
12
+ constructor(window) {
13
+ this.window = window;
14
+ }
15
+ async info() {
16
+ const [title, region] = await Promise.all([
17
+ Promise.resolve(this.window.title),
18
+ Promise.resolve(this.window.region)
19
+ ]);
20
+ return {
21
+ title,
22
+ region: toRegion(region)
23
+ };
24
+ }
25
+ async focus() {
26
+ await this.window.focus();
27
+ }
28
+ async minimize() {
29
+ await this.window.minimize();
30
+ }
31
+ async restore() {
32
+ await this.window.restore();
33
+ }
34
+ async move(point) {
35
+ await this.window.move({ x: point.x, y: point.y });
36
+ }
37
+ async resize(size) {
38
+ await this.window.resize(size);
39
+ }
40
+ }
41
+ export class NutNativeWindowDriver {
42
+ async list() {
43
+ const nut = await loadNut();
44
+ const windows = await nut.getWindows();
45
+ return windows.map(window => new NutNativeWindowHandle(window));
46
+ }
47
+ async active() {
48
+ const nut = await loadNut();
49
+ const window = await nut.getActiveWindow();
50
+ return new NutNativeWindowHandle(window);
51
+ }
52
+ }
53
+ //# sourceMappingURL=NutNativeWindowDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutNativeWindowDriver.js","sourceRoot":"","sources":["../../../src/native/nut/NutNativeWindowDriver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAkC,MAAM,cAAc,CAAC;AAEvE,SAAS,QAAQ,CAAC,MAAiB;IACjC,OAAO;QACL,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC;QAC/B,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,qBAAqB;IACI;IAA7B,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAElD,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACxC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAClC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,OAAO;YACL,KAAK;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAkB;QAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAgB;QAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,qBAAqB;IAChC,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,eAAe,EAAE,CAAC;QAC3C,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ export interface NutPoint {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export interface NutRegion {
6
+ left?: number;
7
+ top?: number;
8
+ x?: number;
9
+ y?: number;
10
+ width: number;
11
+ height: number;
12
+ }
13
+ export interface NutWindow {
14
+ title: Promise<string> | string;
15
+ region: Promise<NutRegion> | NutRegion;
16
+ focus(): Promise<void>;
17
+ minimize(): Promise<void>;
18
+ restore(): Promise<void>;
19
+ move(point: NutPoint): Promise<void>;
20
+ resize(size: {
21
+ width: number;
22
+ height: number;
23
+ }): Promise<void>;
24
+ }
25
+ export interface NutModule {
26
+ mouse: {
27
+ getPosition(): Promise<NutPoint>;
28
+ move(path: unknown): Promise<void>;
29
+ click(button: unknown): Promise<void>;
30
+ };
31
+ keyboard: {
32
+ type(text: string): Promise<void>;
33
+ pressKey(...keys: unknown[]): Promise<void>;
34
+ releaseKey?(...keys: unknown[]): Promise<void>;
35
+ };
36
+ screen: {
37
+ width(): Promise<number>;
38
+ height(): Promise<number>;
39
+ find?(resource: unknown, options?: unknown): Promise<NutRegion>;
40
+ waitFor?(resource: unknown, timeoutMs?: number, intervalMs?: number): Promise<NutRegion>;
41
+ config?: {
42
+ confidence?: number;
43
+ resourceDirectory?: string;
44
+ };
45
+ };
46
+ getWindows(): Promise<NutWindow[]>;
47
+ getActiveWindow(): Promise<NutWindow>;
48
+ straightTo(point: NutPoint): unknown;
49
+ imageResource?(path: string): unknown;
50
+ Button?: Record<string, unknown>;
51
+ Key?: Record<string, unknown>;
52
+ }
53
+ export interface NlMatcherModule {
54
+ useNlMatcher(): void;
55
+ }
56
+ export declare function loadNut(): Promise<NutModule>;
57
+ export declare function loadNlMatcher(): Promise<void>;
58
+ //# sourceMappingURL=loadNut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadNut.d.ts","sourceRoot":"","sources":["../../../src/native/nut/loadNut.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE;QACL,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACvC,CAAC;IACF,QAAQ,EAAE;QACR,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,QAAQ,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,UAAU,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAChD,CAAC;IACF,MAAM,EAAE;QACN,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACzF,MAAM,CAAC,EAAE;YACP,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH,CAAC;IACF,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACnC,eAAe,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IACrC,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,IAAI,IAAI,CAAC;CACtB;AAKD,wBAAsB,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,CAQlD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CASnD"}
@@ -0,0 +1,25 @@
1
+ import { NativeDependencyError } from '../errors.js';
2
+ const dynamicImport = new Function('specifier', 'return import(specifier)');
3
+ let nutModulePromise = null;
4
+ let nlMatcherLoaded = false;
5
+ export async function loadNut() {
6
+ nutModulePromise ??= dynamicImport('@nut-tree/nut-js')
7
+ .then(module => module)
8
+ .catch(error => {
9
+ nutModulePromise = null;
10
+ throw new NativeDependencyError('@nut-tree/nut-js', error);
11
+ });
12
+ return nutModulePromise;
13
+ }
14
+ export async function loadNlMatcher() {
15
+ if (nlMatcherLoaded)
16
+ return;
17
+ const module = await dynamicImport('@nut-tree/nl-matcher')
18
+ .then(value => value)
19
+ .catch(error => {
20
+ throw new NativeDependencyError('@nut-tree/nl-matcher', error);
21
+ });
22
+ module.useNlMatcher();
23
+ nlMatcherLoaded = true;
24
+ }
25
+ //# sourceMappingURL=loadNut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadNut.js","sourceRoot":"","sources":["../../../src/native/nut/loadNut.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAIrD,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAkB,CAAC;AA2D7F,IAAI,gBAAgB,GAA8B,IAAI,CAAC;AACvD,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,gBAAgB,KAAK,aAAa,CAAC,kBAAkB,CAAC;SACnD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAmB,CAAC;SACnC,KAAK,CAAC,KAAK,CAAC,EAAE;QACb,gBAAgB,GAAG,IAAI,CAAC;QACxB,MAAM,IAAI,qBAAqB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IACL,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,eAAe;QAAE,OAAO;IAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,sBAAsB,CAAC;SACvD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAwB,CAAC;SACvC,KAAK,CAAC,KAAK,CAAC,EAAE;QACb,MAAM,IAAI,qBAAqB,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACL,MAAM,CAAC,YAAY,EAAE,CAAC;IACtB,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC"}
@@ -0,0 +1,194 @@
1
+ import type { BrowserSession } from '../browser/BrowserSession.js';
2
+ import type { PageLike } from '../browser/PuppeteerLike.js';
3
+ import type { RuntimeConfig } from '../browser/RuntimeConfig.js';
4
+ import type { Logger } from '../logging/Logger.js';
5
+ export type NativePlatform = 'macos';
6
+ export type NativeMouseButton = 'left' | 'right' | 'middle';
7
+ export type NativeFileDialogStrategy = 'auto' | 'applescript' | 'visual' | 'keyboard';
8
+ export type NativeWindowControlStrategy = 'auto' | 'accessibility' | 'visual';
9
+ export interface NativePoint {
10
+ x: number;
11
+ y: number;
12
+ }
13
+ export interface ScreenPoint extends NativePoint {
14
+ }
15
+ export interface BrowserPoint extends NativePoint {
16
+ }
17
+ export interface NativeSize {
18
+ width: number;
19
+ height: number;
20
+ }
21
+ export interface NativeRegion extends NativePoint, NativeSize {
22
+ }
23
+ export interface WaitOptions {
24
+ timeoutMs?: number;
25
+ intervalMs?: number;
26
+ }
27
+ export interface WindowMatcher {
28
+ appName?: string;
29
+ title?: string;
30
+ titleIncludes?: string;
31
+ titleRegex?: RegExp | string;
32
+ bundleId?: string;
33
+ role?: string;
34
+ }
35
+ export interface NativeWindowInfo {
36
+ id?: string | number;
37
+ title: string;
38
+ appName?: string;
39
+ bundleId?: string;
40
+ role?: string;
41
+ region: NativeRegion;
42
+ isFocused?: boolean;
43
+ isMinimized?: boolean;
44
+ isFullscreen?: boolean;
45
+ }
46
+ export interface EnsureWindowInViewOptions extends WaitOptions {
47
+ restore?: boolean;
48
+ focus?: boolean;
49
+ moveIntoPrimaryDisplay?: boolean;
50
+ minimumVisibleWidth?: number;
51
+ minimumVisibleHeight?: number;
52
+ }
53
+ export interface WindowButtonOptions extends WaitOptions {
54
+ strategy?: NativeWindowControlStrategy;
55
+ fullscreenButtonTemplate?: string;
56
+ searchRegionPaddingPx?: number;
57
+ }
58
+ export interface SelectFileOptions extends WaitOptions {
59
+ appName?: string;
60
+ dialogTitle?: string;
61
+ openButtonTemplate?: string;
62
+ inputFieldTemplate?: string;
63
+ strategy?: NativeFileDialogStrategy;
64
+ clickOpen?: boolean;
65
+ }
66
+ export interface NativeMouseMoveOptions {
67
+ precise?: boolean;
68
+ jitterPixels?: number;
69
+ minJitterPixels?: number;
70
+ moveSpeed?: number;
71
+ disableHumanPath?: boolean;
72
+ }
73
+ export interface NativeMouseClickOptions extends NativeMouseMoveOptions {
74
+ button?: NativeMouseButton;
75
+ delayBeforeClickMs?: number;
76
+ delayAfterMoveMs?: number;
77
+ regionPaddingPx?: number;
78
+ }
79
+ export interface NativeKeyboardTypeOptions {
80
+ delayMs?: number;
81
+ }
82
+ export interface NativeKeyboard {
83
+ type(text: string, options?: NativeKeyboardTypeOptions): Promise<void>;
84
+ pressKey(key: string): Promise<void>;
85
+ pressShortcut(keys: readonly string[]): Promise<void>;
86
+ }
87
+ export interface NativeMouse {
88
+ moveTo(point: ScreenPoint, options?: NativeMouseMoveOptions): Promise<void>;
89
+ click(point: ScreenPoint, options?: NativeMouseClickOptions): Promise<void>;
90
+ clickRegion(region: NativeRegion, options?: NativeMouseClickOptions): Promise<void>;
91
+ clickBrowserPoint(page: PageLike, point: BrowserPoint, options?: NativeMouseClickOptions): Promise<void>;
92
+ }
93
+ export interface NativeTemplateRef {
94
+ name: string;
95
+ buffer?: Uint8Array;
96
+ }
97
+ export interface NativeImageSearchOptions extends WaitOptions {
98
+ searchRegion?: NativeRegion;
99
+ confidence?: number;
100
+ }
101
+ export interface NativeImageMatch {
102
+ region: NativeRegion;
103
+ confidence?: number;
104
+ }
105
+ export interface NativeImageFinder {
106
+ findTemplate(template: string | NativeTemplateRef, options?: NativeImageSearchOptions): Promise<NativeImageMatch | null>;
107
+ waitForTemplate(template: string | NativeTemplateRef, options?: NativeImageSearchOptions): Promise<NativeImageMatch>;
108
+ }
109
+ export interface NativeWindowService {
110
+ list(): Promise<NativeWindowInfo[]>;
111
+ find(matcher: WindowMatcher, options?: WaitOptions): Promise<NativeWindowInfo | null>;
112
+ waitFor(matcher: WindowMatcher, options?: WaitOptions): Promise<NativeWindowInfo>;
113
+ isOpen(matcher: WindowMatcher): Promise<boolean>;
114
+ focus(matcher: WindowMatcher): Promise<NativeWindowInfo>;
115
+ ensureInView(matcher: WindowMatcher, options?: EnsureWindowInViewOptions): Promise<NativeWindowInfo>;
116
+ setFullscreen(matcher: WindowMatcher, fullscreen: boolean, options?: WindowButtonOptions): Promise<void>;
117
+ toggleFullscreen(matcher: WindowMatcher, options?: WindowButtonOptions): Promise<void>;
118
+ minimize(matcher: WindowMatcher): Promise<void>;
119
+ restore(matcher: WindowMatcher): Promise<void>;
120
+ }
121
+ export interface NativeFileDialogService {
122
+ selectFile(filePath: string, options?: SelectFileOptions): Promise<void>;
123
+ }
124
+ export interface BrowserViewportSnapshot {
125
+ screenX: number;
126
+ screenY: number;
127
+ outerWidth: number;
128
+ outerHeight: number;
129
+ innerWidth: number;
130
+ innerHeight: number;
131
+ devicePixelRatio: number;
132
+ }
133
+ export interface CoordinateTransform {
134
+ offsetX: number;
135
+ offsetY: number;
136
+ scaleX: number;
137
+ scaleY: number;
138
+ calibratedAt: number;
139
+ viewport: Pick<BrowserViewportSnapshot, 'innerWidth' | 'innerHeight' | 'devicePixelRatio'>;
140
+ window?: NativeWindowInfo;
141
+ }
142
+ export interface CalibrationOptions extends WaitOptions {
143
+ markerSizePx?: number;
144
+ markerA?: BrowserPoint;
145
+ markerB?: BrowserPoint;
146
+ cacheTtlMs?: number;
147
+ windowMatcher?: WindowMatcher;
148
+ }
149
+ export interface CoordinateMapOptions {
150
+ page?: PageLike;
151
+ useCache?: boolean;
152
+ }
153
+ export interface NativeCoordinateMapper {
154
+ calibrate(page: PageLike, options?: CalibrationOptions): Promise<CoordinateTransform>;
155
+ browserToScreen(point: BrowserPoint, options?: CoordinateMapOptions): Promise<ScreenPoint>;
156
+ screenToBrowser(point: ScreenPoint, options?: CoordinateMapOptions): Promise<BrowserPoint>;
157
+ invalidate(): void;
158
+ }
159
+ export interface NativeActionContext {
160
+ automation: NativeAutomation;
161
+ logger: Logger;
162
+ }
163
+ export interface NativeAction<TInput = unknown, TOutput = unknown> {
164
+ name: string;
165
+ description?: string;
166
+ run(context: NativeActionContext, input: TInput): Promise<TOutput>;
167
+ }
168
+ export interface NativeActionMetadata {
169
+ name: string;
170
+ description?: string;
171
+ }
172
+ export interface NativeActionRegistry {
173
+ register<TInput, TOutput>(action: NativeAction<TInput, TOutput>): this;
174
+ get<TInput = unknown, TOutput = unknown>(name: string): NativeAction<TInput, TOutput>;
175
+ run<TInput = unknown, TOutput = unknown>(name: string, input: TInput): Promise<TOutput>;
176
+ list(): NativeActionMetadata[];
177
+ }
178
+ export interface NativeAutomation {
179
+ windows: NativeWindowService;
180
+ fileDialogs: NativeFileDialogService;
181
+ mouse: NativeMouse;
182
+ keyboard: NativeKeyboard;
183
+ coordinates: NativeCoordinateMapper;
184
+ images: NativeImageFinder;
185
+ actions: NativeActionRegistry;
186
+ }
187
+ export interface NativeAutomationFactoryArgs {
188
+ session: BrowserSession;
189
+ page: PageLike;
190
+ config: RuntimeConfig;
191
+ logger: Logger;
192
+ }
193
+ export type NativeAutomationFactory = (args: NativeAutomationFactoryArgs) => NativeAutomation;
194
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/native/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/native/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Escapes arbitrary text for use as an AppleScript string literal.
3
+ * AppleScript string literals are double-quoted and escape double quotes/backslashes.
4
+ */
5
+ export declare function appleScriptString(value: string): string;
6
+ export declare function appleScriptRegexLiteral(value: RegExp | string): string;
7
+ //# sourceMappingURL=appleScriptEscape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appleScriptEscape.d.ts","sourceRoot":"","sources":["../../../src/native/utils/appleScriptEscape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEtE"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Escapes arbitrary text for use as an AppleScript string literal.
3
+ * AppleScript string literals are double-quoted and escape double quotes/backslashes.
4
+ */
5
+ export function appleScriptString(value) {
6
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
7
+ }
8
+ export function appleScriptRegexLiteral(value) {
9
+ return value instanceof RegExp ? value.source : value;
10
+ }
11
+ //# sourceMappingURL=appleScriptEscape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appleScriptEscape.js","sourceRoot":"","sources":["../../../src/native/utils/appleScriptEscape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAsB;IAC5D,OAAO,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACxD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { NativePoint, NativeRegion } from '../types.js';
2
+ export declare function centerOf(region: NativeRegion): NativePoint;
3
+ export declare function normalizeRegion(region: NativeRegion): NativeRegion;
4
+ export declare function isPointInsideRegion(point: NativePoint, region: NativeRegion): boolean;
5
+ export declare function clampPointToRegion(point: NativePoint, region: NativeRegion): NativePoint;
6
+ export declare function paddedRegion(region: NativeRegion, paddingPx: number): NativeRegion;
7
+ export declare function intersects(a: NativeRegion, b: NativeRegion): boolean;
8
+ export declare function intersection(a: NativeRegion, b: NativeRegion): NativeRegion;
9
+ export declare function visibleEnough(region: NativeRegion, viewport: NativeRegion, minimumWidth: number, minimumHeight: number): boolean;
10
+ export declare function randomPointInRegion(region: NativeRegion, random: () => number, paddingPx?: number): NativePoint;
11
+ export declare function roundPoint(point: NativePoint): NativePoint;
12
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../src/native/utils/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAK1D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAOlE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAKrF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAKxF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CASlF;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAKpE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,YAAY,CAY3E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAIhI;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,SAAS,SAAI,GAAG,WAAW,CAU1G;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAK1D"}
@@ -0,0 +1,77 @@
1
+ export function centerOf(region) {
2
+ return {
3
+ x: region.x + region.width / 2,
4
+ y: region.y + region.height / 2
5
+ };
6
+ }
7
+ export function normalizeRegion(region) {
8
+ return {
9
+ x: region.x,
10
+ y: region.y,
11
+ width: Math.max(0, region.width),
12
+ height: Math.max(0, region.height)
13
+ };
14
+ }
15
+ export function isPointInsideRegion(point, region) {
16
+ return point.x >= region.x
17
+ && point.x <= region.x + region.width
18
+ && point.y >= region.y
19
+ && point.y <= region.y + region.height;
20
+ }
21
+ export function clampPointToRegion(point, region) {
22
+ return {
23
+ x: Math.min(Math.max(point.x, region.x), region.x + region.width),
24
+ y: Math.min(Math.max(point.y, region.y), region.y + region.height)
25
+ };
26
+ }
27
+ export function paddedRegion(region, paddingPx) {
28
+ const x = region.x + paddingPx;
29
+ const y = region.y + paddingPx;
30
+ return normalizeRegion({
31
+ x,
32
+ y,
33
+ width: region.width - paddingPx * 2,
34
+ height: region.height - paddingPx * 2
35
+ });
36
+ }
37
+ export function intersects(a, b) {
38
+ return a.x < b.x + b.width
39
+ && a.x + a.width > b.x
40
+ && a.y < b.y + b.height
41
+ && a.y + a.height > b.y;
42
+ }
43
+ export function intersection(a, b) {
44
+ const x = Math.max(a.x, b.x);
45
+ const y = Math.max(a.y, b.y);
46
+ const right = Math.min(a.x + a.width, b.x + b.width);
47
+ const bottom = Math.min(a.y + a.height, b.y + b.height);
48
+ return normalizeRegion({
49
+ x,
50
+ y,
51
+ width: right - x,
52
+ height: bottom - y
53
+ });
54
+ }
55
+ export function visibleEnough(region, viewport, minimumWidth, minimumHeight) {
56
+ if (!intersects(region, viewport))
57
+ return false;
58
+ const visible = intersection(region, viewport);
59
+ return visible.width >= Math.min(region.width, minimumWidth) && visible.height >= Math.min(region.height, minimumHeight);
60
+ }
61
+ export function randomPointInRegion(region, random, paddingPx = 0) {
62
+ const safe = paddedRegion(region, paddingPx);
63
+ if (safe.width <= 0 || safe.height <= 0) {
64
+ return centerOf(region);
65
+ }
66
+ return {
67
+ x: safe.x + random() * safe.width,
68
+ y: safe.y + random() * safe.height
69
+ };
70
+ }
71
+ export function roundPoint(point) {
72
+ return {
73
+ x: Math.round(point.x),
74
+ y: Math.round(point.y)
75
+ };
76
+ }
77
+ //# sourceMappingURL=geometry.js.map