import { type ExtractedCta, type ExtractedFaq, type ExtractedImage, type ExtractedPage, type ExtractedTestimonial, type PageAuditHints } from "./extract.ts"; import type { ImageKind, ImageMediaType, ImageRole } from "./classify.ts"; import type { SocialLink } from "./social.ts"; export declare const CRITICAL_KEYS: readonly ["name", "phone", "email", "address", "primaryCta", "hours", "services"]; export type CriticalKey = (typeof CRITICAL_KEYS)[number]; export type BusinessFacts = { name: string; phone: string; email: string; address: string; city: string; hours: string[]; primaryCta: { label: string; href: string; }; services: { name: string; blurb: string; }[]; social: SocialLink[]; }; export type BriefImage = { sourceUrl: string; sourceUrls?: string[]; alt: string; r2Key: string; src: string; role: ImageRole; kind: ImageKind; mediaType?: ImageMediaType; pageUrl?: string; nearbyHeading?: string; caption?: string; width?: number; height?: number; aboveFold?: boolean; fromOg?: boolean; /** Site-local path after harvest copy, e.g. `/media/hero.png`. Prefer this in pages. */ localPath?: string; thumbPath?: string; shortlist?: boolean; scratchPath?: string; error?: string; }; export type SiteRegister = "trade" | "beauty" | "b2b"; export type VisualHints = { brandColors?: Array<{ value: string; source: string; }>; fontBody?: string; fontDisplay?: string; radius?: string; radiusPill?: string; }; export type OnboardVisual = { register: SiteRegister; signatureSections: string[]; hints: VisualHints; stills: string[]; }; export type BriefPage = { aliasOf?: string; url: string; title: string; description: string; canonical?: string; outline: string[]; paragraphs: string[]; lists: string[]; testimonials: ExtractedTestimonial[]; faqs: ExtractedFaq[]; ctas: ExtractedCta[]; copyFile?: string; audit: PageAuditHints; }; export type OnboardBrief = { version: 2; sourceUrl: string; crawledAt: string; slug: string; business: BusinessFacts; missing: CriticalKey[]; pages: BriefPage[]; images: BriefImage[]; warnings: string[]; compose: string; visual?: OnboardVisual; }; export type OnboardAudit = { version: 1; sourceUrl: string; crawledAt: string; pages: Array<{ url: string; title: string; description: string; canonical?: string; lang?: string; h1Count: number; missingAlts: number; unlabeledInputs: number; hasCanonical: boolean; hasLang: boolean; hasJsonLd: boolean; titleLength: number; descriptionLength: number; }>; summary: { pageCount: number; pagesMissingTitle: number; pagesMissingDescription: number; pagesMultipleH1: number; pagesZeroH1: number; totalMissingAlts: number; totalUnlabeledInputs: number; }; /** Filled by the research graph node (PSI / Lighthouse). */ webVitals: null | { source: string; lcp?: number | string; inp?: number | string; tbt?: number | string; cls?: number | string; accessibilityScore?: number; seoScore?: number; performanceScore?: number; notes?: string; }; }; export type OnboardResearch = { version: 1; reviews: { rating?: number; count?: number; snippets: Array<{ text: string; author?: string; sourceUrl?: string; }>; sourceUrls: string[]; }; social: SocialLink[]; goals: { primaryConversion?: string; serviceArea?: string; doneWhen?: string; notes?: string; }; sources: string[]; completed: boolean; }; export declare const COMPOSE_NOTE = "Follow the agent skill graph (agent/PROMPT.md). Keep facts (name, phone, email, address, hours, services, primary CTA, social). Keep the old site\u2019s media language: owner photos, illustrations, device mockups, portraits, and press marks \u2014 use interpret shortlist /media paths first. Invent new layout, copy, and chrome; do not clone the old grid 1:1. If the old home has a named visual chapter (How It Works, Featured work, Built for\u2026), restyle it on the new home instead of moving it to an inner route."; export declare function emptyFacts(): BusinessFacts; export declare function parseHoursFromText(text: string): string[]; export declare function inferServices(pages: ExtractedPage[]): { name: string; blurb: string; }[]; export declare function collectCandidateImages(pages: ExtractedPage[]): ExtractedImage[]; export declare function missingCritical(facts: BusinessFacts): CriticalKey[]; export declare function mergeFacts(pages: ExtractedPage[], seed?: Partial): BusinessFacts; export declare function assembleBrief(opts: { sourceUrl: string; slug: string; pages: ExtractedPage[]; images?: BriefImage[]; warnings?: string[]; seed?: Partial; crawledAt?: string; copyFiles?: Map; visual?: OnboardVisual; }): OnboardBrief; export declare function inferSignatureSections(pages: ExtractedPage[]): string[]; export declare function inferRegister(pages: ExtractedPage[], business: BusinessFacts): SiteRegister; export declare function assembleAudit(opts: { sourceUrl: string; pages: ExtractedPage[]; crawledAt?: string; }): OnboardAudit; export declare function emptyResearch(social?: SocialLink[]): OnboardResearch;