@canonry/canonry 7.65.1 → 7.67.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 (138) 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 +2 -2
  3. package/assets/assets/{AgentSetupPage-BDLMjn1I.js → AgentSetupPage-ORsy3QEa.js} +3 -3
  4. package/assets/assets/{AuditHistoryPanel-qhIB8KRK.js → AuditHistoryPanel-vTHZDbfs.js} +1 -1
  5. package/assets/assets/{BacklinksPage-iWrZ0-Pp.js → BacklinksPage-FqADB5sO.js} +1 -1
  6. package/assets/assets/{HistoryPage-BP1_GGlT.js → HistoryPage-C4l5Toqa.js} +1 -1
  7. package/assets/assets/MeasurementPropertyPage-x8f7xanT.js +4 -0
  8. package/assets/assets/ProjectPage-CG9I2-B4.js +9 -0
  9. package/assets/assets/{RunsPage-Ddd2oE1Y.js → RunsPage-oyhhwAPq.js} +1 -1
  10. package/assets/assets/{SettingsPage-D_QdYWDO.js → SettingsPage-DJc4Di1M.js} +1 -1
  11. package/assets/assets/SiteHealthSection-BvqFg3rG.js +2 -0
  12. package/assets/assets/ToneBadge-CTWpeKu8.js +60 -0
  13. package/assets/assets/{TrafficPage-VnBUE1S6.js → TrafficPage-DAD0FFkL.js} +2 -2
  14. package/assets/assets/TrafficSourceDetailPage-BBEzbawh.js +1 -0
  15. package/assets/assets/{account-context-CWRd3KeS.js → account-context-DMHOefRt.js} +1 -1
  16. package/assets/assets/{card-Cb_fM36G.js → card-Brp6fFNG.js} +1 -1
  17. package/assets/assets/{extract-error-message-DSIAoHTR.js → extract-error-message-5QpQCsGb.js} +1 -1
  18. package/assets/assets/{format-helpers-CxNDa1oa.js → format-helpers-BFM0FRjT.js} +1 -1
  19. package/assets/assets/index-BBNs-RhI.js +60 -0
  20. package/assets/assets/{query-client-DLdAMlsX.js → query-client-BMTW-xss.js} +1 -1
  21. package/assets/assets/react-query-DGmY6hJa.js +1 -0
  22. package/assets/assets/{react-sigma_core.esm.min-DEG8vFYD.js → react-sigma_core.esm.min-C0VjhgDo.js} +1 -1
  23. package/assets/assets/service-DW9u_0aZ.js +1 -0
  24. package/assets/index.html +7 -7
  25. package/dist/{ads-D4WQOT5K.js → ads-BXGEL4WI.js} +3 -3
  26. package/dist/{agent-E3IYC7OJ.js → agent-LFX7GHWD.js} +7 -7
  27. package/dist/{agent-ask-ZSKRPB2Z.js → agent-ask-QJV225AT.js} +3 -3
  28. package/dist/{agent-conversations-YHPYPQE2.js → agent-conversations-2TZDIGA6.js} +3 -3
  29. package/dist/{agent-memory-6OWOOD5O.js → agent-memory-XCY3ZG5C.js} +3 -3
  30. package/dist/{agent-providers-7KZK37UO.js → agent-providers-VS6PH55Y.js} +3 -3
  31. package/dist/{agent-transcript-3O7GPML6.js → agent-transcript-BUUHOTZM.js} +3 -3
  32. package/dist/{analytics-P2LLIUYK.js → analytics-YWJWPUNF.js} +3 -3
  33. package/dist/{apply-VBNNJOCT.js → apply-BMCYFBEJ.js} +3 -3
  34. package/dist/{backfill-F5SSURCH.js → backfill-YBOKT5LT.js} +9 -9
  35. package/dist/{backlinks-4RE3TNNA.js → backlinks-QNNABB4N.js} +3 -3
  36. package/dist/{bing-V6UN7D44.js → bing-KEMXBABP.js} +3 -3
  37. package/dist/{bootstrap-SHTSPAI5.js → bootstrap-X2AADK4M.js} +10 -10
  38. package/dist/{cdp-GDL2VFI3.js → cdp-WVYUEV4U.js} +7 -7
  39. package/dist/{chunk-3QKKHU7D.js → chunk-2X7DFLMD.js} +8 -8
  40. package/dist/{chunk-2AROR73F.js → chunk-32BTTG5N.js} +5 -5
  41. package/dist/{chunk-BV6NXSAH.js → chunk-37R6GTU7.js} +21 -3
  42. package/dist/{chunk-HPUZMBS6.js → chunk-5DMESZDF.js} +2 -2
  43. package/dist/{chunk-XOMUSIM7.js → chunk-6DJN7HCK.js} +83 -11
  44. package/dist/{chunk-SRTX6XYR.js → chunk-AFRCTLUL.js} +370 -337
  45. package/dist/{chunk-Z2EENWM3.js → chunk-AVISYPUU.js} +877 -478
  46. package/dist/{chunk-HI2HCYLB.js → chunk-CBYKQRDH.js} +2 -2
  47. package/dist/{chunk-S4VCXCRQ.js → chunk-EKSXR7RJ.js} +1 -1
  48. package/dist/{chunk-66DPEVLJ.js → chunk-G6PZEDTH.js} +3 -3
  49. package/dist/{chunk-GZPGDAAF.js → chunk-GTPGYFZ4.js} +2 -2
  50. package/dist/{chunk-Q2WZAD5W.js → chunk-HX3WLTZU.js} +1 -1
  51. package/dist/{chunk-JSAYC36T.js → chunk-IEBMODUI.js} +193 -47
  52. package/dist/{chunk-2UFA3DYM.js → chunk-KJLICF53.js} +4 -4
  53. package/dist/{chunk-ZPRJCSSR.js → chunk-LU3M54IY.js} +1 -1
  54. package/dist/{chunk-HO5W6QC7.js → chunk-MD5PHJBX.js} +2 -1
  55. package/dist/{chunk-SL3Y7IOX.js → chunk-MLOGEXIO.js} +1 -1
  56. package/dist/{chunk-LTX3TJ3E.js → chunk-MOJ2XZXK.js} +1 -1
  57. package/dist/{chunk-IYB3EGSD.js → chunk-NHHZQWMI.js} +1 -1
  58. package/dist/{chunk-H6HIJAIU.js → chunk-P74TPIWZ.js} +2 -2
  59. package/dist/{chunk-M3OZL6PQ.js → chunk-RRS7U6HQ.js} +4 -4
  60. package/dist/{chunk-X4AHYJCE.js → chunk-UHLWNU6I.js} +5 -5
  61. package/dist/{chunk-C2PYKUD3.js → chunk-UNCOK6DA.js} +1 -1
  62. package/dist/{chunk-IJKKK7F4.js → chunk-UXTNDZKM.js} +1 -1
  63. package/dist/{chunk-GM5ZOWBK.js → chunk-VR4MYSEH.js} +4 -4
  64. package/dist/{chunk-ZWZOQNLD.js → chunk-WSYLDPYF.js} +1 -1
  65. package/dist/{chunk-AE6HJZBU.js → chunk-WZ4LUM26.js} +3 -3
  66. package/dist/{chunk-DQVJB6CZ.js → chunk-XEGYSZEV.js} +99 -9
  67. package/dist/{chunk-F7NZEUXP.js → chunk-XEPEMON2.js} +14 -2
  68. package/dist/{chunk-CRKOGLKJ.js → chunk-XIA6NWIF.js} +4 -4
  69. package/dist/{chunk-737TOG2F.js → chunk-XMIKSCAO.js} +1 -1
  70. package/dist/{chunk-2Y7RN5HG.js → chunk-Y54PMWBH.js} +3 -3
  71. package/dist/{chunk-QNRMYDK6.js → chunk-YP743QX5.js} +1 -1
  72. package/dist/{chunk-XMKXXWMO.js → chunk-ZGUR4AZM.js} +2 -2
  73. package/dist/{citations-GO4SPZYS.js → citations-ZSI5BOGD.js} +3 -3
  74. package/dist/{cli-catalog-6XYQY3PI.js → cli-catalog-J2HUCGJL.js} +3 -3
  75. package/dist/{cli-commands-2TZKVGK6.js → cli-commands-XFMVFREG.js} +7 -7
  76. package/dist/cli.js +13 -13
  77. package/dist/{competitor-JBTKRJ6Y.js → competitor-WJDN3DLP.js} +3 -3
  78. package/dist/{content-LKXXQ7X4.js → content-K52YV4BK.js} +3 -3
  79. package/dist/{dashboard-LUA7UX6B.js → dashboard-L6RKTP35.js} +6 -6
  80. package/dist/{demo-I7JDZJUW.js → demo-Y7XRD4X4.js} +1 -1
  81. package/dist/{demo-server-GNGGWERV.js → demo-server-QNQX5CNP.js} +73 -11
  82. package/dist/{discover-TODAYYJ2.js → discover-UO5M7HQZ.js} +3 -3
  83. package/dist/{discover-eval-FWQESEYB.js → discover-eval-DN4PS6VN.js} +3 -3
  84. package/dist/{doctor-AXNJT2UC.js → doctor-7UYUXG7J.js} +3 -3
  85. package/dist/{evidence-2XGEY4ZC.js → evidence-DGKN5SGQ.js} +3 -3
  86. package/dist/{export-cmd-7RMYBIBZ.js → export-cmd-QAQWWIRL.js} +3 -3
  87. package/dist/{ga-HZDIZGCO.js → ga-4LGTEA6J.js} +3 -3
  88. package/dist/{gbp-SMRBWJEL.js → gbp-XOLYZ4XC.js} +3 -3
  89. package/dist/{google-2CN345XS.js → google-CAQDCFA6.js} +4 -4
  90. package/dist/{google-marketing-W7T2VTVW.js → google-marketing-HU5I3XPP.js} +1 -1
  91. package/dist/{health-cmd-W7OWZ4ZI.js → health-cmd-3PEB3M45.js} +3 -3
  92. package/dist/{history-UVNCBHTE.js → history-UGUWYPOY.js} +3 -3
  93. package/dist/index.d.ts +342 -161
  94. package/dist/index.js +24 -24
  95. package/dist/{init-2IWS2R7G.js → init-DEW65BLN.js} +11 -11
  96. package/dist/{insights-PQ52G5LU.js → insights-ZC3R4ZYG.js} +3 -3
  97. package/dist/intelligence-service-XRJVXZYI.js +15 -0
  98. package/dist/{journeys-3PP5GYVJ.js → journeys-W6F4BCXF.js} +3 -3
  99. package/dist/{keys-CWZUX7IQ.js → keys-ME7VRF73.js} +3 -3
  100. package/dist/{keyword-5OMMULLY.js → keyword-R3PLGSO5.js} +3 -3
  101. package/dist/{logs-3FTE42E3.js → logs-UM7CWHYB.js} +3 -3
  102. package/dist/{mcp-FK5DTI7I.js → mcp-BUPP5HC6.js} +2 -2
  103. package/dist/mcp.js +9 -9
  104. package/dist/{measurement-plan-ICO2BQNT.js → measurement-plan-R4KZHJII.js} +5 -5
  105. package/dist/{notify-ML4PYD3L.js → notify-4C26D2MY.js} +3 -3
  106. package/dist/{organic-evidence-4U4H3DCR.js → organic-evidence-SLIISYHW.js} +3 -3
  107. package/dist/{overview-NF427VFO.js → overview-JJZZOYQU.js} +4 -4
  108. package/dist/{project-AAO65OF7.js → project-XJH2OECP.js} +3 -3
  109. package/dist/{query-7ZOUQNF5.js → query-ZWAIWIYB.js} +3 -3
  110. package/dist/{research-UQ7AF5N3.js → research-GTVWVZBI.js} +3 -3
  111. package/dist/{results-export-CZCLC4ZH.js → results-export-CPAWO5AV.js} +3 -3
  112. package/dist/{run-4XJZW52R.js → run-RI2BMD7U.js} +4 -4
  113. package/dist/{schedule-D3E5FDBE.js → schedule-HDDWULBX.js} +3 -3
  114. package/dist/{search-DYET2IL4.js → search-TT3Q2BBP.js} +3 -3
  115. package/dist/{serve-QWMTR3SN.js → serve-6JYPUU24.js} +25 -25
  116. package/dist/{session-7CW2V5EH.js → session-DDESFV3N.js} +12 -12
  117. package/dist/{settings-ZISHACFX.js → settings-4AYXYJVA.js} +3 -3
  118. package/dist/{skills-WU6IN3NL.js → skills-UFMLMMY5.js} +2 -2
  119. package/dist/{snapshot-KCKQDJ2W.js → snapshot-KLWQGZB6.js} +3 -3
  120. package/dist/{src-WIOU5G4V.js → src-6IHGEMT2.js} +6 -2
  121. package/dist/{status-CYZFVMYA.js → status-HRIUPGUM.js} +4 -4
  122. package/dist/{technical-aeo-P5CS22AR.js → technical-aeo-HKJQHMMS.js} +3 -3
  123. package/dist/{telemetry-LPK5F2WU.js → telemetry-IS6KZK32.js} +4 -4
  124. package/dist/{tools-E3B2GZ6Q.js → tools-ZNVQFEAX.js} +11 -11
  125. package/dist/{traffic-5KZYXXIQ.js → traffic-PFHFGN44.js} +5 -5
  126. package/dist/{users-2F346HIW.js → users-BSLUSU6W.js} +3 -3
  127. package/dist/{visibility-stats-ITA6DNF3.js → visibility-stats-MPRNHPZW.js} +3 -3
  128. package/dist/{wordpress-ZHCFT6V3.js → wordpress-U5XKHURL.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/TrafficSourceDetailPage-CdoL5Dt9.js +0 -1
  135. package/assets/assets/index-D6WlecSB.js +0 -60
  136. package/assets/assets/react-query-BktZZtSC.js +0 -1
  137. package/assets/assets/service-DKP-BIBy.js +0 -1
  138. 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-XEPEMON2.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-XEGYSZEV.js";
23
23
 
24
24
  // src/commands/run.ts
25
25
  function getClient() {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hostMatchesDomain
3
- } from "./chunk-DQVJB6CZ.js";
3
+ } from "./chunk-XEGYSZEV.js";
4
4
 
5
5
  // src/citation-utils.ts
6
6
  function pickProjectCitedDomain(citedDomains, projectDomains) {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-F7NZEUXP.js";
3
+ } from "./chunk-XEPEMON2.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-ZPRJCSSR.js";
10
+ } from "./chunk-LU3M54IY.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-DQVJB6CZ.js";
40
+ } from "./chunk-XEGYSZEV.js";
41
41
 
42
42
  // src/commands/measurement-plan.ts
43
43
  import crypto from "crypto";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  trackIntegrationConnection
3
- } from "./chunk-M3OZL6PQ.js";
3
+ } from "./chunk-RRS7U6HQ.js";
4
4
  import {
5
5
  cliRuntimeContext
6
- } from "./chunk-XMKXXWMO.js";
6
+ } from "./chunk-ZGUR4AZM.js";
7
7
 
8
8
  // src/cli-connection-telemetry.ts
9
9
  function trackCliConnection(properties) {
@@ -8,7 +8,7 @@ import {
8
8
  classifyJourneyEntry,
9
9
  hostMatchesDomain,
10
10
  hostOf
11
- } from "./chunk-DQVJB6CZ.js";
11
+ } from "./chunk-XEGYSZEV.js";
12
12
 
13
13
  // ../integration-traffic/src/ip-ranges/amazonbot.json
14
14
  var amazonbot_default = {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  answerServiceAdapters,
3
3
  answerServiceDescriptors
4
- } from "./chunk-737TOG2F.js";
4
+ } from "./chunk-XMIKSCAO.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-32BTTG5N.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-XIA6NWIF.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-YP743QX5.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-5DMESZDF.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-RRS7U6HQ.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-NHHZQWMI.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-ZGUR4AZM.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-GM5ZOWBK.js";
101
+ } from "./chunk-VR4MYSEH.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-XEPEMON2.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-UNCOK6DA.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
- } from "./chunk-SL3Y7IOX.js";
142
+ } from "./chunk-MLOGEXIO.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-P74TPIWZ.js";
150
150
  import {
151
151
  CanonryMcpToolNames,
152
152
  canonryMcpTools
153
- } from "./chunk-BV6NXSAH.js";
153
+ } from "./chunk-37R6GTU7.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-UHLWNU6I.js";
166
166
  import {
167
167
  computeCitedCompetitorDomains,
168
168
  determineCitationState
169
- } from "./chunk-S4VCXCRQ.js";
169
+ } from "./chunk-EKSXR7RJ.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-AVISYPUU.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-6DJN7HCK.js";
376
376
  import {
377
377
  AGENT_MEMORY_VALUE_MAX_BYTES,
378
378
  AI_ENGINE_DOMAINS,
@@ -450,6 +450,7 @@ import {
450
450
  SentimentOutcomes,
451
451
  SeoAdapterOutcomes,
452
452
  SeoCapabilities,
453
+ SeoMarketRankingSearchStatuses,
453
454
  SeoProviders,
454
455
  SeoRunStatuses,
455
456
  SeoTargetKinds,
@@ -597,7 +598,9 @@ import {
597
598
  sentimentClassifierOutputSchema,
598
599
  sentimentEvaluatorProvider,
599
600
  sentimentSelectionSchema,
601
+ seoDeviceSchema,
600
602
  seoProfileInputSchema,
603
+ seoRankingSettingsSchema,
601
604
  serializeForInlineScript,
602
605
  serializeRunError,
603
606
  shiftIsoCalendarDate,
@@ -618,7 +621,7 @@ import {
618
621
  winnabilityClassLabel,
619
622
  withRetry,
620
623
  withSkippedProviders
621
- } from "./chunk-DQVJB6CZ.js";
624
+ } from "./chunk-XEGYSZEV.js";
622
625
 
623
626
  // src/google-marketing-runtime.ts
624
627
  import crypto2 from "crypto";
@@ -3342,8 +3345,8 @@ var DataForSeoTransportError = class extends Error {
3342
3345
  throttle;
3343
3346
  retryAfter;
3344
3347
  };
3345
- async function fetchOnce2(credentials, endpoint, task, signal) {
3346
- const response = await fetch(`https://api.dataforseo.com/v3/dataforseo_labs/google/${endpoint}/live`, {
3348
+ async function fetchOnce2(credentials, path6, task, signal) {
3349
+ const response = await fetch(`https://api.dataforseo.com/v3/${path6}`, {
3347
3350
  method: "POST",
3348
3351
  headers: {
3349
3352
  Authorization: `Basic ${Buffer.from(`${credentials.login}:${credentials.password}`).toString("base64")}`,
@@ -3367,11 +3370,11 @@ async function fetchOnce2(credentials, endpoint, task, signal) {
3367
3370
  }
3368
3371
  return envelope;
3369
3372
  }
3370
- async function dataForSeoFetch(credentials, endpoint, task, signal) {
3373
+ async function dataForSeoFetch(credentials, path6, task, signal) {
3371
3374
  let refusal = null;
3372
3375
  return withRetry(() => {
3373
3376
  if (signal?.aborted) throw refusal ?? new Error("SEO request was cancelled.");
3374
- return fetchOnce2(credentials, endpoint, task, signal);
3377
+ return fetchOnce2(credentials, path6, task, signal);
3375
3378
  }, {
3376
3379
  maxRetries: 2,
3377
3380
  baseDelayMs: 2e3,
@@ -3450,18 +3453,85 @@ var resultSchema = z2.object({
3450
3453
  target: z2.string().optional(),
3451
3454
  items: z2.array(z2.unknown()).nullable()
3452
3455
  });
3456
+ var serpResultSchema = z2.object({
3457
+ keyword: z2.string(),
3458
+ location_code: z2.number().int(),
3459
+ language_code: z2.string(),
3460
+ datetime: z2.string().nullish(),
3461
+ items: z2.array(z2.unknown()).nullish()
3462
+ });
3463
+ var serpItemTypeSchema = z2.object({ type: z2.string() });
3464
+ var serpItemSchema = z2.object({
3465
+ type: z2.literal("organic"),
3466
+ domain: z2.string().nullish(),
3467
+ url: z2.string().nullish(),
3468
+ rank_group: z2.number().int().positive().nullish(),
3469
+ rank_absolute: z2.number().int().positive().nullish()
3470
+ });
3453
3471
  function provenance(request, collectedAt, sourceUpdatedAt) {
3472
+ const serp = request.capability === SeoCapabilities["market-rankings"];
3454
3473
  return {
3455
3474
  provider: SeoProviders.dataforseo,
3456
- dataset: `dataforseo-labs/google/${request.capability}`,
3475
+ dataset: `${serp ? "dataforseo-serp" : "dataforseo-labs"}/google/${request.capability}`,
3457
3476
  engine: "google",
3458
3477
  locationCode: request.locationCode,
3459
3478
  languageCode: request.languageCode,
3460
- device: "unspecified",
3479
+ device: serp && request.search ? request.search.device : "unspecified",
3461
3480
  collectedAt,
3462
3481
  sourceUpdatedAt
3463
3482
  };
3464
3483
  }
3484
+ function hostBelongsTo(host, target) {
3485
+ const value = target.value.toLowerCase();
3486
+ return host === value || target.kind === SeoTargetKinds.domain && target.includeSubdomains && host.endsWith(`.${value}`);
3487
+ }
3488
+ var searchIdentity = (text) => text.replace(/\s+/g, " ").trim().toLowerCase();
3489
+ function marketRankings(rawResult, request, collectedAt, partial) {
3490
+ const search = request.search;
3491
+ const target = request.target;
3492
+ const searchText = request.keywords[0];
3493
+ if (!search || !target || !searchText) throw new Error("Market rankings need a search, a target and search text.");
3494
+ const result = serpResultSchema.parse(rawResult);
3495
+ if (result.location_code !== request.locationCode || result.language_code !== request.languageCode) {
3496
+ throw new Error("SEO provider returned a different market.");
3497
+ }
3498
+ if (searchIdentity(result.keyword) !== searchIdentity(searchText)) throw new Error("SEO provider returned a different search.");
3499
+ const organic = (result.items ?? []).filter((item) => serpItemTypeSchema.safeParse(item).data?.type === "organic").map((item) => serpItemSchema.parse(item)).filter((item) => item.rank_group != null);
3500
+ const depth = partial ? Math.min(search.depth, organic.reduce((deepest, item) => Math.max(deepest, item.rank_group), 0)) : search.depth;
3501
+ if (depth === 0) throw new Error("SEO provider returned no organic results for a partly collected search.");
3502
+ let best = null;
3503
+ const competitorRanks = /* @__PURE__ */ new Map();
3504
+ const competitors2 = new Set(search.markets.flatMap((market) => market.competitors));
3505
+ for (const item of organic) {
3506
+ const host = item.domain ? normalizeHostname(item.domain) : null;
3507
+ if (!host) continue;
3508
+ if (hostBelongsTo(host, target)) {
3509
+ if (!best || item.rank_group < best.rank_group) best = item;
3510
+ continue;
3511
+ }
3512
+ const domain = registrableDomain(host);
3513
+ const seen = competitorRanks.get(domain);
3514
+ if (domain && competitors2.has(domain) && (seen === void 0 || item.rank_group < seen)) competitorRanks.set(domain, item.rank_group);
3515
+ }
3516
+ const ranked = [...competitorRanks].map(([domain, rankOrganic]) => ({ domain, rankOrganic })).sort((a, b) => a.rankOrganic - b.rankOrganic || compareText(a.domain, b.domain));
3517
+ const source = provenance(request, collectedAt, result.datetime ?? null);
3518
+ return search.markets.map((market) => {
3519
+ const tracked = new Set(market.competitors);
3520
+ return {
3521
+ ...market.context,
3522
+ searchText,
3523
+ locationLabel: search.locationLabel,
3524
+ target,
3525
+ searchStatus: partial ? SeoMarketRankingSearchStatuses.partial : SeoMarketRankingSearchStatuses.completed,
3526
+ rankOrganic: best?.rank_group ?? null,
3527
+ rankAbsolute: best?.rank_absolute ?? null,
3528
+ url: best?.url ?? null,
3529
+ depth,
3530
+ competitors: ranked.filter((competitor) => tracked.has(competitor.domain)),
3531
+ provenance: source
3532
+ };
3533
+ });
3534
+ }
3465
3535
  function keywordMetrics(item, request, collectedAt) {
3466
3536
  return {
3467
3537
  keyword: item.keyword,
@@ -3479,8 +3549,13 @@ function keywordMetrics(item, request, collectedAt) {
3479
3549
  provenance: provenance(request, collectedAt, item.keyword_info?.last_updated_time ?? null)
3480
3550
  };
3481
3551
  }
3482
- function normalizeDataForSeoResults(rawResults, request, collectedAt) {
3552
+ function normalizeDataForSeoResults(rawResults, request, collectedAt, options = {}) {
3483
3553
  const output = emptySeoResults();
3554
+ if (request.capability === SeoCapabilities["market-rankings"]) {
3555
+ if (rawResults.length !== 1) throw new Error("SEO provider returned an unexpected number of results pages.");
3556
+ output.marketRankings.push(...marketRankings(rawResults[0], request, collectedAt, options.partial === true));
3557
+ return output;
3558
+ }
3484
3559
  for (const raw of rawResults) {
3485
3560
  const result = resultSchema.parse(raw);
3486
3561
  if (result.location_code !== request.locationCode || result.language_code !== request.languageCode) {
@@ -3557,12 +3632,81 @@ function normalizeDataForSeoResults(rawResults, request, collectedAt) {
3557
3632
 
3558
3633
  // ../integration-dataforseo/src/adapter.ts
3559
3634
  var ENDPOINTS = {
3560
- [SeoCapabilities["keyword-metrics"]]: "keyword_overview",
3561
- [SeoCapabilities["domain-intelligence"]]: "domain_rank_overview",
3562
- [SeoCapabilities["ranked-keywords"]]: "ranked_keywords"
3635
+ [SeoCapabilities["keyword-metrics"]]: "dataforseo_labs/google/keyword_overview/live",
3636
+ [SeoCapabilities["domain-intelligence"]]: "dataforseo_labs/google/domain_rank_overview/live",
3637
+ [SeoCapabilities["ranked-keywords"]]: "dataforseo_labs/google/ranked_keywords/live",
3638
+ [SeoCapabilities["market-rankings"]]: "serp/google/organic/live/advanced"
3563
3639
  };
3640
+ var MAX_SEARCH_TEXT_LENGTH = 700;
3641
+ var SURCHARGED_OPERATORS = [
3642
+ "allinanchor:",
3643
+ "allintext:",
3644
+ "allintitle:",
3645
+ "allinurl:",
3646
+ "cache:",
3647
+ "define:",
3648
+ "definition:",
3649
+ "filetype:",
3650
+ "id:",
3651
+ "inanchor:",
3652
+ "info:",
3653
+ "intext:",
3654
+ "intitle:",
3655
+ "inurl:",
3656
+ "link:",
3657
+ "site:"
3658
+ ];
3659
+ var OPERATOR_SURCHARGE = 5;
3660
+ function usesSurchargedOperator(searchText) {
3661
+ const text = searchText.toLowerCase();
3662
+ return SURCHARGED_OPERATORS.some((operator) => text.includes(operator));
3663
+ }
3664
+ function serpKeyword(searchText) {
3665
+ return searchText.replaceAll("%", "%25").replaceAll("+", "%2B");
3666
+ }
3564
3667
  var REQUEST_REFUSALS = /* @__PURE__ */ new Set([4e4, 40006, 40100, 40104, 40200, 40203, 40205, 40206, 40207, 40210, 40501, 40502, 40503, 40506]);
3668
+ var PARTIAL_RESULTS = 40106;
3669
+ var SEARCH_ENGINE_ERROR = 40101;
3670
+ function targetHost(target) {
3671
+ const host = target ? normalizeHostname(target.value) : null;
3672
+ if (!target || !host || !registrableDomain(host)) {
3673
+ throw validationError("SEO requires a bare public domain or hostname.");
3674
+ }
3675
+ const domain = registrableDomain(host);
3676
+ if (target.kind === SeoTargetKinds.domain && (host !== domain || !target.includeSubdomains)) {
3677
+ throw validationError("Use the root domain with subdomains included, or choose exact host scope.");
3678
+ }
3679
+ if (target.kind === SeoTargetKinds.host && target.includeSubdomains) {
3680
+ throw validationError("Exact host scope cannot include subdomains.");
3681
+ }
3682
+ return host;
3683
+ }
3684
+ function marketRankingPayload(request) {
3685
+ const search = request.search;
3686
+ const text = request.keywords[0]?.trim() ?? "";
3687
+ if (!search || request.keywords.length !== 1 || !text || text.length > MAX_SEARCH_TEXT_LENGTH) {
3688
+ throw validationError("Market rankings search one tracked query of up to 700 characters at a time.");
3689
+ }
3690
+ if (!seoRankingSettingsSchema.shape.depth.safeParse(search.depth).success || !seoDeviceSchema.safeParse(search.device).success) {
3691
+ throw validationError("Market rankings need a result depth from 10 to 100 in steps of 10 and a device.");
3692
+ }
3693
+ if (search.markets.length === 0) throw validationError("Market rankings need at least one market for each search.");
3694
+ if (!Number.isSafeInteger(request.locationCode) || request.locationCode <= 0 || request.languageCode.length < 2 || request.languageCode.length > 10) {
3695
+ throw validationError("Check the SEO provider location and language.");
3696
+ }
3697
+ if (request.tag.length > 255) throw validationError("SEO task identifier is too long.");
3698
+ targetHost(request.target);
3699
+ return {
3700
+ keyword: serpKeyword(text),
3701
+ location_code: request.locationCode,
3702
+ language_code: request.languageCode,
3703
+ device: search.device,
3704
+ depth: search.depth,
3705
+ tag: request.tag
3706
+ };
3707
+ }
3565
3708
  function taskPayload(request) {
3709
+ if (request.capability === SeoCapabilities["market-rankings"]) return marketRankingPayload(request);
3566
3710
  const parsed = seoProfileInputSchema.pick({ keywords: true, locationCode: true, languageCode: true, limit: true }).safeParse({
3567
3711
  keywords: request.keywords,
3568
3712
  locationCode: request.locationCode,
@@ -3579,17 +3723,8 @@ function taskPayload(request) {
3579
3723
  return { ...common, keywords: request.keywords, include_clickstream_data: false, include_serp_info: true };
3580
3724
  }
3581
3725
  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
- }
3726
+ const host = targetHost(target);
3586
3727
  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
3728
  switch (request.capability) {
3594
3729
  case SeoCapabilities["domain-intelligence"]:
3595
3730
  if (target.kind !== SeoTargetKinds.domain) throw validationError("Domain intelligence requires a whole-domain scope.");
@@ -3613,6 +3748,10 @@ function taskPayload(request) {
3613
3748
  }
3614
3749
  function estimate(request) {
3615
3750
  taskPayload(request);
3751
+ if (request.capability === SeoCapabilities["market-rankings"]) {
3752
+ const surcharge = usesSurchargedOperator(request.keywords[0]) ? OPERATOR_SURCHARGE : 1;
3753
+ return { maxCostMicros: 2e3 * (request.search.depth / 10) * surcharge, catalogRevision: "dataforseo-google-serp-live-2026-10-25-operators" };
3754
+ }
3616
3755
  const rows = request.capability === SeoCapabilities["keyword-metrics"] ? request.keywords.length : request.capability === SeoCapabilities["domain-intelligence"] ? 1 : request.limit;
3617
3756
  return { maxCostMicros: 12e3 + 120 * rows, catalogRevision: "dataforseo-google-labs-2026-10-22" };
3618
3757
  }
@@ -3620,6 +3759,7 @@ function appendResults(target, source) {
3620
3759
  target.keywordMetrics.push(...source.keywordMetrics);
3621
3760
  target.domainIntelligence.push(...source.domainIntelligence);
3622
3761
  target.rankedKeywords.push(...source.rankedKeywords);
3762
+ target.marketRankings.push(...source.marketRankings);
3623
3763
  }
3624
3764
  function createDataForSeoAdapter(credentials) {
3625
3765
  const auth = { login: credentials.login.trim(), password: credentials.password };
@@ -3652,22 +3792,27 @@ function createDataForSeoAdapter(credentials) {
3652
3792
  statusCode: task.status_code,
3653
3793
  costMicros: task.cost == null ? null : dollarsToMicros(task.cost)
3654
3794
  }));
3655
- let successes = 0;
3795
+ let complete = 0;
3796
+ let partial = 0;
3656
3797
  for (const task of tasks) {
3657
- if (task.status_code !== 2e4) continue;
3798
+ const partly = task.status_code === PARTIAL_RESULTS && request.capability === SeoCapabilities["market-rankings"];
3799
+ if (task.status_code !== 2e4 && !partly) continue;
3658
3800
  try {
3659
- appendResults(results, normalizeDataForSeoResults(task.result ?? [], request, fetchedAt2));
3660
- successes++;
3801
+ appendResults(results, normalizeDataForSeoResults(task.result ?? [], request, fetchedAt2, { partial: partly }));
3802
+ if (partly) partial++;
3803
+ else complete++;
3661
3804
  } catch {
3662
3805
  }
3663
3806
  }
3664
- const outcome = successes === tasks.length ? SeoAdapterOutcomes.completed : successes > 0 ? SeoAdapterOutcomes.partial : SeoAdapterOutcomes.failed;
3807
+ const outcome = complete === tasks.length ? SeoAdapterOutcomes.completed : complete + partial > 0 ? SeoAdapterOutcomes.partial : SeoAdapterOutcomes.failed;
3808
+ const retryable = request.capability === SeoCapabilities["market-rankings"] && outcome === SeoAdapterOutcomes.failed && receipts.every((receipt) => receipt.statusCode === SEARCH_ENGINE_ERROR && receipt.costMicros !== null);
3665
3809
  return {
3666
3810
  outcome,
3667
3811
  tasks: receipts,
3668
3812
  results,
3669
3813
  fetchedAt: fetchedAt2,
3670
- error: outcome === SeoAdapterOutcomes.completed ? null : "Some SEO provider results could not be collected."
3814
+ error: outcome === SeoAdapterOutcomes.completed ? null : "Some SEO provider results could not be collected.",
3815
+ ...retryable ? { retryable: true } : {}
3671
3816
  };
3672
3817
  } catch (error) {
3673
3818
  const unaccepted = error instanceof DataForSeoTransportError && error.unaccepted;
@@ -3772,7 +3917,7 @@ var SeoRuntime = class {
3772
3917
  for (const [id, entry] of this.pending) {
3773
3918
  try {
3774
3919
  if (!entry.settled) {
3775
- if (!this.repository.settle(id, entry.result, entry.owner)) {
3920
+ if (!this.repository.settle(id, entry.result, entry.owner, this.getRuntime()?.policy)) {
3776
3921
  createLogger("SeoRuntime").error("seo.receipt.superseded", { message: "SEO receipt could not replace an already reconciled or differently owned task." });
3777
3922
  clearInterval(entry.heartbeat);
3778
3923
  this.pending.delete(id);
@@ -5659,7 +5804,7 @@ function nonBlank(value) {
5659
5804
  return trimmed ? trimmed : void 0;
5660
5805
  }
5661
5806
  function resolveBuildCommit(env = process.env) {
5662
- const embedded = true ? "06f8803bd0643d0048ac8a9afc2bafb6b95b6ca7" : void 0;
5807
+ const embedded = true ? "bc41644d8fe1f58eb00fd3cf4e6fc224834d7d24" : void 0;
5663
5808
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5664
5809
  }
5665
5810
  function resolveInstanceIdentity(env = process.env) {
@@ -13022,6 +13167,7 @@ function ensureDefaultHealthSchedule(db, projectId, now = (/* @__PURE__ */ new D
13022
13167
  cronExpr: DEFAULT_HEALTH_CRON,
13023
13168
  timezone: "UTC",
13024
13169
  enabled: true,
13170
+ enabledAt: now,
13025
13171
  providers: [],
13026
13172
  nextRunAt: nextRunFromCron(DEFAULT_HEALTH_CRON, "UTC"),
13027
13173
  createdAt: now,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  registeredProviderNames
3
- } from "./chunk-IYB3EGSD.js";
3
+ } from "./chunk-NHHZQWMI.js";
4
4
  import {
5
5
  configExists,
6
6
  loadConfigRaw
7
- } from "./chunk-C2PYKUD3.js";
7
+ } from "./chunk-UNCOK6DA.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-WIOU5G4V.js");
31
+ const { createClient, projects, queries: queriesTable } = await import("./src-6IHGEMT2.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-QWMTR3SN.js");
50
+ const { serveCommand } = await import("./serve-6JYPUU24.js");
51
51
  await serveCommand(format);
52
52
  }
53
53
 
@@ -23,7 +23,7 @@ import {
23
23
  measurementDraftUpsertGroupRequestSchema,
24
24
  measurementDraftUpsertMarketRequestSchema,
25
25
  measurementDraftUpsertTargetRequestSchema
26
- } from "./chunk-DQVJB6CZ.js";
26
+ } from "./chunk-XEGYSZEV.js";
27
27
 
28
28
  // src/measurement-draft-actions.ts
29
29
  import { z } from "zod";
@@ -5,7 +5,7 @@ import {
5
5
  AppError,
6
6
  parseWindowIn,
7
7
  resolveDateRange
8
- } from "./chunk-DQVJB6CZ.js";
8
+ } from "./chunk-XEGYSZEV.js";
9
9
 
10
10
  // src/cli-access.ts
11
11
  var CLI_ACCESS_BY_ID = Object.freeze({
@@ -331,6 +331,7 @@ var CLI_ACCESS_BY_ID = Object.freeze({
331
331
  "seo.context": "stored",
332
332
  "seo.domain-intelligence": "stored",
333
333
  "seo.keyword-metrics": "stored",
334
+ "seo.market-rankings": "stored",
334
335
  "seo.operator.reconcile": "write",
335
336
  "seo.operator.task": "stored",
336
337
  "seo.overview": "stored",
@@ -15,7 +15,7 @@ import {
15
15
  formatCanonryPluginUpdateHint,
16
16
  formatCanonryPluginVersionMismatch,
17
17
  skillsClientSchema
18
- } from "./chunk-DQVJB6CZ.js";
18
+ } from "./chunk-XEGYSZEV.js";
19
19
 
20
20
  // src/commands/skills.ts
21
21
  import crypto from "crypto";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-HGMYEDAQ.js";
9
9
  import {
10
10
  describeError
11
- } from "./chunk-DQVJB6CZ.js";
11
+ } from "./chunk-XEGYSZEV.js";
12
12
 
13
13
  // src/commands/mcp.ts
14
14
  import fs from "fs";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  API_PROVIDER_NAMES,
3
3
  ProviderNames
4
- } from "./chunk-DQVJB6CZ.js";
4
+ } from "./chunk-XEGYSZEV.js";
5
5
 
6
6
  // src/provider-registration.ts
7
7
  function isApiProviderRegistrable(name, entry) {
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-XOMUSIM7.js";
8
+ } from "./chunk-6DJN7HCK.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-XEGYSZEV.js";
19
19
 
20
20
  // src/site-audit-factors.ts
21
21
  function recordedSharePct(factor) {