seo 0.17.1 → 0.17.2

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';
@@ -3260,6 +3033,246 @@ export declare function createCrawlReport(input: {
3260
3033
  generatedAt?: string;
3261
3034
  }): CrawlReport;
3262
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[];
3237
+ };
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';
3275
+ };
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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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";
@@ -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;