seo 0.17.1 → 0.17.3

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.
package/dist/index.d.ts CHANGED
@@ -773,13 +773,13 @@ declare const RULE_DEFINITIONS: readonly [{
773
773
  readonly title: "Large HTML response";
774
774
  readonly category: "performance";
775
775
  readonly defaultSeverity: "low";
776
- readonly whyItMatters: "Large HTML takes longer to download and parse before the browser can even start the rest of the page.";
777
- readonly howToFix: "Trim duplicated markup, remove heavy inline data, split non-critical content, and move large scripts or styles out of the HTML response.";
778
- readonly impactIfIgnored: "Pages can feel slow on mobile connections and crawlers spend more time processing each URL.";
779
- readonly howToVerify: "Re-run the crawl and confirm sizeBytes is below the large HTML threshold for normal pages.";
776
+ readonly whyItMatters: "Googlebot reads only the first 2MB of uncompressed HTML for Google Search and indexes the page as if the file ended there. When the h1 or main element, or most of the visible text, sits past that cut, Google may index the page without its main content. Large HTML is also slow to download and parse.";
777
+ readonly howToFix: "Move the main content earlier and trim what comes before it: large inline CSS, inline SVG, JSON data and duplicated markup. Load non-critical styles and scripts as separate files.";
778
+ readonly impactIfIgnored: "Content past the 2MB cut is not indexed, and every page of the template carries the same weight on slow connections.";
779
+ readonly howToVerify: "Re-run the crawl and confirm sizeBytes is under 2,097,152, or that mainContentStartBytes is well before it and few visible words sit after it. The word split is a heuristic from the raw HTML.";
780
780
  readonly agentHints: {
781
- readonly evidenceFields: ["page.sizeBytes", "issue.evidence.thresholdBytes"];
782
- readonly suggestedCommands: ["seo crawl <url> --json"];
781
+ readonly evidenceFields: ["page.sizeBytes", "issue.evidence.thresholdBytes", "issue.evidence.mainContentStartBytes", "issue.evidence.bytesAfterLimit", "issue.evidence.visibleWordsAfterLimit", "issue.evidence.indexingRisk"];
782
+ readonly suggestedCommands: ["seo crawl <url> --mode page --json"];
783
783
  };
784
784
  }, {
785
785
  readonly id: "no_compression";
@@ -2548,233 +2548,6 @@ export declare function contentOptimizationReport(input: {
2548
2548
  refresh?: boolean;
2549
2549
  js?: boolean | 'auto';
2550
2550
  }): Promise<ContentOptimizationReport>;
2551
- export type CrawlPageSnapshot = {
2552
- url: string;
2553
- finalUrl: string;
2554
- status: number;
2555
- contentType?: string;
2556
- responseHeaders?: Record<string, string>;
2557
- responseTimeMs?: number;
2558
- sizeBytes?: number;
2559
- usedJs?: boolean;
2560
- fetchSource?: 'cache' | 'network' | 'rendered';
2561
- cacheState?: 'hit' | 'miss' | 'bypass';
2562
- fetchDiagnostics?: PageFetchDiagnostics;
2563
- auditScope?: 'full' | 'status';
2564
- accessBlock?: AccessBlockEvidence;
2565
- blocked?: boolean;
2566
- contentAuditAllowed?: boolean;
2567
- crawlDepth?: number;
2568
- error?: string;
2569
- robotsTxt?: {
2570
- url: string;
2571
- allowed: boolean | null;
2572
- availability: 'available' | 'absent' | 'access-blocked' | 'rate-limited' | 'unreachable' | 'unreadable';
2573
- status?: number;
2574
- error?: string;
2575
- matchedLine?: string;
2576
- };
2577
- title?: string;
2578
- metaDescription?: string;
2579
- canonical?: string;
2580
- canonicalRaw?: string;
2581
- canonicalStatus?: CanonicalEvidence['status'];
2582
- canonicalCandidates?: CanonicalCandidate[];
2583
- metaRobots?: string;
2584
- xRobotsTag?: string;
2585
- h1?: string;
2586
- h1Count?: number;
2587
- h2Count?: number;
2588
- h3Count?: number;
2589
- indexable: boolean;
2590
- indexability?: string;
2591
- declaredIndexability?: 'indexable-candidate' | 'noindex' | 'robots-blocked' | 'canonical-conflict' | 'canonical-hint-other' | 'meta-refresh' | 'not-html' | 'unknown';
2592
- extractionStatus?: 'complete' | 'failed' | 'not-applicable' | 'unknown-media-type';
2593
- extractionError?: string;
2594
- wordCount: number;
2595
- contentExtraction?: ContentExtractionDiagnostics;
2596
- warnings?: string[];
2597
- contentHash: string;
2598
- mainContentHash?: string;
2599
- textRatio?: number;
2600
- contentSample?: string;
2601
- contentSketch?: ContentSketch;
2602
- softAuthenticationGate?: {
2603
- kind: 'login-form';
2604
- indicators: string[];
2605
- formActionPath?: string;
2606
- };
2607
- metaRefresh?: {
2608
- targetUrl: string;
2609
- delaySeconds: number;
2610
- };
2611
- tabbedContent?: {
2612
- groups: number;
2613
- panels: number;
2614
- retainedPanels: number;
2615
- truncated: boolean;
2616
- panelSketches: Array<{
2617
- label?: string;
2618
- sketch: ContentSketch;
2619
- }>;
2620
- };
2621
- lang?: string;
2622
- hasViewport?: boolean;
2623
- isHttps?: boolean;
2624
- hasHsts?: boolean;
2625
- compression?: string;
2626
- hreflang?: Array<{
2627
- hreflang: string;
2628
- href: string;
2629
- }>;
2630
- mixedContentCount?: number;
2631
- mixedContentSamples?: string[];
2632
- imagesTotal?: number;
2633
- imagesMissingAlt?: number;
2634
- oversizedImageCandidates?: Array<{
2635
- src: string;
2636
- width?: number;
2637
- height?: number;
2638
- detectedFrom: string;
2639
- }>;
2640
- outgoingInternalCount: number;
2641
- outgoingExternalCount?: number;
2642
- internalInlinkCount?: number;
2643
- internalLinkAuthorityScore?: number;
2644
- sampleInternalLinks?: string[];
2645
- sampleExternalLinks?: string[];
2646
- internalAnchorSamples?: Array<{
2647
- href: string;
2648
- text: string;
2649
- }>;
2650
- externalAnchorSamples?: Array<{
2651
- href: string;
2652
- text: string;
2653
- }>;
2654
- markdownAlternates?: string[];
2655
- describedBy?: string[];
2656
- externalLinkChecks?: ExternalLinkCheck[];
2657
- schemaTypes?: string[];
2658
- structuredDataFormats?: Array<'json-ld' | 'microdata' | 'rdfa'>;
2659
- googleRichResults?: GoogleRichResultAssessment[];
2660
- googleRichResultsSelection?: GoogleRichResultAssessmentSelection;
2661
- schemaSameAs?: string[];
2662
- schemaSameAsEvidence?: Array<{
2663
- url: string;
2664
- block: number;
2665
- path: string;
2666
- subjectId?: string;
2667
- subjectTypes: string[];
2668
- }>;
2669
- invalidSchemaSameAs?: Array<{
2670
- block: number;
2671
- path: string;
2672
- value: string;
2673
- }>;
2674
- socialProfileLinks?: string[];
2675
- invalidJsonLdCount?: number;
2676
- invalidJsonLdSamples?: Array<{
2677
- snippet: string;
2678
- error: string;
2679
- }>;
2680
- unrecognizedJsonLdTypes?: Array<{
2681
- block: number;
2682
- path: string;
2683
- value: string;
2684
- reason: 'missing-schema-context' | 'unresolved-context' | 'unsupported-vocabulary';
2685
- }>;
2686
- openGraphTitle?: string;
2687
- openGraphDescription?: string;
2688
- openGraphImage?: string;
2689
- twitterCard?: string;
2690
- author?: string;
2691
- hasDate?: boolean;
2692
- geo?: {
2693
- semanticHtml: boolean;
2694
- structuredData: boolean;
2695
- hasAuthor: boolean;
2696
- hasDate: boolean;
2697
- questionHeadings: number;
2698
- listCount?: number;
2699
- tableCount?: number;
2700
- structuredBlocks: number;
2701
- answerable: boolean;
2702
- hasFaqSchema?: boolean;
2703
- hasQapageSchema?: boolean;
2704
- hasLlmsTxt?: boolean;
2705
- llmsTxtUrl?: string;
2706
- llmsTxtStatus?: number;
2707
- };
2708
- searchMetrics?: {
2709
- clicks: number;
2710
- impressions: number;
2711
- ctr: number;
2712
- position: number;
2713
- };
2714
- topQuery?: {
2715
- query: string;
2716
- clicks: number;
2717
- impressions: number;
2718
- ctr: number;
2719
- position: number;
2720
- };
2721
- analytics?: {
2722
- sessions: number;
2723
- totalUsers?: number;
2724
- conversions?: number;
2725
- };
2726
- };
2727
- export type ExternalLinkCheckState = 'available' | 'confirmed-broken' | 'transient' | 'provider-blocked' | 'rate-limited' | 'method-rejected' | 'unavailable';
2728
- export type ExternalLinkCheckAttempt = {
2729
- method: 'HEAD' | 'GET';
2730
- status?: number;
2731
- error?: string;
2732
- };
2733
- export type ExternalLinkCheck = {
2734
- url: string;
2735
- status?: number;
2736
- error?: string;
2737
- state?: ExternalLinkCheckState;
2738
- attempts?: ExternalLinkCheckAttempt[];
2739
- };
2740
- export type CrawlResponseObservation = {
2741
- requestedUrl: string;
2742
- outcome: 'response';
2743
- finalUrl: string;
2744
- status: number;
2745
- contentType?: string;
2746
- durationMs?: number;
2747
- redirectChain?: PageFetchDiagnostics['redirectChain'];
2748
- accessBlock?: AccessBlockEvidence;
2749
- robotsTxt?: NonNullable<CrawlPageSnapshot['robotsTxt']>;
2750
- } & ({
2751
- extraction: 'complete' | 'not-applicable' | 'unknown-media-type';
2752
- } | {
2753
- extraction: 'failed';
2754
- extractionError: string;
2755
- });
2756
- export type CrawlRequestObservation = CrawlResponseObservation | {
2757
- requestedUrl: string;
2758
- outcome: 'skipped';
2759
- durationMs?: number;
2760
- reason: 'robots-disallowed' | 'robots-deferred';
2761
- robotsTxt: NonNullable<CrawlPageSnapshot['robotsTxt']>;
2762
- extraction: 'not-applicable';
2763
- } | {
2764
- requestedUrl: string;
2765
- outcome: 'skipped';
2766
- durationMs?: number;
2767
- reason: 'origin-backpressure';
2768
- error: string;
2769
- extraction: 'not-applicable';
2770
- } | {
2771
- requestedUrl: string;
2772
- outcome: 'failure';
2773
- durationMs?: number;
2774
- failureKind: 'dns' | 'tls' | 'timeout' | 'redirect-limit' | 'redirect-loop' | 'aborted' | 'unknown';
2775
- error: string;
2776
- extraction: 'not-applicable';
2777
- };
2778
2551
  export type SitemapInvalidLoc = {
2779
2552
  sitemapUrl: string;
2780
2553
  kind: 'url' | 'sitemap';
@@ -3180,86 +2953,326 @@ export type CrawlReportSummary = {
3180
2953
  byStatus: Record<string, number>;
3181
2954
  byCategory: Record<string, number>;
3182
2955
  };
3183
- export type CrawlAccessSummary = {
3184
- crawler: CrawlerIdentity;
3185
- blockedRequests: number;
3186
- providers: Partial<Record<AccessBlockEvidence['provider'], number>>;
3187
- samples: Array<{
3188
- url: string;
3189
- evidence: AccessBlockEvidence;
3190
- }>;
3191
- sampleLimit: number;
3192
- truncated: boolean;
2956
+ export type CrawlAccessSummary = {
2957
+ crawler: CrawlerIdentity;
2958
+ blockedRequests: number;
2959
+ providers: Partial<Record<AccessBlockEvidence['provider'], number>>;
2960
+ samples: Array<{
2961
+ url: string;
2962
+ evidence: AccessBlockEvidence;
2963
+ }>;
2964
+ sampleLimit: number;
2965
+ truncated: boolean;
2966
+ };
2967
+ export type CrawlReport = {
2968
+ id: string;
2969
+ definitionId: string;
2970
+ site?: string;
2971
+ googleAnalyticsPropertyId?: string;
2972
+ analyticsConnection?: AnalyticsConnection;
2973
+ generatedAt: string;
2974
+ status: 'completed' | 'partial' | 'failed';
2975
+ configHash: string;
2976
+ config: CrawlConfig;
2977
+ access: CrawlAccessSummary;
2978
+ summary: CrawlReportSummary;
2979
+ requestEvidenceStatus: 'available' | 'partial' | 'unavailable';
2980
+ requests: CrawlRequestObservation[];
2981
+ pages: CrawlPageSnapshot[];
2982
+ issues: CrawlIssue[];
2983
+ issueGroups: CrawlIssueGroup[];
2984
+ dataSources?: CrawlReportDataSources;
2985
+ ai?: CrawlAiSignals;
2986
+ sitemapDiscovery?: CrawlSitemapDiscovery;
2987
+ externalLinkVerification?: CrawlExternalLinkVerification;
2988
+ siteChecks?: CrawlSiteChecks;
2989
+ warnings: string[];
2990
+ caveats: string[];
2991
+ };
2992
+ export declare function normalizeCrawlConfig(input: CrawlConfigInput): CrawlConfig;
2993
+ export declare function assertCrawlConfigLimits(config: CrawlConfig): CrawlConfig;
2994
+ export declare function crawlConfigHash(config: CrawlConfigInput): string;
2995
+ export declare function crawlDefinitionId(input: {
2996
+ config: CrawlConfigInput;
2997
+ site?: string;
2998
+ googleAnalyticsPropertyId?: string;
2999
+ analyticsConnection?: AnalyticsConnection;
3000
+ }): string;
3001
+ export declare function crawlRunId(): string;
3002
+ export declare function groupCrawlIssues(issues: CrawlIssue[]): CrawlIssueGroup[];
3003
+ export declare function summarizeCrawlReport(input: {
3004
+ pages: CrawlPageSnapshot[];
3005
+ requests?: CrawlRequestObservation[];
3006
+ requestEvidenceStatus?: CrawlReport['requestEvidenceStatus'];
3007
+ issues: CrawlIssue[];
3008
+ stats?: Partial<CrawlRunStats> & {
3009
+ skipReasons?: CrawlSkipReasonCount[];
3010
+ };
3011
+ }): CrawlReportSummary;
3012
+ export declare function createCrawlReport(input: {
3013
+ id?: string;
3014
+ config: CrawlConfigInput;
3015
+ pages?: CrawlPageSnapshot[];
3016
+ requests?: CrawlRequestObservation[];
3017
+ requestEvidenceStatus?: CrawlReport['requestEvidenceStatus'];
3018
+ issues?: CrawlIssue[];
3019
+ additionalIssues?: CrawlIssue[];
3020
+ linkGraph?: CrawlLinkGraph;
3021
+ ai?: CrawlAiSignals;
3022
+ site?: string;
3023
+ googleAnalyticsPropertyId?: string;
3024
+ analyticsConnection?: AnalyticsConnection;
3025
+ dataSources?: CrawlReportDataSources;
3026
+ sitemapDiscovery?: CrawlSitemapDiscovery;
3027
+ externalLinkVerification?: CrawlExternalLinkVerification;
3028
+ siteChecks?: CrawlSiteChecks;
3029
+ status?: CrawlReport['status'];
3030
+ warnings?: string[];
3031
+ caveats?: string[];
3032
+ stats?: Partial<CrawlRunStats>;
3033
+ generatedAt?: string;
3034
+ }): CrawlReport;
3035
+ export declare function normalizeLoadedCrawlReport(report: CrawlReport): CrawlReport;
3036
+ type GooglebotCutEvidence = {
3037
+ limitBytes: number;
3038
+ bytesAfterLimit: number;
3039
+ /** Byte offset of the first <h1> or <main>, whichever comes first. */
3040
+ mainContentStartBytes?: number;
3041
+ mainContentMarker?: 'h1' | 'main';
3042
+ mainContentStart: 'before-limit' | 'near-limit' | 'after-limit' | 'not-found';
3043
+ /** Heuristic: words of text outside tags, scripts and styles. */
3044
+ visibleWordsBeforeLimit: number;
3045
+ visibleWordsAfterLimit: number;
3046
+ };
3047
+ export type CrawlPageSnapshot = {
3048
+ url: string;
3049
+ finalUrl: string;
3050
+ status: number;
3051
+ contentType?: string;
3052
+ responseHeaders?: Record<string, string>;
3053
+ responseTimeMs?: number;
3054
+ sizeBytes?: number;
3055
+ /** Set only when the HTML is over Googlebot's 2MB limit. */
3056
+ googlebotCut?: GooglebotCutEvidence;
3057
+ usedJs?: boolean;
3058
+ fetchSource?: 'cache' | 'network' | 'rendered';
3059
+ cacheState?: 'hit' | 'miss' | 'bypass';
3060
+ fetchDiagnostics?: PageFetchDiagnostics;
3061
+ auditScope?: 'full' | 'status';
3062
+ accessBlock?: AccessBlockEvidence;
3063
+ blocked?: boolean;
3064
+ contentAuditAllowed?: boolean;
3065
+ crawlDepth?: number;
3066
+ error?: string;
3067
+ robotsTxt?: {
3068
+ url: string;
3069
+ allowed: boolean | null;
3070
+ availability: 'available' | 'absent' | 'access-blocked' | 'rate-limited' | 'unreachable' | 'unreadable';
3071
+ status?: number;
3072
+ error?: string;
3073
+ matchedLine?: string;
3074
+ };
3075
+ title?: string;
3076
+ metaDescription?: string;
3077
+ canonical?: string;
3078
+ canonicalRaw?: string;
3079
+ canonicalStatus?: CanonicalEvidence['status'];
3080
+ canonicalCandidates?: CanonicalCandidate[];
3081
+ metaRobots?: string;
3082
+ xRobotsTag?: string;
3083
+ h1?: string;
3084
+ h1Count?: number;
3085
+ h2Count?: number;
3086
+ h3Count?: number;
3087
+ indexable: boolean;
3088
+ indexability?: string;
3089
+ declaredIndexability?: 'indexable-candidate' | 'noindex' | 'robots-blocked' | 'canonical-conflict' | 'canonical-hint-other' | 'meta-refresh' | 'not-html' | 'unknown';
3090
+ extractionStatus?: 'complete' | 'failed' | 'not-applicable' | 'unknown-media-type';
3091
+ extractionError?: string;
3092
+ wordCount: number;
3093
+ contentExtraction?: ContentExtractionDiagnostics;
3094
+ warnings?: string[];
3095
+ contentHash: string;
3096
+ mainContentHash?: string;
3097
+ textRatio?: number;
3098
+ contentSample?: string;
3099
+ contentSketch?: ContentSketch;
3100
+ softAuthenticationGate?: {
3101
+ kind: 'login-form';
3102
+ indicators: string[];
3103
+ formActionPath?: string;
3104
+ };
3105
+ metaRefresh?: {
3106
+ targetUrl: string;
3107
+ delaySeconds: number;
3108
+ };
3109
+ tabbedContent?: {
3110
+ groups: number;
3111
+ panels: number;
3112
+ retainedPanels: number;
3113
+ truncated: boolean;
3114
+ panelSketches: Array<{
3115
+ label?: string;
3116
+ sketch: ContentSketch;
3117
+ }>;
3118
+ };
3119
+ lang?: string;
3120
+ hasViewport?: boolean;
3121
+ isHttps?: boolean;
3122
+ hasHsts?: boolean;
3123
+ compression?: string;
3124
+ hreflang?: Array<{
3125
+ hreflang: string;
3126
+ href: string;
3127
+ }>;
3128
+ mixedContentCount?: number;
3129
+ mixedContentSamples?: string[];
3130
+ imagesTotal?: number;
3131
+ imagesMissingAlt?: number;
3132
+ oversizedImageCandidates?: Array<{
3133
+ src: string;
3134
+ width?: number;
3135
+ height?: number;
3136
+ detectedFrom: string;
3137
+ }>;
3138
+ outgoingInternalCount: number;
3139
+ outgoingExternalCount?: number;
3140
+ internalInlinkCount?: number;
3141
+ internalLinkAuthorityScore?: number;
3142
+ sampleInternalLinks?: string[];
3143
+ sampleExternalLinks?: string[];
3144
+ internalAnchorSamples?: Array<{
3145
+ href: string;
3146
+ text: string;
3147
+ }>;
3148
+ externalAnchorSamples?: Array<{
3149
+ href: string;
3150
+ text: string;
3151
+ }>;
3152
+ markdownAlternates?: string[];
3153
+ describedBy?: string[];
3154
+ externalLinkChecks?: ExternalLinkCheck[];
3155
+ schemaTypes?: string[];
3156
+ structuredDataFormats?: Array<'json-ld' | 'microdata' | 'rdfa'>;
3157
+ googleRichResults?: GoogleRichResultAssessment[];
3158
+ googleRichResultsSelection?: GoogleRichResultAssessmentSelection;
3159
+ schemaSameAs?: string[];
3160
+ schemaSameAsEvidence?: Array<{
3161
+ url: string;
3162
+ block: number;
3163
+ path: string;
3164
+ subjectId?: string;
3165
+ subjectTypes: string[];
3166
+ }>;
3167
+ invalidSchemaSameAs?: Array<{
3168
+ block: number;
3169
+ path: string;
3170
+ value: string;
3171
+ }>;
3172
+ socialProfileLinks?: string[];
3173
+ invalidJsonLdCount?: number;
3174
+ invalidJsonLdSamples?: Array<{
3175
+ snippet: string;
3176
+ error: string;
3177
+ }>;
3178
+ unrecognizedJsonLdTypes?: Array<{
3179
+ block: number;
3180
+ path: string;
3181
+ value: string;
3182
+ reason: 'missing-schema-context' | 'unresolved-context' | 'unsupported-vocabulary';
3183
+ }>;
3184
+ openGraphTitle?: string;
3185
+ openGraphDescription?: string;
3186
+ openGraphImage?: string;
3187
+ twitterCard?: string;
3188
+ author?: string;
3189
+ hasDate?: boolean;
3190
+ geo?: {
3191
+ semanticHtml: boolean;
3192
+ structuredData: boolean;
3193
+ hasAuthor: boolean;
3194
+ hasDate: boolean;
3195
+ questionHeadings: number;
3196
+ listCount?: number;
3197
+ tableCount?: number;
3198
+ structuredBlocks: number;
3199
+ answerable: boolean;
3200
+ hasFaqSchema?: boolean;
3201
+ hasQapageSchema?: boolean;
3202
+ hasLlmsTxt?: boolean;
3203
+ llmsTxtUrl?: string;
3204
+ llmsTxtStatus?: number;
3205
+ };
3206
+ searchMetrics?: {
3207
+ clicks: number;
3208
+ impressions: number;
3209
+ ctr: number;
3210
+ position: number;
3211
+ };
3212
+ topQuery?: {
3213
+ query: string;
3214
+ clicks: number;
3215
+ impressions: number;
3216
+ ctr: number;
3217
+ position: number;
3218
+ };
3219
+ analytics?: {
3220
+ sessions: number;
3221
+ totalUsers?: number;
3222
+ conversions?: number;
3223
+ };
3224
+ };
3225
+ export type ExternalLinkCheckState = 'available' | 'confirmed-broken' | 'transient' | 'provider-blocked' | 'rate-limited' | 'method-rejected' | 'unavailable';
3226
+ export type ExternalLinkCheckAttempt = {
3227
+ method: 'HEAD' | 'GET';
3228
+ status?: number;
3229
+ error?: string;
3230
+ };
3231
+ export type ExternalLinkCheck = {
3232
+ url: string;
3233
+ status?: number;
3234
+ error?: string;
3235
+ state?: ExternalLinkCheckState;
3236
+ attempts?: ExternalLinkCheckAttempt[];
3193
3237
  };
3194
- export type CrawlReport = {
3195
- id: string;
3196
- definitionId: string;
3197
- site?: string;
3198
- googleAnalyticsPropertyId?: string;
3199
- analyticsConnection?: AnalyticsConnection;
3200
- generatedAt: string;
3201
- status: 'completed' | 'partial' | 'failed';
3202
- configHash: string;
3203
- config: CrawlConfig;
3204
- access: CrawlAccessSummary;
3205
- summary: CrawlReportSummary;
3206
- requestEvidenceStatus: 'available' | 'partial' | 'unavailable';
3207
- requests: CrawlRequestObservation[];
3208
- pages: CrawlPageSnapshot[];
3209
- issues: CrawlIssue[];
3210
- issueGroups: CrawlIssueGroup[];
3211
- dataSources?: CrawlReportDataSources;
3212
- ai?: CrawlAiSignals;
3213
- sitemapDiscovery?: CrawlSitemapDiscovery;
3214
- externalLinkVerification?: CrawlExternalLinkVerification;
3215
- siteChecks?: CrawlSiteChecks;
3216
- warnings: string[];
3217
- caveats: string[];
3238
+ export type CrawlResponseObservation = {
3239
+ requestedUrl: string;
3240
+ outcome: 'response';
3241
+ finalUrl: string;
3242
+ status: number;
3243
+ contentType?: string;
3244
+ durationMs?: number;
3245
+ redirectChain?: PageFetchDiagnostics['redirectChain'];
3246
+ accessBlock?: AccessBlockEvidence;
3247
+ robotsTxt?: NonNullable<CrawlPageSnapshot['robotsTxt']>;
3248
+ } & ({
3249
+ extraction: 'complete' | 'not-applicable' | 'unknown-media-type';
3250
+ } | {
3251
+ extraction: 'failed';
3252
+ extractionError: string;
3253
+ });
3254
+ export type CrawlRequestObservation = CrawlResponseObservation | {
3255
+ requestedUrl: string;
3256
+ outcome: 'skipped';
3257
+ durationMs?: number;
3258
+ reason: 'robots-disallowed' | 'robots-deferred';
3259
+ robotsTxt: NonNullable<CrawlPageSnapshot['robotsTxt']>;
3260
+ extraction: 'not-applicable';
3261
+ } | {
3262
+ requestedUrl: string;
3263
+ outcome: 'skipped';
3264
+ durationMs?: number;
3265
+ reason: 'origin-backpressure';
3266
+ error: string;
3267
+ extraction: 'not-applicable';
3268
+ } | {
3269
+ requestedUrl: string;
3270
+ outcome: 'failure';
3271
+ durationMs?: number;
3272
+ failureKind: 'dns' | 'tls' | 'timeout' | 'redirect-limit' | 'redirect-loop' | 'aborted' | 'unknown';
3273
+ error: string;
3274
+ extraction: 'not-applicable';
3218
3275
  };
3219
- export declare function normalizeCrawlConfig(input: CrawlConfigInput): CrawlConfig;
3220
- export declare function assertCrawlConfigLimits(config: CrawlConfig): CrawlConfig;
3221
- export declare function crawlConfigHash(config: CrawlConfigInput): string;
3222
- export declare function crawlDefinitionId(input: {
3223
- config: CrawlConfigInput;
3224
- site?: string;
3225
- googleAnalyticsPropertyId?: string;
3226
- analyticsConnection?: AnalyticsConnection;
3227
- }): string;
3228
- export declare function crawlRunId(): string;
3229
- export declare function groupCrawlIssues(issues: CrawlIssue[]): CrawlIssueGroup[];
3230
- export declare function summarizeCrawlReport(input: {
3231
- pages: CrawlPageSnapshot[];
3232
- requests?: CrawlRequestObservation[];
3233
- requestEvidenceStatus?: CrawlReport['requestEvidenceStatus'];
3234
- issues: CrawlIssue[];
3235
- stats?: Partial<CrawlRunStats> & {
3236
- skipReasons?: CrawlSkipReasonCount[];
3237
- };
3238
- }): CrawlReportSummary;
3239
- export declare function createCrawlReport(input: {
3240
- id?: string;
3241
- config: CrawlConfigInput;
3242
- pages?: CrawlPageSnapshot[];
3243
- requests?: CrawlRequestObservation[];
3244
- requestEvidenceStatus?: CrawlReport['requestEvidenceStatus'];
3245
- issues?: CrawlIssue[];
3246
- additionalIssues?: CrawlIssue[];
3247
- linkGraph?: CrawlLinkGraph;
3248
- ai?: CrawlAiSignals;
3249
- site?: string;
3250
- googleAnalyticsPropertyId?: string;
3251
- analyticsConnection?: AnalyticsConnection;
3252
- dataSources?: CrawlReportDataSources;
3253
- sitemapDiscovery?: CrawlSitemapDiscovery;
3254
- externalLinkVerification?: CrawlExternalLinkVerification;
3255
- siteChecks?: CrawlSiteChecks;
3256
- status?: CrawlReport['status'];
3257
- warnings?: string[];
3258
- caveats?: string[];
3259
- stats?: Partial<CrawlRunStats>;
3260
- generatedAt?: string;
3261
- }): CrawlReport;
3262
- export declare function normalizeLoadedCrawlReport(report: CrawlReport): CrawlReport;
3263
3276
  export declare function auditCrawlRequests(requests: CrawlRequestObservation[]): CrawlIssue[];
3264
3277
  export declare function auditCrawlPages(pages: CrawlPageSnapshot[], opts?: {
3265
3278
  startUrl?: string;
@@ -3383,6 +3396,23 @@ export declare const crawlPageSnapshotSchema: z.ZodObject<{
3383
3396
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
3384
3397
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
3385
3398
  sizeBytes: z.ZodOptional<z.ZodNumber>;
3399
+ googlebotCut: z.ZodOptional<z.ZodObject<{
3400
+ limitBytes: z.ZodNumber;
3401
+ bytesAfterLimit: z.ZodNumber;
3402
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
3403
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
3404
+ h1: "h1";
3405
+ main: "main";
3406
+ }>>;
3407
+ mainContentStart: z.ZodEnum<{
3408
+ "before-limit": "before-limit";
3409
+ "near-limit": "near-limit";
3410
+ "after-limit": "after-limit";
3411
+ "not-found": "not-found";
3412
+ }>;
3413
+ visibleWordsBeforeLimit: z.ZodNumber;
3414
+ visibleWordsAfterLimit: z.ZodNumber;
3415
+ }, z.core.$strip>>;
3386
3416
  usedJs: z.ZodOptional<z.ZodBoolean>;
3387
3417
  fetchSource: z.ZodOptional<z.ZodEnum<{
3388
3418
  cache: "cache";
@@ -3719,10 +3749,10 @@ export declare const crawlPageSnapshotSchema: z.ZodObject<{
3719
3749
  raw: z.ZodString;
3720
3750
  resolved: z.ZodOptional<z.ZodString>;
3721
3751
  ignoredReason: z.ZodOptional<z.ZodEnum<{
3722
- "invalid-url": "invalid-url";
3723
3752
  "outside-head": "outside-head";
3724
3753
  "alternate-qualifier": "alternate-qualifier";
3725
3754
  fragment: "fragment";
3755
+ "invalid-url": "invalid-url";
3726
3756
  "non-http-url": "non-http-url";
3727
3757
  }>>;
3728
3758
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -4360,17 +4390,17 @@ export declare const crawlReportSummarySchema: z.ZodObject<{
4360
4390
  skippedUrls: z.ZodNumber;
4361
4391
  skipReasons: z.ZodArray<z.ZodObject<{
4362
4392
  reason: z.ZodEnum<{
4393
+ "invalid-url": "invalid-url";
4394
+ "robots-disallowed": "robots-disallowed";
4395
+ "origin-backpressure": "origin-backpressure";
4363
4396
  "asset-url": "asset-url";
4364
4397
  "cdn-utility-url": "cdn-utility-url";
4365
4398
  "configured-exclusion": "configured-exclusion";
4366
4399
  "duplicate-normalization": "duplicate-normalization";
4367
- "invalid-url": "invalid-url";
4368
4400
  "memory-pressure": "memory-pressure";
4369
4401
  "off-origin": "off-origin";
4370
- "origin-backpressure": "origin-backpressure";
4371
4402
  "queue-safety-limit": "queue-safety-limit";
4372
4403
  "query-variant-limit": "query-variant-limit";
4373
- "robots-disallowed": "robots-disallowed";
4374
4404
  "robots-uncertain": "robots-uncertain";
4375
4405
  "legacy-unclassified": "legacy-unclassified";
4376
4406
  }>;
@@ -4528,17 +4558,17 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4528
4558
  skippedUrls: z.ZodNumber;
4529
4559
  skipReasons: z.ZodArray<z.ZodObject<{
4530
4560
  reason: z.ZodEnum<{
4561
+ "invalid-url": "invalid-url";
4562
+ "robots-disallowed": "robots-disallowed";
4563
+ "origin-backpressure": "origin-backpressure";
4531
4564
  "asset-url": "asset-url";
4532
4565
  "cdn-utility-url": "cdn-utility-url";
4533
4566
  "configured-exclusion": "configured-exclusion";
4534
4567
  "duplicate-normalization": "duplicate-normalization";
4535
- "invalid-url": "invalid-url";
4536
4568
  "memory-pressure": "memory-pressure";
4537
4569
  "off-origin": "off-origin";
4538
- "origin-backpressure": "origin-backpressure";
4539
4570
  "queue-safety-limit": "queue-safety-limit";
4540
4571
  "query-variant-limit": "query-variant-limit";
4541
- "robots-disallowed": "robots-disallowed";
4542
4572
  "robots-uncertain": "robots-uncertain";
4543
4573
  "legacy-unclassified": "legacy-unclassified";
4544
4574
  }>;
@@ -4577,6 +4607,23 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4577
4607
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
4578
4608
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
4579
4609
  sizeBytes: z.ZodOptional<z.ZodNumber>;
4610
+ googlebotCut: z.ZodOptional<z.ZodObject<{
4611
+ limitBytes: z.ZodNumber;
4612
+ bytesAfterLimit: z.ZodNumber;
4613
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
4614
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
4615
+ h1: "h1";
4616
+ main: "main";
4617
+ }>>;
4618
+ mainContentStart: z.ZodEnum<{
4619
+ "before-limit": "before-limit";
4620
+ "near-limit": "near-limit";
4621
+ "after-limit": "after-limit";
4622
+ "not-found": "not-found";
4623
+ }>;
4624
+ visibleWordsBeforeLimit: z.ZodNumber;
4625
+ visibleWordsAfterLimit: z.ZodNumber;
4626
+ }, z.core.$strip>>;
4580
4627
  usedJs: z.ZodOptional<z.ZodBoolean>;
4581
4628
  fetchSource: z.ZodOptional<z.ZodEnum<{
4582
4629
  cache: "cache";
@@ -4913,10 +4960,10 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4913
4960
  raw: z.ZodString;
4914
4961
  resolved: z.ZodOptional<z.ZodString>;
4915
4962
  ignoredReason: z.ZodOptional<z.ZodEnum<{
4916
- "invalid-url": "invalid-url";
4917
4963
  "outside-head": "outside-head";
4918
4964
  "alternate-qualifier": "alternate-qualifier";
4919
4965
  fragment: "fragment";
4966
+ "invalid-url": "invalid-url";
4920
4967
  "non-http-url": "non-http-url";
4921
4968
  }>>;
4922
4969
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -5875,17 +5922,17 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5875
5922
  skippedUrls: z.ZodNumber;
5876
5923
  skipReasons: z.ZodArray<z.ZodObject<{
5877
5924
  reason: z.ZodEnum<{
5925
+ "invalid-url": "invalid-url";
5926
+ "robots-disallowed": "robots-disallowed";
5927
+ "origin-backpressure": "origin-backpressure";
5878
5928
  "asset-url": "asset-url";
5879
5929
  "cdn-utility-url": "cdn-utility-url";
5880
5930
  "configured-exclusion": "configured-exclusion";
5881
5931
  "duplicate-normalization": "duplicate-normalization";
5882
- "invalid-url": "invalid-url";
5883
5932
  "memory-pressure": "memory-pressure";
5884
5933
  "off-origin": "off-origin";
5885
- "origin-backpressure": "origin-backpressure";
5886
5934
  "queue-safety-limit": "queue-safety-limit";
5887
5935
  "query-variant-limit": "query-variant-limit";
5888
- "robots-disallowed": "robots-disallowed";
5889
5936
  "robots-uncertain": "robots-uncertain";
5890
5937
  "legacy-unclassified": "legacy-unclassified";
5891
5938
  }>;
@@ -5924,6 +5971,23 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5924
5971
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
5925
5972
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
5926
5973
  sizeBytes: z.ZodOptional<z.ZodNumber>;
5974
+ googlebotCut: z.ZodOptional<z.ZodObject<{
5975
+ limitBytes: z.ZodNumber;
5976
+ bytesAfterLimit: z.ZodNumber;
5977
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
5978
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
5979
+ h1: "h1";
5980
+ main: "main";
5981
+ }>>;
5982
+ mainContentStart: z.ZodEnum<{
5983
+ "before-limit": "before-limit";
5984
+ "near-limit": "near-limit";
5985
+ "after-limit": "after-limit";
5986
+ "not-found": "not-found";
5987
+ }>;
5988
+ visibleWordsBeforeLimit: z.ZodNumber;
5989
+ visibleWordsAfterLimit: z.ZodNumber;
5990
+ }, z.core.$strip>>;
5927
5991
  usedJs: z.ZodOptional<z.ZodBoolean>;
5928
5992
  fetchSource: z.ZodOptional<z.ZodEnum<{
5929
5993
  cache: "cache";
@@ -6260,10 +6324,10 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6260
6324
  raw: z.ZodString;
6261
6325
  resolved: z.ZodOptional<z.ZodString>;
6262
6326
  ignoredReason: z.ZodOptional<z.ZodEnum<{
6263
- "invalid-url": "invalid-url";
6264
6327
  "outside-head": "outside-head";
6265
6328
  "alternate-qualifier": "alternate-qualifier";
6266
6329
  fragment: "fragment";
6330
+ "invalid-url": "invalid-url";
6267
6331
  "non-http-url": "non-http-url";
6268
6332
  }>>;
6269
6333
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -7222,17 +7286,17 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7222
7286
  skippedUrls: z.ZodNumber;
7223
7287
  skipReasons: z.ZodArray<z.ZodObject<{
7224
7288
  reason: z.ZodEnum<{
7289
+ "invalid-url": "invalid-url";
7290
+ "robots-disallowed": "robots-disallowed";
7291
+ "origin-backpressure": "origin-backpressure";
7225
7292
  "asset-url": "asset-url";
7226
7293
  "cdn-utility-url": "cdn-utility-url";
7227
7294
  "configured-exclusion": "configured-exclusion";
7228
7295
  "duplicate-normalization": "duplicate-normalization";
7229
- "invalid-url": "invalid-url";
7230
7296
  "memory-pressure": "memory-pressure";
7231
7297
  "off-origin": "off-origin";
7232
- "origin-backpressure": "origin-backpressure";
7233
7298
  "queue-safety-limit": "queue-safety-limit";
7234
7299
  "query-variant-limit": "query-variant-limit";
7235
- "robots-disallowed": "robots-disallowed";
7236
7300
  "robots-uncertain": "robots-uncertain";
7237
7301
  "legacy-unclassified": "legacy-unclassified";
7238
7302
  }>;
@@ -7271,6 +7335,23 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7271
7335
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
7272
7336
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
7273
7337
  sizeBytes: z.ZodOptional<z.ZodNumber>;
7338
+ googlebotCut: z.ZodOptional<z.ZodObject<{
7339
+ limitBytes: z.ZodNumber;
7340
+ bytesAfterLimit: z.ZodNumber;
7341
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
7342
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
7343
+ h1: "h1";
7344
+ main: "main";
7345
+ }>>;
7346
+ mainContentStart: z.ZodEnum<{
7347
+ "before-limit": "before-limit";
7348
+ "near-limit": "near-limit";
7349
+ "after-limit": "after-limit";
7350
+ "not-found": "not-found";
7351
+ }>;
7352
+ visibleWordsBeforeLimit: z.ZodNumber;
7353
+ visibleWordsAfterLimit: z.ZodNumber;
7354
+ }, z.core.$strip>>;
7274
7355
  usedJs: z.ZodOptional<z.ZodBoolean>;
7275
7356
  fetchSource: z.ZodOptional<z.ZodEnum<{
7276
7357
  cache: "cache";
@@ -7607,10 +7688,10 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7607
7688
  raw: z.ZodString;
7608
7689
  resolved: z.ZodOptional<z.ZodString>;
7609
7690
  ignoredReason: z.ZodOptional<z.ZodEnum<{
7610
- "invalid-url": "invalid-url";
7611
7691
  "outside-head": "outside-head";
7612
7692
  "alternate-qualifier": "alternate-qualifier";
7613
7693
  fragment: "fragment";
7694
+ "invalid-url": "invalid-url";
7614
7695
  "non-http-url": "non-http-url";
7615
7696
  }>>;
7616
7697
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -8571,17 +8652,17 @@ export declare const crawlerSchemas: {
8571
8652
  skippedUrls: z.ZodNumber;
8572
8653
  skipReasons: z.ZodArray<z.ZodObject<{
8573
8654
  reason: z.ZodEnum<{
8655
+ "invalid-url": "invalid-url";
8656
+ "robots-disallowed": "robots-disallowed";
8657
+ "origin-backpressure": "origin-backpressure";
8574
8658
  "asset-url": "asset-url";
8575
8659
  "cdn-utility-url": "cdn-utility-url";
8576
8660
  "configured-exclusion": "configured-exclusion";
8577
8661
  "duplicate-normalization": "duplicate-normalization";
8578
- "invalid-url": "invalid-url";
8579
8662
  "memory-pressure": "memory-pressure";
8580
8663
  "off-origin": "off-origin";
8581
- "origin-backpressure": "origin-backpressure";
8582
8664
  "queue-safety-limit": "queue-safety-limit";
8583
8665
  "query-variant-limit": "query-variant-limit";
8584
- "robots-disallowed": "robots-disallowed";
8585
8666
  "robots-uncertain": "robots-uncertain";
8586
8667
  "legacy-unclassified": "legacy-unclassified";
8587
8668
  }>;
@@ -8620,6 +8701,23 @@ export declare const crawlerSchemas: {
8620
8701
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
8621
8702
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
8622
8703
  sizeBytes: z.ZodOptional<z.ZodNumber>;
8704
+ googlebotCut: z.ZodOptional<z.ZodObject<{
8705
+ limitBytes: z.ZodNumber;
8706
+ bytesAfterLimit: z.ZodNumber;
8707
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
8708
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
8709
+ h1: "h1";
8710
+ main: "main";
8711
+ }>>;
8712
+ mainContentStart: z.ZodEnum<{
8713
+ "before-limit": "before-limit";
8714
+ "near-limit": "near-limit";
8715
+ "after-limit": "after-limit";
8716
+ "not-found": "not-found";
8717
+ }>;
8718
+ visibleWordsBeforeLimit: z.ZodNumber;
8719
+ visibleWordsAfterLimit: z.ZodNumber;
8720
+ }, z.core.$strip>>;
8623
8721
  usedJs: z.ZodOptional<z.ZodBoolean>;
8624
8722
  fetchSource: z.ZodOptional<z.ZodEnum<{
8625
8723
  cache: "cache";
@@ -8956,10 +9054,10 @@ export declare const crawlerSchemas: {
8956
9054
  raw: z.ZodString;
8957
9055
  resolved: z.ZodOptional<z.ZodString>;
8958
9056
  ignoredReason: z.ZodOptional<z.ZodEnum<{
8959
- "invalid-url": "invalid-url";
8960
9057
  "outside-head": "outside-head";
8961
9058
  "alternate-qualifier": "alternate-qualifier";
8962
9059
  fragment: "fragment";
9060
+ "invalid-url": "invalid-url";
8963
9061
  "non-http-url": "non-http-url";
8964
9062
  }>>;
8965
9063
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -9918,17 +10016,17 @@ export declare const crawlerSchemas: {
9918
10016
  skippedUrls: z.ZodNumber;
9919
10017
  skipReasons: z.ZodArray<z.ZodObject<{
9920
10018
  reason: z.ZodEnum<{
10019
+ "invalid-url": "invalid-url";
10020
+ "robots-disallowed": "robots-disallowed";
10021
+ "origin-backpressure": "origin-backpressure";
9921
10022
  "asset-url": "asset-url";
9922
10023
  "cdn-utility-url": "cdn-utility-url";
9923
10024
  "configured-exclusion": "configured-exclusion";
9924
10025
  "duplicate-normalization": "duplicate-normalization";
9925
- "invalid-url": "invalid-url";
9926
10026
  "memory-pressure": "memory-pressure";
9927
10027
  "off-origin": "off-origin";
9928
- "origin-backpressure": "origin-backpressure";
9929
10028
  "queue-safety-limit": "queue-safety-limit";
9930
10029
  "query-variant-limit": "query-variant-limit";
9931
- "robots-disallowed": "robots-disallowed";
9932
10030
  "robots-uncertain": "robots-uncertain";
9933
10031
  "legacy-unclassified": "legacy-unclassified";
9934
10032
  }>;
@@ -9967,6 +10065,23 @@ export declare const crawlerSchemas: {
9967
10065
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
9968
10066
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
9969
10067
  sizeBytes: z.ZodOptional<z.ZodNumber>;
10068
+ googlebotCut: z.ZodOptional<z.ZodObject<{
10069
+ limitBytes: z.ZodNumber;
10070
+ bytesAfterLimit: z.ZodNumber;
10071
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
10072
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
10073
+ h1: "h1";
10074
+ main: "main";
10075
+ }>>;
10076
+ mainContentStart: z.ZodEnum<{
10077
+ "before-limit": "before-limit";
10078
+ "near-limit": "near-limit";
10079
+ "after-limit": "after-limit";
10080
+ "not-found": "not-found";
10081
+ }>;
10082
+ visibleWordsBeforeLimit: z.ZodNumber;
10083
+ visibleWordsAfterLimit: z.ZodNumber;
10084
+ }, z.core.$strip>>;
9970
10085
  usedJs: z.ZodOptional<z.ZodBoolean>;
9971
10086
  fetchSource: z.ZodOptional<z.ZodEnum<{
9972
10087
  cache: "cache";
@@ -10303,10 +10418,10 @@ export declare const crawlerSchemas: {
10303
10418
  raw: z.ZodString;
10304
10419
  resolved: z.ZodOptional<z.ZodString>;
10305
10420
  ignoredReason: z.ZodOptional<z.ZodEnum<{
10306
- "invalid-url": "invalid-url";
10307
10421
  "outside-head": "outside-head";
10308
10422
  "alternate-qualifier": "alternate-qualifier";
10309
10423
  fragment: "fragment";
10424
+ "invalid-url": "invalid-url";
10310
10425
  "non-http-url": "non-http-url";
10311
10426
  }>>;
10312
10427
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -11265,17 +11380,17 @@ export declare const crawlerSchemas: {
11265
11380
  skippedUrls: z.ZodNumber;
11266
11381
  skipReasons: z.ZodArray<z.ZodObject<{
11267
11382
  reason: z.ZodEnum<{
11383
+ "invalid-url": "invalid-url";
11384
+ "robots-disallowed": "robots-disallowed";
11385
+ "origin-backpressure": "origin-backpressure";
11268
11386
  "asset-url": "asset-url";
11269
11387
  "cdn-utility-url": "cdn-utility-url";
11270
11388
  "configured-exclusion": "configured-exclusion";
11271
11389
  "duplicate-normalization": "duplicate-normalization";
11272
- "invalid-url": "invalid-url";
11273
11390
  "memory-pressure": "memory-pressure";
11274
11391
  "off-origin": "off-origin";
11275
- "origin-backpressure": "origin-backpressure";
11276
11392
  "queue-safety-limit": "queue-safety-limit";
11277
11393
  "query-variant-limit": "query-variant-limit";
11278
- "robots-disallowed": "robots-disallowed";
11279
11394
  "robots-uncertain": "robots-uncertain";
11280
11395
  "legacy-unclassified": "legacy-unclassified";
11281
11396
  }>;
@@ -11314,6 +11429,23 @@ export declare const crawlerSchemas: {
11314
11429
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
11315
11430
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
11316
11431
  sizeBytes: z.ZodOptional<z.ZodNumber>;
11432
+ googlebotCut: z.ZodOptional<z.ZodObject<{
11433
+ limitBytes: z.ZodNumber;
11434
+ bytesAfterLimit: z.ZodNumber;
11435
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
11436
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
11437
+ h1: "h1";
11438
+ main: "main";
11439
+ }>>;
11440
+ mainContentStart: z.ZodEnum<{
11441
+ "before-limit": "before-limit";
11442
+ "near-limit": "near-limit";
11443
+ "after-limit": "after-limit";
11444
+ "not-found": "not-found";
11445
+ }>;
11446
+ visibleWordsBeforeLimit: z.ZodNumber;
11447
+ visibleWordsAfterLimit: z.ZodNumber;
11448
+ }, z.core.$strip>>;
11317
11449
  usedJs: z.ZodOptional<z.ZodBoolean>;
11318
11450
  fetchSource: z.ZodOptional<z.ZodEnum<{
11319
11451
  cache: "cache";
@@ -11650,10 +11782,10 @@ export declare const crawlerSchemas: {
11650
11782
  raw: z.ZodString;
11651
11783
  resolved: z.ZodOptional<z.ZodString>;
11652
11784
  ignoredReason: z.ZodOptional<z.ZodEnum<{
11653
- "invalid-url": "invalid-url";
11654
11785
  "outside-head": "outside-head";
11655
11786
  "alternate-qualifier": "alternate-qualifier";
11656
11787
  fragment: "fragment";
11788
+ "invalid-url": "invalid-url";
11657
11789
  "non-http-url": "non-http-url";
11658
11790
  }>>;
11659
11791
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -12787,6 +12919,23 @@ export declare const crawlerSchemas: {
12787
12919
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
12788
12920
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
12789
12921
  sizeBytes: z.ZodOptional<z.ZodNumber>;
12922
+ googlebotCut: z.ZodOptional<z.ZodObject<{
12923
+ limitBytes: z.ZodNumber;
12924
+ bytesAfterLimit: z.ZodNumber;
12925
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
12926
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
12927
+ h1: "h1";
12928
+ main: "main";
12929
+ }>>;
12930
+ mainContentStart: z.ZodEnum<{
12931
+ "before-limit": "before-limit";
12932
+ "near-limit": "near-limit";
12933
+ "after-limit": "after-limit";
12934
+ "not-found": "not-found";
12935
+ }>;
12936
+ visibleWordsBeforeLimit: z.ZodNumber;
12937
+ visibleWordsAfterLimit: z.ZodNumber;
12938
+ }, z.core.$strip>>;
12790
12939
  usedJs: z.ZodOptional<z.ZodBoolean>;
12791
12940
  fetchSource: z.ZodOptional<z.ZodEnum<{
12792
12941
  cache: "cache";
@@ -13123,10 +13272,10 @@ export declare const crawlerSchemas: {
13123
13272
  raw: z.ZodString;
13124
13273
  resolved: z.ZodOptional<z.ZodString>;
13125
13274
  ignoredReason: z.ZodOptional<z.ZodEnum<{
13126
- "invalid-url": "invalid-url";
13127
13275
  "outside-head": "outside-head";
13128
13276
  "alternate-qualifier": "alternate-qualifier";
13129
13277
  fragment: "fragment";
13278
+ "invalid-url": "invalid-url";
13130
13279
  "non-http-url": "non-http-url";
13131
13280
  }>>;
13132
13281
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -13547,17 +13696,17 @@ export declare const crawlerJsonSchemas: {
13547
13696
  skippedUrls: z.ZodNumber;
13548
13697
  skipReasons: z.ZodArray<z.ZodObject<{
13549
13698
  reason: z.ZodEnum<{
13699
+ "invalid-url": "invalid-url";
13700
+ "robots-disallowed": "robots-disallowed";
13701
+ "origin-backpressure": "origin-backpressure";
13550
13702
  "asset-url": "asset-url";
13551
13703
  "cdn-utility-url": "cdn-utility-url";
13552
13704
  "configured-exclusion": "configured-exclusion";
13553
13705
  "duplicate-normalization": "duplicate-normalization";
13554
- "invalid-url": "invalid-url";
13555
13706
  "memory-pressure": "memory-pressure";
13556
13707
  "off-origin": "off-origin";
13557
- "origin-backpressure": "origin-backpressure";
13558
13708
  "queue-safety-limit": "queue-safety-limit";
13559
13709
  "query-variant-limit": "query-variant-limit";
13560
- "robots-disallowed": "robots-disallowed";
13561
13710
  "robots-uncertain": "robots-uncertain";
13562
13711
  "legacy-unclassified": "legacy-unclassified";
13563
13712
  }>;
@@ -13596,6 +13745,23 @@ export declare const crawlerJsonSchemas: {
13596
13745
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
13597
13746
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
13598
13747
  sizeBytes: z.ZodOptional<z.ZodNumber>;
13748
+ googlebotCut: z.ZodOptional<z.ZodObject<{
13749
+ limitBytes: z.ZodNumber;
13750
+ bytesAfterLimit: z.ZodNumber;
13751
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
13752
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
13753
+ h1: "h1";
13754
+ main: "main";
13755
+ }>>;
13756
+ mainContentStart: z.ZodEnum<{
13757
+ "before-limit": "before-limit";
13758
+ "near-limit": "near-limit";
13759
+ "after-limit": "after-limit";
13760
+ "not-found": "not-found";
13761
+ }>;
13762
+ visibleWordsBeforeLimit: z.ZodNumber;
13763
+ visibleWordsAfterLimit: z.ZodNumber;
13764
+ }, z.core.$strip>>;
13599
13765
  usedJs: z.ZodOptional<z.ZodBoolean>;
13600
13766
  fetchSource: z.ZodOptional<z.ZodEnum<{
13601
13767
  cache: "cache";
@@ -13932,10 +14098,10 @@ export declare const crawlerJsonSchemas: {
13932
14098
  raw: z.ZodString;
13933
14099
  resolved: z.ZodOptional<z.ZodString>;
13934
14100
  ignoredReason: z.ZodOptional<z.ZodEnum<{
13935
- "invalid-url": "invalid-url";
13936
14101
  "outside-head": "outside-head";
13937
14102
  "alternate-qualifier": "alternate-qualifier";
13938
14103
  fragment: "fragment";
14104
+ "invalid-url": "invalid-url";
13939
14105
  "non-http-url": "non-http-url";
13940
14106
  }>>;
13941
14107
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -14894,17 +15060,17 @@ export declare const crawlerJsonSchemas: {
14894
15060
  skippedUrls: z.ZodNumber;
14895
15061
  skipReasons: z.ZodArray<z.ZodObject<{
14896
15062
  reason: z.ZodEnum<{
15063
+ "invalid-url": "invalid-url";
15064
+ "robots-disallowed": "robots-disallowed";
15065
+ "origin-backpressure": "origin-backpressure";
14897
15066
  "asset-url": "asset-url";
14898
15067
  "cdn-utility-url": "cdn-utility-url";
14899
15068
  "configured-exclusion": "configured-exclusion";
14900
15069
  "duplicate-normalization": "duplicate-normalization";
14901
- "invalid-url": "invalid-url";
14902
15070
  "memory-pressure": "memory-pressure";
14903
15071
  "off-origin": "off-origin";
14904
- "origin-backpressure": "origin-backpressure";
14905
15072
  "queue-safety-limit": "queue-safety-limit";
14906
15073
  "query-variant-limit": "query-variant-limit";
14907
- "robots-disallowed": "robots-disallowed";
14908
15074
  "robots-uncertain": "robots-uncertain";
14909
15075
  "legacy-unclassified": "legacy-unclassified";
14910
15076
  }>;
@@ -14943,6 +15109,23 @@ export declare const crawlerJsonSchemas: {
14943
15109
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
14944
15110
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
14945
15111
  sizeBytes: z.ZodOptional<z.ZodNumber>;
15112
+ googlebotCut: z.ZodOptional<z.ZodObject<{
15113
+ limitBytes: z.ZodNumber;
15114
+ bytesAfterLimit: z.ZodNumber;
15115
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
15116
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
15117
+ h1: "h1";
15118
+ main: "main";
15119
+ }>>;
15120
+ mainContentStart: z.ZodEnum<{
15121
+ "before-limit": "before-limit";
15122
+ "near-limit": "near-limit";
15123
+ "after-limit": "after-limit";
15124
+ "not-found": "not-found";
15125
+ }>;
15126
+ visibleWordsBeforeLimit: z.ZodNumber;
15127
+ visibleWordsAfterLimit: z.ZodNumber;
15128
+ }, z.core.$strip>>;
14946
15129
  usedJs: z.ZodOptional<z.ZodBoolean>;
14947
15130
  fetchSource: z.ZodOptional<z.ZodEnum<{
14948
15131
  cache: "cache";
@@ -15279,10 +15462,10 @@ export declare const crawlerJsonSchemas: {
15279
15462
  raw: z.ZodString;
15280
15463
  resolved: z.ZodOptional<z.ZodString>;
15281
15464
  ignoredReason: z.ZodOptional<z.ZodEnum<{
15282
- "invalid-url": "invalid-url";
15283
15465
  "outside-head": "outside-head";
15284
15466
  "alternate-qualifier": "alternate-qualifier";
15285
15467
  fragment: "fragment";
15468
+ "invalid-url": "invalid-url";
15286
15469
  "non-http-url": "non-http-url";
15287
15470
  }>>;
15288
15471
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -16241,17 +16424,17 @@ export declare const crawlerJsonSchemas: {
16241
16424
  skippedUrls: z.ZodNumber;
16242
16425
  skipReasons: z.ZodArray<z.ZodObject<{
16243
16426
  reason: z.ZodEnum<{
16427
+ "invalid-url": "invalid-url";
16428
+ "robots-disallowed": "robots-disallowed";
16429
+ "origin-backpressure": "origin-backpressure";
16244
16430
  "asset-url": "asset-url";
16245
16431
  "cdn-utility-url": "cdn-utility-url";
16246
16432
  "configured-exclusion": "configured-exclusion";
16247
16433
  "duplicate-normalization": "duplicate-normalization";
16248
- "invalid-url": "invalid-url";
16249
16434
  "memory-pressure": "memory-pressure";
16250
16435
  "off-origin": "off-origin";
16251
- "origin-backpressure": "origin-backpressure";
16252
16436
  "queue-safety-limit": "queue-safety-limit";
16253
16437
  "query-variant-limit": "query-variant-limit";
16254
- "robots-disallowed": "robots-disallowed";
16255
16438
  "robots-uncertain": "robots-uncertain";
16256
16439
  "legacy-unclassified": "legacy-unclassified";
16257
16440
  }>;
@@ -16290,6 +16473,23 @@ export declare const crawlerJsonSchemas: {
16290
16473
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
16291
16474
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
16292
16475
  sizeBytes: z.ZodOptional<z.ZodNumber>;
16476
+ googlebotCut: z.ZodOptional<z.ZodObject<{
16477
+ limitBytes: z.ZodNumber;
16478
+ bytesAfterLimit: z.ZodNumber;
16479
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
16480
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
16481
+ h1: "h1";
16482
+ main: "main";
16483
+ }>>;
16484
+ mainContentStart: z.ZodEnum<{
16485
+ "before-limit": "before-limit";
16486
+ "near-limit": "near-limit";
16487
+ "after-limit": "after-limit";
16488
+ "not-found": "not-found";
16489
+ }>;
16490
+ visibleWordsBeforeLimit: z.ZodNumber;
16491
+ visibleWordsAfterLimit: z.ZodNumber;
16492
+ }, z.core.$strip>>;
16293
16493
  usedJs: z.ZodOptional<z.ZodBoolean>;
16294
16494
  fetchSource: z.ZodOptional<z.ZodEnum<{
16295
16495
  cache: "cache";
@@ -16626,10 +16826,10 @@ export declare const crawlerJsonSchemas: {
16626
16826
  raw: z.ZodString;
16627
16827
  resolved: z.ZodOptional<z.ZodString>;
16628
16828
  ignoredReason: z.ZodOptional<z.ZodEnum<{
16629
- "invalid-url": "invalid-url";
16630
16829
  "outside-head": "outside-head";
16631
16830
  "alternate-qualifier": "alternate-qualifier";
16632
16831
  fragment: "fragment";
16832
+ "invalid-url": "invalid-url";
16633
16833
  "non-http-url": "non-http-url";
16634
16834
  }>>;
16635
16835
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -17763,6 +17963,23 @@ export declare const crawlerJsonSchemas: {
17763
17963
  responseHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
17764
17964
  responseTimeMs: z.ZodOptional<z.ZodNumber>;
17765
17965
  sizeBytes: z.ZodOptional<z.ZodNumber>;
17966
+ googlebotCut: z.ZodOptional<z.ZodObject<{
17967
+ limitBytes: z.ZodNumber;
17968
+ bytesAfterLimit: z.ZodNumber;
17969
+ mainContentStartBytes: z.ZodOptional<z.ZodNumber>;
17970
+ mainContentMarker: z.ZodOptional<z.ZodEnum<{
17971
+ h1: "h1";
17972
+ main: "main";
17973
+ }>>;
17974
+ mainContentStart: z.ZodEnum<{
17975
+ "before-limit": "before-limit";
17976
+ "near-limit": "near-limit";
17977
+ "after-limit": "after-limit";
17978
+ "not-found": "not-found";
17979
+ }>;
17980
+ visibleWordsBeforeLimit: z.ZodNumber;
17981
+ visibleWordsAfterLimit: z.ZodNumber;
17982
+ }, z.core.$strip>>;
17766
17983
  usedJs: z.ZodOptional<z.ZodBoolean>;
17767
17984
  fetchSource: z.ZodOptional<z.ZodEnum<{
17768
17985
  cache: "cache";
@@ -18099,10 +18316,10 @@ export declare const crawlerJsonSchemas: {
18099
18316
  raw: z.ZodString;
18100
18317
  resolved: z.ZodOptional<z.ZodString>;
18101
18318
  ignoredReason: z.ZodOptional<z.ZodEnum<{
18102
- "invalid-url": "invalid-url";
18103
18319
  "outside-head": "outside-head";
18104
18320
  "alternate-qualifier": "alternate-qualifier";
18105
18321
  fragment: "fragment";
18322
+ "invalid-url": "invalid-url";
18106
18323
  "non-http-url": "non-http-url";
18107
18324
  }>>;
18108
18325
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -22116,6 +22333,7 @@ type WeekData = {
22116
22333
  end: string;
22117
22334
  account: string;
22118
22335
  sites: WeekSite[];
22336
+ first?: boolean;
22119
22337
  };
22120
22338
  type WeekGoogleUpdate = {
22121
22339
  name: string;
@@ -22204,10 +22422,63 @@ type LintSource = {
22204
22422
  path: string;
22205
22423
  skipped: string;
22206
22424
  };
22425
+ type AiOverview = {
22426
+ keyword: string;
22427
+ references: {
22428
+ domain: string | null;
22429
+ url: string | null;
22430
+ title: string | null;
22431
+ }[];
22432
+ };
22433
+ declare const RESEARCH_DEVICES: readonly ["desktop", "mobile"];
22434
+ type ResearchDevice = (typeof RESEARCH_DEVICES)[number];
22435
+ type Row$1 = Record<string, string | number | boolean | null>;
22436
+ type ResearchRows = {
22437
+ rows: Row$1[];
22438
+ costUsd: number | null;
22439
+ partial: boolean;
22440
+ missed: string[];
22441
+ noData: string[];
22442
+ floor?: {
22443
+ field: string;
22444
+ value: number;
22445
+ };
22446
+ leftOut?: string[];
22447
+ available?: number;
22448
+ siteTotal?: SiteTotal;
22449
+ rankFailed?: boolean;
22450
+ compared?: {
22451
+ results: number;
22452
+ withPage: number;
22453
+ withSite: number;
22454
+ };
22455
+ aiOverviews?: AiOverview[];
22456
+ warnings?: string[];
22457
+ };
22458
+ type SiteTotal = {
22459
+ metric: 'etv' | 'org_traffic';
22460
+ traffic: number;
22461
+ keywords: number | null;
22462
+ };
22207
22463
  type ResearchStore = {
22208
22464
  get(key: string): Promise<string | null>;
22209
22465
  put(key: string, value: string, ttlSeconds: number): Promise<void>;
22210
22466
  };
22467
+ type Row = ResearchRows['rows'][number];
22468
+ type InstalledSerp = (input: {
22469
+ provider: string;
22470
+ keyword: string;
22471
+ country: string;
22472
+ language: string;
22473
+ device: ResearchDevice;
22474
+ depth: number;
22475
+ }) => Promise<{
22476
+ rows: Row[];
22477
+ costMicros: number | null;
22478
+ partial: boolean;
22479
+ warnings: string[];
22480
+ depth: number;
22481
+ }>;
22211
22482
  export type TokenStorageMode = 'keychain' | 'file';
22212
22483
  export type TokenStorageStatus = {
22213
22484
  configured: TokenStorageMode;
@@ -22710,6 +22981,7 @@ export type ProviderInstallerOptions = {
22710
22981
  export declare function inspectProviderPackage(value: string, options?: ProviderInstallerOptions): Promise<ProviderPackageRelease>;
22711
22982
  export declare function installProviderPackage(input: ProviderPackageRelease, options?: ProviderInstallerOptions): Promise<InstalledProviderPackage>;
22712
22983
  export declare function uninstallProviderExtension(id: string, options?: ProviderInstallerOptions): Promise<InstalledProviderPackage | undefined>;
22984
+ export declare const installedProviderSerp: InstalledSerp;
22713
22985
  export declare function readInstalledProviderPackages(): InstalledProviderPackages;
22714
22986
  export declare function writeInstalledProviderPackages(value: InstalledProviderPackages): InstalledProviderPackages;
22715
22987
  export declare function saveInstalledProviderPackage(value: InstalledProviderPackage): InstalledProviderPackages;