smart-web-mcp 0.44.0 → 1.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 (159) hide show
  1. package/CHANGELOG.md +352 -1
  2. package/README.md +33 -566
  3. package/dist/assessment.d.ts +10 -3
  4. package/dist/assessment.js +21 -6
  5. package/dist/assessment.js.map +1 -1
  6. package/dist/body-export.d.ts +10 -0
  7. package/dist/body-export.js +28 -0
  8. package/dist/body-export.js.map +1 -0
  9. package/dist/browser-session.d.ts +32 -1
  10. package/dist/browser-session.js +373 -3
  11. package/dist/browser-session.js.map +1 -1
  12. package/dist/cli-fetch-options.d.ts +7 -0
  13. package/dist/cli-fetch-options.js +41 -0
  14. package/dist/cli-fetch-options.js.map +1 -0
  15. package/dist/cli.js +31 -12
  16. package/dist/cli.js.map +1 -1
  17. package/dist/comment-export.d.ts +10 -0
  18. package/dist/comment-export.js +39 -0
  19. package/dist/comment-export.js.map +1 -0
  20. package/dist/composition.d.ts +1 -22
  21. package/dist/composition.js +0 -16
  22. package/dist/composition.js.map +1 -1
  23. package/dist/extraction/budget.d.ts +3 -0
  24. package/dist/extraction/budget.js +88 -7
  25. package/dist/extraction/budget.js.map +1 -1
  26. package/dist/extraction/document.js +134 -9
  27. package/dist/extraction/document.js.map +1 -1
  28. package/dist/korea/coupang-filters.d.ts +5 -0
  29. package/dist/korea/coupang-filters.js +87 -0
  30. package/dist/korea/coupang-filters.js.map +1 -0
  31. package/dist/korea/coupang.d.ts +27 -6
  32. package/dist/korea/coupang.js +202 -82
  33. package/dist/korea/coupang.js.map +1 -1
  34. package/dist/korea/proxy-client.d.ts +1 -0
  35. package/dist/korea/proxy-client.js +6 -2
  36. package/dist/korea/proxy-client.js.map +1 -1
  37. package/dist/korea/smartvertical.d.ts +1 -0
  38. package/dist/korea/smartvertical.js +39 -25
  39. package/dist/korea/smartvertical.js.map +1 -1
  40. package/dist/lib.d.ts +4 -2
  41. package/dist/lib.js +2 -1
  42. package/dist/lib.js.map +1 -1
  43. package/dist/mcp-server.js +39 -15
  44. package/dist/mcp-server.js.map +1 -1
  45. package/dist/operator-browser-fixture.d.ts +7 -0
  46. package/dist/operator-browser-fixture.js +19 -0
  47. package/dist/operator-browser-fixture.js.map +1 -0
  48. package/dist/operator-canary-cli.d.ts +6 -0
  49. package/dist/operator-canary-cli.js +190 -0
  50. package/dist/operator-canary-cli.js.map +1 -0
  51. package/dist/operator-canary.d.ts +74 -0
  52. package/dist/operator-canary.js +135 -0
  53. package/dist/operator-canary.js.map +1 -0
  54. package/dist/operator-cdp.d.ts +15 -0
  55. package/dist/operator-cdp.js +195 -0
  56. package/dist/operator-cdp.js.map +1 -0
  57. package/dist/operator-frame.d.ts +3 -0
  58. package/dist/operator-frame.js +55 -0
  59. package/dist/operator-frame.js.map +1 -0
  60. package/dist/settings.d.ts +3 -0
  61. package/dist/settings.js +1 -0
  62. package/dist/settings.js.map +1 -1
  63. package/dist/shared.d.ts +47 -10
  64. package/dist/shared.js +15 -9
  65. package/dist/shared.js.map +1 -1
  66. package/dist/smartbrowser.d.ts +169 -0
  67. package/dist/smartbrowser.js +288 -0
  68. package/dist/smartbrowser.js.map +1 -0
  69. package/dist/smartcrawl.js +16 -21
  70. package/dist/smartcrawl.js.map +1 -1
  71. package/dist/smartfetch/academic-fallback.js +3 -5
  72. package/dist/smartfetch/academic-fallback.js.map +1 -1
  73. package/dist/smartfetch/archive-fallback.js +2 -5
  74. package/dist/smartfetch/archive-fallback.js.map +1 -1
  75. package/dist/smartfetch/assets.d.ts +1 -1
  76. package/dist/smartfetch/assets.js +28 -1
  77. package/dist/smartfetch/assets.js.map +1 -1
  78. package/dist/smartfetch/jina-reader.d.ts +1 -0
  79. package/dist/smartfetch/jina-reader.js +17 -3
  80. package/dist/smartfetch/jina-reader.js.map +1 -1
  81. package/dist/smartfetch/pipeline.js +15 -25
  82. package/dist/smartfetch/pipeline.js.map +1 -1
  83. package/dist/smartfetch/provider-policy.d.ts +3 -0
  84. package/dist/smartfetch/provider-policy.js +45 -2
  85. package/dist/smartfetch/provider-policy.js.map +1 -1
  86. package/dist/smartfetch/provider-types.d.ts +8 -0
  87. package/dist/smartfetch/providers/article.js +76 -10
  88. package/dist/smartfetch/providers/article.js.map +1 -1
  89. package/dist/smartfetch/providers/blind-post.d.ts +2 -0
  90. package/dist/smartfetch/providers/blind-post.js +167 -0
  91. package/dist/smartfetch/providers/blind-post.js.map +1 -0
  92. package/dist/smartfetch/providers/clien.d.ts +2 -0
  93. package/dist/smartfetch/providers/clien.js +157 -0
  94. package/dist/smartfetch/providers/clien.js.map +1 -0
  95. package/dist/smartfetch/providers/commerce.d.ts +15 -0
  96. package/dist/smartfetch/providers/commerce.js +123 -7
  97. package/dist/smartfetch/providers/commerce.js.map +1 -1
  98. package/dist/smartfetch/providers/dcinside.js +313 -20
  99. package/dist/smartfetch/providers/dcinside.js.map +1 -1
  100. package/dist/smartfetch/providers/hackernews-html.d.ts +21 -0
  101. package/dist/smartfetch/providers/hackernews-html.js +148 -0
  102. package/dist/smartfetch/providers/hackernews-html.js.map +1 -0
  103. package/dist/smartfetch/providers/hackernews.js +76 -14
  104. package/dist/smartfetch/providers/hackernews.js.map +1 -1
  105. package/dist/smartfetch/providers/index.js +7 -1
  106. package/dist/smartfetch/providers/index.js.map +1 -1
  107. package/dist/smartfetch/providers/linkedin.js +2 -1
  108. package/dist/smartfetch/providers/linkedin.js.map +1 -1
  109. package/dist/smartfetch/providers/naver-blog.d.ts +2 -0
  110. package/dist/smartfetch/providers/naver-blog.js +87 -45
  111. package/dist/smartfetch/providers/naver-blog.js.map +1 -1
  112. package/dist/smartfetch/providers/naver-cafe-native.d.ts +7 -0
  113. package/dist/smartfetch/providers/naver-cafe-native.js +188 -0
  114. package/dist/smartfetch/providers/naver-cafe-native.js.map +1 -0
  115. package/dist/smartfetch/providers/naver-cafe.js +165 -4
  116. package/dist/smartfetch/providers/naver-cafe.js.map +1 -1
  117. package/dist/smartfetch/providers/naver-map-search.js +1 -1
  118. package/dist/smartfetch/providers/naver-map-search.js.map +1 -1
  119. package/dist/smartfetch/providers/ppomppu.d.ts +2 -0
  120. package/dist/smartfetch/providers/ppomppu.js +289 -0
  121. package/dist/smartfetch/providers/ppomppu.js.map +1 -0
  122. package/dist/smartfetch/providers/reddit.js +24 -3
  123. package/dist/smartfetch/providers/reddit.js.map +1 -1
  124. package/dist/smartfetch/providers/threads.js +1 -1
  125. package/dist/smartfetch/providers/threads.js.map +1 -1
  126. package/dist/smartfetch/providers/wikipedia.js +138 -0
  127. package/dist/smartfetch/providers/wikipedia.js.map +1 -1
  128. package/dist/smartfetch.d.ts +11 -2
  129. package/dist/smartfetch.js +369 -78
  130. package/dist/smartfetch.js.map +1 -1
  131. package/dist/smartsearch-brave.d.ts +2 -0
  132. package/dist/smartsearch-brave.js +43 -0
  133. package/dist/smartsearch-brave.js.map +1 -0
  134. package/dist/smartsearch-browser.d.ts +5 -0
  135. package/dist/smartsearch-browser.js +116 -0
  136. package/dist/smartsearch-browser.js.map +1 -0
  137. package/dist/smartsearch-ddg.d.ts +2 -0
  138. package/dist/smartsearch-ddg.js +46 -0
  139. package/dist/smartsearch-ddg.js.map +1 -0
  140. package/dist/smartsearch-node.d.ts +6 -0
  141. package/dist/smartsearch-node.js +21 -0
  142. package/dist/smartsearch-node.js.map +1 -0
  143. package/dist/smartsearch-postgresql.d.ts +7 -0
  144. package/dist/smartsearch-postgresql.js +44 -0
  145. package/dist/smartsearch-postgresql.js.map +1 -0
  146. package/dist/smartsearch-python.d.ts +8 -0
  147. package/dist/smartsearch-python.js +87 -0
  148. package/dist/smartsearch-python.js.map +1 -0
  149. package/dist/smartsearch-quality.d.ts +6 -0
  150. package/dist/smartsearch-quality.js +47 -0
  151. package/dist/smartsearch-quality.js.map +1 -0
  152. package/dist/smartsearch-youtube.d.ts +7 -0
  153. package/dist/smartsearch-youtube.js +76 -0
  154. package/dist/smartsearch-youtube.js.map +1 -0
  155. package/dist/smartsearch.d.ts +3 -0
  156. package/dist/smartsearch.js +617 -132
  157. package/dist/smartsearch.js.map +1 -1
  158. package/package.json +8 -5
  159. package/python/requirements-undetected-chromedriver.txt +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartsearch-postgresql.js","sourceRoot":"","sources":["../src/smartsearch-postgresql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { BrowserPageSnapshot } from "./browser-session.js";
2
+ import type { SearchResult } from "./shared.js";
3
+ export declare function unscopedPythonDocsTerms(query: string): string | undefined;
4
+ export declare function pythonDocsSearchUrl(scope: {
5
+ host: string;
6
+ path: string;
7
+ } | null, terms: string): string | undefined;
8
+ export declare function parsePythonDocsSearch(snapshot: BrowserPageSnapshot, searchUrl: string, query: string): SearchResult[];
@@ -0,0 +1,87 @@
1
+ import { parseHTML } from "linkedom";
2
+ import { browserSearchMatchesQuery } from "./smartsearch-browser.js";
3
+ // Only a plainly stated, unscoped official-documentation intent is translated.
4
+ // General Python questions and queries with operators stay with general search.
5
+ export function unscopedPythonDocsTerms(query) {
6
+ const match = /^python\s+(.+?)\s+documentation$/i.exec(query);
7
+ if (!match || /\b(?:site|after|before):/i.test(query))
8
+ return undefined;
9
+ const terms = match[1].trim();
10
+ return pythonDocsSearchUrl({ host: "docs.python.org", path: "3" }, terms) ? terms : undefined;
11
+ }
12
+ // The observed Python/Sphinx search UI is a local-browser continuation, not an
13
+ // arbitrary site crawler. Only simple terms and positive phrases are translated.
14
+ export function pythonDocsSearchUrl(scope, terms) {
15
+ if (scope?.host !== "docs.python.org" || !terms || !/^[\p{L}\p{N}\s._"-]+$/u.test(terms)
16
+ || /(?:^|\s)(?:-|AND\b|OR\b|NOT\b)/i.test(terms) || !/^(?:[^"]|"[^"]+")*$/.test(terms))
17
+ return undefined;
18
+ const version = scope.path ? scope.path.match(/^(3(?:\.\d+)?)(?:\/|$)/)?.[1] : "3";
19
+ if (!version)
20
+ return undefined;
21
+ const url = new URL(`https://docs.python.org/${version}/search.html`);
22
+ url.searchParams.set("q", terms.replaceAll('"', "").replace(/\s+/g, " ").trim());
23
+ return url.href;
24
+ }
25
+ export function parsePythonDocsSearch(snapshot, searchUrl, query) {
26
+ const expected = new URL(searchUrl);
27
+ const final = new URL(snapshot.final_url);
28
+ if (final.origin !== expected.origin || final.username || final.password || final.pathname !== expected.pathname
29
+ || final.searchParams.getAll("q").length !== 1 || final.searchParams.get("q") !== expected.searchParams.get("q"))
30
+ return [];
31
+ const { document } = parseHTML(snapshot.html);
32
+ for (const node of document.querySelectorAll('script, style, noscript, template, [hidden], [inert], [aria-hidden="true"]'))
33
+ node.remove();
34
+ for (const node of document.querySelectorAll("[style]")) {
35
+ if (/(?:^|;)\s*(?:display\s*:\s*none|visibility\s*:\s*(?:hidden|collapse))\s*(?:!important)?\s*(?:;|$)/i.test(node.getAttribute("style") || ""))
36
+ node.remove();
37
+ }
38
+ const roots = document.querySelectorAll("#search-results");
39
+ if (roots.length !== 1)
40
+ return [];
41
+ const root = roots[0];
42
+ const headings = [...root.children].filter(node => node.tagName === "H2");
43
+ const summaries = [...root.children].filter(node => node.classList.contains("search-summary"));
44
+ const finished = summaries.length === 1 && summaries[0].textContent?.trim().match(/^Search finished, found ([1-9]\d*) pages? matching the search query\.$/);
45
+ if (headings.length !== 1 || headings[0].textContent?.trim() !== "Search Results" || !finished)
46
+ return [];
47
+ const text = (node) => {
48
+ if (!node)
49
+ return "";
50
+ const copy = node.cloneNode(true);
51
+ for (const nested of copy.querySelectorAll("a, ul, ol, li, .context"))
52
+ nested.remove();
53
+ return (copy.textContent || "").replace(/\s+/g, " ").trim();
54
+ };
55
+ const rows = new Map();
56
+ for (const item of root.querySelectorAll("ul.search > li")) {
57
+ if (item.parentElement?.parentElement !== root)
58
+ continue;
59
+ const anchors = [...item.children].filter(node => node.tagName === "A");
60
+ if (anchors.length !== 1)
61
+ continue;
62
+ const anchor = anchors[0];
63
+ let url;
64
+ try {
65
+ url = new URL(anchor.getAttribute("href") || "", searchUrl);
66
+ }
67
+ catch {
68
+ continue;
69
+ }
70
+ const versionRoot = expected.pathname.replace(/search\.html$/, "");
71
+ if (url.origin !== expected.origin || url.username || url.password || !url.pathname.startsWith(versionRoot)
72
+ || !url.pathname.endsWith(".html") || url.pathname === expected.pathname || url.search)
73
+ continue;
74
+ const snippet = [...item.children].find(node => node.classList.contains("context")) || null;
75
+ const row = { url: url.href, title: text(anchor), snippet: text(snippet).slice(0, 1000), engine: "python_docs_browser" };
76
+ if (!row.title || !browserSearchMatchesQuery(row, query))
77
+ continue;
78
+ // Multiple symbol matches on one documentation page are one original.
79
+ url.hash = "";
80
+ if (!rows.has(url.href))
81
+ rows.set(url.href, row);
82
+ if (rows.size >= 100)
83
+ break;
84
+ }
85
+ return [...rows.values()];
86
+ }
87
+ //# sourceMappingURL=smartsearch-python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartsearch-python.js","sourceRoot":"","sources":["../src/smartsearch-python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SearchResult } from "./shared.js";
2
+ export declare function isSearchTrackingRelay(result: SearchResult): boolean;
3
+ export declare function koreanDiscoveryTerms(query: string): string[];
4
+ export declare function discoveryEvidenceScore(result: SearchResult, terms: string[]): number;
5
+ export declare function rankDiscoveryResults(results: SearchResult[], terms: string[]): SearchResult[];
6
+ export declare function hasDiscoveryYield(results: SearchResult[], terms: string[], requested: number): boolean;
@@ -0,0 +1,47 @@
1
+ import { naverCafeMobilePostUrl } from "./smartfetch/providers/naver-cafe-native.js";
2
+ // A known outbound relay is not an original post even when its host matches
3
+ // site:. Do not navigate it, trust its label, or promote its encoded target to
4
+ // verified content. Normal board/post query parameters remain untouched.
5
+ export function isSearchTrackingRelay(result) {
6
+ try {
7
+ const url = new URL(result.url);
8
+ return url.hostname === "s.ppomppu.co.kr" && url.pathname === "/" && url.searchParams.has("target");
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ // A discovery-yield signal, not a Boolean/quote/body relevance oracle. Complex
15
+ // operators stay with the engine. Do not reject an original just because its
16
+ // snippet omits a word. Whitespace folding handles 부분 도배/부분도배.
17
+ export function koreanDiscoveryTerms(query) {
18
+ if (!/[가-힣]/u.test(query) || /[()"']|\b(?:OR|AND|NOT)\b/.test(query))
19
+ return [];
20
+ const text = query.replace(/(?:^|\s)-?[\w]+:[^\s]+/g, " ");
21
+ return [...new Set(text.split(/\s+/).filter((term) => !term.startsWith("-"))
22
+ .map((term) => term.toLowerCase().replace(/[^\p{L}\p{N}]/gu, ""))
23
+ .filter((term) => term.length >= 2))];
24
+ }
25
+ export function discoveryEvidenceScore(result, terms) {
26
+ const evidence = `${result.title} ${result.snippet}`.toLowerCase().replace(/[^\p{L}\p{N}]/gu, "");
27
+ return terms.filter((term) => evidence.includes(term)).length;
28
+ }
29
+ export function rankDiscoveryResults(results, terms) {
30
+ // Title evidence is more specific than incidental words in a broad snippet.
31
+ const rank = (result) => discoveryEvidenceScore(result, terms)
32
+ + 2 * discoveryEvidenceScore({ ...result, snippet: "" }, terms)
33
+ // A menu listing is a lead, not the requested article. Break topical ties
34
+ // only for a validated native post URL; do not discard menu-only results.
35
+ + (terms.length && naverCafeMobilePostUrl(result.url) ? 1 : 0);
36
+ const unique = new Map();
37
+ for (const result of results) {
38
+ const previous = unique.get(result.url);
39
+ if (!previous || rank(result) > rank(previous))
40
+ unique.set(result.url, result);
41
+ }
42
+ return [...unique.values()].sort((a, b) => rank(b) - rank(a));
43
+ }
44
+ export function hasDiscoveryYield(results, terms, requested) {
45
+ return !terms.length || results.filter((row) => discoveryEvidenceScore(row, terms) >= Math.min(2, terms.length)).length >= Math.min(3, requested);
46
+ }
47
+ //# sourceMappingURL=smartsearch-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartsearch-quality.js","sourceRoot":"","sources":["../src/smartsearch-quality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BrowserPageSnapshot } from "./browser-session.js";
2
+ import type { SearchResult } from "./shared.js";
3
+ export declare function youtubeSearchUrl(scope: {
4
+ host: string;
5
+ path: string;
6
+ } | null, terms: string): string | undefined;
7
+ export declare function parseYoutubeSearch(snapshot: BrowserPageSnapshot, searchUrl: string, query: string): SearchResult[];
@@ -0,0 +1,76 @@
1
+ import { parseHTML } from "linkedom";
2
+ import { browserSearchMatchesQuery } from "./smartsearch-browser.js";
3
+ // Native search is a narrow continuation for an explicit watch-page scope.
4
+ // Unsupported operators must remain with the original general query.
5
+ export function youtubeSearchUrl(scope, terms) {
6
+ if (scope?.host !== "youtube.com" || scope.path !== "watch" || !terms
7
+ || !/^[\p{L}\p{N}\s._"-]+$/u.test(terms)
8
+ || /(?:^|\s)(?:-|AND\b|OR\b|NOT\b|after:|before:)/i.test(terms)
9
+ || !/^(?:[^"]|"[^"]+")*$/.test(terms))
10
+ return undefined;
11
+ const url = new URL("https://www.youtube.com/results");
12
+ url.searchParams.set("search_query", terms);
13
+ return url.href;
14
+ }
15
+ export function parseYoutubeSearch(snapshot, searchUrl, query) {
16
+ let final;
17
+ try {
18
+ final = new URL(snapshot.final_url);
19
+ }
20
+ catch {
21
+ return [];
22
+ }
23
+ const expected = new URL(searchUrl);
24
+ if (final.origin !== expected.origin || final.username || final.password || final.pathname !== expected.pathname
25
+ || final.searchParams.getAll("search_query").length !== 1
26
+ || final.searchParams.get("search_query") !== expected.searchParams.get("search_query"))
27
+ return [];
28
+ const positiveTerms = (expected.searchParams.get("search_query") || "").replace(/"[^"]+"/g, " ").match(/[\p{L}\p{N}._-]+/gu) || [];
29
+ const matchesPositiveTerms = (title) => {
30
+ const normalized = title.normalize("NFKC").toLowerCase();
31
+ return positiveTerms.every(term => {
32
+ // Review/use report are observed headline equivalents, not evidence of
33
+ // the actual video's contents. Other positives require literal titles.
34
+ if (term === "리뷰")
35
+ return /리뷰|후기|사용기|\breview\b/i.test(normalized);
36
+ const value = term.normalize("NFKC").toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
37
+ return new RegExp(`${/^[a-z0-9]/.test(value) ? "(?<![a-z0-9])" : ""}${value}${/[a-z0-9]$/.test(value) ? "(?![a-z0-9])" : ""}`).test(normalized);
38
+ });
39
+ };
40
+ const { document } = parseHTML(snapshot.html);
41
+ for (const node of document.querySelectorAll('script, style, noscript, template, [hidden], [inert], [aria-hidden="true"], [data-ad]'))
42
+ node.remove();
43
+ for (const node of document.querySelectorAll("[style]")) {
44
+ if (/(?:^|;)\s*(?:display\s*:\s*none|visibility\s*:\s*(?:hidden|collapse))\s*(?:!important)?\s*(?:;|$)/i.test(node.getAttribute("style") || ""))
45
+ node.remove();
46
+ }
47
+ const rows = new Map();
48
+ for (const card of document.querySelectorAll("ytd-video-renderer")) {
49
+ const anchors = [...card.querySelectorAll("a#video-title[href]")].filter(node => node.closest("ytd-video-renderer") === card);
50
+ if (anchors.length !== 1)
51
+ continue;
52
+ const anchor = anchors[0];
53
+ let url;
54
+ try {
55
+ url = new URL(anchor.getAttribute("href") || "", expected);
56
+ }
57
+ catch {
58
+ continue;
59
+ }
60
+ const id = url.searchParams.getAll("v");
61
+ if (url.origin !== expected.origin || url.username || url.password || url.pathname !== "/watch"
62
+ || id.length !== 1 || !/^[a-zA-Z0-9_-]{11}$/.test(id[0]))
63
+ continue;
64
+ const title = (anchor.getAttribute("title") || anchor.textContent || "").replace(/\s+/g, " ").trim();
65
+ if (!title)
66
+ continue;
67
+ const row = { url: `https://www.youtube.com/watch?v=${id[0]}`, title, snippet: "", engine: "youtube_browser" };
68
+ if (!browserSearchMatchesQuery(row, query) || !matchesPositiveTerms(title))
69
+ continue;
70
+ rows.set(row.url, row);
71
+ if (rows.size >= 100)
72
+ break;
73
+ }
74
+ return [...rows.values()];
75
+ }
76
+ //# sourceMappingURL=smartsearch-youtube.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartsearch-youtube.js","sourceRoot":"","sources":["../src/smartsearch-youtube.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { SearchResponse } from "./shared.js";
2
2
  import { SmartcrawlMode, runSmartcrawl } from "./smartcrawl.js";
3
3
  import { type SmartfetchBudgetPreset } from "./extraction/budget.js";
4
+ import { runBrowserSession } from "./browser-session.js";
4
5
  export type SmartsearchOptions = {
5
6
  query: string;
6
7
  numResults?: number;
@@ -18,7 +19,9 @@ export type SmartsearchOptions = {
18
19
  };
19
20
  export type SmartsearchRuntime = {
20
21
  runSmartcrawl?: typeof runSmartcrawl;
22
+ runBrowserSession?: typeof runBrowserSession;
21
23
  };
22
24
  export declare function projectSmartsearchOutput(response: SearchResponse, preset?: SmartfetchBudgetPreset): SearchResponse;
25
+ export declare function isSmartsearchExecutionFailure(response: Pick<SearchResponse, "execution">): boolean;
23
26
  export declare function runSmartsearch(options: SmartsearchOptions, runtime?: SmartsearchRuntime): Promise<SearchResponse>;
24
27
  export declare function renderSmartsearch(response: SearchResponse): string;