@canonry/canonry 7.71.0 → 7.72.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.
Files changed (129) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +1 -1
  2. package/assets/assets/{AgentSetupPage-DexQKsfX.js → AgentSetupPage-kkWYCvUB.js} +1 -1
  3. package/assets/assets/{AuditHistoryPanel-C0tKUYig.js → AuditHistoryPanel-BS-iFyHX.js} +1 -1
  4. package/assets/assets/{BacklinksPage-CXKsDXhy.js → BacklinksPage-BW2bEGF4.js} +1 -1
  5. package/assets/assets/{HistoryPage-D1UkPELF.js → HistoryPage-Dh6o2iVd.js} +1 -1
  6. package/assets/assets/{MeasurementPropertyPage-CsSUHpB7.js → MeasurementPropertyPage-BsUyf7NF.js} +1 -1
  7. package/assets/assets/{ProjectPage-DVQora-C.js → ProjectPage-CYBZBlk3.js} +1 -1
  8. package/assets/assets/{RunsPage-CnPgX-bf.js → RunsPage-D27pEHr4.js} +1 -1
  9. package/assets/assets/{SettingsPage-DfiH_eyL.js → SettingsPage-CkI60Uw0.js} +1 -1
  10. package/assets/assets/{SiteHealthSection-BTfTcF_w.js → SiteHealthSection-BKHeLIQL.js} +2 -2
  11. package/assets/assets/{ToneBadge-aGjnkfBI.js → ToneBadge-CmvL5mFG.js} +1 -1
  12. package/assets/assets/{TrafficPage-DIa6lxo2.js → TrafficPage-x01Zc1a-.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-BTFJ4JkC.js → TrafficSourceDetailPage-DE-NyNGz.js} +1 -1
  14. package/assets/assets/{account-context-RobEwj-E.js → account-context-BwV6ox8O.js} +1 -1
  15. package/assets/assets/{card-BLjXAqaV.js → card-DhkoBNyY.js} +1 -1
  16. package/assets/assets/{extract-error-message-BnVETQ_r.js → extract-error-message-dNDtiSBo.js} +1 -1
  17. package/assets/assets/{format-helpers-2INiLwsz.js → format-helpers-Bt4tx-f3.js} +1 -1
  18. package/assets/assets/{index-zdoJudA4.js → index-DtKWmlCj.js} +4 -4
  19. package/assets/assets/{query-client-BMplcUQL.js → query-client-D-zMw63p.js} +1 -1
  20. package/assets/assets/{react-query-BYjj2p2M.js → react-query-EdiRRB2q.js} +1 -1
  21. package/assets/assets/{react-sigma_core.esm.min-CerNhJzW.js → react-sigma_core.esm.min-CmaI5ZWC.js} +1 -1
  22. package/assets/assets/{service-DM_6LxOl.js → service-C_Ai7oQC.js} +1 -1
  23. package/assets/index.html +7 -7
  24. package/dist/{ads-P75E4E3Q.js → ads-FFUUMS4J.js} +3 -3
  25. package/dist/{agent-WKTCTJL7.js → agent-LCD2VG7C.js} +7 -7
  26. package/dist/{agent-ask-CI4I5UER.js → agent-ask-OBHTCYFR.js} +3 -3
  27. package/dist/{agent-conversations-2LXN6PC5.js → agent-conversations-VMZ4NFIX.js} +3 -3
  28. package/dist/{agent-memory-STJUYUEI.js → agent-memory-UPFJFNWC.js} +3 -3
  29. package/dist/{agent-providers-HRQCKR57.js → agent-providers-4GOWLBZK.js} +3 -3
  30. package/dist/{agent-transcript-SMNVT5UA.js → agent-transcript-RGXIVZUP.js} +3 -3
  31. package/dist/{analytics-GZRA5LS4.js → analytics-FBK4XV5P.js} +3 -3
  32. package/dist/{apply-QXMZGXAY.js → apply-Y2DVE3YB.js} +3 -3
  33. package/dist/{backfill-3VVYI6XX.js → backfill-ENGKBFKH.js} +9 -9
  34. package/dist/{backlinks-VUTZFYJY.js → backlinks-YWHFC7DZ.js} +3 -3
  35. package/dist/{bing-DKYPVXU4.js → bing-7BP3DWPK.js} +3 -3
  36. package/dist/{bootstrap-3CMHZS6G.js → bootstrap-Z7QSKVPL.js} +10 -10
  37. package/dist/{cdp-XP4RGCA6.js → cdp-OL6RENO3.js} +7 -7
  38. package/dist/{chunk-Z6BDB4KS.js → chunk-2PC54WLE.js} +4 -4
  39. package/dist/{chunk-SNCRERSZ.js → chunk-3AG3LPZX.js} +1 -1
  40. package/dist/{chunk-JCECURGF.js → chunk-4LTL5RNY.js} +4 -4
  41. package/dist/{chunk-ALXQPMYR.js → chunk-6MYHGP46.js} +1 -1
  42. package/dist/{chunk-C3ZH2HLV.js → chunk-7OJQWLDI.js} +5 -5
  43. package/dist/{chunk-T6IV35KG.js → chunk-ATT3ZCSS.js} +2 -2
  44. package/dist/{chunk-U6EUBP4B.js → chunk-BADJCT6U.js} +1 -1
  45. package/dist/{chunk-AAPMP2T3.js → chunk-BKIFKB7E.js} +8 -8
  46. package/dist/{chunk-JB4NDUWJ.js → chunk-BZZDFIY2.js} +1 -1
  47. package/dist/{chunk-ETMB45WP.js → chunk-DRGCVTYH.js} +1 -1
  48. package/dist/{chunk-WE3SK5GQ.js → chunk-GA2EHZTI.js} +4 -4
  49. package/dist/{chunk-VLFPI3T3.js → chunk-H4HNXCDF.js} +2 -2
  50. package/dist/{chunk-OOXR7SZ5.js → chunk-H6IQ4YCJ.js} +4 -4
  51. package/dist/{chunk-ILLWCY2P.js → chunk-IV6VZ63E.js} +3 -3
  52. package/dist/{chunk-FNVUPIMW.js → chunk-IZMT4WLZ.js} +2 -2
  53. package/dist/{chunk-WHH7HWN7.js → chunk-J523Y7X2.js} +1 -1
  54. package/dist/{chunk-3NOFNFGV.js → chunk-JE5QURTR.js} +1 -1
  55. package/dist/{chunk-WNBN4FYE.js → chunk-JEBY6MS6.js} +1 -1
  56. package/dist/{chunk-K4S2T6C5.js → chunk-JO73L677.js} +2 -2
  57. package/dist/{chunk-JEC5Z22M.js → chunk-L6WMECR5.js} +5 -5
  58. package/dist/{chunk-DEMNY4YE.js → chunk-MJYO6UK2.js} +2 -2
  59. package/dist/{chunk-IX7AKQBJ.js → chunk-NZZWJCKS.js} +3 -3
  60. package/dist/{chunk-EDQ4V4PJ.js → chunk-O7WOCTBD.js} +13 -1
  61. package/dist/{chunk-NPHBHVAY.js → chunk-PPM6Z7CM.js} +1 -1
  62. package/dist/{chunk-AVNEHYTZ.js → chunk-Q25JQANW.js} +1 -1
  63. package/dist/{chunk-2G3J62KV.js → chunk-QDN3FL2A.js} +1 -1
  64. package/dist/{chunk-JHCIMIB5.js → chunk-TEDY3MHN.js} +3 -3
  65. package/dist/{chunk-DP5V4C3I.js → chunk-TOX6HAQJ.js} +3 -3
  66. package/dist/{chunk-ZCIC3DLS.js → chunk-UWBJWKDQ.js} +2 -2
  67. package/dist/{chunk-XSRKTGRG.js → chunk-VH2KHJGT.js} +38 -21
  68. package/dist/{chunk-SZSJALQM.js → chunk-VJFQNFOR.js} +12 -6
  69. package/dist/{chunk-QREFWO3Q.js → chunk-XR6ZVMYK.js} +1 -1
  70. package/dist/{chunk-A3NSYJJL.js → chunk-YXAKL5HM.js} +9 -1
  71. package/dist/{chunk-KRDMSGNZ.js → chunk-ZG4KG53J.js} +334 -334
  72. package/dist/{citations-X24SQ4ZU.js → citations-RVSC67GE.js} +3 -3
  73. package/dist/{cli-catalog-RYUJEUAY.js → cli-catalog-NEZE5QU5.js} +3 -3
  74. package/dist/{cli-commands-DFTOVHCU.js → cli-commands-5YNRJIN6.js} +7 -7
  75. package/dist/cli.js +13 -13
  76. package/dist/{competitor-4GIR3D4Q.js → competitor-BX3M3OYS.js} +3 -3
  77. package/dist/{content-FPMODFJ4.js → content-PKJMVMHJ.js} +3 -3
  78. package/dist/{dashboard-IJCLC5MW.js → dashboard-FI5KKIP4.js} +6 -6
  79. package/dist/{demo-52GRHFQH.js → demo-DQSDWOTF.js} +1 -1
  80. package/dist/{demo-server-QZPEIXU2.js → demo-server-32RKOBFE.js} +11 -11
  81. package/dist/{discover-Y7I3V75V.js → discover-JDP44ZHX.js} +3 -3
  82. package/dist/{discover-eval-TS67TA2C.js → discover-eval-6ORCVYYR.js} +3 -3
  83. package/dist/{doctor-E3OPJGNR.js → doctor-TVZRMBSS.js} +3 -3
  84. package/dist/{evidence-HBPR3QYE.js → evidence-FNIAFBBG.js} +3 -3
  85. package/dist/{export-cmd-AXSRXCD5.js → export-cmd-HQNF2SSD.js} +3 -3
  86. package/dist/{ga-JXHGIEMK.js → ga-PIO5OXMK.js} +3 -3
  87. package/dist/{gbp-4M54KRXG.js → gbp-3R5FME43.js} +3 -3
  88. package/dist/{google-TBZLFQTN.js → google-BYZREX2O.js} +4 -4
  89. package/dist/{google-marketing-EFUITED7.js → google-marketing-SPQ2GW6X.js} +1 -1
  90. package/dist/{health-cmd-5SCHBHXS.js → health-cmd-HH5RYMSV.js} +3 -3
  91. package/dist/{history-BLOGMFLZ.js → history-Q35NLLMJ.js} +3 -3
  92. package/dist/index.d.ts +23 -6
  93. package/dist/index.js +24 -24
  94. package/dist/{init-2WCCRDYU.js → init-O6PEZ2RT.js} +11 -11
  95. package/dist/{insights-AUTLWRQS.js → insights-SH73B4PD.js} +3 -3
  96. package/dist/intelligence-service-V2VS43H4.js +15 -0
  97. package/dist/{journeys-7Y3HE5AX.js → journeys-SIV7HPW7.js} +3 -3
  98. package/dist/{keys-3T65JGMW.js → keys-O656YWSW.js} +3 -3
  99. package/dist/{keyword-2MQEXEYJ.js → keyword-FZ2N4EW7.js} +3 -3
  100. package/dist/{logs-4AWZCX2X.js → logs-2NPN7HBI.js} +3 -3
  101. package/dist/{mcp-RCMC554F.js → mcp-RHQY3DV6.js} +2 -2
  102. package/dist/mcp.js +9 -9
  103. package/dist/{measurement-plan-HFPXGBVZ.js → measurement-plan-JQKVSJRL.js} +5 -5
  104. package/dist/{notify-GEUMV4QL.js → notify-VTAYBHC6.js} +3 -3
  105. package/dist/{organic-evidence-TAH2R2U4.js → organic-evidence-HPXXEPOW.js} +3 -3
  106. package/dist/{overview-WBZW5QMX.js → overview-FSBNDYZJ.js} +4 -4
  107. package/dist/{project-52XSBNDM.js → project-MAPPXURS.js} +3 -3
  108. package/dist/{query-7DHBS2QS.js → query-R6DLPIPJ.js} +3 -3
  109. package/dist/{research-VDLJDU72.js → research-FXKOEUQB.js} +3 -3
  110. package/dist/{results-export-4XMDISAJ.js → results-export-X2PUM63S.js} +3 -3
  111. package/dist/{run-NQ664S64.js → run-6ENTG4IO.js} +4 -4
  112. package/dist/{schedule-CFG2I3BJ.js → schedule-DMMVRT7P.js} +3 -3
  113. package/dist/{search-Q5HSLPLD.js → search-FHI6APT7.js} +3 -3
  114. package/dist/{serve-4X3LDV6K.js → serve-KS6ABZHU.js} +25 -25
  115. package/dist/{session-3JP36MHE.js → session-Q623G5DT.js} +12 -12
  116. package/dist/{settings-Y7RLRCLF.js → settings-FMB4QED4.js} +3 -3
  117. package/dist/{skills-ZVV7HCF5.js → skills-HBIMHSOI.js} +2 -2
  118. package/dist/{snapshot-UAWGXBKI.js → snapshot-RBA2EL7R.js} +3 -3
  119. package/dist/{src-6ZMVHPAY.js → src-BXXGJOQB.js} +2 -2
  120. package/dist/{status-A2FZZJ4M.js → status-ATFDFAVG.js} +4 -4
  121. package/dist/{technical-aeo-HXGF72PP.js → technical-aeo-JWQTGCTB.js} +6 -4
  122. package/dist/{telemetry-7SHJAUQD.js → telemetry-6QFGJL2I.js} +4 -4
  123. package/dist/{tools-3HY3R5J5.js → tools-GNTPFDAF.js} +11 -11
  124. package/dist/{traffic-6LPWSVRR.js → traffic-5R7M4CK5.js} +5 -5
  125. package/dist/{users-UHABRTME.js → users-24TIUYJY.js} +3 -3
  126. package/dist/{visibility-stats-Z5D6ITSA.js → visibility-stats-YLQPPBJJ.js} +3 -3
  127. package/dist/{wordpress-HEIQZGMP.js → wordpress-7VDPHMUZ.js} +3 -3
  128. package/package.json +2 -2
  129. package/dist/intelligence-service-XDGWLXW4.js +0 -15
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  answerServiceAdapters,
3
3
  answerServiceDescriptors
4
- } from "./chunk-QREFWO3Q.js";
4
+ } from "./chunk-XR6ZVMYK.js";
5
5
  import {
6
6
  AeroLlmUsageFeatures,
7
7
  aeroTurnStatus,
@@ -27,14 +27,14 @@ import {
27
27
  resolveConfiguredAgentProvider,
28
28
  resolveSessionProviderAndModel,
29
29
  setAeroSystemPrompt
30
- } from "./chunk-C3ZH2HLV.js";
30
+ } from "./chunk-7OJQWLDI.js";
31
31
  import {
32
32
  AeroToolProfiles,
33
33
  AeroToolScopes,
34
34
  buildAeroStateTools,
35
35
  isAeroToolProfile,
36
36
  truncateToolResult
37
- } from "./chunk-OOXR7SZ5.js";
37
+ } from "./chunk-H6IQ4YCJ.js";
38
38
  import {
39
39
  getGoogleAuthConfig,
40
40
  getGoogleConnection,
@@ -53,7 +53,7 @@ import {
53
53
  removeCloudflareTrafficConnection,
54
54
  removeCloudflareTrafficConnectionBySourceId,
55
55
  upsertCloudflareTrafficConnection
56
- } from "./chunk-JB4NDUWJ.js";
56
+ } from "./chunk-BZZDFIY2.js";
57
57
  import {
58
58
  claudeAdapter,
59
59
  embedQueries,
@@ -64,7 +64,7 @@ import {
64
64
  openaiAdapter,
65
65
  openrouterAdapter,
66
66
  perplexityAdapter
67
- } from "./chunk-K4S2T6C5.js";
67
+ } from "./chunk-JO73L677.js";
68
68
  import {
69
69
  classifyUsageSurface,
70
70
  createApiUsageTelemetry,
@@ -76,7 +76,7 @@ import {
76
76
  startOutcomeTimer,
77
77
  trackFeatureCompleted,
78
78
  trackInstallState
79
- } from "./chunk-JCECURGF.js";
79
+ } from "./chunk-4LTL5RNY.js";
80
80
  import {
81
81
  isLoopbackBindHost
82
82
  } from "./chunk-TSENU4GG.js";
@@ -84,7 +84,7 @@ import {
84
84
  isApiProviderRegistrable,
85
85
  isCdpProviderRegistrable,
86
86
  registeredProviderNames
87
- } from "./chunk-ALXQPMYR.js";
87
+ } from "./chunk-6MYHGP46.js";
88
88
  import {
89
89
  checkLatestVersionForServer,
90
90
  getOrCreateAnonymousId,
@@ -95,17 +95,17 @@ import {
95
95
  recordDashboardEvent,
96
96
  setTelemetryPreference,
97
97
  trackEvent
98
- } from "./chunk-DEMNY4YE.js";
98
+ } from "./chunk-MJYO6UK2.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-ILLWCY2P.js";
101
+ } from "./chunk-IV6VZ63E.js";
102
102
  import {
103
103
  CANONRY_MCP_TIERS,
104
104
  CANONRY_MCP_TOOLKIT_NAMES
105
105
  } from "./chunk-NDTU7FGL.js";
106
106
  import {
107
107
  ApiClient
108
- } from "./chunk-T6IV35KG.js";
108
+ } from "./chunk-ATT3ZCSS.js";
109
109
  import {
110
110
  AGENT_PROVIDERS,
111
111
  adapterSupportsBatch,
@@ -136,21 +136,21 @@ import {
136
136
  saveConfigPatch,
137
137
  sentimentInstallReadiness,
138
138
  updateSharedProviderExecutionGate
139
- } from "./chunk-3NOFNFGV.js";
139
+ } from "./chunk-JE5QURTR.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
- } from "./chunk-NPHBHVAY.js";
142
+ } from "./chunk-PPM6Z7CM.js";
143
143
  import {
144
144
  computeFactorAverages,
145
145
  deleteSiteCrawlGraphLayout,
146
146
  persistSiteCrawlGraphLayout,
147
147
  prepareSiteCrawlGraphLayout,
148
148
  recordedSharePct
149
- } from "./chunk-FNVUPIMW.js";
149
+ } from "./chunk-IZMT4WLZ.js";
150
150
  import {
151
151
  CanonryMcpToolNames,
152
152
  canonryMcpTools
153
- } from "./chunk-WE3SK5GQ.js";
153
+ } from "./chunk-GA2EHZTI.js";
154
154
  import {
155
155
  PACKAGE_VERSION
156
156
  } from "./chunk-AOJU5LKX.js";
@@ -162,11 +162,11 @@ import {
162
162
  addLogListener,
163
163
  createFastifyLogger,
164
164
  createLogger
165
- } from "./chunk-JEC5Z22M.js";
165
+ } from "./chunk-L6WMECR5.js";
166
166
  import {
167
167
  computeCitedCompetitorDomains,
168
168
  determineCitationState
169
- } from "./chunk-ETMB45WP.js";
169
+ } from "./chunk-DRGCVTYH.js";
170
170
  import {
171
171
  BingApiError,
172
172
  CC_CACHE_DIR,
@@ -286,7 +286,7 @@ import {
286
286
  webhookResponseReason,
287
287
  webhookTargetRefusalReason,
288
288
  writeAuditLog
289
- } from "./chunk-SZSJALQM.js";
289
+ } from "./chunk-VJFQNFOR.js";
290
290
  import {
291
291
  OperationalLogStore,
292
292
  SentimentIdempotencyConflict,
@@ -372,7 +372,7 @@ import {
372
372
  siteLivenessState,
373
373
  trafficSources,
374
374
  usageCounters
375
- } from "./chunk-EDQ4V4PJ.js";
375
+ } from "./chunk-O7WOCTBD.js";
376
376
  import {
377
377
  AGENT_MEMORY_VALUE_MAX_BYTES,
378
378
  AI_ENGINE_DOMAINS,
@@ -624,7 +624,7 @@ import {
624
624
  winnabilityClassLabel,
625
625
  withRetry,
626
626
  withSkippedProviders
627
- } from "./chunk-A3NSYJJL.js";
627
+ } from "./chunk-YXAKL5HM.js";
628
628
 
629
629
  // src/google-marketing-runtime.ts
630
630
  import crypto2 from "crypto";
@@ -5807,7 +5807,7 @@ function nonBlank(value) {
5807
5807
  return trimmed ? trimmed : void 0;
5808
5808
  }
5809
5809
  function resolveBuildCommit(env = process.env) {
5810
- const embedded = true ? "9caa25b0ba175e5a81276cef6fe4c541f3f40073" : void 0;
5810
+ const embedded = true ? "5316fa88fb0c94357b949d9442ad4ce1b8307880" : void 0;
5811
5811
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5812
5812
  }
5813
5813
  function resolveInstanceIdentity(env = process.env) {
@@ -11884,6 +11884,7 @@ var log14 = createLogger("SiteAudit");
11884
11884
  var SiteAuditCancelledError = class extends Error {
11885
11885
  name = "SiteAuditCancelledError";
11886
11886
  };
11887
+ var SITE_AUDIT_SKIP_URL_VERSIONS_AFTER = 3;
11887
11888
  var NON_PAGE_MEDIA_EXTENSIONS = /\.(?:jpe?g|png|gif|webp|avif|bmp|ico|tiff?|svg|mp4|webm|mov|avi|mp3|wav|ogg|woff2?|ttf|otf|eot)(?:$|\?)/i;
11888
11889
  var NON_PAGE_MEDIA_CONTENT_TYPE = /^(?:image|video|audio|font)\//i;
11889
11890
  function isNonPageMedia(page) {
@@ -12317,6 +12318,8 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
12317
12318
  pagesFetched: progress.pagesFetched,
12318
12319
  pagesEligible: event.type === "summary" ? observedPages.size === 0 ? 0 : [...observedPages.values()].filter(isInventoryEligible).length : sql6`${siteCrawlAttempts.pagesEligible}`,
12319
12320
  pagesErrored: event.type === "summary" ? observedErrorCount(observedPages.values()) : sql6`${siteCrawlAttempts.pagesErrored}`,
12321
+ // Only the summary knows how many URL versions the crawl left unfetched.
12322
+ urlVersionsSkipped: event.type === "summary" ? event.summary.urlVersions?.skipped ?? 0 : sql6`${siteCrawlAttempts.urlVersionsSkipped}`,
12320
12323
  edgesDiscovered: progress.edgesObserved,
12321
12324
  updatedAt: now
12322
12325
  }).where(eq18(siteCrawlAttempts.id, attemptId)).run();
@@ -12361,6 +12364,7 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
12361
12364
  checkDeadLinks: opts.checkDeadLinks ?? false,
12362
12365
  includeGeo: opts.includeGeo ?? false,
12363
12366
  includeAgentSkills: opts.includeAgentSkills ?? true,
12367
+ skipUrlVersionsAfter: SITE_AUDIT_SKIP_URL_VERSIONS_AFTER,
12364
12368
  signal: opts.signal,
12365
12369
  onEvent: persistEvent
12366
12370
  });
@@ -12560,7 +12564,20 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
12560
12564
  if (current?.status === "cancelled") throw new SiteAuditCancelledError(`Site audit cancelled before publication: ${runId}`);
12561
12565
  throw new Error(`Site audit run was no longer running before publication: ${runId}`);
12562
12566
  }
12563
- log14.info("completed", { runId, projectId, status: terminalStatus, complete: crawlSummary.complete, pages: crawlSummary.pagesObserved });
12567
+ log14.info("completed", {
12568
+ runId,
12569
+ projectId,
12570
+ status: terminalStatus,
12571
+ complete: crawlSummary.complete,
12572
+ pages: crawlSummary.pagesObserved,
12573
+ urlVersionsSkipped: crawlSummary.urlVersions?.skipped ?? 0,
12574
+ urlVersionPatterns: (crawlSummary.urlVersions?.patterns ?? []).map((pattern) => ({
12575
+ section: pattern.section,
12576
+ parameters: pattern.parameters,
12577
+ copies: pattern.copies,
12578
+ skipped: pattern.skipped
12579
+ }))
12580
+ });
12564
12581
  trackSiteAuditOutcome(db, {
12565
12582
  runId,
12566
12583
  projectId,
@@ -9,14 +9,14 @@ import {
9
9
  normalizeCloudflareWorkerEvent,
10
10
  sessionizeJourneyRequests,
11
11
  verifyRequestSignature
12
- } from "./chunk-WNBN4FYE.js";
12
+ } from "./chunk-JEBY6MS6.js";
13
13
  import {
14
14
  currentOutcomeAttribution,
15
15
  getRequestContext,
16
16
  registerRequestContext,
17
17
  requestAuditIdentity,
18
18
  sanitizeRequestContext
19
- } from "./chunk-U6EUBP4B.js";
19
+ } from "./chunk-BADJCT6U.js";
20
20
  import {
21
21
  SentimentIdempotencyConflict,
22
22
  SentimentRepository,
@@ -156,7 +156,7 @@ import {
156
156
  userSessions,
157
157
  users,
158
158
  writeNegativeReviewMaxStars
159
- } from "./chunk-EDQ4V4PJ.js";
159
+ } from "./chunk-O7WOCTBD.js";
160
160
  import {
161
161
  ADS_ACTIVATE_SCOPE,
162
162
  ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
@@ -1194,7 +1194,7 @@ import {
1194
1194
  wordpressSchemaDeployResultDtoSchema,
1195
1195
  wordpressSchemaStatusResultDtoSchema,
1196
1196
  wordpressStatusDtoSchema
1197
- } from "./chunk-A3NSYJJL.js";
1197
+ } from "./chunk-YXAKL5HM.js";
1198
1198
 
1199
1199
  // ../api-routes/src/user-session.ts
1200
1200
  import crypto2 from "crypto";
@@ -42312,7 +42312,7 @@ var routeCatalog = [
42312
42312
  { name: "nodeKey", in: "query", description: "Return only the page with this node key. Combined with a filter it answers whether that exact page is in the filtered set, without paging through the list.", schema: stringSchema },
42313
42313
  { name: "healthState", in: "query", description: "Filter by the derived Site Health state shared with the dashboard and agents. Unlike `indexabilityState` this folds fetch state, canonical identity, and the crawler reasons into one decision. `hidden` means the SITE told answer engines not to index the page (noindex, canonical-away, robots.txt); a non-HTML file is `resource` and a redirect is `redirect`, because neither is suppressed. Values: `eligible`, `hidden`, `resource`, `redirect`, `failed`, `unchecked`.", schema: { type: "string", enum: ["eligible", "hidden", "resource", "redirect", "failed", "unchecked"] } },
42314
42314
  { name: "auditState", in: "query", description: "Filter by audit state. A URL version has `url-version`: it was fetched and classified but not scored.", schema: stringSchema },
42315
- { name: "urlVersions", in: "query", description: "URL versions are parameter addresses (filters, views, cache settings) whose canonical names the same path, so the site marks them as copies of that page. The audit does not score them or count them in fixes, and `inventorySummary.urlVersions` counts them. `include` (default) keeps every crawled address, `exclude` lists pages only, as the dashboard does, and `only` lists the URL versions, each with `urlVersionOf`. Scans made before URL versions were set aside have none.", schema: { type: "string", enum: ["include", "exclude", "only"] } },
42315
+ { name: "urlVersions", in: "query", description: "URL versions are parameter addresses (filters, views, cache settings) whose canonical names the same path, so the site marks them as copies of that page. The audit does not score them or count them in fixes, and `inventorySummary.urlVersions` counts them. `include` (default) keeps every crawled address, `exclude` lists pages only, as the dashboard does, and `only` lists the URL versions, each with `urlVersionOf`. Once a few addresses with the same parameter pattern prove to be copies, the crawl stops fetching that pattern: those have no rows and `inventorySummary.urlVersionsNotFetched` counts them. Scans made before URL versions were set aside have none.", schema: { type: "string", enum: ["include", "exclude", "only"] } },
42316
42316
  { name: "sort", in: "query", description: "Sort order. Defaults to `url`.", schema: { type: "string", enum: ["url", "path", "score-asc", "score-desc"] } },
42317
42317
  crawlCursorParameter,
42318
42318
  crawlLimitParameter
@@ -72580,13 +72580,19 @@ async function technicalAeoRoutes(app, opts) {
72580
72580
  const total = groups.reduce((sum, group) => sum + group.pages, 0);
72581
72581
  const eligible = groups.reduce((sum, group) => sum + (group.inventoryEligible ? group.pages : 0), 0);
72582
72582
  const urlVersions = app.db.select({ value: count8() }).from(siteCrawlPages).where(and83(inScope, isNotNull10(siteCrawlPages.urlVersionOf))).get()?.value ?? 0;
72583
+ const urlVersionsNotFetched = app.db.select({ value: siteCrawlAttempts.urlVersionsSkipped }).from(siteCrawlAttempts).where(and83(
72584
+ eq100(siteCrawlAttempts.projectId, scope.projectId),
72585
+ eq100(siteCrawlAttempts.runId, scope.runId),
72586
+ eq100(siteCrawlAttempts.id, scope.attemptId)
72587
+ )).get()?.value ?? 0;
72583
72588
  return {
72584
72589
  scope: "selected-snapshot",
72585
72590
  total,
72586
72591
  eligible,
72587
72592
  excluded: total - eligible,
72588
72593
  excludedReasons: reasonCounts(groups.filter((group) => !group.inventoryEligible)),
72589
- urlVersions
72594
+ urlVersions,
72595
+ urlVersionsNotFetched
72590
72596
  };
72591
72597
  };
72592
72598
  const completenessOf = (target) => ({
@@ -28,7 +28,7 @@ import {
28
28
  unknownUsageObservation,
29
29
  usdToMicros,
30
30
  withRetry
31
- } from "./chunk-A3NSYJJL.js";
31
+ } from "./chunk-YXAKL5HM.js";
32
32
 
33
33
  // ../provider-answer-services/src/core/http.ts
34
34
  var MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
@@ -7911,7 +7911,15 @@ var siteCrawlInventorySummarySchema = z20.object({
7911
7911
  * and not counted in fixes. A subset of `excluded`; 0 for a scan made before
7912
7912
  * the audit set them aside, which scored every address.
7913
7913
  */
7914
- urlVersions: z20.number().int().nonnegative().default(0)
7914
+ urlVersions: z20.number().int().nonnegative().default(0),
7915
+ /**
7916
+ * URL versions the crawl did not fetch at all: once a few addresses with
7917
+ * the same parameter pattern proved to be copies, it skipped the rest. They
7918
+ * have no page rows, so they are outside `total` and `urlVersions`; the URL
7919
+ * versions a scan found are `urlVersions + urlVersionsNotFetched`. 0 for a
7920
+ * scan that fetched every address.
7921
+ */
7922
+ urlVersionsNotFetched: z20.number().int().nonnegative().default(0)
7915
7923
  });
7916
7924
  var siteCrawlAvailableScanDatesSchema = z20.object({
7917
7925
  /** Most recent distinct visible crawl dates, newest first. Fewer rows than totalDates means the list is bounded. */