seo 0.16.0 → 0.17.0

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
@@ -1753,6 +1753,7 @@ export interface UrlInspectionRequest {
1753
1753
  accountEmail?: string;
1754
1754
  languageCode?: string;
1755
1755
  quotaLimit?: number;
1756
+ signal?: AbortSignal;
1756
1757
  }
1757
1758
  export interface UrlInspectionResult {
1758
1759
  inspectionResult?: {
@@ -2831,7 +2832,7 @@ export declare function fetchSitemapUrls(input: {
2831
2832
  limit?: number;
2832
2833
  maxNested?: number;
2833
2834
  }): Promise<SitemapFetchResult>;
2834
- export declare const CRAWL_SKIP_REASONS: readonly ["asset-url", "configured-exclusion", "duplicate-normalization", "invalid-url", "memory-pressure", "off-origin", "origin-backpressure", "queue-safety-limit", "query-variant-limit", "robots-disallowed", "robots-uncertain", "legacy-unclassified"];
2835
+ export declare const CRAWL_SKIP_REASONS: readonly ["asset-url", "cdn-utility-url", "configured-exclusion", "duplicate-normalization", "invalid-url", "memory-pressure", "off-origin", "origin-backpressure", "queue-safety-limit", "query-variant-limit", "robots-disallowed", "robots-uncertain", "legacy-unclassified"];
2835
2836
  export type CrawlSkipReason = (typeof CRAWL_SKIP_REASONS)[number];
2836
2837
  export type CrawlSkipImpact = 'coverage-affecting' | 'non-impacting';
2837
2838
  export type CrawlSkipReasonCount = {
@@ -2854,6 +2855,9 @@ export declare function normalizeCrawlSkipReasonCounts(input: {
2854
2855
  };
2855
2856
  export declare function crawlSkipReasonCountsFromRecord(input?: Partial<Record<CrawlSkipReason, number>>): CrawlSkipReasonCount[];
2856
2857
  type CrawlStatusPhase = 'started' | 'url_queued' | 'url_skipped' | 'page_started' | 'page_completed' | 'page_failed' | 'page_skipped' | 'external_links_started' | 'external_links_completed' | 'cancelled' | 'completed';
2858
+ export declare function fetchFailureKind(error: unknown, signal?: AbortSignal): Extract<CrawlRequestObservation, {
2859
+ outcome: 'failure';
2860
+ }>['failureKind'];
2857
2861
  export type CrawlOneResult = {
2858
2862
  request?: CrawlRequestObservation;
2859
2863
  page?: CrawlPageSnapshot;
@@ -2879,6 +2883,7 @@ type CrawlSiteChecks = {
2879
2883
  };
2880
2884
  };
2881
2885
  type CrawlAiAvailability = 'available' | 'absent' | 'access-blocked' | 'rate-limited' | 'unreachable';
2886
+ type CrawlFetchErrorKind = 'dns' | 'tls' | 'timeout' | 'redirect-limit' | 'too-large' | 'aborted' | 'unknown';
2882
2887
  type CrawlAiBotAccess = {
2883
2888
  userAgent: string;
2884
2889
  purpose: 'search' | 'training' | 'other';
@@ -2908,6 +2913,7 @@ type CrawlAiSignals = {
2908
2913
  contentType?: string;
2909
2914
  servesHtml?: boolean;
2910
2915
  error?: string;
2916
+ errorKind?: CrawlFetchErrorKind;
2911
2917
  sitemapUrls: string[];
2912
2918
  contentSignals?: string[];
2913
2919
  botAccess: CrawlAiBotAccess[];
@@ -2920,6 +2926,7 @@ type CrawlAiSignals = {
2920
2926
  contentType?: string;
2921
2927
  servesHtml?: boolean;
2922
2928
  error?: string;
2929
+ errorKind?: CrawlFetchErrorKind;
2923
2930
  links?: {
2924
2931
  found: number;
2925
2932
  checked: number;
@@ -3267,6 +3274,8 @@ export declare function reviewObservations(report: CrawlReport, filters?: Omit<T
3267
3274
  export type CrawlOutputFormat = 'pretty' | 'json' | 'csv' | 'html' | 'markdown' | 'junit';
3268
3275
  export declare function renderCrawlCsv(report: CrawlReport): string;
3269
3276
  export declare function renderCrawlPagesCsv(report: CrawlReport): string;
3277
+ /** The caveat a report must lead with when the crawl read too little. */
3278
+ export declare function crawlCoverageCaveat(report: CrawlReport): string | undefined;
3270
3279
  export declare function renderCrawlPretty(report: CrawlReport, fixes?: TopFix[]): string;
3271
3280
  export declare function renderCrawlJunit(report: CrawlReport): string;
3272
3281
  export declare function renderCrawlHtml(report: CrawlReport, fixes?: TopFix[]): string;
@@ -4323,6 +4332,7 @@ export declare const crawlReportSummarySchema: z.ZodObject<{
4323
4332
  "robots-disallowed": "robots-disallowed";
4324
4333
  "origin-backpressure": "origin-backpressure";
4325
4334
  "asset-url": "asset-url";
4335
+ "cdn-utility-url": "cdn-utility-url";
4326
4336
  "configured-exclusion": "configured-exclusion";
4327
4337
  "duplicate-normalization": "duplicate-normalization";
4328
4338
  "memory-pressure": "memory-pressure";
@@ -4490,6 +4500,7 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4490
4500
  "robots-disallowed": "robots-disallowed";
4491
4501
  "origin-backpressure": "origin-backpressure";
4492
4502
  "asset-url": "asset-url";
4503
+ "cdn-utility-url": "cdn-utility-url";
4493
4504
  "configured-exclusion": "configured-exclusion";
4494
4505
  "duplicate-normalization": "duplicate-normalization";
4495
4506
  "memory-pressure": "memory-pressure";
@@ -5300,6 +5311,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5300
5311
  contentType: z.ZodOptional<z.ZodString>;
5301
5312
  servesHtml: z.ZodOptional<z.ZodBoolean>;
5302
5313
  error: z.ZodOptional<z.ZodString>;
5314
+ errorKind: z.ZodOptional<z.ZodEnum<{
5315
+ unknown: "unknown";
5316
+ timeout: "timeout";
5317
+ dns: "dns";
5318
+ tls: "tls";
5319
+ "redirect-limit": "redirect-limit";
5320
+ aborted: "aborted";
5321
+ "too-large": "too-large";
5322
+ }>>;
5303
5323
  sitemapUrls: z.ZodArray<z.ZodString>;
5304
5324
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
5305
5325
  botAccess: z.ZodArray<z.ZodObject<{
@@ -5328,6 +5348,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5328
5348
  contentType: z.ZodOptional<z.ZodString>;
5329
5349
  servesHtml: z.ZodOptional<z.ZodBoolean>;
5330
5350
  error: z.ZodOptional<z.ZodString>;
5351
+ errorKind: z.ZodOptional<z.ZodEnum<{
5352
+ unknown: "unknown";
5353
+ timeout: "timeout";
5354
+ dns: "dns";
5355
+ tls: "tls";
5356
+ "redirect-limit": "redirect-limit";
5357
+ aborted: "aborted";
5358
+ "too-large": "too-large";
5359
+ }>>;
5331
5360
  links: z.ZodOptional<z.ZodObject<{
5332
5361
  found: z.ZodNumber;
5333
5362
  checked: z.ZodNumber;
@@ -5807,6 +5836,7 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5807
5836
  "robots-disallowed": "robots-disallowed";
5808
5837
  "origin-backpressure": "origin-backpressure";
5809
5838
  "asset-url": "asset-url";
5839
+ "cdn-utility-url": "cdn-utility-url";
5810
5840
  "configured-exclusion": "configured-exclusion";
5811
5841
  "duplicate-normalization": "duplicate-normalization";
5812
5842
  "memory-pressure": "memory-pressure";
@@ -6617,6 +6647,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6617
6647
  contentType: z.ZodOptional<z.ZodString>;
6618
6648
  servesHtml: z.ZodOptional<z.ZodBoolean>;
6619
6649
  error: z.ZodOptional<z.ZodString>;
6650
+ errorKind: z.ZodOptional<z.ZodEnum<{
6651
+ unknown: "unknown";
6652
+ timeout: "timeout";
6653
+ dns: "dns";
6654
+ tls: "tls";
6655
+ "redirect-limit": "redirect-limit";
6656
+ aborted: "aborted";
6657
+ "too-large": "too-large";
6658
+ }>>;
6620
6659
  sitemapUrls: z.ZodArray<z.ZodString>;
6621
6660
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
6622
6661
  botAccess: z.ZodArray<z.ZodObject<{
@@ -6645,6 +6684,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6645
6684
  contentType: z.ZodOptional<z.ZodString>;
6646
6685
  servesHtml: z.ZodOptional<z.ZodBoolean>;
6647
6686
  error: z.ZodOptional<z.ZodString>;
6687
+ errorKind: z.ZodOptional<z.ZodEnum<{
6688
+ unknown: "unknown";
6689
+ timeout: "timeout";
6690
+ dns: "dns";
6691
+ tls: "tls";
6692
+ "redirect-limit": "redirect-limit";
6693
+ aborted: "aborted";
6694
+ "too-large": "too-large";
6695
+ }>>;
6648
6696
  links: z.ZodOptional<z.ZodObject<{
6649
6697
  found: z.ZodNumber;
6650
6698
  checked: z.ZodNumber;
@@ -7124,6 +7172,7 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7124
7172
  "robots-disallowed": "robots-disallowed";
7125
7173
  "origin-backpressure": "origin-backpressure";
7126
7174
  "asset-url": "asset-url";
7175
+ "cdn-utility-url": "cdn-utility-url";
7127
7176
  "configured-exclusion": "configured-exclusion";
7128
7177
  "duplicate-normalization": "duplicate-normalization";
7129
7178
  "memory-pressure": "memory-pressure";
@@ -7934,6 +7983,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7934
7983
  contentType: z.ZodOptional<z.ZodString>;
7935
7984
  servesHtml: z.ZodOptional<z.ZodBoolean>;
7936
7985
  error: z.ZodOptional<z.ZodString>;
7986
+ errorKind: z.ZodOptional<z.ZodEnum<{
7987
+ unknown: "unknown";
7988
+ timeout: "timeout";
7989
+ dns: "dns";
7990
+ tls: "tls";
7991
+ "redirect-limit": "redirect-limit";
7992
+ aborted: "aborted";
7993
+ "too-large": "too-large";
7994
+ }>>;
7937
7995
  sitemapUrls: z.ZodArray<z.ZodString>;
7938
7996
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
7939
7997
  botAccess: z.ZodArray<z.ZodObject<{
@@ -7962,6 +8020,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7962
8020
  contentType: z.ZodOptional<z.ZodString>;
7963
8021
  servesHtml: z.ZodOptional<z.ZodBoolean>;
7964
8022
  error: z.ZodOptional<z.ZodString>;
8023
+ errorKind: z.ZodOptional<z.ZodEnum<{
8024
+ unknown: "unknown";
8025
+ timeout: "timeout";
8026
+ dns: "dns";
8027
+ tls: "tls";
8028
+ "redirect-limit": "redirect-limit";
8029
+ aborted: "aborted";
8030
+ "too-large": "too-large";
8031
+ }>>;
7965
8032
  links: z.ZodOptional<z.ZodObject<{
7966
8033
  found: z.ZodNumber;
7967
8034
  checked: z.ZodNumber;
@@ -8443,6 +8510,7 @@ export declare const crawlerSchemas: {
8443
8510
  "robots-disallowed": "robots-disallowed";
8444
8511
  "origin-backpressure": "origin-backpressure";
8445
8512
  "asset-url": "asset-url";
8513
+ "cdn-utility-url": "cdn-utility-url";
8446
8514
  "configured-exclusion": "configured-exclusion";
8447
8515
  "duplicate-normalization": "duplicate-normalization";
8448
8516
  "memory-pressure": "memory-pressure";
@@ -9253,6 +9321,15 @@ export declare const crawlerSchemas: {
9253
9321
  contentType: z.ZodOptional<z.ZodString>;
9254
9322
  servesHtml: z.ZodOptional<z.ZodBoolean>;
9255
9323
  error: z.ZodOptional<z.ZodString>;
9324
+ errorKind: z.ZodOptional<z.ZodEnum<{
9325
+ unknown: "unknown";
9326
+ timeout: "timeout";
9327
+ dns: "dns";
9328
+ tls: "tls";
9329
+ "redirect-limit": "redirect-limit";
9330
+ aborted: "aborted";
9331
+ "too-large": "too-large";
9332
+ }>>;
9256
9333
  sitemapUrls: z.ZodArray<z.ZodString>;
9257
9334
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
9258
9335
  botAccess: z.ZodArray<z.ZodObject<{
@@ -9281,6 +9358,15 @@ export declare const crawlerSchemas: {
9281
9358
  contentType: z.ZodOptional<z.ZodString>;
9282
9359
  servesHtml: z.ZodOptional<z.ZodBoolean>;
9283
9360
  error: z.ZodOptional<z.ZodString>;
9361
+ errorKind: z.ZodOptional<z.ZodEnum<{
9362
+ unknown: "unknown";
9363
+ timeout: "timeout";
9364
+ dns: "dns";
9365
+ tls: "tls";
9366
+ "redirect-limit": "redirect-limit";
9367
+ aborted: "aborted";
9368
+ "too-large": "too-large";
9369
+ }>>;
9284
9370
  links: z.ZodOptional<z.ZodObject<{
9285
9371
  found: z.ZodNumber;
9286
9372
  checked: z.ZodNumber;
@@ -9760,6 +9846,7 @@ export declare const crawlerSchemas: {
9760
9846
  "robots-disallowed": "robots-disallowed";
9761
9847
  "origin-backpressure": "origin-backpressure";
9762
9848
  "asset-url": "asset-url";
9849
+ "cdn-utility-url": "cdn-utility-url";
9763
9850
  "configured-exclusion": "configured-exclusion";
9764
9851
  "duplicate-normalization": "duplicate-normalization";
9765
9852
  "memory-pressure": "memory-pressure";
@@ -10570,6 +10657,15 @@ export declare const crawlerSchemas: {
10570
10657
  contentType: z.ZodOptional<z.ZodString>;
10571
10658
  servesHtml: z.ZodOptional<z.ZodBoolean>;
10572
10659
  error: z.ZodOptional<z.ZodString>;
10660
+ errorKind: z.ZodOptional<z.ZodEnum<{
10661
+ unknown: "unknown";
10662
+ timeout: "timeout";
10663
+ dns: "dns";
10664
+ tls: "tls";
10665
+ "redirect-limit": "redirect-limit";
10666
+ aborted: "aborted";
10667
+ "too-large": "too-large";
10668
+ }>>;
10573
10669
  sitemapUrls: z.ZodArray<z.ZodString>;
10574
10670
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
10575
10671
  botAccess: z.ZodArray<z.ZodObject<{
@@ -10598,6 +10694,15 @@ export declare const crawlerSchemas: {
10598
10694
  contentType: z.ZodOptional<z.ZodString>;
10599
10695
  servesHtml: z.ZodOptional<z.ZodBoolean>;
10600
10696
  error: z.ZodOptional<z.ZodString>;
10697
+ errorKind: z.ZodOptional<z.ZodEnum<{
10698
+ unknown: "unknown";
10699
+ timeout: "timeout";
10700
+ dns: "dns";
10701
+ tls: "tls";
10702
+ "redirect-limit": "redirect-limit";
10703
+ aborted: "aborted";
10704
+ "too-large": "too-large";
10705
+ }>>;
10601
10706
  links: z.ZodOptional<z.ZodObject<{
10602
10707
  found: z.ZodNumber;
10603
10708
  checked: z.ZodNumber;
@@ -11077,6 +11182,7 @@ export declare const crawlerSchemas: {
11077
11182
  "robots-disallowed": "robots-disallowed";
11078
11183
  "origin-backpressure": "origin-backpressure";
11079
11184
  "asset-url": "asset-url";
11185
+ "cdn-utility-url": "cdn-utility-url";
11080
11186
  "configured-exclusion": "configured-exclusion";
11081
11187
  "duplicate-normalization": "duplicate-normalization";
11082
11188
  "memory-pressure": "memory-pressure";
@@ -11887,6 +11993,15 @@ export declare const crawlerSchemas: {
11887
11993
  contentType: z.ZodOptional<z.ZodString>;
11888
11994
  servesHtml: z.ZodOptional<z.ZodBoolean>;
11889
11995
  error: z.ZodOptional<z.ZodString>;
11996
+ errorKind: z.ZodOptional<z.ZodEnum<{
11997
+ unknown: "unknown";
11998
+ timeout: "timeout";
11999
+ dns: "dns";
12000
+ tls: "tls";
12001
+ "redirect-limit": "redirect-limit";
12002
+ aborted: "aborted";
12003
+ "too-large": "too-large";
12004
+ }>>;
11890
12005
  sitemapUrls: z.ZodArray<z.ZodString>;
11891
12006
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
11892
12007
  botAccess: z.ZodArray<z.ZodObject<{
@@ -11915,6 +12030,15 @@ export declare const crawlerSchemas: {
11915
12030
  contentType: z.ZodOptional<z.ZodString>;
11916
12031
  servesHtml: z.ZodOptional<z.ZodBoolean>;
11917
12032
  error: z.ZodOptional<z.ZodString>;
12033
+ errorKind: z.ZodOptional<z.ZodEnum<{
12034
+ unknown: "unknown";
12035
+ timeout: "timeout";
12036
+ dns: "dns";
12037
+ tls: "tls";
12038
+ "redirect-limit": "redirect-limit";
12039
+ aborted: "aborted";
12040
+ "too-large": "too-large";
12041
+ }>>;
11918
12042
  links: z.ZodOptional<z.ZodObject<{
11919
12043
  found: z.ZodNumber;
11920
12044
  checked: z.ZodNumber;
@@ -13323,6 +13447,7 @@ export declare const crawlerJsonSchemas: {
13323
13447
  "robots-disallowed": "robots-disallowed";
13324
13448
  "origin-backpressure": "origin-backpressure";
13325
13449
  "asset-url": "asset-url";
13450
+ "cdn-utility-url": "cdn-utility-url";
13326
13451
  "configured-exclusion": "configured-exclusion";
13327
13452
  "duplicate-normalization": "duplicate-normalization";
13328
13453
  "memory-pressure": "memory-pressure";
@@ -14133,6 +14258,15 @@ export declare const crawlerJsonSchemas: {
14133
14258
  contentType: z.ZodOptional<z.ZodString>;
14134
14259
  servesHtml: z.ZodOptional<z.ZodBoolean>;
14135
14260
  error: z.ZodOptional<z.ZodString>;
14261
+ errorKind: z.ZodOptional<z.ZodEnum<{
14262
+ unknown: "unknown";
14263
+ timeout: "timeout";
14264
+ dns: "dns";
14265
+ tls: "tls";
14266
+ "redirect-limit": "redirect-limit";
14267
+ aborted: "aborted";
14268
+ "too-large": "too-large";
14269
+ }>>;
14136
14270
  sitemapUrls: z.ZodArray<z.ZodString>;
14137
14271
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
14138
14272
  botAccess: z.ZodArray<z.ZodObject<{
@@ -14161,6 +14295,15 @@ export declare const crawlerJsonSchemas: {
14161
14295
  contentType: z.ZodOptional<z.ZodString>;
14162
14296
  servesHtml: z.ZodOptional<z.ZodBoolean>;
14163
14297
  error: z.ZodOptional<z.ZodString>;
14298
+ errorKind: z.ZodOptional<z.ZodEnum<{
14299
+ unknown: "unknown";
14300
+ timeout: "timeout";
14301
+ dns: "dns";
14302
+ tls: "tls";
14303
+ "redirect-limit": "redirect-limit";
14304
+ aborted: "aborted";
14305
+ "too-large": "too-large";
14306
+ }>>;
14164
14307
  links: z.ZodOptional<z.ZodObject<{
14165
14308
  found: z.ZodNumber;
14166
14309
  checked: z.ZodNumber;
@@ -14640,6 +14783,7 @@ export declare const crawlerJsonSchemas: {
14640
14783
  "robots-disallowed": "robots-disallowed";
14641
14784
  "origin-backpressure": "origin-backpressure";
14642
14785
  "asset-url": "asset-url";
14786
+ "cdn-utility-url": "cdn-utility-url";
14643
14787
  "configured-exclusion": "configured-exclusion";
14644
14788
  "duplicate-normalization": "duplicate-normalization";
14645
14789
  "memory-pressure": "memory-pressure";
@@ -15450,6 +15594,15 @@ export declare const crawlerJsonSchemas: {
15450
15594
  contentType: z.ZodOptional<z.ZodString>;
15451
15595
  servesHtml: z.ZodOptional<z.ZodBoolean>;
15452
15596
  error: z.ZodOptional<z.ZodString>;
15597
+ errorKind: z.ZodOptional<z.ZodEnum<{
15598
+ unknown: "unknown";
15599
+ timeout: "timeout";
15600
+ dns: "dns";
15601
+ tls: "tls";
15602
+ "redirect-limit": "redirect-limit";
15603
+ aborted: "aborted";
15604
+ "too-large": "too-large";
15605
+ }>>;
15453
15606
  sitemapUrls: z.ZodArray<z.ZodString>;
15454
15607
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
15455
15608
  botAccess: z.ZodArray<z.ZodObject<{
@@ -15478,6 +15631,15 @@ export declare const crawlerJsonSchemas: {
15478
15631
  contentType: z.ZodOptional<z.ZodString>;
15479
15632
  servesHtml: z.ZodOptional<z.ZodBoolean>;
15480
15633
  error: z.ZodOptional<z.ZodString>;
15634
+ errorKind: z.ZodOptional<z.ZodEnum<{
15635
+ unknown: "unknown";
15636
+ timeout: "timeout";
15637
+ dns: "dns";
15638
+ tls: "tls";
15639
+ "redirect-limit": "redirect-limit";
15640
+ aborted: "aborted";
15641
+ "too-large": "too-large";
15642
+ }>>;
15481
15643
  links: z.ZodOptional<z.ZodObject<{
15482
15644
  found: z.ZodNumber;
15483
15645
  checked: z.ZodNumber;
@@ -15957,6 +16119,7 @@ export declare const crawlerJsonSchemas: {
15957
16119
  "robots-disallowed": "robots-disallowed";
15958
16120
  "origin-backpressure": "origin-backpressure";
15959
16121
  "asset-url": "asset-url";
16122
+ "cdn-utility-url": "cdn-utility-url";
15960
16123
  "configured-exclusion": "configured-exclusion";
15961
16124
  "duplicate-normalization": "duplicate-normalization";
15962
16125
  "memory-pressure": "memory-pressure";
@@ -16767,6 +16930,15 @@ export declare const crawlerJsonSchemas: {
16767
16930
  contentType: z.ZodOptional<z.ZodString>;
16768
16931
  servesHtml: z.ZodOptional<z.ZodBoolean>;
16769
16932
  error: z.ZodOptional<z.ZodString>;
16933
+ errorKind: z.ZodOptional<z.ZodEnum<{
16934
+ unknown: "unknown";
16935
+ timeout: "timeout";
16936
+ dns: "dns";
16937
+ tls: "tls";
16938
+ "redirect-limit": "redirect-limit";
16939
+ aborted: "aborted";
16940
+ "too-large": "too-large";
16941
+ }>>;
16770
16942
  sitemapUrls: z.ZodArray<z.ZodString>;
16771
16943
  contentSignals: z.ZodOptional<z.ZodArray<z.ZodString>>;
16772
16944
  botAccess: z.ZodArray<z.ZodObject<{
@@ -16795,6 +16967,15 @@ export declare const crawlerJsonSchemas: {
16795
16967
  contentType: z.ZodOptional<z.ZodString>;
16796
16968
  servesHtml: z.ZodOptional<z.ZodBoolean>;
16797
16969
  error: z.ZodOptional<z.ZodString>;
16970
+ errorKind: z.ZodOptional<z.ZodEnum<{
16971
+ unknown: "unknown";
16972
+ timeout: "timeout";
16973
+ dns: "dns";
16974
+ tls: "tls";
16975
+ "redirect-limit": "redirect-limit";
16976
+ aborted: "aborted";
16977
+ "too-large": "too-large";
16978
+ }>>;
16798
16979
  links: z.ZodOptional<z.ZodObject<{
16799
16980
  found: z.ZodNumber;
16800
16981
  checked: z.ZodNumber;
@@ -18209,9 +18390,9 @@ export declare const providerIdSchema: z.ZodString;
18209
18390
  export type ProviderId = z.infer<typeof providerIdSchema>;
18210
18391
  export type ExternalServiceId = string;
18211
18392
  export declare const providerCapabilitySchema: z.ZodEnum<{
18393
+ "serp-snapshot": "serp-snapshot";
18212
18394
  "keyword-metrics": "keyword-metrics";
18213
18395
  "keyword-discovery": "keyword-discovery";
18214
- "serp-snapshot": "serp-snapshot";
18215
18396
  "domain-overview": "domain-overview";
18216
18397
  "ranked-keywords": "ranked-keywords";
18217
18398
  "relevant-pages": "relevant-pages";
@@ -18373,11 +18554,110 @@ type ResolvedCrawlSiteDependencies = {
18373
18554
  fetchLandingPageValues: typeof fetchLandingPageValues;
18374
18555
  landingValueForUrl: typeof landingValueForUrl;
18375
18556
  now: () => Date;
18557
+ /** Waits out a rate-limit cool-down. Tests inject a zero delay. */
18558
+ sleep: (ms: number, signal?: AbortSignal) => Promise<void>;
18376
18559
  memoryUsage: () => Pick<NodeJS.MemoryUsage, 'rss' | 'heapUsed' | 'external'>;
18377
18560
  totalMemory: () => number;
18378
18561
  };
18379
18562
  type CrawlSiteDependencies = Partial<ResolvedCrawlSiteDependencies>;
18380
18563
  export declare function crawlSite(input: CrawlConfigInput, dependencies?: CrawlSiteDependencies): Promise<CrawlReport>;
18564
+ export declare const SITE_FACTS_MAX_SITES = 1000;
18565
+ export declare const SITE_FACTS_DEFAULT_CONCURRENCY = 8;
18566
+ export declare const SITE_FACTS_MAX_CONCURRENCY = 16;
18567
+ export declare const SITE_FACTS_TIMEOUT_MS = 5000;
18568
+ export type SiteHomepageFacts = {
18569
+ url: string;
18570
+ outcome: 'response' | 'failed' | 'skipped';
18571
+ skipReason?: 'robots-disallowed' | 'robots-unknown';
18572
+ availability?: CrawlAiAvailability;
18573
+ status?: number;
18574
+ finalUrl?: string;
18575
+ redirects?: NonNullable<PageFetchResult['diagnostics']['redirectChain']>;
18576
+ contentType?: string;
18577
+ accessBlock?: {
18578
+ provider: string;
18579
+ kind: string;
18580
+ };
18581
+ responseTimeMs?: number;
18582
+ sizeBytes?: number;
18583
+ title?: string;
18584
+ metaDescription?: string;
18585
+ h1?: string;
18586
+ lang?: string;
18587
+ canonical?: string;
18588
+ metaRobots?: string;
18589
+ xRobotsTag?: string;
18590
+ indexable?: boolean;
18591
+ indexability?: string;
18592
+ markdownAlternates?: string[];
18593
+ contentSignal?: string;
18594
+ linkRelations?: string[];
18595
+ error?: string;
18596
+ errorKind?: CrawlFetchErrorKind;
18597
+ };
18598
+ export type SiteRobotsFacts = Omit<NonNullable<CrawlAiSignals['robotsTxt']>, 'sitemapUrls'> & {
18599
+ sitemapUrls: string[];
18600
+ sitemapCount: number;
18601
+ homepageAllowed: boolean | null;
18602
+ };
18603
+ export type SiteLlmsFacts = NonNullable<CrawlAiSignals['llmsTxt']> & {
18604
+ sizeBytes?: number;
18605
+ startsWithH1?: boolean;
18606
+ h1?: string;
18607
+ sameSiteLinks?: number;
18608
+ };
18609
+ export type SiteFactsRow = {
18610
+ type: 'site';
18611
+ input: string;
18612
+ origin?: string;
18613
+ error?: string;
18614
+ checkedAt?: string;
18615
+ robotsTxt?: SiteRobotsFacts;
18616
+ homepage?: SiteHomepageFacts;
18617
+ llmsTxt?: SiteLlmsFacts;
18618
+ };
18619
+ type AvailabilityCounts = Record<CrawlAiAvailability, number> & {
18620
+ failed: number;
18621
+ };
18622
+ export type SiteFactsSummary = {
18623
+ type: 'summary';
18624
+ status: 'complete' | 'cancelled';
18625
+ sites: number;
18626
+ checked: number;
18627
+ invalid: number;
18628
+ duplicatesRemoved: number;
18629
+ maxSites: number;
18630
+ concurrency: number;
18631
+ timeoutMs: number;
18632
+ durationMs: number;
18633
+ robotsTxt: AvailabilityCounts;
18634
+ homepage: AvailabilityCounts & {
18635
+ skipped: number;
18636
+ };
18637
+ llmsTxt: AvailabilityCounts & {
18638
+ startsWithH1: number;
18639
+ };
18640
+ botAccess: Array<{
18641
+ userAgent: string;
18642
+ purpose: CrawlAiBotAccess['purpose'];
18643
+ allowed: number;
18644
+ blocked: number;
18645
+ unknown: number;
18646
+ }>;
18647
+ };
18648
+ type Fetch = typeof publicHttpFetch;
18649
+ export type SiteFactsInput = {
18650
+ sites: string[];
18651
+ concurrency?: number;
18652
+ respectRobots?: boolean;
18653
+ signal?: AbortSignal;
18654
+ onRow: (row: SiteFactsRow) => Promise<void> | void;
18655
+ };
18656
+ export type SiteFactsDependencies = {
18657
+ fetch?: Fetch;
18658
+ now?: () => Date;
18659
+ };
18660
+ export declare function checkSites(input: SiteFactsInput, dependencies?: SiteFactsDependencies): Promise<SiteFactsSummary>;
18381
18661
  type QueryFlag = 'likely-automated' | 'navigational-other';
18382
18662
  declare const QUERY_FLAG_METHOD: {
18383
18663
  readonly id: "query_flags_v1";
@@ -20592,6 +20872,7 @@ export type IndexCoverageReportDependencies = {
20592
20872
  now: () => Date;
20593
20873
  };
20594
20874
  export declare function indexCoverageSignals(input: IndexCoverageReportInput, dependencies?: IndexCoverageReportDependencies): Promise<IndexCoverageReport>;
20875
+ type RedirectOutcome = 'done' | 'loop' | 'too_many' | 'timeout' | 'error';
20595
20876
  export type RedirectTraceStep = {
20596
20877
  url: string;
20597
20878
  status: number;
@@ -20606,7 +20887,9 @@ export type RedirectTraceReport = {
20606
20887
  generatedAt: string;
20607
20888
  summary: {
20608
20889
  hops: number;
20609
- finalStatus: number;
20890
+ finalStatus: number | null;
20891
+ outcome: RedirectOutcome;
20892
+ error?: string;
20610
20893
  finalIndexable?: boolean;
20611
20894
  issues: RedirectTraceIssue[];
20612
20895
  };
@@ -21521,6 +21804,7 @@ type PageFacts = {
21521
21804
  h1: string | null;
21522
21805
  canonical: string | null;
21523
21806
  robots: string | null;
21807
+ google_noindex: boolean | null;
21524
21808
  www_authenticate?: string;
21525
21809
  error?: string;
21526
21810
  };
@@ -21541,7 +21825,7 @@ type CommandDeps = {
21541
21825
  searchAnalytics: SearchAnalyticsQuery;
21542
21826
  checkPages: (urls: string[]) => Promise<PageFacts[]>;
21543
21827
  liveCheck: (url: string) => Promise<LiveCheck>;
21544
- inspect: (site: string, url: string) => Promise<IndexStatus>;
21828
+ inspect: (site: string, url: string, signal?: AbortSignal) => Promise<IndexStatus>;
21545
21829
  inspectionQuota?: (site: string) => Promise<{
21546
21830
  used: number;
21547
21831
  limit: number;
@@ -21553,7 +21837,7 @@ type CommandDeps = {
21553
21837
  }>;
21554
21838
  save: (site: string, url: string, status: IndexStatus) => void;
21555
21839
  };
21556
- pageMarkdown?: (url: string) => Promise<PageMarkdown>;
21840
+ pageMarkdown?: (url: string, limit?: number) => Promise<PageMarkdown>;
21557
21841
  call: Caller;
21558
21842
  bing?: () => Promise<BingCall | null>;
21559
21843
  bingConnect?: string;
@@ -21562,6 +21846,7 @@ type CommandDeps = {
21562
21846
  week?: () => Promise<WeekData | null>;
21563
21847
  startAudit?: (site: string) => Promise<StartAudit>;
21564
21848
  issues?: IssueStore;
21849
+ progress?: ProgressReporter;
21565
21850
  now?: () => Date;
21566
21851
  };
21567
21852
  type StartAudit = {
@@ -21744,10 +22029,16 @@ export declare function openCloudLink(url: string): Promise<void>;
21744
22029
  type LintSource = {
21745
22030
  path: string;
21746
22031
  text: string;
22032
+ note?: string;
22033
+ partial?: string;
21747
22034
  } | {
21748
22035
  path: string;
21749
22036
  skipped: string;
21750
22037
  };
22038
+ type ResearchStore = {
22039
+ get(key: string): Promise<string | null>;
22040
+ put(key: string, value: string, ttlSeconds: number): Promise<void>;
22041
+ };
21751
22042
  export type TokenStorageMode = 'keychain' | 'file';
21752
22043
  export type TokenStorageStatus = {
21753
22044
  configured: TokenStorageMode;
@@ -21858,6 +22149,7 @@ export declare function nodeCommandDeps(options: {
21858
22149
  account?: string;
21859
22150
  refresh?: boolean;
21860
22151
  }): CommandDeps;
22152
+ export declare function localResearchStore(refresh?: boolean): ResearchStore;
21861
22153
  export declare const LOCAL_BING_CONNECT = "Connect Bing on your seoskill.dev account and run `seo login`, or run `seo providers bing connect` with an API key from Bing Webmaster Tools (Settings, API access).";
21862
22154
  export declare function localBing(): Promise<BingCall | null>;
21863
22155
  export declare function localAccounts(): Promise<GoogleAccount[]>;
@@ -22624,5 +22916,5 @@ export declare function parseOlderThan(input?: string): number | undefined;
22624
22916
  export declare function formatRelativeExpiry(expiresAt: number): string;
22625
22917
  export declare function isoDate(daysAgo?: number): string;
22626
22918
  export declare const SEO_VERSION: string;
22627
- export { type AiReferralDataSource, type AiReferralMetrics, type AiReferralQueryEvidence, type AiReferralReport, type AiReferralSourceDefinition, type AnalyzeCannibalImportRowsInput, type AnalyzeCannibalRowsInput, type AnalyzeDecayInput, type AnalyzeQuickWinsInput, type AnalyzeSecondPageInput, type AnalyzeStrikingDistanceInput, type CannibalAnalysis, type CannibalImportAnalysis, type CannibalImportItem, type CannibalImportPage, type CannibalImportReport, type CannibalImportSelection, type CannibalItem, type CannibalPage, type CannibalReport, type CannibalSelection, type CannibalSuppression, type CannibalSuppressionReason, type CrawlAiAvailability, type CrawlAiBotAccess, type CrawlAiLinkCheck, type CrawlAiResourceSignal, type CrawlAiSignals, type CrawlSiteChecks, type CrawlSiteDependencies, type CrawlStatusPhase, type CtrUnderperformer, type CtrUnderperformerSelection, type DataForSeoAccountSnapshot, type DataForSeoClientOptions, type DecayAnalysis, type DecayComparison, type DecayDiagnosis, type DecayGroup, type DecayItem, type DecayMetrics, type DecayReport, type DecaySelection, type DecaySignal, type FetchPageOptions, type FetchRateControls, type Ga4AccountSummary, type Ga4PropertySummary, type GoogleAccessTokenClient, type InternalLinkSuggestion, type InternalLinksPage, type InternalLinksReport, type JavaScriptRenderingInput, type JavaScriptRenderingMode, type OAuthClientConfig, type PageOpportunityAnalysis, type PageOpportunityAnalysisInput, type PageOpportunityBenchmark, type PageOpportunityItem, type PageOpportunitySelection, type PageOpportunityType, type PageOpportunityVerification, type PageRenderer, type QueryClusterPage, type QueryClusterRow, type QuickWinAnalysis, type QuickWinGroup, type QuickWinItem, type QuickWinSelection, type QuickWinTemplateRecommendation, SEO_PROVIDER_API_VERSION, type SearchStatusIncident, type SearchUpdate, type SecondPageAnalysis, type SecondPageItem, type SecondPageQuery, type SecondPageRecommendation, type SecondPageReport, type SecondPageSelection, type SegmentDimension, type SegmentImpactItem, type SegmentImpactReport, type SegmentImpactSelection, type SegmentPeriodEvidence, type SegmentRange, SeoAnalyticsConnection, SeoAnalyticsLandingPageResult, SeoLandingPageVisitRow, SeoLandingPageVisitsCapability, SeoLandingPageVisitsResult, SeoProviderActionAdapter, SeoProviderActivate, SeoProviderApiVersion, SeoProviderCapabilityAdapter, SeoProviderCapabilityId, SeoProviderConnection, SeoProviderConnectionAdapter, SeoProviderConnectionField, SeoProviderHost, SeoProviderJson, SeoProviderJsonSchema, SeoProviderKind, SeoProviderRegistration, SeoProviderRequest, SeoProviderRuntime, SeoSearchMarket, SeoSerpLocalPackResult, SeoSerpOrganicResult, SeoSerpSnapshotCapability, SeoSerpSnapshotResult, type StrikingDistanceAnalysis, type StrikingDistanceAnalysisGroup, type StrikingDistanceAnalysisItem, type TelemetryErrorCategory, type TelemetryFailureClassification, type TelemetryFailureContext, type TelemetryFailureReason, type TelemetryOperation, type UnmatchedSegment, pageTechnicalSignals as technicalPageSignals };
22919
+ export { type AiReferralDataSource, type AiReferralMetrics, type AiReferralQueryEvidence, type AiReferralReport, type AiReferralSourceDefinition, type AnalyzeCannibalImportRowsInput, type AnalyzeCannibalRowsInput, type AnalyzeDecayInput, type AnalyzeQuickWinsInput, type AnalyzeSecondPageInput, type AnalyzeStrikingDistanceInput, type CannibalAnalysis, type CannibalImportAnalysis, type CannibalImportItem, type CannibalImportPage, type CannibalImportReport, type CannibalImportSelection, type CannibalItem, type CannibalPage, type CannibalReport, type CannibalSelection, type CannibalSuppression, type CannibalSuppressionReason, type CrawlAiAvailability, type CrawlAiBotAccess, type CrawlAiLinkCheck, type CrawlAiResourceSignal, type CrawlAiSignals, type CrawlFetchErrorKind, type CrawlSiteChecks, type CrawlSiteDependencies, type CrawlStatusPhase, type CtrUnderperformer, type CtrUnderperformerSelection, type DataForSeoAccountSnapshot, type DataForSeoClientOptions, type DecayAnalysis, type DecayComparison, type DecayDiagnosis, type DecayGroup, type DecayItem, type DecayMetrics, type DecayReport, type DecaySelection, type DecaySignal, type FetchPageOptions, type FetchRateControls, type Ga4AccountSummary, type Ga4PropertySummary, type GoogleAccessTokenClient, type InternalLinkSuggestion, type InternalLinksPage, type InternalLinksReport, type JavaScriptRenderingInput, type JavaScriptRenderingMode, type OAuthClientConfig, type PageOpportunityAnalysis, type PageOpportunityAnalysisInput, type PageOpportunityBenchmark, type PageOpportunityItem, type PageOpportunitySelection, type PageOpportunityType, type PageOpportunityVerification, type PageRenderer, type QueryClusterPage, type QueryClusterRow, type QuickWinAnalysis, type QuickWinGroup, type QuickWinItem, type QuickWinSelection, type QuickWinTemplateRecommendation, SEO_PROVIDER_API_VERSION, type SearchStatusIncident, type SearchUpdate, type SecondPageAnalysis, type SecondPageItem, type SecondPageQuery, type SecondPageRecommendation, type SecondPageReport, type SecondPageSelection, type SegmentDimension, type SegmentImpactItem, type SegmentImpactReport, type SegmentImpactSelection, type SegmentPeriodEvidence, type SegmentRange, SeoAnalyticsConnection, SeoAnalyticsLandingPageResult, SeoLandingPageVisitRow, SeoLandingPageVisitsCapability, SeoLandingPageVisitsResult, SeoProviderActionAdapter, SeoProviderActivate, SeoProviderApiVersion, SeoProviderCapabilityAdapter, SeoProviderCapabilityId, SeoProviderConnection, SeoProviderConnectionAdapter, SeoProviderConnectionField, SeoProviderHost, SeoProviderJson, SeoProviderJsonSchema, SeoProviderKind, SeoProviderRegistration, SeoProviderRequest, SeoProviderRuntime, SeoSearchMarket, SeoSerpLocalPackResult, SeoSerpOrganicResult, SeoSerpSnapshotCapability, SeoSerpSnapshotResult, type StrikingDistanceAnalysis, type StrikingDistanceAnalysisGroup, type StrikingDistanceAnalysisItem, type TelemetryErrorCategory, type TelemetryFailureClassification, type TelemetryFailureContext, type TelemetryFailureReason, type TelemetryOperation, type UnmatchedSegment, pageTechnicalSignals as technicalPageSignals };
22628
22920
  //# sourceMappingURL=index.d.ts.map