@canonry/canonry 7.67.0 → 7.68.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 (137) hide show
  1. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +10 -2
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +1 -1
  3. package/assets/assets/{AgentSetupPage-ORsy3QEa.js → AgentSetupPage-DyssdZ1J.js} +3 -3
  4. package/assets/assets/{AuditHistoryPanel-vTHZDbfs.js → AuditHistoryPanel-Bma4Q6p0.js} +1 -1
  5. package/assets/assets/{BacklinksPage-FqADB5sO.js → BacklinksPage-C3GoO2Wf.js} +1 -1
  6. package/assets/assets/{HistoryPage-C4l5Toqa.js → HistoryPage-6iYvYCL7.js} +1 -1
  7. package/assets/assets/MeasurementPropertyPage-CjI5eB3b.js +4 -0
  8. package/assets/assets/ProjectPage-GYIgNPxn.js +9 -0
  9. package/assets/assets/{RunsPage-oyhhwAPq.js → RunsPage-Cw0GTxgx.js} +1 -1
  10. package/assets/assets/{SettingsPage-DJc4Di1M.js → SettingsPage-Cvg8BvZn.js} +1 -1
  11. package/assets/assets/SiteHealthSection-vejp2Igj.js +2 -0
  12. package/assets/assets/ToneBadge-c2bgjqqz.js +60 -0
  13. package/assets/assets/{TrafficPage-DAD0FFkL.js → TrafficPage-BUb0xr-b.js} +1 -1
  14. package/assets/assets/{TrafficSourceDetailPage-BBEzbawh.js → TrafficSourceDetailPage-DmrtEYs8.js} +1 -1
  15. package/assets/assets/{account-context-DMHOefRt.js → account-context-qhg8esXw.js} +1 -1
  16. package/assets/assets/{card-Brp6fFNG.js → card-BNthgfAY.js} +1 -1
  17. package/assets/assets/{extract-error-message-5QpQCsGb.js → extract-error-message-DuYEL09s.js} +1 -1
  18. package/assets/assets/{format-helpers-BFM0FRjT.js → format-helpers-6v-a8B3S.js} +1 -1
  19. package/assets/assets/index-BUigRGam.js +60 -0
  20. package/assets/assets/{index-C6U4u18w.css → index-CqNwsqjm.css} +1 -1
  21. package/assets/assets/{query-client-BMTW-xss.js → query-client-COFiuVJB.js} +1 -1
  22. package/assets/assets/react-query-ZdpN7cFt.js +1 -0
  23. package/assets/assets/{react-sigma_core.esm.min-C0VjhgDo.js → react-sigma_core.esm.min-EbeNATny.js} +1 -1
  24. package/assets/assets/{service-DW9u_0aZ.js → service-DGFjEsYR.js} +1 -1
  25. package/assets/index.html +8 -8
  26. package/dist/{ads-BXGEL4WI.js → ads-AHM5LMVT.js} +3 -3
  27. package/dist/{agent-LFX7GHWD.js → agent-2FSGY7SD.js} +7 -7
  28. package/dist/{agent-ask-QJV225AT.js → agent-ask-GIK7T2HD.js} +3 -3
  29. package/dist/{agent-conversations-2TZDIGA6.js → agent-conversations-JEIFZHT3.js} +3 -3
  30. package/dist/{agent-memory-XCY3ZG5C.js → agent-memory-JC3JJXON.js} +3 -3
  31. package/dist/{agent-providers-VS6PH55Y.js → agent-providers-JRL3VZA7.js} +3 -3
  32. package/dist/{agent-transcript-BUUHOTZM.js → agent-transcript-ZQDNW3IE.js} +3 -3
  33. package/dist/{analytics-YWJWPUNF.js → analytics-HMYE6EIX.js} +3 -3
  34. package/dist/{apply-BMCYFBEJ.js → apply-F5CHVFC3.js} +3 -3
  35. package/dist/{backfill-YBOKT5LT.js → backfill-JZDQKZHY.js} +9 -9
  36. package/dist/{backlinks-QNNABB4N.js → backlinks-L7XEHBAP.js} +3 -3
  37. package/dist/{bing-KEMXBABP.js → bing-XTMKLVRJ.js} +3 -3
  38. package/dist/{bootstrap-X2AADK4M.js → bootstrap-AEHBYC77.js} +10 -10
  39. package/dist/{cdp-WVYUEV4U.js → cdp-SSIHU3PU.js} +7 -7
  40. package/dist/{chunk-MLOGEXIO.js → chunk-2D7O5UHJ.js} +1 -1
  41. package/dist/{chunk-MD5PHJBX.js → chunk-33LH4ZGF.js} +2 -1
  42. package/dist/{chunk-VR4MYSEH.js → chunk-4KMUJOYL.js} +4 -4
  43. package/dist/{chunk-WSYLDPYF.js → chunk-5SK27UE7.js} +1 -1
  44. package/dist/{chunk-AVISYPUU.js → chunk-6W3ENB2X.js} +61 -7
  45. package/dist/{chunk-ZGUR4AZM.js → chunk-7AXVACK6.js} +2 -2
  46. package/dist/{chunk-WZ4LUM26.js → chunk-7NMCRHQL.js} +3 -3
  47. package/dist/{chunk-UXTNDZKM.js → chunk-7SGZHGZ2.js} +1 -1
  48. package/dist/{chunk-6DJN7HCK.js → chunk-ARIYTYOM.js} +1 -1
  49. package/dist/{chunk-XMIKSCAO.js → chunk-ARYBII44.js} +1 -1
  50. package/dist/{chunk-CBYKQRDH.js → chunk-CZUPNWLH.js} +2 -2
  51. package/dist/{chunk-XEPEMON2.js → chunk-FDRZQH3Y.js} +14 -2
  52. package/dist/{chunk-5DMESZDF.js → chunk-IVBJEVHS.js} +2 -2
  53. package/dist/{chunk-HX3WLTZU.js → chunk-J4CNNYRQ.js} +1 -1
  54. package/dist/{chunk-Y54PMWBH.js → chunk-JPVG5LIE.js} +3 -3
  55. package/dist/{chunk-EKSXR7RJ.js → chunk-K2P2XO6P.js} +1 -1
  56. package/dist/{chunk-AFRCTLUL.js → chunk-K54WGCZV.js} +404 -340
  57. package/dist/{chunk-KJLICF53.js → chunk-LABVR6K7.js} +4 -4
  58. package/dist/{chunk-YP743QX5.js → chunk-LTMQ4MHF.js} +1 -1
  59. package/dist/{chunk-UNCOK6DA.js → chunk-MVRPFLEL.js} +1 -1
  60. package/dist/{chunk-LU3M54IY.js → chunk-PAVSKSKA.js} +1 -1
  61. package/dist/{chunk-IEBMODUI.js → chunk-QXCQSRHL.js} +20 -20
  62. package/dist/{chunk-G6PZEDTH.js → chunk-R42VEDCB.js} +3 -3
  63. package/dist/{chunk-P74TPIWZ.js → chunk-RNA6ZCM6.js} +2 -2
  64. package/dist/{chunk-32BTTG5N.js → chunk-U3EJ5RW7.js} +12 -6
  65. package/dist/{chunk-GTPGYFZ4.js → chunk-V6ALEP33.js} +2 -2
  66. package/dist/{chunk-XEGYSZEV.js → chunk-VPZMSV3Q.js} +235 -6
  67. package/dist/{chunk-XIA6NWIF.js → chunk-W7PA35VJ.js} +4 -4
  68. package/dist/{chunk-NHHZQWMI.js → chunk-XMXYUP7X.js} +1 -1
  69. package/dist/{chunk-2X7DFLMD.js → chunk-Y42G2YKT.js} +8 -8
  70. package/dist/{chunk-37R6GTU7.js → chunk-YIIIYNPW.js} +22 -4
  71. package/dist/{chunk-MOJ2XZXK.js → chunk-ZD5G5QEV.js} +1 -1
  72. package/dist/{chunk-UHLWNU6I.js → chunk-ZU6X4SN2.js} +5 -5
  73. package/dist/{chunk-RRS7U6HQ.js → chunk-ZUXFHO4T.js} +4 -4
  74. package/dist/{citations-ZSI5BOGD.js → citations-NIFKIG6Y.js} +3 -3
  75. package/dist/{cli-catalog-J2HUCGJL.js → cli-catalog-ONYERYPV.js} +3 -3
  76. package/dist/{cli-commands-XFMVFREG.js → cli-commands-LWI2NEWW.js} +7 -7
  77. package/dist/cli.js +13 -13
  78. package/dist/{competitor-WJDN3DLP.js → competitor-NSUSTLNW.js} +3 -3
  79. package/dist/{content-K52YV4BK.js → content-W5VYYMAW.js} +3 -3
  80. package/dist/{dashboard-L6RKTP35.js → dashboard-NNA3P645.js} +6 -6
  81. package/dist/{demo-Y7XRD4X4.js → demo-5M4YGVV4.js} +1 -1
  82. package/dist/{demo-server-QNQX5CNP.js → demo-server-FDR4RKLM.js} +12 -11
  83. package/dist/{discover-UO5M7HQZ.js → discover-VCKMXFOR.js} +3 -3
  84. package/dist/{discover-eval-DN4PS6VN.js → discover-eval-CPVP7EK5.js} +3 -3
  85. package/dist/{doctor-7UYUXG7J.js → doctor-EVCP6PDM.js} +3 -3
  86. package/dist/{evidence-DGKN5SGQ.js → evidence-ZWRGNZWN.js} +3 -3
  87. package/dist/{export-cmd-QAQWWIRL.js → export-cmd-AM6SIRUW.js} +3 -3
  88. package/dist/{ga-4LGTEA6J.js → ga-6J67NDMZ.js} +3 -3
  89. package/dist/{gbp-XOLYZ4XC.js → gbp-ERTWK26L.js} +3 -3
  90. package/dist/{google-CAQDCFA6.js → google-O6VQFK4L.js} +4 -4
  91. package/dist/{google-marketing-HU5I3XPP.js → google-marketing-OEW2YGUR.js} +1 -1
  92. package/dist/{health-cmd-3PEB3M45.js → health-cmd-OPGK37MK.js} +3 -3
  93. package/dist/{history-UGUWYPOY.js → history-WTU4ETCU.js} +3 -3
  94. package/dist/index.d.ts +5 -5
  95. package/dist/index.js +24 -24
  96. package/dist/{init-DEW65BLN.js → init-WTAVKFGR.js} +11 -11
  97. package/dist/{insights-ZC3R4ZYG.js → insights-LPEDLSEV.js} +3 -3
  98. package/dist/intelligence-service-4OO2VQ2I.js +15 -0
  99. package/dist/{journeys-W6F4BCXF.js → journeys-TWVQNRLT.js} +3 -3
  100. package/dist/{keys-ME7VRF73.js → keys-C6FPREBZ.js} +3 -3
  101. package/dist/{keyword-R3PLGSO5.js → keyword-PBSE65DK.js} +3 -3
  102. package/dist/{logs-UM7CWHYB.js → logs-62RUOAKT.js} +3 -3
  103. package/dist/{mcp-BUPP5HC6.js → mcp-P4LNENKX.js} +2 -2
  104. package/dist/mcp.js +9 -9
  105. package/dist/{measurement-plan-R4KZHJII.js → measurement-plan-HKW3IVIE.js} +5 -5
  106. package/dist/{notify-4C26D2MY.js → notify-A3I3G7NK.js} +3 -3
  107. package/dist/{organic-evidence-SLIISYHW.js → organic-evidence-OFUJBDCK.js} +3 -3
  108. package/dist/{overview-JJZZOYQU.js → overview-NSRODN2X.js} +4 -4
  109. package/dist/{project-XJH2OECP.js → project-B5G2HEAB.js} +3 -3
  110. package/dist/{query-ZWAIWIYB.js → query-UQHJVYUJ.js} +3 -3
  111. package/dist/{research-GTVWVZBI.js → research-ZWBJDLJY.js} +3 -3
  112. package/dist/{results-export-CPAWO5AV.js → results-export-FOJYT4MK.js} +3 -3
  113. package/dist/{run-RI2BMD7U.js → run-ZIUQ2TNN.js} +4 -4
  114. package/dist/{schedule-HDDWULBX.js → schedule-B5CORKGT.js} +3 -3
  115. package/dist/{search-TT3Q2BBP.js → search-2XCZKP6A.js} +3 -3
  116. package/dist/{serve-6JYPUU24.js → serve-3BSLRICO.js} +25 -25
  117. package/dist/{session-DDESFV3N.js → session-PILSYOTX.js} +12 -12
  118. package/dist/{settings-4AYXYJVA.js → settings-Y3LVGZH4.js} +3 -3
  119. package/dist/{skills-UFMLMMY5.js → skills-6E3RVQAQ.js} +2 -2
  120. package/dist/{snapshot-KLWQGZB6.js → snapshot-RAV2HCL7.js} +3 -3
  121. package/dist/{src-6IHGEMT2.js → src-VUD6WO5N.js} +2 -2
  122. package/dist/{status-HRIUPGUM.js → status-2WCUV6C2.js} +4 -4
  123. package/dist/{technical-aeo-HKJQHMMS.js → technical-aeo-2TJEHHBR.js} +3 -3
  124. package/dist/{telemetry-IS6KZK32.js → telemetry-LQAD26UJ.js} +4 -4
  125. package/dist/{tools-ZNVQFEAX.js → tools-U6VGYZV2.js} +11 -11
  126. package/dist/{traffic-PFHFGN44.js → traffic-3TBXSHPV.js} +5 -5
  127. package/dist/{users-BSLUSU6W.js → users-2HDDA5GT.js} +3 -3
  128. package/dist/{visibility-stats-MPRNHPZW.js → visibility-stats-HSGT3OL3.js} +3 -3
  129. package/dist/{wordpress-U5XKHURL.js → wordpress-ALODIEFK.js} +3 -3
  130. package/package.json +1 -1
  131. package/assets/assets/MeasurementPropertyPage-x8f7xanT.js +0 -4
  132. package/assets/assets/ProjectPage-CG9I2-B4.js +0 -9
  133. package/assets/assets/SiteHealthSection-BvqFg3rG.js +0 -2
  134. package/assets/assets/ToneBadge-CTWpeKu8.js +0 -60
  135. package/assets/assets/index-BBNs-RhI.js +0 -60
  136. package/assets/assets/react-query-DGmY6hJa.js +0 -1
  137. package/dist/intelligence-service-XRJVXZYI.js +0 -15
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  registeredProviderNames
3
- } from "./chunk-NHHZQWMI.js";
3
+ } from "./chunk-XMXYUP7X.js";
4
4
  import {
5
5
  configExists,
6
6
  loadConfigRaw
7
- } from "./chunk-UNCOK6DA.js";
7
+ } from "./chunk-MVRPFLEL.js";
8
8
 
9
9
  // src/setup-state.ts
10
10
  import fs from "fs";
@@ -28,7 +28,7 @@ async function buildSetupState() {
28
28
  }
29
29
  if (dbPath && fs.existsSync(dbPath)) {
30
30
  try {
31
- const { createClient, projects, queries: queriesTable } = await import("./src-6IHGEMT2.js");
31
+ const { createClient, projects, queries: queriesTable } = await import("./src-VUD6WO5N.js");
32
32
  const db = createClient(dbPath);
33
33
  project_count = db.select({ id: projects.id }).from(projects).all().length;
34
34
  const firstQuery = db.select({ id: queriesTable.id }).from(queriesTable).limit(1).all();
@@ -47,7 +47,7 @@ function queueServeHandoff() {
47
47
  async function runPendingServeHandoff(format) {
48
48
  if (!pendingServeHandoff) return;
49
49
  pendingServeHandoff = false;
50
- const { serveCommand } = await import("./serve-6JYPUU24.js");
50
+ const { serveCommand } = await import("./serve-3BSLRICO.js");
51
51
  await serveCommand(format);
52
52
  }
53
53
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cloudflareQueueNameSchema
3
- } from "./chunk-XEGYSZEV.js";
3
+ } from "./chunk-VPZMSV3Q.js";
4
4
 
5
5
  // src/cloudflare-traffic-config.ts
6
6
  function unsupportedDeliveryMode(deliveryMode) {
@@ -20,7 +20,7 @@ import {
20
20
  resolveProviderModel,
21
21
  schedulableRunKindSchema,
22
22
  sentimentEvaluatorProviderSchema
23
- } from "./chunk-XEGYSZEV.js";
23
+ } from "./chunk-VPZMSV3Q.js";
24
24
 
25
25
  // ../config/src/index.ts
26
26
  import { z as z4 } from "zod";
@@ -23,7 +23,7 @@ import {
23
23
  measurementDraftUpsertGroupRequestSchema,
24
24
  measurementDraftUpsertMarketRequestSchema,
25
25
  measurementDraftUpsertTargetRequestSchema
26
- } from "./chunk-XEGYSZEV.js";
26
+ } from "./chunk-VPZMSV3Q.js";
27
27
 
28
28
  // src/measurement-draft-actions.ts
29
29
  import { z } from "zod";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  answerServiceAdapters,
3
3
  answerServiceDescriptors
4
- } from "./chunk-XMIKSCAO.js";
4
+ } from "./chunk-ARYBII44.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-32BTTG5N.js";
30
+ } from "./chunk-U3EJ5RW7.js";
31
31
  import {
32
32
  AeroToolProfiles,
33
33
  AeroToolScopes,
34
34
  buildAeroStateTools,
35
35
  isAeroToolProfile,
36
36
  truncateToolResult
37
- } from "./chunk-XIA6NWIF.js";
37
+ } from "./chunk-W7PA35VJ.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-YP743QX5.js";
56
+ } from "./chunk-LTMQ4MHF.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-5DMESZDF.js";
67
+ } from "./chunk-IVBJEVHS.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-RRS7U6HQ.js";
79
+ } from "./chunk-ZUXFHO4T.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-NHHZQWMI.js";
87
+ } from "./chunk-XMXYUP7X.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-ZGUR4AZM.js";
98
+ } from "./chunk-7AXVACK6.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-VR4MYSEH.js";
101
+ } from "./chunk-4KMUJOYL.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-XEPEMON2.js";
108
+ } from "./chunk-FDRZQH3Y.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-UNCOK6DA.js";
139
+ } from "./chunk-MVRPFLEL.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
- } from "./chunk-MLOGEXIO.js";
142
+ } from "./chunk-2D7O5UHJ.js";
143
143
  import {
144
144
  computeFactorAverages,
145
145
  deleteSiteCrawlGraphLayout,
146
146
  persistSiteCrawlGraphLayout,
147
147
  prepareSiteCrawlGraphLayout,
148
148
  recordedSharePct
149
- } from "./chunk-P74TPIWZ.js";
149
+ } from "./chunk-RNA6ZCM6.js";
150
150
  import {
151
151
  CanonryMcpToolNames,
152
152
  canonryMcpTools
153
- } from "./chunk-37R6GTU7.js";
153
+ } from "./chunk-YIIIYNPW.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-UHLWNU6I.js";
165
+ } from "./chunk-ZU6X4SN2.js";
166
166
  import {
167
167
  computeCitedCompetitorDomains,
168
168
  determineCitationState
169
- } from "./chunk-EKSXR7RJ.js";
169
+ } from "./chunk-K2P2XO6P.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-AVISYPUU.js";
289
+ } from "./chunk-6W3ENB2X.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-6DJN7HCK.js";
375
+ } from "./chunk-ARIYTYOM.js";
376
376
  import {
377
377
  AGENT_MEMORY_VALUE_MAX_BYTES,
378
378
  AI_ENGINE_DOMAINS,
@@ -621,7 +621,7 @@ import {
621
621
  winnabilityClassLabel,
622
622
  withRetry,
623
623
  withSkippedProviders
624
- } from "./chunk-XEGYSZEV.js";
624
+ } from "./chunk-VPZMSV3Q.js";
625
625
 
626
626
  // src/google-marketing-runtime.ts
627
627
  import crypto2 from "crypto";
@@ -5804,7 +5804,7 @@ function nonBlank(value) {
5804
5804
  return trimmed ? trimmed : void 0;
5805
5805
  }
5806
5806
  function resolveBuildCommit(env = process.env) {
5807
- const embedded = true ? "bc41644d8fe1f58eb00fd3cf4e6fc224834d7d24" : void 0;
5807
+ const embedded = true ? "4030f8c56ac36f1152e96e1f1d51596dcb592e84" : void 0;
5808
5808
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5809
5809
  }
5810
5810
  function resolveInstanceIdentity(env = process.env) {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-XEPEMON2.js";
3
+ } from "./chunk-FDRZQH3Y.js";
4
4
  import {
5
5
  emitJsonl
6
6
  } from "./chunk-Z7IUAJOF.js";
7
7
  import {
8
8
  measurementDraftOperationSchema,
9
9
  runMeasurementDraftAction
10
- } from "./chunk-LU3M54IY.js";
10
+ } from "./chunk-PAVSKSKA.js";
11
11
  import {
12
12
  isMachineFormat,
13
13
  systemError
@@ -37,7 +37,7 @@ import {
37
37
  unattributedAnswersLabel,
38
38
  uncheckedSourcesLabel,
39
39
  visibilityReportRequestSchema
40
- } from "./chunk-XEGYSZEV.js";
40
+ } from "./chunk-VPZMSV3Q.js";
41
41
 
42
42
  // src/commands/measurement-plan.ts
43
43
  import crypto from "crypto";
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-6DJN7HCK.js";
8
+ } from "./chunk-ARIYTYOM.js";
9
9
  import {
10
10
  SITE_CRAWL_GRAPH_MAX_EDGES,
11
11
  SITE_CRAWL_GRAPH_MAX_NODES,
@@ -15,7 +15,7 @@ import {
15
15
  factorStatusFromDistribution,
16
16
  factorStatusFromScore,
17
17
  roundPreservingTotal
18
- } from "./chunk-XEGYSZEV.js";
18
+ } from "./chunk-VPZMSV3Q.js";
19
19
 
20
20
  // src/site-audit-factors.ts
21
21
  function recordedSharePct(factor) {
@@ -5,7 +5,7 @@ import {
5
5
  isStoredPageReadTool,
6
6
  isStoredReadTool,
7
7
  truncateToolResult
8
- } from "./chunk-XIA6NWIF.js";
8
+ } from "./chunk-W7PA35VJ.js";
9
9
  import {
10
10
  CANONRY_MCP_TOOLKITS
11
11
  } from "./chunk-NDTU7FGL.js";
@@ -22,23 +22,24 @@ import {
22
22
  resolveApiKeyFor,
23
23
  resolveModelForProvider,
24
24
  validateAgentProviderRegistry
25
- } from "./chunk-UNCOK6DA.js";
25
+ } from "./chunk-MVRPFLEL.js";
26
26
  import {
27
27
  CanonryMcpToolNames,
28
28
  canonryMcpTools
29
- } from "./chunk-37R6GTU7.js";
29
+ } from "./chunk-YIIIYNPW.js";
30
30
  import {
31
31
  agentToolEvents,
32
32
  llmUsageEvents
33
- } from "./chunk-6DJN7HCK.js";
33
+ } from "./chunk-ARIYTYOM.js";
34
34
  import {
35
35
  MeasurementPortfolioLists,
36
+ SeoCapabilities,
36
37
  agentTurnLimitsSchema,
37
38
  agentVisibilityEvidence,
38
39
  describeError,
39
40
  validationError,
40
41
  visibilityReportRequestSchema
41
- } from "./chunk-XEGYSZEV.js";
42
+ } from "./chunk-VPZMSV3Q.js";
42
43
 
43
44
  // src/agent/session.ts
44
45
  import fs3 from "fs";
@@ -765,14 +766,19 @@ async function readAeroViewEvidence(options) {
765
766
  const base = `/${(options.basePath ?? "").replace(/^\/+|\/+$/g, "")}`.replace(/\/$/, "");
766
767
  if (context?.view === "seo") {
767
768
  const overview = await client.getSeoOverview(projectName, { profileId: context.seoProfileId, runId: context.seoRunId });
769
+ const evidence2 = overview.evidenceRun;
770
+ const marketRankings = evidence2?.capabilities.includes(SeoCapabilities["market-rankings"]) ? await client.getSeoMarketRankingSummary(projectName, { profileId: evidence2.profileId, runId: evidence2.id, regionKey: context.seoRegionKey, marketKey: context.seoMarketKey }) : void 0;
768
771
  const search = new URLSearchParams(context.seoProfileId ? { seoProfileId: context.seoProfileId } : {});
769
772
  if (context.seoRunId) search.set("seoRunId", context.seoRunId);
773
+ if (context.seoRegionKey) search.set("seoRegion", context.seoRegionKey);
774
+ if (context.seoMarketKey) search.set("seoMarket", context.seoMarketKey);
770
775
  return {
771
776
  context,
772
777
  retrievedAt: (/* @__PURE__ */ new Date()).toISOString(),
773
778
  source: { label: "Open SEO data", href: `${base}/projects/${encodeURIComponent(projectName)}/seo-data?${search}` },
774
779
  overview,
775
- interpretation: "Stored third-party SEO estimates. Preserve profile, scope, locale, dataset and collection date. Estimates are not Search Console observations or AI citation and mention coverage. Missing or partial data is not zero. This read does not refresh data."
780
+ ...marketRankings ? { marketRankings } : {},
781
+ interpretation: "Stored third-party SEO estimates. Preserve profile, scope, locale, dataset and collection date. Estimates are not Search Console observations or AI citation and mention coverage. Missing or partial data is not zero. This read does not refresh data." + (marketRankings ? " Market rankings are observed Google positions of tracked non-brand queries, counted by rank band for the region or market on screen; a failed or unsearched query has no rank. Read its rows with canonry_seo_market_rankings and the same keys." : "")
776
782
  };
777
783
  }
778
784
  if (context?.view === "site-health") {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  trackIntegrationConnection
3
- } from "./chunk-RRS7U6HQ.js";
3
+ } from "./chunk-ZUXFHO4T.js";
4
4
  import {
5
5
  cliRuntimeContext
6
- } from "./chunk-ZGUR4AZM.js";
6
+ } from "./chunk-7AXVACK6.js";
7
7
 
8
8
  // src/cli-connection-telemetry.ts
9
9
  function trackCliConnection(properties) {
@@ -13366,6 +13366,7 @@ var STORED_READ_OPERATIONS = /* @__PURE__ */ new Set([
13366
13366
  "GET /api/v1/projects/{name}/seo/domain-intelligence",
13367
13367
  "GET /api/v1/projects/{name}/seo/ranked-keywords",
13368
13368
  "GET /api/v1/projects/{name}/seo/market-rankings",
13369
+ "GET /api/v1/projects/{name}/seo/market-rankings/summary",
13369
13370
  "GET /api/v1/projects/{name}/gbp/local-post-attempt",
13370
13371
  "GET /api/v1/openapi.json",
13371
13372
  "GET /api/v1/screenshots/{snapshotId}",
@@ -21386,6 +21387,7 @@ var seoMarketRankingContextSchema = z66.object({
21386
21387
  queryText: z66.string(),
21387
21388
  queryClass: queryClassSchema
21388
21389
  }).strict();
21390
+ var seoMarketRankingCompetitorSchema = z66.object({ domain: z66.string(), rankOrganic: z66.number().int().positive() }).strict();
21389
21391
  var seoMarketRankingSearchStatusSchema = z66.enum(["completed", "partial", "failed", "cancelled"]);
21390
21392
  var SeoMarketRankingSearchStatuses = seoMarketRankingSearchStatusSchema.enum;
21391
21393
  var seoMarketRankingSchema = seoMarketRankingContextSchema.extend({
@@ -21399,11 +21401,18 @@ var seoMarketRankingSchema = seoMarketRankingContextSchema.extend({
21399
21401
  url: z66.string().nullable(),
21400
21402
  /** Organic results the search checked: the requested depth, less when partial, 0 when it failed or never ran. */
21401
21403
  depth: z66.number().int().nonnegative(),
21402
- /** Tracked competitors found in the same results, by their best organic position. */
21403
- competitors: z66.array(z66.object({ domain: z66.string(), rankOrganic: z66.number().int().positive() }).strict()),
21404
+ /** Tracked competitors found in the same results at their best organic position, best first. */
21405
+ competitors: z66.array(seoMarketRankingCompetitorSchema),
21404
21406
  /** Where the results came from; null when the search returned none. */
21405
21407
  provenance: seoProvenanceSchema.nullable()
21406
21408
  }).strict();
21409
+ var seoMarketRankingOutcomeSchema = z66.enum(["page-1", "ranks-11-20", "ranks-21-plus", "not-ranked", "partly-checked", "failed", "cancelled"]);
21410
+ var SeoMarketRankingOutcomes = seoMarketRankingOutcomeSchema.enum;
21411
+ var seoMarketRankingRowSchema = seoMarketRankingSchema.extend({
21412
+ outcome: seoMarketRankingOutcomeSchema,
21413
+ /** A tracked competitor ranks above the target in these results, or ranks while the target is not in them. */
21414
+ rivalAhead: z66.boolean()
21415
+ }).strict();
21407
21416
  var seoResultsSchema = z66.object({
21408
21417
  keywordMetrics: z66.array(seoKeywordMetricsSchema),
21409
21418
  domainIntelligence: z66.array(seoDomainIntelligenceSchema),
@@ -21488,11 +21497,57 @@ var seoPageShape = {
21488
21497
  var seoKeywordMetricsListSchema = z66.object({ ...seoPageShape, items: z66.array(seoKeywordMetricsSchema) }).strict();
21489
21498
  var seoDomainIntelligenceListSchema = z66.object({ ...seoPageShape, items: z66.array(seoDomainIntelligenceSchema) }).strict();
21490
21499
  var seoRankedKeywordListSchema = z66.object({ ...seoPageShape, items: z66.array(seoRankedKeywordSchema) }).strict();
21500
+ var seoMarketRankingFilterSchema = z66.enum(["needs-work", "page-1", "ranks-11-20", "ranks-21-plus", "not-ranked", "partly-checked", "rival-ahead", "failed", "cancelled"]);
21501
+ var SeoMarketRankingFilters = seoMarketRankingFilterSchema.enum;
21502
+ var seoMarketRankingSortSchema = z66.enum(["market", "rank", "-rank", "query", "-query"]);
21503
+ var SeoMarketRankingSorts = seoMarketRankingSortSchema.enum;
21491
21504
  var seoMarketRankingQuerySchema = seoEvidenceQuerySchema.extend({
21505
+ marketKey: z66.string().min(1).max(200).optional(),
21506
+ regionKey: z66.string().min(1).max(200).optional(),
21507
+ outcome: seoMarketRankingFilterSchema.optional(),
21508
+ /** Case-insensitive text found in the query, its searched text or its market label. */
21509
+ q: z66.string().trim().min(1).max(200).optional(),
21510
+ sort: seoMarketRankingSortSchema.optional()
21511
+ }).strict();
21512
+ var seoMarketRankingListSchema = z66.object({ ...seoPageShape, items: z66.array(seoMarketRankingRowSchema) }).strict();
21513
+ var seoMarketRankingCountsSchema = z66.object({
21514
+ queries: z66.number().int().nonnegative(),
21515
+ page1: z66.number().int().nonnegative(),
21516
+ ranks11To20: z66.number().int().nonnegative(),
21517
+ ranks21Plus: z66.number().int().nonnegative(),
21518
+ /** Not in the requested depth: only searches that checked all of it, never a partial one. */
21519
+ notRanked: z66.number().int().nonnegative(),
21520
+ /** A partial search that did not reach the site; ranks past what it checked are unknown. */
21521
+ partlyChecked: z66.number().int().nonnegative(),
21522
+ failed: z66.number().int().nonnegative(),
21523
+ cancelled: z66.number().int().nonnegative(),
21524
+ needsWork: z66.number().int().nonnegative(),
21525
+ /** Rows where a tracked competitor ranks above the target; overlaps the outcome counts. */
21526
+ rivalAhead: z66.number().int().nonnegative()
21527
+ }).strict();
21528
+ var seoMarketRankingGroupKindSchema = z66.enum(["region", "market"]);
21529
+ var SeoMarketRankingGroupKinds = seoMarketRankingGroupKindSchema.enum;
21530
+ var seoMarketRankingGroupSchema = z66.object({
21531
+ key: z66.string(),
21532
+ label: z66.string(),
21533
+ kind: seoMarketRankingGroupKindSchema,
21534
+ counts: seoMarketRankingCountsSchema
21535
+ }).strict();
21536
+ var seoMarketRankingSummaryQuerySchema = seoEvidenceQuerySchema.pick({ profileId: true, runId: true }).extend({
21492
21537
  marketKey: z66.string().min(1).max(200).optional(),
21493
21538
  regionKey: z66.string().min(1).max(200).optional()
21494
21539
  }).strict();
21495
- var seoMarketRankingListSchema = z66.object({ ...seoPageShape, items: z66.array(seoMarketRankingSchema) }).strict();
21540
+ var seoMarketRankingSummarySchema = z66.object({
21541
+ runId: z66.string().nullable(),
21542
+ depth: z66.number().int().positive().nullable(),
21543
+ regionKey: z66.string().nullable(),
21544
+ marketKey: z66.string().nullable(),
21545
+ /** Names of the selected region and market; null when none is selected or the refresh has no rows for it. */
21546
+ regionLabel: z66.string().nullable(),
21547
+ marketLabel: z66.string().nullable(),
21548
+ totals: seoMarketRankingCountsSchema,
21549
+ groups: z66.array(seoMarketRankingGroupSchema)
21550
+ }).strict();
21496
21551
  var seoOverviewSchema = z66.object({
21497
21552
  status: seoStatusSchema,
21498
21553
  profiles: z66.array(seoProfileSchema),
@@ -21509,6 +21564,7 @@ var seoOverviewSchema = z66.object({
21509
21564
  keywordMetricsCount: z66.number().int().nonnegative(),
21510
21565
  domainIntelligenceCount: z66.number().int().nonnegative(),
21511
21566
  rankedKeywordCount: z66.number().int().nonnegative(),
21567
+ /** Rows the market-rankings read returns for the evidence refresh, searches that failed or never ran included. */
21512
21568
  marketRankingCount: z66.number().int().nonnegative()
21513
21569
  }).strict();
21514
21570
  var seoMicrosSchema = z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER);
@@ -23311,11 +23367,11 @@ function resolveModelPrice(provider, model, overrides) {
23311
23367
  }
23312
23368
  return null;
23313
23369
  }
23314
- function estimateAnswerCostMicros(usage, price, tier) {
23370
+ function estimateAnswerCostMicros(usage, price, tier2) {
23315
23371
  const cachedInputRate = price.cachedInputPerMTok ?? DEFAULT_CACHED_INPUT_MULTIPLIER * price.inputPerMTok;
23316
23372
  const cacheWriteRate = price.cacheWritePerMTok ?? DEFAULT_CACHE_WRITE_MULTIPLIER * price.inputPerMTok;
23317
23373
  const tokenMicros = usage.inputTokens * price.inputPerMTok + usage.cachedInputTokens * cachedInputRate + usage.cacheWriteTokens * cacheWriteRate + usage.outputTokens * price.outputPerMTok;
23318
- const tierMultiplier = tier === PricingTiers.batch ? price.batchTokenDiscount ?? DEFAULT_BATCH_TOKEN_DISCOUNT : 1;
23374
+ const tierMultiplier = tier2 === PricingTiers.batch ? price.batchTokenDiscount ?? DEFAULT_BATCH_TOKEN_DISCOUNT : 1;
23319
23375
  const billedSearchUnits = price.searchUnit === SearchUnits.prompt ? usage.searchCount > 0 ? 1 : 0 : usage.searchCount;
23320
23376
  const searchMicros = billedSearchUnits * (price.searchPer1k ?? 0) * 1e3;
23321
23377
  return Math.round(tokenMicros * tierMultiplier + searchMicros);
@@ -23821,6 +23877,9 @@ var agentViewContextSchema = z82.object({
23821
23877
  view: z82.enum(["project", "visibility", "property", "queries", "site-health", "seo"]),
23822
23878
  seoProfileId: z82.string().trim().min(1).max(128).optional(),
23823
23879
  seoRunId: z82.string().trim().min(1).max(128).optional(),
23880
+ /** The market-rankings region and market the SEO view is narrowed to. */
23881
+ seoRegionKey: z82.string().trim().min(1).max(200).optional(),
23882
+ seoMarketKey: z82.string().trim().min(1).max(200).optional(),
23824
23883
  unavailableReason: z82.string().trim().min(1).max(512).optional(),
23825
23884
  selection: visibilityReportRequestSchema.optional(),
23826
23885
  page: z82.object({
@@ -23830,6 +23889,7 @@ var agentViewContextSchema = z82.object({
23830
23889
  }).strict().superRefine((value, ctx) => {
23831
23890
  if (value.seoProfileId && value.view !== "seo") ctx.addIssue({ code: "custom", message: "SEO profile context requires the SEO view." });
23832
23891
  if (value.seoRunId && value.view !== "seo") ctx.addIssue({ code: "custom", message: "SEO run context requires the SEO view." });
23892
+ if ((value.seoRegionKey || value.seoMarketKey) && value.view !== "seo") ctx.addIssue({ code: "custom", message: "SEO market context requires the SEO view." });
23833
23893
  if (value.page && value.view !== "site-health") ctx.addIssue({ code: "custom", message: "Page context requires Site Health." });
23834
23894
  if (value.selection && !["visibility", "property", "queries"].includes(value.view)) ctx.addIssue({ code: "custom", message: "Measurement selection requires a measurement view." });
23835
23895
  });
@@ -26152,6 +26212,162 @@ var cliCatalogSchema = z92.object({
26152
26212
  }))
26153
26213
  });
26154
26214
 
26215
+ // ../contracts/src/seo-market-rankings.ts
26216
+ var PAGE_ONE_LAST_RANK = 10;
26217
+ var CLOSE_LAST_RANK = 20;
26218
+ function bestCompetitorRank(competitors) {
26219
+ return competitors.reduce((best, competitor) => best === null || competitor.rankOrganic < best ? competitor.rankOrganic : best, null);
26220
+ }
26221
+ function outcomeOf(row) {
26222
+ switch (row.searchStatus) {
26223
+ case SeoMarketRankingSearchStatuses.failed:
26224
+ return SeoMarketRankingOutcomes.failed;
26225
+ case SeoMarketRankingSearchStatuses.cancelled:
26226
+ return SeoMarketRankingOutcomes.cancelled;
26227
+ case SeoMarketRankingSearchStatuses.completed:
26228
+ case SeoMarketRankingSearchStatuses.partial: {
26229
+ const rank = row.rankOrganic;
26230
+ if (rank === null) return row.searchStatus === SeoMarketRankingSearchStatuses.partial ? SeoMarketRankingOutcomes["partly-checked"] : SeoMarketRankingOutcomes["not-ranked"];
26231
+ if (rank <= PAGE_ONE_LAST_RANK) return SeoMarketRankingOutcomes["page-1"];
26232
+ return rank <= CLOSE_LAST_RANK ? SeoMarketRankingOutcomes["ranks-11-20"] : SeoMarketRankingOutcomes["ranks-21-plus"];
26233
+ }
26234
+ default: {
26235
+ const unknown = row.searchStatus;
26236
+ return unknown;
26237
+ }
26238
+ }
26239
+ }
26240
+ function marketRankingRow(row) {
26241
+ const best = bestCompetitorRank(row.competitors);
26242
+ return { ...row, outcome: outcomeOf(row), rivalAhead: best !== null && (row.rankOrganic === null || best < row.rankOrganic) };
26243
+ }
26244
+ function matchesMarketRankingFilter(row, filter) {
26245
+ switch (filter) {
26246
+ case SeoMarketRankingFilters["needs-work"]:
26247
+ return row.outcome === SeoMarketRankingOutcomes["ranks-11-20"] || row.outcome === SeoMarketRankingOutcomes["ranks-21-plus"] || row.outcome === SeoMarketRankingOutcomes["not-ranked"] || row.outcome === SeoMarketRankingOutcomes["partly-checked"];
26248
+ case SeoMarketRankingFilters["rival-ahead"]:
26249
+ return row.rivalAhead;
26250
+ case SeoMarketRankingFilters["page-1"]:
26251
+ case SeoMarketRankingFilters["ranks-11-20"]:
26252
+ case SeoMarketRankingFilters["ranks-21-plus"]:
26253
+ case SeoMarketRankingFilters["not-ranked"]:
26254
+ case SeoMarketRankingFilters["partly-checked"]:
26255
+ case SeoMarketRankingFilters.failed:
26256
+ case SeoMarketRankingFilters.cancelled:
26257
+ return row.outcome === filter;
26258
+ default: {
26259
+ const unknown = filter;
26260
+ return unknown;
26261
+ }
26262
+ }
26263
+ }
26264
+ function matchesMarketRankingText(row, text) {
26265
+ const needle = text.trim().toLowerCase();
26266
+ return !needle || [row.queryText, row.searchText, row.marketLabel].some((value) => value.toLowerCase().includes(needle));
26267
+ }
26268
+ var byMarket = (a, b) => compareText(a.regionLabel ?? "", b.regionLabel ?? "") || compareText(a.marketLabel, b.marketLabel) || compareText(a.searchText, b.searchText) || compareText(a.queryText, b.queryText);
26269
+ var byQuery = (a, b) => compareText(a.queryText.toLowerCase(), b.queryText.toLowerCase()) || byMarket(a, b);
26270
+ function tier(row) {
26271
+ switch (row.outcome) {
26272
+ case SeoMarketRankingOutcomes["page-1"]:
26273
+ case SeoMarketRankingOutcomes["ranks-11-20"]:
26274
+ case SeoMarketRankingOutcomes["ranks-21-plus"]:
26275
+ return 0;
26276
+ case SeoMarketRankingOutcomes["partly-checked"]:
26277
+ return 1;
26278
+ case SeoMarketRankingOutcomes["not-ranked"]:
26279
+ return 2;
26280
+ case SeoMarketRankingOutcomes.failed:
26281
+ return 3;
26282
+ case SeoMarketRankingOutcomes.cancelled:
26283
+ return 4;
26284
+ default: {
26285
+ const unknown = row.outcome;
26286
+ return unknown;
26287
+ }
26288
+ }
26289
+ }
26290
+ function worst(row) {
26291
+ const order = tier(row);
26292
+ return order === 2 ? 0 : order === 0 ? 2 : order;
26293
+ }
26294
+ var unranked = (row) => tier(row) === 1 || tier(row) === 2;
26295
+ var rivalOrder = (a, b) => (bestCompetitorRank(a.competitors) ?? Number.MAX_SAFE_INTEGER) - (bestCompetitorRank(b.competitors) ?? Number.MAX_SAFE_INTEGER);
26296
+ function compareMarketRankingsBy(sort) {
26297
+ switch (sort) {
26298
+ case SeoMarketRankingSorts.market:
26299
+ return byMarket;
26300
+ case SeoMarketRankingSorts.query:
26301
+ return byQuery;
26302
+ case SeoMarketRankingSorts["-query"]:
26303
+ return (a, b) => byQuery(b, a);
26304
+ case SeoMarketRankingSorts.rank:
26305
+ return (a, b) => tier(a) - tier(b) || (a.rankOrganic !== null && b.rankOrganic !== null ? a.rankOrganic - b.rankOrganic : 0) || (unranked(a) ? rivalOrder(a, b) : 0) || byQuery(a, b);
26306
+ case SeoMarketRankingSorts["-rank"]:
26307
+ return (a, b) => worst(a) - worst(b) || (a.rankOrganic !== null && b.rankOrganic !== null ? b.rankOrganic - a.rankOrganic : 0) || (unranked(a) ? rivalOrder(a, b) : 0) || byQuery(a, b);
26308
+ default: {
26309
+ const unknown = sort;
26310
+ return unknown;
26311
+ }
26312
+ }
26313
+ }
26314
+ function marketRankingBands(depth, totals) {
26315
+ const fills = (count3, firstRank) => depth === null || depth >= firstRank || (totals?.[count3] ?? 0) > 0;
26316
+ const bands = [{ count: "page1", filter: SeoMarketRankingFilters["page-1"], label: "Page 1" }];
26317
+ if (fills("ranks11To20", 11)) bands.push({ count: "ranks11To20", filter: SeoMarketRankingFilters["ranks-11-20"], label: "11-20" });
26318
+ if (fills("ranks21Plus", 21)) bands.push({ count: "ranks21Plus", filter: SeoMarketRankingFilters["ranks-21-plus"], label: depth === null || depth <= 21 ? "21 and deeper" : `21-${depth}` });
26319
+ bands.push({ count: "notRanked", filter: SeoMarketRankingFilters["not-ranked"], label: depth === null ? "Not ranked" : `Not in top ${depth}` });
26320
+ return bands;
26321
+ }
26322
+ function countMarketRankings(rows) {
26323
+ const counts = { queries: rows.length, page1: 0, ranks11To20: 0, ranks21Plus: 0, notRanked: 0, partlyChecked: 0, failed: 0, cancelled: 0, needsWork: 0, rivalAhead: 0 };
26324
+ for (const row of rows) {
26325
+ switch (row.outcome) {
26326
+ case SeoMarketRankingOutcomes["page-1"]:
26327
+ counts.page1++;
26328
+ break;
26329
+ case SeoMarketRankingOutcomes["ranks-11-20"]:
26330
+ counts.ranks11To20++;
26331
+ break;
26332
+ case SeoMarketRankingOutcomes["ranks-21-plus"]:
26333
+ counts.ranks21Plus++;
26334
+ break;
26335
+ case SeoMarketRankingOutcomes["not-ranked"]:
26336
+ counts.notRanked++;
26337
+ break;
26338
+ case SeoMarketRankingOutcomes["partly-checked"]:
26339
+ counts.partlyChecked++;
26340
+ break;
26341
+ case SeoMarketRankingOutcomes.failed:
26342
+ counts.failed++;
26343
+ break;
26344
+ case SeoMarketRankingOutcomes.cancelled:
26345
+ counts.cancelled++;
26346
+ break;
26347
+ default: {
26348
+ const unknown = row.outcome;
26349
+ return unknown;
26350
+ }
26351
+ }
26352
+ if (row.rivalAhead) counts.rivalAhead++;
26353
+ }
26354
+ counts.needsWork = counts.ranks11To20 + counts.ranks21Plus + counts.notRanked + counts.partlyChecked;
26355
+ return counts;
26356
+ }
26357
+ function groupMarketRankings(rows, scope) {
26358
+ if (scope.marketKey !== void 0) return [];
26359
+ const groups = /* @__PURE__ */ new Map();
26360
+ for (const row of rows) {
26361
+ const region = scope.regionKey === void 0 && row.regionKey !== null;
26362
+ const key = region ? row.regionKey : row.marketKey;
26363
+ const id2 = `${region ? "region" : "market"}\0${key}`;
26364
+ const group = groups.get(id2) ?? { key, label: region ? row.regionLabel ?? key : row.marketLabel, kind: region ? SeoMarketRankingGroupKinds.region : SeoMarketRankingGroupKinds.market, rows: [] };
26365
+ group.rows.push(row);
26366
+ groups.set(id2, group);
26367
+ }
26368
+ return [...groups.values()].map((group) => ({ key: group.key, label: group.label, kind: group.kind, counts: countMarketRankings(group.rows) })).sort((a, b) => b.counts.ranks11To20 - a.counts.ranks11To20 || b.counts.ranks21Plus - a.counts.ranks21Plus || compareText(a.label, b.label) || compareText(a.key, b.key));
26369
+ }
26370
+
26155
26371
  export {
26156
26372
  apiKeyDtoSchema,
26157
26373
  apiKeyListDtoSchema,
@@ -27387,6 +27603,7 @@ export {
27387
27603
  seoQuoteSchema,
27388
27604
  seoSyncInputSchema,
27389
27605
  SeoMarketRankingSearchStatuses,
27606
+ SeoMarketRankingOutcomes,
27390
27607
  emptySeoResults,
27391
27608
  seoSearchTextForQuery,
27392
27609
  seoRunSchema,
@@ -27396,11 +27613,23 @@ export {
27396
27613
  seoKeywordMetricsListSchema,
27397
27614
  seoDomainIntelligenceListSchema,
27398
27615
  seoRankedKeywordListSchema,
27616
+ seoMarketRankingFilterSchema,
27617
+ seoMarketRankingSortSchema,
27618
+ SeoMarketRankingSorts,
27399
27619
  seoMarketRankingQuerySchema,
27400
27620
  seoMarketRankingListSchema,
27621
+ seoMarketRankingSummaryQuerySchema,
27622
+ seoMarketRankingSummarySchema,
27401
27623
  seoOverviewSchema,
27402
27624
  seoOperatorTaskSchema,
27403
27625
  seoReconcileInputSchema,
27404
27626
  seoReconcileResultSchema,
27405
- SeoAdapterOutcomes
27627
+ SeoAdapterOutcomes,
27628
+ marketRankingRow,
27629
+ matchesMarketRankingFilter,
27630
+ matchesMarketRankingText,
27631
+ compareMarketRankingsBy,
27632
+ marketRankingBands,
27633
+ countMarketRankings,
27634
+ groupMarketRankings
27406
27635
  };