@canonry/canonry 7.59.0 → 7.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/assets/agent-workspace/skills/aero/SKILL.md +2 -1
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +20 -5
  3. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +6 -3
  4. package/assets/assets/{AgentSetupPage-DH2Mi2Q7.js → AgentSetupPage-CCMNQwRE.js} +1 -1
  5. package/assets/assets/{AuditHistoryPanel-DVIQR5y5.js → AuditHistoryPanel-B8mIRI3I.js} +1 -1
  6. package/assets/assets/{BacklinksPage-DFFeaSbH.js → BacklinksPage-BNLyIR97.js} +1 -1
  7. package/assets/assets/{HistoryPage-BxDhO9rm.js → HistoryPage-DSr9KE16.js} +1 -1
  8. package/assets/assets/InfoTooltip-BbdxCAup.js +1 -0
  9. package/assets/assets/{MeasurementPropertyPage-B0AkDYxY.js → MeasurementPropertyPage-BTg-SFW7.js} +1 -1
  10. package/assets/assets/{ProjectPage-6_HOcytx.js → ProjectPage-SqE0fkEq.js} +7 -7
  11. package/assets/assets/{RunsPage-BUK5EqC6.js → RunsPage-gJR17ho1.js} +1 -1
  12. package/assets/assets/{SettingsPage-CuBUZ4TN.js → SettingsPage-DY5f_oN4.js} +1 -1
  13. package/assets/assets/{SiteHealthSection-CoyiSleA.js → SiteHealthSection-BYx91hP-.js} +2 -2
  14. package/assets/assets/ToneBadge-C3S7aVf3.js +60 -0
  15. package/assets/assets/{TrafficPage-BE9Ay-x-.js → TrafficPage-CCXH5nhh.js} +1 -1
  16. package/assets/assets/{TrafficSourceDetailPage-kW0DFcwB.js → TrafficSourceDetailPage-DTjCsu4-.js} +1 -1
  17. package/assets/assets/{account-context-IN6VE8PV.js → account-context-DozTQM44.js} +1 -1
  18. package/assets/assets/{card-DiBSxANp.js → card-D8MU7RYV.js} +1 -1
  19. package/assets/assets/{extract-error-message-_H20efSf.js → extract-error-message-CsVYPTyt.js} +1 -1
  20. package/assets/assets/{format-helpers-DKjsmbxo.js → format-helpers-CWBooMJJ.js} +1 -1
  21. package/assets/assets/{index-B1kVq-wC.js → index-D5o-caTl.js} +4 -4
  22. package/assets/assets/index-DqhMdZUM.css +1 -0
  23. package/assets/assets/{query-client-BXS2w17E.js → query-client-DbxlHfUm.js} +1 -1
  24. package/assets/assets/{react-query-B8oOFCyW.js → react-query-D4ZSMg7h.js} +1 -1
  25. package/assets/assets/{react-sigma_core.esm.min-Bf_kjp11.js → react-sigma_core.esm.min-CSRp4hew.js} +1 -1
  26. package/assets/assets/{service-D9noo7pB.js → service-CYzJmCXU.js} +1 -1
  27. package/assets/index.html +9 -9
  28. package/dist/{ads-6NAIIZGO.js → ads-BGCHIYH7.js} +3 -3
  29. package/dist/{agent-LISFS4WR.js → agent-JPTVPRNF.js} +7 -7
  30. package/dist/{agent-ask-JJM34LMD.js → agent-ask-BUA2AOYT.js} +3 -3
  31. package/dist/{agent-conversations-4JNBIBVR.js → agent-conversations-GLTN6QIK.js} +3 -3
  32. package/dist/{agent-memory-I2M7TIWO.js → agent-memory-XON2PCI3.js} +3 -3
  33. package/dist/{agent-providers-3ZX3RETW.js → agent-providers-QVF3QILF.js} +3 -3
  34. package/dist/{agent-transcript-OYK4O5XV.js → agent-transcript-LZI4PBF4.js} +3 -3
  35. package/dist/{analytics-7HW2FSST.js → analytics-Y7ZAOJIG.js} +30 -8
  36. package/dist/{apply-S2OC6S65.js → apply-VPBTAFUO.js} +3 -3
  37. package/dist/{backfill-EUHHN4VT.js → backfill-OI5UPJOS.js} +9 -9
  38. package/dist/{backlinks-AY5EMVN4.js → backlinks-O6MOB6BM.js} +3 -3
  39. package/dist/{bing-KJW2LYAT.js → bing-T4FGT4QG.js} +3 -3
  40. package/dist/{bootstrap-3R4AMSY4.js → bootstrap-NAAROTPL.js} +10 -10
  41. package/dist/{cdp-URC66DX5.js → cdp-ZYDKLCJM.js} +7 -7
  42. package/dist/{chunk-O7BPIPJB.js → chunk-2E4GJQJ4.js} +2 -2
  43. package/dist/{chunk-LJRXJHWJ.js → chunk-2H3E7BDF.js} +1 -1
  44. package/dist/{chunk-KLPRF4PA.js → chunk-5JFEK7IL.js} +1 -1
  45. package/dist/{chunk-PZUMERGZ.js → chunk-5ZINPM6W.js} +1 -1
  46. package/dist/{chunk-JLDTGMVQ.js → chunk-7FTOEVLL.js} +2 -2
  47. package/dist/{chunk-PSRJYRAD.js → chunk-AAKVFLL3.js} +8 -8
  48. package/dist/{chunk-B4N5L6NF.js → chunk-BOIZ6IET.js} +5 -5
  49. package/dist/{chunk-X3UXPAT7.js → chunk-D7DOTPNP.js} +2 -2
  50. package/dist/{chunk-LWKHCQ46.js → chunk-GDVMHIY4.js} +7 -6
  51. package/dist/{chunk-FA7RDZ43.js → chunk-HF4ARGGH.js} +1 -1
  52. package/dist/{chunk-GS6IH7CI.js → chunk-HQKTZH7L.js} +351 -337
  53. package/dist/{chunk-TJ4UAO7R.js → chunk-JHYLKXUV.js} +31 -4
  54. package/dist/{chunk-KCO3PGDZ.js → chunk-K2TRV65V.js} +1 -1
  55. package/dist/{chunk-ON7D53WE.js → chunk-L3W6UCTQ.js} +3 -3
  56. package/dist/{chunk-EED2QEE7.js → chunk-M6KKI7FB.js} +1 -1
  57. package/dist/{chunk-3WRDJJOY.js → chunk-MIV52IYY.js} +1 -1
  58. package/dist/{chunk-PP7HR4II.js → chunk-MSEOZUBH.js} +4 -4
  59. package/dist/{chunk-WSFCQQ7F.js → chunk-O5WQN3GW.js} +96 -21
  60. package/dist/{chunk-Y54KA37X.js → chunk-OFV6CZ2K.js} +1 -1
  61. package/dist/{chunk-VWO4WRQM.js → chunk-OQDVG7K7.js} +3 -3
  62. package/dist/{chunk-VRI3UDRA.js → chunk-OTOVHA7D.js} +1 -1
  63. package/dist/{chunk-QF5C3JXL.js → chunk-ST7JA3UW.js} +1 -1
  64. package/dist/{chunk-SXDAIG5W.js → chunk-TD623G6F.js} +1 -1
  65. package/dist/{chunk-EJZ4TQQR.js → chunk-TQLXCGRD.js} +2 -2
  66. package/dist/{chunk-TKX4G4NV.js → chunk-UQVOB3OH.js} +4 -4
  67. package/dist/{chunk-RFXO5GPB.js → chunk-UX6KFIIE.js} +3 -3
  68. package/dist/{chunk-HUO3YPKB.js → chunk-V3XAJCO3.js} +24 -3
  69. package/dist/{chunk-SEBIXQEN.js → chunk-VMXMJWTB.js} +3 -3
  70. package/dist/{chunk-HKLI6ZFP.js → chunk-WWPADIGG.js} +20 -20
  71. package/dist/{chunk-MTKXD4WY.js → chunk-XKAH5XYT.js} +2 -2
  72. package/dist/{chunk-PTKFLEVN.js → chunk-XRQCRDTF.js} +5 -4
  73. package/dist/{chunk-PDS77GLS.js → chunk-YEH26F57.js} +4 -4
  74. package/dist/{chunk-WUVX5HBI.js → chunk-YGHUT4F7.js} +1 -1
  75. package/dist/{chunk-OTQFHUIH.js → chunk-YWQCJQPV.js} +5 -5
  76. package/dist/{citations-DAXUWNKQ.js → citations-6SR5QG7C.js} +3 -3
  77. package/dist/{cli-catalog-ORQPYKHI.js → cli-catalog-VILBDFBX.js} +3 -3
  78. package/dist/{cli-commands-SDTHXYWU.js → cli-commands-BCYMNTYY.js} +7 -7
  79. package/dist/cli.js +13 -13
  80. package/dist/{competitor-QPL47DA6.js → competitor-XQESNR2X.js} +3 -3
  81. package/dist/{content-V5NLV3AH.js → content-B6H2Y6NI.js} +3 -3
  82. package/dist/{dashboard-CZEO2UTG.js → dashboard-NW3HWXVM.js} +6 -6
  83. package/dist/{demo-JZS5DBSR.js → demo-3CB6CWSG.js} +1 -1
  84. package/dist/{demo-server-OAYVJVGC.js → demo-server-EGSJGYN5.js} +11 -11
  85. package/dist/{discover-TEEHJPLW.js → discover-W5R7QVT4.js} +3 -3
  86. package/dist/{discover-eval-4I25W4VL.js → discover-eval-KXTQYYAT.js} +3 -3
  87. package/dist/{doctor-VR6YKJSW.js → doctor-BVQ5G5FY.js} +3 -3
  88. package/dist/{evidence-SISRJ4YZ.js → evidence-R2OHKHMB.js} +3 -3
  89. package/dist/{export-cmd-L5LKHKBY.js → export-cmd-2D42QGE6.js} +3 -3
  90. package/dist/{ga-WQQVWU5Q.js → ga-FE7E7FK5.js} +3 -3
  91. package/dist/{gbp-XKRX7ZJY.js → gbp-ML4MJFMR.js} +3 -3
  92. package/dist/{google-TUEMVVGE.js → google-3D52XYTJ.js} +4 -4
  93. package/dist/{google-marketing-JWAJXNWR.js → google-marketing-GDMMQVC5.js} +1 -1
  94. package/dist/{health-cmd-2OQEIQMG.js → health-cmd-QEW6GNJP.js} +3 -3
  95. package/dist/{history-33VEX442.js → history-O7CL762R.js} +3 -3
  96. package/dist/index.js +24 -24
  97. package/dist/{init-QMLVST26.js → init-N3WI6WIQ.js} +11 -11
  98. package/dist/{insights-6VIXDNVK.js → insights-RBORMIBR.js} +3 -3
  99. package/dist/intelligence-service-GIQUBLBU.js +15 -0
  100. package/dist/{journeys-7YJLJ34F.js → journeys-62MQCBGH.js} +3 -3
  101. package/dist/{keys-I7Z5CGEQ.js → keys-A7PCG4S7.js} +3 -3
  102. package/dist/{keyword-OPTT3EXO.js → keyword-IU6OBCF6.js} +3 -3
  103. package/dist/{logs-35L2ZWRO.js → logs-FJJDRRGT.js} +3 -3
  104. package/dist/{mcp-JWB42VTJ.js → mcp-RJFSEI5Q.js} +2 -2
  105. package/dist/mcp.js +9 -9
  106. package/dist/{measurement-plan-UWA2N6FO.js → measurement-plan-M65GWWVK.js} +5 -5
  107. package/dist/{notify-FE7FSXDB.js → notify-E555NEWB.js} +3 -3
  108. package/dist/{organic-evidence-34EKPGKI.js → organic-evidence-L3HSIHKB.js} +3 -3
  109. package/dist/{overview-HPY5I6ZT.js → overview-DIUMXQHP.js} +4 -4
  110. package/dist/{project-5CCX7VNR.js → project-BTRIU4ZZ.js} +3 -3
  111. package/dist/{query-VV4TRRDX.js → query-ODGT6LCA.js} +3 -3
  112. package/dist/{research-62VXIO2O.js → research-CFOCCZYJ.js} +3 -3
  113. package/dist/{results-export-QZQTNXMB.js → results-export-ZCVCABTY.js} +3 -3
  114. package/dist/{run-MYWJ2MPB.js → run-ALQMFZPA.js} +4 -4
  115. package/dist/{schedule-YC76OSAK.js → schedule-RJHQG6BO.js} +3 -3
  116. package/dist/{search-J2J7BXBL.js → search-EQGSYWF7.js} +3 -3
  117. package/dist/{serve-LESJD7GM.js → serve-EHPDSJSX.js} +25 -25
  118. package/dist/{session-2MU6LLLC.js → session-3H6V5DGU.js} +12 -12
  119. package/dist/{settings-QIMV3UYB.js → settings-SMD7F2W3.js} +3 -3
  120. package/dist/{skills-3HOQ77ON.js → skills-KQYUUDBA.js} +2 -2
  121. package/dist/{snapshot-XL3KO4OW.js → snapshot-S4UZAST6.js} +3 -3
  122. package/dist/{src-CLICUC3F.js → src-QZCOCSQQ.js} +2 -2
  123. package/dist/{status-CKAJEBHG.js → status-PA5W33LR.js} +4 -4
  124. package/dist/{technical-aeo-CW7WNDUU.js → technical-aeo-LLK37ELV.js} +3 -3
  125. package/dist/{telemetry-GPP5XD7R.js → telemetry-OLKQFAOR.js} +4 -4
  126. package/dist/{tools-UNFFO5HO.js → tools-56M7FYOA.js} +11 -11
  127. package/dist/{traffic-LALKHOSD.js → traffic-WKFMJIBP.js} +13 -8
  128. package/dist/{users-NQG7Y3GC.js → users-GZ4SIIZ7.js} +3 -3
  129. package/dist/{visibility-stats-RJHXNYBM.js → visibility-stats-4VK55MH2.js} +3 -3
  130. package/dist/{wordpress-VLHQ6P47.js → wordpress-H6SNWN7D.js} +3 -3
  131. package/package.json +1 -1
  132. package/assets/assets/InfoTooltip-DV3_9Qp1.js +0 -1
  133. package/assets/assets/ToneBadge-Du4fOtJa.js +0 -60
  134. package/assets/assets/index-DElT2Fss.css +0 -1
  135. package/dist/intelligence-service-NFBPBKI7.js +0 -15
@@ -8,7 +8,7 @@ import {
8
8
  classifyJourneyEntry,
9
9
  hostMatchesDomain,
10
10
  hostOf
11
- } from "./chunk-HUO3YPKB.js";
11
+ } from "./chunk-V3XAJCO3.js";
12
12
 
13
13
  // ../integration-traffic/src/ip-ranges/amazonbot.json
14
14
  var amazonbot_default = {
@@ -15186,6 +15186,29 @@ var DEFAULT_BOT_LIST = {
15186
15186
  };
15187
15187
  var DEFAULT_BOT_SCORE_MAX_FORWARD = 30;
15188
15188
  var WORKER_COMPATIBILITY_DATE = "2026-05-01";
15189
+ var CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX = "+page-views";
15190
+ var PAGE_VIEW_ASSET_EXTENSIONS = ["avif", "bmp", "css", "gif", "ico", "jpeg", "jpg", "js", "map", "mjs", "mp3", "mp4", "otf", "pdf", "png", "svg", "ttf", "txt", "webm", "webmanifest", "webp", "woff", "woff2", "xml", "zip"];
15191
+ var PAGE_VIEW_FILTER = `
15192
+ const PAGE_VIEW_ASSET_PATTERN = new RegExp(${JSON.stringify(`\\.(?:${PAGE_VIEW_ASSET_EXTENSIONS.join("|")})$`)}, 'i')
15193
+
15194
+ function isPageView(request) {
15195
+ const method = request.method || 'GET'
15196
+ if (method !== 'GET' && method !== 'POST') return false
15197
+ const purpose = lower(request.headers.get('sec-purpose') || request.headers.get('purpose') || '')
15198
+ if (purpose.indexOf('prefetch') !== -1 || purpose.indexOf('prerender') !== -1) return false
15199
+ const ua = request.headers.get('user-agent') || ''
15200
+ if (ua.indexOf('Mozilla/') !== 0) return false
15201
+ const dest = lower(request.headers.get('sec-fetch-dest') || '')
15202
+ if (dest) return dest === 'document'
15203
+ if (method !== 'GET') return false
15204
+ if (lower(request.headers.get('accept') || '').indexOf('text/html') === -1) return false
15205
+ try {
15206
+ return !PAGE_VIEW_ASSET_PATTERN.test(new URL(request.url).pathname)
15207
+ } catch (_) {
15208
+ return false
15209
+ }
15210
+ }
15211
+ `;
15189
15212
  function jsString(value) {
15190
15213
  return JSON.stringify(value);
15191
15214
  }
@@ -15194,6 +15217,9 @@ function jsArray(values) {
15194
15217
  }
15195
15218
  function generateWorkerScript(opts) {
15196
15219
  const botScoreMax = opts.botScoreMaxForward ?? DEFAULT_BOT_SCORE_MAX_FORWARD;
15220
+ const pageViewHeader = opts.forwardPageViews ? "\n// page views: forwarded" : "";
15221
+ const pageViewFilter = opts.forwardPageViews ? PAGE_VIEW_FILTER : "";
15222
+ const pageViewCheck = opts.forwardPageViews ? "\n if (isPageView(request)) return true" : "";
15197
15223
  const canonicalJsonFunction = canonicalizeCloudflareJson.toString();
15198
15224
  const directPushDelivery = opts.deliveryMode === "direct-push" ? `
15199
15225
  function toHex(buffer) {
@@ -15303,7 +15329,7 @@ async function deliverViaQueue(env, batch) {
15303
15329
  return `${CLOUDFLARE_WORKER_GENERATED_MARKER}
15304
15330
  // worker version: ${opts.workerVersion}
15305
15331
  // bot-list version: ${opts.botList.version}
15306
- // delivery mode: ${opts.deliveryMode}
15332
+ // delivery mode: ${opts.deliveryMode}${pageViewHeader}
15307
15333
 
15308
15334
  const UA_KEYWORDS = ${jsArray(opts.botList.uaKeywords)}
15309
15335
  const REFERER_DOMAINS = ${jsArray(opts.botList.refererDomains)}
@@ -15378,14 +15404,14 @@ function botSignals(cf) {
15378
15404
  if (typeof cf.botScore === 'number' && cf.botScore < BOT_SCORE_MAX_FORWARD) return true
15379
15405
  return false
15380
15406
  }
15381
-
15407
+ ${pageViewFilter}
15382
15408
  function shouldForward(request) {
15383
15409
  const ua = request.headers.get('user-agent') || ''
15384
15410
  if (uaMatches(ua)) return true
15385
15411
  if (urlUtmMatches(request.url)) return true
15386
15412
  const referer = request.headers.get('referer') || ''
15387
15413
  if (refererMatches(referer)) return true
15388
- if (urlUtmMatches(referer)) return true
15414
+ if (urlUtmMatches(referer)) return true${pageViewCheck}
15389
15415
  return botSignals(request.cf)
15390
15416
  }
15391
15417
 
@@ -15680,6 +15706,7 @@ export {
15680
15706
  CLOUDFLARE_WORKER_GENERATED_MARKER,
15681
15707
  CLOUDFLARE_WRANGLER_GENERATED_MARKER,
15682
15708
  DEFAULT_BOT_LIST,
15709
+ CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX,
15683
15710
  generateWorkerScript,
15684
15711
  generateWranglerToml,
15685
15712
  verifyRequestSignature
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  API_PROVIDER_NAMES,
3
3
  ProviderNames
4
- } from "./chunk-HUO3YPKB.js";
4
+ } from "./chunk-V3XAJCO3.js";
5
5
 
6
6
  // src/provider-registration.ts
7
7
  function isApiProviderRegistrable(name, entry) {
@@ -2,18 +2,18 @@ import {
2
2
  configExists,
3
3
  loadConfigRaw,
4
4
  saveConfigPatch
5
- } from "./chunk-FA7RDZ43.js";
5
+ } from "./chunk-HF4ARGGH.js";
6
6
  import {
7
7
  BUNDLED_SKILL_NAMES,
8
8
  installSkills
9
- } from "./chunk-SXDAIG5W.js";
9
+ } from "./chunk-TD623G6F.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-HUO3YPKB.js";
16
+ } from "./chunk-V3XAJCO3.js";
17
17
 
18
18
  // src/skills-autosync.ts
19
19
  import fs from "fs";
@@ -23,7 +23,7 @@ import {
23
23
  measurementDraftUpsertGroupRequestSchema,
24
24
  measurementDraftUpsertMarketRequestSchema,
25
25
  measurementDraftUpsertTargetRequestSchema
26
- } from "./chunk-HUO3YPKB.js";
26
+ } from "./chunk-V3XAJCO3.js";
27
27
 
28
28
  // src/measurement-draft-actions.ts
29
29
  import { z } from "zod";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-HGMYEDAQ.js";
9
9
  import {
10
10
  describeError
11
- } from "./chunk-HUO3YPKB.js";
11
+ } from "./chunk-V3XAJCO3.js";
12
12
 
13
13
  // src/commands/mcp.ts
14
14
  import fs from "fs";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  registeredProviderNames
3
- } from "./chunk-KCO3PGDZ.js";
3
+ } from "./chunk-K2TRV65V.js";
4
4
  import {
5
5
  configExists,
6
6
  loadConfigRaw
7
- } from "./chunk-FA7RDZ43.js";
7
+ } from "./chunk-HF4ARGGH.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-CLICUC3F.js");
31
+ const { createClient, projects, queries: queriesTable } = await import("./src-QZCOCSQQ.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-LESJD7GM.js");
50
+ const { serveCommand } = await import("./serve-EHPDSJSX.js");
51
51
  await serveCommand(format);
52
52
  }
53
53
 
@@ -1,4 +1,5 @@
1
1
  import {
2
+ CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX,
2
3
  DEFAULT_BOT_LIST,
3
4
  buildTrafficProbeReport,
4
5
  extractJourneyRequests,
@@ -8,14 +9,14 @@ import {
8
9
  normalizeCloudflareWorkerEvent,
9
10
  sessionizeJourneyRequests,
10
11
  verifyRequestSignature
11
- } from "./chunk-TJ4UAO7R.js";
12
+ } from "./chunk-JHYLKXUV.js";
12
13
  import {
13
14
  currentOutcomeAttribution,
14
15
  getRequestContext,
15
16
  registerRequestContext,
16
17
  requestAuditIdentity,
17
18
  sanitizeRequestContext
18
- } from "./chunk-KLPRF4PA.js";
19
+ } from "./chunk-5JFEK7IL.js";
19
20
  import {
20
21
  SentimentIdempotencyConflict,
21
22
  SentimentRepository,
@@ -153,7 +154,7 @@ import {
153
154
  userSessions,
154
155
  users,
155
156
  writeNegativeReviewMaxStars
156
- } from "./chunk-QF5C3JXL.js";
157
+ } from "./chunk-ST7JA3UW.js";
157
158
  import {
158
159
  ADS_ACTIVATE_SCOPE,
159
160
  ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
@@ -260,6 +261,7 @@ import {
260
261
  JOURNEY_LIST_VISITS_PER_VISITOR,
261
262
  JOURNEY_LOOKBACK_DAYS,
262
263
  JOURNEY_MAX_REQUESTS_PER_VISITOR_DAY,
264
+ JOURNEY_PAGE_VIEWS_PENDING_REASON,
263
265
  JOURNEY_PARTIAL_SOURCE_TYPES,
264
266
  JOURNEY_RETENTION_DAYS,
265
267
  JOURNEY_VISIT_IDLE_MINUTES,
@@ -937,6 +939,7 @@ import {
937
939
  providerSummaryEntryDtoSchema,
938
940
  providersFailing,
939
941
  qualifiedNameIncludesName,
942
+ queryClassFilterSchema,
940
943
  queryDtoSchema,
941
944
  queryGenerateRequestSchema,
942
945
  queryGenerateResponseSchema,
@@ -1154,7 +1157,7 @@ import {
1154
1157
  wordpressSchemaDeployResultDtoSchema,
1155
1158
  wordpressSchemaStatusResultDtoSchema,
1156
1159
  wordpressStatusDtoSchema
1157
- } from "./chunk-HUO3YPKB.js";
1160
+ } from "./chunk-V3XAJCO3.js";
1158
1161
 
1159
1162
  // ../api-routes/src/user-session.ts
1160
1163
  import crypto2 from "crypto";
@@ -27366,6 +27369,22 @@ async function analyticsRoutes(app) {
27366
27369
  const project = resolveProject(app.db, request.params.name);
27367
27370
  const classifyQuery = projectQueryClassifier(project);
27368
27371
  const mentionShareScope = classifyQuery ? "non-brand" : "pooled";
27372
+ const parsedQueryClass = queryClassFilterSchema.safeParse(request.query.queryClass ?? "all");
27373
+ if (!parsedQueryClass.success) {
27374
+ throw validationError('"queryClass" must be one of: all, branded, non-brand', { issues: parsedQueryClass.error.issues });
27375
+ }
27376
+ const queryClass = parsedQueryClass.data;
27377
+ if (queryClass !== "all" && activeMeasurementPlan(app.db, project.id)?.plan.schemaVersion === 2) {
27378
+ throw validationError(
27379
+ `Query class "${queryClass}" on a published measurement plan follows its assignments. Read the split from GET /projects/${project.name}/visibility-report, or omit queryClass for pooled trends.`
27380
+ );
27381
+ }
27382
+ if (queryClass !== "all" && !classifyQuery) {
27383
+ throw validationError(
27384
+ `Query class "${queryClass}" needs a brand name or alias on this project. Add one, or omit queryClass for pooled trends.`
27385
+ );
27386
+ }
27387
+ const inQueryClass = (text) => queryClass === "all" || classifyQuery(text) === queryClass;
27369
27388
  const window2 = parseWindow(request.query.window);
27370
27389
  const cutoff = windowCutoff(window2);
27371
27390
  const projectRuns = app.db.select().from(runs).where(and37(
@@ -27379,6 +27398,7 @@ async function analyticsRoutes(app) {
27379
27398
  return reply.send({
27380
27399
  window: window2,
27381
27400
  mentionShareScope,
27401
+ queryClass,
27382
27402
  buckets: [],
27383
27403
  overall: { citationRate: 0, cited: 0, total: 0, mentionRate: 0, mentionedCount: 0 },
27384
27404
  byProvider: {},
@@ -27435,7 +27455,7 @@ async function analyticsRoutes(app) {
27435
27455
  // this far when its text matched the basket, so its key is never empty.)
27436
27456
  basketKey: normalizeQueryText(s.queryText ?? (s.queryId ? queryTextById.get(s.queryId) ?? "" : "")) || s.queryId || "",
27437
27457
  runBasketRevision: runBasketRevision.get(s.runId) ?? null
27438
- }));
27458
+ })).filter((s) => queryClass === "all" || s.queryClass === queryClass);
27439
27459
  const mentionShareCompetitors2 = mentionShareCompetitors(
27440
27460
  app.db.select(competitorIdentityColumns).from(competitors).where(eq46(competitors.projectId, project.id)).orderBy(competitors.domain).all()
27441
27461
  );
@@ -27601,17 +27621,17 @@ async function analyticsRoutes(app) {
27601
27621
  const trend = computeTrend(buckets, "citationRate");
27602
27622
  const mentionTrend = computeTrend(buckets, "mentionRate");
27603
27623
  const windowChange = computeWindowChange(buckets);
27604
- const queryChanges = computeQueryChanges(projectQueries, cutoff);
27624
+ const queryChanges = computeQueryChanges(projectQueries.filter((q) => inQueryClass(q.query)), cutoff);
27605
27625
  const basketChanges = basketRevisions.slice(1).map((rev, i) => {
27606
27626
  const previous = new Set(basketRevisions[i].members);
27607
27627
  const current = new Set(rev.members);
27608
27628
  return {
27609
27629
  revision: rev.revision,
27610
27630
  at: rev.createdAt,
27611
- added: rev.members.filter((m) => !previous.has(m)),
27612
- removed: basketRevisions[i].members.filter((m) => !current.has(m))
27631
+ added: rev.members.filter((m) => !previous.has(m) && inQueryClass(m)),
27632
+ removed: basketRevisions[i].members.filter((m) => !current.has(m) && inQueryClass(m))
27613
27633
  };
27614
- }).filter((change) => !cutoff || change.at >= cutoff);
27634
+ }).filter((change) => queryClass === "all" || change.added.length + change.removed.length > 0).filter((change) => !cutoff || change.at >= cutoff);
27615
27635
  const executionIdentityChanges = [];
27616
27636
  let previousExecutionChecksum = null;
27617
27637
  for (const run of projectRuns) {
@@ -27622,7 +27642,7 @@ async function analyticsRoutes(app) {
27622
27642
  }
27623
27643
  previousExecutionChecksum = identity.checksum;
27624
27644
  }
27625
- return reply.send({ window: window2, mentionShareScope, buckets, overall, byProvider, trend, mentionTrend, windowChange, queryChanges, basketChanges, executionIdentityChanges, referenceBasketRevision: latestBasket?.revision ?? null, modelAttribution, servedModelAttribution, modelServiceMismatch, modelPointerChanges, competitorIdentityChangedAt: readCompetitorIdentityChangedAt(app.db, project.id), competitorSetChangedAt: readCompetitorSetChangedAt(app.db, project.id) });
27645
+ return reply.send({ window: window2, mentionShareScope, queryClass, buckets, overall, byProvider, trend, mentionTrend, windowChange, queryChanges, basketChanges, executionIdentityChanges, referenceBasketRevision: latestBasket?.revision ?? null, modelAttribution, servedModelAttribution, modelServiceMismatch, modelPointerChanges, competitorIdentityChangedAt: readCompetitorIdentityChangedAt(app.db, project.id), competitorSetChangedAt: readCompetitorSetChangedAt(app.db, project.id) });
27626
27646
  });
27627
27647
  app.get("/projects/:name/analytics/gaps", async (request, reply) => {
27628
27648
  const project = resolveProject(app.db, request.params.name);
@@ -28845,6 +28865,14 @@ async function trafficSamplesRoutes(app) {
28845
28865
  import crypto28 from "crypto";
28846
28866
  import { and as and42, asc as asc10, count as count4, desc as desc23, eq as eq50, gt as gt4, gte as gte10, inArray as inArray27, lt as lt8, lte as lte9, sql as sql15 } from "drizzle-orm";
28847
28867
  import "zod";
28868
+
28869
+ // ../api-routes/src/cloudflare-worker-version.ts
28870
+ var CURRENT_CLOUDFLARE_WORKER_VERSION = "1.0.1";
28871
+ function cloudflareWorkerVersionFor(options) {
28872
+ return `${CURRENT_CLOUDFLARE_WORKER_VERSION}${options.forwardPageViews ? CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX : ""}`;
28873
+ }
28874
+
28875
+ // ../api-routes/src/journeys.ts
28848
28876
  var DAY_MS = 24 * 60 * 6e4;
28849
28877
  var IDLE_MS = JOURNEY_VISIT_IDLE_MINUTES * 6e4;
28850
28878
  var LOOKBACK_MS = JOURNEY_LOOKBACK_DAYS * DAY_MS;
@@ -29135,7 +29163,27 @@ function visitsByVisitor(db, projectId, keys) {
29135
29163
  }
29136
29164
  function partialSources(db, projectId) {
29137
29165
  const types = Object.keys(JOURNEY_PARTIAL_SOURCE_TYPES);
29138
- return db.select({ id: trafficSources.id, sourceType: trafficSources.sourceType, status: trafficSources.status }).from(trafficSources).where(and42(eq50(trafficSources.projectId, projectId), inArray27(trafficSources.sourceType, types))).orderBy(asc10(trafficSources.id)).all().filter((row) => row.status !== TrafficSourceStatuses.archived).map((row) => ({ sourceId: row.id, sourceType: row.sourceType, reason: JOURNEY_PARTIAL_SOURCE_TYPES[row.sourceType] }));
29166
+ const rows = db.select({
29167
+ id: trafficSources.id,
29168
+ sourceType: trafficSources.sourceType,
29169
+ status: trafficSources.status,
29170
+ configJson: trafficSources.configJson,
29171
+ lastWorkerVersion: trafficSources.lastWorkerVersion
29172
+ }).from(trafficSources).where(and42(eq50(trafficSources.projectId, projectId), inArray27(trafficSources.sourceType, types))).orderBy(asc10(trafficSources.id)).all();
29173
+ const out = [];
29174
+ for (const row of rows) {
29175
+ if (row.status === TrafficSourceStatuses.archived) continue;
29176
+ let reason = JOURNEY_PARTIAL_SOURCE_TYPES[row.sourceType];
29177
+ if (row.sourceType === TrafficSourceTypes.cloudflare) {
29178
+ const config = cloudflareTrafficSourceConfigSchema.safeParse(row.configJson);
29179
+ if (config.success && config.data.forwardPageViews) {
29180
+ if (row.lastWorkerVersion === cloudflareWorkerVersionFor({ forwardPageViews: true })) continue;
29181
+ reason = JOURNEY_PAGE_VIEWS_PENDING_REASON;
29182
+ }
29183
+ }
29184
+ out.push({ sourceId: row.id, sourceType: row.sourceType, reason });
29185
+ }
29186
+ return out;
29139
29187
  }
29140
29188
  function median(values) {
29141
29189
  if (values.length === 0) return null;
@@ -34260,6 +34308,12 @@ var sourcesQueryClassParameter = {
34260
34308
  description: "Restrict to branded or non-brand answers. With an active v2 measurement plan the class comes from each run's frozen plan assignments (the same answers as the competitor landscape at scope=all-markets); otherwise from the project's brand-name classifier over the query text. Answers neither basis can place are excluded and counted in unclassifiedAnswers. Defaults to all, which pools both classes.",
34261
34309
  schema: { type: "string", enum: ["all", "branded", "non-brand"] }
34262
34310
  };
34311
+ var metricsQueryClassParameter = {
34312
+ name: "queryClass",
34313
+ in: "query",
34314
+ description: "Restrict every rate, bucket, change and query-set event to branded or non-brand answers, classified from the query text by the project's brand names (the same split mention share uses). Mention share stays non-brand, so it is empty under branded. Bucket boundaries do not move with the class, so the two classes plot on the same dates. 400 when the project has no brand name or alias to classify with, or has a published v2 measurement plan (its classes live on the plan assignments; read the split from the visibility report). Defaults to all, which pools both classes.",
34315
+ schema: { type: "string", enum: ["all", "branded", "non-brand"] }
34316
+ };
34263
34317
  var sourcesIncludeByQueryParameter = {
34264
34318
  name: "includeByQuery",
34265
34319
  in: "query",
@@ -36774,9 +36828,10 @@ var routeCatalog = [
36774
36828
  path: "/api/v1/projects/{name}/analytics/metrics",
36775
36829
  summary: "Get citation trend analytics",
36776
36830
  tags: ["analytics"],
36777
- parameters: [nameParameter, analyticsWindowParameter],
36831
+ parameters: [nameParameter, analyticsWindowParameter, metricsQueryClassParameter],
36778
36832
  responses: {
36779
36833
  200: jsonResponse("Citation metrics returned.", "BrandMetricsDto"),
36834
+ 400: errorResponse("Invalid query parameters."),
36780
36835
  404: errorResponse("Project not found.")
36781
36836
  }
36782
36837
  },
@@ -60194,9 +60249,6 @@ import { isIP } from "net";
60194
60249
  import { isDeepStrictEqual } from "util";
60195
60250
  import { and as and69, desc as desc39, eq as eq80, gt as gt7, gte as gte19, inArray as inArray34, lt as lt13, lte as lte20, sql as sql30 } from "drizzle-orm";
60196
60251
 
60197
- // ../api-routes/src/cloudflare-worker-version.ts
60198
- var CURRENT_CLOUDFLARE_WORKER_VERSION = "1.0.1";
60199
-
60200
60252
  // ../api-routes/src/traffic-limits.ts
60201
60253
  var VERCEL_MAX_SYNC_WINDOW_MS = 24 * 60 * 6e4;
60202
60254
  var DEFAULT_VERCEL_SYNC_DEADLINE_MS = 4 * 6e4;
@@ -61985,6 +62037,19 @@ async function loadQueueReceiptPolicy(db, sourceId, readRetentionSeconds, warn2)
61985
62037
  const floorMs = floorExpiry ? Date.parse(floorExpiry) : 0;
61986
62038
  return { ttlMsAt: (receivedAt) => Math.max(ttlMs, floorMs - Date.parse(receivedAt)) };
61987
62039
  }
62040
+ function cloudflarePageViewInstructions(forwardPageViews, deliveryMode) {
62041
+ if (!forwardPageViews) return [];
62042
+ const lines = [
62043
+ "This Worker also forwards page views (document loads and form posts), so AI visitor journeys record later visits.",
62044
+ "Each page view becomes one Worker delivery: expect more Worker CPU and Canonry ingest volume on busy sites."
62045
+ ];
62046
+ if (deliveryMode === CloudflareTrafficDeliveryModes["queue-pull"]) {
62047
+ lines.push(
62048
+ "Each page view is one Queue message (3 Queue operations). Each sync drains for up to 4 minutes by default; if doctor reports more than 1,000 messages left after syncs, shorten the traffic-sync interval or raise CANONRY_CLOUDFLARE_QUEUE_SYNC_DEADLINE_MS."
62049
+ );
62050
+ }
62051
+ return lines;
62052
+ }
61988
62053
  function parseDirectPushCloudflareSourceConfig(config) {
61989
62054
  const parsed = cloudflareTrafficSourceConfigSchema.safeParse(config);
61990
62055
  return parsed.success && parsed.data.deliveryMode === CloudflareTrafficDeliveryModes["direct-push"] ? parsed.data : null;
@@ -63103,11 +63168,13 @@ async function trafficRoutes(app, opts) {
63103
63168
  if (sameModeSource) attempt.update({ action: "reauth" });
63104
63169
  const sourceId2 = sameModeSource?.id ?? crypto52.randomUUID();
63105
63170
  const previousCredential2 = credentialStore.getConnectionBySourceId(sourceId2);
63106
- const workerVersion2 = CURRENT_CLOUDFLARE_WORKER_VERSION;
63171
+ const forwardPageViews2 = parsed.data.forwardPageViews ?? (sameModeSource ? parseQueuePullCloudflareSourceConfig(sameModeSource.configJson)?.forwardPageViews : void 0) ?? false;
63172
+ const workerVersion2 = cloudflareWorkerVersionFor({ forwardPageViews: forwardPageViews2 });
63107
63173
  const workerScript2 = generateWorkerScript({
63108
63174
  deliveryMode: "queue-pull",
63109
63175
  workerVersion: workerVersion2,
63110
- botList: DEFAULT_BOT_LIST
63176
+ botList: DEFAULT_BOT_LIST,
63177
+ forwardPageViews: forwardPageViews2
63111
63178
  });
63112
63179
  const wranglerToml2 = generateWranglerToml({
63113
63180
  deliveryMode: "queue-pull",
@@ -63124,6 +63191,7 @@ async function trafficRoutes(app, opts) {
63124
63191
  workerVersion: workerVersion2,
63125
63192
  expectedBotListVersion: DEFAULT_BOT_LIST.version,
63126
63193
  zoneId: zoneId2 ?? null,
63194
+ forwardPageViews: forwardPageViews2,
63127
63195
  accountId: accountId2,
63128
63196
  queueId,
63129
63197
  queueName,
@@ -63219,12 +63287,14 @@ async function trafficRoutes(app, opts) {
63219
63287
  workerScript: workerScript2,
63220
63288
  wranglerToml: wranglerToml2,
63221
63289
  workerVersion: workerVersion2,
63290
+ forwardPageViews: forwardPageViews2,
63222
63291
  instructions: [
63223
63292
  "Deploy this Worker to your Cloudflare zone:",
63224
63293
  " 1. Save worker.js and wrangler.toml; neither file contains Queue credentials",
63225
63294
  ` 2. Enable the Queue HTTP pull consumer: wrangler queues consumer http add ${queueName}`,
63226
63295
  ` 3. Attach ${workerRouteHost2}/* in the Cloudflare Dashboard with Fail open`,
63227
63296
  ` 4. Canonry pulls Queue ${queueName}; activate this source after the route is live.`,
63297
+ ...cloudflarePageViewInstructions(forwardPageViews2, CloudflareTrafficDeliveryModes["queue-pull"]),
63228
63298
  `Source id: ${sourceRow3.id}`
63229
63299
  ].join("\n")
63230
63300
  };
@@ -63253,17 +63323,19 @@ async function trafficRoutes(app, opts) {
63253
63323
  const previousAccountId = reusableCredential?.accountId ?? parsedActiveConfig?.accountId ?? null;
63254
63324
  const effectiveZoneId = zoneId ?? previousZoneId;
63255
63325
  const effectiveAccountId = accountId ?? previousAccountId;
63326
+ const forwardPageViews = parsed.data.forwardPageViews ?? parsedActiveConfig?.forwardPageViews ?? false;
63256
63327
  const bearerToken = reusableCredential?.bearerToken ?? `cnry_cfw_${crypto52.randomBytes(32).toString("hex")}`;
63257
63328
  const hmacSecret = reusableCredential?.hmacSecret ?? crypto52.randomBytes(32).toString("hex");
63258
63329
  const ingestTokenHash = sha256Hex3(bearerToken);
63259
63330
  const ingestUrl = opts.cloudflareTrafficIngestUrl.replace("{name}", encodeURIComponent(project.name));
63260
63331
  assertCloudflareIngestUrlIsPublicHttps(ingestUrl);
63261
63332
  assertCloudflareIngestUrlOutsideWorkerRoute(ingestUrl, workerRouteHost);
63262
- const workerVersion = CURRENT_CLOUDFLARE_WORKER_VERSION;
63333
+ const workerVersion = cloudflareWorkerVersionFor({ forwardPageViews });
63263
63334
  const workerScript = generateWorkerScript({
63264
63335
  deliveryMode,
63265
63336
  workerVersion,
63266
- botList: DEFAULT_BOT_LIST
63337
+ botList: DEFAULT_BOT_LIST,
63338
+ forwardPageViews
63267
63339
  });
63268
63340
  const wranglerToml = generateWranglerToml({
63269
63341
  deliveryMode,
@@ -63280,7 +63352,8 @@ async function trafficRoutes(app, opts) {
63280
63352
  workerVersion,
63281
63353
  expectedBotListVersion: DEFAULT_BOT_LIST.version,
63282
63354
  zoneId: effectiveZoneId,
63283
- accountId: effectiveAccountId
63355
+ accountId: effectiveAccountId,
63356
+ forwardPageViews
63284
63357
  };
63285
63358
  const fallbackName = displayName ?? activeSource?.displayName ?? `Cloudflare \xB7 ${effectiveZoneId ?? sourceId.slice(0, 8)}`;
63286
63359
  credentialStore.upsertConnection({
@@ -63383,6 +63456,7 @@ async function trafficRoutes(app, opts) {
63383
63456
  ` 5. In the Cloudflare Dashboard route form, select \`${workerRouteHost}/*\` and this Worker`,
63384
63457
  " 6. Set Request limit failure mode to Fail open, then save the route; Wrangler cannot set this toggle",
63385
63458
  " 7. Keep the Canonry ingest hostname outside this Worker route to avoid recursion",
63459
+ ...cloudflarePageViewInstructions(forwardPageViews, CloudflareTrafficDeliveryModes["direct-push"]),
63386
63460
  "",
63387
63461
  `Source id: ${sourceRow2.id}`,
63388
63462
  "After deploy, check `canonry doctor --project " + project.name + "` to confirm events are arriving."
@@ -63394,6 +63468,7 @@ async function trafficRoutes(app, opts) {
63394
63468
  workerScript,
63395
63469
  wranglerToml,
63396
63470
  workerVersion,
63471
+ forwardPageViews,
63397
63472
  instructions
63398
63473
  };
63399
63474
  }));
@@ -68996,7 +69071,7 @@ var workerVersionCheck = {
68996
69071
  };
68997
69072
  }
68998
69073
  const measured = sources.map((source) => {
68999
- const expectedVersion = CURRENT_CLOUDFLARE_WORKER_VERSION;
69074
+ const expectedVersion = cloudflareWorkerVersionFor({ forwardPageViews: source.configJson.forwardPageViews === true });
69000
69075
  const observedVersion = source.lastWorkerVersion;
69001
69076
  const state = observedVersion === null ? "waiting-for-first-event" : observedVersion === expectedVersion ? "current" : "stale";
69002
69077
  return {
@@ -5,7 +5,7 @@ import {
5
5
  AppError,
6
6
  parseWindowIn,
7
7
  resolveDateRange
8
- } from "./chunk-HUO3YPKB.js";
8
+ } from "./chunk-V3XAJCO3.js";
9
9
 
10
10
  // src/cli-access.ts
11
11
  var CLI_ACCESS_BY_ID = Object.freeze({
@@ -6,12 +6,12 @@ import {
6
6
  import {
7
7
  createApiClient,
8
8
  runWithUsageTags
9
- } from "./chunk-PTKFLEVN.js";
9
+ } from "./chunk-XRQCRDTF.js";
10
10
  import {
11
11
  canonryMcpTools,
12
12
  mcpOutputSchema,
13
13
  toolOperationAccess
14
- } from "./chunk-LWKHCQ46.js";
14
+ } from "./chunk-GDVMHIY4.js";
15
15
  import {
16
16
  PACKAGE_VERSION
17
17
  } from "./chunk-AOJU5LKX.js";
@@ -24,7 +24,7 @@ import {
24
24
  isReadOnlyKey,
25
25
  restrictedWriteScopes,
26
26
  upgradeCaveatFor
27
- } from "./chunk-HUO3YPKB.js";
27
+ } from "./chunk-V3XAJCO3.js";
28
28
 
29
29
  // src/mcp/server.ts
30
30
  import { randomUUID } from "crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hostMatchesDomain
3
- } from "./chunk-HUO3YPKB.js";
3
+ } from "./chunk-V3XAJCO3.js";
4
4
 
5
5
  // src/citation-utils.ts
6
6
  function pickProjectCitedDomain(citedDomains, projectDomains) {
@@ -20,7 +20,7 @@ import {
20
20
  templateLinkRatio,
21
21
  templateLinkUbiquityAvailable,
22
22
  validationError
23
- } from "./chunk-HUO3YPKB.js";
23
+ } from "./chunk-V3XAJCO3.js";
24
24
  import {
25
25
  __export
26
26
  } from "./chunk-MLKGABMK.js";
@@ -15,7 +15,7 @@ import {
15
15
  formatCanonryPluginUpdateHint,
16
16
  formatCanonryPluginVersionMismatch,
17
17
  skillsClientSchema
18
- } from "./chunk-HUO3YPKB.js";
18
+ } from "./chunk-V3XAJCO3.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-FA7RDZ43.js";
8
+ } from "./chunk-HF4ARGGH.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-HUO3YPKB.js";
21
+ } from "./chunk-V3XAJCO3.js";
22
22
 
23
23
  // src/runtime-context.ts
24
24
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-EJZ4TQQR.js";
5
+ } from "./chunk-TQLXCGRD.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-FA7RDZ43.js";
8
+ } from "./chunk-HF4ARGGH.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-KLPRF4PA.js";
11
+ } from "./chunk-5JFEK7IL.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-HUO3YPKB.js";
22
+ } from "./chunk-V3XAJCO3.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-PTKFLEVN.js";
3
+ } from "./chunk-XRQCRDTF.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-EED2QEE7.js";
10
+ } from "./chunk-M6KKI7FB.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-HUO3YPKB.js";
40
+ } from "./chunk-V3XAJCO3.js";
41
41
 
42
42
  // src/commands/measurement-plan.ts
43
43
  import crypto from "crypto";