@testmuai/playwright-bindings 0.1.2-beta.1 → 0.1.2-beta.3

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 (76) hide show
  1. package/README.md +3 -3
  2. package/dist/config.d.ts +2 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +6 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/configure.d.ts +5 -1
  7. package/dist/configure.d.ts.map +1 -1
  8. package/dist/configure.js +1 -0
  9. package/dist/configure.js.map +1 -1
  10. package/dist/healPatch.d.ts +9 -2
  11. package/dist/healPatch.d.ts.map +1 -1
  12. package/dist/healPatch.js +25 -8
  13. package/dist/healPatch.js.map +1 -1
  14. package/dist/helpers/assertion.d.ts.map +1 -1
  15. package/dist/helpers/assertion.js +18 -12
  16. package/dist/helpers/assertion.js.map +1 -1
  17. package/dist/helpers/drag.d.ts.map +1 -1
  18. package/dist/helpers/drag.js +2 -0
  19. package/dist/helpers/drag.js.map +1 -1
  20. package/dist/helpers/executeApi.d.ts +12 -1
  21. package/dist/helpers/executeApi.d.ts.map +1 -1
  22. package/dist/helpers/executeApi.js +108 -20
  23. package/dist/helpers/executeApi.js.map +1 -1
  24. package/dist/helpers/executeDb.js +1 -1
  25. package/dist/helpers/executeDb.js.map +1 -1
  26. package/dist/helpers/kaneCli.d.ts +10 -1
  27. package/dist/helpers/kaneCli.d.ts.map +1 -1
  28. package/dist/helpers/kaneCli.js +122 -3
  29. package/dist/helpers/kaneCli.js.map +1 -1
  30. package/dist/helpers/math.d.ts +1 -1
  31. package/dist/helpers/math.d.ts.map +1 -1
  32. package/dist/helpers/math.js +8 -6
  33. package/dist/helpers/math.js.map +1 -1
  34. package/dist/helpers/network.d.ts +4 -4
  35. package/dist/helpers/network.d.ts.map +1 -1
  36. package/dist/helpers/network.js +19 -16
  37. package/dist/helpers/network.js.map +1 -1
  38. package/dist/helpers/smartui.d.ts +5 -1
  39. package/dist/helpers/smartui.d.ts.map +1 -1
  40. package/dist/helpers/smartui.js +45 -7
  41. package/dist/helpers/smartui.js.map +1 -1
  42. package/dist/helpers/tabs.d.ts.map +1 -1
  43. package/dist/helpers/tabs.js +2 -0
  44. package/dist/helpers/tabs.js.map +1 -1
  45. package/dist/helpers/vision.d.ts +50 -7
  46. package/dist/helpers/vision.d.ts.map +1 -1
  47. package/dist/helpers/vision.js +212 -29
  48. package/dist/helpers/vision.js.map +1 -1
  49. package/dist/helpers/wait.d.ts.map +1 -1
  50. package/dist/helpers/wait.js +1 -2
  51. package/dist/helpers/wait.js.map +1 -1
  52. package/dist/index.d.ts +3 -4
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +4 -6
  55. package/dist/index.js.map +1 -1
  56. package/dist/loadEnv.d.ts +2 -0
  57. package/dist/loadEnv.d.ts.map +1 -0
  58. package/dist/loadEnv.js +12 -0
  59. package/dist/loadEnv.js.map +1 -0
  60. package/dist/relayProxy.d.ts +46 -0
  61. package/dist/relayProxy.d.ts.map +1 -0
  62. package/dist/relayProxy.js +453 -0
  63. package/dist/relayProxy.js.map +1 -0
  64. package/dist/session.d.ts +6 -0
  65. package/dist/session.d.ts.map +1 -1
  66. package/dist/session.js +130 -16
  67. package/dist/session.js.map +1 -1
  68. package/dist/step.d.ts +23 -6
  69. package/dist/step.d.ts.map +1 -1
  70. package/dist/step.js +23 -27
  71. package/dist/step.js.map +1 -1
  72. package/dist/vars.d.ts +9 -20
  73. package/dist/vars.d.ts.map +1 -1
  74. package/dist/vars.js +62 -26
  75. package/dist/vars.js.map +1 -1
  76. package/package.json +10 -5
@@ -1,5 +1,124 @@
1
- export async function executeKaneCli(_objective) {
2
- throw new Error('executeKaneCli is not implemented in the TypeScript port. ' +
3
- 'Python relies on Playwright internals that are unavailable in Playwright JS.');
1
+ import { chromium } from 'playwright';
2
+ import { spawn } from 'child_process';
3
+ import { config } from '../config.js';
4
+ import { sessionState } from '../session.js';
5
+ import { _getReporter } from '../step.js';
6
+ import { LTReporter } from '../reporters/lt.js';
7
+ import { TestmuConfigError } from '../errors.js';
8
+ import { log, preview } from '../log.js';
9
+ // Handoff sequence (cloud + smart only) — PY parity: kane_cli.py:22-137.
10
+ // JS uses browser.close() on a connected browser which only detaches the
11
+ // client; the remote browser stays alive via the relay proxy. No need for
12
+ // PY's private `_connection.stop_async()` hack — verified by A1 integration
13
+ // tests I3/I5.
14
+ export async function executeKaneCli(objective, page) {
15
+ if (!config.current.smart) {
16
+ log.helper('[execute_kane_cli] smart is OFF — branch unresolved, skipping');
17
+ return page;
18
+ }
19
+ if (config.current.runTarget !== 'cloud') {
20
+ log.helper('[execute_kane_cli] run_target is not "cloud" — kane-cli needs the relay proxy, skipping (branch unresolved)');
21
+ return page;
22
+ }
23
+ const relayUrl = sessionState.relayUrl;
24
+ if (!relayUrl) {
25
+ throw new TestmuConfigError('execute_kane_cli: relay proxy not initialized; ensure testmu.run() started the cloud session');
26
+ }
27
+ // NB: PY also checks `pw is None` here (kane_cli.py:60-65) because PY needs the
28
+ // async_playwright() handle for chromium.connect later. JS uses the module-level
29
+ // `chromium` import — no handle needed — so the pw gate has no JS analog.
30
+ const currentUrl = page.url();
31
+ const browser = page.context().browser();
32
+ if (!browser) {
33
+ throw new TestmuConfigError('execute_kane_cli: page has no browser (detached?)');
34
+ }
35
+ const username = process.env['LT_USERNAME'] ?? '';
36
+ const accessKey = process.env['LT_ACCESS_KEY'] ?? '';
37
+ const envName = process.env['TESTMUAI_ENV'] ?? 'prod';
38
+ log.helper(`[execute_kane_cli] objective=${preview(objective, 80)}`);
39
+ log.helper('[execute_kane_cli] handing off browser to kane-cli...');
40
+ // Step 1: Disconnect from the remote browser but keep it alive via the relay.
41
+ try {
42
+ await browser.close();
43
+ }
44
+ catch (e) {
45
+ log.helper(`[execute_kane_cli] disconnect warning: ${String(e)}`);
46
+ }
47
+ // Step 2: Spawn kane-cli pointing at our relay URL.
48
+ const args = [
49
+ 'run', objective,
50
+ '--url', currentUrl,
51
+ '--ws-endpoint', relayUrl,
52
+ '--username', username,
53
+ '--access-key', accessKey,
54
+ '--env', envName,
55
+ '--local',
56
+ '--agent',
57
+ ];
58
+ const result = await runKaneCli('kane-cli', args, 600_000);
59
+ if (result.stdout)
60
+ log.helper(`[execute_kane_cli] stdout: ${preview(result.stdout, 2000)}`);
61
+ if (result.stderr)
62
+ log.helper(`[execute_kane_cli] stderr: ${preview(result.stderr, 2000)}`);
63
+ if (result.exitCode !== 0) {
64
+ throw new Error(`kane-cli failed (exit ${result.exitCode}): ${result.stderr}`);
65
+ }
66
+ // Step 3: Reconnect via the relay; proxy replays state.
67
+ log.helper('[execute_kane_cli] reconnecting test to relay...');
68
+ const newBrowser = await chromium.connect(relayUrl, { timeout: 120_000 });
69
+ // Step 4: Resolve a page from the reconnected browser.
70
+ let newPage;
71
+ const ctxs = newBrowser.contexts();
72
+ if (ctxs.length > 0) {
73
+ const ctx = ctxs[0];
74
+ const pages = ctx.pages();
75
+ newPage = pages.length > 0 ? pages[pages.length - 1] : await ctx.newPage();
76
+ }
77
+ else {
78
+ const ctx = await newBrowser.newContext();
79
+ newPage = await ctx.newPage();
80
+ }
81
+ log.helper(`[execute_kane_cli] reconnected — page URL: ${newPage.url()}`);
82
+ // Step 5: Re-wire LT reporter's page reference.
83
+ const rep = _getReporter();
84
+ if (rep instanceof LTReporter)
85
+ rep._setPage(newPage);
86
+ return newPage;
87
+ }
88
+ /** Spawn kane-cli as a subprocess and collect its output with a timeout. */
89
+ export async function runKaneCli(cmd, args, timeoutMs) {
90
+ return new Promise((resolve, reject) => {
91
+ const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });
92
+ const stdout = [];
93
+ const stderr = [];
94
+ child.stdout?.on('data', (chunk) => stdout.push(chunk));
95
+ child.stderr?.on('data', (chunk) => stderr.push(chunk));
96
+ let settled = false;
97
+ const timer = setTimeout(() => {
98
+ if (settled)
99
+ return;
100
+ settled = true;
101
+ child.kill('SIGKILL');
102
+ reject(new Error(`kane-cli timed out after ${timeoutMs}ms`));
103
+ }, timeoutMs);
104
+ child.on('error', (err) => {
105
+ if (settled)
106
+ return;
107
+ settled = true;
108
+ clearTimeout(timer);
109
+ reject(err);
110
+ });
111
+ child.on('close', (exitCode) => {
112
+ if (settled)
113
+ return;
114
+ settled = true;
115
+ clearTimeout(timer);
116
+ resolve({
117
+ stdout: Buffer.concat(stdout).toString('utf8'),
118
+ stderr: Buffer.concat(stderr).toString('utf8'),
119
+ exitCode: exitCode ?? -1,
120
+ });
121
+ });
122
+ });
4
123
  }
5
124
  //# sourceMappingURL=kaneCli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kaneCli.js","sourceRoot":"","sources":["../../src/helpers/kaneCli.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,IAAI,KAAK,CACb,4DAA4D;QAC5D,8EAA8E,CAC/E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"kaneCli.js","sourceRoot":"","sources":["../../src/helpers/kaneCli.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@ export interface MathNode {
2
2
  operator: string;
3
3
  operands: Array<MathNode | number | string>;
4
4
  }
5
- export declare function evaluateMath(node: MathNode): number;
5
+ export declare function evaluateMath(node: MathNode): Promise<number>;
6
6
  //# sourceMappingURL=math.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;CAC7C;AAcD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CA+CnD"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;CAC7C;AAcD,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDlE"}
@@ -1,16 +1,17 @@
1
- import { v } from '../vars.js';
1
+ import { resolveVar } from '../vars.js';
2
+ import { log } from '../log.js';
2
3
  // Matches Python's _OPERATORS frozenset
3
4
  const OPERATORS = new Set([
4
5
  'add', 'subtract', 'multiply', 'divide', 'mod', 'pow', 'negate', 'abs',
5
6
  // symbolic aliases
6
7
  '+', '-', '*', '/',
7
8
  ]);
8
- function toNum(val) {
9
+ async function toNum(val) {
9
10
  if (typeof val === 'number')
10
11
  return val;
11
12
  if (typeof val === 'string') {
12
13
  // Resolve {{var}} / ${var} placeholders via the variable store
13
- const resolved = v(val);
14
+ const resolved = await resolveVar(val);
14
15
  const n = Number(typeof resolved === 'string' ? resolved.trim() : resolved);
15
16
  if (Number.isNaN(n))
16
17
  throw new Error(`Non-numeric operand encountered: ${JSON.stringify(val)}`);
@@ -18,15 +19,16 @@ function toNum(val) {
18
19
  }
19
20
  throw new Error(`Unsupported operand type: ${typeof val}`);
20
21
  }
21
- export function evaluateMath(node) {
22
+ export async function evaluateMath(node) {
22
23
  const op = node.operator ?? 'add';
24
+ log.helper(`[math] operator=${op}`);
23
25
  if (!OPERATORS.has(op))
24
26
  throw new Error(`Unsupported math operator: ${JSON.stringify(op)}`);
25
- const resolved = node.operands.map((operand) => {
27
+ const resolved = await Promise.all(node.operands.map(async (operand) => {
26
28
  if (typeof operand === 'object' && operand !== null)
27
29
  return evaluateMath(operand);
28
30
  return toNum(operand);
29
- });
31
+ }));
30
32
  // Validate arity — matches Python's checks
31
33
  if ((op === 'subtract' || op === '-' || op === 'divide' || op === '/' || op === 'mod') && resolved.length !== 2) {
32
34
  throw new Error(`${op} requires exactly 2 operands, got ${resolved.length}`);
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  type Operator = 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'greater_than' | 'greater_than_or_equal' | 'less_than' | 'less_than_or_equal' | 'start_with' | 'end_with';
2
2
  export interface NetworkLeaf {
3
3
  operator: Operator;
4
- left: unknown;
5
- right: unknown;
4
+ left_operand: unknown;
5
+ right_operand: unknown;
6
6
  }
7
7
  export interface NetworkComposite {
8
8
  operator: 'and' | 'or';
9
- children: NetworkNode[];
9
+ operands: NetworkNode[];
10
10
  }
11
11
  export type NetworkNode = NetworkLeaf | NetworkComposite;
12
- export declare function evaluateNetworkAssertion(node: NetworkNode): boolean;
12
+ export declare function evaluateNetworkAssertion(node: NetworkNode): Promise<boolean>;
13
13
  export interface NetworkQueryOptions {
14
14
  method: string;
15
15
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"AAGA,KAAK,QAAQ,GACT,QAAQ,GAAG,YAAY,GACvB,UAAU,GAAG,cAAc,GAC3B,cAAc,GAAG,uBAAuB,GACxC,WAAW,GAAG,oBAAoB,GAClC,YAAY,GAAG,UAAU,CAAC;AAE9B,MAAM,WAAW,WAAW;IAAG,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;CAAE;AACnF,MAAM,WAAW,gBAAgB;IAAG,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;CAAE;AACtF,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;AA2BzD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAWnE;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB9E"}
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"AAIA,KAAK,QAAQ,GACT,QAAQ,GAAG,YAAY,GACvB,UAAU,GAAG,cAAc,GAC3B,cAAc,GAAG,uBAAuB,GACxC,WAAW,GAAG,oBAAoB,GAClC,YAAY,GAAG,UAAU,CAAC;AAE9B,MAAM,WAAW,WAAW;IAAG,QAAQ,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;CAAE;AACnG,MAAM,WAAW,gBAAgB;IAAG,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;CAAE;AACtF,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAoCzD,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAKlF;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB9E"}
@@ -1,12 +1,13 @@
1
- import { v } from '../vars.js';
1
+ import { resolveVar } from '../vars.js';
2
2
  import { config } from '../config.js';
3
- function resolve(val) {
4
- return typeof val === 'string' ? v(val) : val;
3
+ import { log } from '../log.js';
4
+ async function resolve(val) {
5
+ return typeof val === 'string' ? resolveVar(val) : val;
5
6
  }
6
- function evaluateLeaf(l) {
7
- const a = resolve(l.left);
8
- const b = resolve(l.right);
9
- switch (l.operator) {
7
+ async function evaluateLeaf(l) {
8
+ const a = await resolve(l.left_operand);
9
+ const b = await resolve(l.right_operand);
10
+ switch (l.operator.toLowerCase()) {
10
11
  case 'equals': return a == b;
11
12
  case 'not_equals': return a != b;
12
13
  case 'contains': return String(a).includes(String(b));
@@ -20,23 +21,25 @@ function evaluateLeaf(l) {
20
21
  }
21
22
  }
22
23
  function isComposite(n) {
23
- return n.operator === 'and' || n.operator === 'or';
24
+ const op = n.operator.toLowerCase();
25
+ return op === 'and' || op === 'or';
24
26
  }
25
- export function evaluateNetworkAssertion(node) {
26
- let result;
27
+ async function _evaluateNode(node) {
27
28
  if (isComposite(node)) {
28
- result = node.operator === 'and'
29
- ? node.children.every(evaluateNetworkAssertion)
30
- : node.children.some(evaluateNetworkAssertion);
31
- }
32
- else {
33
- result = evaluateLeaf(node);
29
+ const childResults = await Promise.all(node.operands.map(_evaluateNode));
30
+ return node.operator.toLowerCase() === 'and' ? childResults.every(Boolean) : childResults.some(Boolean);
34
31
  }
32
+ return evaluateLeaf(node);
33
+ }
34
+ export async function evaluateNetworkAssertion(node) {
35
+ log.helper(`[network_assertion] op=${node.operator}`);
36
+ const result = await _evaluateNode(node);
35
37
  if (!result)
36
38
  throw new Error(`Network assertion failed: ${JSON.stringify(node)}`);
37
39
  return true;
38
40
  }
39
41
  export async function networkQuery(opts) {
42
+ log.helper(`[network_query] method=${opts.method} url=${opts.url} index=${opts.index}`);
40
43
  if (config.current.runTarget !== 'cloud')
41
44
  return null;
42
45
  const HAR = 'http://127.0.0.1:8181';
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
1
  import type { Page } from 'playwright';
2
- export declare function smartuiSnapshot(page: Page, name: string): Promise<void>;
2
+ type SdkSnapshot = (p: Page, n: string, o: Record<string, unknown>) => Promise<void>;
3
+ export declare function _resolveSdkFn(mod: unknown): SdkSnapshot | null;
4
+ export declare function _isModuleNotFound(e: unknown): boolean;
5
+ export declare function smartuiSnapshot(page: Page, name: string, options?: Record<string, unknown>): Promise<void>;
6
+ export {};
3
7
  //# sourceMappingURL=smartui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"smartui.d.ts","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7E"}
1
+ {"version":3,"file":"smartui.d.ts","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAGrF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAM9D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -1,11 +1,49 @@
1
1
  import { config } from '../config.js';
2
- export async function smartuiSnapshot(page, name) {
3
- if (!(config.current.smart && config.current.runTarget === 'cloud'))
2
+ import { log } from '../log.js';
3
+ // exported for unit testing — pure functions, no module side effects
4
+ export function _resolveSdkFn(mod) {
5
+ // CJS in Node ESM can surface as either top-level named export or .default
6
+ const m = mod;
7
+ if (typeof m?.smartuiSnapshot === 'function')
8
+ return m.smartuiSnapshot;
9
+ if (typeof m?.default?.smartuiSnapshot === 'function')
10
+ return m.default.smartuiSnapshot;
11
+ return null;
12
+ }
13
+ export function _isModuleNotFound(e) {
14
+ const code = e?.code;
15
+ return code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND';
16
+ }
17
+ export async function smartuiSnapshot(page, name, options = {}) {
18
+ log.helper(`[smartui_snapshot] name=${name}`);
19
+ if (config.current.runTarget !== 'cloud') {
20
+ log.helper(`[smartui_snapshot] requires cloud run target — skipping name=${name}`);
4
21
  return;
5
- const payload = JSON.stringify({
6
- action: 'smartui.takeScreenshot',
7
- arguments: { screenshotName: name },
8
- });
9
- await page.evaluate('_ => {}', `lambdatest_action: ${payload}`);
22
+ }
23
+ let mod;
24
+ try {
25
+ // @ts-expect-error — SDK is not a declared dep; installed at HE runtime
26
+ mod = await import('@lambdatest/playwright-driver');
27
+ }
28
+ catch (e) {
29
+ if (_isModuleNotFound(e)) {
30
+ log.helper(`[smartui_snapshot] @lambdatest/playwright-driver not installed — install at HE runtime via code-export`);
31
+ }
32
+ else {
33
+ log.helper(`[smartui_snapshot] SDK import failed: ${String(e)}`);
34
+ }
35
+ throw e;
36
+ }
37
+ const snapshotFn = _resolveSdkFn(mod);
38
+ if (!snapshotFn) {
39
+ throw new Error('[smartui_snapshot] SDK loaded but smartuiSnapshot export not found');
40
+ }
41
+ try {
42
+ await snapshotFn(page, name, options);
43
+ log.helper(`[smartui_snapshot] captured name=${name}`);
44
+ }
45
+ catch (e) {
46
+ log.helper(`[smartui_snapshot] failed: ${String(e)}`);
47
+ }
10
48
  }
11
49
  //# sourceMappingURL=smartui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"smartui.js","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU,EAAE,IAAY;IAC5D,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC;QAAE,OAAO;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,MAAM,EAAE,wBAAwB;QAChC,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;KACpC,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,sBAAsB,OAAO,EAAE,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"smartui.js","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIhC,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,2EAA2E;IAC3E,MAAM,CAAC,GAAG,GAA6E,CAAC;IACxF,IAAI,OAAO,CAAC,EAAE,eAAe,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,eAA8B,CAAC;IACtF,IAAI,OAAO,CAAC,EAAE,OAAO,EAAE,eAAe,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC,eAA8B,CAAC;IACvG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,MAAM,IAAI,GAAI,CAA8B,EAAE,IAAI,CAAC;IACnD,OAAO,IAAI,KAAK,sBAAsB,IAAI,IAAI,KAAK,kBAAkB,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAU,EACV,IAAY,EACZ,UAAmC,EAAE;IAErC,GAAG,CAAC,MAAM,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,gEAAgE,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IACD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,wEAAwE;QACxE,GAAG,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,wGAAwG,CAAC,CAAC;QACvH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,yCAAyC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,8BAA8B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrF"}
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrF"}
@@ -1,4 +1,6 @@
1
+ import { log } from '../log.js';
1
2
  export async function switchTab(context, index) {
3
+ log.helper(`[switch_tab] index=${index}`);
2
4
  let pages = context.pages();
3
5
  if (index >= pages.length) {
4
6
  await context.waitForEvent('page', { timeout: 5000 }).catch(() => null);
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAuB,EAAE,KAAa;IACpE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACxE,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,yBAAyB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACzF,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAuB,EAAE,KAAa;IACpE,GAAG,CAAC,MAAM,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IAC1C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACxE,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,yBAAyB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACzF,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -3,6 +3,49 @@ export interface VisionCoordinates {
3
3
  x: number;
4
4
  y: number;
5
5
  }
6
+ interface FlatDomElement {
7
+ index: number;
8
+ role: string;
9
+ name: string;
10
+ backend_dom_node_id?: number;
11
+ disabled?: boolean;
12
+ checked?: unknown;
13
+ expanded?: unknown;
14
+ selected?: unknown;
15
+ pressed?: unknown;
16
+ focused?: unknown;
17
+ required?: unknown;
18
+ readonly?: unknown;
19
+ value?: unknown;
20
+ description?: string;
21
+ }
22
+ interface AxNode {
23
+ ignored?: boolean;
24
+ role?: {
25
+ value?: string;
26
+ } | string;
27
+ name?: {
28
+ value?: string;
29
+ } | string;
30
+ backendDOMNodeId?: number;
31
+ properties?: Array<{
32
+ name: string;
33
+ value?: {
34
+ value?: unknown;
35
+ } | unknown;
36
+ }>;
37
+ value?: {
38
+ value?: unknown;
39
+ } | unknown;
40
+ description?: {
41
+ value?: string;
42
+ } | unknown;
43
+ }
44
+ /**
45
+ * Convert CDP Accessibility.getFullAXTree nodes to v16 flat-DOM format.
46
+ * 1-based indexing to match v16-runner's full_flat_dom.py. PY parity.
47
+ */
48
+ export declare function _buildFlatDom(a11yNodes: AxNode[]): FlatDomElement[];
6
49
  /**
7
50
  * Get coordinates for a described element via vision API.
8
51
  *
@@ -22,16 +65,15 @@ export declare function getVisionCoordinates(page: Page, description: string, ac
22
65
  */
23
66
  export declare function visionQuery(page: Page, description: string, returnType?: string): Promise<string | null>;
24
67
  /**
25
- * Extract a value from a DOM element using analyzer API (textual/DOM mode).
68
+ * Extract a value from a DOM element using a 2-step DOM + analyzer API.
26
69
  *
27
- * NOTE: Python does a 5-step CDP flow (DOM.enable Accessibility.getFullAXTree →
28
- * identify via LLM Runtime.callFunctionOn snapshot extract via LLM).
29
- * For v0.1, simplified to a single API call with mode='textual_extract'.
30
- * Full CDP port deferred.
70
+ * Step 1: Build flat accessibility tree, identify target element via LLM.
71
+ * Step 2: Snapshot element via CDP, extract value via LLM.
31
72
  *
32
- * Smart-gated: returns null when smart is OFF.
73
+ * Smart-gated: returns null when smart is OFF. PY parity: vision.py:321.
74
+ * `returnType` kept for signature parity but not sent (PY doesn't send it either).
33
75
  */
34
- export declare function textualQuery(page: Page, description: string, returnType?: string): Promise<string | null>;
76
+ export declare function textualQuery(page: Page, description: string, _returnType?: string): Promise<string | null>;
35
77
  /**
36
78
  * Poll the vision wait API until the described condition is met.
37
79
  *
@@ -45,4 +87,5 @@ export declare function visionWait(page: Page, description: string, timeoutMs?:
45
87
  * Smart-gated via getVisionCoordinates: no-ops when smart is OFF or element not found.
46
88
  */
47
89
  export declare function visionAction(page: Page, description: string, actionType: string, direction?: string, amount?: number): Promise<void>;
90
+ export {};
48
91
  //# sourceMappingURL=vision.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/helpers/vision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,MAAM,WAAW,iBAAiB;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;CAAE;AAE5D;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,GACT,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0BnC;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB9G;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB/G;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBtG;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,SAAS,EAClB,MAAM,SAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAaf"}
1
+ {"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/helpers/vision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAKnD,MAAM,WAAW,iBAAiB;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;CAAE;AAgE5D,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5E,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CAC5C;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAsDnE;AAgED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,GACT,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0BnC;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB9G;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBtG;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,SAAS,EAClB,MAAM,SAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAaf"}