mcp-scraper 0.3.6 → 0.3.8

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 (44) hide show
  1. package/README.md +21 -29
  2. package/dist/bin/api-server.cjs +159 -322
  3. package/dist/bin/api-server.cjs.map +1 -1
  4. package/dist/bin/api-server.js +1 -1
  5. package/dist/bin/browser-agent-stdio-server.cjs +43 -1754
  6. package/dist/bin/browser-agent-stdio-server.cjs.map +1 -1
  7. package/dist/bin/browser-agent-stdio-server.js +2 -4
  8. package/dist/bin/browser-agent-stdio-server.js.map +1 -1
  9. package/dist/bin/mcp-scraper-cli.cjs +48 -329
  10. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  11. package/dist/bin/mcp-scraper-cli.js +8 -92
  12. package/dist/bin/mcp-scraper-cli.js.map +1 -1
  13. package/dist/bin/mcp-scraper-combined-stdio-server.cjs +83 -1801
  14. package/dist/bin/mcp-scraper-combined-stdio-server.cjs.map +1 -1
  15. package/dist/bin/mcp-scraper-combined-stdio-server.js +4 -6
  16. package/dist/bin/mcp-scraper-combined-stdio-server.js.map +1 -1
  17. package/dist/bin/mcp-scraper-install.cjs +4 -4
  18. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  19. package/dist/bin/mcp-scraper-install.js +2 -2
  20. package/dist/bin/mcp-stdio-server.cjs +19 -26
  21. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  22. package/dist/bin/mcp-stdio-server.js +2 -2
  23. package/dist/chunk-7I6PA2UQ.js +7 -0
  24. package/dist/chunk-7I6PA2UQ.js.map +1 -0
  25. package/dist/{chunk-RVYHP7QN.js → chunk-ELI6NDEG.js} +4 -4
  26. package/dist/{chunk-RVYHP7QN.js.map → chunk-ELI6NDEG.js.map} +1 -1
  27. package/dist/{chunk-ROZEDHAA.js → chunk-FU3WERZ7.js} +20 -27
  28. package/dist/chunk-FU3WERZ7.js.map +1 -0
  29. package/dist/{chunk-TK4D2BZ5.js → chunk-VQFVA6RH.js} +17 -698
  30. package/dist/chunk-VQFVA6RH.js.map +1 -0
  31. package/dist/{server-YSKBD2VX.js → server-7CGBJWJY.js} +836 -114
  32. package/dist/server-7CGBJWJY.js.map +1 -0
  33. package/docs/mcp-tool-craft-lint.generated.md +2 -5
  34. package/docs/mcp-tool-manifest.generated.json +18 -110
  35. package/package.json +1 -1
  36. package/dist/chunk-DUEW4EOO.js +0 -214
  37. package/dist/chunk-DUEW4EOO.js.map +0 -1
  38. package/dist/chunk-IHXHQL53.js +0 -7
  39. package/dist/chunk-IHXHQL53.js.map +0 -1
  40. package/dist/chunk-NXRWFOEZ.js +0 -816
  41. package/dist/chunk-NXRWFOEZ.js.map +0 -1
  42. package/dist/chunk-ROZEDHAA.js.map +0 -1
  43. package/dist/chunk-TK4D2BZ5.js.map +0 -1
  44. package/dist/server-YSKBD2VX.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/services/fanout/cdp-capture.ts","../src/services/fanout/parse-helpers.ts","../src/services/fanout/adapters/chatgpt.ts","../src/services/fanout/adapters/claude.ts","../src/services/fanout/adapters/index.ts","../src/services/fanout/build.ts","../src/services/fanout/classify.ts","../src/services/fanout/export.ts","../src/services/fanout/run-capture.ts"],"sourcesContent":["import type { CDPSession, Page } from 'playwright'\n\nconst ANSWER_RE = /\\/backend-api\\/(f\\/)?conversation$|\\/chat_conversations\\/[^/]+\\/(completion|retry_completion)$|\\/completion$/i\n\ninterface AnswerBody {\n url: string\n ct: string\n text: string\n}\n\nexport class FanoutCdpCapture {\n private client: CDPSession | null = null\n private reqUrl = new Map<string, string>()\n private ctById = new Map<string, string>()\n private answerIds = new Set<string>()\n private bodies: AnswerBody[] = []\n private pending: Promise<void>[] = []\n private answerStreams = 0\n\n async attach(page: Page): Promise<void> {\n if (this.client) return\n const client = await page.context().newCDPSession(page)\n this.client = client\n await client.send('Network.enable', { maxTotalBufferSize: 200_000_000, maxResourceBufferSize: 200_000_000 } as never)\n client.on('Network.requestWillBeSent', (e: Record<string, unknown>) => {\n const id = e.requestId as string\n const req = e.request as Record<string, unknown> | undefined\n if (id) this.reqUrl.set(id, (req?.url as string) || '')\n })\n client.on('Network.responseReceived', (e: Record<string, unknown>) => {\n const id = e.requestId as string\n const res = e.response as Record<string, unknown> | undefined\n const url = (res?.url as string) || this.reqUrl.get(id) || ''\n const headers = (res?.headers as Record<string, string>) || {}\n const ct = String(headers['content-type'] || headers['Content-Type'] || '')\n if (id) this.ctById.set(id, ct)\n if (id && (this.isAnswerUrl(url) || /event-stream/i.test(ct))) this.answerIds.add(id)\n })\n client.on('Network.loadingFinished', (e: Record<string, unknown>) => this.grab(e.requestId as string))\n }\n\n reset(): void {\n this.bodies = []\n this.answerStreams = 0\n this.answerIds.clear()\n this.pending = []\n }\n\n answerStreamCount(): number {\n return this.answerStreams\n }\n\n async drain(): Promise<void> {\n await Promise.all(this.pending)\n }\n\n bestAnswerText(): string {\n const eventStreams = this.bodies.filter((b) => /event-stream/i.test(b.ct))\n const answerStreams = eventStreams.filter((b) => this.isAnswerUrl(b.url)).sort((a, b) => b.text.length - a.text.length)\n if (answerStreams.length) return answerStreams.map((b) => b.text).join('\\n')\n const answerJson = this.bodies.filter((b) => this.isAnswerUrl(b.url)).sort((a, b) => b.text.length - a.text.length)\n if (answerJson.length) return answerJson[0].text\n if (eventStreams.length) return eventStreams.sort((a, b) => b.text.length - a.text.length)[0].text\n return ''\n }\n\n async detach(): Promise<void> {\n try {\n await this.client?.detach()\n } catch {\n this.client = null\n }\n this.client = null\n }\n\n private isAnswerUrl(url: string): boolean {\n let path = ''\n try {\n path = new URL(url).pathname\n } catch {\n path = String(url || '').split('?')[0]\n }\n return ANSWER_RE.test(path)\n }\n\n private grab(requestId: string | undefined): void {\n if (!requestId || !this.client || !this.answerIds.has(requestId)) return\n const url = this.reqUrl.get(requestId) || ''\n const ct = this.ctById.get(requestId) || ''\n const client = this.client\n const p = client\n .send('Network.getResponseBody', { requestId } as never)\n .then((r: Record<string, unknown>) => {\n const text = r.base64Encoded ? Buffer.from(String(r.body), 'base64').toString('utf8') : String(r.body || '')\n if (text) {\n this.bodies.push({ url, ct, text })\n if (this.isAnswerUrl(url)) this.answerStreams++\n }\n })\n .catch(() => undefined)\n this.pending.push(p)\n }\n}\n","const INTERNAL = /chatgpt\\.com|openai\\.com|oaiusercontent|oaistatic|claude\\.ai|anthropic\\.com/i\nconst TRACK = /^(utm_|oai|fbclid|gclid|ref$|ref_|sa$|usg$|ved$|sca_esv$|sources$)/i\n\nexport function domainOf(u: string): string {\n try {\n return new URL(u).hostname.replace(/^www\\./, '')\n } catch {\n return ''\n }\n}\n\nexport function normUrl(u: string): string {\n try {\n const x = new URL(u)\n x.hash = ''\n for (const k of [...x.searchParams.keys()]) {\n if (TRACK.test(k)) x.searchParams.delete(k)\n }\n return x.toString().replace(/\\/$/, '').toLowerCase()\n } catch {\n return String(u || '').toLowerCase()\n }\n}\n\nexport function isExternal(u: string): boolean {\n const h = domainOf(u)\n return Boolean(h) && !INTERNAL.test(h)\n}\n\nexport function unesc(s: string): string {\n try {\n return JSON.parse('\"' + s + '\"')\n } catch {\n return String(s).replace(/\\\\(.)/g, '$1')\n }\n}\n\nexport function stripCitationMarkers(s: string): string {\n return String(s || '')\n .replace(/[-]/g, '')\n .replace(/cite(?:turn\\d+\\w+?\\d+)+/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\nexport function sliceBalanced(text: string, openIdx: number): string | null {\n const open = text[openIdx]\n const close = open === '[' ? ']' : '}'\n let depth = 0\n let inStr = false\n let esc = false\n for (let i = openIdx; i < text.length; i++) {\n const ch = text[i]\n if (inStr) {\n if (esc) esc = false\n else if (ch === '\\\\') esc = true\n else if (ch === '\"') inStr = false\n continue\n }\n if (ch === '\"') {\n inStr = true\n continue\n }\n if (ch === open) depth++\n else if (ch === close) {\n depth--\n if (depth === 0) return text.slice(openIdx, i + 1)\n }\n }\n return null\n}\n\nexport function findJsonValues(text: string, field: string): unknown[] {\n const out: unknown[] = []\n const re = new RegExp('\"' + field + '\"\\\\s*:\\\\s*(\\\\[|\\\\{)', 'g')\n let m: RegExpExecArray | null\n while ((m = re.exec(text))) {\n const openIdx = m.index + m[0].length - 1\n const slice = sliceBalanced(text, openIdx)\n if (slice) {\n try {\n out.push(JSON.parse(slice))\n } catch {\n continue\n }\n }\n }\n return out\n}\n\nexport function stringsInArrayBody(arrBody: string): string[] {\n const out: string[] = []\n const re = /\"((?:[^\"\\\\]|\\\\.){2,300}?)\"/g\n let m: RegExpExecArray | null\n while ((m = re.exec(arrBody))) out.push(unesc(m[1]))\n return out\n}\n\nexport function cleanQuery(q: string): string | null {\n const t = (q || '').trim()\n if (t.length < 2 || t.length > 300) return null\n return t\n}\n","import type { FanoutAdapter, FanoutSource, FanoutSnippet, ParsedFanout } from '../types.js'\nimport {\n cleanQuery,\n domainOf,\n findJsonValues,\n isExternal,\n normUrl,\n stringsInArrayBody,\n stripCitationMarkers,\n unesc,\n} from '../parse-helpers.js'\n\ninterface SourceAcc {\n url: string\n domain: string\n title: string\n cited: boolean\n timesCited: number\n firstOrder: number\n snippet: string\n round: number | null\n}\n\nfunction roundOf(refId: string | null): number | null {\n const m = /^turn(\\d+)/.exec(refId || '')\n return m ? Number(m[1]) : null\n}\n\nfunction normRef(r: unknown): string | null {\n if (typeof r === 'string') {\n const m = /turn(\\d+)(search|news|ref|video|image|product)(\\d+)/.exec(r)\n return m ? `turn${m[1]}${m[2]}${m[3]}` : null\n }\n if (r && typeof r === 'object') {\n const o = r as Record<string, unknown>\n if (o.turn_index != null) {\n return `turn${o.turn_index}${o.ref_type || 'search'}${o.ref_index != null ? o.ref_index : ''}`\n }\n }\n return null\n}\n\nfunction refsInText(s: string): string[] {\n return (String(s || '').match(/turn\\d+(?:search|news|ref|video|image|product)\\d+/g) || [])\n .map(normRef)\n .filter((x): x is string => Boolean(x))\n}\n\nfunction collectInto(arr: unknown[], v: unknown): void {\n if (Array.isArray(v)) arr.push(...v)\n else if (v && typeof v === 'object') arr.push(v)\n}\n\nfunction reconstructFromSsePatches(raw: string): string {\n const contentReferences: unknown[] = []\n const searchResultGroups: unknown[] = []\n const citations: unknown[] = []\n const citedUrls = new Set<string>()\n const state = { found: false }\n\n const handleOp = (op: unknown): void => {\n if (!op || typeof op !== 'object') return\n const o = op as Record<string, unknown>\n const v = o.v\n if (o.o === 'patch' && Array.isArray(v)) {\n state.found = true\n v.forEach(handleOp)\n return\n }\n const path = typeof o.p === 'string' ? o.p : ''\n if ((path === '' || path === '/message') && v && typeof v === 'object') {\n const root = v as Record<string, unknown>\n const msg = (root.message as Record<string, unknown>) || root\n const md = msg && (msg.metadata as Record<string, unknown>)\n if (md) {\n collectInto(contentReferences, md.content_references)\n collectInto(searchResultGroups, md.search_result_groups)\n collectInto(citations, md.citations)\n state.found = true\n }\n }\n if (!path) return\n if (/\\/safe_urls$/.test(path) && Array.isArray(v)) {\n for (const u of v) if (typeof u === 'string') citedUrls.add(u)\n state.found = true\n } else if (path.includes('content_references')) {\n collectInto(contentReferences, v)\n state.found = true\n } else if (path.includes('search_result_groups')) {\n collectInto(searchResultGroups, v)\n state.found = true\n } else if (path.includes('citations')) {\n collectInto(citations, v)\n state.found = true\n }\n }\n\n for (const line of raw.split('\\n')) {\n const s = (line.startsWith('data:') ? line.slice(5) : line).trim()\n if (!s || s === '[DONE]' || (s[0] !== '{' && s[0] !== '[')) continue\n let parsed: unknown\n try {\n parsed = JSON.parse(s)\n } catch {\n continue\n }\n const ops = Array.isArray(parsed) ? parsed : [parsed]\n ops.forEach(handleOp)\n }\n\n if (!state.found) return raw\n const citedRefs = [...citedUrls].map((url) => ({ type: 'grouped_webpages', items: [{ url }] }))\n const synthetic = JSON.stringify({\n content_references: [...contentReferences, ...citedRefs],\n search_result_groups: searchResultGroups,\n citations,\n })\n return raw + '\\n' + synthetic\n}\n\nexport const chatgptAdapter: FanoutAdapter = {\n platform: 'ChatGPT',\n matchesHost(hostname) {\n return /(^|\\.)chatgpt\\.com$|(^|\\.)openai\\.com$/i.test(hostname)\n },\n parse(rawInput, prompt): ParsedFanout {\n const raw = reconstructFromSsePatches(rawInput)\n const sources = new Map<string, SourceAcc>()\n const snippets = new Map<string, FanoutSnippet>()\n const queries = new Set<string>()\n const unmapped = new Set<string>()\n const meta = { model: '', finishType: '', title: '', rounds: 0 }\n\n const ensure = (url: string): SourceAcc | null => {\n if (!isExternal(url)) return null\n const k = normUrl(url)\n let s = sources.get(k)\n if (!s) {\n s = { url, domain: domainOf(url), title: '', cited: false, timesCited: 0, firstOrder: Infinity, snippet: '', round: null }\n sources.set(k, s)\n }\n return s\n }\n const addSnippet = (url: string, title: string, text: string) => {\n const clean = stripCitationMarkers(text)\n if (!isExternal(url) || clean.length < 2) return\n snippets.set(normUrl(url), { url, domain: domainOf(url), title: title || domainOf(url), text: clean.slice(0, 400) })\n }\n\n for (const m of raw.matchAll(/\"([a-z_]*(?:quer|search)[a-z_]*)\"\\s*:/gi)) unmapped.add(m[1])\n\n for (const m of raw.matchAll(/\"search_model_queries\"\\s*:\\s*\\[([^\\]]*)\\]/g)) {\n for (const q of stringsInArrayBody(m[1])) {\n const c = cleanQuery(q)\n if (c) queries.add(c)\n }\n }\n for (const m of raw.matchAll(/\"(?:search_queries|queries|search_query)\"\\s*:\\s*\\[([^\\]]*)\\]/g)) {\n for (const q of stringsInArrayBody(m[1])) {\n const c = cleanQuery(q)\n if (c) queries.add(c)\n }\n }\n\n for (const v of findJsonValues(raw, 'search_result_groups')) {\n if (!Array.isArray(v)) continue\n for (const g of v) {\n const entries = (g && typeof g === 'object' && Array.isArray((g as Record<string, unknown>).entries))\n ? ((g as Record<string, unknown>).entries as Array<Record<string, unknown>>)\n : []\n for (const e of entries) {\n const url = typeof e.url === 'string' ? e.url : ''\n const s = ensure(url)\n if (!s) continue\n if (!s.title && typeof e.title === 'string') s.title = e.title.slice(0, 200)\n const ref = normRef(e.ref_id)\n if (ref && s.round == null) s.round = roundOf(ref)\n if (typeof e.snippet === 'string' && e.snippet) addSnippet(url, s.title, e.snippet)\n }\n }\n }\n\n for (const m of raw.matchAll(/\"url\"\\s*:\\s*\"(https?:\\/\\/[^\"\\\\]+)\"(?:[\\s\\S]{0,120}?\"(?:title|name)\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.){0,200})\")?/g)) {\n const s = ensure(m[1])\n if (s && !s.title && m[2]) s.title = unesc(m[2]).slice(0, 200)\n }\n\n let spanTotal = 0\n for (const cr of findJsonValues(raw, 'content_references')) {\n if (!Array.isArray(cr)) continue\n for (const ref of cr as Array<Record<string, unknown>>) {\n const type = typeof ref.type === 'string' ? ref.type : ''\n const isBundle = /sources_footnote|nav_list|alt_text/.test(type)\n const refs = refsInText(typeof ref.matched_text === 'string' ? ref.matched_text : '')\n if (!isBundle) spanTotal++\n const ord = typeof ref.start_idx === 'number' ? ref.start_idx : (isBundle ? Infinity : spanTotal)\n const items = Array.isArray(ref.items) ? (ref.items as Array<Record<string, unknown>>) : []\n items.forEach((it, idx) => {\n const refForItem = refs.length === items.length ? refs[idx] : refs[0]\n const urls = [it.url]\n .concat((Array.isArray(it.supporting_websites) ? it.supporting_websites : []).map((s) => (s as Record<string, unknown>)?.url))\n .filter((u): u is string => typeof u === 'string')\n for (const u of urls) {\n const s = ensure(u)\n if (!s) continue\n if (!isBundle) {\n s.cited = true\n s.timesCited++\n if (ord < s.firstOrder) s.firstOrder = ord\n } else if (!s.cited) {\n s.cited = true\n }\n if (refForItem && s.round == null) s.round = roundOf(refForItem)\n }\n if (typeof it.url === 'string' && typeof it.snippet === 'string') addSnippet(it.url, typeof it.title === 'string' ? it.title : '', it.snippet)\n })\n }\n }\n\n for (const v of findJsonValues(raw, 'citations')) {\n if (!Array.isArray(v)) continue\n v.forEach((c, i) => {\n const md = (c && typeof c === 'object' ? (c as Record<string, unknown>).metadata : null) as Record<string, unknown> | null\n if (!md || typeof md.url !== 'string') return\n const s = ensure(md.url)\n if (!s) return\n s.cited = true\n s.timesCited++\n const ord = typeof (c as Record<string, unknown>).start_ix === 'number' ? (c as Record<string, unknown>).start_ix as number : i\n if (ord < s.firstOrder) s.firstOrder = ord\n if (typeof md.text === 'string') addSnippet(md.url, typeof md.title === 'string' ? md.title : '', md.text)\n })\n }\n\n for (const m of raw.matchAll(/\"content_type\"\\s*:\\s*\"tether_quote\"([\\s\\S]{0,4000}?)\"text\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/g)) {\n const url = (m[1].match(/\"url\"\\s*:\\s*\"([^\"]+)\"/) || [])[1]\n const title = (m[1].match(/\"title\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/) || [])[1]\n if (url) {\n ensure(url)\n addSnippet(url, title ? unesc(title) : '', unesc(m[2]))\n }\n }\n\n const modelMatches = [...raw.matchAll(/\"resolved_model_slug\"\\s*:\\s*\"([^\"]+)\"/g)]\n const slugMatches = modelMatches.length ? modelMatches : [...raw.matchAll(/\"model_slug\"\\s*:\\s*\"([^\"]+)\"/g)]\n if (slugMatches.length) meta.model = slugMatches[slugMatches.length - 1][1]\n const finish = raw.match(/\"finish_details\"\\s*:\\s*\\{[^}]*\"type\"\\s*:\\s*\"([^\"]+)\"/)\n if (finish) meta.finishType = finish[1]\n\n const searchRounds = (raw.match(/\"recipient\"\\s*:\\s*\"(?:web|browser)\"[\\s\\S]{0,400}?\"content_type\"\\s*:\\s*\"code\"[\\s\\S]{0,200}?search\\(/g) || []).length\n const sourceRounds = new Set<number>()\n for (const s of sources.values()) if (s.round != null) sourceRounds.add(s.round)\n meta.rounds = Math.max(searchRounds, sourceRounds.size)\n\n const ordered: FanoutSource[] = [...sources.values()]\n .sort((a, b) => (a.cited === b.cited ? b.timesCited - a.timesCited || a.firstOrder - b.firstOrder : a.cited ? -1 : 1))\n .map((s) => ({\n url: s.url,\n domain: s.domain,\n title: s.title || s.domain,\n cited: s.cited,\n timesCited: s.timesCited,\n snippet: snippets.get(normUrl(s.url))?.text || '',\n round: s.round,\n }))\n\n return {\n subQueries: [...queries],\n sources: ordered,\n snippets: [...snippets.values()],\n meta,\n unmappedKeys: [...unmapped].slice(0, 50),\n }\n },\n}\n","import type { FanoutAdapter, FanoutSource, FanoutSnippet, ParsedFanout } from '../types.js'\nimport { cleanQuery, domainOf, isExternal, normUrl, unesc } from '../parse-helpers.js'\n\ninterface SourceAcc {\n url: string\n domain: string\n title: string\n cited: boolean\n timesCited: number\n snippet: string\n round: number | null\n}\n\nfunction isFavicon(u: string): boolean {\n return /\\/s2\\/favicons/i.test(u) || /favicon/i.test(u)\n}\n\nexport const claudeAdapter: FanoutAdapter = {\n platform: 'Claude',\n matchesHost(hostname) {\n return /(^|\\.)claude\\.ai$/i.test(hostname)\n },\n parse(raw, prompt): ParsedFanout {\n const sources = new Map<string, SourceAcc>()\n const snippets = new Map<string, FanoutSnippet>()\n const queries = new Set<string>()\n const unmapped = new Set<string>()\n const meta = { model: '', finishType: '', title: '', rounds: 0 }\n\n const ensure = (url: string): SourceAcc | null => {\n if (!url || !isExternal(url) || isFavicon(url)) return null\n const k = normUrl(url)\n let s = sources.get(k)\n if (!s) {\n s = { url, domain: domainOf(url), title: '', cited: false, timesCited: 0, snippet: '', round: null }\n sources.set(k, s)\n }\n return s\n }\n\n const toolInputs = new Map<number, { name: string; buf: string }>()\n const searchBlocks = new Set<number>()\n const finalizeTool = (index: number) => {\n const t = toolInputs.get(index)\n if (!t || !/web_search|web_fetch|search|browse/i.test(t.name)) return\n try {\n const input = JSON.parse(t.buf) as Record<string, unknown>\n if (typeof input.query === 'string') {\n const q = cleanQuery(input.query)\n if (q) queries.add(q)\n }\n } catch {\n const m = t.buf.match(/\"query\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/)\n if (m) {\n const q = cleanQuery(unesc(m[1]))\n if (q) queries.add(q)\n }\n }\n }\n\n for (const line of raw.split('\\n')) {\n const s = (line.startsWith('data:') ? line.slice(5) : line).trim()\n if (!s || (s[0] !== '{' && s[0] !== '[')) continue\n let ev: Record<string, unknown>\n try {\n ev = JSON.parse(s) as Record<string, unknown>\n } catch {\n continue\n }\n const type = ev.type\n if (type === 'content_block_start') {\n const cb = (ev.content_block as Record<string, unknown>) || {}\n const index = typeof ev.index === 'number' ? ev.index : -1\n if (cb.type === 'tool_use' && index >= 0) {\n const name = typeof cb.name === 'string' ? cb.name : ''\n toolInputs.set(index, { name, buf: '' })\n if (/web_search|web_fetch|search|browse/i.test(name)) searchBlocks.add(index)\n }\n } else if (type === 'content_block_delta') {\n const d = (ev.delta as Record<string, unknown>) || {}\n const index = typeof ev.index === 'number' ? ev.index : -1\n if (d.type === 'input_json_delta' && typeof d.partial_json === 'string') {\n const t = toolInputs.get(index)\n if (t) t.buf += d.partial_json\n } else if (d.type === 'citation_start_delta') {\n const c = (d.citation as Record<string, unknown>) || {}\n if (typeof c.url === 'string') {\n const src = ensure(c.url)\n if (src) {\n src.cited = true\n src.timesCited++\n if (!src.title && typeof c.title === 'string') src.title = c.title.slice(0, 200)\n if (typeof c.cited_text === 'string' && c.cited_text) {\n snippets.set(normUrl(c.url), { url: c.url, domain: domainOf(c.url), title: src.title, text: String(c.cited_text).slice(0, 400) })\n }\n }\n }\n }\n } else if (type === 'content_block_stop') {\n const index = typeof ev.index === 'number' ? ev.index : -1\n if (index >= 0) finalizeTool(index)\n } else if (type === 'message_delta' || type === 'message_stop' || type === 'message_start') {\n const d = (ev.delta as Record<string, unknown>) || (ev.message as Record<string, unknown>) || {}\n if (typeof d.stop_reason === 'string' && !meta.finishType) meta.finishType = d.stop_reason\n if (typeof d.model === 'string' && !meta.model) meta.model = d.model\n }\n }\n\n for (const index of searchBlocks) finalizeTool(index)\n\n for (const m of raw.matchAll(/\"title\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.){1,200})\"\\s*,\\s*\"url\"\\s*:\\s*\"(https?:\\/\\/[^\"\\\\]+)\"/g)) {\n const src = ensure(m[2])\n if (src && !src.title) src.title = unesc(m[1]).slice(0, 200)\n }\n for (const m of raw.matchAll(/\"url\"\\s*:\\s*\"(https?:\\/\\/[^\"\\\\]+)\"/g)) ensure(m[1])\n\n for (const m of raw.matchAll(/\\\\\"title\\\\\"\\s*:\\s*\\\\\"((?:[^\"\\\\]|\\\\.){1,160}?)\\\\\"[\\s\\S]{0,160}?\\\\\"url\\\\\"\\s*:\\s*\\\\\"(https?:[^\"\\\\]+)\\\\\"/g)) {\n const src = ensure(m[2])\n if (src && !src.title) src.title = unesc(unesc(m[1])).slice(0, 200)\n }\n for (const m of raw.matchAll(/\\\\\"url\\\\\"\\s*:\\s*\\\\\"(https?:[^\"\\\\]+)\\\\\"/g)) ensure(m[1])\n\n if (!meta.model) {\n const mm = raw.match(/\"model\"\\s*:\\s*\"(claude[^\"]+)\"/)\n if (mm) meta.model = mm[1]\n }\n meta.rounds = queries.size > 0 ? searchBlocks.size : 0\n\n for (const m of raw.matchAll(/\"([a-z_]*(?:quer|search)[a-z_]*)\"\\s*:/gi)) unmapped.add(m[1])\n\n const ordered: FanoutSource[] = [...sources.values()]\n .sort((a, b) => (a.cited === b.cited ? b.timesCited - a.timesCited : a.cited ? -1 : 1))\n .map((s) => ({\n url: s.url,\n domain: s.domain,\n title: s.title || s.domain,\n cited: s.cited,\n timesCited: s.timesCited,\n snippet: snippets.get(normUrl(s.url))?.text || '',\n round: s.round,\n }))\n\n return {\n subQueries: [...queries],\n sources: ordered,\n snippets: [...snippets.values()],\n meta,\n unmappedKeys: [...unmapped].slice(0, 50),\n }\n },\n}\n","import type { FanoutAdapter, FanoutPlatform } from '../types.js'\nimport { chatgptAdapter } from './chatgpt.js'\nimport { claudeAdapter } from './claude.js'\n\nexport const FANOUT_ADAPTERS: FanoutAdapter[] = [chatgptAdapter, claudeAdapter]\n\nexport function adapterForHost(hostname: string): FanoutAdapter | null {\n return FANOUT_ADAPTERS.find((a) => a.matchesHost(hostname)) ?? null\n}\n\nexport function adapterForPlatform(platform: FanoutPlatform): FanoutAdapter | null {\n return FANOUT_ADAPTERS.find((a) => a.platform === platform) ?? null\n}\n\nexport { chatgptAdapter, claudeAdapter }\n","import type { FanoutPlatform, FanoutResult, ParsedFanout } from './types.js'\n\nexport interface BuildContext {\n platform: FanoutPlatform\n parsed: ParsedFanout\n prompt: string\n ready: boolean\n rawBytes: number\n}\n\nexport function buildFanoutResult(ctx: BuildContext): FanoutResult {\n const { platform, parsed, ready, rawBytes } = ctx\n const browsedUrls = parsed.sources\n const citedUrls = browsedUrls.filter((s) => s.cited)\n const browsedOnly = browsedUrls.filter((s) => !s.cited)\n const prompt = ctx.prompt || parsed.meta.title || ''\n\n const result: FanoutResult = {\n platform,\n capturedAt: new Date().toISOString(),\n prompt,\n meta: parsed.meta,\n subQueries: parsed.subQueries,\n browsedUrls,\n citedUrls,\n browsedOnly,\n snippets: parsed.snippets,\n counts: {\n subQueries: parsed.subQueries.length,\n browsed: browsedUrls.length,\n cited: citedUrls.length,\n browsedOnly: browsedOnly.length,\n },\n }\n\n if (parsed.subQueries.length === 0 && browsedUrls.length === 0) {\n result.debug = {\n interceptorReady: ready,\n rawBytes,\n unmappedKeys: parsed.unmappedKeys,\n note: ready\n ? 'Capture hook is live but no fan-out was seen yet. Run a NEW prompt that triggers web search in this session, then call browser_capture_fanout again. Fan-out is only captured as it streams; past answers from before the session opened cannot be recovered.'\n : 'Capture hook not detected on this page. The session must be opened with MCP_SCRAPER_BROWSER_MODE=local and navigated to chatgpt.com or claude.ai after opening, so the hook installs before the site scripts run.',\n }\n }\n\n return result\n}\n","import type { FanoutResult, FanoutSource } from './types.js'\n\nexport type SiteType =\n | 'First-party/vendor'\n | 'News/media'\n | 'Reddit'\n | 'Social/video'\n | 'Encyclopedia'\n | 'Review site'\n | 'Docs'\n | 'Blog'\n\nexport interface ClassifiedSource extends FanoutSource {\n siteType: SiteType\n}\n\nexport interface FanoutAggregates {\n topSites: Array<{ domain: string; count: number; cited: boolean; timesCited: number; siteType: SiteType }>\n citationOrder: Array<{ rank: number; domain: string; url: string; timesCited: number }>\n byCategory: Record<SiteType, number>\n}\n\nexport interface EnrichedFanout {\n platform: FanoutResult['platform']\n capturedAt: string\n prompt: string\n meta: FanoutResult['meta']\n queries: string[]\n browsedUrls: ClassifiedSource[]\n citedUrls: ClassifiedSource[]\n browsedOnly: ClassifiedSource[]\n snippets: FanoutResult['snippets']\n counts: FanoutResult['counts']\n aggregates: FanoutAggregates\n firstPartyDomain: string | null\n debug?: FanoutResult['debug']\n}\n\nexport interface EnrichOptions {\n firstPartyDomain?: string\n}\n\nconst SOCIAL = /(^|\\.)(youtube\\.com|youtu\\.be|instagram\\.com|tiktok\\.com|facebook\\.com|fb\\.com|x\\.com|twitter\\.com|linkedin\\.com|pinterest\\.com|threads\\.net|vimeo\\.com)$/i\nconst ENCYCLOPEDIA = /(^|\\.)(wikipedia\\.org|wikimedia\\.org|britannica\\.com|merriam-webster\\.com|dictionary\\.com|fandom\\.com|investopedia\\.com)$/i\nconst REVIEW = /(^|\\.)(yelp\\.com|trustpilot\\.com|g2\\.com|capterra\\.com|angi\\.com|angieslist\\.com|bbb\\.org|consumeraffairs\\.com|bestcompany\\.com|sitejabber\\.com|clutch\\.co|bestpickreports\\.com|homeguide\\.com|porch\\.com|ontoplist\\.com|thumbtack\\.com)$/i\nconst NEWS = /(^|\\.)(reuters\\.com|apnews\\.com|nytimes\\.com|wsj\\.com|washingtonpost\\.com|bloomberg\\.com|cnbc\\.com|forbes\\.com|bbc\\.com|theguardian\\.com|cnn\\.com|npr\\.org|usatoday\\.com|expressnews\\.com|mysanantonio\\.com|beaumontenterprise\\.com)$/i\n\nexport function classifyDomain(domain: string, firstPartyDomain?: string): SiteType {\n const d = domain.toLowerCase().replace(/^www\\./, '')\n if (firstPartyDomain) {\n const fp = firstPartyDomain.toLowerCase().replace(/^www\\./, '')\n if (fp && (d === fp || d.endsWith('.' + fp))) return 'First-party/vendor'\n }\n if (/(^|\\.)reddit\\.com$/i.test(d)) return 'Reddit'\n if (SOCIAL.test(d)) return 'Social/video'\n if (ENCYCLOPEDIA.test(d)) return 'Encyclopedia'\n if (REVIEW.test(d)) return 'Review site'\n if (NEWS.test(d) || /(^|\\.)news\\./i.test(d)) return 'News/media'\n if (/^docs?\\.|^developer\\.|^developers\\.|readthedocs|\\.dev$/i.test(d)) return 'Docs'\n return 'Blog'\n}\n\nfunction emptyCategoryCounts(): Record<SiteType, number> {\n return { 'First-party/vendor': 0, 'News/media': 0, Reddit: 0, 'Social/video': 0, Encyclopedia: 0, 'Review site': 0, Docs: 0, Blog: 0 }\n}\n\nexport function enrichFanout(result: FanoutResult, opts: EnrichOptions = {}): EnrichedFanout {\n const addSiteType = (s: FanoutSource): ClassifiedSource => ({ ...s, siteType: classifyDomain(s.domain, opts.firstPartyDomain) })\n const browsedUrls = result.browsedUrls.map(addSiteType)\n const citedUrls = result.citedUrls.map(addSiteType)\n const browsedOnly = result.browsedOnly.map(addSiteType)\n\n const byCategory = emptyCategoryCounts()\n const domainAgg = new Map<string, { domain: string; count: number; cited: boolean; timesCited: number; siteType: SiteType }>()\n for (const s of browsedUrls) {\n byCategory[s.siteType]++\n const cur = domainAgg.get(s.domain)\n if (!cur) domainAgg.set(s.domain, { domain: s.domain, count: 1, cited: s.cited, timesCited: s.timesCited, siteType: s.siteType })\n else {\n cur.count++\n cur.cited = cur.cited || s.cited\n cur.timesCited += s.timesCited\n }\n }\n const topSites = [...domainAgg.values()].sort((a, b) => b.count - a.count || b.timesCited - a.timesCited)\n\n const citationOrder = citedUrls\n .slice()\n .sort((a, b) => b.timesCited - a.timesCited)\n .map((s, i) => ({ rank: i + 1, domain: s.domain, url: s.url, timesCited: s.timesCited }))\n\n return {\n platform: result.platform,\n capturedAt: result.capturedAt,\n prompt: result.prompt,\n meta: result.meta,\n queries: result.subQueries,\n browsedUrls,\n citedUrls,\n browsedOnly,\n snippets: result.snippets,\n counts: result.counts,\n aggregates: { topSites, citationOrder, byCategory },\n firstPartyDomain: opts.firstPartyDomain ? opts.firstPartyDomain.toLowerCase().replace(/^www\\./, '') : null,\n ...(result.debug ? { debug: result.debug } : {}),\n }\n}\n","import { mkdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport Papa from 'papaparse'\nimport type { EnrichedFanout } from './classify.js'\n\nexport interface FanoutExportPaths {\n dir: string\n json: string\n queriesCsv: string\n queriesTsv: string\n citationsCsv: string\n sourcesCsv: string\n domainsCsv: string\n report: string\n}\n\nfunction outputBaseDir(): string {\n return process.env.MCP_SCRAPER_OUTPUT_DIR?.trim() || join(homedir(), 'Downloads', 'mcp-scraper')\n}\n\nfunction safe(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 80) || 'capture'\n}\n\nfunction writeTable(path: string, rows: Array<Record<string, unknown>>, delimiter: ','): void\nfunction writeTable(path: string, rows: Array<Record<string, unknown>>, delimiter: '\\t'): void\nfunction writeTable(path: string, rows: Array<Record<string, unknown>>, delimiter: string): void {\n writeFileSync(path, Papa.unparse(rows.length ? rows : [{}], { delimiter }))\n}\n\nexport function exportFanout(enriched: EnrichedFanout): FanoutExportPaths {\n const stamp = safe(enriched.capturedAt.replace(/[:.]/g, '-'))\n const dir = join(outputBaseDir(), 'fanout', `${stamp}-${safe(enriched.platform)}`)\n mkdirSync(dir, { recursive: true })\n\n const queryRows = enriched.queries.map((q, i) => ({ index: i + 1, query: q }))\n const citationRows = enriched.aggregates.citationOrder.map((c) => {\n const src = enriched.citedUrls.find((s) => s.url === c.url)\n return { rank: c.rank, domain: c.domain, url: c.url, timesCited: c.timesCited, siteType: src?.siteType ?? '', title: src?.title ?? '' }\n })\n const sourceRows = enriched.browsedUrls.map((s) => ({ domain: s.domain, url: s.url, cited: s.cited, timesCited: s.timesCited, siteType: s.siteType, title: s.title, round: s.round ?? '' }))\n const domainRows = enriched.aggregates.topSites.map((d) => ({ domain: d.domain, count: d.count, cited: d.cited, timesCited: d.timesCited, siteType: d.siteType }))\n\n const paths: FanoutExportPaths = {\n dir,\n json: join(dir, 'fanout.json'),\n queriesCsv: join(dir, 'queries.csv'),\n queriesTsv: join(dir, 'queries.tsv'),\n citationsCsv: join(dir, 'citations.csv'),\n sourcesCsv: join(dir, 'sources.csv'),\n domainsCsv: join(dir, 'domains.csv'),\n report: join(dir, 'report.html'),\n }\n\n writeFileSync(paths.json, JSON.stringify(enriched, null, 2))\n writeTable(paths.queriesCsv, queryRows, ',')\n writeTable(paths.queriesTsv, queryRows, '\\t')\n writeTable(paths.citationsCsv, citationRows, ',')\n writeTable(paths.sourcesCsv, sourceRows, ',')\n writeTable(paths.domainsCsv, domainRows, ',')\n writeFileSync(paths.report, renderReportHtml(enriched))\n\n return paths\n}\n\nfunction esc(s: string): string {\n return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n}\n\nexport function renderReportHtml(enriched: EnrichedFanout): string {\n const data = JSON.stringify(enriched).replace(/</g, '\\\\u003c')\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<title>AI Search Fan-Out — ${esc(enriched.platform)}</title>\n<style>\n:root{--bg:#0b0d12;--panel:#151922;--line:#252b38;--ink:#e8ecf3;--mut:#8b95a7;--acc:#5b9dff;--cite:#39d98a;--browse:#5a6677}\n*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}\n.wrap{max-width:980px;margin:0 auto;padding:28px 20px 80px}\nh1{font-size:20px;margin:0 0 2px}.sub{color:var(--mut);margin:0 0 20px;font-size:13px}\n.stat{font-size:30px;font-weight:700}.stat small{font-size:13px;font-weight:400;color:var(--mut)}\n.cards{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:18px 0}\n.card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:12px 14px}\n.card b{font-size:22px;display:block}.card span{color:var(--mut);font-size:12px}\n.bars{margin:8px 0 22px}.bar{display:flex;align-items:center;gap:8px;margin:4px 0}\n.bar .lab{width:150px;color:var(--mut);font-size:12px;text-align:right}.bar .track{flex:1;background:#10141c;border-radius:5px;overflow:hidden}\n.bar .fill{background:var(--acc);height:16px}.bar .n{width:34px;font-size:12px;color:var(--mut)}\n.tabs{display:flex;gap:8px;margin:22px 0 12px}.tab{background:var(--panel);border:1px solid var(--line);color:var(--ink);padding:7px 14px;border-radius:8px;cursor:pointer}\n.tab.on{background:var(--acc);border-color:var(--acc);color:#04101f;font-weight:600}\n.chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}\n.chip{background:var(--panel);border:1px solid var(--line);color:var(--mut);padding:4px 10px;border-radius:20px;cursor:pointer;font-size:12px}\n.chip.on{border-color:var(--acc);color:var(--ink)}.chip b{color:var(--ink)}\n.row{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin:6px 0;display:flex;gap:10px;align-items:flex-start}\n.row .idx{color:var(--mut);min-width:22px}.row .main{flex:1}\n.tag{font-size:11px;padding:2px 7px;border-radius:6px;border:1px solid var(--line);color:var(--mut);margin-right:5px}\n.dom{font-weight:600}.url{color:var(--mut);font-size:12px;word-break:break-all}\n.pill{font-size:11px;padding:2px 7px;border-radius:6px}.pill.cite{background:rgba(57,217,138,.15);color:var(--cite)}.pill.brow{background:rgba(90,102,119,.2);color:#aeb8c8}\n.copy{background:none;border:1px solid var(--line);color:var(--mut);border-radius:6px;cursor:pointer;font-size:11px;padding:2px 8px}\n.hide{display:none}\n</style>\n</head>\n<body><div class=\"wrap\">\n<h1>AI Search Fan-Out</h1>\n<p class=\"sub\" id=\"sub\"></p>\n<div class=\"stat\" id=\"stat\"></div>\n<div class=\"cards\" id=\"cards\"></div>\n<div id=\"charts\"></div>\n<div class=\"tabs\"><button class=\"tab on\" data-tab=\"q\">Queries</button><button class=\"tab\" data-tab=\"u\">URLs</button></div>\n<div class=\"chips\" id=\"chips\"></div>\n<div id=\"list\"></div>\n</div>\n<script>\nconst D=${data};\nconst el=(t,c,h)=>{const e=document.createElement(t);if(c)e.className=c;if(h!=null)e.innerHTML=h;return e};\ndocument.getElementById('sub').textContent=D.platform+' · '+(D.meta.model||'model n/a')+' · '+D.meta.rounds+' search round(s) · prompt: '+(D.prompt||'');\ndocument.getElementById('stat').innerHTML='Total Fan-Out: '+D.counts.subQueries+' <small>sub-queries · '+D.counts.browsed+' URLs researched · '+D.counts.cited+' cited</small>';\nconst cards=[['Sub-queries',D.counts.subQueries],['Researched',D.counts.browsed],['Cited',D.counts.cited],['Browsed-only',D.counts.browsedOnly]];\nconst cc=document.getElementById('cards');cards.forEach(([k,v])=>{const c=el('div','card');c.appendChild(el('b',null,v));c.appendChild(el('span',null,k));cc.appendChild(c)});\nfunction barChart(title,obj){const max=Math.max(1,...Object.values(obj));const box=el('div','bars');box.appendChild(el('div',null,'<b>'+title+'</b>'));Object.entries(obj).forEach(([k,v])=>{const r=el('div','bar');r.appendChild(el('div','lab',k));const t=el('div','track');const f=el('div','fill');f.style.width=(v/max*100)+'%';t.appendChild(f);r.appendChild(t);r.appendChild(el('div','n',v));box.appendChild(r)});return box}\nconst charts=document.getElementById('charts');\ncharts.appendChild(barChart('URL Categories',D.aggregates.byCategory));\nlet tab='q',filter=null;\nconst chips=document.getElementById('chips'),list=document.getElementById('list');\nfunction render(){\n chips.innerHTML='';list.innerHTML='';\n if(tab==='q'){\n D.queries.forEach((q,i)=>{const r=el('div','row');r.appendChild(el('div','idx',i+1));const m=el('div','main');m.appendChild(el('div',null,esc(q)));r.appendChild(m);const b=el('button','copy','copy');b.onclick=()=>navigator.clipboard.writeText(q);r.appendChild(b);list.appendChild(r)});\n } else {\n const counts={};D.browsedUrls.forEach(s=>{counts[s.siteType]=(counts[s.siteType]||0)+1});\n Object.entries(counts).forEach(([k,v])=>{const c=el('button','chip'+(filter===k?' on':''),k+' <b>'+v+'</b>');c.onclick=()=>{filter=filter===k?null:k;render()};chips.appendChild(c)});\n D.browsedUrls.forEach(s=>{if(filter&&s.siteType!==filter)return;const r=el('div','row');const m=el('div','main');m.appendChild(el('div',null,'<span class=\"dom\">'+esc(s.domain)+'</span> <span class=\"pill '+(s.cited?'cite':'brow')+'\">'+(s.cited?'cited '+s.timesCited+'×':'browsed')+'</span> <span class=\"tag\">'+s.siteType+'</span>'));m.appendChild(el('div','url',esc(s.url)));r.appendChild(m);list.appendChild(r)});\n }\n}\nfunction esc(s){return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')}\ndocument.querySelectorAll('.tab').forEach(t=>t.onclick=()=>{document.querySelectorAll('.tab').forEach(x=>x.classList.remove('on'));t.classList.add('on');tab=t.dataset.tab;filter=null;render()});\nrender();\n</script>\n</body></html>`\n}\n","import type { Page } from 'playwright'\nimport { FanoutCdpCapture } from './cdp-capture.js'\nimport { adapterForHost } from './adapters/index.js'\nimport { buildFanoutResult } from './build.js'\nimport { enrichFanout, type EnrichedFanout } from './classify.js'\nimport { exportFanout, type FanoutExportPaths } from './export.js'\n\nexport interface FanoutCaptureInput {\n prompt?: string\n wait_ms?: number\n first_party_domain?: string\n reset?: boolean\n export?: boolean\n}\n\nexport interface FanoutCaptureOutput {\n result: EnrichedFanout\n exports: FanoutExportPaths | null\n}\n\nconst COMPOSER_SELECTORS = [\n '#prompt-textarea',\n 'div#prompt-textarea',\n 'textarea[data-testid=\"prompt-textarea\"]',\n 'div.ProseMirror[contenteditable=\"true\"]',\n 'div[contenteditable=\"true\"]',\n 'textarea',\n]\n\nasync function sendPrompt(page: Page, text: string): Promise<boolean> {\n for (const selector of COMPOSER_SELECTORS) {\n const locator = page.locator(selector).first()\n try {\n await locator.waitFor({ state: 'visible', timeout: 12_000 })\n } catch {\n continue\n }\n await locator.click({ timeout: 4_000 }).catch(() => undefined)\n await locator.focus().catch(() => undefined)\n await page.keyboard.type(text, { delay: 12 })\n await page.waitForTimeout(300).catch(() => undefined)\n await page.keyboard.press('Enter')\n return true\n }\n return false\n}\n\nasync function waitForAnswer(page: Page, cap: FanoutCdpCapture, baseline: number, waitMs: number): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < waitMs && cap.answerStreamCount() <= baseline) {\n await page.waitForTimeout(400).catch(() => undefined)\n }\n await page.waitForTimeout(1_000).catch(() => undefined)\n}\n\nexport async function runFanoutCapture(page: Page, input: FanoutCaptureInput): Promise<FanoutCaptureOutput> {\n const cap = new FanoutCdpCapture()\n await cap.attach(page)\n try {\n const baseline = cap.answerStreamCount()\n if (input.prompt) await sendPrompt(page, input.prompt).catch(() => false)\n const waitMs = input.wait_ms ?? (input.prompt ? 90_000 : 8_000)\n await waitForAnswer(page, cap, baseline, waitMs)\n await cap.drain()\n\n let hostname = ''\n try {\n hostname = new URL(page.url()).hostname\n } catch {\n hostname = ''\n }\n const adapter = adapterForHost(hostname)\n if (!adapter) {\n throw new Error(`browser_capture_fanout supports chatgpt.com and claude.ai only; the session is on ${hostname || 'an unknown page'}. Navigate there first with browser_goto.`)\n }\n\n const text = cap.bestAnswerText()\n const parsed = adapter.parse(text, input.prompt || '')\n const result = buildFanoutResult({ platform: adapter.platform, parsed, prompt: input.prompt || '', ready: true, rawBytes: text.length })\n const enriched = enrichFanout(result, { firstPartyDomain: input.first_party_domain })\n const exports = input.export ? exportFanout(enriched) : null\n return { result: enriched, exports }\n } finally {\n await cap.detach().catch(() => undefined)\n }\n}\n"],"mappings":"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","names":["esc"]}