@testdriverai/agent 7.8.0-test.38
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,204 @@
|
|
|
1
|
+
// utilities for getting information about the system
|
|
2
|
+
const fs = require("fs");
|
|
3
|
+
const os = require("os");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const { randomUUID } = require("crypto");
|
|
6
|
+
const Jimp = require("jimp");
|
|
7
|
+
const axios = require("axios");
|
|
8
|
+
const { withRetry } = require("./sdk");
|
|
9
|
+
const { events } = require("../events.js");
|
|
10
|
+
|
|
11
|
+
const createSystem = (emitter, sandbox, config) => {
|
|
12
|
+
|
|
13
|
+
// Download a screenshot from S3 when the runner returns an s3Key
|
|
14
|
+
// (screenshots exceed Ably's 64KB message limit)
|
|
15
|
+
const downloadFromS3 = async (s3Key) => {
|
|
16
|
+
const apiRoot = config["TD_API_ROOT"] || sandbox.apiRoot;
|
|
17
|
+
const apiKey = sandbox.apiKey;
|
|
18
|
+
|
|
19
|
+
// Step 1: Get presigned download URL from API (with retry)
|
|
20
|
+
const response = await withRetry(
|
|
21
|
+
() => axios({
|
|
22
|
+
method: "post",
|
|
23
|
+
url: apiRoot + "/api/v7/runner/download-url",
|
|
24
|
+
data: { apiKey, s3Key },
|
|
25
|
+
headers: { "Content-Type": "application/json" },
|
|
26
|
+
timeout: 15000,
|
|
27
|
+
}),
|
|
28
|
+
{
|
|
29
|
+
retryConfig: { maxRetries: 3, baseDelayMs: 1000 },
|
|
30
|
+
},
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
const downloadUrl = response.data.downloadUrl;
|
|
34
|
+
if (!downloadUrl) {
|
|
35
|
+
throw new Error("No downloadUrl in response: " + JSON.stringify(response.data));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Step 2: Download the image from S3
|
|
39
|
+
const imageResponse = await axios({
|
|
40
|
+
method: "get",
|
|
41
|
+
url: downloadUrl,
|
|
42
|
+
responseType: "arraybuffer",
|
|
43
|
+
timeout: 30000,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return Buffer.from(imageResponse.data).toString("base64");
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const screenshot = async (options) => {
|
|
50
|
+
let response = await sandbox.send({
|
|
51
|
+
type: "system.screenshot",
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
let base64;
|
|
55
|
+
|
|
56
|
+
// Runner returns { s3Key } for Ably (screenshots too large for 64KB limit)
|
|
57
|
+
// Runner returns { base64 } for direct/local connections
|
|
58
|
+
if (response.s3Key) {
|
|
59
|
+
base64 = await downloadFromS3(response.s3Key);
|
|
60
|
+
} else {
|
|
61
|
+
base64 = response.base64;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!base64) {
|
|
65
|
+
throw new Error("Failed to take screenshot: sandbox returned empty data");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let image = Buffer.from(base64, "base64");
|
|
69
|
+
|
|
70
|
+
// Verify we got actual image data (PNG header starts with these bytes)
|
|
71
|
+
if (image.length < 100) {
|
|
72
|
+
throw new Error(`Failed to take screenshot: received only ${image.length} bytes`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fs.writeFileSync(options.filename, image);
|
|
76
|
+
return { filename: options.filename };
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
let primaryDisplay = null;
|
|
80
|
+
|
|
81
|
+
const getSystemInformationOsInfo = async () => {
|
|
82
|
+
return {
|
|
83
|
+
os: "windows",
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
let countImages = 0;
|
|
88
|
+
const tmpFilename = () => {
|
|
89
|
+
countImages = countImages + 1;
|
|
90
|
+
return path.join(os.tmpdir(), `td-${Date.now()}-${randomUUID().slice(0, 8)}-${countImages}.png`);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const captureAndResize = async (scale = 1, silent = false, mouse = false) => {
|
|
94
|
+
try {
|
|
95
|
+
if (!silent) {
|
|
96
|
+
emitter.emit(events.screenCapture.start, {
|
|
97
|
+
scale,
|
|
98
|
+
silent,
|
|
99
|
+
display: primaryDisplay,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
let step1 = tmpFilename();
|
|
104
|
+
let step2 = tmpFilename();
|
|
105
|
+
|
|
106
|
+
await screenshot({ filename: step1, format: "png" });
|
|
107
|
+
|
|
108
|
+
// Load the screenshot image with Jimp
|
|
109
|
+
let image = await Jimp.read(step1);
|
|
110
|
+
|
|
111
|
+
// Validate the image was loaded correctly (not a 1x1 or tiny placeholder)
|
|
112
|
+
if (image.getWidth() < 10 || image.getHeight() < 10) {
|
|
113
|
+
throw new Error(`Screenshot appears corrupted: got ${image.getWidth()}x${image.getHeight()} pixels`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Resize the image
|
|
117
|
+
image.resize(
|
|
118
|
+
Math.floor(config.TD_RESOLUTION[0] * scale),
|
|
119
|
+
Math.floor(config.TD_RESOLUTION[1] * scale),
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
if (mouse) {
|
|
123
|
+
// Only get mouse position when needed to avoid unnecessary websocket calls
|
|
124
|
+
const cursorPath = path.join(__dirname, "resources", "cursor-2.png");
|
|
125
|
+
const mousePos = await getMousePosition();
|
|
126
|
+
|
|
127
|
+
// Load and composite the mouse cursor image if we have valid coordinates
|
|
128
|
+
if (mousePos && typeof mousePos.x === "number" && typeof mousePos.y === "number") {
|
|
129
|
+
const cursorImage = await Jimp.read(cursorPath);
|
|
130
|
+
image.composite(cursorImage, mousePos.x, mousePos.y);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
await image.writeAsync(step2);
|
|
135
|
+
|
|
136
|
+
emitter.emit(events.screenCapture.end, {
|
|
137
|
+
scale,
|
|
138
|
+
silent,
|
|
139
|
+
display: primaryDisplay,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
return step2;
|
|
143
|
+
} catch (error) {
|
|
144
|
+
emitter.emit(events.screenCapture.error, {
|
|
145
|
+
error,
|
|
146
|
+
scale,
|
|
147
|
+
silent,
|
|
148
|
+
display: primaryDisplay,
|
|
149
|
+
});
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// our handy screenshot function
|
|
155
|
+
const captureScreenBase64 = async (
|
|
156
|
+
scale = 1,
|
|
157
|
+
silent = false,
|
|
158
|
+
mouse = false,
|
|
159
|
+
) => {
|
|
160
|
+
let step2 = await captureAndResize(scale, silent, mouse);
|
|
161
|
+
return fs.readFileSync(step2, "base64");
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const captureScreenPNG = async (scale = 1, silent = false, mouse = false) => {
|
|
165
|
+
return await captureAndResize(scale, silent, mouse);
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const platform = () => {
|
|
169
|
+
return "windows";
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// this is the focused window
|
|
173
|
+
const activeWin = async () => {
|
|
174
|
+
// Get Mouse Position from command line
|
|
175
|
+
let result = await sandbox.send({
|
|
176
|
+
type: "system.get-active-window",
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
return result.out;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
const getMousePosition = async () => {
|
|
183
|
+
// Get Mouse Position from command line
|
|
184
|
+
let result = await sandbox.send({
|
|
185
|
+
type: "system.get-mouse-position",
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
return result.out;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
captureScreenBase64,
|
|
193
|
+
captureScreenPNG,
|
|
194
|
+
getMousePosition,
|
|
195
|
+
primaryDisplay,
|
|
196
|
+
activeWin,
|
|
197
|
+
platform,
|
|
198
|
+
getSystemInformationOsInfo,
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
module.exports = {
|
|
203
|
+
createSystem,
|
|
204
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const chalk = require("chalk");
|
|
2
|
+
chalk.level = 3; // Force color outputs when using chalk, was added for VS Code support
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
green: chalk.hex("#b3d334"),
|
|
6
|
+
blue: chalk.hex("#34a3d3"),
|
|
7
|
+
red: chalk.hex("#d33434"),
|
|
8
|
+
yellow: chalk.hex("#ced334"),
|
|
9
|
+
magenta: chalk.hex("#d334b3"),
|
|
10
|
+
cyan: chalk.hex("#34d3d3"),
|
|
11
|
+
dim: chalk.dim,
|
|
12
|
+
gray: chalk.gray,
|
|
13
|
+
white: chalk.white,
|
|
14
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const semver = require("semver");
|
|
2
|
+
const packageJson = require("../../package.json");
|
|
3
|
+
|
|
4
|
+
// Function to check if the new version's minor version is >= current version's minor version
|
|
5
|
+
module.exports = (inputVersion) => {
|
|
6
|
+
const currentParsed = semver.parse(packageJson.version);
|
|
7
|
+
const inputParsed = semver.parse(inputVersion.replace("v", ""));
|
|
8
|
+
|
|
9
|
+
if (!currentParsed || !inputParsed) {
|
|
10
|
+
throw new Error("Invalid version format");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Compare major and minor versions
|
|
14
|
+
if (
|
|
15
|
+
inputParsed.major === currentParsed.major &&
|
|
16
|
+
inputParsed.minor <= currentParsed.minor
|
|
17
|
+
) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
const types = () =>
|
|
2
|
+
import("arktype").then(({ scope }) =>
|
|
3
|
+
scope({
|
|
4
|
+
// - command: press-keys # Types a keyboard combination. Repeat the command to repeat the keypress.
|
|
5
|
+
// keys: [command, space]
|
|
6
|
+
PressKeysCommand: {
|
|
7
|
+
command: '"press-keys"',
|
|
8
|
+
keys: "string[]",
|
|
9
|
+
},
|
|
10
|
+
// - command: hover-text # Hovers text matching the \`description\`. The text must be visible. This will also handle clicking or right clicking on the text if required.
|
|
11
|
+
// text: Sign Up # The text to find on screen. The longer and more unique the better.
|
|
12
|
+
// description: registration in the top right of the header # Describe the element so it can be identified in the future. Do not include the text itself here. Make sure to include the unique traits of this element.
|
|
13
|
+
// action: click # What to do when text is found. Available actions are: click, right-click, double-click, hover
|
|
14
|
+
// method: ai # Optional. Only try this if text match is not working.
|
|
15
|
+
HoverTextCommand: {
|
|
16
|
+
command: '"hover-text"',
|
|
17
|
+
text: "string",
|
|
18
|
+
description: "string",
|
|
19
|
+
action: '"click" | "right-click" | "double-click" | "hover"',
|
|
20
|
+
"method?": '"ai"',
|
|
21
|
+
},
|
|
22
|
+
// - command: type # Types the string into the active application. You must focus the correct field before typing.
|
|
23
|
+
// text: Hello World
|
|
24
|
+
TypeCommand: {
|
|
25
|
+
command: '"type"',
|
|
26
|
+
text: "string",
|
|
27
|
+
},
|
|
28
|
+
// - command: wait # Waits a number of miliseconds before continuing.
|
|
29
|
+
// timeout: 5000
|
|
30
|
+
WaitCommand: {
|
|
31
|
+
command: '"wait"',
|
|
32
|
+
timeout: "number",
|
|
33
|
+
},
|
|
34
|
+
// - command: hover-image # Hovers an icon, button, or image matching \`description\`. This will also handle handle clicking or right clicking on the icon or image if required.
|
|
35
|
+
// description: search icon in the webpage content # Describe the icon or image and what it represents. Describe the element so it can be identified in the future. Do not include the image or icon itself here. Make sure to include the unique traits of this element.
|
|
36
|
+
// action: click # What to do when text is found. Available actions are: click, right-click, double-click, hover
|
|
37
|
+
HoverImageCommand: {
|
|
38
|
+
command: '"hover-image"',
|
|
39
|
+
description: "string",
|
|
40
|
+
action: '"click" | "right-click" | "double-click" | "hover"',
|
|
41
|
+
},
|
|
42
|
+
// - command: focus-application # Focus an application by name.
|
|
43
|
+
// name: Google Chrome # The name of the application to focus.
|
|
44
|
+
FocusApplicationCommand: {
|
|
45
|
+
command: '"focus-application"',
|
|
46
|
+
name: "string",
|
|
47
|
+
},
|
|
48
|
+
// - command: extract # Extract a string value from the screen without needing to interact with the desktop.
|
|
49
|
+
// description: My dog's name # The key of the value to extract.
|
|
50
|
+
// value: Roofus # The value to extract
|
|
51
|
+
ExtractCommand: {
|
|
52
|
+
command: '"extract"',
|
|
53
|
+
description: "string",
|
|
54
|
+
value: "string",
|
|
55
|
+
},
|
|
56
|
+
// - command: get-email-url # Retrieves the URL from a sign-up confirmation email in the background.
|
|
57
|
+
// # This retrieves an email confirmation URL without opening an email client. Do not view the screen, just run this command when dealing with emails
|
|
58
|
+
// username: testdriver # The username of the email address to check.
|
|
59
|
+
GetEmailUrlCommand: {
|
|
60
|
+
command: '"get-email-url"',
|
|
61
|
+
username: "string",
|
|
62
|
+
},
|
|
63
|
+
// - command: scroll # Scroll up or down. Make sure the correct portion of the page is focused before scrolling.
|
|
64
|
+
// direction: down # Available directions are: up, down, left, right
|
|
65
|
+
// amount: 300 # Optional. The amount of pixels to scroll. Defaults to 300.
|
|
66
|
+
ScrollCommand: {
|
|
67
|
+
command: '"scroll"',
|
|
68
|
+
direction: '"up" | "down" | "left" | "right"',
|
|
69
|
+
"amount?": "number",
|
|
70
|
+
},
|
|
71
|
+
// - command: scroll-until-text # Scroll until text is found
|
|
72
|
+
// text: Sign Up # The text to find on screen. The longer and more unique the better.
|
|
73
|
+
// direction: down # Available directions are: up, down, left, right
|
|
74
|
+
ScrollUntilTextCommand: {
|
|
75
|
+
command: '"scroll-until-text"',
|
|
76
|
+
text: "string",
|
|
77
|
+
direction: '"up" | "down" | "left" | "right"',
|
|
78
|
+
},
|
|
79
|
+
// - command: scroll-until-image # Scroll until icon or image is found
|
|
80
|
+
// description: Submit at the bottom of the form
|
|
81
|
+
// direction: down # Available directions are: up, down, left, rights
|
|
82
|
+
ScrollUntilImageCommand: {
|
|
83
|
+
command: '"scroll-until-image"',
|
|
84
|
+
description: "string",
|
|
85
|
+
direction: '"up" | "down" | "left" | "right"',
|
|
86
|
+
},
|
|
87
|
+
// - command: wait-for-text # Wait until text is seen on screen. Not recommended unless explicitly requested by user.
|
|
88
|
+
// text: Copyright 2024 # The text to find on screen.
|
|
89
|
+
WaitForTextCommand: {
|
|
90
|
+
command: '"wait-for-text"',
|
|
91
|
+
text: "string",
|
|
92
|
+
},
|
|
93
|
+
// - command: wait-for-image # Wait until icon or image is seen on screen. Not recommended unless explicitly requested by user.
|
|
94
|
+
// description: trash icon
|
|
95
|
+
WaitForImageCommand: {
|
|
96
|
+
command: '"wait-for-image"',
|
|
97
|
+
description: "string",
|
|
98
|
+
},
|
|
99
|
+
// - command: assert # Assert that a condition is true. This is used to validate that a task was successful. Only use this when the user asks to "assert", "check," or "make sure" of something.
|
|
100
|
+
// expect: the video is playing # The condition to check. This should be a string that describes what you see on screen.
|
|
101
|
+
AssertCommand: {
|
|
102
|
+
command: '"assert"',
|
|
103
|
+
expect: "string",
|
|
104
|
+
},
|
|
105
|
+
// - command: if # Conditional block. If the condition is true, run the commands in the block. Otherwise, run the commands in the else block. Only use this if the user explicitly asks for a condition.
|
|
106
|
+
// condition: the active window is "Google Chrome"
|
|
107
|
+
// then:
|
|
108
|
+
// - command: hover-text
|
|
109
|
+
// text: Search Google or type a URL
|
|
110
|
+
// description: main google search
|
|
111
|
+
// action: click
|
|
112
|
+
// - command: type
|
|
113
|
+
// text: monster trucks
|
|
114
|
+
// description: search for monster trucks
|
|
115
|
+
// else:
|
|
116
|
+
// - command: focus-application
|
|
117
|
+
// name: Google Chrome
|
|
118
|
+
IfCommand: {
|
|
119
|
+
command: '"if"',
|
|
120
|
+
condition: "string",
|
|
121
|
+
// The unknown[] instead of Command[] is because of a weird error, although it does work
|
|
122
|
+
// on the other typescript repo
|
|
123
|
+
then: "unknown[]",
|
|
124
|
+
"else?": "unknown[]",
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
Command:
|
|
128
|
+
"PressKeysCommand | HoverTextCommand | TypeCommand | WaitCommand | HoverImageCommand | FocusApplicationCommand | ExtractCommand | GetEmailUrlCommand | ScrollCommand | ScrollUntilTextCommand | ScrollUntilImageCommand | WaitForTextCommand | WaitForImageCommand | AssertCommand | IfCommand",
|
|
129
|
+
|
|
130
|
+
CommandList: "Command[]",
|
|
131
|
+
|
|
132
|
+
Step: {
|
|
133
|
+
prompt: "string",
|
|
134
|
+
commands: "Command[]",
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
StepList: "Step[]",
|
|
138
|
+
|
|
139
|
+
File: {
|
|
140
|
+
version: "string",
|
|
141
|
+
session: "string | undefined",
|
|
142
|
+
steps: "Step[]",
|
|
143
|
+
},
|
|
144
|
+
}).export(),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
*
|
|
149
|
+
* @param {unknown} data
|
|
150
|
+
*/
|
|
151
|
+
const getType = async (data) => {
|
|
152
|
+
const { type } = await import("arktype");
|
|
153
|
+
const t = await types();
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @type {["File", "Step", "StepList", "Command", "CommandList"]}
|
|
157
|
+
*/
|
|
158
|
+
const options = ["File", "Step", "StepList", "Command", "CommandList"];
|
|
159
|
+
|
|
160
|
+
for (const option of options) {
|
|
161
|
+
const result = t[option](data);
|
|
162
|
+
if (!(result instanceof type.errors)) {
|
|
163
|
+
return option;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
module.exports = { getType };
|