@canonry/canonry 7.91.1 → 7.92.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/canonry/references/canonry-cli.md +2 -2
  2. package/assets/assets/{AgentSetupPage-DpBlChWi.js → AgentSetupPage-Dr5ZoPYi.js} +1 -1
  3. package/assets/assets/{AuditHistoryPanel-DAotR_zD.js → AuditHistoryPanel-Dc8pGeZT.js} +1 -1
  4. package/assets/assets/{BacklinksPage-CFoi9mrt.js → BacklinksPage-zEaP7G6s.js} +1 -1
  5. package/assets/assets/{HistoryPage-DIGmY4wi.js → HistoryPage-9OaxBSY8.js} +1 -1
  6. package/assets/assets/{MeasurementPropertyPage-C6o9U2R6.js → MeasurementPropertyPage-k_mqkoWn.js} +1 -1
  7. package/assets/assets/{ProjectPage-00Vsnxv4.js → ProjectPage-vgHaFT7S.js} +1 -1
  8. package/assets/assets/{RunsPage-ChSbIrF9.js → RunsPage-CXkefezd.js} +1 -1
  9. package/assets/assets/{SettingsPage-CIrzXeP8.js → SettingsPage-C8FUNUN5.js} +1 -1
  10. package/assets/assets/{SiteHealthSection-HZXdeAOx.js → SiteHealthSection-C94uYTE3.js} +2 -2
  11. package/assets/assets/ToneBadge-COrS2zpP.js +60 -0
  12. package/assets/assets/{TrafficPage-ZYsFSEuq.js → TrafficPage-KlGx3-bc.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-D5uJZpZ4.js → TrafficSourceDetailPage-BMs9kd7S.js} +1 -1
  14. package/assets/assets/{account-context-DMLbDVNZ.js → account-context-F2VRKRtu.js} +1 -1
  15. package/assets/assets/{agent-trust-copy-DbpAXPxc.js → agent-trust-copy-Hb775a57.js} +1 -1
  16. package/assets/assets/{card-Be_eN_-Q.js → card-P1VA-JnV.js} +1 -1
  17. package/assets/assets/{format-helpers-IKCsn-Iw.js → format-helpers-COfTmLRL.js} +1 -1
  18. package/assets/assets/{index-3jdPlyTf.js → index-DHrWeA6k.js} +4 -4
  19. package/assets/assets/{query-client-CoKNm49W.js → query-client-BHtq57Sw.js} +1 -1
  20. package/assets/assets/{react-query-DIdeX4Dn.js → react-query-IhpEAOba.js} +1 -1
  21. package/assets/assets/{react-sigma_core.esm.min-De3OcL3T.js → react-sigma_core.esm.min-B4NX5_aX.js} +1 -1
  22. package/assets/assets/{server-traffic-DvN44H1n.js → server-traffic-ykAWQo0I.js} +1 -1
  23. package/assets/assets/{service-RpR2yqfP.js → service-m9l8my0x.js} +1 -1
  24. package/assets/index.html +7 -7
  25. package/dist/{ads-QS4QEBHX.js → ads-LRHVFP2J.js} +3 -3
  26. package/dist/{agent-TTGLGLPD.js → agent-P7HWL7VX.js} +7 -7
  27. package/dist/{agent-ask-EBYJSSGR.js → agent-ask-S374MIJS.js} +3 -3
  28. package/dist/{agent-conversations-LPBMYN4F.js → agent-conversations-3SSKVUYG.js} +3 -3
  29. package/dist/{agent-journeys-EL27YZKQ.js → agent-journeys-ZEO7Z4QR.js} +3 -3
  30. package/dist/{agent-memory-YNWTLZGS.js → agent-memory-E5YVW5WY.js} +3 -3
  31. package/dist/{agent-providers-T7HJEQYM.js → agent-providers-BWWB42XJ.js} +3 -3
  32. package/dist/{agent-transcript-EY6KUYYG.js → agent-transcript-YG7TTHWS.js} +3 -3
  33. package/dist/{analytics-NTO6DGQ2.js → analytics-AIKX4BUM.js} +3 -3
  34. package/dist/{apply-UGT7DZHG.js → apply-5MPSMIKM.js} +3 -3
  35. package/dist/{backfill-KDTC6JEP.js → backfill-BUTFX4KY.js} +10 -10
  36. package/dist/{backlinks-JRG57JRJ.js → backlinks-L6BYIJIK.js} +3 -3
  37. package/dist/{bing-ZV6QDFTJ.js → bing-E4ZSEVQV.js} +3 -3
  38. package/dist/{bootstrap-GJHNMV5P.js → bootstrap-V7OE6XXB.js} +10 -10
  39. package/dist/{cdp-ZN47QU5O.js → cdp-LWNX6UZF.js} +7 -7
  40. package/dist/{chunk-2N7BYEZO.js → chunk-3WWSOWXP.js} +2 -2
  41. package/dist/{chunk-LSIE5MHG.js → chunk-4HLR3DRQ.js} +1 -1
  42. package/dist/{chunk-YVY23HNW.js → chunk-4QYGB5IC.js} +1 -1
  43. package/dist/{chunk-M322ZEOQ.js → chunk-73PWU5XA.js} +4 -4
  44. package/dist/{chunk-NAPFULBT.js → chunk-7534NXSP.js} +1 -1
  45. package/dist/{chunk-IQ5RKJKQ.js → chunk-76KBMLPR.js} +1 -1
  46. package/dist/{chunk-FAXYDTV5.js → chunk-7PKMRO33.js} +4 -4
  47. package/dist/{chunk-P4MNYMJJ.js → chunk-AUC47DFW.js} +1 -1
  48. package/dist/{chunk-SYOQULRL.js → chunk-BTYOU24P.js} +2 -2
  49. package/dist/{chunk-PAXP5KZC.js → chunk-BZGAMJG2.js} +5 -5
  50. package/dist/{chunk-7KHSKOV6.js → chunk-CIP3CE2C.js} +3 -3
  51. package/dist/{chunk-6PNFPMLD.js → chunk-D2RMGUAK.js} +6 -6
  52. package/dist/{chunk-AXWUCOYT.js → chunk-DEFHTBJV.js} +1 -1
  53. package/dist/{chunk-QUS7755A.js → chunk-EWZOL56J.js} +3 -3
  54. package/dist/{chunk-PQNT2JUO.js → chunk-FYYOX7UY.js} +22 -3
  55. package/dist/{chunk-VFQMRUGN.js → chunk-GIF3HZKN.js} +21 -21
  56. package/dist/{chunk-YFOTI7LJ.js → chunk-GNHXSSQM.js} +2 -2
  57. package/dist/{chunk-C3BSCGUH.js → chunk-H3PWMM4K.js} +1 -1
  58. package/dist/{chunk-EOIH5XHT.js → chunk-JZVTSC2V.js} +2 -2
  59. package/dist/{chunk-3HNHOS6O.js → chunk-K7ZG6K7J.js} +1 -1
  60. package/dist/{chunk-WOEGZKXQ.js → chunk-N2EWSWZD.js} +1 -1
  61. package/dist/{chunk-OI6YQMSB.js → chunk-O7D7KV75.js} +3 -3
  62. package/dist/{chunk-4FFIIZB5.js → chunk-P6ZDIVFZ.js} +1 -1
  63. package/dist/{chunk-3MIZP4IB.js → chunk-QER7MSUH.js} +7 -7
  64. package/dist/{chunk-42OW42AR.js → chunk-QWEAORJG.js} +38 -8
  65. package/dist/{chunk-UQVUDSAV.js → chunk-T5DH6FEH.js} +1 -1
  66. package/dist/{chunk-56EXMS52.js → chunk-TY5YTNLU.js} +2 -2
  67. package/dist/{chunk-W6H7WDHW.js → chunk-U3T37P7H.js} +3 -3
  68. package/dist/{chunk-IHMODTQ7.js → chunk-UMTYAPCQ.js} +4 -4
  69. package/dist/{chunk-6DP2YPZY.js → chunk-WONUYAKB.js} +4 -4
  70. package/dist/{chunk-NL2WM6OB.js → chunk-WTZZOUOJ.js} +5 -5
  71. package/dist/{chunk-L5U7VT4A.js → chunk-XYQMPYWE.js} +1 -1
  72. package/dist/{chunk-DXXHZHPE.js → chunk-YX33HYHZ.js} +358 -357
  73. package/dist/{chunk-WTKGSKCS.js → chunk-ZPVJ5PVB.js} +2 -2
  74. package/dist/{chunk-YCRSIOIN.js → chunk-ZTCQVHQV.js} +2 -2
  75. package/dist/{citations-6723MJLH.js → citations-BYSB6NON.js} +3 -3
  76. package/dist/{cli-catalog-RVBNEPWA.js → cli-catalog-CFCLMVSK.js} +3 -3
  77. package/dist/{cli-commands-6ZOUHE3V.js → cli-commands-OPH4K73Q.js} +7 -7
  78. package/dist/cli.js +13 -13
  79. package/dist/{competitor-ENYN5RAD.js → competitor-DUYU7EL7.js} +3 -3
  80. package/dist/{content-TT3PF4CR.js → content-OGURKOCE.js} +3 -3
  81. package/dist/{dashboard-JLCJDU2V.js → dashboard-QX4IBLGW.js} +6 -6
  82. package/dist/{demo-KMVR3ZWW.js → demo-SZ5CPFPS.js} +1 -1
  83. package/dist/{demo-server-QXI7BGMM.js → demo-server-JIEIMLLU.js} +12 -12
  84. package/dist/{discover-HATQTTDG.js → discover-SHUCBUDJ.js} +3 -3
  85. package/dist/{discover-eval-64TWPB5Z.js → discover-eval-3ZTYLTGU.js} +3 -3
  86. package/dist/{doctor-6C5TXOG3.js → doctor-FRSV5GAR.js} +3 -3
  87. package/dist/{evidence-K43NRSOT.js → evidence-7UJHNILW.js} +3 -3
  88. package/dist/{export-cmd-KU64GUQ5.js → export-cmd-2DAWSD52.js} +3 -3
  89. package/dist/{ga-KXKLUQBQ.js → ga-K2EVI3KO.js} +3 -3
  90. package/dist/{gbp-5CZTROVP.js → gbp-NXFINC7N.js} +3 -3
  91. package/dist/{google-6TNU7SVF.js → google-J4T52EIG.js} +4 -4
  92. package/dist/{google-marketing-UCUIJBQG.js → google-marketing-PZGKZPEB.js} +1 -1
  93. package/dist/{health-cmd-ZFJ7ZOWI.js → health-cmd-5IHX5GRQ.js} +3 -3
  94. package/dist/{history-V664SORR.js → history-IVO5IVH2.js} +3 -3
  95. package/dist/index.d.ts +28 -28
  96. package/dist/index.js +25 -25
  97. package/dist/{init-TAIUP5GV.js → init-EMXK7MX6.js} +12 -12
  98. package/dist/{insights-JFW7HBPR.js → insights-SPA2BVMV.js} +3 -3
  99. package/dist/intelligence-service-CJNCXI4C.js +16 -0
  100. package/dist/{journeys-QTZXBKBT.js → journeys-7FAHZRGP.js} +3 -3
  101. package/dist/{keys-KGI5S2IE.js → keys-PPBHRYPZ.js} +3 -3
  102. package/dist/{keyword-XU6Y4XVH.js → keyword-C4ULYIWF.js} +3 -3
  103. package/dist/{logs-E2DQXWQQ.js → logs-X7NQN4UT.js} +3 -3
  104. package/dist/{mcp-PQE6WFED.js → mcp-ERMFW6WJ.js} +4 -4
  105. package/dist/mcp.js +9 -9
  106. package/dist/{measurement-plan-NBGLF7BI.js → measurement-plan-7IPWYNIC.js} +5 -5
  107. package/dist/{notify-SHEAQNUJ.js → notify-AC4ZHLUK.js} +3 -3
  108. package/dist/{organic-evidence-LMXCFABG.js → organic-evidence-GDDMNJHN.js} +3 -3
  109. package/dist/{overview-MXEBDUCA.js → overview-7VCUIYQE.js} +4 -4
  110. package/dist/{project-MWZGTK4S.js → project-N4RGX5CT.js} +3 -3
  111. package/dist/{query-EZQY45JT.js → query-Y7LGD6PG.js} +3 -3
  112. package/dist/{research-PSPDLEQL.js → research-WTZO3D7B.js} +3 -3
  113. package/dist/{results-export-7FLSFC7J.js → results-export-BYUFBWEK.js} +3 -3
  114. package/dist/{run-MASOXS63.js → run-SXMD6GW5.js} +4 -4
  115. package/dist/{schedule-V32G7TBR.js → schedule-UQFPQBHI.js} +3 -3
  116. package/dist/{search-R2S5CAVK.js → search-EJUJRZEE.js} +3 -3
  117. package/dist/{serve-PGPQOVGC.js → serve-3CD4TSE7.js} +26 -26
  118. package/dist/{session-MNEWM2CT.js → session-N77UGPQB.js} +13 -13
  119. package/dist/{settings-KBY4766O.js → settings-ZBP3KDJK.js} +3 -3
  120. package/dist/{sitemaps-FLMA6DMY.js → sitemaps-KVROUSLB.js} +3 -3
  121. package/dist/{skills-WAHOLVYH.js → skills-AGAHFQD5.js} +2 -2
  122. package/dist/{snapshot-VJYM7UX2.js → snapshot-WDK6ZSJA.js} +3 -3
  123. package/dist/{src-XVBKS6UX.js → src-XGUBO65J.js} +2 -2
  124. package/dist/{status-YFAUBVEA.js → status-IFUJIB73.js} +4 -4
  125. package/dist/{technical-aeo-656NEU3A.js → technical-aeo-6KR3YH4X.js} +3 -3
  126. package/dist/{telemetry-CJ7ENZDY.js → telemetry-EZNMZMH6.js} +4 -4
  127. package/dist/{tools-4STRCC7Q.js → tools-BNRDF6UZ.js} +11 -11
  128. package/dist/{traffic-NN6ECPRS.js → traffic-7OSHD23C.js} +5 -5
  129. package/dist/{trends-HXZVTQ3I.js → trends-I3NWFNHX.js} +3 -3
  130. package/dist/{users-PELDCAXQ.js → users-VBLZGMML.js} +3 -3
  131. package/dist/{visibility-stats-W3AELURT.js → visibility-stats-6YAV2MTM.js} +18 -3
  132. package/dist/{wordpress-TAVEI2XQ.js → wordpress-EM3S3NDA.js} +3 -3
  133. package/package.json +1 -1
  134. package/assets/assets/ToneBadge-ht0n6RUH.js +0 -60
  135. package/dist/intelligence-service-RRKHXZ2N.js +0 -16
@@ -3,7 +3,7 @@ import {
3
3
  resolveCliAccess,
4
4
  resolveCliAccessForInvocation,
5
5
  windowOptions
6
- } from "./chunk-4FFIIZB5.js";
6
+ } from "./chunk-P6ZDIVFZ.js";
7
7
  import {
8
8
  emitJsonl
9
9
  } from "./chunk-Z7IUAJOF.js";
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-HGMYEDAQ.js";
15
15
  import {
16
16
  OperationAccesses
17
- } from "./chunk-PQNT2JUO.js";
17
+ } from "./chunk-FYYOX7UY.js";
18
18
 
19
19
  // src/cli-catalog.ts
20
20
  import { createRequire } from "module";
@@ -111,7 +111,7 @@ async function dispatchRegisteredCommand(args, fallbackFormat, specs) {
111
111
  const accessValue = accessFilterFromArgs(argsWithoutHelp);
112
112
  validateAccessFilter(accessValue);
113
113
  if (fallbackFormat !== "text") {
114
- const { printCliCatalog: printCliCatalog2 } = await import("./cli-catalog-RVBNEPWA.js");
114
+ const { printCliCatalog: printCliCatalog2 } = await import("./cli-catalog-CFCLMVSK.js");
115
115
  const group2 = argsWithoutHelp.find((arg) => !arg.startsWith("--"));
116
116
  printCliCatalog2(specs, fallbackFormat, group2, accessValue);
117
117
  return true;
@@ -5,7 +5,7 @@ import {
5
5
  AppError,
6
6
  parseWindowIn,
7
7
  resolveDateRange
8
- } from "./chunk-PQNT2JUO.js";
8
+ } from "./chunk-FYYOX7UY.js";
9
9
 
10
10
  // src/cli-access.ts
11
11
  var CLI_ACCESS_BY_ID = Object.freeze({
@@ -8,23 +8,23 @@ import {
8
8
  reparseStoredResult4,
9
9
  reparseStoredResult5,
10
10
  resolveStoredApiResponse
11
- } from "./chunk-PAXP5KZC.js";
11
+ } from "./chunk-BZGAMJG2.js";
12
12
  import {
13
13
  loadConfig
14
- } from "./chunk-YVY23HNW.js";
14
+ } from "./chunk-4QYGB5IC.js";
15
15
  import {
16
16
  isMachineFormat
17
17
  } from "./chunk-HGMYEDAQ.js";
18
18
  import {
19
19
  determineCitationState
20
- } from "./chunk-P4MNYMJJ.js";
20
+ } from "./chunk-AUC47DFW.js";
21
21
  import {
22
22
  backfillProjectAnswerMentions,
23
23
  competitorIdentityColumns,
24
24
  createRunCompetitorResolver,
25
25
  readMarketCompetitorNames,
26
26
  refreshSnapshotMentionIdentity
27
- } from "./chunk-42OW42AR.js";
27
+ } from "./chunk-QWEAORJG.js";
28
28
  import {
29
29
  RawEventSampleEventTypes,
30
30
  auditLog,
@@ -38,7 +38,7 @@ import {
38
38
  querySnapshots,
39
39
  rawEventSamples,
40
40
  runs
41
- } from "./chunk-C3BSCGUH.js";
41
+ } from "./chunk-H3PWMM4K.js";
42
42
  import {
43
43
  ProviderNames,
44
44
  RetrievalContracts,
@@ -51,7 +51,7 @@ import {
51
51
  extractRecommendedCompetitors,
52
52
  normalizeUrlPath,
53
53
  openRouterRouteModel
54
- } from "./chunk-PQNT2JUO.js";
54
+ } from "./chunk-FYYOX7UY.js";
55
55
 
56
56
  // src/commands/backfill.ts
57
57
  import { setImmediate as yieldToEventLoop } from "timers/promises";
@@ -429,7 +429,7 @@ No DB writes performed. Re-run without --dry-run to apply.`);
429
429
  }
430
430
  }
431
431
  async function backfillInsightsCommand(project, opts) {
432
- const { IntelligenceService } = await import("./intelligence-service-RRKHXZ2N.js");
432
+ const { IntelligenceService } = await import("./intelligence-service-CJNCXI4C.js");
433
433
  const config = loadConfig();
434
434
  const db = createClient(config.database);
435
435
  migrate(db);
@@ -15,14 +15,14 @@ import {
15
15
  normalizeCloudflareWorkerEvent,
16
16
  sessionizeJourneyRequests,
17
17
  verifyRequestSignature
18
- } from "./chunk-NAPFULBT.js";
18
+ } from "./chunk-7534NXSP.js";
19
19
  import {
20
20
  currentOutcomeAttribution,
21
21
  getRequestContext,
22
22
  registerRequestContext,
23
23
  requestAuditIdentity,
24
24
  sanitizeRequestContext
25
- } from "./chunk-3HNHOS6O.js";
25
+ } from "./chunk-K7ZG6K7J.js";
26
26
  import {
27
27
  RawEventSampleEventTypes,
28
28
  SentimentIdempotencyConflict,
@@ -180,7 +180,7 @@ import {
180
180
  userSessions,
181
181
  users,
182
182
  writeNegativeReviewMaxStars
183
- } from "./chunk-C3BSCGUH.js";
183
+ } from "./chunk-H3PWMM4K.js";
184
184
  import {
185
185
  ADS_ACTIVATE_SCOPE,
186
186
  ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
@@ -1275,7 +1275,7 @@ import {
1275
1275
  wordpressSchemaDeployResultDtoSchema,
1276
1276
  wordpressSchemaStatusResultDtoSchema,
1277
1277
  wordpressStatusDtoSchema
1278
- } from "./chunk-PQNT2JUO.js";
1278
+ } from "./chunk-FYYOX7UY.js";
1279
1279
 
1280
1280
  // ../api-routes/src/user-session.ts
1281
1281
  import crypto2 from "crypto";
@@ -33381,6 +33381,11 @@ function computeVisibilityStats(input) {
33381
33381
  const byQuery = /* @__PURE__ */ new Map();
33382
33382
  const totals = emptyAgg();
33383
33383
  const totalsByProvider = /* @__PURE__ */ new Map();
33384
+ const byClass = { branded: emptyAgg(), nonBrand: emptyAgg(), unclassified: emptyAgg() };
33385
+ const classKey = (queryId) => {
33386
+ const queryClass = input.queryClasses?.get(queryId) ?? null;
33387
+ return queryClass === "branded" ? "branded" : queryClass === "non-brand" ? "nonBrand" : "unclassified";
33388
+ };
33384
33389
  for (const snap of input.snapshots) {
33385
33390
  const resolved = resolveCurrentQuery(attribution, snap);
33386
33391
  if (!resolved) continue;
@@ -33391,6 +33396,7 @@ function computeVisibilityStats(input) {
33391
33396
  }
33392
33397
  addSnapshot(bucket.agg, snap);
33393
33398
  addSnapshot(totals, snap);
33399
+ if (input.queryClasses) addSnapshot(byClass[classKey(resolved.id)], snap);
33394
33400
  if (wantProviders) {
33395
33401
  const qpAgg = bucket.byProvider.get(snap.provider) ?? emptyAgg();
33396
33402
  addSnapshot(qpAgg, snap);
@@ -33406,12 +33412,14 @@ function computeVisibilityStats(input) {
33406
33412
  ...counts(bucket.agg),
33407
33413
  firstObserved: bucket.agg.first ?? "",
33408
33414
  lastObserved: bucket.agg.last ?? "",
33415
+ ...input.queryClasses ? { queryClass: input.queryClasses.get(bucket.id) ?? null } : {},
33409
33416
  ...wantProviders ? { providers: providerEntries(bucket.byProvider) } : {}
33410
33417
  })).sort((a, b) => a.query.localeCompare(b.query));
33411
33418
  return {
33412
33419
  totals: counts(totals),
33413
33420
  ...wantProviders ? { byProvider: providerEntries(totalsByProvider) } : {},
33414
- queries: queryEntries
33421
+ queries: queryEntries,
33422
+ ...input.queryClasses ? { byQueryClass: { branded: counts(byClass.branded), nonBrand: counts(byClass.nonBrand), unclassified: counts(byClass.unclassified) } } : {}
33415
33423
  };
33416
33424
  }
33417
33425
  async function visibilityStatsRoutes(app) {
@@ -33493,7 +33501,8 @@ async function visibilityStatsRoutes(app) {
33493
33501
  answerMentioned: querySnapshots.answerMentioned,
33494
33502
  createdAt: querySnapshots.createdAt
33495
33503
  }).from(querySnapshots).where(inArray34(querySnapshots.runId, runIds)).all() : [];
33496
- const stats = computeVisibilityStats({ queries: projectQueries, snapshots, groupBy });
33504
+ const queryClasses = readQueryClasses(app.db, project, projectQueries);
33505
+ const stats = computeVisibilityStats({ queries: projectQueries, snapshots, groupBy, queryClasses });
33497
33506
  const queryAttribution = buildQueryAttribution(projectQueries);
33498
33507
  let shareOfVoice;
33499
33508
  if (wantShareOfVoice) {
@@ -33526,6 +33535,7 @@ async function visibilityStatsRoutes(app) {
33526
33535
  runCount
33527
33536
  },
33528
33537
  totals: stats.totals,
33538
+ ...stats.byQueryClass ? { byQueryClass: stats.byQueryClass } : {},
33529
33539
  queries: stats.queries,
33530
33540
  // `groupBy` + `byProvider` appear together only when a breakdown was
33531
33541
  // requested; both are OMITTED otherwise (absent = no breakdown) so the
@@ -39053,7 +39063,7 @@ var routeCatalog = [
39053
39063
  method: "get",
39054
39064
  path: "/api/v1/projects/{name}/visibility-stats",
39055
39065
  summary: "Get aggregated mention/citation stats per query",
39056
- description: "Per-query mention (answer-text) and citation (source-list) counts with a sample size, pooled across many answer-visibility runs (probe-excluded). Tri-state aware: `checked` counts only snapshots where answerMentioned was recorded (null = not checked is excluded). Lets a consumer compute confidence-aware (e.g. Wilson) proportions without N+1 run fetches. With no since/until/lastRuns, EVERY completed/partial answer-visibility run is pooled \u2014 `window.runCount` reports how many; bound the window with lastRuns, since/until, or month=YYYY-MM for a recent sample. Set groupBy=provider for a per-provider breakdown whose counts sum to the pooled counts, or shareOfVoice=1 to add share of voice vs tracked competitors (non-brand queries by default; set queryClass=branded for brand recall).",
39066
+ description: "Per-query mention (answer-text) and citation (source-list) counts with a sample size, pooled across many answer-visibility runs (probe-excluded). Tri-state aware: `checked` counts only snapshots where answerMentioned was recorded (null = not checked is excluded). Lets a consumer compute confidence-aware (e.g. Wilson) proportions without N+1 run fetches. With no since/until/lastRuns, EVERY completed/partial answer-visibility run is pooled \u2014 `window.runCount` reports how many; bound the window with lastRuns, since/until, or month=YYYY-MM for a recent sample. Set groupBy=provider for a per-provider breakdown whose counts sum to the pooled counts, or shareOfVoice=1 to add share of voice vs tracked competitors (non-brand queries by default; set queryClass=branded for brand recall). `totals` pools branded and non-brand queries; `byQueryClass` splits the same counts by each query's class (as the query list reports it), and each query carries `queryClass`. The `queryClass` parameter scopes share of voice only.",
39057
39067
  tags: ["analytics"],
39058
39068
  parameters: [
39059
39069
  nameParameter,
@@ -59124,6 +59134,13 @@ function sitemapKey(url) {
59124
59134
  return url;
59125
59135
  }
59126
59136
  }
59137
+ function sitemapHost(url) {
59138
+ try {
59139
+ return new URL(url).host.toLowerCase();
59140
+ } catch {
59141
+ return url;
59142
+ }
59143
+ }
59127
59144
  function googleSitemapState(row) {
59128
59145
  if (row.isPending) return { state: "pending", statusLabel: "Processing" };
59129
59146
  if ((row.errors ?? 0) > 0) return { state: "errors", statusLabel: "Errors" };
@@ -59149,7 +59166,20 @@ function missingFor(list, other, site, parents, accepts) {
59149
59166
  candidates.set(key, entry);
59150
59167
  };
59151
59168
  for (const url of site) add(url, "site");
59152
- for (const row of other?.list.sitemaps ?? []) if (row.parentUrl === null && row.submittedAt !== null) add(row.url, other.name);
59169
+ const declaredByHost = /* @__PURE__ */ new Map();
59170
+ for (const url of site) {
59171
+ const host = sitemapHost(url);
59172
+ declaredByHost.set(host, [...declaredByHost.get(host) ?? [], sitemapKey(url)]);
59173
+ }
59174
+ const coversSite = (url) => {
59175
+ const declared = declaredByHost.get(sitemapHost(url)) ?? [];
59176
+ return declared.length > 0 && declared.every((key) => have.has(key));
59177
+ };
59178
+ for (const row of other?.list.sitemaps ?? []) {
59179
+ if (row.parentUrl !== null || row.submittedAt === null || row.state === "errors") continue;
59180
+ if (row.isIndex && coversSite(row.url)) continue;
59181
+ add(row.url, other.name);
59182
+ }
59153
59183
  return [...candidates.entries()].filter(([key]) => {
59154
59184
  const parent2 = parents.get(key);
59155
59185
  return parent2 === void 0 || !candidates.has(parent2);
@@ -15,7 +15,7 @@ import {
15
15
  formatCanonryPluginUpdateHint,
16
16
  formatCanonryPluginVersionMismatch,
17
17
  skillsClientSchema
18
- } from "./chunk-PQNT2JUO.js";
18
+ } from "./chunk-FYYOX7UY.js";
19
19
 
20
20
  // src/commands/skills.ts
21
21
  import crypto from "crypto";
@@ -5,7 +5,7 @@ import {
5
5
  loadConfig,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-YVY23HNW.js";
8
+ } from "./chunk-4QYGB5IC.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-PQNT2JUO.js";
21
+ } from "./chunk-FYYOX7UY.js";
22
22
 
23
23
  // src/runtime-context.ts
24
24
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-WTKGSKCS.js";
3
+ } from "./chunk-ZPVJ5PVB.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-L5U7VT4A.js";
10
+ } from "./chunk-XYQMPYWE.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-PQNT2JUO.js";
40
+ } from "./chunk-FYYOX7UY.js";
41
41
 
42
42
  // src/commands/measurement-plan.ts
43
43
  import crypto from "crypto";
@@ -2,11 +2,11 @@ import {
2
2
  dedupeGscSitemapUrls,
3
3
  resolveDiscoveredGscSitemapUrls,
4
4
  submitGscSitemapBatches
5
- } from "./chunk-IQ5RKJKQ.js";
5
+ } from "./chunk-76KBMLPR.js";
6
6
  import {
7
7
  measurementDraftOperationSchema,
8
8
  runMeasurementDraftAction
9
- } from "./chunk-L5U7VT4A.js";
9
+ } from "./chunk-XYQMPYWE.js";
10
10
  import {
11
11
  CliError
12
12
  } from "./chunk-HGMYEDAQ.js";
@@ -187,7 +187,7 @@ import {
187
187
  trendSurfaceSchema,
188
188
  visibilityCompareSelectionSchema,
189
189
  visibilityReportRequestSchema
190
- } from "./chunk-PQNT2JUO.js";
190
+ } from "./chunk-FYYOX7UY.js";
191
191
 
192
192
  // src/mcp/tool-registry.ts
193
193
  import { z as z2 } from "zod";
@@ -2087,7 +2087,7 @@ var rawCanonryMcpTools = [
2087
2087
  month: z2.string().optional().describe("Aggregate one calendar month (YYYY-MM), expanded to that month's inclusive UTC bounds. Mutually exclusive with since/until/lastRuns."),
2088
2088
  groupBy: z2.enum(["provider"]).optional().describe('Set to "provider" for a per-provider breakdown.'),
2089
2089
  shareOfVoice: z2.boolean().optional().describe("Include brand-mention share with tracked/observed basis and availability across the same window (non-brand queries unless queryClass says otherwise)."),
2090
- queryClass: z2.enum(["branded", "non-brand"]).optional().describe('Query class for shareOfVoice. Defaults to non-brand. There is no "all": branded and non-brand never share a denominator.')
2090
+ queryClass: z2.enum(["branded", "non-brand"]).optional().describe('Query class for shareOfVoice. Defaults to non-brand. There is no "all": branded and non-brand never share a denominator. It does not filter the counts: `totals` pools both classes, and `byQueryClass` (plus `queryClass` on each query) carries the split.')
2091
2091
  }),
2092
2092
  annotations: readAnnotations(),
2093
2093
  openApiOperations: ["GET /api/v1/projects/{name}/visibility-stats"],
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-56EXMS52.js";
5
+ } from "./chunk-TY5YTNLU.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-YVY23HNW.js";
8
+ } from "./chunk-4QYGB5IC.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-3HNHOS6O.js";
11
+ } from "./chunk-K7ZG6K7J.js";
12
12
  import {
13
13
  AGENT_NONE,
14
14
  OutcomeSurfaces,
@@ -19,7 +19,7 @@ import {
19
19
  integrationConnectionPropertiesSchema,
20
20
  normalizeAgentSlug,
21
21
  usageSurfaceSchema
22
- } from "./chunk-PQNT2JUO.js";
22
+ } from "./chunk-FYYOX7UY.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  pickProjectCitedDomain
3
- } from "./chunk-P4MNYMJJ.js";
3
+ } from "./chunk-AUC47DFW.js";
4
4
  import {
5
5
  createLogger
6
- } from "./chunk-SYOQULRL.js";
6
+ } from "./chunk-BTYOU24P.js";
7
7
  import {
8
8
  GBP_INSIGHT_PROVIDER,
9
9
  PERSISTENT_GAP_THRESHOLD,
@@ -17,7 +17,7 @@ import {
17
17
  mergeGscQueryTotalsWithFallback,
18
18
  readGscQueryDailyRows,
19
19
  readLatestGscDataDate
20
- } from "./chunk-42OW42AR.js";
20
+ } from "./chunk-QWEAORJG.js";
21
21
  import {
22
22
  competitors,
23
23
  gbpDailyMetrics,
@@ -35,14 +35,14 @@ import {
35
35
  queries,
36
36
  querySnapshots,
37
37
  runs
38
- } from "./chunk-C3BSCGUH.js";
38
+ } from "./chunk-H3PWMM4K.js";
39
39
  import {
40
40
  CitationStates,
41
41
  RunKinds,
42
42
  RunStatuses,
43
43
  RunTriggers,
44
44
  effectiveDomains
45
- } from "./chunk-PQNT2JUO.js";
45
+ } from "./chunk-FYYOX7UY.js";
46
46
 
47
47
  // src/intelligence-service.ts
48
48
  import { eq, desc, asc, and, ne, or, inArray, gte, lte, isNull, sql, exists } from "drizzle-orm";
@@ -23,7 +23,7 @@ import {
23
23
  measurementDraftUpsertGroupRequestSchema,
24
24
  measurementDraftUpsertMarketRequestSchema,
25
25
  measurementDraftUpsertTargetRequestSchema
26
- } from "./chunk-PQNT2JUO.js";
26
+ } from "./chunk-FYYOX7UY.js";
27
27
 
28
28
  // src/measurement-draft-actions.ts
29
29
  import { z } from "zod";