@ainyc/canonry 4.95.0 → 4.96.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 (23) hide show
  1. package/assets/assets/{BacklinksPage-CT3DfxMw.js → BacklinksPage-BiuaXwM3.js} +1 -1
  2. package/assets/assets/{ChartPrimitives-B6Dleq3z.js → ChartPrimitives-C7jCdApm.js} +1 -1
  3. package/assets/assets/ProjectPage-BHo6vIlj.js +6 -0
  4. package/assets/assets/{RunRow-C7rEdPSI.js → RunRow-DLn-qaBh.js} +1 -1
  5. package/assets/assets/{RunsPage-ByohAHOY.js → RunsPage-BArLwd1T.js} +1 -1
  6. package/assets/assets/{SettingsPage-D4dwPwZy.js → SettingsPage-BJmzcMsh.js} +1 -1
  7. package/assets/assets/{TrafficPage-Kh1CSxMr.js → TrafficPage-DqG9hcNu.js} +1 -1
  8. package/assets/assets/{TrafficSourceDetailPage-CIlOFRYB.js → TrafficSourceDetailPage-yW5pdgrM.js} +1 -1
  9. package/assets/assets/{arrow-left-BoX1Vp7B.js → arrow-left-BUhA2bZu.js} +1 -1
  10. package/assets/assets/{extract-error-message-ZqsMkFg8.js → extract-error-message-D2vzFSUQ.js} +1 -1
  11. package/assets/assets/{index-k1XIw8WK.js → index-afT0D_K8.js} +3 -3
  12. package/assets/assets/{trash-2-A1PQNK3E.js → trash-2-C94CCTsF.js} +1 -1
  13. package/assets/index.html +1 -1
  14. package/dist/{chunk-BUGJOQNW.js → chunk-CEYDMSQO.js} +29 -0
  15. package/dist/{chunk-7YU6ILWL.js → chunk-CNTBEUVE.js} +11 -7
  16. package/dist/{chunk-FFSJRZJR.js → chunk-IFB43PRW.js} +1 -1
  17. package/dist/{chunk-4E4JPS37.js → chunk-ROLTZPV7.js} +4 -4
  18. package/dist/cli.js +4 -4
  19. package/dist/index.js +4 -4
  20. package/dist/{intelligence-service-PGEGDNY6.js → intelligence-service-SJKUVFZ6.js} +2 -2
  21. package/dist/mcp.js +2 -2
  22. package/package.json +10 -10
  23. package/assets/assets/ProjectPage-DeEE66hg.js +0 -6
@@ -1 +1 @@
1
- import{c}from"./index-k1XIw8WK.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-afT0D_K8.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-k1XIw8WK.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-afT0D_K8.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">
@@ -4283,6 +4283,13 @@ var reportRateDeltaSchema = z28.object({
4283
4283
  prior: z28.number(),
4284
4284
  /** Absolute delta (current − prior). Negative = decrease. */
4285
4285
  deltaAbs: z28.number(),
4286
+ /**
4287
+ * Signed percent change vs `prior`, rounded to a whole number. Null when
4288
+ * `prior <= 0` (percentage undefined). Renderers route count/traffic tiles
4289
+ * through the "smart %" rule — percentage when the prior base is large
4290
+ * enough (`MIN_PCT_BASE`), otherwise a rounded raw delta.
4291
+ */
4292
+ deltaPct: z28.number().nullable(),
4286
4293
  /**
4287
4294
  * Direction tag for tone mapping. Threshold is metric-specific (3pp for
4288
4295
  * rates, 0.5 for counts) so small noise lands as 'flat' rather than
@@ -5064,6 +5071,26 @@ function formatDeltaCopy(d, suffix, windowLabel = "vs prior 7 days") {
5064
5071
  if (d.deltaPct < 0) return `Down ${Math.abs(d.deltaPct)}% ${windowLabel} (${formatNumber(d.prior)} ${suffix})`;
5065
5072
  return `Flat ${windowLabel} (${formatNumber(d.prior)} ${suffix})`;
5066
5073
  }
5074
+ var MIN_PCT_BASE = 30;
5075
+ function round1(value) {
5076
+ return Math.round(value * 10) / 10;
5077
+ }
5078
+ function formatAverageDelta(d) {
5079
+ if (d.prior >= MIN_PCT_BASE && d.deltaPct !== null) {
5080
+ const sign2 = d.deltaPct > 0 ? "+" : "";
5081
+ return `${sign2}${d.deltaPct}% vs prior`;
5082
+ }
5083
+ const sign = d.deltaAbs > 0 ? "+" : "";
5084
+ return `${sign}${round1(d.deltaAbs)} vs ${round1(d.prior)}`;
5085
+ }
5086
+ function formatWindowCountDelta(d, countLabel, windowLabel) {
5087
+ if (d.prior >= MIN_PCT_BASE && d.deltaPct !== null) {
5088
+ const sign2 = d.deltaPct > 0 ? "+" : "";
5089
+ return `${sign2}${d.deltaPct}% ${windowLabel}`;
5090
+ }
5091
+ const sign = d.deltaAbs > 0 ? "+" : "";
5092
+ return `${sign}${formatNumber(Math.round(d.deltaAbs))} ${countLabel} ${windowLabel}`;
5093
+ }
5067
5094
 
5068
5095
  // ../contracts/src/ads.ts
5069
5096
  import { z as z31 } from "zod";
@@ -5572,6 +5599,8 @@ export {
5572
5599
  deltaPercent,
5573
5600
  deltaTone,
5574
5601
  formatDeltaCopy,
5602
+ formatAverageDelta,
5603
+ formatWindowCountDelta,
5575
5604
  adsConnectRequestSchema,
5576
5605
  adsConnectionStatusDtoSchema,
5577
5606
  adsDisconnectResponseSchema,
@@ -124,12 +124,14 @@ import {
124
124
  extractAnswerMentions,
125
125
  findDuplicateLocationLabels,
126
126
  forbidden,
127
+ formatAverageDelta,
127
128
  formatDate,
128
129
  formatDateRange,
129
130
  formatDeltaCopy,
130
131
  formatIsoDate,
131
132
  formatNumber,
132
133
  formatRatio,
134
+ formatWindowCountDelta,
133
135
  ga4AiReferralHistoryEntrySchema,
134
136
  ga4SessionHistoryEntrySchema,
135
137
  ga4SocialReferralHistoryEntrySchema,
@@ -259,7 +261,7 @@ import {
259
261
  wordpressSchemaDeployResultDtoSchema,
260
262
  wordpressSchemaStatusResultDtoSchema,
261
263
  wordpressStatusDtoSchema
262
- } from "./chunk-BUGJOQNW.js";
264
+ } from "./chunk-CEYDMSQO.js";
263
265
 
264
266
  // src/intelligence-service.ts
265
267
  import { eq as eq37, desc as desc18, asc as asc5, and as and27, ne as ne5, or as or5, inArray as inArray14, gte as gte7, lte as lte4 } from "drizzle-orm";
@@ -5237,10 +5239,13 @@ function smoothedRunDelta(points, valueFn, maxWindow = SMOOTHED_RUN_DELTA_MAX_WI
5237
5239
  const sum = (arr) => arr.reduce((s, p) => s + valueFn(p), 0);
5238
5240
  const currentAvg = sum(tail) / tail.length;
5239
5241
  const priorAvg = sum(prior) / prior.length;
5242
+ const current = roundTo1Decimal(currentAvg);
5243
+ const prior_ = roundTo1Decimal(priorAvg);
5240
5244
  return {
5241
- current: roundTo1Decimal(currentAvg),
5242
- prior: roundTo1Decimal(priorAvg),
5245
+ current,
5246
+ prior: prior_,
5243
5247
  deltaAbs: currentAvg - priorAvg,
5248
+ deltaPct: deltaPercent(current, prior_),
5244
5249
  window
5245
5250
  };
5246
5251
  }
@@ -10123,8 +10128,7 @@ function renderRateDeltaTile(label, delta, unit) {
10123
10128
  return `<div class="metric"><div class="label">${escapeHtml(label)}</div><div class="value">\u2014</div><div class="delta">No prior data</div></div>`;
10124
10129
  }
10125
10130
  const valueSuffix = unit === "%" ? "%" : "";
10126
- const deltaSign = delta.deltaAbs > 0 ? "+" : "";
10127
- const deltaText = `${deltaSign}${delta.deltaAbs.toFixed(unit === "%" ? 1 : 0)}${valueSuffix} vs ${delta.prior}${valueSuffix}`;
10131
+ const deltaText = unit === "%" ? `${delta.deltaAbs > 0 ? "+" : ""}${delta.deltaAbs.toFixed(1)}% vs ${delta.prior}%` : formatAverageDelta(delta);
10128
10132
  return `<div class="metric">
10129
10133
  <div class="label">${escapeHtml(label)}</div>
10130
10134
  <div class="value ${deltaToneClass(delta.direction)}">${delta.current}${valueSuffix} <span style="font-size:14px;font-weight:500;">${deltaArrow(delta.direction)}</span></div>
@@ -10135,8 +10139,7 @@ function renderTrafficDeltaTile(label, delta, countLabel) {
10135
10139
  if (!delta) {
10136
10140
  return `<div class="metric"><div class="label">${escapeHtml(label)}</div><div class="value">\u2014</div><div class="delta">Not enough trend data</div></div>`;
10137
10141
  }
10138
- const deltaSign = delta.deltaAbs > 0 ? "+" : "";
10139
- const deltaText = `${deltaSign}${formatNumber(delta.deltaAbs)} ${countLabel} vs prior ${WHATS_CHANGED_PERIOD_DAYS} days`;
10142
+ const deltaText = formatWindowCountDelta(delta, countLabel, `vs prior ${WHATS_CHANGED_PERIOD_DAYS} days`);
10140
10143
  return `<div class="metric">
10141
10144
  <div class="label">${escapeHtml(label)}</div>
10142
10145
  <div class="value ${deltaToneClass(delta.direction)}">${formatNumber(delta.current)} <span style="font-size:14px;font-weight:500;">${deltaArrow(delta.direction)}</span></div>
@@ -12437,6 +12440,7 @@ function periodOverPeriodDelta(trend) {
12437
12440
  current,
12438
12441
  prior: priorTotal,
12439
12442
  deltaAbs,
12443
+ deltaPct: deltaPercent(current, priorTotal),
12440
12444
  direction: rateDirection(deltaAbs, 0)
12441
12445
  };
12442
12446
  }
@@ -23,7 +23,7 @@ import {
23
23
  trafficConnectVercelRequestSchema,
24
24
  trafficConnectWordpressRequestSchema,
25
25
  trafficEventKindSchema
26
- } from "./chunk-BUGJOQNW.js";
26
+ } from "./chunk-CEYDMSQO.js";
27
27
 
28
28
  // src/config.ts
29
29
  import fs from "fs";
@@ -9,7 +9,7 @@ import {
9
9
  loadConfig,
10
10
  loadConfigRaw,
11
11
  saveConfigPatch
12
- } from "./chunk-FFSJRZJR.js";
12
+ } from "./chunk-IFB43PRW.js";
13
13
  import {
14
14
  CC_CACHE_DIR,
15
15
  DUCKDB_SPEC,
@@ -111,7 +111,7 @@ import {
111
111
  siteAuditPages,
112
112
  siteAuditSnapshots,
113
113
  usageCounters
114
- } from "./chunk-7YU6ILWL.js";
114
+ } from "./chunk-CNTBEUVE.js";
115
115
  import {
116
116
  AGENT_MEMORY_VALUE_MAX_BYTES,
117
117
  AGENT_PROVIDER_IDS,
@@ -171,7 +171,7 @@ import {
171
171
  validationError,
172
172
  winnabilityClassLabel,
173
173
  withRetry
174
- } from "./chunk-BUGJOQNW.js";
174
+ } from "./chunk-CEYDMSQO.js";
175
175
 
176
176
  // src/telemetry.ts
177
177
  import crypto from "crypto";
@@ -6396,7 +6396,7 @@ function readStoredGroundingSources(rawResponse) {
6396
6396
  return result;
6397
6397
  }
6398
6398
  async function backfillInsightsCommand(project, opts) {
6399
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-PGEGDNY6.js");
6399
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-SJKUVFZ6.js");
6400
6400
  const config = loadConfig();
6401
6401
  const db = createClient(config.database);
6402
6402
  migrate(db);
package/dist/cli.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  setTelemetrySource,
28
28
  showFirstRunNotice,
29
29
  trackEvent
30
- } from "./chunk-4E4JPS37.js";
30
+ } from "./chunk-ROLTZPV7.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-FFSJRZJR.js";
47
+ } from "./chunk-IFB43PRW.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-7YU6ILWL.js";
55
+ } from "./chunk-CNTBEUVE.js";
56
56
  import {
57
57
  BacklinkSources,
58
58
  CcReleaseSyncStatuses,
@@ -77,7 +77,7 @@ import {
77
77
  providerQuotaPolicySchema,
78
78
  resolveProviderInput,
79
79
  winnabilityClassSchema
80
- } from "./chunk-BUGJOQNW.js";
80
+ } from "./chunk-CEYDMSQO.js";
81
81
 
82
82
  // src/cli.ts
83
83
  import { pathToFileURL } from "url";
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-4E4JPS37.js";
3
+ } from "./chunk-ROLTZPV7.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-FFSJRZJR.js";
7
- import "./chunk-7YU6ILWL.js";
8
- import "./chunk-BUGJOQNW.js";
6
+ } from "./chunk-IFB43PRW.js";
7
+ import "./chunk-CNTBEUVE.js";
8
+ import "./chunk-CEYDMSQO.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-7YU6ILWL.js";
4
- import "./chunk-BUGJOQNW.js";
3
+ } from "./chunk-CNTBEUVE.js";
4
+ import "./chunk-CEYDMSQO.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,10 +3,10 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-FFSJRZJR.js";
6
+ } from "./chunk-IFB43PRW.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-BUGJOQNW.js";
9
+ } from "./chunk-CEYDMSQO.js";
10
10
 
11
11
  // src/mcp/cli.ts
12
12
  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.95.0",
3
+ "version": "4.96.0",
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,27 +62,27 @@
62
62
  "@types/node-cron": "^3.0.11",
63
63
  "tsup": "^8.5.1",
64
64
  "tsx": "^4.19.0",
65
+ "@ainyc/canonry-api-client": "0.0.0",
65
66
  "@ainyc/canonry-api-routes": "0.0.0",
66
- "@ainyc/canonry-contracts": "0.0.0",
67
- "@ainyc/canonry-integration-openai-ads": "0.0.0",
67
+ "@ainyc/canonry-config": "0.0.0",
68
68
  "@ainyc/canonry-integration-bing": "0.0.0",
69
- "@ainyc/canonry-api-client": "0.0.0",
70
69
  "@ainyc/canonry-db": "0.0.0",
71
70
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
71
+ "@ainyc/canonry-contracts": "0.0.0",
72
72
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
73
- "@ainyc/canonry-config": "0.0.0",
74
73
  "@ainyc/canonry-integration-google": "0.0.0",
74
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
75
75
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
76
+ "@ainyc/canonry-integration-traffic": "0.0.0",
76
77
  "@ainyc/canonry-integration-google-places": "0.0.0",
77
78
  "@ainyc/canonry-integration-wordpress": "0.0.0",
78
- "@ainyc/canonry-integration-traffic": "0.0.0",
79
79
  "@ainyc/canonry-intelligence": "0.0.0",
80
- "@ainyc/canonry-provider-cdp": "0.0.0",
81
- "@ainyc/canonry-provider-claude": "0.0.0",
82
80
  "@ainyc/canonry-provider-gemini": "0.0.0",
83
- "@ainyc/canonry-provider-local": "0.0.0",
84
81
  "@ainyc/canonry-provider-openai": "0.0.0",
85
- "@ainyc/canonry-provider-perplexity": "0.0.0"
82
+ "@ainyc/canonry-provider-claude": "0.0.0",
83
+ "@ainyc/canonry-provider-local": "0.0.0",
84
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
85
+ "@ainyc/canonry-provider-cdp": "0.0.0"
86
86
  },
87
87
  "scripts": {
88
88
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",