@ainyc/canonry 4.71.0 → 4.72.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 (25) hide show
  1. package/assets/agent-workspace/skills/aero/references/regression-playbook.md +1 -1
  2. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +7 -0
  3. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +20 -2
  4. package/assets/assets/{BacklinksPage-CQNPYiDA.js → BacklinksPage-CjfpwZEH.js} +1 -1
  5. package/assets/assets/{ChartPrimitives-BShpLrpS.js → ChartPrimitives-Ckf2FrUy.js} +1 -1
  6. package/assets/assets/{ProjectPage-CJLw1m4O.js → ProjectPage-DZeplYeC.js} +6 -6
  7. package/assets/assets/{RunRow-Dq1vs1hA.js → RunRow-BuFyG0V_.js} +1 -1
  8. package/assets/assets/{RunsPage-CBMa2xWh.js → RunsPage-D-pr000K.js} +1 -1
  9. package/assets/assets/{SettingsPage-B_XeJDdg.js → SettingsPage-CiaapCYn.js} +1 -1
  10. package/assets/assets/{TrafficPage-vJv_Mf6f.js → TrafficPage-B40xytJD.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-C3yFwVmQ.js → TrafficSourceDetailPage-7hHem-gM.js} +1 -1
  12. package/assets/assets/{extract-error-message-CIpeBFLl.js → extract-error-message-3GkDsu1h.js} +1 -1
  13. package/assets/assets/{index-BXLM3-cs.js → index-BVdH2O9w.js} +77 -77
  14. package/assets/assets/{server-traffic-Yt3jIi3g.js → server-traffic-CsgPsudZ.js} +1 -1
  15. package/assets/assets/{trash-2-xGvNHhEj.js → trash-2-B8Ipf9rI.js} +1 -1
  16. package/assets/index.html +1 -1
  17. package/dist/{chunk-ZNWMVYYU.js → chunk-NYZSY5QJ.js} +126 -7
  18. package/dist/{chunk-5FM7QRYD.js → chunk-SJI6JGPN.js} +1249 -1005
  19. package/dist/{chunk-XYBBC5CH.js → chunk-XYX447L2.js} +670 -99
  20. package/dist/{chunk-B32J3DSZ.js → chunk-ZISXWFQA.js} +92 -4
  21. package/dist/cli.js +306 -84
  22. package/dist/index.js +4 -4
  23. package/dist/{intelligence-service-GV57RTPO.js → intelligence-service-YOZOOYUI.js} +2 -2
  24. package/dist/mcp.js +2 -2
  25. package/package.json +9 -9
@@ -1 +1 @@
1
- import{c as d,j as a,bY as S,bS as l,bZ as v,ay as y,l as t,b_ as m,bT as i,b$ as T,c0 as h,c1 as p,c2 as C}from"./index-BXLM3-cs.js";import{u as c,r as g,n as s,o as u}from"./vendor-tanstack-Dq7p98wZ.js";const w=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],M=d("refresh-cw",w);function P(e){switch(e){case i.connected:return"positive";case i.paused:return"caution";case i.error:return"negative";case i.archived:return"neutral"}}function b(e){const r={};return e.kind&&e.kind!=="all"&&(r.kind=e.kind),e.sourceId&&(r.sourceId=e.sourceId),e.sinceMinutes!==void 0&&(r.since=new Date(Date.now()-e.sinceMinutes*6e4).toISOString()),e.limit!==void 0&&(r.limit=String(e.limit)),r}function o(e){e.invalidateQueries({predicate:r=>{const n=r.queryKey[0];return typeof n?._id=="string"&&n._id.startsWith("getApiV1ProjectsByNameTraffic")}})}function k(e){return c({...S({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function F(e){return c({...C({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function V(e,r){return c({...l({client:t,path:{name:e??"",id:r??""}}),enabled:!!(e&&r),staleTime:a})}function A(e,r){const n=g.useMemo(()=>b(r),[r.kind,r.sourceId,r.sinceMinutes,r.limit]);return c({...v({client:t,path:{name:e??""},query:n}),enabled:!!e,staleTime:a})}function E(e){const r=s();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Cloud Run source");return p(e,n)},onSuccess:()=>{e&&o(r)}})}function I(e){const r=s();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a WordPress source");return T(e,n)},onSuccess:()=>{e&&o(r)}})}function Q(e){const r=s();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Vercel source");return h(e,n)},onSuccess:()=>{e&&o(r)}})}function R(e,r){const n=s();return u({mutationFn:f=>{if(!e||!r)throw new Error("Project and sourceId are required to sync");return m(e,r,f??void 0)},onSuccess:()=>{e&&(o(n),n.invalidateQueries({queryKey:y({client:t})}))}})}export{M as R,I as a,Q as b,E as c,k as d,V as e,A as f,R as g,P as t,F as u};
1
+ import{c as d,j as a,bY as S,bS as l,bZ as v,ay as y,l as t,b_ as m,bT as i,b$ as T,c0 as h,c1 as p,c2 as C}from"./index-BVdH2O9w.js";import{u as c,r as g,n as s,o as u}from"./vendor-tanstack-Dq7p98wZ.js";const w=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],M=d("refresh-cw",w);function P(e){switch(e){case i.connected:return"positive";case i.paused:return"caution";case i.error:return"negative";case i.archived:return"neutral"}}function b(e){const r={};return e.kind&&e.kind!=="all"&&(r.kind=e.kind),e.sourceId&&(r.sourceId=e.sourceId),e.sinceMinutes!==void 0&&(r.since=new Date(Date.now()-e.sinceMinutes*6e4).toISOString()),e.limit!==void 0&&(r.limit=String(e.limit)),r}function o(e){e.invalidateQueries({predicate:r=>{const n=r.queryKey[0];return typeof n?._id=="string"&&n._id.startsWith("getApiV1ProjectsByNameTraffic")}})}function k(e){return c({...S({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function F(e){return c({...C({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function V(e,r){return c({...l({client:t,path:{name:e??"",id:r??""}}),enabled:!!(e&&r),staleTime:a})}function A(e,r){const n=g.useMemo(()=>b(r),[r.kind,r.sourceId,r.sinceMinutes,r.limit]);return c({...v({client:t,path:{name:e??""},query:n}),enabled:!!e,staleTime:a})}function E(e){const r=s();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Cloud Run source");return p(e,n)},onSuccess:()=>{e&&o(r)}})}function I(e){const r=s();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a WordPress source");return T(e,n)},onSuccess:()=>{e&&o(r)}})}function Q(e){const r=s();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Vercel source");return h(e,n)},onSuccess:()=>{e&&o(r)}})}function R(e,r){const n=s();return u({mutationFn:f=>{if(!e||!r)throw new Error("Project and sourceId are required to sync");return m(e,r,f??void 0)},onSuccess:()=>{e&&(o(n),n.invalidateQueries({queryKey:y({client:t})}))}})}export{M as R,I as a,Q as b,E as c,k as d,V as e,A as f,R as g,P as t,F as u};
@@ -1 +1 @@
1
- import{c}from"./index-BXLM3-cs.js";const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],h=c("circle-check",a);const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],n=c("circle-question-mark",e);const o=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],s=c("download",o);const t=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],r=c("trash-2",t);export{h as C,s as D,r as T,n as a};
1
+ import{c}from"./index-BVdH2O9w.js";const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],h=c("circle-check",a);const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],n=c("circle-question-mark",e);const o=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],s=c("download",o);const t=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],r=c("trash-2",t);export{h as C,s as D,r as T,n as a};
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-BXLM3-cs.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-BVdH2O9w.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Dq7p98wZ.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-B57xfQbP.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-ClRVR6aX.js">
@@ -22,7 +22,7 @@ import {
22
22
  trafficConnectVercelRequestSchema,
23
23
  trafficConnectWordpressRequestSchema,
24
24
  trafficEventKindSchema
25
- } from "./chunk-5FM7QRYD.js";
25
+ } from "./chunk-SJI6JGPN.js";
26
26
 
27
27
  // src/config.ts
28
28
  import fs from "fs";
@@ -2869,6 +2869,46 @@ var getApiV1ProjectsByNameContentTargets = (options) => {
2869
2869
  ...options
2870
2870
  });
2871
2871
  };
2872
+ var getApiV1ProjectsByNameContentRecommendationsByTargetRefBrief = (options) => {
2873
+ return (options.client ?? client).get({
2874
+ security: [
2875
+ {
2876
+ scheme: "bearer",
2877
+ type: "http"
2878
+ }
2879
+ ],
2880
+ url: "/api/v1/projects/{name}/content/recommendations/{targetRef}/brief",
2881
+ ...options
2882
+ });
2883
+ };
2884
+ var postApiV1ProjectsByNameContentRecommendationsByTargetRefBrief = (options) => {
2885
+ return (options.client ?? client).post({
2886
+ security: [
2887
+ {
2888
+ scheme: "bearer",
2889
+ type: "http"
2890
+ }
2891
+ ],
2892
+ url: "/api/v1/projects/{name}/content/recommendations/{targetRef}/brief",
2893
+ ...options,
2894
+ headers: {
2895
+ "Content-Type": "application/json",
2896
+ ...options.headers
2897
+ }
2898
+ });
2899
+ };
2900
+ var getApiV1ProjectsByNameContentDomainClassifications = (options) => {
2901
+ return (options.client ?? client).get({
2902
+ security: [
2903
+ {
2904
+ scheme: "bearer",
2905
+ type: "http"
2906
+ }
2907
+ ],
2908
+ url: "/api/v1/projects/{name}/content/domain-classifications",
2909
+ ...options
2910
+ });
2911
+ };
2872
2912
  var getApiV1ProjectsByNameContentSources = (options) => {
2873
2913
  return (options.client ?? client).get({
2874
2914
  security: [
@@ -3820,12 +3860,12 @@ var ApiClient = class {
3820
3860
  })
3821
3861
  );
3822
3862
  }
3823
- async getAnalyticsSources(project, window) {
3863
+ async getAnalyticsSources(project, opts = {}) {
3824
3864
  return this.invoke(
3825
3865
  () => getApiV1ProjectsByNameAnalyticsSources({
3826
3866
  client: this.heyClient,
3827
3867
  path: { name: project },
3828
- query: { window }
3868
+ query: { window: opts.window, limit: opts.limit }
3829
3869
  })
3830
3870
  );
3831
3871
  }
@@ -4695,7 +4735,9 @@ var ApiClient = class {
4695
4735
  path: { name: project },
4696
4736
  query: {
4697
4737
  limit: opts?.limit,
4698
- "include-in-progress": opts?.includeInProgress ? "true" : void 0
4738
+ "include-in-progress": opts?.includeInProgress ? "true" : void 0,
4739
+ "winnability-class": opts?.winnabilityClass,
4740
+ ownable: opts?.ownable ? "true" : void 0
4699
4741
  }
4700
4742
  })
4701
4743
  );
@@ -4710,6 +4752,28 @@ var ApiClient = class {
4710
4752
  () => getApiV1ProjectsByNameContentGaps({ client: this.heyClient, path: { name: project } })
4711
4753
  );
4712
4754
  }
4755
+ async getDomainClassifications(project) {
4756
+ return this.invoke(
4757
+ () => getApiV1ProjectsByNameContentDomainClassifications({ client: this.heyClient, path: { name: project } })
4758
+ );
4759
+ }
4760
+ async getContentBrief(project, targetRef) {
4761
+ return this.invoke(
4762
+ () => getApiV1ProjectsByNameContentRecommendationsByTargetRefBrief({
4763
+ client: this.heyClient,
4764
+ path: { name: project, targetRef }
4765
+ })
4766
+ );
4767
+ }
4768
+ async synthesizeContentBrief(project, targetRef, opts) {
4769
+ return this.invoke(
4770
+ () => postApiV1ProjectsByNameContentRecommendationsByTargetRefBrief({
4771
+ client: this.heyClient,
4772
+ path: { name: project, targetRef },
4773
+ body: { provider: opts?.provider, model: opts?.model, forceRefresh: opts?.forceRefresh }
4774
+ })
4775
+ );
4776
+ }
4713
4777
  async getHealth(project) {
4714
4778
  return this.invoke(
4715
4779
  () => getApiV1ProjectsByNameHealthLatest({ client: this.heyClient, path: { name: project } })
@@ -5031,7 +5095,19 @@ var doctorInputSchema = z2.object({
5031
5095
  var contentTargetsInputSchema = z2.object({
5032
5096
  project: projectNameSchema,
5033
5097
  limit: z2.number().int().positive().max(500).optional().describe("Max rows. Defaults to all. Use a small number (3-10) when summarizing for the user."),
5034
- includeInProgress: z2.boolean().optional().describe("Include rows that already have an in-flight tracked action. Default false.")
5098
+ includeInProgress: z2.boolean().optional().describe("Include rows that already have an in-flight tracked action. Default false."),
5099
+ winnabilityClass: z2.enum(["ownable", "ceded"]).optional().describe('Filter by winnability: "ownable" (worth a brief) or "ceded" (aggregator/editorial head term to skip).'),
5100
+ ownable: z2.boolean().optional().describe('Convenience: when true, return only ownable targets (same as winnabilityClass="ownable").')
5101
+ });
5102
+ var contentBriefInputSchema = z2.object({
5103
+ project: projectNameSchema,
5104
+ targetRef: z2.string().min(1).describe("Stable target ref from canonry_content_targets. The target must be ownable; ceded targets are rejected."),
5105
+ provider: z2.string().optional().describe("Optional provider override (claude|openai|gemini|zai)."),
5106
+ model: z2.string().optional().describe("Optional model override within the chosen provider."),
5107
+ forceRefresh: z2.boolean().optional().describe("Force a fresh synthesis even if a cached brief exists.")
5108
+ });
5109
+ var contentMapInputSchema = z2.object({
5110
+ project: projectNameSchema
5035
5111
  });
5036
5112
  var backlinksDomainsInputSchema = z2.object({
5037
5113
  project: projectNameSchema,
@@ -5197,6 +5273,21 @@ var canonryMcpTools = [
5197
5273
  openApiOperations: ["GET /api/v1/projects/{name}/analytics/metrics"],
5198
5274
  handler: (client2, input) => client2.getAnalyticsMetrics(input.project, input.window)
5199
5275
  }),
5276
+ defineTool({
5277
+ name: "canonry_analytics_sources",
5278
+ title: "Get cited-source rankings",
5279
+ description: "Where AI engines get the facts they cite for a project. Returns the FULL ranked list of cited domains (not truncated) \u2014 each tagged with a category and an actionable surface class (own / direct-competitor / ota-aggregator / editorial-media / other) \u2014 plus a surface-class roll-up and a per-provider breakdown (each provider's cited-domain mix + total cited slots). The surface class is deterministic (own/competitor from project data, the rest from the source allow-list) and enriched by discovery's stored per-domain classifications when present \u2014 no new LLM calls. Probe-excluded, window-filterable (7d/30d/90d/all). Use `limit` to cap each ranked list to the top N domains (an explicit long-tail rollup preserves the totals). All counts/shares/classification are computed server-side.",
5280
+ access: "read",
5281
+ tier: "monitoring",
5282
+ inputSchema: z2.object({
5283
+ project: projectNameSchema,
5284
+ window: analyticsWindowSchema.optional().describe("Time range: 7d, 30d, 90d, or all (default all)."),
5285
+ limit: z2.number().int().positive().optional().describe("Cap each ranked list to the top N domains. Omit for the full list.")
5286
+ }),
5287
+ annotations: readAnnotations(),
5288
+ openApiOperations: ["GET /api/v1/projects/{name}/analytics/sources"],
5289
+ handler: (client2, input) => client2.getAnalyticsSources(input.project, { window: input.window, limit: input.limit })
5290
+ }),
5200
5291
  defineTool({
5201
5292
  name: "canonry_search",
5202
5293
  title: "Search project (composite)",
@@ -5373,7 +5464,7 @@ var canonryMcpTools = [
5373
5464
  defineTool({
5374
5465
  name: "canonry_content_targets",
5375
5466
  title: "Get content targets",
5376
- description: "Ranked, action-typed content opportunities. Each row is `{query, action \u2208 create|expand|refresh|add-schema, ourBestPage?, winningCompetitor?, score, scoreBreakdown, drivers[], demandSource, actionConfidence}`. Use this to recommend which post the user should write or refresh next.",
5467
+ description: 'Ranked, action-typed content opportunities. Each row is `{query, action \u2208 create|expand|refresh|add-schema, ourBestPage?, winningCompetitor?, score, scoreBreakdown, drivers[], demandSource, actionConfidence, winnabilityClass, winnability?}`. `winnabilityClass` is the winnability gate: "ownable" (worth a brief) vs "ceded" (aggregator/editorial head term to skip); ownable rows sort first. Filter with `winnabilityClass`/`ownable`. Use this to recommend which post the user should write or refresh next.',
5377
5468
  access: "read",
5378
5469
  tier: "monitoring",
5379
5470
  inputSchema: contentTargetsInputSchema,
@@ -5381,9 +5472,37 @@ var canonryMcpTools = [
5381
5472
  openApiOperations: ["GET /api/v1/projects/{name}/content/targets"],
5382
5473
  handler: (client2, input) => client2.getContentTargets(input.project, {
5383
5474
  limit: input.limit,
5384
- includeInProgress: input.includeInProgress
5475
+ includeInProgress: input.includeInProgress,
5476
+ winnabilityClass: input.winnabilityClass,
5477
+ ownable: input.ownable
5385
5478
  })
5386
5479
  }),
5480
+ defineTool({
5481
+ name: "canonry_content_brief",
5482
+ title: "Synthesize content brief",
5483
+ description: "Synthesize (or fetch cached) a STRUCTURED content brief for an ownable target: `{targetQuery, winnabilityClass, angle, whyWinnable, schemaHookup, controllableSurfaceRationale}`. Gated to ownable targets \u2014 a ceded head term is rejected. Costs one analyze-tier LLM call on a cache miss; repeat calls are free. Pass a targetRef from canonry_content_targets.",
5484
+ access: "write",
5485
+ tier: "monitoring",
5486
+ inputSchema: contentBriefInputSchema,
5487
+ annotations: writeAnnotations({ idempotentHint: true }),
5488
+ openApiOperations: ["POST /api/v1/projects/{name}/content/recommendations/{targetRef}/brief"],
5489
+ handler: (client2, input) => client2.synthesizeContentBrief(input.project, input.targetRef, {
5490
+ provider: input.provider,
5491
+ model: input.model,
5492
+ forceRefresh: input.forceRefresh
5493
+ })
5494
+ }),
5495
+ defineTool({
5496
+ name: "canonry_content_map",
5497
+ title: "Get domain classifications (winnability map)",
5498
+ description: 'The per-domain cited-surface classifications behind the winnabilityClass gate: `{domain, competitorType \u2208 direct-competitor|ota-aggregator|editorial-media|other|unknown, hits, updatedAt}`, ranked by recurrence. Aggregator/editorial domains are the "ceded" surfaces. Running discovery improves coverage.',
5499
+ access: "read",
5500
+ tier: "monitoring",
5501
+ inputSchema: contentMapInputSchema,
5502
+ annotations: readAnnotations(),
5503
+ openApiOperations: ["GET /api/v1/projects/{name}/content/domain-classifications"],
5504
+ handler: (client2, input) => client2.getDomainClassifications(input.project)
5505
+ }),
5387
5506
  defineTool({
5388
5507
  name: "canonry_content_sources",
5389
5508
  title: "Get grounding sources",