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