browser-debugger-cli 0.6.1 → 0.6.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 (115) hide show
  1. package/README.md +55 -0
  2. package/dist/__tests__/smoke/error-handling.smoke.test.js +9 -4
  3. package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -1
  4. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +27 -24
  5. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -1
  6. package/dist/__testutils__/daemonHelpers.d.ts +13 -1
  7. package/dist/__testutils__/daemonHelpers.d.ts.map +1 -1
  8. package/dist/__testutils__/daemonHelpers.js +54 -5
  9. package/dist/__testutils__/daemonHelpers.js.map +1 -1
  10. package/dist/cdp/protocol.d.ts.map +1 -1
  11. package/dist/cdp/protocol.js +9 -7
  12. package/dist/cdp/protocol.js.map +1 -1
  13. package/dist/commands/cleanup.d.ts.map +1 -1
  14. package/dist/commands/cleanup.js +21 -6
  15. package/dist/commands/cleanup.js.map +1 -1
  16. package/dist/commands/dom/a11y.d.ts +18 -0
  17. package/dist/commands/dom/a11y.d.ts.map +1 -0
  18. package/dist/commands/dom/a11y.js +134 -0
  19. package/dist/commands/dom/a11y.js.map +1 -0
  20. package/dist/commands/dom/evalHelpers.js +1 -1
  21. package/dist/commands/dom/evalHelpers.js.map +1 -1
  22. package/dist/commands/dom/index.d.ts.map +1 -1
  23. package/dist/commands/dom/index.js +41 -20
  24. package/dist/commands/dom/index.js.map +1 -1
  25. package/dist/commands/peek.d.ts.map +1 -1
  26. package/dist/commands/peek.js +2 -0
  27. package/dist/commands/peek.js.map +1 -1
  28. package/dist/commands/stop.d.ts.map +1 -1
  29. package/dist/commands/stop.js +12 -4
  30. package/dist/commands/stop.js.map +1 -1
  31. package/dist/commands/types.d.ts +3 -0
  32. package/dist/commands/types.d.ts.map +1 -1
  33. package/dist/constants.d.ts +6 -0
  34. package/dist/constants.d.ts.map +1 -1
  35. package/dist/constants.js +6 -0
  36. package/dist/constants.js.map +1 -1
  37. package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts +19 -0
  38. package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts.map +1 -0
  39. package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js +212 -0
  40. package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js.map +1 -0
  41. package/dist/daemon/launcher.d.ts.map +1 -1
  42. package/dist/daemon/launcher.js +4 -3
  43. package/dist/daemon/launcher.js.map +1 -1
  44. package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
  45. package/dist/daemon/lifecycle/workerCleanup.js +1 -1
  46. package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
  47. package/dist/daemon/services/SessionService.js +1 -1
  48. package/dist/daemon/services/SessionService.js.map +1 -1
  49. package/dist/ipc/__tests__/client.contract.test.js +251 -19
  50. package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
  51. package/dist/ipc/__tests__/jsonl.unit.test.js +19 -1
  52. package/dist/ipc/__tests__/jsonl.unit.test.js.map +1 -1
  53. package/dist/ipc/transport/jsonl.d.ts +16 -0
  54. package/dist/ipc/transport/jsonl.d.ts.map +1 -1
  55. package/dist/ipc/transport/jsonl.js +25 -0
  56. package/dist/ipc/transport/jsonl.js.map +1 -1
  57. package/dist/session/chrome.js +2 -2
  58. package/dist/session/chrome.js.map +1 -1
  59. package/dist/session/cleanup.d.ts +21 -0
  60. package/dist/session/cleanup.d.ts.map +1 -1
  61. package/dist/session/cleanup.js +101 -1
  62. package/dist/session/cleanup.js.map +1 -1
  63. package/dist/session/lock.js +1 -1
  64. package/dist/session/lock.js.map +1 -1
  65. package/dist/telemetry/__tests__/a11y.unit.test.d.ts +10 -0
  66. package/dist/telemetry/__tests__/a11y.unit.test.d.ts.map +1 -0
  67. package/dist/telemetry/__tests__/a11y.unit.test.js +265 -0
  68. package/dist/telemetry/__tests__/a11y.unit.test.js.map +1 -0
  69. package/dist/telemetry/a11y.d.ts +78 -0
  70. package/dist/telemetry/a11y.d.ts.map +1 -0
  71. package/dist/telemetry/a11y.js +280 -0
  72. package/dist/telemetry/a11y.js.map +1 -0
  73. package/dist/telemetry/dom.d.ts +1 -1
  74. package/dist/telemetry/dom.d.ts.map +1 -1
  75. package/dist/telemetry/dom.js +32 -1
  76. package/dist/telemetry/dom.js.map +1 -1
  77. package/dist/types.d.ts +77 -0
  78. package/dist/types.d.ts.map +1 -1
  79. package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts +2 -0
  80. package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts.map +1 -0
  81. package/dist/ui/formatters/__tests__/semantic.unit.test.js +111 -0
  82. package/dist/ui/formatters/__tests__/semantic.unit.test.js.map +1 -0
  83. package/dist/ui/formatters/a11y.d.ts +30 -0
  84. package/dist/ui/formatters/a11y.d.ts.map +1 -0
  85. package/dist/ui/formatters/a11y.js +178 -0
  86. package/dist/ui/formatters/a11y.js.map +1 -0
  87. package/dist/ui/formatters/preview.d.ts +2 -0
  88. package/dist/ui/formatters/preview.d.ts.map +1 -1
  89. package/dist/ui/formatters/preview.js +27 -4
  90. package/dist/ui/formatters/preview.js.map +1 -1
  91. package/dist/ui/formatters/semantic.d.ts +36 -0
  92. package/dist/ui/formatters/semantic.d.ts.map +1 -0
  93. package/dist/ui/formatters/semantic.js +98 -0
  94. package/dist/ui/formatters/semantic.js.map +1 -0
  95. package/dist/ui/formatters/status.js +1 -1
  96. package/dist/ui/formatters/status.js.map +1 -1
  97. package/dist/ui/messages/commands.d.ts +7 -0
  98. package/dist/ui/messages/commands.d.ts.map +1 -1
  99. package/dist/ui/messages/commands.js +9 -0
  100. package/dist/ui/messages/commands.js.map +1 -1
  101. package/dist/utils/__tests__/errors.unit.test.d.ts +12 -0
  102. package/dist/utils/__tests__/errors.unit.test.d.ts.map +1 -0
  103. package/dist/utils/__tests__/errors.unit.test.js +255 -0
  104. package/dist/utils/__tests__/errors.unit.test.js.map +1 -0
  105. package/dist/utils/__tests__/http.unit.test.d.ts +12 -0
  106. package/dist/utils/__tests__/http.unit.test.d.ts.map +1 -0
  107. package/dist/utils/__tests__/http.unit.test.js +218 -0
  108. package/dist/utils/__tests__/http.unit.test.js.map +1 -0
  109. package/dist/utils/__tests__/process.unit.test.d.ts +14 -0
  110. package/dist/utils/__tests__/process.unit.test.d.ts.map +1 -0
  111. package/dist/utils/__tests__/process.unit.test.js +124 -0
  112. package/dist/utils/__tests__/process.unit.test.js.map +1 -0
  113. package/dist/utils/__tests__/session.contract.test.js +1 -1
  114. package/dist/utils/__tests__/session.contract.test.js.map +1 -1
  115. package/package.json +22 -1
@@ -0,0 +1,280 @@
1
+ import { callCDP } from '../ipc/client.js';
2
+ /**
3
+ * Builds accessibility tree from raw CDP nodes.
4
+ *
5
+ * Pure function that filters out ignored nodes and builds the tree structure.
6
+ * Separated from collectA11yTree for easier unit testing.
7
+ *
8
+ * @param rawNodes - Raw AXNode array from CDP
9
+ * @returns Parsed accessibility tree
10
+ * @throws Error if no root node found
11
+ */
12
+ export function buildTreeFromRawNodes(rawNodes) {
13
+ const nodes = new Map();
14
+ let root = null;
15
+ for (const rawNode of rawNodes) {
16
+ if (rawNode.ignored) {
17
+ continue;
18
+ }
19
+ const node = parseA11yNode(rawNode);
20
+ nodes.set(node.nodeId, node);
21
+ root ??= node;
22
+ }
23
+ if (!root) {
24
+ throw new Error('No root node found in accessibility tree');
25
+ }
26
+ return {
27
+ root,
28
+ nodes,
29
+ count: nodes.size,
30
+ };
31
+ }
32
+ /**
33
+ * Collects the full accessibility tree from the page via IPC.
34
+ *
35
+ * Uses the worker's persistent CDP connection through callCDP for consistency
36
+ * with other DOM commands and to avoid connection conflicts.
37
+ *
38
+ * @returns Parsed and filtered accessibility tree
39
+ * @throws Error if CDP Accessibility domain fails
40
+ */
41
+ export async function collectA11yTree() {
42
+ await callCDP('Accessibility.enable', {});
43
+ try {
44
+ const response = await callCDP('Accessibility.getFullAXTree', {});
45
+ const result = response.data?.result;
46
+ if (!result?.nodes) {
47
+ throw new Error('Failed to get accessibility tree');
48
+ }
49
+ return buildTreeFromRawNodes(result.nodes);
50
+ }
51
+ finally {
52
+ await callCDP('Accessibility.disable', {});
53
+ }
54
+ }
55
+ /**
56
+ * Parses raw CDP AXNode into simplified A11yNode format.
57
+ *
58
+ * Extracts key properties (role, name, description, value) and common
59
+ * ARIA properties (focusable, focused, disabled, required).
60
+ *
61
+ * @param rawNode - Raw AXNode from CDP
62
+ * @returns Simplified A11yNode
63
+ */
64
+ function parseA11yNode(rawNode) {
65
+ const node = {
66
+ nodeId: rawNode.nodeId,
67
+ role: extractRole(rawNode),
68
+ };
69
+ if (rawNode.name?.value) {
70
+ node.name = String(rawNode.name.value);
71
+ }
72
+ if (rawNode.description?.value) {
73
+ node.description = String(rawNode.description.value);
74
+ }
75
+ if (rawNode.value?.value) {
76
+ node.value = String(rawNode.value.value);
77
+ }
78
+ if (rawNode.properties) {
79
+ const props = {};
80
+ for (const prop of rawNode.properties) {
81
+ if (prop.name === 'focusable') {
82
+ node.focusable = prop.value.value === true;
83
+ }
84
+ else if (prop.name === 'focused') {
85
+ node.focused = prop.value.value === true;
86
+ }
87
+ else if (prop.name === 'disabled') {
88
+ node.disabled = prop.value.value === true;
89
+ }
90
+ else if (prop.name === 'required') {
91
+ node.required = prop.value.value === true;
92
+ }
93
+ else {
94
+ props[prop.name] = prop.value.value;
95
+ }
96
+ }
97
+ if (Object.keys(props).length > 0) {
98
+ node.properties = props;
99
+ }
100
+ }
101
+ if (rawNode.childIds && rawNode.childIds.length > 0) {
102
+ node.childIds = rawNode.childIds;
103
+ }
104
+ if (rawNode.backendDOMNodeId) {
105
+ node.backendDOMNodeId = rawNode.backendDOMNodeId;
106
+ }
107
+ return node;
108
+ }
109
+ /**
110
+ * Extracts role string from AXNode.
111
+ *
112
+ * Prefers explicit role over Chrome internal role.
113
+ *
114
+ * @param rawNode - Raw AXNode from CDP
115
+ * @returns Role string (e.g., 'button', 'textbox', 'heading')
116
+ */
117
+ function extractRole(rawNode) {
118
+ if (rawNode.role?.value) {
119
+ return String(rawNode.role.value);
120
+ }
121
+ return 'unknown';
122
+ }
123
+ /**
124
+ * Queries accessibility tree by pattern (role, name, description).
125
+ *
126
+ * Performs case-insensitive matching with AND logic for multiple fields.
127
+ *
128
+ * @param tree - Accessibility tree to search
129
+ * @param pattern - Query pattern with optional role, name, description
130
+ * @returns Query result with matching nodes
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * // Find submit buttons
135
+ * queryA11yTree(tree, { role: 'button', name: 'Submit' });
136
+ *
137
+ * // Find all textboxes
138
+ * queryA11yTree(tree, { role: 'textbox' });
139
+ *
140
+ * // Find by name only
141
+ * queryA11yTree(tree, { name: 'Email' });
142
+ * ```
143
+ */
144
+ export function queryA11yTree(tree, pattern) {
145
+ const matches = [];
146
+ for (const node of tree.nodes.values()) {
147
+ if (matchesPattern(node, pattern)) {
148
+ matches.push(node);
149
+ }
150
+ }
151
+ return {
152
+ nodes: matches,
153
+ count: matches.length,
154
+ pattern,
155
+ };
156
+ }
157
+ /**
158
+ * Checks if a node matches the query pattern.
159
+ *
160
+ * All specified fields must match (AND logic).
161
+ * String matching is case-insensitive.
162
+ *
163
+ * @param node - A11y node to test
164
+ * @param pattern - Query pattern
165
+ * @returns True if node matches all pattern criteria
166
+ */
167
+ function matchesPattern(node, pattern) {
168
+ if (pattern.role) {
169
+ if (node.role.toLowerCase() !== pattern.role.toLowerCase()) {
170
+ return false;
171
+ }
172
+ }
173
+ if (pattern.name) {
174
+ if (!node.name) {
175
+ return false;
176
+ }
177
+ if (!node.name.toLowerCase().includes(pattern.name.toLowerCase())) {
178
+ return false;
179
+ }
180
+ }
181
+ if (pattern.description) {
182
+ if (!node.description) {
183
+ return false;
184
+ }
185
+ if (!node.description.toLowerCase().includes(pattern.description.toLowerCase())) {
186
+ return false;
187
+ }
188
+ }
189
+ return true;
190
+ }
191
+ /**
192
+ * Parses query pattern string into A11yQueryPattern object.
193
+ *
194
+ * Supports format: "role:button name:Submit description:Main"
195
+ * Fields are separated by spaces, case-insensitive.
196
+ *
197
+ * @param patternString - Query pattern string
198
+ * @returns Parsed query pattern
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * parseQueryPattern('role:button name:Submit')
203
+ * // => { role: 'button', name: 'Submit' }
204
+ *
205
+ * parseQueryPattern('role:textbox')
206
+ * // => { role: 'textbox' }
207
+ *
208
+ * parseQueryPattern('name:Email')
209
+ * // => { name: 'Email' }
210
+ * ```
211
+ */
212
+ export function parseQueryPattern(patternString) {
213
+ const pattern = {};
214
+ const parts = patternString.trim().split(/\s+/);
215
+ for (const part of parts) {
216
+ const [key, ...valueParts] = part.split(':');
217
+ const value = valueParts.join(':');
218
+ if (!value) {
219
+ continue;
220
+ }
221
+ if (!key) {
222
+ continue;
223
+ }
224
+ const normalizedKey = key.toLowerCase();
225
+ if (normalizedKey === 'role') {
226
+ pattern.role = value;
227
+ }
228
+ else if (normalizedKey === 'name') {
229
+ pattern.name = value;
230
+ }
231
+ else if (normalizedKey === 'description' || normalizedKey === 'desc') {
232
+ pattern.description = value;
233
+ }
234
+ }
235
+ return pattern;
236
+ }
237
+ /**
238
+ * Gets accessibility properties for a DOM node by CSS selector via IPC.
239
+ *
240
+ * Uses the worker's persistent CDP connection through callCDP for consistency.
241
+ *
242
+ * @param selector - CSS selector
243
+ * @returns A11y node or null if not found
244
+ * @throws Error if selector is invalid or element not found
245
+ */
246
+ export async function getA11yNodeBySelector(selector) {
247
+ await callCDP('Accessibility.enable', {});
248
+ try {
249
+ const docResponse = await callCDP('DOM.getDocument', {});
250
+ const doc = docResponse.data?.result;
251
+ if (!doc?.root?.nodeId) {
252
+ throw new Error('Failed to get document root');
253
+ }
254
+ const nodeResponse = await callCDP('DOM.querySelector', {
255
+ nodeId: doc.root.nodeId,
256
+ selector,
257
+ });
258
+ const nodeResult = nodeResponse.data?.result;
259
+ if (!nodeResult?.nodeId) {
260
+ return null;
261
+ }
262
+ const a11yResponse = await callCDP('Accessibility.getPartialAXTree', {
263
+ nodeId: nodeResult.nodeId,
264
+ fetchRelatives: false,
265
+ });
266
+ const a11yResult = a11yResponse.data?.result;
267
+ if (!a11yResult?.nodes) {
268
+ return null;
269
+ }
270
+ const rawNode = a11yResult.nodes.find((n) => !n.ignored);
271
+ if (!rawNode) {
272
+ return null;
273
+ }
274
+ return parseA11yNode(rawNode);
275
+ }
276
+ finally {
277
+ await callCDP('Accessibility.disable', {});
278
+ }
279
+ }
280
+ //# sourceMappingURL=a11y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../src/telemetry/a11y.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ export declare function prepareDOMCollection(cdp: CDPConnection): Promise<Cleanu
15
15
  * Called during session shutdown to get the final state of the page.
16
16
  *
17
17
  * @param cdp - CDP connection instance
18
- * @returns DOM data including URL, title, and full HTML
18
+ * @returns DOM data including URL, title, full HTML, and A11y tree
19
19
  */
20
20
  export declare function collectDOM(cdp: CDPConnection): Promise<DOMData>;
21
21
  //# sourceMappingURL=dom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQxD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAcvF;AA6DD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBrE"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAY,MAAM,SAAS,CAAC;AASlE;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAcvF;AAmGD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBrE"}
@@ -1,5 +1,6 @@
1
1
  import { getErrorMessage } from '../connection/errors.js';
2
2
  import { createLogger } from '../ui/logging/index.js';
3
+ import { buildTreeFromRawNodes } from './a11y.js';
3
4
  import { withTimeout } from './utils.js';
4
5
  const log = createLogger('dom');
5
6
  const CDP_TIMEOUT = 5000;
@@ -65,13 +66,41 @@ async function getDocumentTitle(cdp) {
65
66
  }
66
67
  return 'Untitled';
67
68
  }
69
+ /**
70
+ * Capture accessibility tree from the current page.
71
+ *
72
+ * @param cdp - CDP connection instance
73
+ * @returns A11y tree with nodes serialized as plain object, or undefined on error
74
+ */
75
+ async function collectA11yTree(cdp) {
76
+ try {
77
+ await cdp.send('Accessibility.enable');
78
+ const response = (await withTimeout(cdp.send('Accessibility.getFullAXTree', {}), CDP_TIMEOUT, 'Accessibility.getFullAXTree'));
79
+ if (!response.nodes) {
80
+ return undefined;
81
+ }
82
+ const tree = buildTreeFromRawNodes(response.nodes);
83
+ await cdp.send('Accessibility.disable').catch(() => {
84
+ /* Ignore errors */
85
+ });
86
+ return {
87
+ root: tree.root,
88
+ nodes: Object.fromEntries(tree.nodes),
89
+ count: tree.count,
90
+ };
91
+ }
92
+ catch (error) {
93
+ log.debug(`A11y tree capture failed: ${getErrorMessage(error)}`);
94
+ return undefined;
95
+ }
96
+ }
68
97
  /**
69
98
  * Capture a complete DOM snapshot of the current page.
70
99
  *
71
100
  * Called during session shutdown to get the final state of the page.
72
101
  *
73
102
  * @param cdp - CDP connection instance
74
- * @returns DOM data including URL, title, and full HTML
103
+ * @returns DOM data including URL, title, full HTML, and A11y tree
75
104
  */
76
105
  export async function collectDOM(cdp) {
77
106
  try {
@@ -79,10 +108,12 @@ export async function collectDOM(cdp) {
79
108
  const outerHTML = await getOuterHTML(cdp, root.nodeId);
80
109
  const frame = await getMainFrame(cdp);
81
110
  const title = await getDocumentTitle(cdp);
111
+ const a11yTree = await collectA11yTree(cdp);
82
112
  return {
83
113
  url: frame.url,
84
114
  title,
85
115
  outerHTML,
116
+ ...(a11yTree && { a11yTree }),
86
117
  };
87
118
  }
88
119
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -10,6 +10,11 @@ export interface DOMData {
10
10
  url: string;
11
11
  title: string;
12
12
  outerHTML: string;
13
+ a11yTree?: {
14
+ root: A11yNode;
15
+ nodes: Record<string, A11yNode>;
16
+ count: number;
17
+ };
13
18
  }
14
19
  export interface NetworkRequest {
15
20
  requestId: string;
@@ -49,4 +54,76 @@ export interface BdgOutput {
49
54
  partial?: boolean;
50
55
  }
51
56
  export type TelemetryType = 'dom' | 'network' | 'console';
57
+ /**
58
+ * Accessibility tree node with filtered and formatted data.
59
+ *
60
+ * This is a simplified representation of Protocol.Accessibility.AXNode
61
+ * optimized for agent consumption and semantic queries.
62
+ */
63
+ export interface A11yNode {
64
+ /** Unique node identifier from CDP */
65
+ nodeId: string;
66
+ /** ARIA role (button, textbox, heading, etc.) */
67
+ role: string;
68
+ /** Accessible name (computed label) */
69
+ name?: string;
70
+ /** Accessible description */
71
+ description?: string;
72
+ /** Node value (for inputs, textareas, etc.) */
73
+ value?: string;
74
+ /** Whether node is focusable */
75
+ focusable?: boolean;
76
+ /** Whether node is currently focused */
77
+ focused?: boolean;
78
+ /** Whether node is disabled */
79
+ disabled?: boolean;
80
+ /** Whether field is required (forms) */
81
+ required?: boolean;
82
+ /** Additional ARIA properties */
83
+ properties?: Record<string, unknown>;
84
+ /** Child node IDs */
85
+ childIds?: string[];
86
+ /** Associated DOM node ID for querying */
87
+ backendDOMNodeId?: number;
88
+ }
89
+ /**
90
+ * Accessibility tree data structure.
91
+ */
92
+ export interface A11yTree {
93
+ /** Root node of the tree */
94
+ root: A11yNode;
95
+ /** All nodes indexed by nodeId for fast lookup */
96
+ nodes: Map<string, A11yNode>;
97
+ /** Total node count */
98
+ count: number;
99
+ }
100
+ /**
101
+ * Query pattern for searching accessibility tree.
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * { role: 'button', name: 'Submit' }
106
+ * { role: 'textbox' }
107
+ * { name: 'Email' }
108
+ * ```
109
+ */
110
+ export interface A11yQueryPattern {
111
+ /** Filter by ARIA role */
112
+ role?: string;
113
+ /** Filter by accessible name (case-insensitive) */
114
+ name?: string;
115
+ /** Filter by accessible description (case-insensitive) */
116
+ description?: string;
117
+ }
118
+ /**
119
+ * Result from A11y query operation.
120
+ */
121
+ export interface A11yQueryResult {
122
+ /** Matching nodes */
123
+ nodes: A11yNode[];
124
+ /** Total matches found */
125
+ count: number;
126
+ /** Query pattern used */
127
+ pattern: A11yQueryPattern;
128
+ }
52
129
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;;;GAKG;AACH,YAAY,EACV,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=semantic.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/ui/formatters/__tests__/semantic.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, test } from 'node:test';
3
+ import { semantic } from '../../../ui/formatters/semantic.js';
4
+ describe('semantic formatter', () => {
5
+ test('formats simple tree with indentation', () => {
6
+ const tree = {
7
+ root: { nodeId: '1', role: 'RootWebArea', name: 'Test Page' },
8
+ nodes: new Map([
9
+ ['1', { nodeId: '1', role: 'RootWebArea', name: 'Test Page', childIds: ['2'] }],
10
+ ['2', { nodeId: '2', role: 'button', name: 'Click me', focusable: true }],
11
+ ]),
12
+ count: 2,
13
+ };
14
+ const output = semantic(tree);
15
+ assert.equal(output, '[RootWebArea] "Test Page"\n [Button] "Click me" (focusable)');
16
+ });
17
+ test('handles heading levels', () => {
18
+ const tree = {
19
+ root: { nodeId: '1', role: 'heading', properties: { level: '1' } },
20
+ nodes: new Map([
21
+ ['1', { nodeId: '1', role: 'heading', name: 'Main Title', properties: { level: '1' } }],
22
+ ]),
23
+ count: 1,
24
+ };
25
+ const output = semantic(tree);
26
+ assert.equal(output, '[Heading L1] "Main Title"');
27
+ });
28
+ test('shows multiple properties', () => {
29
+ const node = {
30
+ nodeId: '1',
31
+ role: 'textbox',
32
+ name: 'Email',
33
+ focusable: true,
34
+ required: true,
35
+ disabled: false,
36
+ };
37
+ const tree = {
38
+ root: node,
39
+ nodes: new Map([['1', node]]),
40
+ count: 1,
41
+ };
42
+ const output = semantic(tree);
43
+ assert.equal(output, '[Textbox] "Email" (focusable, required)');
44
+ });
45
+ test('omits name when not present', () => {
46
+ const tree = {
47
+ root: { nodeId: '1', role: 'generic' },
48
+ nodes: new Map([
49
+ ['1', { nodeId: '1', role: 'generic', childIds: ['2'] }],
50
+ ['2', { nodeId: '2', role: 'paragraph', name: 'Text' }],
51
+ ]),
52
+ count: 2,
53
+ };
54
+ const output = semantic(tree);
55
+ assert.equal(output, '[Generic]\n [Paragraph] "Text"');
56
+ });
57
+ test('handles deep nesting', () => {
58
+ const tree = {
59
+ root: { nodeId: '1', role: 'RootWebArea', childIds: ['2'] },
60
+ nodes: new Map([
61
+ ['1', { nodeId: '1', role: 'RootWebArea', childIds: ['2'] }],
62
+ ['2', { nodeId: '2', role: 'main', childIds: ['3'] }],
63
+ ['3', { nodeId: '3', role: 'navigation', childIds: ['4'] }],
64
+ ['4', { nodeId: '4', role: 'link', name: 'Home' }],
65
+ ]),
66
+ count: 4,
67
+ };
68
+ const output = semantic(tree);
69
+ assert.equal(output, '[RootWebArea]\n [Main]\n [Navigation]\n [Link] "Home"');
70
+ });
71
+ test('handles all boolean properties', () => {
72
+ const node = {
73
+ nodeId: '1',
74
+ role: 'button',
75
+ name: 'Submit',
76
+ focusable: true,
77
+ focused: true,
78
+ disabled: true,
79
+ required: true,
80
+ };
81
+ const tree = {
82
+ root: node,
83
+ nodes: new Map([['1', node]]),
84
+ count: 1,
85
+ };
86
+ const output = semantic(tree);
87
+ assert.equal(output, '[Button] "Submit" (focusable, focused, disabled, required)');
88
+ });
89
+ test('handles nodes without children', () => {
90
+ const tree = {
91
+ root: { nodeId: '1', role: 'button', name: 'Click' },
92
+ nodes: new Map([['1', { nodeId: '1', role: 'button', name: 'Click' }]]),
93
+ count: 1,
94
+ };
95
+ const output = semantic(tree);
96
+ assert.equal(output, '[Button] "Click"');
97
+ });
98
+ test('capitalizes role names', () => {
99
+ const tree = {
100
+ root: { nodeId: '1', role: 'navigation' },
101
+ nodes: new Map([
102
+ ['1', { nodeId: '1', role: 'navigation', childIds: ['2'] }],
103
+ ['2', { nodeId: '2', role: 'searchbox', name: 'Search' }],
104
+ ]),
105
+ count: 2,
106
+ };
107
+ const output = semantic(tree);
108
+ assert.equal(output, '[Navigation]\n [Searchbox] "Search"');
109
+ });
110
+ });
111
+ //# sourceMappingURL=semantic.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.unit.test.js","sourceRoot":"","sources":["../../../../src/ui/formatters/__tests__/semantic.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { A11yTree, A11yQueryResult, A11yNode } from '../../types.js';
2
+ /**
3
+ * Format accessibility tree for human-readable output.
4
+ *
5
+ * Displays the tree structure with role, name, and key properties.
6
+ * Shows up to 50 nodes by default for manageable output.
7
+ *
8
+ * @param tree - Accessibility tree data
9
+ * @returns Formatted output string
10
+ */
11
+ export declare function formatA11yTree(tree: A11yTree): string;
12
+ /**
13
+ * Format query result for human-readable output.
14
+ *
15
+ * Shows matching nodes with their role, name, and properties.
16
+ *
17
+ * @param result - Query result with matching nodes
18
+ * @returns Formatted output string
19
+ */
20
+ export declare function formatA11yQueryResult(result: A11yQueryResult): string;
21
+ /**
22
+ * Format single accessibility node for human-readable output.
23
+ *
24
+ * Shows detailed properties including role, name, description, value, and states.
25
+ *
26
+ * @param node - Accessibility node
27
+ * @returns Formatted output string
28
+ */
29
+ export declare function formatA11yNode(node: A11yNode): string;
30
+ //# sourceMappingURL=a11y.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/ui/formatters/a11y.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AActE;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAmBrD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAyBrE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CA8CrD"}