@ainyc/canonry 4.186.5 → 4.186.7

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 (27) hide show
  1. package/assets/assets/{AuditHistoryPanel-D1obTGKY.js → AuditHistoryPanel-9q5v4zHj.js} +1 -1
  2. package/assets/assets/{BacklinksPage-D_tj5Rbt.js → BacklinksPage-C2QVWfQf.js} +1 -1
  3. package/assets/assets/{HistoryPage-lL-CZziY.js → HistoryPage-oLCQA7-T.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-0voEYofK.js → MeasurementPropertyPage-DUYt5ceA.js} +1 -1
  5. package/assets/assets/ProjectPage-Dsao_AiN.js +9 -0
  6. package/assets/assets/{RunRow-DTeprTL3.js → RunRow-kaFXI_VP.js} +1 -1
  7. package/assets/assets/{RunsPage-DrAtN-Xn.js → RunsPage-CQizRJxf.js} +1 -1
  8. package/assets/assets/{SettingsPage-DCD1aTWP.js → SettingsPage-BHh4Y7Qg.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-BX_ehKQW.js → SiteHealthSection-DjmPK0Tg.js} +3 -3
  10. package/assets/assets/{TrafficPage-PTKGMjZO.js → TrafficPage-B3N0r5gW.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-BouaEiZp.js → TrafficSourceDetailPage-C27GkPF4.js} +1 -1
  12. package/assets/assets/extract-error-message-DlmIEdy_.js +1 -0
  13. package/assets/assets/{index-AI2ypViE.js → index-DVa1lkiE.js} +20 -20
  14. package/assets/assets/{react-sigma_core.esm.min-CQ5k6lQz.js → react-sigma_core.esm.min-BBOzBU_n.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-V7LWMC2C.js → chunk-42P3CXIH.js} +4 -4
  17. package/dist/{chunk-67UGGOII.js → chunk-7CG3QE4N.js} +1600 -1441
  18. package/dist/{chunk-GGEW65VE.js → chunk-7TYSFZEG.js} +2 -2
  19. package/dist/{chunk-PXGN7BY7.js → chunk-CFJHRXZ3.js} +2261 -2215
  20. package/dist/{chunk-D6YHI72G.js → chunk-FGEHMYIW.js} +4 -4
  21. package/dist/cli.js +28 -19
  22. package/dist/index.js +4 -4
  23. package/dist/{intelligence-service-CTFIKNIF.js → intelligence-service-KBHLNDGO.js} +2 -2
  24. package/dist/mcp.js +3 -3
  25. package/package.json +12 -12
  26. package/assets/assets/ProjectPage-Bq-ncl6p.js +0 -9
  27. package/assets/assets/extract-error-message-DOUrsRz6.js +0 -1
@@ -11,7 +11,7 @@ import {
11
11
  loadConfig,
12
12
  loadConfigRaw,
13
13
  saveConfigPatch
14
- } from "./chunk-V7LWMC2C.js";
14
+ } from "./chunk-42P3CXIH.js";
15
15
  import {
16
16
  CC_CACHE_DIR,
17
17
  DUCKDB_SPEC,
@@ -158,7 +158,7 @@ import {
158
158
  siteCrawlSnapshots,
159
159
  toAlertView,
160
160
  usageCounters
161
- } from "./chunk-67UGGOII.js";
161
+ } from "./chunk-7CG3QE4N.js";
162
162
  import {
163
163
  AGENT_MEMORY_VALUE_MAX_BYTES,
164
164
  AGENT_PROVIDER_IDS,
@@ -299,7 +299,7 @@ import {
299
299
  validationError,
300
300
  winnabilityClassLabel,
301
301
  withRetry
302
- } from "./chunk-PXGN7BY7.js";
302
+ } from "./chunk-CFJHRXZ3.js";
303
303
 
304
304
  // src/telemetry.ts
305
305
  import crypto from "crypto";
@@ -11909,7 +11909,7 @@ function readStoredGroundingSources(rawResponse) {
11909
11909
  return result;
11910
11910
  }
11911
11911
  async function backfillInsightsCommand(project, opts) {
11912
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-CTFIKNIF.js");
11912
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-KBHLNDGO.js");
11913
11913
  const config = loadConfig();
11914
11914
  const db = createClient(config.database);
11915
11915
  migrate(db);
package/dist/cli.js CHANGED
@@ -28,11 +28,11 @@ import {
28
28
  trackCliCommandFinished,
29
29
  trackEvent,
30
30
  waitForServerRuntimeStartup
31
- } from "./chunk-D6YHI72G.js";
31
+ } from "./chunk-FGEHMYIW.js";
32
32
  import {
33
33
  autoSyncSkills,
34
34
  formatAutoSyncNotice
35
- } from "./chunk-GGEW65VE.js";
35
+ } from "./chunk-7TYSFZEG.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-V7LWMC2C.js";
61
+ } from "./chunk-42P3CXIH.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-67UGGOII.js";
75
+ } from "./chunk-7CG3QE4N.js";
76
76
  import {
77
77
  AdsDeliverySnapshotStatuses,
78
78
  AdsHistoricalCampaignRollupStatuses,
@@ -141,9 +141,11 @@ import {
141
141
  queryTrackingCommitRequestSchema,
142
142
  queryTrackingPreviewRequestSchema,
143
143
  resolveProviderInput,
144
+ shareOfVoiceLabel,
145
+ shareOfVoiceReason,
144
146
  visibilityReportRequestSchema,
145
147
  winnabilityClassSchema
146
- } from "./chunk-PXGN7BY7.js";
148
+ } from "./chunk-CFJHRXZ3.js";
147
149
 
148
150
  // src/cli.ts
149
151
  import { pathToFileURL } from "url";
@@ -7605,24 +7607,29 @@ function printCompetitorLandscape(data) {
7605
7607
  console.log(
7606
7608
  data.filters.queryClass === "all" ? "Share of voice is blank: branded and non-brand queries are pooled here. Add --query-class non-brand for a ratio." : `Counting ${data.filters.queryClass} queries only.`
7607
7609
  );
7610
+ if (data.reason) console.log(shareOfVoiceReason(data.reason));
7608
7611
  if (data.truncated) console.log("Top 100 observed competitors and top 100 other cited sources shown; pinned competitors are complete.");
7609
7612
  console.log("");
7610
- printLandscapeRows("Your brand", [data.project]);
7611
- printLandscapeRows("Pinned competitors", data.pinned);
7612
- printLandscapeRows("Observed competitors", data.observed);
7613
- printLandscapeRows("Other cited sources", data.otherSources);
7613
+ printLandscapeRows("Your brand", [data.project], false, data, data.filters.queryClass);
7614
+ printLandscapeRows("Pinned competitors", data.pinned, false, data, data.filters.queryClass);
7615
+ printLandscapeRows("Observed competitors", data.observed, false, data, data.filters.queryClass);
7616
+ printLandscapeRows("Other cited sources", data.otherSources, false, data, data.filters.queryClass);
7614
7617
  console.log("");
7615
7618
  console.log(
7616
7619
  `Evidence: ${data.evidence.answeredResults} answer-text result(s), ${data.evidence.sourceResults} source result(s); excluded: ${data.evidence.excludedProbeResults} probe, ${data.evidence.excludedNonCompletedResults} non-completed.`
7617
7620
  );
7618
- if (data.modelComparison) printModelComparison(data.modelComparison);
7621
+ if (data.observedNames?.length) {
7622
+ console.log("Names observed in answers (not a comparison set):");
7623
+ for (const row of data.observedNames) console.log(` ${row.name} \xB7 ${row.answerCount} answers`);
7624
+ }
7625
+ if (data.modelComparison) printModelComparison(data.modelComparison, data.filters.queryClass);
7619
7626
  }
7620
7627
  function describeServedModels(evidence) {
7621
7628
  if (evidence.status === "unknown") return "Unknown (not disclosed)";
7622
7629
  if (evidence.status === "known") return evidence.model;
7623
7630
  return [...evidence.models, ...evidence.includesUnknown ? ["Unknown (not disclosed)"] : []].join(", ");
7624
7631
  }
7625
- function printModelComparison(comparison) {
7632
+ function printModelComparison(comparison, queryClass) {
7626
7633
  console.log("");
7627
7634
  console.log(`Model comparison \xB7 requested-model basis \xB7 ${comparison.groups.length} of ${comparison.totalGroups} groups`);
7628
7635
  console.log("Groups use stored observations. They do not form a matched-query or equal-weight comparison.");
@@ -7632,21 +7639,22 @@ function printModelComparison(comparison) {
7632
7639
  console.log(`${group.provider} \xB7 requested model: ${group.model ?? "Unknown (not recorded)"}`);
7633
7640
  console.log(`Served model evidence: ${describeServedModels(group.servedModels)}`);
7634
7641
  console.log(`Samples: ${group.snapshotCount} snapshot(s), ${group.evidence.answeredResults} answer-text result(s), ${group.evidence.sourceResults} source result(s).`);
7635
- printLandscapeRows("Your brand", [group.project], true);
7636
- printLandscapeRows("Pinned competitors", group.pinned, true);
7637
- printLandscapeRows("Observed competitors", group.observed, true);
7638
- printLandscapeRows("Other cited sources", group.otherSources, true);
7642
+ if (group.reason) console.log(shareOfVoiceReason(group.reason));
7643
+ printLandscapeRows("Your brand", [group.project], true, group, queryClass);
7644
+ printLandscapeRows("Pinned competitors", group.pinned, true, group, queryClass);
7645
+ printLandscapeRows("Observed competitors", group.observed, true, group, queryClass);
7646
+ printLandscapeRows("Other cited sources", group.otherSources, true, group, queryClass);
7639
7647
  if (group.truncated) console.log("Top 100 observed competitors and top 100 other sources shown. Pinned competitors are complete.");
7640
7648
  }
7641
7649
  }
7642
- function printLandscapeRows(heading, rows, showSampleCount = false) {
7650
+ function printLandscapeRows(heading, rows, showSampleCount = false, context, queryClass = "all") {
7643
7651
  console.log(`${heading}:`);
7644
7652
  if (rows.length === 0) {
7645
7653
  console.log(" \u2014");
7646
7654
  return;
7647
7655
  }
7648
7656
  for (const row of rows) {
7649
- const sov = row.shareOfVoice === null ? "\u2014" : `${row.shareOfVoice.toFixed(1)}%`;
7657
+ const sov = `${shareOfVoiceLabel(row.shareOfVoice, context)} \xB7 ${queryClass} queries`;
7650
7658
  console.log(` ${row.domain} mention ${row.mentionCount} \xB7 citation ${row.citationCount} \xB7 SOV ${sov}${showSampleCount ? ` \xB7 answers ${row.answeredResults}` : ""}`);
7651
7659
  }
7652
7660
  }
@@ -16955,11 +16963,12 @@ function printVisibilityStats(data) {
16955
16963
  const sov = data.shareOfVoice;
16956
16964
  if (sov) {
16957
16965
  console.log("");
16958
- const pctStr = sov.percent !== null ? `${sov.percent}%` : sov.competitorCount === 0 ? "\u2014 (no competitors configured)" : sov.snapshotsWithAnswerText === 0 ? "\u2014 (no answer text in scope)" : "\u2014 (no brands mentioned in scope)";
16966
+ const pctStr = sov.availability !== void 0 ? shareOfVoiceLabel(sov.percent, sov) : sov.percent !== null ? `${sov.percent}%` : sov.competitorCount === 0 ? "\u2014 (no competitors configured)" : sov.snapshotsWithAnswerText === 0 ? "\u2014 (no answer text in scope)" : "\u2014 (no brands mentioned in scope)";
16959
16967
  const scope = sov.queryClass === "pooled" ? "pooled queries \xB7 classification unavailable" : `${sov.queryClass} queries`;
16960
16968
  console.log(
16961
- `Share of voice (${scope}): ${pctStr} (you ${sov.projectMentions} vs competitors ${sov.competitorMentions} brand mentions across ${sov.snapshotsWithAnswerText} answers)`
16969
+ `Share of voice (${scope}${sov.measurementScope === "all-markets" ? " \xB7 all markets" : ""}): ${pctStr} (you ${sov.projectMentions} vs competitors ${sov.competitorMentions} brand mentions across ${sov.snapshotsWithAnswerText} answers)`
16962
16970
  );
16971
+ if (sov.reason) console.log(` ${shareOfVoiceReason(sov.reason)}`);
16963
16972
  if (sov.queryClass === "non-brand") {
16964
16973
  console.log(" branded queries excluded on purpose \u2014 re-run with --query-class branded for brand recall");
16965
16974
  }
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-D6YHI72G.js";
6
+ } from "./chunk-FGEHMYIW.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-V7LWMC2C.js";
10
- import "./chunk-67UGGOII.js";
11
- import "./chunk-PXGN7BY7.js";
9
+ } from "./chunk-42P3CXIH.js";
10
+ import "./chunk-7CG3QE4N.js";
11
+ import "./chunk-CFJHRXZ3.js";
12
12
  export {
13
13
  GoogleMarketingRuntimeError,
14
14
  createGoogleMarketingCredentialStore,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-67UGGOII.js";
4
- import "./chunk-PXGN7BY7.js";
3
+ } from "./chunk-7CG3QE4N.js";
4
+ import "./chunk-CFJHRXZ3.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-GGEW65VE.js";
3
+ } from "./chunk-7TYSFZEG.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-V7LWMC2C.js";
7
+ } from "./chunk-42P3CXIH.js";
8
8
  import {
9
9
  isReadOnlyKey
10
- } from "./chunk-PXGN7BY7.js";
10
+ } from "./chunk-CFJHRXZ3.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.186.5",
3
+ "version": "4.186.7",
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,31 +71,31 @@
71
71
  "tsup": "^8.5.1",
72
72
  "tsx": "^4.19.0",
73
73
  "@ainyc/canonry-web": "0.0.0",
74
- "@ainyc/canonry-config": "0.0.0",
75
- "@ainyc/canonry-contracts": "0.0.0",
76
74
  "@ainyc/canonry-api-routes": "0.0.0",
77
75
  "@ainyc/canonry-api-client": "0.0.0",
78
- "@ainyc/canonry-integration-bing": "0.0.0",
76
+ "@ainyc/canonry-contracts": "0.0.0",
77
+ "@ainyc/canonry-config": "0.0.0",
79
78
  "@ainyc/canonry-db": "0.0.0",
80
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
79
+ "@ainyc/canonry-integration-bing": "0.0.0",
81
80
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
81
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
82
82
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
83
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
83
84
  "@ainyc/canonry-integration-google": "0.0.0",
84
- "@ainyc/canonry-integration-google-places": "0.0.0",
85
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
86
85
  "@ainyc/canonry-integration-google-ads": "0.0.0",
87
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
86
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
87
+ "@ainyc/canonry-integration-google-places": "0.0.0",
88
88
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
89
89
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
90
+ "@ainyc/canonry-integration-traffic": "0.0.0",
90
91
  "@ainyc/canonry-integration-wordpress": "0.0.0",
92
+ "@ainyc/canonry-provider-claude": "0.0.0",
93
+ "@ainyc/canonry-provider-gemini": "0.0.0",
91
94
  "@ainyc/canonry-provider-cdp": "0.0.0",
92
95
  "@ainyc/canonry-intelligence": "0.0.0",
93
- "@ainyc/canonry-provider-gemini": "0.0.0",
94
- "@ainyc/canonry-provider-claude": "0.0.0",
95
96
  "@ainyc/canonry-provider-local": "0.0.0",
96
- "@ainyc/canonry-provider-perplexity": "0.0.0",
97
97
  "@ainyc/canonry-provider-openai": "0.0.0",
98
- "@ainyc/canonry-integration-traffic": "0.0.0"
98
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
99
99
  },
100
100
  "scripts": {
101
101
  "build": "pnpm run build:cli && pnpm run build:web",