@testdriverai/agent 7.8.0-canary.10

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 (528) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +4 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc +1 -0
  5. package/CHANGELOG.md +953 -0
  6. package/README.md +81 -0
  7. package/agent/events.js +135 -0
  8. package/agent/index.js +2450 -0
  9. package/agent/interface.js +35 -0
  10. package/agent/lib/analytics.js +22 -0
  11. package/agent/lib/censorship.js +75 -0
  12. package/agent/lib/commander.js +246 -0
  13. package/agent/lib/commands.js +1684 -0
  14. package/agent/lib/config.js +60 -0
  15. package/agent/lib/generator.js +91 -0
  16. package/agent/lib/http.js +144 -0
  17. package/agent/lib/logger.js +56 -0
  18. package/agent/lib/outputs.js +29 -0
  19. package/agent/lib/parser.js +209 -0
  20. package/agent/lib/redraw.js +386 -0
  21. package/agent/lib/resources/cursor-2.png +0 -0
  22. package/agent/lib/sandbox.js +1104 -0
  23. package/agent/lib/sdk.js +633 -0
  24. package/agent/lib/session.js +25 -0
  25. package/agent/lib/source-mapper.js +342 -0
  26. package/agent/lib/subimage/index.js +77 -0
  27. package/agent/lib/subimage/opencv.js +69 -0
  28. package/agent/lib/system.js +204 -0
  29. package/agent/lib/theme.js +14 -0
  30. package/agent/lib/valid-version.js +21 -0
  31. package/agent/lib/validation.js +169 -0
  32. package/ai/.claude-plugin/plugin.json +9 -0
  33. package/ai/agents/testdriver.md +638 -0
  34. package/ai/skills/testdriver-ai/SKILL.md +204 -0
  35. package/ai/skills/testdriver-assert/SKILL.md +315 -0
  36. package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
  37. package/ai/skills/testdriver-cache/SKILL.md +221 -0
  38. package/ai/skills/testdriver-caching/SKILL.md +124 -0
  39. package/ai/skills/testdriver-captcha/SKILL.md +158 -0
  40. package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
  41. package/ai/skills/testdriver-click/SKILL.md +286 -0
  42. package/ai/skills/testdriver-client/SKILL.md +477 -0
  43. package/ai/skills/testdriver-cloud/SKILL.md +119 -0
  44. package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
  45. package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
  46. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
  47. package/ai/skills/testdriver-device-config/SKILL.md +317 -0
  48. package/ai/skills/testdriver-double-click/SKILL.md +102 -0
  49. package/ai/skills/testdriver-elements/SKILL.md +605 -0
  50. package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
  51. package/ai/skills/testdriver-errors/SKILL.md +246 -0
  52. package/ai/skills/testdriver-events/SKILL.md +356 -0
  53. package/ai/skills/testdriver-examples/SKILL.md +7 -0
  54. package/ai/skills/testdriver-exec/SKILL.md +317 -0
  55. package/ai/skills/testdriver-find/SKILL.md +829 -0
  56. package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
  57. package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
  58. package/ai/skills/testdriver-hover/SKILL.md +278 -0
  59. package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
  60. package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
  61. package/ai/skills/testdriver-mcp/SKILL.md +7 -0
  62. package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
  63. package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
  64. package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
  65. package/ai/skills/testdriver-parse/SKILL.md +236 -0
  66. package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
  67. package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
  68. package/ai/skills/testdriver-provision/SKILL.md +331 -0
  69. package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
  70. package/ai/skills/testdriver-redraw/SKILL.md +214 -0
  71. package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
  72. package/ai/skills/testdriver-right-click/SKILL.md +123 -0
  73. package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
  74. package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
  75. package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
  76. package/ai/skills/testdriver-scroll/SKILL.md +335 -0
  77. package/ai/skills/testdriver-secrets/SKILL.md +115 -0
  78. package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
  79. package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
  80. package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
  81. package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
  82. package/ai/skills/testdriver-type/SKILL.md +357 -0
  83. package/ai/skills/testdriver-variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver-wait/SKILL.md +50 -0
  85. package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
  86. package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
  87. package/bin/testdriverai.js +22 -0
  88. package/debugger/bg.png +0 -0
  89. package/debugger/icon.png +0 -0
  90. package/debugger/index.html +469 -0
  91. package/debugger/td.png +0 -0
  92. package/debugger/tray-buffered.png +0 -0
  93. package/debugger/tray.png +0 -0
  94. package/docs/GITHUB_COMMENTS.md +330 -0
  95. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
  96. package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
  97. package/docs/TEST-GITHUB-COMMENTS.md +129 -0
  98. package/docs/_data/examples-manifest.json +177 -0
  99. package/docs/_data/examples-manifest.schema.json +41 -0
  100. package/docs/_scripts/extract-example-urls.js +165 -0
  101. package/docs/_scripts/generate-examples.js +560 -0
  102. package/docs/_scripts/generate-skills.js +154 -0
  103. package/docs/_scripts/link-replacer.js +164 -0
  104. package/docs/_scripts/upload-docs-to-openai.js +284 -0
  105. package/docs/changelog.mdx +161 -0
  106. package/docs/claude-mcp-plugin.mdx +160 -0
  107. package/docs/docs.json +442 -0
  108. package/docs/github-integration-setup.md +266 -0
  109. package/docs/guide/best-practices-polling.mdx +174 -0
  110. package/docs/images/content/account/newprojectsettings.png +0 -0
  111. package/docs/images/content/account/projectpage.png +0 -0
  112. package/docs/images/content/account/projectreplays.png +0 -0
  113. package/docs/images/content/account/team-manage.png +0 -0
  114. package/docs/images/content/account/teampage.png +0 -0
  115. package/docs/images/content/extension/cursor.svg +1 -0
  116. package/docs/images/content/extension/vscode.svg +57 -0
  117. package/docs/images/content/extension/windsurf.svg +3 -0
  118. package/docs/images/content/parse/output.png +0 -0
  119. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  120. package/docs/images/content/side-by-side.png +0 -0
  121. package/docs/images/content/vscode/ide-full.png +0 -0
  122. package/docs/images/content/vscode/running.png +0 -0
  123. package/docs/images/content/vscode/v7-chat.png +0 -0
  124. package/docs/images/content/vscode/v7-choose-agent.png +0 -0
  125. package/docs/images/content/vscode/v7-full.png +0 -0
  126. package/docs/images/content/vscode/v7-onboarding.png +0 -0
  127. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  128. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  129. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  130. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  131. package/docs/images/content/vscode/vscode-install.png +0 -0
  132. package/docs/images/content/vscode/vscode-overview.png +0 -0
  133. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  134. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  135. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  136. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  137. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  138. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  139. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  140. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  141. package/docs/images/template/dark.png +0 -0
  142. package/docs/images/template/icon.png +0 -0
  143. package/docs/images/template/light.png +0 -0
  144. package/docs/snippets/calendar-link.mdx +4 -0
  145. package/docs/snippets/gitignore-warning.mdx +7 -0
  146. package/docs/snippets/lifecycle-warning.mdx +6 -0
  147. package/docs/snippets/test-prereqs.mdx +12 -0
  148. package/docs/snippets/tests/assert-replay.mdx +7 -0
  149. package/docs/snippets/tests/assert-yaml.mdx +8 -0
  150. package/docs/snippets/tests/exec-js-replay.mdx +7 -0
  151. package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
  152. package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
  153. package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
  154. package/docs/snippets/tests/hover-image-replay.mdx +7 -0
  155. package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
  156. package/docs/snippets/tests/hover-text-replay.mdx +7 -0
  157. package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
  158. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
  159. package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
  160. package/docs/snippets/tests/match-image-replay.mdx +7 -0
  161. package/docs/snippets/tests/match-image-yaml.mdx +17 -0
  162. package/docs/snippets/tests/press-keys-replay.mdx +7 -0
  163. package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
  164. package/docs/snippets/tests/remember-replay.mdx +7 -0
  165. package/docs/snippets/tests/remember-yaml.mdx +28 -0
  166. package/docs/snippets/tests/scroll-replay.mdx +7 -0
  167. package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
  168. package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
  169. package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
  170. package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
  171. package/docs/snippets/tests/scroll-yaml.mdx +30 -0
  172. package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
  173. package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
  174. package/docs/snippets/tests/type-replay.mdx +7 -0
  175. package/docs/snippets/tests/type-yaml.mdx +28 -0
  176. package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
  177. package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
  178. package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
  179. package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
  180. package/docs/snippets/tests/wait-replay.mdx +7 -0
  181. package/docs/snippets/tests/wait-yaml.mdx +13 -0
  182. package/docs/styles.css +65 -0
  183. package/docs/v6/account/dashboard.mdx +16 -0
  184. package/docs/v6/account/enterprise.mdx +110 -0
  185. package/docs/v6/account/pricing.mdx +33 -0
  186. package/docs/v6/account/projects.mdx +33 -0
  187. package/docs/v6/account/team.mdx +35 -0
  188. package/docs/v6/action/ami.mdx +109 -0
  189. package/docs/v6/action/performance.mdx +105 -0
  190. package/docs/v6/action/secrets.mdx +93 -0
  191. package/docs/v6/apps/chrome-extensions.mdx +48 -0
  192. package/docs/v6/apps/desktop-apps.mdx +93 -0
  193. package/docs/v6/apps/mobile-apps.mdx +26 -0
  194. package/docs/v6/apps/static-websites.mdx +54 -0
  195. package/docs/v6/apps/tauri-apps.mdx +361 -0
  196. package/docs/v6/bugs/jira.mdx +232 -0
  197. package/docs/v6/cli/overview.mdx +66 -0
  198. package/docs/v6/commands/assert.mdx +45 -0
  199. package/docs/v6/commands/exec.mdx +276 -0
  200. package/docs/v6/commands/focus-application.mdx +44 -0
  201. package/docs/v6/commands/hover-image.mdx +69 -0
  202. package/docs/v6/commands/hover-text.mdx +47 -0
  203. package/docs/v6/commands/if.mdx +53 -0
  204. package/docs/v6/commands/match-image.mdx +67 -0
  205. package/docs/v6/commands/press-keys.mdx +87 -0
  206. package/docs/v6/commands/remember.mdx +49 -0
  207. package/docs/v6/commands/run.mdx +44 -0
  208. package/docs/v6/commands/scroll-until-image.mdx +66 -0
  209. package/docs/v6/commands/scroll-until-text.mdx +60 -0
  210. package/docs/v6/commands/scroll.mdx +69 -0
  211. package/docs/v6/commands/type.mdx +45 -0
  212. package/docs/v6/commands/wait-for-image.mdx +54 -0
  213. package/docs/v6/commands/wait-for-text.mdx +48 -0
  214. package/docs/v6/commands/wait.mdx +45 -0
  215. package/docs/v6/exporting/junit.mdx +218 -0
  216. package/docs/v6/exporting/playwright.mdx +197 -0
  217. package/docs/v6/features/auto-healing.mdx +144 -0
  218. package/docs/v6/features/generation.mdx +116 -0
  219. package/docs/v6/features/parallel-testing.mdx +151 -0
  220. package/docs/v6/features/reusable-snippets.mdx +131 -0
  221. package/docs/v6/features/selectorless.mdx +80 -0
  222. package/docs/v6/features/visual-assertions.mdx +139 -0
  223. package/docs/v6/getting-started/ci.mdx +146 -0
  224. package/docs/v6/getting-started/cli.mdx +91 -0
  225. package/docs/v6/getting-started/editing.mdx +100 -0
  226. package/docs/v6/getting-started/playwright.mdx +342 -0
  227. package/docs/v6/getting-started/running.mdx +48 -0
  228. package/docs/v6/getting-started/self-hosting.mdx +408 -0
  229. package/docs/v6/getting-started/vscode.mdx +88 -0
  230. package/docs/v6/guide/assertions.mdx +189 -0
  231. package/docs/v6/guide/authentication.mdx +136 -0
  232. package/docs/v6/guide/code.mdx +65 -0
  233. package/docs/v6/guide/dashcam.mdx +118 -0
  234. package/docs/v6/guide/environment-variables.mdx +26 -0
  235. package/docs/v6/guide/lifecycle.mdx +242 -0
  236. package/docs/v6/guide/locating.mdx +141 -0
  237. package/docs/v6/guide/protips.mdx +43 -0
  238. package/docs/v6/guide/variables.mdx +143 -0
  239. package/docs/v6/guide/waiting.mdx +130 -0
  240. package/docs/v6/importing/csv.mdx +196 -0
  241. package/docs/v6/importing/gherkin.mdx +143 -0
  242. package/docs/v6/importing/jira.mdx +164 -0
  243. package/docs/v6/importing/testrail.mdx +162 -0
  244. package/docs/v6/integrations/electron.mdx +146 -0
  245. package/docs/v6/integrations/netlify.mdx +100 -0
  246. package/docs/v6/integrations/vercel.mdx +125 -0
  247. package/docs/v6/interactive/explore.mdx +99 -0
  248. package/docs/v6/interactive/run.mdx +52 -0
  249. package/docs/v6/interactive/save.mdx +63 -0
  250. package/docs/v6/overview/comparison.mdx +101 -0
  251. package/docs/v6/overview/faq.mdx +162 -0
  252. package/docs/v6/overview/performance.mdx +52 -0
  253. package/docs/v6/overview/quickstart.mdx +137 -0
  254. package/docs/v6/overview/what-is-testdriver.mdx +85 -0
  255. package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
  256. package/docs/v6/scenarios/cookie-banner.mdx +32 -0
  257. package/docs/v6/scenarios/file-upload.mdx +33 -0
  258. package/docs/v6/scenarios/form-filling.mdx +32 -0
  259. package/docs/v6/scenarios/log-in.mdx +75 -0
  260. package/docs/v6/scenarios/pdf-generation.mdx +25 -0
  261. package/docs/v6/scenarios/spell-check.mdx +22 -0
  262. package/docs/v6/security/action.mdx +84 -0
  263. package/docs/v6/security/agent.mdx +73 -0
  264. package/docs/v6/security/platform.mdx +77 -0
  265. package/docs/v6/tutorials/advanced-test.mdx +81 -0
  266. package/docs/v6/tutorials/basic-test.mdx +45 -0
  267. package/docs/v7/_drafts/agents.mdx +843 -0
  268. package/docs/v7/_drafts/architecture.mdx +399 -0
  269. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  270. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
  271. package/docs/v7/_drafts/best-practices.mdx +486 -0
  272. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  273. package/docs/v7/_drafts/caching-selectors.mdx +424 -0
  274. package/docs/v7/_drafts/caching.mdx +366 -0
  275. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  276. package/docs/v7/_drafts/commands/assert.mdx +45 -0
  277. package/docs/v7/_drafts/commands/exec.mdx +276 -0
  278. package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
  279. package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
  280. package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
  281. package/docs/v7/_drafts/commands/if.mdx +53 -0
  282. package/docs/v7/_drafts/commands/match-image.mdx +67 -0
  283. package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
  284. package/docs/v7/_drafts/commands/remember.mdx +49 -0
  285. package/docs/v7/_drafts/commands/run.mdx +44 -0
  286. package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
  287. package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
  288. package/docs/v7/_drafts/commands/scroll.mdx +69 -0
  289. package/docs/v7/_drafts/commands/type.mdx +45 -0
  290. package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
  291. package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
  292. package/docs/v7/_drafts/commands/wait.mdx +45 -0
  293. package/docs/v7/_drafts/configuration.mdx +378 -0
  294. package/docs/v7/_drafts/contributing.mdx +174 -0
  295. package/docs/v7/_drafts/core.mdx +458 -0
  296. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  297. package/docs/v7/_drafts/debugging.mdx +349 -0
  298. package/docs/v7/_drafts/error-handling.mdx +501 -0
  299. package/docs/v7/_drafts/faq.mdx +393 -0
  300. package/docs/v7/_drafts/hooks.mdx +360 -0
  301. package/docs/v7/_drafts/init-command.mdx +95 -0
  302. package/docs/v7/_drafts/installation.mdx +420 -0
  303. package/docs/v7/_drafts/migration.mdx +562 -0
  304. package/docs/v7/_drafts/observable.mdx +604 -0
  305. package/docs/v7/_drafts/playwright.mdx +342 -0
  306. package/docs/v7/_drafts/plugin-migration.mdx +220 -0
  307. package/docs/v7/_drafts/powerful.mdx +419 -0
  308. package/docs/v7/_drafts/presets.mdx +210 -0
  309. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  310. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  311. package/docs/v7/_drafts/provision.mdx +390 -0
  312. package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
  313. package/docs/v7/_drafts/readme.mdx +135 -0
  314. package/docs/v7/_drafts/reports.mdx +414 -0
  315. package/docs/v7/_drafts/scalable.mdx +763 -0
  316. package/docs/v7/_drafts/screenshot.mdx +155 -0
  317. package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
  318. package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
  319. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  320. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  321. package/docs/v7/_drafts/self-hosting.mdx +369 -0
  322. package/docs/v7/_drafts/test-recording.mdx +382 -0
  323. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  324. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  325. package/docs/v7/_drafts/vitest.mdx +535 -0
  326. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  327. package/docs/v7/ai.mdx +205 -0
  328. package/docs/v7/assert.mdx +316 -0
  329. package/docs/v7/aws-setup.mdx +449 -0
  330. package/docs/v7/cache.mdx +223 -0
  331. package/docs/v7/caching.mdx +128 -0
  332. package/docs/v7/captcha.mdx +159 -0
  333. package/docs/v7/ci-cd.mdx +603 -0
  334. package/docs/v7/click.mdx +287 -0
  335. package/docs/v7/client.mdx +478 -0
  336. package/docs/v7/copilot/auto-healing.mdx +265 -0
  337. package/docs/v7/copilot/creating-tests.mdx +156 -0
  338. package/docs/v7/copilot/github.mdx +143 -0
  339. package/docs/v7/copilot/running-tests.mdx +149 -0
  340. package/docs/v7/copilot/setup.mdx +143 -0
  341. package/docs/v7/customizing-devices.mdx +319 -0
  342. package/docs/v7/dashcam.mdx +419 -0
  343. package/docs/v7/debugging-with-screenshots.mdx +402 -0
  344. package/docs/v7/device-config.mdx +317 -0
  345. package/docs/v7/double-click.mdx +102 -0
  346. package/docs/v7/elements.mdx +606 -0
  347. package/docs/v7/enterprise.mdx +9 -0
  348. package/docs/v7/errors.mdx +248 -0
  349. package/docs/v7/events.mdx +358 -0
  350. package/docs/v7/examples/ai.mdx +72 -0
  351. package/docs/v7/examples/assert.mdx +72 -0
  352. package/docs/v7/examples/captcha-api.mdx +92 -0
  353. package/docs/v7/examples/chrome-extension.mdx +132 -0
  354. package/docs/v7/examples/drag-and-drop.mdx +100 -0
  355. package/docs/v7/examples/element-not-found.mdx +67 -0
  356. package/docs/v7/examples/exec-output.mdx +85 -0
  357. package/docs/v7/examples/exec-pwsh.mdx +83 -0
  358. package/docs/v7/examples/focus-window.mdx +62 -0
  359. package/docs/v7/examples/hover-image.mdx +94 -0
  360. package/docs/v7/examples/hover-text.mdx +69 -0
  361. package/docs/v7/examples/installer.mdx +91 -0
  362. package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
  363. package/docs/v7/examples/match-image.mdx +96 -0
  364. package/docs/v7/examples/press-keys.mdx +92 -0
  365. package/docs/v7/examples/scroll-keyboard.mdx +79 -0
  366. package/docs/v7/examples/scroll-until-image.mdx +81 -0
  367. package/docs/v7/examples/scroll-until-text.mdx +109 -0
  368. package/docs/v7/examples/scroll.mdx +81 -0
  369. package/docs/v7/examples/type.mdx +92 -0
  370. package/docs/v7/examples/windows-installer.mdx +89 -0
  371. package/docs/v7/exec.mdx +318 -0
  372. package/docs/v7/find.mdx +830 -0
  373. package/docs/v7/focus-application.mdx +294 -0
  374. package/docs/v7/generating-tests.mdx +36 -0
  375. package/docs/v7/hosted.mdx +158 -0
  376. package/docs/v7/hover.mdx +279 -0
  377. package/docs/v7/locating-elements.mdx +71 -0
  378. package/docs/v7/making-assertions.mdx +32 -0
  379. package/docs/v7/mcp.mdx +9 -0
  380. package/docs/v7/mouse-down.mdx +161 -0
  381. package/docs/v7/mouse-up.mdx +164 -0
  382. package/docs/v7/parse.mdx +237 -0
  383. package/docs/v7/performing-actions.mdx +54 -0
  384. package/docs/v7/press-keys.mdx +349 -0
  385. package/docs/v7/provision.mdx +333 -0
  386. package/docs/v7/quickstart.mdx +173 -0
  387. package/docs/v7/redraw.mdx +216 -0
  388. package/docs/v7/reusable-code.mdx +249 -0
  389. package/docs/v7/right-click.mdx +123 -0
  390. package/docs/v7/running-tests.mdx +185 -0
  391. package/docs/v7/screenshot.mdx +249 -0
  392. package/docs/v7/screenshots.mdx +186 -0
  393. package/docs/v7/scroll.mdx +336 -0
  394. package/docs/v7/secrets.mdx +115 -0
  395. package/docs/v7/self-hosted.mdx +149 -0
  396. package/docs/v7/type.mdx +358 -0
  397. package/docs/v7/variables.mdx +111 -0
  398. package/docs/v7/wait.mdx +52 -0
  399. package/docs/v7/waiting-for-elements.mdx +90 -0
  400. package/docs/v7/what-is-testdriver.mdx +54 -0
  401. package/eslint.config.js +67 -0
  402. package/examples/ai.test.mjs +31 -0
  403. package/examples/assert.test.mjs +47 -0
  404. package/examples/chrome-extension.test.mjs +97 -0
  405. package/examples/config.mjs +5 -0
  406. package/examples/element-not-found.test.mjs +27 -0
  407. package/examples/exec-output.test.mjs +60 -0
  408. package/examples/exec-pwsh.test.mjs +58 -0
  409. package/examples/findall-coffee-icons.test.mjs +42 -0
  410. package/examples/focus-window.test.mjs +37 -0
  411. package/examples/formatted-logging.test.mjs +27 -0
  412. package/examples/hover-image.test.mjs +53 -0
  413. package/examples/hover-text-with-description.test.mjs +57 -0
  414. package/examples/hover-text.test.mjs +28 -0
  415. package/examples/installer.test.mjs +50 -0
  416. package/examples/launch-vscode-linux.test.mjs +55 -0
  417. package/examples/match-image.test.mjs +55 -0
  418. package/examples/parse.test.mjs +19 -0
  419. package/examples/press-keys.test.mjs +44 -0
  420. package/examples/prompt.test.mjs +34 -0
  421. package/examples/scroll-keyboard.test.mjs +38 -0
  422. package/examples/scroll-until-image.test.mjs +40 -0
  423. package/examples/scroll.test.mjs +42 -0
  424. package/examples/type.test.mjs +46 -0
  425. package/examples/windows-installer.test.mjs +54 -0
  426. package/index.js +2 -0
  427. package/interfaces/cli/commands/init.js +438 -0
  428. package/interfaces/cli/commands/setup.js +382 -0
  429. package/interfaces/cli/lib/base.js +285 -0
  430. package/interfaces/cli.js +20 -0
  431. package/interfaces/junit-reporter.js +290 -0
  432. package/interfaces/logger.js +388 -0
  433. package/interfaces/readline.js +234 -0
  434. package/interfaces/shared-test-state.mjs +64 -0
  435. package/interfaces/vitest-plugin.d.ts +115 -0
  436. package/interfaces/vitest-plugin.mjs +1698 -0
  437. package/lib/captcha/solver.js +358 -0
  438. package/lib/core/Dashcam.js +533 -0
  439. package/lib/core/index.d.ts +172 -0
  440. package/lib/core/index.js +12 -0
  441. package/lib/environments.json +18 -0
  442. package/lib/github-comment-formatter.js +263 -0
  443. package/lib/github-comment.mjs +452 -0
  444. package/lib/init-project.js +575 -0
  445. package/lib/presets/index.mjs +331 -0
  446. package/lib/resolve-channel.js +46 -0
  447. package/lib/sentry.js +417 -0
  448. package/lib/vitest/hooks.d.ts +57 -0
  449. package/lib/vitest/hooks.mjs +674 -0
  450. package/lib/vitest/setup-aws.mjs +247 -0
  451. package/lib/vitest/setup-self-hosted.mjs +151 -0
  452. package/lib/vitest/setup.mjs +46 -0
  453. package/manual/captcha-api.test.mjs +51 -0
  454. package/manual/drag-and-drop.test.mjs +59 -0
  455. package/manual/flake-diffthreshold-001.test.mjs +9 -0
  456. package/manual/flake-diffthreshold-01.test.mjs +9 -0
  457. package/manual/flake-diffthreshold-05.test.mjs +9 -0
  458. package/manual/flake-noredraw-cache.test.mjs +9 -0
  459. package/manual/flake-noredraw-nocache.test.mjs +9 -0
  460. package/manual/flake-redraw-cache.test.mjs +9 -0
  461. package/manual/flake-redraw-nocache.test.mjs +9 -0
  462. package/manual/flake-rocket-match.test.mjs +30 -0
  463. package/manual/flake-shared.mjs +51 -0
  464. package/manual/no-provision.test.mjs +31 -0
  465. package/manual/packer-hover-image.test.mjs +176 -0
  466. package/manual/scroll-until-text.test.mjs +68 -0
  467. package/manual/test-init-command.js +223 -0
  468. package/mcp-server/README.md +322 -0
  469. package/mcp-server/dist/codegen.d.ts +9 -0
  470. package/mcp-server/dist/codegen.js +165 -0
  471. package/mcp-server/dist/mcp-app.html +114 -0
  472. package/mcp-server/dist/package.json +1 -0
  473. package/mcp-server/dist/provision-types.d.ts +290 -0
  474. package/mcp-server/dist/provision-types.js +174 -0
  475. package/mcp-server/dist/server.d.ts +6 -0
  476. package/mcp-server/dist/server.mjs +1925 -0
  477. package/mcp-server/dist/session.d.ts +85 -0
  478. package/mcp-server/dist/session.js +152 -0
  479. package/mcp-server/mcp-app.html +28 -0
  480. package/mcp-server/mcp-config.example.json +19 -0
  481. package/mcp-server/package-lock.json +4027 -0
  482. package/mcp-server/package.json +31 -0
  483. package/mcp-server/src/codegen.ts +189 -0
  484. package/mcp-server/src/mcp-app.css +360 -0
  485. package/mcp-server/src/mcp-app.ts +547 -0
  486. package/mcp-server/src/provision-types.ts +209 -0
  487. package/mcp-server/src/server.ts +2391 -0
  488. package/mcp-server/src/session.ts +194 -0
  489. package/mcp-server/tsconfig.json +16 -0
  490. package/mcp-server/vite.config.ts +23 -0
  491. package/package.json +158 -0
  492. package/schema.json +1046 -0
  493. package/scripts/generate-skills.js +94 -0
  494. package/sdk-log-formatter.js +1157 -0
  495. package/sdk.d.ts +1486 -0
  496. package/sdk.js +4336 -0
  497. package/setup/aws/cloudformation.yaml +463 -0
  498. package/setup/aws/disable-defender.sh +42 -0
  499. package/setup/aws/install-dev-runner.sh +79 -0
  500. package/setup/aws/spawn-runner.sh +289 -0
  501. package/test/captcha-solver.test.mjs +152 -0
  502. package/test/chrome-remote-debugging.test.mjs +66 -0
  503. package/test/duckduckgo/experiment.test.mjs +28 -0
  504. package/test/duckduckgo/setup.test.mjs +29 -0
  505. package/test/manual/debug-locate-response.js +82 -0
  506. package/test/manual/reconnect-provision.test.mjs +49 -0
  507. package/test/manual/test-console-logs.test.mjs +42 -0
  508. package/test/manual/test-find-api.js +73 -0
  509. package/test/manual/test-init.sh +54 -0
  510. package/test/manual/test-prompt-cache.js +97 -0
  511. package/test/manual/test-provision-auth.mjs +22 -0
  512. package/test/manual/test-sandbox-render.js +29 -0
  513. package/test/manual/test-sdk-methods.js +15 -0
  514. package/test/manual/test-sdk-refactor.js +53 -0
  515. package/test/manual/test-stack-trace.mjs +57 -0
  516. package/test/manual/verify-element-api.js +89 -0
  517. package/test/manual/verify-types.js +0 -0
  518. package/test/manual-unawaited-promise.test.mjs +31 -0
  519. package/vitest.config.mjs +58 -0
  520. package/vitest.runner.config.mjs +33 -0
  521. package/vscode-extension/.vscodeignore +12 -0
  522. package/vscode-extension/README.md +94 -0
  523. package/vscode-extension/media/icon.png +0 -0
  524. package/vscode-extension/package-lock.json +4126 -0
  525. package/vscode-extension/package.json +86 -0
  526. package/vscode-extension/src/extension.ts +829 -0
  527. package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
  528. package/vscode-extension/tsconfig.json +16 -0
@@ -0,0 +1,248 @@
1
+ ---
2
+ title: "Errors"
3
+ sidebarTitle: "Errors"
4
+ description: "Custom error classes and error handling"
5
+ icon: "triangle-exclamation"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Overview
10
+
11
+ TestDriver provides custom error classes with rich debugging information. These are exported from the SDK and can be used for `instanceof` checks in your tests.
12
+
13
+ ```javascript
14
+ import TestDriver, { ElementNotFoundError, AIError } from 'testdriverai';
15
+ ```
16
+
17
+ ## ElementNotFoundError
18
+
19
+ Thrown when `find()` cannot locate an element on screen, or when calling `click()`/`hover()` on an unfound element.
20
+
21
+ ```javascript
22
+ try {
23
+ await testdriver.find('nonexistent button').click();
24
+ } catch (error) {
25
+ if (error instanceof ElementNotFoundError) {
26
+ console.log(error.description); // "nonexistent button"
27
+ console.log(error.screenshotPath); // path to debug screenshot
28
+ console.log(error.pixelDiffPath); // path to pixel diff image
29
+ }
30
+ }
31
+ ```
32
+
33
+ ### Properties
34
+
35
+ <ParamField path="name" type="string">
36
+ Always `"ElementNotFoundError"`.
37
+ </ParamField>
38
+
39
+ <ParamField path="message" type="string">
40
+ Enhanced message with a debug block containing element description, cache status, similarity scores, and AI response details.
41
+ </ParamField>
42
+
43
+ <ParamField path="description" type="string">
44
+ The original element description passed to `find()`.
45
+ </ParamField>
46
+
47
+ <ParamField path="screenshotPath" type="string | null">
48
+ Absolute path to a debug screenshot saved at the time of failure. Written to `<os.tmpdir>/testdriver-debug/screenshot-<timestamp>.png`.
49
+ </ParamField>
50
+
51
+ <ParamField path="pixelDiffPath" type="string | null">
52
+ Absolute path to a pixel diff image showing the comparison between the cached and current screenshots. Written to `<os.tmpdir>/testdriver-debug/pixel-diff-error-<timestamp>.png`. Only present when cache was involved.
53
+ </ParamField>
54
+
55
+ <ParamField path="cachedImagePath" type="string | null">
56
+ URL to the cached image that was compared against.
57
+ </ParamField>
58
+
59
+ <ParamField path="aiResponse" type="object | null">
60
+ Sanitized AI response object. Large binary fields (`croppedImage`, `screenshot`, `pixelDiffImage`) are removed. Contains cache metadata like `similarity`, `cacheHit`, `cacheStrategy`, `cacheDiffPercent`, and `threshold`.
61
+ </ParamField>
62
+
63
+ <ParamField path="timestamp" type="string">
64
+ ISO 8601 timestamp of when the error was created.
65
+ </ParamField>
66
+
67
+ ### Enhanced Message
68
+
69
+ The error message is automatically enhanced with debugging information:
70
+
71
+ ```
72
+ Element not found: "submit button"
73
+
74
+ === Element Debug Info ===
75
+ Element: submit button
76
+ Cache Hit: false
77
+ Similarity: 0.23
78
+ Cache Strategy: pixel-diff
79
+ Threshold: 0.05
80
+ AI Response Element: null
81
+ ```
82
+
83
+ ### Stack Trace Cleaning
84
+
85
+ Stack traces are automatically cleaned to remove internal SDK frames (`Element.*`, `sdk.js` internals), showing only your test code for easier debugging.
86
+
87
+ ## AIError
88
+
89
+ Thrown when `act()` exhausts all retry attempts.
90
+
91
+ ```javascript
92
+ try {
93
+ await testdriver.act('perform complex workflow', { tries: 3 });
94
+ } catch (error) {
95
+ if (error instanceof AIError) {
96
+ console.log(error.task); // "perform complex workflow"
97
+ console.log(error.tries); // 3
98
+ console.log(error.duration); // 15234 (ms)
99
+ console.log(error.cause); // underlying Error
100
+ }
101
+ }
102
+ ```
103
+
104
+ ### Properties
105
+
106
+ <ParamField path="name" type="string">
107
+ Always `"AIError"`.
108
+ </ParamField>
109
+
110
+ <ParamField path="message" type="string">
111
+ Enhanced message with execution details block.
112
+ </ParamField>
113
+
114
+ <ParamField path="task" type="string">
115
+ The task description passed to `act()`.
116
+ </ParamField>
117
+
118
+ <ParamField path="tries" type="number">
119
+ Number of attempts that were made.
120
+ </ParamField>
121
+
122
+ <ParamField path="maxTries" type="number">
123
+ Maximum number of attempts configured.
124
+ </ParamField>
125
+
126
+ <ParamField path="duration" type="number">
127
+ Total execution time in milliseconds.
128
+ </ParamField>
129
+
130
+ <ParamField path="cause" type="Error | undefined">
131
+ The underlying error that caused the final failure.
132
+ </ParamField>
133
+
134
+ <ParamField path="timestamp" type="string">
135
+ ISO 8601 timestamp of when the error was created.
136
+ </ParamField>
137
+
138
+ ### Enhanced Message
139
+
140
+ ```
141
+ AI failed: Element not found after 3 attempts
142
+
143
+ === AI Execution Details ===
144
+ Task: perform complex workflow
145
+ Tries: 3 / 3
146
+ Duration: 15234ms
147
+ Cause: ElementNotFoundError: Element not found: "submit button"
148
+ ```
149
+
150
+ ## Internal Error Classes
151
+
152
+ These errors are used internally by the agent and are not exported, but may appear as the `cause` of an `AIError`:
153
+
154
+ ### MatchError
155
+
156
+ Thrown when element matching fails (text, image, or assertion).
157
+
158
+ | Property | Type | Description |
159
+ |---|---|---|
160
+ | `fatal` | `boolean` | If `true`, cannot be healed. Default: `false` |
161
+ | `attachScreenshot` | `boolean` | Always `true` — a screenshot is attached to the error |
162
+
163
+ ### CommandError
164
+
165
+ Thrown for invalid arguments or unsupported operations.
166
+
167
+ | Property | Type | Description |
168
+ |---|---|---|
169
+ | `fatal` | `boolean` | Always `true` |
170
+ | `attachScreenshot` | `boolean` | Always `false` |
171
+
172
+ ## Soft Assert Mode
173
+
174
+ Inside `act()`, assertions run in **soft assert mode**. When an assertion fails, it returns the failure result instead of throwing, allowing the AI to process the failure and adjust its approach.
175
+
176
+ ```javascript
177
+ // Inside act(), assertion failures don't throw
178
+ await testdriver.act('verify the dashboard shows correct data', {
179
+ tries: 3,
180
+ });
181
+ // The AI can see assertion results and self-correct
182
+ ```
183
+
184
+ This is automatic — you don't need to configure it. Regular `assert()` calls outside of `act()` will throw normally on failure.
185
+
186
+ ## Error Handling Patterns
187
+
188
+ ### Catching Specific Errors
189
+
190
+ ```javascript
191
+ import TestDriver, { ElementNotFoundError, AIError } from 'testdriverai';
192
+
193
+ try {
194
+ await testdriver.find('submit button').click();
195
+ } catch (error) {
196
+ if (error instanceof ElementNotFoundError) {
197
+ // Element wasn't found — check screenshot for debugging
198
+ console.log('Debug screenshot:', error.screenshotPath);
199
+ } else if (error instanceof AIError) {
200
+ // AI exhausted retries
201
+ console.log(`Failed after ${error.tries} tries in ${error.duration}ms`);
202
+ } else {
203
+ throw error; // Unexpected error
204
+ }
205
+ }
206
+ ```
207
+
208
+ ### Using Debug Screenshots
209
+
210
+ ```javascript
211
+ try {
212
+ const el = await testdriver.find('checkout button');
213
+ await el.click();
214
+ } catch (error) {
215
+ if (error instanceof ElementNotFoundError) {
216
+ // Screenshot of what the screen looked like
217
+ console.log('Screen:', error.screenshotPath);
218
+ // Pixel diff showing cache comparison
219
+ console.log('Diff:', error.pixelDiffPath);
220
+ // Full AI response metadata
221
+ console.log('AI:', JSON.stringify(error.aiResponse, null, 2));
222
+ }
223
+ }
224
+ ```
225
+
226
+ ## Types
227
+
228
+ ```typescript
229
+ class ElementNotFoundError extends Error {
230
+ name: 'ElementNotFoundError';
231
+ description: string;
232
+ screenshotPath: string | null;
233
+ pixelDiffPath: string | null;
234
+ cachedImagePath: string | null;
235
+ aiResponse: Record<string, any> | null;
236
+ timestamp: string;
237
+ }
238
+
239
+ class AIError extends Error {
240
+ name: 'AIError';
241
+ task: string;
242
+ tries: number;
243
+ maxTries: number;
244
+ duration: number;
245
+ cause?: Error;
246
+ timestamp: string;
247
+ }
248
+ ```
@@ -0,0 +1,358 @@
1
+ ---
2
+ title: "Events"
3
+ sidebarTitle: "Events"
4
+ description: "Listen to SDK lifecycle events with wildcard support"
5
+ icon: "bolt"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Overview
10
+
11
+ TestDriver uses [EventEmitter2](https://github.com/EventEmitter2/EventEmitter2) for its event system. Events use a colon-delimited namespace pattern and support wildcard listeners.
12
+
13
+ Access the emitter through `testdriver.emitter`:
14
+
15
+ ```javascript
16
+ testdriver.emitter.on('command:start', (data) => {
17
+ console.log(`Running: ${data.command}`);
18
+ });
19
+ ```
20
+
21
+ ### Configuration
22
+
23
+ The internal emitter is created with:
24
+
25
+ ```javascript
26
+ new EventEmitter2({
27
+ wildcard: true,
28
+ delimiter: ':',
29
+ maxListeners: 20,
30
+ verboseMemoryLeak: false,
31
+ ignoreErrors: false,
32
+ });
33
+ ```
34
+
35
+ ### Wildcard Listeners
36
+
37
+ Use `*` to match a single level or `**` to match multiple levels:
38
+
39
+ ```javascript
40
+ // Match all log events
41
+ testdriver.emitter.on('log:*', (message) => {
42
+ console.log(message);
43
+ });
44
+
45
+ // Match all events in any namespace
46
+ testdriver.emitter.on('**', (...args) => {
47
+ console.log('Event:', this.event, args);
48
+ });
49
+ ```
50
+
51
+ ## Event Reference
52
+
53
+ ### Command Events
54
+
55
+ Emitted during the execution of SDK commands (`click`, `type`, `find`, etc.).
56
+
57
+ | Event | Payload |
58
+ |---|---|
59
+ | `command:start` | `{ command, depth, data, timestamp, sourcePosition }` |
60
+ | `command:success` | `{ command, depth, data, duration, response, timestamp, sourcePosition }` |
61
+ | `command:error` | `{ command, depth, data, error, duration, timestamp, sourcePosition }` |
62
+ | `command:status` | `{ command, status: "executing", data, depth, timestamp }` |
63
+ | `command:progress` | `{ command, status: "completed", timing, data, depth, timestamp }` |
64
+
65
+ ```javascript
66
+ testdriver.emitter.on('command:start', ({ command, data }) => {
67
+ console.log(`Starting ${command}`, data);
68
+ });
69
+
70
+ testdriver.emitter.on('command:error', ({ command, error, duration }) => {
71
+ console.error(`${command} failed after ${duration}ms: ${error}`);
72
+ });
73
+ ```
74
+
75
+ ### Step Events
76
+
77
+ Emitted for each AI reasoning step within a command.
78
+
79
+ | Event | Payload |
80
+ |---|---|
81
+ | `step:start` | `{ stepIndex, prompt, commandCount, timestamp, sourcePosition }` |
82
+ | `step:success` | `{ stepIndex, prompt, commandCount, duration, timestamp, sourcePosition }` |
83
+ | `step:error` | `{ stepIndex, prompt, error, duration?, timestamp, sourcePosition? }` |
84
+
85
+ ```javascript
86
+ testdriver.emitter.on('step:start', ({ stepIndex, prompt }) => {
87
+ console.log(`Step ${stepIndex}: ${prompt}`);
88
+ });
89
+ ```
90
+
91
+ ### Test Events
92
+
93
+ Emitted when a test file execution starts.
94
+
95
+ | Event | Payload |
96
+ |---|---|
97
+ | `test:start` | `{ filePath, timestamp }` |
98
+ | `test:success` | *Emitted on test completion* |
99
+ | `test:error` | *Emitted on test failure* |
100
+
101
+ ### Log Events
102
+
103
+ Emitted for all log output from the SDK.
104
+
105
+ | Event | Payload |
106
+ |---|---|
107
+ | `log:log` | `(message: string)` — general log message |
108
+ | `log:warn` | `(message: string)` — warning message |
109
+ | `log:debug` | `(message: string)` — debug output (only when `VERBOSE`/`DEBUG`/`TD_DEBUG` env set) |
110
+ | `log:info` | `(message: string)` — informational message |
111
+ | `log:error` | `(message: string)` — error message |
112
+ | `log:narration` | `(message: string, overwrite?: boolean)` — in-place status line |
113
+ | `log:markdown` | `(markdown: string)` — full static markdown content |
114
+ | `log:markdown:start` | `(streamId: string)` — begin streaming markdown |
115
+ | `log:markdown:chunk` | `(streamId: string, chunk: string)` — incremental chunk |
116
+ | `log:markdown:end` | `(streamId: string)` — end streaming markdown |
117
+
118
+ ```javascript
119
+ // Capture all logs
120
+ testdriver.emitter.on('log:*', function (message) {
121
+ console.log(`[${this.event}]`, message);
122
+ });
123
+ ```
124
+
125
+ ### Screen Capture Events
126
+
127
+ Emitted during screenshot capture.
128
+
129
+ | Event | Payload |
130
+ |---|---|
131
+ | `screen-capture:start` | `{ scale, silent, display }` |
132
+ | `screen-capture:end` | `{ scale, silent, display }` |
133
+ | `screen-capture:error` | `{ error, scale, silent, display }` |
134
+
135
+ ### Sandbox Events
136
+
137
+ Emitted for sandbox WebSocket lifecycle and communication.
138
+
139
+ | Event | Payload |
140
+ |---|---|
141
+ | `sandbox:connected` | *No payload* — WebSocket connection established |
142
+ | `sandbox:authenticated` | `{ traceId }` — authentication successful |
143
+ | `sandbox:error` | `(err: Error \| string)` — connection or sandbox error |
144
+ | `sandbox:sent` | `(message: object)` — WebSocket message sent |
145
+ | `sandbox:received` | *No payload* — successful message reply received |
146
+ | `sandbox:progress` | `{ step, message }` — sandbox setup progress |
147
+
148
+ ```javascript
149
+ testdriver.emitter.on('sandbox:connected', () => {
150
+ console.log('Connected to sandbox');
151
+ });
152
+
153
+ testdriver.emitter.on('sandbox:progress', ({ step, message }) => {
154
+ console.log(`Sandbox: [${step}] ${message}`);
155
+ });
156
+ ```
157
+
158
+ ### Redraw Events
159
+
160
+ Emitted during screen stability detection. See [Redraw](/v7/redraw) for more details.
161
+
162
+ | Event | Payload |
163
+ |---|---|
164
+ | `redraw:status` | `{ redraw: { enabled, settled, hasChangedFromInitial, consecutiveFramesStable, diffFromInitial, diffFromLast, text }, network: { enabled, settled, rxBytes, txBytes, text }, timeout: { isTimeout, elapsed, max, text } }` |
165
+ | `redraw:complete` | `{ screenSettled, hasChangedFromInitial, consecutiveFramesStable, networkSettled, isTimeout, timeElapsed }` |
166
+
167
+ ```javascript
168
+ testdriver.emitter.on('redraw:complete', (result) => {
169
+ if (result.isTimeout) {
170
+ console.warn('Redraw timed out after', result.timeElapsed, 'ms');
171
+ }
172
+ });
173
+ ```
174
+
175
+ ### File Events
176
+
177
+ Emitted during file load/save operations in the agent.
178
+
179
+ | Event | Payload |
180
+ |---|---|
181
+ | `file:start` | `{ operation: "load" \| "save" \| "run", filePath, timestamp }` |
182
+ | `file:stop` | `{ operation, filePath, duration, success, sourceMap?, reason?, timestamp }` |
183
+ | `file:load` | `{ filePath, size, timestamp }` |
184
+ | `file:save` | `{ filePath, size, timestamp }` |
185
+ | `file:diff` | `{ filePath, diff: { patches, sourceMaps, summary: { additions, deletions, modifications } }, timestamp }` |
186
+ | `file:error` | `{ operation, filePath, error, duration?, timestamp }` |
187
+
188
+ ### Error Events
189
+
190
+ Emitted for errors at various severity levels.
191
+
192
+ | Event | Payload |
193
+ |---|---|
194
+ | `error:fatal` | `(error: string \| Error)` — terminates the process |
195
+ | `error:general` | `(message: string)` — non-fatal error |
196
+ | `error:sandbox` | `(err: Error \| string)` — sandbox/WebSocket error |
197
+
198
+ ```javascript
199
+ testdriver.emitter.on('error:*', function (err) {
200
+ console.error(`[${this.event}]`, err);
201
+ });
202
+ ```
203
+
204
+ ### SDK Events
205
+
206
+ Emitted for API request lifecycle.
207
+
208
+ | Event | Payload |
209
+ |---|---|
210
+ | `sdk:request` | `{ path }` — outgoing API request |
211
+ | `sdk:response` | `{ path }` — API response received |
212
+ | `sdk:retry` | `{ path, attempt, error, delayMs }` — request retry |
213
+
214
+ ### Other Events
215
+
216
+ | Event | Payload |
217
+ |---|---|
218
+ | `exit` | `(exitCode: number)` — `0` for success, `1` for failure |
219
+ | `status` | `(message: string)` — general status updates |
220
+ | `mouse-click` | `{ x, y, button, click, double }` — mouse click performed |
221
+ | `terminal:stdout` | Terminal stdout output |
222
+ | `terminal:stderr` | Terminal stderr output |
223
+
224
+ ## Practical Examples
225
+
226
+ ### Custom Test Reporter
227
+
228
+ ```javascript
229
+ const results = [];
230
+
231
+ testdriver.emitter.on('command:success', ({ command, duration }) => {
232
+ results.push({ command, duration, status: 'pass' });
233
+ });
234
+
235
+ testdriver.emitter.on('command:error', ({ command, duration, error }) => {
236
+ results.push({ command, duration, status: 'fail', error });
237
+ });
238
+
239
+ // After test completes
240
+ afterAll(() => {
241
+ console.table(results);
242
+ });
243
+ ```
244
+
245
+ ### Progress Monitoring
246
+
247
+ ```javascript
248
+ testdriver.emitter.on('step:start', ({ stepIndex, prompt }) => {
249
+ process.stdout.write(`\r Step ${stepIndex}: ${prompt}`);
250
+ });
251
+
252
+ testdriver.emitter.on('command:progress', ({ command, timing }) => {
253
+ process.stdout.write(`\r ${command} completed in ${timing}ms`);
254
+ });
255
+ ```
256
+
257
+ ### Debug Logging
258
+
259
+ ```javascript
260
+ // Log every event (verbose)
261
+ testdriver.emitter.on('**', function (...args) {
262
+ console.debug(`[EVENT] ${this.event}`, ...args);
263
+ });
264
+ ```
265
+
266
+ ## Types
267
+
268
+ ```typescript
269
+ interface CommandStartEvent {
270
+ command: string;
271
+ depth: number;
272
+ data: Record<string, any>;
273
+ timestamp: number;
274
+ sourcePosition: SourcePosition;
275
+ }
276
+
277
+ interface CommandSuccessEvent {
278
+ command: string;
279
+ depth: number;
280
+ data: Record<string, any>;
281
+ duration: number;
282
+ response: any;
283
+ timestamp: number;
284
+ sourcePosition: SourcePosition;
285
+ }
286
+
287
+ interface CommandErrorEvent {
288
+ command: string;
289
+ depth: number;
290
+ data: Record<string, any>;
291
+ error: string;
292
+ duration: number;
293
+ timestamp: number;
294
+ sourcePosition: SourcePosition;
295
+ }
296
+
297
+ interface StepStartEvent {
298
+ stepIndex: number;
299
+ prompt: string;
300
+ commandCount: number;
301
+ timestamp: number;
302
+ sourcePosition: SourcePosition;
303
+ }
304
+
305
+ interface StepSuccessEvent {
306
+ stepIndex: number;
307
+ prompt: string;
308
+ commandCount: number;
309
+ duration: number;
310
+ timestamp: number;
311
+ sourcePosition: SourcePosition;
312
+ }
313
+
314
+ interface RedrawStatusEvent {
315
+ redraw: {
316
+ enabled: boolean;
317
+ settled: boolean;
318
+ hasChangedFromInitial: boolean;
319
+ consecutiveFramesStable: number;
320
+ diffFromInitial: number;
321
+ diffFromLast: number;
322
+ text: string;
323
+ };
324
+ network: {
325
+ enabled: boolean;
326
+ settled: boolean;
327
+ rxBytes: number;
328
+ txBytes: number;
329
+ text: string;
330
+ };
331
+ timeout: {
332
+ isTimeout: boolean;
333
+ elapsed: number;
334
+ max: number;
335
+ text: string;
336
+ };
337
+ }
338
+
339
+ interface RedrawCompleteEvent {
340
+ screenSettled: boolean;
341
+ hasChangedFromInitial: boolean;
342
+ consecutiveFramesStable: number;
343
+ networkSettled: boolean;
344
+ isTimeout: boolean;
345
+ timeElapsed: number;
346
+ }
347
+
348
+ interface SandboxProgressEvent {
349
+ step: string;
350
+ message: string;
351
+ }
352
+
353
+ interface SourcePosition {
354
+ file: string;
355
+ line: number;
356
+ column: number;
357
+ }
358
+ ```
@@ -0,0 +1,72 @@
1
+ ---
2
+ title: "AI Test Example"
3
+ sidebarTitle: "AI"
4
+ description: "Example test using the AI exploratory loop to automate complex multi-step interactions."
5
+ icon: "wand-magic-sparkles"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* ai.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc952cf14c7f71c46d6b90/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="ai.test.mjs" {17}
25
+ /**
26
+ * TestDriver SDK - AI Test
27
+ */
28
+
29
+ import { describe, expect, it } from "vitest";
30
+ import { TestDriver } from "testdriverai/vitest/hooks";
31
+
32
+ describe("AI Test", () => {
33
+ it("should use ai to search for testdriver on Google", async (context) => {
34
+ const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
35
+
36
+ // provision.chrome() automatically calls ready() and starts dashcam
37
+ await testdriver.provision.chrome({
38
+ url: 'https://duckduckgo.com',
39
+ });
40
+
41
+ // Use ai to search for testdriver
42
+ let aiRes = await testdriver.ai("click on the empty search box, type 'testdriver', and hit enter.");
43
+
44
+ console.log("AI response:", aiRes);
45
+
46
+ // Assert the search results are displayed
47
+ const result = await testdriver.assert(
48
+ "search results for testdriver are visible",
49
+ );
50
+
51
+ expect(result).toBeTruthy();
52
+ });
53
+ });
54
+ ```
55
+
56
+ ## Running This Example
57
+
58
+ ```bash
59
+ # Clone the TestDriver repository
60
+ git clone https://github.com/testdriverai/testdriverai
61
+
62
+ # Install dependencies
63
+ cd testdriverai
64
+ npm install
65
+
66
+ # Run this specific example
67
+ npx vitest run examples/ai.test.mjs
68
+ ```
69
+
70
+ <Note>
71
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
72
+ </Note>