testdriverai 6.2.2 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/.github/workflows/acceptance-linux.yml +75 -0
  2. package/.github/workflows/acceptance-sdk-tests.yml +133 -0
  3. package/.vscode/settings.json +5 -1
  4. package/MIGRATION.md +389 -0
  5. package/PLUGIN_MIGRATION.md +222 -0
  6. package/PROMPT_CACHE.md +200 -0
  7. package/SDK_LOGGING.md +222 -0
  8. package/SDK_MIGRATION.md +474 -0
  9. package/SDK_README.md +1122 -0
  10. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  11. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  12. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  13. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  14. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  15. package/_testdriver/lifecycle/prerun.yaml +15 -0
  16. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  17. package/agent/index.js +258 -68
  18. package/agent/interface.js +15 -0
  19. package/agent/lib/cache.js +142 -0
  20. package/agent/lib/commander.js +1 -39
  21. package/agent/lib/commands.js +143 -188
  22. package/agent/lib/redraw.js +6 -3
  23. package/agent/lib/sandbox.js +19 -5
  24. package/agent/lib/sdk.js +1 -0
  25. package/agent/lib/system.js +0 -3
  26. package/agent/lib/validation.js +1 -7
  27. package/debug-locate-response.js +82 -0
  28. package/debug-screenshot-1763401388589.png +0 -0
  29. package/debugger/index.html +15 -4
  30. package/docs/ARCHITECTURE.md +424 -0
  31. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  32. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  33. package/docs/SDK_AWESOME_LOGS.md +468 -0
  34. package/docs/TEST_RECORDING.md +388 -0
  35. package/docs/docs.json +232 -152
  36. package/docs/sdk-browser-rendering.md +167 -0
  37. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  38. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  39. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  40. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  41. package/docs/v6/overview/comparison.mdx +101 -0
  42. package/docs/v7/README.md +135 -0
  43. package/docs/v7/api/ai.mdx +205 -0
  44. package/docs/v7/api/assert.mdx +285 -0
  45. package/docs/v7/api/assertions.mdx +403 -0
  46. package/docs/v7/api/click.mdx +287 -0
  47. package/docs/v7/api/client.mdx +322 -0
  48. package/docs/v7/api/elements.mdx +479 -0
  49. package/docs/v7/api/exec.mdx +346 -0
  50. package/docs/v7/api/find.mdx +316 -0
  51. package/docs/v7/api/focusApplication.mdx +294 -0
  52. package/docs/v7/api/hover.mdx +279 -0
  53. package/docs/v7/api/pressKeys.mdx +349 -0
  54. package/docs/v7/api/sandbox.mdx +404 -0
  55. package/docs/v7/api/scroll.mdx +300 -0
  56. package/docs/v7/api/type.mdx +314 -0
  57. package/docs/v7/commands/assert.mdx +45 -0
  58. package/docs/v7/commands/exec.mdx +282 -0
  59. package/docs/v7/commands/focus-application.mdx +44 -0
  60. package/docs/v7/commands/hover-image.mdx +69 -0
  61. package/docs/v7/commands/hover-text.mdx +47 -0
  62. package/docs/v7/commands/if.mdx +53 -0
  63. package/docs/v7/commands/match-image.mdx +67 -0
  64. package/docs/v7/commands/press-keys.mdx +87 -0
  65. package/docs/v7/commands/remember.mdx +49 -0
  66. package/docs/v7/commands/run.mdx +44 -0
  67. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  68. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  69. package/docs/v7/commands/scroll.mdx +69 -0
  70. package/docs/v7/commands/type.mdx +45 -0
  71. package/docs/v7/commands/wait-for-image.mdx +54 -0
  72. package/docs/v7/commands/wait-for-text.mdx +48 -0
  73. package/docs/v7/commands/wait.mdx +45 -0
  74. package/docs/v7/getting-started/quickstart.mdx +199 -0
  75. package/docs/v7/guides/migration.mdx +562 -0
  76. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  77. package/docs/v7/playwright.mdx +342 -0
  78. package/eslint.config.js +19 -1
  79. package/examples/run-tests-with-recording.sh +70 -0
  80. package/examples/screenshot-example.js +63 -0
  81. package/examples/sdk-awesome-logs-demo.js +177 -0
  82. package/examples/sdk-cache-thresholds.js +96 -0
  83. package/examples/sdk-element-properties.js +155 -0
  84. package/examples/sdk-simple-example.js +65 -0
  85. package/examples/test-recording-example.test.js +166 -0
  86. package/interfaces/cli/lib/base.js +10 -4
  87. package/interfaces/logger.js +2 -1
  88. package/interfaces/shared-test-state.mjs +69 -0
  89. package/interfaces/vitest-plugin.mjs +744 -0
  90. package/mcp-server/AI_GUIDELINES.md +57 -0
  91. package/package.json +18 -5
  92. package/schema.json +8 -29
  93. package/scripts/view-test-results.mjs +96 -0
  94. package/sdk-log-formatter.js +714 -0
  95. package/sdk.d.ts +735 -0
  96. package/sdk.js +1906 -0
  97. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  98. package/setup/aws/cloudformation.yaml +9 -2
  99. package/test/mcp-example-test.yaml +27 -0
  100. package/test-find-api.js +73 -0
  101. package/test-prompt-cache.js +96 -0
  102. package/test-sandbox-render.js +28 -0
  103. package/test-sdk-methods.js +15 -0
  104. package/test-sdk-refactor.js +53 -0
  105. package/test-stack-trace.mjs +57 -0
  106. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  107. package/testdriver/acceptance-sdk/README.md +128 -0
  108. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  109. package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
  110. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
  111. package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
  112. package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
  113. package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
  114. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
  115. package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
  116. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
  117. package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
  118. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
  119. package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
  120. package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
  121. package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
  122. package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
  123. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
  124. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
  125. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
  126. package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
  127. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  128. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
  129. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
  130. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  131. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  132. package/testdriver/acceptance-sdk/type.test.mjs +84 -0
  133. package/verify-element-api.js +89 -0
  134. package/verify-types.js +0 -0
  135. package/vitest.config.example.js +19 -0
  136. package/vitest.config.mjs +65 -0
  137. package/vitest.config.mjs.bak +44 -0
  138. package/.github/workflows/acceptance-v6.yml +0 -169
  139. package/docs/overview/comparison.mdx +0 -82
  140. package/testdriver/lifecycle/prerun.yaml +0 -17
  141. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  142. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  143. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  144. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  145. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  146. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  147. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  148. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  149. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  150. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  151. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  152. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  153. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  154. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  155. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  156. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  157. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  158. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  159. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  160. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  161. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  162. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  163. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  164. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  165. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  166. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  167. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  168. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  169. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  170. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  171. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  172. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  173. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  174. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  175. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  176. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  177. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  178. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  179. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  180. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  181. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  182. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  183. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  184. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  185. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  186. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  187. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  188. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  189. /package/docs/{account → v6/account}/projects.mdx +0 -0
  190. /package/docs/{account → v6/account}/team.mdx +0 -0
  191. /package/docs/{action → v6/action}/ami.mdx +0 -0
  192. /package/docs/{action → v6/action}/performance.mdx +0 -0
  193. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  194. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  195. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  196. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  197. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  198. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  199. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  200. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  201. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  202. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  203. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  204. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  205. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  206. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  207. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  208. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  209. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  210. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  211. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  212. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  213. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  214. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  215. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  216. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  217. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  218. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  219. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  220. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  221. /package/docs/{features → v6/features}/generation.mdx +0 -0
  222. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  223. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  224. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  225. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  226. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  227. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  228. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  229. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  230. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  231. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  232. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  233. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  234. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  235. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  236. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  237. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  238. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  239. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  240. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  241. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  242. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  243. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  244. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  245. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  246. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  247. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  248. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  249. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  250. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  251. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  252. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  253. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  254. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  255. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  256. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  257. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  258. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  259. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  260. /package/docs/{security → v6/security}/action.mdx +0 -0
  261. /package/docs/{security → v6/security}/agent.mdx +0 -0
  262. /package/docs/{security → v6/security}/platform.mdx +0 -0
  263. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  264. /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
@@ -0,0 +1,142 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const crypto = require("crypto");
4
+
5
+ /**
6
+ * Generate a cache key from a prompt
7
+ * Uses a hash to create a safe filename
8
+ */
9
+ function getCacheKey(prompt) {
10
+ // Normalize the prompt by trimming and converting to lowercase
11
+ const normalized = prompt.trim().toLowerCase();
12
+
13
+ // Create a hash for the filename
14
+ const hash = crypto.createHash("md5").update(normalized).digest("hex");
15
+
16
+ // Also create a sanitized version of the prompt for readability
17
+ const sanitized = normalized
18
+ .replace(/[^a-z0-9\s]/g, "") // Remove special chars
19
+ .replace(/\s+/g, "-") // Replace spaces with hyphens
20
+ .substring(0, 50); // Limit length
21
+
22
+ // Combine sanitized prompt with hash for uniqueness
23
+ return `${sanitized}-${hash}.yaml`;
24
+ }
25
+
26
+ /**
27
+ * Get the cache directory path
28
+ * Creates it if it doesn't exist
29
+ */
30
+ function getCacheDir() {
31
+ const cacheDir = path.join(process.cwd(), ".testdriver", ".cache");
32
+
33
+ if (!fs.existsSync(cacheDir)) {
34
+ fs.mkdirSync(cacheDir, { recursive: true });
35
+ }
36
+
37
+ return cacheDir;
38
+ }
39
+
40
+ /**
41
+ * Get the full path to a cache file
42
+ */
43
+ function getCachePath(prompt) {
44
+ const cacheDir = getCacheDir();
45
+ const key = getCacheKey(prompt);
46
+ return path.join(cacheDir, key);
47
+ }
48
+
49
+ /**
50
+ * Check if a cached response exists for a prompt
51
+ */
52
+ function hasCache(prompt) {
53
+ const cachePath = getCachePath(prompt);
54
+ return fs.existsSync(cachePath);
55
+ }
56
+
57
+ /**
58
+ * Read cached YAML for a prompt
59
+ * Returns null if no cache exists
60
+ */
61
+ function readCache(prompt) {
62
+ if (!hasCache(prompt)) {
63
+ return null;
64
+ }
65
+
66
+ try {
67
+ const cachePath = getCachePath(prompt);
68
+ const yaml = fs.readFileSync(cachePath, "utf8");
69
+ return yaml;
70
+ } catch {
71
+ // If there's an error reading the cache, return null
72
+ return null;
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Write YAML to cache for a prompt
78
+ */
79
+ function writeCache(prompt, yaml) {
80
+ try {
81
+ const cachePath = getCachePath(prompt);
82
+ fs.writeFileSync(cachePath, yaml, "utf8");
83
+ return cachePath;
84
+ } catch {
85
+ // Silently fail if we can't write to cache
86
+ return null;
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Clear all cached prompts
92
+ */
93
+ function clearCache() {
94
+ const cacheDir = getCacheDir();
95
+
96
+ try {
97
+ const files = fs.readdirSync(cacheDir);
98
+
99
+ for (const file of files) {
100
+ if (file.endsWith(".yaml")) {
101
+ fs.unlinkSync(path.join(cacheDir, file));
102
+ }
103
+ }
104
+
105
+ return true;
106
+ } catch {
107
+ return false;
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Get cache statistics
113
+ */
114
+ function getCacheStats() {
115
+ const cacheDir = getCacheDir();
116
+
117
+ try {
118
+ const files = fs.readdirSync(cacheDir);
119
+ const yamlFiles = files.filter((f) => f.endsWith(".yaml"));
120
+
121
+ return {
122
+ count: yamlFiles.length,
123
+ files: yamlFiles,
124
+ };
125
+ } catch {
126
+ return {
127
+ count: 0,
128
+ files: [],
129
+ };
130
+ }
131
+ }
132
+
133
+ module.exports = {
134
+ getCacheKey,
135
+ getCacheDir,
136
+ getCachePath,
137
+ hasCache,
138
+ readCache,
139
+ writeCache,
140
+ clearCache,
141
+ getCacheStats,
142
+ };
@@ -81,42 +81,26 @@ commands:
81
81
  switch (object.command) {
82
82
  case "type":
83
83
  emitter.emit(events.log.log, generator.jsonToManual(object));
84
- emitter.emit(events.log.narration, `typing ${object.text}`);
85
84
  response = await commands.type(object.text, object.delay);
86
85
  break;
87
86
  case "press-keys":
88
87
  emitter.emit(events.log.log, generator.jsonToManual(object));
89
- emitter.emit(
90
- events.log.narration,
91
- `pressing keys: ${Array.isArray(object.keys) ? object.keys.join(", ") : object.keys}`,
92
- );
93
88
  response = await commands["press-keys"](object.keys);
94
89
  break;
95
90
  case "scroll":
96
91
  emitter.emit(events.log.log, generator.jsonToManual(object));
97
- emitter.emit(events.log.narration, `scrolling ${object.direction}`);
98
- response = await commands.scroll(
99
- object.direction,
100
- object.amount,
101
- object.method,
102
- );
92
+ response = await commands.scroll(object.direction, object.amount);
103
93
  break;
104
94
  case "wait":
105
95
  emitter.emit(events.log.log, generator.jsonToManual(object));
106
- emitter.emit(
107
- events.log.narration,
108
- `waiting ${object.timeout} seconds`,
109
- );
110
96
  response = await commands.wait(object.timeout);
111
97
  break;
112
98
  case "click":
113
99
  emitter.emit(events.log.log, generator.jsonToManual(object));
114
- emitter.emit(events.log.narration, `${object.action}`);
115
100
  response = await commands["click"](object.x, object.y, object.action);
116
101
  break;
117
102
  case "hover":
118
103
  emitter.emit(events.log.log, generator.jsonToManual(object));
119
- emitter.emit(events.log.narration, `moving mouse`);
120
104
  response = await commands["hover"](object.x, object.y);
121
105
  break;
122
106
  case "drag":
@@ -125,10 +109,6 @@ commands:
125
109
  break;
126
110
  case "hover-text":
127
111
  emitter.emit(events.log.log, generator.jsonToManual(object));
128
- emitter.emit(
129
- events.log.narration,
130
- `searching for ${object.description}`,
131
- );
132
112
  response = await commands["hover-text"](
133
113
  object.text,
134
114
  object.description,
@@ -139,10 +119,6 @@ commands:
139
119
  break;
140
120
  case "hover-image":
141
121
  emitter.emit(events.log.log, generator.jsonToManual(object));
142
- emitter.emit(
143
- events.log.narration,
144
- `searching for image of ${object.description}`,
145
- );
146
122
  response = await commands["hover-image"](
147
123
  object.description,
148
124
  object.action,
@@ -150,10 +126,6 @@ commands:
150
126
  break;
151
127
  case "match-image":
152
128
  emitter.emit(events.log.log, generator.jsonToManual(object));
153
- emitter.emit(
154
- events.log.narration,
155
- `${object.action} image ${object.path}`,
156
- );
157
129
  response = await commands["match-image"](
158
130
  object.path,
159
131
  object.action,
@@ -162,10 +134,6 @@ commands:
162
134
  break;
163
135
  case "wait-for-image":
164
136
  emitter.emit(events.log.log, generator.jsonToManual(object));
165
- emitter.emit(
166
- events.log.narration,
167
- `waiting for ${object.description}`,
168
- );
169
137
  response = await commands["wait-for-image"](
170
138
  object.description,
171
139
  object.timeout,
@@ -174,7 +142,6 @@ commands:
174
142
  break;
175
143
  case "wait-for-text":
176
144
  emitter.emit(events.log.log, generator.jsonToManual(object));
177
- emitter.emit(events.log.narration, `waiting for ${object.text}`);
178
145
  copy.text = "*****";
179
146
  response = await commands["wait-for-text"](
180
147
  object.text,
@@ -185,7 +152,6 @@ commands:
185
152
  break;
186
153
  case "scroll-until-text":
187
154
  emitter.emit(events.log.log, generator.jsonToManual(object));
188
- emitter.emit(events.log.narration, `scrolling until ${object.text}`);
189
155
  copy.text = "*****";
190
156
  response = await commands["scroll-until-text"](
191
157
  object.text,
@@ -197,9 +163,7 @@ commands:
197
163
  );
198
164
  break;
199
165
  case "scroll-until-image": {
200
- const needle = object.description || object.path;
201
166
  emitter.emit(events.log.log, generator.jsonToManual(object));
202
- emitter.emit(events.log.narration, `scrolling until ${needle}`);
203
167
  response = await commands["scroll-until-image"](
204
168
  object.description,
205
169
  object.direction,
@@ -212,7 +176,6 @@ commands:
212
176
  }
213
177
  case "focus-application":
214
178
  emitter.emit(events.log.log, generator.jsonToManual(object));
215
- emitter.emit(events.log.narration, `focusing ${object.name}`);
216
179
  response = await commands["focus-application"](object.name);
217
180
  break;
218
181
  case "remember": {
@@ -224,7 +187,6 @@ commands:
224
187
  }
225
188
  case "assert":
226
189
  emitter.emit(events.log.log, generator.jsonToManual(object));
227
- emitter.emit(events.log.narration, `asserting ${object.expect}`);
228
190
  response = await commands.assert(
229
191
  object.expect,
230
192
  object.async,