@kritchoff/agent-browser 0.9.2

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 (88) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +903 -0
  3. package/README.sdk.md +77 -0
  4. package/bin/agent-browser-linux-x64 +0 -0
  5. package/bin/agent-browser.js +109 -0
  6. package/dist/actions.d.ts +17 -0
  7. package/dist/actions.d.ts.map +1 -0
  8. package/dist/actions.js +1427 -0
  9. package/dist/actions.js.map +1 -0
  10. package/dist/browser.d.ts +474 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +1566 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/cdp-client.d.ts +103 -0
  15. package/dist/cdp-client.d.ts.map +1 -0
  16. package/dist/cdp-client.js +223 -0
  17. package/dist/cdp-client.js.map +1 -0
  18. package/dist/daemon.d.ts +60 -0
  19. package/dist/daemon.d.ts.map +1 -0
  20. package/dist/daemon.js +401 -0
  21. package/dist/daemon.js.map +1 -0
  22. package/dist/dualmode-config.d.ts +37 -0
  23. package/dist/dualmode-config.d.ts.map +1 -0
  24. package/dist/dualmode-config.js +44 -0
  25. package/dist/dualmode-config.js.map +1 -0
  26. package/dist/dualmode-fetcher.d.ts +60 -0
  27. package/dist/dualmode-fetcher.d.ts.map +1 -0
  28. package/dist/dualmode-fetcher.js +449 -0
  29. package/dist/dualmode-fetcher.js.map +1 -0
  30. package/dist/dualmode-types.d.ts +183 -0
  31. package/dist/dualmode-types.d.ts.map +1 -0
  32. package/dist/dualmode-types.js +8 -0
  33. package/dist/dualmode-types.js.map +1 -0
  34. package/dist/ios-actions.d.ts +11 -0
  35. package/dist/ios-actions.d.ts.map +1 -0
  36. package/dist/ios-actions.js +228 -0
  37. package/dist/ios-actions.js.map +1 -0
  38. package/dist/ios-manager.d.ts +266 -0
  39. package/dist/ios-manager.d.ts.map +1 -0
  40. package/dist/ios-manager.js +1073 -0
  41. package/dist/ios-manager.js.map +1 -0
  42. package/dist/protocol.d.ts +26 -0
  43. package/dist/protocol.d.ts.map +1 -0
  44. package/dist/protocol.js +832 -0
  45. package/dist/protocol.js.map +1 -0
  46. package/dist/snapshot.d.ts +83 -0
  47. package/dist/snapshot.d.ts.map +1 -0
  48. package/dist/snapshot.js +653 -0
  49. package/dist/snapshot.js.map +1 -0
  50. package/dist/stream-server.d.ts +117 -0
  51. package/dist/stream-server.d.ts.map +1 -0
  52. package/dist/stream-server.js +305 -0
  53. package/dist/stream-server.js.map +1 -0
  54. package/dist/types.d.ts +742 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/docker-compose.sdk.yml +45 -0
  59. package/package.json +85 -0
  60. package/scripts/benchmark.sh +80 -0
  61. package/scripts/build-all-platforms.sh +68 -0
  62. package/scripts/check-version-sync.js +39 -0
  63. package/scripts/copy-native.js +36 -0
  64. package/scripts/fast_reset.sh +108 -0
  65. package/scripts/postinstall.js +235 -0
  66. package/scripts/publish_images.sh +55 -0
  67. package/scripts/snapshot_manager.sh +293 -0
  68. package/scripts/start-android-agent.sh +49 -0
  69. package/scripts/sync-version.js +69 -0
  70. package/scripts/vaccine-run +26 -0
  71. package/sdk.sh +153 -0
  72. package/skills/agent-browser/SKILL.md +217 -0
  73. package/skills/agent-browser/references/authentication.md +202 -0
  74. package/skills/agent-browser/references/commands.md +259 -0
  75. package/skills/agent-browser/references/proxy-support.md +188 -0
  76. package/skills/agent-browser/references/session-management.md +193 -0
  77. package/skills/agent-browser/references/snapshot-refs.md +194 -0
  78. package/skills/agent-browser/references/video-recording.md +173 -0
  79. package/skills/agent-browser/templates/authenticated-session.sh +97 -0
  80. package/skills/agent-browser/templates/capture-workflow.sh +69 -0
  81. package/skills/agent-browser/templates/form-automation.sh +62 -0
  82. package/skills/skill-creator/LICENSE.txt +202 -0
  83. package/skills/skill-creator/SKILL.md +356 -0
  84. package/skills/skill-creator/references/output-patterns.md +82 -0
  85. package/skills/skill-creator/references/workflows.md +28 -0
  86. package/skills/skill-creator/scripts/init_skill.py +303 -0
  87. package/skills/skill-creator/scripts/package_skill.py +113 -0
  88. package/skills/skill-creator/scripts/quick_validate.py +95 -0
@@ -0,0 +1,449 @@
1
+ /**
2
+ * DualMode Accessibility Tree Fetcher
3
+ *
4
+ * Fetches enhanced accessibility tree from WootzApp Android browser via CDP.
5
+ * Transforms flat node list into hierarchical tree structure with refs.
6
+ */
7
+ import { CDPClient } from './cdp-client.js';
8
+ import * as fs from 'fs';
9
+ /**
10
+ * DualMode AXTree fetcher
11
+ */
12
+ export class DualModeAXTreeFetcher {
13
+ host;
14
+ port;
15
+ constructor(host = 'localhost', port = 9224) {
16
+ this.host = host;
17
+ this.port = port;
18
+ }
19
+ /**
20
+ * Clear Chrome app data using pm clear command
21
+ */
22
+ async clearBrowserData() {
23
+ try {
24
+ console.log('[DualMode] Clearing browser data...');
25
+ const { exec } = await import('child_process');
26
+ const { promisify } = await import('util');
27
+ const execAsync = promisify(exec);
28
+ // Clear Chrome app data using pm clear
29
+ console.log('[DualMode] Clearing app data with pm clear...');
30
+ await execAsync('docker exec android-world adb shell pm clear org.chromium.chrome');
31
+ await new Promise(resolve => setTimeout(resolve, 1000));
32
+ console.log('[DualMode] ✓ Browser cleared successfully');
33
+ }
34
+ catch (error) {
35
+ console.warn('[DualMode] Failed to clear browser:', error.message);
36
+ throw error;
37
+ }
38
+ }
39
+ /**
40
+ * Fetch DualMode AXTree for a URL
41
+ */
42
+ async fetchTree(url) {
43
+ // EXACT FLOW AS REQUESTED:
44
+ // 1. Connect to CDP
45
+ // 2. Get current URL from Playwright (passed as parameter)
46
+ // 3. Load URL in emulator browser and wait till completely loaded
47
+ // 4. Call getDualModeAXTree through CDP
48
+ // 5. Clear chromium app data using pm clear
49
+ const { exec } = await import('child_process');
50
+ const { promisify } = await import('util');
51
+ const execAsync = promisify(exec);
52
+ // Create a new CDP client for this fetch
53
+ const cdpClient = new CDPClient({
54
+ timeout: 30000,
55
+ commandTimeout: 15000,
56
+ });
57
+ try {
58
+ // Step 1: Connect to CDP
59
+ console.log('[DualMode] Step 1: Getting WebSocket debugger URL...');
60
+ const wsUrl = await CDPClient.getWebSocketDebuggerUrl(this.host, this.port);
61
+ console.log('[DualMode] Step 1: Connecting to CDP...');
62
+ await cdpClient.connect(wsUrl);
63
+ console.log('[DualMode] ✓ Connected to CDP');
64
+ // Enable Page domain
65
+ await cdpClient.send('Page.enable');
66
+ // Step 2: URL is already from Playwright (passed as parameter)
67
+ console.log(`[DualMode] Step 2: URL from Playwright: ${url}`);
68
+ // Step 3: Load URL in emulator browser and wait till completely loaded
69
+ console.log(`[DualMode] Step 3: Navigating Android browser to: ${url}`);
70
+ await cdpClient.send('Page.navigate', { url });
71
+ console.log('[DualMode] Step 3: Waiting for page load event...');
72
+ await cdpClient.waitForEvent('Page.loadEventFired', 30000);
73
+ // Wait for accessibility tree to fully build
74
+ console.log('[DualMode] Step 3: Waiting for accessibility tree to settle (3s)...');
75
+ await new Promise(resolve => setTimeout(resolve, 3000));
76
+ console.log('[DualMode] ✓ Page completely loaded');
77
+ // Step 4: Call getDualModeAXTree through CDP
78
+ console.log('[DualMode] Step 4: Enabling Accessibility domain...');
79
+ await cdpClient.send('Accessibility.enable');
80
+ console.log('[DualMode] Step 4: Calling getDualModeAXTree...');
81
+ const result = await cdpClient.send('Accessibility.getDualModeAXTree', {});
82
+ fs.appendFileSync('/tmp/debug.log', `[DualMode] Raw Response: ${JSON.stringify(result, null, 2)}\n`);
83
+ console.log('[DualMode] Raw AXTree response:', JSON.stringify(result, null, 2));
84
+ console.log(`[DualMode] ✓ Successfully fetched tree with ${result.nodes?.length || 0} nodes`);
85
+ // Disable Accessibility domain (cleanup)
86
+ await cdpClient.send('Accessibility.disable');
87
+ // Step 5: Clear chromium app data using pm clear
88
+ console.log('[DualMode] Step 5: Clearing chromium app data...');
89
+ await execAsync('docker exec android-world adb shell pm clear org.chromium.chrome');
90
+ console.log('[DualMode] ✓ Chromium app data cleared');
91
+ return result;
92
+ }
93
+ finally {
94
+ // Always close CDP connection
95
+ await cdpClient.close();
96
+ }
97
+ }
98
+ /**
99
+ * Convert standard CDP accessibility tree to DualMode format
100
+ */
101
+ convertStandardTreeToDualMode(standardTree) {
102
+ const nodes = [];
103
+ if (!standardTree.nodes || !Array.isArray(standardTree.nodes)) {
104
+ console.warn('[DualMode] No nodes in standard tree response');
105
+ return { nodes: [] };
106
+ }
107
+ console.log(`[DualMode] Converting ${standardTree.nodes.length} nodes...`);
108
+ for (const node of standardTree.nodes) {
109
+ // Skip ignored nodes
110
+ if (node.ignored)
111
+ continue;
112
+ const nodeId = this.parseNodeId(node.nodeId);
113
+ const backendNodeId = node.backendDomNodeId;
114
+ // Extract role
115
+ const role = node.role?.value || 'unknown';
116
+ // Extract name
117
+ const name = node.name?.value || '';
118
+ // Build child IDs
119
+ const childrenIds = [];
120
+ if (node.childIds && Array.isArray(node.childIds)) {
121
+ childrenIds.push(...node.childIds.map((id) => this.parseNodeId(id)));
122
+ }
123
+ // Determine parent (we'll set this in a second pass)
124
+ const parentId = null;
125
+ // Convert to DualMode format
126
+ const dualModeNode = {
127
+ core: {
128
+ nodeId,
129
+ backendNodeId,
130
+ className: role, // Use role as className for now
131
+ childrenIds,
132
+ parentId,
133
+ text: name,
134
+ contentDescription: node.description?.value,
135
+ focusable: node.focusable,
136
+ clickable: node.properties?.some((p) => p.name === 'clickable') || false,
137
+ enabled: !node.disabled,
138
+ },
139
+ xrayMode: {
140
+ semantics: {
141
+ role,
142
+ name,
143
+ description: node.description?.value,
144
+ },
145
+ dom: {
146
+ tagName: node.properties?.find((p) => p.name === 'htmlTag')?.value?.value,
147
+ },
148
+ },
149
+ };
150
+ nodes.push(dualModeNode);
151
+ }
152
+ // Second pass: set parent IDs
153
+ const nodeMap = new Map(nodes.map(n => [n.core.nodeId, n]));
154
+ for (const node of nodes) {
155
+ for (const childId of node.core.childrenIds) {
156
+ const child = nodeMap.get(childId);
157
+ if (child) {
158
+ child.core.parentId = node.core.nodeId;
159
+ }
160
+ }
161
+ }
162
+ console.log(`[DualMode] Conversion complete: ${nodes.length} nodes`);
163
+ return { nodes };
164
+ }
165
+ /**
166
+ * Parse node ID (handle string or number)
167
+ */
168
+ parseNodeId(nodeId) {
169
+ if (typeof nodeId === 'number')
170
+ return nodeId;
171
+ const parsed = parseInt(nodeId, 10);
172
+ return isNaN(parsed) ? 0 : parsed;
173
+ }
174
+ /**
175
+ * Fetch tree for current page (no navigation)
176
+ */
177
+ async fetchCurrentPageTree() {
178
+ // Create a new CDP client for each fetch
179
+ const cdpClient = new CDPClient({
180
+ timeout: 30000,
181
+ commandTimeout: 15000,
182
+ });
183
+ try {
184
+ // Get WebSocket URL
185
+ const wsUrl = await CDPClient.getWebSocketDebuggerUrl(this.host, this.port);
186
+ // Connect to CDP
187
+ await cdpClient.connect(wsUrl);
188
+ // Enable Accessibility domain
189
+ await cdpClient.send('Accessibility.enable');
190
+ // Fetch DualMode tree
191
+ const result = await cdpClient.send('Accessibility.getDualModeAXTree');
192
+ // Disable Accessibility domain (cleanup)
193
+ await cdpClient.send('Accessibility.disable');
194
+ return result;
195
+ }
196
+ finally {
197
+ await cdpClient.close();
198
+ }
199
+ }
200
+ /**
201
+ * Build hierarchical tree from flat node list
202
+ */
203
+ buildTree(response) {
204
+ const nodes = response.nodes;
205
+ const nodeMap = new Map();
206
+ // First pass: populate nodeMap
207
+ for (const node of nodes) {
208
+ nodeMap.set(node.core.nodeId, { ...node, children: [] });
209
+ }
210
+ // Second pass: build parent-child relationships
211
+ let root = null;
212
+ for (const node of nodeMap.values()) {
213
+ if (node.core.parentId === null) {
214
+ root = node;
215
+ }
216
+ else {
217
+ const parent = nodeMap.get(node.core.parentId);
218
+ if (parent) {
219
+ parent.children = parent.children || [];
220
+ parent.children.push(node);
221
+ }
222
+ }
223
+ }
224
+ if (!root) {
225
+ throw new Error('No root node found in DualMode tree');
226
+ }
227
+ // Collect interactive elements
228
+ const interactiveElements = [];
229
+ let refCounter = 0;
230
+ const collectInteractive = (node) => {
231
+ const isInteractive = node.core.clickable ||
232
+ node.core.focusable ||
233
+ this.isInteractiveRole(node.xrayMode?.semantics?.role);
234
+ if (isInteractive) {
235
+ interactiveElements.push({
236
+ node,
237
+ ref: `e${++refCounter}`,
238
+ selector: this.generateSelector(node),
239
+ });
240
+ }
241
+ if (node.children) {
242
+ for (const child of node.children) {
243
+ collectInteractive(child);
244
+ }
245
+ }
246
+ };
247
+ collectInteractive(root);
248
+ return {
249
+ root,
250
+ nodeMap,
251
+ interactiveElements,
252
+ };
253
+ }
254
+ /**
255
+ * Check if role is interactive
256
+ */
257
+ isInteractiveRole(role) {
258
+ if (!role)
259
+ return false;
260
+ const interactiveRoles = [
261
+ 'button', 'link', 'textbox', 'checkbox', 'radio',
262
+ 'combobox', 'listbox', 'menuitem', 'searchbox',
263
+ 'slider', 'spinbutton', 'switch', 'tab',
264
+ ];
265
+ return interactiveRoles.includes(role.toLowerCase());
266
+ }
267
+ /**
268
+ * Generate selector for node (best effort)
269
+ */
270
+ generateSelector(node) {
271
+ const dom = node.xrayMode?.dom;
272
+ // Prefer ID selector
273
+ if (dom?.id) {
274
+ return `#${dom.id}`;
275
+ }
276
+ // Use role and name for Playwright-style selector
277
+ const role = node.xrayMode?.semantics?.role;
278
+ const name = node.xrayMode?.semantics?.name || node.core.text;
279
+ if (role && name) {
280
+ return `role=${role}[name="${name}"]`;
281
+ }
282
+ if (role) {
283
+ return `role=${role}`;
284
+ }
285
+ // Fallback to CSS selector
286
+ if (dom?.selector) {
287
+ return dom.selector;
288
+ }
289
+ // Last resort: use text content
290
+ const text = node.core.text || node.core.contentDescription;
291
+ if (text) {
292
+ return `text="${text.substring(0, 50)}"`;
293
+ }
294
+ return `node-${node.core.nodeId}`;
295
+ }
296
+ /**
297
+ * Generate text tree representation
298
+ */
299
+ generateTextTree(tree, options = {}) {
300
+ const lines = [];
301
+ const refMap = new Map();
302
+ // Build ref map
303
+ for (const elem of tree.interactiveElements) {
304
+ refMap.set(elem.node.core.nodeId, elem.ref);
305
+ }
306
+ const traverse = (node, depth = 0) => {
307
+ // Check depth limit
308
+ if (options.maxDepth !== undefined && depth > options.maxDepth) {
309
+ return;
310
+ }
311
+ // Check if should include node
312
+ if (options.interactive && !refMap.has(node.core.nodeId)) {
313
+ // Skip non-interactive nodes in interactive mode
314
+ // but still traverse children
315
+ if (node.children) {
316
+ for (const child of node.children) {
317
+ traverse(child, depth);
318
+ }
319
+ }
320
+ return;
321
+ }
322
+ // Check intent filter
323
+ if (options.intentFilter && options.intentFilter.length > 0) {
324
+ const intentTags = node.xrayMode?.semantics?.intentTags || [];
325
+ const hasMatchingIntent = options.intentFilter.some(filter => intentTags.includes(filter));
326
+ if (!hasMatchingIntent) {
327
+ return;
328
+ }
329
+ }
330
+ // Check importance threshold
331
+ if (options.minImportance !== undefined) {
332
+ const importance = node.xrayMode?.insights?.importance ?? 0;
333
+ if (importance < options.minImportance) {
334
+ return;
335
+ }
336
+ }
337
+ // Build node line
338
+ const indent = ' '.repeat(depth);
339
+ const role = node.xrayMode?.semantics?.role || node.core.className;
340
+ const name = node.xrayMode?.semantics?.name ||
341
+ node.core.text ||
342
+ node.core.contentDescription || '';
343
+ const ref = refMap.get(node.core.nodeId);
344
+ const refPart = ref ? ` [ref=${ref}]` : '';
345
+ let line = `${indent}- ${role}`;
346
+ if (name) {
347
+ line += ` "${name}"`;
348
+ }
349
+ line += refPart;
350
+ // Add metadata if requested
351
+ if (options.includeMetadata && node.xrayMode) {
352
+ const tags = node.xrayMode.semantics?.intentTags;
353
+ if (tags && tags.length > 0) {
354
+ line += ` [intent:${tags.join(',')}]`;
355
+ }
356
+ const importance = node.xrayMode.insights?.importance;
357
+ if (importance !== undefined) {
358
+ line += ` [importance:${importance.toFixed(2)}]`;
359
+ }
360
+ }
361
+ lines.push(line);
362
+ // Traverse children
363
+ if (node.children) {
364
+ for (const child of node.children) {
365
+ traverse(child, depth + 1);
366
+ }
367
+ }
368
+ };
369
+ traverse(tree.root);
370
+ return lines.join('\n');
371
+ }
372
+ /**
373
+ * Get enhanced snapshot with refs
374
+ */
375
+ async getEnhancedSnapshot(url, options = {}) {
376
+ const response = await this.fetchTree(url);
377
+ const tree = this.buildTree(response);
378
+ const textTree = this.generateTextTree(tree, options);
379
+ // Build refs map
380
+ const refs = {};
381
+ for (const elem of tree.interactiveElements) {
382
+ refs[elem.ref] = {
383
+ selector: elem.selector || '',
384
+ role: elem.node.xrayMode?.semantics?.role || elem.node.core.className,
385
+ name: elem.node.xrayMode?.semantics?.name || elem.node.core.text,
386
+ nodeId: elem.node.core.nodeId,
387
+ };
388
+ }
389
+ return {
390
+ tree: textTree,
391
+ refs,
392
+ dualModeTree: tree,
393
+ metadata: {
394
+ engine: 'wootzapp',
395
+ timestamp: Date.now(),
396
+ url,
397
+ nodeCount: tree.nodeMap.size,
398
+ interactiveCount: tree.interactiveElements.length,
399
+ },
400
+ };
401
+ }
402
+ /**
403
+ * Get current page snapshot (no navigation)
404
+ */
405
+ async getCurrentPageSnapshot(options = {}) {
406
+ const response = await this.fetchCurrentPageTree();
407
+ const tree = this.buildTree(response);
408
+ const textTree = this.generateTextTree(tree, options);
409
+ // Build refs map
410
+ const refs = {};
411
+ for (const elem of tree.interactiveElements) {
412
+ refs[elem.ref] = {
413
+ selector: elem.selector || '',
414
+ role: elem.node.xrayMode?.semantics?.role || elem.node.core.className,
415
+ name: elem.node.xrayMode?.semantics?.name || elem.node.core.text,
416
+ nodeId: elem.node.core.nodeId,
417
+ };
418
+ }
419
+ // Get current URL from CDP
420
+ let currentUrl = '';
421
+ try {
422
+ const cdpClient = new CDPClient({
423
+ timeout: 5000,
424
+ commandTimeout: 5000,
425
+ });
426
+ const wsUrl = await CDPClient.getWebSocketDebuggerUrl(this.host, this.port);
427
+ await cdpClient.connect(wsUrl);
428
+ const target = await cdpClient.send('Target.getTargetInfo');
429
+ currentUrl = target.targetInfo?.url || '';
430
+ await cdpClient.close();
431
+ }
432
+ catch {
433
+ // Ignore errors, URL is optional
434
+ }
435
+ return {
436
+ tree: textTree,
437
+ refs,
438
+ dualModeTree: tree,
439
+ metadata: {
440
+ engine: 'wootzapp',
441
+ timestamp: Date.now(),
442
+ url: currentUrl,
443
+ nodeCount: tree.nodeMap.size,
444
+ interactiveCount: tree.interactiveElements.length,
445
+ },
446
+ };
447
+ }
448
+ }
449
+ //# sourceMappingURL=dualmode-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dualmode-fetcher.js","sourceRoot":"","sources":["../src/dualmode-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Type definitions for DualMode Accessibility Tree
3
+ *
4
+ * DualMode AXTree combines Android-like semantics with web accessibility,
5
+ * providing rich context for AI agents.
6
+ */
7
+ /**
8
+ * Core accessibility node properties (Android-like structure)
9
+ */
10
+ export interface DualModeAXNodeCore {
11
+ /** Unique node identifier */
12
+ nodeId: number;
13
+ /** Backend DOM node ID (links to browser DOM) */
14
+ backendNodeId?: number;
15
+ /** Android class name (e.g., "android.widget.Button", "android.view.View") */
16
+ className: string;
17
+ /** Array of child node IDs */
18
+ childrenIds: number[];
19
+ /** Parent node ID (null for root) */
20
+ parentId: number | null;
21
+ /** Text content of the node */
22
+ text?: string;
23
+ /** Content description (accessibility label) */
24
+ contentDescription?: string;
25
+ /** Whether the node is focusable */
26
+ focusable?: boolean;
27
+ /** Whether the node is clickable */
28
+ clickable?: boolean;
29
+ /** Whether the node is enabled */
30
+ enabled?: boolean;
31
+ /** Whether the node is checked (for checkboxes) */
32
+ checked?: boolean;
33
+ /** Whether the node is selected */
34
+ selected?: boolean;
35
+ /** Bounding box coordinates */
36
+ bounds?: {
37
+ left: number;
38
+ top: number;
39
+ right: number;
40
+ bottom: number;
41
+ };
42
+ /** Whether the node is visible to user */
43
+ visibleToUser?: boolean;
44
+ }
45
+ /**
46
+ * Enhanced semantic metadata for AI understanding
47
+ */
48
+ export interface DualModeXRaySemantics {
49
+ /** Web accessibility role (button, link, textbox, etc.) */
50
+ role: string;
51
+ /** Computed accessible name */
52
+ name?: string;
53
+ /** Element description */
54
+ description?: string;
55
+ /** Intent tags for agent decision-making */
56
+ intentTags?: string[];
57
+ /** Semantic category (navigation, form, content, etc.) */
58
+ category?: string;
59
+ /** Interaction hints */
60
+ interactions?: string[];
61
+ /** Visual context */
62
+ visualContext?: {
63
+ isAboveFold?: boolean;
64
+ isPrimary?: boolean;
65
+ prominence?: 'high' | 'medium' | 'low';
66
+ };
67
+ /** Form context */
68
+ formContext?: {
69
+ fieldType?: string;
70
+ required?: boolean;
71
+ validation?: string;
72
+ };
73
+ }
74
+ /**
75
+ * XRayMode metadata - enhanced perception layer
76
+ */
77
+ export interface DualModeXRayMode {
78
+ /** Enhanced semantics */
79
+ semantics?: DualModeXRaySemantics;
80
+ /** ML-generated insights */
81
+ insights?: {
82
+ /** Element importance score (0-1) */
83
+ importance?: number;
84
+ /** Predicted user intent */
85
+ predictedIntent?: string;
86
+ /** Task relevance tags */
87
+ taskTags?: string[];
88
+ };
89
+ /** Accessibility properties */
90
+ accessibility?: {
91
+ /** ARIA role */
92
+ ariaRole?: string;
93
+ /** ARIA attributes */
94
+ ariaAttributes?: Record<string, string>;
95
+ /** Landmark role */
96
+ landmark?: string;
97
+ };
98
+ /** DOM metadata */
99
+ dom?: {
100
+ /** HTML tag name */
101
+ tagName?: string;
102
+ /** ID attribute */
103
+ id?: string;
104
+ /** Class names */
105
+ classNames?: string[];
106
+ /** CSS selector path */
107
+ selector?: string;
108
+ };
109
+ }
110
+ /**
111
+ * Complete DualMode AX Node
112
+ */
113
+ export interface DualModeAXNode {
114
+ /** Core Android-like properties */
115
+ core: DualModeAXNodeCore;
116
+ /** Enhanced XRayMode metadata */
117
+ xrayMode?: DualModeXRayMode;
118
+ /** Child nodes (populated when building tree) */
119
+ children?: DualModeAXNode[];
120
+ }
121
+ /**
122
+ * CDP response for getDualModeAXTree command
123
+ */
124
+ export interface GetDualModeAXTreeResponse {
125
+ /** Flat array of nodes */
126
+ nodes: DualModeAXNode[];
127
+ }
128
+ /**
129
+ * Processed tree structure
130
+ */
131
+ export interface DualModeTree {
132
+ /** Root node */
133
+ root: DualModeAXNode;
134
+ /** Flat node lookup by nodeId */
135
+ nodeMap: Map<number, DualModeAXNode>;
136
+ /** Interactive elements with refs */
137
+ interactiveElements: Array<{
138
+ node: DualModeAXNode;
139
+ ref: string;
140
+ selector?: string;
141
+ }>;
142
+ }
143
+ /**
144
+ * DualMode snapshot options
145
+ */
146
+ export interface DualModeSnapshotOptions {
147
+ /** Only include interactive elements */
148
+ interactive?: boolean;
149
+ /** Maximum tree depth */
150
+ maxDepth?: number;
151
+ /** Include XRayMode metadata in output */
152
+ includeMetadata?: boolean;
153
+ /** Filter by intent tags */
154
+ intentFilter?: string[];
155
+ /** Minimum importance score (0-1) */
156
+ minImportance?: number;
157
+ }
158
+ /**
159
+ * Enhanced snapshot with DualMode tree
160
+ */
161
+ export interface DualModeEnhancedSnapshot {
162
+ /** Text tree representation */
163
+ tree: string;
164
+ /** Reference map for element interaction */
165
+ refs: Record<string, {
166
+ selector: string;
167
+ role: string;
168
+ name?: string;
169
+ nth?: number;
170
+ nodeId?: number;
171
+ }>;
172
+ /** Full DualMode tree structure */
173
+ dualModeTree?: DualModeTree;
174
+ /** Metadata */
175
+ metadata?: {
176
+ engine: 'wootzapp' | 'playwright';
177
+ timestamp: number;
178
+ url: string;
179
+ nodeCount: number;
180
+ interactiveCount: number;
181
+ };
182
+ }
183
+ //# sourceMappingURL=dualmode-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dualmode-types.d.ts","sourceRoot":"","sources":["../src/dualmode-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IAEf,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAElB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,+BAA+B;IAC/B,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IAEb,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,qBAAqB;IACrB,aAAa,CAAC,EAAE;QACd,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;KACxC,CAAC;IAEF,mBAAmB;IACnB,WAAW,CAAC,EAAE;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAElC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE;QACT,qCAAqC;QACrC,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB,4BAA4B;QAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;QAEzB,0BAA0B;QAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IAEF,+BAA+B;IAC/B,aAAa,CAAC,EAAE;QACd,gBAAgB;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB,sBAAsB;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAExC,oBAAoB;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,mBAAmB;IACnB,GAAG,CAAC,EAAE;QACJ,oBAAoB;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,mBAAmB;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QAEZ,kBAAkB;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QAEtB,wBAAwB;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,IAAI,EAAE,kBAAkB,CAAC;IAEzB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAE5B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,0BAA0B;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,IAAI,EAAE,cAAc,CAAC;IAErB,iCAAiC;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAErC,qCAAqC;IACrC,mBAAmB,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,cAAc,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,0CAA0C;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IAEb,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IAEH,mCAAmC;IACnC,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,eAAe;IACf,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Type definitions for DualMode Accessibility Tree
3
+ *
4
+ * DualMode AXTree combines Android-like semantics with web accessibility,
5
+ * providing rich context for AI agents.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=dualmode-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dualmode-types.js","sourceRoot":"","sources":["../src/dualmode-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}