@ainyc/canonry 4.186.8 → 4.187.0

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 (28) hide show
  1. package/assets/assets/{AuditHistoryPanel-9q5v4zHj.js → AuditHistoryPanel-G2iVWlbn.js} +1 -1
  2. package/assets/assets/{BacklinksPage-C2QVWfQf.js → BacklinksPage-B13UlDT7.js} +1 -1
  3. package/assets/assets/{HistoryPage-oLCQA7-T.js → HistoryPage-DZoRKfzJ.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-DUYt5ceA.js → MeasurementPropertyPage-DNxsAgEA.js} +1 -1
  5. package/assets/assets/ProjectPage-BdfsfLkU.js +9 -0
  6. package/assets/assets/{RunRow-kaFXI_VP.js → RunRow-C9u35nrm.js} +1 -1
  7. package/assets/assets/{RunsPage-CQizRJxf.js → RunsPage-DST-BpAu.js} +1 -1
  8. package/assets/assets/{SettingsPage-BHh4Y7Qg.js → SettingsPage-BC05JomS.js} +1 -1
  9. package/assets/assets/SiteHealthSection-DIeYA2HJ.js +4 -0
  10. package/assets/assets/{TrafficPage-B3N0r5gW.js → TrafficPage-DezdhoxL.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-C27GkPF4.js → TrafficSourceDetailPage-C0FIPjXi.js} +1 -1
  12. package/assets/assets/{extract-error-message-DlmIEdy_.js → extract-error-message-B5OYNTJO.js} +1 -1
  13. package/assets/assets/{index-DVa1lkiE.js → index-DJWMbOc5.js} +24 -24
  14. package/assets/assets/{react-sigma_core.esm.min-BBOzBU_n.js → react-sigma_core.esm.min-B06R8tYw.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-42P3CXIH.js → chunk-5BUAG4CN.js} +28 -3
  17. package/dist/{chunk-YYNL73BT.js → chunk-B7WQ5Z4L.js} +48 -9
  18. package/dist/{chunk-7CG3QE4N.js → chunk-EMSDPSQM.js} +130 -68
  19. package/dist/{chunk-7TYSFZEG.js → chunk-IPALTNIE.js} +2 -2
  20. package/dist/{chunk-CFJHRXZ3.js → chunk-LNBX7RTN.js} +556 -536
  21. package/dist/cli.js +5 -5
  22. package/dist/index.d.ts +12 -2
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-KBHLNDGO.js → intelligence-service-UZGA24EF.js} +2 -2
  25. package/dist/mcp.js +3 -3
  26. package/package.json +12 -12
  27. package/assets/assets/ProjectPage-Dsao_AiN.js +0 -9
  28. package/assets/assets/SiteHealthSection-DjmPK0Tg.js +0 -4
@@ -1,4 +1,4 @@
1
- import{g as Bt,t as S,r as C}from"./vendor-tanstack-CYBjbqVr.js";import{e as Ht,G as Wt}from"./SiteHealthSection-DjmPK0Tg.js";import"./index-DVa1lkiE.js";import"./vendor-radix-BpmvLvpp.js";import"./vendor-recharts-FA0uySU7.js";import"./vendor-lucide-BovNTc41.js";import"./vendor-markdown-9tTeP8v7.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-DLEICrrL.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-CYBjbqVr.js";import{e as Ht,G as Wt}from"./SiteHealthSection-DIeYA2HJ.js";import"./index-DJWMbOc5.js";import"./vendor-radix-BpmvLvpp.js";import"./vendor-recharts-FA0uySU7.js";import"./vendor-lucide-BovNTc41.js";import"./vendor-markdown-9tTeP8v7.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-DLEICrrL.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-DVa1lkiE.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-DJWMbOc5.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-CYBjbqVr.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-BpmvLvpp.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-FA0uySU7.js">
@@ -2,6 +2,7 @@ import {
2
2
  AGENT_MEMORY_KEY_MAX_LENGTH,
3
3
  AGENT_MEMORY_VALUE_MAX_BYTES,
4
4
  CodingAgents,
5
+ DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT,
5
6
  DISCOVERY_MAX_PROBES_CAP,
6
7
  DISCOVERY_PROBE_CONCURRENCY_CAP,
7
8
  GOOGLE_MARKETING_STORED_SNAPSHOT_PAGE_MAX,
@@ -97,7 +98,7 @@ import {
97
98
  trafficEventKindSchema,
98
99
  trafficSeriesGranularitySchema,
99
100
  visibilityReportRequestSchema
100
- } from "./chunk-CFJHRXZ3.js";
101
+ } from "./chunk-LNBX7RTN.js";
101
102
 
102
103
  // src/cli-error.ts
103
104
  function isMachineFormat(format) {
@@ -169,6 +170,9 @@ import { parse, stringify } from "yaml";
169
170
  // ../config/src/index.ts
170
171
  import { z } from "zod";
171
172
  var dashboardManagedSweepsSchema = z.boolean().nullish();
173
+ var researchAllowViewersSchema = z.boolean().nullish();
174
+ var researchViewerDailyRunLimitSchema = z.number().int().positive().nullish();
175
+ var dashboardManagedRunKindsSchema = z.array(schedulableRunKindSchema).nullish();
172
176
  var envSchema = z.object({
173
177
  DATABASE_URL: z.string().default("postgresql://aeo:aeo@postgres:5432/aeo_platform"),
174
178
  API_PORT: z.coerce.number().int().positive().default(3e3),
@@ -209,7 +213,9 @@ var envSchema = z.object({
209
213
  // Secret for HMAC-signing Google OAuth state parameters. Required for
210
214
  // cloud deployments that mount googleRoutes; the plugin refuses to register
211
215
  // without it (see packages/api-routes/src/google.ts).
212
- GOOGLE_STATE_SECRET: z.string().optional()
216
+ GOOGLE_STATE_SECRET: z.string().optional(),
217
+ CANONRY_RESEARCH_ALLOW_VIEWERS: z.string().optional(),
218
+ CANONRY_RESEARCH_VIEWER_DAILY_RUN_LIMIT: z.coerce.number().int().positive().default(DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT)
213
219
  });
214
220
  var bootstrapEnvSchema = z.object({
215
221
  CANONRY_API_KEY: z.string().optional(),
@@ -396,6 +402,24 @@ Do not use "canonry init --force" for recovery. It replaces credentials without
396
402
  message: `Invalid config at ${configPath}: dashboard.managedSweeps must be true, false, or left blank.`
397
403
  });
398
404
  }
405
+ if (!researchAllowViewersSchema.safeParse(parsed.research?.allowViewers).success) {
406
+ throw new CliError({
407
+ code: "CONFIG_INVALID",
408
+ message: `Invalid config at ${configPath}: research.allowViewers must be true, false, or left blank.`
409
+ });
410
+ }
411
+ if (!dashboardManagedRunKindsSchema.safeParse(parsed.dashboard?.managedRunKinds).success) {
412
+ throw new CliError({
413
+ code: "CONFIG_INVALID",
414
+ message: `Invalid config at ${configPath}: dashboard.managedRunKinds must be a list of schedulable run kinds.`
415
+ });
416
+ }
417
+ if (!researchViewerDailyRunLimitSchema.safeParse(parsed.research?.viewerDailyRunLimit).success) {
418
+ throw new CliError({
419
+ code: "CONFIG_INVALID",
420
+ message: `Invalid config at ${configPath}: research.viewerDailyRunLimit must be a positive integer or left blank.`
421
+ });
422
+ }
399
423
  if (parsed.geminiApiKey && !parsed.providers?.gemini) {
400
424
  parsed.providers = {
401
425
  ...parsed.providers,
@@ -12544,7 +12568,7 @@ Two signals, never interchangeable:
12544
12568
  - cited = the domain appears in the SOURCE links behind the answer.
12545
12569
  A model can do either, both or neither. Never compute one from the other, and never report a number for one under the other's name.
12546
12570
 
12547
- Sweeps and probes spend provider quota and write rows. Get explicit approval before any run, apply, or other mutation.
12571
+ Sweeps, probes, and research runs spend provider quota and write rows. Get explicit approval before any run, apply, or other mutation.
12548
12572
 
12549
12573
  Most reads are free. Five ads reads are NOT: canonry_ads_account, canonry_ads_geo_search, canonry_ads_live_delivery, canonry_ads_conversion_pixels and canonry_ads_conversion_event_settings call the provider live and spend against the advertiser account. They are marked read, so nothing in the tool list warns you. Get approval for those exactly as for a mutation.
12550
12574
 
@@ -13004,6 +13028,7 @@ function parseSkillsClient(value) {
13004
13028
  }
13005
13029
 
13006
13030
  export {
13031
+ dashboardManagedRunKindsSchema,
13007
13032
  getBootstrapEnv,
13008
13033
  isMachineFormat,
13009
13034
  EXIT_USER_ERROR,
@@ -2,16 +2,18 @@ import {
2
2
  ApiClient,
3
3
  CANONRY_MCP_TOOLKIT_NAMES,
4
4
  CanonryMcpToolNames,
5
+ CliError,
5
6
  canonryMcpTools,
6
7
  configExists,
7
8
  createCanonryMcpServer,
9
+ dashboardManagedRunKindsSchema,
8
10
  getBundledSkillSnapshots,
9
11
  getConfigPath,
10
12
  isMachineFormat,
11
13
  loadConfig,
12
14
  loadConfigRaw,
13
15
  saveConfigPatch
14
- } from "./chunk-42P3CXIH.js";
16
+ } from "./chunk-5BUAG4CN.js";
15
17
  import {
16
18
  CC_CACHE_DIR,
17
19
  DUCKDB_SPEC,
@@ -158,7 +160,7 @@ import {
158
160
  siteCrawlSnapshots,
159
161
  toAlertView,
160
162
  usageCounters
161
- } from "./chunk-7CG3QE4N.js";
163
+ } from "./chunk-EMSDPSQM.js";
162
164
  import {
163
165
  AGENT_MEMORY_VALUE_MAX_BYTES,
164
166
  AGENT_PROVIDER_IDS,
@@ -170,6 +172,7 @@ import {
170
172
  BacklinkSources,
171
173
  CITED_URL_CAPTURE_VERSION,
172
174
  CcReleaseSyncStatuses,
175
+ DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT,
173
176
  DiscoveryCompetitorTypes,
174
177
  GOOGLE_ADS_CAMPAIGN_METRICS_MAX_CAMPAIGNS,
175
178
  GOOGLE_ADS_CAMPAIGN_METRICS_MAX_DAYS,
@@ -299,7 +302,7 @@ import {
299
302
  validationError,
300
303
  winnabilityClassLabel,
301
304
  withRetry
302
- } from "./chunk-CFJHRXZ3.js";
305
+ } from "./chunk-LNBX7RTN.js";
303
306
 
304
307
  // src/telemetry.ts
305
308
  import crypto from "crypto";
@@ -11921,7 +11924,7 @@ function readStoredGroundingSources(rawResponse) {
11921
11924
  return result;
11922
11925
  }
11923
11926
  async function backfillInsightsCommand(project, opts) {
11924
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-KBHLNDGO.js");
11927
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-UZGA24EF.js");
11925
11928
  const config = loadConfig();
11926
11929
  const db = createClient(config.database);
11927
11930
  migrate(db);
@@ -16929,14 +16932,40 @@ function parseBooleanEnv(value) {
16929
16932
  if (normalized === "0" || normalized === "false" || normalized === "no") return false;
16930
16933
  return void 0;
16931
16934
  }
16935
+ function parsePositiveIntegerEnv(value) {
16936
+ const normalized = value?.trim();
16937
+ if (!normalized || !/^\d+$/.test(normalized)) return void 0;
16938
+ const parsed = Number(normalized);
16939
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : void 0;
16940
+ }
16932
16941
  function resolveDashboardRequirePassword(env, config) {
16933
16942
  return parseBooleanEnv(env.CANONRY_DASHBOARD_REQUIRE_PASSWORD) ?? config.dashboard?.requirePassword ?? true;
16934
16943
  }
16935
16944
  function resolveDashboardShowResourceLinks(env, config) {
16936
16945
  return parseBooleanEnv(env.CANONRY_DASHBOARD_SHOW_RESOURCE_LINKS) ?? config.dashboard?.showResourceLinks ?? true;
16937
16946
  }
16938
- function resolveDashboardManagedSweeps(env, config) {
16939
- return parseBooleanEnv(env.CANONRY_DASHBOARD_MANAGED_SWEEPS) ?? config.dashboard?.managedSweeps ?? false;
16947
+ function resolveDashboardManagedRunKinds(env, config) {
16948
+ const configured = dashboardManagedRunKindsSchema.safeParse(config.dashboard?.managedRunKinds);
16949
+ if (!configured.success) {
16950
+ throw new CliError({ code: "CONFIG_INVALID", message: "dashboard.managedRunKinds must be a list of schedulable run kinds." });
16951
+ }
16952
+ const envValue = env.CANONRY_DASHBOARD_MANAGED_RUN_KINDS?.trim();
16953
+ if (envValue) {
16954
+ const parsed = dashboardManagedRunKindsSchema.safeParse(envValue.split(",").map((kind) => kind.trim()));
16955
+ if (!parsed.success) {
16956
+ throw new CliError({ code: "CONFIG_INVALID", message: "CANONRY_DASHBOARD_MANAGED_RUN_KINDS must be a comma-separated list of schedulable run kinds." });
16957
+ }
16958
+ return [...new Set(parsed.data)];
16959
+ }
16960
+ const legacyEnv = parseBooleanEnv(env.CANONRY_DASHBOARD_MANAGED_SWEEPS);
16961
+ if (legacyEnv !== void 0) return legacyEnv ? [SchedulableRunKinds["answer-visibility"]] : [];
16962
+ return [...new Set(configured.data ?? (config.dashboard?.managedSweeps ? [SchedulableRunKinds["answer-visibility"]] : []))];
16963
+ }
16964
+ function resolveResearchAllowViewers(env, config) {
16965
+ return parseBooleanEnv(env.CANONRY_RESEARCH_ALLOW_VIEWERS) ?? config.research?.allowViewers ?? false;
16966
+ }
16967
+ function resolveResearchViewerDailyRunLimit(env, config) {
16968
+ return parsePositiveIntegerEnv(env.CANONRY_RESEARCH_VIEWER_DAILY_RUN_LIMIT) ?? config.research?.viewerDailyRunLimit ?? DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT;
16940
16969
  }
16941
16970
  function resolveDashboardShowUpdateNotification(env, config) {
16942
16971
  return parseBooleanEnv(env.CANONRY_DASHBOARD_SHOW_UPDATE_NOTIFICATION) ?? config.dashboard?.showUpdateNotification ?? true;
@@ -17247,6 +17276,7 @@ function createGoogleMarketingConfigCredentialStore(input) {
17247
17276
  };
17248
17277
  }
17249
17278
  async function createServer(opts) {
17279
+ const dashboardManagedRunKinds = resolveDashboardManagedRunKinds(process.env, opts.config);
17250
17280
  const logger = opts.logger === false ? false : process.stdout.isTTY ? {
17251
17281
  transport: {
17252
17282
  target: "pino-pretty",
@@ -18069,8 +18099,9 @@ async function createServer(opts) {
18069
18099
  const dashboardRequirePassword = resolveDashboardRequirePassword(process.env, opts.config);
18070
18100
  const dashboardShowResourceLinks = resolveDashboardShowResourceLinks(process.env, opts.config);
18071
18101
  const dashboardShowUpdateNotification = resolveDashboardShowUpdateNotification(process.env, opts.config);
18072
- const dashboardManagedSweeps = resolveDashboardManagedSweeps(process.env, opts.config);
18073
18102
  const dashboardOnboardingMode = resolveDashboardOnboardingMode(process.env, opts.config);
18103
+ const researchAllowViewers = resolveResearchAllowViewers(process.env, opts.config);
18104
+ const researchViewerDailyRunLimit = resolveResearchViewerDailyRunLimit(process.env, opts.config);
18074
18105
  app.log.info(
18075
18106
  { dashboardRequirePassword },
18076
18107
  "Dashboard password gate resolved"
@@ -18393,6 +18424,8 @@ async function createServer(opts) {
18393
18424
  // was previously reachable only from tests, so a source losing ground could
18394
18425
  // not be rescued without shipping code. Unset keeps the built-in default.
18395
18426
  vercelSyncDeadlineMs: resolveVercelSyncDeadlineMs(process.env),
18427
+ researchAllowViewers,
18428
+ researchViewerDailyRunLimit,
18396
18429
  // Local-only Aero agent routes. Registered here so they inherit api-routes'
18397
18430
  // auth plugin — bare `registerAgentRoutes(app, ...)` would skip auth.
18398
18431
  credentials: credentialChecker,
@@ -18960,8 +18993,8 @@ async function createServer(opts) {
18960
18993
  if (!dashboardShowUpdateNotification) {
18961
18994
  dashboardConfig.showUpdateNotification = false;
18962
18995
  }
18963
- if (dashboardManagedSweeps) {
18964
- dashboardConfig.managedSweeps = true;
18996
+ if (dashboardManagedRunKinds.length > 0) {
18997
+ dashboardConfig.managedRunKinds = dashboardManagedRunKinds;
18965
18998
  }
18966
18999
  if (!agentEnabled) {
18967
19000
  dashboardConfig.showAgentBar = false;
@@ -18969,6 +19002,12 @@ async function createServer(opts) {
18969
19002
  if (Object.keys(dashboardConfig).length > 0) {
18970
19003
  clientConfig.dashboard = dashboardConfig;
18971
19004
  }
19005
+ if (researchAllowViewers) {
19006
+ clientConfig.research = {
19007
+ allowViewers: true,
19008
+ viewerDailyRunLimit: researchViewerDailyRunLimit
19009
+ };
19010
+ }
18972
19011
  if (embed.enabled) {
18973
19012
  const embedClient = embedClientConfigForRequest(embed, projectTabsOverride, themeOverride, renderTokenOverride);
18974
19013
  if (embedClient) clientConfig.embed = embedClient;