@ainyc/canonry 4.63.0 → 4.64.1

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 (28) hide show
  1. package/assets/agent-workspace/skills/aero/references/regression-playbook.md +1 -1
  2. package/assets/agent-workspace/skills/canonry/references/google-business-profile.md +17 -3
  3. package/assets/assets/{BacklinksPage-CAMqubn_.js → BacklinksPage-B9oyoljV.js} +1 -1
  4. package/assets/assets/{ChartPrimitives-CiZKV2Ax.js → ChartPrimitives-CvfM24iC.js} +1 -1
  5. package/assets/assets/ProjectPage-DELbOAlm.js +6 -0
  6. package/assets/assets/{RunRow-Du7aiJa1.js → RunRow-vHM36Fdi.js} +1 -1
  7. package/assets/assets/{RunsPage-BPNXipd_.js → RunsPage-Cr58nTet.js} +1 -1
  8. package/assets/assets/{SettingsPage-C5Iz4EDc.js → SettingsPage-BuiP8ZOv.js} +1 -1
  9. package/assets/assets/{TrafficPage-F6XgD0ME.js → TrafficPage-bwOxChyo.js} +1 -1
  10. package/assets/assets/{TrafficSourceDetailPage-BGk23nTl.js → TrafficSourceDetailPage-B0uY6VIB.js} +1 -1
  11. package/assets/assets/{extract-error-message-DCFMmz7N.js → extract-error-message-CWdzuNp4.js} +1 -1
  12. package/assets/assets/{index-DVWeE6yS.js → index-DiN_mzYU.js} +66 -66
  13. package/assets/assets/{index-DbIJBXnx.css → index-yMJe1bJR.css} +1 -1
  14. package/assets/assets/{server-traffic-CKrIOeHp.js → server-traffic-D3aICbxr.js} +1 -1
  15. package/assets/assets/{trash-2-Cs489qhT.js → trash-2-CVKno2W2.js} +1 -1
  16. package/assets/assets/vendor-recharts-ClRVR6aX.js +36 -0
  17. package/assets/index.html +3 -3
  18. package/dist/{chunk-GWV4FKVY.js → chunk-34PATQZM.js} +45 -0
  19. package/dist/{chunk-WW6NOJTP.js → chunk-64IDABSF.js} +1 -1
  20. package/dist/{chunk-EECLXA5D.js → chunk-KHN3XMOR.js} +52 -7
  21. package/dist/{chunk-UNDLLHDV.js → chunk-MDNDIBUM.js} +4 -4
  22. package/dist/cli.js +15 -10
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-I5HMGDKS.js → intelligence-service-SMU5JVVD.js} +2 -2
  25. package/dist/mcp.js +2 -2
  26. package/package.json +11 -11
  27. package/assets/assets/ProjectPage-0Ph71-Nu.js +0 -6
  28. package/assets/assets/vendor-recharts-DWvKDyBF.js +0 -36
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-DVWeE6yS.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-DiN_mzYU.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
- <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-DWvKDyBF.js">
18
+ <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-ClRVR6aX.js">
19
19
  <link rel="modulepreload" crossorigin href="./assets/vendor-markdown-DK7fbRNb.js">
20
- <link rel="stylesheet" crossorigin href="./assets/index-DbIJBXnx.css">
20
+ <link rel="stylesheet" crossorigin href="./assets/index-yMJe1bJR.css">
21
21
  </head>
22
22
  <body>
23
23
  <div id="root"></div>
@@ -973,8 +973,30 @@ var gbpSummaryDtoSchema = z7.object({
973
973
  totals: z7.record(z7.string(), z7.number()),
974
974
  recent7d: z7.record(z7.string(), z7.number()),
975
975
  prior7d: z7.record(z7.string(), z7.number()),
976
+ // Per-metric % change recent-vs-prior, computed over COMPLETE days only
977
+ // (the windows anchor to `freshness.dataThroughDate`, never the lagging
978
+ // tail), so a reporting-lag artifact is never shown as a real delta.
976
979
  deltaPct: z7.record(z7.string(), z7.number().nullable())
977
980
  }),
981
+ // GBP Performance data lags a few days; the most recent stored days can be
982
+ // not-yet-reported zeros. `freshness` lets every renderer mark the trailing
983
+ // window as pending instead of treating it as a real decline.
984
+ freshness: z7.object({
985
+ /** Latest day with reported (non-zero) activity — the last complete day. Null when there's no data. */
986
+ dataThroughDate: z7.string().nullable(),
987
+ /** Max stored metric date (>= dataThroughDate when Google has emitted not-yet-final zero rows). Null when there's no data. */
988
+ latestStoredDate: z7.string().nullable(),
989
+ /** Calendar days between dataThroughDate and the as-of date — the trailing window still pending/unreported. */
990
+ pendingDays: z7.number().int().nonnegative()
991
+ }),
992
+ // Daily series (most recent ~30 days) for the trend charts. Each day carries
993
+ // every metric present in the window (0 where a metric had no row that day),
994
+ // and a `pending` flag so the lag tail renders distinct, never as zeros.
995
+ timeseries: z7.array(z7.object({
996
+ date: z7.string(),
997
+ pending: z7.boolean(),
998
+ metrics: z7.record(z7.string(), z7.number())
999
+ })),
978
1000
  keywords: z7.object({
979
1001
  total: z7.number().int().nonnegative(),
980
1002
  thresholdedCount: z7.number().int().nonnegative(),
@@ -992,6 +1014,28 @@ var gbpSummaryDtoSchema = z7.object({
992
1014
  emptyLodgingCount: z7.number().int().nonnegative()
993
1015
  })
994
1016
  });
1017
+ var GBP_METRIC_LABELS = {
1018
+ BUSINESS_DIRECTION_REQUESTS: "Direction requests",
1019
+ WEBSITE_CLICKS: "Website clicks",
1020
+ CALL_CLICKS: "Call clicks",
1021
+ BUSINESS_BOOKINGS: "Bookings",
1022
+ BUSINESS_CONVERSATIONS: "Conversations",
1023
+ BUSINESS_FOOD_ORDERS: "Food orders",
1024
+ BUSINESS_FOOD_MENU_CLICKS: "Food menu clicks",
1025
+ BUSINESS_IMPRESSIONS_DESKTOP_SEARCH: "Search impressions (desktop)",
1026
+ BUSINESS_IMPRESSIONS_MOBILE_SEARCH: "Search impressions (mobile)",
1027
+ BUSINESS_IMPRESSIONS_DESKTOP_MAPS: "Maps impressions (desktop)",
1028
+ BUSINESS_IMPRESSIONS_MOBILE_MAPS: "Maps impressions (mobile)"
1029
+ };
1030
+ function humanizeMetricKey(metric) {
1031
+ const words = metric.replace(/^BUSINESS_/, "").split("_").filter(Boolean).map((w) => w.toLowerCase());
1032
+ if (words.length === 0) return metric;
1033
+ const joined = words.join(" ");
1034
+ return joined.charAt(0).toUpperCase() + joined.slice(1);
1035
+ }
1036
+ function formatGbpMetricLabel(metric) {
1037
+ return GBP_METRIC_LABELS[metric] ?? humanizeMetricKey(metric);
1038
+ }
995
1039
 
996
1040
  // ../contracts/src/retry.ts
997
1041
  var DEFAULT_BASE_DELAY_MS = 1e3;
@@ -3912,6 +3956,7 @@ export {
3912
3956
  gbpLodgingListResponseSchema,
3913
3957
  gbpPlaceDetailsListResponseSchema,
3914
3958
  gbpSummaryDtoSchema,
3959
+ formatGbpMetricLabel,
3915
3960
  withRetry,
3916
3961
  isRetryableHttpError,
3917
3962
  bingUrlInspectionDtoSchema,
@@ -22,7 +22,7 @@ import {
22
22
  trafficConnectVercelRequestSchema,
23
23
  trafficConnectWordpressRequestSchema,
24
24
  trafficEventKindSchema
25
- } from "./chunk-GWV4FKVY.js";
25
+ } from "./chunk-34PATQZM.js";
26
26
 
27
27
  // src/config.ts
28
28
  import fs from "fs";
@@ -207,7 +207,7 @@ import {
207
207
  wordpressSchemaDeployResultDtoSchema,
208
208
  wordpressSchemaStatusResultDtoSchema,
209
209
  wordpressStatusDtoSchema
210
- } from "./chunk-GWV4FKVY.js";
210
+ } from "./chunk-34PATQZM.js";
211
211
 
212
212
  // src/intelligence-service.ts
213
213
  import { eq as eq30, desc as desc15, asc as asc3, and as and23, ne as ne5, or as or5, inArray as inArray11, gte as gte6, lte as lte3 } from "drizzle-orm";
@@ -16837,6 +16837,11 @@ function shiftDate(date, days) {
16837
16837
  const dd = String(dt.getUTCDate()).padStart(2, "0");
16838
16838
  return `${yy}-${mm}-${dd}`;
16839
16839
  }
16840
+ function daysBetween(from, to) {
16841
+ const [fy, fm, fd] = from.split("-").map(Number);
16842
+ const [ty, tm, td] = to.split("-").map(Number);
16843
+ return Math.round((Date.UTC(ty, tm - 1, td) - Date.UTC(fy, fm - 1, fd)) / 864e5);
16844
+ }
16840
16845
  function roundPct(numerator, denominator) {
16841
16846
  if (denominator === 0) return 0;
16842
16847
  return Math.round(numerator / denominator * 100);
@@ -16864,6 +16869,44 @@ function computeWindowDelta(rows, referenceDate) {
16864
16869
  }
16865
16870
  return { recent7d, prior7d, deltaPct };
16866
16871
  }
16872
+ function computeFreshness(rows, asOfDate) {
16873
+ if (rows.length === 0) return { dataThroughDate: null, latestStoredDate: null, pendingDays: 0 };
16874
+ let latestStoredDate = "";
16875
+ const totalByDate = /* @__PURE__ */ new Map();
16876
+ for (const row of rows) {
16877
+ if (row.date > latestStoredDate) latestStoredDate = row.date;
16878
+ totalByDate.set(row.date, (totalByDate.get(row.date) ?? 0) + row.value);
16879
+ }
16880
+ let dataThroughDate = null;
16881
+ for (const [date, total] of totalByDate) {
16882
+ if (total > 0 && (dataThroughDate === null || date > dataThroughDate)) dataThroughDate = date;
16883
+ }
16884
+ const pendingDays = dataThroughDate ? Math.max(0, daysBetween(dataThroughDate, asOfDate)) : 0;
16885
+ return { dataThroughDate, latestStoredDate: latestStoredDate || null, pendingDays };
16886
+ }
16887
+ function buildTimeseries(rows, freshness, windowDays = 30) {
16888
+ if (rows.length === 0 || freshness.latestStoredDate === null) return [];
16889
+ const windowLow = shiftDate(freshness.latestStoredDate, -(windowDays - 1));
16890
+ const metricKeys = /* @__PURE__ */ new Set();
16891
+ const byDate = /* @__PURE__ */ new Map();
16892
+ for (const row of rows) {
16893
+ if (row.date < windowLow || row.date > freshness.latestStoredDate) continue;
16894
+ metricKeys.add(row.metric);
16895
+ const day = byDate.get(row.date) ?? {};
16896
+ day[row.metric] = (day[row.metric] ?? 0) + row.value;
16897
+ byDate.set(row.date, day);
16898
+ }
16899
+ return [...byDate.keys()].sort().map((date) => {
16900
+ const present = byDate.get(date);
16901
+ const metrics = {};
16902
+ for (const key of metricKeys) metrics[key] = present[key] ?? 0;
16903
+ return {
16904
+ date,
16905
+ pending: freshness.dataThroughDate !== null && date > freshness.dataThroughDate,
16906
+ metrics
16907
+ };
16908
+ });
16909
+ }
16867
16910
  function computeKeywordCoverage(rows) {
16868
16911
  const total = rows.length;
16869
16912
  const thresholdedCount = rows.filter((r) => r.valueCount === null).length;
@@ -16886,7 +16929,9 @@ function summarizeLodging(rows) {
16886
16929
  };
16887
16930
  }
16888
16931
  function buildGbpSummary(input) {
16889
- const window = computeWindowDelta(input.dailyMetrics, input.referenceDate);
16932
+ const freshness = computeFreshness(input.dailyMetrics, input.asOfDate);
16933
+ const anchor = freshness.dataThroughDate ?? input.asOfDate;
16934
+ const window = computeWindowDelta(input.dailyMetrics, anchor);
16890
16935
  return {
16891
16936
  scope: { locationName: input.locationName, locationCount: input.locationCount },
16892
16937
  performance: {
@@ -16895,6 +16940,8 @@ function buildGbpSummary(input) {
16895
16940
  prior7d: window.prior7d,
16896
16941
  deltaPct: window.deltaPct
16897
16942
  },
16943
+ freshness,
16944
+ timeseries: buildTimeseries(input.dailyMetrics, freshness),
16898
16945
  keywords: computeKeywordCoverage(input.keywords),
16899
16946
  placeActions: summarizePlaceActions(input.placeActions),
16900
16947
  lodging: summarizeLodging(input.lodging)
@@ -19405,7 +19452,7 @@ async function googleRoutes(app, opts) {
19405
19452
  return buildGbpSummary({
19406
19453
  locationName,
19407
19454
  locationCount: 0,
19408
- referenceDate: today,
19455
+ asOfDate: today,
19409
19456
  dailyMetrics: [],
19410
19457
  keywords: [],
19411
19458
  placeActions: [],
@@ -19422,11 +19469,10 @@ async function googleRoutes(app, opts) {
19422
19469
  latestLodgingByLocation.set(row.locationName, { locationName: row.locationName, populatedGroupCount: row.populatedGroupCount });
19423
19470
  }
19424
19471
  }
19425
- const referenceDate = metricRows.reduce((max, r) => r.date > max ? r.date : max, "") || today;
19426
19472
  return buildGbpSummary({
19427
19473
  locationName,
19428
19474
  locationCount: locationNames.length,
19429
- referenceDate,
19475
+ asOfDate: today,
19430
19476
  dailyMetrics: metricRows.map((r) => ({ metric: r.metric, date: r.date, value: r.value })),
19431
19477
  keywords: keywordRows.map((r) => ({ valueCount: r.valueCount ?? null, valueThreshold: r.valueThreshold ?? null })),
19432
19478
  placeActions: placeActionRows.map((r) => ({ placeActionType: r.placeActionType, providerType: r.providerType ?? null })),
@@ -31420,11 +31466,10 @@ var IntelligenceService = class {
31420
31466
  const lodgingRow = this.db.select({ populatedGroupCount: gbpLodgingSnapshots.populatedGroupCount }).from(gbpLodgingSnapshots).where(and23(eq30(gbpLodgingSnapshots.projectId, projectId), eq30(gbpLodgingSnapshots.locationName, locationName))).orderBy(desc15(gbpLodgingSnapshots.syncedAt)).limit(1).get();
31421
31467
  const placeRow = this.db.select({ attributes: gbpPlaceDetails.attributes }).from(gbpPlaceDetails).where(and23(eq30(gbpPlaceDetails.projectId, projectId), eq30(gbpPlaceDetails.locationName, locationName))).orderBy(desc15(gbpPlaceDetails.syncedAt)).limit(1).get();
31422
31468
  const placesAmenities = placeRow ? extractPlaceAmenities(placeRow.attributes) : [];
31423
- const referenceDate = metricRows.reduce((max, r) => r.date > max ? r.date : max, "") || fallbackDate;
31424
31469
  const summary = buildGbpSummary({
31425
31470
  locationName,
31426
31471
  locationCount: 1,
31427
- referenceDate,
31472
+ asOfDate: fallbackDate,
31428
31473
  dailyMetrics: metricRows,
31429
31474
  keywords: [],
31430
31475
  // keyword coverage is unused here; the trend uses the monthly series below
@@ -8,7 +8,7 @@ import {
8
8
  loadConfig,
9
9
  loadConfigRaw,
10
10
  saveConfigPatch
11
- } from "./chunk-WW6NOJTP.js";
11
+ } from "./chunk-64IDABSF.js";
12
12
  import {
13
13
  CC_CACHE_DIR,
14
14
  DUCKDB_SPEC,
@@ -93,7 +93,7 @@ import {
93
93
  runs,
94
94
  schedules,
95
95
  usageCounters
96
- } from "./chunk-EECLXA5D.js";
96
+ } from "./chunk-KHN3XMOR.js";
97
97
  import {
98
98
  AGENT_MEMORY_VALUE_MAX_BYTES,
99
99
  AGENT_PROVIDER_IDS,
@@ -141,7 +141,7 @@ import {
141
141
  skillsClientSchema,
142
142
  validationError,
143
143
  withRetry
144
- } from "./chunk-GWV4FKVY.js";
144
+ } from "./chunk-34PATQZM.js";
145
145
 
146
146
  // src/telemetry.ts
147
147
  import crypto from "crypto";
@@ -5616,7 +5616,7 @@ function readStoredGroundingSources(rawResponse) {
5616
5616
  return result;
5617
5617
  }
5618
5618
  async function backfillInsightsCommand(project, opts) {
5619
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-I5HMGDKS.js");
5619
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-SMU5JVVD.js");
5620
5620
  const config = loadConfig();
5621
5621
  const db = createClient(config.database);
5622
5622
  migrate(db);
package/dist/cli.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  setTelemetrySource,
28
28
  showFirstRunNotice,
29
29
  trackEvent
30
- } from "./chunk-UNDLLHDV.js";
30
+ } from "./chunk-MDNDIBUM.js";
31
31
  import {
32
32
  CliError,
33
33
  EXIT_SYSTEM_ERROR,
@@ -43,7 +43,7 @@ import {
43
43
  saveConfig,
44
44
  saveConfigPatch,
45
45
  usageError
46
- } from "./chunk-WW6NOJTP.js";
46
+ } from "./chunk-64IDABSF.js";
47
47
  import {
48
48
  apiKeys,
49
49
  createClient,
@@ -51,7 +51,7 @@ import {
51
51
  projects,
52
52
  queries,
53
53
  renderReportHtml
54
- } from "./chunk-EECLXA5D.js";
54
+ } from "./chunk-KHN3XMOR.js";
55
55
  import {
56
56
  CcReleaseSyncStatuses,
57
57
  CheckScopes,
@@ -62,12 +62,13 @@ import {
62
62
  discoveryBucketSchema,
63
63
  discoveryCompetitorTypeSchema,
64
64
  effectiveDomains,
65
+ formatGbpMetricLabel,
65
66
  formatRunErrorOneLine,
66
67
  normalizeProjectAliases,
67
68
  notificationEventSchema,
68
69
  providerQuotaPolicySchema,
69
70
  resolveProviderInput
70
- } from "./chunk-GWV4FKVY.js";
71
+ } from "./chunk-34PATQZM.js";
71
72
 
72
73
  // src/cli.ts
73
74
  import { pathToFileURL } from "url";
@@ -3015,7 +3016,7 @@ async function gbpMetrics(project, opts) {
3015
3016
  for (const m of response.metrics) totals.set(m.metric, (totals.get(m.metric) ?? 0) + m.value);
3016
3017
  console.log(`${response.total} metric row(s). Totals by metric:`);
3017
3018
  for (const [metric, total] of [...totals.entries()].sort((a, b) => b[1] - a[1])) {
3018
- console.log(` ${metric.padEnd(40)} ${total}`);
3019
+ console.log(` ${formatGbpMetricLabel(metric).padEnd(28)} ${total}`);
3019
3020
  }
3020
3021
  }
3021
3022
  async function gbpKeywords(project, opts) {
@@ -3098,15 +3099,19 @@ async function gbpSummary(project, opts) {
3098
3099
  return;
3099
3100
  }
3100
3101
  const scopeLabel = s.scope.locationName ?? `${s.scope.locationCount} selected location(s)`;
3101
- console.log(`GBP local-AEO summary \u2014 ${scopeLabel}
3102
- `);
3103
- console.log("Performance (30d totals, last-7d vs prior-7d):");
3104
- const metrics = Object.keys(s.performance.totals).sort();
3102
+ console.log(`GBP local-AEO summary \u2014 ${scopeLabel}`);
3103
+ if (s.freshness.dataThroughDate) {
3104
+ const pending = s.freshness.pendingDays > 0 ? ` \xB7 ${s.freshness.pendingDays}d pending` : "";
3105
+ console.log(`Data through ${s.freshness.dataThroughDate}${pending}`);
3106
+ }
3107
+ console.log("");
3108
+ console.log("Performance (totals, last-7d vs prior-7d over complete days):");
3109
+ const metrics = Object.keys(s.performance.totals).sort((a, b) => formatGbpMetricLabel(a).localeCompare(formatGbpMetricLabel(b)));
3105
3110
  if (metrics.length === 0) {
3106
3111
  console.log(" (no performance data \u2014 run `canonry gbp sync` first)");
3107
3112
  } else {
3108
3113
  for (const m of metrics) {
3109
- console.log(` ${m.padEnd(40)} ${String(s.performance.totals[m]).padStart(8)} ${fmtDelta(s.performance.deltaPct[m] ?? null)}`);
3114
+ console.log(` ${formatGbpMetricLabel(m).padEnd(28)} ${String(s.performance.totals[m]).padStart(8)} ${fmtDelta(s.performance.deltaPct[m] ?? null)}`);
3110
3115
  }
3111
3116
  }
3112
3117
  console.log(`
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-UNDLLHDV.js";
3
+ } from "./chunk-MDNDIBUM.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-WW6NOJTP.js";
7
- import "./chunk-EECLXA5D.js";
8
- import "./chunk-GWV4FKVY.js";
6
+ } from "./chunk-64IDABSF.js";
7
+ import "./chunk-KHN3XMOR.js";
8
+ import "./chunk-34PATQZM.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-EECLXA5D.js";
4
- import "./chunk-GWV4FKVY.js";
3
+ } from "./chunk-KHN3XMOR.js";
4
+ import "./chunk-34PATQZM.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,8 +3,8 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-WW6NOJTP.js";
7
- import "./chunk-GWV4FKVY.js";
6
+ } from "./chunk-64IDABSF.js";
7
+ import "./chunk-34PATQZM.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.63.0",
3
+ "version": "4.64.1",
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,25 +62,25 @@
62
62
  "tsup": "^8.5.1",
63
63
  "tsx": "^4.19.0",
64
64
  "@ainyc/canonry-api-routes": "0.0.0",
65
- "@ainyc/canonry-api-client": "0.0.0",
66
65
  "@ainyc/canonry-config": "0.0.0",
67
- "@ainyc/canonry-contracts": "0.0.0",
66
+ "@ainyc/canonry-api-client": "0.0.0",
68
67
  "@ainyc/canonry-db": "0.0.0",
69
- "@ainyc/canonry-integration-bing": "0.0.0",
68
+ "@ainyc/canonry-contracts": "0.0.0",
70
69
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
71
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
72
- "@ainyc/canonry-integration-google-places": "0.0.0",
70
+ "@ainyc/canonry-integration-bing": "0.0.0",
71
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
73
72
  "@ainyc/canonry-integration-google": "0.0.0",
73
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
74
74
  "@ainyc/canonry-integration-traffic": "0.0.0",
75
75
  "@ainyc/canonry-integration-wordpress": "0.0.0",
76
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
77
76
  "@ainyc/canonry-intelligence": "0.0.0",
78
- "@ainyc/canonry-provider-gemini": "0.0.0",
77
+ "@ainyc/canonry-provider-cdp": "0.0.0",
79
78
  "@ainyc/canonry-provider-claude": "0.0.0",
79
+ "@ainyc/canonry-integration-google-places": "0.0.0",
80
+ "@ainyc/canonry-provider-gemini": "0.0.0",
81
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
80
82
  "@ainyc/canonry-provider-openai": "0.0.0",
81
- "@ainyc/canonry-provider-cdp": "0.0.0",
82
- "@ainyc/canonry-provider-local": "0.0.0",
83
- "@ainyc/canonry-provider-perplexity": "0.0.0"
83
+ "@ainyc/canonry-provider-local": "0.0.0"
84
84
  },
85
85
  "scripts": {
86
86
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",