@canonry/canonry 7.65.1 → 7.66.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 (135) hide show
  1. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +15 -1
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +1 -1
  3. package/assets/assets/{AgentSetupPage-BDLMjn1I.js → AgentSetupPage-DXFxOJ1W.js} +1 -1
  4. package/assets/assets/{AuditHistoryPanel-qhIB8KRK.js → AuditHistoryPanel-CS8UfTHc.js} +1 -1
  5. package/assets/assets/{BacklinksPage-iWrZ0-Pp.js → BacklinksPage-D5IA2tNY.js} +1 -1
  6. package/assets/assets/{HistoryPage-BP1_GGlT.js → HistoryPage-DsQAUkgR.js} +1 -1
  7. package/assets/assets/MeasurementPropertyPage-CdCnjCaS.js +4 -0
  8. package/assets/assets/ProjectPage-D3oFKnBG.js +9 -0
  9. package/assets/assets/{RunsPage-Ddd2oE1Y.js → RunsPage-BgjN1N3t.js} +1 -1
  10. package/assets/assets/{SettingsPage-D_QdYWDO.js → SettingsPage-BQuqnEvm.js} +1 -1
  11. package/assets/assets/SiteHealthSection-C6QE9xNk.js +2 -0
  12. package/assets/assets/ToneBadge-DNva5_AM.js +60 -0
  13. package/assets/assets/{TrafficPage-VnBUE1S6.js → TrafficPage-BBqpvwl5.js} +2 -2
  14. package/assets/assets/{TrafficSourceDetailPage-CdoL5Dt9.js → TrafficSourceDetailPage-uxd0ojry.js} +1 -1
  15. package/assets/assets/{account-context-CWRd3KeS.js → account-context-wRthfm6K.js} +1 -1
  16. package/assets/assets/{card-Cb_fM36G.js → card-Bq64-UB5.js} +1 -1
  17. package/assets/assets/{extract-error-message-DSIAoHTR.js → extract-error-message-BRDc8As2.js} +1 -1
  18. package/assets/assets/{format-helpers-CxNDa1oa.js → format-helpers-D5wFtgg2.js} +1 -1
  19. package/assets/assets/{index-D6WlecSB.js → index-Ttz5_bL3.js} +13 -13
  20. package/assets/assets/{query-client-DLdAMlsX.js → query-client-IopmAOx0.js} +1 -1
  21. package/assets/assets/react-query-CISHjSch.js +1 -0
  22. package/assets/assets/{react-sigma_core.esm.min-DEG8vFYD.js → react-sigma_core.esm.min-d72rX0Uo.js} +1 -1
  23. package/assets/assets/{service-DKP-BIBy.js → service-DsDxSQuN.js} +1 -1
  24. package/assets/index.html +7 -7
  25. package/dist/{ads-D4WQOT5K.js → ads-IFKZU7SC.js} +3 -3
  26. package/dist/{agent-E3IYC7OJ.js → agent-3KMENHL3.js} +7 -7
  27. package/dist/{agent-ask-ZSKRPB2Z.js → agent-ask-7WVQLLD5.js} +3 -3
  28. package/dist/{agent-conversations-YHPYPQE2.js → agent-conversations-5LR67TBD.js} +3 -3
  29. package/dist/{agent-memory-6OWOOD5O.js → agent-memory-GKUCCKVX.js} +3 -3
  30. package/dist/{agent-providers-7KZK37UO.js → agent-providers-TVCRM3YZ.js} +3 -3
  31. package/dist/{agent-transcript-3O7GPML6.js → agent-transcript-MUTCOOWG.js} +3 -3
  32. package/dist/{analytics-P2LLIUYK.js → analytics-2IXSG5ML.js} +3 -3
  33. package/dist/{apply-VBNNJOCT.js → apply-7RIYK4VC.js} +3 -3
  34. package/dist/{backfill-F5SSURCH.js → backfill-VU3FV6DQ.js} +9 -9
  35. package/dist/{backlinks-4RE3TNNA.js → backlinks-DLSRYEX2.js} +3 -3
  36. package/dist/{bing-V6UN7D44.js → bing-4CXTZUH4.js} +3 -3
  37. package/dist/{bootstrap-SHTSPAI5.js → bootstrap-OOHSBSDQ.js} +10 -10
  38. package/dist/{cdp-GDL2VFI3.js → cdp-Y53SRSRV.js} +7 -7
  39. package/dist/{chunk-ZWZOQNLD.js → chunk-2YBEI6LE.js} +1 -1
  40. package/dist/{chunk-SL3Y7IOX.js → chunk-6ASEI24F.js} +1 -1
  41. package/dist/{chunk-HI2HCYLB.js → chunk-743NYXIK.js} +2 -2
  42. package/dist/{chunk-BV6NXSAH.js → chunk-ALQEGGYM.js} +21 -3
  43. package/dist/{chunk-JSAYC36T.js → chunk-AVQQRTMD.js} +146 -39
  44. package/dist/{chunk-Q2WZAD5W.js → chunk-BCRRAH5C.js} +1 -1
  45. package/dist/{chunk-ZPRJCSSR.js → chunk-CKTA5374.js} +1 -1
  46. package/dist/{chunk-GZPGDAAF.js → chunk-DE2UI37M.js} +2 -2
  47. package/dist/{chunk-2Y7RN5HG.js → chunk-DH5QRKFW.js} +3 -3
  48. package/dist/{chunk-CRKOGLKJ.js → chunk-DVYS2RMM.js} +4 -4
  49. package/dist/{chunk-F7NZEUXP.js → chunk-EIMXB6UH.js} +14 -2
  50. package/dist/{chunk-C2PYKUD3.js → chunk-EYWC24VC.js} +1 -1
  51. package/dist/{chunk-2AROR73F.js → chunk-FG7KMVA6.js} +5 -5
  52. package/dist/{chunk-QNRMYDK6.js → chunk-FNI3QSVD.js} +1 -1
  53. package/dist/{chunk-H6HIJAIU.js → chunk-H37CDAZX.js} +2 -2
  54. package/dist/{chunk-XMKXXWMO.js → chunk-IHOVPHUW.js} +2 -2
  55. package/dist/{chunk-M3OZL6PQ.js → chunk-IPF2S5G2.js} +4 -4
  56. package/dist/{chunk-3QKKHU7D.js → chunk-J5YZXRD5.js} +8 -8
  57. package/dist/{chunk-XOMUSIM7.js → chunk-JALKQREN.js} +1 -1
  58. package/dist/{chunk-Z2EENWM3.js → chunk-JYOMHNRP.js} +182 -20
  59. package/dist/{chunk-66DPEVLJ.js → chunk-K2HDTMRI.js} +3 -3
  60. package/dist/{chunk-2UFA3DYM.js → chunk-L7DQYID4.js} +4 -4
  61. package/dist/{chunk-HO5W6QC7.js → chunk-LBRG6RKI.js} +2 -1
  62. package/dist/{chunk-HPUZMBS6.js → chunk-OSF27DCY.js} +2 -2
  63. package/dist/{chunk-737TOG2F.js → chunk-PFKBQTYD.js} +1 -1
  64. package/dist/{chunk-S4VCXCRQ.js → chunk-QRBZBJ4U.js} +1 -1
  65. package/dist/{chunk-X4AHYJCE.js → chunk-SGZWOUIZ.js} +5 -5
  66. package/dist/{chunk-AE6HJZBU.js → chunk-TJZLICMB.js} +3 -3
  67. package/dist/{chunk-GM5ZOWBK.js → chunk-VGUZPC3I.js} +4 -4
  68. package/dist/{chunk-DQVJB6CZ.js → chunk-WNCOBSPN.js} +82 -8
  69. package/dist/{chunk-LTX3TJ3E.js → chunk-XC44Q5XR.js} +1 -1
  70. package/dist/{chunk-IYB3EGSD.js → chunk-YJYLFIVT.js} +1 -1
  71. package/dist/{chunk-IJKKK7F4.js → chunk-YRX5UOM3.js} +1 -1
  72. package/dist/{chunk-SRTX6XYR.js → chunk-ZRSNMEB3.js} +364 -336
  73. package/dist/{citations-GO4SPZYS.js → citations-ZTQIYYDB.js} +3 -3
  74. package/dist/{cli-catalog-6XYQY3PI.js → cli-catalog-IZJXAHFQ.js} +3 -3
  75. package/dist/{cli-commands-2TZKVGK6.js → cli-commands-XYM2VMAK.js} +7 -7
  76. package/dist/cli.js +13 -13
  77. package/dist/{competitor-JBTKRJ6Y.js → competitor-SIXAPHOM.js} +3 -3
  78. package/dist/{content-LKXXQ7X4.js → content-XPS3D3Y6.js} +3 -3
  79. package/dist/{dashboard-LUA7UX6B.js → dashboard-FMJDM5PA.js} +6 -6
  80. package/dist/{demo-I7JDZJUW.js → demo-QQKSHTPO.js} +1 -1
  81. package/dist/{demo-server-GNGGWERV.js → demo-server-LQ3QXUAS.js} +71 -11
  82. package/dist/{discover-TODAYYJ2.js → discover-K5HFEU2T.js} +3 -3
  83. package/dist/{discover-eval-FWQESEYB.js → discover-eval-6536Z2YN.js} +3 -3
  84. package/dist/{doctor-AXNJT2UC.js → doctor-STNH3PHH.js} +3 -3
  85. package/dist/{evidence-2XGEY4ZC.js → evidence-W2EWKBAV.js} +3 -3
  86. package/dist/{export-cmd-7RMYBIBZ.js → export-cmd-EGHMY3M6.js} +3 -3
  87. package/dist/{ga-HZDIZGCO.js → ga-DVIG3PVW.js} +3 -3
  88. package/dist/{gbp-SMRBWJEL.js → gbp-SNS4XZBO.js} +3 -3
  89. package/dist/{google-2CN345XS.js → google-KGPHZG6E.js} +4 -4
  90. package/dist/{google-marketing-W7T2VTVW.js → google-marketing-VZR6W3L6.js} +1 -1
  91. package/dist/{health-cmd-W7OWZ4ZI.js → health-cmd-2KWO2GOM.js} +3 -3
  92. package/dist/{history-UVNCBHTE.js → history-ZY27B7JE.js} +3 -3
  93. package/dist/index.d.ts +236 -161
  94. package/dist/index.js +24 -24
  95. package/dist/{init-2IWS2R7G.js → init-5TXIKII2.js} +11 -11
  96. package/dist/{insights-PQ52G5LU.js → insights-MUYEOSOG.js} +3 -3
  97. package/dist/intelligence-service-U4NSGZUH.js +15 -0
  98. package/dist/{journeys-3PP5GYVJ.js → journeys-YO54IRVC.js} +3 -3
  99. package/dist/{keys-CWZUX7IQ.js → keys-M4QZGYVJ.js} +3 -3
  100. package/dist/{keyword-5OMMULLY.js → keyword-MU62MGWT.js} +3 -3
  101. package/dist/{logs-3FTE42E3.js → logs-BAQM334Q.js} +3 -3
  102. package/dist/{mcp-FK5DTI7I.js → mcp-LYS5P3PB.js} +2 -2
  103. package/dist/mcp.js +9 -9
  104. package/dist/{measurement-plan-ICO2BQNT.js → measurement-plan-HVSTZWTW.js} +5 -5
  105. package/dist/{notify-ML4PYD3L.js → notify-XSP5JXU3.js} +3 -3
  106. package/dist/{organic-evidence-4U4H3DCR.js → organic-evidence-4HYW4PVO.js} +3 -3
  107. package/dist/{overview-NF427VFO.js → overview-XH72WTZT.js} +4 -4
  108. package/dist/{project-AAO65OF7.js → project-UKH7FTQX.js} +3 -3
  109. package/dist/{query-7ZOUQNF5.js → query-RRD5M4QV.js} +3 -3
  110. package/dist/{research-UQ7AF5N3.js → research-V2IGDUKL.js} +3 -3
  111. package/dist/{results-export-CZCLC4ZH.js → results-export-5FC7ZT6O.js} +3 -3
  112. package/dist/{run-4XJZW52R.js → run-B2A4LMWU.js} +4 -4
  113. package/dist/{schedule-D3E5FDBE.js → schedule-PLY6CHQT.js} +3 -3
  114. package/dist/{search-DYET2IL4.js → search-ACVK3WH5.js} +3 -3
  115. package/dist/{serve-QWMTR3SN.js → serve-2LTQZPEK.js} +25 -25
  116. package/dist/{session-7CW2V5EH.js → session-IHXMPETX.js} +12 -12
  117. package/dist/{settings-ZISHACFX.js → settings-ZHBNX2I5.js} +3 -3
  118. package/dist/{skills-WU6IN3NL.js → skills-KWRTCXTF.js} +2 -2
  119. package/dist/{snapshot-KCKQDJ2W.js → snapshot-GBDCCV6L.js} +3 -3
  120. package/dist/{src-WIOU5G4V.js → src-NOTQWGYV.js} +2 -2
  121. package/dist/{status-CYZFVMYA.js → status-FGDDGBMJ.js} +4 -4
  122. package/dist/{technical-aeo-P5CS22AR.js → technical-aeo-AK4QI63Q.js} +3 -3
  123. package/dist/{telemetry-LPK5F2WU.js → telemetry-6QPWYMCR.js} +4 -4
  124. package/dist/{tools-E3B2GZ6Q.js → tools-PBNTVVN7.js} +11 -11
  125. package/dist/{traffic-5KZYXXIQ.js → traffic-AS4PIOQL.js} +5 -5
  126. package/dist/{users-2F346HIW.js → users-BNYKF35J.js} +3 -3
  127. package/dist/{visibility-stats-ITA6DNF3.js → visibility-stats-TWL3GJMD.js} +3 -3
  128. package/dist/{wordpress-ZHCFT6V3.js → wordpress-XBWXAACD.js} +3 -3
  129. package/package.json +1 -1
  130. package/assets/assets/MeasurementPropertyPage-dxGJ1GF9.js +0 -4
  131. package/assets/assets/ProjectPage-W6oYA85b.js +0 -9
  132. package/assets/assets/SiteHealthSection-DT20rNw-.js +0 -2
  133. package/assets/assets/ToneBadge-CJ6ObMRe.js +0 -60
  134. package/assets/assets/react-query-BktZZtSC.js +0 -1
  135. package/dist/intelligence-service-IAUGKMDO.js +0 -15
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-F7NZEUXP.js";
3
+ } from "./chunk-EIMXB6UH.js";
4
4
  import {
5
5
  emitJsonl
6
6
  } from "./chunk-Z7IUAJOF.js";
@@ -19,7 +19,7 @@ import {
19
19
  formatMicros,
20
20
  formatRunErrorOneLine,
21
21
  resolveProviderInput
22
- } from "./chunk-DQVJB6CZ.js";
22
+ } from "./chunk-WNCOBSPN.js";
23
23
 
24
24
  // src/commands/run.ts
25
25
  function getClient() {
@@ -2,11 +2,11 @@ import {
2
2
  dedupeGscSitemapUrls,
3
3
  resolveDiscoveredGscSitemapUrls,
4
4
  submitGscSitemapBatches
5
- } from "./chunk-ZWZOQNLD.js";
5
+ } from "./chunk-2YBEI6LE.js";
6
6
  import {
7
7
  measurementDraftOperationSchema,
8
8
  runMeasurementDraftAction
9
- } from "./chunk-ZPRJCSSR.js";
9
+ } from "./chunk-CKTA5374.js";
10
10
  import {
11
11
  CliError
12
12
  } from "./chunk-HGMYEDAQ.js";
@@ -141,6 +141,8 @@ import {
141
141
  seoDomainIntelligenceListSchema,
142
142
  seoEvidenceQuerySchema,
143
143
  seoKeywordMetricsListSchema,
144
+ seoMarketRankingListSchema,
145
+ seoMarketRankingQuerySchema,
144
146
  seoOperatorTaskSchema,
145
147
  seoOverviewSchema,
146
148
  seoProfileInputSchema,
@@ -173,7 +175,7 @@ import {
173
175
  trafficSeriesGranularitySchema,
174
176
  visibilityCompareSelectionSchema,
175
177
  visibilityReportRequestSchema
176
- } from "./chunk-DQVJB6CZ.js";
178
+ } from "./chunk-WNCOBSPN.js";
177
179
 
178
180
  // src/mcp/tool-registry.ts
179
181
  import { z as z2 } from "zod";
@@ -1123,6 +1125,7 @@ var sentimentPreviewInputSchema = sentimentBackfillSelectionSchema.safeExtend({
1123
1125
  var sentimentBackfillInputSchema = sentimentBackfillRequestSchema.extend({ project: projectNameSchema });
1124
1126
  var seoIdInputSchema = projectInputSchema.extend({ id: z2.string().min(1) });
1125
1127
  var seoEvidenceInputSchema = seoEvidenceQuerySchema.extend({ project: projectNameSchema });
1128
+ var seoMarketRankingInputSchema = seoMarketRankingQuerySchema.extend({ project: projectNameSchema });
1126
1129
  var rawCanonryMcpTools = [
1127
1130
  defineTool({
1128
1131
  name: "canonry_seo_operator_task",
@@ -1334,6 +1337,21 @@ var rawCanonryMcpTools = [
1334
1337
  return client.getSeoRankedKeywords(project, query);
1335
1338
  }
1336
1339
  }),
1340
+ defineTool({
1341
+ name: "canonry_seo_market_rankings",
1342
+ title: "SEO market rankings",
1343
+ description: "Read stored SEO data only. No provider calls. The site's Google position for each tracked non-brand query in each market, searched from that market's location; these are the same tracked queries AI visibility measures, and searchText is the exact text searched. A null rank means not in the checked results (depth), not a failed search. Filter with marketKey or regionKey and keep runId fixed while paging.",
1344
+ access: "read",
1345
+ tier: "seo",
1346
+ inputSchema: seoMarketRankingInputSchema,
1347
+ outputSchema: seoMarketRankingListSchema,
1348
+ annotations: readAnnotations(),
1349
+ openApiOperations: ["GET /api/v1/projects/{name}/seo/market-rankings"],
1350
+ handler: (client, input) => {
1351
+ const { project, ...query } = input;
1352
+ return client.getSeoMarketRankings(project, query);
1353
+ }
1354
+ }),
1337
1355
  defineTool({
1338
1356
  name: "canonry_sentiment_settings",
1339
1357
  title: "Read sentiment readiness and settings",
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  answerServiceAdapters,
3
3
  answerServiceDescriptors
4
- } from "./chunk-737TOG2F.js";
4
+ } from "./chunk-PFKBQTYD.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-2AROR73F.js";
30
+ } from "./chunk-FG7KMVA6.js";
31
31
  import {
32
32
  AeroToolProfiles,
33
33
  AeroToolScopes,
34
34
  buildAeroStateTools,
35
35
  isAeroToolProfile,
36
36
  truncateToolResult
37
- } from "./chunk-CRKOGLKJ.js";
37
+ } from "./chunk-DVYS2RMM.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-QNRMYDK6.js";
56
+ } from "./chunk-FNI3QSVD.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-HPUZMBS6.js";
67
+ } from "./chunk-OSF27DCY.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-M3OZL6PQ.js";
79
+ } from "./chunk-IPF2S5G2.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-IYB3EGSD.js";
87
+ } from "./chunk-YJYLFIVT.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-XMKXXWMO.js";
98
+ } from "./chunk-IHOVPHUW.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-GM5ZOWBK.js";
101
+ } from "./chunk-VGUZPC3I.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-F7NZEUXP.js";
108
+ } from "./chunk-EIMXB6UH.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-C2PYKUD3.js";
139
+ } from "./chunk-EYWC24VC.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
- } from "./chunk-SL3Y7IOX.js";
142
+ } from "./chunk-6ASEI24F.js";
143
143
  import {
144
144
  computeFactorAverages,
145
145
  deleteSiteCrawlGraphLayout,
146
146
  persistSiteCrawlGraphLayout,
147
147
  prepareSiteCrawlGraphLayout,
148
148
  recordedSharePct
149
- } from "./chunk-H6HIJAIU.js";
149
+ } from "./chunk-H37CDAZX.js";
150
150
  import {
151
151
  CanonryMcpToolNames,
152
152
  canonryMcpTools
153
- } from "./chunk-BV6NXSAH.js";
153
+ } from "./chunk-ALQEGGYM.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-X4AHYJCE.js";
165
+ } from "./chunk-SGZWOUIZ.js";
166
166
  import {
167
167
  computeCitedCompetitorDomains,
168
168
  determineCitationState
169
- } from "./chunk-S4VCXCRQ.js";
169
+ } from "./chunk-QRBZBJ4U.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-Z2EENWM3.js";
289
+ } from "./chunk-JYOMHNRP.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-XOMUSIM7.js";
375
+ } from "./chunk-JALKQREN.js";
376
376
  import {
377
377
  AGENT_MEMORY_VALUE_MAX_BYTES,
378
378
  AI_ENGINE_DOMAINS,
@@ -597,7 +597,9 @@ import {
597
597
  sentimentClassifierOutputSchema,
598
598
  sentimentEvaluatorProvider,
599
599
  sentimentSelectionSchema,
600
+ seoDeviceSchema,
600
601
  seoProfileInputSchema,
602
+ seoRankingSettingsSchema,
601
603
  serializeForInlineScript,
602
604
  serializeRunError,
603
605
  shiftIsoCalendarDate,
@@ -618,7 +620,7 @@ import {
618
620
  winnabilityClassLabel,
619
621
  withRetry,
620
622
  withSkippedProviders
621
- } from "./chunk-DQVJB6CZ.js";
623
+ } from "./chunk-WNCOBSPN.js";
622
624
 
623
625
  // src/google-marketing-runtime.ts
624
626
  import crypto2 from "crypto";
@@ -3342,8 +3344,8 @@ var DataForSeoTransportError = class extends Error {
3342
3344
  throttle;
3343
3345
  retryAfter;
3344
3346
  };
3345
- async function fetchOnce2(credentials, endpoint, task, signal) {
3346
- const response = await fetch(`https://api.dataforseo.com/v3/dataforseo_labs/google/${endpoint}/live`, {
3347
+ async function fetchOnce2(credentials, path6, task, signal) {
3348
+ const response = await fetch(`https://api.dataforseo.com/v3/${path6}`, {
3347
3349
  method: "POST",
3348
3350
  headers: {
3349
3351
  Authorization: `Basic ${Buffer.from(`${credentials.login}:${credentials.password}`).toString("base64")}`,
@@ -3367,11 +3369,11 @@ async function fetchOnce2(credentials, endpoint, task, signal) {
3367
3369
  }
3368
3370
  return envelope;
3369
3371
  }
3370
- async function dataForSeoFetch(credentials, endpoint, task, signal) {
3372
+ async function dataForSeoFetch(credentials, path6, task, signal) {
3371
3373
  let refusal = null;
3372
3374
  return withRetry(() => {
3373
3375
  if (signal?.aborted) throw refusal ?? new Error("SEO request was cancelled.");
3374
- return fetchOnce2(credentials, endpoint, task, signal);
3376
+ return fetchOnce2(credentials, path6, task, signal);
3375
3377
  }, {
3376
3378
  maxRetries: 2,
3377
3379
  baseDelayMs: 2e3,
@@ -3450,18 +3452,82 @@ var resultSchema = z2.object({
3450
3452
  target: z2.string().optional(),
3451
3453
  items: z2.array(z2.unknown()).nullable()
3452
3454
  });
3455
+ var serpResultSchema = z2.object({
3456
+ keyword: z2.string(),
3457
+ location_code: z2.number().int(),
3458
+ language_code: z2.string(),
3459
+ datetime: z2.string().nullish(),
3460
+ items: z2.array(z2.unknown()).nullish()
3461
+ });
3462
+ var serpItemTypeSchema = z2.object({ type: z2.string() });
3463
+ var serpItemSchema = z2.object({
3464
+ type: z2.literal("organic"),
3465
+ domain: z2.string().nullish(),
3466
+ url: z2.string().nullish(),
3467
+ rank_group: z2.number().int().positive().nullish(),
3468
+ rank_absolute: z2.number().int().positive().nullish()
3469
+ });
3453
3470
  function provenance(request, collectedAt, sourceUpdatedAt) {
3471
+ const serp = request.capability === SeoCapabilities["market-rankings"];
3454
3472
  return {
3455
3473
  provider: SeoProviders.dataforseo,
3456
- dataset: `dataforseo-labs/google/${request.capability}`,
3474
+ dataset: `${serp ? "dataforseo-serp" : "dataforseo-labs"}/google/${request.capability}`,
3457
3475
  engine: "google",
3458
3476
  locationCode: request.locationCode,
3459
3477
  languageCode: request.languageCode,
3460
- device: "unspecified",
3478
+ device: serp && request.search ? request.search.device : "unspecified",
3461
3479
  collectedAt,
3462
3480
  sourceUpdatedAt
3463
3481
  };
3464
3482
  }
3483
+ function hostBelongsTo(host, target) {
3484
+ const value = target.value.toLowerCase();
3485
+ return host === value || target.kind === SeoTargetKinds.domain && target.includeSubdomains && host.endsWith(`.${value}`);
3486
+ }
3487
+ var searchIdentity = (text) => text.replace(/\s+/g, " ").trim().toLowerCase();
3488
+ function marketRankings(rawResult, request, collectedAt) {
3489
+ const search = request.search;
3490
+ const target = request.target;
3491
+ const searchText = request.keywords[0];
3492
+ if (!search || !target || !searchText) throw new Error("Market rankings need a search, a target and search text.");
3493
+ const result = serpResultSchema.parse(rawResult);
3494
+ if (result.location_code !== request.locationCode || result.language_code !== request.languageCode) {
3495
+ throw new Error("SEO provider returned a different market.");
3496
+ }
3497
+ if (searchIdentity(result.keyword) !== searchIdentity(searchText)) throw new Error("SEO provider returned a different search.");
3498
+ const organic = (result.items ?? []).filter((item) => serpItemTypeSchema.safeParse(item).data?.type === "organic").map((item) => serpItemSchema.parse(item)).filter((item) => item.rank_group != null);
3499
+ let best = null;
3500
+ const competitorRanks = /* @__PURE__ */ new Map();
3501
+ const competitors2 = new Set(search.markets.flatMap((market) => market.competitors));
3502
+ for (const item of organic) {
3503
+ const host = item.domain ? normalizeHostname(item.domain) : null;
3504
+ if (!host) continue;
3505
+ if (hostBelongsTo(host, target)) {
3506
+ if (!best || item.rank_group < best.rank_group) best = item;
3507
+ continue;
3508
+ }
3509
+ const domain = registrableDomain(host);
3510
+ const seen = competitorRanks.get(domain);
3511
+ if (domain && competitors2.has(domain) && (seen === void 0 || item.rank_group < seen)) competitorRanks.set(domain, item.rank_group);
3512
+ }
3513
+ const ranked = [...competitorRanks].map(([domain, rankOrganic]) => ({ domain, rankOrganic })).sort((a, b) => a.rankOrganic - b.rankOrganic || compareText(a.domain, b.domain));
3514
+ const source = provenance(request, collectedAt, result.datetime ?? null);
3515
+ return search.markets.map((market) => {
3516
+ const tracked = new Set(market.competitors);
3517
+ return {
3518
+ ...market.context,
3519
+ searchText,
3520
+ locationLabel: search.locationLabel,
3521
+ target,
3522
+ rankOrganic: best?.rank_group ?? null,
3523
+ rankAbsolute: best?.rank_absolute ?? null,
3524
+ url: best?.url ?? null,
3525
+ depth: search.depth,
3526
+ competitors: ranked.filter((competitor) => tracked.has(competitor.domain)),
3527
+ provenance: source
3528
+ };
3529
+ });
3530
+ }
3465
3531
  function keywordMetrics(item, request, collectedAt) {
3466
3532
  return {
3467
3533
  keyword: item.keyword,
@@ -3481,6 +3547,11 @@ function keywordMetrics(item, request, collectedAt) {
3481
3547
  }
3482
3548
  function normalizeDataForSeoResults(rawResults, request, collectedAt) {
3483
3549
  const output = emptySeoResults();
3550
+ if (request.capability === SeoCapabilities["market-rankings"]) {
3551
+ if (rawResults.length !== 1) throw new Error("SEO provider returned an unexpected number of results pages.");
3552
+ output.marketRankings.push(...marketRankings(rawResults[0], request, collectedAt));
3553
+ return output;
3554
+ }
3484
3555
  for (const raw of rawResults) {
3485
3556
  const result = resultSchema.parse(raw);
3486
3557
  if (result.location_code !== request.locationCode || result.language_code !== request.languageCode) {
@@ -3557,12 +3628,53 @@ function normalizeDataForSeoResults(rawResults, request, collectedAt) {
3557
3628
 
3558
3629
  // ../integration-dataforseo/src/adapter.ts
3559
3630
  var ENDPOINTS = {
3560
- [SeoCapabilities["keyword-metrics"]]: "keyword_overview",
3561
- [SeoCapabilities["domain-intelligence"]]: "domain_rank_overview",
3562
- [SeoCapabilities["ranked-keywords"]]: "ranked_keywords"
3631
+ [SeoCapabilities["keyword-metrics"]]: "dataforseo_labs/google/keyword_overview/live",
3632
+ [SeoCapabilities["domain-intelligence"]]: "dataforseo_labs/google/domain_rank_overview/live",
3633
+ [SeoCapabilities["ranked-keywords"]]: "dataforseo_labs/google/ranked_keywords/live",
3634
+ [SeoCapabilities["market-rankings"]]: "serp/google/organic/live/advanced"
3563
3635
  };
3636
+ var MAX_SEARCH_TEXT_LENGTH = 700;
3564
3637
  var REQUEST_REFUSALS = /* @__PURE__ */ new Set([4e4, 40006, 40100, 40104, 40200, 40203, 40205, 40206, 40207, 40210, 40501, 40502, 40503, 40506]);
3638
+ function targetHost(target) {
3639
+ const host = target ? normalizeHostname(target.value) : null;
3640
+ if (!target || !host || !registrableDomain(host)) {
3641
+ throw validationError("SEO requires a bare public domain or hostname.");
3642
+ }
3643
+ const domain = registrableDomain(host);
3644
+ if (target.kind === SeoTargetKinds.domain && (host !== domain || !target.includeSubdomains)) {
3645
+ throw validationError("Use the root domain with subdomains included, or choose exact host scope.");
3646
+ }
3647
+ if (target.kind === SeoTargetKinds.host && target.includeSubdomains) {
3648
+ throw validationError("Exact host scope cannot include subdomains.");
3649
+ }
3650
+ return host;
3651
+ }
3652
+ function marketRankingPayload(request) {
3653
+ const search = request.search;
3654
+ const text = request.keywords[0]?.trim() ?? "";
3655
+ if (!search || request.keywords.length !== 1 || !text || text.length > MAX_SEARCH_TEXT_LENGTH) {
3656
+ throw validationError("Market rankings search one tracked query of up to 700 characters at a time.");
3657
+ }
3658
+ if (!seoRankingSettingsSchema.shape.depth.safeParse(search.depth).success || !seoDeviceSchema.safeParse(search.device).success) {
3659
+ throw validationError("Market rankings need a result depth from 10 to 100 in steps of 10 and a device.");
3660
+ }
3661
+ if (search.markets.length === 0) throw validationError("Market rankings need at least one market for each search.");
3662
+ if (!Number.isSafeInteger(request.locationCode) || request.locationCode <= 0 || request.languageCode.length < 2 || request.languageCode.length > 10) {
3663
+ throw validationError("Check the SEO provider location and language.");
3664
+ }
3665
+ if (request.tag.length > 255) throw validationError("SEO task identifier is too long.");
3666
+ targetHost(request.target);
3667
+ return {
3668
+ keyword: text,
3669
+ location_code: request.locationCode,
3670
+ language_code: request.languageCode,
3671
+ device: search.device,
3672
+ depth: search.depth,
3673
+ tag: request.tag
3674
+ };
3675
+ }
3565
3676
  function taskPayload(request) {
3677
+ if (request.capability === SeoCapabilities["market-rankings"]) return marketRankingPayload(request);
3566
3678
  const parsed = seoProfileInputSchema.pick({ keywords: true, locationCode: true, languageCode: true, limit: true }).safeParse({
3567
3679
  keywords: request.keywords,
3568
3680
  locationCode: request.locationCode,
@@ -3579,17 +3691,8 @@ function taskPayload(request) {
3579
3691
  return { ...common, keywords: request.keywords, include_clickstream_data: false, include_serp_info: true };
3580
3692
  }
3581
3693
  const target = request.target;
3582
- const host = target ? normalizeHostname(target.value) : null;
3583
- if (!target || !host || !registrableDomain(host)) {
3584
- throw validationError("SEO requires a bare public domain or hostname.");
3585
- }
3694
+ const host = targetHost(target);
3586
3695
  const domain = registrableDomain(host);
3587
- if (target.kind === SeoTargetKinds.domain && (host !== domain || !target.includeSubdomains)) {
3588
- throw validationError("Use the root domain with subdomains included, or choose exact host scope.");
3589
- }
3590
- if (target.kind === SeoTargetKinds.host && target.includeSubdomains) {
3591
- throw validationError("Exact host scope cannot include subdomains.");
3592
- }
3593
3696
  switch (request.capability) {
3594
3697
  case SeoCapabilities["domain-intelligence"]:
3595
3698
  if (target.kind !== SeoTargetKinds.domain) throw validationError("Domain intelligence requires a whole-domain scope.");
@@ -3613,6 +3716,9 @@ function taskPayload(request) {
3613
3716
  }
3614
3717
  function estimate(request) {
3615
3718
  taskPayload(request);
3719
+ if (request.capability === SeoCapabilities["market-rankings"]) {
3720
+ return { maxCostMicros: 2e3 * (request.search.depth / 10), catalogRevision: "dataforseo-google-serp-live-2026-10-25" };
3721
+ }
3616
3722
  const rows = request.capability === SeoCapabilities["keyword-metrics"] ? request.keywords.length : request.capability === SeoCapabilities["domain-intelligence"] ? 1 : request.limit;
3617
3723
  return { maxCostMicros: 12e3 + 120 * rows, catalogRevision: "dataforseo-google-labs-2026-10-22" };
3618
3724
  }
@@ -3620,6 +3726,7 @@ function appendResults(target, source) {
3620
3726
  target.keywordMetrics.push(...source.keywordMetrics);
3621
3727
  target.domainIntelligence.push(...source.domainIntelligence);
3622
3728
  target.rankedKeywords.push(...source.rankedKeywords);
3729
+ target.marketRankings.push(...source.marketRankings);
3623
3730
  }
3624
3731
  function createDataForSeoAdapter(credentials) {
3625
3732
  const auth = { login: credentials.login.trim(), password: credentials.password };
@@ -5659,7 +5766,7 @@ function nonBlank(value) {
5659
5766
  return trimmed ? trimmed : void 0;
5660
5767
  }
5661
5768
  function resolveBuildCommit(env = process.env) {
5662
- const embedded = true ? "06f8803bd0643d0048ac8a9afc2bafb6b95b6ca7" : void 0;
5769
+ const embedded = true ? "1f62971b3ef629481796f7a7492eb87b0e6e6ee9" : void 0;
5663
5770
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5664
5771
  }
5665
5772
  function resolveInstanceIdentity(env = process.env) {
@@ -8,7 +8,7 @@ import {
8
8
  classifyJourneyEntry,
9
9
  hostMatchesDomain,
10
10
  hostOf
11
- } from "./chunk-DQVJB6CZ.js";
11
+ } from "./chunk-WNCOBSPN.js";
12
12
 
13
13
  // ../integration-traffic/src/ip-ranges/amazonbot.json
14
14
  var amazonbot_default = {
@@ -23,7 +23,7 @@ import {
23
23
  measurementDraftUpsertGroupRequestSchema,
24
24
  measurementDraftUpsertMarketRequestSchema,
25
25
  measurementDraftUpsertTargetRequestSchema
26
- } from "./chunk-DQVJB6CZ.js";
26
+ } from "./chunk-WNCOBSPN.js";
27
27
 
28
28
  // src/measurement-draft-actions.ts
29
29
  import { z } from "zod";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  trackIntegrationConnection
3
- } from "./chunk-M3OZL6PQ.js";
3
+ } from "./chunk-IPF2S5G2.js";
4
4
  import {
5
5
  cliRuntimeContext
6
- } from "./chunk-XMKXXWMO.js";
6
+ } from "./chunk-IHOVPHUW.js";
7
7
 
8
8
  // src/cli-connection-telemetry.ts
9
9
  function trackCliConnection(properties) {
@@ -2,18 +2,18 @@ import {
2
2
  configExists,
3
3
  loadConfigRaw,
4
4
  saveConfigPatch
5
- } from "./chunk-C2PYKUD3.js";
5
+ } from "./chunk-EYWC24VC.js";
6
6
  import {
7
7
  BUNDLED_SKILL_NAMES,
8
8
  installSkills
9
- } from "./chunk-SL3Y7IOX.js";
9
+ } from "./chunk-6ASEI24F.js";
10
10
  import {
11
11
  PACKAGE_VERSION
12
12
  } from "./chunk-AOJU5LKX.js";
13
13
  import {
14
14
  SKILL_MANIFEST_FILENAME,
15
15
  SkillsClients
16
- } from "./chunk-DQVJB6CZ.js";
16
+ } from "./chunk-WNCOBSPN.js";
17
17
 
18
18
  // src/skills-autosync.ts
19
19
  import fs from "fs";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  runWithUsageTags
3
- } from "./chunk-F7NZEUXP.js";
3
+ } from "./chunk-EIMXB6UH.js";
4
4
  import {
5
5
  CanonryMcpToolNames,
6
6
  canonryMcpTools
7
- } from "./chunk-BV6NXSAH.js";
7
+ } from "./chunk-ALQEGGYM.js";
8
8
  import {
9
9
  CliError
10
10
  } from "./chunk-HGMYEDAQ.js";
11
11
  import {
12
12
  buildOpenApiDocument
13
- } from "./chunk-Z2EENWM3.js";
13
+ } from "./chunk-JYOMHNRP.js";
14
14
  import {
15
15
  DEFAULT_COMPETITOR_AUTO_ALIAS_MODE,
16
16
  MeasurementPortfolioLists,
@@ -23,7 +23,7 @@ import {
23
23
  seoDatasetWithoutVendor,
24
24
  seoProviderSchema,
25
25
  truncateUtf16
26
- } from "./chunk-DQVJB6CZ.js";
26
+ } from "./chunk-WNCOBSPN.js";
27
27
 
28
28
  // src/agent/tools.ts
29
29
  import { Type as Type2 } from "@earendil-works/pi-ai";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadConfig
3
- } from "./chunk-C2PYKUD3.js";
3
+ } from "./chunk-EYWC24VC.js";
4
4
  import {
5
5
  PACKAGE_VERSION
6
6
  } from "./chunk-AOJU5LKX.js";
@@ -36,7 +36,7 @@ import {
36
36
  sentimentSettingsReadSchema,
37
37
  sentimentSummaryReadSchema,
38
38
  upgradeCommandFor
39
- } from "./chunk-DQVJB6CZ.js";
39
+ } from "./chunk-WNCOBSPN.js";
40
40
 
41
41
  // ../api-client-generated/src/generated/core/bodySerializer.gen.ts
42
42
  var jsonBodySerializer = {
@@ -900,6 +900,11 @@ var getApiV1ProjectsByNameSeoRankedKeywords = (options) => (options.client ?? cl
900
900
  url: "/api/v1/projects/{name}/seo/ranked-keywords",
901
901
  ...options
902
902
  });
903
+ var getApiV1ProjectsByNameSeoMarketRankings = (options) => (options.client ?? client).get({
904
+ security: [{ scheme: "bearer", type: "http" }],
905
+ url: "/api/v1/projects/{name}/seo/market-rankings",
906
+ ...options
907
+ });
903
908
  var postApiV1ProjectsByNameSeoRefreshIntents = (options) => (options.client ?? client).post({
904
909
  security: [{ scheme: "bearer", type: "http" }],
905
910
  url: "/api/v1/projects/{name}/seo/refresh-intents",
@@ -6188,6 +6193,13 @@ var ApiClient = class {
6188
6193
  query
6189
6194
  }));
6190
6195
  }
6196
+ async getSeoMarketRankings(project, query) {
6197
+ return this.invoke(() => getApiV1ProjectsByNameSeoMarketRankings({
6198
+ client: this.heyClient,
6199
+ path: { name: project },
6200
+ query
6201
+ }));
6202
+ }
6191
6203
  async getResearchRun(project, runId) {
6192
6204
  return this.invoke(
6193
6205
  () => getApiV1ProjectsByNameResearchRunsByRunId({
@@ -20,7 +20,7 @@ import {
20
20
  resolveProviderModel,
21
21
  schedulableRunKindSchema,
22
22
  sentimentEvaluatorProviderSchema
23
- } from "./chunk-DQVJB6CZ.js";
23
+ } from "./chunk-WNCOBSPN.js";
24
24
 
25
25
  // ../config/src/index.ts
26
26
  import { z as z4 } from "zod";
@@ -5,7 +5,7 @@ import {
5
5
  isStoredPageReadTool,
6
6
  isStoredReadTool,
7
7
  truncateToolResult
8
- } from "./chunk-CRKOGLKJ.js";
8
+ } from "./chunk-DVYS2RMM.js";
9
9
  import {
10
10
  CANONRY_MCP_TOOLKITS
11
11
  } from "./chunk-NDTU7FGL.js";
@@ -22,15 +22,15 @@ import {
22
22
  resolveApiKeyFor,
23
23
  resolveModelForProvider,
24
24
  validateAgentProviderRegistry
25
- } from "./chunk-C2PYKUD3.js";
25
+ } from "./chunk-EYWC24VC.js";
26
26
  import {
27
27
  CanonryMcpToolNames,
28
28
  canonryMcpTools
29
- } from "./chunk-BV6NXSAH.js";
29
+ } from "./chunk-ALQEGGYM.js";
30
30
  import {
31
31
  agentToolEvents,
32
32
  llmUsageEvents
33
- } from "./chunk-XOMUSIM7.js";
33
+ } from "./chunk-JALKQREN.js";
34
34
  import {
35
35
  MeasurementPortfolioLists,
36
36
  agentTurnLimitsSchema,
@@ -38,7 +38,7 @@ import {
38
38
  describeError,
39
39
  validationError,
40
40
  visibilityReportRequestSchema
41
- } from "./chunk-DQVJB6CZ.js";
41
+ } from "./chunk-WNCOBSPN.js";
42
42
 
43
43
  // src/agent/session.ts
44
44
  import fs3 from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cloudflareQueueNameSchema
3
- } from "./chunk-DQVJB6CZ.js";
3
+ } from "./chunk-WNCOBSPN.js";
4
4
 
5
5
  // src/cloudflare-traffic-config.ts
6
6
  function unsupportedDeliveryMode(deliveryMode) {
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-XOMUSIM7.js";
8
+ } from "./chunk-JALKQREN.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-DQVJB6CZ.js";
18
+ } from "./chunk-WNCOBSPN.js";
19
19
 
20
20
  // src/site-audit-factors.ts
21
21
  function recordedSharePct(factor) {
@@ -5,7 +5,7 @@ import {
5
5
  loadConfig,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-C2PYKUD3.js";
8
+ } from "./chunk-EYWC24VC.js";
9
9
  import {
10
10
  CANONRY_NPM_PACKAGE_URL,
11
11
  compareSemver,
@@ -18,7 +18,7 @@ import {
18
18
  updateCheckEnvOptOut,
19
19
  upgradeCaveatFor,
20
20
  upgradeCommandFor
21
- } from "./chunk-DQVJB6CZ.js";
21
+ } from "./chunk-WNCOBSPN.js";
22
22
 
23
23
  // src/runtime-context.ts
24
24
  function cliRuntimeContext(env = process.env, stdio = process) {