webforai 2.1.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +63 -1
  2. package/dist/adapters/index.js +58 -0
  3. package/dist/adapters/registry.js +149 -0
  4. package/dist/adapters/sites/declarative.js +178 -0
  5. package/dist/adapters/sites/hackernews.js +94 -0
  6. package/dist/adapters/sites/youtube.js +165 -0
  7. package/dist/adapters/types.js +0 -0
  8. package/dist/bin.js +3197 -402
  9. package/dist/cjs/adapters/index.js +86 -0
  10. package/dist/cjs/adapters/registry.js +178 -0
  11. package/dist/cjs/adapters/sites/declarative.js +202 -0
  12. package/dist/cjs/adapters/sites/hackernews.js +117 -0
  13. package/dist/cjs/adapters/sites/youtube.js +191 -0
  14. package/dist/cjs/adapters/types.js +16 -0
  15. package/dist/cjs/constants.js +2 -2
  16. package/dist/cjs/extractors/index.js +5 -0
  17. package/dist/cjs/extractors/lib/constants.js +186 -0
  18. package/dist/cjs/extractors/lib/sanitize.js +425 -0
  19. package/dist/cjs/extractors/lib/score.js +264 -0
  20. package/dist/cjs/extractors/lib/terminators.js +131 -0
  21. package/dist/cjs/extractors/lib/ui-chrome.js +119 -0
  22. package/dist/cjs/extractors/pipeExtractors.js +12 -9
  23. package/dist/cjs/extractors/presets/auto.js +44 -0
  24. package/dist/cjs/extractors/presets/minimal-filter.js +27 -48
  25. package/dist/cjs/extractors/presets/takumi.js +84 -122
  26. package/dist/cjs/html-to-markdown.js +44 -7
  27. package/dist/cjs/html-to-mdast.js +9 -1
  28. package/dist/cjs/index.js +31 -2
  29. package/dist/cjs/mdast-handlers/custom-a-handler.js +25 -9
  30. package/dist/cjs/mdast-handlers/custom-img-handler.js +23 -1
  31. package/dist/cjs/mdast-handlers/custom-table-handler.js +16 -0
  32. package/dist/cjs/mdast-handlers/definition-list-handler.js +99 -0
  33. package/dist/cjs/mdast-handlers/math-handler.js +12 -3
  34. package/dist/cjs/mdast-handlers/sup-sub-handler.js +39 -0
  35. package/dist/cjs/metadata/index.js +223 -0
  36. package/dist/cjs/normalize/index.js +168 -0
  37. package/dist/cjs/platform/client.js +147 -0
  38. package/dist/cjs/platform/error.js +36 -0
  39. package/dist/cjs/platform/fetch.js +37 -0
  40. package/dist/cjs/platform/index.js +40 -0
  41. package/dist/cjs/platform/types.js +34 -0
  42. package/dist/cjs/utils/hast-fast.js +284 -0
  43. package/dist/constants.js +2 -2
  44. package/dist/extractors/index.js +3 -0
  45. package/dist/extractors/lib/constants.js +150 -0
  46. package/dist/extractors/lib/sanitize.js +415 -0
  47. package/dist/extractors/lib/score.js +242 -0
  48. package/dist/extractors/lib/terminators.js +107 -0
  49. package/dist/extractors/lib/ui-chrome.js +96 -0
  50. package/dist/extractors/pipeExtractors.js +12 -9
  51. package/dist/extractors/presets/auto.js +20 -0
  52. package/dist/extractors/presets/minimal-filter.js +35 -47
  53. package/dist/extractors/presets/takumi.js +91 -122
  54. package/dist/html-to-markdown.js +42 -6
  55. package/dist/html-to-mdast.js +9 -1
  56. package/dist/index.js +31 -2
  57. package/dist/mdast-handlers/custom-a-handler.js +25 -9
  58. package/dist/mdast-handlers/custom-img-handler.js +23 -1
  59. package/dist/mdast-handlers/custom-table-handler.js +16 -0
  60. package/dist/mdast-handlers/definition-list-handler.js +76 -0
  61. package/dist/mdast-handlers/math-handler.js +12 -3
  62. package/dist/mdast-handlers/sup-sub-handler.js +16 -0
  63. package/dist/metadata/index.js +198 -0
  64. package/dist/normalize/index.js +149 -0
  65. package/dist/platform/client.js +125 -0
  66. package/dist/platform/error.js +13 -0
  67. package/dist/platform/fetch.js +14 -0
  68. package/dist/platform/index.js +19 -0
  69. package/dist/platform/types.js +9 -0
  70. package/dist/types/adapters/index.d.ts +24 -0
  71. package/dist/types/adapters/index.js.map +1 -0
  72. package/dist/types/adapters/registry.d.ts +35 -0
  73. package/dist/types/adapters/registry.js.map +1 -0
  74. package/dist/types/adapters/sites/declarative.d.ts +13 -0
  75. package/dist/types/adapters/sites/declarative.js.map +1 -0
  76. package/dist/types/adapters/sites/hackernews.d.ts +13 -0
  77. package/dist/types/adapters/sites/hackernews.js.map +1 -0
  78. package/dist/types/adapters/sites/youtube.d.ts +31 -0
  79. package/dist/types/adapters/sites/youtube.js.map +1 -0
  80. package/dist/types/adapters/types.d.ts +99 -0
  81. package/dist/types/adapters/types.js.map +1 -0
  82. package/dist/types/cli/bin.js.map +1 -1
  83. package/dist/types/cli/commands/skill/content.d.ts +9 -0
  84. package/dist/types/cli/commands/skill/content.js.map +1 -0
  85. package/dist/types/cli/commands/skill/index.d.ts +19 -0
  86. package/dist/types/cli/commands/skill/index.js.map +1 -0
  87. package/dist/types/cli/commands/webforai/interactive.d.ts +7 -0
  88. package/dist/types/cli/commands/webforai/interactive.js.map +1 -0
  89. package/dist/types/cli/commands/webforai/loadHtml.js.map +1 -1
  90. package/dist/types/cli/commands/webforai/options.d.ts +55 -0
  91. package/dist/types/cli/commands/webforai/options.js.map +1 -0
  92. package/dist/types/cli/commands/webforai/run.d.ts +10 -0
  93. package/dist/types/cli/commands/webforai/run.js.map +1 -0
  94. package/dist/types/cli/constants.d.ts +14 -4
  95. package/dist/types/cli/constants.js.map +1 -1
  96. package/dist/types/cli/helpers/selectExtractMode.js.map +1 -1
  97. package/dist/types/cli/helpers/selectLoader.js.map +1 -1
  98. package/dist/types/constants.d.ts +7 -1
  99. package/dist/types/constants.js.map +1 -1
  100. package/dist/types/extractors/index.d.ts +1 -0
  101. package/dist/types/extractors/index.js.map +1 -1
  102. package/dist/types/extractors/lib/constants.d.ts +81 -0
  103. package/dist/types/extractors/lib/constants.js.map +1 -0
  104. package/dist/types/extractors/lib/sanitize.d.ts +66 -0
  105. package/dist/types/extractors/lib/sanitize.js.map +1 -0
  106. package/dist/types/extractors/lib/score.d.ts +85 -0
  107. package/dist/types/extractors/lib/score.js.map +1 -0
  108. package/dist/types/extractors/lib/terminators.d.ts +26 -0
  109. package/dist/types/extractors/lib/terminators.js.map +1 -0
  110. package/dist/types/extractors/lib/ui-chrome.d.ts +18 -0
  111. package/dist/types/extractors/lib/ui-chrome.js.map +1 -0
  112. package/dist/types/extractors/pipeExtractors.d.ts +5 -0
  113. package/dist/types/extractors/pipeExtractors.js.map +1 -1
  114. package/dist/types/extractors/presets/auto.d.ts +30 -0
  115. package/dist/types/extractors/presets/auto.js.map +1 -0
  116. package/dist/types/extractors/presets/minimal-filter.d.ts +10 -2
  117. package/dist/types/extractors/presets/minimal-filter.js.map +1 -1
  118. package/dist/types/extractors/presets/takumi.d.ts +19 -3
  119. package/dist/types/extractors/presets/takumi.js.map +1 -1
  120. package/dist/types/extractors/types.d.ts +8 -0
  121. package/dist/types/html-to-markdown.d.ts +38 -0
  122. package/dist/types/html-to-markdown.js.map +1 -1
  123. package/dist/types/html-to-mdast.d.ts +11 -0
  124. package/dist/types/html-to-mdast.js.map +1 -1
  125. package/dist/types/index.d.ts +6 -3
  126. package/dist/types/index.js.map +1 -1
  127. package/dist/types/mdast-handlers/custom-a-handler.js.map +1 -1
  128. package/dist/types/mdast-handlers/custom-img-handler.js.map +1 -1
  129. package/dist/types/mdast-handlers/custom-table-handler.js.map +1 -1
  130. package/dist/types/mdast-handlers/definition-list-handler.d.ts +13 -0
  131. package/dist/types/mdast-handlers/definition-list-handler.js.map +1 -0
  132. package/dist/types/mdast-handlers/math-handler.js.map +1 -1
  133. package/dist/types/mdast-handlers/sup-sub-handler.d.ts +10 -0
  134. package/dist/types/mdast-handlers/sup-sub-handler.js.map +1 -0
  135. package/dist/types/metadata/index.d.ts +47 -0
  136. package/dist/types/metadata/index.js.map +1 -0
  137. package/dist/types/normalize/index.d.ts +53 -0
  138. package/dist/types/normalize/index.js.map +1 -0
  139. package/dist/types/platform/client.d.ts +54 -0
  140. package/dist/types/platform/client.js.map +1 -0
  141. package/dist/types/platform/error.d.ts +20 -0
  142. package/dist/types/platform/error.js.map +1 -0
  143. package/dist/types/platform/fetch.d.ts +34 -0
  144. package/dist/types/platform/fetch.js.map +1 -0
  145. package/dist/types/platform/index.d.ts +4 -0
  146. package/dist/types/platform/index.js.map +1 -0
  147. package/dist/types/platform/types.d.ts +135 -0
  148. package/dist/types/platform/types.js.map +1 -0
  149. package/dist/types/utils/hast-fast.d.ts +101 -0
  150. package/dist/types/utils/hast-fast.js.map +1 -0
  151. package/dist/utils/hast-fast.js +246 -0
  152. package/package.json +10 -3
  153. package/dist/types/cli/commands/webforai/index.d.ts +0 -6
  154. package/dist/types/cli/commands/webforai/index.js.map +0 -1
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Wire types for the webforai platform HTTP API (`/v1`).
3
+ *
4
+ * These mirror the server contract exactly (`apps/platform/src/routes/*` in the webforai
5
+ * repository is the source of truth). Request bodies are validated strictly server-side:
6
+ * unknown keys are a `400`, so the client only ever sends fields the caller provided.
7
+ */
8
+ /** How the platform acquires the page's HTML. */
9
+ export declare const ENGINES: readonly ["fetch", "browser", "proxy-fetch", "proxy-browser"];
10
+ export type Engine = (typeof ENGINES)[number];
11
+ /** Coarse egress location, honoured by the proxy engines only. */
12
+ export declare const REGIONS: readonly ["auto", "us", "eu", "uk", "jp", "asia"];
13
+ export type Region = (typeof REGIONS)[number];
14
+ /** Extraction presets understood by the platform (passed through to the webforai library). */
15
+ export type ExtractorPreset = "auto" | "takumi" | "minimal" | "none";
16
+ export interface ConvertOptions {
17
+ extractor?: ExtractorPreset;
18
+ /** Prepend YAML front matter built from the page's metadata. */
19
+ frontmatter?: boolean;
20
+ /** Base URL used to absolutize relative links; defaults to the fetched URL. */
21
+ baseUrl?: string;
22
+ }
23
+ interface CommonRequestOptions {
24
+ /** Defaults to `fetch` server-side. */
25
+ engine?: Engine;
26
+ /** Browser engines only (`browser`, `proxy-browser`); +1 credit. */
27
+ screenshot?: boolean;
28
+ /** Re-upload the page's images behind expiring URLs; +1 credit per started 5 images. */
29
+ rehostImages?: boolean;
30
+ region?: Region;
31
+ convert?: ConvertOptions;
32
+ }
33
+ export interface ScrapeOptions extends CommonRequestOptions {
34
+ url: string;
35
+ }
36
+ export interface BatchOptions extends CommonRequestOptions {
37
+ /** 1–100 URLs. */
38
+ urls: string[];
39
+ }
40
+ export interface CrawlOptions extends CommonRequestOptions {
41
+ url: string;
42
+ /** 0–5, default 2. */
43
+ maxDepth?: number;
44
+ /** 1–500 pages, default 50. */
45
+ limit?: number;
46
+ /** Regexes matched against the pathname. */
47
+ includePaths?: string[];
48
+ excludePaths?: string[];
49
+ /** The platform currently only supports same-origin crawls; sending `false` is a 400. */
50
+ sameOrigin?: true;
51
+ }
52
+ export interface ScrapeResult {
53
+ /** Final URL after redirects. */
54
+ url: string;
55
+ engine: Engine;
56
+ markdown: string;
57
+ metadata: Record<string, unknown>;
58
+ credits: number;
59
+ /** Present when a screenshot was requested; the URL expires after ~24h. */
60
+ screenshotUrl?: string;
61
+ /** Present when `rehostImages` was requested. */
62
+ images?: {
63
+ original: string;
64
+ rehosted: string;
65
+ }[];
66
+ }
67
+ export interface JobRef {
68
+ jobId: string;
69
+ }
70
+ export type JobType = "batch" | "crawl";
71
+ export type JobState = "queued" | "running" | "completed" | "failed";
72
+ export interface JobStatus {
73
+ jobId: string;
74
+ type: JobType;
75
+ status: JobState;
76
+ total: number;
77
+ completed: number;
78
+ failed: number;
79
+ credits: number;
80
+ /** When the stored results disappear (ISO timestamp, 7 days after creation). */
81
+ expiresAt: string;
82
+ /** Present only when the job failed. */
83
+ error?: string;
84
+ }
85
+ export interface PageError {
86
+ code: string;
87
+ message: string;
88
+ }
89
+ export type PageSuccess = ScrapeResult & {
90
+ status: "ok";
91
+ };
92
+ export interface PageFailure {
93
+ status: "error";
94
+ url: string;
95
+ engine: Engine;
96
+ error: PageError;
97
+ }
98
+ /** One page of an async job, after the client resolves any spilled results. */
99
+ export type PageResult = PageSuccess | PageFailure;
100
+ /**
101
+ * Results larger than ~100KiB are stored out-of-band; the API returns this stub with an
102
+ * expiring `resultUrl` instead of the inline markdown. `jobResults()` resolves these
103
+ * automatically; `getJobResults()` returns them as-is.
104
+ */
105
+ export interface StoredPageStub {
106
+ status: "ok";
107
+ url: string;
108
+ engine: Engine;
109
+ credits: number;
110
+ resultUrl: string;
111
+ }
112
+ export type JobResultItem = PageResult | StoredPageStub;
113
+ export interface JobResultsPage {
114
+ jobId: string;
115
+ status: JobState;
116
+ results: JobResultItem[];
117
+ /** Absent on the last page. */
118
+ cursor?: string;
119
+ }
120
+ export interface DemoScrapeOptions {
121
+ url: string;
122
+ region?: Region;
123
+ }
124
+ export interface DemoResult {
125
+ url: string;
126
+ region: Region;
127
+ /** Truncated to ~8000 characters by the demo endpoint. */
128
+ markdown: string;
129
+ truncated: boolean;
130
+ title?: string;
131
+ metadata: Record<string, unknown>;
132
+ }
133
+ /** Narrows a job-results item to the out-of-band stub form. */
134
+ export declare const isStoredPageStub: (item: JobResultItem) => item is StoredPageStub;
135
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/platform/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,CAAU,CAAC;AAGrF,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAU,CAAC;AAwIzE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAmB,EAA0B,EAAE,CAC/E,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Performance-critical HAST helpers.
3
+ *
4
+ * The v2 extractors leaned on `unist-util-filter` and `hast-util-to-string`, both of which
5
+ * walk (and in the case of `filter`, deep-clone) the entire tree on every call. A single run
6
+ * of `takumiExtractor` therefore cloned the document four times and re-walked it for every
7
+ * length measurement. The helpers here replace both with a single mutation pass and a
8
+ * memoised post-order metric walk.
9
+ */
10
+ import type { Element, Nodes as Hast, Parent, RootContent } from "hast";
11
+ /** Text metrics for a subtree, gathered in one post-order pass. */
12
+ export interface TextMetrics {
13
+ /** Length of the whitespace-normalised text content. */
14
+ text: number;
15
+ /** Length of text that sits inside an `<a>` descendant. */
16
+ link: number;
17
+ /** Number of sentence-separating commas (ASCII, CJK and Arabic). */
18
+ commas: number;
19
+ /** Number of `<p>`, `<pre>` and `<li>` descendants. */
20
+ paragraphs: number;
21
+ /** Number of element descendants (self excluded). */
22
+ elements: number;
23
+ }
24
+ export declare const isElement: (node: unknown) => node is Element;
25
+ export declare const isParent: (node: unknown) => node is Parent;
26
+ /** Normalised class list, tolerating both the array and the raw-string shapes hast can produce. */
27
+ export declare const classList: (element: Element) => string[];
28
+ /** `"tagname#id .class1 .class2"` — the string the heuristic regexps are matched against. */
29
+ export declare const matchString: (element: Element) => string;
30
+ /**
31
+ * A memoised metric collector bound to one snapshot of a tree.
32
+ *
33
+ * The cache is only sound while the tree is unchanged, so callers create a fresh collector
34
+ * after every mutation pass rather than invalidating entries individually.
35
+ */
36
+ export declare class MetricsCollector {
37
+ #private;
38
+ metrics(node: Hast): TextMetrics;
39
+ textLength(node: Hast): number;
40
+ /** Fraction of a subtree's text that is link anchor text. `0` for empty subtrees. */
41
+ linkDensity(node: Hast): number;
42
+ }
43
+ /**
44
+ * Removes every node for which `keep` returns `false`, mutating `tree` in place.
45
+ *
46
+ * Unlike `unist-util-filter` this performs no cloning, so callers own the responsibility of
47
+ * copying the tree beforehand when the input must stay untouched.
48
+ *
49
+ * `keep` is called top-down; returning `false` for a node skips its subtree entirely, which is
50
+ * what makes a single pass sufficient.
51
+ */
52
+ export declare const pruneInPlace: (tree: Hast, keep: (node: Hast) => boolean) => Hast;
53
+ /**
54
+ * Depth-first pre-order walk. Return `false` from `visit` to skip a subtree.
55
+ *
56
+ * `boolean | void` is deliberate: it is the standard visitor signature (unist-util-visit uses
57
+ * the same shape) and lets callers that only observe nodes omit a return entirely.
58
+ */
59
+ export declare const walk: (tree: Hast, visit: (node: Hast, parent: Parent | undefined) => boolean | void) => void;
60
+ /**
61
+ * Collects every element matching `predicate`.
62
+ *
63
+ * This exists to replace repeated `hast-util-select` calls: the CSS engine re-parses the
64
+ * selector and re-walks the tree per call, while callers here usually only need a tag-name or
65
+ * attribute test that a single traversal can answer.
66
+ */
67
+ export declare const collectElements: (tree: Hast, predicate: (element: Element) => boolean) => Element[];
68
+ /** First element matching `predicate`, in document order. */
69
+ export declare const findElement: (tree: Hast, predicate: (element: Element) => boolean) => Element | undefined;
70
+ /**
71
+ * Structural clone of a HAST tree.
72
+ *
73
+ * `structuredClone` is available on every runtime the package targets (Node 18+, Deno, Bun,
74
+ * Workers) and is markedly faster than a JSON round trip, but it rejects the `Object.create(null)`
75
+ * prototypes that some HAST producers use for `properties`, so we fall back on a manual copy.
76
+ */
77
+ export declare const cloneHast: <T extends Hast>(tree: T) => T;
78
+ /** Wraps loose nodes into a root so downstream utilities always receive a single tree. */
79
+ export declare const asRoot: (nodes: Hast | RootContent[]) => Hast;
80
+ /**
81
+ * Reads a raw property, accepting the attribute spelling as written in HTML.
82
+ *
83
+ * `hast-util-from-html` stores attributes under their DOM property names, so `aria-hidden`
84
+ * becomes `ariaHidden` and `data-rwidth` becomes `dataRwidth`. Looking up the hyphenated form
85
+ * directly always misses — a mistake that silently disabled several v2 filters — so this
86
+ * helper checks the verbatim key first and then the camel-cased spelling.
87
+ */
88
+ export declare const property: (element: Element, key: string) => unknown;
89
+ /** Reads a property as a finite number, tolerating the string form attributes arrive in. */
90
+ export declare const numericProperty: (element: Element, key: string) => number | undefined;
91
+ /** Reads a property as a string, joining the array form hast uses for token lists. */
92
+ export declare const stringProperty: (element: Element, key: string) => string | undefined;
93
+ /** True when the attribute is present at all, regardless of its value. */
94
+ export declare const hasProperty: (element: Element, key: string) => boolean;
95
+ /**
96
+ * True for attributes that follow the ARIA/HTML "true unless explicitly false" convention.
97
+ *
98
+ * Boolean HTML attributes (`hidden`) arrive as `true`, while ARIA states arrive as the strings
99
+ * `"true"`/`"false"`, and an empty string means present-and-true.
100
+ */
101
+ export declare const isTruthyAttribute: (element: Element, key: string) => boolean;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hast-fast.js","sourceRoot":"","sources":["../../../src/utils/hast-fast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ // src/utils/hast-fast.ts
2
+ var EMPTY_METRICS = { text: 0, link: 0, commas: 0, paragraphs: 0, elements: 0 };
3
+ var COMMA_REGEX = /[,、,،]/g;
4
+ var PARAGRAPH_LIKE = /* @__PURE__ */ new Set(["p", "pre", "li", "blockquote", "figcaption", "dd", "dt"]);
5
+ var NON_PROSE_TAGS = /* @__PURE__ */ new Set(["script", "style", "noscript", "template", "svg", "math", "iframe", "object"]);
6
+ var isElement = (node) => typeof node === "object" && node !== null && node.type === "element";
7
+ var isParent = (node) => typeof node === "object" && node !== null && Array.isArray(node.children);
8
+ var classList = (element) => {
9
+ const className = element.properties?.className;
10
+ if (Array.isArray(className)) {
11
+ return className;
12
+ }
13
+ if (typeof className === "string") {
14
+ return className.split(/\s+/).filter(Boolean);
15
+ }
16
+ return [];
17
+ };
18
+ var matchString = (element) => {
19
+ const id = element.properties?.id;
20
+ const classes = classList(element);
21
+ if (!id && classes.length === 0) {
22
+ return element.tagName;
23
+ }
24
+ return `${element.tagName} ${typeof id === "string" ? id : ""} ${classes.join(" ")}`;
25
+ };
26
+ var MetricsCollector = class {
27
+ #cache = /* @__PURE__ */ new WeakMap();
28
+ metrics(node) {
29
+ if (node.type === "text") {
30
+ const value = node.value;
31
+ if (value.trim().length === 0) {
32
+ return EMPTY_METRICS;
33
+ }
34
+ return {
35
+ text: value.length,
36
+ link: 0,
37
+ commas: (value.match(COMMA_REGEX) ?? []).length,
38
+ paragraphs: 0,
39
+ elements: 0
40
+ };
41
+ }
42
+ if (!isParent(node)) {
43
+ return EMPTY_METRICS;
44
+ }
45
+ const cached = this.#cache.get(node);
46
+ if (cached) {
47
+ return cached;
48
+ }
49
+ if (isElement(node) && NON_PROSE_TAGS.has(node.tagName)) {
50
+ this.#cache.set(node, EMPTY_METRICS);
51
+ return EMPTY_METRICS;
52
+ }
53
+ let text = 0;
54
+ let link = 0;
55
+ let commas = 0;
56
+ let paragraphs = 0;
57
+ let elements = 0;
58
+ for (const child of node.children) {
59
+ const childMetrics = this.metrics(child);
60
+ text += childMetrics.text;
61
+ link += childMetrics.link;
62
+ commas += childMetrics.commas;
63
+ paragraphs += childMetrics.paragraphs;
64
+ elements += childMetrics.elements;
65
+ if (isElement(child)) {
66
+ elements += 1;
67
+ if (PARAGRAPH_LIKE.has(child.tagName)) {
68
+ paragraphs += 1;
69
+ }
70
+ }
71
+ }
72
+ if (isElement(node) && node.tagName === "a") {
73
+ link = text;
74
+ }
75
+ const metrics = { text, link, commas, paragraphs, elements };
76
+ this.#cache.set(node, metrics);
77
+ return metrics;
78
+ }
79
+ textLength(node) {
80
+ return this.metrics(node).text;
81
+ }
82
+ /** Fraction of a subtree's text that is link anchor text. `0` for empty subtrees. */
83
+ linkDensity(node) {
84
+ const { text, link } = this.metrics(node);
85
+ if (text === 0) {
86
+ return 0;
87
+ }
88
+ return Math.min(1, link / text);
89
+ }
90
+ };
91
+ var pruneInPlace = (tree, keep) => {
92
+ if (!isParent(tree)) {
93
+ return tree;
94
+ }
95
+ const stack = [tree];
96
+ while (stack.length > 0) {
97
+ const parent = stack.pop();
98
+ const children = parent.children;
99
+ let write = 0;
100
+ for (let read = 0; read < children.length; read++) {
101
+ const child = children[read];
102
+ if (!keep(child)) {
103
+ continue;
104
+ }
105
+ children[write++] = child;
106
+ if (isParent(child)) {
107
+ stack.push(child);
108
+ }
109
+ }
110
+ children.length = write;
111
+ }
112
+ return tree;
113
+ };
114
+ var walk = (tree, visit) => {
115
+ const stack = [{ node: tree, parent: void 0 }];
116
+ while (stack.length > 0) {
117
+ const { node, parent } = stack.pop();
118
+ if (visit(node, parent) === false) {
119
+ continue;
120
+ }
121
+ if (isParent(node)) {
122
+ for (let i = node.children.length - 1; i >= 0; i--) {
123
+ stack.push({ node: node.children[i], parent: node });
124
+ }
125
+ }
126
+ }
127
+ };
128
+ var collectElements = (tree, predicate) => {
129
+ const found = [];
130
+ walk(tree, (node) => {
131
+ if (isElement(node) && predicate(node)) {
132
+ found.push(node);
133
+ }
134
+ });
135
+ return found;
136
+ };
137
+ var findElement = (tree, predicate) => {
138
+ let found;
139
+ walk(tree, (node) => {
140
+ if (found) {
141
+ return false;
142
+ }
143
+ if (isElement(node) && predicate(node)) {
144
+ found = node;
145
+ return false;
146
+ }
147
+ });
148
+ return found;
149
+ };
150
+ var cloneHast = (tree) => {
151
+ try {
152
+ return structuredClone(tree);
153
+ } catch {
154
+ return manualClone(tree);
155
+ }
156
+ };
157
+ var manualClone = (node) => {
158
+ if (Array.isArray(node)) {
159
+ return node.map(manualClone);
160
+ }
161
+ if (typeof node !== "object" || node === null) {
162
+ return node;
163
+ }
164
+ const copy = {};
165
+ for (const [key, value] of Object.entries(node)) {
166
+ copy[key] = manualClone(value);
167
+ }
168
+ return copy;
169
+ };
170
+ var asRoot = (nodes) => {
171
+ if (Array.isArray(nodes)) {
172
+ return { type: "root", children: nodes };
173
+ }
174
+ return nodes;
175
+ };
176
+ var property = (element, key) => {
177
+ const properties = element.properties;
178
+ if (!properties) {
179
+ return void 0;
180
+ }
181
+ const direct = properties[key];
182
+ if (direct !== void 0) {
183
+ return direct;
184
+ }
185
+ if (!(key.includes("-") || key.includes(":"))) {
186
+ return void 0;
187
+ }
188
+ return properties[camelCaseAttribute(key)];
189
+ };
190
+ var camelCaseAttribute = (key) => key.replace(/[-:]([a-z])/g, (_, character) => character.toUpperCase());
191
+ var numericProperty = (element, key) => {
192
+ const raw = property(element, key);
193
+ if (typeof raw === "number") {
194
+ return Number.isFinite(raw) ? raw : void 0;
195
+ }
196
+ if (typeof raw === "string" && raw.length > 0) {
197
+ const parsed = Number.parseFloat(raw);
198
+ return Number.isFinite(parsed) ? parsed : void 0;
199
+ }
200
+ return void 0;
201
+ };
202
+ var stringProperty = (element, key) => {
203
+ const raw = property(element, key);
204
+ if (typeof raw === "string") {
205
+ return raw;
206
+ }
207
+ if (Array.isArray(raw)) {
208
+ return raw.join(" ");
209
+ }
210
+ if (raw === true) {
211
+ return "";
212
+ }
213
+ return void 0;
214
+ };
215
+ var hasProperty = (element, key) => property(element, key) !== void 0;
216
+ var isTruthyAttribute = (element, key) => {
217
+ const raw = property(element, key);
218
+ if (raw === void 0 || raw === null || raw === false) {
219
+ return false;
220
+ }
221
+ if (raw === true) {
222
+ return true;
223
+ }
224
+ if (typeof raw === "string") {
225
+ return raw.toLowerCase() !== "false";
226
+ }
227
+ return true;
228
+ };
229
+ export {
230
+ MetricsCollector,
231
+ asRoot,
232
+ classList,
233
+ cloneHast,
234
+ collectElements,
235
+ findElement,
236
+ hasProperty,
237
+ isElement,
238
+ isParent,
239
+ isTruthyAttribute,
240
+ matchString,
241
+ numericProperty,
242
+ property,
243
+ pruneInPlace,
244
+ stringProperty,
245
+ walk
246
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webforai",
3
- "version": "2.1.1",
3
+ "version": "3.0.0",
4
4
  "description": "A library that provides a web interface for AI",
5
5
  "author": "inaridiy",
6
6
  "license": "Apache-2.0",
@@ -38,6 +38,11 @@
38
38
  "import": "./dist/index.js",
39
39
  "require": "./dist/cjs/index.js"
40
40
  },
41
+ "./platform": {
42
+ "types": "./dist/types/platform/index.d.ts",
43
+ "import": "./dist/platform/index.js",
44
+ "require": "./dist/cjs/platform/index.js"
45
+ },
41
46
  "./loaders/playwright": {
42
47
  "types": "./dist/types/loaders/playwright.d.ts",
43
48
  "import": "./dist/loaders/playwright.js",
@@ -75,6 +80,9 @@
75
80
  ],
76
81
  "loaders/puppeteer": [
77
82
  "./dist/types/loaders/puppeteer.d.ts"
83
+ ],
84
+ "platform": [
85
+ "./dist/types/platform/index.d.ts"
78
86
  ]
79
87
  }
80
88
  },
@@ -110,8 +118,7 @@
110
118
  "mdast-util-to-markdown": "^2.1.0",
111
119
  "picocolors": "^1.0.1",
112
120
  "trim-trailing-lines": "^2.1.0",
113
- "unist-util-filter": "^5.0.1",
114
- "zx": "^8.1.5"
121
+ "unist-util-filter": "^5.0.1"
115
122
  },
116
123
  "devDependencies": {
117
124
  "@cloudflare/puppeteer": "^0.0.6",
@@ -1,6 +0,0 @@
1
- export declare const webforaiCommand: (initialPath: string, options: {
2
- output?: string;
3
- mode?: string;
4
- loader?: string;
5
- debug?: boolean;
6
- }) => Promise<void>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/cli/commands/webforai/index.ts"],"names":[],"mappings":"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"}