testchimp-runner-core 0.0.34 → 0.0.36

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 (150) hide show
  1. package/dist/execution-service.d.ts +1 -4
  2. package/dist/execution-service.d.ts.map +1 -1
  3. package/dist/execution-service.js +155 -468
  4. package/dist/execution-service.js.map +1 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +11 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/orchestrator/decision-parser.d.ts +18 -0
  10. package/dist/orchestrator/decision-parser.d.ts.map +1 -0
  11. package/dist/orchestrator/decision-parser.js +127 -0
  12. package/dist/orchestrator/decision-parser.js.map +1 -0
  13. package/dist/orchestrator/index.d.ts +4 -2
  14. package/dist/orchestrator/index.d.ts.map +1 -1
  15. package/dist/orchestrator/index.js +14 -2
  16. package/dist/orchestrator/index.js.map +1 -1
  17. package/dist/orchestrator/orchestrator-agent.d.ts +17 -14
  18. package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -1
  19. package/dist/orchestrator/orchestrator-agent.js +534 -204
  20. package/dist/orchestrator/orchestrator-agent.js.map +1 -1
  21. package/dist/orchestrator/orchestrator-prompts.d.ts +14 -2
  22. package/dist/orchestrator/orchestrator-prompts.d.ts.map +1 -1
  23. package/dist/orchestrator/orchestrator-prompts.js +529 -247
  24. package/dist/orchestrator/orchestrator-prompts.js.map +1 -1
  25. package/dist/orchestrator/page-som-handler.d.ts +106 -0
  26. package/dist/orchestrator/page-som-handler.d.ts.map +1 -0
  27. package/dist/orchestrator/page-som-handler.js +1353 -0
  28. package/dist/orchestrator/page-som-handler.js.map +1 -0
  29. package/dist/orchestrator/som-types.d.ts +149 -0
  30. package/dist/orchestrator/som-types.d.ts.map +1 -0
  31. package/dist/orchestrator/som-types.js +87 -0
  32. package/dist/orchestrator/som-types.js.map +1 -0
  33. package/dist/orchestrator/tool-registry.d.ts +2 -0
  34. package/dist/orchestrator/tool-registry.d.ts.map +1 -1
  35. package/dist/orchestrator/tool-registry.js.map +1 -1
  36. package/dist/orchestrator/tools/index.d.ts +4 -1
  37. package/dist/orchestrator/tools/index.d.ts.map +1 -1
  38. package/dist/orchestrator/tools/index.js +7 -2
  39. package/dist/orchestrator/tools/index.js.map +1 -1
  40. package/dist/orchestrator/tools/refresh-som-markers.d.ts +12 -0
  41. package/dist/orchestrator/tools/refresh-som-markers.d.ts.map +1 -0
  42. package/dist/orchestrator/tools/refresh-som-markers.js +64 -0
  43. package/dist/orchestrator/tools/refresh-som-markers.js.map +1 -0
  44. package/dist/orchestrator/tools/view-previous-screenshot.d.ts +15 -0
  45. package/dist/orchestrator/tools/view-previous-screenshot.d.ts.map +1 -0
  46. package/dist/orchestrator/tools/view-previous-screenshot.js +92 -0
  47. package/dist/orchestrator/tools/view-previous-screenshot.js.map +1 -0
  48. package/dist/orchestrator/types.d.ts +23 -1
  49. package/dist/orchestrator/types.d.ts.map +1 -1
  50. package/dist/orchestrator/types.js +11 -1
  51. package/dist/orchestrator/types.js.map +1 -1
  52. package/dist/scenario-service.d.ts +5 -0
  53. package/dist/scenario-service.d.ts.map +1 -1
  54. package/dist/scenario-service.js +17 -0
  55. package/dist/scenario-service.js.map +1 -1
  56. package/dist/scenario-worker-class.d.ts +4 -0
  57. package/dist/scenario-worker-class.d.ts.map +1 -1
  58. package/dist/scenario-worker-class.js +18 -3
  59. package/dist/scenario-worker-class.js.map +1 -1
  60. package/dist/testing/agent-tester.d.ts +35 -0
  61. package/dist/testing/agent-tester.d.ts.map +1 -0
  62. package/dist/testing/agent-tester.js +84 -0
  63. package/dist/testing/agent-tester.js.map +1 -0
  64. package/dist/testing/ref-translator-tester.d.ts +44 -0
  65. package/dist/testing/ref-translator-tester.d.ts.map +1 -0
  66. package/dist/testing/ref-translator-tester.js +104 -0
  67. package/dist/testing/ref-translator-tester.js.map +1 -0
  68. package/dist/utils/hierarchical-selector.d.ts +47 -0
  69. package/dist/utils/hierarchical-selector.d.ts.map +1 -0
  70. package/dist/utils/hierarchical-selector.js +212 -0
  71. package/dist/utils/hierarchical-selector.js.map +1 -0
  72. package/dist/utils/page-info-retry.d.ts +14 -0
  73. package/dist/utils/page-info-retry.d.ts.map +1 -0
  74. package/dist/utils/page-info-retry.js +60 -0
  75. package/dist/utils/page-info-retry.js.map +1 -0
  76. package/dist/utils/page-info-utils.d.ts +1 -0
  77. package/dist/utils/page-info-utils.d.ts.map +1 -1
  78. package/dist/utils/page-info-utils.js +46 -18
  79. package/dist/utils/page-info-utils.js.map +1 -1
  80. package/dist/utils/ref-attacher.d.ts +21 -0
  81. package/dist/utils/ref-attacher.d.ts.map +1 -0
  82. package/dist/utils/ref-attacher.js +149 -0
  83. package/dist/utils/ref-attacher.js.map +1 -0
  84. package/dist/utils/ref-translator.d.ts +49 -0
  85. package/dist/utils/ref-translator.d.ts.map +1 -0
  86. package/dist/utils/ref-translator.js +276 -0
  87. package/dist/utils/ref-translator.js.map +1 -0
  88. package/package.json +6 -1
  89. package/RELEASE_0.0.26.md +0 -165
  90. package/RELEASE_0.0.27.md +0 -236
  91. package/RELEASE_0.0.28.md +0 -286
  92. package/plandocs/BEFORE_AFTER_VERIFICATION.md +0 -148
  93. package/plandocs/COORDINATE_MODE_DIAGNOSIS.md +0 -144
  94. package/plandocs/CREDIT_CALLBACK_ARCHITECTURE.md +0 -253
  95. package/plandocs/HUMAN_LIKE_IMPROVEMENTS.md +0 -642
  96. package/plandocs/IMPLEMENTATION_STATUS.md +0 -108
  97. package/plandocs/INTEGRATION_COMPLETE.md +0 -322
  98. package/plandocs/MULTI_AGENT_ARCHITECTURE_REVIEW.md +0 -844
  99. package/plandocs/ORCHESTRATOR_MVP_SUMMARY.md +0 -539
  100. package/plandocs/PHASE1_ABSTRACTION_COMPLETE.md +0 -241
  101. package/plandocs/PHASE1_FINAL_STATUS.md +0 -210
  102. package/plandocs/PHASE_1_COMPLETE.md +0 -165
  103. package/plandocs/PHASE_1_SUMMARY.md +0 -184
  104. package/plandocs/PLANNING_SESSION_SUMMARY.md +0 -372
  105. package/plandocs/PROMPT_OPTIMIZATION_ANALYSIS.md +0 -120
  106. package/plandocs/PROMPT_SANITY_CHECK.md +0 -120
  107. package/plandocs/SCRIPT_CLEANUP_FEATURE.md +0 -201
  108. package/plandocs/SCRIPT_GENERATION_ARCHITECTURE.md +0 -364
  109. package/plandocs/SELECTOR_IMPROVEMENTS.md +0 -139
  110. package/plandocs/SESSION_SUMMARY_v0.0.33.md +0 -151
  111. package/plandocs/TROUBLESHOOTING_SESSION.md +0 -72
  112. package/plandocs/VISION_DIAGNOSTICS_IMPROVEMENTS.md +0 -336
  113. package/plandocs/VISUAL_AGENT_EVOLUTION_PLAN.md +0 -396
  114. package/plandocs/WHATS_NEW_v0.0.33.md +0 -183
  115. package/src/auth-config.ts +0 -84
  116. package/src/credit-usage-service.ts +0 -188
  117. package/src/env-loader.ts +0 -103
  118. package/src/execution-service.ts +0 -1413
  119. package/src/file-handler.ts +0 -104
  120. package/src/index.ts +0 -422
  121. package/src/llm-facade.ts +0 -821
  122. package/src/llm-provider.ts +0 -53
  123. package/src/model-constants.ts +0 -35
  124. package/src/orchestrator/index.ts +0 -34
  125. package/src/orchestrator/orchestrator-agent.ts +0 -862
  126. package/src/orchestrator/orchestrator-agent.ts.backup +0 -1386
  127. package/src/orchestrator/orchestrator-prompts.ts +0 -474
  128. package/src/orchestrator/tool-registry.ts +0 -182
  129. package/src/orchestrator/tools/check-page-ready.ts +0 -75
  130. package/src/orchestrator/tools/extract-data.ts +0 -92
  131. package/src/orchestrator/tools/index.ts +0 -12
  132. package/src/orchestrator/tools/inspect-page.ts +0 -42
  133. package/src/orchestrator/tools/recall-history.ts +0 -72
  134. package/src/orchestrator/tools/take-screenshot.ts +0 -128
  135. package/src/orchestrator/tools/verify-action-result.ts +0 -159
  136. package/src/orchestrator/types.ts +0 -248
  137. package/src/playwright-mcp-service.ts +0 -224
  138. package/src/progress-reporter.ts +0 -144
  139. package/src/prompts.ts +0 -842
  140. package/src/providers/backend-proxy-llm-provider.ts +0 -91
  141. package/src/providers/local-llm-provider.ts +0 -38
  142. package/src/scenario-service.ts +0 -232
  143. package/src/scenario-worker-class.ts +0 -1089
  144. package/src/script-utils.ts +0 -203
  145. package/src/types.ts +0 -239
  146. package/src/utils/browser-utils.ts +0 -348
  147. package/src/utils/coordinate-converter.ts +0 -162
  148. package/src/utils/page-info-utils.ts +0 -250
  149. package/testchimp-runner-core-0.0.33.tgz +0 -0
  150. package/tsconfig.json +0 -19
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Standalone Ref Translator Tester
3
+ * Tests ref translation effectiveness independently
4
+ */
5
+ export interface TranslationTestCommand {
6
+ ref: string;
7
+ operation: string;
8
+ value?: string;
9
+ }
10
+ export interface TranslationTestResult {
11
+ ref: string;
12
+ operation: string;
13
+ alternatives: string[];
14
+ successful?: string;
15
+ allFailed: boolean;
16
+ error?: string;
17
+ elementInfo?: {
18
+ tag: string;
19
+ role: string;
20
+ text: string;
21
+ };
22
+ }
23
+ export interface TranslationBatchResult {
24
+ totalCommands: number;
25
+ successfulTranslations: number;
26
+ failedTranslations: number;
27
+ results: TranslationTestResult[];
28
+ }
29
+ /**
30
+ * Test ref translation for a set of commands
31
+ */
32
+ export declare class RefTranslatorTester {
33
+ private translator;
34
+ constructor();
35
+ /**
36
+ * Test translation of ref commands on a page
37
+ */
38
+ testTranslation(page: any, commands: TranslationTestCommand[]): Promise<TranslationBatchResult>;
39
+ /**
40
+ * Test a single ref command
41
+ */
42
+ testSingleCommand(page: any, ref: string, operation: string, value?: string): Promise<TranslationTestResult>;
43
+ }
44
+ //# sourceMappingURL=ref-translator-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-translator-tester.d.ts","sourceRoot":"","sources":["../../src/testing/ref-translator-tester.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAgB;;IAMlC;;OAEG;IACG,eAAe,CACnB,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,sBAAsB,EAAE,GACjC,OAAO,CAAC,sBAAsB,CAAC;IA6FlC;;OAEG;IACG,iBAAiB,CACrB,IAAI,EAAE,GAAG,EACT,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC;CAIlC"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * Standalone Ref Translator Tester
4
+ * Tests ref translation effectiveness independently
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RefTranslatorTester = void 0;
8
+ const ref_translator_1 = require("../utils/ref-translator");
9
+ const ref_attacher_1 = require("../utils/ref-attacher");
10
+ /**
11
+ * Test ref translation for a set of commands
12
+ */
13
+ class RefTranslatorTester {
14
+ constructor() {
15
+ this.translator = new ref_translator_1.RefTranslator(console.log);
16
+ }
17
+ /**
18
+ * Test translation of ref commands on a page
19
+ */
20
+ async testTranslation(page, commands) {
21
+ console.log('\n=== REF TRANSLATION TEST ===');
22
+ console.log(`Testing ${commands.length} command(s)`);
23
+ try {
24
+ // Step 1: Get page info (uses data-tc-id if available)
25
+ console.log('\n1. Getting page info...');
26
+ const pageInfo = await (0, ref_attacher_1.getPageInfoFromAttachedRefs)(page);
27
+ console.log(` RefMap size: ${pageInfo.refMap?.size || 0}`);
28
+ // Step 2: Convert to RefCommand format
29
+ const refCommands = commands.map(cmd => ({
30
+ type: 'ref',
31
+ ref: cmd.ref,
32
+ operation: cmd.operation,
33
+ value: cmd.value
34
+ }));
35
+ // Step 3: Translate commands
36
+ console.log('\n2. Translating commands...');
37
+ const results = [];
38
+ for (const cmd of commands) {
39
+ console.log(`\n Testing ref='${cmd.ref}' operation='${cmd.operation}'`);
40
+ // Get element info
41
+ const elementInfo = pageInfo.refMap?.get(cmd.ref);
42
+ if (!elementInfo) {
43
+ console.log(` ⚠️ Ref '${cmd.ref}' not found in refMap`);
44
+ results.push({
45
+ ref: cmd.ref,
46
+ operation: cmd.operation,
47
+ alternatives: [],
48
+ allFailed: true,
49
+ error: 'Ref not found in refMap'
50
+ });
51
+ continue;
52
+ }
53
+ console.log(` Element: <${elementInfo.tag}> role="${elementInfo.role}" text="${elementInfo.text?.substring(0, 30)}"`);
54
+ // Translate single command
55
+ const translated = await this.translator.translateRefCommands([{ type: 'ref', ref: cmd.ref, operation: cmd.operation, value: cmd.value }], page, pageInfo.refMap, pageInfo.ariaSnapshot);
56
+ const result = translated[0];
57
+ console.log(` Generated ${result.alternatives.length} alternatives`);
58
+ if (result.successful) {
59
+ console.log(` ✓ Success: ${result.successful.substring(0, 80)}...`);
60
+ }
61
+ else {
62
+ console.log(` ✗ All alternatives failed`);
63
+ }
64
+ results.push({
65
+ ref: cmd.ref,
66
+ operation: cmd.operation,
67
+ alternatives: result.alternatives,
68
+ successful: result.successful,
69
+ allFailed: !result.successful,
70
+ elementInfo: {
71
+ tag: elementInfo.tag,
72
+ role: elementInfo.role,
73
+ text: elementInfo.text || ''
74
+ }
75
+ });
76
+ }
77
+ // Step 4: Summary
78
+ const successful = results.filter(r => !r.allFailed).length;
79
+ const failed = results.filter(r => r.allFailed).length;
80
+ console.log('\n3. Summary:');
81
+ console.log(` ✓ Successful: ${successful}/${commands.length}`);
82
+ console.log(` ✗ Failed: ${failed}/${commands.length}`);
83
+ return {
84
+ totalCommands: commands.length,
85
+ successfulTranslations: successful,
86
+ failedTranslations: failed,
87
+ results
88
+ };
89
+ }
90
+ catch (error) {
91
+ console.error(`\n❌ Translation test failed: ${error.message}`);
92
+ throw error;
93
+ }
94
+ }
95
+ /**
96
+ * Test a single ref command
97
+ */
98
+ async testSingleCommand(page, ref, operation, value) {
99
+ const result = await this.testTranslation(page, [{ ref, operation, value }]);
100
+ return result.results[0];
101
+ }
102
+ }
103
+ exports.RefTranslatorTester = RefTranslatorTester;
104
+ //# sourceMappingURL=ref-translator-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-translator-tester.js","sourceRoot":"","sources":["../../src/testing/ref-translator-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Hierarchical Selector Generator
3
+ * Generates Playwright selectors using ARIA tree hierarchy for uniqueness
4
+ * Mimics Playwright's own selector generation strategy
5
+ */
6
+ export interface AriaNode {
7
+ role: string;
8
+ name?: string;
9
+ ref?: string;
10
+ children?: AriaNode[];
11
+ }
12
+ export interface AriaTreePath {
13
+ nodes: AriaNode[];
14
+ targetIndex: number;
15
+ }
16
+ export declare class HierarchicalSelectorGenerator {
17
+ private logger?;
18
+ constructor(logger?: (message: string, level?: 'log' | 'error' | 'warn') => void);
19
+ /**
20
+ * Generate Playwright selectors for a ref using ARIA tree hierarchy
21
+ * Returns selectors in priority order, considering parent context for uniqueness
22
+ */
23
+ generateSelectorsForRef(ref: string, refMap: Map<string, any>, ariaTree: any): string[];
24
+ /**
25
+ * Strategy 1: Unique attributes (most reliable)
26
+ */
27
+ private generateUniqueAttributeSelectors;
28
+ /**
29
+ * Strategy 2: Parent-scoped selectors (uses hierarchy for uniqueness)
30
+ */
31
+ private generateParentScopedSelectors;
32
+ /**
33
+ * Strategy 3: nth-match based on sibling position in ARIA tree
34
+ */
35
+ private generateNthMatchSelectors;
36
+ /**
37
+ * Strategy 4: Generic fallbacks (last resort)
38
+ */
39
+ private generateGenericFallbacks;
40
+ /**
41
+ * Walk ARIA tree to find path from root to target ref
42
+ */
43
+ private getAriaTreePath;
44
+ private walkTree;
45
+ private escape;
46
+ }
47
+ //# sourceMappingURL=hierarchical-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical-selector.d.ts","sourceRoot":"","sources":["../../src/utils/hierarchical-selector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,6BAA6B;IACxC,OAAO,CAAC,MAAM,CAAC,CAA8D;gBAEjE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI;IAIhF;;;OAGG;IACH,uBAAuB,CACrB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,QAAQ,EAAE,GAAG,GACZ,MAAM,EAAE;IA+BX;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAgCxC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA4CrC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2CjC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2BhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,MAAM;CAGf"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * Hierarchical Selector Generator
4
+ * Generates Playwright selectors using ARIA tree hierarchy for uniqueness
5
+ * Mimics Playwright's own selector generation strategy
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.HierarchicalSelectorGenerator = void 0;
9
+ class HierarchicalSelectorGenerator {
10
+ constructor(logger) {
11
+ this.logger = logger;
12
+ }
13
+ /**
14
+ * Generate Playwright selectors for a ref using ARIA tree hierarchy
15
+ * Returns selectors in priority order, considering parent context for uniqueness
16
+ */
17
+ generateSelectorsForRef(ref, refMap, ariaTree) {
18
+ const element = refMap.get(ref);
19
+ if (!element) {
20
+ this.logger?.(`[HierarchicalSelector] Ref '${ref}' not found in refMap`, 'warn');
21
+ return [];
22
+ }
23
+ // Get ARIA tree path to understand hierarchy
24
+ const path = this.getAriaTreePath(ariaTree, ref);
25
+ const selectors = [];
26
+ // Strategy 1: BEST - Unique attribute (name, id, data-testid)
27
+ selectors.push(...this.generateUniqueAttributeSelectors(element));
28
+ // Strategy 2: GOOD - Parent-scoped semantic selectors
29
+ if (path) {
30
+ selectors.push(...this.generateParentScopedSelectors(element, path));
31
+ }
32
+ // Strategy 3: FALLBACK - nth-match based on sibling position
33
+ if (path) {
34
+ selectors.push(...this.generateNthMatchSelectors(element, path, ref));
35
+ }
36
+ // Strategy 4: LAST RESORT - Generic selectors with first()
37
+ selectors.push(...this.generateGenericFallbacks(element));
38
+ return selectors;
39
+ }
40
+ /**
41
+ * Strategy 1: Unique attributes (most reliable)
42
+ */
43
+ generateUniqueAttributeSelectors(element) {
44
+ const selectors = [];
45
+ const { tag, name, id, ariaLabel, placeholder, type } = element;
46
+ // name attribute (best for forms)
47
+ if (name && (tag === 'input' || tag === 'textarea' || tag === 'select')) {
48
+ selectors.push(`${tag}[name="${name}"]`);
49
+ }
50
+ // data-testid
51
+ if (element.dataTestId) {
52
+ selectors.push(`[data-testid="${element.dataTestId}"]`);
53
+ }
54
+ // ID (only if stable - avoid auto-generated)
55
+ if (id && !id.match(/^(rc_|:r[0-9]+:|__|«)/)) {
56
+ selectors.push(`#${id}`);
57
+ }
58
+ // aria-label (semantic)
59
+ if (ariaLabel && ariaLabel.length > 0 && ariaLabel.length < 50) {
60
+ selectors.push(`[aria-label="${this.escape(ariaLabel)}"]`);
61
+ }
62
+ // placeholder
63
+ if (placeholder && placeholder.length > 0) {
64
+ selectors.push(`[placeholder="${this.escape(placeholder)}"]`);
65
+ }
66
+ return selectors;
67
+ }
68
+ /**
69
+ * Strategy 2: Parent-scoped selectors (uses hierarchy for uniqueness)
70
+ */
71
+ generateParentScopedSelectors(element, path) {
72
+ const selectors = [];
73
+ const { role, text, tag } = element;
74
+ const nodes = path.nodes;
75
+ if (nodes.length < 2)
76
+ return selectors; // Need at least parent + target
77
+ // Get parent and grandparent for context
78
+ const parent = nodes[nodes.length - 2];
79
+ const grandparent = nodes.length >= 3 ? nodes[nodes.length - 3] : null;
80
+ // Parent has text content - use it for scoping
81
+ if (parent.name && parent.name.length > 0 && parent.name.length < 50) {
82
+ // Approach 1: Scope by parent text, then find by role
83
+ if (role) {
84
+ selectors.push(`text=${parent.name} >> [role="${role}"]`);
85
+ }
86
+ // Approach 2: Scope by parent text, then find by tag
87
+ if (tag) {
88
+ selectors.push(`text=${parent.name} >> ${tag}`);
89
+ }
90
+ // Approach 3: Use getByText parent chaining (Playwright style)
91
+ if (text && text.length > 0) {
92
+ selectors.push(`text=${parent.name} >> text=${text}`);
93
+ }
94
+ }
95
+ // Grandparent scoping (for nested structures)
96
+ if (grandparent && grandparent.name && grandparent.name.length > 0) {
97
+ if (role) {
98
+ selectors.push(`text=${grandparent.name} >> [role="${role}"]`);
99
+ }
100
+ }
101
+ // Text content with role (if element has visible text)
102
+ if (text && text.length > 0 && text.length < 30 && role) {
103
+ selectors.push(`[role="${role}"][aria-label*="${this.escape(text)}"]`);
104
+ }
105
+ return selectors;
106
+ }
107
+ /**
108
+ * Strategy 3: nth-match based on sibling position in ARIA tree
109
+ */
110
+ generateNthMatchSelectors(element, path, ref) {
111
+ const selectors = [];
112
+ const { role, tag, text } = element;
113
+ const nodes = path.nodes;
114
+ if (nodes.length < 2)
115
+ return selectors;
116
+ const parent = nodes[nodes.length - 2];
117
+ // Find position among siblings with same role
118
+ const siblingsWithSameRole = (parent.children || []).filter((child) => child.role === role);
119
+ const position = siblingsWithSameRole.findIndex((child) => child.ref === ref);
120
+ if (position >= 0) {
121
+ // nth-match by role
122
+ if (role) {
123
+ selectors.push(`[role="${role}"] >> nth=${position}`);
124
+ // Playwright's getByRole with nth
125
+ selectors.push(`getByRole('${role}').nth(${position})`);
126
+ }
127
+ // nth-match by tag
128
+ if (tag) {
129
+ selectors.push(`${tag} >> nth=${position}`);
130
+ selectors.push(`locator('${tag}').nth(${position})`);
131
+ }
132
+ // Special case: first or last
133
+ if (position === 0) {
134
+ if (role)
135
+ selectors.push(`[role="${role}"] >> first`);
136
+ if (tag)
137
+ selectors.push(`${tag} >> first`);
138
+ }
139
+ else if (position === siblingsWithSameRole.length - 1) {
140
+ if (role)
141
+ selectors.push(`[role="${role}"] >> last`);
142
+ if (tag)
143
+ selectors.push(`${tag} >> last`);
144
+ }
145
+ }
146
+ return selectors;
147
+ }
148
+ /**
149
+ * Strategy 4: Generic fallbacks (last resort)
150
+ */
151
+ generateGenericFallbacks(element) {
152
+ const selectors = [];
153
+ const { tag, role, text, type } = element;
154
+ // Text content
155
+ if (text && text.length > 0 && text.length < 30) {
156
+ selectors.push(`text=${this.escape(text)}`);
157
+ selectors.push(`getByText('${this.escape(text)}')`);
158
+ }
159
+ // Role only (use first())
160
+ if (role) {
161
+ selectors.push(`[role="${role}"] >> first`);
162
+ selectors.push(`getByRole('${role}').first()`);
163
+ }
164
+ // Type selector
165
+ if (type) {
166
+ selectors.push(`${tag}[type="${type}"] >> first`);
167
+ }
168
+ // Ultimate fallback
169
+ selectors.push(`${tag} >> first`);
170
+ return selectors;
171
+ }
172
+ /**
173
+ * Walk ARIA tree to find path from root to target ref
174
+ */
175
+ getAriaTreePath(tree, targetRef) {
176
+ const path = [];
177
+ const found = this.walkTree(tree, targetRef, path);
178
+ if (found) {
179
+ return {
180
+ nodes: path,
181
+ targetIndex: path.length - 1
182
+ };
183
+ }
184
+ return null;
185
+ }
186
+ walkTree(node, targetRef, path) {
187
+ if (!node)
188
+ return false;
189
+ // Add current node to path
190
+ path.push(node);
191
+ // Found it!
192
+ if (node.ref === targetRef) {
193
+ return true;
194
+ }
195
+ // Search children
196
+ if (node.children && Array.isArray(node.children)) {
197
+ for (const child of node.children) {
198
+ if (this.walkTree(child, targetRef, path)) {
199
+ return true; // Found in this subtree
200
+ }
201
+ }
202
+ }
203
+ // Not found in this subtree - backtrack
204
+ path.pop();
205
+ return false;
206
+ }
207
+ escape(str) {
208
+ return str.replace(/'/g, "\\'").replace(/"/g, '\\"');
209
+ }
210
+ }
211
+ exports.HierarchicalSelectorGenerator = HierarchicalSelectorGenerator;
212
+ //# sourceMappingURL=hierarchical-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical-selector.js","sourceRoot":"","sources":["../../src/utils/hierarchical-selector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Page Info Retry Utility
3
+ * Handles adaptive page loading with exponential backoff
4
+ */
5
+ import { PageInfo } from './page-info-utils';
6
+ export declare class PageInfoRetry {
7
+ /**
8
+ * Get page info with retry logic - waits for interactive elements to appear
9
+ * Uses exponential backoff to handle slow-loading React/Vue/Angular apps
10
+ */
11
+ static getWithRetry(page: any, maxAttempts?: number): Promise<PageInfo>;
12
+ private static calculateTotalWaitTime;
13
+ }
14
+ //# sourceMappingURL=page-info-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-info-retry.d.ts","sourceRoot":"","sources":["../../src/utils/page-info-retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElE,qBAAa,aAAa;IACxB;;;OAGG;WACU,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAE,MAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0ChF,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAStC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /**
3
+ * Page Info Retry Utility
4
+ * Handles adaptive page loading with exponential backoff
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PageInfoRetry = void 0;
8
+ const page_info_utils_1 = require("./page-info-utils");
9
+ class PageInfoRetry {
10
+ /**
11
+ * Get page info with retry logic - waits for interactive elements to appear
12
+ * Uses exponential backoff to handle slow-loading React/Vue/Angular apps
13
+ */
14
+ static async getWithRetry(page, maxAttempts = 6) {
15
+ // Wait for initial page load (generous timeout for slow apps)
16
+ try {
17
+ await page.waitForLoadState('domcontentloaded', { timeout: 20000 }).catch(() => { });
18
+ }
19
+ catch (waitError) {
20
+ // Continue even if wait fails
21
+ }
22
+ let attempt = 0;
23
+ let backoffMs = 1000; // Start with 1 second (adequate for most sites)
24
+ while (attempt < maxAttempts) {
25
+ attempt++;
26
+ // Try to extract page info
27
+ const pageInfo = await (0, page_info_utils_1.getEnhancedPageInfo)(page);
28
+ // If we got a reasonable number of elements, we're done
29
+ if (pageInfo.interactiveElements && pageInfo.interactiveElements.length >= 3) {
30
+ if (attempt > 1) {
31
+ console.log(`[PageInfoRetry] ✓ Page elements loaded after ${attempt} attempts`);
32
+ }
33
+ return pageInfo;
34
+ }
35
+ // If this is the last attempt, return what we have
36
+ if (attempt >= maxAttempts) {
37
+ const totalWait = this.calculateTotalWaitTime(maxAttempts);
38
+ console.log(`[PageInfoRetry] ⚠️ Only found ${pageInfo.interactiveElements?.length || 0} elements after ${maxAttempts} attempts (total wait: ~${totalWait}ms)`);
39
+ return pageInfo;
40
+ }
41
+ // Wait with exponential backoff before retrying
42
+ console.log(`[PageInfoRetry] Only ${pageInfo.interactiveElements?.length || 0} elements found (attempt ${attempt}/${maxAttempts}), waiting ${backoffMs}ms...`);
43
+ await page.waitForTimeout(backoffMs);
44
+ backoffMs = Math.min(backoffMs * 1.6, 15000); // Cap at 15 seconds per attempt
45
+ }
46
+ // Fallback (shouldn't reach here, but for type safety)
47
+ return await (0, page_info_utils_1.getEnhancedPageInfo)(page);
48
+ }
49
+ static calculateTotalWaitTime(maxAttempts) {
50
+ let total = 0;
51
+ let backoffMs = 1000;
52
+ for (let i = 1; i < maxAttempts; i++) {
53
+ total += backoffMs;
54
+ backoffMs = Math.min(backoffMs * 1.6, 15000);
55
+ }
56
+ return Math.round(total);
57
+ }
58
+ }
59
+ exports.PageInfoRetry = PageInfoRetry;
60
+ //# sourceMappingURL=page-info-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-info-retry.js","sourceRoot":"","sources":["../../src/utils/page-info-retry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uDAAkE;AAElE,MAAa,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAS,EAAE,cAAsB,CAAC;QAC1D,8DAA8D;QAC9D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,8BAA8B;QAChC,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,gDAAgD;QAEtE,OAAO,OAAO,GAAG,WAAW,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;YAEV,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,MAAM,IAAA,qCAAmB,EAAC,IAAI,CAAC,CAAC;YAEjD,wDAAwD;YACxD,IAAI,QAAQ,CAAC,mBAAmB,IAAI,QAAQ,CAAC,mBAAmB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC7E,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,gDAAgD,OAAO,WAAW,CAAC,CAAC;gBAClF,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,mDAAmD;YACnD,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,kCAAkC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,mBAAmB,WAAW,2BAA2B,SAAS,KAAK,CAAC,CAAC;gBAChK,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,gDAAgD;YAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,4BAA4B,OAAO,IAAI,WAAW,cAAc,SAAS,OAAO,CAAC,CAAC;YAC/J,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACrC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,gCAAgC;QAChF,CAAC;QAED,uDAAuD;QACvD,OAAO,MAAM,IAAA,qCAAmB,EAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,MAAM,CAAC,sBAAsB,CAAC,WAAmB;QACvD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,KAAK,IAAI,SAAS,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACF;AAxDD,sCAwDC"}
@@ -7,6 +7,7 @@ export interface InteractiveElement {
7
7
  id: string | null;
8
8
  text: string;
9
9
  type: string;
10
+ name: string;
10
11
  role: string;
11
12
  ariaLabel: string;
12
13
  placeholder: string;
@@ -1 +1 @@
1
- {"version":3,"file":"page-info-utils.d.ts","sourceRoot":"","sources":["../../src/utils/page-info-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,GAAG,CAAC;IAClB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxE,wBAAsB,mBAAmB,CAAC,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"page-info-utils.d.ts","sourceRoot":"","sources":["../../src/utils/page-info-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,GAAG,CAAC;IAClB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxE,wBAAsB,mBAAmB,CAAC,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC"}