@ainyc/canonry 4.193.2 → 4.194.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.
- package/README.md +1 -1
- package/assets/agent-workspace/skills/canonry/SKILL.md +11 -1
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +11 -0
- package/assets/assets/{AuditHistoryPanel-BBXiKuD1.js → AuditHistoryPanel-C8hUWnaD.js} +1 -1
- package/assets/assets/{BacklinksPage-CE_-DKWO.js → BacklinksPage-BcIdghvA.js} +1 -1
- package/assets/assets/{HistoryPage-D-l4jMt5.js → HistoryPage-DF7PLFi1.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-fCJm3sW6.js → MeasurementPropertyPage-BTlXQbYt.js} +1 -1
- package/assets/assets/{ProjectPage-Cxrd8lZM.js → ProjectPage-YiZ_i5eX.js} +1 -1
- package/assets/assets/{RunRow-C2kmB04V.js → RunRow-CfzuyTSM.js} +1 -1
- package/assets/assets/{RunsPage-B73hjh_l.js → RunsPage-Diu_-YWl.js} +1 -1
- package/assets/assets/{SettingsPage-Ba30Jfnn.js → SettingsPage-g93aqkg2.js} +1 -1
- package/assets/assets/{SiteHealthSection-mjpxy6N9.js → SiteHealthSection-DroMQJVF.js} +3 -3
- package/assets/assets/{TrafficPage-BZ8H_c8u.js → TrafficPage-BhHjy5Ee.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-sCUyzPpH.js → TrafficSourceDetailPage-DI3aZIHo.js} +1 -1
- package/assets/assets/{extract-error-message-G-MvSIBA.js → extract-error-message-DjXzzSl3.js} +1 -1
- package/assets/assets/{index-CSktlkUv.js → index-33ZEL6A5.js} +20 -20
- package/assets/assets/{react-sigma_core.esm.min-CgN2Dnvk.js → react-sigma_core.esm.min-BlfsZb5G.js} +1 -1
- package/assets/assets/{v2-overview-adapter-OmeP2l8O.js → v2-overview-adapter-C6cROMod.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-24JHDZ7H.js → chunk-7XXXNNE2.js} +40 -9
- package/dist/{chunk-LIMWYFHS.js → chunk-AO5QJJE6.js} +2 -2
- package/dist/{chunk-Q5KGSOT7.js → chunk-QVYGI6CL.js} +7 -11
- package/dist/{chunk-5CXUV3ZX.js → chunk-X5AE3GNC.js} +12 -2
- package/dist/{chunk-KJJMIWVD.js → chunk-ZA2QVBQO.js} +23 -7
- package/dist/cli.js +24 -7
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-6ORSU2M6.js → intelligence-service-M4V3YPFZ.js} +2 -2
- package/dist/mcp.js +3 -3
- package/package.json +9 -9
package/assets/assets/{react-sigma_core.esm.min-CgN2Dnvk.js → react-sigma_core.esm.min-BlfsZb5G.js}
RENAMED
|
@@ -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-
|
|
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-DroMQJVF.js";import"./index-33ZEL6A5.js";import"./vendor-radix-twS1M3FF.js";import"./vendor-recharts-D-cUuLZo.js";import"./vendor-lucide-CW2qe0uH.js";import"./vendor-markdown-B-Oq2NYq.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-Bxa_vFmq.js";function Vt(r,n){if(typeof r!="object"||!r)return r;var i=r[Symbol.toPrimitive];if(i!==void 0){var e=i.call(r,n);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}function ae(r){var n=Vt(r,"string");return typeof n=="symbol"?n:n+""}function A(r,n){if(!(r instanceof n))throw new TypeError("Cannot call a class as a function")}function He(r,n){for(var i=0;i<n.length;i++){var e=n[i];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(r,ae(e.key),e)}}function L(r,n,i){return n&&He(r.prototype,n),i&&He(r,i),Object.defineProperty(r,"prototype",{writable:!1}),r}function Q(r){return Q=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},Q(r)}function yt(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(yt=function(){return!!r})()}function jt(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function Zt(r,n){if(n&&(typeof n=="object"||typeof n=="function"))return n;if(n!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return jt(r)}function I(r,n,i){return n=Q(n),Zt(r,yt()?Reflect.construct(n,i||[],Q(r).constructor):n.apply(r,i))}function xe(r,n){return xe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(i,e){return i.__proto__=e,i},xe(r,n)}function G(r,n){if(typeof n!="function"&&n!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(n&&n.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),n&&xe(r,n)}function qt(r){if(Array.isArray(r))return r}function Yt(r,n){var i=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(i!=null){var e,t,a,o,s=[],l=!0,h=!1;try{if(a=(i=i.call(r)).next,n===0){if(Object(i)!==i)return;l=!1}else for(;!(l=(e=a.call(i)).done)&&(s.push(e.value),s.length!==n);l=!0);}catch(u){h=!0,t=u}finally{try{if(!l&&i.return!=null&&(o=i.return(),Object(o)!==o))return}finally{if(h)throw t}}return s}}function Se(r,n){(n==null||n>r.length)&&(n=r.length);for(var i=0,e=Array(n);i<n;i++)e[i]=r[i];return e}function Tt(r,n){if(r){if(typeof r=="string")return Se(r,n);var i={}.toString.call(r).slice(8,-1);return i==="Object"&&r.constructor&&(i=r.constructor.name),i==="Map"||i==="Set"?Array.from(r):i==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Se(r,n):void 0}}function Xt(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
2
2
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ee(r,n){return qt(r)||Yt(r,n)||Tt(r,n)||Xt()}var pe={black:"#000000",silver:"#C0C0C0",gray:"#808080",grey:"#808080",white:"#FFFFFF",maroon:"#800000",red:"#FF0000",purple:"#800080",fuchsia:"#FF00FF",green:"#008000",lime:"#00FF00",olive:"#808000",yellow:"#FFFF00",navy:"#000080",blue:"#0000FF",teal:"#008080",aqua:"#00FFFF",darkblue:"#00008B",mediumblue:"#0000CD",darkgreen:"#006400",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",springgreen:"#00FF7F",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",rebeccapurple:"#663399",mediumaquamarine:"#66CDAA",dimgray:"#696969",dimgrey:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",slategrey:"#708090",lightslategray:"#778899",lightslategrey:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370DB",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",palevioletred:"#DB7093",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",lightyellow:"#FFFFE0",ivory:"#FFFFF0"},Ct=new Int8Array(4),be=new Int32Array(Ct.buffer,0,1),$t=new Float32Array(Ct.buffer,0,1),Kt=/^\s*rgba?\s*\(/,Jt=/^\s*rgba?\s*\(\s*([0-9]*)\s*,\s*([0-9]*)\s*,\s*([0-9]*)(?:\s*,\s*(.*)?)?\)\s*$/;function Qt(r){var n=0,i=0,e=0,t=1;if(r[0]==="#")r.length===4?(n=parseInt(r.charAt(1)+r.charAt(1),16),i=parseInt(r.charAt(2)+r.charAt(2),16),e=parseInt(r.charAt(3)+r.charAt(3),16)):(n=parseInt(r.charAt(1)+r.charAt(2),16),i=parseInt(r.charAt(3)+r.charAt(4),16),e=parseInt(r.charAt(5)+r.charAt(6),16)),r.length===9&&(t=parseInt(r.charAt(7)+r.charAt(8),16)/255);else if(Kt.test(r)){var a=r.match(Jt);a&&(n=+a[1],i=+a[2],e=+a[3],a[4]&&(t=+a[4]))}return{r:n,g:i,b:e,a:t}}var J={};for(var le in pe)J[le]=oe(pe[le]),J[pe[le]]=J[le];function Rt(r,n,i,e,t){return be[0]=e<<24|i<<16|n<<8|r,be[0]=be[0]&4278190079,$t[0]}function oe(r){if(r=r.toLowerCase(),typeof J[r]<"u")return J[r];var n=Qt(r),i=n.r,e=n.g,t=n.b,a=n.a;a=a*255|0;var o=Rt(i,e,t,a);return J[r]=o,o}var Ee={};function _t(r){if(typeof Ee[r]<"u")return Ee[r];var n=(r&16711680)>>>16,i=(r&65280)>>>8,e=r&255,t=255,a=Rt(n,i,e,t);return Ee[r]=a,a}function We(r,n,i,e){return i+(n<<8)+(r<<16)}function Ve(r,n,i,e,t,a){var o=Math.floor(i/a*t),s=Math.floor(r.drawingBufferHeight/a-e/a*t),l=new Uint8Array(4);r.bindFramebuffer(r.FRAMEBUFFER,n),r.readPixels(o,s,1,1,r.RGBA,r.UNSIGNED_BYTE,l);var h=ee(l,4),u=h[0],d=h[1],f=h[2],g=h[3];return[u,d,f,g]}function c(r,n,i){return(n=ae(n))in r?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,r}function je(r,n){var i=Object.keys(r);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(r);n&&(e=e.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),i.push.apply(i,e)}return i}function b(r){for(var n=1;n<arguments.length;n++){var i=arguments[n]!=null?arguments[n]:{};n%2?je(Object(i),!0).forEach(function(e){c(r,e,i[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):je(Object(i)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))})}return r}function ei(r,n){for(;!{}.hasOwnProperty.call(r,n)&&(r=Q(r))!==null;);return r}function Ae(){return Ae=typeof Reflect<"u"&&Reflect.get?Reflect.get.bind():function(r,n,i){var e=ei(r,n);if(e){var t=Object.getOwnPropertyDescriptor(e,n);return t.get?t.get.call(arguments.length<3?r:i):t.value}},Ae.apply(null,arguments)}function wt(r,n,i,e){var t=Ae(Q(r.prototype),n,i);return typeof t=="function"?function(a){return t.apply(i,a)}:t}function ti(r){return r.normalized?1:r.size}function ye(r){var n=0;return r.forEach(function(i){return n+=ti(i)}),n}function xt(r,n,i){var e=r==="VERTEX"?n.VERTEX_SHADER:n.FRAGMENT_SHADER,t=n.createShader(e);if(t===null)throw new Error("loadShader: error while creating the shader");n.shaderSource(t,i),n.compileShader(t);var a=n.getShaderParameter(t,n.COMPILE_STATUS);if(!a){var o=n.getShaderInfoLog(t);throw n.deleteShader(t),new Error(`loadShader: error while compiling the shader:
|
|
3
3
|
`.concat(o,`
|
|
4
4
|
`).concat(i))}return t}function ii(r,n){return xt("VERTEX",r,n)}function ri(r,n){return xt("FRAGMENT",r,n)}function ni(r,n){var i=r.createProgram();if(i===null)throw new Error("loadProgram: error while creating the program.");var e,t;for(e=0,t=n.length;e<t;e++)r.attachShader(i,n[e]);r.linkProgram(i);var a=r.getProgramParameter(i,r.LINK_STATUS);if(!a){var o=r.getProgramInfoLog(i);throw r.deleteProgram(i),new Error("loadProgram: error while linking the program: ".concat(o))}return i}function Ze(r){var n=r.gl,i=r.buffer,e=r.program,t=r.vertexShader,a=r.fragmentShader;n.deleteShader(t),n.deleteShader(a),n.deleteProgram(e),n.deleteBuffer(i)}var qe=`#define PICKING_MODE
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as o,r as C}from"./vendor-tanstack-ZXXkndVj.js";import{y as M,B as A}from"./index-
|
|
1
|
+
import{j as o,r as C}from"./vendor-tanstack-ZXXkndVj.js";import{y as M,B as A}from"./index-33ZEL6A5.js";import{M as $}from"./vendor-markdown-B-Oq2NYq.js";const H="Sources",y={copy:"Copy answer",copying:"Copying…",copied:"Copied",failed:"Could not copy. Select and copy the answer above."};function N({headingLevel:e}){return n=>{const r=[],s=i=>{i.type==="heading"&&i.depth&&r.push(i),i.children?.forEach(s)};s(n);const l=r.reduce((i,u)=>Math.min(i,u.depth),6);for(const i of r){const u=i.depth-l;i.depth=Math.min(6,e+u),i.data={...i.data,hProperties:{...i.data?.hProperties,"data-answer-heading-level":u+1}}}}}function R({answer:e}){const[n,r]=C.useState("idle"),s=C.useRef(!1),l=async()=>{if(!s.current){s.current=!0,r("copying");try{await navigator.clipboard.writeText(e),r("copied")}catch{r("failed")}finally{s.current=!1}}};return o.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-x-3",children:[o.jsx(A,{type:"button",variant:"ghost",className:"min-h-11 px-2","aria-disabled":n==="copying","aria-busy":n==="copying",onClick:()=>{l()},children:n==="copying"?y.copying:y.copy}),o.jsx("span",{role:"status",className:"text-sm text-secondary",children:n==="copied"?y.copied:n==="failed"?y.failed:""})]})}function L({children:e,headingLevel:n=4,copyable:r=!1}){return o.jsxs("div",{className:"answer-markdown",children:[o.jsx($,{remarkPlugins:[[N,{headingLevel:n}]],components:{p:({children:s})=>o.jsx("p",{className:"mb-3 whitespace-pre-wrap last:mb-0",children:s}),ul:({children:s})=>o.jsx("ul",{className:"mb-3 ml-5 list-disc space-y-1",children:s}),ol:({children:s,start:l})=>o.jsx("ol",{start:l,className:"mb-3 ml-5 list-decimal space-y-1",children:s}),pre:({children:s})=>o.jsx("pre",{className:"mb-3 overflow-x-auto whitespace-pre-wrap",children:s}),a:({children:s,href:l})=>{const i=M(l);return i?o.jsx("a",{href:i,target:"_blank",rel:"noopener noreferrer",className:"text-link underline",children:s}):o.jsx("span",{children:s})},img:({alt:s})=>o.jsx("span",{children:s})},children:e}),r&&e.trim()?o.jsx(R,{answer:e},e):null]})}function F(e){const n=e[0];return n?e.every(r=>r.mode===n.mode&&r.scope.kind===n.scope.kind&&r.scope.key===n.scope.key&&r.queryClass===n.queryClass&&r.measurement.displayedRunId===n.measurement.displayedRunId):!0}function p(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}}function I(e){return e.kind==="exact"?e.url:e.kind==="prefix"?`https://${e.host}${e.pathPrefix}/*`:`https://${e.host}/*`}function T(e){return e==="assigned"?"this-property":e==="sibling"?"another-property":e==="ownedUnmapped"?"owned-unassigned":e==="external"?"external":e==="ambiguous"?"multiple-properties":"invalid-url"}function _(e){return e==="assigned"?"positive":e==="external"?"neutral":e==="invalid"?"negative":"caution"}function k(e){return`target:${e.targetKey}:${e.queryId}:${e.executionNodeKey}`}function j(e,n,r){const s=new Map;if(!n)return s;const l=new Map(e.usageEdges.map(a=>[k(a),a.targetKey])),i=new Map(e.assignments.map(a=>[`${a.targetKey}:${a.queryId}`,a.queryClass])),u=new Map(e.usageEdges.map(a=>[k(a),i.get(`${a.targetKey}:${a.queryId}`)]));for(const a of n.evidence){if(r&&u.get(a.usageEdgeId)!==r)continue;const c=l.get(a.usageEdgeId);if(!c)continue;const m=s.get(c)??[];m.push({id:`${a.observationId}:${a.expectedSlotId}:${a.usageEdgeId}:${a.sourceUrl}`,kind:T(a.classification),query:a.queryText,provider:a.provider,location:a.location,url:a.sourceUrl,tone:_(a.classification),historical:a.historical||a.bridged}),s.set(c,m)}return s}function B(e){if(e.flags>0)return{label:"Review",tone:"caution"};const n=[e.mentionCoverage,e.citationCoverage].filter(r=>r.state==="unavailable").map(r=>r.reason);return n.includes("no_completed_run")?{label:"Not measured",tone:"neutral"}:n.includes("plan_v1")?{label:"Update setup",tone:"caution"}:n.includes("evidence_incomplete")?{label:"Evidence incomplete",tone:"caution"}:n.includes("no_population")?{label:"No queries",tone:"neutral"}:n.includes("not_applicable")?{label:"Not applicable",tone:"neutral"}:{label:"Complete",tone:"positive"}}function O(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 U(e){if(!e)return"";const n=new Date(e);return Number.isFinite(n.getTime())?n.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric",timeZone:"UTC"}):""}function q(e){const n=e.nextAction.count??e.flags.total;if(e.nextAction.kind==="review_flags")return`${n} flagged ${n===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 W({overview:e,activePlan:n,report:r,reportState:s=r?"ready":"loading",sort:l}){if(n.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 i=n.plan,u=new Map(i.targets.map(t=>[t.stableKey,t])),a=new Map(i.querySnapshots.map(t=>[t.queryId,t.queryText])),c=new Map;for(const t of i.assignments){if(e.queryClass!=="all"&&t.queryClass!==e.queryClass)continue;const d=a.get(t.queryId);if(!d)continue;const g=c.get(t.targetKey)??new Set;g.add(d),c.set(t.targetKey,g)}const m=r?.revision===n.revision&&r.run?.id===e.measurement.displayedRunId?r:null,K=e.measurement.displayedRunId===void 0||m?"ready":s==="error"||r!=null?"error":"loading",S=j(i,m,e.queryClass==="all"?void 0:e.queryClass),h=new Map;for(const t of i.groups)for(const d of t.targetKeys)h.has(d)||h.set(d,t.label);const x=e.properties.items.map(t=>{const d=u.get(t.targetKey),g=S.get(t.targetKey)??[];return{id:t.targetKey,name:t.label,mentionCoverage:p(t.mentionCoverage),citationCoverage:p(t.citationCoverage),status:B(t),providers:t.providers?.map(f=>({provider:f.provider,mentionCoverage:p(f.mentionCoverage),citationCoverage:p(f.citationCoverage)})),market:h.get(t.targetKey),assignedQueries:[...c.get(t.targetKey)??[]],urls:d?.urlMatchers.map(I)??[],evidence:g,evidenceState:K,historical:g.some(f=>f.historical)}}),b=e.namedShareOfVoice?.entries.map(t=>({name:t.label,coverage:{numerator:t.credits,denominator:e.namedShareOfVoice.denominator}})),E=e.properties.items.flatMap(t=>t.flags>0?[{id:`property:${t.targetKey}`,property:t.label,summary:`${t.flags} ${t.flags===1?"result needs":"results need"} review.`,tone:"caution",count:t.flags}]:[]);return{classReporting:"available",latestMeasurement:{status:O(e.measurement.state),completedSlots:e.measurement.completed,totalSlots:e.measurement.expected,date:U(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:p(e.metrics.propertiesMentioned),mentionCoverage:p(e.metrics.mentionCoverage),citationCoverage:p(e.metrics.citationCoverage)},properties:x,...b?{shareOfVoice:b}:{}},propertyTotal:e.properties.totalEstimate??x.length,outcomes:e.outcomes,nextCursor:e.properties.nextCursor,...l?{sort:l}:{}},availableGroups:i.groups.map(t=>({id:t.stableKey,label:t.label})),...q(e)?{nextActionText:q(e)}:{},flaggedResultsTotal:e.flags.total,flaggedResults:E}}export{L as A,H as a,F as b,W as c,I as m};
|
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-
|
|
15
|
+
<script type="module" crossorigin src="./assets/index-33ZEL6A5.js"></script>
|
|
16
16
|
<link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-ZXXkndVj.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="./assets/vendor-radix-twS1M3FF.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="./assets/vendor-recharts-D-cUuLZo.js">
|
|
@@ -99,13 +99,14 @@ import {
|
|
|
99
99
|
schedulableRunKindSchema,
|
|
100
100
|
scheduleUpsertRequestSchema,
|
|
101
101
|
skillsClientSchema,
|
|
102
|
+
snapshotRequestInputSchema,
|
|
102
103
|
trafficConnectCloudRunRequestSchema,
|
|
103
104
|
trafficConnectVercelRequestSchema,
|
|
104
105
|
trafficConnectWordpressRequestSchema,
|
|
105
106
|
trafficEventKindSchema,
|
|
106
107
|
trafficSeriesGranularitySchema,
|
|
107
108
|
visibilityReportRequestSchema
|
|
108
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-X5AE3GNC.js";
|
|
109
110
|
|
|
110
111
|
// src/cli-error.ts
|
|
111
112
|
function isMachineFormat(format) {
|
|
@@ -10828,6 +10829,17 @@ var canonryMcpTools = [
|
|
|
10828
10829
|
openApiOperations: ["POST /api/v1/projects/{name}/traffic/sources/{id}/reset"],
|
|
10829
10830
|
handler: (client2, input) => client2.trafficReset(input.project, input.sourceId)
|
|
10830
10831
|
}),
|
|
10832
|
+
defineTool({
|
|
10833
|
+
name: "canonry_snapshot",
|
|
10834
|
+
title: "Generate a prospect snapshot",
|
|
10835
|
+
description: "Generate a one-shot AI perception report for a company and domain without creating a project. Spends provider quota and fetches the site. Optional providers and providerMode constrain both answers and analysis; omitted selection uses all configured providers. Browser-only selection requires manual queries.",
|
|
10836
|
+
access: "write",
|
|
10837
|
+
tier: "discovery",
|
|
10838
|
+
inputSchema: snapshotRequestInputSchema,
|
|
10839
|
+
annotations: writeAnnotations({ idempotentHint: false, openWorldHint: true }),
|
|
10840
|
+
openApiOperations: ["POST /api/v1/snapshot"],
|
|
10841
|
+
handler: (client2, input) => client2.createSnapshot(input)
|
|
10842
|
+
}),
|
|
10831
10843
|
defineTool({
|
|
10832
10844
|
name: "canonry_project_upsert",
|
|
10833
10845
|
title: "Create or replace project",
|
|
@@ -12585,8 +12597,8 @@ var CANONRY_MCP_TOOLKITS = [
|
|
|
12585
12597
|
{
|
|
12586
12598
|
name: "discovery",
|
|
12587
12599
|
title: "Query discovery and research",
|
|
12588
|
-
description: "
|
|
12589
|
-
whenToLoad: "Load
|
|
12600
|
+
description: "Find queries expands an ICP into a promotable tracked-query basket; research queries runs saved free-form experiments against one API model. Research never adds queries to tracking. Prospect snapshots generate a company report without creating a project.",
|
|
12601
|
+
whenToLoad: "Load for prospect snapshots, ICP-led candidates for a tracked basket, or research into free-form queries, model answers, sources, and location effects without changing tracking."
|
|
12590
12602
|
}
|
|
12591
12603
|
];
|
|
12592
12604
|
function isCanonryMcpToolkitName(value) {
|
|
@@ -12730,6 +12742,21 @@ var OPERATIONS_GUIDE = {
|
|
|
12730
12742
|
],
|
|
12731
12743
|
"guidance": "Compare stored history in the same project, period, provider/model, location, and query-class scope. Separate observed changes from possible causes; propose any live verification for approval."
|
|
12732
12744
|
},
|
|
12745
|
+
"prospecting": {
|
|
12746
|
+
"keywords": [
|
|
12747
|
+
"prospect",
|
|
12748
|
+
"prospects",
|
|
12749
|
+
"prospecting",
|
|
12750
|
+
"snapshot"
|
|
12751
|
+
],
|
|
12752
|
+
"next": [
|
|
12753
|
+
"canonry_settings_get"
|
|
12754
|
+
],
|
|
12755
|
+
"actions": [
|
|
12756
|
+
"canonry_snapshot"
|
|
12757
|
+
],
|
|
12758
|
+
"guidance": "Inspect stored provider settings, then agree on the company, domain, providers, and queries. Snapshot generation spends quota and fetches the site; approval must cover that work. No project is required. Use the snapshot action only when offered by this connection; its absence does not grant permission to bypass access restrictions."
|
|
12759
|
+
},
|
|
12733
12760
|
"measurement": {
|
|
12734
12761
|
"keywords": [
|
|
12735
12762
|
"measurement",
|
|
@@ -12783,7 +12810,7 @@ var OPERATIONS_GUIDE = {
|
|
|
12783
12810
|
"guidance": "Read the stored report for the selected project and period. Retain evidence dates, scope, sample sizes, missing data, and separate mention/citation signals; do not generate fresh runs implicitly."
|
|
12784
12811
|
}
|
|
12785
12812
|
},
|
|
12786
|
-
"markdown": "# Canonry Operations Guide v1\n\nCanonry is an agent-first AI visibility platform. MCP is the universal entry\npoint for connected agents. Host-native skills are optional upgrades, not a\nprerequisite or a permission mechanism.\n\n## Connect and choose a route\n\nRead the initialization guidance, then call `canonry_help` with an `intent`:\n`status`, `diagnose`, `measurement`, `integrations`, `reports`, or a short task\ndescription. Select an accessible project with `canonry_projects_list` before\nusing its exact name in project tools. Inspect each listed tool's input schema;\nhelp suggests tool names, not invented arguments or authorization.\n\nHelp returns a versioned, compact route: connection `mode`, available `next`\ntools, workflow guidance, approval boundaries, and this guide's URL. It performs\nno provider calls, reads no project data, and changes no permissions.\n`includeCatalog: true` additionally returns toolkit details when needed.\n\nHosted connections use a fixed catalog. Help only suggests tools offered by that\nconnection; it never tells a hosted agent to dynamically load a toolkit. A\nprogressive local stdio connection may return `loadToolkits`: call\n`canonry_load_toolkit` with one returned name, await it, then call help again.\nLoading only changes local tool discovery, never server authority.\n\nThe optional `canonry://agent-operations/v1` MCP resource contains this same\nguide. If the host cannot read resources or open links, continue through help.\nDo not install a plugin, local runtime, or skill merely to use connected MCP.\nAn installed Codex or Claude Canonry skill contains a generated copy of this\nguide plus links to host-native references. It does not replace runtime help.\n\n## Vocabulary and evidence\n\n- **Mentioned** means the brand appears in answer text. **Cited** means its\n domain appears in source links. Either, both, or neither can occur; never\n compute one signal from the other.\n- `answerMentioned: null` means not checked, not false. Missing runs and empty\n populations mean no measurement, not zero visibility.\n- Preserve project, time window, provider, requested/served model, location,\n sample size, and query class when comparing evidence. Use server-returned\n metrics; do not invent a score from incompatible populations.\n- Simple projects and Advanced portfolios share the workflow. For Advanced\n results, preserve Property, Target, market, plan revision, and class scope.\n Groups organize navigation; do not infer an unrequested fan-out.\n- Research is isolated evidence, not tracked measurement. A probe still spends\n quota and persists evidence but is excluded from normal tracking metrics.\n\n## Workflows\n\n**Status:** read the stored overview and freshness first. Say when evidence is\nmissing instead of silently creating it.\n\n**Diagnose:** inspect stored history and comparable evidence. Explain what\nchanged separately from why it might have changed. A hypothesis is not a\nmeasured cause. Propose bounded verification if stored evidence is insufficient.\n\n**Measurement:** inspect the existing setup and results before proposing edits.\nKeep research, query tracking, plan publication, and sweep execution separate.\nFor direct research, submit the final editable query text in one context. For a\nreviewed batch, submit each explicit destination with its final text and one\nidempotency key. Pattern substitution happens in the client before either\nrequest; choosing a market or Property records a destination only and never\nrewrites a query or creates an automatic fan-out. `research.run` does not\nauthorize saving patterns, changing tracking, publishing plans, or settings.\nUse a supported preview where available, inspect its exact destination and\nrevision, then seek approval for the actual change. A preview may itself require\nwrite permission; never treat a dry-run flag as a universal safety guarantee.\n\n**Integrations:** inspect stored connection state and snapshot freshness first.\nProvider configuration evidence does not prove a browser event fired or a\nconversion was recorded. Connection, resource selection, refresh/sync, and live\nreads are separate actions. Credentials belong in the operator's secure setup\nflow, never in chat, tool arguments, reports, or public guidance.\n\n**Reports:** use saved evidence for the requested period and scope. Keep mention\nand citation signals separate, include dates and sample sizes, and state missing\nor stale inputs. For Advanced Property mention rankings, use\n`canonry_measurement_portfolio_summary` and its `mentionRanking.strongest`,\n`.weakest`, and `.excluded` lists. It defaults to non-brand questions; state the\nreturned class and report branded results separately. An unavailable portfolio\naggregate does not invalidate available Property mention rates. Flag excluded\nProperties individually; do not silently replace mention ranking with citation\nranking. Keep sample sizes and ties visible. Preparing a report does not\nauthorize new measurement.\n\n## Authority and approval\n\nStart with stored evidence. Before a live provider read, sweep, probe, research\nrun, sync, write, or externally visible action, obtain approval covering its\nexact target, action, and bounded work. Approval already given for that exact\noperation need not be asked for again, but does not extend to more projects,\nlarger batches, retries with new identities, or recurring work.\n\nHTTP GET and MCP `readOnlyHint` describe aspects of an operation, not its cost\nor permission. Provider discovery, account reads, and live diagnostics may\nconsume quota even when labeled read-only. If the tool's effect is unclear,\ninspect its description and request direction before calling it.\n\nAuthentication, role/scope checks, project restrictions, quotas, and guarded\napproval receipts are enforced by the server. Help, skills, resources, and tool\nvisibility cannot grant authority. Never change credentials, endpoints, or\nproject identifiers to work around a missing tool or a `403` response.\n\nFor guarded ads writes, inspect unresolved operation receipts before retrying.\nUse the receipt's supported recovery action; do not replay a mutation under a\nnew identity. An executor cannot create or widen its own human approval grant.\nOn ambiguous results, exhausted bounds, or refusal, stop and report what is\nknown and what permission or operator action is needed.\n\n## Version and source\n\nThis public, versioned document is the source for initialization guidance,\nintent routes, the optional resource, and generated Canonry `SKILL.md` files.\nGuide v1 may receive compatible clarifications; incompatible routing contracts\nrequire a new guide version. The running server's help describes its actual\ncatalog and remains usable without fetching this document.\n"
|
|
12813
|
+
"markdown": "# Canonry Operations Guide v1\n\nCanonry is an agent-first AI visibility platform. MCP is the universal entry\npoint for connected agents. Host-native skills are optional upgrades, not a\nprerequisite or a permission mechanism.\n\n## Connect and choose a route\n\nRead the initialization guidance, then call `canonry_help` with an `intent`:\n`status`, `diagnose`, `prospecting`, `measurement`, `integrations`, `reports`, or a short task\ndescription. Select an accessible project with `canonry_projects_list` before\nusing its exact name in project tools. Inspect each listed tool's input schema;\nhelp suggests tool names, not invented arguments or authorization.\n\nHelp returns a versioned, compact route: connection `mode`, available `next`\ntools, workflow guidance, approval boundaries, and this guide's URL. It performs\nno provider calls, reads no project data, and changes no permissions.\n`next` lists stored reads. Optional `actions` lists loaded tools for work that\nrequires approval; listing an action does not authorize or execute it.\n`includeCatalog: true` additionally returns toolkit details when needed.\n\nHosted connections use a fixed catalog. Help only suggests tools offered by that\nconnection; it never tells a hosted agent to dynamically load a toolkit. A\nprogressive local stdio connection may return `loadToolkits`: call\n`canonry_load_toolkit` with one returned name, await it, then call help again.\nLoading only changes local tool discovery, never server authority.\n\nThe optional `canonry://agent-operations/v1` MCP resource contains this same\nguide. If the host cannot read resources or open links, continue through help.\nDo not install a plugin, local runtime, or skill merely to use connected MCP.\nAn installed Codex or Claude Canonry skill contains a generated copy of this\nguide plus links to host-native references. It does not replace runtime help.\n\n## Vocabulary and evidence\n\n- **Mentioned** means the brand appears in answer text. **Cited** means its\n domain appears in source links. Either, both, or neither can occur; never\n compute one signal from the other.\n- `answerMentioned: null` means not checked, not false. Missing runs and empty\n populations mean no measurement, not zero visibility.\n- Preserve project, time window, provider, requested/served model, location,\n sample size, and query class when comparing evidence. Use server-returned\n metrics; do not invent a score from incompatible populations.\n- Simple projects and Advanced portfolios share the workflow. For Advanced\n results, preserve Property, Target, market, plan revision, and class scope.\n Groups organize navigation; do not infer an unrequested fan-out.\n- Research is isolated evidence, not tracked measurement. A probe still spends\n quota and persists evidence but is excluded from normal tracking metrics.\n\n## Workflows\n\n**Status:** read the stored overview and freshness first. Say when evidence is\nmissing instead of silently creating it.\n\n**Diagnose:** inspect stored history and comparable evidence. Explain what\nchanged separately from why it might have changed. A hypothesis is not a\nmeasured cause. Propose bounded verification if stored evidence is insufficient.\n\n**Prospecting:** generate a one-shot company snapshot without creating a project.\nInspect stored provider settings first. Agree on the company, domain, selected\nproviders, and queries before starting the quota-spending snapshot action.\nBrowser-only selection requires manual queries. Progressive stdio help offers\nthe discovery toolkit when this connection permits snapshots; load it, then\ncall help again. Fixed catalogs offer only already available actions. Read-only\nand restricted connections must not bypass missing snapshot access.\n\n**Measurement:** inspect the existing setup and results before proposing edits.\nKeep research, query tracking, plan publication, and sweep execution separate.\nFor direct research, submit the final editable query text in one context. For a\nreviewed batch, submit each explicit destination with its final text and one\nidempotency key. Pattern substitution happens in the client before either\nrequest; choosing a market or Property records a destination only and never\nrewrites a query or creates an automatic fan-out. `research.run` does not\nauthorize saving patterns, changing tracking, publishing plans, or settings.\nUse a supported preview where available, inspect its exact destination and\nrevision, then seek approval for the actual change. A preview may itself require\nwrite permission; never treat a dry-run flag as a universal safety guarantee.\n\n**Integrations:** inspect stored connection state and snapshot freshness first.\nProvider configuration evidence does not prove a browser event fired or a\nconversion was recorded. Connection, resource selection, refresh/sync, and live\nreads are separate actions. Credentials belong in the operator's secure setup\nflow, never in chat, tool arguments, reports, or public guidance.\n\n**Reports:** use saved evidence for the requested period and scope. Keep mention\nand citation signals separate, include dates and sample sizes, and state missing\nor stale inputs. For Advanced Property mention rankings, use\n`canonry_measurement_portfolio_summary` and its `mentionRanking.strongest`,\n`.weakest`, and `.excluded` lists. It defaults to non-brand questions; state the\nreturned class and report branded results separately. An unavailable portfolio\naggregate does not invalidate available Property mention rates. Flag excluded\nProperties individually; do not silently replace mention ranking with citation\nranking. Keep sample sizes and ties visible. Preparing a report does not\nauthorize new measurement.\n\n## Authority and approval\n\nStart with stored evidence. Before a live provider read, sweep, probe, research\nrun, sync, write, or externally visible action, obtain approval covering its\nexact target, action, and bounded work. Approval already given for that exact\noperation need not be asked for again, but does not extend to more projects,\nlarger batches, retries with new identities, or recurring work.\n\nHTTP GET and MCP `readOnlyHint` describe aspects of an operation, not its cost\nor permission. Provider discovery, account reads, and live diagnostics may\nconsume quota even when labeled read-only. If the tool's effect is unclear,\ninspect its description and request direction before calling it.\n\nAuthentication, role/scope checks, project restrictions, quotas, and guarded\napproval receipts are enforced by the server. Help, skills, resources, and tool\nvisibility cannot grant authority. Never change credentials, endpoints, or\nproject identifiers to work around a missing tool or a `403` response.\n\nFor guarded ads writes, inspect unresolved operation receipts before retrying.\nUse the receipt's supported recovery action; do not replay a mutation under a\nnew identity. An executor cannot create or widen its own human approval grant.\nOn ambiguous results, exhausted bounds, or refusal, stop and report what is\nknown and what permission or operator action is needed.\n\n## Version and source\n\nThis public, versioned document is the source for initialization guidance,\nintent routes, the optional resource, and generated Canonry `SKILL.md` files.\nGuide v1 may receive compatible clarifications; incompatible routing contracts\nrequire a new guide version. The running server's help describes its actual\ncatalog and remains usable without fetching this document.\n"
|
|
12787
12814
|
};
|
|
12788
12815
|
|
|
12789
12816
|
// src/mcp/operations-guide.ts
|
|
@@ -12793,11 +12820,14 @@ function operationsHelp(catalog, mode, intent = "", includeCatalog = false) {
|
|
|
12793
12820
|
const workflow = workflows.find((name) => OPERATIONS_GUIDE.workflows[name].keywords.some((word) => words.has(word))) ?? "status";
|
|
12794
12821
|
const route = OPERATIONS_GUIDE.workflows[workflow];
|
|
12795
12822
|
const available = /* @__PURE__ */ new Set([...catalog.coreTools, ...catalog.toolkits.filter((t) => t.loaded).flatMap((t) => t.tools)]);
|
|
12796
|
-
const
|
|
12797
|
-
|
|
12823
|
+
const reads = route.next;
|
|
12824
|
+
const requestedActions = "actions" in route ? route.actions : [];
|
|
12825
|
+
const next = reads.filter((name) => available.has(name)).slice(0, 4);
|
|
12826
|
+
const actions = requestedActions.filter((name) => available.has(name));
|
|
12827
|
+
if (reads.includes("canonry_projects_list") && next.length < 2 && available.has("canonry_project_overview") && !next.includes("canonry_project_overview")) {
|
|
12798
12828
|
next.push("canonry_project_overview");
|
|
12799
12829
|
}
|
|
12800
|
-
const wanted =
|
|
12830
|
+
const wanted = [...reads, ...requestedActions];
|
|
12801
12831
|
const loadToolkits = mode === "stdio-progressive" ? catalog.toolkits.filter((t) => !t.loaded && t.tools.some((name) => wanted.includes(name))).map((t) => t.name) : [];
|
|
12802
12832
|
return {
|
|
12803
12833
|
guideVersion: OPERATIONS_GUIDE.guideVersion,
|
|
@@ -12805,6 +12835,7 @@ function operationsHelp(catalog, mode, intent = "", includeCatalog = false) {
|
|
|
12805
12835
|
scope: catalog.scope,
|
|
12806
12836
|
workflow,
|
|
12807
12837
|
next,
|
|
12838
|
+
...actions.length ? { actions } : {},
|
|
12808
12839
|
workflows,
|
|
12809
12840
|
guidance: route.guidance,
|
|
12810
12841
|
approvalBoundary: OPERATIONS_GUIDE.approvalBoundary,
|
|
@@ -12867,7 +12898,7 @@ var loadToolkitInputSchema = z5.object({
|
|
|
12867
12898
|
name: z5.enum(CANONRY_MCP_TOOLKIT_NAMES).describe("Toolkit name. List options with canonry_help.")
|
|
12868
12899
|
});
|
|
12869
12900
|
var helpInputSchema = z5.object({
|
|
12870
|
-
intent: z5.string().max(200).optional().describe("Workflow (status, diagnose, measurement, integrations, reports) or a short task description."),
|
|
12901
|
+
intent: z5.string().max(200).optional().describe("Workflow (status, diagnose, prospecting, measurement, integrations, reports) or a short task description."),
|
|
12871
12902
|
includeCatalog: z5.boolean().optional().describe("Include full toolkit details. Omit for a compact, actionable route.")
|
|
12872
12903
|
});
|
|
12873
12904
|
function registerMetaTools(server, catalog, opts) {
|
|
@@ -12875,7 +12906,7 @@ function registerMetaTools(server, catalog, opts) {
|
|
|
12875
12906
|
"canonry_help",
|
|
12876
12907
|
{
|
|
12877
12908
|
title: "Guide a Canonry workflow",
|
|
12878
|
-
description: "Start here: route an intent to available stored-evidence tools,
|
|
12909
|
+
description: "Start here: route an intent to available stored-evidence tools, separately listed actions requiring approval, and workflow guidance. No provider calls or installation required. Optionally include full toolkit details.",
|
|
12879
12910
|
inputSchema: helpInputSchema.shape,
|
|
12880
12911
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false }
|
|
12881
12912
|
},
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
installSkills,
|
|
6
6
|
loadConfigRaw,
|
|
7
7
|
saveConfigPatch
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7XXXNNE2.js";
|
|
9
9
|
import {
|
|
10
10
|
SKILL_MANIFEST_FILENAME,
|
|
11
11
|
SkillsClients
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-X5AE3GNC.js";
|
|
13
13
|
|
|
14
14
|
// src/skills-autosync.ts
|
|
15
15
|
import fs from "fs";
|
|
@@ -639,6 +639,7 @@ import {
|
|
|
639
639
|
snapshotDiffResponseSchema,
|
|
640
640
|
snapshotListResponseSchema,
|
|
641
641
|
snapshotReportSchema,
|
|
642
|
+
snapshotRequestInputSchema,
|
|
642
643
|
snapshotRequestSchema,
|
|
643
644
|
sourceBreakdownDtoSchema,
|
|
644
645
|
splitList,
|
|
@@ -691,7 +692,7 @@ import {
|
|
|
691
692
|
wordpressSchemaDeployResultDtoSchema,
|
|
692
693
|
wordpressSchemaStatusResultDtoSchema,
|
|
693
694
|
wordpressStatusDtoSchema
|
|
694
|
-
} from "./chunk-
|
|
695
|
+
} from "./chunk-X5AE3GNC.js";
|
|
695
696
|
|
|
696
697
|
// src/intelligence-service.ts
|
|
697
698
|
import { eq as eq67, desc as desc29, asc as asc12, and as and57, ne as ne10, or as or15, inArray as inArray25, gte as gte18, lte as lte15, isNull as isNull12, sql as sql26, exists } from "drizzle-orm";
|
|
@@ -34998,6 +34999,8 @@ var SCHEMA_TABLE = {
|
|
|
34998
34999
|
SnapshotDiffResponse: snapshotDiffResponseSchema,
|
|
34999
35000
|
SnapshotListResponse: snapshotListResponseSchema,
|
|
35000
35001
|
SnapshotReportDto: snapshotReportSchema,
|
|
35002
|
+
// The API accepts legacy phrases, but the public contract advertises queries.
|
|
35003
|
+
SnapshotRequest: z.object(snapshotRequestInputSchema.shape).omit({ phrases: true }),
|
|
35001
35004
|
SourceBreakdownDto: sourceBreakdownDtoSchema,
|
|
35002
35005
|
TelemetryEventAcceptedDto: telemetryEventAcceptedDtoSchema,
|
|
35003
35006
|
CloudflareWorkerIngestRequest: cloudflareWorkerIngestRequestSchema,
|
|
@@ -37650,21 +37653,13 @@ var routeCatalog = [
|
|
|
37650
37653
|
method: "post",
|
|
37651
37654
|
path: "/api/v1/snapshot",
|
|
37652
37655
|
summary: "Generate a one-shot AI perception snapshot",
|
|
37656
|
+
description: "Runs configured providers without creating a project. Optional providers and providerMode constrain both answer queries and analysis; omitted selection uses all configured providers. Browser-only selection requires manual queries. Spends provider quota.",
|
|
37653
37657
|
tags: ["snapshot"],
|
|
37654
37658
|
requestBody: {
|
|
37655
37659
|
required: true,
|
|
37656
37660
|
content: {
|
|
37657
37661
|
"application/json": {
|
|
37658
|
-
schema: {
|
|
37659
|
-
type: "object",
|
|
37660
|
-
required: ["companyName", "domain"],
|
|
37661
|
-
properties: {
|
|
37662
|
-
companyName: stringSchema,
|
|
37663
|
-
domain: stringSchema,
|
|
37664
|
-
queries: stringArraySchema,
|
|
37665
|
-
competitors: stringArraySchema
|
|
37666
|
-
}
|
|
37667
|
-
}
|
|
37662
|
+
schema: { $ref: "#/components/schemas/SnapshotRequest" }
|
|
37668
37663
|
}
|
|
37669
37664
|
}
|
|
37670
37665
|
},
|
|
@@ -42509,6 +42504,7 @@ async function snapshotRoutes(app, opts) {
|
|
|
42509
42504
|
try {
|
|
42510
42505
|
return await opts.onSnapshotRequested(input);
|
|
42511
42506
|
} catch (err) {
|
|
42507
|
+
if (err instanceof AppError) throw err;
|
|
42512
42508
|
request.log.error({ err }, "Snapshot report generation failed");
|
|
42513
42509
|
throw internalError(err instanceof Error ? err.message : "Failed to generate snapshot report");
|
|
42514
42510
|
}
|
|
@@ -10719,14 +10719,18 @@ var settingsDtoSchema = z32.object({
|
|
|
10719
10719
|
|
|
10720
10720
|
// ../contracts/src/snapshot.ts
|
|
10721
10721
|
import { z as z33 } from "zod";
|
|
10722
|
+
var snapshotProviderModeSchema = z33.enum(["all", "api", "browser"]);
|
|
10723
|
+
var SnapshotProviderModes = snapshotProviderModeSchema.enum;
|
|
10722
10724
|
var snapshotAccuracySchema = z33.enum(["yes", "no", "unknown", "not-mentioned"]);
|
|
10723
10725
|
var snapshotQueryListSchema = z33.array(z33.string().min(1));
|
|
10724
|
-
var
|
|
10726
|
+
var snapshotRequestInputSchema = z33.object({
|
|
10725
10727
|
companyName: z33.string().min(1),
|
|
10726
10728
|
domain: z33.string().min(1),
|
|
10727
10729
|
queries: snapshotQueryListSchema.optional(),
|
|
10728
10730
|
phrases: snapshotQueryListSchema.optional(),
|
|
10729
|
-
competitors: z33.array(z33.string().min(1)).optional()
|
|
10731
|
+
competitors: z33.array(z33.string().min(1)).optional(),
|
|
10732
|
+
providers: z33.array(z33.string().trim().min(1)).min(1).optional().describe("Configured provider names to use for both answers and analysis. Omit to use all providers matching providerMode."),
|
|
10733
|
+
providerMode: snapshotProviderModeSchema.optional().describe("Filter providers by transport; defaults to all. Browser-only selection requires manual queries and uses no API provider for analysis.")
|
|
10730
10734
|
}).superRefine((input, ctx) => {
|
|
10731
10735
|
if (input.queries !== void 0 && input.phrases !== void 0) {
|
|
10732
10736
|
ctx.addIssue({
|
|
@@ -10736,6 +10740,9 @@ var snapshotRequestSchema = z33.object({
|
|
|
10736
10740
|
});
|
|
10737
10741
|
}
|
|
10738
10742
|
});
|
|
10743
|
+
var snapshotRequestSchema = snapshotRequestInputSchema.safeExtend({
|
|
10744
|
+
competitors: snapshotRequestInputSchema.shape.competitors.default([])
|
|
10745
|
+
});
|
|
10739
10746
|
function resolveSnapshotRequestQueries(input) {
|
|
10740
10747
|
return input.queries ?? input.phrases ?? [];
|
|
10741
10748
|
}
|
|
@@ -18152,6 +18159,9 @@ export {
|
|
|
18152
18159
|
runDetailDtoSchema,
|
|
18153
18160
|
latestProjectRunDtoSchema,
|
|
18154
18161
|
auditLogEntrySchema,
|
|
18162
|
+
snapshotProviderModeSchema,
|
|
18163
|
+
SnapshotProviderModes,
|
|
18164
|
+
snapshotRequestInputSchema,
|
|
18155
18165
|
snapshotRequestSchema,
|
|
18156
18166
|
resolveSnapshotRequestQueries,
|
|
18157
18167
|
snapshotReportSchema,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
loadConfig,
|
|
15
15
|
loadConfigRaw,
|
|
16
16
|
saveConfigPatch
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-7XXXNNE2.js";
|
|
18
18
|
import {
|
|
19
19
|
CC_CACHE_DIR,
|
|
20
20
|
DUCKDB_SPEC,
|
|
@@ -162,7 +162,7 @@ import {
|
|
|
162
162
|
siteCrawlSnapshots,
|
|
163
163
|
toAlertView,
|
|
164
164
|
usageCounters
|
|
165
|
-
} from "./chunk-
|
|
165
|
+
} from "./chunk-QVYGI6CL.js";
|
|
166
166
|
import {
|
|
167
167
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
168
168
|
AGENT_PROVIDER_IDS,
|
|
@@ -204,6 +204,7 @@ import {
|
|
|
204
204
|
SITE_CRAWL_GRAPH_MAX_NODES,
|
|
205
205
|
SchedulableRunKinds,
|
|
206
206
|
SiteHealthLinkClassificationSources,
|
|
207
|
+
SnapshotProviderModes,
|
|
207
208
|
TEMPLATE_LINK_RATIO_THRESHOLD,
|
|
208
209
|
TrafficEventConfidences,
|
|
209
210
|
TrafficEventKinds,
|
|
@@ -305,7 +306,7 @@ import {
|
|
|
305
306
|
validationError,
|
|
306
307
|
winnabilityClassLabel,
|
|
307
308
|
withRetry
|
|
308
|
-
} from "./chunk-
|
|
309
|
+
} from "./chunk-X5AE3GNC.js";
|
|
309
310
|
|
|
310
311
|
// src/telemetry.ts
|
|
311
312
|
import crypto from "crypto";
|
|
@@ -6246,7 +6247,7 @@ function nonBlank(value) {
|
|
|
6246
6247
|
return trimmed ? trimmed : void 0;
|
|
6247
6248
|
}
|
|
6248
6249
|
function resolveBuildCommit(env = process.env) {
|
|
6249
|
-
const embedded = true ? "
|
|
6250
|
+
const embedded = true ? "8d4ee4870a290e10a57c6f8455e98cf94ea48ae2" : void 0;
|
|
6250
6251
|
return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
|
|
6251
6252
|
}
|
|
6252
6253
|
function resolveInstanceIdentity(env = process.env) {
|
|
@@ -12057,7 +12058,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
12057
12058
|
return result;
|
|
12058
12059
|
}
|
|
12059
12060
|
async function backfillInsightsCommand(project, opts) {
|
|
12060
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
12061
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-M4V3YPFZ.js");
|
|
12061
12062
|
const config = loadConfig();
|
|
12062
12063
|
const db = createClient(config.database);
|
|
12063
12064
|
migrate(db);
|
|
@@ -16402,11 +16403,26 @@ var SnapshotService = class {
|
|
|
16402
16403
|
const domain = hostOf(input.domain) ?? input.domain.trim();
|
|
16403
16404
|
const manualQueries = normalizeStringList(resolveSnapshotRequestQueries(input));
|
|
16404
16405
|
const manualCompetitors = normalizeStringList(input.competitors ?? []);
|
|
16405
|
-
const
|
|
16406
|
+
const requestedNames = input.providers === void 0 ? void 0 : [...new Set(input.providers)];
|
|
16407
|
+
const mode = input.providerMode ?? SnapshotProviderModes.all;
|
|
16408
|
+
const providers = requestedNames === void 0 ? this.registry.getAll().filter((provider) => mode === SnapshotProviderModes.all || provider.adapter.mode === mode) : requestedNames.map((name) => {
|
|
16409
|
+
const provider = this.registry.get(name);
|
|
16410
|
+
if (!provider) throw validationError(`Snapshot provider "${name}" is not configured`);
|
|
16411
|
+
if (mode !== SnapshotProviderModes.all && provider.adapter.mode !== mode) {
|
|
16412
|
+
throw validationError(`Snapshot provider "${name}" does not match providerMode "${mode}"`);
|
|
16413
|
+
}
|
|
16414
|
+
return provider;
|
|
16415
|
+
});
|
|
16406
16416
|
if (providers.length === 0) {
|
|
16417
|
+
if (input.providers !== void 0 || input.providerMode !== void 0) {
|
|
16418
|
+
throw validationError(`No configured snapshot providers match the selection (providerMode: ${mode})`);
|
|
16419
|
+
}
|
|
16407
16420
|
throw new Error("No providers configured. Add at least one provider API key before running canonry snapshot.");
|
|
16408
16421
|
}
|
|
16409
|
-
const analysisProvider = pickAnalysisProvider(
|
|
16422
|
+
const analysisProvider = pickAnalysisProvider(providers.filter((provider) => provider.adapter.mode === SnapshotProviderModes.api));
|
|
16423
|
+
if (!analysisProvider && manualQueries.length === 0) {
|
|
16424
|
+
throw validationError("Automatic category-query generation requires a selected API provider. Include an API provider or pass manual queries via --queries.");
|
|
16425
|
+
}
|
|
16410
16426
|
const homepageUrl = `https://${domain}`;
|
|
16411
16427
|
const [siteText, audit] = await Promise.all([
|
|
16412
16428
|
fetchSiteText(domain),
|
package/dist/cli.js
CHANGED
|
@@ -28,11 +28,11 @@ import {
|
|
|
28
28
|
trackCliCommandFinished,
|
|
29
29
|
trackEvent,
|
|
30
30
|
waitForServerRuntimeStartup
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-ZA2QVBQO.js";
|
|
32
32
|
import {
|
|
33
33
|
autoSyncSkills,
|
|
34
34
|
formatAutoSyncNotice
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-AO5QJJE6.js";
|
|
36
36
|
import {
|
|
37
37
|
CliError,
|
|
38
38
|
EXIT_SYSTEM_ERROR,
|
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
saveConfigPatch,
|
|
59
59
|
systemError,
|
|
60
60
|
usageError
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-7XXXNNE2.js";
|
|
62
62
|
import {
|
|
63
63
|
CLOUDFLARE_WORKER_BINDINGS,
|
|
64
64
|
CLOUDFLARE_WORKER_GENERATED_MARKER,
|
|
@@ -72,7 +72,7 @@ import {
|
|
|
72
72
|
projects,
|
|
73
73
|
queries,
|
|
74
74
|
renderReportHtml
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-QVYGI6CL.js";
|
|
76
76
|
import {
|
|
77
77
|
AdsDeliverySnapshotStatuses,
|
|
78
78
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -146,9 +146,10 @@ import {
|
|
|
146
146
|
resultsClearRequestSchema,
|
|
147
147
|
shareOfVoiceLabel,
|
|
148
148
|
shareOfVoiceReason,
|
|
149
|
+
snapshotProviderModeSchema,
|
|
149
150
|
visibilityReportRequestSchema,
|
|
150
151
|
winnabilityClassSchema
|
|
151
|
-
} from "./chunk-
|
|
152
|
+
} from "./chunk-X5AE3GNC.js";
|
|
152
153
|
|
|
153
154
|
// src/cli.ts
|
|
154
155
|
import { pathToFileURL } from "url";
|
|
@@ -13588,6 +13589,8 @@ async function createSnapshotReport(companyName, opts) {
|
|
|
13588
13589
|
const report = await client.createSnapshot({
|
|
13589
13590
|
companyName,
|
|
13590
13591
|
domain: opts.domain,
|
|
13592
|
+
...opts.providers !== void 0 ? { providers: opts.providers } : {},
|
|
13593
|
+
...opts.providerMode !== void 0 ? { providerMode: opts.providerMode } : {},
|
|
13591
13594
|
...opts.queries && opts.queries.length > 0 ? { queries: opts.queries } : {},
|
|
13592
13595
|
...opts.competitors && opts.competitors.length > 0 ? { competitors: opts.competitors } : {}
|
|
13593
13596
|
});
|
|
@@ -13754,6 +13757,7 @@ function formatProviderLine(result) {
|
|
|
13754
13757
|
}
|
|
13755
13758
|
|
|
13756
13759
|
// src/cli-commands/snapshot.ts
|
|
13760
|
+
var SNAPSHOT_USAGE = 'canonry snapshot <company-name> --domain <domain> [--provider <name>...] [--provider-mode all|api|browser] [--queries "a,b"] [--phrases "a,b" (legacy alias)] [--competitors "x,y"] [--md] [--output <path>] [--pdf] [--format table|json]';
|
|
13757
13761
|
function parseCsvOption(value) {
|
|
13758
13762
|
if (!value) return void 0;
|
|
13759
13763
|
const parts = value.split(",").map((part) => part.trim()).filter(Boolean);
|
|
@@ -13762,9 +13766,11 @@ function parseCsvOption(value) {
|
|
|
13762
13766
|
var SNAPSHOT_CLI_COMMANDS = [
|
|
13763
13767
|
{
|
|
13764
13768
|
path: ["snapshot"],
|
|
13765
|
-
usage:
|
|
13769
|
+
usage: SNAPSHOT_USAGE,
|
|
13766
13770
|
options: {
|
|
13767
13771
|
domain: stringOption(),
|
|
13772
|
+
provider: multiStringOption(),
|
|
13773
|
+
"provider-mode": stringOption(),
|
|
13768
13774
|
queries: stringOption(),
|
|
13769
13775
|
phrases: stringOption(),
|
|
13770
13776
|
competitors: stringOption(),
|
|
@@ -13773,7 +13779,7 @@ var SNAPSHOT_CLI_COMMANDS = [
|
|
|
13773
13779
|
output: stringOption()
|
|
13774
13780
|
},
|
|
13775
13781
|
run: async (input) => {
|
|
13776
|
-
const usage =
|
|
13782
|
+
const usage = SNAPSHOT_USAGE;
|
|
13777
13783
|
const companyName = requirePositional(input, 0, {
|
|
13778
13784
|
command: "snapshot",
|
|
13779
13785
|
usage,
|
|
@@ -13784,12 +13790,23 @@ var SNAPSHOT_CLI_COMMANDS = [
|
|
|
13784
13790
|
usage,
|
|
13785
13791
|
message: "--domain is required"
|
|
13786
13792
|
});
|
|
13793
|
+
const rawMode = getString(input.values, "provider-mode");
|
|
13794
|
+
const mode = snapshotProviderModeSchema.optional().safeParse(rawMode);
|
|
13795
|
+
if (!mode.success) {
|
|
13796
|
+
throw usageError("Error: --provider-mode must be all, api, or browser", {
|
|
13797
|
+
details: { command: "snapshot", usage }
|
|
13798
|
+
});
|
|
13799
|
+
}
|
|
13800
|
+
const providers = getStringArray(input.values, "provider")?.map((name) => name.trim());
|
|
13801
|
+
if (providers?.some((name) => !name)) throw usageError("Error: --provider must not be blank");
|
|
13787
13802
|
const outputPath = getString(input.values, "output");
|
|
13788
13803
|
const explicitMd = getBoolean(input.values, "md");
|
|
13789
13804
|
const wantsPdf = getBoolean(input.values, "pdf");
|
|
13790
13805
|
const wantsMd = explicitMd || !!outputPath && !wantsPdf;
|
|
13791
13806
|
await createSnapshotReport(companyName, {
|
|
13792
13807
|
domain,
|
|
13808
|
+
providers: providers === void 0 ? void 0 : [...new Set(providers)],
|
|
13809
|
+
providerMode: mode.data,
|
|
13793
13810
|
queries: parseCsvOption(getString(input.values, "queries") ?? getString(input.values, "phrases")),
|
|
13794
13811
|
competitors: parseCsvOption(getString(input.values, "competitors")),
|
|
13795
13812
|
md: wantsMd,
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
createGoogleMarketingCredentialStore,
|
|
4
4
|
createGoogleMarketingRuntime,
|
|
5
5
|
createServer
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ZA2QVBQO.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-7XXXNNE2.js";
|
|
10
|
+
import "./chunk-QVYGI6CL.js";
|
|
11
|
+
import "./chunk-X5AE3GNC.js";
|
|
12
12
|
export {
|
|
13
13
|
GoogleMarketingRuntimeError,
|
|
14
14
|
createGoogleMarketingCredentialStore,
|
package/dist/mcp.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoSyncSkills
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-AO5QJJE6.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient,
|
|
6
6
|
createCanonryMcpServer
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7XXXNNE2.js";
|
|
8
8
|
import {
|
|
9
9
|
isReadOnlyKey
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-X5AE3GNC.js";
|
|
11
11
|
|
|
12
12
|
// src/mcp/cli.ts
|
|
13
13
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ainyc/canonry",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.194.0",
|
|
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",
|
|
@@ -71,29 +71,29 @@
|
|
|
71
71
|
"tsup": "^8.5.1",
|
|
72
72
|
"tsx": "^4.19.0",
|
|
73
73
|
"@ainyc/canonry-web": "0.0.0",
|
|
74
|
-
"@ainyc/canonry-api-client": "0.0.0",
|
|
75
|
-
"@ainyc/canonry-config": "0.0.0",
|
|
76
74
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
77
75
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
76
|
+
"@ainyc/canonry-config": "0.0.0",
|
|
77
|
+
"@ainyc/canonry-api-client": "0.0.0",
|
|
78
78
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
79
79
|
"@ainyc/canonry-db": "0.0.0",
|
|
80
80
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
81
|
-
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
82
81
|
"@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
|
|
83
|
-
"@ainyc/canonry-integration-
|
|
84
|
-
"@ainyc/canonry-integration-google": "0.0.0",
|
|
82
|
+
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
85
83
|
"@ainyc/canonry-integration-google-ads": "0.0.0",
|
|
84
|
+
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
86
85
|
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
86
|
+
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
87
|
+
"@ainyc/canonry-integration-google": "0.0.0",
|
|
87
88
|
"@ainyc/canonry-integration-google-tag-manager": "0.0.0",
|
|
88
89
|
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
89
|
-
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
90
90
|
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
91
91
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
92
92
|
"@ainyc/canonry-intelligence": "0.0.0",
|
|
93
93
|
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
94
|
-
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
95
|
-
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
96
94
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
95
|
+
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
96
|
+
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
97
97
|
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
98
98
|
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
99
99
|
},
|