@canonry/canonry 4.165.0 → 4.165.2

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 (26) hide show
  1. package/README.md +11 -1
  2. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +75 -3
  3. package/assets/assets/{AuditHistoryPanel-IYMElyK5.js → AuditHistoryPanel-DYBAiNCu.js} +1 -1
  4. package/assets/assets/{BacklinksPage-BMqIPRvZ.js → BacklinksPage-p19FCIyh.js} +1 -1
  5. package/assets/assets/{HistoryPage-iuETLmwO.js → HistoryPage-CRSuA-J0.js} +1 -1
  6. package/assets/assets/{MeasurementPropertyPage-BzNAaB8X.js → MeasurementPropertyPage-Bgr9VeUk.js} +1 -1
  7. package/assets/assets/{ProjectPage-DIzi4Ggo.js → ProjectPage-D6-9qYKU.js} +8 -8
  8. package/assets/assets/{RunRow-BkkYxEjl.js → RunRow-_RMMaLPt.js} +1 -1
  9. package/assets/assets/{RunsPage-DGTrqrTA.js → RunsPage-CaDPSEfE.js} +1 -1
  10. package/assets/assets/{SettingsPage-Cwb_Ft9u.js → SettingsPage-Dcp71zcu.js} +1 -1
  11. package/assets/assets/{SiteHealthSection-k4I71wfJ.js → SiteHealthSection-Byp_Fu5K.js} +3 -3
  12. package/assets/assets/{TrafficPage-C8nyb8l1.js → TrafficPage-BXkXNKYB.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-ry7Da0pV.js → TrafficSourceDetailPage-CReS8q0H.js} +1 -1
  14. package/assets/assets/{extract-error-message-BYyBW07F.js → extract-error-message-CHW-A3AQ.js} +1 -1
  15. package/assets/assets/{index-rqOXhYwp.js → index-CcS2bDjR.js} +2 -2
  16. package/assets/assets/{react-sigma_core.esm.min-BtG8TWTe.js → react-sigma_core.esm.min-Cm0RA3Iv.js} +1 -1
  17. package/assets/index.html +1 -1
  18. package/dist/{chunk-QKLNTSQ2.js → chunk-BJLIMWL2.js} +12 -11
  19. package/dist/{chunk-QDOZEMDK.js → chunk-J56XZGG6.js} +1 -1
  20. package/dist/{chunk-BU6C2DKF.js → chunk-P2CQ57UV.js} +8 -2
  21. package/dist/{chunk-L5SMSDZB.js → chunk-UVDX2Y4N.js} +4 -4
  22. package/dist/cli.js +4 -4
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-RDGUEEZQ.js → intelligence-service-QGBYYNWV.js} +2 -2
  25. package/dist/mcp.js +2 -2
  26. package/package.json +7 -7
@@ -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-k4I71wfJ.js";import"./index-rqOXhYwp.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-Byp_Fu5K.js";import"./index-CcS2bDjR.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-rqOXhYwp.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-CcS2bDjR.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">
@@ -470,6 +470,7 @@ import {
470
470
  recommendationExplainRequestSchema,
471
471
  recommendationExplanationDtoSchema,
472
472
  registrableDomain,
473
+ relativeChangeRatio,
473
474
  reportActionCategoryLabel,
474
475
  reportActionTone,
475
476
  reportComparisonWindowDays,
@@ -582,7 +583,7 @@ import {
582
583
  wordpressSchemaDeployResultDtoSchema,
583
584
  wordpressSchemaStatusResultDtoSchema,
584
585
  wordpressStatusDtoSchema
585
- } from "./chunk-BU6C2DKF.js";
586
+ } from "./chunk-P2CQ57UV.js";
586
587
 
587
588
  // src/intelligence-service.ts
588
589
  import { eq as eq59, desc as desc26, asc as asc11, and as and47, ne as ne7, or as or13, inArray as inArray21, gte as gte14, lte as lte12 } from "drizzle-orm";
@@ -8635,7 +8636,9 @@ function pickWorstKeywordDrop(loc) {
8635
8636
  let worst = null;
8636
8637
  for (const point of loc.keywordPoints) {
8637
8638
  if (point.recent == null || point.prior == null || point.prior < GBP_KEYWORD_MIN_BASELINE) continue;
8638
- const dropPct = Math.round((point.prior - point.recent) / point.prior * 100);
8639
+ const changeRatio = relativeChangeRatio(point.recent, point.prior);
8640
+ if (changeRatio === null) continue;
8641
+ const dropPct = Math.round(-changeRatio * 100);
8639
8642
  if (dropPct < GBP_KEYWORD_DROP_PCT) continue;
8640
8643
  if (!worst || dropPct > worst.dropPct) {
8641
8644
  worst = { keyword: point.keyword, dropPct, recent: point.recent, prior: point.prior };
@@ -25913,7 +25916,7 @@ function summarizeServer(crawlers, fetches, referrals) {
25913
25916
  }
25914
25917
  function comparisonDetail(latest, prior) {
25915
25918
  if (prior === 0) return `${latest} in the latest cohort versus 0 in the prior cohort`;
25916
- const change = Math.round((latest - prior) / prior * 100);
25919
+ const change = deltaPercent(latest, prior) ?? 0;
25917
25920
  return `${latest} in the latest cohort versus ${prior} prior (${change >= 0 ? "+" : ""}${change}%)`;
25918
25921
  }
25919
25922
  function aggregateCoverage(row) {
@@ -35612,7 +35615,7 @@ function computeWindowDelta(rows, referenceDate) {
35612
35615
  const prior = prior7d[metric2] ?? 0;
35613
35616
  recent7d[metric2] = recent;
35614
35617
  prior7d[metric2] = prior;
35615
- deltaPct[metric2] = prior === 0 ? null : Math.round((recent - prior) / prior * 100);
35618
+ deltaPct[metric2] = deltaPercent(recent, prior);
35616
35619
  }
35617
35620
  return { recent7d, prior7d, deltaPct };
35618
35621
  }
@@ -45941,7 +45944,6 @@ async function ga4Routes(app, opts) {
45941
45944
  const prev7d = sumSocial(daysAgo(14), daysAgo(7));
45942
45945
  const current30d = sumSocial(daysAgo(30), fmt(today));
45943
45946
  const prev30d = sumSocial(daysAgo(60), daysAgo(30));
45944
- const pct = (cur, prev) => prev === 0 ? null : Math.round((cur - prev) / prev * 100);
45945
45947
  const sourceCurrent = app.db.select({
45946
45948
  source: gaSocialReferrals.source,
45947
45949
  sessions: sql16`SUM(${gaSocialReferrals.sessions})`
@@ -45970,17 +45972,17 @@ async function ga4Routes(app, opts) {
45970
45972
  source: row.source,
45971
45973
  sessions7d: row.sessions,
45972
45974
  sessionsPrev7d: prev,
45973
- changePct: pct(row.sessions, prev) ?? (row.sessions > 0 ? 100 : 0)
45975
+ changePct: deltaPercent(row.sessions, prev) ?? (row.sessions > 0 ? 100 : 0)
45974
45976
  };
45975
45977
  }
45976
45978
  }
45977
45979
  return {
45978
45980
  socialSessions7d: current7d?.sessions ?? 0,
45979
45981
  socialSessionsPrev7d: prev7d?.sessions ?? 0,
45980
- trend7dPct: pct(current7d?.sessions ?? 0, prev7d?.sessions ?? 0),
45982
+ trend7dPct: deltaPercent(current7d?.sessions ?? 0, prev7d?.sessions ?? 0),
45981
45983
  socialSessions30d: current30d?.sessions ?? 0,
45982
45984
  socialSessionsPrev30d: prev30d?.sessions ?? 0,
45983
- trend30dPct: pct(current30d?.sessions ?? 0, prev30d?.sessions ?? 0),
45985
+ trend30dPct: deltaPercent(current30d?.sessions ?? 0, prev30d?.sessions ?? 0),
45984
45986
  biggestMover
45985
45987
  };
45986
45988
  });
@@ -45994,7 +45996,6 @@ async function ga4Routes(app, opts) {
45994
45996
  d.setDate(d.getDate() - n);
45995
45997
  return fmt(d);
45996
45998
  };
45997
- const pct = (cur, prev) => prev === 0 ? null : Math.round((cur - prev) / prev * 100);
45998
45999
  const sumTotal = (from, to) => app.db.select({ sessions: sql16`COALESCE(SUM(${gaTrafficSnapshots.sessions}), 0)` }).from(gaTrafficSnapshots).where(and35(eq44(gaTrafficSnapshots.projectId, project.id), sql16`${gaTrafficSnapshots.date} >= ${from}`, sql16`${gaTrafficSnapshots.date} < ${to}`)).get();
45999
46000
  const sumOrganic = (from, to) => app.db.select({ sessions: sql16`COALESCE(SUM(${gaTrafficSnapshots.organicSessions}), 0)` }).from(gaTrafficSnapshots).where(and35(eq44(gaTrafficSnapshots.projectId, project.id), sql16`${gaTrafficSnapshots.date} >= ${from}`, sql16`${gaTrafficSnapshots.date} < ${to}`)).get();
46000
46001
  const sumDirect = (from, to) => app.db.select({ sessions: sql16`COALESCE(SUM(${gaTrafficSnapshots.directSessions}), 0)` }).from(gaTrafficSnapshots).where(and35(eq44(gaTrafficSnapshots.projectId, project.id), sql16`${gaTrafficSnapshots.date} >= ${from}`, sql16`${gaTrafficSnapshots.date} < ${to}`)).get();
@@ -46011,7 +46012,7 @@ async function ga4Routes(app, opts) {
46011
46012
  const p7 = sum(daysAgo(14), daysAgo(7))?.sessions ?? 0;
46012
46013
  const c30 = sum(daysAgo(30), todayStr)?.sessions ?? 0;
46013
46014
  const p30 = sum(daysAgo(60), daysAgo(30))?.sessions ?? 0;
46014
- return { sessions7d: c7, sessionsPrev7d: p7, trend7dPct: pct(c7, p7), sessions30d: c30, sessionsPrev30d: p30, trend30dPct: pct(c30, p30) };
46015
+ return { sessions7d: c7, sessionsPrev7d: p7, trend7dPct: deltaPercent(c7, p7), sessions30d: c30, sessionsPrev30d: p30, trend30dPct: deltaPercent(c30, p30) };
46015
46016
  };
46016
46017
  const aiSourceCurrent = app.db.select({ source: gaAiReferrals.source, sessions: sql16`COALESCE(SUM(${gaAiReferrals.sessions}), 0)` }).from(gaAiReferrals).where(and35(
46017
46018
  eq44(gaAiReferrals.projectId, project.id),
@@ -46034,7 +46035,7 @@ async function ga4Routes(app, opts) {
46034
46035
  const delta = Math.abs(row.sessions - p);
46035
46036
  if (delta > maxDelta) {
46036
46037
  maxDelta = delta;
46037
- mover = { source: row.source, sessions7d: row.sessions, sessionsPrev7d: p, changePct: pct(row.sessions, p) ?? (row.sessions > 0 ? 100 : 0) };
46038
+ mover = { source: row.source, sessions7d: row.sessions, sessionsPrev7d: p, changePct: deltaPercent(row.sessions, p) ?? (row.sessions > 0 ? 100 : 0) };
46038
46039
  }
46039
46040
  }
46040
46041
  return mover;
@@ -81,7 +81,7 @@ import {
81
81
  trafficConnectWordpressRequestSchema,
82
82
  trafficEventKindSchema,
83
83
  trafficSeriesGranularitySchema
84
- } from "./chunk-BU6C2DKF.js";
84
+ } from "./chunk-P2CQ57UV.js";
85
85
 
86
86
  // src/config.ts
87
87
  import fs from "fs";
@@ -7126,9 +7126,14 @@ function parseInclusiveEndMs(iso) {
7126
7126
  if (Number.isNaN(ms)) return null;
7127
7127
  return DATE_ONLY_PATTERN.test(iso) ? ms + 864e5 - 1 : ms;
7128
7128
  }
7129
+ function relativeChangeRatio(current, baseline) {
7130
+ if (!Number.isFinite(current) || !Number.isFinite(baseline) || baseline <= 0) return null;
7131
+ const ratio = (current - baseline) / baseline;
7132
+ return Number.isFinite(ratio) ? ratio : null;
7133
+ }
7129
7134
  function deltaPercent(current, prior) {
7130
- if (prior <= 0) return null;
7131
- return Math.round((current - prior) / prior * 100);
7135
+ const ratio = relativeChangeRatio(current, prior);
7136
+ return ratio === null ? null : Math.round(ratio * 100);
7132
7137
  }
7133
7138
  function deltaTone(deltaPct) {
7134
7139
  if (deltaPct === null || deltaPct === 0) return "neutral";
@@ -15184,6 +15189,7 @@ export {
15184
15189
  startOfDayHourInTimeZone,
15185
15190
  formatDateRange,
15186
15191
  parseInclusiveEndMs,
15192
+ relativeChangeRatio,
15187
15193
  deltaPercent,
15188
15194
  deltaTone,
15189
15195
  formatDeltaCopy,
@@ -10,7 +10,7 @@ import {
10
10
  loadConfig,
11
11
  loadConfigRaw,
12
12
  saveConfigPatch
13
- } from "./chunk-QDOZEMDK.js";
13
+ } from "./chunk-J56XZGG6.js";
14
14
  import {
15
15
  CC_CACHE_DIR,
16
16
  DUCKDB_SPEC,
@@ -139,7 +139,7 @@ import {
139
139
  siteCrawlSnapshots,
140
140
  toAlertView,
141
141
  usageCounters
142
- } from "./chunk-QKLNTSQ2.js";
142
+ } from "./chunk-BJLIMWL2.js";
143
143
  import {
144
144
  AGENT_MEMORY_VALUE_MAX_BYTES,
145
145
  AGENT_PROVIDER_IDS,
@@ -253,7 +253,7 @@ import {
253
253
  validationError,
254
254
  winnabilityClassLabel,
255
255
  withRetry
256
- } from "./chunk-BU6C2DKF.js";
256
+ } from "./chunk-P2CQ57UV.js";
257
257
 
258
258
  // src/telemetry.ts
259
259
  import crypto from "crypto";
@@ -9084,7 +9084,7 @@ function readStoredGroundingSources(rawResponse) {
9084
9084
  return result;
9085
9085
  }
9086
9086
  async function backfillInsightsCommand(project, opts) {
9087
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-RDGUEEZQ.js");
9087
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-QGBYYNWV.js");
9088
9088
  const config = loadConfig();
9089
9089
  const db = createClient(config.database);
9090
9090
  migrate(db);
package/dist/cli.js CHANGED
@@ -31,7 +31,7 @@ import {
31
31
  showFirstRunNotice,
32
32
  trackCliCommandFinished,
33
33
  trackEvent
34
- } from "./chunk-L5SMSDZB.js";
34
+ } from "./chunk-UVDX2Y4N.js";
35
35
  import {
36
36
  CliError,
37
37
  EXIT_SYSTEM_ERROR,
@@ -51,7 +51,7 @@ import {
51
51
  saveConfigPatch,
52
52
  systemError,
53
53
  usageError
54
- } from "./chunk-QDOZEMDK.js";
54
+ } from "./chunk-J56XZGG6.js";
55
55
  import {
56
56
  CLOUDFLARE_WORKER_BINDINGS,
57
57
  CLOUDFLARE_WORKER_GENERATED_MARKER,
@@ -65,7 +65,7 @@ import {
65
65
  projects,
66
66
  queries,
67
67
  renderReportHtml
68
- } from "./chunk-QKLNTSQ2.js";
68
+ } from "./chunk-BJLIMWL2.js";
69
69
  import {
70
70
  AdsDeliverySnapshotStatuses,
71
71
  AdsHistoricalCampaignRollupStatuses,
@@ -129,7 +129,7 @@ import {
129
129
  providerQuotaPolicySchema,
130
130
  resolveProviderInput,
131
131
  winnabilityClassSchema
132
- } from "./chunk-BU6C2DKF.js";
132
+ } from "./chunk-P2CQ57UV.js";
133
133
 
134
134
  // src/cli.ts
135
135
  import { pathToFileURL } from "url";
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-L5SMSDZB.js";
3
+ } from "./chunk-UVDX2Y4N.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-QDOZEMDK.js";
7
- import "./chunk-QKLNTSQ2.js";
8
- import "./chunk-BU6C2DKF.js";
6
+ } from "./chunk-J56XZGG6.js";
7
+ import "./chunk-BJLIMWL2.js";
8
+ import "./chunk-P2CQ57UV.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-QKLNTSQ2.js";
4
- import "./chunk-BU6C2DKF.js";
3
+ } from "./chunk-BJLIMWL2.js";
4
+ import "./chunk-P2CQ57UV.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,10 +3,10 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-QDOZEMDK.js";
6
+ } from "./chunk-J56XZGG6.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-BU6C2DKF.js";
9
+ } from "./chunk-P2CQ57UV.js";
10
10
 
11
11
  // src/mcp/cli.ts
12
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonry/canonry",
3
- "version": "4.165.0",
3
+ "version": "4.165.2",
4
4
  "type": "module",
5
5
  "description": "Agent-first open-source AEO operating platform - track how answer engines cite your domain",
6
6
  "license": "FSL-1.1-ALv2",
@@ -70,22 +70,22 @@
70
70
  "@types/node-cron": "^3.0.11",
71
71
  "tsup": "^8.5.1",
72
72
  "tsx": "^4.19.0",
73
- "@ainyc/canonry-api-routes": "0.0.0",
74
73
  "@ainyc/canonry-api-client": "0.0.0",
75
- "@ainyc/canonry-config": "0.0.0",
76
74
  "@ainyc/canonry-contracts": "0.0.0",
75
+ "@ainyc/canonry-api-routes": "0.0.0",
76
+ "@ainyc/canonry-config": "0.0.0",
77
77
  "@ainyc/canonry-db": "0.0.0",
78
78
  "@ainyc/canonry-integration-bing": "0.0.0",
79
- "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
79
+ "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
80
80
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
81
+ "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
81
82
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
82
83
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
83
- "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
84
84
  "@ainyc/canonry-integration-google": "0.0.0",
85
- "@ainyc/canonry-integration-google-places": "0.0.0",
86
85
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
87
- "@ainyc/canonry-integration-wordpress": "0.0.0",
88
86
  "@ainyc/canonry-integration-traffic": "0.0.0",
87
+ "@ainyc/canonry-integration-google-places": "0.0.0",
88
+ "@ainyc/canonry-integration-wordpress": "0.0.0",
89
89
  "@ainyc/canonry-intelligence": "0.0.0",
90
90
  "@ainyc/canonry-provider-claude": "0.0.0",
91
91
  "@ainyc/canonry-provider-local": "0.0.0",