@canonry/canonry 4.179.2 → 4.180.1
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.
- package/assets/assets/{AuditHistoryPanel-TTMgg1iQ.js → AuditHistoryPanel-DI6iXS0J.js} +1 -1
- package/assets/assets/{BacklinksPage-BmlsStTz.js → BacklinksPage-DiwTMJTp.js} +1 -1
- package/assets/assets/{HistoryPage-OlX3tvxL.js → HistoryPage-BWODoEok.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-B_usHzN3.js → MeasurementPropertyPage-C1uZ9LEl.js} +1 -1
- package/assets/assets/{ProjectPage-DsC2NUCt.js → ProjectPage-C-fk0Jja.js} +8 -8
- package/assets/assets/{RunRow-BL8kiPON.js → RunRow-CMSISg-I.js} +1 -1
- package/assets/assets/{RunsPage-BXMLPcIB.js → RunsPage-HZwwLQDE.js} +1 -1
- package/assets/assets/{SettingsPage-Bm_T8JMf.js → SettingsPage-3eoRO4ze.js} +1 -1
- package/assets/assets/{SiteHealthSection-xlUYOOe2.js → SiteHealthSection-CATUc26x.js} +3 -3
- package/assets/assets/{TrafficPage-DmyGEdhw.js → TrafficPage-Cw8AM5VR.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-sbu3kXCD.js → TrafficSourceDetailPage-ChFDAstr.js} +1 -1
- package/assets/assets/{extract-error-message-Ra108eiS.js → extract-error-message-CG_IQ_9c.js} +1 -1
- package/assets/assets/{index-rJBOFic-.js → index-Dz0ju3qg.js} +3 -3
- package/assets/assets/{react-sigma_core.esm.min-tfJo9bgS.js → react-sigma_core.esm.min-BvgsCKLZ.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-E2JGJH5E.js → chunk-3JW762Q4.js} +29 -4
- package/dist/{chunk-VRQ7U4HU.js → chunk-A6XDLCKF.js} +2 -2
- package/dist/{chunk-SKL6ZDIY.js → chunk-BJAZWJNH.js} +4 -4
- package/dist/{chunk-F4HFEWLM.js → chunk-NFALEGSZ.js} +1 -1
- package/dist/{chunk-Z46AW53D.js → chunk-VEEHINTY.js} +52 -29
- package/dist/cli.js +10 -5
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-F67UFJBG.js → intelligence-service-NHAF7V6L.js} +2 -2
- package/dist/mcp.js +3 -3
- package/package.json +5 -5
package/assets/assets/{react-sigma_core.esm.min-tfJo9bgS.js → react-sigma_core.esm.min-BvgsCKLZ.js}
RENAMED
|
@@ -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-
|
|
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-CATUc26x.js";import"./index-Dz0ju3qg.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-DG35TyhH.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-
|
|
15
|
+
<script type="module" crossorigin src="./assets/index-Dz0ju3qg.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">
|
|
@@ -7687,8 +7687,33 @@ var gscPeriodTotalsSchema = z19.object({
|
|
|
7687
7687
|
source: z19.enum(["property-daily", "dimensioned", "mixed", "empty"])
|
|
7688
7688
|
});
|
|
7689
7689
|
var gscPeriodComparisonSchema = z19.object({
|
|
7690
|
-
/**
|
|
7690
|
+
/**
|
|
7691
|
+
* Length of EACH period in calendar days. Equals the selected window under
|
|
7692
|
+
* `basis: 'prior-window'`, and half of it under `basis: 'split-window'`.
|
|
7693
|
+
*/
|
|
7691
7694
|
days: z19.number(),
|
|
7695
|
+
/**
|
|
7696
|
+
* Which two periods these are, so a surface can say what it is showing.
|
|
7697
|
+
*
|
|
7698
|
+
* `prior-window` — the selected window against the equal-length period
|
|
7699
|
+
* immediately before it. What a reader means by "vs prior 90d".
|
|
7700
|
+
*
|
|
7701
|
+
* `split-window` — the selected window's own trailing and leading halves.
|
|
7702
|
+
* Used when there is nothing before the window to compare with: an unbounded
|
|
7703
|
+
* selection (`window=all`), or a prior period the sync never reached, whose
|
|
7704
|
+
* unsynced days would otherwise be counted as zeroes and manufacture growth.
|
|
7705
|
+
* A surface printing "vs prior {days}d" here is naming a period HALF the
|
|
7706
|
+
* length of the control the reader pressed, which is honest but surprising —
|
|
7707
|
+
* hence the label.
|
|
7708
|
+
*
|
|
7709
|
+
* Optional for the same reason as `window` and `trends`: a server older than
|
|
7710
|
+
* this field returns the comparison WITHOUT it, and declaring it required
|
|
7711
|
+
* would tell a generated consumer it may dereference the field safely against
|
|
7712
|
+
* a legacy response. Absent means the basis is unstated; every such server
|
|
7713
|
+
* split the window, but a surface should render the absence with its
|
|
7714
|
+
* period-length copy rather than assert a basis nobody sent.
|
|
7715
|
+
*/
|
|
7716
|
+
basis: z19.enum(["prior-window", "split-window"]).optional(),
|
|
7692
7717
|
prior: gscPeriodTotalsSchema,
|
|
7693
7718
|
trailing: gscPeriodTotalsSchema,
|
|
7694
7719
|
/**
|
|
@@ -7744,9 +7769,9 @@ var gscPerformanceDailyDtoSchema = z19.object({
|
|
|
7744
7769
|
trends: gscPerformanceTrendsSchema.optional(),
|
|
7745
7770
|
/**
|
|
7746
7771
|
* Optional for the same reason as `window` and `trends`, and additionally
|
|
7747
|
-
* null when
|
|
7748
|
-
*
|
|
7749
|
-
*
|
|
7772
|
+
* null when there is no span to divide into two periods, no evidence, or the
|
|
7773
|
+
* span extends beyond the project's known GSC data frontier. A consumer must
|
|
7774
|
+
* render the absence rather than substitute a percentage.
|
|
7750
7775
|
*/
|
|
7751
7776
|
periodComparison: gscPeriodComparisonSchema.nullable().optional()
|
|
7752
7777
|
});
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
installSkills,
|
|
6
6
|
loadConfigRaw,
|
|
7
7
|
saveConfigPatch
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-NFALEGSZ.js";
|
|
9
9
|
import {
|
|
10
10
|
SKILL_MANIFEST_FILENAME,
|
|
11
11
|
SkillsClients
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3JW762Q4.js";
|
|
13
13
|
|
|
14
14
|
// src/skills-autosync.ts
|
|
15
15
|
import fs from "fs";
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
loadConfig,
|
|
12
12
|
loadConfigRaw,
|
|
13
13
|
saveConfigPatch
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-NFALEGSZ.js";
|
|
15
15
|
import {
|
|
16
16
|
CC_CACHE_DIR,
|
|
17
17
|
DUCKDB_SPEC,
|
|
@@ -157,7 +157,7 @@ import {
|
|
|
157
157
|
siteCrawlSnapshots,
|
|
158
158
|
toAlertView,
|
|
159
159
|
usageCounters
|
|
160
|
-
} from "./chunk-
|
|
160
|
+
} from "./chunk-VEEHINTY.js";
|
|
161
161
|
import {
|
|
162
162
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
163
163
|
AGENT_PROVIDER_IDS,
|
|
@@ -295,7 +295,7 @@ import {
|
|
|
295
295
|
validationError,
|
|
296
296
|
winnabilityClassLabel,
|
|
297
297
|
withRetry
|
|
298
|
-
} from "./chunk-
|
|
298
|
+
} from "./chunk-3JW762Q4.js";
|
|
299
299
|
|
|
300
300
|
// src/telemetry.ts
|
|
301
301
|
import crypto from "crypto";
|
|
@@ -11857,7 +11857,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
11857
11857
|
return result;
|
|
11858
11858
|
}
|
|
11859
11859
|
async function backfillInsightsCommand(project, opts) {
|
|
11860
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
11860
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-NHAF7V6L.js");
|
|
11861
11861
|
const config = loadConfig();
|
|
11862
11862
|
const db = createClient(config.database);
|
|
11863
11863
|
migrate(db);
|
|
@@ -642,7 +642,7 @@ import {
|
|
|
642
642
|
wordpressSchemaDeployResultDtoSchema,
|
|
643
643
|
wordpressSchemaStatusResultDtoSchema,
|
|
644
644
|
wordpressStatusDtoSchema
|
|
645
|
-
} from "./chunk-
|
|
645
|
+
} from "./chunk-3JW762Q4.js";
|
|
646
646
|
|
|
647
647
|
// src/intelligence-service.ts
|
|
648
648
|
import { eq as eq62, desc as desc27, asc as asc11, and as and51, ne as ne8, or as or14, inArray as inArray22, gte as gte14, lte as lte12, isNull as isNull9, sql as sql25, exists } from "drizzle-orm";
|
|
@@ -20596,7 +20596,7 @@ function validateCron(expr) {
|
|
|
20596
20596
|
}
|
|
20597
20597
|
return true;
|
|
20598
20598
|
}
|
|
20599
|
-
function validateCronField(field,
|
|
20599
|
+
function validateCronField(field, min2, max2) {
|
|
20600
20600
|
if (field === "*") return true;
|
|
20601
20601
|
const segments = field.split(",");
|
|
20602
20602
|
for (const segment of segments) {
|
|
@@ -20612,7 +20612,7 @@ function validateCronField(field, min, max2) {
|
|
|
20612
20612
|
if (rangeParts.length > 2) return false;
|
|
20613
20613
|
for (const part of rangeParts) {
|
|
20614
20614
|
const num = parseInt(part, 10);
|
|
20615
|
-
if (isNaN(num) || num <
|
|
20615
|
+
if (isNaN(num) || num < min2 || num > max2) return false;
|
|
20616
20616
|
}
|
|
20617
20617
|
}
|
|
20618
20618
|
return true;
|
|
@@ -22356,10 +22356,10 @@ function buildCategoryCounts(counts2) {
|
|
|
22356
22356
|
// ../api-routes/src/intelligence.ts
|
|
22357
22357
|
import { eq as eq25, desc as desc9, and as and19, inArray as inArray10, like } from "drizzle-orm";
|
|
22358
22358
|
var SEVERITY_RANK = { low: 0, medium: 1, high: 2, critical: 3 };
|
|
22359
|
-
function severitiesAtOrAbove(
|
|
22360
|
-
const floor = SEVERITY_RANK[
|
|
22359
|
+
function severitiesAtOrAbove(min2) {
|
|
22360
|
+
const floor = SEVERITY_RANK[min2];
|
|
22361
22361
|
if (floor === void 0) {
|
|
22362
|
-
throw validationError(`Invalid severity "${
|
|
22362
|
+
throw validationError(`Invalid severity "${min2}". Use one of: low, medium, high, critical.`);
|
|
22363
22363
|
}
|
|
22364
22364
|
return Object.keys(SEVERITY_RANK).filter((s) => SEVERITY_RANK[s] >= floor);
|
|
22365
22365
|
}
|
|
@@ -23338,7 +23338,7 @@ function winnabilityClassRank(winnabilityClass) {
|
|
|
23338
23338
|
}
|
|
23339
23339
|
|
|
23340
23340
|
// ../api-routes/src/gsc-totals.ts
|
|
23341
|
-
import { and as and23, asc as asc4, eq as eq28, sql as sql9, max } from "drizzle-orm";
|
|
23341
|
+
import { and as and23, asc as asc4, eq as eq28, sql as sql9, max, min } from "drizzle-orm";
|
|
23342
23342
|
var WINDOW_DAYS = { "7d": 7, "30d": 30, "90d": 90 };
|
|
23343
23343
|
function resolveGscWindowRange(window, latestDataDate, today) {
|
|
23344
23344
|
if (window === "all") {
|
|
@@ -23379,6 +23379,11 @@ function readLatestGscDataDate(db, projectId) {
|
|
|
23379
23379
|
const dimensioned = db.select({ latest: max(gscSearchData.date) }).from(gscSearchData).where(eq28(gscSearchData.projectId, projectId)).get()?.latest ?? null;
|
|
23380
23380
|
return [watermark, property, dimensioned].filter((d) => d !== null).reduce((maxDate, d) => maxDate === null || d > maxDate ? d : maxDate, null);
|
|
23381
23381
|
}
|
|
23382
|
+
function readEarliestGscDataDate(db, projectId) {
|
|
23383
|
+
const property = db.select({ earliest: min(gscDailyTotals.date) }).from(gscDailyTotals).where(eq28(gscDailyTotals.projectId, projectId)).get()?.earliest ?? null;
|
|
23384
|
+
const dimensioned = db.select({ earliest: min(gscSearchData.date) }).from(gscSearchData).where(eq28(gscSearchData.projectId, projectId)).get()?.earliest ?? null;
|
|
23385
|
+
return [property, dimensioned].filter((d) => d !== null).reduce((earliest, d) => earliest === null || d < earliest ? d : earliest, null);
|
|
23386
|
+
}
|
|
23382
23387
|
function readGscDailyTotals(db, projectId, startDate, endDate) {
|
|
23383
23388
|
const rows = db.select({
|
|
23384
23389
|
date: gscDailyTotals.date,
|
|
@@ -26869,20 +26874,26 @@ function buildReportActionPlan(input) {
|
|
|
26869
26874
|
});
|
|
26870
26875
|
}
|
|
26871
26876
|
if (actions.length === 0) {
|
|
26877
|
+
const neverMeasured = input.citationScorecard.providers.length === 0;
|
|
26872
26878
|
actions.push({
|
|
26873
26879
|
audience: "both",
|
|
26874
26880
|
priority: 90,
|
|
26875
26881
|
horizon: "short-term",
|
|
26876
26882
|
category: "monitoring",
|
|
26877
|
-
title: "Keep monitoring citation and mention coverage",
|
|
26878
|
-
action: "Run the next scheduled check and watch for citation gains, losses, and engine-specific misses.",
|
|
26879
|
-
why: [
|
|
26883
|
+
title: neverMeasured ? "Run the first visibility check" : "Keep monitoring citation and mention coverage",
|
|
26884
|
+
action: neverMeasured ? "Run an answer-visibility check to establish the first citation and mention baseline." : "Run the next scheduled check and watch for citation gains, losses, and engine-specific misses.",
|
|
26885
|
+
why: neverMeasured ? [
|
|
26886
|
+
"No answer-engine check has completed for this project, so there is no citation or mention evidence to act on yet.",
|
|
26887
|
+
"The rest of this report can only describe what was measured, and this signal has not been measured once."
|
|
26888
|
+
] : [
|
|
26880
26889
|
"No urgent corrective action surfaced from the current evidence.",
|
|
26881
26890
|
"AEO performance is directional; repeated checks are needed before overreacting to a single sample."
|
|
26882
26891
|
],
|
|
26883
|
-
evidence: [
|
|
26884
|
-
|
|
26885
|
-
|
|
26892
|
+
evidence: [
|
|
26893
|
+
neverMeasured ? "No completed answer-engine snapshots exist for this project, so nothing could be detected either way." : "No critical insights, content gaps, indexing blockers, or provider-zero issues were detected in this report."
|
|
26894
|
+
],
|
|
26895
|
+
successMetric: neverMeasured ? "A first check completes and produces a citation and mention baseline." : "Coverage stays stable or improves across the next trend window.",
|
|
26896
|
+
confidence: neverMeasured ? "high" : "medium"
|
|
26886
26897
|
});
|
|
26887
26898
|
}
|
|
26888
26899
|
return actions.sort((a, b) => a.priority - b.priority).slice(0, 10);
|
|
@@ -26947,14 +26958,17 @@ function buildAgencyDiagnostics(input) {
|
|
|
26947
26958
|
});
|
|
26948
26959
|
}
|
|
26949
26960
|
if (input.indexingHealth) {
|
|
26961
|
+
const inspected = input.indexingHealth.total > 0;
|
|
26962
|
+
const provider = input.indexingHealth.provider ?? "the connected provider";
|
|
26950
26963
|
diagnostics.push({
|
|
26951
26964
|
title: "Indexing health",
|
|
26952
|
-
detail: `${input.indexingHealth.indexedPct}% of inspected URLs are indexed in ${
|
|
26953
|
-
|
|
26954
|
-
|
|
26965
|
+
detail: inspected ? `${input.indexingHealth.indexedPct}% of inspected URLs are indexed in ${provider}.` : `No URLs have been inspected in ${provider} yet, so indexing coverage is not measured.`,
|
|
26966
|
+
// Not measured is not a finding, so it must not carry a finding's tone.
|
|
26967
|
+
severity: !inspected ? "neutral" : input.indexingHealth.indexedPct >= 90 ? "positive" : input.indexingHealth.indexedPct >= 70 ? "caution" : "negative",
|
|
26968
|
+
evidence: inspected ? [
|
|
26955
26969
|
`${input.indexingHealth.indexed}/${input.indexingHealth.total} indexed`,
|
|
26956
26970
|
`${input.indexingHealth.notIndexed} not indexed`
|
|
26957
|
-
]
|
|
26971
|
+
] : ["0 URLs inspected"]
|
|
26958
26972
|
});
|
|
26959
26973
|
}
|
|
26960
26974
|
diagnostics.push({
|
|
@@ -38096,6 +38110,7 @@ function computeGscPeriodComparison(daily, bounds) {
|
|
|
38096
38110
|
const comparable = prior.source !== "dimensioned" && prior.source !== "mixed" && trailing.source !== "dimensioned" && trailing.source !== "mixed";
|
|
38097
38111
|
return {
|
|
38098
38112
|
days: periodDays,
|
|
38113
|
+
basis: bounds?.basis ?? "split-window",
|
|
38099
38114
|
prior,
|
|
38100
38115
|
trailing,
|
|
38101
38116
|
comparable,
|
|
@@ -40498,12 +40513,19 @@ async function googleRoutes(app, opts) {
|
|
|
40498
40513
|
gscToday()
|
|
40499
40514
|
);
|
|
40500
40515
|
const cutoffDate = startDate ? null : resolvedWindow.startDate;
|
|
40516
|
+
const reportedWindow = resolveReportedWindow(resolvedWindow, startDate, endDate);
|
|
40501
40517
|
const windowStart = startDate ?? cutoffDate ?? "";
|
|
40502
40518
|
const windowEnd = endDate ?? resolvedWindow.endDate ?? "9999-12-31";
|
|
40503
|
-
const
|
|
40519
|
+
const priorPeriodStart = reportedWindow.startDate !== null && reportedWindow.endDate !== null ? (() => {
|
|
40520
|
+
const span = inclusiveDayCount(reportedWindow.startDate, reportedWindow.endDate);
|
|
40521
|
+
return span !== null && span > 0 ? shiftIsoCalendarDate(reportedWindow.startDate, -span) : null;
|
|
40522
|
+
})() : null;
|
|
40523
|
+
const earliestDataDate = priorPeriodStart === null ? null : readEarliestGscDataDate(app.db, project.id);
|
|
40524
|
+
const priorWindowIsSynced = priorPeriodStart !== null && earliestDataDate !== null && priorPeriodStart >= earliestDataDate;
|
|
40525
|
+
const fetchStart = priorWindowIsSynced ? priorPeriodStart : windowStart;
|
|
40526
|
+
const dailyTotals = readGscDailyTotals(app.db, project.id, fetchStart, windowEnd);
|
|
40504
40527
|
const conditions = [eq40(gscSearchData.projectId, project.id)];
|
|
40505
|
-
if (
|
|
40506
|
-
else if (cutoffDate) conditions.push(sql14`${gscSearchData.date} >= ${cutoffDate}`);
|
|
40528
|
+
if (fetchStart) conditions.push(sql14`${gscSearchData.date} >= ${fetchStart}`);
|
|
40507
40529
|
if (endDate) conditions.push(sql14`${gscSearchData.date} <= ${endDate}`);
|
|
40508
40530
|
const dimensionedRows = app.db.select({
|
|
40509
40531
|
date: gscSearchData.date,
|
|
@@ -40511,7 +40533,7 @@ async function googleRoutes(app, opts) {
|
|
|
40511
40533
|
impressions: sql14`COALESCE(SUM(${gscSearchData.impressions}), 0)`
|
|
40512
40534
|
}).from(gscSearchData).where(and32(...conditions)).groupBy(gscSearchData.date).orderBy(gscSearchData.date).all();
|
|
40513
40535
|
const propertyDates = new Set(dailyTotals.map((d) => d.date));
|
|
40514
|
-
const
|
|
40536
|
+
const comparisonDaily = mergeGscDailyTotalsWithFallback(
|
|
40515
40537
|
dailyTotals,
|
|
40516
40538
|
dimensionedRows.map((r) => ({
|
|
40517
40539
|
date: r.date,
|
|
@@ -40526,6 +40548,7 @@ async function googleRoutes(app, opts) {
|
|
|
40526
40548
|
ctr: d.impressions > 0 ? d.clicks / d.impressions : 0,
|
|
40527
40549
|
position: propertyDates.has(d.date) ? d.position : null
|
|
40528
40550
|
}));
|
|
40551
|
+
const daily = fetchStart === windowStart ? comparisonDaily : comparisonDaily.filter((d) => d.date >= windowStart && d.date <= windowEnd);
|
|
40529
40552
|
const totalClicks = daily.reduce((sum, d) => sum + d.clicks, 0);
|
|
40530
40553
|
const totalImpressions = daily.reduce((sum, d) => sum + d.impressions, 0);
|
|
40531
40554
|
let positionWeight = 0;
|
|
@@ -40541,10 +40564,15 @@ async function googleRoutes(app, opts) {
|
|
|
40541
40564
|
const row = byDate.get(date);
|
|
40542
40565
|
return row ? pick(row) : null;
|
|
40543
40566
|
});
|
|
40544
|
-
const reportedWindow = resolveReportedWindow(resolvedWindow, startDate, endDate);
|
|
40545
|
-
const comparisonStart = reportedWindow.startDate ?? daily[0]?.date;
|
|
40546
40567
|
const comparisonEnd = reportedWindow.endDate ?? daily[daily.length - 1]?.date;
|
|
40547
40568
|
const comparisonEndsWithinKnownData = reportedWindow.latestDataDate !== null && comparisonEnd <= reportedWindow.latestDataDate;
|
|
40569
|
+
const taggedComparisonDaily = comparisonDaily.map((d) => ({
|
|
40570
|
+
...d,
|
|
40571
|
+
fromPropertyTotals: propertyDates.has(d.date)
|
|
40572
|
+
}));
|
|
40573
|
+
const comparisonFor = (basis, startDate2) => startDate2 && comparisonEnd && comparisonEndsWithinKnownData ? computeGscPeriodComparison(taggedComparisonDaily, { startDate: startDate2, endDate: comparisonEnd, basis }) : null;
|
|
40574
|
+
const priorWindowComparison = priorWindowIsSynced ? comparisonFor("prior-window", priorPeriodStart) : null;
|
|
40575
|
+
const periodComparison = priorWindowComparison?.comparable ? priorWindowComparison : comparisonFor("split-window", reportedWindow.startDate ?? daily[0]?.date);
|
|
40548
40576
|
return {
|
|
40549
40577
|
totals: {
|
|
40550
40578
|
clicks: totalClicks,
|
|
@@ -40586,12 +40614,7 @@ async function googleRoutes(app, opts) {
|
|
|
40586
40614
|
// it goes negative for a metric that cannot be. Computed server-side for
|
|
40587
40615
|
// the same UI/CLI parity reason as the fit: a percentage derived in a
|
|
40588
40616
|
// chart component is invisible to an agent.
|
|
40589
|
-
periodComparison
|
|
40590
|
-
// The source tag is the comparison module's input, NOT part of the
|
|
40591
|
-
// response: `daily` on the wire stays exactly what the DTO declares.
|
|
40592
|
-
daily.map((d) => ({ ...d, fromPropertyTotals: propertyDates.has(d.date) })),
|
|
40593
|
-
{ startDate: comparisonStart, endDate: comparisonEnd }
|
|
40594
|
-
) : null
|
|
40617
|
+
periodComparison
|
|
40595
40618
|
};
|
|
40596
40619
|
});
|
|
40597
40620
|
app.get("/projects/:name/google/gsc/top-pages", async (request) => {
|
package/dist/cli.js
CHANGED
|
@@ -26,11 +26,11 @@ import {
|
|
|
26
26
|
showFirstRunNotice,
|
|
27
27
|
trackCliCommandFinished,
|
|
28
28
|
trackEvent
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-BJAZWJNH.js";
|
|
30
30
|
import {
|
|
31
31
|
autoSyncSkills,
|
|
32
32
|
formatAutoSyncNotice
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-A6XDLCKF.js";
|
|
34
34
|
import {
|
|
35
35
|
CliError,
|
|
36
36
|
EXIT_SYSTEM_ERROR,
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
saveConfigPatch,
|
|
56
56
|
systemError,
|
|
57
57
|
usageError
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-NFALEGSZ.js";
|
|
59
59
|
import {
|
|
60
60
|
CLOUDFLARE_WORKER_BINDINGS,
|
|
61
61
|
CLOUDFLARE_WORKER_GENERATED_MARKER,
|
|
@@ -69,7 +69,7 @@ import {
|
|
|
69
69
|
projects,
|
|
70
70
|
queries,
|
|
71
71
|
renderReportHtml
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-VEEHINTY.js";
|
|
73
73
|
import {
|
|
74
74
|
AdsDeliverySnapshotStatuses,
|
|
75
75
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -138,7 +138,7 @@ import {
|
|
|
138
138
|
providerQuotaPolicySchema,
|
|
139
139
|
resolveProviderInput,
|
|
140
140
|
winnabilityClassSchema
|
|
141
|
-
} from "./chunk-
|
|
141
|
+
} from "./chunk-3JW762Q4.js";
|
|
142
142
|
|
|
143
143
|
// src/cli.ts
|
|
144
144
|
import { pathToFileURL } from "url";
|
|
@@ -7903,6 +7903,11 @@ No period comparison: period comparison needs property-level daily data. Sync ag
|
|
|
7903
7903
|
`
|
|
7904
7904
|
Last ${cmp.days} day${cmp.days === 1 ? "" : "s"} (${cmp.trailing.startDate} to ${cmp.trailing.endDate}) vs prior ${cmp.days} (${cmp.prior.startDate} to ${cmp.prior.endDate}):`
|
|
7905
7905
|
);
|
|
7906
|
+
if (cmp.basis === "split-window") {
|
|
7907
|
+
console.log(
|
|
7908
|
+
` (no equal-length period with synced data before this window, so it was split in two)`
|
|
7909
|
+
);
|
|
7910
|
+
}
|
|
7906
7911
|
for (const [label, ratio, prior, trailing, inverted] of [
|
|
7907
7912
|
["Clicks", cmp.change.clicks, cmp.prior.clicks, cmp.trailing.clicks, false],
|
|
7908
7913
|
["Impressions", cmp.change.impressions, cmp.prior.impressions, cmp.trailing.impressions, false],
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
createGoogleMarketingCredentialStore,
|
|
4
4
|
createGoogleMarketingRuntime,
|
|
5
5
|
createServer
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BJAZWJNH.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-NFALEGSZ.js";
|
|
10
|
+
import "./chunk-VEEHINTY.js";
|
|
11
|
+
import "./chunk-3JW762Q4.js";
|
|
12
12
|
export {
|
|
13
13
|
GoogleMarketingRuntimeError,
|
|
14
14
|
createGoogleMarketingCredentialStore,
|
package/dist/mcp.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoSyncSkills
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-A6XDLCKF.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient,
|
|
6
6
|
createCanonryMcpServer
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NFALEGSZ.js";
|
|
8
8
|
import {
|
|
9
9
|
isReadOnlyKey
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3JW762Q4.js";
|
|
11
11
|
|
|
12
12
|
// src/mcp/cli.ts
|
|
13
13
|
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.
|
|
3
|
+
"version": "4.180.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Self-hosted AI visibility (AEO) platform: track how ChatGPT, Claude, Gemini, and Perplexity cite your domain, join it with Search Console, GA4, server-side traffic, and paid media, and fix what you find through agent tools (CLI, REST, MCP). Local SQLite.",
|
|
6
6
|
"license": "FSL-1.1-ALv2",
|
|
@@ -71,10 +71,10 @@
|
|
|
71
71
|
"tsup": "^8.5.1",
|
|
72
72
|
"tsx": "^4.19.0",
|
|
73
73
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
74
|
-
"@ainyc/canonry-config": "0.0.0",
|
|
75
74
|
"@ainyc/canonry-api-client": "0.0.0",
|
|
76
|
-
"@ainyc/canonry-
|
|
75
|
+
"@ainyc/canonry-config": "0.0.0",
|
|
77
76
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
77
|
+
"@ainyc/canonry-db": "0.0.0",
|
|
78
78
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
79
79
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
80
80
|
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
@@ -84,10 +84,10 @@
|
|
|
84
84
|
"@ainyc/canonry-integration-google-ads": "0.0.0",
|
|
85
85
|
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
86
86
|
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
87
|
-
"@ainyc/canonry-integration-google-tag-manager": "0.0.0",
|
|
88
|
-
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
89
87
|
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
88
|
+
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
90
89
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
90
|
+
"@ainyc/canonry-integration-google-tag-manager": "0.0.0",
|
|
91
91
|
"@ainyc/canonry-intelligence": "0.0.0",
|
|
92
92
|
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
93
93
|
"@ainyc/canonry-provider-claude": "0.0.0",
|