seo 0.12.1 → 0.13.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/mcp.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __seoCreateRequire } from 'node:module'; const require = __seoCreateRequire(import.meta.url);
2
- import { i as __toESM, n as version, r as __commonJSMin, t as load } from "./esm-Cyusbw2J.js";
2
+ import { i as __toESM, n as version, r as __commonJSMin, t as load } from "./esm-BfNQ2FiC.js";
3
3
  import { createHash, randomUUID, sign } from "node:crypto";
4
4
  import { ZodOptional, z } from "zod";
5
5
  import { arch, homedir, platform, tmpdir, totalmem } from "node:os";
@@ -32,7 +32,7 @@ import { ZodFirstPartyTypeKind } from "zod/v3";
32
32
  import * as z4mini from "zod/v4-mini";
33
33
  import * as z$1 from "zod/v4";
34
34
  import process$1 from "node:process";
35
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
35
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
36
36
  function isZ4Schema(s) {
37
37
  return !!s._zod;
38
38
  }
@@ -155,7 +155,7 @@ function getLiteralValue(schema) {
155
155
  if (directValue !== void 0) return directValue;
156
156
  }
157
157
  //#endregion
158
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
158
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
159
159
  const LATEST_PROTOCOL_VERSION = "2025-11-25";
160
160
  const SUPPORTED_PROTOCOL_VERSIONS = [
161
161
  LATEST_PROTOCOL_VERSION,
@@ -2101,7 +2101,7 @@ var UrlElicitationRequiredError = class extends McpError {
2101
2101
  }
2102
2102
  };
2103
2103
  //#endregion
2104
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
2104
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
2105
2105
  /**
2106
2106
  * Experimental task interfaces for MCP SDK.
2107
2107
  * WARNING: These APIs are experimental and may change without notice.
@@ -2118,7 +2118,7 @@ function isTerminal(status) {
2118
2118
  return status === "completed" || status === "failed" || status === "cancelled";
2119
2119
  }
2120
2120
  //#endregion
2121
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/Options.js
2121
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/Options.js
2122
2122
  const ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use");
2123
2123
  const defaultOptions = {
2124
2124
  name: void 0,
@@ -2152,7 +2152,7 @@ const getDefaultOptions = (options) => typeof options === "string" ? {
2152
2152
  ...options
2153
2153
  };
2154
2154
  //#endregion
2155
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/Refs.js
2155
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/Refs.js
2156
2156
  const getRefs = (options) => {
2157
2157
  const _options = getDefaultOptions(options);
2158
2158
  const currentPath = _options.name !== void 0 ? [
@@ -2177,7 +2177,7 @@ const getRefs = (options) => {
2177
2177
  };
2178
2178
  };
2179
2179
  //#endregion
2180
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/errorMessages.js
2180
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/errorMessages.js
2181
2181
  function addErrorMessage(res, key, errorMessage, refs) {
2182
2182
  if (!refs?.errorMessages) return;
2183
2183
  if (errorMessage) res.errorMessage = {
@@ -2190,14 +2190,14 @@ function setResponseValueAndErrors(res, key, value, errorMessage, refs) {
2190
2190
  addErrorMessage(res, key, errorMessage, refs);
2191
2191
  }
2192
2192
  //#endregion
2193
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js
2193
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js
2194
2194
  const getRelativePath = (pathA, pathB) => {
2195
2195
  let i = 0;
2196
2196
  for (; i < pathA.length && i < pathB.length; i++) if (pathA[i] !== pathB[i]) break;
2197
2197
  return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/");
2198
2198
  };
2199
2199
  //#endregion
2200
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/any.js
2200
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/any.js
2201
2201
  function parseAnyDef(refs) {
2202
2202
  if (refs.target !== "openAi") return {};
2203
2203
  const anyDefinitionPath = [
@@ -2209,7 +2209,7 @@ function parseAnyDef(refs) {
2209
2209
  return { $ref: refs.$refStrategy === "relative" ? getRelativePath(anyDefinitionPath, refs.currentPath) : anyDefinitionPath.join("/") };
2210
2210
  }
2211
2211
  //#endregion
2212
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/array.js
2212
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/array.js
2213
2213
  function parseArrayDef(def, refs) {
2214
2214
  const res = { type: "array" };
2215
2215
  if (def.type?._def && def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny) res.items = parseDef(def.type._def, {
@@ -2225,7 +2225,7 @@ function parseArrayDef(def, refs) {
2225
2225
  return res;
2226
2226
  }
2227
2227
  //#endregion
2228
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js
2228
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js
2229
2229
  function parseBigintDef(def, refs) {
2230
2230
  const res = {
2231
2231
  type: "integer",
@@ -2234,44 +2234,44 @@ function parseBigintDef(def, refs) {
2234
2234
  if (!def.checks) return res;
2235
2235
  for (const check of def.checks) switch (check.kind) {
2236
2236
  case "min":
2237
- if (refs.target === "jsonSchema7") if (check.inclusive) setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
2238
- else setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
2239
- else {
2237
+ if (refs.target === "jsonSchema7") {
2238
+ if (check.inclusive) setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
2239
+ else setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
2240
+ } else {
2240
2241
  if (!check.inclusive) res.exclusiveMinimum = true;
2241
2242
  setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
2242
2243
  }
2243
2244
  break;
2244
2245
  case "max":
2245
- if (refs.target === "jsonSchema7") if (check.inclusive) setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2246
- else setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
2247
- else {
2246
+ if (refs.target === "jsonSchema7") {
2247
+ if (check.inclusive) setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2248
+ else setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
2249
+ } else {
2248
2250
  if (!check.inclusive) res.exclusiveMaximum = true;
2249
2251
  setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2250
2252
  }
2251
2253
  break;
2252
- case "multipleOf":
2253
- setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
2254
- break;
2254
+ case "multipleOf": setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
2255
2255
  }
2256
2256
  return res;
2257
2257
  }
2258
2258
  //#endregion
2259
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js
2259
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js
2260
2260
  function parseBooleanDef() {
2261
2261
  return { type: "boolean" };
2262
2262
  }
2263
2263
  //#endregion
2264
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js
2264
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js
2265
2265
  function parseBrandedDef(_def, refs) {
2266
2266
  return parseDef(_def.type._def, refs);
2267
2267
  }
2268
2268
  //#endregion
2269
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js
2269
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js
2270
2270
  const parseCatchDef = (def, refs) => {
2271
2271
  return parseDef(def.innerType._def, refs);
2272
2272
  };
2273
2273
  //#endregion
2274
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/date.js
2274
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/date.js
2275
2275
  function parseDateDef(def, refs, overrideDateStrategy) {
2276
2276
  const strategy = overrideDateStrategy ?? refs.dateStrategy;
2277
2277
  if (Array.isArray(strategy)) return { anyOf: strategy.map((item, i) => parseDateDef(def, refs, item)) };
@@ -2298,14 +2298,12 @@ const integerDateParser = (def, refs) => {
2298
2298
  case "min":
2299
2299
  setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
2300
2300
  break;
2301
- case "max":
2302
- setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2303
- break;
2301
+ case "max": setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2304
2302
  }
2305
2303
  return res;
2306
2304
  };
2307
2305
  //#endregion
2308
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/default.js
2306
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/default.js
2309
2307
  function parseDefaultDef(_def, refs) {
2310
2308
  return {
2311
2309
  ...parseDef(_def.innerType._def, refs),
@@ -2313,12 +2311,12 @@ function parseDefaultDef(_def, refs) {
2313
2311
  };
2314
2312
  }
2315
2313
  //#endregion
2316
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js
2314
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js
2317
2315
  function parseEffectsDef(_def, refs) {
2318
2316
  return refs.effectStrategy === "input" ? parseDef(_def.schema._def, refs) : parseAnyDef(refs);
2319
2317
  }
2320
2318
  //#endregion
2321
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js
2319
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js
2322
2320
  function parseEnumDef(def) {
2323
2321
  return {
2324
2322
  type: "string",
@@ -2326,7 +2324,7 @@ function parseEnumDef(def) {
2326
2324
  };
2327
2325
  }
2328
2326
  //#endregion
2329
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js
2327
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js
2330
2328
  const isJsonSchema7AllOfType = (type) => {
2331
2329
  if ("type" in type && type.type === "string") return false;
2332
2330
  return "allOf" in type;
@@ -2368,7 +2366,7 @@ function parseIntersectionDef(def, refs) {
2368
2366
  } : void 0;
2369
2367
  }
2370
2368
  //#endregion
2371
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js
2369
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js
2372
2370
  function parseLiteralDef(def, refs) {
2373
2371
  const parsedType = typeof def.value;
2374
2372
  if (parsedType !== "bigint" && parsedType !== "number" && parsedType !== "boolean" && parsedType !== "string") return { type: Array.isArray(def.value) ? "array" : "object" };
@@ -2382,7 +2380,7 @@ function parseLiteralDef(def, refs) {
2382
2380
  };
2383
2381
  }
2384
2382
  //#endregion
2385
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/string.js
2383
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/string.js
2386
2384
  let emojiRegex = void 0;
2387
2385
  /**
2388
2386
  * Generated from the regular expressions found here as of 2024-05-22:
@@ -2452,9 +2450,7 @@ function parseStringDef(def, refs) {
2452
2450
  case "format:idn-email":
2453
2451
  addFormat(res, "idn-email", check.message, refs);
2454
2452
  break;
2455
- case "pattern:zod":
2456
- addPattern(res, zodPatterns.email, check.message, refs);
2457
- break;
2453
+ case "pattern:zod": addPattern(res, zodPatterns.email, check.message, refs);
2458
2454
  }
2459
2455
  break;
2460
2456
  case "url":
@@ -2525,16 +2521,10 @@ function parseStringDef(def, refs) {
2525
2521
  case "contentEncoding:base64":
2526
2522
  setResponseValueAndErrors(res, "contentEncoding", "base64", check.message, refs);
2527
2523
  break;
2528
- case "pattern:zod":
2529
- addPattern(res, zodPatterns.base64, check.message, refs);
2530
- break;
2524
+ case "pattern:zod": addPattern(res, zodPatterns.base64, check.message, refs);
2531
2525
  }
2532
2526
  break;
2533
2527
  case "nanoid": addPattern(res, zodPatterns.nanoid, check.message, refs);
2534
- case "toLowerCase":
2535
- case "toUpperCase":
2536
- case "trim": break;
2537
- default:
2538
2528
  }
2539
2529
  return res;
2540
2530
  }
@@ -2653,7 +2643,7 @@ function stringifyRegExpWithFlags(regex, refs) {
2653
2643
  return pattern;
2654
2644
  }
2655
2645
  //#endregion
2656
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/record.js
2646
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/record.js
2657
2647
  function parseRecordDef(def, refs) {
2658
2648
  if (refs.target === "openAi") console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");
2659
2649
  if (refs.target === "openApi3" && def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) return {
@@ -2700,7 +2690,7 @@ function parseRecordDef(def, refs) {
2700
2690
  return schema;
2701
2691
  }
2702
2692
  //#endregion
2703
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/map.js
2693
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/map.js
2704
2694
  function parseMapDef(def, refs) {
2705
2695
  if (refs.mapStrategy === "record") return parseRecordDef(def, refs);
2706
2696
  return {
@@ -2731,7 +2721,7 @@ function parseMapDef(def, refs) {
2731
2721
  };
2732
2722
  }
2733
2723
  //#endregion
2734
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js
2724
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js
2735
2725
  function parseNativeEnumDef(def) {
2736
2726
  const object = def.values;
2737
2727
  const actualValues = Object.keys(def.values).filter((key) => {
@@ -2744,7 +2734,7 @@ function parseNativeEnumDef(def) {
2744
2734
  };
2745
2735
  }
2746
2736
  //#endregion
2747
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/never.js
2737
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/never.js
2748
2738
  function parseNeverDef(refs) {
2749
2739
  return refs.target === "openAi" ? void 0 : { not: parseAnyDef({
2750
2740
  ...refs,
@@ -2752,7 +2742,7 @@ function parseNeverDef(refs) {
2752
2742
  }) };
2753
2743
  }
2754
2744
  //#endregion
2755
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/null.js
2745
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/null.js
2756
2746
  function parseNullDef(refs) {
2757
2747
  return refs.target === "openApi3" ? {
2758
2748
  enum: ["null"],
@@ -2760,7 +2750,7 @@ function parseNullDef(refs) {
2760
2750
  } : { type: "null" };
2761
2751
  }
2762
2752
  //#endregion
2763
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/union.js
2753
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/union.js
2764
2754
  const primitiveMappings = {
2765
2755
  ZodString: "string",
2766
2756
  ZodNumber: "number",
@@ -2816,7 +2806,7 @@ const asAnyOf = (def, refs) => {
2816
2806
  return anyOf.length ? { anyOf } : void 0;
2817
2807
  };
2818
2808
  //#endregion
2819
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js
2809
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js
2820
2810
  function parseNullableDef(def, refs) {
2821
2811
  if ([
2822
2812
  "ZodString",
@@ -2856,7 +2846,7 @@ function parseNullableDef(def, refs) {
2856
2846
  return base && { anyOf: [base, { type: "null" }] };
2857
2847
  }
2858
2848
  //#endregion
2859
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/number.js
2849
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/number.js
2860
2850
  function parseNumberDef(def, refs) {
2861
2851
  const res = { type: "number" };
2862
2852
  if (!def.checks) return res;
@@ -2866,29 +2856,29 @@ function parseNumberDef(def, refs) {
2866
2856
  addErrorMessage(res, "type", check.message, refs);
2867
2857
  break;
2868
2858
  case "min":
2869
- if (refs.target === "jsonSchema7") if (check.inclusive) setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
2870
- else setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
2871
- else {
2859
+ if (refs.target === "jsonSchema7") {
2860
+ if (check.inclusive) setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
2861
+ else setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
2862
+ } else {
2872
2863
  if (!check.inclusive) res.exclusiveMinimum = true;
2873
2864
  setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
2874
2865
  }
2875
2866
  break;
2876
2867
  case "max":
2877
- if (refs.target === "jsonSchema7") if (check.inclusive) setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2878
- else setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
2879
- else {
2868
+ if (refs.target === "jsonSchema7") {
2869
+ if (check.inclusive) setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2870
+ else setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
2871
+ } else {
2880
2872
  if (!check.inclusive) res.exclusiveMaximum = true;
2881
2873
  setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
2882
2874
  }
2883
2875
  break;
2884
- case "multipleOf":
2885
- setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
2886
- break;
2876
+ case "multipleOf": setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
2887
2877
  }
2888
2878
  return res;
2889
2879
  }
2890
2880
  //#endregion
2891
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/object.js
2881
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/object.js
2892
2882
  function parseObjectDef(def, refs) {
2893
2883
  const forceOptionalIntoNullable = refs.target === "openAi";
2894
2884
  const result = {
@@ -2947,7 +2937,7 @@ function safeIsOptional(schema) {
2947
2937
  }
2948
2938
  }
2949
2939
  //#endregion
2950
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js
2940
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js
2951
2941
  const parseOptionalDef = (def, refs) => {
2952
2942
  if (refs.currentPath.toString() === refs.propertyPath?.toString()) return parseDef(def.innerType._def, refs);
2953
2943
  const innerSchema = parseDef(def.innerType._def, {
@@ -2961,7 +2951,7 @@ const parseOptionalDef = (def, refs) => {
2961
2951
  return innerSchema ? { anyOf: [{ not: parseAnyDef(refs) }, innerSchema] } : parseAnyDef(refs);
2962
2952
  };
2963
2953
  //#endregion
2964
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js
2954
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js
2965
2955
  const parsePipelineDef = (def, refs) => {
2966
2956
  if (refs.pipeStrategy === "input") return parseDef(def.in._def, refs);
2967
2957
  else if (refs.pipeStrategy === "output") return parseDef(def.out._def, refs);
@@ -2983,12 +2973,12 @@ const parsePipelineDef = (def, refs) => {
2983
2973
  })].filter((x) => x !== void 0) };
2984
2974
  };
2985
2975
  //#endregion
2986
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js
2976
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js
2987
2977
  function parsePromiseDef(def, refs) {
2988
2978
  return parseDef(def.type._def, refs);
2989
2979
  }
2990
2980
  //#endregion
2991
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/set.js
2981
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/set.js
2992
2982
  function parseSetDef(def, refs) {
2993
2983
  const schema = {
2994
2984
  type: "array",
@@ -3003,7 +2993,7 @@ function parseSetDef(def, refs) {
3003
2993
  return schema;
3004
2994
  }
3005
2995
  //#endregion
3006
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js
2996
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js
3007
2997
  function parseTupleDef(def, refs) {
3008
2998
  if (def.rest) return {
3009
2999
  type: "array",
@@ -3036,22 +3026,22 @@ function parseTupleDef(def, refs) {
3036
3026
  };
3037
3027
  }
3038
3028
  //#endregion
3039
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js
3029
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js
3040
3030
  function parseUndefinedDef(refs) {
3041
3031
  return { not: parseAnyDef(refs) };
3042
3032
  }
3043
3033
  //#endregion
3044
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js
3034
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js
3045
3035
  function parseUnknownDef(refs) {
3046
3036
  return parseAnyDef(refs);
3047
3037
  }
3048
3038
  //#endregion
3049
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js
3039
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js
3050
3040
  const parseReadonlyDef = (def, refs) => {
3051
3041
  return parseDef(def.innerType._def, refs);
3052
3042
  };
3053
3043
  //#endregion
3054
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/selectParser.js
3044
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/selectParser.js
3055
3045
  const selectParser = (def, typeName, refs) => {
3056
3046
  switch (typeName) {
3057
3047
  case ZodFirstPartyTypeKind.ZodString: return parseStringDef(def, refs);
@@ -3094,7 +3084,7 @@ const selectParser = (def, typeName, refs) => {
3094
3084
  }
3095
3085
  };
3096
3086
  //#endregion
3097
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parseDef.js
3087
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/parseDef.js
3098
3088
  function parseDef(def, refs, forceResolution = false) {
3099
3089
  const seenItem = refs.seen.get(def);
3100
3090
  if (refs.override) {
@@ -3143,7 +3133,7 @@ const addMeta = (def, refs, jsonSchema) => {
3143
3133
  return jsonSchema;
3144
3134
  };
3145
3135
  //#endregion
3146
- //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js
3136
+ //#region node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.6.7/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js
3147
3137
  const zodToJsonSchema = (schema, options) => {
3148
3138
  const refs = getRefs(options);
3149
3139
  let definitions = typeof options === "object" && options.definitions ? Object.entries(options.definitions).reduce((acc, [name, schema]) => ({
@@ -3206,7 +3196,7 @@ const zodToJsonSchema = (schema, options) => {
3206
3196
  return combined;
3207
3197
  };
3208
3198
  //#endregion
3209
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
3199
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
3210
3200
  function mapMiniTarget(t) {
3211
3201
  if (!t) return "draft-7";
3212
3202
  if (t === "jsonSchema7" || t === "draft-7") return "draft-7";
@@ -6120,10 +6110,12 @@ var require_resolve = /* @__PURE__ */ __commonJSMin(((exports) => {
6120
6110
  let schOrRef = this.refs[ref];
6121
6111
  if (typeof schOrRef == "string") schOrRef = this.refs[schOrRef];
6122
6112
  if (typeof schOrRef == "object") checkAmbiguosRef(sch, schOrRef.schema, ref);
6123
- else if (ref !== normalizeId(fullPath)) if (ref[0] === "#") {
6124
- checkAmbiguosRef(sch, localRefs[ref], ref);
6125
- localRefs[ref] = sch;
6126
- } else this.refs[ref] = fullPath;
6113
+ else if (ref !== normalizeId(fullPath)) {
6114
+ if (ref[0] === "#") {
6115
+ checkAmbiguosRef(sch, localRefs[ref], ref);
6116
+ localRefs[ref] = sch;
6117
+ } else this.refs[ref] = fullPath;
6118
+ }
6127
6119
  return ref;
6128
6120
  }
6129
6121
  function addAnchor(anchor) {
@@ -7049,15 +7041,16 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
7049
7041
  let nextSlash = -1;
7050
7042
  let len = 0;
7051
7043
  while (len = input.length) {
7052
- if (len === 1) if (input === ".") break;
7053
- else if (input === "/") {
7054
- output.push("/");
7055
- break;
7056
- } else {
7057
- output.push(input);
7058
- break;
7059
- }
7060
- else if (len === 2) {
7044
+ if (len === 1) {
7045
+ if (input === ".") break;
7046
+ else if (input === "/") {
7047
+ output.push("/");
7048
+ break;
7049
+ } else {
7050
+ output.push(input);
7051
+ break;
7052
+ }
7053
+ } else if (len === 2) {
7061
7054
  if (input[0] === ".") {
7062
7055
  if (input[1] === ".") break;
7063
7056
  else if (input[1] === "/") {
@@ -7746,8 +7739,10 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
7746
7739
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
7747
7740
  const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
7748
7741
  const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
7749
- if (component.path !== void 0) if (!options.skipEscape) component.path = serializePathEncoding(component.path, pathNoScheme);
7750
- else component.path = normalizePercentEncoding(component.path);
7742
+ if (component.path !== void 0) {
7743
+ if (!options.skipEscape) component.path = serializePathEncoding(component.path, pathNoScheme);
7744
+ else component.path = normalizePercentEncoding(component.path);
7745
+ }
7751
7746
  if (options.reference !== "suffix" && component.scheme) {
7752
7747
  component.scheme = decodeValidScheme(component.scheme);
7753
7748
  uriTokens.push(component.scheme, ":");
@@ -7857,8 +7852,10 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
7857
7852
  let malformedIPLiteral = false;
7858
7853
  let malformedScheme = false;
7859
7854
  let isIP = false;
7860
- if (options.reference === "suffix") if (options.scheme) uri = options.scheme + ":" + uri;
7861
- else uri = "//" + uri;
7855
+ if (options.reference === "suffix") {
7856
+ if (options.scheme) uri = options.scheme + ":" + uri;
7857
+ else uri = "//" + uri;
7858
+ }
7862
7859
  const authorityMatch = uri.match(AUTHORITY_PREFIX);
7863
7860
  if (authorityMatch !== null && authorityMatch[1].indexOf("\\") !== -1) {
7864
7861
  parsed.error = "URI authority must not contain a literal backslash.";
@@ -7903,18 +7900,20 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
7903
7900
  parsed.error = parsed.error || parseError;
7904
7901
  malformedAuthorityOrPort = true;
7905
7902
  }
7906
- if (parsed.host) if (isIPv4(parsed.host) === false) {
7907
- const bracketedIPLiteral = isIPLiteral(parsed.host);
7908
- const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
7909
- const ipv6result = normalizeIPv6(parsed.host);
7910
- isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
7911
- malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
7912
- parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
7913
- if (malformedIPLiteral) {
7914
- parsed.error = parsed.error || "URI host is malformed.";
7915
- malformedAuthorityOrPort = true;
7916
- }
7917
- } else isIP = true;
7903
+ if (parsed.host) {
7904
+ if (isIPv4(parsed.host) === false) {
7905
+ const bracketedIPLiteral = isIPLiteral(parsed.host);
7906
+ const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
7907
+ const ipv6result = normalizeIPv6(parsed.host);
7908
+ isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
7909
+ malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
7910
+ parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
7911
+ if (malformedIPLiteral) {
7912
+ parsed.error = parsed.error || "URI host is malformed.";
7913
+ malformedAuthorityOrPort = true;
7914
+ }
7915
+ } else isIP = true;
7916
+ }
7918
7917
  if (parsed.scheme === void 0 && parsed.userinfo === void 0 && parsed.host === void 0 && parsed.port === void 0 && parsed.query === void 0 && !parsed.path) parsed.reference = "same-document";
7919
7918
  else if (parsed.scheme === void 0) parsed.reference = "relative";
7920
7919
  else if (parsed.fragment === void 0) parsed.reference = "absolute";
@@ -8681,17 +8680,21 @@ var require_ref = /* @__PURE__ */ __commonJSMin(((exports) => {
8681
8680
  var _a;
8682
8681
  if (!it.opts.unevaluated) return;
8683
8682
  const schEvaluated = (_a = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a === void 0 ? void 0 : _a.evaluated;
8684
- if (it.props !== true) if (schEvaluated && !schEvaluated.dynamicProps) {
8685
- if (schEvaluated.props !== void 0) it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props);
8686
- } else {
8687
- const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`);
8688
- it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name);
8683
+ if (it.props !== true) {
8684
+ if (schEvaluated && !schEvaluated.dynamicProps) {
8685
+ if (schEvaluated.props !== void 0) it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props);
8686
+ } else {
8687
+ const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`);
8688
+ it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name);
8689
+ }
8689
8690
  }
8690
- if (it.items !== true) if (schEvaluated && !schEvaluated.dynamicItems) {
8691
- if (schEvaluated.items !== void 0) it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items);
8692
- } else {
8693
- const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`);
8694
- it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name);
8691
+ if (it.items !== true) {
8692
+ if (schEvaluated && !schEvaluated.dynamicItems) {
8693
+ if (schEvaluated.items !== void 0) it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items);
8694
+ } else {
8695
+ const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`);
8696
+ it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name);
8697
+ }
8695
8698
  }
8696
8699
  }
8697
8700
  }
@@ -10669,7 +10672,7 @@ var require_dist = /* @__PURE__ */ __commonJSMin(((exports, module) => {
10669
10672
  exports.default = formatsPlugin;
10670
10673
  }));
10671
10674
  //#endregion
10672
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
10675
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
10673
10676
  var import_ajv = /* @__PURE__ */ __toESM(require_ajv(), 1);
10674
10677
  var import_dist = /* @__PURE__ */ __toESM(require_dist(), 1);
10675
10678
  function createDefaultAjvInstance() {
@@ -10745,7 +10748,7 @@ var AjvJsonSchemaValidator = class {
10745
10748
  }
10746
10749
  };
10747
10750
  //#endregion
10748
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
10751
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
10749
10752
  /**
10750
10753
  * Experimental server task features for MCP SDK.
10751
10754
  * WARNING: These APIs are experimental and may change without notice.
@@ -10902,9 +10905,7 @@ var ExperimentalServerTasks = class {
10902
10905
  case "url":
10903
10906
  if (!clientCapabilities?.elicitation?.url) throw new Error("Client does not support url elicitation.");
10904
10907
  break;
10905
- case "form":
10906
- if (!clientCapabilities?.elicitation?.form) throw new Error("Client does not support form elicitation.");
10907
- break;
10908
+ case "form": if (!clientCapabilities?.elicitation?.form) throw new Error("Client does not support form elicitation.");
10908
10909
  }
10909
10910
  const normalizedParams = mode === "form" && params.mode === void 0 ? {
10910
10911
  ...params,
@@ -10965,7 +10966,7 @@ var ExperimentalServerTasks = class {
10965
10966
  }
10966
10967
  };
10967
10968
  //#endregion
10968
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
10969
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
10969
10970
  /**
10970
10971
  * Experimental task capability assertion helpers.
10971
10972
  * WARNING: These APIs are experimental and may change without notice.
@@ -10986,10 +10987,7 @@ var ExperimentalServerTasks = class {
10986
10987
  function assertToolsCallTaskCapability(requests, method, entityName) {
10987
10988
  if (!requests) throw new Error(`${entityName} does not support task creation (required for ${method})`);
10988
10989
  switch (method) {
10989
- case "tools/call":
10990
- if (!requests.tools?.call) throw new Error(`${entityName} does not support task creation for tools/call (required for ${method})`);
10991
- break;
10992
- default: break;
10990
+ case "tools/call": if (!requests.tools?.call) throw new Error(`${entityName} does not support task creation for tools/call (required for ${method})`);
10993
10991
  }
10994
10992
  }
10995
10993
  /**
@@ -11009,14 +11007,11 @@ function assertClientRequestTaskCapability(requests, method, entityName) {
11009
11007
  case "sampling/createMessage":
11010
11008
  if (!requests.sampling?.createMessage) throw new Error(`${entityName} does not support task creation for sampling/createMessage (required for ${method})`);
11011
11009
  break;
11012
- case "elicitation/create":
11013
- if (!requests.elicitation?.create) throw new Error(`${entityName} does not support task creation for elicitation/create (required for ${method})`);
11014
- break;
11015
- default: break;
11010
+ case "elicitation/create": if (!requests.elicitation?.create) throw new Error(`${entityName} does not support task creation for elicitation/create (required for ${method})`);
11016
11011
  }
11017
11012
  }
11018
11013
  //#endregion
11019
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
11014
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
11020
11015
  /**
11021
11016
  * An MCP server on top of a pluggable transport.
11022
11017
  *
@@ -11133,10 +11128,7 @@ var Server = class extends Protocol {
11133
11128
  case "elicitation/create":
11134
11129
  if (!this._clientCapabilities?.elicitation) throw new Error(`Client does not support elicitation (required for ${method})`);
11135
11130
  break;
11136
- case "roots/list":
11137
- if (!this._clientCapabilities?.roots) throw new Error(`Client does not support listing roots (required for ${method})`);
11138
- break;
11139
- case "ping": break;
11131
+ case "roots/list": if (!this._clientCapabilities?.roots) throw new Error(`Client does not support listing roots (required for ${method})`);
11140
11132
  }
11141
11133
  }
11142
11134
  assertNotificationCapability(method) {
@@ -11154,11 +11146,7 @@ var Server = class extends Protocol {
11154
11146
  case "notifications/prompts/list_changed":
11155
11147
  if (!this._capabilities.prompts) throw new Error(`Server does not support notifying of prompt list changes (required for ${method})`);
11156
11148
  break;
11157
- case "notifications/elicitation/complete":
11158
- if (!this._clientCapabilities?.elicitation?.url) throw new Error(`Client does not support URL elicitation (required for ${method})`);
11159
- break;
11160
- case "notifications/cancelled": break;
11161
- case "notifications/progress": break;
11149
+ case "notifications/elicitation/complete": if (!this._clientCapabilities?.elicitation?.url) throw new Error(`Client does not support URL elicitation (required for ${method})`);
11162
11150
  }
11163
11151
  }
11164
11152
  assertRequestHandlerCapability(method) {
@@ -11186,11 +11174,7 @@ var Server = class extends Protocol {
11186
11174
  case "tasks/get":
11187
11175
  case "tasks/list":
11188
11176
  case "tasks/result":
11189
- case "tasks/cancel":
11190
- if (!this._capabilities.tasks) throw new Error(`Server does not support tasks capability (required for ${method})`);
11191
- break;
11192
- case "ping":
11193
- case "initialize": break;
11177
+ case "tasks/cancel": if (!this._capabilities.tasks) throw new Error(`Server does not support tasks capability (required for ${method})`);
11194
11178
  }
11195
11179
  }
11196
11180
  assertTaskCapability(method) {
@@ -11350,7 +11334,7 @@ var Server = class extends Protocol {
11350
11334
  }
11351
11335
  };
11352
11336
  //#endregion
11353
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js
11337
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js
11354
11338
  const COMPLETABLE_SYMBOL = Symbol.for("mcp.completable");
11355
11339
  /**
11356
11340
  * Checks if a schema is completable (has completion metadata).
@@ -11369,7 +11353,7 @@ var McpZodTypeKind;
11369
11353
  McpZodTypeKind["Completable"] = "McpCompletable";
11370
11354
  })(McpZodTypeKind || (McpZodTypeKind = {}));
11371
11355
  //#endregion
11372
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js
11356
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js
11373
11357
  /**
11374
11358
  * Tool name validation utilities according to SEP: Specify Format for Tool Names
11375
11359
  *
@@ -11440,7 +11424,7 @@ function validateAndWarnToolName(name) {
11440
11424
  return result.isValid;
11441
11425
  }
11442
11426
  //#endregion
11443
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js
11427
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js
11444
11428
  /**
11445
11429
  * Experimental McpServer task features for MCP SDK.
11446
11430
  * WARNING: These APIs are experimental and may change without notice.
@@ -11471,7 +11455,7 @@ var ExperimentalMcpServerTasks = class {
11471
11455
  }
11472
11456
  };
11473
11457
  //#endregion
11474
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js
11458
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js
11475
11459
  function toolInputElementCount(value, max) {
11476
11460
  let count = 0;
11477
11461
  const stack = [value];
@@ -12155,7 +12139,7 @@ function serializeMessage(message) {
12155
12139
  return JSON.stringify(message) + "\n";
12156
12140
  }
12157
12141
  //#endregion
12158
- //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
12142
+ //#region node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@4.6.7/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
12159
12143
  /**
12160
12144
  * Server transport for stdio: this communicates with an MCP client by reading from the current process' stdin and writing to stdout.
12161
12145
  *
@@ -13854,7 +13838,7 @@ async function listAnalyticsAccounts(gfetch, options) {
13854
13838
  return googleJson(gfetch, url.toString(), {
13855
13839
  ...options,
13856
13840
  label: "Google Analytics accounts",
13857
- maxBytes: 10 * 1024 * 1024
13841
+ maxBytes: 10485760
13858
13842
  });
13859
13843
  });
13860
13844
  }
@@ -13863,7 +13847,7 @@ async function listAnalyticsDataStreams(gfetch, propertyId, options) {
13863
13847
  ...options,
13864
13848
  label: "Google Analytics data streams",
13865
13849
  subject: `property ${propertyId}`,
13866
- maxBytes: 1024 * 1024
13850
+ maxBytes: 1048576
13867
13851
  })).dataStreams ?? [];
13868
13852
  }
13869
13853
  async function runAnalyticsReport(gfetch, propertyId, body, options) {
@@ -13912,13 +13896,13 @@ function day$2(value) {
13912
13896
  const date = legacy ? new Date(Number(legacy[1])) : new Date(value);
13913
13897
  return Number.isNaN(date.getTime()) ? null : date.toISOString().slice(0, 10);
13914
13898
  }
13915
- const count$2 = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
13916
- function list$1(data, label) {
13899
+ const count$3 = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
13900
+ function list$2(data, label) {
13917
13901
  if (!Array.isArray(data)) throw new SeoError("OPTIONAL_PROVIDER_UNAVAILABLE", `Bing Webmaster returned an invalid ${label}.`);
13918
13902
  return data.filter((item) => Boolean(item) && typeof item === "object");
13919
13903
  }
13920
13904
  async function listBingSites(call) {
13921
- return list$1(await call("GetUserSites"), "site list").filter((row) => typeof row.Url === "string").map((row) => ({
13905
+ return list$2(await call("GetUserSites"), "site list").filter((row) => typeof row.Url === "string").map((row) => ({
13922
13906
  url: row.Url,
13923
13907
  verified: row.IsVerified === true
13924
13908
  })).sort((a, b) => a.url.localeCompare(b.url, "en"));
@@ -13926,10 +13910,10 @@ async function listBingSites(call) {
13926
13910
  async function bingTraffic(call, site) {
13927
13911
  const rows = [];
13928
13912
  let invalidRows = 0;
13929
- for (const row of list$1(await call("GetRankAndTrafficStats", { siteUrl: site }), "traffic list")) {
13913
+ for (const row of list$2(await call("GetRankAndTrafficStats", { siteUrl: site }), "traffic list")) {
13930
13914
  const date = day$2(row.Date);
13931
- const clicks = count$2(row.Clicks);
13932
- const impressions = count$2(row.Impressions);
13915
+ const clicks = count$3(row.Clicks);
13916
+ const impressions = count$3(row.Impressions);
13933
13917
  if (!date || clicks === null || impressions === null) {
13934
13918
  invalidRows += 1;
13935
13919
  continue;
@@ -13949,12 +13933,12 @@ async function bingTraffic(call, site) {
13949
13933
  async function keyed(call, method, params) {
13950
13934
  const rows = [];
13951
13935
  let invalidRows = 0;
13952
- for (const row of list$1(await call(method, params), "row list")) {
13936
+ for (const row of list$2(await call(method, params), "row list")) {
13953
13937
  const date = day$2(row.Date);
13954
13938
  const key = typeof row.Query === "string" ? row.Query.trim() : "";
13955
- const clicks = count$2(row.Clicks);
13956
- const impressions = count$2(row.Impressions);
13957
- const position = count$2(row.AvgImpressionPosition);
13939
+ const clicks = count$3(row.Clicks);
13940
+ const impressions = count$3(row.Impressions);
13941
+ const position = count$3(row.AvgImpressionPosition);
13958
13942
  if (!date || !key || clicks === null || impressions === null) {
13959
13943
  invalidRows += 1;
13960
13944
  continue;
@@ -14488,7 +14472,7 @@ function sharedReader(read, redirects = /* @__PURE__ */ new Map()) {
14488
14472
  return found;
14489
14473
  };
14490
14474
  }
14491
- const MAX_STATUS_BYTES = 10 * 1024 * 1024;
14475
+ const MAX_STATUS_BYTES = 10485760;
14492
14476
  async function googleUpdates(window) {
14493
14477
  if (!window) return [];
14494
14478
  const incidents = await fetch("https://status.search.google.com/incidents.json", { signal: AbortSignal.timeout(8e3) }).then((response) => response.ok ? readJson(response, "Google Search Status", { maxBytes: MAX_STATUS_BYTES }) : null).catch(() => null);
@@ -15694,6 +15678,15 @@ async function cloudCredentials(options = {}) {
15694
15678
  })();
15695
15679
  return credentials;
15696
15680
  }
15681
+ async function cloudWeek() {
15682
+ const token = cloudToken();
15683
+ if (!token) throw new SeoError("AUTH_REQUIRED", notSignedIn());
15684
+ const result = await call$1("/account/cli/week", { token });
15685
+ if (result.status === 401) throw new SeoError("AUTH_EXPIRED", `This machine is not linked to a seoskill.dev account any more. ${CLOUD_SIGN_IN}`);
15686
+ if (result.status === 403) return null;
15687
+ if (!result.ok) throw new SeoError("PROVIDER_UNAVAILABLE", `seoskill.dev returned ${result.status}. Try again in a minute.`);
15688
+ return result.body;
15689
+ }
15697
15690
  function notSignedIn() {
15698
15691
  return "Not signed in. Run `seo login` to use your seoskill.dev account on this machine (it prints a link to approve), or `seo auth login` to sign in with Google on this machine only. `seo crawl --url <url>` works without sign-in.";
15699
15692
  }
@@ -16411,15 +16404,15 @@ function googleFetchFor(client) {
16411
16404
  const LOCAL_SIGN_IN = { signIn: "Run `seo auth login` again." };
16412
16405
  //#endregion
16413
16406
  //#region packages/core/dist/storage/cache-maintenance.js
16414
- const MEBIBYTE$2 = 1024 * 1024;
16415
- const CACHE_MAX_AGE_MS = 720 * 60 * 60 * 1e3;
16407
+ const MEBIBYTE$1 = 1048576;
16408
+ const CACHE_MAX_AGE_MS = 2592e6;
16416
16409
  const CACHE_LIMITS = {
16417
- gsc_cache: 48 * MEBIBYTE$2,
16418
- url_inspection_cache: 16 * MEBIBYTE$2,
16419
- ga4_cache: 24 * MEBIBYTE$2,
16420
- provider_cache: 32 * MEBIBYTE$2,
16421
- http_cache: 128 * MEBIBYTE$2,
16422
- performance_reports: 8 * MEBIBYTE$2
16410
+ gsc_cache: 48 * MEBIBYTE$1,
16411
+ url_inspection_cache: 16 * MEBIBYTE$1,
16412
+ ga4_cache: 24 * MEBIBYTE$1,
16413
+ provider_cache: 32 * MEBIBYTE$1,
16414
+ http_cache: 128 * MEBIBYTE$1,
16415
+ performance_reports: 8 * MEBIBYTE$1
16423
16416
  };
16424
16417
  const CACHE_POLICIES = [
16425
16418
  {
@@ -17928,7 +17921,7 @@ async function extractMainMarkdown(fetchResult) {
17928
17921
  const cut = markdown.slice(0, MARKDOWN_LIMIT);
17929
17922
  const end = cut.lastIndexOf("\n");
17930
17923
  return {
17931
- markdown: (end > 2e4 / 2 ? cut.slice(0, end) : cut).trimEnd(),
17924
+ markdown: (end > 1e4 ? cut.slice(0, end) : cut).trimEnd(),
17932
17925
  characters: markdown.length,
17933
17926
  truncated: true
17934
17927
  };
@@ -19190,7 +19183,7 @@ async function fetchWithRedirectChain(url, signal) {
19190
19183
  }
19191
19184
  //#endregion
19192
19185
  //#region packages/core/dist/fetch/page-fetcher/robots.js
19193
- const MAX_ROBOTS_RESPONSE_BYTES = 1024 * 1024;
19186
+ const MAX_ROBOTS_RESPONSE_BYTES = 1048576;
19194
19187
  var RobotsAccessError = class extends Error {
19195
19188
  reason;
19196
19189
  evidence;
@@ -19364,7 +19357,7 @@ function diagnosticRobotsEvidence(robots) {
19364
19357
  }
19365
19358
  //#endregion
19366
19359
  //#region packages/core/dist/fetch/page-fetcher/plain.js
19367
- const MAX_PAGE_RESPONSE_BYTES = 5 * 1024 * 1024;
19360
+ const MAX_PAGE_RESPONSE_BYTES = 5242880;
19368
19361
  function encodePageFetchCacheEvidence(result) {
19369
19362
  return JSON.stringify({
19370
19363
  finalUrl: result.finalUrl,
@@ -20129,7 +20122,7 @@ function assertUrlMatchesGscProperty(property, value) {
20129
20122
  if (!url.startsWith(prefix)) return invalid(`${url} is outside the Search Console property ${property}.`);
20130
20123
  return url;
20131
20124
  }
20132
- const RESERVATION_TTL_MS = 5 * 6e4;
20125
+ const RESERVATION_TTL_MS = 3e5;
20133
20126
  var UrlInspectionQuotaError = class extends SeoError {
20134
20127
  property;
20135
20128
  requestSent;
@@ -20174,8 +20167,8 @@ function reconcileExpiredReservations(input) {
20174
20167
  WHERE credential_key = ? AND property_site_url = ? AND quota_date = ?`).run(expired.count, expired.count, input.now, input.credentialKey, input.property, input.quotaDate);
20175
20168
  }
20176
20169
  function pruneOldQuotaRows(database, now) {
20177
- const reservationCutoff = now - 2 * 864e5;
20178
- const bucketCutoff = (/* @__PURE__ */ new Date(now - 7 * 864e5)).toISOString().slice(0, 10);
20170
+ const reservationCutoff = now - 1728e5;
20171
+ const bucketCutoff = (/* @__PURE__ */ new Date(now - 6048e5)).toISOString().slice(0, 10);
20179
20172
  database.prepare(`DELETE FROM url_inspection_quota_reservations
20180
20173
  WHERE expires_at < ?`).run(reservationCutoff);
20181
20174
  database.prepare(`DELETE FROM url_inspection_quota_buckets
@@ -22173,7 +22166,7 @@ const actionPriority = new Map([
22173
22166
  "unverified",
22174
22167
  "covered"
22175
22168
  ].map((type, index) => [type, index]));
22176
- function plural$7(count, singular, pluralLabel) {
22169
+ function plural$8(count, singular, pluralLabel) {
22177
22170
  return count === 1 ? singular : pluralLabel;
22178
22171
  }
22179
22172
  function actionable(item) {
@@ -22207,7 +22200,7 @@ function pageOpportunityVerdict(input) {
22207
22200
  if (focus === "unverified") return "GSC visibility exists, but the page was not verified and no specific change is justified yet.";
22208
22201
  if (focus === "covered") return "The verified page covers the sampled queries and CTR is not materially below its directional benchmark.";
22209
22202
  const count = analysis.summary.opportunities;
22210
- const prefix = `${count} ${plural$7(count, "actionable observation", "actionable observations")} found.`;
22203
+ const prefix = `${count} ${plural$8(count, "actionable observation", "actionable observations")} found.`;
22211
22204
  if (focus === "content-gap") return `${prefix} Verified body coverage is the main issue; confirm intent before expanding the page.`;
22212
22205
  if (focus === "serp-framing") return `${prefix} The body is relevant, but its title, meta description, or H1 framing is weak.`;
22213
22206
  if (focus === "ranking") return `${prefix} Most upside requires stronger relevance or authority; no CTR-only lift is claimed for page-two queries.`;
@@ -22222,7 +22215,7 @@ function pageOpportunityRecommendations(analysis) {
22222
22215
  }
22223
22216
  const recommendations = [`Start with "${top.query}". ${top.recommendation}`];
22224
22217
  const technical = actions.filter((item) => item.opportunityType === "technical-check").length;
22225
- if (technical) recommendations.push(`Resolve the technical evidence affecting ${technical} ${plural$7(technical, "row", "rows")} before content work.`);
22218
+ if (technical) recommendations.push(`Resolve the technical evidence affecting ${technical} ${plural$8(technical, "row", "rows")} before content work.`);
22226
22219
  const gaps = actions.filter((item) => item.opportunityType === "content-gap").length;
22227
22220
  if (gaps >= 3) recommendations.push(`Group the ${gaps} verified content gaps into useful sections rather than adding one thin paragraph per query.`);
22228
22221
  return recommendations;
@@ -22649,8 +22642,8 @@ function urlKey(value) {
22649
22642
  }
22650
22643
  }
22651
22644
  const SLOW_RESPONSE_MS = 2e3;
22652
- const LARGE_HTML_BYTES = 2 * 1024 * 1024;
22653
- const COMPRESSION_MIN_BYTES = 4 * 1024;
22645
+ const LARGE_HTML_BYTES = 2097152;
22646
+ const COMPRESSION_MIN_BYTES = 4096;
22654
22647
  const DEEP_PAGE_DEPTH = 4;
22655
22648
  const WEAK_VALUABLE_INLINKS = 1;
22656
22649
  const QUERY_COVERAGE_MIN_IMPRESSIONS = 50;
@@ -23529,8 +23522,10 @@ function summarizeCrawlReport(input) {
23529
23522
  if (request.outcome === "response") {
23530
23523
  responseRequests += 1;
23531
23524
  if (request.extraction === "failed") extractionFailures += 1;
23532
- } else if (request.outcome === "failure") if (request.failureKind === "aborted") abortedRequests += 1;
23533
- else failedRequests += 1;
23525
+ } else if (request.outcome === "failure") {
23526
+ if (request.failureKind === "aborted") abortedRequests += 1;
23527
+ else failedRequests += 1;
23528
+ }
23534
23529
  }
23535
23530
  let highIssues = 0;
23536
23531
  let mediumIssues = 0;
@@ -24849,11 +24844,11 @@ function cancellationRace(signal) {
24849
24844
  }
24850
24845
  //#endregion
24851
24846
  //#region packages/core/dist/analyze/crawler/crawl-memory.js
24852
- const MEBIBYTE$1 = 1024 * 1024;
24853
- const MIN_CRAWL_MEMORY_LIMIT = 384 * MEBIBYTE$1;
24854
- const MAX_CRAWL_MEMORY_LIMIT = 640 * MEBIBYTE$1;
24855
- const MIN_CRAWL_RSS_LIMIT = 512 * MEBIBYTE$1;
24856
- const MAX_CRAWL_RSS_LIMIT = 896 * MEBIBYTE$1;
24847
+ const MEBIBYTE = 1048576;
24848
+ const MIN_CRAWL_MEMORY_LIMIT = 384 * MEBIBYTE;
24849
+ const MAX_CRAWL_MEMORY_LIMIT = 640 * MEBIBYTE;
24850
+ const MIN_CRAWL_RSS_LIMIT = 512 * MEBIBYTE;
24851
+ const MAX_CRAWL_RSS_LIMIT = 896 * MEBIBYTE;
24857
24852
  const SYSTEM_MEMORY_FRACTION = .1;
24858
24853
  const SYSTEM_RSS_FRACTION = .2;
24859
24854
  function crawlMemoryLimitBytes(totalMemoryBytes) {
@@ -25252,7 +25247,7 @@ async function collectCrawlSiteChecks(input) {
25252
25247
  }
25253
25248
  //#endregion
25254
25249
  //#region packages/core/dist/analyze/crawler/site-crawl-ai-signals.js
25255
- const MAX_AUXILIARY_RESPONSE_BYTES = 2 * 1024 * 1024;
25250
+ const MAX_AUXILIARY_RESPONSE_BYTES = 2097152;
25256
25251
  const LLMS_LINK_LIMIT = 20;
25257
25252
  const AI_BOTS = [
25258
25253
  ["OAI-SearchBot", "search"],
@@ -26906,7 +26901,7 @@ const identifierPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
26906
26901
  const packageNamePattern = /^(?:@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)$/u;
26907
26902
  const exactVersionPattern = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u;
26908
26903
  const integrityPattern = /^sha(?:256|384|512)-[A-Za-z0-9+/=]+$/u;
26909
- const MAX_SCHEMA_BYTES = 64 * 1024;
26904
+ const MAX_SCHEMA_BYTES = 65536;
26910
26905
  const MAX_SCHEMA_DEPTH = 16;
26911
26906
  const MAX_SCHEMA_VALUES = 5e3;
26912
26907
  function boundedJsonObject(value) {
@@ -26979,7 +26974,7 @@ const providerCapabilityAdapterSchema = z.union([landingPageVisitsCapabilitySche
26979
26974
  const providerActionAdapterSchema = z.custom((value) => {
26980
26975
  if (typeof value !== "object" || value === null) return false;
26981
26976
  const action = value;
26982
- return typeof action.id === "string" && providerExtensionIdSchema.safeParse(action.id).success && typeof action.description === "string" && action.description.trim().length >= 1 && action.description.length <= 240 && supportedJsonSchema(action.inputSchema, true) && supportedJsonSchema(action.outputSchema) && (action.cacheTtlMs === void 0 || Number.isSafeInteger(action.cacheTtlMs) && action.cacheTtlMs >= 0 && action.cacheTtlMs <= 10080 * 60 * 1e3) && typeof action.run === "function";
26977
+ return typeof action.id === "string" && providerExtensionIdSchema.safeParse(action.id).success && typeof action.description === "string" && action.description.trim().length >= 1 && action.description.length <= 240 && supportedJsonSchema(action.inputSchema, true) && supportedJsonSchema(action.outputSchema) && (action.cacheTtlMs === void 0 || Number.isSafeInteger(action.cacheTtlMs) && action.cacheTtlMs >= 0 && action.cacheTtlMs <= 6048e5) && typeof action.run === "function";
26983
26978
  }, "Invalid provider action.");
26984
26979
  const providerPackageManifestSchema = z.object({
26985
26980
  apiVersion: z.literal(1),
@@ -27349,8 +27344,8 @@ async function loadInstalledProviderExtensions(options = {}) {
27349
27344
  //#endregion
27350
27345
  //#region packages/core/dist/provider-extensions/runtime.js
27351
27346
  const DEFAULT_MAX_REQUESTS = 8;
27352
- const MAX_RESPONSE_BYTES$1 = 10 * 1024 * 1024;
27353
- const MAX_REQUEST_BODY_BYTES = 64 * 1024;
27347
+ const MAX_RESPONSE_BYTES$1 = 10485760;
27348
+ const MAX_REQUEST_BODY_BYTES = 65536;
27354
27349
  const TIMEOUT_MS$3 = 15e3;
27355
27350
  function normalizeProviderExtensionAccount(provider, account) {
27356
27351
  const fields = provider.connection.fields.filter((field) => field.kind === "account");
@@ -27407,7 +27402,7 @@ function runtimeForProvider(provider, options = {}) {
27407
27402
  }
27408
27403
  //#endregion
27409
27404
  //#region packages/core/dist/provider-extensions/analytics.js
27410
- const CACHE_TTL_MS$1 = 1440 * 60 * 1e3;
27405
+ const CACHE_TTL_MS$1 = 864e5;
27411
27406
  const landingPageResultSchema = z.object({
27412
27407
  metric: z.literal("landing-page-visits"),
27413
27408
  rows: z.array(z.object({
@@ -28006,16 +28001,18 @@ async function crawlSite(input, dependencies) {
28006
28001
  return;
28007
28002
  }
28008
28003
  if (queue.size + visited.size + inFlight.size >= config.maxPages * 5) {
28009
- if (!queueSafetyDeferredUrls.has(normalized)) if (queueSafetyDeferredUrls.size < maxTrackedQueueSafetyUrls) {
28010
- queueSafetyDeferredUrls.add(normalized);
28011
- queueSafetySkippedUrls = queueSafetyDeferredUrls.size;
28012
- recordSkip("queue-safety-limit");
28013
- emitStatus("url_skipped", {
28014
- url: normalized,
28015
- depth,
28016
- reason: "queue_safety_limit"
28017
- });
28018
- } else queueSafetyInventoryCapped = true;
28004
+ if (!queueSafetyDeferredUrls.has(normalized)) {
28005
+ if (queueSafetyDeferredUrls.size < maxTrackedQueueSafetyUrls) {
28006
+ queueSafetyDeferredUrls.add(normalized);
28007
+ queueSafetySkippedUrls = queueSafetyDeferredUrls.size;
28008
+ recordSkip("queue-safety-limit");
28009
+ emitStatus("url_skipped", {
28010
+ url: normalized,
28011
+ depth,
28012
+ reason: "queue_safety_limit"
28013
+ });
28014
+ } else queueSafetyInventoryCapped = true;
28015
+ }
28019
28016
  return;
28020
28017
  }
28021
28018
  discovered.add(normalized);
@@ -28121,12 +28118,14 @@ async function crawlSite(input, dependencies) {
28121
28118
  extraction: "not-applicable"
28122
28119
  });
28123
28120
  requests.push(request);
28124
- if (healthStrategy) if (request.outcome === "response" && request.status < 400 && !request.accessBlock) {
28125
- healthyProbeStreak += 1;
28126
- activeConcurrency = Math.min(config.concurrency, 1 + Math.floor(healthyProbeStreak / 20));
28127
- } else {
28128
- healthyProbeStreak = 0;
28129
- activeConcurrency = 1;
28121
+ if (healthStrategy) {
28122
+ if (request.outcome === "response" && request.status < 400 && !request.accessBlock) {
28123
+ healthyProbeStreak += 1;
28124
+ activeConcurrency = Math.min(config.concurrency, 1 + Math.floor(healthyProbeStreak / 20));
28125
+ } else {
28126
+ healthyProbeStreak = 0;
28127
+ activeConcurrency = 1;
28128
+ }
28130
28129
  }
28131
28130
  checkMemoryPressure();
28132
28131
  if (request.outcome === "skipped") {
@@ -28259,14 +28258,16 @@ async function crawlSite(input, dependencies) {
28259
28258
  depth: task.depth,
28260
28259
  statusCode: page.status
28261
28260
  });
28262
- if (followLinks && task.depth < config.maxDepth) if (memoryLimited) for (const value of result.urls) {
28263
- const normalized = normalizeUrl$1(value, finalUrl);
28264
- if (normalized && sameOrigin(normalized, origin) && !isLikelyAsset(normalized) && passesFilters(normalized, config.include, config.exclude) && !visited.has(normalized) && !queue.has(normalized)) {
28265
- discovered.add(normalized);
28266
- memoryDeferredUrls.add(normalized);
28261
+ if (followLinks && task.depth < config.maxDepth) {
28262
+ if (memoryLimited) for (const value of result.urls) {
28263
+ const normalized = normalizeUrl$1(value, finalUrl);
28264
+ if (normalized && sameOrigin(normalized, origin) && !isLikelyAsset(normalized) && passesFilters(normalized, config.include, config.exclude) && !visited.has(normalized) && !queue.has(normalized)) {
28265
+ discovered.add(normalized);
28266
+ memoryDeferredUrls.add(normalized);
28267
+ }
28267
28268
  }
28269
+ else for (const url of result.urls) enqueue(url, task.depth + 1);
28268
28270
  }
28269
- else for (const url of result.urls) enqueue(url, task.depth + 1);
28270
28271
  }
28271
28272
  const memoryPressureSkippedUrls = memoryLimited ? queue.size + memoryDeferredUrls.size : 0;
28272
28273
  const stoppedForMemory = memoryPressureSkippedUrls > 0;
@@ -28961,7 +28962,7 @@ function analyzeCtrUnderperformersFromRows(input) {
28961
28962
  const MAX_GSC_ROWS$3 = 1e5;
28962
28963
  const DEFAULT_DAYS$3 = 28;
28963
28964
  const MAX_DAYS$2 = 548;
28964
- function plural$6(count, singular, pluralLabel = `${singular}s`) {
28965
+ function plural$7(count, singular, pluralLabel = `${singular}s`) {
28965
28966
  return count === 1 ? singular : pluralLabel;
28966
28967
  }
28967
28968
  async function ctrUnderperformersReportWith(input, dependencies) {
@@ -29064,11 +29065,11 @@ async function ctrUnderperformersReportWith(input, dependencies) {
29064
29065
  minImpressions,
29065
29066
  limit,
29066
29067
  brandFiltering: input.includeBrand ? "included" : "excluded",
29067
- verdict: top ? `${selection.eligibleUnderperformers} CTR ${plural$6(selection.eligibleUnderperformers, "underperformer")} found in retained rows, with a calculated heuristic shortfall of ${totalClickShortfall.toFixed(0)} clicks for this window. Start review with "${top.query}" because it has the largest gap.` : dataStatus === "partial" ? "No material CTR underperformers remained in the validated retained rows, but partial evidence prevents an all-clear." : `No high-impression rows at average position below 4 in the retained rows are materially below the heuristic CTR benchmark.`
29068
+ verdict: top ? `${selection.eligibleUnderperformers} CTR ${plural$7(selection.eligibleUnderperformers, "underperformer")} found in retained rows, with a calculated heuristic shortfall of ${totalClickShortfall.toFixed(0)} clicks for this window. Start review with "${top.query}" because it has the largest gap.` : dataStatus === "partial" ? "No material CTR underperformers remained in the validated retained rows, but partial evidence prevents an all-clear." : `No high-impression rows at average position below 4 in the retained rows are materially below the heuristic CTR benchmark.`
29068
29069
  },
29069
29070
  items,
29070
29071
  caveats: [
29071
- `Date window: ${range.startDate} to ${range.endDate} (${days} ${plural$6(days, "day")}), using final GSC data where available.`,
29072
+ `Date window: ${range.startDate} to ${range.endDate} (${days} ${plural$7(days, "day")}), using final GSC data where available.`,
29072
29073
  `Brand queries: ${input.includeBrand ? "included" : "excluded"}. Brand terms used: ${brand.terms.join(", ") || "none"} (${brand.source === "provided" ? "provided" : "host forms, plus the bare domain stem only when Search Console shows the site is its navigational answer"}).`,
29073
29074
  `Only rows at average position below 4 with at least ${minImpressions} impressions were checked. Rows at position 4 to 10 belong to quick-wins, which uses the same site CTR curve.`,
29074
29075
  minImpressionsCaveat({
@@ -29076,13 +29077,13 @@ async function ctrUnderperformersReportWith(input, dependencies) {
29076
29077
  belowMinimumRows: selection.belowMinimumRows
29077
29078
  }),
29078
29079
  "Expected CTR uses the site CTR curve from all page-one rows (75th percentile of qualified URL CTRs per position) when enough peer data exists, otherwise the fallback position curve.",
29079
- ...selection.fragmentRows ? [`${selection.fragmentRows} source ${plural$6(selection.fragmentRows, "row")} with a #fragment URL ${selection.fragmentRows === 1 ? "was" : "were"} merged into the base URL.`] : [],
29080
- ...selection.flaggedRows ? [`${selection.flaggedRows} eligible ${plural$6(selection.flaggedRows, "row")} carry heuristic query flags (likely-automated or navigational-other) and rank after unflagged rows.`] : [],
29080
+ ...selection.fragmentRows ? [`${selection.fragmentRows} source ${plural$7(selection.fragmentRows, "row")} with a #fragment URL ${selection.fragmentRows === 1 ? "was" : "were"} merged into the base URL.`] : [],
29081
+ ...selection.flaggedRows ? [`${selection.flaggedRows} eligible ${plural$7(selection.flaggedRows, "row")} carry heuristic query flags (likely-automated or navigational-other) and rank after unflagged rows.`] : [],
29081
29082
  "CTR benchmarks and calculated click shortfalls are directional heuristics, not forecasts or proof that clicks are available. Validate the search intent and live SERP before editing.",
29082
- ...selection.invalidRows ? [`${selection.invalidRows} invalid provider ${plural$6(selection.invalidRows, "row")} ${selection.invalidRows === 1 ? "was" : "were"} excluded, so this report is partial.`] : [],
29083
- ...selection.duplicateRows ? [`${selection.duplicateRows} repeated query/page ${plural$6(selection.duplicateRows, "row")} ${selection.duplicateRows === 1 ? "was" : "were"} aggregated before CTR and average position were calculated.`] : [],
29083
+ ...selection.invalidRows ? [`${selection.invalidRows} invalid provider ${plural$7(selection.invalidRows, "row")} ${selection.invalidRows === 1 ? "was" : "were"} excluded, so this report is partial.`] : [],
29084
+ ...selection.duplicateRows ? [`${selection.duplicateRows} repeated query/page ${plural$7(selection.duplicateRows, "row")} ${selection.duplicateRows === 1 ? "was" : "were"} aggregated before CTR and average position were calculated.`] : [],
29084
29085
  ...possiblyTruncated ? [`The retained-row limit of ${MAX_GSC_ROWS$3} was reached, so lower-ranked source rows may be absent.`] : [],
29085
- ...selection.limitedUnderperformers ? [`${selection.limitedUnderperformers} eligible ${plural$6(selection.limitedUnderperformers, "underperformer")} ${selection.limitedUnderperformers === 1 ? "was" : "were"} omitted by the output limit.`] : []
29086
+ ...selection.limitedUnderperformers ? [`${selection.limitedUnderperformers} eligible ${plural$7(selection.limitedUnderperformers, "underperformer")} ${selection.limitedUnderperformers === 1 ? "was" : "were"} omitted by the output limit.`] : []
29086
29087
  ],
29087
29088
  recommendations: top ? [
29088
29089
  `Review the live SERP and displayed snippet for "${top.query}" first. Test the title or meta description only if the observed framing does not match the query intent.`,
@@ -29102,11 +29103,11 @@ function ctrUnderperformersReport(input, dependencies = defaultDependencies$9) {
29102
29103
  }
29103
29104
  //#endregion
29104
29105
  //#region packages/core/dist/phrasing.js
29105
- function plural$5(count, singular, pluralLabel = `${singular}s`) {
29106
+ function plural$6(count, singular, pluralLabel = `${singular}s`) {
29106
29107
  return count === 1 ? singular : pluralLabel;
29107
29108
  }
29108
29109
  function countLabel(count, singular, pluralLabel = `${singular}s`) {
29109
- return `${count.toLocaleString("en-GB")} ${plural$5(count, singular, pluralLabel)}`;
29110
+ return `${count.toLocaleString("en-GB")} ${plural$6(count, singular, pluralLabel)}`;
29110
29111
  }
29111
29112
  //#endregion
29112
29113
  //#region packages/core/dist/analyze/diagnosis-priorities.js
@@ -29428,7 +29429,7 @@ function analyzeSegmentRows(input) {
29428
29429
  }
29429
29430
  //#endregion
29430
29431
  //#region packages/core/dist/analyze/segment-impact-input.js
29431
- const DAY_MS = 864e5;
29432
+ const DAY_MS$1 = 864e5;
29432
29433
  const MAX_WINDOW_DAYS = 240;
29433
29434
  function subtractDays(value, days) {
29434
29435
  const date = /* @__PURE__ */ new Date(`${value}T00:00:00.000Z`);
@@ -29436,7 +29437,7 @@ function subtractDays(value, days) {
29436
29437
  return date.toISOString().slice(0, 10);
29437
29438
  }
29438
29439
  function segmentRangeDays(range) {
29439
- return Math.floor((Date.parse(`${range.endDate}T00:00:00.000Z`) - Date.parse(`${range.startDate}T00:00:00.000Z`)) / DAY_MS) + 1;
29440
+ return Math.floor((Date.parse(`${range.endDate}T00:00:00.000Z`) - Date.parse(`${range.startDate}T00:00:00.000Z`)) / DAY_MS$1) + 1;
29440
29441
  }
29441
29442
  function segmentComparisonRange(after, compareDays) {
29442
29443
  const endDate = subtractDays(after.startDate, 1);
@@ -29657,9 +29658,10 @@ function delimiterCount(line, delimiter) {
29657
29658
  let quoted = false;
29658
29659
  for (let index = 0; index < line.length; index += 1) {
29659
29660
  const character = line[index];
29660
- if (character === "\"") if (quoted && line[index + 1] === "\"") index += 1;
29661
- else quoted = !quoted;
29662
- else if (!quoted && character === delimiter) count += 1;
29661
+ if (character === "\"") {
29662
+ if (quoted && line[index + 1] === "\"") index += 1;
29663
+ else quoted = !quoted;
29664
+ } else if (!quoted && character === delimiter) count += 1;
29663
29665
  }
29664
29666
  return count;
29665
29667
  }
@@ -29686,9 +29688,10 @@ function decodeText(decoder, chunk, stream, label) {
29686
29688
  async function detectCsvDelimiter(path) {
29687
29689
  const handle = await open$1(path, "r");
29688
29690
  try {
29689
- const buffer = Buffer.alloc(64 * 1024);
29691
+ const buffer = Buffer.alloc(65536);
29690
29692
  const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
29691
- const firstRecord = new TextDecoder$1(await detectTextEncoding(path)).decode(buffer.subarray(0, bytesRead)).split(/\r?\n/u, 1)[0]?.replace(/^\uFEFF/u, "");
29693
+ const encoding = await detectTextEncoding(path);
29694
+ const firstRecord = new TextDecoder$1(encoding).decode(buffer.subarray(0, bytesRead)).split(/\r?\n/u, 1)[0]?.replace(/^\uFEFF/u, "");
29692
29695
  if (!firstRecord) return ",";
29693
29696
  const candidates = [
29694
29697
  ",",
@@ -29727,9 +29730,10 @@ async function* csvRecords(input) {
29727
29730
  quoted = false;
29728
29731
  pendingQuote = false;
29729
29732
  }
29730
- if (quoted) if (character === "\"") pendingQuote = true;
29731
- else field += character;
29732
- else if (character === "\"" && field.length === 0) quoted = true;
29733
+ if (quoted) {
29734
+ if (character === "\"") pendingQuote = true;
29735
+ else field += character;
29736
+ } else if (character === "\"" && field.length === 0) quoted = true;
29733
29737
  else if (character === delimiter) {
29734
29738
  record.push(field);
29735
29739
  field = "";
@@ -32803,7 +32807,7 @@ const INCIDENTS_URL = "https://status.search.google.com/incidents.json";
32803
32807
  async function fetchSearchStatusIncidents() {
32804
32808
  const response = await fetch$1(INCIDENTS_URL, { signal: AbortSignal.timeout(8e3) });
32805
32809
  if (!response.ok) throw new SeoError("OPTIONAL_PROVIDER_UNAVAILABLE", `Google Search Status fetch failed with ${response.status}.`);
32806
- return readJson(response, "Google Search Status", { maxBytes: 10 * 1024 * 1024 });
32810
+ return readJson(response, "Google Search Status", { maxBytes: 10485760 });
32807
32811
  }
32808
32812
  async function listSearchUpdates(input = {}) {
32809
32813
  return searchUpdatesFromIncidents(withRankingHistory(await fetchSearchStatusIncidents()), input);
@@ -32865,7 +32869,7 @@ function anomalyEvidence(anomaly) {
32865
32869
  if (anomaly.direction === "normal") return `${formatMetric(anomaly.metric)} changed ${changePhrase} (${anomaly.baselineMean.toLocaleString("en-GB")} -> ${anomaly.comparisonMean.toLocaleString("en-GB")} per observed day${anomaly.zScore === null ? "; the baseline had no observed variance" : `, z ${anomaly.zScore}`}).`;
32866
32870
  return `${formatMetric(anomaly.metric)} ${direction} ${changePhrase} (${anomaly.baselineMean.toLocaleString("en-GB")} -> ${anomaly.comparisonMean.toLocaleString("en-GB")} per observed day${anomaly.zScore === null ? "; outside the flat observed baseline" : `, z ${anomaly.zScore}`}).`;
32867
32871
  }
32868
- function plural$4(count, singular, pluralLabel = `${singular}s`) {
32872
+ function plural$5(count, singular, pluralLabel = `${singular}s`) {
32869
32873
  return count === 1 ? singular : pluralLabel;
32870
32874
  }
32871
32875
  function strongestSignal(anomalies) {
@@ -32921,13 +32925,13 @@ function interpretUpdateCorrelation(input) {
32921
32925
  summary,
32922
32926
  evidence: [
32923
32927
  ...input.anomalies.map(anomalyEvidence),
32924
- hasUpdate ? `${input.overlappingUpdates.length} official Google Ranking update ${plural$4(input.overlappingUpdates.length, "window")} overlapped the change date or comparison window: ${updateNames.join(", ")}.` : "No official Google Ranking update windows overlapped the change date or comparison window.",
32928
+ hasUpdate ? `${input.overlappingUpdates.length} official Google Ranking update ${plural$5(input.overlappingUpdates.length, "window")} overlapped the change date or comparison window: ${updateNames.join(", ")}.` : "No official Google Ranking update windows overlapped the change date or comparison window.",
32925
32929
  largeMovement ? "Both clicks and impressions moved sharply in the same direction." : "Clicks and impressions did not both meet the sharp-movement evidence threshold.",
32926
32930
  hasConfounders ? `Known overlapping site changes: ${confounders.map((confounder) => confounder.title).join("; ")}.` : "No overlapping site changes were supplied."
32927
32931
  ],
32928
32932
  caveats: [
32929
32933
  `GSC window: ${input.days} days; recent comparison window: ${input.recentDays} days.`,
32930
- `Update overlap padding: ${input.paddingDays} ${plural$4(input.paddingDays, "day")} either side of the step-change date, or of the recent comparison window when no step change was found.`,
32934
+ `Update overlap padding: ${input.paddingDays} ${plural$5(input.paddingDays, "day")} either side of the step-change date, or of the recent comparison window when no step change was found.`,
32931
32935
  input.refresh ? "Data freshness: cache bypassed for GSC data." : "Data freshness: local GSC cache may have been used.",
32932
32936
  "Source: official Google Search Status Dashboard Ranking incidents only; third-party volatility and unconfirmed chatter are not included.",
32933
32937
  "An update-window overlap cannot establish causation, even when movement is large and no known site change was recorded.",
@@ -33095,7 +33099,7 @@ function analyzeTrafficAnomalyRows(input) {
33095
33099
  if (step && changeDate) {
33096
33100
  const previousDate = aggregated.rows[step.index - 1]?.keys[0];
33097
33101
  const gap = previousDate ? calendarDays(previousDate, changeDate) - 2 : 0;
33098
- stepCaveats.push(`${formatMetric(metric)} changed level on ${changeDate}, so its baseline is every observed day before that date and its comparison is every observed day from it.`, ...gap > 0 ? [`The ${metric} change date follows ${gap} missing ${plural$4(gap, "day")}; the change may have started on one of them.`] : []);
33102
+ stepCaveats.push(`${formatMetric(metric)} changed level on ${changeDate}, so its baseline is every observed day before that date and its comparison is every observed day from it.`, ...gap > 0 ? [`The ${metric} change date follows ${gap} missing ${plural$5(gap, "day")}; the change may have started on one of them.`] : []);
33099
33103
  return compareSegments({
33100
33104
  site: input.site,
33101
33105
  metric,
@@ -33126,9 +33130,9 @@ function analyzeTrafficAnomalyRows(input) {
33126
33130
  const comparisonMissingDays = input.recentDays - comparisonRows.length;
33127
33131
  const missingDays = expectedDays - aggregated.rows.length;
33128
33132
  const caveats = [
33129
- ...missingDays > 0 ? [`${missingDays} requested calendar ${plural$4(missingDays, "day")} had no returned date aggregate and ${missingDays === 1 ? "was" : "were"} not filled with zeros.`] : [],
33130
- ...aggregated.invalidRows > 0 ? [`${aggregated.invalidRows} invalid provider ${plural$4(aggregated.invalidRows, "row")} ${aggregated.invalidRows === 1 ? "was" : "were"} excluded.`] : [],
33131
- ...aggregated.duplicateRows > 0 ? [`${aggregated.duplicateRows} duplicate date ${plural$4(aggregated.duplicateRows, "row")} ${aggregated.duplicateRows === 1 ? "was" : "were"} aggregated before analysis.`] : [],
33133
+ ...missingDays > 0 ? [`${missingDays} requested calendar ${plural$5(missingDays, "day")} had no returned date aggregate and ${missingDays === 1 ? "was" : "were"} not filled with zeros.`] : [],
33134
+ ...aggregated.invalidRows > 0 ? [`${aggregated.invalidRows} invalid provider ${plural$5(aggregated.invalidRows, "row")} ${aggregated.invalidRows === 1 ? "was" : "were"} excluded.`] : [],
33135
+ ...aggregated.duplicateRows > 0 ? [`${aggregated.duplicateRows} duplicate date ${plural$5(aggregated.duplicateRows, "row")} ${aggregated.duplicateRows === 1 ? "was" : "were"} aggregated before analysis.`] : [],
33132
33136
  ...stepCaveats
33133
33137
  ];
33134
33138
  return {
@@ -33812,7 +33816,7 @@ var DecisionModelError = class extends Error {
33812
33816
  const TYPESAFE_URL = "https://api.typesafe.ai/v1/systemone";
33813
33817
  const JEV_PRICE_PER_MILLION = .042;
33814
33818
  const REQUEST_TIMEOUT_MS = 6e4;
33815
- const MAX_RESPONSE_BYTES = 1024 * 1024;
33819
+ const MAX_RESPONSE_BYTES = 1048576;
33816
33820
  function retryAfter(response) {
33817
33821
  const value = Number(response.headers.get("retry-after"));
33818
33822
  return Number.isFinite(value) && value > 0 ? Math.min(value, 30) * 1e3 : void 0;
@@ -34150,7 +34154,7 @@ function keyTerms(page) {
34150
34154
  const title = page.title.replace(/\s+[|\u2013\u2014-]\s+[^|\u2013\u2014]*$/u, "");
34151
34155
  for (const term of terms(page.description)) key.set(term, 1);
34152
34156
  for (const term of terms(`${title} ${page.h1} ${lastSegmentWords(page.url)}`)) key.set(term, NAME_WEIGHT);
34153
- for (const term of terms(siteName(page.url))) key.delete(term);
34157
+ for (const term of terms(siteName$1(page.url))) key.delete(term);
34154
34158
  return key;
34155
34159
  }
34156
34160
  function lastSegmentWords(url) {
@@ -34160,7 +34164,7 @@ function lastSegmentWords(url) {
34160
34164
  return "";
34161
34165
  }
34162
34166
  }
34163
- function siteName(url) {
34167
+ function siteName$1(url) {
34164
34168
  try {
34165
34169
  return new URL(url).hostname.replace(/^www\./u, "").split(".")[0] ?? "";
34166
34170
  } catch {
@@ -35037,15 +35041,15 @@ function internalLinksReportRange(input, fallbackDays, now) {
35037
35041
  days: Math.round((Date.parse(`${endDate}T00:00:00Z`) - Date.parse(`${startDate}T00:00:00Z`)) / DAY$1) + 1
35038
35042
  };
35039
35043
  }
35040
- const plural$3 = (count, word) => `${count} ${word}${count === 1 ? "" : "s"}`;
35044
+ const plural$4 = (count, word) => `${count} ${word}${count === 1 ? "" : "s"}`;
35041
35045
  function internalLinksVerdict(report) {
35042
35046
  const { counts } = report;
35043
35047
  if (report.dataStatus === "blocked") return "robots.txt does not allow this crawler to read the site, so nothing was checked.";
35044
35048
  if (report.dataStatus === "empty") return "No HTML page could be crawled, so there is nothing to link.";
35045
35049
  if (report.dataStatus === "target-not-crawled") return "The target page could not be crawled as its own page (it failed, left the site, or names another page as canonical). Check it with seo page first.";
35046
35050
  if (report.dataStatus === "target-not-linkable") return `The target is ${report.target?.noindex ? "noindex" : `a ${report.target?.type?.replaceAll("_", " ")} page`}, so no links to it are suggested.`;
35047
- const judged = report.judge.status === "used" || report.judge.status === "partial" ? `${counts.strong} strong and ${counts.possible} possible link${counts.strong + counts.possible === 1 ? "" : "s"} judged by ${report.judge.model}${counts.heuristic ? `, plus ${plural$3(counts.heuristic, "heuristic link")} where a request failed` : ""}` : `${plural$3(counts.heuristic, "heuristic link")} (no decision model)`;
35048
- const scope = report.mode === "url" ? `to ${report.target?.url}` : `across ${plural$3(counts.pagesCrawled, "page")}`;
35051
+ const judged = report.judge.status === "used" || report.judge.status === "partial" ? `${counts.strong} strong and ${counts.possible} possible link${counts.strong + counts.possible === 1 ? "" : "s"} judged by ${report.judge.model}${counts.heuristic ? `, plus ${plural$4(counts.heuristic, "heuristic link")} where a request failed` : ""}` : `${plural$4(counts.heuristic, "heuristic link")} (no decision model)`;
35052
+ const scope = report.mode === "url" ? `to ${report.target?.url}` : `across ${plural$4(counts.pagesCrawled, "page")}`;
35049
35053
  const capped = report.crawl.capReached ? ` The crawl stopped at its limit of ${report.crawl.pageLimit} pages, so pages beyond it were not checked.` : "";
35050
35054
  return `${judged} ${scope}${counts.heldBack ? `; ${counts.heldBack} held back by the evidence floors` : ""}.${capped}`;
35051
35055
  }
@@ -36850,7 +36854,7 @@ async function runLighthouse(input) {
36850
36854
  ], {
36851
36855
  env: lighthouseEnvironment(),
36852
36856
  timeout: input.timeoutMs ?? 12e4,
36853
- maxBuffer: 30 * 1024 * 1024
36857
+ maxBuffer: 31457280
36854
36858
  });
36855
36859
  const jsonStart = stdout.indexOf("{");
36856
36860
  if (jsonStart < 0) throw new LighthouseRunError("invalid_result");
@@ -37483,14 +37487,14 @@ function* retainedQueryClusterRows(input) {
37483
37487
  };
37484
37488
  }
37485
37489
  }
37486
- function plural$2(count, singular, pluralLabel = `${singular}s`) {
37490
+ function plural$3(count, singular, pluralLabel = `${singular}s`) {
37487
37491
  return count === 1 ? singular : pluralLabel;
37488
37492
  }
37489
37493
  function reportVerdict(input) {
37490
37494
  if (!input.clusters.length) return "No query clusters were generated for this scope.";
37491
37495
  if (input.highOpportunityClusters > 0) {
37492
37496
  const verb = input.highOpportunityClusters === 1 ? "has" : "have";
37493
- return `${input.highOpportunityClusters} ${plural$2(input.highOpportunityClusters, "cluster")} ${verb} enough demand and weak enough performance to review first.`;
37497
+ return `${input.highOpportunityClusters} ${plural$3(input.highOpportunityClusters, "cluster")} ${verb} enough demand and weak enough performance to review first.`;
37494
37498
  }
37495
37499
  return "No obvious high-opportunity clusters were found. Use this report for content structure and intent mapping rather than urgent fixes.";
37496
37500
  }
@@ -37631,7 +37635,7 @@ function movementLine(report) {
37631
37635
  }
37632
37636
  function countPhrase(count, singular, pluralLabel = `${singular}s`) {
37633
37637
  if (count === 0) return `no ${pluralLabel}`;
37634
- return `${count} ${plural$1(count, singular, pluralLabel)}`;
37638
+ return `${count} ${plural$2(count, singular, pluralLabel)}`;
37635
37639
  }
37636
37640
  function headlineLine(report) {
37637
37641
  const parts = [
@@ -37686,7 +37690,7 @@ function decayDiagnosisLabel(diagnosis) {
37686
37690
  if (diagnosis === "lost_clicks") return "clicks dropped without one dominant signal";
37687
37691
  return diagnosis.replaceAll("_", " ");
37688
37692
  }
37689
- function plural$1(count, singular, pluralLabel = `${singular}s`) {
37693
+ function plural$2(count, singular, pluralLabel = `${singular}s`) {
37690
37694
  return count === 1 ? singular : pluralLabel;
37691
37695
  }
37692
37696
  function decayClusterLine(report) {
@@ -37694,7 +37698,7 @@ function decayClusterLine(report) {
37694
37698
  if (!group) return "No material decay cluster stood out.";
37695
37699
  const diagnosis = decayDiagnosisLabel(group.diagnosis);
37696
37700
  const samples = group.sampleQueries.slice(0, 2).join("; ");
37697
- return `Top decay cluster: ${group.count} ${plural$1(group.count, "finding")} in the ${group.template.label} template (${diagnosis}), ${group.totalClickLoss.toFixed(0)} fewer observed clicks across rows retained in both windows. Action: ${group.recommendation}${samples ? ` Example queries: ${samples}.` : ""}`;
37701
+ return `Top decay cluster: ${group.count} ${plural$2(group.count, "finding")} in the ${group.template.label} template (${diagnosis}), ${group.totalClickLoss.toFixed(0)} fewer observed clicks across rows retained in both windows. Action: ${group.recommendation}${samples ? ` Example queries: ${samples}.` : ""}`;
37698
37702
  }
37699
37703
  function cannibalSuppressionLine(report) {
37700
37704
  const suppressed = report.cannibalization.selection.suppressedQueries;
@@ -37712,21 +37716,21 @@ function contentOpportunityBullets(report) {
37712
37716
  if (unavailableSections.length) bullets.push(`Could not assess ${unavailableSections.join(", ")} opportunities in this run; see report caveats.`);
37713
37717
  if (report.summary.decayItems) {
37714
37718
  const top = report.decay.items[0];
37715
- bullets.push(top ? `${report.summary.decayItems} observed retained query/page ${plural$1(report.summary.decayItems, "decline")} need review. Start with "${top.query}" on ${top.url}; it had ${top.clickLoss.toFixed(0)} fewer clicks.` : `${report.summary.decayItems} observed retained query/page ${plural$1(report.summary.decayItems, "decline")} need review.`);
37719
+ bullets.push(top ? `${report.summary.decayItems} observed retained query/page ${plural$2(report.summary.decayItems, "decline")} need review. Start with "${top.query}" on ${top.url}; it had ${top.clickLoss.toFixed(0)} fewer clicks.` : `${report.summary.decayItems} observed retained query/page ${plural$2(report.summary.decayItems, "decline")} need review.`);
37716
37720
  bullets.push(decayClusterLine(report));
37717
37721
  }
37718
37722
  if (report.summary.cannibalItems) {
37719
37723
  const top = report.cannibalization.items[0];
37720
- bullets.push(top ? `${report.summary.cannibalItems} multi-URL query ${plural$1(report.summary.cannibalItems, "candidate")} need intent and technical review. Start with "${top.query}" and decide whether ${top.pages.length} ranking URLs answer the same intent.` : `${report.summary.cannibalItems} multi-URL query ${plural$1(report.summary.cannibalItems, "candidate")} need intent and technical review.`);
37724
+ bullets.push(top ? `${report.summary.cannibalItems} multi-URL query ${plural$2(report.summary.cannibalItems, "candidate")} need intent and technical review. Start with "${top.query}" and decide whether ${top.pages.length} ranking URLs answer the same intent.` : `${report.summary.cannibalItems} multi-URL query ${plural$2(report.summary.cannibalItems, "candidate")} need intent and technical review.`);
37721
37725
  }
37722
37726
  if (report.cannibalization.selection.suppressedQueries) bullets.push(cannibalSuppressionLine(report));
37723
37727
  if (report.summary.strikingDistanceItems) {
37724
37728
  const top = report.strikingDistance.items[0];
37725
- bullets.push(top ? `${countLabel(report.summary.strikingDistanceItems, "query/page candidate")} ${plural$1(report.summary.strikingDistanceItems, "has", "have")} an average GSC position above 10 and at most 20. Start by investigating "${top.query}" on ${top.url}; it averages position ${top.position.toFixed(1)} with ${top.impressions.toFixed(0)} impressions.` : `${countLabel(report.summary.strikingDistanceItems, "query/page candidate")} ${plural$1(report.summary.strikingDistanceItems, "has", "have")} an average GSC position above 10 and at most 20.`);
37729
+ bullets.push(top ? `${countLabel(report.summary.strikingDistanceItems, "query/page candidate")} ${plural$2(report.summary.strikingDistanceItems, "has", "have")} an average GSC position above 10 and at most 20. Start by investigating "${top.query}" on ${top.url}; it averages position ${top.position.toFixed(1)} with ${top.impressions.toFixed(0)} impressions.` : `${countLabel(report.summary.strikingDistanceItems, "query/page candidate")} ${plural$2(report.summary.strikingDistanceItems, "has", "have")} an average GSC position above 10 and at most 20.`);
37726
37730
  }
37727
37731
  if (!skippedReason(report, "quick-win opportunities") && report.summary.quickWinItems) {
37728
37732
  const top = report.quickWins.items[0];
37729
- bullets.push(top ? `${report.summary.quickWinItems} retained query/page ${plural$1(report.summary.quickWinItems, "candidate")} fell below a site-peer or versioned heuristic CTR target. Start with "${top.query}" on ${top.url}; it had ${top.impressions.toFixed(0)} impressions at average position ${top.position.toFixed(1)}.` : `${report.summary.quickWinItems} CTR-target ${plural$1(report.summary.quickWinItems, "candidate")} need review.`);
37733
+ bullets.push(top ? `${report.summary.quickWinItems} retained query/page ${plural$2(report.summary.quickWinItems, "candidate")} fell below a site-peer or versioned heuristic CTR target. Start with "${top.query}" on ${top.url}; it had ${top.impressions.toFixed(0)} impressions at average position ${top.position.toFixed(1)}.` : `${report.summary.quickWinItems} CTR-target ${plural$2(report.summary.quickWinItems, "candidate")} need review.`);
37730
37734
  }
37731
37735
  const templateLine = templateOpportunityLine(report);
37732
37736
  if (!templateLine.startsWith("No dominant")) bullets.push(templateLine);
@@ -38086,10 +38090,10 @@ function applyVerification(item, coverage) {
38086
38090
  function verdict(report) {
38087
38091
  if (report.dataStatus === "empty") return "Google Search Console returned no retained query/page rows for this window.";
38088
38092
  if (report.dataStatus === "filtered") return "No pages met the position, brand, and minimum-impression criteria.";
38089
- if (report.technical > 0) return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.technical, "returned page")} ${plural$5(report.technical, "has", "have")} verified technical issues to fix before content changes.`;
38090
- if (report.failed > 0) return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.failed, "returned page")} could not be verified and ${plural$5(report.failed, "needs", "need")} a fetch check before content changes.`;
38091
- if (report.content > 0) return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.content, "returned page")} ${plural$5(report.content, "has", "have")} verified content or search-framing gaps.`;
38092
- return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.returned, "page")} ${plural$5(report.returned, "is", "are")} returned in priority order for investigation.`;
38093
+ if (report.technical > 0) return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.technical, "returned page")} ${plural$6(report.technical, "has", "have")} verified technical issues to fix before content changes.`;
38094
+ if (report.failed > 0) return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.failed, "returned page")} could not be verified and ${plural$6(report.failed, "needs", "need")} a fetch check before content changes.`;
38095
+ if (report.content > 0) return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.content, "returned page")} ${plural$6(report.content, "has", "have")} verified content or search-framing gaps.`;
38096
+ return `${countLabel(report.eligible, "eligible average-position page")} found; ${countLabel(report.returned, "page")} ${plural$6(report.returned, "is", "are")} returned in priority order for investigation.`;
38093
38097
  }
38094
38098
  function reportRecommendations(items) {
38095
38099
  const first = items[0];
@@ -39204,7 +39208,7 @@ async function clickyDomain(site) {
39204
39208
  }
39205
39209
  //#endregion
39206
39210
  //#region packages/core/dist/analyze/ai-queries.js
39207
- const RULES$1 = [
39211
+ const RULES = [
39208
39212
  ["agent_prompt", "^(search the web for|browse the web|find sources)|do not invent|return the [0-9]+ most relevant|include source urls|context: location|do not include location|question: |reply only with|the model you are using"],
39209
39213
  ["tracker", "\\. ?my location is |\\?\\. ?my( |$)|^evaluate the .+ on "],
39210
39214
  ["reply", "^(yes|yeah|yep|ok|okay|sure|yes please|go on|continue|keep going|tell me more|why not|how so|really|exactly|show me|and then|thanks|thank you|got it|what else|anything else)[?!.,]*$"],
@@ -39222,8 +39226,8 @@ const AI_QUERY_KINDS = {
39222
39226
  chat: "chat phrasing, such as \"can you\" or \"should i\"",
39223
39227
  long: "ten or more words with no other sign"
39224
39228
  };
39225
- const MATCHERS = RULES$1.map(([kind, pattern]) => [kind, new RegExp(pattern)]);
39226
- const AI_QUERY_PATTERN = RULES$1.map(([, pattern]) => `(?:${pattern})`).join("|");
39229
+ const MATCHERS = RULES.map(([kind, pattern]) => [kind, new RegExp(pattern)]);
39230
+ const AI_QUERY_PATTERN = RULES.map(([, pattern]) => `(?:${pattern})`).join("|");
39227
39231
  const NOISE = [
39228
39232
  ["spaced_letters", /(^|\s)(\S\s){3,}\S(\s|$)/u],
39229
39233
  ["broken_encoding", /^(яю|ÿþ|þÿ)|&#[0-9]+;?|&[a-z]+;|[âÃÂ][\u0080-\u00bf€™œ“”]|\ufffd/u],
@@ -39797,15 +39801,15 @@ async function runRows(input, deps) {
39797
39801
  };
39798
39802
  }
39799
39803
  const QUESTION_DAYS = 90;
39800
- const list = (value) => Array.isArray(value) ? value : [];
39804
+ const list$1 = (value) => Array.isArray(value) ? value : [];
39801
39805
  const urls = (items) => items.map((item) => item.url).filter((url) => typeof url === "string");
39802
39806
  const overview = (result) => {
39803
- const block = list(result.items).find((item) => item.type === "ai_overview");
39807
+ const block = list$1(result.items).find((item) => item.type === "ai_overview");
39804
39808
  if (!block) return null;
39805
- const parts = list(block.items);
39809
+ const parts = list$1(block.items);
39806
39810
  return {
39807
39811
  markdown: typeof block.markdown === "string" ? block.markdown : parts.map((part) => String(part.markdown ?? "")).join("\n"),
39808
- sources: urls([...list(block.references), ...parts.flatMap((part) => list(part.references))]),
39812
+ sources: urls([...list$1(block.references), ...parts.flatMap((part) => list$1(part.references))]),
39809
39813
  model: null
39810
39814
  };
39811
39815
  };
@@ -39821,7 +39825,7 @@ const ENGINES = [
39821
39825
  }),
39822
39826
  shown: (result) => {
39823
39827
  const markdown = typeof result.markdown === "string" ? result.markdown : "";
39824
- const sources = urls(list(result.sources));
39828
+ const sources = urls(list$1(result.sources));
39825
39829
  if (!markdown && !sources.length) return null;
39826
39830
  return {
39827
39831
  markdown,
@@ -40400,7 +40404,7 @@ async function analyticsBeside(access, site, range, before, pages) {
40400
40404
  //#region packages/core/dist/commands/audit.js
40401
40405
  const AUDIT_SECTION = "weekly-audit";
40402
40406
  const AUDIT_SECTION_TEXT = "What the weekly crawl of the site found (broken and redirected internal links, missing or duplicate titles, descriptions and H1s, noindex, canonicals to another page, sitemap URLs that do not return 200, thin pages), with what is new, back or resolved since the crawl before. Only for sites added to the weekly site audit beta.";
40403
- const RULES = {
40407
+ const AUDIT_RULES = {
40404
40408
  link_to_error: "Internal links to a page that returns an error",
40405
40409
  link_to_redirect: "Internal links to a redirect",
40406
40410
  link_failed: "Internal links to a page that could not be fetched",
@@ -40557,7 +40561,7 @@ function runAuditReport(input, snapshot, call) {
40557
40561
  text: [
40558
40562
  head,
40559
40563
  indexText,
40560
- byRule.length ? ["finding | open | what it is", ...byRule.map(([rule, count]) => `${rule} | ${count} | ${RULES[rule] ?? rule}`)].join("\n") : "No findings in this crawl.",
40564
+ byRule.length ? ["finding | open | what it is", ...byRule.map(([rule, count]) => `${rule} | ${count} | ${AUDIT_RULES[rule] ?? rule}`)].join("\n") : "No findings in this crawl.",
40561
40565
  fresh.length ? `New, back or resolved this week, 1 to ${Math.min(SUMMARY_ROWS$1, fresh.length)} of ${fresh.length}:\n${table(fresh.slice(0, SUMMARY_ROWS$1), origin, since)}` : previous ? "Nothing new, back or resolved since the crawl before." : null,
40562
40566
  changes.compared ? `Between the two crawls: ${changes.new_urls} new URLs, ${changes.gone_urls} gone, ${changes.status_changed} changed status, ${changes.title_changed} changed title.` : null,
40563
40567
  `More: ${call("report", {
@@ -40582,9 +40586,9 @@ function auditPreview(snapshot) {
40582
40586
  const index = snapshot.index_changes;
40583
40587
  return `${index && (index.dropped || index.returned) ? `${index.dropped} URLs dropped out of Google's index this week and ${index.returned} came back. ` : ""}Last crawl ${day$1(snapshot.finished_at)}: ${findings.open} open findings, ${findings.new + findings.reopened} new or back, ${findings.resolved} resolved.`;
40584
40588
  }
40585
- const WEEK_MS = 7 * 864e5;
40589
+ const WEEK_MS = 6048e5;
40586
40590
  const day = (ms) => ms === null ? "" : new Date(ms).toISOString().slice(0, 10);
40587
- const count$1 = (value) => value.toLocaleString("en-US");
40591
+ const count$2 = (value) => value.toLocaleString("en-US");
40588
40592
  function relative$1(value, origin) {
40589
40593
  if (!value) return "";
40590
40594
  return origin && value.startsWith(origin) ? value.slice(origin.length) || "/" : value;
@@ -40605,7 +40609,7 @@ function rowsTable(rows, checks) {
40605
40609
  changed(row) ? row.prev_coverage ?? "" : "",
40606
40610
  changed(row) ? day(row.changed_at) : "",
40607
40611
  day(row.checked_at),
40608
- `${count$1(row.clicks)} (${count$1(row.previous_clicks)})${row.lost ? " lost" : ""}`,
40612
+ `${count$2(row.clicks)} (${count$2(row.previous_clicks)})${row.lost ? " lost" : ""}`,
40609
40613
  row.in_sitemap ? "yes" : "no",
40610
40614
  row.google_canonical && row.google_canonical !== row.url ? relative$1(row.google_canonical, checks.origin) : "",
40611
40615
  row.error ?? ""
@@ -40613,12 +40617,12 @@ function rowsTable(rows, checks) {
40613
40617
  }
40614
40618
  function head(site, checks) {
40615
40619
  const { queued } = checks;
40616
- const quota = checks.properties.map((item) => `${item.property} (${count$1(item.urls)} URLs: ${count$1(item.top)} top pages checked daily, the rest every ${item.cycle_days === 1 ? "day" : `${item.cycle_days} days`}; ${count$1(item.used_today)} of ${count$1(checks.per_day)} checks used today)`).join(", ");
40620
+ const quota = checks.properties.map((item) => `${item.property} (${count$2(item.urls)} URLs: ${count$2(item.top)} top pages checked daily, the rest every ${item.cycle_days === 1 ? "day" : `${item.cycle_days} days`}; ${count$2(item.used_today)} of ${count$2(checks.per_day)} checks used today)`).join(", ");
40617
40621
  return [
40618
40622
  `Google indexing of ${site}, from the URL Inspection results this server keeps for it (as of ${new Date(checks.as_of).toISOString().slice(0, 16).replace("T", " ")} UTC).`,
40619
- checks.dropped_this_week || checks.returned_this_week ? `In the last 7 days ${count$1(checks.dropped_this_week)} ${checks.dropped_this_week === 1 ? "URL" : "URLs"} dropped out of Google's index and ${count$1(checks.returned_this_week)} came back; they are listed first. A top page's drop counts only after a second check an hour later.` : null,
40620
- `Covered: ${count$1(checks.covered)} of ${count$1(checks.known)} known URLs have a current result. Known URLs are the sitemap's, the crawl's and the Search Console pages with clicks or impressions. Each property spends its full ${count$1(checks.per_day)} checks a day: its top pages (lost clicks, then clicks, then impressions, up to ${count$1(checks.top_per_day)}) daily, the rest as often as the quota allows, and a page the weekly crawl saw change at once.`,
40621
- queued.total ? `Queued: ${count$1(queued.total)} (${count$1(queued.lost)} pages that lost their clicks, ${count$1(queued.search)} with clicks or impressions, ${count$1(queued.sitemap)} sitemap URLs never checked, ${count$1(queued.stale)} older or changed), checked in that order. Time left: ${etaText(checks.eta_hours)}, at up to ${count$1(checks.per_day)} checks a day per property, spread over the day.` : "Queued: nothing; every known URL has a current result.",
40623
+ checks.dropped_this_week || checks.returned_this_week ? `In the last 7 days ${count$2(checks.dropped_this_week)} ${checks.dropped_this_week === 1 ? "URL" : "URLs"} dropped out of Google's index and ${count$2(checks.returned_this_week)} came back; they are listed first. A top page's drop counts only after a second check an hour later.` : null,
40624
+ `Covered: ${count$2(checks.covered)} of ${count$2(checks.known)} known URLs have a current result. Known URLs are the sitemap's, the crawl's and the Search Console pages with clicks or impressions. Each property spends its full ${count$2(checks.per_day)} checks a day: its top pages (lost clicks, then clicks, then impressions, up to ${count$2(checks.top_per_day)}) daily, the rest as often as the quota allows, and a page the weekly crawl saw change at once.`,
40625
+ queued.total ? `Queued: ${count$2(queued.total)} (${count$2(queued.lost)} pages that lost their clicks, ${count$2(queued.search)} with clicks or impressions, ${count$2(queued.sitemap)} sitemap URLs never checked, ${count$2(queued.stale)} older or changed), checked in that order. Time left: ${etaText(checks.eta_hours)}, at up to ${count$2(checks.per_day)} checks a day per property, spread over the day.` : "Queued: nothing; every known URL has a current result.",
40622
40626
  quota ? `Checked through ${quota}.` : null,
40623
40627
  checks.stopped ? `Checks stopped early: ${checks.stopped}` : null,
40624
40628
  "A URL without a result has none here, so this is not an all-clear for it."
@@ -40627,9 +40631,9 @@ function head(site, checks) {
40627
40631
  function suggestionsText(checks) {
40628
40632
  if (!checks.suggestions.length) return null;
40629
40633
  return [
40630
- `The sitemap has more URLs than these properties can check every 7 days. Each Search Console property gets its own ${count$1(checks.per_day)} checks a day, so adding these folders as URL-prefix properties (on the same Google account) would check more:`,
40634
+ `The sitemap has more URLs than these properties can check every 7 days. Each Search Console property gets its own ${count$2(checks.per_day)} checks a day, so adding these folders as URL-prefix properties (on the same Google account) would check more:`,
40631
40635
  "property to add | sitemap URLs in it | more URLs checked a week",
40632
- ...checks.suggestions.map((item) => `${item.property} | ${count$1(item.urls)} | ${count$1(item.gain)}`),
40636
+ ...checks.suggestions.map((item) => `${item.property} | ${count$2(item.urls)} | ${count$2(item.gain)}`),
40633
40637
  "The next day the checks find a new property in Search Console and use its quota for the URLs in that folder."
40634
40638
  ].join("\n");
40635
40639
  }
@@ -40644,7 +40648,7 @@ function runAuditChecks(input, checks, call) {
40644
40648
  data: checks
40645
40649
  };
40646
40650
  if (!checks.started) return {
40647
- text: `${site} is in the weekly site audit, and its Google checks are starting now: pages that lost their clicks first, then pages by clicks and impressions, then sitemap URLs. ${checks.known ? `${count$1(checks.known)} URLs are known so far. ` : ""}Run ${call("index", { site })} again in a few minutes for the coverage and the time left.`,
40651
+ text: `${site} is in the weekly site audit, and its Google checks are starting now: pages that lost their clicks first, then pages by clicks and impressions, then sitemap URLs. ${checks.known ? `${count$2(checks.known)} URLs are known so far. ` : ""}Run ${call("index", { site })} again in a few minutes for the coverage and the time left.`,
40648
40652
  data: checks
40649
40653
  };
40650
40654
  const more = (offset) => input.paged ? `More: ${call("index", {
@@ -40668,7 +40672,7 @@ function runAuditChecks(input, checks, call) {
40668
40672
  const reasons = checks.reasons.length ? [
40669
40673
  "Google's reason at each URL's latest check:",
40670
40674
  "reason | verdict | urls | changed to it this week",
40671
- ...checks.reasons.map((item) => `${item.coverage ?? ""} | ${item.verdict ?? ""} | ${count$1(item.urls)} | ${count$1(item.changed_this_week)}`)
40675
+ ...checks.reasons.map((item) => `${item.coverage ?? ""} | ${item.verdict ?? ""} | ${count$2(item.urls)} | ${count$2(item.changed_this_week)}`)
40672
40676
  ].join("\n") : "No URL has a result yet.";
40673
40677
  const shown = checks.rows.slice(0, 20);
40674
40678
  return {
@@ -41078,13 +41082,13 @@ function clickyRange(input) {
41078
41082
  endDate: input.endDate
41079
41083
  };
41080
41084
  }
41081
- const count = (item) => {
41085
+ const count$1 = (item) => {
41082
41086
  const value = Number(item.value);
41083
41087
  return Number.isSafeInteger(value) && value >= 0 ? value : null;
41084
41088
  };
41085
41089
  const totals = (items) => items.map((item) => ({
41086
41090
  name: item.title ?? "",
41087
- visits: count(item)
41091
+ visits: count$1(item)
41088
41092
  })).filter((item) => Boolean(item.name) && item.visits !== null);
41089
41093
  const line = (items) => {
41090
41094
  const top = items.slice(0, 10).map((item) => `${item.name} ${item.visits}`);
@@ -41115,7 +41119,7 @@ async function runClickyRows(input, keys, options) {
41115
41119
  const entrances = stats["pages-entrance"] ?? [];
41116
41120
  const visitsByPage = /* @__PURE__ */ new Map();
41117
41121
  for (const item of entrances) {
41118
- const visits = count(item);
41122
+ const visits = count$1(item);
41119
41123
  if (visits === null || !item.url) continue;
41120
41124
  let page;
41121
41125
  try {
@@ -41166,7 +41170,7 @@ async function runClickyRows(input, keys, options) {
41166
41170
  const DR_ATTRIBUTION = "domain_rating: Domain Rating by Ahrefs (https://ahrefs.com/).";
41167
41171
  const ENDPOINT = "https://api.ahrefs.com/v3/public/domain-rating-free";
41168
41172
  const MAX_DOMAINS = 25;
41169
- const TTL_SECONDS = 1440 * 60;
41173
+ const TTL_SECONDS = 86400;
41170
41174
  const DOMAIN_FIELDS = [
41171
41175
  "domain",
41172
41176
  "competitor_domain",
@@ -41273,14 +41277,14 @@ const samePath = (a, b) => {
41273
41277
  return from.pathname === to.pathname && from.search === to.search;
41274
41278
  };
41275
41279
  const authPath = (url) => AUTH_SEGMENTS.has(new URL(url).pathname.split("/")[1]?.toLowerCase() ?? "");
41276
- const plural = (count, word) => `${count} ${word}${count === 1 ? "" : "s"}`;
41280
+ const plural$1 = (count, word) => `${count} ${word}${count === 1 ? "" : "s"}`;
41277
41281
  function labelOf(e) {
41278
41282
  const { url, status, live } = e;
41279
41283
  const { first, hops, last } = live;
41280
41284
  const indexed = status.verdict === "PASS";
41281
41285
  const coverage = status.coverage ?? "";
41282
41286
  const referring = status.referring_urls.filter((item) => item !== url && sameSite(item, url) && !samePath(item, url));
41283
- const pointers = [e.inSitemap ? "the sitemap lists it" : null, referring.length ? `Google lists ${plural(referring.length, "referring page")} on this site as of its last crawl (${referring[0]}${referring.length > 1 ? ", and more" : ""})` : null].filter(Boolean);
41287
+ const pointers = [e.inSitemap ? "the sitemap lists it" : null, referring.length ? `Google lists ${plural$1(referring.length, "referring page")} on this site as of its last crawl (${referring[0]}${referring.length > 1 ? ", and more" : ""})` : null].filter(Boolean);
41284
41288
  if (first.error) return indexed ? {
41285
41289
  label: "indexed",
41286
41290
  why: `Google indexes it. The live check failed (${first.error}).`
@@ -41562,20 +41566,20 @@ function indexingText(site, run, page, origin, askMore, now) {
41562
41566
  const sources = [
41563
41567
  `lost-click pages ${n(known.lostClicks)}`,
41564
41568
  `Search Console pages with impressions in the last 28 days ${n(known.searchConsole)}${known.searchConsoleCapped ? ", capped" : ""}`,
41565
- `sitemap ${n(known.sitemap.urls.length)} from ${plural(known.sitemap.files, "file")}${known.sitemap.partial ? ", partial" : ""}`
41569
+ `sitemap ${n(known.sitemap.urls.length)} from ${plural$1(known.sitemap.files, "file")}${known.sitemap.partial ? ", partial" : ""}`
41566
41570
  ];
41567
41571
  const lowerBound = known.sitemap.partial || known.searchConsoleCapped ? " at least" : "";
41568
41572
  const asked = run.inspected - run.fromSaved;
41569
41573
  const most = Math.min(total, MAX_INSPECT_LIMIT, run.quota ? run.inspected + run.quota.limit - run.quota.used - asked : MAX_INSPECT_LIMIT);
41570
41574
  const days = run.oldestSaved ? Math.floor((now.getTime() - Date.parse(run.oldestSaved)) / 864e5) : 0;
41571
- const savedNote = run.fromSaved ? ` (${n(asked)} asked of Google now, ${n(run.fromSaved)} from saved results; the oldest was inspected ${run.oldestSaved?.slice(0, 16).replace("T", " ")} UTC, ${days === 0 ? "under a day" : plural(days, "day")} ago. Saved results are reused for 7 days)` : "";
41575
+ const savedNote = run.fromSaved ? ` (${n(asked)} asked of Google now, ${n(run.fromSaved)} from saved results; the oldest was inspected ${run.oldestSaved?.slice(0, 16).replace("T", " ")} UTC, ${days === 0 ? "under a day" : plural$1(days, "day")} ago. Saved results are reused for 7 days)` : "";
41572
41576
  const stop = run.stoppedBy === "quota" ? "The URL Inspection quota stopped it." : run.stoppedBy === "limit" ? `It stopped at ${n(run.limit)}, the number of inspections for this run${askMore && most > run.limit ? `; to inspect more, up to the quota left today: ${askMore(most)}` : ""}.` : "Every known URL has a result.";
41573
41577
  const lines = [
41574
41578
  `Google's indexing reasons for ${site}, from URL Inspection. Search Console's Page indexing report has no API, so known URLs are inspected one at a time, in a fixed order (lost-click pages, Search Console pages by clicks then impressions, sitemap URLs, then the rest), and checked live from here.`,
41575
41579
  `Known URLs:${lowerBound} ${n(total)} (${sources.join("; ")}). Inspected ${n(run.inspected)} of ${n(total)}${savedNote}. ${stop}${notInspected > 0 ? ` The ${n(notInspected)} URLs not inspected have no result here, so this is not an all-clear for them.` : ""}${known.sitemap.notes.length ? ` Sitemap: ${known.sitemap.notes.join("; ")}.` : ""}`,
41576
41580
  run.quota ? `URL Inspection quota: this machine had used ${n(run.quota.used)} of ${n(run.quota.limit)} today for this property before the run. Google also counts inspections from other tools.` : "URL Inspection quota: not counted on this server; Google stops inspections at 2,000 a day per property."
41577
41581
  ];
41578
- if (run.failed.length) lines.push(`URL Inspection failed for ${plural(run.failed.length, "URL")}: ${run.failed.slice(0, 5).map((item) => `${item.url} (${item.error})`).join("; ")}${run.failed.length > 5 ? "; and more" : ""}.`);
41582
+ if (run.failed.length) lines.push(`URL Inspection failed for ${plural$1(run.failed.length, "URL")}: ${run.failed.slice(0, 5).map((item) => `${item.url} (${item.error})`).join("; ")}${run.failed.length > 5 ? "; and more" : ""}.`);
41579
41583
  const groups = byReason(run.rows);
41580
41584
  if (groups.length) lines.push(`By Google's reason, with labels from the rules below (not Google's):\n${table$1(groups, [
41581
41585
  "reason",
@@ -42900,6 +42904,164 @@ function telemetryReportFor(command, args = {}) {
42900
42904
  }[command] ?? null;
42901
42905
  }
42902
42906
  //#endregion
42907
+ //#region packages/core/dist/commands/week.js
42908
+ const DAY_MS = 864e5;
42909
+ function weekLabel(start, end) {
42910
+ const parts = (date) => {
42911
+ const value = /* @__PURE__ */ new Date(`${date}T00:00:00Z`);
42912
+ return {
42913
+ day: value.getUTCDate(),
42914
+ month: value.toLocaleString("en-GB", {
42915
+ month: "short",
42916
+ timeZone: "UTC"
42917
+ })
42918
+ };
42919
+ };
42920
+ const from = parts(start);
42921
+ const to = parts(end);
42922
+ return from.month === to.month ? `${from.day} to ${to.day} ${to.month}` : `${from.day} ${from.month} to ${to.day} ${to.month}`;
42923
+ }
42924
+ const weekTitle = (data) => `Your SEO Skill week, ${weekLabel(data.start, data.end)}`;
42925
+ const siteName = (property) => property.replace(/^sc-domain:|^https?:\/\//, "").replace(/\/$/, "");
42926
+ const count = (n) => n.toLocaleString("en-US");
42927
+ const plural = (n, one, many = `${one}s`) => `${count(n)} ${n === 1 ? one : many}`;
42928
+ const list = (items) => items.length <= 1 ? items[0] ?? "" : `${items.slice(0, -1).join(", ")} and ${items.at(-1)}`;
42929
+ function path(url) {
42930
+ try {
42931
+ const parsed = new URL(url);
42932
+ return `${parsed.pathname}${parsed.search}`;
42933
+ } catch {
42934
+ return url;
42935
+ }
42936
+ }
42937
+ function clicksChange(site) {
42938
+ const clicks = site.clicks;
42939
+ if (!clicks) return null;
42940
+ const change = clicks.clicks - clicks.previous;
42941
+ if (Math.abs(change) < 50) return null;
42942
+ if (change < 0 && clicks.previous >= 100 && -change >= .3 * clicks.previous) return "fell";
42943
+ if (change > 0 && clicks.previous >= 50 && change >= .3 * clicks.previous) return "rose";
42944
+ return null;
42945
+ }
42946
+ const percent = (site) => {
42947
+ const clicks = site.clicks;
42948
+ return Math.round(Math.abs(clicks.clicks - clicks.previous) / clicks.previous * 100);
42949
+ };
42950
+ function issues(site, startMs, endMs) {
42951
+ const name = siteName(site.property);
42952
+ const found = [];
42953
+ const index = site.index;
42954
+ if (index?.dropped) {
42955
+ const paths = index.dropped_pages.map((page) => path(page.url));
42956
+ const more = index.dropped - paths.length;
42957
+ const shown = more > 0 ? `${paths.join(", ")} and ${plural(more, "more")}` : list(paths);
42958
+ const reasons = new Set(index.dropped_pages.map((page) => page.coverage));
42959
+ const reason = reasons.size === 1 ? [...reasons][0] : null;
42960
+ found.push({
42961
+ rank: 0,
42962
+ heading: `${plural(index.dropped, "page")} dropped`,
42963
+ line: `${shown} dropped out of Google’s index.${reason ? ` Google says: ${reason}.` : ""}`,
42964
+ next: `check ${index.dropped === 1 ? "it" : "they"} still return${index.dropped === 1 ? "s" : ""} 200 and ${index.dropped === 1 ? "is" : "are"} not noindexed.`,
42965
+ prompt: `Why did ${paths[0] ?? "a page"} on ${name} drop out of Google’s index this week, and how do I fix it?`
42966
+ });
42967
+ }
42968
+ const crawl = site.crawl;
42969
+ const crawled = crawl !== null && crawl.finished_at >= startMs && crawl.finished_at < endMs;
42970
+ if (crawled && crawl.status === "failed") found.push({
42971
+ rank: 1,
42972
+ heading: "crawl stopped early",
42973
+ line: `The weekly crawl stopped after ${plural(crawl.pages, "page")}${crawl.error ? `: ${crawl.error}` : "."}`,
42974
+ next: "check the site is up. The next weekly crawl tries again.",
42975
+ prompt: `Why did the weekly crawl of ${name} stop early, and what should I check?`
42976
+ });
42977
+ else if (!crawled && site.added_at < startMs) found.push({
42978
+ rank: 1,
42979
+ heading: "no crawl this week",
42980
+ line: `No weekly crawl finished this week${site.start_error ? `: ${site.start_error}` : "."}`,
42981
+ next: "check the site is up. The crawl tries again each hour.",
42982
+ prompt: `Why has the weekly crawl of ${name} not finished, and what should I check?`
42983
+ });
42984
+ if (clicksChange(site) === "fell") {
42985
+ const clicks = site.clicks;
42986
+ found.push({
42987
+ rank: 2,
42988
+ heading: `clicks down ${percent(site)}%`,
42989
+ line: `Search clicks fell ${percent(site)}%, from ${count(clicks.previous)} to ${count(clicks.clicks)} (${weekLabel(clicks.start, clicks.end)}, against the 7 days before).`,
42990
+ next: "ask your agent which pages and queries lost them.",
42991
+ prompt: `Which pages and queries lost search clicks on ${name} in the last week, and why?`
42992
+ });
42993
+ }
42994
+ if (crawled && crawl.new_issues > 0) {
42995
+ const rule = crawl.top_rule ? AUDIT_RULES[crawl.top_rule] : void 0;
42996
+ found.push({
42997
+ rank: 3,
42998
+ heading: plural(crawl.new_issues, "new issue"),
42999
+ line: `The weekly crawl found ${plural(crawl.new_issues, "new issue")}${rule ? `, most of them ${rule.charAt(0).toLowerCase()}${rule.slice(1)}` : ""}.`,
43000
+ next: "ask your agent for the weekly audit of this site.",
43001
+ prompt: `What did the weekly crawl of ${name} find this week, and what should I fix first?`
43002
+ });
43003
+ }
43004
+ return found;
43005
+ }
43006
+ function weekMarkdown(data) {
43007
+ const startMs = Date.parse(`${data.start}T00:00:00Z`);
43008
+ const endMs = Date.parse(`${data.end}T00:00:00Z`) + DAY_MS;
43009
+ const title = `# ${weekTitle(data)}`;
43010
+ if (!data.sites.length) return `${title}\n\nNo site is in your weekly audit yet. Add one on the Sites tab: ${data.account}#sites`;
43011
+ const byName = (a, b) => siteName(a.property).localeCompare(siteName(b.property)) || a.property.localeCompare(b.property);
43012
+ const sites = [...data.sites].sort(byName);
43013
+ const attention = [];
43014
+ const quiet = [];
43015
+ const waiting = [];
43016
+ for (const site of sites) {
43017
+ const found = issues(site, startMs, endMs);
43018
+ if (found.length) attention.push({
43019
+ site,
43020
+ found
43021
+ });
43022
+ else if (!site.crawl || !site.index) waiting.push(site);
43023
+ else quiet.push(site);
43024
+ }
43025
+ attention.sort((a, b) => a.found[0].rank - b.found[0].rank || byName(a.site, b.site));
43026
+ const total = sites.length;
43027
+ const out = [
43028
+ title,
43029
+ "",
43030
+ attention.length ? total === 1 ? "Your site needs a look this week." : `${attention.length} of your ${total} sites ${attention.length === 1 ? "needs" : "need"} a look this week.` : quiet.length ? total === 1 ? "Your site had a quiet week." : quiet.length === total ? `All ${total} of your sites had a quiet week.` : `${quiet.length} of your ${total} sites had a quiet week.` : "Your sites are still on their first checks."
43031
+ ];
43032
+ if (attention.length) {
43033
+ out.push("", "## Needs attention");
43034
+ for (const { site, found } of attention) {
43035
+ const [first, ...rest] = found;
43036
+ const also = rest.length ? ` Also: ${list(rest.map((item) => item.heading))}.` : "";
43037
+ const rose = clicksChange(site) === "rose" ? ` Search clicks rose ${percent(site)}%.` : "";
43038
+ out.push("", `### ${siteName(site.property)}: ${first.heading}`, "", `- ${first.line}${also}${rose}`, `- Next step: ${first.next}`, ...site.link ? [`- [View site](${site.link})`] : []);
43039
+ }
43040
+ }
43041
+ if (quiet.length) {
43042
+ const risen = quiet.filter((site) => clicksChange(site) === "rose");
43043
+ out.push("", "## All quiet", "", `${list(quiet.map((site) => siteName(site.property)))}: no drops, no new issues.${risen.map((site) => ` Search clicks rose ${percent(site)}% on ${siteName(site.property)}.`).join("")}`);
43044
+ }
43045
+ if (waiting.length) out.push("", "## Not checked yet", "", `${list(waiting.map((site) => siteName(site.property)))}: the first crawl or Google checks are still running.`);
43046
+ const first = attention[0];
43047
+ const prompt = first ? first.found[0].prompt : `What are the best quick wins on ${siteName((quiet[0] ?? sites[0]).property)} this month?`;
43048
+ out.push("", "## Ask your agent", "", "Paste this into your agent:", "", "```", prompt, "```");
43049
+ return out.join("\n");
43050
+ }
43051
+ async function runAllSites(deps) {
43052
+ const data = deps.week ? await deps.week() : null;
43053
+ if (!data) throw new CommandError("INVALID_INPUT", `No site given. Name one: ${deps.call("report", { site: "<site>" })}. The summary of every site is for accounts in the weekly site audit beta.`);
43054
+ const startMs = Date.parse(`${data.start}T00:00:00Z`);
43055
+ const endMs = Date.parse(`${data.end}T00:00:00Z`) + DAY_MS;
43056
+ const urgency = (site) => issues(site, startMs, endMs)[0]?.rank ?? Number.POSITIVE_INFINITY;
43057
+ const first = [...data.sites].sort((a, b) => urgency(a) - urgency(b) || siteName(a.property).localeCompare(siteName(b.property)))[0];
43058
+ const example = first ? siteName(first.property) : "<site>";
43059
+ return {
43060
+ text: `${weekMarkdown(data)}\n\nFull report on one site: ${deps.call("report", { site: example })}`,
43061
+ data
43062
+ };
43063
+ }
43064
+ //#endregion
42903
43065
  //#region packages/core/dist/commands/tools.js
42904
43066
  const site = z.string().min(1).describe("Search Console property or site, such as sc-domain:example.com, https://example.com/ or example.com.");
42905
43067
  const dates = {
@@ -42943,17 +43105,25 @@ const SHARED_TOOLS = [
42943
43105
  name: "seo_report",
42944
43106
  command: "report",
42945
43107
  title: "Search Console report",
42946
- description: `The main report for a Search Console property. Without a section it returns the overview plus each section's row count and top rows. With a section it returns that section's rows; page sections also check their top 20 URLs live. Sections:\n${Object.entries(SECTIONS).map(([id, text]) => `- ${id}: ${text}`).join("\n")}`,
43108
+ description: `Start here. Without site: a short summary of every site in the person's weekly site audit (beta) for last week, with what needs a look and the next step for each, ending with the site to ask about next; an account outside that beta must send site. With site: the main report for that Search Console property, the overview plus each section's row count and top rows. With site and section: that section's rows; page sections also check their top 20 URLs live. Sections:\n${Object.entries(SECTIONS).map(([id, text]) => `- ${id}: ${text}`).join("\n")}`,
42947
43109
  input: z.object({
42948
- site,
42949
- section: z.enum(SECTION_IDS).optional().describe("Optional. Leave it out first; then ask for one section."),
43110
+ site: site.optional().describe("Leave it out for the summary of every audited site (weekly site audit beta). Otherwise a Search Console property or site, such as sc-domain:example.com, https://example.com/ or example.com."),
43111
+ section: z.enum(SECTION_IDS).optional().describe("Optional, needs site. Leave it out first; then ask for one section."),
42950
43112
  ...dates,
42951
43113
  ...detail
42952
43114
  }),
42953
43115
  run: async (surface, input) => {
42954
- const resolved = await surface.resolveSite(input.site).catch((error) => error instanceof Error ? error : new Error(String(error)));
43116
+ if (!input.site) {
43117
+ if (input.section) throw new CommandError("INVALID_INPUT", `section needs a site: ${surface.deps.call("report", {
43118
+ site: "<site>",
43119
+ section: input.section
43120
+ })}.`);
43121
+ return runAllSites(surface.deps);
43122
+ }
43123
+ const target = input.site;
43124
+ const resolved = await surface.resolveSite(target).catch((error) => error instanceof Error ? error : new Error(String(error)));
42955
43125
  if (resolved instanceof Error && !input.section && surface.deps.bing) return runBingReport({
42956
- site: input.site,
43126
+ site: target,
42957
43127
  startDate: input.start_date,
42958
43128
  endDate: input.end_date
42959
43129
  }, surface.deps).catch(() => {
@@ -42961,7 +43131,7 @@ const SHARED_TOOLS = [
42961
43131
  });
42962
43132
  if (resolved instanceof Error && input.section !== "bing") throw resolved;
42963
43133
  return runReport$1({
42964
- site: resolved instanceof Error ? input.site : resolved,
43134
+ site: resolved instanceof Error ? target : resolved,
42965
43135
  section: input.section,
42966
43136
  startDate: input.start_date,
42967
43137
  endDate: input.end_date,
@@ -43168,9 +43338,34 @@ async function runSharedTool(tool, surface, input, local = false) {
43168
43338
  if (!parsed.success) throw new CommandError("INVALID_INPUT", parsed.error.issues.map((issue) => `${issue.path.join(".") || "input"}: ${issue.message}`).join("; "));
43169
43339
  return tool.run(surface, parsed.data);
43170
43340
  }
43341
+ const MCP_SERVER_INFO = {
43342
+ name: "seo",
43343
+ title: "SEO Skill",
43344
+ description: "Search Console, Google Analytics and keyword data for your AI agent.",
43345
+ websiteUrl: "https://seoskill.dev",
43346
+ icons: [
43347
+ {
43348
+ src: "https://seoskill.dev/favicon-light.png",
43349
+ mimeType: "image/png",
43350
+ sizes: ["512x512"],
43351
+ theme: "light"
43352
+ },
43353
+ {
43354
+ src: "https://seoskill.dev/favicon-dark.png",
43355
+ mimeType: "image/png",
43356
+ sizes: ["512x512"],
43357
+ theme: "dark"
43358
+ },
43359
+ {
43360
+ src: "https://seoskill.dev/favicon.svg",
43361
+ mimeType: "image/svg+xml",
43362
+ sizes: ["any"]
43363
+ }
43364
+ ]
43365
+ };
43171
43366
  const MCP_INSTRUCTIONS = `SEO Skill reads the person's own Search Console, Google Analytics, Bing Webmaster Tools, Clicky and optional keyword accounts, and returns facts with their dates and limits. It gives no advice.
43172
43367
  1. seo_sites: the properties the connected accounts can read.
43173
- 2. seo_report: the main report. Run it without a section first; it shows the overview and every section's count and top rows. Then ask for the one section you need.
43368
+ 2. seo_report: start here. Without site it summarises last week across every site in the weekly site audit (beta) and names the site to ask about next. With site it shows that property's overview and every section's count and top rows; then ask for the one section you need.
43174
43369
  3. seo_page for one URL, seo_compare for before and after a date, seo_index for Google's indexing reasons and pages that lost their clicks, seo_research for keyword, competitor and backlink data, and whether AI answers cite the site, from the DataForSEO or Ahrefs key the person saved, seo_data for raw rows, including Google Analytics, Bing and Clicky.`;
43175
43370
  const mcpCall = (command, args) => {
43176
43371
  const name = `seo_${command.replace("-", "_")}`;
@@ -43186,7 +43381,7 @@ const SKILL_RESOURCE = {
43186
43381
  };
43187
43382
  //#endregion
43188
43383
  //#region packages/core/dist/gsc/client/inspection-cache.js
43189
- const INSPECTION_FRESH_MS = 7 * 864e5;
43384
+ const INSPECTION_FRESH_MS = 6048e5;
43190
43385
  function readSavedInspections(site, urls, now = Date.now()) {
43191
43386
  const found = /* @__PURE__ */ new Map();
43192
43387
  try {
@@ -43415,7 +43610,8 @@ function nodeCommandDeps(options) {
43415
43610
  analytics: {
43416
43611
  accounts: localAccounts,
43417
43612
  signIn: LOCAL_SIGN_IN.signIn
43418
- }
43613
+ },
43614
+ ...cloudLinked() ? { week: cloudWeek } : {}
43419
43615
  };
43420
43616
  }
43421
43617
  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).";
@@ -43569,10 +43765,10 @@ async function runDoctor(dependencies = {}) {
43569
43765
  }
43570
43766
  //#endregion
43571
43767
  //#region packages/core/dist/provider-extensions/actions.js
43572
- const MAX_ACTION_PARAM_BYTES = 64 * 1024;
43768
+ const MAX_ACTION_PARAM_BYTES = 65536;
43573
43769
  const MAX_ACTION_PARAM_DEPTH = 16;
43574
43770
  const MAX_ACTION_PARAM_VALUES = 5e3;
43575
- const MAX_ACTION_RESULT_BYTES = 10 * 1024 * 1024;
43771
+ const MAX_ACTION_RESULT_BYTES = 10485760;
43576
43772
  const MAX_ACTION_RESULT_DEPTH = 20;
43577
43773
  const MAX_ACTION_RESULT_VALUES = 1e5;
43578
43774
  function normalizedParams(params) {
@@ -43946,7 +44142,7 @@ function updateNotice(options = {}) {
43946
44142
  }
43947
44143
  //#endregion
43948
44144
  //#region packages/mcp/src/agent-output-budget.ts
43949
- const AGENT_STRUCTURED_OUTPUT_MAX_BYTES = 96 * 1024;
44145
+ const AGENT_STRUCTURED_OUTPUT_MAX_BYTES = 98304;
43950
44146
  function jsonBytes(value) {
43951
44147
  return Buffer.byteLength(JSON.stringify(value));
43952
44148
  }
@@ -46499,8 +46695,10 @@ async function countedRun(command, args, telemetry, run) {
46499
46695
  if (report && telemetry) trackTelemetryReportStart(report, telemetry());
46500
46696
  try {
46501
46697
  const result = await run();
46502
- if (report && telemetry) if (result.isError) trackTelemetryReportFailed(report, result.structuredContent?.error, telemetry());
46503
- else trackTelemetryReportComplete(report, telemetry());
46698
+ if (report && telemetry) {
46699
+ if (result.isError) trackTelemetryReportFailed(report, result.structuredContent?.error, telemetry());
46700
+ else trackTelemetryReportComplete(report, telemetry());
46701
+ }
46504
46702
  return result;
46505
46703
  } catch (error) {
46506
46704
  const failure = localError(error);
@@ -46599,7 +46797,9 @@ function readSkill() {
46599
46797
  }
46600
46798
  function createServer(options = {}) {
46601
46799
  const server = new McpServer({
46602
- name: "seo",
46800
+ ...MCP_SERVER_INFO,
46801
+ title: "SEO Skill (local)",
46802
+ description: `${MCP_SERVER_INFO.description} Runs on your machine.`,
46603
46803
  version: SEO_VERSION
46604
46804
  }, {
46605
46805
  capabilities: { logging: {} },