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