mcp-scraper 0.64.0 → 0.65.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 (41) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +2 -2
  3. package/dist/bin/api-server.cjs +1028 -497
  4. package/dist/bin/api-server.cjs.map +1 -1
  5. package/dist/bin/api-server.js +2 -2
  6. package/dist/bin/mcp-scraper-cli.cjs +1 -1
  7. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  8. package/dist/bin/mcp-scraper-cli.js +1 -1
  9. package/dist/bin/mcp-scraper-install.cjs +2 -2
  10. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  11. package/dist/bin/mcp-scraper-install.js +2 -2
  12. package/dist/bin/mcp-stdio-server.cjs +49 -9
  13. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  14. package/dist/bin/mcp-stdio-server.js +4 -4
  15. package/dist/{chunk-TRSZEK2D.js → chunk-2XUXVKT4.js} +3 -3
  16. package/dist/{chunk-TRSZEK2D.js.map → chunk-2XUXVKT4.js.map} +1 -1
  17. package/dist/chunk-5BODYBIP.js +7 -0
  18. package/dist/chunk-5BODYBIP.js.map +1 -0
  19. package/dist/{chunk-BRKCPONM.js → chunk-5PIO7QBG.js} +2 -2
  20. package/dist/{chunk-5QYSY5KI.js → chunk-AMLFKPLL.js} +139 -3
  21. package/dist/chunk-AMLFKPLL.js.map +1 -0
  22. package/dist/{chunk-3NXLGTC6.js → chunk-DCWXVAQT.js} +2 -2
  23. package/dist/{chunk-3NXLGTC6.js.map → chunk-DCWXVAQT.js.map} +1 -1
  24. package/dist/{chunk-EEW3DMI5.js → chunk-PSKRQDGN.js} +50 -10
  25. package/dist/chunk-PSKRQDGN.js.map +1 -0
  26. package/dist/{extract-bundle-FW23CEMG.js → extract-bundle-UWKJT4MU.js} +371 -14
  27. package/dist/extract-bundle-UWKJT4MU.js.map +1 -0
  28. package/dist/{server-TMAWQYZE.js → server-AFEA235I.js} +170 -163
  29. package/dist/server-AFEA235I.js.map +1 -0
  30. package/dist/{site-extract-repository-UXSFD2QM.js → site-extract-repository-J3RH3MOS.js} +3 -3
  31. package/dist/{worker-DD243CON.js → worker-YKRIK5LS.js} +2 -2
  32. package/package.json +3 -1
  33. package/dist/chunk-5QYSY5KI.js.map +0 -1
  34. package/dist/chunk-DYSXI6QU.js +0 -7
  35. package/dist/chunk-DYSXI6QU.js.map +0 -1
  36. package/dist/chunk-EEW3DMI5.js.map +0 -1
  37. package/dist/extract-bundle-FW23CEMG.js.map +0 -1
  38. package/dist/server-TMAWQYZE.js.map +0 -1
  39. /package/dist/{chunk-BRKCPONM.js.map → chunk-5PIO7QBG.js.map} +0 -0
  40. /package/dist/{site-extract-repository-UXSFD2QM.js.map → site-extract-repository-J3RH3MOS.js.map} +0 -0
  41. /package/dist/{worker-DD243CON.js.map → worker-YKRIK5LS.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/extract-bundle.ts"],"sourcesContent":["import { createWriteStream, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs'\nimport { createHash } from 'node:crypto'\nimport { basename, join } from 'node:path'\nimport { tmpdir } from 'node:os'\nimport { createGzip } from 'node:zlib'\nimport { once } from 'node:events'\nimport { finished } from 'node:stream/promises'\nimport { ZipFile } from 'yazl'\nimport pLimit from 'p-limit'\nimport { getDb } from './db.js'\nimport { computeIssues, renderIssueReport } from './seo-issues.js'\nimport { renderLinkReport, type ExtDomainRow, type LinkReport } from './seo-link-report.js'\nimport type { PageLinkMetrics } from './seo-link-graph.js'\nimport type { SeoAudit } from './seo-audit.js'\nimport type { ExtractJobArtifact, ExtractJobRow } from './site-extract-repository.js'\nimport { extractJobLimitInfo } from './site-extract-repository.js'\nimport type { PageData } from './site-extractor.js'\nimport { publicizeExtractionFailure } from './extraction-problems.js'\nimport { renderImageSection, type ImageAudit } from './image-audit.js'\nimport { downloadAsset } from '../lib/media-extractor.js'\nimport { createSiteExtractBundleArtifactStream, createSiteExtractImageArtifact } from './site-extract-artifacts.js'\nimport { createSiteExtractContentReader } from './site-extract-content-store.js'\n\nexport const SITE_EXTRACT_PAGE_CHUNK = 25\nconst MAX_IMAGES_PER_PAGE = 20\nconst MAX_IMAGES_PER_SITE = 500\nconst IMAGE_DOWNLOAD_CONCURRENCY = 8\nconst MAX_IMAGE_BYTES = 10 * 1024 * 1024\nconst MAX_SITE_IMAGE_BYTES = 100 * 1024 * 1024\nexport const MAX_ANALYZED_LINK_EDGES = 250_000\n\nfunction normalize(u: string): string {\n return u.split('#')[0].replace(/\\/$/, '')\n}\n\nfunction registrableDomain(host: string): string {\n const h = host.replace(/^www\\./, '').toLowerCase()\n const parts = h.split('.')\n return parts.length <= 2 ? h : parts.slice(-2).join('.')\n}\n\nfunction safeImageFilename(url: string, index: number): string {\n try {\n const u = new URL(url)\n const base = basename(u.pathname).replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 80)\n return base || `image-${index}`\n } catch {\n return `image-${index}`\n }\n}\n\nfunction slugFactory() {\n const counts = new Map<string, number>()\n return (url: string): string => {\n const base = url.replace(/^https?:\\/\\//, '').replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 80) || 'page'\n const n = counts.get(base) ?? 0\n counts.set(base, n + 1)\n return n ? `${base}-${n}` : base\n }\n}\n\nasync function* pageChunks(jobId: string): AsyncGenerator<PageData[]> {\n const db = getDb()\n let lastRowId = 0\n for (;;) {\n const res = await db.execute({\n sql: `SELECT rowid AS cursor_id, page\n FROM site_extract_pages\n WHERE job_id = ? AND rowid > ?\n ORDER BY rowid\n LIMIT ${SITE_EXTRACT_PAGE_CHUNK}`,\n args: [jobId, lastRowId],\n })\n if (!res.rows.length) return\n lastRowId = Number(res.rows.at(-1)?.cursor_id ?? lastRowId)\n if (!Number.isSafeInteger(lastRowId) || lastRowId <= 0) throw new Error('site extract page cursor is invalid')\n yield res.rows.map(r => JSON.parse(String((r as unknown as Record<string, unknown>).page)) as PageData)\n }\n}\n\nexport interface AssembleExtras {\n branding?: unknown\n imageAudit?: ImageAudit | null\n seoAudit?: SeoAudit | null\n}\n\nexport async function assembleExtractArtifacts(job: ExtractJobRow, extras: AssembleExtras = {}): Promise<ExtractJobArtifact[]> {\n const dir = join(tmpdir(), `extract-bundle-${job.id}-${Date.now()}`)\n const downloadImages = job.options.downloadImages === true\n if (job.userId == null) throw new Error('site extract artifact owner is missing')\n const readPageContent = createSiteExtractContentReader(String(job.userId))\n mkdirSync(dir, { recursive: true })\n if (downloadImages) mkdirSync(join(dir, 'images'), { recursive: true })\n try {\n const metas: PageData[] = []\n const pageExportEntries: Array<{\n pageId: string\n url: string\n jsonPath: string\n htmlPath: string | null\n markdownPath: string | null\n legacyMarkdownPath: string | null\n jsonSha256: string\n htmlSha256: string | null\n markdownSha256: string | null\n htmlBytes: number\n markdownBytes: number\n }> = []\n const waybackTimeline = job.options.waybackTimeline as {\n rootUrl?: string\n timeline?: { months?: string[]; from?: string; to?: string; intervalMonths?: number; urls?: string[] }\n maxPagesPerSnapshot?: number\n } | undefined\n const statusByUrl = new Map<string, number | null>()\n for await (const chunk of pageChunks(job.id)) {\n for (const p of chunk) {\n statusByUrl.set(normalize(p.url), p.status)\n // Keep only fields needed by computeIssues/renderIssueReport. Holding\n // every bounded PageData field for 10k pages can still consume\n // hundreds of MiB even though DB reads are streamed in small chunks.\n metas.push({\n url: p.url,\n status: p.status,\n title: p.title,\n titleLength: p.titleLength,\n titlePixels: p.titlePixels,\n metaDescription: p.metaDescription,\n metaDescLength: p.metaDescLength,\n h1: p.h1,\n h1_2: p.h1_2,\n h2Count: p.h2Count,\n extractionStatus: p.extractionStatus,\n indexable: p.indexable,\n indexabilityReason: p.indexabilityReason,\n canonicalUrl: p.canonicalUrl ? p.url : null,\n wordCount: p.wordCount,\n contentHash: p.contentHash,\n imagesMissingAlt: p.imagesMissingAlt,\n schemaTypes: p.schemaTypes.length > 0 ? ['present'] : [],\n outlinks: [],\n } as unknown as PageData)\n const pageId = p.pageId ?? createHash('sha256').update(p.archivedUrl ?? p.url).digest('hex')\n const pageDir = join(dir, 'pages', pageId)\n mkdirSync(pageDir, { recursive: true })\n const content = p.contentRef ? await readPageContent(p.contentRef) : null\n const html = content?.html ?? null\n const markdown = content?.markdown ?? p.bodyMarkdown ?? null\n const htmlPath = html == null ? null : `pages/${pageId}/page.html`\n const markdownPath = markdown == null ? null : `pages/${pageId}/page.md`\n const legacyMarkdownPath = markdown == null || !p.archiveRequestedMonth\n ? null\n : `pages/${p.archiveRequestedMonth}/${pageId}.md`\n if (html != null && htmlPath) writeFileSync(join(dir, htmlPath), html)\n if (markdown != null && markdownPath) writeFileSync(join(dir, markdownPath), markdown)\n if (markdown != null && legacyMarkdownPath) {\n mkdirSync(join(dir, 'pages', p.archiveRequestedMonth!), { recursive: true })\n writeFileSync(join(dir, legacyMarkdownPath), markdown)\n }\n const { bodyMarkdown: _body, contentRef: _contentRef, discoveryLinks: _discovery, ...metadata } = p\n const pageRecord = {\n version: 'site-export-page.v1',\n ...metadata,\n pageId,\n content: {\n htmlPath,\n markdownPath,\n htmlBytes: html == null ? 0 : Buffer.byteLength(html),\n markdownBytes: markdown == null ? 0 : Buffer.byteLength(markdown),\n htmlSha256: html == null ? null : createHash('sha256').update(html).digest('hex'),\n markdownSha256: markdown == null ? null : createHash('sha256').update(markdown).digest('hex'),\n },\n }\n const pageJson = JSON.stringify(pageRecord, null, 2)\n const jsonPath = `pages/${pageId}/page.json`\n writeFileSync(join(dir, jsonPath), pageJson)\n pageExportEntries.push({\n pageId,\n url: p.archivedUrl ?? p.url,\n jsonPath,\n htmlPath,\n markdownPath,\n legacyMarkdownPath,\n jsonSha256: createHash('sha256').update(pageJson).digest('hex'),\n htmlSha256: pageRecord.content.htmlSha256,\n markdownSha256: pageRecord.content.markdownSha256,\n htmlBytes: pageRecord.content.htmlBytes,\n markdownBytes: pageRecord.content.markdownBytes,\n })\n }\n }\n\n const gz = createGzip()\n const linksOut = createWriteStream(join(dir, 'links.jsonl.gz'))\n gz.pipe(linksOut)\n const gzWrite = async (line: string) => { if (!gz.write(line)) await once(gz, 'drain') }\n const schemaOut = createWriteStream(join(dir, 'schema.jsonl'))\n const schemaWrite = async (line: string) => { if (!schemaOut.write(line)) await once(schemaOut, 'drain') }\n const failuresOut = createWriteStream(join(dir, 'failures.jsonl'))\n const failureWrite = async (line: string) => { if (!failuresOut.write(line)) await once(failuresOut, 'drain') }\n\n const inboundFrom = new Map<string, Set<string>>()\n const anchorCounts = new Map<string, Map<string, number>>()\n const adjacency = new Map<string, Set<string>>()\n const outCounts = new Map<string, { int: number; ext: number }>()\n const domMap = new Map<string, { links: number; nofollow: number; pages: Set<string> }>()\n const brokenLinkPages = new Set<string>()\n let internalTotal = 0\n let externalTotal = 0\n let brokenInternal = 0\n let streamedLinkEdges = 0\n let analyzedLinkEdges = 0\n let linkAnalysisTruncated = false\n let siteReg = ''\n try { siteReg = registrableDomain(new URL(job.startUrl).hostname) } catch { siteReg = '' }\n\n const imageLimit = pLimit(IMAGE_DOWNLOAD_CONCURRENCY)\n const imageDownloads: Promise<void>[] = []\n const imageManifest: Array<{\n imageId: string\n sourcePage: string\n sourceUrl: string\n path: string | null\n status: 'not_requested' | 'downloaded' | 'failed' | 'skipped_page_limit' | 'skipped_site_limit'\n mimeType: string | null\n bytes: number | null\n sha256: string | null\n failureCode: string | null\n failureReason: string | null\n artifactId: string | null\n }> = []\n const imageArtifacts: ExtractJobArtifact[] = []\n let imagesQueued = 0\n let imagesFailed = 0\n let imageBytesDownloaded = 0\n const consumeImageBytes = (bytes: number) => {\n if (imageBytesDownloaded + bytes > MAX_SITE_IMAGE_BYTES) return false\n imageBytesDownloaded += bytes\n return true\n }\n\n for await (const chunk of pageChunks(job.id)) {\n for (const p of chunk) {\n if (p.schema?.length) await schemaWrite(JSON.stringify({ url: p.url, schema: p.schema }) + '\\n')\n if (p.extractionStatus === 'failed') {\n const { failureCode, failureReason } = publicizeExtractionFailure(p.failureCode, p.failureReason)\n await failureWrite(JSON.stringify({\n url: p.url,\n status: p.status,\n via: p.via,\n failureCode,\n failureReason,\n fetchAttempts: p.fetchAttempts ?? [],\n }) + '\\n')\n }\n if (p.imageLinks?.length) {\n for (const [idx, imgUrl] of p.imageLinks.entries()) {\n const imageId = createHash('sha256').update(`${p.url}\\0${imgUrl}`).digest('hex')\n const record: (typeof imageManifest)[number] = {\n imageId,\n sourcePage: p.url,\n sourceUrl: imgUrl,\n path: null,\n status: 'not_requested',\n mimeType: null,\n bytes: null,\n sha256: null,\n failureCode: null,\n failureReason: null,\n artifactId: null,\n }\n imageManifest.push(record)\n if (!downloadImages) continue\n if (idx >= MAX_IMAGES_PER_PAGE) {\n record.status = 'skipped_page_limit'\n record.failureCode = 'page_image_limit'\n record.failureReason = `Only the first ${MAX_IMAGES_PER_PAGE} image candidates are downloaded per page.`\n continue\n }\n if (imagesQueued >= MAX_IMAGES_PER_SITE) {\n record.status = 'skipped_site_limit'\n record.failureCode = 'site_image_limit'\n record.failureReason = `Only the first ${MAX_IMAGES_PER_SITE} image candidates are downloaded per site.`\n continue\n }\n imagesQueued++\n const filename = `${imageId}-${safeImageFilename(imgUrl, idx)}`\n const outputPath = join(dir, 'images')\n imageDownloads.push(\n imageLimit(() => downloadAsset(imgUrl, outputPath, filename, {\n expectedType: 'image',\n maxBytes: MAX_IMAGE_BYTES,\n consumeBytes: consumeImageBytes,\n })).then(async result => {\n const bytes = readFileSync(result.savedPath)\n const artifact = await createSiteExtractImageArtifact({\n ownerId: String(job.userId),\n jobId: job.id,\n imageId,\n filename,\n contentType: result.mimeType ?? 'application/octet-stream',\n content: bytes,\n sourceUrl: imgUrl,\n sourcePage: p.url,\n })\n imageArtifacts.push(artifact)\n record.status = 'downloaded'\n record.path = `images/${filename}`\n record.artifactId = artifact.key\n record.mimeType = result.mimeType\n record.bytes = result.sizeBytes\n record.sha256 = createHash('sha256').update(bytes).digest('hex')\n }, error => {\n imagesFailed++\n record.status = 'failed'\n record.failureCode = 'image_download_failed'\n record.failureReason = (error instanceof Error ? error.message : String(error)).replace(/\\s+/g, ' ').slice(0, 500)\n }),\n )\n }\n }\n const from = normalize(p.url)\n const oc = { int: 0, ext: 0 }\n for (const l of p.outlinks ?? []) {\n const nofollow = (l.rel ?? '').split(/\\s+/).includes('nofollow')\n const to = normalize(l.href)\n const targetStatus = statusByUrl.get(to) ?? null\n await gzWrite(JSON.stringify({ from: p.url, to: l.href, anchor: l.anchor, rel: l.rel, internal: l.internal, nofollow, targetStatus }) + '\\n')\n streamedLinkEdges++\n if (analyzedLinkEdges >= MAX_ANALYZED_LINK_EDGES) {\n linkAnalysisTruncated = true\n continue\n }\n analyzedLinkEdges++\n if (l.internal) {\n oc.int++\n internalTotal++\n if (!inboundFrom.has(to)) inboundFrom.set(to, new Set())\n inboundFrom.get(to)!.add(from)\n if (l.anchor) {\n if (!anchorCounts.has(to)) anchorCounts.set(to, new Map())\n const ac = anchorCounts.get(to)!\n ac.set(l.anchor, (ac.get(l.anchor) ?? 0) + 1)\n }\n if (!nofollow && (statusByUrl.get(to) === 200 || !statusByUrl.has(to))) {\n if (!adjacency.has(from)) adjacency.set(from, new Set())\n adjacency.get(from)!.add(to)\n }\n if (targetStatus != null && targetStatus >= 400) {\n brokenInternal++\n brokenLinkPages.add(p.url)\n }\n } else {\n oc.ext++\n let domain = ''\n try { domain = registrableDomain(new URL(l.href).hostname) } catch { continue }\n if (!domain || domain === siteReg) continue\n externalTotal++\n const d = domMap.get(domain) ?? { links: 0, nofollow: 0, pages: new Set<string>() }\n d.links++\n if (nofollow) d.nofollow++\n d.pages.add(p.url)\n domMap.set(domain, d)\n }\n }\n outCounts.set(p.url, oc)\n }\n }\n const outputFinished = Promise.all([finished(linksOut), finished(schemaOut), finished(failuresOut)])\n gz.end()\n schemaOut.end()\n failuresOut.end()\n await outputFinished\n await Promise.all(imageDownloads)\n\n const depth = new Map<string, number>()\n const start = normalize(job.startUrl)\n depth.set(start, 0)\n const queue: string[] = [start]\n while (queue.length > 0) {\n const cur = queue.shift()!\n const d = depth.get(cur)!\n for (const next of adjacency.get(cur) ?? []) {\n if (!depth.has(next)) { depth.set(next, d + 1); queue.push(next) }\n }\n }\n\n const metrics = new Map<string, PageLinkMetrics>()\n for (const p of metas) {\n const key = normalize(p.url)\n const inbound = inboundFrom.get(key) ?? new Set()\n const ac = anchorCounts.get(key)\n const topAnchors = ac\n ? [...ac.entries()].sort((a, b) => b[1] - a[1]).slice(0, 3).map(e => e[0])\n : []\n const oc = outCounts.get(p.url) ?? { int: 0, ext: 0 }\n metrics.set(p.url, {\n url: p.url,\n inlinks: inbound.size,\n uniqueInlinks: inbound.size,\n outlinksInternal: oc.int,\n outlinksExternal: oc.ext,\n crawlDepth: depth.has(key) ? depth.get(key)! : null,\n orphan: inbound.size === 0 && key !== start,\n topAnchors,\n })\n }\n\n const issues = computeIssues(metas, metrics, brokenLinkPages)\n let reportMd = renderIssueReport(job.startUrl, metas, issues, metrics)\n const limits = extractJobLimitInfo(job)\n const crawlSummary = {\n jobId: job.id,\n startUrl: job.startUrl,\n status: job.successfulUrls === 0\n ? 'failed'\n : job.failedUrls > 0 || job.remainingUrls > 0 || limits.creditTruncated\n ? 'partial'\n : 'complete',\n ...limits,\n discovered: job.totalUrls,\n attempted: job.attemptedUrls,\n successful: job.successfulUrls,\n failed: job.failedUrls,\n remaining: job.remainingUrls,\n linkAnalysis: {\n truncated: linkAnalysisTruncated,\n analyzedEdges: analyzedLinkEdges,\n streamedEdges: streamedLinkEdges,\n edgeCap: MAX_ANALYZED_LINK_EDGES,\n },\n generatedAt: new Date().toISOString(),\n }\n reportMd = [\n `## Crawl delivery`,\n `- Discovered: ${crawlSummary.discovered}`,\n `- Attempted: ${crawlSummary.attempted}`,\n `- Successful: ${crawlSummary.successful}`,\n `- Failed: ${crawlSummary.failed}`,\n `- Remaining: ${crawlSummary.remaining}`,\n `- Requested page cap: ${limits.requestedMaxPages}`,\n `- Funded page cap: ${limits.effectiveMaxPages}`,\n `- Credit-truncated: ${limits.creditTruncated ? 'yes' : 'no'}`,\n `- Link analysis: ${analyzedLinkEdges}/${streamedLinkEdges} edges${linkAnalysisTruncated ? ` (capped at ${MAX_ANALYZED_LINK_EDGES})` : ''}`,\n '',\n reportMd,\n ].join('\\n')\n if (extras.imageAudit) reportMd += `\\n\\n${renderImageSection(extras.imageAudit)}`\n\n const metricValues = [...metrics.values()]\n const round = (n: number) => Math.round(n * 10) / 10\n const distribution = { zero: 0, oneToTwo: 0, threeToTen: 0, elevenPlus: 0 }\n let sumInlinks = 0\n let sumOutlinks = 0\n for (const m of metricValues) {\n sumInlinks += m.inlinks\n sumOutlinks += m.outlinksInternal + m.outlinksExternal\n if (m.inlinks === 0) distribution.zero++\n else if (m.inlinks <= 2) distribution.oneToTwo++\n else if (m.inlinks <= 10) distribution.threeToTen++\n else distribution.elevenPlus++\n }\n const externalDomains: ExtDomainRow[] = [...domMap.entries()]\n .map(([domain, d]) => ({ domain, links: d.links, nofollow: d.nofollow, pages: d.pages.size }))\n .sort((a, b) => b.links - a.links)\n const linkReport: LinkReport = {\n summary: {\n internal: {\n totalLinks: internalTotal,\n pages: metas.length,\n orphans: metricValues.filter(m => m.orphan).length,\n brokenInternal,\n avgInlinks: metas.length ? round(sumInlinks / metas.length) : 0,\n avgOutlinks: metas.length ? round(sumOutlinks / metas.length) : 0,\n distribution,\n topByInlinks: [...metricValues].sort((a, b) => b.inlinks - a.inlinks).slice(0, 20)\n .map(m => ({ url: m.url, inlinks: m.inlinks, outlinksInternal: m.outlinksInternal, outlinksExternal: m.outlinksExternal })),\n },\n external: {\n totalLinks: externalTotal,\n uniqueDomains: externalDomains.length,\n topDomains: externalDomains.slice(0, 20),\n },\n },\n externalDomains,\n }\n\n const pagesOut = createWriteStream(join(dir, 'pages.jsonl'))\n const pageExportById = new Map(pageExportEntries.map(entry => [entry.pageId, entry]))\n const captureMatrixOut = waybackTimeline\n ? createWriteStream(join(dir, 'capture-matrix.jsonl'))\n : null\n const capturedCells = new Set<string>()\n const captureCellKey = (month: string | null | undefined, url: string) => {\n let normalized = url\n try { normalized = new URL(url).href } catch { /** Keep the bounded stored value. */ }\n return `${month ?? ''}\\0${normalized}`\n }\n for await (const chunk of pageChunks(job.id)) {\n for (const page of chunk) {\n const publicFailure = page.extractionStatus === 'failed'\n ? publicizeExtractionFailure(page.failureCode, page.failureReason)\n : { failureCode: null, failureReason: null }\n const { bodyMarkdown: _body, schema: _schema, outlinks: _outlinks, contentRef: _contentRef, ...boundedPage } = page\n const m = metrics.get(page.url)\n const exported = page.pageId ? pageExportById.get(page.pageId) : undefined\n const row = {\n ...boundedPage,\n ...(page.extractionStatus === 'failed' ? publicFailure : {}),\n representations: exported ? {\n jsonPath: exported.jsonPath,\n htmlPath: exported.htmlPath,\n markdownPath: exported.markdownPath,\n jsonSha256: exported.jsonSha256,\n htmlSha256: exported.htmlSha256,\n markdownSha256: exported.markdownSha256,\n htmlBytes: exported.htmlBytes,\n markdownBytes: exported.markdownBytes,\n } : null,\n inlinks: m?.inlinks ?? 0,\n crawlDepth: m?.crawlDepth ?? null,\n orphan: m?.orphan ?? false,\n }\n if (!pagesOut.write(JSON.stringify(row) + '\\n')) await once(pagesOut, 'drain')\n if (captureMatrixOut) {\n const cellKey = captureCellKey(page.archiveRequestedMonth, page.originalUrl ?? page.url)\n capturedCells.add(cellKey)\n const captureRow = {\n requestedMonth: page.archiveRequestedMonth ?? null,\n captureTimestamp: page.archiveTimestamp ?? null,\n originalUrl: page.originalUrl ?? page.url,\n archivedUrl: page.archivedUrl ?? null,\n status: page.extractionStatus === 'successful' ? 'captured' : 'failed',\n httpStatus: page.status,\n contentHash: page.contentHash || null,\n wordCount: page.wordCount,\n failureCode: publicFailure.failureCode,\n failureReason: publicFailure.failureReason,\n }\n if (!captureMatrixOut.write(JSON.stringify(captureRow) + '\\n')) await once(captureMatrixOut, 'drain')\n }\n }\n }\n if (captureMatrixOut && waybackTimeline?.timeline?.urls) {\n const timeline = waybackTimeline.timeline\n const requestedUrls = timeline.urls!\n const months = (() => {\n if (timeline.months?.length) return [...new Set(timeline.months)].sort()\n if (!timeline.from || !timeline.to) return []\n const values: string[] = []\n const cursor = new Date(`${timeline.from}-01T00:00:00Z`)\n const end = new Date(`${timeline.to}-01T00:00:00Z`)\n while (cursor <= end && values.length < 60) {\n values.push(`${cursor.getUTCFullYear()}-${String(cursor.getUTCMonth() + 1).padStart(2, '0')}`)\n cursor.setUTCMonth(cursor.getUTCMonth() + (timeline.intervalMonths ?? 1))\n }\n return values\n })()\n for (const requestedMonth of months) {\n for (const originalUrl of requestedUrls) {\n if (capturedCells.has(captureCellKey(requestedMonth, originalUrl))) continue\n if (!captureMatrixOut.write(JSON.stringify({\n requestedMonth,\n captureTimestamp: null,\n originalUrl,\n archivedUrl: null,\n status: 'missing',\n httpStatus: null,\n contentHash: null,\n wordCount: 0,\n failureCode: 'wayback_capture_missing',\n failureReason: 'No successful HTML capture was available in the requested month.',\n }) + '\\n')) await once(captureMatrixOut, 'drain')\n }\n }\n }\n const pagesFinished = finished(pagesOut)\n const captureMatrixFinished = captureMatrixOut ? finished(captureMatrixOut) : Promise.resolve()\n pagesOut.end()\n captureMatrixOut?.end()\n await Promise.all([pagesFinished, captureMatrixFinished])\n\n writeFileSync(join(dir, 'report.md'), reportMd)\n writeFileSync(join(dir, 'crawl-summary.json'), JSON.stringify(crawlSummary, null, 2))\n writeFileSync(join(dir, 'images-manifest.jsonl'), imageManifest.map(record => JSON.stringify(record)).join('\\n'))\n writeFileSync(join(dir, 'manifest.json'), JSON.stringify({\n version: 'site-export.v1',\n jobId: job.id,\n startUrl: job.startUrl,\n generatedAt: crawlSummary.generatedAt,\n outputProfile: {\n json: true,\n html: true,\n markdown: true,\n imageManifest: true,\n imageBytes: downloadImages,\n },\n pages: [...pageExportEntries].sort((a, b) => a.pageId.localeCompare(b.pageId)),\n imagesManifestPath: 'images-manifest.jsonl',\n download: 'This ZIP is the complete human export. AI clients should use site_export_read and site_export_image.',\n }, null, 2))\n if (waybackTimeline) {\n writeFileSync(join(dir, 'wayback-manifest.json'), JSON.stringify({\n rootUrl: waybackTimeline.rootUrl ?? job.startUrl,\n requested: waybackTimeline.timeline ?? null,\n maxPagesPerSnapshot: waybackTimeline.maxPagesPerSnapshot ?? null,\n captureMatrix: 'capture-matrix.jsonl',\n }, null, 2))\n }\n writeFileSync(join(dir, 'issues.json'), JSON.stringify(issues, null, 2))\n writeFileSync(join(dir, 'link-metrics.jsonl'), metricValues.map(m => JSON.stringify(m)).join('\\n'))\n writeFileSync(join(dir, 'link-report.md'), renderLinkReport(linkReport))\n writeFileSync(join(dir, 'links-summary.json'), JSON.stringify(linkReport.summary, null, 2))\n writeFileSync(join(dir, 'external-domains.json'), JSON.stringify(linkReport.externalDomains, null, 2))\n if (extras.imageAudit) {\n writeFileSync(join(dir, 'images.jsonl'), extras.imageAudit.rows.map(r => JSON.stringify(r)).join('\\n'))\n writeFileSync(join(dir, 'images-summary.json'), JSON.stringify(extras.imageAudit.summary, null, 2))\n }\n if (extras.seoAudit) writeFileSync(join(dir, 'seo-audit.json'), JSON.stringify(extras.seoAudit, null, 2))\n if (extras.branding) writeFileSync(join(dir, 'branding.json'), JSON.stringify(extras.branding, null, 2))\n if (downloadImages) {\n writeFileSync(join(dir, 'images-download-summary.json'), JSON.stringify({\n queued: imagesQueued,\n downloaded: imagesQueued - imagesFailed,\n failed: imagesFailed,\n downloadedBytes: imageBytesDownloaded,\n perPageCap: MAX_IMAGES_PER_PAGE,\n perSiteCap: MAX_IMAGES_PER_SITE,\n perFileByteCap: MAX_IMAGE_BYTES,\n totalByteCap: MAX_SITE_IMAGE_BYTES,\n }, null, 2))\n }\n\n const artifactFiles: Array<{ name: string; type: string }> = [\n { name: 'manifest.json', type: 'application/json' },\n { name: 'images-manifest.jsonl', type: 'application/x-ndjson' },\n { name: 'report.md', type: 'text/markdown' },\n { name: 'crawl-summary.json', type: 'application/json' },\n { name: 'failures.jsonl', type: 'application/x-ndjson' },\n { name: 'schema.jsonl', type: 'application/x-ndjson' },\n { name: 'issues.json', type: 'application/json' },\n { name: 'pages.jsonl', type: 'application/x-ndjson' },\n { name: 'links.jsonl.gz', type: 'application/gzip' },\n { name: 'link-metrics.jsonl', type: 'application/x-ndjson' },\n { name: 'link-report.md', type: 'text/markdown' },\n { name: 'links-summary.json', type: 'application/json' },\n { name: 'external-domains.json', type: 'application/json' },\n ]\n if (waybackTimeline) {\n artifactFiles.push({ name: 'wayback-manifest.json', type: 'application/json' })\n artifactFiles.push({ name: 'capture-matrix.jsonl', type: 'application/x-ndjson' })\n }\n if (extras.imageAudit) {\n artifactFiles.push({ name: 'images.jsonl', type: 'application/x-ndjson' })\n artifactFiles.push({ name: 'images-summary.json', type: 'application/json' })\n }\n if (extras.seoAudit) artifactFiles.push({ name: 'seo-audit.json', type: 'application/json' })\n if (extras.branding) artifactFiles.push({ name: 'branding.json', type: 'application/json' })\n if (downloadImages) artifactFiles.push({ name: 'images-download-summary.json', type: 'application/json' })\n\n const zip = new ZipFile()\n const artifactPromise = createSiteExtractBundleArtifactStream({\n ownerId: String(job.userId),\n jobId: job.id,\n // Artifact retention starts when this bundle is assembled, including a\n // later support re-finalization, rather than when the crawl was queued.\n createdAt: new Date(),\n content: zip.outputStream,\n })\n for (const f of artifactFiles) zip.addFile(join(dir, f.name), f.name)\n const orderedPageEntries = [...pageExportEntries].sort((a, b) => a.pageId.localeCompare(b.pageId))\n for (const entry of orderedPageEntries) if (entry.markdownPath) zip.addFile(join(dir, entry.markdownPath), entry.markdownPath)\n for (const entry of orderedPageEntries) if (entry.legacyMarkdownPath) zip.addFile(join(dir, entry.legacyMarkdownPath), entry.legacyMarkdownPath)\n for (const entry of orderedPageEntries) if (entry.htmlPath) zip.addFile(join(dir, entry.htmlPath), entry.htmlPath)\n for (const entry of orderedPageEntries) zip.addFile(join(dir, entry.jsonPath), entry.jsonPath)\n if (downloadImages && imagesQueued > imagesFailed) {\n const imagesDir = join(dir, 'images')\n for (const rel of readdirSync(imagesDir, { recursive: true }) as string[]) {\n const full = join(imagesDir, rel)\n if (statSync(full).isFile()) zip.addFile(full, `images/${rel.split('\\\\').join('/')}`)\n }\n }\n zip.end()\n return [await artifactPromise, ...imageArtifacts]\n } finally {\n rmSync(dir, { recursive: true, force: true })\n }\n}\n"],"mappings":"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","names":[]}