@canonry/canonry 7.87.1 → 7.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/assets/agent-workspace/skills/aero/references/ai-traffic-tracking.md +6 -1
  2. package/assets/agent-workspace/skills/canonry/references/ai-traffic-tracking.md +6 -1
  3. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +34 -5
  4. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +17 -5
  5. package/assets/assets/{AgentSetupPage-_ZP3F_zA.js → AgentSetupPage-DV06oPTd.js} +1 -1
  6. package/assets/assets/{AuditHistoryPanel-9B0XpYsN.js → AuditHistoryPanel-C1JnxBFK.js} +1 -1
  7. package/assets/assets/{BacklinksPage-CsvVgXTZ.js → BacklinksPage-Dw0wgYlg.js} +1 -1
  8. package/assets/assets/{HistoryPage-BCxpCul0.js → HistoryPage-DsDx15am.js} +1 -1
  9. package/assets/assets/{MeasurementPropertyPage-BObvWjVx.js → MeasurementPropertyPage-Bkxt3QcY.js} +1 -1
  10. package/assets/assets/{ProjectPage-y378tOaT.js → ProjectPage-CzrD1lpf.js} +1 -1
  11. package/assets/assets/{RunsPage-CfQ_kqlu.js → RunsPage-BggqKbOG.js} +1 -1
  12. package/assets/assets/{SettingsPage-PIgRvqJc.js → SettingsPage-B7ns_ECx.js} +1 -1
  13. package/assets/assets/{SiteHealthSection-DuUE1cB0.js → SiteHealthSection-B2YibqCs.js} +2 -2
  14. package/assets/assets/{ToneBadge-BgTLSTKp.js → ToneBadge-B8hKcr8p.js} +1 -1
  15. package/assets/assets/{TrafficPage-B_YunwjH.js → TrafficPage-DRTbgzKI.js} +1 -1
  16. package/assets/assets/{TrafficSourceDetailPage-C51W87fU.js → TrafficSourceDetailPage-sgLE2gdJ.js} +1 -1
  17. package/assets/assets/{account-context-CVjb3ZSn.js → account-context-pzV-boTi.js} +1 -1
  18. package/assets/assets/{agent-trust-copy-BlpC8jo5.js → agent-trust-copy-DBtiOpFu.js} +1 -1
  19. package/assets/assets/{card-BnVez9nG.js → card-Mu_5i5fM.js} +1 -1
  20. package/assets/assets/{extract-error-message-Dqirbrl0.js → extract-error-message-D_ptq0tW.js} +1 -1
  21. package/assets/assets/{format-helpers-DVXZD864.js → format-helpers-C8QYorwm.js} +1 -1
  22. package/assets/assets/{index-CsvEqhK4.js → index-fN5qDR8H.js} +6 -6
  23. package/assets/assets/{query-client-CVc7wMKJ.js → query-client-CdG4DC3B.js} +1 -1
  24. package/assets/assets/{react-query-CSlTSOjz.js → react-query-CxeygwoL.js} +1 -1
  25. package/assets/assets/{react-sigma_core.esm.min-CVfGIEIE.js → react-sigma_core.esm.min-BfnfPCis.js} +1 -1
  26. package/assets/assets/{service-BGqeyqhZ.js → service-B85wjZQP.js} +1 -1
  27. package/assets/index.html +7 -7
  28. package/dist/{ads-ZUZWSIBV.js → ads-4TAIMWZC.js} +3 -3
  29. package/dist/{agent-YDS3WY7B.js → agent-C7NKP2TO.js} +7 -7
  30. package/dist/{agent-ask-7VUPXTXL.js → agent-ask-EPH5FDM6.js} +3 -3
  31. package/dist/{agent-conversations-WPEBK3BS.js → agent-conversations-LPBBVRKK.js} +3 -3
  32. package/dist/{agent-journeys-H5CCYLNB.js → agent-journeys-MBORINJA.js} +3 -3
  33. package/dist/{agent-memory-CNPKPIWD.js → agent-memory-NJIZO75R.js} +3 -3
  34. package/dist/{agent-providers-U7FLJO5I.js → agent-providers-ZQVUOCX6.js} +3 -3
  35. package/dist/{agent-transcript-VY3BQNPU.js → agent-transcript-67HFY5GT.js} +3 -3
  36. package/dist/{analytics-PYUNO7C2.js → analytics-TUO6BVB6.js} +3 -3
  37. package/dist/{apply-YNBEYC2G.js → apply-V7A5O7YS.js} +3 -3
  38. package/dist/{backfill-PNHBAV5N.js → backfill-PGKYR6NA.js} +10 -10
  39. package/dist/{backlinks-LVHZ2MQ7.js → backlinks-5GGPQNR4.js} +3 -3
  40. package/dist/bing-PQOLIW2X.js +759 -0
  41. package/dist/{bootstrap-AZYQXBHN.js → bootstrap-IH3XX6PI.js} +10 -10
  42. package/dist/{cdp-HCYY4SXR.js → cdp-B3PFQ5RB.js} +7 -7
  43. package/dist/{chunk-RSPOFH66.js → chunk-2KL2XHS6.js} +4 -4
  44. package/dist/{chunk-DOPUEXMC.js → chunk-4A4X7VXE.js} +2 -2
  45. package/dist/{chunk-2AXFKYJU.js → chunk-4T2VZPDG.js} +2 -2
  46. package/dist/{chunk-W7DHXSXN.js → chunk-4VMHN5LL.js} +4004 -2994
  47. package/dist/{chunk-2FJB3CSS.js → chunk-5KDJJO2N.js} +1 -1
  48. package/dist/{chunk-BJHHD7VE.js → chunk-5WWEZ26Y.js} +2 -2
  49. package/dist/{chunk-2I22IUA3.js → chunk-6DIDDYG6.js} +5 -5
  50. package/dist/{chunk-IBGZ6D6R.js → chunk-BDLC3DFM.js} +2 -2
  51. package/dist/{chunk-IK7QEKKD.js → chunk-CYQCO5NY.js} +1 -1
  52. package/dist/{chunk-FAMCDCVK.js → chunk-D354CQ6T.js} +1 -1
  53. package/dist/{chunk-3KK6FWDF.js → chunk-DILCH7RL.js} +1 -1
  54. package/dist/{chunk-BKZ6PQAE.js → chunk-DVWAA3ES.js} +1088 -646
  55. package/dist/{chunk-ECZGTJIQ.js → chunk-E4DUE2PW.js} +6 -6
  56. package/dist/{chunk-TEQF4ZJA.js → chunk-EGUJNHAZ.js} +162 -2
  57. package/dist/{chunk-JDTKG7KJ.js → chunk-EL4HRIID.js} +3 -3
  58. package/dist/{chunk-UXSWQAVZ.js → chunk-EYSQMZ6L.js} +530 -342
  59. package/dist/{chunk-MNLAIB67.js → chunk-FL76YWYN.js} +1 -1
  60. package/dist/{chunk-INH773FB.js → chunk-FLJVGHTQ.js} +3 -3
  61. package/dist/{chunk-4LNZTL7M.js → chunk-FNQFM3TK.js} +3 -3
  62. package/dist/{chunk-GBWCEOZR.js → chunk-IPOYH4WE.js} +1 -1
  63. package/dist/{chunk-VDYXB6SV.js → chunk-IR3MYKIA.js} +84 -13
  64. package/dist/{chunk-CR54BCUP.js → chunk-LBZYPZAA.js} +7 -7
  65. package/dist/{chunk-4FWDITQG.js → chunk-MCQK432C.js} +1 -1
  66. package/dist/{chunk-CBWGUGME.js → chunk-MEN27RAJ.js} +18 -2
  67. package/dist/{chunk-RHOIR5QY.js → chunk-N6AWKBLY.js} +5 -5
  68. package/dist/{chunk-TN53B5AB.js → chunk-O7OZVZWR.js} +210 -3
  69. package/dist/{chunk-6F5ULQDY.js → chunk-OKLDBQYW.js} +4 -4
  70. package/dist/{chunk-G44S34CE.js → chunk-PBOIN52J.js} +2 -2
  71. package/dist/{chunk-GXTCDNX7.js → chunk-PZLEKWYA.js} +1 -1
  72. package/dist/{chunk-F643WELJ.js → chunk-Q2SJRZA3.js} +297 -5
  73. package/dist/{chunk-ICS2WJ7H.js → chunk-R7K24KY7.js} +3 -3
  74. package/dist/{chunk-J7ITGXCS.js → chunk-TAQHHXBC.js} +4 -4
  75. package/dist/{chunk-JAYUWQAV.js → chunk-TL52ELES.js} +1 -1
  76. package/dist/{chunk-GDU6IMGB.js → chunk-UVXQQZB5.js} +2 -2
  77. package/dist/{chunk-O26FQ7RI.js → chunk-ZQGWB7VJ.js} +260 -1
  78. package/dist/{citations-3EZTHA65.js → citations-J3IGPX4L.js} +3 -3
  79. package/dist/{cli-catalog-CBTM3JKP.js → cli-catalog-2PCRGKPH.js} +3 -3
  80. package/dist/{cli-commands-62QECRBV.js → cli-commands-4MUJZCZO.js} +7 -7
  81. package/dist/cli.js +13 -13
  82. package/dist/{competitor-VH4TXJLT.js → competitor-X7Q2AZGL.js} +3 -3
  83. package/dist/{content-TSMNHXJZ.js → content-HTR3PJPX.js} +3 -3
  84. package/dist/{dashboard-4HOXCUQE.js → dashboard-LSO57ZEE.js} +6 -6
  85. package/dist/{demo-IY7Y7KR3.js → demo-P25N4SKK.js} +1 -1
  86. package/dist/{demo-server-BLLSDILQ.js → demo-server-6Z5XSHFS.js} +12 -12
  87. package/dist/{discover-XTJXTKCI.js → discover-KE6TQPOC.js} +3 -3
  88. package/dist/{discover-eval-IVQI5YEW.js → discover-eval-XKOYGCRW.js} +3 -3
  89. package/dist/{doctor-SJ4SHSQO.js → doctor-RL2J54I3.js} +3 -3
  90. package/dist/{evidence-C6T556YH.js → evidence-CYJ4AKUZ.js} +3 -3
  91. package/dist/{export-cmd-JQZ5ZRSI.js → export-cmd-2YM3PXCW.js} +3 -3
  92. package/dist/{ga-W2WHVRHN.js → ga-XAB66MJO.js} +3 -3
  93. package/dist/{gbp-3AZIV5WF.js → gbp-CDGBLRVV.js} +3 -3
  94. package/dist/{google-3CKWPZT7.js → google-XHCUKQ3J.js} +4 -4
  95. package/dist/{google-marketing-PJBGQYYW.js → google-marketing-ZR6NTWEY.js} +1 -1
  96. package/dist/{health-cmd-4JTQMCXM.js → health-cmd-VS3EIFJD.js} +3 -3
  97. package/dist/{history-TXUJFEO2.js → history-YIGYYNZJ.js} +3 -3
  98. package/dist/index.d.ts +2000 -373
  99. package/dist/index.js +25 -25
  100. package/dist/{init-JY76QAOC.js → init-ST3BXHQF.js} +12 -12
  101. package/dist/{insights-XZQO4B45.js → insights-KZS6TYYL.js} +3 -3
  102. package/dist/intelligence-service-LCTP5BC7.js +16 -0
  103. package/dist/{journeys-VFIV5JYV.js → journeys-USOPWGW5.js} +3 -3
  104. package/dist/{keys-PV23G4LW.js → keys-XY7LSM3S.js} +3 -3
  105. package/dist/{keyword-D76KBIV5.js → keyword-PKBFHHF5.js} +3 -3
  106. package/dist/{logs-DYDZ6IEJ.js → logs-PROW5TQJ.js} +3 -3
  107. package/dist/{mcp-GAR5LDQD.js → mcp-OQGC62QU.js} +4 -4
  108. package/dist/mcp.js +9 -9
  109. package/dist/{measurement-plan-K24EOGMI.js → measurement-plan-AI4NNBTO.js} +5 -5
  110. package/dist/{notify-XQHMPDQQ.js → notify-6HRPNJZ5.js} +3 -3
  111. package/dist/{organic-evidence-UHHE7AO4.js → organic-evidence-IXCSUGGY.js} +3 -3
  112. package/dist/{overview-AUZ3XRS5.js → overview-2WS3CFHK.js} +4 -4
  113. package/dist/{project-FUCPU2BD.js → project-ENUZG62V.js} +3 -3
  114. package/dist/{query-HRMSXDKL.js → query-WE3ZWTIB.js} +3 -3
  115. package/dist/{research-R23XLZJ3.js → research-DZSD5UZ2.js} +3 -3
  116. package/dist/{results-export-N6IV3KG4.js → results-export-JMUMYNUE.js} +3 -3
  117. package/dist/{run-CJLG5EXH.js → run-QXOO7CRK.js} +4 -4
  118. package/dist/{schedule-IPDCQ2I5.js → schedule-3RJKGUDN.js} +3 -3
  119. package/dist/{search-ZU4AKJ76.js → search-SGS4H7I4.js} +3 -3
  120. package/dist/{serve-ZQXMTDE7.js → serve-T24QKEUY.js} +26 -26
  121. package/dist/{session-MGOUDLXN.js → session-HPH2A4AZ.js} +13 -13
  122. package/dist/{settings-4FS5NRKP.js → settings-K44RK2TW.js} +3 -3
  123. package/dist/{skills-GSFHACGN.js → skills-HGPPGBXG.js} +2 -2
  124. package/dist/{snapshot-4NUVPDK3.js → snapshot-FEHHQRY3.js} +3 -3
  125. package/dist/{src-SJYGA7NH.js → src-4PAYI7GE.js} +18 -2
  126. package/dist/{status-ASBLMFP2.js → status-L5HVFWTS.js} +4 -4
  127. package/dist/{technical-aeo-QXHRBGYY.js → technical-aeo-Z43UCW6E.js} +3 -3
  128. package/dist/{telemetry-J2I577I3.js → telemetry-D47SSSG7.js} +4 -4
  129. package/dist/{tools-ZWFLE5UR.js → tools-WCWUY2ZJ.js} +11 -11
  130. package/dist/{traffic-B7Q4WPOV.js → traffic-5KH62P43.js} +5 -5
  131. package/dist/{trends-YOLCJBNM.js → trends-RMAXZKRO.js} +3 -3
  132. package/dist/{users-LPSCZV3M.js → users-WT54XNEI.js} +3 -3
  133. package/dist/{visibility-stats-JJQTZSSK.js → visibility-stats-HU62U5MA.js} +3 -3
  134. package/dist/{wordpress-4IKDT5KT.js → wordpress-BDAKQ4MU.js} +3 -3
  135. package/package.json +1 -1
  136. package/dist/bing-A2MUG6AV.js +0 -418
  137. package/dist/intelligence-service-GJYBEHJE.js +0 -16
@@ -23,7 +23,7 @@ import {
23
23
  measurementDraftUpsertGroupRequestSchema,
24
24
  measurementDraftUpsertMarketRequestSchema,
25
25
  measurementDraftUpsertTargetRequestSchema
26
- } from "./chunk-F643WELJ.js";
26
+ } from "./chunk-Q2SJRZA3.js";
27
27
 
28
28
  // src/measurement-draft-actions.ts
29
29
  import { z } from "zod";
@@ -2,18 +2,18 @@ import {
2
2
  configExists,
3
3
  loadConfigRaw,
4
4
  saveConfigPatch
5
- } from "./chunk-2FJB3CSS.js";
5
+ } from "./chunk-5KDJJO2N.js";
6
6
  import {
7
7
  BUNDLED_SKILL_NAMES,
8
8
  installSkills
9
- } from "./chunk-FAMCDCVK.js";
9
+ } from "./chunk-D354CQ6T.js";
10
10
  import {
11
11
  PACKAGE_VERSION
12
12
  } from "./chunk-AOJU5LKX.js";
13
13
  import {
14
14
  SKILL_MANIFEST_FILENAME,
15
15
  SkillsClients
16
- } from "./chunk-F643WELJ.js";
16
+ } from "./chunk-Q2SJRZA3.js";
17
17
 
18
18
  // src/skills-autosync.ts
19
19
  import fs from "fs";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-TEQF4ZJA.js";
3
+ } from "./chunk-EGUJNHAZ.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-MNLAIB67.js";
10
+ } from "./chunk-FL76YWYN.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-F643WELJ.js";
40
+ } from "./chunk-Q2SJRZA3.js";
41
41
 
42
42
  // src/commands/measurement-plan.ts
43
43
  import crypto from "crypto";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  USAGE_TELEMETRY_HEADERS,
3
3
  redactLogString
4
- } from "./chunk-F643WELJ.js";
4
+ } from "./chunk-Q2SJRZA3.js";
5
5
 
6
6
  // ../api-routes/src/request-context.ts
7
7
  import { AsyncLocalStorage } from "async_hooks";
@@ -3,6 +3,8 @@ import {
3
3
  AgentTrustLevels,
4
4
  AgentTrustReasons,
5
5
  AiReferralTrafficClasses,
6
+ JOURNEY_LOOKBACK_DAYS,
7
+ JOURNEY_VISIT_IDLE_MINUTES,
6
8
  TrafficEventConfidences,
7
9
  TrafficEvidenceKinds,
8
10
  TrafficPathClasses,
@@ -11,8 +13,9 @@ import {
11
13
  classifyJourneyEntry,
12
14
  classifyTrafficPath,
13
15
  hostMatchesDomain,
14
- hostOf
15
- } from "./chunk-F643WELJ.js";
16
+ hostOf,
17
+ isLocationRedirectStatus
18
+ } from "./chunk-Q2SJRZA3.js";
16
19
 
17
20
  // ../integration-traffic/src/agent-trust.ts
18
21
  var AGENT_TRUST_RULES_VERSION = 2;
@@ -18170,6 +18173,18 @@ function isStepRefererHost(host, path) {
18170
18173
  return host === entry.slice(0, slash) && path.startsWith(entry.slice(slash));
18171
18174
  });
18172
18175
  }
18176
+ function siteDomainHosts(siteDomains = []) {
18177
+ return siteDomains.map(domainOf).filter((d) => Boolean(d));
18178
+ }
18179
+ function isStepReferer(event, siteHosts = []) {
18180
+ const refererUrl = refererUrlOf(event.referer);
18181
+ const refererBase = baseHost(refererUrl?.hostname || null);
18182
+ if (!refererBase) return false;
18183
+ const siteHost = baseHost(hostOfEvent(event));
18184
+ if (siteHost && (onDomain(refererBase, siteHost) || onDomain(siteHost, refererBase))) return true;
18185
+ if (siteHosts.some((domain) => onDomain(refererBase, domain))) return true;
18186
+ return isStepRefererHost(refererBase, refererUrl?.pathname ?? "/");
18187
+ }
18173
18188
  function isAssetPath(path) {
18174
18189
  return ASSET_PATH_PREFIXES.some((prefix) => path.startsWith(prefix)) || ASSET_EXTENSION_PATTERN.test(path);
18175
18190
  }
@@ -18194,7 +18209,7 @@ function isLikelyBrowser(userAgent) {
18194
18209
  return Boolean(ua) && /^Mozilla\//.test(ua) && !NON_BROWSER_PATTERN.test(ua);
18195
18210
  }
18196
18211
  function extractJourneyRequests(events, options = {}) {
18197
- const siteDomains = (options.siteDomains ?? []).map(domainOf).filter((d) => Boolean(d));
18212
+ const siteHosts = siteDomainHosts(options.siteDomains);
18198
18213
  const out = [];
18199
18214
  for (const event of events) {
18200
18215
  const method = event.method?.toUpperCase() ?? null;
@@ -18212,12 +18227,8 @@ function extractJourneyRequests(events, options = {}) {
18212
18227
  });
18213
18228
  const maskedPath = maskJourneyPath(rawPath);
18214
18229
  const path = (kept.length ? `${maskedPath}?${kept.join("&")}` : maskedPath).slice(0, MAX_PATH_LENGTH);
18215
- const refererUrl = refererUrlOf(event.referer);
18216
- const refererHost = refererUrl?.hostname || null;
18217
- const refererBase = baseHost(refererHost);
18218
- const siteHost = baseHost(hostOfEvent(event));
18219
- const sameSite = Boolean(refererBase && (siteHost && (onDomain(refererBase, siteHost) || onDomain(siteHost, refererBase)) || siteDomains.some((domain) => onDomain(refererBase, domain))));
18220
- const stepReferer = sameSite || Boolean(refererBase && isStepRefererHost(refererBase, refererUrl?.pathname ?? "/"));
18230
+ const refererHost = refererUrlOf(event.referer)?.hostname || null;
18231
+ const stepReferer = isStepReferer(event, siteHosts);
18221
18232
  const ai = classifyAiReferral(event);
18222
18233
  const networkClickId = Object.keys(NETWORK_CLICK_ID_PARAMETERS).find((name) => params.has(name));
18223
18234
  out.push({
@@ -18615,11 +18626,68 @@ function isLikelySubresourcePath(path) {
18615
18626
  const cleanPath = path.split("?")[0] || "/";
18616
18627
  return ASSET_PATH_PREFIXES2.some((prefix) => cleanPath.startsWith(prefix)) || ASSET_EXTENSION_PATTERN2.test(cleanPath);
18617
18628
  }
18618
- function actorKey(event) {
18629
+ function batchActorKey(event) {
18619
18630
  const remoteIp = event.remoteIp?.trim();
18620
18631
  const userAgent = event.userAgent?.trim();
18621
- if (remoteIp || userAgent) return `${remoteIp ?? "unknown-ip"} ${userAgent ?? "unknown-ua"}`;
18622
- return `event:${event.eventId}`;
18632
+ return remoteIp || userAgent ? `${remoteIp ?? "unknown-ip"} ${userAgent ?? "unknown-ua"}` : null;
18633
+ }
18634
+ function actorKey(event) {
18635
+ return batchActorKey(event) ?? `event:${event.eventId}`;
18636
+ }
18637
+ var AI_REFERRAL_LOOKBACK_MS = JOURNEY_LOOKBACK_DAYS * 24 * 60 * 6e4;
18638
+ var AI_REFERRAL_SAME_VISIT_MS = JOURNEY_VISIT_IDLE_MINUTES * 6e4;
18639
+ function findAiReferralFollowOns(events, options) {
18640
+ const lookbackMs = options.lookbackMs ?? AI_REFERRAL_LOOKBACK_MS;
18641
+ const siteHosts = siteDomainHosts(options.siteDomains);
18642
+ const candidates = [];
18643
+ for (const event of events) {
18644
+ if (isSelfTraffic(event)) continue;
18645
+ const referral = classifyAiReferral(event);
18646
+ if (!referral || isLikelySubresourcePath(resolveAiReferralLandingPath(event, referral.evidenceType))) continue;
18647
+ const at = Date.parse(event.observedAt);
18648
+ const actor = options.actorKey(event, referral.product);
18649
+ if (!Number.isFinite(at) || actor === null) continue;
18650
+ const hop = event.status !== null && isLocationRedirectStatus(event.status);
18651
+ candidates.push({ eventId: event.eventId, actor, at, step: isStepReferer(event, siteHosts), hop });
18652
+ }
18653
+ candidates.sort((a, b) => a.at - b.at || Number(a.step) - Number(b.step));
18654
+ const actors = [...new Set(candidates.map((candidate) => candidate.actor))];
18655
+ const known = actors.length > 0 && options.known ? options.known(actors) : /* @__PURE__ */ new Map();
18656
+ const eventIds = /* @__PURE__ */ new Set();
18657
+ const arrivals = /* @__PURE__ */ new Map();
18658
+ const counted = (actor, arrival) => {
18659
+ const list = arrivals.get(actor);
18660
+ if (list) list.push(arrival);
18661
+ else arrivals.set(actor, [arrival]);
18662
+ };
18663
+ for (const candidate of candidates) {
18664
+ const remembered = [...known.get(candidate.actor) ?? [], ...arrivals.get(candidate.actor) ?? []];
18665
+ if (candidate.step) {
18666
+ const covered = remembered.some((arrival) => arrival.at <= candidate.at && candidate.at - arrival.at <= lookbackMs);
18667
+ if (covered || candidate.hop) {
18668
+ eventIds.add(candidate.eventId);
18669
+ continue;
18670
+ }
18671
+ counted(candidate.actor, { at: candidate.at, standIn: true });
18672
+ continue;
18673
+ }
18674
+ if (candidate.hop) continue;
18675
+ const alreadyCounted = remembered.some((arrival) => arrival.standIn && arrival.at >= candidate.at && arrival.at - candidate.at <= AI_REFERRAL_SAME_VISIT_MS);
18676
+ if (alreadyCounted) {
18677
+ eventIds.add(candidate.eventId);
18678
+ continue;
18679
+ }
18680
+ counted(candidate.actor, { at: candidate.at, standIn: false });
18681
+ }
18682
+ return { eventIds, arrivals };
18683
+ }
18684
+ function findAiReferralFollowOnsInBatch(events) {
18685
+ return findAiReferralFollowOns(events, {
18686
+ actorKey: (event, product) => {
18687
+ const actor = batchActorKey(event);
18688
+ return actor === null ? null : `${actor} ${product}`;
18689
+ }
18690
+ }).eventIds;
18623
18691
  }
18624
18692
  function aiReferralSessionKey(event, aiReferral, landingPathNormalized, windowMs) {
18625
18693
  return [
@@ -18679,6 +18747,7 @@ function buildTrafficProbeReport(events, options = {}) {
18679
18747
  const includedEvents = events.filter((event) => !isSelfTraffic(event));
18680
18748
  const selfTrafficExcluded = events.length - includedEvents.length;
18681
18749
  const scannerBursts = options.scannerBurstEventIds ?? findScannerBurstsInBatch(includedEvents);
18750
+ const aiReferralFollowOns = options.aiReferralFollowOnEventIds ?? findAiReferralFollowOnsInBatch(includedEvents);
18682
18751
  let crawlerHits = 0;
18683
18752
  let aiUserFetchHits = 0;
18684
18753
  let aiUserFetchLikelyFakeHits = 0;
@@ -18770,7 +18839,7 @@ function buildTrafficProbeReport(events, options = {}) {
18770
18839
  if (aiReferral) {
18771
18840
  aiReferralHits += 1;
18772
18841
  const landingPathNormalized = resolveAiReferralLandingPath(event, aiReferral.evidenceType);
18773
- if (!isLikelySubresourcePath(landingPathNormalized)) {
18842
+ if (!aiReferralFollowOns.has(event.eventId) && !isLikelySubresourcePath(landingPathNormalized)) {
18774
18843
  const session = {
18775
18844
  tsHour,
18776
18845
  operator: aiReferral.operator,
@@ -19549,6 +19618,8 @@ export {
19549
19618
  UNRECOGNIZED_AGENT_NAMING_VERSION,
19550
19619
  unrecognizedAgentName,
19551
19620
  normalizeTrafficPathPattern,
19621
+ AI_REFERRAL_LOOKBACK_MS,
19622
+ findAiReferralFollowOns,
19552
19623
  buildTrafficProbeReport,
19553
19624
  normalizeCloudflareWorkerEvent,
19554
19625
  CLOUDFLARE_WORKER_BINDINGS,
@@ -8,23 +8,23 @@ import {
8
8
  reparseStoredResult4,
9
9
  reparseStoredResult5,
10
10
  resolveStoredApiResponse
11
- } from "./chunk-RHOIR5QY.js";
11
+ } from "./chunk-N6AWKBLY.js";
12
12
  import {
13
13
  loadConfig
14
- } from "./chunk-2FJB3CSS.js";
14
+ } from "./chunk-5KDJJO2N.js";
15
15
  import {
16
16
  isMachineFormat
17
17
  } from "./chunk-HGMYEDAQ.js";
18
18
  import {
19
19
  determineCitationState
20
- } from "./chunk-JAYUWQAV.js";
20
+ } from "./chunk-TL52ELES.js";
21
21
  import {
22
22
  backfillProjectAnswerMentions,
23
23
  competitorIdentityColumns,
24
24
  createRunCompetitorResolver,
25
25
  readMarketCompetitorNames,
26
26
  refreshSnapshotMentionIdentity
27
- } from "./chunk-W7DHXSXN.js";
27
+ } from "./chunk-4VMHN5LL.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-O26FQ7RI.js";
41
+ } from "./chunk-ZQGWB7VJ.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-F643WELJ.js";
54
+ } from "./chunk-Q2SJRZA3.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-GJYBEHJE.js");
432
+ const { IntelligenceService } = await import("./intelligence-service-LCTP5BC7.js");
433
433
  const config = loadConfig();
434
434
  const db = createClient(config.database);
435
435
  migrate(db);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cloudflareQueueNameSchema
3
- } from "./chunk-F643WELJ.js";
3
+ } from "./chunk-Q2SJRZA3.js";
4
4
 
5
5
  // src/cloudflare-traffic-config.ts
6
6
  function unsupportedDeliveryMode(deliveryMode) {
@@ -5,7 +5,7 @@ import {
5
5
  AppError,
6
6
  parseWindowIn,
7
7
  resolveDateRange
8
- } from "./chunk-F643WELJ.js";
8
+ } from "./chunk-Q2SJRZA3.js";
9
9
 
10
10
  // src/cli-access.ts
11
11
  var CLI_ACCESS_BY_ID = Object.freeze({
@@ -81,16 +81,32 @@ var CLI_ACCESS_BY_ID = Object.freeze({
81
81
  "bing.connect": "write",
82
82
  "bing.coverage": "write",
83
83
  "bing.coverage-history": "stored",
84
+ "bing.crawl-stats": "stored",
84
85
  "bing.disconnect": "write",
86
+ "bing.fetched-urls": "live",
85
87
  "bing.inspect": "write",
86
88
  "bing.inspect-sitemap": "write",
87
89
  "bing.inspections": "stored",
88
- "bing.performance": "live",
90
+ "bing.keyword-demand": "stored",
91
+ "bing.keywords": "live",
92
+ "bing.links": "live",
93
+ "bing.page-queries": "live",
94
+ "bing.pages": "stored",
95
+ "bing.performance": "stored",
96
+ "bing.queries": "stored",
97
+ "bing.query-history": "live",
98
+ "bing.query-pages": "live",
89
99
  "bing.refresh": "write",
90
100
  "bing.request-indexing": "write",
91
101
  "bing.set-site": "write",
102
+ "bing.site": "stored",
103
+ "bing.sitemaps": "stored",
92
104
  "bing.sites": "live",
93
105
  "bing.status": "stored",
106
+ "bing.sync": "write",
107
+ "bing.traffic": "stored",
108
+ "bing.url-children": "live",
109
+ "bing.url-traffic": "live",
94
110
  "bootstrap": "write",
95
111
  "cdp": "stored",
96
112
  "cdp.connect": "write",
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  createLogger
3
- } from "./chunk-IBGZ6D6R.js";
3
+ } from "./chunk-BDLC3DFM.js";
4
4
  import {
5
5
  addLikelyFakeAgentHits,
6
6
  correctBackgroundCallJourneys,
7
7
  mergeSplitJourneyVisitors,
8
8
  writeUnrecognizedAgentBuckets
9
- } from "./chunk-W7DHXSXN.js";
9
+ } from "./chunk-4VMHN5LL.js";
10
10
  import {
11
11
  AGENT_TRUST_RULES_VERSION,
12
12
  BROWSER_SHAPED_AGENT_MARKERS,
@@ -23,7 +23,7 @@ import {
23
23
  isSelfTraffic,
24
24
  normalizeTrafficPathPattern,
25
25
  unrecognizedAgentName
26
- } from "./chunk-VDYXB6SV.js";
26
+ } from "./chunk-IR3MYKIA.js";
27
27
  import {
28
28
  RawEventSampleEventTypes,
29
29
  agentJourneyCaptureDays,
@@ -36,7 +36,7 @@ import {
36
36
  rawEventSamples,
37
37
  trafficReclassificationState,
38
38
  unrecognizedAgentEventsHourly
39
- } from "./chunk-O26FQ7RI.js";
39
+ } from "./chunk-ZQGWB7VJ.js";
40
40
  import {
41
41
  AI_ENGINE_DOMAINS,
42
42
  AI_ENGINE_SELF_DOMAINS,
@@ -69,7 +69,7 @@ import {
69
69
  retryAfterDelayMs,
70
70
  usageCount,
71
71
  withRetry
72
- } from "./chunk-F643WELJ.js";
72
+ } from "./chunk-Q2SJRZA3.js";
73
73
 
74
74
  // ../provider-openai/src/normalize.ts
75
75
  import OpenAI from "openai";
@@ -2,11 +2,11 @@ import {
2
2
  dedupeGscSitemapUrls,
3
3
  resolveDiscoveredGscSitemapUrls,
4
4
  submitGscSitemapBatches
5
- } from "./chunk-GXTCDNX7.js";
5
+ } from "./chunk-PZLEKWYA.js";
6
6
  import {
7
7
  measurementDraftOperationSchema,
8
8
  runMeasurementDraftAction
9
- } from "./chunk-MNLAIB67.js";
9
+ } from "./chunk-FL76YWYN.js";
10
10
  import {
11
11
  CliError
12
12
  } from "./chunk-HGMYEDAQ.js";
@@ -46,6 +46,7 @@ import {
46
46
  apiKeyDtoSchema,
47
47
  auditHistoryQuerySchema,
48
48
  backlinkSourceSchema,
49
+ bingSiteSnapshotKindSchema,
49
50
  calendarDateSchema,
50
51
  canonicalizeGtmAccountId,
51
52
  canonicalizeGtmResourceSelection,
@@ -186,7 +187,7 @@ import {
186
187
  trendSurfaceSchema,
187
188
  visibilityCompareSelectionSchema,
188
189
  visibilityReportRequestSchema
189
- } from "./chunk-F643WELJ.js";
190
+ } from "./chunk-Q2SJRZA3.js";
190
191
 
191
192
  // src/mcp/tool-registry.ts
192
193
  import { z as z2 } from "zod";
@@ -486,6 +487,59 @@ var gscPerformanceInputSchema = z2.object({
486
487
  orderBy: gscPerformanceOrderBySchema.optional(),
487
488
  window: analyticsWindowSchema.optional()
488
489
  });
490
+ var bingWindowShape = {
491
+ project: projectNameSchema,
492
+ startDate: z2.string().optional().describe("First day, YYYY-MM-DD. Wins over days."),
493
+ endDate: z2.string().optional().describe("Last day, YYYY-MM-DD."),
494
+ days: z2.number().int().positive().optional().describe("Span in days ending at endDate or at the newest stored day (default 28).")
495
+ };
496
+ var bingWindowInputSchema = z2.object(bingWindowShape);
497
+ var bingQueriesInputSchema = z2.object({
498
+ ...bingWindowShape,
499
+ query: z2.string().optional().describe("Substring filter on the query."),
500
+ groupBy: z2.enum(["query", "week"]).optional(),
501
+ limit: z2.number().int().positive().max(5e3).optional(),
502
+ offset: z2.number().int().nonnegative().optional()
503
+ });
504
+ var bingPagesInputSchema = z2.object({
505
+ ...bingWindowShape,
506
+ page: z2.string().optional().describe("Substring filter on the page URL."),
507
+ groupBy: z2.enum(["page", "week"]).optional(),
508
+ limit: z2.number().int().positive().max(5e3).optional(),
509
+ offset: z2.number().int().nonnegative().optional()
510
+ });
511
+ var bingSiteInputSchema = z2.object({
512
+ project: projectNameSchema,
513
+ kind: bingSiteSnapshotKindSchema.optional()
514
+ });
515
+ var bingKeywordDemandInputSchema = z2.object({
516
+ project: projectNameSchema,
517
+ query: z2.string().optional().describe("A tracked query whose weekly history to include.")
518
+ });
519
+ var bingQueryPagesInputSchema = z2.object({ project: projectNameSchema, query: z2.string().min(1) });
520
+ var bingPageQueriesInputSchema = z2.object({ project: projectNameSchema, page: z2.string().url() });
521
+ var bingQueryHistoryInputSchema = z2.object({ project: projectNameSchema, query: z2.string().min(1), page: z2.string().url().optional() });
522
+ var bingUrlTrafficInputSchema = z2.object({
523
+ project: projectNameSchema,
524
+ url: z2.string().url(),
525
+ children: z2.boolean().optional(),
526
+ page: z2.number().int().nonnegative().optional()
527
+ });
528
+ var bingKeywordsInputSchema = z2.object({
529
+ project: projectNameSchema,
530
+ keyword: z2.string().min(1),
531
+ country: z2.string().optional().describe("Market country, such as us. Defaults to the project country."),
532
+ language: z2.string().optional().describe("Market language tag, such as en-US. Defaults from the project."),
533
+ startDate: z2.string().optional(),
534
+ endDate: z2.string().optional()
535
+ });
536
+ function bingWindowQuery(input) {
537
+ return {
538
+ ...input.startDate ? { startDate: input.startDate } : {},
539
+ ...input.endDate ? { endDate: input.endDate } : {},
540
+ ...input.days !== void 0 ? { days: String(input.days) } : {}
541
+ };
542
+ }
489
543
  var gscPerformanceDailyInputSchema = z2.object({
490
544
  project: projectNameSchema,
491
545
  startDate: z2.string().optional(),
@@ -2465,6 +2519,159 @@ var rawCanonryMcpTools = [
2465
2519
  openApiOperations: ["GET /api/v1/projects/{name}/bing/coverage"],
2466
2520
  handler: (client, input) => client.bingCoverage(input.project)
2467
2521
  }),
2522
+ defineTool({
2523
+ name: "canonry_bing_sync",
2524
+ title: "Sync Bing data",
2525
+ description: "Queue a full Bing Webmaster sync for a project: daily site clicks and impressions, weekly query and page stats, daily crawl stats, sitemaps, site settings (submission quotas, crawl settings, blocked URLs, URL parameters, geo-targeting, preview and sitelink blocks, Fetch as Bingbot history, crawl issues) and weekly search demand for tracked queries. Makes about 20 to 50 calls to Bing, paced on the shared account limit. Runs daily as part of the data refresh; trigger it only when stored data is missing or stale. Returns the queued run.",
2526
+ access: "write",
2527
+ tier: "bing",
2528
+ inputSchema: projectInputSchema,
2529
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
2530
+ openApiOperations: ["POST /api/v1/projects/{name}/bing/sync"],
2531
+ handler: (client, input) => client.bingSync(input.project)
2532
+ }),
2533
+ defineTool({
2534
+ name: "canonry_bing_traffic",
2535
+ title: "Get Bing traffic",
2536
+ description: "Get stored daily Bing search clicks and impressions for the whole site, with window totals and CTR (no call to Bing). These daily rows are the site total; use them for Bing headline numbers, never a sum of canonry_bing_queries rows. latestAvailableDate is the newest stored day (Bing lags 2 to 3 days); earliestAvailableDate says how far back history goes.",
2537
+ access: "read",
2538
+ tier: "bing",
2539
+ inputSchema: bingWindowInputSchema,
2540
+ annotations: readAnnotations(),
2541
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/traffic"],
2542
+ handler: (client, input) => client.bingTraffic(input.project, bingWindowQuery(input))
2543
+ }),
2544
+ defineTool({
2545
+ name: "canonry_bing_queries",
2546
+ title: "Get Bing query stats",
2547
+ description: "Get stored Bing search stats per query (no call to Bing). Bing reports queries per WEEK, so each row sums the weekly buckets inside the window, with impression-weighted position and the number of weeks it appeared. Bing names only some queries: never sum rows for a site total, use canonry_bing_traffic. groupBy=week returns weekly totals instead, for a trend. Page with limit/offset until truncated is false.",
2548
+ access: "read",
2549
+ tier: "bing",
2550
+ inputSchema: bingQueriesInputSchema,
2551
+ annotations: readAnnotations(),
2552
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/queries"],
2553
+ handler: (client, input) => client.bingQueries(input.project, { ...bingWindowQuery(input), query: input.query, groupBy: input.groupBy, limit: input.limit, offset: input.offset })
2554
+ }),
2555
+ defineTool({
2556
+ name: "canonry_bing_pages",
2557
+ title: "Get Bing page stats",
2558
+ description: "Get stored Bing search stats per page URL (no call to Bing), summed from weekly buckets like canonry_bing_queries. groupBy=week returns weekly totals. Never sum rows for a site total; use canonry_bing_traffic.",
2559
+ access: "read",
2560
+ tier: "bing",
2561
+ inputSchema: bingPagesInputSchema,
2562
+ annotations: readAnnotations(),
2563
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/pages"],
2564
+ handler: (client, input) => client.bingPages(input.project, { ...bingWindowQuery(input), page: input.page, groupBy: input.groupBy, limit: input.limit, offset: input.offset })
2565
+ }),
2566
+ defineTool({
2567
+ name: "canonry_bing_crawl_stats",
2568
+ title: "Get Bing crawl stats",
2569
+ description: "Get stored daily Bingbot crawl counts (no call to Bing): pages crawled, pages in index, crawl errors, inbound links, HTTP 2xx/301/302/4xx/5xx counts, robots.txt blocks, timeouts, DNS failures and malware flags. Newest first.",
2570
+ access: "read",
2571
+ tier: "bing",
2572
+ inputSchema: bingWindowInputSchema,
2573
+ annotations: readAnnotations(),
2574
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/crawl-stats"],
2575
+ handler: (client, input) => client.bingCrawlStats(input.project, bingWindowQuery(input))
2576
+ }),
2577
+ defineTool({
2578
+ name: "canonry_bing_sitemaps",
2579
+ title: "Get Bing sitemaps",
2580
+ description: "Get the sitemaps Bing has for the site as of the last sync (no call to Bing): type, status, URL count, submitted and last-crawled dates. Child sitemaps carry the parentUrl of their sitemap index.",
2581
+ access: "read",
2582
+ tier: "bing",
2583
+ inputSchema: projectInputSchema,
2584
+ annotations: readAnnotations(),
2585
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/sitemaps"],
2586
+ handler: (client, input) => client.bingSitemaps(input.project)
2587
+ }),
2588
+ defineTool({
2589
+ name: "canonry_bing_site",
2590
+ title: "Get Bing site settings",
2591
+ description: "Get the stored Bing site settings (no call to Bing): URL and content submission quotas LEFT today and this month, crawl settings, crawl issues, blocked URLs, page preview blocks, sitelink blocks, URL parameters, geo-targeting, Fetch as Bingbot history, connected pages and user roles. status is unauthorized for owner-only settings this key cannot read. A blocked URL or preview block keeps a page out of Bing and Copilot answers.",
2592
+ access: "read",
2593
+ tier: "bing",
2594
+ inputSchema: bingSiteInputSchema,
2595
+ annotations: readAnnotations(),
2596
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/site"],
2597
+ handler: (client, input) => client.bingSite(input.project, input.kind ? { kind: input.kind } : void 0)
2598
+ }),
2599
+ defineTool({
2600
+ name: "canonry_bing_keyword_demand",
2601
+ title: "Get Bing keyword demand",
2602
+ description: "Get stored weekly Bing search volume for every tracked query in the project market (no call to Bing): average and latest weekly exact-match searches, broad-match searches and weeks stored. This is demand for the query, not traffic to the site. Pass query to include that query's weekly history. Refreshed weekly by the Bing sync.",
2603
+ access: "read",
2604
+ tier: "bing",
2605
+ inputSchema: bingKeywordDemandInputSchema,
2606
+ annotations: readAnnotations(),
2607
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/keyword-demand"],
2608
+ handler: (client, input) => client.bingKeywordDemand(input.project, input.query ? { query: input.query } : void 0)
2609
+ }),
2610
+ defineTool({
2611
+ name: "canonry_bing_query_pages",
2612
+ title: "Get Bing pages for a query (live)",
2613
+ description: "Ask Bing live which of the site's pages showed for one search query, per week (one call to Bing). Use it to find the page Bing ranks for a query.",
2614
+ access: "read",
2615
+ tier: "bing",
2616
+ inputSchema: bingQueryPagesInputSchema,
2617
+ annotations: readAnnotations(true),
2618
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/query-pages"],
2619
+ handler: (client, input) => client.bingQueryPages(input.project, input.query)
2620
+ }),
2621
+ defineTool({
2622
+ name: "canonry_bing_page_queries",
2623
+ title: "Get Bing queries for a page (live)",
2624
+ description: "Ask Bing live which search queries one page showed for, per week (one call to Bing).",
2625
+ access: "read",
2626
+ tier: "bing",
2627
+ inputSchema: bingPageQueriesInputSchema,
2628
+ annotations: readAnnotations(true),
2629
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/page-queries"],
2630
+ handler: (client, input) => client.bingPageQueries(input.project, input.page)
2631
+ }),
2632
+ defineTool({
2633
+ name: "canonry_bing_query_history",
2634
+ title: "Get Bing query history (live)",
2635
+ description: "Ask Bing live for one query's clicks and impressions per day, or per week with position when page is given (one call to Bing).",
2636
+ access: "read",
2637
+ tier: "bing",
2638
+ inputSchema: bingQueryHistoryInputSchema,
2639
+ annotations: readAnnotations(true),
2640
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/query-history"],
2641
+ handler: (client, input) => client.bingQueryHistory(input.project, { query: input.query, page: input.page })
2642
+ }),
2643
+ defineTool({
2644
+ name: "canonry_bing_url_traffic",
2645
+ title: "Get Bing traffic for a URL (live)",
2646
+ description: "Ask Bing live for one URL's clicks and impressions, optionally with the URLs under it (children, 0-indexed page). One or two calls to Bing.",
2647
+ access: "read",
2648
+ tier: "bing",
2649
+ inputSchema: bingUrlTrafficInputSchema,
2650
+ annotations: readAnnotations(true),
2651
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/url-traffic"],
2652
+ handler: (client, input) => client.bingUrlTraffic(input.project, {
2653
+ url: input.url,
2654
+ children: input.children ? "true" : void 0,
2655
+ page: input.page === void 0 ? void 0 : String(input.page)
2656
+ })
2657
+ }),
2658
+ defineTool({
2659
+ name: "canonry_bing_keywords",
2660
+ title: "Research a keyword on Bing (live)",
2661
+ description: "Ask Bing live for any keyword's search volume over a window, its weekly history and related keywords with their volume (three calls to Bing). Not tied to the site; use it to size demand for a topic or find new queries to track. impressions is exact-match volume, broadImpressions broad-match.",
2662
+ access: "read",
2663
+ tier: "bing",
2664
+ inputSchema: bingKeywordsInputSchema,
2665
+ annotations: readAnnotations(true),
2666
+ openApiOperations: ["GET /api/v1/projects/{name}/bing/keywords"],
2667
+ handler: (client, input) => client.bingKeywords(input.project, {
2668
+ keyword: input.keyword,
2669
+ country: input.country,
2670
+ language: input.language,
2671
+ startDate: input.startDate,
2672
+ endDate: input.endDate
2673
+ })
2674
+ }),
2468
2675
  defineTool({
2469
2676
  name: "canonry_gsc_sitemaps",
2470
2677
  title: "Get GSC sitemaps",
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-DOPUEXMC.js";
5
+ } from "./chunk-4A4X7VXE.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-2FJB3CSS.js";
8
+ } from "./chunk-5KDJJO2N.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-GBWCEOZR.js";
11
+ } from "./chunk-IPOYH4WE.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-F643WELJ.js";
22
+ } from "./chunk-Q2SJRZA3.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-O26FQ7RI.js";
8
+ } from "./chunk-ZQGWB7VJ.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-F643WELJ.js";
18
+ } from "./chunk-Q2SJRZA3.js";
19
19
 
20
20
  // src/site-audit-factors.ts
21
21
  function recordedSharePct(factor) {