Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Fetch any URL via Chrome CDP and convert the rendered page to clean markdown with YouTube transcript support.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/lib/adapters/generic/index.ts
1import type { Adapter } from "../types";2import { detectInteractionGate } from "../../browser/interaction-gates";3import { captureNormalizedPageSnapshot } from "../../browser/page-snapshot";4import { convertHtmlToMarkdown } from "../../extract/html-to-markdown";56export const genericAdapter: Adapter = {7name: "generic",8match() {9return true;10},11async process(context) {12context.log.info(`Loading ${context.input.url.toString()} with generic adapter`);13await context.browser.goto(context.input.url.toString(), context.timeoutMs);1415try {16await context.network.waitForIdle({17idleMs: 1_200,18timeoutMs: Math.min(context.timeoutMs, 15_000),19});20} catch {21context.log.debug("Network idle timed out on initial load; continuing.");22}2324await context.browser.scrollToEnd({ maxSteps: 4, delayMs: 300 });2526try {27await context.network.waitForIdle({28idleMs: 900,29timeoutMs: Math.min(context.timeoutMs, 10_000),30});31} catch {32context.log.debug("Network idle timed out after scrolling; continuing.");33}3435const interaction = await detectInteractionGate(context.browser);36if (interaction) {37return {38status: "needs_interaction",39interaction,40};41}4243const snapshot = await captureNormalizedPageSnapshot(context.browser);44const converted = await convertHtmlToMarkdown(snapshot.html, snapshot.finalUrl, {45enableRemoteMarkdownFallback: context.outputFormat === "markdown",46preserveBase64Images: context.downloadMedia,47});48const document = {49url: snapshot.finalUrl,50canonicalUrl: converted.metadata.canonicalUrl,51title: converted.metadata.title,52author: converted.metadata.author,53siteName: converted.metadata.siteName,54publishedAt: converted.metadata.publishedAt,55summary: converted.metadata.summary,56adapter: "generic",57metadata: {58coverImage: converted.metadata.coverImage,59language: converted.metadata.language,60capturedAt: converted.metadata.capturedAt,61conversionMethod: converted.conversionMethod,62fallbackReason: converted.fallbackReason,63kind: "generic/article",64},65content: converted.markdown ? [{ type: "markdown" as const, markdown: converted.markdown }] : [],66};6768return {69status: "ok",70document,71media: converted.media,72};73},74};75