@canonry/canonry 4.179.1 → 4.179.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 (25) hide show
  1. package/assets/assets/{AuditHistoryPanel-lD6Q5KaA.js → AuditHistoryPanel-TTMgg1iQ.js} +1 -1
  2. package/assets/assets/{BacklinksPage-ClN1xbOa.js → BacklinksPage-BmlsStTz.js} +1 -1
  3. package/assets/assets/{HistoryPage-CXKCPfG7.js → HistoryPage-OlX3tvxL.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-CiJsa0If.js → MeasurementPropertyPage-B_usHzN3.js} +1 -1
  5. package/assets/assets/{ProjectPage-CD0QbHPd.js → ProjectPage-DsC2NUCt.js} +1 -1
  6. package/assets/assets/{RunRow-DkFcHvDU.js → RunRow-BL8kiPON.js} +1 -1
  7. package/assets/assets/{RunsPage-CLzUDwTj.js → RunsPage-BXMLPcIB.js} +1 -1
  8. package/assets/assets/{SettingsPage-0PRgB0gI.js → SettingsPage-Bm_T8JMf.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-BXAMjVeD.js → SiteHealthSection-xlUYOOe2.js} +3 -3
  10. package/assets/assets/{TrafficPage-CP4qsn82.js → TrafficPage-DmyGEdhw.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-DoaIZ_ix.js → TrafficSourceDetailPage-sbu3kXCD.js} +1 -1
  12. package/assets/assets/{extract-error-message-Cn74-t3z.js → extract-error-message-Ra108eiS.js} +1 -1
  13. package/assets/assets/{index-BR9BgNb3.js → index-rJBOFic-.js} +22 -22
  14. package/assets/assets/{react-sigma_core.esm.min-CZrBq6qL.js → react-sigma_core.esm.min-tfJo9bgS.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-A2AB7UK5.js → chunk-E2JGJH5E.js} +15 -8
  17. package/dist/{chunk-FFXYNYPZ.js → chunk-F4HFEWLM.js} +1 -1
  18. package/dist/{chunk-WG4EDZT3.js → chunk-SKL6ZDIY.js} +4 -4
  19. package/dist/{chunk-LPUTKQDR.js → chunk-VRQ7U4HU.js} +2 -2
  20. package/dist/{chunk-5BZWU35I.js → chunk-Z46AW53D.js} +101 -19
  21. package/dist/cli.js +5 -5
  22. package/dist/index.js +4 -4
  23. package/dist/{intelligence-service-CKGM2RUJ.js → intelligence-service-F67UFJBG.js} +2 -2
  24. package/dist/mcp.js +3 -3
  25. 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-BXAMjVeD.js";import"./index-BR9BgNb3.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-xlUYOOe2.js";import"./index-rJBOFic-.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-BR9BgNb3.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-rJBOFic-.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">
@@ -15427,12 +15427,19 @@ var adsActivationEntityRefSchema = z52.object({
15427
15427
  expectedUpdatedAt: z52.number().int().nonnegative()
15428
15428
  }).strict();
15429
15429
  var adsActivationAdSchema = adsActivationEntityRefSchema;
15430
+ var ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES = 1e3;
15430
15431
  var ADS_ACTIVATION_MAX_ENTITIES = 100;
15432
+ function countAdsActivationManifestEntities(manifest) {
15433
+ return 1 + manifest.campaign.adGroups.reduce(
15434
+ (count, group) => count + 1 + group.ads.length,
15435
+ 0
15436
+ );
15437
+ }
15431
15438
  var adsActivationAdGroupSchema = adsActivationEntityRefSchema.extend({
15432
- ads: z52.array(adsActivationAdSchema).min(1).max(ADS_ACTIVATION_MAX_ENTITIES - 1)
15439
+ ads: z52.array(adsActivationAdSchema).min(1).max(ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES - 1)
15433
15440
  }).strict();
15434
15441
  var adsActivationCampaignSchema = adsActivationEntityRefSchema.extend({
15435
- adGroups: z52.array(adsActivationAdGroupSchema).min(1).max(ADS_ACTIVATION_MAX_ENTITIES - 1)
15442
+ adGroups: z52.array(adsActivationAdGroupSchema).min(1).max(ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES - 1)
15436
15443
  }).strict();
15437
15444
  function compareAdsActivationEntityIds(left, right) {
15438
15445
  if (left < right) return -1;
@@ -15454,15 +15461,12 @@ function addCanonicalEntityOrderIssue(items, path, ctx) {
15454
15461
  var adsActivationManifestSchema = z52.object({
15455
15462
  campaign: adsActivationCampaignSchema
15456
15463
  }).strict().superRefine((manifest, ctx) => {
15457
- const entityCount = 1 + manifest.campaign.adGroups.reduce(
15458
- (count, group) => count + 1 + group.ads.length,
15459
- 0
15460
- );
15461
- if (entityCount > ADS_ACTIVATION_MAX_ENTITIES) {
15464
+ const entityCount = countAdsActivationManifestEntities(manifest);
15465
+ if (entityCount > ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES) {
15462
15466
  ctx.addIssue({
15463
15467
  code: "custom",
15464
15468
  path: ["campaign"],
15465
- message: `Activation manifests may contain at most ${ADS_ACTIVATION_MAX_ENTITIES} entities`
15469
+ message: `Activation manifests may contain at most ${ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES} entities`
15466
15470
  });
15467
15471
  }
15468
15472
  addCanonicalEntityOrderIssue(manifest.campaign.adGroups, ["campaign", "adGroups"], ctx);
@@ -16999,6 +17003,9 @@ export {
16999
17003
  AdsEntityStatuses,
17000
17004
  AdsEntityTypes,
17001
17005
  AdsActivationEntityTypes,
17006
+ ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
17007
+ ADS_ACTIVATION_MAX_ENTITIES,
17008
+ countAdsActivationManifestEntities,
17002
17009
  adsActivationManifestSchema,
17003
17010
  canonicalizeAdsActivationManifest,
17004
17011
  adsActivationManifestHashSchema,
@@ -92,7 +92,7 @@ import {
92
92
  trafficConnectWordpressRequestSchema,
93
93
  trafficEventKindSchema,
94
94
  trafficSeriesGranularitySchema
95
- } from "./chunk-A2AB7UK5.js";
95
+ } from "./chunk-E2JGJH5E.js";
96
96
 
97
97
  // src/config.ts
98
98
  import fs from "fs";
@@ -11,7 +11,7 @@ import {
11
11
  loadConfig,
12
12
  loadConfigRaw,
13
13
  saveConfigPatch
14
- } from "./chunk-FFXYNYPZ.js";
14
+ } from "./chunk-F4HFEWLM.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-5BZWU35I.js";
160
+ } from "./chunk-Z46AW53D.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-A2AB7UK5.js";
298
+ } from "./chunk-E2JGJH5E.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-CKGM2RUJ.js");
11860
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-F67UFJBG.js");
11861
11861
  const config = loadConfig();
11862
11862
  const db = createClient(config.database);
11863
11863
  migrate(db);
@@ -5,11 +5,11 @@ import {
5
5
  installSkills,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-FFXYNYPZ.js";
8
+ } from "./chunk-F4HFEWLM.js";
9
9
  import {
10
10
  SKILL_MANIFEST_FILENAME,
11
11
  SkillsClients
12
- } from "./chunk-A2AB7UK5.js";
12
+ } from "./chunk-E2JGJH5E.js";
13
13
 
14
14
  // src/skills-autosync.ts
15
15
  import fs from "fs";
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  ADS_ACTIVATE_SCOPE,
3
+ ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
4
+ ADS_ACTIVATION_MAX_ENTITIES,
3
5
  ADS_APPROVE_SCOPE,
4
6
  ADS_WRITE_SCOPE,
5
7
  AGENT_PROVIDER_IDS,
@@ -251,6 +253,7 @@ import {
251
253
  conversionTrackingIntegrityReadEnvelopeSchema,
252
254
  conversionTrackingOptionsDtoSchema,
253
255
  cosineSimilarity,
256
+ countAdsActivationManifestEntities,
254
257
  createApiKeyRequestSchema,
255
258
  createTemplateLinkPairIndex,
256
259
  createUserRequestSchema,
@@ -639,7 +642,7 @@ import {
639
642
  wordpressSchemaDeployResultDtoSchema,
640
643
  wordpressSchemaStatusResultDtoSchema,
641
644
  wordpressStatusDtoSchema
642
- } from "./chunk-A2AB7UK5.js";
645
+ } from "./chunk-E2JGJH5E.js";
643
646
 
644
647
  // src/intelligence-service.ts
645
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";
@@ -34269,7 +34272,7 @@ var routeCatalog = [
34269
34272
  method: "post",
34270
34273
  path: "/api/v1/projects/{name}/ads/activation-grants",
34271
34274
  summary: "Approve one exact paused OpenAI Ads campaign tree for activation",
34272
- description: "Human-only approval surface. The authenticated ads.approve key is recorded as approver and must differ from the named executor key. Canonry verifies account eligibility, exact parent-child membership, paused state, upstream timestamps, and ad review approval before issuing a short-lived single-use grant.",
34275
+ description: "Human-only approval surface. The authenticated ads.approve key is recorded as approver and must differ from the named executor key. Canonry verifies account eligibility, exact parent-child membership, paused state, upstream timestamps, and ad review approval before issuing a short-lived single-use grant. New grants are refused when the manifest exceeds the deployment's operational entity cap (default 100, tunable via CANONRY_ADS_ACTIVATION_MAX_ENTITIES to a whole number between 1 and the structural ceiling of 1000; a set-but-invalid value fails closed and refuses new grants until fixed).",
34273
34276
  tags: ["ads"],
34274
34277
  parameters: [nameParameter],
34275
34278
  requestBody: {
@@ -34324,7 +34327,7 @@ var routeCatalog = [
34324
34327
  method: "post",
34325
34328
  path: "/api/v1/projects/{name}/ads/campaigns/{id}/activate-tree",
34326
34329
  summary: "Execute a grant-bound OpenAI Ads campaign-tree activation",
34327
- description: "Requires ads.activate and a nonexpired single-use grant bound to the exact executor key, project, advertiser account, manifest hash, campaign, entity IDs, and upstream timestamps. Canonry activates ads first, then ad groups, then the campaign; every step is durably checkpointed and verified. Failure rolls back the campaign before children and ambiguous outcomes fail closed as unknown.",
34330
+ description: "Requires ads.activate and a nonexpired single-use grant bound to the exact executor key, project, advertiser account, manifest hash, campaign, entity IDs, and upstream timestamps. Canonry activates ads first, then ad groups, then the campaign; every step is durably checkpointed and verified. Failure rolls back the campaign before children and ambiguous outcomes fail closed as unknown. New executions are refused when the manifest exceeds the deployment's operational entity cap (default 100, tunable via CANONRY_ADS_ACTIVATION_MAX_ENTITIES to a whole number between 1 and the structural ceiling of 1000; a set-but-invalid value fails closed and refuses new executions until fixed); stored receipts replay and reconcile regardless.",
34328
34331
  tags: ["ads"],
34329
34332
  parameters: [
34330
34333
  nameParameter,
@@ -43179,10 +43182,6 @@ async function googleMarketingRoutes(app, opts) {
43179
43182
  import crypto35 from "crypto";
43180
43183
  import { eq as eq43, and as and35, asc as asc8, desc as desc19, gt as gt2, gte as gte9, lt as lt8, lte as lte8, ne as ne5, inArray as inArray17, or as or10, isNull as isNull5, isNotNull as isNotNull2, sql as sql17 } from "drizzle-orm";
43181
43184
 
43182
- // ../api-routes/src/ads-activation-routes.ts
43183
- import crypto34 from "crypto";
43184
- import { and as and34, asc as asc7, eq as eq42, gt, isNotNull, isNull as isNull4, lte as lte7, or as or9, sql as sql16 } from "drizzle-orm";
43185
-
43186
43185
  // ../api-routes/src/ads-activation.ts
43187
43186
  import crypto33 from "crypto";
43188
43187
  var AdsActivationErrorCodes = {
@@ -43221,6 +43220,55 @@ var AdsActivationError = class extends Error {
43221
43220
  operation;
43222
43221
  entity;
43223
43222
  };
43223
+ function createMemoizedAdsActivationProvider(source) {
43224
+ const adGroupsByCampaignId = /* @__PURE__ */ new Map();
43225
+ const adsByAdGroupId = /* @__PURE__ */ new Map();
43226
+ const readThrough = (cache, parentId, load) => {
43227
+ const cached = cache.get(parentId);
43228
+ if (cached) return cached;
43229
+ const pending = load();
43230
+ cache.set(parentId, pending);
43231
+ pending.catch(() => {
43232
+ if (cache.get(parentId) === pending) cache.delete(parentId);
43233
+ });
43234
+ return pending;
43235
+ };
43236
+ const invalidate = () => {
43237
+ adGroupsByCampaignId.clear();
43238
+ adsByAdGroupId.clear();
43239
+ };
43240
+ const mutate = async (run) => {
43241
+ try {
43242
+ return await run();
43243
+ } finally {
43244
+ invalidate();
43245
+ }
43246
+ };
43247
+ const listAdGroups = (campaignId) => readThrough(adGroupsByCampaignId, campaignId, () => source.listAdGroups(campaignId));
43248
+ const listAds = (adGroupId) => readThrough(adsByAdGroupId, adGroupId, () => source.listAds(adGroupId));
43249
+ return {
43250
+ getAccount: () => source.getAccount(),
43251
+ getCampaign: (id) => source.getCampaign(id),
43252
+ listAdGroups,
43253
+ getAdGroup: async (id, campaignId) => {
43254
+ const entity = (await listAdGroups(campaignId)).find((candidate) => candidate.id === id);
43255
+ if (!entity) throw new Error("OpenAI Ads ad group was not found under the approved campaign");
43256
+ return entity;
43257
+ },
43258
+ listAds,
43259
+ getAd: async (id, adGroupId) => {
43260
+ const entity = (await listAds(adGroupId)).find((candidate) => candidate.id === id);
43261
+ if (!entity) throw new Error("OpenAI Ads ad was not found under the approved ad group");
43262
+ return entity;
43263
+ },
43264
+ activateCampaign: (id) => mutate(() => source.activateCampaign(id)),
43265
+ activateAdGroup: (id) => mutate(() => source.activateAdGroup(id)),
43266
+ activateAd: (id) => mutate(() => source.activateAd(id)),
43267
+ pauseCampaign: (id) => mutate(() => source.pauseCampaign(id)),
43268
+ pauseAdGroup: (id) => mutate(() => source.pauseAdGroup(id)),
43269
+ pauseAd: (id) => mutate(() => source.pauseAd(id))
43270
+ };
43271
+ }
43224
43272
  var DEFAULT_LEASE_MS = 5 * 6e4;
43225
43273
  var DEFAULT_ACTIVATION_VERIFICATION_RETRY_DELAYS_MS = [100, 250, 500, 1e3, 2e3, 2e3];
43226
43274
  var PROVIDER_PAUSED = "paused";
@@ -44517,6 +44565,8 @@ async function executeApprovedAdsActivation(dependencies, request) {
44517
44565
  }
44518
44566
 
44519
44567
  // ../api-routes/src/ads-activation-routes.ts
44568
+ import crypto34 from "crypto";
44569
+ import { and as and34, asc as asc7, eq as eq42, gt, isNotNull, isNull as isNull4, lte as lte7, or as or9, sql as sql16 } from "drizzle-orm";
44520
44570
  var MAX_ACTIVATION_GRANT_LIFETIME_MS = 24 * 60 * 60 * 1e3;
44521
44571
  var ACTIVATION_LEASE_MS = 5 * 6e4;
44522
44572
  var ACTIVATION_REVOCATION_SETTLEMENT_MS = ACTIVATION_LEASE_MS;
@@ -44934,6 +44984,40 @@ function countManifest(manifest) {
44934
44984
  adCount: manifest.campaign.adGroups.reduce((count2, group) => count2 + group.ads.length, 0)
44935
44985
  };
44936
44986
  }
44987
+ function resolveAdsActivationMaxEntities(env = process.env) {
44988
+ const raw = env.CANONRY_ADS_ACTIVATION_MAX_ENTITIES;
44989
+ if (raw === void 0 || raw.trim() === "") return ADS_ACTIVATION_MAX_ENTITIES;
44990
+ const trimmed = raw.trim();
44991
+ const parsed = /^\d+$/.test(trimmed) ? Number(trimmed) : Number.NaN;
44992
+ if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES) {
44993
+ throw internalError(
44994
+ `CANONRY_ADS_ACTIVATION_MAX_ENTITIES is set to the invalid value "${raw}". It must be a whole number between 1 and ${ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES} (unset it to use the default of ${ADS_ACTIVATION_MAX_ENTITIES}). New ads activations are refused until the variable is fixed.`,
44995
+ {
44996
+ envVar: "CANONRY_ADS_ACTIVATION_MAX_ENTITIES",
44997
+ value: raw,
44998
+ min: 1,
44999
+ max: ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
45000
+ default: ADS_ACTIVATION_MAX_ENTITIES
45001
+ }
45002
+ );
45003
+ }
45004
+ return parsed;
45005
+ }
45006
+ function enforceAdsActivationOperationalCap(manifest) {
45007
+ const maxEntities = resolveAdsActivationMaxEntities();
45008
+ const entityCount = countAdsActivationManifestEntities(manifest);
45009
+ if (entityCount > maxEntities) {
45010
+ throw validationError(
45011
+ `New ads activations may contain at most ${maxEntities} entities (raise CANONRY_ADS_ACTIVATION_MAX_ENTITIES to change the operational cap)`,
45012
+ {
45013
+ entityCount,
45014
+ maxEntities,
45015
+ absoluteMaxEntities: ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
45016
+ envVar: "CANONRY_ADS_ACTIVATION_MAX_ENTITIES"
45017
+ }
45018
+ );
45019
+ }
45020
+ }
44937
45021
  function requireAuthenticatedKey(request) {
44938
45022
  if (!request.apiKey) {
44939
45023
  throw forbidden("Ads activation approval and execution require an authenticated API key");
@@ -45378,6 +45462,7 @@ function registerAdsActivationRoutes(app, opts) {
45378
45462
  const approver = requireAuthenticatedKey(request);
45379
45463
  const project = resolveProject(app.db, request.params.name);
45380
45464
  const body = parseBody3(adsActivationGrantCreateRequestSchema, request.body);
45465
+ enforceAdsActivationOperationalCap(body.manifest);
45381
45466
  const now = /* @__PURE__ */ new Date();
45382
45467
  const expiresAt = Date.parse(body.expiresAt);
45383
45468
  if (!Number.isFinite(expiresAt) || expiresAt <= now.getTime() || expiresAt > now.getTime() + MAX_ACTIVATION_GRANT_LIFETIME_MS) {
@@ -45540,6 +45625,9 @@ function registerAdsActivationRoutes(app, opts) {
45540
45625
  if (grant.manifestHash !== body.manifestHash) {
45541
45626
  throw validationError("The activation grant does not match the requested manifest hash");
45542
45627
  }
45628
+ if (!grant.operationId) {
45629
+ enforceAdsActivationOperationalCap(grant.manifest);
45630
+ }
45543
45631
  try {
45544
45632
  const terminal = terminalActivationResponse(app, opts, grant, body.operationKey);
45545
45633
  if (terminal) return terminal;
@@ -46986,20 +47074,14 @@ async function adsRoutes(app, opts) {
46986
47074
  entity: { ...entity, status: entity.status, updatedAt: entity.updatedAt }
46987
47075
  });
46988
47076
  },
46989
- provider: {
47077
+ // getAdGroup/getAd are list-derived (no single-entity upstream read),
47078
+ // so the memoized provider shares one list walk per parent across the
47079
+ // whole verification pass and clears its cache on every mutation —
47080
+ // see createMemoizedAdsActivationProvider for the invariants.
47081
+ provider: createMemoizedAdsActivationProvider({
46990
47082
  getAccount: refreshAccount,
46991
47083
  getCampaign: (id) => operator.getCampaign(apiKey, id),
46992
- getAdGroup: async (id, campaignId) => {
46993
- const entity = (await operator.listAdGroups(apiKey, campaignId)).find((candidate) => candidate.id === id);
46994
- if (!entity) throw new Error("OpenAI Ads ad group was not found under the approved campaign");
46995
- return entity;
46996
- },
46997
47084
  listAdGroups: (campaignId) => operator.listAdGroups(apiKey, campaignId),
46998
- getAd: async (id, adGroupId) => {
46999
- const entity = (await operator.listAds(apiKey, adGroupId)).find((candidate) => candidate.id === id);
47000
- if (!entity) throw new Error("OpenAI Ads ad was not found under the approved ad group");
47001
- return entity;
47002
- },
47003
47085
  listAds: (adGroupId) => operator.listAds(apiKey, adGroupId),
47004
47086
  activateCampaign: (id) => activateCampaign(apiKey, id),
47005
47087
  activateAdGroup: (id) => activateAdGroup(apiKey, id),
@@ -47007,7 +47089,7 @@ async function adsRoutes(app, opts) {
47007
47089
  pauseCampaign: (id) => operator.pauseCampaign(apiKey, id),
47008
47090
  pauseAdGroup: (id) => operator.pauseAdGroup(apiKey, id),
47009
47091
  pauseAd: (id) => operator.pauseAd(apiKey, id)
47010
- }
47092
+ })
47011
47093
  };
47012
47094
  },
47013
47095
  toOperationDto: operationDto
package/dist/cli.js CHANGED
@@ -26,11 +26,11 @@ import {
26
26
  showFirstRunNotice,
27
27
  trackCliCommandFinished,
28
28
  trackEvent
29
- } from "./chunk-WG4EDZT3.js";
29
+ } from "./chunk-SKL6ZDIY.js";
30
30
  import {
31
31
  autoSyncSkills,
32
32
  formatAutoSyncNotice
33
- } from "./chunk-LPUTKQDR.js";
33
+ } from "./chunk-VRQ7U4HU.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-FFXYNYPZ.js";
58
+ } from "./chunk-F4HFEWLM.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-5BZWU35I.js";
72
+ } from "./chunk-Z46AW53D.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-A2AB7UK5.js";
141
+ } from "./chunk-E2JGJH5E.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-WG4EDZT3.js";
6
+ } from "./chunk-SKL6ZDIY.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-FFXYNYPZ.js";
10
- import "./chunk-5BZWU35I.js";
11
- import "./chunk-A2AB7UK5.js";
9
+ } from "./chunk-F4HFEWLM.js";
10
+ import "./chunk-Z46AW53D.js";
11
+ import "./chunk-E2JGJH5E.js";
12
12
  export {
13
13
  GoogleMarketingRuntimeError,
14
14
  createGoogleMarketingCredentialStore,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-5BZWU35I.js";
4
- import "./chunk-A2AB7UK5.js";
3
+ } from "./chunk-Z46AW53D.js";
4
+ import "./chunk-E2JGJH5E.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-LPUTKQDR.js";
3
+ } from "./chunk-VRQ7U4HU.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-FFXYNYPZ.js";
7
+ } from "./chunk-F4HFEWLM.js";
8
8
  import {
9
9
  isReadOnlyKey
10
- } from "./chunk-A2AB7UK5.js";
10
+ } from "./chunk-E2JGJH5E.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.179.1",
3
+ "version": "4.179.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",
@@ -70,31 +70,31 @@
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-api-routes": "0.0.0",
75
74
  "@ainyc/canonry-config": "0.0.0",
76
- "@ainyc/canonry-contracts": "0.0.0",
75
+ "@ainyc/canonry-api-client": "0.0.0",
77
76
  "@ainyc/canonry-db": "0.0.0",
77
+ "@ainyc/canonry-contracts": "0.0.0",
78
78
  "@ainyc/canonry-integration-bing": "0.0.0",
79
79
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
80
- "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
81
80
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
81
+ "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
82
82
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
83
83
  "@ainyc/canonry-integration-google": "0.0.0",
84
84
  "@ainyc/canonry-integration-google-ads": "0.0.0",
85
- "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
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",
87
88
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
88
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
89
+ "@ainyc/canonry-integration-traffic": "0.0.0",
89
90
  "@ainyc/canonry-integration-wordpress": "0.0.0",
90
91
  "@ainyc/canonry-intelligence": "0.0.0",
91
- "@ainyc/canonry-integration-traffic": "0.0.0",
92
92
  "@ainyc/canonry-provider-cdp": "0.0.0",
93
93
  "@ainyc/canonry-provider-claude": "0.0.0",
94
- "@ainyc/canonry-provider-local": "0.0.0",
95
94
  "@ainyc/canonry-provider-gemini": "0.0.0",
96
- "@ainyc/canonry-provider-openai": "0.0.0",
97
- "@ainyc/canonry-provider-perplexity": "0.0.0"
95
+ "@ainyc/canonry-provider-local": "0.0.0",
96
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
97
+ "@ainyc/canonry-provider-openai": "0.0.0"
98
98
  },
99
99
  "scripts": {
100
100
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",