import type { Finding } from "../hub/finding.js"; import type { SeoAnalysis } from "./analyzer.js"; import type { Logger } from "../utils/logger.js"; /** Hub Finding emitter — mirrors `SecurityFindingSink` (`security-hub.ts:29`). */ export type SeoFindingSink = (finding: Finding) => Promise; export declare class SeoHubEmitter { /** * Build one hub `Finding` per CITED `SeoFinding` in `analysis.findings`. * PURE — never reads the clock (`now` is injected). * * `kind` mapping: `humanApprovalRequired: true` -> `"action"`; * otherwise `"risk"` (informational/low-severity findings could be * refined to `"watch"` in a later sprint — not required by sc-11-4). * * `title` is STABLE across retries (feeds the id hash via * `deriveFindingId`) — built from `workflow` + a slice of the * recommendation text, never the full free-text body. */ mapToFindings(analysis: SeoAnalysis, now: string): Finding[]; /** * Map and emit `analysis`'s cited findings through the injected sink. * Best-effort: NEVER throws. A failure raised by the sink (or the * mapping) is caught and logged via `log.warn` — it must never alter the * runner's exit code (mirrors `emitSecurityFindings`, `security-hub.ts:164-177`). */ emit(analysis: SeoAnalysis, sink: SeoFindingSink, log: Pick, now: string): Promise; } //# sourceMappingURL=hub-emitter.d.ts.map