@canonry/canonry 4.180.0 → 4.180.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/assets/agent-workspace/skills/canonry/references/canonry-cli.md +11 -6
  2. package/assets/assets/{AuditHistoryPanel-DI6iXS0J.js → AuditHistoryPanel-Cf-jEEKZ.js} +1 -1
  3. package/assets/assets/{BacklinksPage-DiwTMJTp.js → BacklinksPage-oMcS6Hc_.js} +1 -1
  4. package/assets/assets/{HistoryPage-BWODoEok.js → HistoryPage-CDQOpxi0.js} +1 -1
  5. package/assets/assets/{MeasurementPropertyPage-C1uZ9LEl.js → MeasurementPropertyPage-MoKFTmrS.js} +1 -1
  6. package/assets/assets/{ProjectPage-C-fk0Jja.js → ProjectPage-CtD1AwXE.js} +8 -8
  7. package/assets/assets/{RunRow-CMSISg-I.js → RunRow-CPekiscK.js} +1 -1
  8. package/assets/assets/{RunsPage-HZwwLQDE.js → RunsPage-hn05ImCv.js} +1 -1
  9. package/assets/assets/{SettingsPage-3eoRO4ze.js → SettingsPage-BOTYXtfF.js} +1 -1
  10. package/assets/assets/{SiteHealthSection-CATUc26x.js → SiteHealthSection-FwMZ11F8.js} +3 -3
  11. package/assets/assets/{TrafficPage-Cw8AM5VR.js → TrafficPage-f2v6A_uk.js} +1 -1
  12. package/assets/assets/{TrafficSourceDetailPage-ChFDAstr.js → TrafficSourceDetailPage-nhWRLHiu.js} +1 -1
  13. package/assets/assets/{extract-error-message-CG_IQ_9c.js → extract-error-message-Cp1YeVEr.js} +1 -1
  14. package/assets/assets/{index-Dz0ju3qg.js → index-VmxEHABq.js} +22 -22
  15. package/assets/assets/{react-sigma_core.esm.min-BvgsCKLZ.js → react-sigma_core.esm.min-fnm2MkMi.js} +1 -1
  16. package/assets/index.html +1 -1
  17. package/dist/{chunk-QPJC2H6J.js → chunk-44LVINXQ.js} +39 -20
  18. package/dist/{chunk-A6XDLCKF.js → chunk-4XHQ2GCN.js} +2 -2
  19. package/dist/{chunk-UD3YJQOV.js → chunk-665YENL2.js} +4 -10
  20. package/dist/{chunk-3JW762Q4.js → chunk-6IR32MIH.js} +5 -7
  21. package/dist/{chunk-NFALEGSZ.js → chunk-DA25LOTW.js} +2 -2
  22. package/dist/cli.js +5 -5
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-WQPUIJO6.js → intelligence-service-RNBODYMZ.js} +2 -2
  25. package/dist/mcp.js +3 -3
  26. package/package.json +10 -10
@@ -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-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.
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-FwMZ11F8.js";import"./index-VmxEHABq.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-Dz0ju3qg.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-VmxEHABq.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">
@@ -642,7 +642,7 @@ import {
642
642
  wordpressSchemaDeployResultDtoSchema,
643
643
  wordpressSchemaStatusResultDtoSchema,
644
644
  wordpressStatusDtoSchema
645
- } from "./chunk-3JW762Q4.js";
645
+ } from "./chunk-6IR32MIH.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";
@@ -26874,20 +26874,26 @@ function buildReportActionPlan(input) {
26874
26874
  });
26875
26875
  }
26876
26876
  if (actions.length === 0) {
26877
+ const neverMeasured = input.citationScorecard.providers.length === 0;
26877
26878
  actions.push({
26878
26879
  audience: "both",
26879
26880
  priority: 90,
26880
26881
  horizon: "short-term",
26881
26882
  category: "monitoring",
26882
- title: "Keep monitoring citation and mention coverage",
26883
- action: "Run the next scheduled check and watch for citation gains, losses, and engine-specific misses.",
26884
- 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
+ ] : [
26885
26889
  "No urgent corrective action surfaced from the current evidence.",
26886
26890
  "AEO performance is directional; repeated checks are needed before overreacting to a single sample."
26887
26891
  ],
26888
- evidence: ["No critical insights, content gaps, indexing blockers, or provider-zero issues were detected in this report."],
26889
- successMetric: "Coverage stays stable or improves across the next trend window.",
26890
- confidence: "medium"
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"
26891
26897
  });
26892
26898
  }
26893
26899
  return actions.sort((a, b) => a.priority - b.priority).slice(0, 10);
@@ -26952,14 +26958,17 @@ function buildAgencyDiagnostics(input) {
26952
26958
  });
26953
26959
  }
26954
26960
  if (input.indexingHealth) {
26961
+ const inspected = input.indexingHealth.total > 0;
26962
+ const provider = input.indexingHealth.provider ?? "the connected provider";
26955
26963
  diagnostics.push({
26956
26964
  title: "Indexing health",
26957
- detail: `${input.indexingHealth.indexedPct}% of inspected URLs are indexed in ${input.indexingHealth.provider ?? "the connected provider"}.`,
26958
- severity: input.indexingHealth.indexedPct >= 90 ? "positive" : input.indexingHealth.indexedPct >= 70 ? "caution" : "negative",
26959
- evidence: [
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 ? [
26960
26969
  `${input.indexingHealth.indexed}/${input.indexingHealth.total} indexed`,
26961
26970
  `${input.indexingHealth.notIndexed} not indexed`
26962
- ]
26971
+ ] : ["0 URLs inspected"]
26963
26972
  });
26964
26973
  }
26965
26974
  diagnostics.push({
@@ -34391,7 +34400,7 @@ var routeCatalog = [
34391
34400
  method: "post",
34392
34401
  path: "/api/v1/projects/{name}/ads/campaigns",
34393
34402
  summary: "Create a paused OpenAI Ads campaign",
34394
- description: "The server always creates the campaign paused. Click bidding requires at least one unique conversion event-setting ID. Omit both bidding fields for legacy impressions mode. Status is not accepted from the caller.",
34403
+ description: "The server always creates the campaign paused. biddingType is what the account is billed for and is immutable after creation; conversionEventSettingIds is the independent, optional optimization target, so click bidding may carry none. Omit both bidding fields for legacy impressions mode. Status is not accepted from the caller.",
34395
34404
  tags: ["ads"],
34396
34405
  parameters: [nameParameter],
34397
34406
  requestBody: {
@@ -34412,7 +34421,7 @@ var routeCatalog = [
34412
34421
  type: "array",
34413
34422
  uniqueItems: true,
34414
34423
  items: stringSchema,
34415
- description: "Required and non-empty when biddingType is clicks."
34424
+ description: "Optional conversion events to optimize delivery toward. Independent of biddingType: a clicks campaign may omit these."
34416
34425
  }
34417
34426
  }
34418
34427
  } } }
@@ -70139,10 +70148,16 @@ function bindTrafficSyncSchedule(tx, projectId, sourceId, now, createIfMissing =
70139
70148
  }).run();
70140
70149
  return { changed: true, created: true };
70141
70150
  }
70151
+ var VercelRetentionClampError = class extends Error {
70152
+ constructor(requestedStartMs, effectiveStartMs) {
70153
+ super(
70154
+ `Vercel request-logs retention starts at ${new Date(effectiveStartMs).toISOString()}, after requested start ${new Date(requestedStartMs).toISOString()}; refusing to advance because historical traffic would be skipped`
70155
+ );
70156
+ this.name = "VercelRetentionClampError";
70157
+ }
70158
+ };
70142
70159
  function vercelRetentionClampError(requestedStartMs, effectiveStartMs) {
70143
- return new Error(
70144
- `Vercel request-logs retention starts at ${new Date(effectiveStartMs).toISOString()}, after requested start ${new Date(requestedStartMs).toISOString()}; refusing to advance because historical traffic would be skipped`
70145
- );
70160
+ return new VercelRetentionClampError(requestedStartMs, effectiveStartMs);
70146
70161
  }
70147
70162
  async function runBackfillTask(options) {
70148
70163
  const {
@@ -70155,13 +70170,13 @@ async function runBackfillTask(options) {
70155
70170
  pullForBackfill,
70156
70171
  pullErrorPrefix
70157
70172
  } = options;
70158
- const markFailed = (msg) => {
70173
+ const markFailed = (msg, preserveSourceState = false) => {
70159
70174
  const failedAt = (/* @__PURE__ */ new Date()).toISOString();
70160
70175
  try {
70161
70176
  app.db.transaction((tx) => {
70162
70177
  tx.update(runs).set({ status: RunStatuses.failed, error: msg, finishedAt: failedAt }).where(eq51(runs.id, runId)).run();
70163
70178
  const latestSource = tx.select().from(trafficSources).where(eq51(trafficSources.id, sourceRow2.id)).get();
70164
- if (latestSource && isAuthoritativeTrafficSource(tx, latestSource) && isSameTrafficSourceGeneration(latestSource, sourceRow2)) {
70179
+ if (!preserveSourceState && latestSource && isAuthoritativeTrafficSource(tx, latestSource) && isSameTrafficSourceGeneration(latestSource, sourceRow2)) {
70165
70180
  tx.update(trafficSources).set({ status: TrafficSourceStatuses.error, lastError: msg, updatedAt: failedAt }).where(eq51(trafficSources.id, sourceRow2.id)).run();
70166
70181
  }
70167
70182
  });
@@ -70176,7 +70191,10 @@ async function runBackfillTask(options) {
70176
70191
  try {
70177
70192
  allEvents = await pullForBackfill();
70178
70193
  } catch (e) {
70179
- markFailed(`${pullErrorPrefix}: ${describeError(e)}`);
70194
+ markFailed(
70195
+ `${pullErrorPrefix}: ${describeError(e)}`,
70196
+ e instanceof VercelRetentionClampError
70197
+ );
70180
70198
  return;
70181
70199
  }
70182
70200
  if (allEvents.length === 0) {
@@ -72291,7 +72309,8 @@ async function trafficRoutes(app, opts) {
72291
72309
  }
72292
72310
  const appliedDays = Math.min(requestedDays, MAX_BACKFILL_DAYS);
72293
72311
  const windowEnd = /* @__PURE__ */ new Date();
72294
- const windowStart = new Date(windowEnd.getTime() - appliedDays * 864e5);
72312
+ const requestedWindowStartMs = windowEnd.getTime() - appliedDays * 864e5;
72313
+ const windowStart = new Date(requestedWindowStartMs);
72295
72314
  windowStart.setUTCMinutes(0, 0, 0);
72296
72315
  let pullForBackfill;
72297
72316
  let pullErrorPrefix;
@@ -5,11 +5,11 @@ import {
5
5
  installSkills,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-NFALEGSZ.js";
8
+ } from "./chunk-DA25LOTW.js";
9
9
  import {
10
10
  SKILL_MANIFEST_FILENAME,
11
11
  SkillsClients
12
- } from "./chunk-3JW762Q4.js";
12
+ } from "./chunk-6IR32MIH.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-NFALEGSZ.js";
14
+ } from "./chunk-DA25LOTW.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-QPJC2H6J.js";
160
+ } from "./chunk-44LVINXQ.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-3JW762Q4.js";
298
+ } from "./chunk-6IR32MIH.js";
299
299
 
300
300
  // src/telemetry.ts
301
301
  import crypto from "crypto";
@@ -7843,12 +7843,6 @@ function validateCampaignBidding(request) {
7843
7843
  throw new OpenAiAdsApiError("Campaign conversion_event_setting_ids must contain unique IDs", 400);
7844
7844
  }
7845
7845
  }
7846
- if (biddingType === OpenAiAdsBiddingTypes.clicks && (!Array.isArray(conversionIds) || conversionIds.length === 0)) {
7847
- throw new OpenAiAdsApiError(
7848
- "Click campaigns require at least one conversion_event_setting_id",
7849
- 400
7850
- );
7851
- }
7852
7846
  }
7853
7847
  function validateBiddingConfig(value) {
7854
7848
  validateRequestObject(value, "Ad group bidding_config");
@@ -11857,7 +11851,7 @@ function readStoredGroundingSources(rawResponse) {
11857
11851
  return result;
11858
11852
  }
11859
11853
  async function backfillInsightsCommand(project, opts) {
11860
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-WQPUIJO6.js");
11854
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-RNBODYMZ.js");
11861
11855
  const config = loadConfig();
11862
11856
  const db = createClient(config.database);
11863
11857
  migrate(db);
@@ -15575,19 +15575,17 @@ var adsCampaignCreateRequestSchema = z52.object({
15575
15575
  endTime: adsTimestampSchema.optional(),
15576
15576
  lifetimeSpendLimitMicros: adsMicrosSchema.min(1e6),
15577
15577
  locationIds: z52.array(adsEntityIdSchema).min(1).max(100),
15578
+ // biddingType is BILLING (what the account pays for) and is immutable once
15579
+ // the provider creates the campaign. conversionEventSettingIds is
15580
+ // OPTIMIZATION (what delivery is steered toward). The two are independent,
15581
+ // and the provider accepts a clicks campaign carrying no conversion event
15582
+ // settings, so neither field is conditioned on the other here.
15578
15583
  biddingType: adsCampaignBiddingTypeSchema.optional(),
15579
15584
  conversionEventSettingIds: adsConversionEventSettingIdsSchema.optional()
15580
15585
  }).superRefine((value, ctx) => {
15581
15586
  if (value.startTime !== void 0 && value.endTime !== void 0 && value.endTime <= value.startTime) {
15582
15587
  ctx.addIssue({ code: "custom", path: ["endTime"], message: "endTime must be after startTime" });
15583
15588
  }
15584
- if (value.biddingType === AdsCampaignBiddingTypes.clicks && (value.conversionEventSettingIds === void 0 || value.conversionEventSettingIds.length === 0)) {
15585
- ctx.addIssue({
15586
- code: "custom",
15587
- path: ["conversionEventSettingIds"],
15588
- message: "conversionEventSettingIds must be non-empty when biddingType is clicks"
15589
- });
15590
- }
15591
15589
  });
15592
15590
  var adsAdGroupCreateRequestSchema = z52.object({
15593
15591
  operationKey: adsOperationKeySchema,
@@ -92,7 +92,7 @@ import {
92
92
  trafficConnectWordpressRequestSchema,
93
93
  trafficEventKindSchema,
94
94
  trafficSeriesGranularitySchema
95
- } from "./chunk-3JW762Q4.js";
95
+ } from "./chunk-6IR32MIH.js";
96
96
 
97
97
  // src/config.ts
98
98
  import fs from "fs";
@@ -11800,7 +11800,7 @@ var canonryMcpTools = [
11800
11800
  defineTool({
11801
11801
  name: "canonry_ads_campaign_create",
11802
11802
  title: "Create a paused ads campaign",
11803
- description: "Create an OpenAI Ads campaign PAUSED with an explicit lifetime spend limit and location allowlist. Set biddingType=clicks with one or more provider-issued conversionEventSettingIds for conversion-optimized delivery; omit both for legacy impressions bidding. The server ignores any status concept and always sends paused. Inspect the receipt, then create matching paused ad groups and ads. A human must separately approve the exact tree before this operator can activate it.",
11803
+ description: "Create an OpenAI Ads campaign PAUSED with an explicit lifetime spend limit and location allowlist. biddingType is what the account is BILLED for (clicks or the legacy impressions default) and is immutable after creation; conversionEventSettingIds are what delivery OPTIMIZES toward and are independent, so a clicks campaign may omit them; adding provider-issued IDs makes it conversion-optimized. The server ignores any status concept and always sends paused. Inspect the receipt, then create matching paused ad groups and ads. A human must separately approve the exact tree before this operator can activate it.",
11804
11804
  access: "write",
11805
11805
  tier: "ads",
11806
11806
  inputSchema: adsCampaignCreateInputSchema,
package/dist/cli.js CHANGED
@@ -26,11 +26,11 @@ import {
26
26
  showFirstRunNotice,
27
27
  trackCliCommandFinished,
28
28
  trackEvent
29
- } from "./chunk-UD3YJQOV.js";
29
+ } from "./chunk-665YENL2.js";
30
30
  import {
31
31
  autoSyncSkills,
32
32
  formatAutoSyncNotice
33
- } from "./chunk-A6XDLCKF.js";
33
+ } from "./chunk-4XHQ2GCN.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-NFALEGSZ.js";
58
+ } from "./chunk-DA25LOTW.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-QPJC2H6J.js";
72
+ } from "./chunk-44LVINXQ.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-3JW762Q4.js";
141
+ } from "./chunk-6IR32MIH.js";
142
142
 
143
143
  // src/cli.ts
144
144
  import { pathToFileURL } from "url";
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-UD3YJQOV.js";
6
+ } from "./chunk-665YENL2.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-NFALEGSZ.js";
10
- import "./chunk-QPJC2H6J.js";
11
- import "./chunk-3JW762Q4.js";
9
+ } from "./chunk-DA25LOTW.js";
10
+ import "./chunk-44LVINXQ.js";
11
+ import "./chunk-6IR32MIH.js";
12
12
  export {
13
13
  GoogleMarketingRuntimeError,
14
14
  createGoogleMarketingCredentialStore,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-QPJC2H6J.js";
4
- import "./chunk-3JW762Q4.js";
3
+ } from "./chunk-44LVINXQ.js";
4
+ import "./chunk-6IR32MIH.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-A6XDLCKF.js";
3
+ } from "./chunk-4XHQ2GCN.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-NFALEGSZ.js";
7
+ } from "./chunk-DA25LOTW.js";
8
8
  import {
9
9
  isReadOnlyKey
10
- } from "./chunk-3JW762Q4.js";
10
+ } from "./chunk-6IR32MIH.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.180.0",
3
+ "version": "4.180.2",
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",
@@ -73,28 +73,28 @@
73
73
  "@ainyc/canonry-api-client": "0.0.0",
74
74
  "@ainyc/canonry-api-routes": "0.0.0",
75
75
  "@ainyc/canonry-config": "0.0.0",
76
- "@ainyc/canonry-contracts": "0.0.0",
77
76
  "@ainyc/canonry-db": "0.0.0",
78
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
77
+ "@ainyc/canonry-contracts": "0.0.0",
79
78
  "@ainyc/canonry-integration-bing": "0.0.0",
80
- "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
79
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
81
80
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
82
81
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
83
82
  "@ainyc/canonry-integration-google": "0.0.0",
84
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
83
+ "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
85
84
  "@ainyc/canonry-integration-google-ads": "0.0.0",
85
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
86
+ "@ainyc/canonry-integration-google-places": "0.0.0",
86
87
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
87
- "@ainyc/canonry-integration-openai-ads": "0.0.0",
88
88
  "@ainyc/canonry-integration-traffic": "0.0.0",
89
- "@ainyc/canonry-integration-google-places": "0.0.0",
90
- "@ainyc/canonry-integration-wordpress": "0.0.0",
89
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
90
+ "@ainyc/canonry-provider-claude": "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-gemini": "0.0.0",
94
- "@ainyc/canonry-provider-claude": "0.0.0",
95
94
  "@ainyc/canonry-provider-local": "0.0.0",
95
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
96
96
  "@ainyc/canonry-provider-openai": "0.0.0",
97
- "@ainyc/canonry-provider-perplexity": "0.0.0"
97
+ "@ainyc/canonry-integration-wordpress": "0.0.0"
98
98
  },
99
99
  "scripts": {
100
100
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",