@ainyc/canonry 4.72.2 → 4.72.4
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/canonry/references/aeo-analysis.md +1 -1
- package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +56 -3
- package/dist/{chunk-J7SDOU2J.js → chunk-HOKVBMOD.js} +54 -11
- package/dist/{chunk-SJI6JGPN.js → chunk-JXFNERK4.js} +18 -5
- package/dist/{chunk-BRXQKUGY.js → chunk-SRBO33HB.js} +4 -4
- package/dist/{chunk-NYZSY5QJ.js → chunk-ZUBBADMR.js} +1 -1
- package/dist/cli.js +4 -4
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-JNF3JRFR.js → intelligence-service-CSW4R4I7.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +6 -6
|
@@ -53,7 +53,7 @@ Shows which source categories AI models cite for your queries. Helps identify:
|
|
|
53
53
|
- Content format opportunities (FAQ, how-to, comparison pages)
|
|
54
54
|
|
|
55
55
|
### Winnability gate + briefs (`canonry content targets|map|brief`)
|
|
56
|
-
Every content target carries a deterministic `winnabilityClass`: **ownable** (worth writing for) or **ceded** (the cited surface is dominated by aggregators/OTAs or editorial media
|
|
56
|
+
Every content target carries a deterministic `winnabilityClass`: **ownable** (worth writing for) or **ceded** (the cited surface is dominated by aggregators/OTAs or editorial media, a head term first-party content cannot realistically win). It is derived (no LLM) by classifying each cited domain through the shared surface classifier (own > tracked competitor > stored discovery class > static allow-list), so well-known aggregators/editorial cede immediately, no discovery run required. **`canonry discover run`** improves recall for niche domains the allow-list misses; a target only fails open to `ownable` when none of its cited surface is recognized. `canonry doctor --project <project> --check content.winnability.coverage` reports recognized-coverage of the cited surface and, when the project has no ICP, nudges you to set one (discovery needs it).
|
|
57
57
|
- `canonry content targets <project> --ownable` — the winnable shortlist (ownable rows sort first by default).
|
|
58
58
|
- `canonry content map <project>` — the winnability map: which cited surfaces are ceded vs the ranked ownable targets.
|
|
59
59
|
- `canonry content brief <project> <targetRef>` — synthesize a structured brief (angle, why-winnable, schema hookup) for an **ownable** target. Ceded targets are rejected — don't chase them.
|
|
@@ -66,8 +66,45 @@ sync flow does NOT echo the private key back in any response.
|
|
|
66
66
|
## Connecting a WordPress source
|
|
67
67
|
|
|
68
68
|
The WordPress adapter pulls events from the **Canonry Traffic Logger**
|
|
69
|
-
WordPress plugin, which captures every non-admin GET page-load
|
|
70
|
-
exposes a paginated REST endpoint protected by an
|
|
69
|
+
WordPress plugin, which captures every non-admin GET page-load **that
|
|
70
|
+
reaches PHP** and exposes a paginated REST endpoint protected by an
|
|
71
|
+
Application Password.
|
|
72
|
+
|
|
73
|
+
> **Cache blind spot.** The plugin is a PHP hook, so it only sees
|
|
74
|
+
> requests that execute WordPress. A full-page cache (LiteSpeed, WP
|
|
75
|
+
> Rocket, W3 Total Cache, WP Super Cache) or CDN serves cached pages
|
|
76
|
+
> before PHP runs, so cache-served page views, including live AI
|
|
77
|
+
> user-fetches (Claude-User, ChatGPT-User), are NOT logged. Bot crawls
|
|
78
|
+
> of uncached endpoints (sitemap, feeds, assets, cache misses) still
|
|
79
|
+
> come through, which can make capture look healthy while real page
|
|
80
|
+
> views go uncounted. Exclude AI user-agents from the cache (and any
|
|
81
|
+
> CDN), or capture from access/edge logs instead. The
|
|
82
|
+
> `traffic.source.cache-blindspot` doctor check warns whenever a
|
|
83
|
+
> WordPress source is connected.
|
|
84
|
+
|
|
85
|
+
**Which user-agents to exclude from the cache** (one per line in
|
|
86
|
+
LiteSpeed's "Do Not Cache User Agents", WP Rocket's
|
|
87
|
+
`rocket_cache_reject_ua`, or W3TC / WP Super Cache "Rejected User
|
|
88
|
+
Agents"):
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Claude-User
|
|
92
|
+
ClaudeBot
|
|
93
|
+
ChatGPT-User
|
|
94
|
+
OAI-SearchBot
|
|
95
|
+
GPTBot
|
|
96
|
+
PerplexityBot
|
|
97
|
+
Perplexity-User
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
These are the answer-engine fetchers in both live-user-fetch (`*-User`)
|
|
101
|
+
and crawler forms. Do NOT add `Googlebot` or `Bingbot`: caching helps
|
|
102
|
+
search crawlers (page speed is a ranking signal, and cached pages let
|
|
103
|
+
them crawl more per visit, which matters most on crawl-budget-starved
|
|
104
|
+
sites), and their crawl stats are already authoritative in GSC and Bing
|
|
105
|
+
Webmaster Tools. Rule of thumb: bypass cache only for agents you cannot
|
|
106
|
+
measure elsewhere and that gain nothing from being cached. Answer-engine
|
|
107
|
+
fetchers fit both; search crawlers fit neither.
|
|
71
108
|
|
|
72
109
|
```bash
|
|
73
110
|
# 1. Install the plugin. Download the latest release zip from the
|
|
@@ -223,7 +260,7 @@ MCP `canonry_traffic_status` tool.
|
|
|
223
260
|
| Project dashboard `/projects/:name/activity` | Live source table + 24h totals + GA4 referrals (combined view) |
|
|
224
261
|
| Top-level `/traffic` route | Cross-project source admin (connect, sync, archive) |
|
|
225
262
|
| `cnry report <project>` (HTML + SPA) | "AI Visibility — Server-Side" section, ranked above Indexing Health |
|
|
226
|
-
| `cnry doctor --project <name>` | `traffic.source.connected`, `recent-data`, `credentials`, `scopes` checks |
|
|
263
|
+
| `cnry doctor --project <name>` | `traffic.source.connected`, `recent-data`, `credentials`, `scopes`, `cache-blindspot` checks |
|
|
227
264
|
| MCP toolkit `traffic` | Tools: `canonry_traffic_status`, `_sources_list`, `_source_get`, `_events`, `_connect_cloud_run`, `_sync` |
|
|
228
265
|
|
|
229
266
|
## Doctor signals
|
|
@@ -237,6 +274,7 @@ The doctor checks are adapter-agnostic. When they fail or warn:
|
|
|
237
274
|
| `traffic.source.recent-data` | `traffic.recent-data.stale` | Last sync was >7d ago. Run `cnry traffic sync …` or schedule a recurring sync. |
|
|
238
275
|
| `traffic.source.recent-data` | `traffic.recent-data.empty` | Source connected but no data in 30d. Verify config and credentials with `cnry traffic sources <project>`. |
|
|
239
276
|
| `traffic.source.credentials` | `traffic.credentials.resolve-failed` | Service-account key in `~/.canonry/config.yaml` is invalid or expired. Re-connect. |
|
|
277
|
+
| `traffic.source.cache-blindspot` | `traffic.cache-blindspot.wordpress-plugin` | A WordPress source is connected, so the plugin cannot see cache-served page views. Exclude AI user-agents from the page cache and any CDN, or switch to a log/edge source. Warns only, not a failure. |
|
|
240
278
|
|
|
241
279
|
## Scheduling
|
|
242
280
|
|
|
@@ -276,6 +314,21 @@ domains, or PII are surfaced.
|
|
|
276
314
|
|
|
277
315
|
## Limits & caveats
|
|
278
316
|
|
|
317
|
+
- **The WordPress plugin is blind to cache-served traffic.** The
|
|
318
|
+
`wordpress` adapter logs only requests that reach PHP. A full-page
|
|
319
|
+
cache or CDN serves cached pages from the edge, so cache-served page
|
|
320
|
+
views, including live AI user-fetches (Claude-User, ChatGPT-User),
|
|
321
|
+
never reach the plugin and go uncounted, even though bot crawls of
|
|
322
|
+
uncached endpoints (sitemap, assets) still appear. On a cached
|
|
323
|
+
WordPress site, treat the plugin's page-view counts as a floor, not a
|
|
324
|
+
total. Either exclude AI user-agents from the cache + CDN, or capture
|
|
325
|
+
cache-independent via a `cloud-run` / `vercel` / edge-log source. The
|
|
326
|
+
`traffic.source.cache-blindspot` doctor check surfaces this. Adapter
|
|
327
|
+
coverage differs: `vercel` ingests edge request-logs so cache hits are
|
|
328
|
+
captured (it records the `cache` HIT/MISS label), and `cloud-run` logs
|
|
329
|
+
every request that reaches the service, missing only what a CDN placed
|
|
330
|
+
in front of Cloud Run serves from its own edge cache. Only the
|
|
331
|
+
hook-based `wordpress` adapter has the always-present blind spot.
|
|
279
332
|
- **Path-level citation cross-reference is not implemented yet.** The
|
|
280
333
|
citation store is domain-grain (`query_snapshots.cited_domains`). A
|
|
281
334
|
future iteration that lands URL-grain citation evidence will extend
|
|
@@ -65,6 +65,7 @@ import {
|
|
|
65
65
|
citationStateSchema,
|
|
66
66
|
citationStateToCited,
|
|
67
67
|
citationVisibilityResponseSchema,
|
|
68
|
+
classifyCitedSurface,
|
|
68
69
|
classifySkillFile,
|
|
69
70
|
classifySurfaceFromCategory,
|
|
70
71
|
clusterByCosine,
|
|
@@ -222,7 +223,7 @@ import {
|
|
|
222
223
|
wordpressSchemaDeployResultDtoSchema,
|
|
223
224
|
wordpressSchemaStatusResultDtoSchema,
|
|
224
225
|
wordpressStatusDtoSchema
|
|
225
|
-
} from "./chunk-
|
|
226
|
+
} from "./chunk-JXFNERK4.js";
|
|
226
227
|
|
|
227
228
|
// src/intelligence-service.ts
|
|
228
229
|
import { eq as eq32, desc as desc16, asc as asc3, and as and23, ne as ne5, or as or5, inArray as inArray11, gte as gte6, lte as lte3 } from "drizzle-orm";
|
|
@@ -3636,7 +3637,12 @@ function buildContentTargetRows(input) {
|
|
|
3636
3637
|
gscAvgPosition: cq.gscPosition,
|
|
3637
3638
|
organicSessions: input.gaTrafficByPage.get(ourPage.url) ?? 0
|
|
3638
3639
|
} : null;
|
|
3639
|
-
const
|
|
3640
|
+
const surfaceClasses = classifyCitedSurface(
|
|
3641
|
+
cq.citedSurfaceDomains,
|
|
3642
|
+
{ projectDomains: [input.ownDomain], competitorDomains: input.competitors },
|
|
3643
|
+
input.domainClasses
|
|
3644
|
+
);
|
|
3645
|
+
const { winnabilityClass, winnability } = deriveWinnabilityClass(cq.citedSurfaceDomains, surfaceClasses);
|
|
3640
3646
|
rows.push({
|
|
3641
3647
|
targetRef,
|
|
3642
3648
|
query: cq.query,
|
|
@@ -29667,23 +29673,30 @@ var winnabilityCoverageCheck = {
|
|
|
29667
29673
|
}
|
|
29668
29674
|
};
|
|
29669
29675
|
}
|
|
29670
|
-
const
|
|
29671
|
-
|
|
29676
|
+
const surfaceClasses = classifyCitedSurface(
|
|
29677
|
+
citedDomains.map((domain) => ({ domain })),
|
|
29678
|
+
{ projectDomains: [input.ownDomain], competitorDomains: input.competitors },
|
|
29679
|
+
input.domainClasses
|
|
29680
|
+
);
|
|
29681
|
+
const coveredDomains = citedDomains.filter((domain) => surfaceClasses.has(domain));
|
|
29682
|
+
const unclassifiedDomains = citedDomains.filter((domain) => !surfaceClasses.has(domain));
|
|
29672
29683
|
const coverage = coveredDomains.length / citedDomains.length;
|
|
29673
29684
|
const details = {
|
|
29674
29685
|
citedSurfaceDomainCount: citedDomains.length,
|
|
29675
|
-
classifiedDomainCount: input.domainClasses.size,
|
|
29676
29686
|
coveredDomainCount: coveredDomains.length,
|
|
29687
|
+
classifiedDomainCount: input.domainClasses.size,
|
|
29677
29688
|
coverage,
|
|
29678
29689
|
threshold: WINNABILITY_COVERAGE_WARN_THRESHOLD,
|
|
29679
29690
|
unclassifiedDomains: unclassifiedDomains.slice(0, UNCLASSIFIED_DOMAIN_SAMPLE_LIMIT)
|
|
29680
29691
|
};
|
|
29692
|
+
const hasIcp = Boolean(project.icpDescription && project.icpDescription.trim().length > 0);
|
|
29693
|
+
const discoverRemediation = hasIcp ? `Run \`canonry discover run ${ctx.project.name} --wait\` to classify the unrecognized domains before relying on ownable/ceded content targets.` : `This project has no ICP, which discovery requires. Run \`canonry discover run ${ctx.project.name} --icp "<who the project sells to>" --wait\` (or set \`spec.icpDescription\`) to classify the unrecognized domains.`;
|
|
29681
29694
|
if (coveredDomains.length === 0) {
|
|
29682
29695
|
return {
|
|
29683
29696
|
status: CheckStatuses.warn,
|
|
29684
29697
|
code: "content.winnability.no-classifications",
|
|
29685
|
-
summary: `0 of ${citedDomains.length} cited-surface domain(s)
|
|
29686
|
-
remediation:
|
|
29698
|
+
summary: `0 of ${citedDomains.length} cited-surface domain(s) are recognized (own/competitor/aggregator/editorial); the winnability gate is failing open.`,
|
|
29699
|
+
remediation: discoverRemediation,
|
|
29687
29700
|
details
|
|
29688
29701
|
};
|
|
29689
29702
|
}
|
|
@@ -29691,15 +29704,15 @@ var winnabilityCoverageCheck = {
|
|
|
29691
29704
|
return {
|
|
29692
29705
|
status: CheckStatuses.warn,
|
|
29693
29706
|
code: "content.winnability.low-coverage",
|
|
29694
|
-
summary: `${coveredDomains.length} of ${citedDomains.length} cited-surface domain(s)
|
|
29695
|
-
remediation:
|
|
29707
|
+
summary: `${coveredDomains.length} of ${citedDomains.length} cited-surface domain(s) recognized (${percent(coverage)}%); the winnability gate may miss ceded surfaces in the unrecognized tail.`,
|
|
29708
|
+
remediation: discoverRemediation,
|
|
29696
29709
|
details
|
|
29697
29710
|
};
|
|
29698
29711
|
}
|
|
29699
29712
|
return {
|
|
29700
29713
|
status: CheckStatuses.ok,
|
|
29701
29714
|
code: "content.winnability.covered",
|
|
29702
|
-
summary: `${coveredDomains.length} of ${citedDomains.length} cited-surface domain(s)
|
|
29715
|
+
summary: `${coveredDomains.length} of ${citedDomains.length} cited-surface domain(s) recognized (${percent(coverage)}%); the winnability gate is active.`,
|
|
29703
29716
|
remediation: null,
|
|
29704
29717
|
details
|
|
29705
29718
|
};
|
|
@@ -30936,11 +30949,41 @@ var scopesCheck3 = {
|
|
|
30936
30949
|
return summarizePerSourceResults("scopes", "scopes", results);
|
|
30937
30950
|
}
|
|
30938
30951
|
};
|
|
30952
|
+
var cacheBlindSpotCheck = {
|
|
30953
|
+
id: "traffic.source.cache-blindspot",
|
|
30954
|
+
category: CheckCategories.integrations,
|
|
30955
|
+
scope: CheckScopes.project,
|
|
30956
|
+
title: "WordPress traffic cache blind spot",
|
|
30957
|
+
run: (ctx) => {
|
|
30958
|
+
if (!ctx.project) return skippedNoProject4();
|
|
30959
|
+
const wpSources = loadProbes(ctx).filter(
|
|
30960
|
+
(s) => s.sourceType === TrafficSourceTypes.wordpress
|
|
30961
|
+
);
|
|
30962
|
+
if (wpSources.length === 0) {
|
|
30963
|
+
return {
|
|
30964
|
+
status: CheckStatuses.skipped,
|
|
30965
|
+
code: "traffic.cache-blindspot.no-wordpress-source",
|
|
30966
|
+
summary: "No WordPress traffic source connected, so the plugin cache blind spot does not apply (log and edge adapters see cache-served requests)."
|
|
30967
|
+
};
|
|
30968
|
+
}
|
|
30969
|
+
return {
|
|
30970
|
+
status: CheckStatuses.warn,
|
|
30971
|
+
code: "traffic.cache-blindspot.wordpress-plugin",
|
|
30972
|
+
summary: `${wpSources.length} WordPress traffic source(s) capture via the Canonry Traffic Logger plugin, which only logs requests that execute PHP. A full-page cache (LiteSpeed, WP Rocket, W3 Total Cache, WP Super Cache) or CDN serves cached pages before PHP runs, so cache-served page views, including live AI user-fetches such as Claude-User and ChatGPT-User, are not captured. Bot crawls of uncached endpoints (sitemap, feeds, assets, cache misses) still appear, which can make capture look healthy while real page views go uncounted.`,
|
|
30973
|
+
remediation: 'Exclude AI user-agents from the page cache so their requests reach PHP: LiteSpeed Cache has "Do Not Cache User Agents" under Cache > Excludes; WP Rocket uses the `rocket_cache_reject_ua` filter; W3 Total Cache and WP Super Cache have a "Rejected User Agents" box. Mirror the rule at any CDN in front. For cache-independent capture, ingest from server or edge access logs (a `cloud-run` or `vercel` source, or an edge worker) instead of the WordPress plugin.',
|
|
30974
|
+
details: {
|
|
30975
|
+
wordpressSourceCount: wpSources.length,
|
|
30976
|
+
wordpressSourceIds: wpSources.map((s) => s.id)
|
|
30977
|
+
}
|
|
30978
|
+
};
|
|
30979
|
+
}
|
|
30980
|
+
};
|
|
30939
30981
|
var TRAFFIC_SOURCE_CHECKS = [
|
|
30940
30982
|
sourceConnectedCheck,
|
|
30941
30983
|
recentDataCheck,
|
|
30942
30984
|
credentialsCheck,
|
|
30943
|
-
scopesCheck3
|
|
30985
|
+
scopesCheck3,
|
|
30986
|
+
cacheBlindSpotCheck
|
|
30944
30987
|
];
|
|
30945
30988
|
|
|
30946
30989
|
// ../api-routes/src/doctor/checks/wordpress-publish.ts
|
|
@@ -1898,6 +1898,18 @@ function classifySurfaceFromCategory(domain, category, context, storedClass) {
|
|
|
1898
1898
|
return SurfaceClasses.other;
|
|
1899
1899
|
}
|
|
1900
1900
|
}
|
|
1901
|
+
function classifyCitedSurface(domains, context, storedClasses) {
|
|
1902
|
+
const out = /* @__PURE__ */ new Map();
|
|
1903
|
+
for (const { domain } of domains) {
|
|
1904
|
+
if (out.has(domain)) continue;
|
|
1905
|
+
const stored = storedClasses?.get(domain);
|
|
1906
|
+
const storedClass = stored ? surfaceClassFromCompetitorType(stored) : void 0;
|
|
1907
|
+
const { category } = categorizeSource(domain);
|
|
1908
|
+
const cls = classifySurfaceFromCategory(domain, category, context, storedClass);
|
|
1909
|
+
if (cls !== SurfaceClasses.other) out.set(domain, cls);
|
|
1910
|
+
}
|
|
1911
|
+
return out;
|
|
1912
|
+
}
|
|
1901
1913
|
|
|
1902
1914
|
// ../contracts/src/analytics.ts
|
|
1903
1915
|
var metricsWindowSchema = z18.enum(["7d", "30d", "90d", "all"]);
|
|
@@ -2575,17 +2587,17 @@ function winnabilityClassLabel(winnabilityClass) {
|
|
|
2575
2587
|
}
|
|
2576
2588
|
}
|
|
2577
2589
|
var CEDED_SURFACE_THRESHOLD = 0.6;
|
|
2578
|
-
function deriveWinnabilityClass(citedSurfaceDomains,
|
|
2579
|
-
const hasCoverage = citedSurfaceDomains.some((d) =>
|
|
2580
|
-
if (citedSurfaceDomains.length === 0 ||
|
|
2590
|
+
function deriveWinnabilityClass(citedSurfaceDomains, surfaceClasses, threshold = CEDED_SURFACE_THRESHOLD) {
|
|
2591
|
+
const hasCoverage = citedSurfaceDomains.some((d) => surfaceClasses.has(d.domain));
|
|
2592
|
+
if (citedSurfaceDomains.length === 0 || surfaceClasses.size === 0 || !hasCoverage) {
|
|
2581
2593
|
return { winnabilityClass: WinnabilityClasses.ownable, winnability: null };
|
|
2582
2594
|
}
|
|
2583
2595
|
let total = 0;
|
|
2584
2596
|
let ceded = 0;
|
|
2585
2597
|
for (const { domain, citationCount } of citedSurfaceDomains) {
|
|
2586
2598
|
total += citationCount;
|
|
2587
|
-
const cls =
|
|
2588
|
-
if (cls ===
|
|
2599
|
+
const cls = surfaceClasses.get(domain);
|
|
2600
|
+
if (cls === SurfaceClasses["ota-aggregator"] || cls === SurfaceClasses["editorial-media"]) {
|
|
2589
2601
|
ceded += citationCount;
|
|
2590
2602
|
}
|
|
2591
2603
|
}
|
|
@@ -4331,6 +4343,7 @@ export {
|
|
|
4331
4343
|
surfaceClassLabel,
|
|
4332
4344
|
surfaceClassFromCompetitorType,
|
|
4333
4345
|
classifySurfaceFromCategory,
|
|
4346
|
+
classifyCitedSurface,
|
|
4334
4347
|
brandMetricsDtoSchema,
|
|
4335
4348
|
sourceBreakdownDtoSchema,
|
|
4336
4349
|
parseWindow,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
loadConfig,
|
|
10
10
|
loadConfigRaw,
|
|
11
11
|
saveConfigPatch
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-ZUBBADMR.js";
|
|
13
13
|
import {
|
|
14
14
|
CC_CACHE_DIR,
|
|
15
15
|
DUCKDB_SPEC,
|
|
@@ -95,7 +95,7 @@ import {
|
|
|
95
95
|
runs,
|
|
96
96
|
schedules,
|
|
97
97
|
usageCounters
|
|
98
|
-
} from "./chunk-
|
|
98
|
+
} from "./chunk-HOKVBMOD.js";
|
|
99
99
|
import {
|
|
100
100
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
101
101
|
AGENT_PROVIDER_IDS,
|
|
@@ -145,7 +145,7 @@ import {
|
|
|
145
145
|
validationError,
|
|
146
146
|
winnabilityClassLabel,
|
|
147
147
|
withRetry
|
|
148
|
-
} from "./chunk-
|
|
148
|
+
} from "./chunk-JXFNERK4.js";
|
|
149
149
|
|
|
150
150
|
// src/telemetry.ts
|
|
151
151
|
import crypto from "crypto";
|
|
@@ -5620,7 +5620,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
5620
5620
|
return result;
|
|
5621
5621
|
}
|
|
5622
5622
|
async function backfillInsightsCommand(project, opts) {
|
|
5623
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
5623
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-CSW4R4I7.js");
|
|
5624
5624
|
const config = loadConfig();
|
|
5625
5625
|
const db = createClient(config.database);
|
|
5626
5626
|
migrate(db);
|
package/dist/cli.js
CHANGED
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
setTelemetrySource,
|
|
28
28
|
showFirstRunNotice,
|
|
29
29
|
trackEvent
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-SRBO33HB.js";
|
|
31
31
|
import {
|
|
32
32
|
CliError,
|
|
33
33
|
EXIT_SYSTEM_ERROR,
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
saveConfig,
|
|
45
45
|
saveConfigPatch,
|
|
46
46
|
usageError
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-ZUBBADMR.js";
|
|
48
48
|
import {
|
|
49
49
|
apiKeys,
|
|
50
50
|
createClient,
|
|
@@ -52,7 +52,7 @@ import {
|
|
|
52
52
|
projects,
|
|
53
53
|
queries,
|
|
54
54
|
renderReportHtml
|
|
55
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-HOKVBMOD.js";
|
|
56
56
|
import {
|
|
57
57
|
CcReleaseSyncStatuses,
|
|
58
58
|
CheckScopes,
|
|
@@ -71,7 +71,7 @@ import {
|
|
|
71
71
|
providerQuotaPolicySchema,
|
|
72
72
|
resolveProviderInput,
|
|
73
73
|
winnabilityClassSchema
|
|
74
|
-
} from "./chunk-
|
|
74
|
+
} from "./chunk-JXFNERK4.js";
|
|
75
75
|
|
|
76
76
|
// src/cli.ts
|
|
77
77
|
import { pathToFileURL } from "url";
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createServer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SRBO33HB.js";
|
|
4
4
|
import {
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-ZUBBADMR.js";
|
|
7
|
+
import "./chunk-HOKVBMOD.js";
|
|
8
|
+
import "./chunk-JXFNERK4.js";
|
|
9
9
|
export {
|
|
10
10
|
createServer,
|
|
11
11
|
loadConfig
|
package/dist/mcp.js
CHANGED
|
@@ -3,8 +3,8 @@ import {
|
|
|
3
3
|
PACKAGE_VERSION,
|
|
4
4
|
canonryMcpTools,
|
|
5
5
|
createApiClient
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-ZUBBADMR.js";
|
|
7
|
+
import "./chunk-JXFNERK4.js";
|
|
8
8
|
|
|
9
9
|
// src/mcp/cli.ts
|
|
10
10
|
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.72.
|
|
3
|
+
"version": "4.72.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Agent-first open-source AEO operating platform - track how answer engines cite your domain",
|
|
6
6
|
"license": "FSL-1.1-ALv2",
|
|
@@ -62,24 +62,24 @@
|
|
|
62
62
|
"@types/node-cron": "^3.0.11",
|
|
63
63
|
"tsup": "^8.5.1",
|
|
64
64
|
"tsx": "^4.19.0",
|
|
65
|
-
"@ainyc/canonry-api-routes": "0.0.0",
|
|
66
65
|
"@ainyc/canonry-api-client": "0.0.0",
|
|
66
|
+
"@ainyc/canonry-api-routes": "0.0.0",
|
|
67
67
|
"@ainyc/canonry-config": "0.0.0",
|
|
68
68
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
69
|
-
"@ainyc/canonry-db": "0.0.0",
|
|
70
69
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
71
|
-
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
72
70
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
71
|
+
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
72
|
+
"@ainyc/canonry-db": "0.0.0",
|
|
73
73
|
"@ainyc/canonry-integration-google": "0.0.0",
|
|
74
|
-
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
75
74
|
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
75
|
+
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
76
76
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
77
77
|
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
78
78
|
"@ainyc/canonry-intelligence": "0.0.0",
|
|
79
|
+
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
79
80
|
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
80
81
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
81
82
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
82
|
-
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
83
83
|
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
84
84
|
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
85
85
|
},
|