testdriverai 6.2.2 → 7.1.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/AGENTS.md +550 -0
- package/CODEOWNERS +0 -1
- package/README.md +126 -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 +300 -85
- 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 +910 -296
- package/agent/lib/redraw.js +129 -41
- package/agent/lib/sandbox.js +29 -6
- package/agent/lib/sdk.js +22 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/MIGRATION.md +425 -0
- package/docs/PRESETS.md +210 -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 +286 -152
- package/docs/guide/best-practices-polling.mdx +154 -0
- 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/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -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/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/rightClick.mdx +123 -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/configuration.mdx +380 -0
- package/docs/v7/getting-started/quickstart.mdx +332 -0
- package/docs/v7/guides/best-practices.mdx +486 -0
- package/docs/v7/guides/caching-ai.mdx +215 -0
- package/docs/v7/guides/caching-selectors.mdx +292 -0
- package/docs/v7/guides/caching.mdx +366 -0
- package/docs/v7/guides/ci-cd/azure.mdx +587 -0
- package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
- package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
- package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
- package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
- package/docs/v7/guides/ci-cd/travis.mdx +438 -0
- package/docs/v7/guides/debugging.mdx +349 -0
- package/docs/v7/guides/faq.mdx +393 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/v7/guides/performance.mdx +517 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/guides/troubleshooting.mdx +526 -0
- package/docs/v7/guides/vitest-plugin.mdx +477 -0
- package/docs/v7/guides/vitest.mdx +535 -0
- package/docs/v7/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +342 -0
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +287 -0
- package/docs/v7/presets/electron.mdx +435 -0
- package/docs/v7/presets/vscode.mdx +398 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/docs/v7/progressive-apis/CORE.md +459 -0
- package/docs/v7/progressive-apis/HOOKS.md +360 -0
- package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
- package/docs/v7/progressive-apis/PROVISION.md +266 -0
- package/eslint.config.js +19 -1
- 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 +830 -0
- package/package.json +29 -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 +1028 -0
- package/sdk.js +2567 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/src/core/Dashcam.js +469 -0
- package/src/core/index.d.ts +150 -0
- package/src/core/index.js +12 -0
- package/src/presets/index.mjs +331 -0
- package/src/vitest/extended.mjs +108 -0
- package/src/vitest/hooks.d.ts +119 -0
- package/src/vitest/hooks.mjs +298 -0
- package/src/vitest/index.mjs +64 -0
- package/src/vitest/lifecycle.mjs +277 -0
- package/src/vitest/utils.mjs +150 -0
- package/test/dashcam.test.js +137 -0
- package/test/mcp-example-test.yaml +27 -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 +26 -0
- package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
- package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
- package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
- package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +45 -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 +66 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/.vscode/mcp.json +0 -9
- 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
|
@@ -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
|
+
};
|
package/agent/lib/commander.js
CHANGED
|
@@ -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
|
-
|
|
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,
|