@canonry/canonry 7.6.0 → 7.8.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 (35) hide show
  1. package/assets/agent-workspace/skills/aero/SKILL.md +70 -6
  2. package/assets/agent-workspace/skills/aero/references/agent-operations.md +4 -1
  3. package/assets/agent-workspace/skills/aero/references/portfolio-analysis.md +15 -7
  4. package/assets/agent-workspace/skills/canonry/SKILL.md +4 -1
  5. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +2 -2
  6. package/assets/assets/{AuditHistoryPanel-DZbPVuDn.js → AuditHistoryPanel-AJlkzSmq.js} +1 -1
  7. package/assets/assets/{BacklinksPage-6iPxcQdF.js → BacklinksPage-IhPtSh39.js} +1 -1
  8. package/assets/assets/{HistoryPage-DQ4gqs5s.js → HistoryPage-B-vNinvd.js} +1 -1
  9. package/assets/assets/{MeasurementPropertyPage-X4EGa3a5.js → MeasurementPropertyPage-s1kKo2TD.js} +1 -1
  10. package/assets/assets/{ProjectPage-qvbLROZz.js → ProjectPage-iH_9g_lU.js} +1 -1
  11. package/assets/assets/{RunsPage-DBfy79uf.js → RunsPage-BSbEUlNZ.js} +1 -1
  12. package/assets/assets/{SettingsPage-BlNafKGd.js → SettingsPage-zHyljW2M.js} +1 -1
  13. package/assets/assets/SiteHealthSection-AYGPjoka.js +4 -0
  14. package/assets/assets/{TrafficPage-CPZWDxjp.js → TrafficPage-CY_qggoW.js} +1 -1
  15. package/assets/assets/{TrafficSourceDetailPage-BIhpWiRg.js → TrafficSourceDetailPage-aJ2Vk6Pd.js} +1 -1
  16. package/assets/assets/{extract-error-message-C9XX_kMH.js → extract-error-message-CHEe8sOP.js} +1 -1
  17. package/assets/assets/index-DfamSNSD.js +86 -0
  18. package/assets/assets/{react-sigma_core.esm.min-FTRP6jVQ.js → react-sigma_core.esm.min-2sZRqoN4.js} +1 -1
  19. package/assets/assets/{v2-overview-adapter-DEuH0zoM.js → v2-overview-adapter-ZNgNU_Yp.js} +1 -1
  20. package/assets/index.html +1 -1
  21. package/dist/{chunk-HXAGDOYV.js → chunk-AAMKTL6B.js} +3 -3
  22. package/dist/{chunk-WO7XJJHH.js → chunk-DO7XPDG5.js} +5977 -5742
  23. package/dist/{chunk-FRSGZYQZ.js → chunk-KRFTA4I7.js} +1129 -477
  24. package/dist/{chunk-BLHPFAR6.js → chunk-L35TGPAV.js} +458 -161
  25. package/dist/{chunk-7FJZCG7A.js → chunk-LO56QXPO.js} +5 -4
  26. package/dist/{chunk-P72CWNTU.js → chunk-T2V2PESH.js} +4 -3
  27. package/dist/{chunk-B7IT47FE.js → chunk-ZLB7WX5D.js} +26 -33
  28. package/dist/cli.js +67 -28
  29. package/dist/{demo-server-Z7NM6DJT.js → demo-server-KDMG3APY.js} +4 -4
  30. package/dist/index.js +6 -6
  31. package/dist/{intelligence-service-P7AOOXLZ.js → intelligence-service-LAXJFE3U.js} +2 -2
  32. package/dist/mcp.js +4 -4
  33. package/package.json +8 -8
  34. package/assets/assets/SiteHealthSection-79l2PnfR.js +0 -4
  35. package/assets/assets/index-CUQtRdIf.js +0 -86
package/dist/cli.js CHANGED
@@ -32,11 +32,11 @@ import {
32
32
  trackCliCommandFinished,
33
33
  trackEvent,
34
34
  waitForServerRuntimeStartup
35
- } from "./chunk-BLHPFAR6.js";
35
+ } from "./chunk-L35TGPAV.js";
36
36
  import {
37
37
  autoSyncSkills,
38
38
  formatAutoSyncNotice
39
- } from "./chunk-HXAGDOYV.js";
39
+ } from "./chunk-AAMKTL6B.js";
40
40
  import {
41
41
  configExists,
42
42
  createApiClient,
@@ -53,13 +53,13 @@ import {
53
53
  saveConfig,
54
54
  saveConfigPatch,
55
55
  shouldPrintServeSkillsNudge
56
- } from "./chunk-7FJZCG7A.js";
56
+ } from "./chunk-LO56QXPO.js";
57
57
  import {
58
58
  DEFAULT_DEMO_TRUSTED_PROXIES,
59
59
  trustedProxiesProblem,
60
60
  trustedProxyProblem
61
61
  } from "./chunk-RB2F4D3Z.js";
62
- import "./chunk-P72CWNTU.js";
62
+ import "./chunk-T2V2PESH.js";
63
63
  import {
64
64
  CliError,
65
65
  EXIT_SYSTEM_ERROR,
@@ -71,7 +71,7 @@ import {
71
71
  runMeasurementDraftAction,
72
72
  systemError,
73
73
  usageError
74
- } from "./chunk-B7IT47FE.js";
74
+ } from "./chunk-ZLB7WX5D.js";
75
75
  import {
76
76
  CLOUDFLARE_WORKER_BINDINGS,
77
77
  CLOUDFLARE_WORKER_GENERATED_MARKER,
@@ -100,7 +100,7 @@ import {
100
100
  querySnapshots,
101
101
  rawEventSamples,
102
102
  runs
103
- } from "./chunk-FRSGZYQZ.js";
103
+ } from "./chunk-KRFTA4I7.js";
104
104
  import {
105
105
  AdsDeliverySnapshotStatuses,
106
106
  AdsHistoricalCampaignRollupStatuses,
@@ -155,6 +155,7 @@ import {
155
155
  buildModelChangeNotice,
156
156
  canonicalizeGtmAccountId,
157
157
  canonicalizeGtmResourceSelection,
158
+ competitorLandscapeQuerySchema,
158
159
  computeCompetitorOverlap,
159
160
  contentTargetDismissRequestSchema,
160
161
  conversionTrackingContractWriteRequestSchema,
@@ -228,7 +229,7 @@ import {
228
229
  visibilityCompareSelectionSchema,
229
230
  visibilityReportRequestSchema,
230
231
  winnabilityClassSchema
231
- } from "./chunk-WO7XJJHH.js";
232
+ } from "./chunk-DO7XPDG5.js";
232
233
 
233
234
  // src/cli.ts
234
235
  import { pathToFileURL } from "url";
@@ -685,8 +686,8 @@ var SENTIMENT_CLI_COMMANDS = [
685
686
  },
686
687
  {
687
688
  path: ["sentiment", "compare"],
688
- usage: "canonry sentiment compare <project> --from-run-id <id> --to-run-id <id> [selection options] [--format json]",
689
- help: `${selectionHelp} Complete matched coverage and compatible evaluators are required for a directional verdict.`,
689
+ usage: "canonry sentiment compare <project> --from-run-id <id|previous-rated> --to-run-id <id> [selection options] [--format json]",
690
+ help: `${selectionHelp} Use --from-run-id previous-rated to resolve the preceding rated run in the selected scope. Self-comparisons are refused. Complete matched coverage and compatible evaluators are required for a directional verdict.`,
690
691
  options: { ...selectionOptions, "from-run-id": stringOption(), "to-run-id": stringOption() },
691
692
  run: (input) => compareSentiment(project(input, "compare"), parse(sentimentCompareRequestSchema, {
692
693
  ...selection(input),
@@ -778,7 +779,7 @@ function parseDemoTrustedProxies(values) {
778
779
  async function demoCommand(options) {
779
780
  const { host, port } = parseDemoListenOptions(options);
780
781
  const trustProxy = parseDemoTrustedProxies(options.trustProxy);
781
- const { createDemoServer } = await import("./demo-server-Z7NM6DJT.js");
782
+ const { createDemoServer } = await import("./demo-server-KDMG3APY.js");
782
783
  const app = await createDemoServer({ trustProxy });
783
784
  let stopping = false;
784
785
  const stop = () => {
@@ -1192,7 +1193,7 @@ No DB writes performed. Re-run without --dry-run to apply.`);
1192
1193
  }
1193
1194
  }
1194
1195
  async function backfillInsightsCommand(project2, opts) {
1195
- const { IntelligenceService } = await import("./intelligence-service-P7AOOXLZ.js");
1196
+ const { IntelligenceService } = await import("./intelligence-service-LAXJFE3U.js");
1196
1197
  const config = loadConfig();
1197
1198
  const db = createClient(config.database);
1198
1199
  migrate(db);
@@ -9246,7 +9247,8 @@ async function showCompetitorLandscape(project2, options) {
9246
9247
  ...options.model !== void 0 ? { model: options.model } : {},
9247
9248
  queryClass: options.queryClass,
9248
9249
  location: options.location,
9249
- runId: options.runId
9250
+ runId: options.runId,
9251
+ answers: options.answers
9250
9252
  });
9251
9253
  if (options.format === "json") {
9252
9254
  console.log(JSON.stringify(data, null, 2));
@@ -9324,7 +9326,7 @@ function printLandscapeRows(heading, rows, showSampleCount = false, context, que
9324
9326
  // src/cli-commands/competitor.ts
9325
9327
  var ADD_USAGE = "canonry competitor add <project> <domain...> [--alias <name>]... [--format json]";
9326
9328
  var ALIASES_USAGE = "canonry competitor aliases <project> <domain> [--set <name>]... [--add <name>]... [--remove <name>]... [--clear] [--format json]";
9327
- var LANDSCAPE_USAGE = "canonry competitor landscape <project> [--window 7d|30d|90d|all] [--group-key <key>|--scope all-markets] [--by-model] [--provider <provider> [--model <id>]] [--query-class all|branded|non-brand] [--location <label>] [--run-id <id>] [--format json|jsonl]";
9329
+ var LANDSCAPE_USAGE = "canonry competitor landscape <project> [--window 7d|30d|90d|all] [--group-key <key>|--scope all-markets] [--by-model] [--provider <provider> [--model <id>]] [--query-class all|branded|non-brand] [--answers all|not-mentioned] [--location <label>] [--run-id <id>] [--format json|jsonl]";
9328
9330
  function parseLandscapeScope(value) {
9329
9331
  if (value === void 0 || value === "") return void 0;
9330
9332
  if (value !== "all-markets") throw usageError(`--scope must be "all-markets" (got "${value}")`, {
@@ -9451,7 +9453,8 @@ Usage: ${ALIASES_USAGE}`, {
9451
9453
  model: stringOption(),
9452
9454
  "query-class": stringOption(),
9453
9455
  location: stringOption(),
9454
- "run-id": stringOption()
9456
+ "run-id": stringOption(),
9457
+ answers: stringOption()
9455
9458
  },
9456
9459
  run: async (input) => {
9457
9460
  const project2 = requireProject(input, "competitor.landscape", LANDSCAPE_USAGE);
@@ -9471,7 +9474,10 @@ Usage: ${ALIASES_USAGE}`, {
9471
9474
  details: { command: "competitor.landscape", usage: LANDSCAPE_USAGE }
9472
9475
  });
9473
9476
  }
9477
+ const parsedAnswers = competitorLandscapeQuerySchema.safeParse({ answers: getString(input.values, "answers") });
9478
+ if (!parsedAnswers.success) throw usageError("--answers must be all or not-mentioned");
9474
9479
  await showCompetitorLandscape(project2, {
9480
+ answers: parsedAnswers.data.answers,
9475
9481
  window: getString(input.values, "window"),
9476
9482
  groupKey,
9477
9483
  scope,
@@ -11794,12 +11800,16 @@ async function runAdvancedMeasurementOperation(project2, operation, source, form
11794
11800
  advancedEmptyInputSchema.parse(input);
11795
11801
  result = await client.getMeasurementSetup(project2);
11796
11802
  break;
11797
- case "overview":
11798
- result = await client.getMeasurementOverview(project2, measurementOverviewQuerySchema.parse(input));
11803
+ case "overview": {
11804
+ const query = measurementOverviewQuerySchema.parse(input);
11805
+ result = await client.getMeasurementOverview(project2, { ...query, compact: typeof input === "object" && input !== null && "compact" in input ? query.compact : true });
11799
11806
  break;
11800
- case "portfolio-summary":
11801
- result = await client.getMeasurementPortfolioSummary(project2, measurementPortfolioSummaryQuerySchema.parse(input));
11807
+ }
11808
+ case "portfolio-summary": {
11809
+ const query = measurementPortfolioSummaryQuerySchema.parse(input);
11810
+ result = await client.getMeasurementPortfolioSummary(project2, { ...query, compact: typeof input === "object" && input !== null && "compact" in input ? query.compact : true });
11802
11811
  break;
11812
+ }
11803
11813
  case "property-questions":
11804
11814
  result = await client.getMeasurementPropertyQuestions(project2, measurementPropertyQuestionsQuerySchema.parse(input));
11805
11815
  break;
@@ -18491,12 +18501,16 @@ async function technicalAeoProgress(project2, opts) {
18491
18501
  console.log(lines.join("\n"));
18492
18502
  }
18493
18503
  async function technicalAeoCrawl(project2, opts) {
18494
- const crawl = await getClient27().getTechnicalAeoCrawl(project2, { runId: opts.runId });
18504
+ const crawl = await getClient27().getTechnicalAeoCrawl(project2, { runId: opts.runId, date: opts.date });
18495
18505
  if (isMachineFormat(opts.format)) {
18496
18506
  console.log(JSON.stringify(crawl, null, 2));
18497
18507
  return;
18498
18508
  }
18499
18509
  if (!crawl.hasCrawlData) {
18510
+ if (opts.date) {
18511
+ console.log([`No persisted site crawl for "${project2}" on ${opts.date}.`, ...availableScanDateLines(crawl.availableScanDates)].join("\n"));
18512
+ return;
18513
+ }
18500
18514
  console.log(`No persisted site crawl for "${project2}". Run \`canonry technical-aeo run ${project2}\` first.`);
18501
18515
  return;
18502
18516
  }
@@ -18507,6 +18521,7 @@ async function technicalAeoCrawl(project2, opts) {
18507
18521
  `Links: ${crawl.counts.edges} internal/external observations \xB7 ${crawl.counts.findings} findings`,
18508
18522
  `Dead links: ${formatDeadLinkState(crawl.deadLinks)}`
18509
18523
  ];
18524
+ lines.push(...inventorySummaryLines(crawl.inventorySummary));
18510
18525
  if (crawl.termination) lines.push(`Stopped: ${crawl.termination}`);
18511
18526
  console.log(lines.join("\n"));
18512
18527
  }
@@ -18618,6 +18633,21 @@ function partialCrawlNote(res) {
18618
18633
  if (!res.hasCrawlData || res.complete !== false) return null;
18619
18634
  return `Partial crawl (${res.termination ?? "incomplete"}): pages and links beyond the crawl budget were not observed, so a missing page or link is not proof it does not exist.`;
18620
18635
  }
18636
+ function availableScanDateLines(dates) {
18637
+ if (!dates) return [];
18638
+ return [
18639
+ `Known scan dates: ${dates.totalDates} distinct dates`,
18640
+ `Recent dates: ${dates.recentDates.join(", ") || "none"}`,
18641
+ `Same month and day: ${dates.matchingMonthDayDates.join(", ") || "none"} (${dates.matchingMonthDayTotal} distinct dates)`
18642
+ ];
18643
+ }
18644
+ function inventorySummaryLines(summary) {
18645
+ if (!summary) return [];
18646
+ return [
18647
+ `Stored canonical pages: ${summary.total} total \xB7 ${summary.eligible} eligible \xB7 ${summary.excluded} excluded`,
18648
+ ...summary.excludedReasons.map((reason) => `Excluded \xB7 ${reason.healthReason}: ${reason.pages}`)
18649
+ ];
18650
+ }
18621
18651
  async function technicalAeoCrawlPages(project2, opts) {
18622
18652
  const res = await getClient27().getTechnicalAeoCrawlPages(project2, opts);
18623
18653
  if (opts.format === "jsonl") {
@@ -18626,6 +18656,11 @@ async function technicalAeoCrawlPages(project2, opts) {
18626
18656
  project: project2,
18627
18657
  runId: res.runId,
18628
18658
  complete: res.complete,
18659
+ runSelection: res.runSelection,
18660
+ requestedDate: res.requestedDate,
18661
+ availableScanDates: res.availableScanDates,
18662
+ inventorySummary: res.inventorySummary,
18663
+ healthReasonCounts: res.healthReasonCounts,
18629
18664
  termination: res.termination,
18630
18665
  total: res.total,
18631
18666
  nextCursor: res.nextCursor
@@ -18638,14 +18673,16 @@ async function technicalAeoCrawlPages(project2, opts) {
18638
18673
  return;
18639
18674
  }
18640
18675
  const note = partialCrawlNote(res);
18676
+ const inventoryLines = inventorySummaryLines(res.inventorySummary);
18641
18677
  if (res.pages.length === 0) {
18642
- console.log([`No persisted crawl pages for "${project2}".`, ...note ? [note] : []].join("\n"));
18678
+ console.log([opts.date && !res.hasCrawlData ? `No persisted crawl pages for "${project2}" on ${opts.date}.` : `No persisted crawl pages for "${project2}".`, ...availableScanDateLines(res.availableScanDates), ...inventoryLines, ...note ? [note] : []].join("\n"));
18643
18679
  return;
18644
18680
  }
18645
18681
  const lines = [`${res.pages.length} of ${res.total} crawl page(s)${res.nextCursor ? " (more available)" : ""}:`, ""];
18646
- lines.push(`${"Depth".padStart(5)} ${"Score".padStart(5)} ${"Indexability".padEnd(15)} URL`);
18682
+ lines.push(...inventoryLines);
18683
+ lines.push(`${"Depth".padStart(5)} ${"Score".padStart(5)} ${"Page state".padEnd(21)} URL`);
18647
18684
  for (const page of res.pages) {
18648
- lines.push(`${String(page.depth ?? "-").padStart(5)} ${String(page.auditScore ?? "-").padStart(5)} ${page.indexabilityState.slice(0, 15).padEnd(15)} ${page.url}`);
18685
+ lines.push(`${String(page.depth ?? "-").padStart(5)} ${String(page.auditScore ?? "-").padStart(5)} ${(page.healthReason ?? page.healthState ?? page.indexabilityState).slice(0, 21).padEnd(21)} ${page.url}`);
18649
18686
  }
18650
18687
  if (res.nextCursor) lines.push(`
18651
18688
  Next cursor: ${res.nextCursor}`);
@@ -19003,12 +19040,12 @@ var TECHNICAL_AEO_CLI_COMMANDS_BASE = [
19003
19040
  },
19004
19041
  {
19005
19042
  path: ["technical-aeo", "crawl"],
19006
- usage: "canonry technical-aeo crawl <project> [--run-id <id>] [--format json]",
19007
- options: { "run-id": stringOption() },
19043
+ usage: "canonry technical-aeo crawl <project> [--run-id <id> | --date YYYY-MM-DD] [--format json]",
19044
+ options: { "run-id": stringOption(), date: stringOption() },
19008
19045
  run: async (input) => {
19009
- const usage = "canonry technical-aeo crawl <project> [--run-id <id>] [--format json]";
19046
+ const usage = "canonry technical-aeo crawl <project> [--run-id <id> | --date YYYY-MM-DD] [--format json]";
19010
19047
  const project2 = requireProject(input, "technical-aeo.crawl", usage);
19011
- await technicalAeoCrawl(project2, { runId: getString(input.values, "run-id"), format: input.format });
19048
+ await technicalAeoCrawl(project2, { runId: getString(input.values, "run-id"), date: getString(input.values, "date"), format: input.format });
19012
19049
  }
19013
19050
  },
19014
19051
  {
@@ -19148,9 +19185,10 @@ Usage: ${usage}`, {
19148
19185
  },
19149
19186
  {
19150
19187
  path: ["technical-aeo", "crawl-pages"],
19151
- usage: "canonry technical-aeo crawl-pages <project> [--run-id <id>] [--inventory-eligible true|false] [--fetch-state <state>] [--indexability-state <state>] [--audit-state <state>] [--sort url|path|score-asc|score-desc] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]",
19188
+ usage: "canonry technical-aeo crawl-pages <project> [--run-id <id> | --date YYYY-MM-DD] [--inventory-eligible true|false] [--fetch-state <state>] [--indexability-state <state>] [--audit-state <state>] [--sort url|path|score-asc|score-desc] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]",
19152
19189
  options: {
19153
19190
  "run-id": stringOption(),
19191
+ date: stringOption(),
19154
19192
  "inventory-eligible": stringOption(),
19155
19193
  "fetch-state": stringOption(),
19156
19194
  "indexability-state": stringOption(),
@@ -19160,7 +19198,7 @@ Usage: ${usage}`, {
19160
19198
  limit: stringOption()
19161
19199
  },
19162
19200
  run: async (input) => {
19163
- const usage = "canonry technical-aeo crawl-pages <project> [--run-id <id>] [--inventory-eligible true|false] [--fetch-state <state>] [--indexability-state <state>] [--audit-state <state>] [--sort url|path|score-asc|score-desc] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]";
19201
+ const usage = "canonry technical-aeo crawl-pages <project> [--run-id <id> | --date YYYY-MM-DD] [--inventory-eligible true|false] [--fetch-state <state>] [--indexability-state <state>] [--audit-state <state>] [--sort url|path|score-asc|score-desc] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]";
19164
19202
  const project2 = requireProject(input, "technical-aeo.crawl-pages", usage);
19165
19203
  const sort = getString(input.values, "sort");
19166
19204
  if (sort !== void 0 && !["url", "path", "score-asc", "score-desc"].includes(sort)) {
@@ -19172,6 +19210,7 @@ Usage: ${usage}`, {
19172
19210
  }
19173
19211
  await technicalAeoCrawlPages(project2, {
19174
19212
  runId: getString(input.values, "run-id"),
19213
+ date: getString(input.values, "date"),
19175
19214
  inventoryEligible: parseOptionalBoolean(input, "inventory-eligible", { command: "technical-aeo.crawl-pages", usage }),
19176
19215
  fetchState: getString(input.values, "fetch-state"),
19177
19216
  indexabilityState: getString(input.values, "indexability-state"),
@@ -5,11 +5,11 @@ import {
5
5
  computeFactorAverages,
6
6
  layoutSiteCrawlGraphInput,
7
7
  persistSiteCrawlGraphLayout
8
- } from "./chunk-P72CWNTU.js";
8
+ } from "./chunk-T2V2PESH.js";
9
9
  import {
10
10
  PACKAGE_VERSION,
11
11
  canonryMcpTools
12
- } from "./chunk-B7IT47FE.js";
12
+ } from "./chunk-ZLB7WX5D.js";
13
13
  import {
14
14
  HISTORY_WINDOW_RUNS,
15
15
  IntelligenceService,
@@ -83,7 +83,7 @@ import {
83
83
  siteCrawlPages,
84
84
  siteCrawlSnapshots,
85
85
  trafficSources
86
- } from "./chunk-FRSGZYQZ.js";
86
+ } from "./chunk-KRFTA4I7.js";
87
87
  import {
88
88
  RunKinds,
89
89
  SiteCrawlFetchStates,
@@ -112,7 +112,7 @@ import {
112
112
  roundPreservingTotal,
113
113
  siteAuditPageFactorSchema,
114
114
  wilsonInterval
115
- } from "./chunk-WO7XJJHH.js";
115
+ } from "./chunk-DO7XPDG5.js";
116
116
 
117
117
  // src/demo-server.ts
118
118
  import { dirname, join as join2 } from "path";
package/dist/index.js CHANGED
@@ -3,14 +3,14 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-BLHPFAR6.js";
6
+ } from "./chunk-L35TGPAV.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-7FJZCG7A.js";
10
- import "./chunk-P72CWNTU.js";
11
- import "./chunk-B7IT47FE.js";
12
- import "./chunk-FRSGZYQZ.js";
13
- import "./chunk-WO7XJJHH.js";
9
+ } from "./chunk-LO56QXPO.js";
10
+ import "./chunk-T2V2PESH.js";
11
+ import "./chunk-ZLB7WX5D.js";
12
+ import "./chunk-KRFTA4I7.js";
13
+ import "./chunk-DO7XPDG5.js";
14
14
  export {
15
15
  GoogleMarketingRuntimeError,
16
16
  createGoogleMarketingCredentialStore,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  HISTORY_WINDOW_RUNS,
3
3
  IntelligenceService
4
- } from "./chunk-FRSGZYQZ.js";
5
- import "./chunk-WO7XJJHH.js";
4
+ } from "./chunk-KRFTA4I7.js";
5
+ import "./chunk-DO7XPDG5.js";
6
6
  export {
7
7
  HISTORY_WINDOW_RUNS,
8
8
  IntelligenceService
package/dist/mcp.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-HXAGDOYV.js";
3
+ } from "./chunk-AAMKTL6B.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-7FJZCG7A.js";
8
- import "./chunk-B7IT47FE.js";
7
+ } from "./chunk-LO56QXPO.js";
8
+ import "./chunk-ZLB7WX5D.js";
9
9
  import {
10
10
  isReadOnlyKey,
11
11
  updateCheckEnvOptOut
12
- } from "./chunk-WO7XJJHH.js";
12
+ } from "./chunk-DO7XPDG5.js";
13
13
 
14
14
  // src/mcp/cli.ts
15
15
  import { randomUUID } from "crypto";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonry/canonry",
3
- "version": "7.6.0",
3
+ "version": "7.8.0",
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
  "keywords": [
@@ -86,23 +86,23 @@
86
86
  "tsup": "^8.5.1",
87
87
  "tsx": "^4.19.0",
88
88
  "@ainyc/canonry-web": "0.0.0",
89
- "@ainyc/canonry-api-client": "0.0.0",
90
89
  "@ainyc/canonry-api-routes": "0.0.0",
90
+ "@ainyc/canonry-api-client": "0.0.0",
91
+ "@ainyc/canonry-config": "0.0.0",
91
92
  "@ainyc/canonry-db": "0.0.0",
92
93
  "@ainyc/canonry-contracts": "0.0.0",
93
- "@ainyc/canonry-config": "0.0.0",
94
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
95
94
  "@ainyc/canonry-integration-bing": "0.0.0",
96
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
97
- "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
95
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
98
96
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
99
- "@ainyc/canonry-integration-google": "0.0.0",
97
+ "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
100
98
  "@ainyc/canonry-integration-google-ads": "0.0.0",
99
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
101
100
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
102
101
  "@ainyc/canonry-integration-google-places": "0.0.0",
103
102
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
104
- "@ainyc/canonry-integration-traffic": "0.0.0",
103
+ "@ainyc/canonry-integration-google": "0.0.0",
105
104
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
105
+ "@ainyc/canonry-integration-traffic": "0.0.0",
106
106
  "@ainyc/canonry-integration-wordpress": "0.0.0",
107
107
  "@ainyc/canonry-intelligence": "0.0.0",
108
108
  "@ainyc/canonry-provider-cdp": "0.0.0",