@nuxtseo/protocol 0.1.5 → 0.2.1

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.
@@ -2122,6 +2122,199 @@ export declare const actionResolveOperation: {
2122
2122
  }];
2123
2123
  };
2124
2124
  };
2125
+ export declare const actionDismissDataSchema: import("./core.js").CompatibleResponseSchema<z.ZodObject<{
2126
+ readonly actionId: z.ZodString;
2127
+ readonly status: z.ZodString;
2128
+ readonly message: z.ZodString;
2129
+ }, z.core.$strip>, z.ZodObject<{
2130
+ readonly actionId: z.ZodString;
2131
+ readonly status: z.ZodString;
2132
+ readonly message: z.ZodString;
2133
+ }, z.core.$strip>>;
2134
+ export declare const actionDismissResponseSchema: import("./core.js").CompatibleResponseSchema<z.ZodObject<{
2135
+ data: z.ZodObject<{
2136
+ readonly actionId: z.ZodString;
2137
+ readonly status: z.ZodString;
2138
+ readonly message: z.ZodString;
2139
+ }, z.core.$strip>;
2140
+ meta: z.ZodObject<{
2141
+ requestId: z.ZodString;
2142
+ version: z.ZodLiteral<"1.0">;
2143
+ }, z.core.$strict>;
2144
+ }, z.core.$strip>, z.ZodObject<{
2145
+ data: z.ZodObject<{
2146
+ readonly actionId: z.ZodString;
2147
+ readonly status: z.ZodString;
2148
+ readonly message: z.ZodString;
2149
+ }, z.core.$strip>;
2150
+ meta: z.ZodObject<{
2151
+ requestId: z.ZodString;
2152
+ version: z.ZodLiteral<"1.0">;
2153
+ }, z.core.$loose>;
2154
+ }, z.core.$strip>>;
2155
+ export type ActionDismiss = z.output<typeof actionDismissDataSchema.client>;
2156
+ /**
2157
+ * Dismissing is the opposite decision from resolving: the page stays gone.
2158
+ * It is admitted only for a broken-page Action whose evidence is complete and
2159
+ * shows no internal referrer, so a caller cannot use it to hide work. The same
2160
+ * `artifactVersion` fence as resolve applies, so a decision made against stale
2161
+ * evidence is rejected rather than applied.
2162
+ */
2163
+ export declare const actionDismissOperation: {
2164
+ readonly id: 'actions.dismiss';
2165
+ readonly method: 'POST';
2166
+ readonly path: '/api/v1/sites/{siteId}/actions/{actionId}/dismiss';
2167
+ readonly visibility: 'public';
2168
+ readonly semantics: {
2169
+ readonly kind: 'mutation';
2170
+ readonly sideEffects: 'state';
2171
+ readonly retry: 'never';
2172
+ readonly readConsistency: null;
2173
+ };
2174
+ readonly auth: {
2175
+ readonly credentials: readonly ["session", "api_token"];
2176
+ readonly scopes: readonly ["actions:write"];
2177
+ readonly minimumRole: 'member';
2178
+ readonly ownership: 'site';
2179
+ };
2180
+ readonly request: {
2181
+ readonly params: z.ZodObject<{
2182
+ siteId: z.ZodString;
2183
+ actionId: z.ZodString;
2184
+ }, z.core.$strict>;
2185
+ readonly query: null;
2186
+ readonly headers: null;
2187
+ readonly body: z.ZodObject<{
2188
+ artifactVersion: z.ZodString;
2189
+ }, z.core.$strict>;
2190
+ };
2191
+ readonly responses: {
2192
+ readonly 200: import("./core.js").CompatibleResponseSchema<z.ZodObject<{
2193
+ data: z.ZodObject<{
2194
+ readonly actionId: z.ZodString;
2195
+ readonly status: z.ZodString;
2196
+ readonly message: z.ZodString;
2197
+ }, z.core.$strip>;
2198
+ meta: z.ZodObject<{
2199
+ requestId: z.ZodString;
2200
+ version: z.ZodLiteral<"1.0">;
2201
+ }, z.core.$strict>;
2202
+ }, z.core.$strip>, z.ZodObject<{
2203
+ data: z.ZodObject<{
2204
+ readonly actionId: z.ZodString;
2205
+ readonly status: z.ZodString;
2206
+ readonly message: z.ZodString;
2207
+ }, z.core.$strip>;
2208
+ meta: z.ZodObject<{
2209
+ requestId: z.ZodString;
2210
+ version: z.ZodLiteral<"1.0">;
2211
+ }, z.core.$loose>;
2212
+ }, z.core.$strip>>;
2213
+ };
2214
+ readonly errors: readonly ["invalid_request", "unauthorized", "auth_expired", "forbidden", "entitlement_required", "not_found", "stale_evidence", "conflict", "rate_limited", "contract_violation", "internal_error"];
2215
+ readonly errorResponse: import("./core.js").CompatibleResponseSchema<z.ZodObject<{
2216
+ readonly error: z.ZodObject<{
2217
+ code: z.ZodEnum<{
2218
+ auth_expired: "auth_expired";
2219
+ conflict: "conflict";
2220
+ contract_violation: "contract_violation";
2221
+ entitlement_required: "entitlement_required";
2222
+ forbidden: "forbidden";
2223
+ internal_error: "internal_error";
2224
+ invalid_request: "invalid_request";
2225
+ not_found: "not_found";
2226
+ provider_unavailable: "provider_unavailable";
2227
+ quota_exhausted: "quota_exhausted";
2228
+ rate_limited: "rate_limited";
2229
+ site_ambiguous: "site_ambiguous";
2230
+ stale_evidence: "stale_evidence";
2231
+ unauthorized: "unauthorized";
2232
+ }>;
2233
+ message: z.ZodString;
2234
+ requestId: z.ZodString;
2235
+ retryable: z.ZodBoolean;
2236
+ details: z.ZodRecord<z.ZodString, z.ZodUnknown>;
2237
+ }, z.core.$strict>;
2238
+ }, z.core.$strip>, z.ZodObject<{
2239
+ readonly error: z.ZodObject<{
2240
+ code: z.ZodEnum<{
2241
+ auth_expired: "auth_expired";
2242
+ conflict: "conflict";
2243
+ contract_violation: "contract_violation";
2244
+ entitlement_required: "entitlement_required";
2245
+ forbidden: "forbidden";
2246
+ internal_error: "internal_error";
2247
+ invalid_request: "invalid_request";
2248
+ not_found: "not_found";
2249
+ provider_unavailable: "provider_unavailable";
2250
+ quota_exhausted: "quota_exhausted";
2251
+ rate_limited: "rate_limited";
2252
+ site_ambiguous: "site_ambiguous";
2253
+ stale_evidence: "stale_evidence";
2254
+ unauthorized: "unauthorized";
2255
+ }>;
2256
+ message: z.ZodString;
2257
+ requestId: z.ZodString;
2258
+ retryable: z.ZodBoolean;
2259
+ details: z.ZodRecord<z.ZodString, z.ZodUnknown>;
2260
+ }, z.core.$loose>;
2261
+ }, z.core.$strip>>;
2262
+ readonly resources: {
2263
+ readonly reads: readonly [{
2264
+ readonly type: 'site.actions';
2265
+ readonly idFrom: 'params.siteId';
2266
+ }];
2267
+ readonly changes: readonly [{
2268
+ readonly type: 'site.actions';
2269
+ readonly idFrom: 'params.siteId';
2270
+ }];
2271
+ };
2272
+ readonly policy: {
2273
+ readonly rate: {
2274
+ readonly name: 'public-v1-fixed-window';
2275
+ readonly limit: 50;
2276
+ readonly windowSeconds: 60;
2277
+ };
2278
+ readonly idempotency: {
2279
+ readonly _tag: 'none';
2280
+ };
2281
+ readonly entitlement: null;
2282
+ readonly meter: null;
2283
+ };
2284
+ readonly lifecycle: {
2285
+ readonly introduced: '1.2.0';
2286
+ };
2287
+ readonly docs: {
2288
+ readonly summary: 'Dismiss an action';
2289
+ readonly description: 'Dismisses a broken-page action when its evidence is complete and shows no internal referrers, so the removed page stays removed. It is rejected when the action has other evidence, when it is already decided, or when the artifactVersion no longer matches. The action stays dismissed until a person restores it.';
2290
+ readonly tags: readonly ["Actions"];
2291
+ readonly examples: readonly [{
2292
+ readonly request: {
2293
+ readonly params: {
2294
+ readonly siteId: 'site_01JXYZ';
2295
+ readonly actionId: 'action_01JXYZ';
2296
+ };
2297
+ readonly body: {
2298
+ readonly artifactVersion: 'te2:action_01JXYZ:scope';
2299
+ };
2300
+ };
2301
+ readonly response: {
2302
+ readonly status: 200;
2303
+ readonly body: {
2304
+ readonly data: {
2305
+ readonly actionId: 'action_01JXYZ';
2306
+ readonly status: 'dismissed';
2307
+ readonly message: 'Dismissed. This page can stay removed.';
2308
+ };
2309
+ readonly meta: {
2310
+ readonly requestId: 'req_01JXYZ';
2311
+ readonly version: '1.0';
2312
+ };
2313
+ };
2314
+ };
2315
+ }];
2316
+ };
2317
+ };
2125
2318
  export declare const actionsV1Registry: import("./core.js").PublicV1Registry<{
2126
2319
  readonly list: {
2127
2320
  readonly id: 'actions.list';
@@ -2945,4 +3138,159 @@ export declare const actionsV1Registry: import("./core.js").PublicV1Registry<{
2945
3138
  }];
2946
3139
  };
2947
3140
  };
3141
+ readonly dismiss: {
3142
+ readonly id: 'actions.dismiss';
3143
+ readonly method: 'POST';
3144
+ readonly path: '/api/v1/sites/{siteId}/actions/{actionId}/dismiss';
3145
+ readonly visibility: 'public';
3146
+ readonly semantics: {
3147
+ readonly kind: 'mutation';
3148
+ readonly sideEffects: 'state';
3149
+ readonly retry: 'never';
3150
+ readonly readConsistency: null;
3151
+ };
3152
+ readonly auth: {
3153
+ readonly credentials: readonly ["session", "api_token"];
3154
+ readonly scopes: readonly ["actions:write"];
3155
+ readonly minimumRole: 'member';
3156
+ readonly ownership: 'site';
3157
+ };
3158
+ readonly request: {
3159
+ readonly params: z.ZodObject<{
3160
+ siteId: z.ZodString;
3161
+ actionId: z.ZodString;
3162
+ }, z.core.$strict>;
3163
+ readonly query: null;
3164
+ readonly headers: null;
3165
+ readonly body: z.ZodObject<{
3166
+ artifactVersion: z.ZodString;
3167
+ }, z.core.$strict>;
3168
+ };
3169
+ readonly responses: {
3170
+ readonly 200: import("./core.js").CompatibleResponseSchema<z.ZodObject<{
3171
+ data: z.ZodObject<{
3172
+ readonly actionId: z.ZodString;
3173
+ readonly status: z.ZodString;
3174
+ readonly message: z.ZodString;
3175
+ }, z.core.$strip>;
3176
+ meta: z.ZodObject<{
3177
+ requestId: z.ZodString;
3178
+ version: z.ZodLiteral<"1.0">;
3179
+ }, z.core.$strict>;
3180
+ }, z.core.$strip>, z.ZodObject<{
3181
+ data: z.ZodObject<{
3182
+ readonly actionId: z.ZodString;
3183
+ readonly status: z.ZodString;
3184
+ readonly message: z.ZodString;
3185
+ }, z.core.$strip>;
3186
+ meta: z.ZodObject<{
3187
+ requestId: z.ZodString;
3188
+ version: z.ZodLiteral<"1.0">;
3189
+ }, z.core.$loose>;
3190
+ }, z.core.$strip>>;
3191
+ };
3192
+ readonly errors: readonly ["invalid_request", "unauthorized", "auth_expired", "forbidden", "entitlement_required", "not_found", "stale_evidence", "conflict", "rate_limited", "contract_violation", "internal_error"];
3193
+ readonly errorResponse: import("./core.js").CompatibleResponseSchema<z.ZodObject<{
3194
+ readonly error: z.ZodObject<{
3195
+ code: z.ZodEnum<{
3196
+ auth_expired: "auth_expired";
3197
+ conflict: "conflict";
3198
+ contract_violation: "contract_violation";
3199
+ entitlement_required: "entitlement_required";
3200
+ forbidden: "forbidden";
3201
+ internal_error: "internal_error";
3202
+ invalid_request: "invalid_request";
3203
+ not_found: "not_found";
3204
+ provider_unavailable: "provider_unavailable";
3205
+ quota_exhausted: "quota_exhausted";
3206
+ rate_limited: "rate_limited";
3207
+ site_ambiguous: "site_ambiguous";
3208
+ stale_evidence: "stale_evidence";
3209
+ unauthorized: "unauthorized";
3210
+ }>;
3211
+ message: z.ZodString;
3212
+ requestId: z.ZodString;
3213
+ retryable: z.ZodBoolean;
3214
+ details: z.ZodRecord<z.ZodString, z.ZodUnknown>;
3215
+ }, z.core.$strict>;
3216
+ }, z.core.$strip>, z.ZodObject<{
3217
+ readonly error: z.ZodObject<{
3218
+ code: z.ZodEnum<{
3219
+ auth_expired: "auth_expired";
3220
+ conflict: "conflict";
3221
+ contract_violation: "contract_violation";
3222
+ entitlement_required: "entitlement_required";
3223
+ forbidden: "forbidden";
3224
+ internal_error: "internal_error";
3225
+ invalid_request: "invalid_request";
3226
+ not_found: "not_found";
3227
+ provider_unavailable: "provider_unavailable";
3228
+ quota_exhausted: "quota_exhausted";
3229
+ rate_limited: "rate_limited";
3230
+ site_ambiguous: "site_ambiguous";
3231
+ stale_evidence: "stale_evidence";
3232
+ unauthorized: "unauthorized";
3233
+ }>;
3234
+ message: z.ZodString;
3235
+ requestId: z.ZodString;
3236
+ retryable: z.ZodBoolean;
3237
+ details: z.ZodRecord<z.ZodString, z.ZodUnknown>;
3238
+ }, z.core.$loose>;
3239
+ }, z.core.$strip>>;
3240
+ readonly resources: {
3241
+ readonly reads: readonly [{
3242
+ readonly type: 'site.actions';
3243
+ readonly idFrom: 'params.siteId';
3244
+ }];
3245
+ readonly changes: readonly [{
3246
+ readonly type: 'site.actions';
3247
+ readonly idFrom: 'params.siteId';
3248
+ }];
3249
+ };
3250
+ readonly policy: {
3251
+ readonly rate: {
3252
+ readonly name: 'public-v1-fixed-window';
3253
+ readonly limit: 50;
3254
+ readonly windowSeconds: 60;
3255
+ };
3256
+ readonly idempotency: {
3257
+ readonly _tag: 'none';
3258
+ };
3259
+ readonly entitlement: null;
3260
+ readonly meter: null;
3261
+ };
3262
+ readonly lifecycle: {
3263
+ readonly introduced: '1.2.0';
3264
+ };
3265
+ readonly docs: {
3266
+ readonly summary: 'Dismiss an action';
3267
+ readonly description: 'Dismisses a broken-page action when its evidence is complete and shows no internal referrers, so the removed page stays removed. It is rejected when the action has other evidence, when it is already decided, or when the artifactVersion no longer matches. The action stays dismissed until a person restores it.';
3268
+ readonly tags: readonly ["Actions"];
3269
+ readonly examples: readonly [{
3270
+ readonly request: {
3271
+ readonly params: {
3272
+ readonly siteId: 'site_01JXYZ';
3273
+ readonly actionId: 'action_01JXYZ';
3274
+ };
3275
+ readonly body: {
3276
+ readonly artifactVersion: 'te2:action_01JXYZ:scope';
3277
+ };
3278
+ };
3279
+ readonly response: {
3280
+ readonly status: 200;
3281
+ readonly body: {
3282
+ readonly data: {
3283
+ readonly actionId: 'action_01JXYZ';
3284
+ readonly status: 'dismissed';
3285
+ readonly message: 'Dismissed. This page can stay removed.';
3286
+ };
3287
+ readonly meta: {
3288
+ readonly requestId: 'req_01JXYZ';
3289
+ readonly version: '1.0';
3290
+ };
3291
+ };
3292
+ };
3293
+ }];
3294
+ };
3295
+ };
2948
3296
  }>;
@@ -485,11 +485,87 @@ export const actionResolveOperation = defineOperation({
485
485
  }],
486
486
  },
487
487
  });
488
+ export const actionDismissDataSchema = defineResponseObject({
489
+ actionId: schema.string().min(1),
490
+ status: schema.string().min(1),
491
+ message: schema.string().min(1),
492
+ }, {
493
+ actionId: schema.string().min(1),
494
+ status: schema.string().min(1),
495
+ message: schema.string().min(1),
496
+ });
497
+ export const actionDismissResponseSchema = defineSuccessEnvelope(actionDismissDataSchema);
498
+ /**
499
+ * Dismissing is the opposite decision from resolving: the page stays gone.
500
+ * It is admitted only for a broken-page Action whose evidence is complete and
501
+ * shows no internal referrer, so a caller cannot use it to hide work. The same
502
+ * `artifactVersion` fence as resolve applies, so a decision made against stale
503
+ * evidence is rejected rather than applied.
504
+ */
505
+ export const actionDismissOperation = defineOperation({
506
+ id: 'actions.dismiss',
507
+ method: 'POST',
508
+ path: '/api/v1/sites/{siteId}/actions/{actionId}/dismiss',
509
+ visibility: 'public',
510
+ semantics: { kind: 'mutation', sideEffects: 'state', retry: 'never', readConsistency: null },
511
+ auth: {
512
+ credentials: ['session', 'api_token'],
513
+ scopes: ['actions:write'],
514
+ minimumRole: 'member',
515
+ ownership: 'site',
516
+ },
517
+ request: { params: actionParamsSchema, query: null, headers: null, body: actionResolveBodySchema },
518
+ responses: { 200: actionDismissResponseSchema },
519
+ errors: [
520
+ 'invalid_request',
521
+ 'unauthorized',
522
+ 'auth_expired',
523
+ 'forbidden',
524
+ 'entitlement_required',
525
+ 'not_found',
526
+ 'stale_evidence',
527
+ 'conflict',
528
+ 'rate_limited',
529
+ 'contract_violation',
530
+ 'internal_error',
531
+ ],
532
+ errorResponse: publicV1ErrorEnvelope,
533
+ resources: {
534
+ reads: [{ type: 'site.actions', idFrom: 'params.siteId' }],
535
+ changes: [{ type: 'site.actions', idFrom: 'params.siteId' }],
536
+ },
537
+ policy: {
538
+ rate: publicV1StandardRatePolicy,
539
+ idempotency: { _tag: 'none' },
540
+ entitlement: null,
541
+ meter: null,
542
+ },
543
+ lifecycle: { introduced: '1.2.0' },
544
+ docs: {
545
+ summary: 'Dismiss an action',
546
+ description: 'Dismisses a broken-page action when its evidence is complete and shows no internal referrers, so the removed page stays removed. It is rejected when the action has other evidence, when it is already decided, or when the artifactVersion no longer matches. The action stays dismissed until a person restores it.',
547
+ tags: ['Actions'],
548
+ examples: [{
549
+ request: {
550
+ params: { siteId: 'site_01JXYZ', actionId: 'action_01JXYZ' },
551
+ body: { artifactVersion: 'te2:action_01JXYZ:scope' },
552
+ },
553
+ response: {
554
+ status: 200,
555
+ body: {
556
+ data: { actionId: 'action_01JXYZ', status: 'dismissed', message: 'Dismissed. This page can stay removed.' },
557
+ meta: { requestId: 'req_01JXYZ', version: '1.0' },
558
+ },
559
+ },
560
+ }],
561
+ },
562
+ });
488
563
  export const actionsV1Registry = defineRegistry({
489
564
  feature: 'actions',
490
565
  operations: {
491
566
  list: actionListOperation,
492
567
  show: actionShowOperation,
493
568
  resolve: actionResolveOperation,
569
+ dismiss: actionDismissOperation,
494
570
  },
495
571
  });
@@ -1027,6 +1027,13 @@ export declare const auditDuplicateClustersDataSchema: import("./core.js").Compa
1027
1027
  }, z.core.$strip>>;
1028
1028
  readonly total: z.ZodNumber;
1029
1029
  readonly pagesAffected: z.ZodNumber;
1030
+ /**
1031
+ * The crawl the clusters came from, null when the site has never completed
1032
+ * one. The reader always knew this and the route dropped it, so a consumer
1033
+ * could not tell "no duplicates" from "never looked" — both arrive as
1034
+ * `total: 0`. Optional so a payload cached before this field still parses.
1035
+ */
1036
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1030
1037
  }, z.core.$strip>, z.ZodObject<{
1031
1038
  readonly connected: z.ZodBoolean;
1032
1039
  readonly clusters: z.ZodArray<z.ZodObject<{
@@ -1053,6 +1060,7 @@ export declare const auditDuplicateClustersDataSchema: import("./core.js").Compa
1053
1060
  }, z.core.$strip>>;
1054
1061
  readonly total: z.ZodNumber;
1055
1062
  readonly pagesAffected: z.ZodNumber;
1063
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1056
1064
  }, z.core.$strip>>;
1057
1065
  export declare const auditDuplicateClustersResponseSchema: import("./core.js").CompatibleResponseSchema<z.ZodObject<{
1058
1066
  data: z.ZodObject<{
@@ -1081,6 +1089,13 @@ export declare const auditDuplicateClustersResponseSchema: import("./core.js").C
1081
1089
  }, z.core.$strip>>;
1082
1090
  readonly total: z.ZodNumber;
1083
1091
  readonly pagesAffected: z.ZodNumber;
1092
+ /**
1093
+ * The crawl the clusters came from, null when the site has never completed
1094
+ * one. The reader always knew this and the route dropped it, so a consumer
1095
+ * could not tell "no duplicates" from "never looked" — both arrive as
1096
+ * `total: 0`. Optional so a payload cached before this field still parses.
1097
+ */
1098
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1084
1099
  }, z.core.$strip>;
1085
1100
  meta: z.ZodObject<{
1086
1101
  requestId: z.ZodString;
@@ -1113,6 +1128,7 @@ export declare const auditDuplicateClustersResponseSchema: import("./core.js").C
1113
1128
  }, z.core.$strip>>;
1114
1129
  readonly total: z.ZodNumber;
1115
1130
  readonly pagesAffected: z.ZodNumber;
1131
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1116
1132
  }, z.core.$strip>;
1117
1133
  meta: z.ZodObject<{
1118
1134
  requestId: z.ZodString;
@@ -2165,6 +2181,13 @@ export declare const auditDuplicateClustersOperation: {
2165
2181
  }, z.core.$strip>>;
2166
2182
  readonly total: z.ZodNumber;
2167
2183
  readonly pagesAffected: z.ZodNumber;
2184
+ /**
2185
+ * The crawl the clusters came from, null when the site has never completed
2186
+ * one. The reader always knew this and the route dropped it, so a consumer
2187
+ * could not tell "no duplicates" from "never looked" — both arrive as
2188
+ * `total: 0`. Optional so a payload cached before this field still parses.
2189
+ */
2190
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2168
2191
  }, z.core.$strip>;
2169
2192
  meta: z.ZodObject<{
2170
2193
  requestId: z.ZodString;
@@ -2197,6 +2220,7 @@ export declare const auditDuplicateClustersOperation: {
2197
2220
  }, z.core.$strip>>;
2198
2221
  readonly total: z.ZodNumber;
2199
2222
  readonly pagesAffected: z.ZodNumber;
2223
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2200
2224
  }, z.core.$strip>;
2201
2225
  meta: z.ZodObject<{
2202
2226
  requestId: z.ZodString;
@@ -3472,6 +3496,13 @@ export declare const auditV1Registry: import("./core.js").PublicV1Registry<{
3472
3496
  }, z.core.$strip>>;
3473
3497
  readonly total: z.ZodNumber;
3474
3498
  readonly pagesAffected: z.ZodNumber;
3499
+ /**
3500
+ * The crawl the clusters came from, null when the site has never completed
3501
+ * one. The reader always knew this and the route dropped it, so a consumer
3502
+ * could not tell "no duplicates" from "never looked" — both arrive as
3503
+ * `total: 0`. Optional so a payload cached before this field still parses.
3504
+ */
3505
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
3475
3506
  }, z.core.$strip>;
3476
3507
  meta: z.ZodObject<{
3477
3508
  requestId: z.ZodString;
@@ -3504,6 +3535,7 @@ export declare const auditV1Registry: import("./core.js").PublicV1Registry<{
3504
3535
  }, z.core.$strip>>;
3505
3536
  readonly total: z.ZodNumber;
3506
3537
  readonly pagesAffected: z.ZodNumber;
3538
+ readonly crawlSettingsId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
3507
3539
  }, z.core.$strip>;
3508
3540
  meta: z.ZodObject<{
3509
3541
  requestId: z.ZodString;
package/dist/v1/audit.js CHANGED
@@ -199,11 +199,19 @@ export const auditDuplicateClustersDataSchema = defineResponseObject({
199
199
  clusters: schema.array(duplicateClusterSchema.producer),
200
200
  total: schema.number(),
201
201
  pagesAffected: schema.number(),
202
+ /**
203
+ * The crawl the clusters came from, null when the site has never completed
204
+ * one. The reader always knew this and the route dropped it, so a consumer
205
+ * could not tell "no duplicates" from "never looked" — both arrive as
206
+ * `total: 0`. Optional so a payload cached before this field still parses.
207
+ */
208
+ crawlSettingsId: schema.number().nullable().optional(),
202
209
  }, {
203
210
  connected: schema.boolean(),
204
211
  clusters: schema.array(duplicateClusterSchema.client),
205
212
  total: schema.number(),
206
213
  pagesAffected: schema.number(),
214
+ crawlSettingsId: schema.number().nullable().optional(),
207
215
  });
208
216
  export const auditDuplicateClustersResponseSchema = defineSuccessEnvelope(auditDuplicateClustersDataSchema);
209
217
  export const linkOpportunityRowSchema = defineResponseObject({