testdriverai 6.2.2 → 7.0.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 (264) hide show
  1. package/.github/workflows/acceptance-linux.yml +75 -0
  2. package/.github/workflows/acceptance-sdk-tests.yml +133 -0
  3. package/.vscode/settings.json +5 -1
  4. package/MIGRATION.md +389 -0
  5. package/PLUGIN_MIGRATION.md +222 -0
  6. package/PROMPT_CACHE.md +200 -0
  7. package/SDK_LOGGING.md +222 -0
  8. package/SDK_MIGRATION.md +474 -0
  9. package/SDK_README.md +1122 -0
  10. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  11. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  12. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  13. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  14. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  15. package/_testdriver/lifecycle/prerun.yaml +15 -0
  16. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  17. package/agent/index.js +258 -68
  18. package/agent/interface.js +15 -0
  19. package/agent/lib/cache.js +142 -0
  20. package/agent/lib/commander.js +1 -39
  21. package/agent/lib/commands.js +143 -188
  22. package/agent/lib/redraw.js +6 -3
  23. package/agent/lib/sandbox.js +19 -5
  24. package/agent/lib/sdk.js +1 -0
  25. package/agent/lib/system.js +0 -3
  26. package/agent/lib/validation.js +1 -7
  27. package/debug-locate-response.js +82 -0
  28. package/debug-screenshot-1763401388589.png +0 -0
  29. package/debugger/index.html +15 -4
  30. package/docs/ARCHITECTURE.md +424 -0
  31. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  32. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  33. package/docs/SDK_AWESOME_LOGS.md +468 -0
  34. package/docs/TEST_RECORDING.md +388 -0
  35. package/docs/docs.json +232 -152
  36. package/docs/sdk-browser-rendering.md +167 -0
  37. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  38. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  39. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  40. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  41. package/docs/v6/overview/comparison.mdx +101 -0
  42. package/docs/v7/README.md +135 -0
  43. package/docs/v7/api/ai.mdx +205 -0
  44. package/docs/v7/api/assert.mdx +285 -0
  45. package/docs/v7/api/assertions.mdx +403 -0
  46. package/docs/v7/api/click.mdx +287 -0
  47. package/docs/v7/api/client.mdx +322 -0
  48. package/docs/v7/api/elements.mdx +479 -0
  49. package/docs/v7/api/exec.mdx +346 -0
  50. package/docs/v7/api/find.mdx +316 -0
  51. package/docs/v7/api/focusApplication.mdx +294 -0
  52. package/docs/v7/api/hover.mdx +279 -0
  53. package/docs/v7/api/pressKeys.mdx +349 -0
  54. package/docs/v7/api/sandbox.mdx +404 -0
  55. package/docs/v7/api/scroll.mdx +300 -0
  56. package/docs/v7/api/type.mdx +314 -0
  57. package/docs/v7/commands/assert.mdx +45 -0
  58. package/docs/v7/commands/exec.mdx +282 -0
  59. package/docs/v7/commands/focus-application.mdx +44 -0
  60. package/docs/v7/commands/hover-image.mdx +69 -0
  61. package/docs/v7/commands/hover-text.mdx +47 -0
  62. package/docs/v7/commands/if.mdx +53 -0
  63. package/docs/v7/commands/match-image.mdx +67 -0
  64. package/docs/v7/commands/press-keys.mdx +87 -0
  65. package/docs/v7/commands/remember.mdx +49 -0
  66. package/docs/v7/commands/run.mdx +44 -0
  67. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  68. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  69. package/docs/v7/commands/scroll.mdx +69 -0
  70. package/docs/v7/commands/type.mdx +45 -0
  71. package/docs/v7/commands/wait-for-image.mdx +54 -0
  72. package/docs/v7/commands/wait-for-text.mdx +48 -0
  73. package/docs/v7/commands/wait.mdx +45 -0
  74. package/docs/v7/getting-started/quickstart.mdx +199 -0
  75. package/docs/v7/guides/migration.mdx +562 -0
  76. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  77. package/docs/v7/playwright.mdx +342 -0
  78. package/eslint.config.js +19 -1
  79. package/examples/run-tests-with-recording.sh +70 -0
  80. package/examples/screenshot-example.js +63 -0
  81. package/examples/sdk-awesome-logs-demo.js +177 -0
  82. package/examples/sdk-cache-thresholds.js +96 -0
  83. package/examples/sdk-element-properties.js +155 -0
  84. package/examples/sdk-simple-example.js +65 -0
  85. package/examples/test-recording-example.test.js +166 -0
  86. package/interfaces/cli/lib/base.js +10 -4
  87. package/interfaces/logger.js +2 -1
  88. package/interfaces/shared-test-state.mjs +69 -0
  89. package/interfaces/vitest-plugin.mjs +744 -0
  90. package/mcp-server/AI_GUIDELINES.md +57 -0
  91. package/package.json +18 -5
  92. package/schema.json +8 -29
  93. package/scripts/view-test-results.mjs +96 -0
  94. package/sdk-log-formatter.js +714 -0
  95. package/sdk.d.ts +735 -0
  96. package/sdk.js +1906 -0
  97. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  98. package/setup/aws/cloudformation.yaml +9 -2
  99. package/test/mcp-example-test.yaml +27 -0
  100. package/test-find-api.js +73 -0
  101. package/test-prompt-cache.js +96 -0
  102. package/test-sandbox-render.js +28 -0
  103. package/test-sdk-methods.js +15 -0
  104. package/test-sdk-refactor.js +53 -0
  105. package/test-stack-trace.mjs +57 -0
  106. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  107. package/testdriver/acceptance-sdk/README.md +128 -0
  108. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  109. package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
  110. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
  111. package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
  112. package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
  113. package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
  114. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
  115. package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
  116. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
  117. package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
  118. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
  119. package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
  120. package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
  121. package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
  122. package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
  123. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
  124. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
  125. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
  126. package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
  127. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  128. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
  129. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
  130. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  131. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  132. package/testdriver/acceptance-sdk/type.test.mjs +84 -0
  133. package/verify-element-api.js +89 -0
  134. package/verify-types.js +0 -0
  135. package/vitest.config.example.js +19 -0
  136. package/vitest.config.mjs +65 -0
  137. package/vitest.config.mjs.bak +44 -0
  138. package/.github/workflows/acceptance-v6.yml +0 -169
  139. package/docs/overview/comparison.mdx +0 -82
  140. package/testdriver/lifecycle/prerun.yaml +0 -17
  141. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  142. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  143. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  144. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  145. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  146. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  147. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  148. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  149. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  150. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  151. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  152. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  153. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  154. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  155. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  156. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  157. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  158. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  159. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  160. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  161. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  162. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  163. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  164. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  165. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  166. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  167. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  168. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  169. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  170. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  171. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  172. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  173. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  174. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  175. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  176. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  177. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  178. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  179. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  180. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  181. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  182. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  183. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  184. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  185. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  186. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  187. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  188. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  189. /package/docs/{account → v6/account}/projects.mdx +0 -0
  190. /package/docs/{account → v6/account}/team.mdx +0 -0
  191. /package/docs/{action → v6/action}/ami.mdx +0 -0
  192. /package/docs/{action → v6/action}/performance.mdx +0 -0
  193. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  194. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  195. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  196. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  197. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  198. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  199. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  200. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  201. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  202. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  203. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  204. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  205. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  206. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  207. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  208. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  209. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  210. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  211. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  212. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  213. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  214. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  215. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  216. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  217. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  218. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  219. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  220. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  221. /package/docs/{features → v6/features}/generation.mdx +0 -0
  222. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  223. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  224. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  225. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  226. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  227. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  228. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  229. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  230. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  231. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  232. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  233. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  234. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  235. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  236. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  237. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  238. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  239. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  240. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  241. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  242. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  243. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  244. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  245. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  246. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  247. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  248. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  249. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  250. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  251. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  252. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  253. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  254. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  255. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  256. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  257. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  258. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  259. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  260. /package/docs/{security → v6/security}/action.mdx +0 -0
  261. /package/docs/{security → v6/security}/agent.mdx +0 -0
  262. /package/docs/{security → v6/security}/platform.mdx +0 -0
  263. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  264. /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
package/sdk.d.ts ADDED
@@ -0,0 +1,735 @@
1
+ /**
2
+ * TestDriver SDK - TypeScript Definitions
3
+ */
4
+
5
+ // Type Definitions
6
+ export type ClickAction =
7
+ | "click"
8
+ | "right-click"
9
+ | "double-click"
10
+ | "hover"
11
+ | "mouseDown"
12
+ | "mouseUp";
13
+ export type ScrollDirection = "up" | "down" | "left" | "right";
14
+ export type ScrollMethod = "keyboard" | "mouse";
15
+ export type TextMatchMethod = "ai" | "turbo";
16
+ export type ExecLanguage = "js" | "pwsh";
17
+ export type KeyboardKey =
18
+ | "\t"
19
+ | "\n"
20
+ | "\r"
21
+ | " "
22
+ | "!"
23
+ | '"'
24
+ | "#"
25
+ | "$"
26
+ | "%"
27
+ | "&"
28
+ | "'"
29
+ | "("
30
+ | ")"
31
+ | "*"
32
+ | "+"
33
+ | ","
34
+ | "-"
35
+ | "."
36
+ | "/"
37
+ | "0"
38
+ | "1"
39
+ | "2"
40
+ | "3"
41
+ | "4"
42
+ | "5"
43
+ | "6"
44
+ | "7"
45
+ | "8"
46
+ | "9"
47
+ | ":"
48
+ | ";"
49
+ | "<"
50
+ | "="
51
+ | ">"
52
+ | "?"
53
+ | "@"
54
+ | "["
55
+ | "\\"
56
+ | "]"
57
+ | "^"
58
+ | "_"
59
+ | "`"
60
+ | "a"
61
+ | "b"
62
+ | "c"
63
+ | "d"
64
+ | "e"
65
+ | "f"
66
+ | "g"
67
+ | "h"
68
+ | "i"
69
+ | "j"
70
+ | "k"
71
+ | "l"
72
+ | "m"
73
+ | "n"
74
+ | "o"
75
+ | "p"
76
+ | "q"
77
+ | "r"
78
+ | "s"
79
+ | "t"
80
+ | "u"
81
+ | "v"
82
+ | "w"
83
+ | "x"
84
+ | "y"
85
+ | "z"
86
+ | "{"
87
+ | "|"
88
+ | "}"
89
+ | "~"
90
+ | "accept"
91
+ | "add"
92
+ | "alt"
93
+ | "altleft"
94
+ | "altright"
95
+ | "apps"
96
+ | "backspace"
97
+ | "browserback"
98
+ | "browserfavorites"
99
+ | "browserforward"
100
+ | "browserhome"
101
+ | "browserrefresh"
102
+ | "browsersearch"
103
+ | "browserstop"
104
+ | "capslock"
105
+ | "clear"
106
+ | "convert"
107
+ | "ctrl"
108
+ | "ctrlleft"
109
+ | "ctrlright"
110
+ | "decimal"
111
+ | "del"
112
+ | "delete"
113
+ | "divide"
114
+ | "down"
115
+ | "end"
116
+ | "enter"
117
+ | "esc"
118
+ | "escape"
119
+ | "execute"
120
+ | "f1"
121
+ | "f2"
122
+ | "f3"
123
+ | "f4"
124
+ | "f5"
125
+ | "f6"
126
+ | "f7"
127
+ | "f8"
128
+ | "f9"
129
+ | "f10"
130
+ | "f11"
131
+ | "f12"
132
+ | "f13"
133
+ | "f14"
134
+ | "f15"
135
+ | "f16"
136
+ | "f17"
137
+ | "f18"
138
+ | "f19"
139
+ | "f20"
140
+ | "f21"
141
+ | "f22"
142
+ | "f23"
143
+ | "f24"
144
+ | "final"
145
+ | "fn"
146
+ | "hanguel"
147
+ | "hangul"
148
+ | "hanja"
149
+ | "help"
150
+ | "home"
151
+ | "insert"
152
+ | "junja"
153
+ | "kana"
154
+ | "kanji"
155
+ | "launchapp1"
156
+ | "launchapp2"
157
+ | "launchmail"
158
+ | "launchmediaselect"
159
+ | "left"
160
+ | "modechange"
161
+ | "multiply"
162
+ | "nexttrack"
163
+ | "nonconvert"
164
+ | "num0"
165
+ | "num1"
166
+ | "num2"
167
+ | "num3"
168
+ | "num4"
169
+ | "num5"
170
+ | "num6"
171
+ | "num7"
172
+ | "num8"
173
+ | "num9"
174
+ | "numlock"
175
+ | "pagedown"
176
+ | "pageup"
177
+ | "pause"
178
+ | "pgdn"
179
+ | "pgup"
180
+ | "playpause"
181
+ | "prevtrack"
182
+ | "print"
183
+ | "printscreen"
184
+ | "prntscrn"
185
+ | "prtsc"
186
+ | "prtscr"
187
+ | "return"
188
+ | "right"
189
+ | "scrolllock"
190
+ | "select"
191
+ | "separator"
192
+ | "shift"
193
+ | "shiftleft"
194
+ | "shiftright"
195
+ | "sleep"
196
+ | "space"
197
+ | "stop"
198
+ | "subtract"
199
+ | "tab"
200
+ | "up"
201
+ | "volumedown"
202
+ | "volumemute"
203
+ | "volumeup"
204
+ | "win"
205
+ | "winleft"
206
+ | "winright"
207
+ | "yen"
208
+ | "command"
209
+ | "option"
210
+ | "optionleft"
211
+ | "optionright";
212
+
213
+ export interface TestDriverOptions {
214
+ /** API endpoint URL (default: 'https://v6.testdriver.ai') */
215
+ apiRoot?: string;
216
+ /** Sandbox resolution (default: '1366x768') */
217
+ resolution?: string;
218
+ /** Enable analytics tracking (default: true) */
219
+ analytics?: boolean;
220
+ /** Enable console logging output (default: true) */
221
+ logging?: boolean;
222
+ /** Enable/disable cache (default: true). Set to false to force regeneration on all find operations */
223
+ cache?: boolean;
224
+ /** Cache threshold configuration for different methods */
225
+ cacheThreshold?: {
226
+ /** Threshold for find operations (default: 0.05 = 5% difference, 95% similarity) */
227
+ find?: number;
228
+ /** Threshold for findAll operations (default: 0.05 = 5% difference, 95% similarity) */
229
+ findAll?: number;
230
+ };
231
+ /** Additional environment variables */
232
+ environment?: Record<string, any>;
233
+ }
234
+
235
+ export interface ConnectOptions {
236
+ /** Existing sandbox ID to reconnect to */
237
+ sandboxId?: string;
238
+ /** Force creation of a new sandbox */
239
+ newSandbox?: boolean;
240
+ /** Direct IP address to connect to */
241
+ ip?: string;
242
+ /** Custom AMI for sandbox */
243
+ sandboxAmi?: string;
244
+ /** Instance type for sandbox */
245
+ sandboxInstance?: string;
246
+ }
247
+
248
+ export interface SandboxInstance {
249
+ instanceId: string;
250
+ ip: string;
251
+ vncPort: number;
252
+ [key: string]: any;
253
+ }
254
+
255
+ export interface ElementCoordinates {
256
+ x: number;
257
+ y: number;
258
+ centerX: number;
259
+ centerY: number;
260
+ }
261
+
262
+ export interface ElementBoundingBox {
263
+ top: number;
264
+ left: number;
265
+ bottom: number;
266
+ right: number;
267
+ [key: string]: any;
268
+ }
269
+
270
+ export interface ElementResponse {
271
+ coordinates: ElementCoordinates;
272
+ confidence?: number;
273
+ screenshot?: string;
274
+ width?: number;
275
+ height?: number;
276
+ boundingBox?: ElementBoundingBox;
277
+ text?: string;
278
+ label?: string;
279
+ [key: string]: any;
280
+ }
281
+
282
+ export interface HoverResult {
283
+ x: number;
284
+ y: number;
285
+ centerX: number;
286
+ centerY: number;
287
+ [key: string]: any;
288
+ }
289
+
290
+ /**
291
+ * Element class representing a located or to-be-located element on screen
292
+ */
293
+ export class Element {
294
+ constructor(description: string);
295
+
296
+ /**
297
+ * Check if element was found
298
+ */
299
+ found(): boolean;
300
+
301
+ /**
302
+ * Find the element on screen
303
+ * @param newDescription - Optional new description to search for
304
+ * @param cacheThreshold - Cache threshold for this specific find (overrides global setting)
305
+ */
306
+ find(newDescription?: string, cacheThreshold?: number): Promise<Element>;
307
+
308
+ /**
309
+ * Click on the element
310
+ * @param action - Type of click action (default: 'click')
311
+ */
312
+ click(action?: ClickAction): Promise<void>;
313
+
314
+ /**
315
+ * Hover over the element
316
+ */
317
+ hover(): Promise<void>;
318
+
319
+ /**
320
+ * Double-click on the element
321
+ */
322
+ doubleClick(): Promise<void>;
323
+
324
+ /**
325
+ * Right-click on the element
326
+ */
327
+ rightClick(): Promise<void>;
328
+
329
+ /**
330
+ * Press mouse button down on this element
331
+ */
332
+ mouseDown(): Promise<void>;
333
+
334
+ /**
335
+ * Release mouse button on this element
336
+ */
337
+ mouseUp(): Promise<void>;
338
+
339
+ /**
340
+ * Get the coordinates of the element
341
+ */
342
+ getCoordinates(): ElementCoordinates | null;
343
+
344
+ /**
345
+ * Get the x coordinate (top-left)
346
+ */
347
+ readonly x: number | null;
348
+
349
+ /**
350
+ * Get the y coordinate (top-left)
351
+ */
352
+ readonly y: number | null;
353
+
354
+ /**
355
+ * Get the center x coordinate
356
+ */
357
+ readonly centerX: number | null;
358
+
359
+ /**
360
+ * Get the center y coordinate
361
+ */
362
+ readonly centerY: number | null;
363
+
364
+ /**
365
+ * Get the full API response data
366
+ */
367
+ getResponse(): ElementResponse | null;
368
+
369
+ /**
370
+ * Get element screenshot if available (base64 encoded)
371
+ */
372
+ readonly screenshot: string | null;
373
+
374
+ /**
375
+ * Get element confidence score if available
376
+ */
377
+ readonly confidence: number | null;
378
+
379
+ /**
380
+ * Get element width if available
381
+ */
382
+ readonly width: number | null;
383
+
384
+ /**
385
+ * Get element height if available
386
+ */
387
+ readonly height: number | null;
388
+
389
+ /**
390
+ * Get element bounding box if available
391
+ */
392
+ readonly boundingBox: ElementBoundingBox | null;
393
+
394
+ /**
395
+ * Get element text content if available
396
+ */
397
+ readonly text: string | null;
398
+
399
+ /**
400
+ * Get element label if available
401
+ */
402
+ readonly label: string | null;
403
+ }
404
+
405
+ export default class TestDriverSDK {
406
+ constructor(apiKey: string, options?: TestDriverOptions);
407
+
408
+ /**
409
+ * Authenticate with TestDriver API
410
+ */
411
+ auth(): Promise<string>;
412
+
413
+ /**
414
+ * Connect to a sandbox environment
415
+ */
416
+ connect(options?: ConnectOptions): Promise<SandboxInstance>;
417
+
418
+ /**
419
+ * Disconnect from the sandbox
420
+ */
421
+ disconnect(): Promise<void>;
422
+
423
+ // Element Finding API
424
+
425
+ /**
426
+ * Find an element by description
427
+ * Automatically locates the element and returns it
428
+ *
429
+ * @param description - Description of the element to find
430
+ * @param cacheThreshold - Cache threshold for this specific find (overrides global setting)
431
+ * @returns Element instance that has been located
432
+ *
433
+ * @example
434
+ * // Find and click immediately
435
+ * const element = await client.find('the sign in button');
436
+ * await element.click();
437
+ *
438
+ * @example
439
+ * // Find with custom cache threshold
440
+ * const element = await client.find('login button', 0.01);
441
+ *
442
+ * @example
443
+ * // Poll until element is found
444
+ * let element;
445
+ * while (!element?.found()) {
446
+ * element = await client.find('login button');
447
+ * if (!element.found()) {
448
+ * await new Promise(resolve => setTimeout(resolve, 1000));
449
+ * }
450
+ * }
451
+ * await element.click();
452
+ */
453
+ find(description: string, cacheThreshold?: number): Promise<Element>;
454
+
455
+ /**
456
+ * Find all elements matching a description
457
+ * @param description - Description of the elements to find
458
+ * @param cacheThreshold - Cache threshold for this specific findAll (overrides global setting)
459
+ * @returns Array of Element instances
460
+ *
461
+ * @example
462
+ * // Find all buttons
463
+ * const buttons = await client.findAll('button');
464
+ *
465
+ * @example
466
+ * // Find with custom cache threshold
467
+ * const items = await client.findAll('list item', 0.01);
468
+ */
469
+ findAll(description: string, cacheThreshold?: number): Promise<Element[]>;
470
+
471
+ // Text Interaction Methods
472
+
473
+ /**
474
+ * Hover over text on screen
475
+ * @deprecated Use find() and element.click() instead
476
+ * @param text - Text to find and hover over
477
+ * @param description - Optional description of the element
478
+ * @param action - Action to perform (default: 'click')
479
+ * @param method - Text matching method (default: 'turbo')
480
+ * @param timeout - Timeout in milliseconds (default: 5000)
481
+ */
482
+ hoverText(
483
+ text: string,
484
+ description?: string | null,
485
+ action?: ClickAction,
486
+ method?: TextMatchMethod,
487
+ timeout?: number,
488
+ ): Promise<HoverResult>;
489
+
490
+ /**
491
+ * Type text
492
+ * @param text - Text to type
493
+ * @param delay - Delay between keystrokes in milliseconds (default: 250)
494
+ */
495
+ type(text: string | number, delay?: number): Promise<void>;
496
+
497
+ /**
498
+ * Wait for text to appear on screen
499
+ * @deprecated Use find() in a polling loop instead
500
+ * @param text - Text to wait for
501
+ * @param timeout - Timeout in milliseconds (default: 5000)
502
+ * @param method - Text matching method (default: 'turbo')
503
+ * @param invert - Invert the match (wait for text to disappear) (default: false)
504
+ */
505
+ waitForText(
506
+ text: string,
507
+ timeout?: number,
508
+ method?: TextMatchMethod,
509
+ invert?: boolean,
510
+ ): Promise<void>;
511
+
512
+ /**
513
+ * Scroll until text is found
514
+ * @param text - Text to find
515
+ * @param direction - Scroll direction (default: 'down')
516
+ * @param maxDistance - Maximum distance to scroll in pixels (default: 10000)
517
+ * @param textMatchMethod - Text matching method (default: 'turbo')
518
+ * @param method - Scroll method (default: 'keyboard')
519
+ * @param invert - Invert the match (default: false)
520
+ */
521
+ scrollUntilText(
522
+ text: string,
523
+ direction?: ScrollDirection,
524
+ maxDistance?: number,
525
+ textMatchMethod?: TextMatchMethod,
526
+ method?: ScrollMethod,
527
+ invert?: boolean,
528
+ ): Promise<void>;
529
+
530
+ // Image Interaction Methods
531
+
532
+ /**
533
+ * Hover over an image on screen
534
+ * @deprecated Use find() and element.click() instead
535
+ * @param description - Description of the image to find
536
+ * @param action - Action to perform (default: 'click')
537
+ */
538
+ hoverImage(description: string, action?: ClickAction): Promise<HoverResult>;
539
+
540
+ /**
541
+ * Match and interact with an image template
542
+ * @param imagePath - Path to the image template
543
+ * @param action - Action to perform (default: 'click')
544
+ * @param invert - Invert the match (default: false)
545
+ */
546
+ matchImage(
547
+ imagePath: string,
548
+ action?: ClickAction,
549
+ invert?: boolean,
550
+ ): Promise<boolean>;
551
+
552
+ /**
553
+ * Wait for image to appear on screen
554
+ * @deprecated Use find() in a polling loop instead
555
+ * @param description - Description of the image
556
+ * @param timeout - Timeout in milliseconds (default: 10000)
557
+ * @param invert - Invert the match (wait for image to disappear) (default: false)
558
+ */
559
+ waitForImage(
560
+ description: string,
561
+ timeout?: number,
562
+ invert?: boolean,
563
+ ): Promise<void>;
564
+
565
+ /**
566
+ * Scroll until image is found
567
+ * @param description - Description of the image (or use path parameter)
568
+ * @param direction - Scroll direction (default: 'down')
569
+ * @param maxDistance - Maximum distance to scroll in pixels (default: 10000)
570
+ * @param method - Scroll method (default: 'keyboard')
571
+ * @param path - Path to image template (default: null)
572
+ * @param invert - Invert the match (default: false)
573
+ */
574
+ scrollUntilImage(
575
+ description: string,
576
+ direction?: ScrollDirection,
577
+ maxDistance?: number,
578
+ method?: ScrollMethod,
579
+ path?: string | null,
580
+ invert?: boolean,
581
+ ): Promise<void>;
582
+
583
+ // Mouse & Keyboard Methods
584
+
585
+ /**
586
+ * Click at coordinates
587
+ * @param x - X coordinate
588
+ * @param y - Y coordinate
589
+ * @param action - Type of click action (default: 'click')
590
+ */
591
+ click(x: number, y: number, action?: ClickAction): Promise<void>;
592
+
593
+ /**
594
+ * Hover at coordinates
595
+ * @param x - X coordinate
596
+ * @param y - Y coordinate
597
+ */
598
+ hover(x: number, y: number): Promise<void>;
599
+
600
+ /**
601
+ * Press keyboard keys
602
+ * @param keys - Array of keys to press
603
+ */
604
+ pressKeys(keys: KeyboardKey[]): Promise<void>;
605
+
606
+ /**
607
+ * Scroll the page
608
+ * @param direction - Direction to scroll (default: 'down')
609
+ * @param amount - Amount to scroll in pixels (default: 300)
610
+ * @param method - Scroll method (default: 'mouse')
611
+ */
612
+ scroll(
613
+ direction?: ScrollDirection,
614
+ amount?: number,
615
+ method?: ScrollMethod,
616
+ ): Promise<void>;
617
+
618
+ // Application Control
619
+
620
+ /**
621
+ * Focus an application by name
622
+ * @param name - Application name
623
+ */
624
+ focusApplication(name: string): Promise<string>;
625
+
626
+ // AI-Powered Methods
627
+
628
+ /**
629
+ * Make an AI-powered assertion
630
+ * @param assertion - Assertion to check
631
+ * @param async - Run asynchronously (default: false)
632
+ * @param invert - Invert the assertion (default: false)
633
+ */
634
+ assert(
635
+ assertion: string,
636
+ async?: boolean,
637
+ invert?: boolean,
638
+ ): Promise<boolean>;
639
+
640
+ /**
641
+ * Extract and remember information from the screen using AI
642
+ * @param description - What to remember
643
+ */
644
+ remember(description: string): Promise<string>;
645
+
646
+ // Code Execution
647
+
648
+ /**
649
+ * Execute code in the sandbox
650
+ * @param language - Language ('js' or 'pwsh')
651
+ * @param code - Code to execute
652
+ * @param timeout - Timeout in milliseconds
653
+ * @param silent - Suppress output (default: false)
654
+ */
655
+ exec(
656
+ language: ExecLanguage,
657
+ code: string,
658
+ timeout: number,
659
+ silent?: boolean,
660
+ ): Promise<string>;
661
+
662
+ // Utility Methods
663
+
664
+ /**
665
+ * Capture a screenshot of the current screen
666
+ * @param scale - Scale factor for the screenshot (default: 1 = original size)
667
+ * @param silent - Whether to suppress logging (default: false)
668
+ * @param mouse - Whether to include mouse cursor (default: false)
669
+ * @returns Base64 encoded PNG screenshot
670
+ *
671
+ * @example
672
+ * // Capture a screenshot
673
+ * const screenshot = await client.screenshot();
674
+ * fs.writeFileSync('screenshot.png', Buffer.from(screenshot, 'base64'));
675
+ *
676
+ * @example
677
+ * // Capture with mouse cursor visible
678
+ * const screenshot = await client.screenshot(1, false, true);
679
+ */
680
+ screenshot(
681
+ scale?: number,
682
+ silent?: boolean,
683
+ mouse?: boolean,
684
+ ): Promise<string>;
685
+
686
+ /**
687
+ * Wait for specified time
688
+ * @deprecated Consider using element polling with find() instead of arbitrary waits
689
+ */
690
+ wait(timeout?: number): Promise<void>;
691
+
692
+ /**
693
+ * Get the current sandbox instance details
694
+ */
695
+ getInstance(): SandboxInstance | null;
696
+
697
+ /**
698
+ * Get the session ID
699
+ */
700
+ getSessionId(): string | null;
701
+
702
+ /**
703
+ * Enable or disable logging output
704
+ */
705
+ setLogging(enabled: boolean): void;
706
+
707
+ /**
708
+ * Get the event emitter for custom event handling
709
+ */
710
+ getEmitter(): any; // EventEmitter2 type
711
+
712
+ // AI Methods (Exploratory Loop)
713
+
714
+ /**
715
+ * Execute a natural language task using AI
716
+ * This is the SDK equivalent of the CLI's exploratory loop
717
+ *
718
+ * @param task - Natural language description of what to do
719
+ * @param options - Execution options
720
+ * @returns Final AI response if validateAndLoop is true
721
+ *
722
+ * @example
723
+ * // Simple execution
724
+ * await client.ai('Click the submit button');
725
+ *
726
+ * @example
727
+ * // With validation loop
728
+ * const result = await client.ai('Fill out the contact form', { validateAndLoop: true });
729
+ * console.log(result); // AI's final assessment
730
+ */
731
+ ai(
732
+ task: string,
733
+ options?: { validateAndLoop?: boolean },
734
+ ): Promise<string | void>;
735
+ }