@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.
- package/assets/agent-workspace/skills/aero/references/regression-playbook.md +1 -1
- package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +7 -0
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +20 -2
- package/assets/assets/{BacklinksPage-CQNPYiDA.js → BacklinksPage-CjfpwZEH.js} +1 -1
- package/assets/assets/{ChartPrimitives-BShpLrpS.js → ChartPrimitives-Ckf2FrUy.js} +1 -1
- package/assets/assets/{ProjectPage-CJLw1m4O.js → ProjectPage-DZeplYeC.js} +6 -6
- package/assets/assets/{RunRow-Dq1vs1hA.js → RunRow-BuFyG0V_.js} +1 -1
- package/assets/assets/{RunsPage-CBMa2xWh.js → RunsPage-D-pr000K.js} +1 -1
- package/assets/assets/{SettingsPage-B_XeJDdg.js → SettingsPage-CiaapCYn.js} +1 -1
- package/assets/assets/{TrafficPage-vJv_Mf6f.js → TrafficPage-B40xytJD.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-C3yFwVmQ.js → TrafficSourceDetailPage-7hHem-gM.js} +1 -1
- package/assets/assets/{extract-error-message-CIpeBFLl.js → extract-error-message-3GkDsu1h.js} +1 -1
- package/assets/assets/{index-BXLM3-cs.js → index-BVdH2O9w.js} +77 -77
- package/assets/assets/{server-traffic-Yt3jIi3g.js → server-traffic-CsgPsudZ.js} +1 -1
- package/assets/assets/{trash-2-xGvNHhEj.js → trash-2-B8Ipf9rI.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-ZNWMVYYU.js → chunk-NYZSY5QJ.js} +126 -7
- package/dist/{chunk-5FM7QRYD.js → chunk-SJI6JGPN.js} +1249 -1005
- package/dist/{chunk-XYBBC5CH.js → chunk-XYX447L2.js} +670 -99
- package/dist/{chunk-B32J3DSZ.js → chunk-ZISXWFQA.js} +92 -4
- package/dist/cli.js +306 -84
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-GV57RTPO.js → intelligence-service-YOZOOYUI.js} +2 -2
- package/dist/mcp.js +2 -2
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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,
|
|
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:
|
|
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",
|