@ainyc/canonry 4.62.0 → 4.62.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 (22) hide show
  1. package/assets/assets/{BacklinksPage-BemXB6GS.js → BacklinksPage-nntNEmWm.js} +1 -1
  2. package/assets/assets/{ChartPrimitives-dmrE9jZb.js → ChartPrimitives-Bsg8aPq0.js} +1 -1
  3. package/assets/assets/{ProjectPage-DqCnHEV2.js → ProjectPage-Jy7qm4wK.js} +1 -1
  4. package/assets/assets/{RunRow-DoylbyR5.js → RunRow-CFgQnTnH.js} +1 -1
  5. package/assets/assets/{RunsPage-Dqk6N23k.js → RunsPage-ForYa-YV.js} +1 -1
  6. package/assets/assets/{SettingsPage-BiHfUMwX.js → SettingsPage-l0-szZR2.js} +1 -1
  7. package/assets/assets/{TrafficPage-D1kFNV8R.js → TrafficPage-Ds7_1EgS.js} +1 -1
  8. package/assets/assets/{TrafficSourceDetailPage-DOK7re41.js → TrafficSourceDetailPage-D5LY42UQ.js} +1 -1
  9. package/assets/assets/{extract-error-message-CD8TzPFm.js → extract-error-message-CHUHxwAN.js} +1 -1
  10. package/assets/assets/{index-D4km1FDL.js → index-DjZLLCqh.js} +3 -3
  11. package/assets/assets/{server-traffic-K8586rYW.js → server-traffic-BDFC_oVS.js} +1 -1
  12. package/assets/assets/{trash-2-D2qhBJ9M.js → trash-2-DvI9ZgWY.js} +1 -1
  13. package/assets/index.html +1 -1
  14. package/dist/{chunk-QU62IX7K.js → chunk-EECLXA5D.js} +69 -27
  15. package/dist/{chunk-URPUUKLC.js → chunk-GWV4FKVY.js} +2 -0
  16. package/dist/{chunk-4FLI5VSQ.js → chunk-UNDLLHDV.js} +5 -4
  17. package/dist/{chunk-PITZUUFV.js → chunk-WW6NOJTP.js} +1 -1
  18. package/dist/cli.js +7 -4
  19. package/dist/index.js +4 -4
  20. package/dist/{intelligence-service-AZDX2EBS.js → intelligence-service-I5HMGDKS.js} +2 -2
  21. package/dist/mcp.js +2 -2
  22. package/package.json +11 -11
@@ -207,7 +207,7 @@ import {
207
207
  wordpressSchemaDeployResultDtoSchema,
208
208
  wordpressSchemaStatusResultDtoSchema,
209
209
  wordpressStatusDtoSchema
210
- } from "./chunk-URPUUKLC.js";
210
+ } from "./chunk-GWV4FKVY.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";
@@ -25950,6 +25950,9 @@ function verifyIpForRule(ip, ruleId) {
25950
25950
 
25951
25951
  // ../integration-traffic/src/rules.ts
25952
25952
  var LEGACY_CHATGPT_DOMAIN = "chat.openai.com";
25953
+ var SELF_TRAFFIC_USER_AGENT_PATTERNS = [
25954
+ /AINYC-AEO-Audit\//i
25955
+ ];
25953
25956
  var DEFAULT_AI_CRAWLER_RULES = [
25954
25957
  {
25955
25958
  id: "openai-gptbot",
@@ -26248,6 +26251,11 @@ function utmSourceFromUrl(value) {
26248
26251
  return null;
26249
26252
  }
26250
26253
  }
26254
+ function isSelfTraffic(event) {
26255
+ const userAgent = event.userAgent?.trim();
26256
+ if (!userAgent) return false;
26257
+ return SELF_TRAFFIC_USER_AGENT_PATTERNS.some((pattern) => pattern.test(userAgent));
26258
+ }
26251
26259
  function classifyCrawler(event) {
26252
26260
  const userAgent = event.userAgent?.trim();
26253
26261
  if (!userAgent) return null;
@@ -26450,12 +26458,14 @@ function buildTrafficProbeReport(events, options = {}) {
26450
26458
  const topAiUserFetchPaths = /* @__PURE__ */ new Map();
26451
26459
  const topAiReferrers = /* @__PURE__ */ new Map();
26452
26460
  const topAiReferralLandingPaths = /* @__PURE__ */ new Map();
26461
+ const includedEvents = events.filter((event) => !isSelfTraffic(event));
26462
+ const selfTrafficExcluded = events.length - includedEvents.length;
26453
26463
  let crawlerHits = 0;
26454
26464
  let aiUserFetchHits = 0;
26455
26465
  let aiReferralHits = 0;
26456
26466
  let unknownHits = 0;
26457
26467
  const samples = [];
26458
- for (const event of events) {
26468
+ for (const event of includedEvents) {
26459
26469
  const tsHour = hourBucket(event.observedAt);
26460
26470
  const pathNormalized = normalizeTrafficPathPattern(event.path);
26461
26471
  const crawler = classifyCrawler(event);
@@ -26586,7 +26596,8 @@ function buildTrafficProbeReport(events, options = {}) {
26586
26596
  return {
26587
26597
  generatedAt: options.generatedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
26588
26598
  totals: {
26589
- normalizedEvents: events.length,
26599
+ normalizedEvents: includedEvents.length,
26600
+ selfTrafficExcluded,
26590
26601
  crawlerHits,
26591
26602
  aiUserFetchHits,
26592
26603
  aiReferralSessions: aiReferralSessions.size,
@@ -27051,7 +27062,7 @@ async function drainVercelTrafficEvents(options) {
27051
27062
  const events = [];
27052
27063
  const seenEventIds = /* @__PURE__ */ new Set();
27053
27064
  if (endMs <= startMs) {
27054
- return { events, subWindowCount: 0, effectiveStartMs: startMs, retentionClamped: false };
27065
+ return { events, subWindowCount: 0, effectiveStartMs: startMs, retentionClamped: false, truncatedSliceCount: 0, truncatedSliceStartsMs: [] };
27055
27066
  }
27056
27067
  let cursorMs = startMs;
27057
27068
  let spanMs = endMs - startMs;
@@ -27061,6 +27072,8 @@ async function drainVercelTrafficEvents(options) {
27061
27072
  let retentionResolved = false;
27062
27073
  let floorSpanProbeCountdown = 0;
27063
27074
  let floorPageBudgetCountdown = 0;
27075
+ let truncatedSliceCount = 0;
27076
+ const truncatedSliceStartsMs = [];
27064
27077
  while (cursorMs < endMs) {
27065
27078
  if (subWindowCount >= options.maxSubWindows) {
27066
27079
  throw new Error(
@@ -27103,27 +27116,28 @@ async function drainVercelTrafficEvents(options) {
27103
27116
  }
27104
27117
  continue;
27105
27118
  }
27106
- if (pageBudget >= FLOOR_SLICE_MAX_PAGES) {
27107
- throw new Error(
27108
- `Vercel ${MIN_SUB_WINDOW_MS / 1e3}-second slice holds more than ${FLOOR_SLICE_MAX_PAGES} pages and cannot be drained further`
27109
- );
27119
+ if (pageBudget < FLOOR_SLICE_MAX_PAGES) {
27120
+ page = await options.pull({
27121
+ token: options.token,
27122
+ projectId: options.projectId,
27123
+ teamId: options.teamId,
27124
+ environment: options.environment,
27125
+ startDate: cursorMs,
27126
+ endDate: subEndMs,
27127
+ maxPages: FLOOR_SLICE_MAX_PAGES
27128
+ });
27129
+ subWindowCount += 1;
27130
+ floorSpanProbeCountdown = FLOOR_CONGESTION_PROBE_INTERVAL;
27131
+ floorPageBudgetCountdown = FLOOR_CONGESTION_PROBE_INTERVAL;
27110
27132
  }
27111
- page = await options.pull({
27112
- token: options.token,
27113
- projectId: options.projectId,
27114
- teamId: options.teamId,
27115
- environment: options.environment,
27116
- startDate: cursorMs,
27117
- endDate: subEndMs,
27118
- maxPages: FLOOR_SLICE_MAX_PAGES
27119
- });
27120
- subWindowCount += 1;
27121
- floorSpanProbeCountdown = FLOOR_CONGESTION_PROBE_INTERVAL;
27122
- floorPageBudgetCountdown = FLOOR_CONGESTION_PROBE_INTERVAL;
27123
27133
  if (page.hasMore) {
27124
- throw new Error(
27125
- `Vercel ${MIN_SUB_WINDOW_MS / 1e3}-second slice holds more than ${FLOOR_SLICE_MAX_PAGES} pages and cannot be drained further`
27126
- );
27134
+ if (options.abortOnTruncation) {
27135
+ throw new Error(
27136
+ `Vercel ${MIN_SUB_WINDOW_MS / 1e3}-second slice starting ${new Date(cursorMs).toISOString()} holds more than ${FLOOR_SLICE_MAX_PAGES} pages and cannot be drained further`
27137
+ );
27138
+ }
27139
+ truncatedSliceCount += 1;
27140
+ truncatedSliceStartsMs.push(cursorMs);
27127
27141
  }
27128
27142
  }
27129
27143
  for (const event of page.events) {
@@ -27147,7 +27161,7 @@ async function drainVercelTrafficEvents(options) {
27147
27161
  }
27148
27162
  }
27149
27163
  }
27150
- return { events, subWindowCount, effectiveStartMs, retentionClamped };
27164
+ return { events, subWindowCount, effectiveStartMs, retentionClamped, truncatedSliceCount, truncatedSliceStartsMs };
27151
27165
  }
27152
27166
 
27153
27167
  // ../api-routes/src/traffic.ts
@@ -27237,10 +27251,16 @@ async function runBackfillTask(options) {
27237
27251
  return;
27238
27252
  }
27239
27253
  const report = buildTrafficProbeReport(allEvents, { sampleLimit: BACKFILL_SAMPLE_LIMIT });
27254
+ if (report.totals.selfTrafficExcluded > 0) {
27255
+ app.log.info(
27256
+ { sourceId: sourceRow.id, selfTrafficExcluded: report.totals.selfTrafficExcluded },
27257
+ "Backfill dropped Canonry self-traffic before rollup"
27258
+ );
27259
+ }
27240
27260
  const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
27241
27261
  const windowStartIso = windowStart.toISOString();
27242
27262
  const windowEndIso = windowEnd.toISOString();
27243
- const newSorted = allEvents.slice().sort((a, b) => a.observedAt < b.observedAt ? 1 : a.observedAt > b.observedAt ? -1 : 0).map((e) => e.eventId);
27263
+ const newSorted = allEvents.filter((e) => !isSelfTraffic(e)).sort((a, b) => a.observedAt < b.observedAt ? 1 : a.observedAt > b.observedAt ? -1 : 0).map((e) => e.eventId);
27244
27264
  const newRingBuffer = newSorted.slice(0, MAX_TRACKED_EVENT_IDS);
27245
27265
  const currentLastSyncedMs = sourceRow.lastSyncedAt ? new Date(sourceRow.lastSyncedAt).getTime() : Number.NEGATIVE_INFINITY;
27246
27266
  const nextLastSyncedAt = Math.max(currentLastSyncedMs, windowEnd.getTime()) === windowEnd.getTime() ? windowEndIso : sourceRow.lastSyncedAt;
@@ -27694,6 +27714,7 @@ async function trafficRoutes(app, opts) {
27694
27714
  sourceType: sourceRow.sourceType,
27695
27715
  sourceId: sourceRow.id,
27696
27716
  pulledEvents: 0,
27717
+ selfTrafficExcluded: 0,
27697
27718
  crawlerHits: 0,
27698
27719
  aiUserFetchHits: 0,
27699
27720
  aiReferralHits: 0,
@@ -27850,6 +27871,16 @@ async function trafficRoutes(app, opts) {
27850
27871
  if (drained.retentionClamped) {
27851
27872
  throw vercelRetentionClampError(windowStart.getTime(), drained.effectiveStartMs);
27852
27873
  }
27874
+ if (drained.truncatedSliceCount > 0) {
27875
+ request.log.warn(
27876
+ {
27877
+ sourceId: sourceRow.id,
27878
+ truncatedSlices: drained.truncatedSliceCount,
27879
+ sliceStarts: drained.truncatedSliceStartsMs.map((ms) => new Date(ms).toISOString())
27880
+ },
27881
+ "Vercel drain truncated dense one-second slice(s); ingested a sample and advanced past them"
27882
+ );
27883
+ }
27853
27884
  allEvents = drained.events;
27854
27885
  } catch (e) {
27855
27886
  const msg = e instanceof Error ? e.message : String(e);
@@ -27863,6 +27894,7 @@ async function trafficRoutes(app, opts) {
27863
27894
  let sampleRows = 0;
27864
27895
  let finishedAt = (/* @__PURE__ */ new Date()).toISOString();
27865
27896
  let pulledEventsCount = 0;
27897
+ let selfTrafficExcludedCount = 0;
27866
27898
  let crawlerHitsCount = 0;
27867
27899
  let aiUserFetchHitsCount = 0;
27868
27900
  let aiReferralHitsCount = 0;
@@ -27872,7 +27904,7 @@ async function trafficRoutes(app, opts) {
27872
27904
  const previousIds = latestRow.lastEventIds ?? [];
27873
27905
  const seenEventIds = new Set(previousIds);
27874
27906
  const dedupedEvents = seenEventIds.size === 0 ? allEvents : allEvents.filter((e) => !seenEventIds.has(e.eventId));
27875
- const newSorted = dedupedEvents.slice().sort((a, b) => a.observedAt < b.observedAt ? 1 : a.observedAt > b.observedAt ? -1 : 0).map((e) => e.eventId);
27907
+ const newSorted = dedupedEvents.filter((e) => !isSelfTraffic(e)).sort((a, b) => a.observedAt < b.observedAt ? 1 : a.observedAt > b.observedAt ? -1 : 0).map((e) => e.eventId);
27876
27908
  const merged = [];
27877
27909
  const mergedSet = /* @__PURE__ */ new Set();
27878
27910
  for (const id of [...newSorted, ...previousIds]) {
@@ -27885,6 +27917,7 @@ async function trafficRoutes(app, opts) {
27885
27917
  const report = buildTrafficProbeReport(dedupedEvents, { sampleLimit });
27886
27918
  finishedAt = (/* @__PURE__ */ new Date()).toISOString();
27887
27919
  pulledEventsCount = report.totals.normalizedEvents;
27920
+ selfTrafficExcludedCount = report.totals.selfTrafficExcluded;
27888
27921
  crawlerHitsCount = report.totals.crawlerHits;
27889
27922
  aiUserFetchHitsCount = report.totals.aiUserFetchHits;
27890
27923
  aiReferralHitsCount = report.totals.aiReferralHits;
@@ -28043,12 +28076,19 @@ async function trafficRoutes(app, opts) {
28043
28076
  entityType: "traffic_source",
28044
28077
  entityId: sourceRow.id
28045
28078
  });
28079
+ if (selfTrafficExcludedCount > 0) {
28080
+ request.log.info(
28081
+ { sourceId: sourceRow.id, selfTrafficExcluded: selfTrafficExcludedCount },
28082
+ "Dropped Canonry self-traffic before rollup; excluded from pulledEvents"
28083
+ );
28084
+ }
28046
28085
  try {
28047
28086
  opts.onTrafficSynced?.({
28048
28087
  status: "completed",
28049
28088
  sourceType: sourceRow.sourceType,
28050
28089
  sourceId: sourceRow.id,
28051
28090
  pulledEvents: pulledEventsCount,
28091
+ selfTrafficExcluded: selfTrafficExcludedCount,
28052
28092
  crawlerHits: crawlerHitsCount,
28053
28093
  aiUserFetchHits: aiUserFetchHitsCount,
28054
28094
  aiReferralHits: aiReferralHitsCount,
@@ -28061,6 +28101,7 @@ async function trafficRoutes(app, opts) {
28061
28101
  runId,
28062
28102
  syncedAt: finishedAt,
28063
28103
  pulledEvents: pulledEventsCount,
28104
+ selfTrafficExcluded: selfTrafficExcludedCount,
28064
28105
  crawlerHits: crawlerHitsCount,
28065
28106
  aiUserFetchHits: aiUserFetchHitsCount,
28066
28107
  aiReferralHits: aiReferralHitsCount,
@@ -28210,7 +28251,8 @@ async function trafficRoutes(app, opts) {
28210
28251
  startDate: chunkStartMs,
28211
28252
  endDate: chunkEndMs,
28212
28253
  pagesPerSubWindow: BACKFILL_MAX_PAGES,
28213
- maxSubWindows: VERCEL_MAX_SUB_WINDOWS
28254
+ maxSubWindows: VERCEL_MAX_SUB_WINDOWS,
28255
+ abortOnTruncation: true
28214
28256
  });
28215
28257
  if (drained.retentionClamped) {
28216
28258
  throw vercelRetentionClampError(chunkStartMs, drained.effectiveStartMs);
@@ -3454,6 +3454,8 @@ var trafficSyncResponseSchema = z24.object({
3454
3454
  runId: z24.string(),
3455
3455
  syncedAt: z24.string(),
3456
3456
  pulledEvents: z24.number().int().nonnegative(),
3457
+ /** Self-traffic events (Canonry's own tooling) dropped before rollup. */
3458
+ selfTrafficExcluded: z24.number().int().nonnegative(),
3457
3459
  crawlerHits: z24.number().int().nonnegative(),
3458
3460
  aiUserFetchHits: z24.number().int().nonnegative(),
3459
3461
  aiReferralHits: z24.number().int().nonnegative(),
@@ -8,7 +8,7 @@ import {
8
8
  loadConfig,
9
9
  loadConfigRaw,
10
10
  saveConfigPatch
11
- } from "./chunk-PITZUUFV.js";
11
+ } from "./chunk-WW6NOJTP.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-QU62IX7K.js";
96
+ } from "./chunk-EECLXA5D.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-URPUUKLC.js";
144
+ } from "./chunk-GWV4FKVY.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-AZDX2EBS.js");
5619
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-I5HMGDKS.js");
5620
5620
  const config = loadConfig();
5621
5621
  const db = createClient(config.database);
5622
5622
  migrate(db);
@@ -9987,6 +9987,7 @@ async function createServer(opts) {
9987
9987
  sourceType: event.sourceType,
9988
9988
  sourceId: event.sourceId,
9989
9989
  pulledEvents: event.pulledEvents,
9990
+ selfTrafficExcluded: event.selfTrafficExcluded,
9990
9991
  crawlerHits: event.crawlerHits,
9991
9992
  aiReferralHits: event.aiReferralHits,
9992
9993
  durationMs: event.durationMs
@@ -22,7 +22,7 @@ import {
22
22
  trafficConnectVercelRequestSchema,
23
23
  trafficConnectWordpressRequestSchema,
24
24
  trafficEventKindSchema
25
- } from "./chunk-URPUUKLC.js";
25
+ } from "./chunk-GWV4FKVY.js";
26
26
 
27
27
  // src/config.ts
28
28
  import fs from "fs";
package/dist/cli.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  setTelemetrySource,
28
28
  showFirstRunNotice,
29
29
  trackEvent
30
- } from "./chunk-4FLI5VSQ.js";
30
+ } from "./chunk-UNDLLHDV.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-PITZUUFV.js";
46
+ } from "./chunk-WW6NOJTP.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-QU62IX7K.js";
54
+ } from "./chunk-EECLXA5D.js";
55
55
  import {
56
56
  CcReleaseSyncStatuses,
57
57
  CheckScopes,
@@ -67,7 +67,7 @@ import {
67
67
  notificationEventSchema,
68
68
  providerQuotaPolicySchema,
69
69
  resolveProviderInput
70
- } from "./chunk-URPUUKLC.js";
70
+ } from "./chunk-GWV4FKVY.js";
71
71
 
72
72
  // src/cli.ts
73
73
  import { pathToFileURL } from "url";
@@ -3700,6 +3700,9 @@ async function trafficSync(project, opts) {
3700
3700
  console.log(` Run ID: ${result.runId}`);
3701
3701
  console.log(` Window: ${result.windowStart} \u2192 ${result.windowEnd}`);
3702
3702
  console.log(` Pulled events: ${result.pulledEvents}`);
3703
+ if (result.selfTrafficExcluded > 0) {
3704
+ console.log(` Self-traffic excl: ${result.selfTrafficExcluded} (Canonry's own tooling, dropped before rollup)`);
3705
+ }
3703
3706
  console.log(` Crawler hits: ${result.crawlerHits} (${result.crawlerBucketRows} hourly bucket${result.crawlerBucketRows === 1 ? "" : "s"})`);
3704
3707
  console.log(` AI referral hits: ${result.aiReferralHits} (${result.aiReferralBucketRows} hourly bucket${result.aiReferralBucketRows === 1 ? "" : "s"})`);
3705
3708
  console.log(` Unknown hits: ${result.unknownHits}`);
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-4FLI5VSQ.js";
3
+ } from "./chunk-UNDLLHDV.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-PITZUUFV.js";
7
- import "./chunk-QU62IX7K.js";
8
- import "./chunk-URPUUKLC.js";
6
+ } from "./chunk-WW6NOJTP.js";
7
+ import "./chunk-EECLXA5D.js";
8
+ import "./chunk-GWV4FKVY.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-QU62IX7K.js";
4
- import "./chunk-URPUUKLC.js";
3
+ } from "./chunk-EECLXA5D.js";
4
+ import "./chunk-GWV4FKVY.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-PITZUUFV.js";
7
- import "./chunk-URPUUKLC.js";
6
+ } from "./chunk-WW6NOJTP.js";
7
+ import "./chunk-GWV4FKVY.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.62.0",
3
+ "version": "4.62.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-client": "0.0.0",
65
- "@ainyc/canonry-api-routes": "0.0.0",
66
- "@ainyc/canonry-config": "0.0.0",
65
+ "@ainyc/canonry-contracts": "0.0.0",
67
66
  "@ainyc/canonry-db": "0.0.0",
68
67
  "@ainyc/canonry-integration-bing": "0.0.0",
69
- "@ainyc/canonry-contracts": "0.0.0",
70
68
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
69
+ "@ainyc/canonry-config": "0.0.0",
70
+ "@ainyc/canonry-api-routes": "0.0.0",
71
71
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
72
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
72
+ "@ainyc/canonry-integration-google": "0.0.0",
73
73
  "@ainyc/canonry-integration-google-places": "0.0.0",
74
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
74
75
  "@ainyc/canonry-integration-traffic": "0.0.0",
75
76
  "@ainyc/canonry-integration-wordpress": "0.0.0",
76
- "@ainyc/canonry-integration-google": "0.0.0",
77
- "@ainyc/canonry-provider-gemini": "0.0.0",
78
77
  "@ainyc/canonry-intelligence": "0.0.0",
79
- "@ainyc/canonry-provider-claude": "0.0.0",
80
- "@ainyc/canonry-provider-local": "0.0.0",
81
- "@ainyc/canonry-provider-perplexity": "0.0.0",
82
78
  "@ainyc/canonry-provider-cdp": "0.0.0",
83
- "@ainyc/canonry-provider-openai": "0.0.0"
79
+ "@ainyc/canonry-provider-gemini": "0.0.0",
80
+ "@ainyc/canonry-provider-local": "0.0.0",
81
+ "@ainyc/canonry-provider-claude": "0.0.0",
82
+ "@ainyc/canonry-provider-openai": "0.0.0",
83
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
84
84
  },
85
85
  "scripts": {
86
86
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",