@canonry/canonry 7.58.5 → 7.60.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 (132) hide show
  1. package/assets/agent-workspace/skills/aero/SKILL.md +2 -1
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +48 -4
  3. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +34 -0
  4. package/assets/assets/{AgentSetupPage-CoD9a386.js → AgentSetupPage-xAe2RSTQ.js} +1 -1
  5. package/assets/assets/{AuditHistoryPanel-DSUKF9GC.js → AuditHistoryPanel-DRGMxc1o.js} +1 -1
  6. package/assets/assets/{BacklinksPage-DIZy0NkW.js → BacklinksPage-OS6r_MtQ.js} +1 -1
  7. package/assets/assets/{HistoryPage-B2Xtxu5L.js → HistoryPage-RDxUN7rD.js} +1 -1
  8. package/assets/assets/{MeasurementPropertyPage-BZmvjMiS.js → MeasurementPropertyPage-BVAmJBKa.js} +1 -1
  9. package/assets/assets/{ProjectPage-DMIoYBCF.js → ProjectPage-BWY9eFFx.js} +1 -1
  10. package/assets/assets/{RunsPage-DtvesLu2.js → RunsPage-Fb7IM6iV.js} +1 -1
  11. package/assets/assets/{SettingsPage-BjE3d5Ae.js → SettingsPage-Dz_agQCf.js} +1 -1
  12. package/assets/assets/{SiteHealthSection-D6RLbM2o.js → SiteHealthSection-TXp2Cszl.js} +2 -2
  13. package/assets/assets/ToneBadge-DZzQvXs_.js +60 -0
  14. package/assets/assets/{TrafficPage-CHZlfMgd.js → TrafficPage-BKfgooKl.js} +1 -1
  15. package/assets/assets/{TrafficSourceDetailPage-Dp7AYvRP.js → TrafficSourceDetailPage-C1HM_4Mh.js} +1 -1
  16. package/assets/assets/{account-context-DHWaWJSr.js → account-context-sj3dKq-a.js} +1 -1
  17. package/assets/assets/{card-im88-x1b.js → card-DKV0mNmm.js} +1 -1
  18. package/assets/assets/{extract-error-message-Bq8oNvfF.js → extract-error-message-Tfdo6vAJ.js} +1 -1
  19. package/assets/assets/{format-helpers-DOEct2q8.js → format-helpers-BagbvnfZ.js} +1 -1
  20. package/assets/assets/{index-CgAMnZFS.js → index-7G0DHKIO.js} +4 -4
  21. package/assets/assets/{query-client-BN_-qp71.js → query-client-7P_Wczfa.js} +1 -1
  22. package/assets/assets/{react-query-P6OZ-MPl.js → react-query-agN8P-yg.js} +1 -1
  23. package/assets/assets/{react-sigma_core.esm.min-TGwpCHs4.js → react-sigma_core.esm.min-CHz1PIYq.js} +1 -1
  24. package/assets/assets/{service-CUJkePNp.js → service-CAV4dMit.js} +1 -1
  25. package/assets/index.html +7 -7
  26. package/dist/{ads-BMBXQB67.js → ads-A42JBQ5Q.js} +3 -3
  27. package/dist/{agent-S6CU36RL.js → agent-ZKKHPMOB.js} +7 -7
  28. package/dist/{agent-ask-XG7WQBX6.js → agent-ask-SMV76QZM.js} +3 -3
  29. package/dist/{agent-conversations-C4QBZAPC.js → agent-conversations-O5QA3MHR.js} +3 -3
  30. package/dist/{agent-memory-I7UJ7MKH.js → agent-memory-ZRJQ6SZU.js} +3 -3
  31. package/dist/{agent-providers-YHRIYJDT.js → agent-providers-EOXIPRXN.js} +3 -3
  32. package/dist/{agent-transcript-2WICUOEW.js → agent-transcript-4TB2VI5E.js} +3 -3
  33. package/dist/{analytics-Y5AGSYWD.js → analytics-KSHS32RJ.js} +3 -3
  34. package/dist/{apply-DLVLMU3O.js → apply-4ZZMONED.js} +3 -3
  35. package/dist/{backfill-SINDWLD3.js → backfill-DJIIN5ZR.js} +9 -9
  36. package/dist/{backlinks-TEZTPNZ5.js → backlinks-XIAPORR5.js} +3 -3
  37. package/dist/{bing-IIA5HLND.js → bing-QDZXI334.js} +3 -3
  38. package/dist/{bootstrap-AKGA3BJI.js → bootstrap-7RAGKHJZ.js} +10 -10
  39. package/dist/{cdp-WWOFWFYU.js → cdp-3OX3WGWN.js} +7 -7
  40. package/dist/{chunk-4P7NK7XM.js → chunk-2IBFY7KQ.js} +2 -2
  41. package/dist/{chunk-SCS7R2ND.js → chunk-3JV3PWNA.js} +128 -1
  42. package/dist/{chunk-QEJBAPDP.js → chunk-4IV4FO3O.js} +2616 -2055
  43. package/dist/{chunk-27SGL3DF.js → chunk-66C7YITH.js} +1 -1
  44. package/dist/{chunk-TH3NNUJW.js → chunk-7HZ7KRHT.js} +5 -1
  45. package/dist/{chunk-O6TF6TPM.js → chunk-7KEIZ5OO.js} +8 -8
  46. package/dist/{chunk-YJPQBJZO.js → chunk-7XSGAPN5.js} +48 -3
  47. package/dist/{chunk-NWYNTYPD.js → chunk-ADY24WBX.js} +4 -4
  48. package/dist/{chunk-N2HCXIQ3.js → chunk-D7ZU5LMK.js} +1 -1
  49. package/dist/{chunk-BP5OKJIC.js → chunk-DUYENNUI.js} +2 -2
  50. package/dist/{chunk-52NCZIAC.js → chunk-FCPIOH6P.js} +1 -1
  51. package/dist/{chunk-CYVQW32W.js → chunk-FKQPVB5B.js} +21 -20
  52. package/dist/{chunk-IFVTHGXG.js → chunk-G7VJEPDZ.js} +2 -2
  53. package/dist/{chunk-U65LWABS.js → chunk-GLFE3Q3C.js} +7 -3
  54. package/dist/{chunk-QSPLYPVA.js → chunk-HGBIJIVM.js} +1 -1
  55. package/dist/{chunk-WLIGKWVB.js → chunk-HV5MGQYI.js} +3 -3
  56. package/dist/{chunk-4UGM5YV4.js → chunk-I32IFAB3.js} +3 -3
  57. package/dist/{chunk-G34BVUMF.js → chunk-IDPAYZHR.js} +1 -1
  58. package/dist/{chunk-Y7NX6EIK.js → chunk-JDL4QAPT.js} +2666 -2407
  59. package/dist/{chunk-5D4RL23M.js → chunk-L7WQTD3D.js} +5 -5
  60. package/dist/{chunk-6IBLGQVZ.js → chunk-NQTUPEBQ.js} +1 -1
  61. package/dist/{chunk-Q4J3XSWE.js → chunk-O7KIDW4H.js} +347 -10
  62. package/dist/{chunk-A5F5E4DL.js → chunk-OA6N3BI7.js} +4 -4
  63. package/dist/{chunk-3U7LL3JM.js → chunk-QCSNNKFI.js} +1 -1
  64. package/dist/{chunk-TVANRUBO.js → chunk-QEG7BSLH.js} +8 -1
  65. package/dist/{chunk-AP7YSOFC.js → chunk-QRC6SDPF.js} +417 -331
  66. package/dist/{chunk-65YQFVJM.js → chunk-RLXNZRHD.js} +5 -5
  67. package/dist/{chunk-F6W7FCS2.js → chunk-SJNF5GN2.js} +26 -2
  68. package/dist/{chunk-JGRUCEL4.js → chunk-TLNHDCJF.js} +2 -2
  69. package/dist/{chunk-L7TKNHEX.js → chunk-UHE4RLFW.js} +1 -1
  70. package/dist/{chunk-YDSY5YJE.js → chunk-XJF7LMGU.js} +4 -4
  71. package/dist/{chunk-ZYL3LCDZ.js → chunk-Z63ZR6AD.js} +1 -1
  72. package/dist/{chunk-KWXARGCT.js → chunk-Z7WG6F7Q.js} +3 -3
  73. package/dist/{chunk-4TM4NXQR.js → chunk-ZK5WIVGA.js} +2 -2
  74. package/dist/{citations-4LVBHTDX.js → citations-L3HFNQVU.js} +3 -3
  75. package/dist/{cli-catalog-PJYR3JHX.js → cli-catalog-DJPRREDK.js} +3 -3
  76. package/dist/{cli-commands-ZPW3OST3.js → cli-commands-4KG4X76Z.js} +7 -7
  77. package/dist/cli.js +14 -14
  78. package/dist/{competitor-T7UXAW4F.js → competitor-Q5LZ26U5.js} +3 -3
  79. package/dist/{content-DFYYGGPI.js → content-WRVFNQSO.js} +3 -3
  80. package/dist/{dashboard-VT3GQRW4.js → dashboard-GBP2T2AG.js} +6 -6
  81. package/dist/{demo-ZBNVULOO.js → demo-JMLMPLJ6.js} +1 -1
  82. package/dist/{demo-server-QUW4TDJL.js → demo-server-AOVPBGZ7.js} +11 -11
  83. package/dist/{discover-QTC5OBQG.js → discover-SKUNZE4Y.js} +3 -3
  84. package/dist/{discover-eval-QQZGUPR6.js → discover-eval-57BEDSQN.js} +3 -3
  85. package/dist/{doctor-VHFDL5MH.js → doctor-DMLJGH6G.js} +3 -3
  86. package/dist/{evidence-4PRFOC2I.js → evidence-J4XF4W7O.js} +3 -3
  87. package/dist/{export-cmd-BQE7BPKZ.js → export-cmd-3JXT2YAP.js} +3 -3
  88. package/dist/{ga-ULY5XDBK.js → ga-KHILAPMC.js} +3 -3
  89. package/dist/{gbp-4WHNZAFY.js → gbp-PHOFQZNT.js} +3 -3
  90. package/dist/{google-O4IVWLSG.js → google-QOLM2NBI.js} +4 -4
  91. package/dist/{google-marketing-DCQDTDDG.js → google-marketing-N37WUWNL.js} +1 -1
  92. package/dist/{health-cmd-I2JTACS7.js → health-cmd-2FUEPUJZ.js} +3 -3
  93. package/dist/{history-LUPHO3P3.js → history-MOSRCLAD.js} +3 -3
  94. package/dist/index.d.ts +818 -64
  95. package/dist/index.js +24 -24
  96. package/dist/{init-C2DLDK6T.js → init-V6ER2PJV.js} +11 -11
  97. package/dist/{insights-GC2W45U4.js → insights-F3MT66IV.js} +3 -3
  98. package/dist/intelligence-service-S5DI74LD.js +15 -0
  99. package/dist/journeys-DNS3EZNK.js +122 -0
  100. package/dist/{keys-DXQBSOBI.js → keys-NPOLKCWZ.js} +3 -3
  101. package/dist/{keyword-2DCR2QCJ.js → keyword-AXEPIJQ7.js} +3 -3
  102. package/dist/{logs-H45QFIEB.js → logs-ECEDVUTX.js} +3 -3
  103. package/dist/{mcp-NXXP6M3C.js → mcp-HUIRIY74.js} +2 -2
  104. package/dist/mcp.js +9 -9
  105. package/dist/{measurement-plan-IG4JUKKW.js → measurement-plan-5Y2IHH43.js} +5 -5
  106. package/dist/{notify-BLLWXMBB.js → notify-PIFCJ7WM.js} +3 -3
  107. package/dist/{organic-evidence-73K7W7SB.js → organic-evidence-S2IE5XV6.js} +3 -3
  108. package/dist/{overview-4TAULPUG.js → overview-TZT7C4U4.js} +4 -4
  109. package/dist/{project-ANX4JTWS.js → project-HIY673Y5.js} +3 -3
  110. package/dist/{query-U3MFTLGR.js → query-FUJIMFJQ.js} +3 -3
  111. package/dist/{research-3YZ6QI67.js → research-ECGEXWID.js} +3 -3
  112. package/dist/{results-export-72OVLKSC.js → results-export-7DRGFNUX.js} +3 -3
  113. package/dist/{run-SI6IL4FC.js → run-4JEDD5VT.js} +4 -4
  114. package/dist/{schedule-FYEHU2VH.js → schedule-NRHQXHTW.js} +3 -3
  115. package/dist/{search-MXDT3DQE.js → search-M7PNZZZL.js} +3 -3
  116. package/dist/{serve-ME2KJ6BG.js → serve-RXLQEALQ.js} +56 -27
  117. package/dist/{session-R3PRJ3RB.js → session-MCSZQR5V.js} +12 -12
  118. package/dist/{settings-ZGS26QOP.js → settings-JXOYI7VV.js} +3 -3
  119. package/dist/{skills-ZMMCKKSA.js → skills-SRUXD2PV.js} +2 -2
  120. package/dist/{snapshot-5AGGUQKE.js → snapshot-7N4BEGGM.js} +3 -3
  121. package/dist/{src-AIM5FPLZ.js → src-ZAAE3NIM.js} +8 -2
  122. package/dist/{status-HVQI4E5X.js → status-5OYYSMAY.js} +4 -4
  123. package/dist/{technical-aeo-S4OFCURE.js → technical-aeo-464OUUWT.js} +3 -3
  124. package/dist/{telemetry-SPSC5MUN.js → telemetry-BZFNXACR.js} +4 -4
  125. package/dist/{tools-VZVQ2CTU.js → tools-YVWC3NTG.js} +11 -11
  126. package/dist/{traffic-5AXVN37M.js → traffic-WXJHRB7H.js} +13 -8
  127. package/dist/{users-WFKSUCGV.js → users-U2UNKGDY.js} +3 -3
  128. package/dist/{visibility-stats-5S26GC27.js → visibility-stats-AHGME46N.js} +3 -3
  129. package/dist/{wordpress-IUPZC7II.js → wordpress-FUVFZKH2.js} +3 -3
  130. package/package.json +1 -1
  131. package/assets/assets/ToneBadge-DYEbxp5S.js +0 -60
  132. package/dist/intelligence-service-R5BRSQKI.js +0 -15
@@ -5,7 +5,7 @@ import {
5
5
  isStoredPageReadTool,
6
6
  isStoredReadTool,
7
7
  truncateToolResult
8
- } from "./chunk-A5F5E4DL.js";
8
+ } from "./chunk-OA6N3BI7.js";
9
9
  import {
10
10
  CANONRY_MCP_TOOLKITS
11
11
  } from "./chunk-NCIPNVD6.js";
@@ -22,15 +22,15 @@ import {
22
22
  resolveApiKeyFor,
23
23
  resolveModelForProvider,
24
24
  validateAgentProviderRegistry
25
- } from "./chunk-TVANRUBO.js";
25
+ } from "./chunk-QEG7BSLH.js";
26
26
  import {
27
27
  CanonryMcpToolNames,
28
28
  canonryMcpTools
29
- } from "./chunk-YJPQBJZO.js";
29
+ } from "./chunk-7XSGAPN5.js";
30
30
  import {
31
31
  agentToolEvents,
32
32
  llmUsageEvents
33
- } from "./chunk-SCS7R2ND.js";
33
+ } from "./chunk-3JV3PWNA.js";
34
34
  import {
35
35
  MeasurementPortfolioLists,
36
36
  agentTurnLimitsSchema,
@@ -38,7 +38,7 @@ import {
38
38
  describeError,
39
39
  validationError,
40
40
  visibilityReportRequestSchema
41
- } from "./chunk-Y7NX6EIK.js";
41
+ } from "./chunk-JDL4QAPT.js";
42
42
 
43
43
  // src/agent/session.ts
44
44
  import fs3 from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cloudflareQueueNameSchema
3
- } from "./chunk-Y7NX6EIK.js";
3
+ } from "./chunk-JDL4QAPT.js";
4
4
 
5
5
  // src/cloudflare-traffic-config.ts
6
6
  function unsupportedDeliveryMode(deliveryMode) {
@@ -5,9 +5,10 @@ import {
5
5
  TrafficEvidenceKinds,
6
6
  TrafficSourceTypes,
7
7
  classifyAiReferralTrafficClass,
8
+ classifyJourneyEntry,
8
9
  hostMatchesDomain,
9
10
  hostOf
10
- } from "./chunk-Y7NX6EIK.js";
11
+ } from "./chunk-JDL4QAPT.js";
11
12
 
12
13
  // ../integration-traffic/src/ip-ranges/amazonbot.json
13
14
  var amazonbot_default = {
@@ -14506,14 +14507,321 @@ function classifyAiReferral(event) {
14506
14507
  return null;
14507
14508
  }
14508
14509
 
14510
+ // ../integration-traffic/src/journey.ts
14511
+ var ASSET_EXTENSION_PATTERN = /\.(?:avif|bmp|css|gif|ico|jpe?g|js|map|mjs|mp3|mp4|otf|png|svg|ttf|txt|webm|webmanifest|webp|woff2?|xml)$/i;
14512
+ var ASSET_PATH_PREFIXES = ["/_next/static/", "/_nuxt/", "/_ipx/", "/_vercel/", "/assets/", "/build/", "/dist/", "/fonts/", "/images/", "/img/", "/static/", "/wp-content/", "/wp-includes/", "/cdn-cgi/"];
14513
+ var DATA_PATH_PATTERN = /\.json$|^\/api\/|^\/wp-json\/|^\/graphql/i;
14514
+ var NON_BROWSER_PATTERN = /bot|crawl|spider|slurp|scrape|curl\/|wget|python|java\/|go-http|okhttp|axios|node-fetch|headless|phantom|lighthouse|pingdom|uptime|monitor|preview|facebookexternalhit|whatsapp|telegram|discord|slack/i;
14515
+ var KEPT_QUERY_PARAMETERS = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
14516
+ var AD_CLICK_ID_PARAMETERS = ["gclid", "gbraid", "wbraid", "dclid", "msclkid", "ttclid", "li_fat_id"];
14517
+ var NETWORK_CLICK_ID_PARAMETERS = { fbclid: "Facebook", twclid: "X" };
14518
+ var STEP_REFERER_HOSTS = [
14519
+ "accounts.google.com",
14520
+ "accounts.youtube.com",
14521
+ "pay.google.com",
14522
+ "appleid.apple.com",
14523
+ "login.microsoftonline.com",
14524
+ "login.live.com",
14525
+ "login.microsoft.com",
14526
+ "github.com/login",
14527
+ "checkout.stripe.com",
14528
+ "js.stripe.com",
14529
+ "hooks.stripe.com",
14530
+ "pay.stripe.com",
14531
+ "connect.stripe.com",
14532
+ "paypal.com",
14533
+ "pay.amazon.com",
14534
+ "checkout.shopify.com",
14535
+ "shop.app",
14536
+ "klarna.com",
14537
+ "afterpay.com",
14538
+ "squareup.com",
14539
+ "checkout.square.site",
14540
+ "adyen.com",
14541
+ "braintreegateway.com",
14542
+ "auth0.com",
14543
+ "okta.com",
14544
+ "onelogin.com",
14545
+ "amazoncognito.com",
14546
+ "clerk.accounts.dev"
14547
+ ];
14548
+ var MAX_PATH_LENGTH = 512;
14549
+ var UUID_SEGMENT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
14550
+ var LONG_HEX_SEGMENT = /^[0-9a-f]{16,}$/i;
14551
+ var TOKEN_CHARSET = /^[\w-]+$/;
14552
+ var JWT_SEGMENT = /^eyJ[\w-]+\.[\w-]+/;
14553
+ function baseHost(host) {
14554
+ const h = host?.trim().toLowerCase().replace(/:\d+$/, "").replace(/^www\./, "").replace(/\.$/, "");
14555
+ return h || null;
14556
+ }
14557
+ function domainOf(value) {
14558
+ const v = value.trim().toLowerCase();
14559
+ if (!v) return null;
14560
+ try {
14561
+ return baseHost(new URL(v.includes("://") ? v : `https://${v}`).hostname);
14562
+ } catch {
14563
+ return null;
14564
+ }
14565
+ }
14566
+ function refererUrlOf(referer) {
14567
+ if (!referer) return null;
14568
+ try {
14569
+ return new URL(referer);
14570
+ } catch {
14571
+ return null;
14572
+ }
14573
+ }
14574
+ function hostOfEvent(event) {
14575
+ if (event.host) return event.host;
14576
+ if (!event.requestUrl) return null;
14577
+ try {
14578
+ return new URL(event.requestUrl).hostname || null;
14579
+ } catch {
14580
+ return null;
14581
+ }
14582
+ }
14583
+ var onDomain = (host, domain) => host === domain || host.endsWith(`.${domain}`);
14584
+ function isStepRefererHost(host, path) {
14585
+ return STEP_REFERER_HOSTS.some((entry) => {
14586
+ const slash = entry.indexOf("/");
14587
+ if (slash < 0) return onDomain(host, entry);
14588
+ return host === entry.slice(0, slash) && path.startsWith(entry.slice(slash));
14589
+ });
14590
+ }
14591
+ function isAssetPath(path) {
14592
+ return ASSET_PATH_PREFIXES.some((prefix) => path.startsWith(prefix)) || ASSET_EXTENSION_PATTERN.test(path);
14593
+ }
14594
+ function looksSecret(segment) {
14595
+ if (UUID_SEGMENT.test(segment) || LONG_HEX_SEGMENT.test(segment) || JWT_SEGMENT.test(segment)) return true;
14596
+ if (segment.length < 20 || !TOKEN_CHARSET.test(segment)) return false;
14597
+ const digits = segment.replace(/\D/g, "").length;
14598
+ const letters = segment.replace(/[^a-z]/gi, "").length;
14599
+ const mixedCase = /[a-z]/.test(segment) && /[A-Z]/.test(segment);
14600
+ return digits >= 3 && letters >= 3 && (mixedCase || !/[-_]/.test(segment));
14601
+ }
14602
+ function maskJourneyPath(path) {
14603
+ return (path || "/").split("/").map((raw) => {
14604
+ const segment = raw.split(";")[0];
14605
+ if (!segment) return segment;
14606
+ if (/@|%40/.test(segment)) return ":email";
14607
+ return looksSecret(segment) ? ":token" : segment;
14608
+ }).join("/") || "/";
14609
+ }
14610
+ function isLikelyBrowser(userAgent) {
14611
+ const ua = userAgent?.trim();
14612
+ return Boolean(ua) && /^Mozilla\//.test(ua) && !NON_BROWSER_PATTERN.test(ua);
14613
+ }
14614
+ function extractJourneyRequests(events, options = {}) {
14615
+ const siteDomains = (options.siteDomains ?? []).map(domainOf).filter((d) => Boolean(d));
14616
+ const out = [];
14617
+ for (const event of events) {
14618
+ const method = event.method?.toUpperCase() ?? null;
14619
+ if (method === "HEAD" || method === "OPTIONS") continue;
14620
+ const observedMs = Date.parse(event.observedAt);
14621
+ if (!Number.isFinite(observedMs)) continue;
14622
+ const rawPath = event.path.split("?")[0] || "/";
14623
+ if (isAssetPath(rawPath)) continue;
14624
+ if (!isLikelyBrowser(event.userAgent)) continue;
14625
+ if (isSelfTraffic(event) || classifyCrawler(event) || classifyAiUserFetch(event)) continue;
14626
+ const params = new URLSearchParams(event.queryString ?? "");
14627
+ const kept = KEPT_QUERY_PARAMETERS.flatMap((name) => {
14628
+ const value = params.get(name);
14629
+ return value ? [`${name}=${encodeURIComponent(value)}`] : [];
14630
+ });
14631
+ const maskedPath = maskJourneyPath(rawPath);
14632
+ const path = (kept.length ? `${maskedPath}?${kept.join("&")}` : maskedPath).slice(0, MAX_PATH_LENGTH);
14633
+ const refererUrl = refererUrlOf(event.referer);
14634
+ const refererHost = refererUrl?.hostname || null;
14635
+ const refererBase = baseHost(refererHost);
14636
+ const siteHost = baseHost(hostOfEvent(event));
14637
+ const sameSite = Boolean(refererBase && (siteHost && (onDomain(refererBase, siteHost) || onDomain(siteHost, refererBase)) || siteDomains.some((domain) => onDomain(refererBase, domain))));
14638
+ const stepReferer = sameSite || Boolean(refererBase && isStepRefererHost(refererBase, refererUrl?.pathname ?? "/"));
14639
+ const ai = classifyAiReferral(event);
14640
+ const networkClickId = Object.keys(NETWORK_CLICK_ID_PARAMETERS).find((name) => params.has(name));
14641
+ out.push({
14642
+ eventId: event.eventId,
14643
+ observedAt: new Date(observedMs).toISOString(),
14644
+ method,
14645
+ path,
14646
+ status: event.status,
14647
+ kind: DATA_PATH_PATTERN.test(rawPath) ? "data" : "page",
14648
+ remoteIp: event.remoteIp?.trim() || null,
14649
+ userAgent: event.userAgent.trim(),
14650
+ stepReferer,
14651
+ aiEvidence: ai?.evidenceType ?? null,
14652
+ signal: {
14653
+ aiProduct: ai?.product ?? null,
14654
+ aiDomain: ai?.sourceDomain ?? null,
14655
+ aiPaid: ai?.trafficClass === "paid",
14656
+ refererHost: stepReferer ? null : refererHost,
14657
+ utmSource: params.get("utm_source"),
14658
+ utmMedium: params.get("utm_medium"),
14659
+ adClickId: AD_CLICK_ID_PARAMETERS.some((name) => params.has(name)),
14660
+ clickNetwork: networkClickId ? NETWORK_CLICK_ID_PARAMETERS[networkClickId] : null
14661
+ }
14662
+ });
14663
+ }
14664
+ return out;
14665
+ }
14666
+ function hasEntryEvidence(request) {
14667
+ if (request.stepReferer) return false;
14668
+ const s = request.signal;
14669
+ return Boolean(s.aiProduct || s.refererHost || s.utmSource || s.utmMedium || s.adClickId || s.clickNetwork);
14670
+ }
14671
+ function entryKey(entry) {
14672
+ return `${entry.entryClass}:${entry.entryName ?? entry.entryHost ?? ""}`;
14673
+ }
14674
+ var ms = (iso) => Date.parse(iso);
14675
+ var DIRECT_ENTRY = { entryClass: "direct", entryName: null, entryHost: null, paid: false };
14676
+ var laterOf = (a, b) => a !== null && a > b ? a : b;
14677
+ function placeRequest(visits, t, outsideEntry, idleMs) {
14678
+ let current;
14679
+ let next;
14680
+ for (const v of visits) {
14681
+ const start = ms(v.startedAt);
14682
+ if (start <= t) {
14683
+ if (t <= ms(v.endedAt) + idleMs && (!current || v.startedAt > current.startedAt)) current = v;
14684
+ } else if (start - t <= idleMs && (!next || v.startedAt < next.startedAt)) {
14685
+ next = v;
14686
+ }
14687
+ }
14688
+ if (current && (outsideEntry === null || outsideEntry === entryKey(current.entry))) return { visit: current, head: false, current };
14689
+ if (next && (next.entry.entryClass === "direct" || outsideEntry === entryKey(next.entry))) return { visit: next, head: true, current };
14690
+ return { visit: void 0, head: false, current };
14691
+ }
14692
+ function insertSorted(values, value) {
14693
+ let i = values.length;
14694
+ while (i > 0 && values[i - 1] > value) i -= 1;
14695
+ if (values[i - 1] !== value) values.splice(i, 0, value);
14696
+ }
14697
+ function sessionizeJourneyRequests(requests, state, options) {
14698
+ const byVisitor = /* @__PURE__ */ new Map();
14699
+ for (const request of requests) {
14700
+ const list = byVisitor.get(request.visitorKey);
14701
+ if (list) list.push(request);
14702
+ else byVisitor.set(request.visitorKey, [request]);
14703
+ }
14704
+ const visits = /* @__PURE__ */ new Map();
14705
+ const events = [];
14706
+ const visitors = [];
14707
+ let dropped = 0;
14708
+ let capped = 0;
14709
+ for (const [visitorKey, list] of byVisitor) {
14710
+ list.sort((a, b) => a.observedAt < b.observedAt ? -1 : a.observedAt > b.observedAt ? 1 : 0);
14711
+ const prior = state.get(visitorKey);
14712
+ const isWeakAi = (r) => Boolean(r.signal.aiProduct) && r.stepReferer;
14713
+ const isStrongAi = (r) => Boolean(r.signal.aiProduct) && !r.stepReferer;
14714
+ const aiTimes = [...new Set([
14715
+ prior?.firstAiAt,
14716
+ prior?.lastAiAt,
14717
+ ...prior?.aiTimes ?? [],
14718
+ ...list.filter(isStrongAi).map((r) => r.observedAt)
14719
+ ].filter((t) => Boolean(t)))].sort();
14720
+ if (aiTimes.length === 0 && !list.some(isWeakAi)) {
14721
+ dropped += list.length;
14722
+ continue;
14723
+ }
14724
+ const engineAt = /* @__PURE__ */ new Map();
14725
+ const known = (prior?.visits ?? []).map((v) => ({ ...v, visitorKey, landingPath: "", isNew: false, headChanged: false }));
14726
+ const requestsByDay = new Map(Object.entries(prior?.requestsByDay ?? {}));
14727
+ let keptAny = false;
14728
+ const cappedDays = /* @__PURE__ */ new Set();
14729
+ let lastSeenAt = null;
14730
+ let userAgent = list[0].userAgent;
14731
+ let aiIndex = -1;
14732
+ for (const request of list) {
14733
+ const t = ms(request.observedAt);
14734
+ while (aiIndex + 1 < aiTimes.length && aiTimes[aiIndex + 1] <= request.observedAt) aiIndex += 1;
14735
+ const withinLookback = aiIndex >= 0 && t - ms(aiTimes[aiIndex]) <= options.lookbackMs;
14736
+ let aiTouch = isStrongAi(request);
14737
+ if (isWeakAi(request) && !withinLookback) {
14738
+ aiTouch = true;
14739
+ insertSorted(aiTimes, request.observedAt);
14740
+ aiIndex = aiTimes.indexOf(request.observedAt);
14741
+ }
14742
+ if (aiTouch && request.signal.aiProduct && !engineAt.has(request.observedAt)) engineAt.set(request.observedAt, request.signal.aiProduct);
14743
+ const entry = aiTouch ? classifyJourneyEntry(request.signal) : request.stepReferer ? DIRECT_ENTRY : classifyJourneyEntry({ ...request.signal, aiProduct: null, aiDomain: null, aiPaid: false });
14744
+ const outside = aiTouch || hasEntryEvidence(request);
14745
+ const placement = placeRequest(known, t, outside ? entryKey(entry) : null, options.idleMs);
14746
+ const continues = placement.visit !== void 0 && !placement.head;
14747
+ const kept = aiTouch || withinLookback || continues;
14748
+ const opensVisit = placement.visit === void 0;
14749
+ if (!kept || opensVisit && request.kind === "data" && !outside) {
14750
+ dropped += 1;
14751
+ continue;
14752
+ }
14753
+ const day = request.observedAt.slice(0, 10);
14754
+ const stored = requestsByDay.get(day) ?? 0;
14755
+ if (stored >= options.maxRequestsPerDay && !aiTouch) {
14756
+ cappedDays.add(day);
14757
+ capped += 1;
14758
+ continue;
14759
+ }
14760
+ requestsByDay.set(day, stored + 1);
14761
+ let target;
14762
+ if (placement.visit) {
14763
+ target = placement.visit;
14764
+ if (placement.head) {
14765
+ target.startedAt = request.observedAt;
14766
+ target.landingPath = request.path;
14767
+ if (outside) target.entry = entry;
14768
+ target.headChanged = !target.isNew;
14769
+ }
14770
+ if (request.observedAt > target.endedAt) target.endedAt = request.observedAt;
14771
+ target.requestCount += 1;
14772
+ if (request.kind === "page") target.pageCount += 1;
14773
+ } else {
14774
+ target = {
14775
+ id: options.newId(),
14776
+ visitorKey,
14777
+ startedAt: request.observedAt,
14778
+ endedAt: request.observedAt,
14779
+ entry,
14780
+ requestCount: 1,
14781
+ pageCount: request.kind === "page" ? 1 : 0,
14782
+ landingPath: request.path,
14783
+ isNew: true,
14784
+ headChanged: false
14785
+ };
14786
+ const inside = placement.current;
14787
+ if (outside && inside && request.observedAt < inside.endedAt) {
14788
+ target.splitFrom = { visitId: inside.id, after: request.observedAt };
14789
+ target.endedAt = inside.endedAt;
14790
+ inside.endedAt = request.observedAt;
14791
+ visits.set(inside.id, inside);
14792
+ }
14793
+ known.push(target);
14794
+ }
14795
+ visits.set(target.id, target);
14796
+ events.push({ visitId: target.id, visitorKey, request, aiTouch });
14797
+ keptAny = true;
14798
+ lastSeenAt = laterOf(lastSeenAt, request.observedAt);
14799
+ userAgent = request.userAgent;
14800
+ }
14801
+ if ((keptAny || cappedDays.size > 0) && aiTimes.length > 0) {
14802
+ const firstAiAt = aiTimes[0];
14803
+ visitors.push({
14804
+ visitorKey,
14805
+ firstAiAt,
14806
+ firstAiEngine: (prior?.firstAiAt === firstAiAt ? prior?.firstAiEngine : null) ?? engineAt.get(firstAiAt) ?? prior?.firstAiEngine ?? "AI",
14807
+ lastAiAt: aiTimes[aiTimes.length - 1],
14808
+ userAgent,
14809
+ lastSeenAt: lastSeenAt ?? prior?.lastAiAt ?? firstAiAt,
14810
+ cappedDays: [...cappedDays].sort()
14811
+ });
14812
+ }
14813
+ }
14814
+ return { visits: [...visits.values()], events, visitors, dropped, capped };
14815
+ }
14816
+
14509
14817
  // ../integration-traffic/src/rollup.ts
14510
14818
  var DEFAULT_SAMPLE_LIMIT = 25;
14511
14819
  var DEFAULT_AI_REFERRAL_SESSION_WINDOW_MS = 6e4;
14512
- var UUID_SEGMENT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
14513
- var LONG_HEX_SEGMENT = /^[0-9a-f]{16,}$/i;
14820
+ var UUID_SEGMENT2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
14821
+ var LONG_HEX_SEGMENT2 = /^[0-9a-f]{16,}$/i;
14514
14822
  var NUMERIC_SEGMENT = /^\d+$/;
14515
- var ASSET_EXTENSION_PATTERN = /\.(?:avif|bmp|css|gif|ico|jpe?g|js|json|map|mjs|mp4|otf|png|svg|webm|webmanifest|woff2?|xml)$/i;
14516
- var ASSET_PATH_PREFIXES = [
14823
+ var ASSET_EXTENSION_PATTERN2 = /\.(?:avif|bmp|css|gif|ico|jpe?g|js|json|map|mjs|mp4|otf|png|svg|webm|webmanifest|woff2?|xml)$/i;
14824
+ var ASSET_PATH_PREFIXES2 = [
14517
14825
  "/_next/static/",
14518
14826
  "/assets/",
14519
14827
  "/build/",
@@ -14528,7 +14836,7 @@ function normalizeTrafficPathPattern(path) {
14528
14836
  const pathOnly = cleanPath.split("?")[0] || "/";
14529
14837
  const segments = pathOnly.split("/").map((segment) => {
14530
14838
  if (!segment) return segment;
14531
- if (UUID_SEGMENT.test(segment) || LONG_HEX_SEGMENT.test(segment) || NUMERIC_SEGMENT.test(segment)) {
14839
+ if (UUID_SEGMENT2.test(segment) || LONG_HEX_SEGMENT2.test(segment) || NUMERIC_SEGMENT.test(segment)) {
14532
14840
  return ":id";
14533
14841
  }
14534
14842
  return segment;
@@ -14571,7 +14879,7 @@ function resolveAiReferralLandingPath(event, evidenceType) {
14571
14879
  }
14572
14880
  function isLikelySubresourcePath(path) {
14573
14881
  const cleanPath = path.split("?")[0] || "/";
14574
- return ASSET_PATH_PREFIXES.some((prefix) => cleanPath.startsWith(prefix)) || ASSET_EXTENSION_PATTERN.test(cleanPath);
14882
+ return ASSET_PATH_PREFIXES2.some((prefix) => cleanPath.startsWith(prefix)) || ASSET_EXTENSION_PATTERN2.test(cleanPath);
14575
14883
  }
14576
14884
  function actorKey(event) {
14577
14885
  const remoteIp = event.remoteIp?.trim();
@@ -14878,6 +15186,29 @@ var DEFAULT_BOT_LIST = {
14878
15186
  };
14879
15187
  var DEFAULT_BOT_SCORE_MAX_FORWARD = 30;
14880
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
+ `;
14881
15212
  function jsString(value) {
14882
15213
  return JSON.stringify(value);
14883
15214
  }
@@ -14886,6 +15217,9 @@ function jsArray(values) {
14886
15217
  }
14887
15218
  function generateWorkerScript(opts) {
14888
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" : "";
14889
15223
  const canonicalJsonFunction = canonicalizeCloudflareJson.toString();
14890
15224
  const directPushDelivery = opts.deliveryMode === "direct-push" ? `
14891
15225
  function toHex(buffer) {
@@ -14995,7 +15329,7 @@ async function deliverViaQueue(env, batch) {
14995
15329
  return `${CLOUDFLARE_WORKER_GENERATED_MARKER}
14996
15330
  // worker version: ${opts.workerVersion}
14997
15331
  // bot-list version: ${opts.botList.version}
14998
- // delivery mode: ${opts.deliveryMode}
15332
+ // delivery mode: ${opts.deliveryMode}${pageViewHeader}
14999
15333
 
15000
15334
  const UA_KEYWORDS = ${jsArray(opts.botList.uaKeywords)}
15001
15335
  const REFERER_DOMAINS = ${jsArray(opts.botList.refererDomains)}
@@ -15070,14 +15404,14 @@ function botSignals(cf) {
15070
15404
  if (typeof cf.botScore === 'number' && cf.botScore < BOT_SCORE_MAX_FORWARD) return true
15071
15405
  return false
15072
15406
  }
15073
-
15407
+ ${pageViewFilter}
15074
15408
  function shouldForward(request) {
15075
15409
  const ua = request.headers.get('user-agent') || ''
15076
15410
  if (uaMatches(ua)) return true
15077
15411
  if (urlUtmMatches(request.url)) return true
15078
15412
  const referer = request.headers.get('referer') || ''
15079
15413
  if (refererMatches(referer)) return true
15080
- if (urlUtmMatches(referer)) return true
15414
+ if (urlUtmMatches(referer)) return true${pageViewCheck}
15081
15415
  return botSignals(request.cf)
15082
15416
  }
15083
15417
 
@@ -15364,12 +15698,15 @@ export {
15364
15698
  isSelfTraffic,
15365
15699
  classifyCrawler,
15366
15700
  classifyAiUserFetch,
15701
+ extractJourneyRequests,
15702
+ sessionizeJourneyRequests,
15367
15703
  buildTrafficProbeReport,
15368
15704
  normalizeCloudflareWorkerEvent,
15369
15705
  CLOUDFLARE_WORKER_BINDINGS,
15370
15706
  CLOUDFLARE_WORKER_GENERATED_MARKER,
15371
15707
  CLOUDFLARE_WRANGLER_GENERATED_MARKER,
15372
15708
  DEFAULT_BOT_LIST,
15709
+ CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX,
15373
15710
  generateWorkerScript,
15374
15711
  generateWranglerToml,
15375
15712
  verifyRequestSignature
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  runWithUsageTags
3
- } from "./chunk-F6W7FCS2.js";
3
+ } from "./chunk-SJNF5GN2.js";
4
4
  import {
5
5
  CanonryMcpToolNames,
6
6
  canonryMcpTools
7
- } from "./chunk-YJPQBJZO.js";
7
+ } from "./chunk-7XSGAPN5.js";
8
8
  import {
9
9
  CliError
10
10
  } from "./chunk-HGMYEDAQ.js";
11
11
  import {
12
12
  buildOpenApiDocument
13
- } from "./chunk-QEJBAPDP.js";
13
+ } from "./chunk-4IV4FO3O.js";
14
14
  import {
15
15
  DEFAULT_COMPETITOR_AUTO_ALIAS_MODE,
16
16
  MeasurementPortfolioLists,
@@ -20,7 +20,7 @@ import {
20
20
  formatPercent,
21
21
  ratioUnitSchema,
22
22
  truncateUtf16
23
- } from "./chunk-Y7NX6EIK.js";
23
+ } from "./chunk-JDL4QAPT.js";
24
24
 
25
25
  // src/agent/tools.ts
26
26
  import { Type as Type2 } from "@earendil-works/pi-ai";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  API_PROVIDER_NAMES,
3
3
  ProviderNames
4
- } from "./chunk-Y7NX6EIK.js";
4
+ } from "./chunk-JDL4QAPT.js";
5
5
 
6
6
  // src/provider-registration.ts
7
7
  function isApiProviderRegistrable(name, entry) {
@@ -20,7 +20,7 @@ import {
20
20
  resolveProviderModel,
21
21
  schedulableRunKindSchema,
22
22
  sentimentEvaluatorProviderSchema
23
- } from "./chunk-Y7NX6EIK.js";
23
+ } from "./chunk-JDL4QAPT.js";
24
24
 
25
25
  // ../config/src/index.ts
26
26
  import { z as z4 } from "zod";
@@ -960,6 +960,13 @@ Do not use "canonry init --force" for recovery. It replaces credentials without
960
960
  message: `Invalid config at ${configPath}: agent.model must be a non-empty string or left blank.`
961
961
  });
962
962
  }
963
+ const journeySecret = parsed.journeys?.visitorKeySecret;
964
+ if (journeySecret !== void 0 && journeySecret !== null && (typeof journeySecret !== "string" || journeySecret.trim().length > 0 && journeySecret.trim().length < 32)) {
965
+ throw new CliError({
966
+ code: "CONFIG_INVALID",
967
+ message: `Invalid config at ${configPath}: journeys.visitorKeySecret must be a string of at least 32 characters, or left blank to generate one.`
968
+ });
969
+ }
963
970
  if (!agentAllowViewersSchema.safeParse(parsed.agent?.allowViewers).success) {
964
971
  throw new CliError({
965
972
  code: "CONFIG_INVALID",