@canonry/canonry 7.66.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 (139) hide show
  1. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +12 -4
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +2 -2
  3. package/assets/assets/{AgentSetupPage-DXFxOJ1W.js → AgentSetupPage-DyssdZ1J.js} +3 -3
  4. package/assets/assets/{AuditHistoryPanel-CS8UfTHc.js → AuditHistoryPanel-Bma4Q6p0.js} +1 -1
  5. package/assets/assets/{BacklinksPage-D5IA2tNY.js → BacklinksPage-C3GoO2Wf.js} +1 -1
  6. package/assets/assets/{HistoryPage-DsQAUkgR.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-BgjN1N3t.js → RunsPage-Cw0GTxgx.js} +1 -1
  10. package/assets/assets/{SettingsPage-BQuqnEvm.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-BBqpvwl5.js → TrafficPage-BUb0xr-b.js} +1 -1
  14. package/assets/assets/TrafficSourceDetailPage-DmrtEYs8.js +1 -0
  15. package/assets/assets/{account-context-wRthfm6K.js → account-context-qhg8esXw.js} +1 -1
  16. package/assets/assets/{card-Bq64-UB5.js → card-BNthgfAY.js} +1 -1
  17. package/assets/assets/{extract-error-message-BRDc8As2.js → extract-error-message-DuYEL09s.js} +1 -1
  18. package/assets/assets/{format-helpers-D5wFtgg2.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-IopmAOx0.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-d72rX0Uo.js → react-sigma_core.esm.min-EbeNATny.js} +1 -1
  24. package/assets/assets/service-DGFjEsYR.js +1 -0
  25. package/assets/index.html +8 -8
  26. package/dist/{ads-IFKZU7SC.js → ads-AHM5LMVT.js} +3 -3
  27. package/dist/{agent-3KMENHL3.js → agent-2FSGY7SD.js} +7 -7
  28. package/dist/{agent-ask-7WVQLLD5.js → agent-ask-GIK7T2HD.js} +3 -3
  29. package/dist/{agent-conversations-5LR67TBD.js → agent-conversations-JEIFZHT3.js} +3 -3
  30. package/dist/{agent-memory-GKUCCKVX.js → agent-memory-JC3JJXON.js} +3 -3
  31. package/dist/{agent-providers-TVCRM3YZ.js → agent-providers-JRL3VZA7.js} +3 -3
  32. package/dist/{agent-transcript-MUTCOOWG.js → agent-transcript-ZQDNW3IE.js} +3 -3
  33. package/dist/{analytics-2IXSG5ML.js → analytics-HMYE6EIX.js} +3 -3
  34. package/dist/{apply-7RIYK4VC.js → apply-F5CHVFC3.js} +3 -3
  35. package/dist/{backfill-VU3FV6DQ.js → backfill-JZDQKZHY.js} +9 -9
  36. package/dist/{backlinks-DLSRYEX2.js → backlinks-L7XEHBAP.js} +3 -3
  37. package/dist/{bing-4CXTZUH4.js → bing-XTMKLVRJ.js} +3 -3
  38. package/dist/{bootstrap-OOHSBSDQ.js → bootstrap-AEHBYC77.js} +10 -10
  39. package/dist/{cdp-Y53SRSRV.js → cdp-SSIHU3PU.js} +7 -7
  40. package/dist/{chunk-6ASEI24F.js → chunk-2D7O5UHJ.js} +1 -1
  41. package/dist/{chunk-LBRG6RKI.js → chunk-33LH4ZGF.js} +2 -1
  42. package/dist/{chunk-VGUZPC3I.js → chunk-4KMUJOYL.js} +4 -4
  43. package/dist/{chunk-2YBEI6LE.js → chunk-5SK27UE7.js} +1 -1
  44. package/dist/{chunk-JYOMHNRP.js → chunk-6W3ENB2X.js} +758 -467
  45. package/dist/{chunk-IHOVPHUW.js → chunk-7AXVACK6.js} +2 -2
  46. package/dist/{chunk-TJZLICMB.js → chunk-7NMCRHQL.js} +3 -3
  47. package/dist/{chunk-YRX5UOM3.js → chunk-7SGZHGZ2.js} +1 -1
  48. package/dist/{chunk-JALKQREN.js → chunk-ARIYTYOM.js} +83 -11
  49. package/dist/{chunk-PFKBQTYD.js → chunk-ARYBII44.js} +1 -1
  50. package/dist/{chunk-743NYXIK.js → chunk-CZUPNWLH.js} +2 -2
  51. package/dist/{chunk-EIMXB6UH.js → chunk-FDRZQH3Y.js} +14 -2
  52. package/dist/{chunk-OSF27DCY.js → chunk-IVBJEVHS.js} +2 -2
  53. package/dist/{chunk-BCRRAH5C.js → chunk-J4CNNYRQ.js} +1 -1
  54. package/dist/{chunk-DH5QRKFW.js → chunk-JPVG5LIE.js} +3 -3
  55. package/dist/{chunk-QRBZBJ4U.js → chunk-K2P2XO6P.js} +1 -1
  56. package/dist/{chunk-ZRSNMEB3.js → chunk-K54WGCZV.js} +409 -340
  57. package/dist/{chunk-L7DQYID4.js → chunk-LABVR6K7.js} +4 -4
  58. package/dist/{chunk-FNI3QSVD.js → chunk-LTMQ4MHF.js} +1 -1
  59. package/dist/{chunk-EYWC24VC.js → chunk-MVRPFLEL.js} +1 -1
  60. package/dist/{chunk-CKTA5374.js → chunk-PAVSKSKA.js} +1 -1
  61. package/dist/{chunk-AVQQRTMD.js → chunk-QXCQSRHL.js} +72 -33
  62. package/dist/{chunk-K2HDTMRI.js → chunk-R42VEDCB.js} +3 -3
  63. package/dist/{chunk-H37CDAZX.js → chunk-RNA6ZCM6.js} +2 -2
  64. package/dist/{chunk-FG7KMVA6.js → chunk-U3EJ5RW7.js} +12 -6
  65. package/dist/{chunk-DE2UI37M.js → chunk-V6ALEP33.js} +2 -2
  66. package/dist/{chunk-WNCOBSPN.js → chunk-VPZMSV3Q.js} +254 -9
  67. package/dist/{chunk-DVYS2RMM.js → chunk-W7PA35VJ.js} +4 -4
  68. package/dist/{chunk-YJYLFIVT.js → chunk-XMXYUP7X.js} +1 -1
  69. package/dist/{chunk-J5YZXRD5.js → chunk-Y42G2YKT.js} +8 -8
  70. package/dist/{chunk-ALQEGGYM.js → chunk-YIIIYNPW.js} +22 -4
  71. package/dist/{chunk-XC44Q5XR.js → chunk-ZD5G5QEV.js} +1 -1
  72. package/dist/{chunk-SGZWOUIZ.js → chunk-ZU6X4SN2.js} +5 -5
  73. package/dist/{chunk-IPF2S5G2.js → chunk-ZUXFHO4T.js} +4 -4
  74. package/dist/{citations-ZTQIYYDB.js → citations-NIFKIG6Y.js} +3 -3
  75. package/dist/{cli-catalog-IZJXAHFQ.js → cli-catalog-ONYERYPV.js} +3 -3
  76. package/dist/{cli-commands-XYM2VMAK.js → cli-commands-LWI2NEWW.js} +7 -7
  77. package/dist/cli.js +13 -13
  78. package/dist/{competitor-SIXAPHOM.js → competitor-NSUSTLNW.js} +3 -3
  79. package/dist/{content-XPS3D3Y6.js → content-W5VYYMAW.js} +3 -3
  80. package/dist/{dashboard-FMJDM5PA.js → dashboard-NNA3P645.js} +6 -6
  81. package/dist/{demo-QQKSHTPO.js → demo-5M4YGVV4.js} +1 -1
  82. package/dist/{demo-server-LQ3QXUAS.js → demo-server-FDR4RKLM.js} +14 -11
  83. package/dist/{discover-K5HFEU2T.js → discover-VCKMXFOR.js} +3 -3
  84. package/dist/{discover-eval-6536Z2YN.js → discover-eval-CPVP7EK5.js} +3 -3
  85. package/dist/{doctor-STNH3PHH.js → doctor-EVCP6PDM.js} +3 -3
  86. package/dist/{evidence-W2EWKBAV.js → evidence-ZWRGNZWN.js} +3 -3
  87. package/dist/{export-cmd-EGHMY3M6.js → export-cmd-AM6SIRUW.js} +3 -3
  88. package/dist/{ga-DVIG3PVW.js → ga-6J67NDMZ.js} +3 -3
  89. package/dist/{gbp-SNS4XZBO.js → gbp-ERTWK26L.js} +3 -3
  90. package/dist/{google-KGPHZG6E.js → google-O6VQFK4L.js} +4 -4
  91. package/dist/{google-marketing-VZR6W3L6.js → google-marketing-OEW2YGUR.js} +1 -1
  92. package/dist/{health-cmd-2KWO2GOM.js → health-cmd-OPGK37MK.js} +3 -3
  93. package/dist/{history-ZY27B7JE.js → history-WTU4ETCU.js} +3 -3
  94. package/dist/index.d.ts +114 -8
  95. package/dist/index.js +24 -24
  96. package/dist/{init-5TXIKII2.js → init-WTAVKFGR.js} +11 -11
  97. package/dist/{insights-MUYEOSOG.js → insights-LPEDLSEV.js} +3 -3
  98. package/dist/intelligence-service-4OO2VQ2I.js +15 -0
  99. package/dist/{journeys-YO54IRVC.js → journeys-TWVQNRLT.js} +3 -3
  100. package/dist/{keys-M4QZGYVJ.js → keys-C6FPREBZ.js} +3 -3
  101. package/dist/{keyword-MU62MGWT.js → keyword-PBSE65DK.js} +3 -3
  102. package/dist/{logs-BAQM334Q.js → logs-62RUOAKT.js} +3 -3
  103. package/dist/{mcp-LYS5P3PB.js → mcp-P4LNENKX.js} +2 -2
  104. package/dist/mcp.js +9 -9
  105. package/dist/{measurement-plan-HVSTZWTW.js → measurement-plan-HKW3IVIE.js} +5 -5
  106. package/dist/{notify-XSP5JXU3.js → notify-A3I3G7NK.js} +3 -3
  107. package/dist/{organic-evidence-4HYW4PVO.js → organic-evidence-OFUJBDCK.js} +3 -3
  108. package/dist/{overview-XH72WTZT.js → overview-NSRODN2X.js} +4 -4
  109. package/dist/{project-UKH7FTQX.js → project-B5G2HEAB.js} +3 -3
  110. package/dist/{query-RRD5M4QV.js → query-UQHJVYUJ.js} +3 -3
  111. package/dist/{research-V2IGDUKL.js → research-ZWBJDLJY.js} +3 -3
  112. package/dist/{results-export-5FC7ZT6O.js → results-export-FOJYT4MK.js} +3 -3
  113. package/dist/{run-B2A4LMWU.js → run-ZIUQ2TNN.js} +4 -4
  114. package/dist/{schedule-PLY6CHQT.js → schedule-B5CORKGT.js} +3 -3
  115. package/dist/{search-ACVK3WH5.js → search-2XCZKP6A.js} +3 -3
  116. package/dist/{serve-2LTQZPEK.js → serve-3BSLRICO.js} +25 -25
  117. package/dist/{session-IHXMPETX.js → session-PILSYOTX.js} +12 -12
  118. package/dist/{settings-ZHBNX2I5.js → settings-Y3LVGZH4.js} +3 -3
  119. package/dist/{skills-KWRTCXTF.js → skills-6E3RVQAQ.js} +2 -2
  120. package/dist/{snapshot-GBDCCV6L.js → snapshot-RAV2HCL7.js} +3 -3
  121. package/dist/{src-NOTQWGYV.js → src-VUD6WO5N.js} +6 -2
  122. package/dist/{status-FGDDGBMJ.js → status-2WCUV6C2.js} +4 -4
  123. package/dist/{technical-aeo-AK4QI63Q.js → technical-aeo-2TJEHHBR.js} +3 -3
  124. package/dist/{telemetry-6QPWYMCR.js → telemetry-LQAD26UJ.js} +4 -4
  125. package/dist/{tools-PBNTVVN7.js → tools-U6VGYZV2.js} +11 -11
  126. package/dist/{traffic-AS4PIOQL.js → traffic-3TBXSHPV.js} +5 -5
  127. package/dist/{users-BNYKF35J.js → users-2HDDA5GT.js} +3 -3
  128. package/dist/{visibility-stats-TWL3GJMD.js → visibility-stats-HSGT3OL3.js} +3 -3
  129. package/dist/{wordpress-XBWXAACD.js → wordpress-ALODIEFK.js} +3 -3
  130. package/package.json +1 -1
  131. package/assets/assets/MeasurementPropertyPage-CdCnjCaS.js +0 -4
  132. package/assets/assets/ProjectPage-D3oFKnBG.js +0 -9
  133. package/assets/assets/SiteHealthSection-C6QE9xNk.js +0 -2
  134. package/assets/assets/ToneBadge-DNva5_AM.js +0 -60
  135. package/assets/assets/TrafficSourceDetailPage-uxd0ojry.js +0 -1
  136. package/assets/assets/index-Ttz5_bL3.js +0 -60
  137. package/assets/assets/react-query-CISHjSch.js +0 -1
  138. package/assets/assets/service-DsDxSQuN.js +0 -1
  139. package/dist/intelligence-service-U4NSGZUH.js +0 -15
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  registeredProviderNames
3
- } from "./chunk-YJYLFIVT.js";
3
+ } from "./chunk-XMXYUP7X.js";
4
4
  import {
5
5
  configExists,
6
6
  loadConfigRaw
7
- } from "./chunk-EYWC24VC.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-NOTQWGYV.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-2LTQZPEK.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-WNCOBSPN.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-WNCOBSPN.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-WNCOBSPN.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-PFKBQTYD.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-FG7KMVA6.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-DVYS2RMM.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-FNI3QSVD.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-OSF27DCY.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-IPF2S5G2.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-YJYLFIVT.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-IHOVPHUW.js";
98
+ } from "./chunk-7AXVACK6.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-VGUZPC3I.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-EIMXB6UH.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-EYWC24VC.js";
139
+ } from "./chunk-MVRPFLEL.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
- } from "./chunk-6ASEI24F.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-H37CDAZX.js";
149
+ } from "./chunk-RNA6ZCM6.js";
150
150
  import {
151
151
  CanonryMcpToolNames,
152
152
  canonryMcpTools
153
- } from "./chunk-ALQEGGYM.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-SGZWOUIZ.js";
165
+ } from "./chunk-ZU6X4SN2.js";
166
166
  import {
167
167
  computeCitedCompetitorDomains,
168
168
  determineCitationState
169
- } from "./chunk-QRBZBJ4U.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-JYOMHNRP.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-JALKQREN.js";
375
+ } from "./chunk-ARIYTYOM.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,
@@ -620,7 +621,7 @@ import {
620
621
  winnabilityClassLabel,
621
622
  withRetry,
622
623
  withSkippedProviders
623
- } from "./chunk-WNCOBSPN.js";
624
+ } from "./chunk-VPZMSV3Q.js";
624
625
 
625
626
  // src/google-marketing-runtime.ts
626
627
  import crypto2 from "crypto";
@@ -3485,7 +3486,7 @@ function hostBelongsTo(host, target) {
3485
3486
  return host === value || target.kind === SeoTargetKinds.domain && target.includeSubdomains && host.endsWith(`.${value}`);
3486
3487
  }
3487
3488
  var searchIdentity = (text) => text.replace(/\s+/g, " ").trim().toLowerCase();
3488
- function marketRankings(rawResult, request, collectedAt) {
3489
+ function marketRankings(rawResult, request, collectedAt, partial) {
3489
3490
  const search = request.search;
3490
3491
  const target = request.target;
3491
3492
  const searchText = request.keywords[0];
@@ -3496,6 +3497,8 @@ function marketRankings(rawResult, request, collectedAt) {
3496
3497
  }
3497
3498
  if (searchIdentity(result.keyword) !== searchIdentity(searchText)) throw new Error("SEO provider returned a different search.");
3498
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.");
3499
3502
  let best = null;
3500
3503
  const competitorRanks = /* @__PURE__ */ new Map();
3501
3504
  const competitors2 = new Set(search.markets.flatMap((market) => market.competitors));
@@ -3519,10 +3522,11 @@ function marketRankings(rawResult, request, collectedAt) {
3519
3522
  searchText,
3520
3523
  locationLabel: search.locationLabel,
3521
3524
  target,
3525
+ searchStatus: partial ? SeoMarketRankingSearchStatuses.partial : SeoMarketRankingSearchStatuses.completed,
3522
3526
  rankOrganic: best?.rank_group ?? null,
3523
3527
  rankAbsolute: best?.rank_absolute ?? null,
3524
3528
  url: best?.url ?? null,
3525
- depth: search.depth,
3529
+ depth,
3526
3530
  competitors: ranked.filter((competitor) => tracked.has(competitor.domain)),
3527
3531
  provenance: source
3528
3532
  };
@@ -3545,11 +3549,11 @@ function keywordMetrics(item, request, collectedAt) {
3545
3549
  provenance: provenance(request, collectedAt, item.keyword_info?.last_updated_time ?? null)
3546
3550
  };
3547
3551
  }
3548
- function normalizeDataForSeoResults(rawResults, request, collectedAt) {
3552
+ function normalizeDataForSeoResults(rawResults, request, collectedAt, options = {}) {
3549
3553
  const output = emptySeoResults();
3550
3554
  if (request.capability === SeoCapabilities["market-rankings"]) {
3551
3555
  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));
3556
+ output.marketRankings.push(...marketRankings(rawResults[0], request, collectedAt, options.partial === true));
3553
3557
  return output;
3554
3558
  }
3555
3559
  for (const raw of rawResults) {
@@ -3634,7 +3638,35 @@ var ENDPOINTS = {
3634
3638
  [SeoCapabilities["market-rankings"]]: "serp/google/organic/live/advanced"
3635
3639
  };
3636
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
+ }
3637
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;
3638
3670
  function targetHost(target) {
3639
3671
  const host = target ? normalizeHostname(target.value) : null;
3640
3672
  if (!target || !host || !registrableDomain(host)) {
@@ -3665,7 +3697,7 @@ function marketRankingPayload(request) {
3665
3697
  if (request.tag.length > 255) throw validationError("SEO task identifier is too long.");
3666
3698
  targetHost(request.target);
3667
3699
  return {
3668
- keyword: text,
3700
+ keyword: serpKeyword(text),
3669
3701
  location_code: request.locationCode,
3670
3702
  language_code: request.languageCode,
3671
3703
  device: search.device,
@@ -3717,7 +3749,8 @@ function taskPayload(request) {
3717
3749
  function estimate(request) {
3718
3750
  taskPayload(request);
3719
3751
  if (request.capability === SeoCapabilities["market-rankings"]) {
3720
- return { maxCostMicros: 2e3 * (request.search.depth / 10), catalogRevision: "dataforseo-google-serp-live-2026-10-25" };
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" };
3721
3754
  }
3722
3755
  const rows = request.capability === SeoCapabilities["keyword-metrics"] ? request.keywords.length : request.capability === SeoCapabilities["domain-intelligence"] ? 1 : request.limit;
3723
3756
  return { maxCostMicros: 12e3 + 120 * rows, catalogRevision: "dataforseo-google-labs-2026-10-22" };
@@ -3759,22 +3792,27 @@ function createDataForSeoAdapter(credentials) {
3759
3792
  statusCode: task.status_code,
3760
3793
  costMicros: task.cost == null ? null : dollarsToMicros(task.cost)
3761
3794
  }));
3762
- let successes = 0;
3795
+ let complete = 0;
3796
+ let partial = 0;
3763
3797
  for (const task of tasks) {
3764
- 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;
3765
3800
  try {
3766
- appendResults(results, normalizeDataForSeoResults(task.result ?? [], request, fetchedAt2));
3767
- successes++;
3801
+ appendResults(results, normalizeDataForSeoResults(task.result ?? [], request, fetchedAt2, { partial: partly }));
3802
+ if (partly) partial++;
3803
+ else complete++;
3768
3804
  } catch {
3769
3805
  }
3770
3806
  }
3771
- 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);
3772
3809
  return {
3773
3810
  outcome,
3774
3811
  tasks: receipts,
3775
3812
  results,
3776
3813
  fetchedAt: fetchedAt2,
3777
- 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 } : {}
3778
3816
  };
3779
3817
  } catch (error) {
3780
3818
  const unaccepted = error instanceof DataForSeoTransportError && error.unaccepted;
@@ -3879,7 +3917,7 @@ var SeoRuntime = class {
3879
3917
  for (const [id, entry] of this.pending) {
3880
3918
  try {
3881
3919
  if (!entry.settled) {
3882
- if (!this.repository.settle(id, entry.result, entry.owner)) {
3920
+ if (!this.repository.settle(id, entry.result, entry.owner, this.getRuntime()?.policy)) {
3883
3921
  createLogger("SeoRuntime").error("seo.receipt.superseded", { message: "SEO receipt could not replace an already reconciled or differently owned task." });
3884
3922
  clearInterval(entry.heartbeat);
3885
3923
  this.pending.delete(id);
@@ -5766,7 +5804,7 @@ function nonBlank(value) {
5766
5804
  return trimmed ? trimmed : void 0;
5767
5805
  }
5768
5806
  function resolveBuildCommit(env = process.env) {
5769
- const embedded = true ? "1f62971b3ef629481796f7a7492eb87b0e6e6ee9" : void 0;
5807
+ const embedded = true ? "4030f8c56ac36f1152e96e1f1d51596dcb592e84" : void 0;
5770
5808
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5771
5809
  }
5772
5810
  function resolveInstanceIdentity(env = process.env) {
@@ -13129,6 +13167,7 @@ function ensureDefaultHealthSchedule(db, projectId, now = (/* @__PURE__ */ new D
13129
13167
  cronExpr: DEFAULT_HEALTH_CRON,
13130
13168
  timezone: "UTC",
13131
13169
  enabled: true,
13170
+ enabledAt: now,
13132
13171
  providers: [],
13133
13172
  nextRunAt: nextRunFromCron(DEFAULT_HEALTH_CRON, "UTC"),
13134
13173
  createdAt: now,
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-EIMXB6UH.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-CKTA5374.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-WNCOBSPN.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-JALKQREN.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-WNCOBSPN.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-DVYS2RMM.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-EYWC24VC.js";
25
+ } from "./chunk-MVRPFLEL.js";
26
26
  import {
27
27
  CanonryMcpToolNames,
28
28
  canonryMcpTools
29
- } from "./chunk-ALQEGGYM.js";
29
+ } from "./chunk-YIIIYNPW.js";
30
30
  import {
31
31
  agentToolEvents,
32
32
  llmUsageEvents
33
- } from "./chunk-JALKQREN.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-WNCOBSPN.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-IPF2S5G2.js";
3
+ } from "./chunk-ZUXFHO4T.js";
4
4
  import {
5
5
  cliRuntimeContext
6
- } from "./chunk-IHOVPHUW.js";
6
+ } from "./chunk-7AXVACK6.js";
7
7
 
8
8
  // src/cli-connection-telemetry.ts
9
9
  function trackCliConnection(properties) {