@ainyc/canonry 4.192.0 → 4.192.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.
Files changed (26) hide show
  1. package/assets/assets/{AuditHistoryPanel-C7MwfCl9.js → AuditHistoryPanel-DvqnrQc_.js} +1 -1
  2. package/assets/assets/{BacklinksPage-1Nq1zbRk.js → BacklinksPage-BCk2qBfC.js} +1 -1
  3. package/assets/assets/{HistoryPage-BNACyEiz.js → HistoryPage-IMlkx--Q.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-BqjpIYAw.js → MeasurementPropertyPage-1o1e5vmH.js} +1 -1
  5. package/assets/assets/ProjectPage-BusVoYaC.js +8 -0
  6. package/assets/assets/{RunRow-DINPo5ES.js → RunRow-BherM7NU.js} +1 -1
  7. package/assets/assets/{RunsPage-BFuDLm7p.js → RunsPage-B5G_OrmE.js} +1 -1
  8. package/assets/assets/{SettingsPage-CkqmyTSK.js → SettingsPage-CMeCn5uk.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-DzFKj9lX.js → SiteHealthSection-DZX1yv4k.js} +3 -3
  10. package/assets/assets/{TrafficPage-CkIGVLET.js → TrafficPage-BV-HOztp.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-CTmn_FmZ.js → TrafficSourceDetailPage-9IN0q7bd.js} +1 -1
  12. package/assets/assets/{extract-error-message-CC2kxd3e.js → extract-error-message-c7zJp5uX.js} +1 -1
  13. package/assets/assets/{index-CCPMPGar.js → index-D3KGn0S0.js} +19 -19
  14. package/assets/assets/{react-sigma_core.esm.min-DkpQa1sf.js → react-sigma_core.esm.min-DxHkjhKC.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-BULKBROE.js → chunk-QRNKMGVD.js} +25 -1
  17. package/dist/{chunk-32Q2NZ4S.js → chunk-S5QNBQ72.js} +2 -2
  18. package/dist/{chunk-JOSSB4QC.js → chunk-T4OO575U.js} +4 -4
  19. package/dist/{chunk-FTKZAOFD.js → chunk-T6GRXUOE.js} +84 -27
  20. package/dist/{chunk-36RKISAI.js → chunk-V4ZLHKOG.js} +1 -1
  21. package/dist/cli.js +5 -5
  22. package/dist/index.js +4 -4
  23. package/dist/{intelligence-service-MEQ5VX5L.js → intelligence-service-QYRQHSJH.js} +2 -2
  24. package/dist/mcp.js +3 -3
  25. package/package.json +13 -13
  26. package/assets/assets/ProjectPage-BhBzznlv.js +0 -8
@@ -1,4 +1,4 @@
1
- import{g as Bt,t as S,r as C}from"./vendor-tanstack-ZXXkndVj.js";import{e as Ht,G as Wt}from"./SiteHealthSection-DzFKj9lX.js";import"./index-CCPMPGar.js";import"./vendor-radix-twS1M3FF.js";import"./vendor-recharts-D-cUuLZo.js";import"./vendor-lucide-CW2qe0uH.js";import"./vendor-markdown-B-Oq2NYq.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-Bxa_vFmq.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-ZXXkndVj.js";import{e as Ht,G as Wt}from"./SiteHealthSection-DZX1yv4k.js";import"./index-D3KGn0S0.js";import"./vendor-radix-twS1M3FF.js";import"./vendor-recharts-D-cUuLZo.js";import"./vendor-lucide-CW2qe0uH.js";import"./vendor-markdown-B-Oq2NYq.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-Bxa_vFmq.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-CCPMPGar.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-D3KGn0S0.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-ZXXkndVj.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-twS1M3FF.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-D-cUuLZo.js">
@@ -3952,6 +3952,8 @@ var measurementV2ReportingScopeSchema = z6.object({
3952
3952
  stableKey: measurementV2StableKeySchema,
3953
3953
  label: z6.string().trim().min(1),
3954
3954
  kind: z6.literal("market"),
3955
+ /** Explicit navigation association; never inferred from labels or shared properties. */
3956
+ groupKey: measurementV2StableKeySchema.optional(),
3955
3957
  usageEdges: z6.array(measurementV2UsageEdgeSchema)
3956
3958
  }).strict();
3957
3959
  function measurementV2UsageEdgeKey(edge) {
@@ -4014,6 +4016,12 @@ var measurementPlanV2Schema = z6.object({
4014
4016
  });
4015
4017
  }
4016
4018
  reportingScopeKeys.add(scope.stableKey);
4019
+ if (scope.groupKey !== void 0) {
4020
+ const group = plan.groups.find((group2) => group2.stableKey === scope.groupKey);
4021
+ if (!group || scope.usageEdges.some((edge) => !group.targetKeys.includes(edge.targetKey))) {
4022
+ ctx.addIssue({ code: z6.ZodIssueCode.custom, path: ["reportingScopes", scopeIndex, "groupKey"], message: "A market must link to an existing group containing all its assigned properties." });
4023
+ }
4024
+ }
4017
4025
  const memberKeys = /* @__PURE__ */ new Set();
4018
4026
  scope.usageEdges.forEach((edge, edgeIndex) => {
4019
4027
  const key = measurementV2UsageEdgeKey(edge);
@@ -6127,6 +6135,8 @@ var visibilityReportRequestShape = {
6127
6135
  queryClass: visibilityReportQueryClassSchema.default("non-brand"),
6128
6136
  scope: visibilityReportScopeKindSchema.default("project"),
6129
6137
  scopeKey: nonBlankIdSchema.optional(),
6138
+ /** Exact frozen market refinement for a project, group, or Property selection. */
6139
+ marketKey: nonBlankIdSchema.optional(),
6130
6140
  provider: nonBlankIdSchema.optional(),
6131
6141
  /** Exact stored served-model identity. Null/absent model evidence never matches this filter. */
6132
6142
  model: nonBlankIdSchema.optional(),
@@ -6160,6 +6170,13 @@ var visibilityReportRequestSchema = z15.object(visibilityReportRequestShape).str
6160
6170
  message: "scopeKey is not valid for project scope"
6161
6171
  });
6162
6172
  }
6173
+ if (value.scope === "market" && value.marketKey !== void 0) {
6174
+ ctx.addIssue({
6175
+ code: z15.ZodIssueCode.custom,
6176
+ path: ["marketKey"],
6177
+ message: "marketKey is not valid for market scope"
6178
+ });
6179
+ }
6163
6180
  if (value.from !== void 0 && value.to !== void 0 && value.from > value.to) {
6164
6181
  ctx.addIssue({
6165
6182
  code: z15.ZodIssueCode.custom,
@@ -6218,7 +6235,9 @@ var visibilityReportScopeOptionSchema = z15.object({
6218
6235
  kind: visibilityReportScopeKindSchema,
6219
6236
  targetCount: z15.number().int().nonnegative(),
6220
6237
  /** Group and Property membership is frozen and explicit; groups have zero or one id. */
6221
- parentGroupIds: z15.array(nonBlankIdSchema).optional()
6238
+ parentGroupIds: z15.array(nonBlankIdSchema).optional(),
6239
+ /** Explicit frozen market links; absent for scopes without market metadata. */
6240
+ marketKeys: z15.array(nonBlankIdSchema).optional()
6222
6241
  }).strict();
6223
6242
  var visibilityReportModelOptionSchema = z15.object({
6224
6243
  provider: nonBlankIdSchema,
@@ -6278,6 +6297,8 @@ var visibilityReportQueryRowSchema = z15.object({
6278
6297
  model: z15.string().nullable(),
6279
6298
  location: z15.string().nullable(),
6280
6299
  targetKeys: z15.array(nonBlankIdSchema),
6300
+ /** Frozen market memberships for standalone Property query grouping. */
6301
+ marketKeys: z15.array(nonBlankIdSchema).optional(),
6281
6302
  answerCount: z15.number().int().nonnegative(),
6282
6303
  mentionCoverage: visibilityReportRateSchema,
6283
6304
  citationCoverage: visibilityReportRateSchema
@@ -6361,6 +6382,8 @@ var visibilityReportSelectionSchema = z15.object({
6361
6382
  mode: visibilityReportResolvedModeSchema,
6362
6383
  queryClass: visibilityReportQueryClassSchema,
6363
6384
  scope: visibilityReportScopeOptionSchema,
6385
+ /** Selected frozen market refinement, omitted when reading the full scope. */
6386
+ market: visibilityReportScopeOptionSchema.optional(),
6364
6387
  provider: z15.string().nullable(),
6365
6388
  model: z15.string().nullable(),
6366
6389
  location: visibilityReportLocationSelectionSchema,
@@ -6511,6 +6534,7 @@ var queryTrackingGroupSchema = z16.object({
6511
6534
  }).strict();
6512
6535
  var queryTrackingMarketSchema = z16.object({
6513
6536
  stableKey: measurementV2StableKeySchema,
6537
+ groupKey: measurementV2StableKeySchema.optional(),
6514
6538
  label: z16.string().trim().min(1),
6515
6539
  usageEdges: z16.array(measurementV2UsageEdgeSchema)
6516
6540
  }).strict();
@@ -5,11 +5,11 @@ import {
5
5
  installSkills,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-36RKISAI.js";
8
+ } from "./chunk-V4ZLHKOG.js";
9
9
  import {
10
10
  SKILL_MANIFEST_FILENAME,
11
11
  SkillsClients
12
- } from "./chunk-BULKBROE.js";
12
+ } from "./chunk-QRNKMGVD.js";
13
13
 
14
14
  // src/skills-autosync.ts
15
15
  import fs from "fs";
@@ -14,7 +14,7 @@ import {
14
14
  loadConfig,
15
15
  loadConfigRaw,
16
16
  saveConfigPatch
17
- } from "./chunk-36RKISAI.js";
17
+ } from "./chunk-V4ZLHKOG.js";
18
18
  import {
19
19
  CC_CACHE_DIR,
20
20
  DUCKDB_SPEC,
@@ -162,7 +162,7 @@ import {
162
162
  siteCrawlSnapshots,
163
163
  toAlertView,
164
164
  usageCounters
165
- } from "./chunk-FTKZAOFD.js";
165
+ } from "./chunk-T6GRXUOE.js";
166
166
  import {
167
167
  AGENT_MEMORY_VALUE_MAX_BYTES,
168
168
  AGENT_PROVIDER_IDS,
@@ -305,7 +305,7 @@ import {
305
305
  validationError,
306
306
  winnabilityClassLabel,
307
307
  withRetry
308
- } from "./chunk-BULKBROE.js";
308
+ } from "./chunk-QRNKMGVD.js";
309
309
 
310
310
  // src/telemetry.ts
311
311
  import crypto from "crypto";
@@ -12041,7 +12041,7 @@ function readStoredGroundingSources(rawResponse) {
12041
12041
  return result;
12042
12042
  }
12043
12043
  async function backfillInsightsCommand(project, opts) {
12044
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-MEQ5VX5L.js");
12044
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-QYRQHSJH.js");
12045
12045
  const config = loadConfig();
12046
12046
  const db = createClient(config.database);
12047
12047
  migrate(db);
@@ -689,7 +689,7 @@ import {
689
689
  wordpressSchemaDeployResultDtoSchema,
690
690
  wordpressSchemaStatusResultDtoSchema,
691
691
  wordpressStatusDtoSchema
692
- } from "./chunk-BULKBROE.js";
692
+ } from "./chunk-QRNKMGVD.js";
693
693
 
694
694
  // src/intelligence-service.ts
695
695
  import { eq as eq67, desc as desc29, asc as asc12, and as and57, ne as ne10, or as or15, inArray as inArray25, gte as gte18, lte as lte15, isNull as isNull12, sql as sql26, exists } from "drizzle-orm";
@@ -18021,6 +18021,12 @@ function diffCompiledPlans(active, candidate, activeRevision) {
18021
18021
  };
18022
18022
  }
18023
18023
  function plansAreLabelOnlyVariants(active, candidate) {
18024
+ const marketSurface = (scope) => {
18025
+ const { groupKey: _groupKey, ...population } = scope;
18026
+ return JSON.stringify(canonicalJsonValue({ ...population, label: "" }));
18027
+ };
18028
+ const nextMarkets = new Map((canonicalMeasurementPlanV2(candidate).reportingScopes ?? []).map((scope) => [scope.stableKey, marketSurface(scope)]));
18029
+ if ((canonicalMeasurementPlanV2(active).reportingScopes ?? []).some((scope) => nextMarkets.get(scope.stableKey) !== marketSurface(scope))) return false;
18024
18030
  const surface = (plan) => {
18025
18031
  const doc = canonicalMeasurementPlanV2(plan);
18026
18032
  const stripped = {
@@ -18028,6 +18034,7 @@ function plansAreLabelOnlyVariants(active, candidate) {
18028
18034
  // The checksum includes labels and navigation parents. Neutralize it
18029
18035
  // with those display fields; all measurement semantics stay in the comparison.
18030
18036
  compiledChecksum: "",
18037
+ reportingScopes: [],
18031
18038
  targets: doc.targets.map((target) => ({ ...target, label: "" })),
18032
18039
  groups: doc.groups.map(({ parentGroupKey: _parentGroupKey, ...group }) => ({
18033
18040
  // Parentage changes navigation only. It changes the frozen document and
@@ -18457,6 +18464,10 @@ function upsertGroup(authoring, body) {
18457
18464
  }
18458
18465
  function upsertMarket(authoring, body) {
18459
18466
  const { market } = parseBody(measurementDraftUpsertMarketRequestSchema, body, "upsert-market");
18467
+ if (market.groupKey !== void 0) {
18468
+ const group = authoring.groups.find((group2) => group2.stableKey === market.groupKey);
18469
+ if (!group || market.usageEdges.some((edge) => !group.targetKeys.includes(edge.targetKey))) throw validationError("A market must link to an existing group containing all its assigned properties.");
18470
+ }
18460
18471
  const included = new Set(authoring.targets.filter((target) => target.status === "included").map((target) => target.stableKey));
18461
18472
  const frozen = new Set(authoring.assignments.flatMap((assignment) => (assignment.executionContexts ?? []).filter((context) => context.executionNodeKey !== void 0).map((context) => measurementV2UsageEdgeKey({ targetKey: assignment.targetKey, queryId: assignment.queryId, executionNodeKey: context.executionNodeKey }))));
18462
18473
  const seen2 = /* @__PURE__ */ new Set();
@@ -22225,35 +22236,43 @@ function rate(values, expected, unknownReason = "evidence-incomplete") {
22225
22236
  function scopeResolution(definition, selection) {
22226
22237
  const project = definition.scopeOptions.find((option2) => option2.kind === "project");
22227
22238
  if (!project) throw new VisibilityReportScopeError("Frozen definition has no project scope.");
22239
+ let option = project;
22240
+ let edgeIds;
22228
22241
  if (selection.scope === "project") {
22229
- return { option: project, edgeIds: new Set(definition.edges.map((edge) => edge.id)) };
22230
- }
22231
- const key = selection.scopeKey;
22232
- if (!key) throw new VisibilityReportScopeError(`${selection.scope} scope requires a scope key.`);
22233
- const option = definition.scopeOptions.find((candidate) => candidate.kind === selection.scope && candidate.id === key);
22234
- if (!option) throw new VisibilityReportScopeError(`${selection.scope} scope "${key}" is not in this frozen definition.`);
22235
- if (selection.scope === "property") {
22236
- return {
22237
- option,
22238
- edgeIds: new Set(definition.edges.filter((edge) => edge.targetKey === key).map((edge) => edge.id))
22239
- };
22242
+ edgeIds = new Set(definition.edges.map((edge) => edge.id));
22243
+ } else {
22244
+ const key = selection.scopeKey;
22245
+ if (!key) throw new VisibilityReportScopeError(`${selection.scope} scope requires a scope key.`);
22246
+ const scoped = definition.scopeOptions.find((candidate) => candidate.kind === selection.scope && candidate.id === key);
22247
+ if (!scoped) throw new VisibilityReportScopeError(`${selection.scope} scope "${key}" is not in this frozen definition.`);
22248
+ option = scoped;
22249
+ if (selection.scope === "property") {
22250
+ edgeIds = new Set(definition.edges.filter((edge) => edge.targetKey === key).map((edge) => edge.id));
22251
+ } else if (selection.scope === "group") {
22252
+ const group = definition.groups.find((candidate) => candidate.id === key);
22253
+ if (!group) throw new VisibilityReportScopeError(`Group "${key}" is not in this frozen definition.`);
22254
+ const targetKeys = new Set(group.targetKeys);
22255
+ edgeIds = new Set(definition.edges.filter((edge) => targetKeys.has(edge.targetKey)).map((edge) => edge.id));
22256
+ } else {
22257
+ edgeIds = new Set(definition.edges.filter((edge) => edge.marketKeys.includes(key)).map((edge) => edge.id));
22258
+ }
22240
22259
  }
22241
- if (selection.scope === "group") {
22242
- const group = definition.groups.find((candidate) => candidate.id === key);
22243
- if (!group) throw new VisibilityReportScopeError(`Group "${key}" is not in this frozen definition.`);
22244
- const targetKeys = new Set(group.targetKeys);
22245
- return {
22246
- option,
22247
- edgeIds: new Set(definition.edges.filter((edge) => targetKeys.has(edge.targetKey)).map((edge) => edge.id))
22248
- };
22260
+ if (selection.scope === "market" && selection.marketKey !== void 0) {
22261
+ throw new VisibilityReportScopeError("marketKey is not valid for market scope.");
22249
22262
  }
22263
+ const marketKey = selection.scope === "market" ? selection.scopeKey : selection.marketKey;
22264
+ if (marketKey === void 0) return { option, edgeIds };
22265
+ const market = definition.scopeOptions.find((candidate) => candidate.kind === "market" && candidate.id === marketKey);
22266
+ if (!market) throw new VisibilityReportScopeError(`Market "${marketKey}" is not in this frozen definition.`);
22250
22267
  return {
22251
22268
  option,
22252
- edgeIds: new Set(definition.edges.filter((edge) => edge.marketKeys.includes(key)).map((edge) => edge.id))
22269
+ market,
22270
+ edgeIds: new Set(definition.edges.filter((edge) => edgeIds.has(edge.id) && edge.marketKeys.includes(marketKey)).map((edge) => edge.id))
22253
22271
  };
22254
22272
  }
22255
22273
  function scopeTargetKeys(definition, selection) {
22256
22274
  const resolution = scopeResolution(definition, selection);
22275
+ if (resolution.market !== void 0) return [...new Set(definition.edges.filter((edge) => resolution.edgeIds.has(edge.id)).map((edge) => edge.targetKey))].sort(compareText14);
22257
22276
  if (selection.scope === "project") return definition.targets.map((target) => target.id).sort(compareText14);
22258
22277
  if (selection.scope === "property") return [resolution.option.id];
22259
22278
  if (selection.scope === "group") {
@@ -22439,11 +22458,15 @@ function queryRows(candidates, definition, selection) {
22439
22458
  model: first.observation?.model ?? null,
22440
22459
  location: first.slot.location,
22441
22460
  targetKeys: selectedTargetKeys(rows),
22461
+ ...(() => {
22462
+ const marketKeys = [...new Set(rows.flatMap((row) => row.edges.flatMap((edge) => edge.marketKeys)))].sort(compareText14);
22463
+ return marketKeys.length === 0 ? {} : { marketKeys };
22464
+ })(),
22442
22465
  answerCount: value.answerCount,
22443
22466
  mentionCoverage: value.mentionCoverage,
22444
22467
  citationCoverage: value.citationCoverage
22445
22468
  };
22446
- }).sort((left, right) => compareText14(normalizeText3(left.query), normalizeText3(right.query)) || compareText14(left.provider, right.provider) || compareText14(left.model ?? "", right.model ?? "") || compareText14(left.location ?? "", right.location ?? "") || compareText14(left.queryKey, right.queryKey));
22469
+ }).sort((left, right) => (selection.scope === "property" && selection.marketKey === void 0 ? compareText14((left.marketKeys ?? []).join("\0"), (right.marketKeys ?? []).join("\0")) : 0) || compareText14(normalizeText3(left.query), normalizeText3(right.query)) || compareText14(left.provider, right.provider) || compareText14(left.model ?? "", right.model ?? "") || compareText14(left.location ?? "", right.location ?? "") || compareText14(left.queryKey, right.queryKey));
22447
22470
  }
22448
22471
  function evidenceRows(candidates, definition, selection) {
22449
22472
  if (selection.queryKey === void 0 && selection.queryId === void 0) return [];
@@ -22578,6 +22601,7 @@ function page2(rows, keyOf, kind, queryClass, input, run) {
22578
22601
  queryClass,
22579
22602
  scope: input.selection.scope,
22580
22603
  scopeKey: input.selection.scopeKey ?? null,
22604
+ marketKey: input.selection.marketKey ?? null,
22581
22605
  provider: input.selection.provider ?? null,
22582
22606
  model: input.selection.model ?? null,
22583
22607
  location: input.selection.location,
@@ -22668,7 +22692,8 @@ function buildVisibilityReport(input) {
22668
22692
  const runs2 = input.runs.filter((run) => !run.probe && inTime(run, input.selection)).sort((left, right) => compareText14(left.createdAt, right.createdAt) || compareText14(left.id, right.id));
22669
22693
  const selectedRun = input.selection.runId === void 0 ? input.preferredRunId === void 0 ? runs2.at(-1) : runs2.find((run) => run.id === input.preferredRunId) : runs2.find((run) => run.id === input.selection.runId);
22670
22694
  const definition = selectedRun?.definition ?? input.activeDefinition;
22671
- const selectedScope = scopeResolution(definition, input.selection).option;
22695
+ const selectedResolution = scopeResolution(definition, input.selection);
22696
+ const selectedScope = selectedResolution.option;
22672
22697
  const populationTargetKeys = scopeTargetKeys(definition, input.selection);
22673
22698
  const classes = selectedClasses(input.selection.queryClass);
22674
22699
  const runCandidates = /* @__PURE__ */ new Map();
@@ -22723,6 +22748,7 @@ function buildVisibilityReport(input) {
22723
22748
  mode: input.mode,
22724
22749
  queryClass: input.selection.queryClass,
22725
22750
  scope: selectedScope,
22751
+ ...selectedResolution.market === void 0 ? {} : { market: selectedResolution.market },
22726
22752
  provider: input.selection.provider ?? null,
22727
22753
  model: input.selection.model ?? null,
22728
22754
  location: input.selection.location,
@@ -22906,16 +22932,47 @@ function v2Definition(plan, revision, manifest, run) {
22906
22932
  for (const group of plan.groups) {
22907
22933
  for (const targetKey of group.targetKeys) groupKeysForTarget.get(targetKey)?.push(group.stableKey);
22908
22934
  }
22935
+ const marketKeysForGroup = /* @__PURE__ */ new Map();
22936
+ const marketKeysForTarget = new Map(plan.targets.map((target) => [target.stableKey, []]));
22937
+ for (const market of plan.reportingScopes ?? []) {
22938
+ if (market.groupKey !== void 0) {
22939
+ const keys = marketKeysForGroup.get(market.groupKey) ?? [];
22940
+ keys.push(market.stableKey);
22941
+ marketKeysForGroup.set(market.groupKey, keys);
22942
+ }
22943
+ for (const edge of market.usageEdges) marketKeysForTarget.get(edge.targetKey)?.push(market.stableKey);
22944
+ }
22909
22945
  const scopeOptions = [
22910
22946
  { id: "project", label: "Project", kind: "project", targetCount: plan.targets.length },
22911
- ...plan.groups.map((group) => ({ id: group.stableKey, label: group.label, kind: "group", targetCount: group.targetKeys.length, ...group.parentGroupKey === void 0 ? {} : { parentGroupIds: [group.parentGroupKey] } })),
22947
+ ...plan.groups.map((group) => {
22948
+ const marketKeys = [...new Set(marketKeysForGroup.get(group.stableKey) ?? [])].sort();
22949
+ return {
22950
+ id: group.stableKey,
22951
+ label: group.label,
22952
+ kind: "group",
22953
+ targetCount: group.targetKeys.length,
22954
+ ...group.parentGroupKey === void 0 ? {} : { parentGroupIds: [group.parentGroupKey] },
22955
+ ...marketKeys.length === 0 ? {} : { marketKeys }
22956
+ };
22957
+ }),
22912
22958
  ...plan.reportingScopes?.map((market) => ({
22913
22959
  id: market.stableKey,
22914
22960
  label: market.label,
22915
22961
  kind: "market",
22916
- targetCount: new Set(market.usageEdges.map((edge) => edge.targetKey)).size
22962
+ targetCount: new Set(market.usageEdges.map((edge) => edge.targetKey)).size,
22963
+ ...market.groupKey === void 0 ? {} : { parentGroupIds: [market.groupKey] }
22917
22964
  })) ?? [],
22918
- ...plan.targets.map((target) => ({ id: target.stableKey, label: target.label, kind: "property", targetCount: 1, parentGroupIds: [...new Set(groupKeysForTarget.get(target.stableKey) ?? [])].sort() }))
22965
+ ...plan.targets.map((target) => {
22966
+ const marketKeys = [...new Set(marketKeysForTarget.get(target.stableKey) ?? [])].sort();
22967
+ return {
22968
+ id: target.stableKey,
22969
+ label: target.label,
22970
+ kind: "property",
22971
+ targetCount: 1,
22972
+ parentGroupIds: [...new Set(groupKeysForTarget.get(target.stableKey) ?? [])].sort(),
22973
+ ...marketKeys.length === 0 ? {} : { marketKeys }
22974
+ };
22975
+ })
22919
22976
  ];
22920
22977
  return {
22921
22978
  revision,
@@ -23899,7 +23956,7 @@ function workspaceDto(db, state, opts) {
23899
23956
  targetKeys: group.targetKeys,
23900
23957
  ...group.parentGroupKey ? { parentGroupKey: group.parentGroupKey } : {}
23901
23958
  })) ?? [],
23902
- markets: plan?.reportingScopes?.map((scope) => ({ stableKey: scope.stableKey, label: scope.label, usageEdges: scope.usageEdges })) ?? [],
23959
+ markets: plan?.reportingScopes?.map((scope) => ({ stableKey: scope.stableKey, label: scope.label, usageEdges: scope.usageEdges, ...scope.groupKey ? { groupKey: scope.groupKey } : {} })) ?? [],
23903
23960
  tracked: trackedRows(db, state, rows, plan, opts),
23904
23961
  savedSources: savedSources(db, state.project.id)
23905
23962
  });
@@ -104,7 +104,7 @@ import {
104
104
  trafficEventKindSchema,
105
105
  trafficSeriesGranularitySchema,
106
106
  visibilityReportRequestSchema
107
- } from "./chunk-BULKBROE.js";
107
+ } from "./chunk-QRNKMGVD.js";
108
108
 
109
109
  // src/cli-error.ts
110
110
  function isMachineFormat(format) {
package/dist/cli.js CHANGED
@@ -28,11 +28,11 @@ import {
28
28
  trackCliCommandFinished,
29
29
  trackEvent,
30
30
  waitForServerRuntimeStartup
31
- } from "./chunk-JOSSB4QC.js";
31
+ } from "./chunk-T4OO575U.js";
32
32
  import {
33
33
  autoSyncSkills,
34
34
  formatAutoSyncNotice
35
- } from "./chunk-32Q2NZ4S.js";
35
+ } from "./chunk-S5QNBQ72.js";
36
36
  import {
37
37
  CliError,
38
38
  EXIT_SYSTEM_ERROR,
@@ -58,7 +58,7 @@ import {
58
58
  saveConfigPatch,
59
59
  systemError,
60
60
  usageError
61
- } from "./chunk-36RKISAI.js";
61
+ } from "./chunk-V4ZLHKOG.js";
62
62
  import {
63
63
  CLOUDFLARE_WORKER_BINDINGS,
64
64
  CLOUDFLARE_WORKER_GENERATED_MARKER,
@@ -72,7 +72,7 @@ import {
72
72
  projects,
73
73
  queries,
74
74
  renderReportHtml
75
- } from "./chunk-FTKZAOFD.js";
75
+ } from "./chunk-T6GRXUOE.js";
76
76
  import {
77
77
  AdsDeliverySnapshotStatuses,
78
78
  AdsHistoricalCampaignRollupStatuses,
@@ -148,7 +148,7 @@ import {
148
148
  shareOfVoiceReason,
149
149
  visibilityReportRequestSchema,
150
150
  winnabilityClassSchema
151
- } from "./chunk-BULKBROE.js";
151
+ } from "./chunk-QRNKMGVD.js";
152
152
 
153
153
  // src/cli.ts
154
154
  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-JOSSB4QC.js";
6
+ } from "./chunk-T4OO575U.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-36RKISAI.js";
10
- import "./chunk-FTKZAOFD.js";
11
- import "./chunk-BULKBROE.js";
9
+ } from "./chunk-V4ZLHKOG.js";
10
+ import "./chunk-T6GRXUOE.js";
11
+ import "./chunk-QRNKMGVD.js";
12
12
  export {
13
13
  GoogleMarketingRuntimeError,
14
14
  createGoogleMarketingCredentialStore,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-FTKZAOFD.js";
4
- import "./chunk-BULKBROE.js";
3
+ } from "./chunk-T6GRXUOE.js";
4
+ import "./chunk-QRNKMGVD.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-32Q2NZ4S.js";
3
+ } from "./chunk-S5QNBQ72.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-36RKISAI.js";
7
+ } from "./chunk-V4ZLHKOG.js";
8
8
  import {
9
9
  isReadOnlyKey
10
- } from "./chunk-BULKBROE.js";
10
+ } from "./chunk-QRNKMGVD.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": "@ainyc/canonry",
3
- "version": "4.192.0",
3
+ "version": "4.192.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",
@@ -70,32 +70,32 @@
70
70
  "@types/node-cron": "^3.0.11",
71
71
  "tsup": "^8.5.1",
72
72
  "tsx": "^4.19.0",
73
- "@ainyc/canonry-api-client": "0.0.0",
74
73
  "@ainyc/canonry-web": "0.0.0",
75
- "@ainyc/canonry-api-routes": "0.0.0",
76
- "@ainyc/canonry-contracts": "0.0.0",
74
+ "@ainyc/canonry-api-client": "0.0.0",
77
75
  "@ainyc/canonry-config": "0.0.0",
78
- "@ainyc/canonry-db": "0.0.0",
76
+ "@ainyc/canonry-contracts": "0.0.0",
77
+ "@ainyc/canonry-api-routes": "0.0.0",
79
78
  "@ainyc/canonry-integration-bing": "0.0.0",
80
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
81
- "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
79
+ "@ainyc/canonry-db": "0.0.0",
82
80
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
81
+ "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
82
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
83
83
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
84
- "@ainyc/canonry-integration-google": "0.0.0",
85
84
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
85
+ "@ainyc/canonry-integration-google": "0.0.0",
86
+ "@ainyc/canonry-integration-google-ads": "0.0.0",
86
87
  "@ainyc/canonry-integration-google-places": "0.0.0",
87
88
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
88
89
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
89
- "@ainyc/canonry-integration-google-ads": "0.0.0",
90
- "@ainyc/canonry-integration-traffic": "0.0.0",
91
90
  "@ainyc/canonry-integration-wordpress": "0.0.0",
91
+ "@ainyc/canonry-integration-traffic": "0.0.0",
92
92
  "@ainyc/canonry-intelligence": "0.0.0",
93
93
  "@ainyc/canonry-provider-cdp": "0.0.0",
94
+ "@ainyc/canonry-provider-gemini": "0.0.0",
94
95
  "@ainyc/canonry-provider-claude": "0.0.0",
95
- "@ainyc/canonry-provider-perplexity": "0.0.0",
96
96
  "@ainyc/canonry-provider-openai": "0.0.0",
97
- "@ainyc/canonry-provider-local": "0.0.0",
98
- "@ainyc/canonry-provider-gemini": "0.0.0"
97
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
98
+ "@ainyc/canonry-provider-local": "0.0.0"
99
99
  },
100
100
  "scripts": {
101
101
  "build": "pnpm run build:cli && pnpm run build:web",