ax-grep 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +71 -119
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/{chunk-U3GDKPLQ.js → chunk-HPZ32BKV.js} +37 -3
- package/dist/chunk-HPZ32BKV.js.map +1 -0
- package/dist/{chunk-Z7V6PIPH.js → chunk-ZXTURCRT.js} +214 -24
- package/dist/chunk-ZXTURCRT.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +22364 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +38 -4
- package/dist/index.js.map +1 -1
- package/dist/static.d.ts +1 -1
- package/dist/static.js +1 -1
- package/dist/types-gwHWhYmw.d.ts +3660 -0
- package/docs/README.md +19 -0
- package/docs/agent-handoff.md +95 -0
- package/docs/agent-readiness.md +38 -0
- package/docs/assets/ax-grep-benchmark.png +0 -0
- package/docs/assets/ax-grep-og.png +0 -0
- package/docs/assets/ax-grep-search.png +0 -0
- package/docs/benchmarks.md +123 -0
- package/docs/cli-agent.md +194 -0
- package/docs/comparison-baseline.md +625 -0
- package/docs/features.md +28 -0
- package/docs/library-api.md +211 -0
- package/docs/progress.md +1306 -0
- package/package.json +33 -3
- package/skills/ax-grep-cli/SKILL.md +89 -0
- package/skills.sh +24 -0
- package/dist/chunk-U3GDKPLQ.js.map +0 -1
- package/dist/chunk-Z7V6PIPH.js.map +0 -1
- package/dist/types-dgf3brcf.d.ts +0 -74
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 hmmhmmhm
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,157 +1,109 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
1
3
|
# ax-grep
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/ax-grep)
|
|
6
|
+
[](./tests)
|
|
7
|
+
[](./LICENSE)
|
|
8
|
+
[](./docs/agent-handoff.md)
|
|
9
|
+
[](./skills/ax-grep-cli/SKILL.md)
|
|
10
|
+
[](./docs/cli-agent.md)
|
|
11
|
+
[](./docs/cli-agent.md)
|
|
6
12
|
|
|
7
|
-
|
|
8
|
-
one from DOM, ARIA, computed style, labels, focusability, and element state.
|
|
13
|
+
<img src="./docs/assets/ax-grep-og.png" alt="ax-grep promo image" width="920">
|
|
9
14
|
|
|
10
|
-
|
|
15
|
+
<img src="./docs/assets/ax-grep-benchmark.png" alt="ax-grep benchmark comparison image" width="920">
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
pnpm add ax-grep
|
|
14
|
-
```
|
|
17
|
+
<img src="./docs/assets/ax-grep-search.png" alt="ax-grep auto search comparison image" width="920">
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
Compact semantic trees and agent-ready page checks from HTML, URLs, WebViews, and live browser pages.
|
|
20
|
+
It approximates the accessibility tree browsers expose, but can do it from
|
|
21
|
+
static HTML before launching browser automation.
|
|
17
22
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
| You want the explicit Worker-oriented static entry | `extract(html)` from `ax-grep/static` |
|
|
23
|
+
The CLI defaults to `impit` for browser-like HTTP/2/TLS static fetches, detects
|
|
24
|
+
hCaptcha, reCAPTCHA, and Cloudflare challenge markers, then tells agents when a
|
|
25
|
+
browser is actually needed. In the local benchmark, the decision handoff used
|
|
26
|
+
15.4x less peak RAM on average and 3.0x fewer decision tokens on the content
|
|
27
|
+
fixture than `agent-browser snapshot`.
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
`--search` auto mode tries DuckDuckGo, Bing, and StartPage, records every
|
|
30
|
+
engine attempt, and hands ranked source choices back to the agent.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
import { extract } from "ax-grep";
|
|
32
|
+
</div>
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
const html = await response.text();
|
|
32
|
-
const tree = extract(html);
|
|
33
|
-
```
|
|
34
|
+
## 1. Try With A Prompt
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
you want the smallest Worker-oriented import.
|
|
36
|
+
Paste this into a Codex session or subagent prompt before opening a browser:
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
```md
|
|
39
|
+
Before opening a browser, inspect pages with ax-grep when possible.
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
Run:
|
|
42
|
+
npx --yes ax-grep@latest <url> --agent-brief
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
Read agent.executor, agent.handoff, agent.readTargets, pageCheck, and
|
|
45
|
+
verification first. Open a browser only when the payload says static HTML is
|
|
46
|
+
not enough.
|
|
44
47
|
```
|
|
45
48
|
|
|
46
|
-
|
|
49
|
+
## 2. Install The CLI Skill
|
|
47
50
|
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
import { createExtractorScript, formatSemanticTreeText } from "ax-grep";
|
|
51
|
-
|
|
52
|
-
const browser = await chromium.launch();
|
|
53
|
-
const page = await browser.newPage();
|
|
54
|
-
|
|
55
|
-
await page.goto("https://example.com");
|
|
56
|
-
|
|
57
|
-
const tree = await page.evaluate(createExtractorScript({
|
|
58
|
-
includeBounds: false,
|
|
59
|
-
includeAttributes: false,
|
|
60
|
-
}));
|
|
61
|
-
|
|
62
|
-
console.log(formatSemanticTreeText(tree));
|
|
63
|
-
|
|
64
|
-
await browser.close();
|
|
51
|
+
```sh
|
|
52
|
+
curl -fsSL https://raw.githubusercontent.com/hmmhmmhm/ax-grep/main/skills.sh | sh
|
|
65
53
|
```
|
|
66
54
|
|
|
67
|
-
|
|
55
|
+
This installs the Codex skill prompt only. Restart Codex if the new skill is not listed immediately.
|
|
68
56
|
|
|
69
|
-
|
|
70
|
-
import { createExtractorScript } from "ax-grep";
|
|
71
|
-
|
|
72
|
-
const script = createExtractorScript({
|
|
73
|
-
mode: "interactive",
|
|
74
|
-
format: "json",
|
|
75
|
-
});
|
|
57
|
+
## 3. Try The CLI
|
|
76
58
|
|
|
77
|
-
|
|
78
|
-
|
|
59
|
+
```sh
|
|
60
|
+
npx --yes ax-grep@latest https://example.com --agent-brief
|
|
79
61
|
```
|
|
80
62
|
|
|
81
|
-
|
|
63
|
+
If you installed the binary globally, use `ax-grep` directly.
|
|
64
|
+
Agents should read `agent.executor`, `agent.handoff`, `agent.readTargets`,
|
|
65
|
+
`pageCheck`, and `verification` first. Open a browser only when the handoff
|
|
66
|
+
fields say static HTML is not enough.
|
|
82
67
|
|
|
83
|
-
|
|
84
|
-
import { extract, formatSemanticTreeText } from "ax-grep/browser";
|
|
68
|
+
## 4. Use From A Server
|
|
85
69
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
});
|
|
70
|
+
Use this inside agent services built with Codex SDK, OpenRouter, or similar
|
|
71
|
+
LLM routing stacks to turn fetched HTML into compact source evidence before
|
|
72
|
+
spending tokens or memory on browser automation.
|
|
90
73
|
|
|
91
|
-
|
|
74
|
+
```sh
|
|
75
|
+
npm install ax-grep
|
|
92
76
|
```
|
|
93
77
|
|
|
94
|
-
## Static SSR HTML
|
|
95
|
-
|
|
96
78
|
```ts
|
|
97
|
-
import { extract } from "ax-grep
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const url = new URL(request.url).searchParams.get("url");
|
|
103
|
-
if (!url) return new Response("Missing url", { status: 400 });
|
|
104
|
-
|
|
105
|
-
const response = await fetch(url);
|
|
106
|
-
const html = await response.text();
|
|
107
|
-
const tree = extract(html);
|
|
108
|
-
|
|
109
|
-
return new Response(formatSemanticTreeText(tree), {
|
|
110
|
-
headers: { "content-type": "text/plain; charset=utf-8" },
|
|
111
|
-
});
|
|
112
|
-
},
|
|
113
|
-
};
|
|
79
|
+
import { extract, formatSemanticTreeText } from "ax-grep";
|
|
80
|
+
|
|
81
|
+
const html = await fetch("https://example.com").then((r) => r.text());
|
|
82
|
+
const tree = extract(html);
|
|
83
|
+
const promptText = formatSemanticTreeText(tree);
|
|
114
84
|
```
|
|
115
85
|
|
|
116
|
-
|
|
117
|
-
labels, ARIA state, links, forms, headings, tables, and lists from SSR markup. It
|
|
118
|
-
cannot see computed style, layout bounds, client-rendered DOM, shadow DOM, or
|
|
119
|
-
iframe contents.
|
|
86
|
+
`ax-grep` is ESM-only and requires Node 18 or newer. CommonJS services can use `const { extract } = await import("ax-grep")`.
|
|
120
87
|
|
|
121
|
-
|
|
122
|
-
regions, skips non-semantic payload tags, summarizes very large child lists, and
|
|
123
|
-
collapses repeated template-like subtrees. It also infers broad source profiles
|
|
124
|
-
from the HTML, preserving more links for wiki-like pages while tightening dense
|
|
125
|
-
link-list summarization for forum-like pages.
|
|
88
|
+
## 5. Use In WebViews Or Pages
|
|
126
89
|
|
|
127
|
-
|
|
90
|
+
In mobile apps, WebViews, and in-page agents, inject the extractor to create an
|
|
91
|
+
accessibility-style structure immediately from the current page. It is useful
|
|
92
|
+
for local sLLM web search, local web parsing, and instant agent-ready page
|
|
93
|
+
summaries without leaving the app.
|
|
128
94
|
|
|
129
95
|
```ts
|
|
130
|
-
import {
|
|
131
|
-
|
|
132
|
-
const observer = observeSemanticTree((change) => {
|
|
133
|
-
console.log(change.mutationCount, change.tree);
|
|
134
|
-
}, { debounceMs: 50 });
|
|
135
|
-
|
|
136
|
-
observer.disconnect();
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
For injected-script use, `createObserverScript()` installs an observer on
|
|
140
|
-
`window.__AX_LITE_OBSERVER__` and dispatches `__AX_LITE_OBSERVER__:change`
|
|
141
|
-
events.
|
|
142
|
-
|
|
143
|
-
## Benchmarking
|
|
96
|
+
import { createExtractorScript } from "ax-grep";
|
|
144
97
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
pnpm compare:tokens https://example.com https://news.ycombinator.com
|
|
149
|
-
pnpm compare:static:korea-social
|
|
150
|
-
pnpm compare:tokens:korea-social
|
|
151
|
-
pnpm compare:static:china-japan
|
|
152
|
-
pnpm compare:tokens:china-japan
|
|
98
|
+
const script = createExtractorScript({ format: "text" });
|
|
99
|
+
const text = await page.evaluate(script);
|
|
100
|
+
// iOS/Android WebView: evaluateJavaScript(script) returns the same text value.
|
|
153
101
|
```
|
|
154
102
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
103
|
+
## Docs
|
|
104
|
+
- [Documentation index](./docs/README.md)
|
|
105
|
+
- [CLI skill prompt](./skills/ax-grep-cli/SKILL.md)
|
|
106
|
+
- [CLI and agent mode](./docs/cli-agent.md)
|
|
107
|
+
- [Agent handoff loop](./docs/agent-handoff.md)
|
|
108
|
+
- [Benchmarks](./docs/benchmarks.md)
|
|
109
|
+
- [Library API](./docs/library-api.md)
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as SemanticTreeOptions, S as SemanticNode,
|
|
1
|
+
import { a as SemanticTreeOptions, S as SemanticNode, aE as SemanticTreeChange, aF as SemanticTreeObserverOptions } from './types-gwHWhYmw.js';
|
|
2
2
|
|
|
3
3
|
declare function extractSemanticTree(options?: SemanticTreeOptions): SemanticNode;
|
|
4
4
|
|
package/dist/browser.js
CHANGED
|
@@ -132,7 +132,7 @@ function walkElement(element, context) {
|
|
|
132
132
|
if (!context.options.includeHidden && isHidden(element)) return null;
|
|
133
133
|
if (context.options.excludeLikelyAds && isLikelyAd(element)) return null;
|
|
134
134
|
const role = getRole(element);
|
|
135
|
-
const state = getState(element);
|
|
135
|
+
const state = getState(element, context);
|
|
136
136
|
const focusable = isFocusable(element);
|
|
137
137
|
const interactive = isInteractive(element, role, focusable);
|
|
138
138
|
const name = role ? computeName(element, role, context) : "";
|
|
@@ -292,10 +292,20 @@ function labelText(element, context) {
|
|
|
292
292
|
}
|
|
293
293
|
return "";
|
|
294
294
|
}
|
|
295
|
-
function getState(element) {
|
|
295
|
+
function getState(element, context) {
|
|
296
296
|
const state = {};
|
|
297
297
|
if (isHidden(element)) state.hidden = true;
|
|
298
298
|
if (isDisabled(element)) state.disabled = true;
|
|
299
|
+
const busy = ariaBoolean(element.getAttribute("aria-busy"));
|
|
300
|
+
if (busy !== void 0) state.busy = busy;
|
|
301
|
+
const multiselectable = ariaBoolean(element.getAttribute("aria-multiselectable"));
|
|
302
|
+
if (multiselectable !== void 0) state.multiselectable = multiselectable;
|
|
303
|
+
const sort = element.getAttribute("aria-sort");
|
|
304
|
+
if (sort) state.sort = normalizeText(sort, 40);
|
|
305
|
+
const grabbed = ariaBoolean(element.getAttribute("aria-grabbed"));
|
|
306
|
+
if (grabbed !== void 0) state.grabbed = grabbed;
|
|
307
|
+
const dropEffect = element.getAttribute("aria-dropeffect");
|
|
308
|
+
if (dropEffect) state.dropEffect = normalizeText(dropEffect, 80);
|
|
299
309
|
if (element === document.activeElement) state.focused = true;
|
|
300
310
|
const checked = ariaBooleanOrMixed(element.getAttribute("aria-checked"));
|
|
301
311
|
if (checked !== void 0) state.checked = checked;
|
|
@@ -317,6 +327,25 @@ function getState(element) {
|
|
|
317
327
|
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
318
328
|
if (element.readOnly) state.readonly = true;
|
|
319
329
|
}
|
|
330
|
+
const current = element.getAttribute("aria-current");
|
|
331
|
+
if (current && current !== "false") state.current = current === "true" ? true : current;
|
|
332
|
+
const haspopup = element.getAttribute("aria-haspopup");
|
|
333
|
+
if (haspopup && haspopup !== "false") state.haspopup = haspopup === "true" ? true : haspopup;
|
|
334
|
+
const controls = element.getAttribute("aria-controls");
|
|
335
|
+
if (controls) state.controls = normalizeText(controls, context.options.maxTextLength);
|
|
336
|
+
const live = element.getAttribute("aria-live");
|
|
337
|
+
if (live) state.live = normalizeText(live, context.options.maxTextLength);
|
|
338
|
+
if (element.getAttribute("aria-modal") === "true") state.modal = true;
|
|
339
|
+
const orientation = element.getAttribute("aria-orientation");
|
|
340
|
+
if (orientation) state.orientation = normalizeText(orientation, 40);
|
|
341
|
+
const valueMin = ariaNumber(element.getAttribute("aria-valuemin"));
|
|
342
|
+
if (typeof valueMin === "number") state.valueMin = valueMin;
|
|
343
|
+
const valueMax = ariaNumber(element.getAttribute("aria-valuemax"));
|
|
344
|
+
if (typeof valueMax === "number") state.valueMax = valueMax;
|
|
345
|
+
const valueNow = ariaNumber(element.getAttribute("aria-valuenow"));
|
|
346
|
+
if (typeof valueNow === "number") state.valueNow = valueNow;
|
|
347
|
+
const valueText = element.getAttribute("aria-valuetext");
|
|
348
|
+
if (valueText) state.valueText = normalizeText(valueText, context.options.maxTextLength);
|
|
320
349
|
return state;
|
|
321
350
|
}
|
|
322
351
|
function isHidden(element) {
|
|
@@ -550,6 +579,11 @@ function ariaBooleanOrMixed(value) {
|
|
|
550
579
|
if (value === "mixed") return "mixed";
|
|
551
580
|
return ariaBoolean(value);
|
|
552
581
|
}
|
|
582
|
+
function ariaNumber(value) {
|
|
583
|
+
if (value === null || value.trim() === "") return void 0;
|
|
584
|
+
const parsed = Number(value);
|
|
585
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
586
|
+
}
|
|
553
587
|
function formatState(state) {
|
|
554
588
|
if (!state) return "";
|
|
555
589
|
const entries = Object.entries(state).filter(([, value]) => value !== void 0);
|
|
@@ -575,4 +609,4 @@ export {
|
|
|
575
609
|
formatSemanticTreeText,
|
|
576
610
|
observeSemanticTree
|
|
577
611
|
};
|
|
578
|
-
//# sourceMappingURL=chunk-
|
|
612
|
+
//# sourceMappingURL=chunk-HPZ32BKV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts"],"sourcesContent":["import type {\n SemanticNode,\n SemanticNodeState,\n SemanticTreeChange,\n SemanticTreeObserverOptions,\n SemanticTreeOptions,\n} from \"./types\";\n\ntype WalkContext = {\n options: Required<SemanticTreeOptions>;\n nextId: number;\n rootDocument: Document;\n};\n\nconst defaultOptions: Required<SemanticTreeOptions> = {\n mode: \"compact\",\n includeBounds: true,\n includeAttributes: true,\n includeTextNodes: true,\n includeHidden: false,\n includeSelectOptions: true,\n excludeLikelyAds: false,\n excludeLikelyBoilerplate: false,\n pruneCustomElementWrappers: true,\n pruneCollapsedSubtrees: true,\n pruneLikelyClosedOverlays: false,\n summarizeLargeSubtrees: false,\n summarizeLikelyLinkFarms: false,\n summarizeRepeatedSubtrees: false,\n maxChildrenPerNode: 80,\n maxLinkFarmChildren: 24,\n maxRepeatedSubtreeInstances: 3,\n maxTextLength: 240,\n};\n\nconst defaultObserverOptions: Required<Pick<SemanticTreeObserverOptions, \"debounceMs\">> = {\n debounceMs: 50,\n};\n\nconst interactiveRoles = new Set([\n \"button\",\n \"checkbox\",\n \"combobox\",\n \"link\",\n \"listbox\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"searchbox\",\n \"slider\",\n \"spinbutton\",\n \"switch\",\n \"tab\",\n \"textbox\",\n \"treeitem\",\n]);\n\nconst landmarkTags: Record<string, string> = {\n article: \"article\",\n aside: \"complementary\",\n footer: \"contentinfo\",\n form: \"form\",\n header: \"banner\",\n main: \"main\",\n nav: \"navigation\",\n section: \"region\",\n};\n\nconst rolesNamedFromContents = new Set([\n \"button\",\n \"cell\",\n \"checkbox\",\n \"columnheader\",\n \"heading\",\n \"link\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"rowheader\",\n \"switch\",\n \"tab\",\n \"treeitem\",\n]);\n\nexport function extractSemanticTree(options: SemanticTreeOptions = {}): SemanticNode {\n const rootDocument = document;\n const context: WalkContext = {\n options: { ...defaultOptions, ...options },\n nextId: 1,\n rootDocument,\n };\n\n return (\n walkElement(rootDocument.body ?? rootDocument.documentElement, context) ??\n unavailableNode(context, \"document\", \"Document has no inspectable body\")\n );\n}\n\nexport { extractSemanticTree as extract };\n\nexport function formatSemanticTreeText(node: SemanticNode): string {\n const lines: string[] = [];\n\n function visit(current: SemanticNode, depth: number): void {\n const prefix = \" \".repeat(depth);\n const role = current.role ?? current.tag;\n const marker = current.interactive ? \"[i] \" : \"\";\n const name = current.name ? ` '${current.name}'` : \"\";\n const state = formatState(current.state);\n const unavailable = current.unavailableReason ? ` (${current.unavailableReason})` : \"\";\n lines.push(`${prefix}${marker}${role}${name}${state}${unavailable}`);\n for (const child of current.children) visit(child, depth + 1);\n }\n\n visit(node, 0);\n return lines.join(\"\\n\");\n}\n\nexport function observeSemanticTree(\n onChange: (change: SemanticTreeChange) => void,\n options: SemanticTreeObserverOptions = {},\n): { disconnect: () => void; snapshot: () => SemanticNode } {\n const root = document.documentElement;\n const observerOptions = { ...defaultObserverOptions, ...options };\n let mutationCount = 0;\n let timeoutId: number | undefined;\n\n function snapshot(): SemanticNode {\n return extractSemanticTree(options);\n }\n\n function emit(): void {\n timeoutId = undefined;\n onChange({\n tree: snapshot(),\n changedAt: Date.now(),\n mutationCount,\n });\n mutationCount = 0;\n }\n\n const observer = new MutationObserver((mutations) => {\n mutationCount += mutations.length;\n if (timeoutId !== undefined) window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(emit, observerOptions.debounceMs);\n });\n\n observer.observe(root, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n\n return {\n disconnect() {\n if (timeoutId !== undefined) window.clearTimeout(timeoutId);\n observer.disconnect();\n },\n snapshot,\n };\n}\n\nfunction walkElement(element: Element, context: WalkContext): SemanticNode | null {\n if (!context.options.includeHidden && isHidden(element)) return null;\n if (context.options.excludeLikelyAds && isLikelyAd(element)) return null;\n\n const role = getRole(element);\n const state = getState(element, context);\n const focusable = isFocusable(element);\n const interactive = isInteractive(element, role, focusable);\n const name = role ? computeName(element, role, context) : \"\";\n const description = computeDescription(element, context);\n const tag = element.tagName.toLowerCase();\n const children = collectChildren(element, context);\n\n if (context.options.mode === \"interactive\" && !interactive) {\n return children.length > 0\n ? containerNode(context, tag, children)\n : null;\n }\n\n if (shouldPrune(element, role, name, interactive, children, context)) {\n return children.length === 1 ? children[0] ?? null : containerNode(context, tag, children);\n }\n\n const node: SemanticNode = {\n id: nextId(context),\n tag,\n role,\n name,\n interactive,\n focusable,\n children,\n };\n\n if (description) node.description = description;\n const text = getDirectText(element, context.options.maxTextLength);\n if (text) node.text = text;\n const value = getValue(element);\n if (value) node.value = value;\n if (Object.keys(state).length > 0) node.state = state;\n node.selector = getCssPath(element);\n node.xpath = getXPath(element);\n if (context.options.includeBounds) node.bounds = getBounds(element);\n if (context.options.includeAttributes) node.attributes = getAttributes(element);\n\n appendSpecialChildren(element, node, context);\n appendShadowChildren(element, node, context);\n appendFrameChildren(element, node, context);\n\n return node;\n}\n\nfunction collectChildren(element: Element, context: WalkContext): SemanticNode[] {\n const children: SemanticNode[] = [];\n for (const child of Array.from(element.childNodes)) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n if (!context.options.includeSelectOptions && element instanceof HTMLSelectElement) continue;\n const semanticChild = walkElement(child as Element, context);\n if (semanticChild) children.push(semanticChild);\n continue;\n }\n\n if (context.options.includeTextNodes && child.nodeType === Node.TEXT_NODE) {\n const text = normalizeText(child.textContent ?? \"\", context.options.maxTextLength);\n if (text) {\n children.push({\n id: nextId(context),\n tag: \"#text\",\n role: \"text\",\n name: text,\n text,\n interactive: false,\n focusable: false,\n children: [],\n });\n }\n }\n }\n return children;\n}\n\nfunction shouldPrune(\n element: Element,\n role: string | null,\n name: string,\n interactive: boolean,\n children: SemanticNode[],\n context: WalkContext,\n): boolean {\n if (context.options.mode === \"full\") return false;\n if (role === \"none\" || role === \"presentation\") return true;\n if (interactive) return false;\n if (context.options.pruneCustomElementWrappers && isCustomElement(element)) return children.length > 0;\n if (role && role !== \"generic\") return false;\n if (name) return false;\n if (element.id || element.getAttribute(\"aria-label\") || element.getAttribute(\"aria-labelledby\")) return false;\n return children.length > 0;\n}\n\nfunction getRole(element: Element): string | null {\n const explicit = firstToken(element.getAttribute(\"role\"));\n if (explicit) return explicit;\n\n const tag = element.tagName.toLowerCase();\n if (tag === \"section\" && !hasExplicitNameSource(element)) return null;\n if (tag === \"form\" && !hasExplicitNameSource(element)) return null;\n if (tag in landmarkTags) return landmarkTags[tag] ?? null;\n if (/^h[1-6]$/.test(tag)) return \"heading\";\n\n if (tag === \"a\" || tag === \"area\") return element.hasAttribute(\"href\") ? \"link\" : null;\n if (tag === \"button\") return \"button\";\n if (tag === \"details\") return \"group\";\n if (tag === \"dialog\") return \"dialog\";\n if (tag === \"fieldset\") return \"group\";\n if (tag === \"figure\") return \"figure\";\n if (tag === \"iframe\") return \"iframe\";\n if (tag === \"img\") return hasEmptyAlt(element) ? \"presentation\" : \"img\";\n if (tag === \"li\") return \"listitem\";\n if (tag === \"ol\" || tag === \"ul\") return \"list\";\n if (tag === \"optgroup\") return \"group\";\n if (tag === \"option\") return \"option\";\n if (tag === \"output\") return \"status\";\n if (tag === \"progress\") return \"progressbar\";\n if (tag === \"select\") return element.hasAttribute(\"multiple\") ? \"listbox\" : \"combobox\";\n if (tag === \"summary\") return \"button\";\n if (tag === \"table\") return \"table\";\n if (tag === \"caption\") return \"caption\";\n if (tag === \"tbody\" || tag === \"tfoot\" || tag === \"thead\") return \"rowgroup\";\n if (tag === \"td\") return \"cell\";\n if (tag === \"textarea\") return \"textbox\";\n if (tag === \"th\") return element.getAttribute(\"scope\") === \"row\" ? \"rowheader\" : \"columnheader\";\n if (tag === \"tr\") return \"row\";\n\n if (tag === \"input\") return inputRole(element as HTMLInputElement);\n return null;\n}\n\nfunction inputRole(input: HTMLInputElement): string | null {\n const type = (input.getAttribute(\"type\") || \"text\").toLowerCase();\n if (type === \"button\" || type === \"image\" || type === \"reset\" || type === \"submit\") return \"button\";\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"email\" || type === \"tel\" || type === \"text\" || type === \"url\") return \"textbox\";\n if (type === \"number\") return \"spinbutton\";\n if (type === \"radio\") return \"radio\";\n if (type === \"range\") return \"slider\";\n if (type === \"search\") return \"searchbox\";\n if (type === \"hidden\") return null;\n return \"textbox\";\n}\n\nfunction computeName(element: Element, role: string, context: WalkContext): string {\n if (element.getAttribute(\"aria-labelledby\")) {\n const labelled = textFromIds(element.getAttribute(\"aria-labelledby\") ?? \"\", context.rootDocument);\n if (labelled) return labelled;\n }\n\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel) return normalizeText(ariaLabel, context.options.maxTextLength);\n\n if (element instanceof HTMLInputElement && isButtonLikeInput(element)) {\n return normalizeText(element.value || element.getAttribute(\"value\") || inputFallbackName(element), context.options.maxTextLength);\n }\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n const label = labelText(element, context);\n if (label) return label;\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder) return normalizeText(placeholder, context.options.maxTextLength);\n }\n\n if (element instanceof HTMLImageElement) {\n return normalizeText(element.alt || element.getAttribute(\"title\") || \"\", context.options.maxTextLength);\n }\n\n if (element instanceof HTMLFieldSetElement) {\n const legend = element.querySelector(\":scope > legend\");\n if (legend) return getVisibleText(legend, context.options.maxTextLength);\n }\n\n if (rolesNamedFromContents.has(role)) {\n const ownText = getVisibleText(element, context.options.maxTextLength);\n if (ownText) return ownText;\n }\n\n return normalizeText(element.getAttribute(\"title\") ?? \"\", context.options.maxTextLength);\n}\n\nfunction computeDescription(element: Element, context: WalkContext): string {\n const describedBy = element.getAttribute(\"aria-describedby\");\n if (describedBy) return textFromIds(describedBy, context.rootDocument);\n return normalizeText(element.getAttribute(\"title\") ?? \"\", context.options.maxTextLength);\n}\n\nfunction labelText(\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n context: WalkContext,\n): string {\n if (element.labels && element.labels.length > 0) {\n return normalizeText(Array.from(element.labels).map((label) => getVisibleText(label, context.options.maxTextLength)).join(\" \"), context.options.maxTextLength);\n }\n return \"\";\n}\n\nfunction getState(element: Element, context: WalkContext): SemanticNodeState {\n const state: SemanticNodeState = {};\n if (isHidden(element)) state.hidden = true;\n if (isDisabled(element)) state.disabled = true;\n const busy = ariaBoolean(element.getAttribute(\"aria-busy\"));\n if (busy !== undefined) state.busy = busy;\n const multiselectable = ariaBoolean(element.getAttribute(\"aria-multiselectable\"));\n if (multiselectable !== undefined) state.multiselectable = multiselectable;\n const sort = element.getAttribute(\"aria-sort\");\n if (sort) state.sort = normalizeText(sort, 40);\n const grabbed = ariaBoolean(element.getAttribute(\"aria-grabbed\"));\n if (grabbed !== undefined) state.grabbed = grabbed;\n const dropEffect = element.getAttribute(\"aria-dropeffect\");\n if (dropEffect) state.dropEffect = normalizeText(dropEffect, 80);\n if (element === document.activeElement) state.focused = true;\n\n const checked = ariaBooleanOrMixed(element.getAttribute(\"aria-checked\"));\n if (checked !== undefined) state.checked = checked;\n else if (element instanceof HTMLInputElement && (element.type === \"checkbox\" || element.type === \"radio\")) {\n state.checked = element.checked;\n }\n\n const selected = ariaBoolean(element.getAttribute(\"aria-selected\"));\n if (selected !== undefined) state.selected = selected;\n else if (element instanceof HTMLOptionElement) state.selected = element.selected;\n\n const expanded = ariaBoolean(element.getAttribute(\"aria-expanded\"));\n if (expanded !== undefined) state.expanded = expanded;\n\n const pressed = ariaBooleanOrMixed(element.getAttribute(\"aria-pressed\"));\n if (pressed !== undefined) state.pressed = pressed;\n\n const required = ariaBoolean(element.getAttribute(\"aria-required\"));\n if (required !== undefined) state.required = required;\n else if (\"required\" in element && Boolean((element as HTMLInputElement).required)) state.required = true;\n\n const invalid = element.getAttribute(\"aria-invalid\");\n if (invalid && invalid !== \"false\") state.invalid = invalid === \"true\" ? true : invalid;\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n if (element.readOnly) state.readonly = true;\n }\n\n const current = element.getAttribute(\"aria-current\");\n if (current && current !== \"false\") state.current = current === \"true\" ? true : current;\n\n const haspopup = element.getAttribute(\"aria-haspopup\");\n if (haspopup && haspopup !== \"false\") state.haspopup = haspopup === \"true\" ? true : haspopup;\n\n const controls = element.getAttribute(\"aria-controls\");\n if (controls) state.controls = normalizeText(controls, context.options.maxTextLength);\n\n const live = element.getAttribute(\"aria-live\");\n if (live) state.live = normalizeText(live, context.options.maxTextLength);\n\n if (element.getAttribute(\"aria-modal\") === \"true\") state.modal = true;\n\n const orientation = element.getAttribute(\"aria-orientation\");\n if (orientation) state.orientation = normalizeText(orientation, 40);\n\n const valueMin = ariaNumber(element.getAttribute(\"aria-valuemin\"));\n if (typeof valueMin === \"number\") state.valueMin = valueMin;\n const valueMax = ariaNumber(element.getAttribute(\"aria-valuemax\"));\n if (typeof valueMax === \"number\") state.valueMax = valueMax;\n const valueNow = ariaNumber(element.getAttribute(\"aria-valuenow\"));\n if (typeof valueNow === \"number\") state.valueNow = valueNow;\n const valueText = element.getAttribute(\"aria-valuetext\");\n if (valueText) state.valueText = normalizeText(valueText, context.options.maxTextLength);\n\n return state;\n}\n\nfunction isHidden(element: Element): boolean {\n if (element.hasAttribute(\"hidden\")) return true;\n if (element.getAttribute(\"aria-hidden\") === \"true\") return true;\n\n const style = getComputedStyle(element);\n if (\n style.display === \"none\" ||\n style.visibility === \"hidden\" ||\n style.contentVisibility === \"hidden\"\n ) return true;\n if (Number(style.opacity) === 0) return true;\n return false;\n}\n\nfunction isLikelyAd(element: Element): boolean {\n const haystack = [\n element.id,\n element.getAttribute(\"class\"),\n element.getAttribute(\"aria-label\"),\n element.getAttribute(\"data-testid\"),\n element.getAttribute(\"data-test-id\"),\n element.getAttribute(\"data-name\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n if (/\\b(ad|ads|advert|advertisement|sponsor|sponsored|placement)\\b/.test(haystack)) return true;\n if (element instanceof HTMLAnchorElement && normalizeText(element.textContent ?? \"\", 80).toLowerCase() === \"ad\") return true;\n return false;\n}\n\nfunction isDisabled(element: Element): boolean {\n if (element.getAttribute(\"aria-disabled\") === \"true\") return true;\n return \"disabled\" in element && Boolean((element as HTMLButtonElement).disabled);\n}\n\nfunction isFocusable(element: Element): boolean {\n if (isDisabled(element) || isHidden(element)) return false;\n const tabindex = element.getAttribute(\"tabindex\");\n if (tabindex !== null) return Number(tabindex) >= 0;\n return element.matches(\"a[href],area[href],button,input,select,textarea,summary,iframe,[contenteditable=''],[contenteditable='true']\");\n}\n\nfunction isInteractive(element: Element, role: string | null, focusable: boolean): boolean {\n if (role && interactiveRoles.has(role)) return true;\n if (element.matches(\"a[href],button,input,select,textarea,summary,option\")) return true;\n if (element.hasAttribute(\"onclick\")) return true;\n return focusable && Boolean(role);\n}\n\nfunction appendSpecialChildren(element: Element, node: SemanticNode, context: WalkContext): void {\n if (!context.options.includeSelectOptions) return;\n if (element instanceof HTMLSelectElement) {\n for (const option of Array.from(element.options)) {\n node.children.push({\n id: nextId(context),\n tag: \"option\",\n role: \"option\",\n name: normalizeText(option.textContent ?? \"\", context.options.maxTextLength),\n value: option.value,\n state: { selected: option.selected, disabled: option.disabled },\n interactive: false,\n focusable: false,\n selector: getCssPath(option),\n xpath: getXPath(option),\n children: [],\n });\n }\n }\n}\n\nfunction isCustomElement(element: Element): boolean {\n return element.tagName.includes(\"-\");\n}\n\nfunction appendShadowChildren(element: Element, node: SemanticNode, context: WalkContext): void {\n const shadowRoot = element.shadowRoot;\n if (!shadowRoot) return;\n for (const child of Array.from(shadowRoot.children)) {\n const semanticChild = walkElement(child, context);\n if (semanticChild) node.children.push(semanticChild);\n }\n}\n\nfunction appendFrameChildren(element: Element, node: SemanticNode, context: WalkContext): void {\n if (!(element instanceof HTMLIFrameElement)) return;\n try {\n const frameDocument = element.contentDocument;\n if (!frameDocument?.body) {\n node.children.push(unavailableNode(context, \"iframe\", \"iframe document unavailable\"));\n return;\n }\n const previousDocument = context.rootDocument;\n context.rootDocument = frameDocument;\n const child = walkElement(frameDocument.body, context);\n context.rootDocument = previousDocument;\n if (child) node.children.push(child);\n } catch {\n node.children.push(unavailableNode(context, \"iframe\", \"cross-origin iframe\"));\n }\n}\n\nfunction unavailableNode(context: WalkContext, tag: string, reason: string): SemanticNode {\n return {\n id: nextId(context),\n tag,\n role: null,\n name: \"\",\n interactive: false,\n focusable: false,\n unavailableReason: reason,\n children: [],\n };\n}\n\nfunction containerNode(context: WalkContext, tag: string, children: SemanticNode[]): SemanticNode {\n return {\n id: nextId(context),\n tag,\n role: null,\n name: \"\",\n interactive: false,\n focusable: false,\n children,\n };\n}\n\nfunction getValue(element: Element): string {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n return element.value;\n }\n return normalizeText(element.getAttribute(\"aria-valuetext\") ?? element.getAttribute(\"aria-valuenow\") ?? \"\", 80);\n}\n\nfunction getDirectText(element: Element, maxLength: number): string {\n return normalizeText(\n Array.from(element.childNodes)\n .filter((node) => node.nodeType === Node.TEXT_NODE)\n .map((node) => node.textContent ?? \"\")\n .join(\" \"),\n maxLength,\n );\n}\n\nfunction getVisibleText(element: Element, maxLength: number): string {\n const parts: string[] = [];\n\n function visit(node: Node): void {\n if (node.nodeType === Node.TEXT_NODE) {\n parts.push(node.textContent ?? \"\");\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n const childElement = node as Element;\n if (isHidden(childElement)) return;\n for (const child of Array.from(childElement.childNodes)) visit(child);\n }\n\n visit(element);\n return normalizeText(parts.join(\" \"), maxLength);\n}\n\nfunction getAttributes(element: Element): Record<string, string> {\n const attributes: Record<string, string> = {};\n for (const attribute of Array.from(element.attributes)) {\n if (\n attribute.name === \"id\" ||\n attribute.name === \"href\" ||\n attribute.name === \"type\" ||\n attribute.name === \"role\" ||\n attribute.name === \"alt\" ||\n attribute.name === \"title\" ||\n attribute.name.startsWith(\"aria-\") ||\n attribute.name.startsWith(\"data-\")\n ) {\n attributes[attribute.name] = attribute.value;\n }\n }\n return attributes;\n}\n\nfunction getBounds(element: Element) {\n const rect = element.getBoundingClientRect();\n return {\n x: round(rect.x),\n y: round(rect.y),\n width: round(rect.width),\n height: round(rect.height),\n };\n}\n\nfunction getCssPath(element: Element): string {\n if (element.id) return `#${cssEscape(element.id)}`;\n const segments: string[] = [];\n let current: Element | null = element;\n while (current && current.nodeType === Node.ELEMENT_NODE && current !== document.documentElement) {\n const elementAtLevel: Element = current;\n const tag = elementAtLevel.tagName.toLowerCase();\n const parent: Element | null = elementAtLevel.parentElement;\n if (!parent) {\n segments.unshift(tag);\n break;\n }\n const siblings = Array.from(parent.children).filter((child) => child.tagName === elementAtLevel.tagName);\n const index = siblings.indexOf(elementAtLevel) + 1;\n segments.unshift(siblings.length > 1 ? `${tag}:nth-of-type(${index})` : tag);\n current = parent;\n }\n return segments.join(\" > \");\n}\n\nfunction getXPath(element: Element): string {\n const segments: string[] = [];\n let current: Element | null = element;\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n const elementAtLevel: Element = current;\n const tag = elementAtLevel.tagName.toLowerCase();\n const parent: Element | null = elementAtLevel.parentElement;\n if (!parent) {\n segments.unshift(`/${tag}[1]`);\n break;\n }\n const sameTag = Array.from(parent.children).filter((child) => child.tagName === elementAtLevel.tagName);\n segments.unshift(`/${tag}[${sameTag.indexOf(elementAtLevel) + 1}]`);\n current = parent;\n }\n return segments.join(\"\");\n}\n\nfunction textFromIds(ids: string, rootDocument: Document): string {\n return normalizeText(\n ids\n .split(/\\s+/)\n .map((id) => {\n const element = rootDocument.getElementById(id);\n return element ? getVisibleText(element, 240) : \"\";\n })\n .filter(Boolean)\n .join(\" \"),\n 240,\n );\n}\n\nfunction normalizeText(value: string, maxLength: number): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}…` : normalized;\n}\n\nfunction firstToken(value: string | null): string | null {\n return value?.trim().split(/\\s+/)[0] || null;\n}\n\nfunction hasExplicitNameSource(element: Element): boolean {\n return Boolean(\n element.getAttribute(\"aria-label\") ||\n element.getAttribute(\"aria-labelledby\") ||\n element.getAttribute(\"title\"),\n );\n}\n\nfunction hasEmptyAlt(element: Element): boolean {\n return element.hasAttribute(\"alt\") && element.getAttribute(\"alt\") === \"\";\n}\n\nfunction isButtonLikeInput(input: HTMLInputElement): boolean {\n return [\"button\", \"image\", \"reset\", \"submit\"].includes((input.getAttribute(\"type\") || \"\").toLowerCase());\n}\n\nfunction inputFallbackName(input: HTMLInputElement): string {\n const type = (input.getAttribute(\"type\") || \"\").toLowerCase();\n if (type === \"submit\") return \"Submit\";\n if (type === \"reset\") return \"Reset\";\n return \"\";\n}\n\nfunction ariaBoolean(value: string | null): boolean | undefined {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return undefined;\n}\n\nfunction ariaBooleanOrMixed(value: string | null): boolean | \"mixed\" | undefined {\n if (value === \"mixed\") return \"mixed\";\n return ariaBoolean(value);\n}\n\nfunction ariaNumber(value: string | null): number | undefined {\n if (value === null || value.trim() === \"\") return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction formatState(state: SemanticNodeState | undefined): string {\n if (!state) return \"\";\n const entries = Object.entries(state).filter(([, value]) => value !== undefined);\n return entries.length > 0\n ? ` [${entries.map(([key, value]) => `${key}=${String(value)}`).join(\" \")}]`\n : \"\";\n}\n\nfunction nextId(context: WalkContext): string {\n const id = `n${context.nextId}`;\n context.nextId += 1;\n return id;\n}\n\nfunction round(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nfunction cssEscape(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n return value.replace(/[^a-zA-Z0-9_-]/g, (char) => `\\\\${char}`);\n}\n"],"mappings":"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","names":[]}
|