@canonry/canonry 4.133.1 → 4.133.2

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 (26) hide show
  1. package/assets/assets/{AuditHistoryPanel-BKJ_bJO3.js → AuditHistoryPanel-CVDg3GXg.js} +1 -1
  2. package/assets/assets/{BacklinksPage-Dlp78T7O.js → BacklinksPage-Dh4RIvS7.js} +1 -1
  3. package/assets/assets/{ChartPrimitives-BnqLVaHC.js → ChartPrimitives-BK89G5H_.js} +1 -1
  4. package/assets/assets/{HistoryPage-dEjboZIm.js → HistoryPage-D8rMu_Js.js} +1 -1
  5. package/assets/assets/ProjectPage-CiTDveNK.js +8 -0
  6. package/assets/assets/{RunRow-C0PeLbDh.js → RunRow-DVOwbmTp.js} +1 -1
  7. package/assets/assets/{RunsPage-8cmHsMEV.js → RunsPage-tz3Oil7N.js} +1 -1
  8. package/assets/assets/{SettingsPage-FzWCV54A.js → SettingsPage-C698YidM.js} +1 -1
  9. package/assets/assets/{TrafficPage-BrEuU4K9.js → TrafficPage-XDXWMtey.js} +1 -1
  10. package/assets/assets/{TrafficSourceDetailPage-yqyQGzqQ.js → TrafficSourceDetailPage-Clz8kOR8.js} +1 -1
  11. package/assets/assets/{arrow-left-DJbzrqwz.js → arrow-left-GWLbh0pE.js} +1 -1
  12. package/assets/assets/{extract-error-message-7lcxZroQ.js → extract-error-message-Dk8w-sb1.js} +1 -1
  13. package/assets/assets/index-JhX-wfQO.css +1 -0
  14. package/assets/assets/{index-DtOyJ_1v.js → index-jTshRRh0.js} +46 -46
  15. package/assets/assets/{trash-2-DFJYR1Fq.js → trash-2-DwnzsuH1.js} +1 -1
  16. package/assets/index.html +2 -2
  17. package/dist/{chunk-VPY3PZXV.js → chunk-IEZTETUZ.js} +52 -19
  18. package/dist/{chunk-P4MIG7V5.js → chunk-JTJQZ4UC.js} +1 -1
  19. package/dist/{chunk-42P7POVS.js → chunk-V2YR3YK6.js} +3 -3
  20. package/dist/cli.js +3 -3
  21. package/dist/index.js +3 -3
  22. package/dist/{intelligence-service-2K7GVEQM.js → intelligence-service-WZNE23TV.js} +1 -1
  23. package/dist/mcp.js +1 -1
  24. package/package.json +7 -7
  25. package/assets/assets/ProjectPage-CV1zK5No.js +0 -8
  26. package/assets/assets/index-BKoAGOtU.css +0 -1
@@ -1 +1 @@
1
- import{c as a}from"./index-DtOyJ_1v.js";const c=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],d=a("circle-check",c);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"}]],k=a("circle-question-mark",e);const t=[["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=a("download",t);const o=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],r=a("external-link",o);const n=[["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"}]],y=a("trash-2",n);export{d as C,s as D,r as E,y as T,k as a};
1
+ import{c as a}from"./index-jTshRRh0.js";const c=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],d=a("circle-check",c);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"}]],k=a("circle-question-mark",e);const t=[["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=a("download",t);const o=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],r=a("external-link",o);const n=[["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"}]],y=a("trash-2",n);export{d as C,s as D,r as E,y as T,k as a};
package/assets/index.html CHANGED
@@ -12,12 +12,12 @@
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-DtOyJ_1v.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-jTshRRh0.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Be8JdV5M.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-CQ77EO2y.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-DSxTZhaH.js">
19
19
  <link rel="modulepreload" crossorigin href="./assets/vendor-markdown-6dwjPOKK.js">
20
- <link rel="stylesheet" crossorigin href="./assets/index-BKoAGOtU.css">
20
+ <link rel="stylesheet" crossorigin href="./assets/index-JhX-wfQO.css">
21
21
  </head>
22
22
  <body>
23
23
  <div id="root"></div>
@@ -15267,22 +15267,48 @@ function sumSearchRows(rows) {
15267
15267
  zero()
15268
15268
  );
15269
15269
  }
15270
+ var classifyVerificationStatus = (status) => {
15271
+ if (status === VerificationStatuses.verified) return "verified";
15272
+ if (status === VerificationStatuses.claimed_unverified) return "claimedUnverified";
15273
+ if (status === VerificationStatuses.unknown_ai_like) return "unknownAiLike";
15274
+ return null;
15275
+ };
15276
+ var emptyVerificationCounts = () => ({
15277
+ verified: 0,
15278
+ claimedUnverified: 0,
15279
+ unknownAiLike: 0
15280
+ });
15281
+ function summarizeVerificationHits(rows) {
15282
+ const counts2 = emptyVerificationCounts();
15283
+ let unsupportedRows = 0;
15284
+ let unsupportedHits = 0;
15285
+ for (const row of rows) {
15286
+ const tier = classifyVerificationStatus(row.verificationStatus);
15287
+ if (!tier) {
15288
+ unsupportedRows += 1;
15289
+ unsupportedHits += row.hits;
15290
+ continue;
15291
+ }
15292
+ counts2[tier] += row.hits;
15293
+ }
15294
+ return { counts: counts2, unsupportedRows, unsupportedHits };
15295
+ }
15270
15296
  function summarizeServer(crawlers, fetches, referrals) {
15271
15297
  const total = referrals.reduce((count2, row) => count2 + row.sessionsOrHits, 0);
15272
15298
  const paid = referrals.reduce((count2, row) => count2 + row.paidSessionsOrHits, 0);
15273
15299
  const organic = referrals.reduce((count2, row) => count2 + row.organicSessionsOrHits, 0);
15300
+ const crawlerHits = summarizeVerificationHits(crawlers);
15301
+ const userFetchHits = summarizeVerificationHits(fetches);
15274
15302
  return {
15275
- crawlerHits: {
15276
- verified: crawlers.filter((row) => row.verificationStatus === VerificationStatuses.verified).reduce((count2, row) => count2 + row.hits, 0),
15277
- claimedUnverified: crawlers.filter((row) => row.verificationStatus === VerificationStatuses.claimed_unverified).reduce((count2, row) => count2 + row.hits, 0),
15278
- unknownAiLike: crawlers.filter((row) => row.verificationStatus === VerificationStatuses.unknown_ai_like).reduce((count2, row) => count2 + row.hits, 0)
15279
- },
15280
- userFetchHits: {
15281
- verified: fetches.filter((row) => row.verificationStatus === VerificationStatuses.verified).reduce((count2, row) => count2 + row.hits, 0),
15282
- claimedUnverified: fetches.filter((row) => row.verificationStatus === VerificationStatuses.claimed_unverified).reduce((count2, row) => count2 + row.hits, 0),
15283
- unknownAiLike: fetches.filter((row) => row.verificationStatus === VerificationStatuses.unknown_ai_like).reduce((count2, row) => count2 + row.hits, 0)
15303
+ summary: {
15304
+ crawlerHits: crawlerHits.counts,
15305
+ userFetchHits: userFetchHits.counts,
15306
+ referralSessions: { total, paid, organic, unknown: Math.max(0, total - paid - organic) }
15284
15307
  },
15285
- referralSessions: { total, paid, organic, unknown: Math.max(0, total - paid - organic) }
15308
+ unsupportedVerification: {
15309
+ rows: crawlerHits.unsupportedRows + userFetchHits.unsupportedRows,
15310
+ hits: crawlerHits.unsupportedHits + userFetchHits.unsupportedHits
15311
+ }
15286
15312
  };
15287
15313
  }
15288
15314
  function comparisonDetail(latest, prior) {
@@ -15476,7 +15502,8 @@ function buildOrganicEvidence(db, projectName, periodDays) {
15476
15502
  const crawlers = allCrawlers.filter((row) => serverInWindow(row.tsHour));
15477
15503
  const fetches = allFetches.filter((row) => serverInWindow(row.tsHour));
15478
15504
  const referrals = allReferrals.filter((row) => serverInWindow(row.tsHour));
15479
- const server = serverSources.length ? summarizeServer(crawlers, fetches, referrals) : null;
15505
+ const serverSummary = summarizeServer(crawlers, fetches, referrals);
15506
+ const server = serverSources.length ? serverSummary.summary : null;
15480
15507
  const latest = db.select().from(runs).where(and14(
15481
15508
  eq18(runs.projectId, project.id),
15482
15509
  eq18(runs.kind, RunKinds["answer-visibility"]),
@@ -15523,16 +15550,16 @@ function buildOrganicEvidence(db, projectName, periodDays) {
15523
15550
  ensurePage(row.landingPageNormalized ?? row.landingPage).ga4OrganicSessions += row.sessions;
15524
15551
  }
15525
15552
  for (const row of crawlers) {
15553
+ const tier = classifyVerificationStatus(row.verificationStatus);
15554
+ if (!tier) continue;
15526
15555
  const counts2 = ensurePage(row.pathNormalized).server.crawlerHits;
15527
- if (row.verificationStatus === VerificationStatuses.verified) counts2.verified += row.hits;
15528
- else if (row.verificationStatus === VerificationStatuses.claimed_unverified) counts2.claimedUnverified += row.hits;
15529
- else counts2.unknownAiLike += row.hits;
15556
+ counts2[tier] += row.hits;
15530
15557
  }
15531
15558
  for (const row of fetches) {
15559
+ const tier = classifyVerificationStatus(row.verificationStatus);
15560
+ if (!tier) continue;
15532
15561
  const counts2 = ensurePage(row.pathNormalized).server.userFetchHits;
15533
- if (row.verificationStatus === VerificationStatuses.verified) counts2.verified += row.hits;
15534
- else if (row.verificationStatus === VerificationStatuses.claimed_unverified) counts2.claimedUnverified += row.hits;
15535
- else counts2.unknownAiLike += row.hits;
15562
+ counts2[tier] += row.hits;
15536
15563
  }
15537
15564
  for (const row of referrals) {
15538
15565
  const counts2 = ensurePage(row.landingPathNormalized).server.referralSessions;
@@ -15567,10 +15594,10 @@ function buildOrganicEvidence(db, projectName, periodDays) {
15567
15594
  }
15568
15595
  const latestGa = ga4?.cohorts.at(-1);
15569
15596
  const priorGa = ga4?.cohorts.at(-2);
15570
- if (ga4 && latestGa && priorGa) {
15597
+ if (ga4 && latestGa && priorGa && latestGa.organicSessions !== priorGa.organicSessions) {
15571
15598
  findings.push({
15572
15599
  tone: "neutral",
15573
- title: "Organic sessions remain a separate outcome",
15600
+ title: "Organic sessions changed",
15574
15601
  detail: `GA4 organic sessions were ${comparisonDetail(latestGa.organicSessions, priorGa.organicSessions)}; visibility alone does not establish lead impact.`
15575
15602
  });
15576
15603
  }
@@ -15674,6 +15701,12 @@ function buildOrganicEvidence(db, projectName, periodDays) {
15674
15701
  detail: "Claimed-unverified and heuristic AI requests are user-agent evidence without operator IP verification and are reported separately from verified requests."
15675
15702
  });
15676
15703
  }
15704
+ if (serverSummary.unsupportedVerification.rows > 0) {
15705
+ limitations.push({
15706
+ code: "unsupported-server-verification-status",
15707
+ detail: `Skipped ${serverSummary.unsupportedVerification.hits} server hits across ${serverSummary.unsupportedVerification.rows} rows with unsupported verification statuses; they are excluded from all verification tiers.`
15708
+ });
15709
+ }
15677
15710
  if (visibility && visibility.ageDays > 30) {
15678
15711
  limitations.push({
15679
15712
  code: "stale-visibility-sweep",
@@ -6470,7 +6470,7 @@ var canonryMcpTools = [
6470
6470
  defineTool({
6471
6471
  name: "canonry_organic_evidence",
6472
6472
  title: "Reconcile organic and AI evidence",
6473
- description: "One-call investigation of whether organic work is gaining visibility, traffic, AI attention, or leads. Returns source-specific 30-day GSC and GA4 cohorts, URL-agnostic page evidence, available GA4 lead events, server-observed AI crawling/user-fetch/referral evidence, the latest answer-visibility sweep, source coverage, findings, and limitations. It preserves native units. Prefer this over fanning out across GSC, GA, traffic, and visibility tools.",
6473
+ description: "One-call investigation of whether organic work is gaining visibility, traffic, or AI attention. Returns source-specific 30-day GSC and GA4 cohorts, URL-agnostic page evidence, available GA4 lead-event evidence (not lead attribution), server-observed AI crawling/user-fetch/referral evidence, the latest answer-visibility sweep, source coverage, findings, and limitations. It preserves native units. Prefer this over fanning out across GSC, GA, traffic, and visibility tools.",
6474
6474
  access: "read",
6475
6475
  tier: "monitoring",
6476
6476
  inputSchema: z2.object({
@@ -10,7 +10,7 @@ import {
10
10
  loadConfig,
11
11
  loadConfigRaw,
12
12
  saveConfigPatch
13
- } from "./chunk-P4MIG7V5.js";
13
+ } from "./chunk-JTJQZ4UC.js";
14
14
  import {
15
15
  CC_CACHE_DIR,
16
16
  DUCKDB_SPEC,
@@ -118,7 +118,7 @@ import {
118
118
  siteAuditPages,
119
119
  siteAuditSnapshots,
120
120
  usageCounters
121
- } from "./chunk-VPY3PZXV.js";
121
+ } from "./chunk-IEZTETUZ.js";
122
122
  import {
123
123
  AGENT_MEMORY_VALUE_MAX_BYTES,
124
124
  AGENT_PROVIDER_IDS,
@@ -7000,7 +7000,7 @@ function readStoredGroundingSources(rawResponse) {
7000
7000
  return result;
7001
7001
  }
7002
7002
  async function backfillInsightsCommand(project, opts) {
7003
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-2K7GVEQM.js");
7003
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-WZNE23TV.js");
7004
7004
  const config = loadConfig();
7005
7005
  const db = createClient(config.database);
7006
7006
  migrate(db);
package/dist/cli.js CHANGED
@@ -29,7 +29,7 @@ import {
29
29
  setTelemetrySource,
30
30
  showFirstRunNotice,
31
31
  trackEvent
32
- } from "./chunk-42P7POVS.js";
32
+ } from "./chunk-V2YR3YK6.js";
33
33
  import {
34
34
  CliError,
35
35
  EXIT_SYSTEM_ERROR,
@@ -46,7 +46,7 @@ import {
46
46
  saveConfig,
47
47
  saveConfigPatch,
48
48
  usageError
49
- } from "./chunk-P4MIG7V5.js";
49
+ } from "./chunk-JTJQZ4UC.js";
50
50
  import {
51
51
  apiKeys,
52
52
  createClient,
@@ -54,7 +54,7 @@ import {
54
54
  projects,
55
55
  queries,
56
56
  renderReportHtml
57
- } from "./chunk-VPY3PZXV.js";
57
+ } from "./chunk-IEZTETUZ.js";
58
58
  import {
59
59
  AdsOperationKinds,
60
60
  AdsOperationStates,
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-42P7POVS.js";
3
+ } from "./chunk-V2YR3YK6.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-P4MIG7V5.js";
7
- import "./chunk-VPY3PZXV.js";
6
+ } from "./chunk-JTJQZ4UC.js";
7
+ import "./chunk-IEZTETUZ.js";
8
8
  import "./chunk-ZPQX5ZQ2.js";
9
9
  export {
10
10
  createServer,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-VPY3PZXV.js";
3
+ } from "./chunk-IEZTETUZ.js";
4
4
  import "./chunk-ZPQX5ZQ2.js";
5
5
  export {
6
6
  IntelligenceService
package/dist/mcp.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-P4MIG7V5.js";
6
+ } from "./chunk-JTJQZ4UC.js";
7
7
  import {
8
8
  isReadOnlyKey
9
9
  } from "./chunk-ZPQX5ZQ2.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonry/canonry",
3
- "version": "4.133.1",
3
+ "version": "4.133.2",
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",
@@ -66,26 +66,26 @@
66
66
  "tsup": "^8.5.1",
67
67
  "tsx": "^4.19.0",
68
68
  "@ainyc/canonry-api-client": "0.0.0",
69
- "@ainyc/canonry-config": "0.0.0",
70
69
  "@ainyc/canonry-api-routes": "0.0.0",
70
+ "@ainyc/canonry-config": "0.0.0",
71
71
  "@ainyc/canonry-contracts": "0.0.0",
72
72
  "@ainyc/canonry-db": "0.0.0",
73
- "@ainyc/canonry-integration-openai-ads": "0.0.0",
74
73
  "@ainyc/canonry-integration-bing": "0.0.0",
75
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
74
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
76
75
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
77
76
  "@ainyc/canonry-integration-google": "0.0.0",
78
77
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
78
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
79
79
  "@ainyc/canonry-integration-google-places": "0.0.0",
80
80
  "@ainyc/canonry-integration-wordpress": "0.0.0",
81
- "@ainyc/canonry-intelligence": "0.0.0",
82
81
  "@ainyc/canonry-integration-traffic": "0.0.0",
83
82
  "@ainyc/canonry-provider-cdp": "0.0.0",
83
+ "@ainyc/canonry-intelligence": "0.0.0",
84
84
  "@ainyc/canonry-provider-claude": "0.0.0",
85
85
  "@ainyc/canonry-provider-gemini": "0.0.0",
86
86
  "@ainyc/canonry-provider-local": "0.0.0",
87
- "@ainyc/canonry-provider-openai": "0.0.0",
88
- "@ainyc/canonry-provider-perplexity": "0.0.0"
87
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
88
+ "@ainyc/canonry-provider-openai": "0.0.0"
89
89
  },
90
90
  "scripts": {
91
91
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",