ax-grep 0.1.0 → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +72 -121
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +0 -0
- 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 +22407 -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/static.js.map +0 -0
- package/dist/types-K1hqb7Pq.d.ts +3660 -0
- package/docs/README.md +21 -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 +157 -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/docs/release.md +24 -0
- package/docs/server-agent.md +71 -0
- package/docs/webview.md +70 -0
- package/package.json +35 -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/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { formatSemanticTreeText, observeSemanticTree } from './browser.js';
|
|
2
2
|
import { StaticSemanticTreeOptions } from './static.js';
|
|
3
|
-
import { E as ExtractorScriptOptions, O as ObserverScriptOptions, S as SemanticNode, a as SemanticTreeOptions } from './types-
|
|
4
|
-
export { b as
|
|
3
|
+
import { E as ExtractorScriptOptions, O as ObserverScriptOptions, S as SemanticNode, a as SemanticTreeOptions } from './types-K1hqb7Pq.js';
|
|
4
|
+
export { A as AgentAction, b as AgentActionTargetChoice, c as AgentAnswerPlan, d as AgentBrowserHtmlCapture, e as AgentCitation, f as AgentContinuationMode, g as AgentContract, h as AgentContractFeature, i as AgentExecutionMode, j as AgentExecutorStep, k as AgentExpectedOutcome, l as AgentExpectedOutcomeKind, m as AgentFindMatch, n as AgentFindSummary, o as AgentFormChoice, p as AgentFormField, q as AgentFormHiddenField, r as AgentHandoff, s as AgentJsonEnvelope, t as AgentLoopDecision, u as AgentLoopDirective, v as AgentNext, w as AgentPageAction, x as AgentPageApiEndpoint, y as AgentPageAppHint, z as AgentPageAuthorLink, B as AgentPageBarrier, C as AgentPageBreadcrumb, D as AgentPageBreadcrumbItem, F as AgentPageCheck, G as AgentPageCitation, H as AgentPageClientState, I as AgentPageCodeBlock, J as AgentPageConfig, K as AgentPageContactPoint, L as AgentPageDataTable, M as AgentPageDataset, N as AgentPageDecision, P as AgentPageEmbed, Q as AgentPageEvidence, R as AgentPageFaq, T as AgentPageForm, U as AgentPageHttpPolicy, V as AgentPageHydration, W as AgentPageIdentity, X as AgentPageKeyValue, Y as AgentPageMedia, Z as AgentPageMetaFact, _ as AgentPageMetadata, $ as AgentPageMobileHint, a0 as AgentPageOffer, a1 as AgentPagePagination, a2 as AgentPageProvenance, a3 as AgentPageResource, a4 as AgentPageRuntime, a5 as AgentPageSchemaFact, a6 as AgentPageSchemaFactValue, a7 as AgentPageSection, a8 as AgentPageTimeline, a9 as AgentPageToc, aa as AgentPageTocItem, ab as AgentPageTopic, ac as AgentPageTranscript, ad as AgentQualityGate, ae as AgentQualityGateKind, af as AgentReadTarget, ag as AgentReadValue, ah as AgentReadValueInline, ai as AgentReadValueKind, aj as AgentReadValuePayload, ak as AgentReadValueReference, al as AgentReadValueScalar, am as AgentResultChoice, an as AgentRoutingIntent, ao as AgentSearchDecision, ap as AgentSemanticSummary, aq as AgentSignal, ar as AgentSignalKind, as as AgentSignalSeverity, at as AgentSourceChoice, au as AgentSourceSearch, av as AgentSourceSearchResult, aw as AgentStatus, ax as AgentSummary, ay as AgentTarget, az as AgentVerification, aA as ExtractMode, aB as OutputFormat, aC as SemanticNodeBounds, aD as SemanticNodeState, aE as SemanticTreeChange, aF as SemanticTreeObserverOptions } from './types-K1hqb7Pq.js';
|
|
5
5
|
|
|
6
6
|
declare function extract(html: string, options?: StaticSemanticTreeOptions): SemanticNode;
|
|
7
7
|
declare function createExtractorScript(options?: ExtractorScriptOptions): string;
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
formatSemanticTreeText,
|
|
3
3
|
observeSemanticTree
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-HPZ32BKV.js";
|
|
5
5
|
import {
|
|
6
6
|
extractStaticSemanticTree
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZXTURCRT.js";
|
|
8
8
|
|
|
9
9
|
// src/index.ts
|
|
10
10
|
function extract(html, options) {
|
|
@@ -157,7 +157,7 @@ const __AX_LITE__ = (() => {
|
|
|
157
157
|
if (!context.options.includeHidden && isHidden(element)) return null;
|
|
158
158
|
if (context.options.excludeLikelyAds && isLikelyAd(element)) return null;
|
|
159
159
|
const role = getRole(element);
|
|
160
|
-
const state = getState(element);
|
|
160
|
+
const state = getState(element, context);
|
|
161
161
|
const focusable = isFocusable(element);
|
|
162
162
|
const interactive = isInteractive(element, role, focusable);
|
|
163
163
|
const name = role ? computeName(element, role, context) : "";
|
|
@@ -286,10 +286,20 @@ const __AX_LITE__ = (() => {
|
|
|
286
286
|
if (element.labels && element.labels.length > 0) return normalizeText(Array.from(element.labels).map((label) => getVisibleText(label, context.options.maxTextLength)).join(" "), context.options.maxTextLength);
|
|
287
287
|
return "";
|
|
288
288
|
}
|
|
289
|
-
function getState(element) {
|
|
289
|
+
function getState(element, context) {
|
|
290
290
|
const state = {};
|
|
291
291
|
if (isHidden(element)) state.hidden = true;
|
|
292
292
|
if (isDisabled(element)) state.disabled = true;
|
|
293
|
+
const busy = ariaBoolean(element.getAttribute("aria-busy"));
|
|
294
|
+
if (busy !== undefined) state.busy = busy;
|
|
295
|
+
const multiselectable = ariaBoolean(element.getAttribute("aria-multiselectable"));
|
|
296
|
+
if (multiselectable !== undefined) state.multiselectable = multiselectable;
|
|
297
|
+
const sort = element.getAttribute("aria-sort");
|
|
298
|
+
if (sort) state.sort = normalizeText(sort, 40);
|
|
299
|
+
const grabbed = ariaBoolean(element.getAttribute("aria-grabbed"));
|
|
300
|
+
if (grabbed !== undefined) state.grabbed = grabbed;
|
|
301
|
+
const dropEffect = element.getAttribute("aria-dropeffect");
|
|
302
|
+
if (dropEffect) state.dropEffect = normalizeText(dropEffect, 80);
|
|
293
303
|
if (element === document.activeElement) state.focused = true;
|
|
294
304
|
const checked = ariaBooleanOrMixed(element.getAttribute("aria-checked"));
|
|
295
305
|
if (checked !== undefined) state.checked = checked;
|
|
@@ -307,6 +317,25 @@ const __AX_LITE__ = (() => {
|
|
|
307
317
|
const invalid = element.getAttribute("aria-invalid");
|
|
308
318
|
if (invalid && invalid !== "false") state.invalid = invalid === "true" ? true : invalid;
|
|
309
319
|
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) if (element.readOnly) state.readonly = true;
|
|
320
|
+
const current = element.getAttribute("aria-current");
|
|
321
|
+
if (current && current !== "false") state.current = current === "true" ? true : current;
|
|
322
|
+
const haspopup = element.getAttribute("aria-haspopup");
|
|
323
|
+
if (haspopup && haspopup !== "false") state.haspopup = haspopup === "true" ? true : haspopup;
|
|
324
|
+
const controls = element.getAttribute("aria-controls");
|
|
325
|
+
if (controls) state.controls = normalizeText(controls, context.options.maxTextLength);
|
|
326
|
+
const live = element.getAttribute("aria-live");
|
|
327
|
+
if (live) state.live = normalizeText(live, context.options.maxTextLength);
|
|
328
|
+
if (element.getAttribute("aria-modal") === "true") state.modal = true;
|
|
329
|
+
const orientation = element.getAttribute("aria-orientation");
|
|
330
|
+
if (orientation) state.orientation = normalizeText(orientation, 40);
|
|
331
|
+
const valueMin = ariaNumber(element.getAttribute("aria-valuemin"));
|
|
332
|
+
if (typeof valueMin === "number") state.valueMin = valueMin;
|
|
333
|
+
const valueMax = ariaNumber(element.getAttribute("aria-valuemax"));
|
|
334
|
+
if (typeof valueMax === "number") state.valueMax = valueMax;
|
|
335
|
+
const valueNow = ariaNumber(element.getAttribute("aria-valuenow"));
|
|
336
|
+
if (typeof valueNow === "number") state.valueNow = valueNow;
|
|
337
|
+
const valueText = element.getAttribute("aria-valuetext");
|
|
338
|
+
if (valueText) state.valueText = normalizeText(valueText, context.options.maxTextLength);
|
|
310
339
|
return state;
|
|
311
340
|
}
|
|
312
341
|
function isHidden(element) {
|
|
@@ -381,6 +410,11 @@ const __AX_LITE__ = (() => {
|
|
|
381
410
|
function inputFallbackName(input) { const type = (input.getAttribute("type") || "").toLowerCase(); if (type === "submit") return "Submit"; if (type === "reset") return "Reset"; return ""; }
|
|
382
411
|
function ariaBoolean(value) { if (value === "true") return true; if (value === "false") return false; return undefined; }
|
|
383
412
|
function ariaBooleanOrMixed(value) { if (value === "mixed") return "mixed"; return ariaBoolean(value); }
|
|
413
|
+
function ariaNumber(value) {
|
|
414
|
+
if (value === null || value.trim() === "") return undefined;
|
|
415
|
+
const parsed = Number(value);
|
|
416
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
417
|
+
}
|
|
384
418
|
function formatState(state) { if (!state) return ""; const entries = Object.entries(state).filter(([, value]) => value !== undefined); return entries.length > 0 ? " [" + entries.map(([key, value]) => key + "=" + String(value)).join(" ") + "]" : ""; }
|
|
385
419
|
function nextId(context) { const id = "n" + context.nextId; context.nextId += 1; return id; }
|
|
386
420
|
function round(value) { return Math.round(value * 100) / 100; }
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { formatSemanticTreeText, observeSemanticTree } from \"./browser\";\nimport { extract as extractStatic, type StaticSemanticTreeOptions } from \"./static\";\nimport type { ExtractorScriptOptions, ObserverScriptOptions, SemanticNode, SemanticTreeOptions } from \"./types\";\n\nexport type {\n ExtractMode,\n ExtractorScriptOptions,\n OutputFormat,\n ObserverScriptOptions,\n SemanticNode,\n SemanticNodeBounds,\n SemanticNodeState,\n SemanticTreeChange,\n SemanticTreeObserverOptions,\n SemanticTreeOptions,\n} from \"./types\";\nexport type { StaticSemanticTreeOptions } from \"./static\";\n\nexport { formatSemanticTreeText, observeSemanticTree };\n\nexport function extract(html: string, options?: StaticSemanticTreeOptions): SemanticNode {\n return extractStatic(html, options);\n}\n\nexport function createExtractorScript(options: ExtractorScriptOptions = {}): string {\n const serializedOptions = JSON.stringify(options);\n return `(() => {\n ${browserBundleSource()}\n const options = ${serializedOptions};\n const tree = __AX_LITE__.extractSemanticTree(options);\n return options.format === \"text\" ? __AX_LITE__.formatSemanticTreeText(tree) : tree;\n })()`;\n}\n\nexport function createObserverScript(options: ObserverScriptOptions = {}): string {\n const { globalName = \"__AX_LITE_OBSERVER__\", ...observerOptions } = options;\n const serializedOptions = JSON.stringify(observerOptions);\n const serializedGlobalName = JSON.stringify(globalName);\n return `(() => {\n ${browserBundleSource()}\n const globalName = ${serializedGlobalName};\n const observer = __AX_LITE__.observeSemanticTree((change) => {\n window.dispatchEvent(new CustomEvent(globalName + \":change\", { detail: change }));\n }, ${serializedOptions});\n window[globalName] = observer;\n return observer.snapshot();\n })()`;\n}\n\nexport function flattenSemanticTree(node: SemanticNode): SemanticNode[] {\n const nodes: SemanticNode[] = [];\n const stack = [node];\n while (stack.length > 0) {\n const current = stack.shift();\n if (!current) continue;\n nodes.push(current);\n stack.unshift(...current.children);\n }\n return nodes;\n}\n\nexport function summarizeSemanticTree(node: SemanticNode): {\n nodeCount: number;\n interactiveCount: number;\n roles: Record<string, number>;\n namedRoles: string[];\n} {\n const flat = flattenSemanticTree(node);\n const roles: Record<string, number> = {};\n const namedRoles: string[] = [];\n for (const item of flat) {\n const role = item.role ?? item.tag;\n roles[role] = (roles[role] ?? 0) + 1;\n if (item.role && item.name) namedRoles.push(`${item.role}:${item.name}`);\n }\n return {\n nodeCount: flat.length,\n interactiveCount: flat.filter((item) => item.interactive).length,\n roles,\n namedRoles,\n };\n}\n\nexport function normalizeOptions(options: SemanticTreeOptions = {}): SemanticTreeOptions {\n return {\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 ...options,\n };\n}\n\nfunction browserBundleSource(): string {\n return String.raw`\nconst __AX_LITE__ = (() => {\n const defaultOptions = {\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 const interactiveRoles = new Set([\"button\",\"checkbox\",\"combobox\",\"link\",\"listbox\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"radio\",\"searchbox\",\"slider\",\"spinbutton\",\"switch\",\"tab\",\"textbox\",\"treeitem\"]);\n const landmarkTags = { article: \"article\", aside: \"complementary\", footer: \"contentinfo\", form: \"form\", header: \"banner\", main: \"main\", nav: \"navigation\", section: \"region\" };\n const rolesNamedFromContents = new Set([\"button\",\"cell\",\"checkbox\",\"columnheader\",\"heading\",\"link\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"radio\",\"rowheader\",\"switch\",\"tab\",\"treeitem\"]);\n function extractSemanticTree(options = {}) {\n const rootDocument = document;\n const context = { options: { ...defaultOptions, ...options }, nextId: 1, rootDocument };\n return walkElement(rootDocument.body || rootDocument.documentElement, context) || unavailableNode(context, \"document\", \"Document has no inspectable body\");\n }\n function formatSemanticTreeText(node) {\n const lines = [];\n function visit(current, depth) {\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 visit(node, 0);\n return lines.join(\"\\n\");\n }\n function observeSemanticTree(onChange, options = {}) {\n const root = document.documentElement;\n const debounceMs = options.debounceMs ?? 50;\n let mutationCount = 0;\n let timeoutId;\n function snapshot() { return extractSemanticTree(options); }\n function emit() {\n timeoutId = undefined;\n onChange({ tree: snapshot(), changedAt: Date.now(), mutationCount });\n mutationCount = 0;\n }\n const observer = new MutationObserver((mutations) => {\n mutationCount += mutations.length;\n if (timeoutId !== undefined) window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(emit, debounceMs);\n });\n observer.observe(root, { attributes: true, characterData: true, childList: true, subtree: true });\n return {\n disconnect() {\n if (timeoutId !== undefined) window.clearTimeout(timeoutId);\n observer.disconnect();\n },\n snapshot,\n };\n }\n function walkElement(element, context) {\n if (!context.options.includeHidden && isHidden(element)) return null;\n if (context.options.excludeLikelyAds && isLikelyAd(element)) return null;\n const role = getRole(element);\n const state = getState(element);\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 if (context.options.mode === \"interactive\" && !interactive) return children.length > 0 ? containerNode(context, tag, children) : null;\n if (shouldPrune(element, role, name, interactive, children, context)) return children.length === 1 ? children[0] || null : containerNode(context, tag, children);\n const node = { id: nextId(context), tag, role, name, interactive, focusable, children };\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 appendSpecialChildren(element, node, context);\n appendShadowChildren(element, node, context);\n appendFrameChildren(element, node, context);\n return node;\n }\n function collectChildren(element, context) {\n const children = [];\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, context);\n if (semanticChild) children.push(semanticChild);\n } else if (context.options.includeTextNodes && child.nodeType === Node.TEXT_NODE) {\n const text = normalizeText(child.textContent || \"\", context.options.maxTextLength);\n if (text) children.push({ id: nextId(context), tag: \"#text\", role: \"text\", name: text, text, interactive: false, focusable: false, children: [] });\n }\n }\n return children;\n }\n function shouldPrune(element, role, name, interactive, children, context) {\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 function getRole(element) {\n const explicit = firstToken(element.getAttribute(\"role\"));\n if (explicit) return explicit;\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 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 if (tag === \"input\") return inputRole(element);\n return null;\n }\n function inputRole(input) {\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 function computeName(element, role, context) {\n if (element.getAttribute(\"aria-labelledby\")) {\n const labelled = textFromIds(element.getAttribute(\"aria-labelledby\") || \"\", context.rootDocument);\n if (labelled) return labelled;\n }\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel) return normalizeText(ariaLabel, context.options.maxTextLength);\n if (element instanceof HTMLInputElement && isButtonLikeInput(element)) return normalizeText(element.value || element.getAttribute(\"value\") || inputFallbackName(element), context.options.maxTextLength);\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 if (element instanceof HTMLImageElement) return normalizeText(element.alt || element.getAttribute(\"title\") || \"\", context.options.maxTextLength);\n if (element instanceof HTMLFieldSetElement) {\n const legend = element.querySelector(\":scope > legend\");\n if (legend) return getVisibleText(legend, context.options.maxTextLength);\n }\n if (rolesNamedFromContents.has(role)) {\n const ownText = getVisibleText(element, context.options.maxTextLength);\n if (ownText) return ownText;\n }\n return normalizeText(element.getAttribute(\"title\") || \"\", context.options.maxTextLength);\n }\n function computeDescription(element, context) {\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 function labelText(element, context) {\n if (element.labels && element.labels.length > 0) return normalizeText(Array.from(element.labels).map((label) => getVisibleText(label, context.options.maxTextLength)).join(\" \"), context.options.maxTextLength);\n return \"\";\n }\n function getState(element) {\n const state = {};\n if (isHidden(element)) state.hidden = true;\n if (isDisabled(element)) state.disabled = true;\n if (element === document.activeElement) state.focused = true;\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\")) state.checked = element.checked;\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 const expanded = ariaBoolean(element.getAttribute(\"aria-expanded\"));\n if (expanded !== undefined) state.expanded = expanded;\n const pressed = ariaBooleanOrMixed(element.getAttribute(\"aria-pressed\"));\n if (pressed !== undefined) state.pressed = pressed;\n const required = ariaBoolean(element.getAttribute(\"aria-required\"));\n if (required !== undefined) state.required = required;\n else if (\"required\" in element && Boolean(element.required)) state.required = true;\n const invalid = element.getAttribute(\"aria-invalid\");\n if (invalid && invalid !== \"false\") state.invalid = invalid === \"true\" ? true : invalid;\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) if (element.readOnly) state.readonly = true;\n return state;\n }\n function isHidden(element) {\n if (element.hasAttribute(\"hidden\")) return true;\n if (element.getAttribute(\"aria-hidden\") === \"true\") return true;\n const style = getComputedStyle(element);\n if (style.display === \"none\" || style.visibility === \"hidden\" || style.contentVisibility === \"hidden\") return true;\n if (Number(style.opacity) === 0) return true;\n return false;\n }\n function isLikelyAd(element) { const haystack = [element.id, element.getAttribute(\"class\"), element.getAttribute(\"aria-label\"), element.getAttribute(\"data-testid\"), element.getAttribute(\"data-test-id\"), element.getAttribute(\"data-name\")].filter(Boolean).join(\" \").toLowerCase(); if (/\\b(ad|ads|advert|advertisement|sponsor|sponsored|placement)\\b/.test(haystack)) return true; if (element instanceof HTMLAnchorElement && normalizeText(element.textContent || \"\", 80).toLowerCase() === \"ad\") return true; return false; }\n function isDisabled(element) { return element.getAttribute(\"aria-disabled\") === \"true\" || (\"disabled\" in element && Boolean(element.disabled)); }\n function isFocusable(element) {\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 function isInteractive(element, role, focusable) {\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 function appendSpecialChildren(element, node, context) {\n if (!context.options.includeSelectOptions) return;\n if (element instanceof HTMLSelectElement) {\n for (const option of Array.from(element.options)) node.children.push({ id: nextId(context), tag: \"option\", role: \"option\", name: normalizeText(option.textContent || \"\", context.options.maxTextLength), value: option.value, state: { selected: option.selected, disabled: option.disabled }, interactive: false, focusable: false, selector: getCssPath(option), xpath: getXPath(option), children: [] });\n }\n }\n function isCustomElement(element) { return element.tagName.includes(\"-\"); }\n function appendShadowChildren(element, node, context) {\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 function appendFrameChildren(element, node, context) {\n if (!(element instanceof HTMLIFrameElement)) return;\n try {\n const frameDocument = element.contentDocument;\n if (!frameDocument || !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 function unavailableNode(context, tag, reason) { return { id: nextId(context), tag, role: null, name: \"\", interactive: false, focusable: false, unavailableReason: reason, children: [] }; }\n function containerNode(context, tag, children) { return { id: nextId(context), tag, role: null, name: \"\", interactive: false, focusable: false, children }; }\n function getValue(element) { if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) return element.value; return normalizeText(element.getAttribute(\"aria-valuetext\") || element.getAttribute(\"aria-valuenow\") || \"\", 80); }\n function getDirectText(element, maxLength) { return normalizeText(Array.from(element.childNodes).filter((node) => node.nodeType === Node.TEXT_NODE).map((node) => node.textContent || \"\").join(\" \"), maxLength); }\n function getVisibleText(element, maxLength) { const parts = []; function visit(node) { if (node.nodeType === Node.TEXT_NODE) { parts.push(node.textContent || \"\"); return; } if (node.nodeType !== Node.ELEMENT_NODE) return; const childElement = node; if (isHidden(childElement)) return; for (const child of Array.from(childElement.childNodes)) visit(child); } visit(element); return normalizeText(parts.join(\" \"), maxLength); }\n function getAttributes(element) { const attributes = {}; for (const attribute of Array.from(element.attributes)) if (attribute.name === \"id\" || attribute.name === \"href\" || attribute.name === \"type\" || attribute.name === \"role\" || attribute.name === \"alt\" || attribute.name === \"title\" || attribute.name.startsWith(\"aria-\") || attribute.name.startsWith(\"data-\")) attributes[attribute.name] = attribute.value; return attributes; }\n function getBounds(element) { const rect = element.getBoundingClientRect(); return { x: round(rect.x), y: round(rect.y), width: round(rect.width), height: round(rect.height) }; }\n function getCssPath(element) { if (element.id) return \"#\" + cssEscape(element.id); const segments = []; let current = element; while (current && current.nodeType === Node.ELEMENT_NODE && current !== document.documentElement) { const tag = current.tagName.toLowerCase(); const parent = current.parentElement; if (!parent) { segments.unshift(tag); break; } const siblings = Array.from(parent.children).filter((child) => child.tagName === current.tagName); const index = siblings.indexOf(current) + 1; segments.unshift(siblings.length > 1 ? tag + \":nth-of-type(\" + index + \")\" : tag); current = parent; } return segments.join(\" > \"); }\n function getXPath(element) { const segments = []; let current = element; while (current && current.nodeType === Node.ELEMENT_NODE) { const tag = current.tagName.toLowerCase(); const parent = current.parentElement; if (!parent) { segments.unshift(\"/\" + tag + \"[1]\"); break; } const sameTag = Array.from(parent.children).filter((child) => child.tagName === current.tagName); segments.unshift(\"/\" + tag + \"[\" + (sameTag.indexOf(current) + 1) + \"]\"); current = parent; } return segments.join(\"\"); }\n function textFromIds(ids, rootDocument) { return normalizeText(ids.split(/\\s+/).map((id) => { const element = rootDocument.getElementById(id); return element ? getVisibleText(element, 240) : \"\"; }).filter(Boolean).join(\" \"), 240); }\n function normalizeText(value, maxLength) { const normalized = value.replace(/\\s+/g, \" \").trim(); return normalized.length > maxLength ? normalized.slice(0, maxLength - 1) + \"…\" : normalized; }\n function firstToken(value) { return (value && value.trim().split(/\\s+/)[0]) || null; }\n function hasExplicitNameSource(element) { return Boolean(element.getAttribute(\"aria-label\") || element.getAttribute(\"aria-labelledby\") || element.getAttribute(\"title\")); }\n function hasEmptyAlt(element) { return element.hasAttribute(\"alt\") && element.getAttribute(\"alt\") === \"\"; }\n function isButtonLikeInput(input) { return [\"button\", \"image\", \"reset\", \"submit\"].includes((input.getAttribute(\"type\") || \"\").toLowerCase()); }\n function inputFallbackName(input) { const type = (input.getAttribute(\"type\") || \"\").toLowerCase(); if (type === \"submit\") return \"Submit\"; if (type === \"reset\") return \"Reset\"; return \"\"; }\n function ariaBoolean(value) { if (value === \"true\") return true; if (value === \"false\") return false; return undefined; }\n function ariaBooleanOrMixed(value) { if (value === \"mixed\") return \"mixed\"; return ariaBoolean(value); }\n function formatState(state) { if (!state) return \"\"; const entries = Object.entries(state).filter(([, value]) => value !== undefined); return entries.length > 0 ? \" [\" + entries.map(([key, value]) => key + \"=\" + String(value)).join(\" \") + \"]\" : \"\"; }\n function nextId(context) { const id = \"n\" + context.nextId; context.nextId += 1; return id; }\n function round(value) { return Math.round(value * 100) / 100; }\n function cssEscape(value) { if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") return CSS.escape(value); return value.replace(/[^a-zA-Z0-9_-]/g, (char) => \"\\\\\" + char); }\n return { extractSemanticTree, formatSemanticTreeText, observeSemanticTree };\n})();\n`;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { formatSemanticTreeText, observeSemanticTree } from \"./browser\";\nimport { extract as extractStatic, type StaticSemanticTreeOptions } from \"./static\";\nimport type { ExtractorScriptOptions, ObserverScriptOptions, SemanticNode, SemanticTreeOptions } from \"./types\";\n\nexport type {\n AgentContract,\n AgentContractFeature,\n AgentAction,\n AgentActionTargetChoice,\n AgentAnswerPlan,\n AgentBrowserHtmlCapture,\n AgentCitation,\n AgentContinuationMode,\n AgentExpectedOutcome,\n AgentExpectedOutcomeKind,\n AgentExecutorStep,\n AgentExecutionMode,\n AgentFindMatch,\n AgentFindSummary,\n AgentFormChoice,\n AgentFormField,\n AgentFormHiddenField,\n AgentHandoff,\n AgentJsonEnvelope,\n AgentLoopDecision,\n AgentLoopDirective,\n AgentNext,\n AgentPageAction,\n AgentPageAppHint,\n AgentPageAuthorLink,\n AgentPageBarrier,\n AgentPageBreadcrumb,\n AgentPageBreadcrumbItem,\n AgentPageCitation,\n AgentPageCheck,\n AgentPageCodeBlock,\n AgentPageApiEndpoint,\n AgentPageClientState,\n AgentPageConfig,\n AgentPageContactPoint,\n AgentPageDataTable,\n AgentPageDataset,\n AgentPageEvidence,\n AgentPageEmbed,\n AgentPageFaq,\n AgentPageForm,\n AgentPageHydration,\n AgentPageHttpPolicy,\n AgentPageIdentity,\n AgentPageKeyValue,\n AgentPageMedia,\n AgentPageMetaFact,\n AgentPageMetadata,\n AgentPageMobileHint,\n AgentPageOffer,\n AgentPageDecision,\n AgentPagePagination,\n AgentPageProvenance,\n AgentPageResource,\n AgentPageSchemaFact,\n AgentPageSchemaFactValue,\n AgentPageRuntime,\n AgentPageSection,\n AgentPageTimeline,\n AgentPageToc,\n AgentPageTocItem,\n AgentPageTopic,\n AgentPageTranscript,\n AgentQualityGate,\n AgentQualityGateKind,\n AgentReadTarget,\n AgentReadValue,\n AgentReadValueInline,\n AgentReadValueKind,\n AgentReadValuePayload,\n AgentReadValueReference,\n AgentReadValueScalar,\n AgentResultChoice,\n AgentRoutingIntent,\n AgentSearchDecision,\n AgentSemanticSummary,\n AgentSignal,\n AgentSignalKind,\n AgentSignalSeverity,\n AgentSourceChoice,\n AgentSourceSearch,\n AgentSourceSearchResult,\n AgentStatus,\n AgentSummary,\n AgentTarget,\n AgentVerification,\n ExtractMode,\n ExtractorScriptOptions,\n OutputFormat,\n ObserverScriptOptions,\n SemanticNode,\n SemanticNodeBounds,\n SemanticNodeState,\n SemanticTreeChange,\n SemanticTreeObserverOptions,\n SemanticTreeOptions,\n} from \"./types\";\nexport type { StaticSemanticTreeOptions } from \"./static\";\n\nexport { formatSemanticTreeText, observeSemanticTree };\n\nexport function extract(html: string, options?: StaticSemanticTreeOptions): SemanticNode {\n return extractStatic(html, options);\n}\n\nexport function createExtractorScript(options: ExtractorScriptOptions = {}): string {\n const serializedOptions = JSON.stringify(options);\n return `(() => {\n ${browserBundleSource()}\n const options = ${serializedOptions};\n const tree = __AX_LITE__.extractSemanticTree(options);\n return options.format === \"text\" ? __AX_LITE__.formatSemanticTreeText(tree) : tree;\n })()`;\n}\n\nexport function createObserverScript(options: ObserverScriptOptions = {}): string {\n const { globalName = \"__AX_LITE_OBSERVER__\", ...observerOptions } = options;\n const serializedOptions = JSON.stringify(observerOptions);\n const serializedGlobalName = JSON.stringify(globalName);\n return `(() => {\n ${browserBundleSource()}\n const globalName = ${serializedGlobalName};\n const observer = __AX_LITE__.observeSemanticTree((change) => {\n window.dispatchEvent(new CustomEvent(globalName + \":change\", { detail: change }));\n }, ${serializedOptions});\n window[globalName] = observer;\n return observer.snapshot();\n })()`;\n}\n\nexport function flattenSemanticTree(node: SemanticNode): SemanticNode[] {\n const nodes: SemanticNode[] = [];\n const stack = [node];\n while (stack.length > 0) {\n const current = stack.shift();\n if (!current) continue;\n nodes.push(current);\n stack.unshift(...current.children);\n }\n return nodes;\n}\n\nexport function summarizeSemanticTree(node: SemanticNode): {\n nodeCount: number;\n interactiveCount: number;\n roles: Record<string, number>;\n namedRoles: string[];\n} {\n const flat = flattenSemanticTree(node);\n const roles: Record<string, number> = {};\n const namedRoles: string[] = [];\n for (const item of flat) {\n const role = item.role ?? item.tag;\n roles[role] = (roles[role] ?? 0) + 1;\n if (item.role && item.name) namedRoles.push(`${item.role}:${item.name}`);\n }\n return {\n nodeCount: flat.length,\n interactiveCount: flat.filter((item) => item.interactive).length,\n roles,\n namedRoles,\n };\n}\n\nexport function normalizeOptions(options: SemanticTreeOptions = {}): SemanticTreeOptions {\n return {\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 ...options,\n };\n}\n\nfunction browserBundleSource(): string {\n return String.raw`\nconst __AX_LITE__ = (() => {\n const defaultOptions = {\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 const interactiveRoles = new Set([\"button\",\"checkbox\",\"combobox\",\"link\",\"listbox\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"radio\",\"searchbox\",\"slider\",\"spinbutton\",\"switch\",\"tab\",\"textbox\",\"treeitem\"]);\n const landmarkTags = { article: \"article\", aside: \"complementary\", footer: \"contentinfo\", form: \"form\", header: \"banner\", main: \"main\", nav: \"navigation\", section: \"region\" };\n const rolesNamedFromContents = new Set([\"button\",\"cell\",\"checkbox\",\"columnheader\",\"heading\",\"link\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"radio\",\"rowheader\",\"switch\",\"tab\",\"treeitem\"]);\n function extractSemanticTree(options = {}) {\n const rootDocument = document;\n const context = { options: { ...defaultOptions, ...options }, nextId: 1, rootDocument };\n return walkElement(rootDocument.body || rootDocument.documentElement, context) || unavailableNode(context, \"document\", \"Document has no inspectable body\");\n }\n function formatSemanticTreeText(node) {\n const lines = [];\n function visit(current, depth) {\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 visit(node, 0);\n return lines.join(\"\\n\");\n }\n function observeSemanticTree(onChange, options = {}) {\n const root = document.documentElement;\n const debounceMs = options.debounceMs ?? 50;\n let mutationCount = 0;\n let timeoutId;\n function snapshot() { return extractSemanticTree(options); }\n function emit() {\n timeoutId = undefined;\n onChange({ tree: snapshot(), changedAt: Date.now(), mutationCount });\n mutationCount = 0;\n }\n const observer = new MutationObserver((mutations) => {\n mutationCount += mutations.length;\n if (timeoutId !== undefined) window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(emit, debounceMs);\n });\n observer.observe(root, { attributes: true, characterData: true, childList: true, subtree: true });\n return {\n disconnect() {\n if (timeoutId !== undefined) window.clearTimeout(timeoutId);\n observer.disconnect();\n },\n snapshot,\n };\n }\n function walkElement(element, context) {\n if (!context.options.includeHidden && isHidden(element)) return null;\n if (context.options.excludeLikelyAds && isLikelyAd(element)) return null;\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 if (context.options.mode === \"interactive\" && !interactive) return children.length > 0 ? containerNode(context, tag, children) : null;\n if (shouldPrune(element, role, name, interactive, children, context)) return children.length === 1 ? children[0] || null : containerNode(context, tag, children);\n const node = { id: nextId(context), tag, role, name, interactive, focusable, children };\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 appendSpecialChildren(element, node, context);\n appendShadowChildren(element, node, context);\n appendFrameChildren(element, node, context);\n return node;\n }\n function collectChildren(element, context) {\n const children = [];\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, context);\n if (semanticChild) children.push(semanticChild);\n } else if (context.options.includeTextNodes && child.nodeType === Node.TEXT_NODE) {\n const text = normalizeText(child.textContent || \"\", context.options.maxTextLength);\n if (text) children.push({ id: nextId(context), tag: \"#text\", role: \"text\", name: text, text, interactive: false, focusable: false, children: [] });\n }\n }\n return children;\n }\n function shouldPrune(element, role, name, interactive, children, context) {\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 function getRole(element) {\n const explicit = firstToken(element.getAttribute(\"role\"));\n if (explicit) return explicit;\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 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 if (tag === \"input\") return inputRole(element);\n return null;\n }\n function inputRole(input) {\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 function computeName(element, role, context) {\n if (element.getAttribute(\"aria-labelledby\")) {\n const labelled = textFromIds(element.getAttribute(\"aria-labelledby\") || \"\", context.rootDocument);\n if (labelled) return labelled;\n }\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel) return normalizeText(ariaLabel, context.options.maxTextLength);\n if (element instanceof HTMLInputElement && isButtonLikeInput(element)) return normalizeText(element.value || element.getAttribute(\"value\") || inputFallbackName(element), context.options.maxTextLength);\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 if (element instanceof HTMLImageElement) return normalizeText(element.alt || element.getAttribute(\"title\") || \"\", context.options.maxTextLength);\n if (element instanceof HTMLFieldSetElement) {\n const legend = element.querySelector(\":scope > legend\");\n if (legend) return getVisibleText(legend, context.options.maxTextLength);\n }\n if (rolesNamedFromContents.has(role)) {\n const ownText = getVisibleText(element, context.options.maxTextLength);\n if (ownText) return ownText;\n }\n return normalizeText(element.getAttribute(\"title\") || \"\", context.options.maxTextLength);\n }\n function computeDescription(element, context) {\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 function labelText(element, context) {\n if (element.labels && element.labels.length > 0) return normalizeText(Array.from(element.labels).map((label) => getVisibleText(label, context.options.maxTextLength)).join(\" \"), context.options.maxTextLength);\n return \"\";\n }\n function getState(element, context) {\n const state = {};\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 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\")) state.checked = element.checked;\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 const expanded = ariaBoolean(element.getAttribute(\"aria-expanded\"));\n if (expanded !== undefined) state.expanded = expanded;\n const pressed = ariaBooleanOrMixed(element.getAttribute(\"aria-pressed\"));\n if (pressed !== undefined) state.pressed = pressed;\n const required = ariaBoolean(element.getAttribute(\"aria-required\"));\n if (required !== undefined) state.required = required;\n else if (\"required\" in element && Boolean(element.required)) state.required = true;\n const invalid = element.getAttribute(\"aria-invalid\");\n if (invalid && invalid !== \"false\") state.invalid = invalid === \"true\" ? true : invalid;\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) if (element.readOnly) state.readonly = true;\n const current = element.getAttribute(\"aria-current\");\n if (current && current !== \"false\") state.current = current === \"true\" ? true : current;\n const haspopup = element.getAttribute(\"aria-haspopup\");\n if (haspopup && haspopup !== \"false\") state.haspopup = haspopup === \"true\" ? true : haspopup;\n const controls = element.getAttribute(\"aria-controls\");\n if (controls) state.controls = normalizeText(controls, context.options.maxTextLength);\n const live = element.getAttribute(\"aria-live\");\n if (live) state.live = normalizeText(live, context.options.maxTextLength);\n if (element.getAttribute(\"aria-modal\") === \"true\") state.modal = true;\n const orientation = element.getAttribute(\"aria-orientation\");\n if (orientation) state.orientation = normalizeText(orientation, 40);\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 return state;\n }\n function isHidden(element) {\n if (element.hasAttribute(\"hidden\")) return true;\n if (element.getAttribute(\"aria-hidden\") === \"true\") return true;\n const style = getComputedStyle(element);\n if (style.display === \"none\" || style.visibility === \"hidden\" || style.contentVisibility === \"hidden\") return true;\n if (Number(style.opacity) === 0) return true;\n return false;\n }\n function isLikelyAd(element) { const haystack = [element.id, element.getAttribute(\"class\"), element.getAttribute(\"aria-label\"), element.getAttribute(\"data-testid\"), element.getAttribute(\"data-test-id\"), element.getAttribute(\"data-name\")].filter(Boolean).join(\" \").toLowerCase(); if (/\\b(ad|ads|advert|advertisement|sponsor|sponsored|placement)\\b/.test(haystack)) return true; if (element instanceof HTMLAnchorElement && normalizeText(element.textContent || \"\", 80).toLowerCase() === \"ad\") return true; return false; }\n function isDisabled(element) { return element.getAttribute(\"aria-disabled\") === \"true\" || (\"disabled\" in element && Boolean(element.disabled)); }\n function isFocusable(element) {\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 function isInteractive(element, role, focusable) {\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 function appendSpecialChildren(element, node, context) {\n if (!context.options.includeSelectOptions) return;\n if (element instanceof HTMLSelectElement) {\n for (const option of Array.from(element.options)) node.children.push({ id: nextId(context), tag: \"option\", role: \"option\", name: normalizeText(option.textContent || \"\", context.options.maxTextLength), value: option.value, state: { selected: option.selected, disabled: option.disabled }, interactive: false, focusable: false, selector: getCssPath(option), xpath: getXPath(option), children: [] });\n }\n }\n function isCustomElement(element) { return element.tagName.includes(\"-\"); }\n function appendShadowChildren(element, node, context) {\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 function appendFrameChildren(element, node, context) {\n if (!(element instanceof HTMLIFrameElement)) return;\n try {\n const frameDocument = element.contentDocument;\n if (!frameDocument || !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 function unavailableNode(context, tag, reason) { return { id: nextId(context), tag, role: null, name: \"\", interactive: false, focusable: false, unavailableReason: reason, children: [] }; }\n function containerNode(context, tag, children) { return { id: nextId(context), tag, role: null, name: \"\", interactive: false, focusable: false, children }; }\n function getValue(element) { if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) return element.value; return normalizeText(element.getAttribute(\"aria-valuetext\") || element.getAttribute(\"aria-valuenow\") || \"\", 80); }\n function getDirectText(element, maxLength) { return normalizeText(Array.from(element.childNodes).filter((node) => node.nodeType === Node.TEXT_NODE).map((node) => node.textContent || \"\").join(\" \"), maxLength); }\n function getVisibleText(element, maxLength) { const parts = []; function visit(node) { if (node.nodeType === Node.TEXT_NODE) { parts.push(node.textContent || \"\"); return; } if (node.nodeType !== Node.ELEMENT_NODE) return; const childElement = node; if (isHidden(childElement)) return; for (const child of Array.from(childElement.childNodes)) visit(child); } visit(element); return normalizeText(parts.join(\" \"), maxLength); }\n function getAttributes(element) { const attributes = {}; for (const attribute of Array.from(element.attributes)) if (attribute.name === \"id\" || attribute.name === \"href\" || attribute.name === \"type\" || attribute.name === \"role\" || attribute.name === \"alt\" || attribute.name === \"title\" || attribute.name.startsWith(\"aria-\") || attribute.name.startsWith(\"data-\")) attributes[attribute.name] = attribute.value; return attributes; }\n function getBounds(element) { const rect = element.getBoundingClientRect(); return { x: round(rect.x), y: round(rect.y), width: round(rect.width), height: round(rect.height) }; }\n function getCssPath(element) { if (element.id) return \"#\" + cssEscape(element.id); const segments = []; let current = element; while (current && current.nodeType === Node.ELEMENT_NODE && current !== document.documentElement) { const tag = current.tagName.toLowerCase(); const parent = current.parentElement; if (!parent) { segments.unshift(tag); break; } const siblings = Array.from(parent.children).filter((child) => child.tagName === current.tagName); const index = siblings.indexOf(current) + 1; segments.unshift(siblings.length > 1 ? tag + \":nth-of-type(\" + index + \")\" : tag); current = parent; } return segments.join(\" > \"); }\n function getXPath(element) { const segments = []; let current = element; while (current && current.nodeType === Node.ELEMENT_NODE) { const tag = current.tagName.toLowerCase(); const parent = current.parentElement; if (!parent) { segments.unshift(\"/\" + tag + \"[1]\"); break; } const sameTag = Array.from(parent.children).filter((child) => child.tagName === current.tagName); segments.unshift(\"/\" + tag + \"[\" + (sameTag.indexOf(current) + 1) + \"]\"); current = parent; } return segments.join(\"\"); }\n function textFromIds(ids, rootDocument) { return normalizeText(ids.split(/\\s+/).map((id) => { const element = rootDocument.getElementById(id); return element ? getVisibleText(element, 240) : \"\"; }).filter(Boolean).join(\" \"), 240); }\n function normalizeText(value, maxLength) { const normalized = value.replace(/\\s+/g, \" \").trim(); return normalized.length > maxLength ? normalized.slice(0, maxLength - 1) + \"…\" : normalized; }\n function firstToken(value) { return (value && value.trim().split(/\\s+/)[0]) || null; }\n function hasExplicitNameSource(element) { return Boolean(element.getAttribute(\"aria-label\") || element.getAttribute(\"aria-labelledby\") || element.getAttribute(\"title\")); }\n function hasEmptyAlt(element) { return element.hasAttribute(\"alt\") && element.getAttribute(\"alt\") === \"\"; }\n function isButtonLikeInput(input) { return [\"button\", \"image\", \"reset\", \"submit\"].includes((input.getAttribute(\"type\") || \"\").toLowerCase()); }\n function inputFallbackName(input) { const type = (input.getAttribute(\"type\") || \"\").toLowerCase(); if (type === \"submit\") return \"Submit\"; if (type === \"reset\") return \"Reset\"; return \"\"; }\n function ariaBoolean(value) { if (value === \"true\") return true; if (value === \"false\") return false; return undefined; }\n function ariaBooleanOrMixed(value) { if (value === \"mixed\") return \"mixed\"; return ariaBoolean(value); }\n function ariaNumber(value) {\n if (value === null || value.trim() === \"\") return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n function formatState(state) { if (!state) return \"\"; const entries = Object.entries(state).filter(([, value]) => value !== undefined); return entries.length > 0 ? \" [\" + entries.map(([key, value]) => key + \"=\" + String(value)).join(\" \") + \"]\" : \"\"; }\n function nextId(context) { const id = \"n\" + context.nextId; context.nextId += 1; return id; }\n function round(value) { return Math.round(value * 100) / 100; }\n function cssEscape(value) { if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") return CSS.escape(value); return value.replace(/[^a-zA-Z0-9_-]/g, (char) => \"\\\\\" + char); }\n return { extractSemanticTree, formatSemanticTreeText, observeSemanticTree };\n})();\n`;\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmVhB;","names":[]}
|
package/dist/static.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as SemanticTreeOptions, S as SemanticNode } from './types-
|
|
1
|
+
import { a as SemanticTreeOptions, S as SemanticNode } from './types-K1hqb7Pq.js';
|
|
2
2
|
|
|
3
3
|
type StaticSemanticTreeOptions = Pick<SemanticTreeOptions, "excludeLikelyAds" | "excludeLikelyBoilerplate" | "includeAttributes" | "includeHidden" | "includeSelectOptions" | "includeTextNodes" | "maxChildrenPerNode" | "maxLinkFarmChildren" | "maxRepeatedSubtreeInstances" | "maxTextLength" | "mode" | "pruneCollapsedSubtrees" | "pruneLikelyClosedOverlays" | "summarizeLargeSubtrees" | "summarizeLikelyLinkFarms" | "summarizeRepeatedSubtrees">;
|
|
4
4
|
declare function extractStaticSemanticTree(html: string, options?: StaticSemanticTreeOptions): SemanticNode;
|
package/dist/static.js
CHANGED
package/dist/static.js.map
CHANGED
|
File without changes
|