@canonry/canonry 4.176.0 → 4.177.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 (28) hide show
  1. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +15 -0
  2. package/assets/assets/{AuditHistoryPanel-aEUCJheK.js → AuditHistoryPanel-YZvGU1la.js} +1 -1
  3. package/assets/assets/{BacklinksPage-BcWequGL.js → BacklinksPage-CB2uJWWy.js} +1 -1
  4. package/assets/assets/{HistoryPage-D0BWQK0c.js → HistoryPage-D9IxxbQ9.js} +1 -1
  5. package/assets/assets/{MeasurementPropertyPage-D96eQnYJ.js → MeasurementPropertyPage-CxgnnPdp.js} +1 -1
  6. package/assets/assets/{ProjectPage-CoRkwGec.js → ProjectPage-CPmaXzhL.js} +8 -8
  7. package/assets/assets/{RunRow--3y-0dSr.js → RunRow-2KxOta8F.js} +1 -1
  8. package/assets/assets/{RunsPage-7wdCl_J3.js → RunsPage-ya8vTkyd.js} +1 -1
  9. package/assets/assets/{SettingsPage-D37dV5-m.js → SettingsPage-lTy3o2bo.js} +1 -1
  10. package/assets/assets/{SiteHealthSection-B9WF97sJ.js → SiteHealthSection-Cyu7MIv2.js} +3 -3
  11. package/assets/assets/TrafficPage-DjhKfw57.js +1 -0
  12. package/assets/assets/TrafficSourceDetailPage-Pwi-Dl9Q.js +1 -0
  13. package/assets/assets/{extract-error-message-DlPqK0mV.js → extract-error-message-I1FVWHLH.js} +1 -1
  14. package/assets/assets/{index-CiQNKNMG.js → index-BeLVKN3H.js} +3 -3
  15. package/assets/assets/{react-sigma_core.esm.min-Dc7_SFjo.js → react-sigma_core.esm.min-BX6mOEq5.js} +1 -1
  16. package/assets/index.html +1 -1
  17. package/dist/{chunk-TIEHKR6K.js → chunk-F4ZZKGAC.js} +1 -1
  18. package/dist/{chunk-OSMUOPBR.js → chunk-UXXXKDW4.js} +70 -6
  19. package/dist/{chunk-HYKZOCBT.js → chunk-WW7TDVLV.js} +2 -2
  20. package/dist/{chunk-J3RVQCCQ.js → chunk-X776E66Z.js} +680 -634
  21. package/dist/{chunk-DSGX2IAI.js → chunk-YWFNRDLK.js} +4 -4
  22. package/dist/cli.js +7 -7
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-RSZTVVX2.js → intelligence-service-QLLGPZOC.js} +2 -2
  25. package/dist/mcp.js +3 -3
  26. package/package.json +9 -9
  27. package/assets/assets/TrafficPage-Bn1yDSRr.js +0 -1
  28. package/assets/assets/TrafficSourceDetailPage-CURlB_yO.js +0 -1
@@ -1,4 +1,4 @@
1
- import{g as Bt,t as S,r as C}from"./vendor-tanstack-Dock0eH1.js";import{e as Ht,G as Wt}from"./SiteHealthSection-B9WF97sJ.js";import"./index-CiQNKNMG.js";import"./vendor-radix-4UOaVWza.js";import"./vendor-recharts-D8rt5lKn.js";import"./vendor-lucide-nYKv-BB7.js";import"./vendor-markdown-Bn7fRwrx.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-BoYe2M-i.js";function Vt(r,n){if(typeof r!="object"||!r)return r;var i=r[Symbol.toPrimitive];if(i!==void 0){var e=i.call(r,n);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}function ae(r){var n=Vt(r,"string");return typeof n=="symbol"?n:n+""}function A(r,n){if(!(r instanceof n))throw new TypeError("Cannot call a class as a function")}function He(r,n){for(var i=0;i<n.length;i++){var e=n[i];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(r,ae(e.key),e)}}function L(r,n,i){return n&&He(r.prototype,n),i&&He(r,i),Object.defineProperty(r,"prototype",{writable:!1}),r}function Q(r){return Q=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},Q(r)}function yt(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(yt=function(){return!!r})()}function jt(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function Zt(r,n){if(n&&(typeof n=="object"||typeof n=="function"))return n;if(n!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return jt(r)}function I(r,n,i){return n=Q(n),Zt(r,yt()?Reflect.construct(n,i||[],Q(r).constructor):n.apply(r,i))}function xe(r,n){return xe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(i,e){return i.__proto__=e,i},xe(r,n)}function G(r,n){if(typeof n!="function"&&n!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(n&&n.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),n&&xe(r,n)}function qt(r){if(Array.isArray(r))return r}function Yt(r,n){var i=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(i!=null){var e,t,a,o,s=[],l=!0,h=!1;try{if(a=(i=i.call(r)).next,n===0){if(Object(i)!==i)return;l=!1}else for(;!(l=(e=a.call(i)).done)&&(s.push(e.value),s.length!==n);l=!0);}catch(u){h=!0,t=u}finally{try{if(!l&&i.return!=null&&(o=i.return(),Object(o)!==o))return}finally{if(h)throw t}}return s}}function Se(r,n){(n==null||n>r.length)&&(n=r.length);for(var i=0,e=Array(n);i<n;i++)e[i]=r[i];return e}function Tt(r,n){if(r){if(typeof r=="string")return Se(r,n);var i={}.toString.call(r).slice(8,-1);return i==="Object"&&r.constructor&&(i=r.constructor.name),i==="Map"||i==="Set"?Array.from(r):i==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Se(r,n):void 0}}function Xt(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
1
+ import{g as Bt,t as S,r as C}from"./vendor-tanstack-Dock0eH1.js";import{e as Ht,G as Wt}from"./SiteHealthSection-Cyu7MIv2.js";import"./index-BeLVKN3H.js";import"./vendor-radix-4UOaVWza.js";import"./vendor-recharts-D8rt5lKn.js";import"./vendor-lucide-nYKv-BB7.js";import"./vendor-markdown-Bn7fRwrx.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-BoYe2M-i.js";function Vt(r,n){if(typeof r!="object"||!r)return r;var i=r[Symbol.toPrimitive];if(i!==void 0){var e=i.call(r,n);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}function ae(r){var n=Vt(r,"string");return typeof n=="symbol"?n:n+""}function A(r,n){if(!(r instanceof n))throw new TypeError("Cannot call a class as a function")}function He(r,n){for(var i=0;i<n.length;i++){var e=n[i];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(r,ae(e.key),e)}}function L(r,n,i){return n&&He(r.prototype,n),i&&He(r,i),Object.defineProperty(r,"prototype",{writable:!1}),r}function Q(r){return Q=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},Q(r)}function yt(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(yt=function(){return!!r})()}function jt(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function Zt(r,n){if(n&&(typeof n=="object"||typeof n=="function"))return n;if(n!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return jt(r)}function I(r,n,i){return n=Q(n),Zt(r,yt()?Reflect.construct(n,i||[],Q(r).constructor):n.apply(r,i))}function xe(r,n){return xe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(i,e){return i.__proto__=e,i},xe(r,n)}function G(r,n){if(typeof n!="function"&&n!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(n&&n.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),n&&xe(r,n)}function qt(r){if(Array.isArray(r))return r}function Yt(r,n){var i=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(i!=null){var e,t,a,o,s=[],l=!0,h=!1;try{if(a=(i=i.call(r)).next,n===0){if(Object(i)!==i)return;l=!1}else for(;!(l=(e=a.call(i)).done)&&(s.push(e.value),s.length!==n);l=!0);}catch(u){h=!0,t=u}finally{try{if(!l&&i.return!=null&&(o=i.return(),Object(o)!==o))return}finally{if(h)throw t}}return s}}function Se(r,n){(n==null||n>r.length)&&(n=r.length);for(var i=0,e=Array(n);i<n;i++)e[i]=r[i];return e}function Tt(r,n){if(r){if(typeof r=="string")return Se(r,n);var i={}.toString.call(r).slice(8,-1);return i==="Object"&&r.constructor&&(i=r.constructor.name),i==="Map"||i==="Set"?Array.from(r):i==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Se(r,n):void 0}}function Xt(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
2
2
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ee(r,n){return qt(r)||Yt(r,n)||Tt(r,n)||Xt()}var pe={black:"#000000",silver:"#C0C0C0",gray:"#808080",grey:"#808080",white:"#FFFFFF",maroon:"#800000",red:"#FF0000",purple:"#800080",fuchsia:"#FF00FF",green:"#008000",lime:"#00FF00",olive:"#808000",yellow:"#FFFF00",navy:"#000080",blue:"#0000FF",teal:"#008080",aqua:"#00FFFF",darkblue:"#00008B",mediumblue:"#0000CD",darkgreen:"#006400",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",springgreen:"#00FF7F",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",rebeccapurple:"#663399",mediumaquamarine:"#66CDAA",dimgray:"#696969",dimgrey:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",slategrey:"#708090",lightslategray:"#778899",lightslategrey:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370DB",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",palevioletred:"#DB7093",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",lightyellow:"#FFFFE0",ivory:"#FFFFF0"},Ct=new Int8Array(4),be=new Int32Array(Ct.buffer,0,1),$t=new Float32Array(Ct.buffer,0,1),Kt=/^\s*rgba?\s*\(/,Jt=/^\s*rgba?\s*\(\s*([0-9]*)\s*,\s*([0-9]*)\s*,\s*([0-9]*)(?:\s*,\s*(.*)?)?\)\s*$/;function Qt(r){var n=0,i=0,e=0,t=1;if(r[0]==="#")r.length===4?(n=parseInt(r.charAt(1)+r.charAt(1),16),i=parseInt(r.charAt(2)+r.charAt(2),16),e=parseInt(r.charAt(3)+r.charAt(3),16)):(n=parseInt(r.charAt(1)+r.charAt(2),16),i=parseInt(r.charAt(3)+r.charAt(4),16),e=parseInt(r.charAt(5)+r.charAt(6),16)),r.length===9&&(t=parseInt(r.charAt(7)+r.charAt(8),16)/255);else if(Kt.test(r)){var a=r.match(Jt);a&&(n=+a[1],i=+a[2],e=+a[3],a[4]&&(t=+a[4]))}return{r:n,g:i,b:e,a:t}}var J={};for(var le in pe)J[le]=oe(pe[le]),J[pe[le]]=J[le];function Rt(r,n,i,e,t){return be[0]=e<<24|i<<16|n<<8|r,be[0]=be[0]&4278190079,$t[0]}function oe(r){if(r=r.toLowerCase(),typeof J[r]<"u")return J[r];var n=Qt(r),i=n.r,e=n.g,t=n.b,a=n.a;a=a*255|0;var o=Rt(i,e,t,a);return J[r]=o,o}var Ee={};function _t(r){if(typeof Ee[r]<"u")return Ee[r];var n=(r&16711680)>>>16,i=(r&65280)>>>8,e=r&255,t=255,a=Rt(n,i,e,t);return Ee[r]=a,a}function We(r,n,i,e){return i+(n<<8)+(r<<16)}function Ve(r,n,i,e,t,a){var o=Math.floor(i/a*t),s=Math.floor(r.drawingBufferHeight/a-e/a*t),l=new Uint8Array(4);r.bindFramebuffer(r.FRAMEBUFFER,n),r.readPixels(o,s,1,1,r.RGBA,r.UNSIGNED_BYTE,l);var h=ee(l,4),u=h[0],d=h[1],f=h[2],g=h[3];return[u,d,f,g]}function c(r,n,i){return(n=ae(n))in r?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,r}function je(r,n){var i=Object.keys(r);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(r);n&&(e=e.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),i.push.apply(i,e)}return i}function b(r){for(var n=1;n<arguments.length;n++){var i=arguments[n]!=null?arguments[n]:{};n%2?je(Object(i),!0).forEach(function(e){c(r,e,i[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):je(Object(i)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))})}return r}function ei(r,n){for(;!{}.hasOwnProperty.call(r,n)&&(r=Q(r))!==null;);return r}function Ae(){return Ae=typeof Reflect<"u"&&Reflect.get?Reflect.get.bind():function(r,n,i){var e=ei(r,n);if(e){var t=Object.getOwnPropertyDescriptor(e,n);return t.get?t.get.call(arguments.length<3?r:i):t.value}},Ae.apply(null,arguments)}function wt(r,n,i,e){var t=Ae(Q(r.prototype),n,i);return typeof t=="function"?function(a){return t.apply(i,a)}:t}function ti(r){return r.normalized?1:r.size}function ye(r){var n=0;return r.forEach(function(i){return n+=ti(i)}),n}function xt(r,n,i){var e=r==="VERTEX"?n.VERTEX_SHADER:n.FRAGMENT_SHADER,t=n.createShader(e);if(t===null)throw new Error("loadShader: error while creating the shader");n.shaderSource(t,i),n.compileShader(t);var a=n.getShaderParameter(t,n.COMPILE_STATUS);if(!a){var o=n.getShaderInfoLog(t);throw n.deleteShader(t),new Error(`loadShader: error while compiling the shader:
3
3
  `.concat(o,`
4
4
  `).concat(i))}return t}function ii(r,n){return xt("VERTEX",r,n)}function ri(r,n){return xt("FRAGMENT",r,n)}function ni(r,n){var i=r.createProgram();if(i===null)throw new Error("loadProgram: error while creating the program.");var e,t;for(e=0,t=n.length;e<t;e++)r.attachShader(i,n[e]);r.linkProgram(i);var a=r.getProgramParameter(i,r.LINK_STATUS);if(!a){var o=r.getProgramInfoLog(i);throw r.deleteProgram(i),new Error("loadProgram: error while linking the program: ".concat(o))}return i}function Ze(r){var n=r.gl,i=r.buffer,e=r.program,t=r.vertexShader,a=r.fragmentShader;n.deleteShader(t),n.deleteShader(a),n.deleteProgram(e),n.deleteBuffer(i)}var qe=`#define PICKING_MODE
package/assets/index.html CHANGED
@@ -12,7 +12,7 @@
12
12
  <link rel="icon" type="image/png" sizes="32x32" href="./favicon-32.png" />
13
13
  <link rel="apple-touch-icon" href="./apple-touch-icon.png" />
14
14
  <title>Canonry</title>
15
- <script type="module" crossorigin src="./assets/index-CiQNKNMG.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-BeLVKN3H.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Dock0eH1.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-4UOaVWza.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-D8rt5lKn.js">
@@ -91,7 +91,7 @@ import {
91
91
  trafficConnectWordpressRequestSchema,
92
92
  trafficEventKindSchema,
93
93
  trafficSeriesGranularitySchema
94
- } from "./chunk-OSMUOPBR.js";
94
+ } from "./chunk-UXXXKDW4.js";
95
95
 
96
96
  // src/config.ts
97
97
  import fs from "fs";
@@ -13655,8 +13655,22 @@ var serverActivitySectionSchema = z47.object({
13655
13655
  * not "is this a confirmed bot identity?"
13656
13656
  */
13657
13657
  aiUserFetchHits: z47.object({ current: z47.number(), prior: z47.number(), deltaPct: z47.number().nullable() }),
13658
- /** Last-7d AI-referral sessions (sessionized from server-side request evidence). Paid + organic + unclassified. */
13658
+ /**
13659
+ * Last-7d AI-referral sessions (sessionized from server-side request
13660
+ * evidence). Paid + organic + unclassified. Excludes subresource fetches and
13661
+ * requests answered with a Location redirect (301/302/303/307/308): a hop is
13662
+ * not an arrival, and its destination raises its own row. Redirect-answered
13663
+ * requests are reported separately in `referralRedirects`.
13664
+ */
13659
13665
  referralArrivals: z47.object({ current: z47.number(), prior: z47.number(), deltaPct: z47.number().nullable() }),
13666
+ /**
13667
+ * AI-referred requests in the current window that were answered with a
13668
+ * Location redirect instead of a page. Not arrivals — but a site where this
13669
+ * dominates has its AI traffic bouncing off a redirect before landing, which
13670
+ * is exactly the thing to fix, so the report must be able to say it rather
13671
+ * than render an empty section.
13672
+ */
13673
+ referralRedirects: z47.number().int().nonnegative(),
13660
13674
  /**
13661
13675
  * `referralArrivals` split by traffic class. The three buckets sum to it.
13662
13676
  *
@@ -14567,7 +14581,31 @@ var trafficSourceTotalsSchema = z50.object({
14567
14581
  /** Full per-class crawler-hit breakdown; the five buckets sum to `crawlerHits`. */
14568
14582
  crawlerSegments: trafficCrawlerSegmentsSchema,
14569
14583
  aiUserFetchHits: z50.number().int().nonnegative(),
14584
+ /**
14585
+ * Every request carrying AI-origin evidence. UNCHANGED contract — still the
14586
+ * full count across every status. Use `aiReferralLandedHits` for the
14587
+ * "someone actually arrived" signal.
14588
+ */
14570
14589
  aiReferralHits: z50.number().int().nonnegative(),
14590
+ /**
14591
+ * Countable referral SESSIONS: excludes requests answered with a proven
14592
+ * Location redirect (301/302/303/307/308) AND static subresource fetches,
14593
+ * matching the report's predicate exactly. This is the figure to present as
14594
+ * visits, visitors, sessions or arrivals. "Not proven" on the redirect half:
14595
+ * a source that never observed a status stores 0, and an unobserved status
14596
+ * is not a hop, so those rows count — the benefit-of-the-doubt default.
14597
+ * `landed + redirected <= total`; the gap is subresource noise, which is
14598
+ * neither a session nor a hop.
14599
+ */
14600
+ aiReferralLandedHits: z50.number().int().nonnegative(),
14601
+ /**
14602
+ * Referral hits answered with a Location redirect. The visitor got no
14603
+ * content here; the destination raises its own row when it carries the same
14604
+ * evidence, so counting these as arrivals double-counts one person. A site
14605
+ * where this is most of the total is a finding in itself: its AI arrivals
14606
+ * all bounce off a redirect.
14607
+ */
14608
+ aiReferralRedirectedHits: z50.number().int().nonnegative(),
14571
14609
  sampleCount: z50.number().int().nonnegative()
14572
14610
  });
14573
14611
  var trafficSourceListResponseSchema = z50.object({
@@ -14598,7 +14636,12 @@ var trafficSeriesPointSchema = z50.object({
14598
14636
  bucket: z50.string(),
14599
14637
  crawlerHits: z50.number().int().nonnegative(),
14600
14638
  aiUserFetchHits: z50.number().int().nonnegative(),
14601
- aiReferralHits: z50.number().int().nonnegative()
14639
+ aiReferralHits: z50.number().int().nonnegative(),
14640
+ /**
14641
+ * The part of `aiReferralHits` not answered with a Location redirect — the
14642
+ * series to chart under any label that says sessions or visits.
14643
+ */
14644
+ aiReferralLandedHits: z50.number().int().nonnegative()
14602
14645
  });
14603
14646
  var trafficCrawlerEventEntrySchema = z50.object({
14604
14647
  kind: z50.literal(TrafficEventKinds.crawler),
@@ -14677,13 +14720,26 @@ var trafficEventsResponseSchema = z50.object({
14677
14720
  /** Full per-class crawler-hit breakdown; the five buckets sum to `crawlerHits`. */
14678
14721
  crawlerSegments: trafficCrawlerSegmentsSchema,
14679
14722
  aiUserFetchHits: z50.number().int().nonnegative(),
14680
- /** Total AI-referral sessions. The three class buckets below sum to it. */
14723
+ /**
14724
+ * Every AI-referral request in the window, whatever the server answered.
14725
+ * NOT a session count: use `aiReferralLandedHits` for anything presented
14726
+ * as sessions or visits. The three class buckets sum to the LANDED figure,
14727
+ * because a redirect hop's paid tags are not a paid session.
14728
+ */
14681
14729
  aiReferralHits: z50.number().int().nonnegative(),
14682
- /** AI-referral sessions carrying paid-attribution UTM evidence. */
14730
+ /**
14731
+ * Countable referral SESSIONS: no redirect hops, no static subresource
14732
+ * fetches — the same predicate the report uses, so windowed totals here
14733
+ * and report arrivals cannot disagree.
14734
+ */
14735
+ aiReferralLandedHits: z50.number().int().nonnegative(),
14736
+ /** Referral hits answered with a Location redirect — hops, not arrivals. */
14737
+ aiReferralRedirectedHits: z50.number().int().nonnegative(),
14738
+ /** LANDED sessions carrying paid-attribution UTM evidence. */
14683
14739
  aiReferralPaidHits: z50.number().int().nonnegative(),
14684
- /** AI-referral sessions with no paid-attribution evidence. */
14740
+ /** LANDED sessions with no paid-attribution evidence. */
14685
14741
  aiReferralOrganicHits: z50.number().int().nonnegative(),
14686
- /** AI-referral sessions ingested before the classifier shipped; unresolvable, never organic. */
14742
+ /** LANDED sessions ingested before the classifier shipped; unresolvable, never organic. */
14687
14743
  aiReferralUnknownHits: z50.number().int().nonnegative()
14688
14744
  }),
14689
14745
  eventRows: z50.object({
@@ -15822,6 +15878,12 @@ function formatMicros(micros, currencyCode = "USD") {
15822
15878
  }).format(micros / MICROS_PER_UNIT);
15823
15879
  }
15824
15880
 
15881
+ // ../contracts/src/http-status.ts
15882
+ var LOCATION_REDIRECT_STATUSES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
15883
+ function isLocationRedirectStatus(status) {
15884
+ return LOCATION_REDIRECT_STATUSES.has(status);
15885
+ }
15886
+
15825
15887
  // ../contracts/src/sql-like.ts
15826
15888
  function escapeLikePattern(value) {
15827
15889
  return value.replace(/[\\%_]/g, (match) => `\\${match}`);
@@ -16759,6 +16821,8 @@ export {
16759
16821
  adsCpcMicros,
16760
16822
  dollarsToMicros,
16761
16823
  formatMicros,
16824
+ LOCATION_REDIRECT_STATUSES,
16825
+ isLocationRedirectStatus,
16762
16826
  escapeLikePattern,
16763
16827
  READ_ONLY_SCOPE,
16764
16828
  WILDCARD_SCOPE,
@@ -5,11 +5,11 @@ import {
5
5
  installSkills,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-TIEHKR6K.js";
8
+ } from "./chunk-F4ZZKGAC.js";
9
9
  import {
10
10
  SKILL_MANIFEST_FILENAME,
11
11
  SkillsClients
12
- } from "./chunk-OSMUOPBR.js";
12
+ } from "./chunk-UXXXKDW4.js";
13
13
 
14
14
  // src/skills-autosync.ts
15
15
  import fs from "fs";