@canonry/canonry 5.30.2 → 5.33.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 (33) hide show
  1. package/assets/assets/{AuditHistoryPanel-8GPJdEWL.js → AuditHistoryPanel-CcCIqJzU.js} +1 -1
  2. package/assets/assets/{BacklinksPage-8-KPXFtA.js → BacklinksPage-B4r9SLIP.js} +1 -1
  3. package/assets/assets/{HistoryPage-CKgF71m5.js → HistoryPage-DIpbpqWc.js} +1 -1
  4. package/assets/assets/MeasurementPropertyPage-BF93li8O.js +1 -0
  5. package/assets/assets/{ProjectPage-BPtdO-Gp.js → ProjectPage-CjadJKsG.js} +7 -7
  6. package/assets/assets/{RunRow-C3CRRfb4.js → RunRow-C-d8luIA.js} +1 -1
  7. package/assets/assets/{RunsPage-BvCCjtqM.js → RunsPage-DEbjaNYY.js} +1 -1
  8. package/assets/assets/{SettingsPage-B1QuP6Cv.js → SettingsPage-B5h3wM7i.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-DgM3aTd-.js → SiteHealthSection-Cj2lo1GY.js} +3 -3
  10. package/assets/assets/{TrafficPage-DEUDhBXG.js → TrafficPage-CFDh9Rx4.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-gpgLsGA1.js → TrafficSourceDetailPage-psddSEHZ.js} +1 -1
  12. package/assets/assets/{extract-error-message-CH4G5kw6.js → extract-error-message-BbHnZTOx.js} +1 -1
  13. package/assets/assets/{index-B2qeAPfR.js → index-CiWV331j.js} +24 -24
  14. package/assets/assets/index-DX5M4MHr.css +1 -0
  15. package/assets/assets/{react-sigma_core.esm.min-CG4hSMQ3.js → react-sigma_core.esm.min-6EgecOc3.js} +1 -1
  16. package/assets/assets/v2-overview-adapter-0pVxmjG8.js +1 -0
  17. package/assets/index.html +2 -2
  18. package/dist/{chunk-YVWYQBXW.js → chunk-AQFRQTKY.js} +2 -2
  19. package/dist/{chunk-WZL73LY3.js → chunk-G3CMWO26.js} +2 -2
  20. package/dist/{chunk-7YS62CJ4.js → chunk-GIKWL2BQ.js} +62 -28
  21. package/dist/{chunk-RCX6I3DX.js → chunk-SJX7XJB6.js} +2 -1
  22. package/dist/{chunk-NEP2PJ2T.js → chunk-UDEZZMV5.js} +3 -3
  23. package/dist/{chunk-7YRGVXR5.js → chunk-XICZEXE5.js} +153 -70
  24. package/dist/{chunk-DFIK6IPP.js → chunk-Y23FQK6O.js} +1 -1
  25. package/dist/cli.js +14 -8
  26. package/dist/{demo-server-ERFY4Q2P.js → demo-server-G4BFXA6G.js} +4 -4
  27. package/dist/index.js +6 -6
  28. package/dist/{intelligence-service-PULUYOPR.js → intelligence-service-FVOFIJP3.js} +2 -2
  29. package/dist/mcp.js +4 -4
  30. package/package.json +11 -12
  31. package/assets/assets/MeasurementPropertyPage-nfGYHl6C.js +0 -1
  32. package/assets/assets/index-D0bY1wpI.css +0 -1
  33. package/assets/assets/v2-overview-adapter-QNwqt0UG.js +0 -1
@@ -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-DgM3aTd-.js";import"./index-B2qeAPfR.js";import"./vendor-radix-twS1M3FF.js";import"./vendor-recharts-llkUFBGR.js";import"./vendor-lucide-N6vOpZmh.js";import"./vendor-markdown-B4giJcws.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-B5okB5g-.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-Cj2lo1GY.js";import"./index-CiWV331j.js";import"./vendor-radix-twS1M3FF.js";import"./vendor-recharts-llkUFBGR.js";import"./vendor-lucide-N6vOpZmh.js";import"./vendor-markdown-B4giJcws.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-B5okB5g-.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
@@ -0,0 +1 @@
1
+ import{r as j,j as a}from"./vendor-tanstack-ZXXkndVj.js";import{K as ie,fB as oe,B as le,aV as ue}from"./index-CiWV331j.js";import{M as ce}from"./vendor-markdown-B4giJcws.js";import{C as de,$ as pe,g as J}from"./vendor-lucide-N6vOpZmh.js";const Ke="Sources",B={copy:"Copy answer",copying:"Copying…",copied:"Copied",failed:"Could not copy. Select and copy the answer above."};function me({previewLength:e,highlight:r}){return o=>{if(e!==void 0&&Number.isFinite(e)){let c=Math.max(0,Math.floor(e));const d={field:"value",omitted:!1},p=n=>{if(n.type==="definition")return!0;if(n.children)return n.children=n.children.filter(p),n.children.length>0;const s=n.type==="image"||n.type==="imageReference"?"alt":"value",f=n[s];if(f===void 0)return c>0;const b=Array.from(f);if(b.length===0)return c>0;if(c===0)return d.omitted=!0,!1;const N=b.length>c,k=b.slice(0,c);if(N&&!/\s/.test(b[c])){let g=k.length-1;for(;g>=0&&!/\s/.test(k[g]);)g--;g>=0&&g>c-40&&(k.length=g)}return d.omitted||=N,n[s]=k.join(""),c=N?0:c-k.length,k.length===0?!1:(d.lastNode=n,d.field=s,!0)};p(o),d.omitted&&(d.lastNode?d.lastNode[d.field]=`${d.lastNode[d.field].trimEnd()}…`:o.children?.push({type:"paragraph",children:[{type:"text",value:"…"}]}))}if(r){const c=d=>{["link","linkReference","code","inlineCode"].includes(d.type)||(d.type==="text"&&(d.data={...d.data,hName:"span"}),d.children?.forEach(c))};c(o)}}}function fe({headingLevel:e}){return r=>{const o=[],c=p=>{p.type==="heading"&&p.depth&&o.push(p),p.children?.forEach(c)};c(r);const d=o.reduce((p,n)=>Math.min(p,n.depth),6);for(const p of o){const n=p.depth-d;p.depth=Math.min(6,e+n),p.data={...p.data,hProperties:{...p.data?.hProperties,"data-answer-heading-level":n+1}}}}}function ge({answer:e}){const[r,o]=j.useState("idle"),c=j.useRef(!1),d=async()=>{if(!c.current){c.current=!0,o("copying");try{await navigator.clipboard.writeText(e),o("copied")}catch{o("failed")}finally{c.current=!1}}};return a.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-x-3",children:[a.jsx(le,{type:"button",variant:"ghost",className:"min-h-11 px-2","aria-disabled":r==="copying","aria-busy":r==="copying",onClick:()=>{d()},children:r==="copying"?B.copying:B.copy}),a.jsx("span",{role:"status",className:"text-sm text-secondary",children:r==="copied"?B.copied:r==="failed"?B.failed:""})]})}const Ae=j.memo(function({children:r,headingLevel:o=4,copyable:c=!1,highlightGroups:d,previewLength:p}){return a.jsxs("div",{className:"answer-markdown",children:[a.jsx(ce,{remarkPlugins:[[fe,{headingLevel:o}],[me,{previewLength:p,highlight:!!d?.length}]],components:{p:({children:n})=>a.jsx("p",{className:"mb-3 whitespace-pre-wrap last:mb-0",children:n}),ul:({children:n})=>a.jsx("ul",{className:"mb-3 ml-5 list-disc space-y-1",children:n}),ol:({children:n,start:s})=>a.jsx("ol",{start:s,className:"mb-3 ml-5 list-decimal space-y-1",children:n}),pre:({children:n})=>a.jsx("pre",{className:"mb-3 overflow-x-auto whitespace-pre-wrap",children:n}),span:({children:n})=>a.jsx("span",{children:typeof n=="string"&&d?n.split(/(https?:\/\/[^\s<>]+)/i).map((s,f)=>f%2?s:a.jsx(j.Fragment,{children:oe(s,d)},f)):n}),a:({children:n,href:s})=>{const f=ie(s);return f?a.jsx("a",{href:f,target:"_blank",rel:"noopener noreferrer",className:"text-link underline",children:n}):a.jsx("span",{children:n})},img:({alt:n})=>a.jsx("span",{children:n})},children:r}),c&&r.trim()?a.jsx(ge,{answer:r},r):null]})}),X="min-h-11 w-full rounded-md border border-default bg-surface px-3 py-2 text-sm text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400",D="flex min-h-11 w-full items-center justify-between gap-3 rounded px-2 text-left text-sm text-primary hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400",E=e=>e.kind==="project"?"Whole site":e.label,R={allMarkets:"All markets",browse:e=>`Browse ${e}`,select:e=>`Select ${e}`,browseAll:"Browse all properties"},he=e=>e?.kind==="group"&&e.marketKeys?.length===1?e.marketKeys[0]:void 0,ee=e=>`${e} ${e===1?"property":"properties"}`;function Se({options:e,selected:r,onSelect:o,marketKey:c,label:d="Measurement scope",labelVisibility:p="visible",allowGroupSelect:n=!0}){const s=[...e].sort((t,u)=>t.label.localeCompare(u.label,void 0,{numeric:!0})||t.id.localeCompare(u.id)),[f,b]=j.useState(""),[N,k]=j.useState([]),[g,$]=j.useState(!1),C=j.useRef(null),I=j.useRef(null),i=j.useId(),y=s.filter(t=>t.kind==="group"),h=new Map(y.map(t=>[t.id,t])),l=h.get(N.at(-1)??""),F=h.get(N.at(-2)??""),x=f.trim().toLocaleLowerCase(),ne=y.filter(t=>!t.parentGroupIds?.some(u=>h.has(u))),_=s.filter(t=>t.kind==="property"),O=t=>(t.parentGroupIds??[]).map(u=>h.get(u)?.label).filter(Boolean).join(" · "),T=t=>`${E(t)} ${O(t)}`.toLocaleLowerCase().includes(x),U=t=>{const u=[...t.parentGroupIds??[]],m=new Set;for(;u.length;){const v=u.pop();if(v===l?.id)return!0;m.has(v)||(m.add(v),u.push(...h.get(v)?.parentGroupIds??[]))}return!1},K=(g?[]:l?y.filter(t=>x?U(t):t.parentGroupIds?.includes(l.id)):x?y:ne).filter(T),A=s.find(t=>t.kind==="market"&&t.id===(c??(r.kind==="market"?r.id:void 0))),H=l&&A&&(l.marketKeys?.includes(A.id)||A.parentGroupIds?.includes(l.id))?A.id:void 0,L=n?H??he(l):void 0,V=(l?_.filter(t=>t.parentGroupIds?.includes(l.id)&&(!L||t.marketKeys?.includes(L))):x||g||y.length===0?_:[]).filter(T),W=s.filter(t=>t.kind!=="market"||g||!n&&!l&&!x&&y.length>0||n&&l?.marketKeys?.length===1&&!x?!1:(l?x?U(t):t.parentGroupIds?.includes(l.id):x||!t.parentGroupIds?.some(m=>h.has(m)))&&T(t)),z=l||g?[]:s.filter(t=>t.kind==="project"&&T(t));j.useEffect(()=>{const t=u=>{C.current?.open&&u.target instanceof Node&&!C.current.contains(u.target)&&(C.current.open=!1)};return document.addEventListener("pointerdown",t),()=>document.removeEventListener("pointerdown",t)},[]);const se=t=>{C.current&&(C.current.open=!1,C.current.querySelector("summary")?.focus());const u=n?t.kind==="property"?L:t.kind==="group"&&t.id===l?.id?H:void 0:void 0;u?o(t,u):o(t)},q=t=>{const u=[];let m=h.get(t.parentGroupIds?.[0]??"");for(;m&&!u.includes(m.id)&&m.id!==t.id;)u.unshift(m.id),m=h.get(m.parentGroupIds?.[0]??"");return[...u,t.id]},ae=()=>{const t=r.kind==="group"?h.get(r.id):void 0,u=h.get(A?.parentGroupIds?.[0]??""),m=(r.parentGroupIds??[]).flatMap(S=>{const w=h.get(S);return w?[q(w)]:[]}),v=m.find(S=>S.at(-1)===l?.id)??m.sort((S,w)=>w.length-S.length)[0]??[],Z=u?q(u):r.marketKeys?.length?[]:v;k(t?q(t):Z),$(r.kind==="property"&&Z.length===0&&y.length>0),b("")},Y=t=>{k(q(t)),$(!1),b(""),I.current?.focus()},P=(t,u=E(t))=>a.jsxs("div",{className:"flex items-stretch",children:[a.jsxs("button",{type:"button",className:D,"aria-label":t.kind==="group"&&!n?R.browse(E(t)):R.select(E(t)),"aria-current":r.kind===t.kind&&r.id===t.id?"true":void 0,onClick:()=>t.kind==="group"&&!n?Y(t):se(t),children:[a.jsxs("span",{className:"min-w-0 break-words",children:[u,x&&O(t)?a.jsx("span",{className:"block text-[13px] text-secondary",children:O(t)}):null]}),a.jsx("span",{className:"shrink-0 text-right text-[13px] text-secondary",children:t.kind==="market"?n?"Query context":"Market":t.kind==="property"?"Property":ee(t.targetCount)})]}),n&&t.kind==="group"&&t.id!==l?.id&&s.some(m=>m.parentGroupIds?.includes(t.id))?a.jsx("button",{type:"button","aria-label":R.browse(t.label),title:`Browse ${t.label}`,className:"flex min-h-11 min-w-11 items-center justify-center rounded text-secondary hover:bg-surface-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400",onClick:()=>Y(t),children:a.jsx(J,{size:18,"aria-hidden":"true"})}):null]},`${t.kind}:${t.id}`),G=(t,u)=>u.length>0?a.jsxs("section",{"aria-label":t,className:"mt-2",children:[a.jsx("h3",{className:"px-2 py-2 text-[13px] font-medium text-secondary",children:t}),u.map(m=>P(m))]}):null,Q=(t,u,m)=>u.length>0?a.jsxs("details",{open:m,className:"mt-2 border-y border-default",children:[a.jsxs("summary",{className:"min-h-11 cursor-pointer px-2 py-3 text-sm text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400",children:[t," (",u.length,")"]}),u.map(v=>P(v))]},`${l?.id??"root"}:${t}`):null;return a.jsxs("div",{className:"min-w-0",children:[a.jsx("span",{id:`${i}-label`,className:p==="sr-only"?"sr-only":"mb-1 block text-sm font-medium text-heading",children:d}),a.jsxs("details",{ref:C,className:"relative",onToggle:t=>{t.target===t.currentTarget&&t.currentTarget.open&&I.current?.focus()},onKeyDown:t=>{t.key==="Escape"&&(t.preventDefault(),t.currentTarget.open=!1,t.currentTarget.querySelector("summary")?.focus())},children:[a.jsxs("summary",{id:`${i}-value`,"aria-labelledby":`${i}-label ${i}-value`,className:`${X} visibility-scope-trigger`,onClick:()=>{C.current?.open||ae()},children:[`${E(r)}${r.kind==="group"?` · ${ee(r.targetCount)}`:r.kind==="property"?` · ${s.find(t=>t.kind==="market"&&t.id===c)?.label??(r.marketKeys?.length?R.allMarkets:"Property")}`:r.kind==="market"?" · Market":""}`,a.jsx(de,{size:16,"aria-hidden":"true",className:"shrink-0 text-secondary"})]}),a.jsxs("div",{className:"visibility-scope-menu",children:[l||g?a.jsxs("div",{className:"mb-2 border-b border-default pb-2",children:[a.jsx("button",{type:"button",className:D,"aria-label":`Back to ${F?.label??"all groups"}`,onClick:()=>{k(N.slice(0,-1)),$(!1),b(""),I.current?.focus()},children:a.jsxs("span",{className:"flex items-center gap-1",children:[a.jsx(pe,{size:16,"aria-hidden":"true"}),F?.label??"All groups"]})}),a.jsx("p",{className:"px-2 py-1 text-sm font-medium text-heading","aria-live":"polite",children:l?.label??"All properties"})]}):null,a.jsx("input",{ref:I,type:"search","aria-label":"Search scopes",className:X,placeholder:l?"Search within this group":g?"Search properties":"Search groups or properties",value:f,onChange:t=>b(t.target.value)}),a.jsxs("div",{className:"mt-2 max-h-80 overflow-y-auto",children:[n&&l&&!x?P(l,"All properties in this group"):null,z.map(t=>P(t)),l&&!x?Q("Subgroups",K,!0):G(l?"Subgroups":"Groups",K),x?G("Properties",V):Q(l&&K.length>0?"All properties":"Properties",V,!l||K.length===0),G("Markets",W),!l&&!g&&!x&&y.length>0&&_.length>0?a.jsxs("button",{type:"button",className:`${D} mt-2 border-t border-default`,"aria-label":R.browseAll,onClick:()=>{$(!0),I.current?.focus()},children:[a.jsx("span",{children:"All properties"}),a.jsx(J,{size:18,"aria-hidden":"true"})]}):null,x&&K.length+V.length+W.length+z.length===0?a.jsx("p",{className:"py-3 text-sm text-secondary",children:"No matching scopes."}):null]})]})]})]})}function Ee(e){const r=e[0];return r?e.every(o=>o.mode===r.mode&&o.scope.kind===r.scope.kind&&o.scope.key===r.scope.key&&o.queryClass===r.queryClass&&o.measurement.displayedRunId===r.measurement.displayedRunId):!0}function M(e){return e.state==="unavailable"?{numerator:null,denominator:null,reason:e.reason}:e.numerator===void 0||e.denominator===void 0||e.denominator<=0?{numerator:null,denominator:null,reason:"not_applicable"}:{numerator:e.numerator,denominator:e.denominator,...e.unattributed===void 0?{}:{unattributed:e.unattributed}}}function ye(e){return e.kind==="exact"?e.url:e.kind==="prefix"?`https://${e.host}${e.pathPrefix}/*`:`https://${e.host}/*`}function be(e){return e==="assigned"?"this-property":e==="sibling"?"another-property":e==="ownedUnmapped"?"owned-unassigned":e==="external"?"external":e==="ambiguous"?"multiple-properties":"invalid-url"}function xe(e){return e==="assigned"?"positive":e==="external"?"neutral":e==="invalid"?"negative":"caution"}function te(e){return`target:${e.targetKey}:${e.queryId}:${e.executionNodeKey}`}function ke(e,r,o){const c=new Map;if(!r)return c;const d=new Map(e.usageEdges.map(s=>[te(s),s.targetKey])),p=new Map(e.assignments.map(s=>[`${s.targetKey}:${s.queryId}`,s.queryClass])),n=new Map(e.usageEdges.map(s=>[te(s),p.get(`${s.targetKey}:${s.queryId}`)]));for(const s of r.evidence){if(o&&n.get(s.usageEdgeId)!==o)continue;const f=d.get(s.usageEdgeId);if(!f)continue;const b=c.get(f)??[];b.push({id:`${s.observationId}:${s.expectedSlotId}:${s.usageEdgeId}:${s.sourceUrl}`,kind:be(s.classification),query:s.queryText,provider:s.provider,location:s.location,url:s.sourceUrl,tone:xe(s.classification),historical:s.historical||s.bridged}),c.set(f,b)}return c}function Ce(e){if(e.flags>0)return{label:"Review",tone:"caution"};const r=[e.mentionCoverage,e.citationCoverage].filter(o=>o.state==="unavailable").map(o=>o.reason);return r.includes("no_completed_run")?{label:"Not measured",tone:"neutral"}:r.includes("plan_v1")?{label:"Update setup",tone:"caution"}:r.includes("evidence_incomplete")?{label:"Evidence incomplete",tone:"caution"}:r.includes("identity_ambiguous")?{label:ue.ambiguous,tone:"caution"}:r.includes("no_population")?{label:"No queries",tone:"neutral"}:r.includes("not_applicable")?{label:"Not applicable",tone:"neutral"}:{label:"Complete",tone:"positive"}}function je(e){return e==="complete"?{label:"Complete",tone:"positive"}:e==="partial"?{label:"Partial",tone:"caution"}:e==="queued"?{label:"Queued",tone:"neutral"}:e==="running"?{label:"Running",tone:"neutral"}:e==="failed"?{label:"Failed",tone:"negative"}:{label:"Not measured",tone:"neutral"}}function Ne(e){if(!e)return"";const r=new Date(e);return Number.isFinite(r.getTime())?r.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric",timeZone:"UTC"}):""}function re(e){const r=e.nextAction.count??e.flags.total;if(e.nextAction.kind==="review_flags")return`${r} flagged ${r===1?"result needs":"results need"} review.`;if(e.nextAction.kind==="complete_setup")return"Finish setup.";if(e.nextAction.kind==="republish_setup")return"Setup update required.";if(e.nextAction.kind==="run_measurement")return"Ready to measure."}function Re({overview:e,activePlan:r,report:o,reportState:c=o?"ready":"loading",sort:d}){if(r.plan.schemaVersion!==2||e.mode!=="active-v2")throw new Error("The current overview requires an active version-two setup.");if(e.scope.kind!=="all"&&e.scope.kind!=="group")throw new Error("The current overview requires an All Properties or group scope.");const p=r.plan,n=new Map(p.targets.map(i=>[i.stableKey,i])),s=new Map(p.querySnapshots.map(i=>[i.queryId,i.queryText])),f=new Map;for(const i of p.assignments){if(e.queryClass!=="all"&&i.queryClass!==e.queryClass)continue;const y=s.get(i.queryId);if(!y)continue;const h=f.get(i.targetKey)??new Set;h.add(y),f.set(i.targetKey,h)}const b=o?.revision===r.revision&&o.run?.id===e.measurement.displayedRunId?o:null,N=e.measurement.displayedRunId===void 0||b?"ready":c==="error"||o!=null?"error":"loading",k=ke(p,b,e.queryClass==="all"?void 0:e.queryClass),g=new Map;for(const i of p.groups)for(const y of i.targetKeys)g.has(y)||g.set(y,i.label);const $=e.properties.items.map(i=>{const y=n.get(i.targetKey),h=k.get(i.targetKey)??[];return{id:i.targetKey,name:i.label,mentionCoverage:M(i.mentionCoverage),citationCoverage:M(i.citationCoverage),status:Ce(i),providers:i.providers?.map(l=>({provider:l.provider,mentionCoverage:M(l.mentionCoverage),citationCoverage:M(l.citationCoverage)})),market:g.get(i.targetKey),assignedQueries:[...f.get(i.targetKey)??[]],urls:y?.urlMatchers.map(ye)??[],evidence:h,evidenceState:N,historical:h.some(l=>l.historical)}}),C=e.namedShareOfVoice?.entries.map(i=>({name:i.label,coverage:{numerator:i.credits,denominator:e.namedShareOfVoice.denominator}})),I=e.properties.items.flatMap(i=>i.flags>0?[{id:`property:${i.targetKey}`,property:i.label,summary:`${i.flags} ${i.flags===1?"result needs":"results need"} review.`,tone:"caution",count:i.flags}]:[]);return{classReporting:"available",latestMeasurement:{status:je(e.measurement.state),completedSlots:e.measurement.completed,totalSlots:e.measurement.expected,date:Ne(e.measurement.completedAt),includesBridgedHistory:e.measurement.includesHistoricalData===!0},currentView:{scope:e.scope.kind==="group"?{kind:"group",...e.scope.key?{key:e.scope.key}:{}}:{kind:"all"},queryClass:e.queryClass,aggregate:{metrics:{propertiesMentioned:M(e.metrics.propertiesMentioned),mentionCoverage:M(e.metrics.mentionCoverage),citationCoverage:M(e.metrics.citationCoverage)},properties:$,...C?{shareOfVoice:C}:{}},propertyTotal:e.properties.totalEstimate??$.length,outcomes:e.outcomes,nextCursor:e.properties.nextCursor,...d?{sort:d}:{}},availableGroups:p.groups.map(i=>({id:i.stableKey,label:i.label})),...re(e)?{nextActionText:re(e)}:{},flaggedResultsTotal:e.flags.total,flaggedResults:I}}export{Ae as A,R as M,Se as V,Ke as a,Ee as b,Re as c,ye as m};
package/assets/index.html CHANGED
@@ -12,14 +12,14 @@
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-B2qeAPfR.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-CiWV331j.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-llkUFBGR.js">
19
19
  <link rel="modulepreload" crossorigin href="./assets/vendor-lucide-N6vOpZmh.js">
20
20
  <link rel="modulepreload" crossorigin href="./assets/vendor-markdown-B4giJcws.js">
21
21
  <link rel="modulepreload" crossorigin href="./assets/vendor-yaml-GWJz5H2G.js">
22
- <link rel="stylesheet" crossorigin href="./assets/index-D0bY1wpI.css">
22
+ <link rel="stylesheet" crossorigin href="./assets/index-DX5M4MHr.css">
23
23
  </head>
24
24
  <body>
25
25
  <div id="root"></div>
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-7YS62CJ4.js";
8
+ } from "./chunk-GIKWL2BQ.js";
9
9
  import {
10
10
  SITE_CRAWL_GRAPH_MAX_EDGES,
11
11
  SITE_CRAWL_GRAPH_MAX_NODES,
@@ -13,7 +13,7 @@ import {
13
13
  TEMPLATE_LINK_RATIO_THRESHOLD,
14
14
  factorStatusFromScore,
15
15
  roundPreservingTotal
16
- } from "./chunk-RCX6I3DX.js";
16
+ } from "./chunk-SJX7XJB6.js";
17
17
 
18
18
  // src/site-audit-factors.ts
19
19
  function recordedSharePct(factor) {
@@ -5,7 +5,7 @@ import {
5
5
  PACKAGE_VERSION,
6
6
  canonryMcpTools,
7
7
  isMachineFormat
8
- } from "./chunk-DFIK6IPP.js";
8
+ } from "./chunk-Y23FQK6O.js";
9
9
  import {
10
10
  AGENT_PROVIDER_IDS,
11
11
  CANONRY_NPM_PACKAGE_URL,
@@ -49,7 +49,7 @@ import {
49
49
  skillsClientSchema,
50
50
  upgradeCaveatFor,
51
51
  upgradeCommandFor
52
- } from "./chunk-RCX6I3DX.js";
52
+ } from "./chunk-SJX7XJB6.js";
53
53
 
54
54
  // src/config.ts
55
55
  import fs from "fs";
@@ -866,7 +866,7 @@ import {
866
866
  wordpressSchemaDeployResultDtoSchema,
867
867
  wordpressSchemaStatusResultDtoSchema,
868
868
  wordpressStatusDtoSchema
869
- } from "./chunk-RCX6I3DX.js";
869
+ } from "./chunk-SJX7XJB6.js";
870
870
 
871
871
  // src/intelligence-service.ts
872
872
  import { eq as eq82, desc as desc36, asc as asc15, and as and69, ne as ne14, or as or20, inArray as inArray32, gte as gte22, lte as lte20, isNull as isNull16, sql as sql31, exists } from "drizzle-orm";
@@ -13504,7 +13504,10 @@ function selectSentimentSources(db, projectId, filters) {
13504
13504
  const selectedRuns = db.select(sourceRunColumns).from(runs).where(and3(...conditions)).orderBy(desc2(runs.createdAt)).limit(101).all();
13505
13505
  if (selectedRuns.length > 100) throw validationError("Selection exceeds 100 runs; narrow the date range.");
13506
13506
  if (requestedIds && new Set(selectedRuns.map((row) => row.id)).size !== new Set(requestedIds).size) throw validationError("One or more selected runs are unavailable in this project.");
13507
- const out = { assessments: [], runIds: selectedRuns.map((row) => row.id), sourceCoverage: { expected: 0, completed: 0 }, skipped: {}, skippedByRun: {} };
13507
+ const out = { assessments: [], runIds: selectedRuns.map((row) => row.id), sourceCoverage: { expected: 0, completed: 0 }, sourceSlotIds: { expected: [], completed: [] }, skipped: {}, skippedByRun: {} };
13508
+ const recordSlots = (runId, slots) => {
13509
+ for (const key of ["expected", "completed"]) out.sourceSlotIds[key].push(...slots[key].map((slot) => pairKey(runId, slot)));
13510
+ };
13508
13511
  let currentRunId = "";
13509
13512
  const skip = (reason, count4 = 1) => {
13510
13513
  out.skipped[reason] = (out.skipped[reason] ?? 0) + count4;
@@ -13531,6 +13534,7 @@ function selectSentimentSources(db, projectId, filters) {
13531
13534
  const completedSuperseded = run.status === "superseded" && Boolean(db.select({ sequence: sentimentCompletionReceipts.sequence }).from(sentimentCompletionReceipts).where(and3(eq8(sentimentCompletionReceipts.projectId, projectId), eq8(sentimentCompletionReceipts.runId, run.id))).get());
13532
13535
  if (run.status !== "completed" && !completedSuperseded) {
13533
13536
  const coverage = selectedSlotCoverage(db, projectId, run, filters, plans);
13537
+ recordSlots(run.id, coverage.slotIds);
13534
13538
  out.sourceCoverage.expected += coverage.expected;
13535
13539
  out.sourceCoverage.completed += coverage.completed;
13536
13540
  skip(run.status === "failed" ? "failed-run" : "incomplete-run");
@@ -13555,6 +13559,7 @@ function selectSentimentSources(db, projectId, filters) {
13555
13559
  out.sourceCoverage.completed += slots.executed;
13556
13560
  if (!slots.planned || !slots.readable || slots.missing.length > 0 || slots.hasUnboundSnapshot) {
13557
13561
  const coverage = selectedSlotCoverage(db, projectId, run, filters, plans);
13562
+ recordSlots(run.id, coverage.slotIds);
13558
13563
  out.sourceCoverage.expected = beforeCoverage.expected + coverage.expected;
13559
13564
  out.sourceCoverage.completed = beforeCoverage.completed + coverage.completed;
13560
13565
  skip("incomplete-run");
@@ -13626,6 +13631,7 @@ function selectSentimentSources(db, projectId, filters) {
13626
13631
  out.sourceCoverage.completed += expected.filter((key) => recorded.has(key)).length;
13627
13632
  if (!expected.length || expected.some((key) => !recorded.has(key)) || snapshots.length !== expected.length || snapshots.some(({ snapshot, query }) => !expectedSlots.has(simpleSlotKey(query?.queryId, snapshot.provider)))) {
13628
13633
  const coverage = selectedSlotCoverage(db, projectId, run, filters, plans);
13634
+ recordSlots(run.id, coverage.slotIds);
13629
13635
  out.sourceCoverage.expected = beforeCoverage.expected + coverage.expected;
13630
13636
  out.sourceCoverage.completed = beforeCoverage.completed + coverage.completed;
13631
13637
  skip("incomplete-run");
@@ -13658,9 +13664,10 @@ function selectSentimentSources(db, projectId, filters) {
13658
13664
  });
13659
13665
  }
13660
13666
  }
13661
- const selectedSlots = new Set(out.assessments.slice(beforeAssessments).map((item2) => item2.snapshotId)).size;
13662
- out.sourceCoverage.expected = beforeCoverage.expected + selectedSlots;
13663
- out.sourceCoverage.completed = beforeCoverage.completed + selectedSlots;
13667
+ const selectedSlots = [...new Set(out.assessments.slice(beforeAssessments).map((item2) => item2.snapshotId))];
13668
+ recordSlots(run.id, { expected: selectedSlots, completed: selectedSlots });
13669
+ out.sourceCoverage.expected = beforeCoverage.expected + selectedSlots.length;
13670
+ out.sourceCoverage.completed = beforeCoverage.completed + selectedSlots.length;
13664
13671
  }
13665
13672
  return out;
13666
13673
  }
@@ -13707,7 +13714,8 @@ function indexedPlan(db, projectId, versionId, cache) {
13707
13714
  }
13708
13715
  function selectedSlotCoverage(db, projectId, run, filters, plans) {
13709
13716
  const expected = /* @__PURE__ */ new Set(), completed = /* @__PURE__ */ new Set();
13710
- if (run.status === "failed") return { expected: 0, completed: 0 };
13717
+ const coverage = () => ({ expected: expected.size, completed: completed.size, slotIds: { expected: [...expected], completed: [...completed] } });
13718
+ if (run.status === "failed") return coverage();
13711
13719
  const snapshots = db.select({ queryId: querySnapshots.queryId, queryText: querySnapshots.queryText, provider: querySnapshots.provider, servedModel: querySnapshots.servedModel, measurementExecutionId: querySnapshots.measurementExecutionId }).from(querySnapshots).where(eq8(querySnapshots.runId, run.id)).all();
13712
13720
  const count4 = (key, edge, recorded) => {
13713
13721
  if (!matchesSentimentEdge(edge, filters)) return;
@@ -13716,7 +13724,7 @@ function selectedSlotCoverage(db, projectId, run, filters, plans) {
13716
13724
  };
13717
13725
  if (run.measurementPlanVersionId) {
13718
13726
  const indexed = indexedPlan(db, projectId, run.measurementPlanVersionId, plans);
13719
- if (!indexed || filters.revision !== void 0 && indexed.revision !== filters.revision) return { expected: 0, completed: 0 };
13727
+ if (!indexed || filters.revision !== void 0 && indexed.revision !== filters.revision) return coverage();
13720
13728
  const bySlot = /* @__PURE__ */ new Map();
13721
13729
  for (const snapshot of snapshots) if (snapshot.measurementExecutionId !== null) keep(bySlot, pairKey(snapshot.measurementExecutionId, snapshot.provider), snapshot);
13722
13730
  const scopedTargets = run.measurementScope?.resolvedTargets.length ? new Set(run.measurementScope.resolvedTargets) : null;
@@ -13733,10 +13741,10 @@ function selectedSlotCoverage(db, projectId, run, filters, plans) {
13733
13741
  }
13734
13742
  }
13735
13743
  } else {
13736
- if (filters.revision !== void 0 || filters.scope && filters.scope !== "project" || filters.marketKey) return { expected: 0, completed: 0 };
13744
+ if (filters.revision !== void 0 || filters.scope && filters.scope !== "project" || filters.marketKey) return coverage();
13737
13745
  const row = db.select({ definition: simpleMeasurementDefinitions.definition }).from(simpleMeasurementDefinitions).where(eq8(simpleMeasurementDefinitions.runId, run.id)).get();
13738
13746
  const stored = simpleMeasurementDefinitionSchema.safeParse(row?.definition);
13739
- if (!stored.success) return { expected: 0, completed: 0 };
13747
+ if (!stored.success) return coverage();
13740
13748
  const sourceQuery = simpleSourceQueries(stored.data);
13741
13749
  const bySlot = /* @__PURE__ */ new Map();
13742
13750
  for (const snapshot of snapshots) {
@@ -13749,7 +13757,7 @@ function selectedSlotCoverage(db, projectId, run, filters, plans) {
13749
13757
  count4(`${query.queryId}:${engine.provider}`, { queryKey: query.queryId, queryText: query.queryText, executionNodeKey: null, queryClass: query.queryClass, propertyKey: run.projectId, groupKeys: [], marketKeys: [], provider: engine.provider, sourceModel: engine.requestedModel, servedModel: snapshot?.servedModel ?? null, context: stored.data.location }, Boolean(snapshot));
13750
13758
  }
13751
13759
  }
13752
- return { expected: expected.size, completed: completed.size };
13760
+ return coverage();
13753
13761
  }
13754
13762
  function matchesSentimentEdge(edge, filters) {
13755
13763
  if (edge.queryClass !== (filters.queryClass ?? "branded")) return false;
@@ -14154,26 +14162,12 @@ var SentimentService = class {
14154
14162
  const selections = resolved.map((entry) => entry.selection), sources = resolved.map((entry) => entry.source);
14155
14163
  const runIds = selections.flatMap((selection2) => selection2.runId ? [selection2.runId] : []).sort();
14156
14164
  const definitions = new Set(selections.flatMap((selection2) => selection2.evaluationDefinitionId ? [selection2.evaluationDefinitionId] : []));
14157
- const modes = new Set(selections.map((selection2) => selection2.mode));
14158
- const revisions = new Set(selections.map((selection2) => selection2.revision));
14159
- const source = { assessments: sources.flatMap((source2) => source2.assessments), runIds, sourceCoverage: { expected: sources.reduce((sum, source2) => sum + source2.sourceCoverage.expected, 0), completed: sources.reduce((sum, source2) => sum + source2.sourceCoverage.completed, 0) }, skipped: sources.reduce((counts2, source2) => {
14165
+ const source = { assessments: sources.flatMap((source2) => source2.assessments), runIds, sourceCoverage: { expected: sources.reduce((sum, source2) => sum + source2.sourceCoverage.expected, 0), completed: sources.reduce((sum, source2) => sum + source2.sourceCoverage.completed, 0) }, sourceSlotIds: { expected: sources.flatMap((source2) => source2.sourceSlotIds.expected), completed: sources.flatMap((source2) => source2.sourceSlotIds.completed) }, skipped: sources.reduce((counts2, source2) => {
14160
14166
  for (const [reason2, count4] of Object.entries(source2.skipped)) counts2[reason2] = (counts2[reason2] ?? 0) + count4;
14161
14167
  return counts2;
14162
14168
  }, {}) };
14163
14169
  const selection = { ...selections[0], runId: runIds.length === 1 ? runIds[0] : null, runIds: runIds.length > 1 ? runIds : void 0, evaluationDefinitionId: definitions.size === 1 ? [...definitions][0] : null };
14164
- let reason = definitions.size > 1 ? "evaluation-definition-changed" : modes.size > 1 ? "source-mode-changed" : revisions.size > 1 ? "measurement-revision-changed" : null;
14165
- const subjects = /* @__PURE__ */ new Map(), queries2 = /* @__PURE__ */ new Map();
14166
- const filter = sourceFilter(query);
14167
- for (const assessment of source.assessments) {
14168
- const identity = sentimentHash(assessment.subject), prior = subjects.get(assessment.subject.key);
14169
- if (prior && prior !== identity) reason ??= "subject-identity-changed";
14170
- subjects.set(assessment.subject.key, identity);
14171
- for (const edge of assessment.edges.filter((edge2) => matchesSentimentEdge(edge2, filter))) {
14172
- const previous = queries2.get(edge.queryKey);
14173
- if (previous && previous !== edge.queryText) reason ??= "query-identity-changed";
14174
- queries2.set(edge.queryKey, edge.queryText);
14175
- }
14176
- }
14170
+ const reason = incompatibleSelectionReason(selections, source.assessments, sourceFilter(query));
14177
14171
  return { selection, items, source, reason, fingerprint: sentimentHash(selections) };
14178
14172
  }
14179
14173
  /** Incompatible pooled identities replace every score in the response with an unavailable one. */
@@ -14205,6 +14199,7 @@ var SentimentService = class {
14205
14199
  overview(projectId, runIds, location) {
14206
14200
  const settings = this.settings(projectId);
14207
14201
  const configured = settings.enabled && settings.installEnabled;
14202
+ const reads = [];
14208
14203
  const headline = (queryClass) => {
14209
14204
  if (!configured || !runIds.length) {
14210
14205
  const empty = { mode: "simple", scope: "project", queryClass, runId: null, revision: null, evaluationDefinitionId: null };
@@ -14212,10 +14207,12 @@ var SentimentService = class {
14212
14207
  return { state: result2.state, reason: result2.reason, provisional: result2.provisional, coverage: result2.coverage, score: result2.score, selection: empty, runIds: [] };
14213
14208
  }
14214
14209
  const read = this.readSelection(projectId, { mode: "auto", scope: "project", queryClass, runIds, ...location ? { location } : {} });
14210
+ reads.push(read);
14215
14211
  const { summary: result } = this.present(read, settings, null);
14216
14212
  return { state: result.state, reason: result.reason, provisional: result.provisional, coverage: result.coverage, score: result.score, selection: result.selection, runIds: result.selection.runIds ?? (result.selection.runId ? [result.selection.runId] : []) };
14217
14213
  };
14218
- return { configured, branded: headline("branded"), nonBrand: headline("non-brand") };
14214
+ const branded = headline("branded"), nonBrand = headline("non-brand");
14215
+ return { configured, branded, nonBrand, overall: overallSentiment(reads, !configured) };
14219
14216
  }
14220
14217
  evidence(projectId, query, limit, cursor) {
14221
14218
  const { assessmentId, ...sourceSelection } = query;
@@ -14276,7 +14273,44 @@ var SentimentService = class {
14276
14273
  };
14277
14274
  var jobAttemptJoin = and4(eq9(sentimentJobItems.workItemId, sentimentAttempts.workItemId), eq9(sentimentJobItems.projectId, sentimentAttempts.projectId));
14278
14275
  function emptySource() {
14279
- return { assessments: [], runIds: [], sourceCoverage: { expected: 0, completed: 0 }, skipped: {} };
14276
+ return { assessments: [], runIds: [], sourceCoverage: { expected: 0, completed: 0 }, sourceSlotIds: { expected: [], completed: [] }, skipped: {} };
14277
+ }
14278
+ function incompatibleSelectionReason(selections, assessments, filter) {
14279
+ const definitions = new Set(selections.flatMap((selection) => selection.evaluationDefinitionId ? [selection.evaluationDefinitionId] : []));
14280
+ const modes = new Set(selections.map((selection) => selection.mode));
14281
+ const revisions = new Set(selections.map((selection) => selection.revision));
14282
+ let reason = definitions.size > 1 ? "evaluation-definition-changed" : modes.size > 1 ? "source-mode-changed" : revisions.size > 1 ? "measurement-revision-changed" : null;
14283
+ const subjects = /* @__PURE__ */ new Map(), queries2 = /* @__PURE__ */ new Map();
14284
+ for (const assessment of assessments) {
14285
+ const identity = sentimentHash(assessment.subject), prior = subjects.get(assessment.subject.key);
14286
+ if (prior && prior !== identity) reason ??= "subject-identity-changed";
14287
+ subjects.set(assessment.subject.key, identity);
14288
+ for (const edge of assessment.edges) {
14289
+ if (filter && !matchesSentimentEdge(edge, filter)) continue;
14290
+ const previous = queries2.get(edge.queryKey);
14291
+ if (previous && previous !== edge.queryText) reason ??= "query-identity-changed";
14292
+ queries2.set(edge.queryKey, edge.queryText);
14293
+ }
14294
+ }
14295
+ return reason;
14296
+ }
14297
+ function overallSentiment(reads, disabled) {
14298
+ const assessmentKey = (item2) => JSON.stringify([item2.snapshotId, item2.subject.key]);
14299
+ const assessments = reads.flatMap((read) => read.source.assessments);
14300
+ const eligible = [...new Map(assessments.map((item2) => [assessmentKey(item2), item2])).values()];
14301
+ const selected = [...new Map(reads.flatMap((read) => read.items).map((item2) => [assessmentKey(item2.member), item2])).values()];
14302
+ const slots = {
14303
+ expected: new Set(reads.flatMap((read) => read.source.sourceSlotIds.expected)).size,
14304
+ completed: new Set(reads.flatMap((read) => read.source.sourceSlotIds.completed)).size
14305
+ };
14306
+ const result = scoreAssessments(selected, eligible, { disabled, slots, incomplete: reads.some((read) => Boolean(read.source.skipped["incomplete-run"])) });
14307
+ const reason = reads.find((read) => read.reason)?.reason ?? incompatibleSelectionReason(reads.map((read) => read.selection), assessments);
14308
+ return {
14309
+ ...result,
14310
+ ...!disabled && reason ? { state: "unsupported", reason, provisional: true, score: aggregateSentiment([]).score } : {},
14311
+ queryClass: "all",
14312
+ runIds: [...new Set(reads.flatMap((read) => read.source.runIds))].sort()
14313
+ };
14280
14314
  }
14281
14315
  function append2(map, key, value) {
14282
14316
  const list = map.get(key);
@@ -15660,7 +15660,8 @@ var sentimentCoverageSchema = z51.object({ selected: count, eligibleAssessments:
15660
15660
  var sentimentScoreSchema = z51.object({ favorableRate: rate, mixedRate: rate, unfavorableRate: rate, favorableDisplay: z51.string(), mixedDisplay: z51.string(), unfavorableDisplay: z51.string(), interval: z51.object({ low: z51.number(), high: z51.number() }).strict().nullable(), method: z51.literal("wilson-independent-v1"), limitation: z51.string() }).strict();
15661
15661
  var headlineFields = { state: sentimentStateSchema, reason: z51.string().nullable(), provisional: z51.boolean(), coverage: sentimentCoverageSchema, score: sentimentScoreSchema };
15662
15662
  var sentimentHeadlineSchema = z51.object({ ...headlineFields, selection: sentimentResolvedSelectionSchema, runIds: z51.array(id) }).strict();
15663
- var sentimentOverviewSchema = z51.object({ configured: z51.boolean(), branded: sentimentHeadlineSchema, nonBrand: sentimentHeadlineSchema }).strict();
15663
+ var sentimentOverallHeadlineSchema = z51.object({ ...headlineFields, queryClass: z51.literal("all"), runIds: z51.array(id) }).strict();
15664
+ var sentimentOverviewSchema = z51.object({ configured: z51.boolean(), branded: sentimentHeadlineSchema, nonBrand: sentimentHeadlineSchema, overall: sentimentOverallHeadlineSchema.optional() }).strict();
15664
15665
  var sentimentAssessmentSummarySchema = z51.object({
15665
15666
  assessmentId: id.nullable(),
15666
15667
  sourceSnapshotId: id,
@@ -4,14 +4,14 @@ import {
4
4
  installSkills,
5
5
  loadConfigRaw,
6
6
  saveConfigPatch
7
- } from "./chunk-WZL73LY3.js";
7
+ } from "./chunk-G3CMWO26.js";
8
8
  import {
9
9
  PACKAGE_VERSION
10
- } from "./chunk-DFIK6IPP.js";
10
+ } from "./chunk-Y23FQK6O.js";
11
11
  import {
12
12
  SKILL_MANIFEST_FILENAME,
13
13
  SkillsClients
14
- } from "./chunk-RCX6I3DX.js";
14
+ } from "./chunk-SJX7XJB6.js";
15
15
 
16
16
  // src/skills-autosync.ts
17
17
  import fs from "fs";