@canonry/canonry 7.9.0 → 7.10.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 (29) hide show
  1. package/assets/assets/{AuditHistoryPanel-D0nukTwD.js → AuditHistoryPanel-BgcvPo6g.js} +1 -1
  2. package/assets/assets/{BacklinksPage-B525ij0g.js → BacklinksPage-DZ4tauAs.js} +1 -1
  3. package/assets/assets/{HistoryPage-DvupqQDM.js → HistoryPage-DWG52dz1.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-CwDbi1XN.js → MeasurementPropertyPage-DTx2iQLV.js} +1 -1
  5. package/assets/assets/{ProjectPage-DmZZ2C7q.js → ProjectPage-CCf70zbI.js} +1 -1
  6. package/assets/assets/{RunsPage-DHTvHcGm.js → RunsPage-B6MhRqxN.js} +1 -1
  7. package/assets/assets/{SettingsPage-BwAFzB7A.js → SettingsPage-Bxv7OSHT.js} +1 -1
  8. package/assets/assets/SiteHealthSection-C5x7oiFL.js +4 -0
  9. package/assets/assets/{TrafficPage-BOcXASAM.js → TrafficPage-C5gyQopi.js} +1 -1
  10. package/assets/assets/{TrafficSourceDetailPage-DTq0cN6g.js → TrafficSourceDetailPage-Dv2ZRNvN.js} +1 -1
  11. package/assets/assets/{extract-error-message-BOTDI6g5.js → extract-error-message-C5pr51ph.js} +1 -1
  12. package/assets/assets/{index-BLJfGYUw.js → index-BhXHm5nG.js} +3 -3
  13. package/assets/assets/{react-sigma_core.esm.min-BEBdJNtD.js → react-sigma_core.esm.min-P5bVaYly.js} +1 -1
  14. package/assets/assets/{v2-overview-adapter-BPZ-H3VY.js → v2-overview-adapter-QtI4xO_4.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-KRFTA4I7.js → chunk-52PHEGHT.js} +89 -50
  17. package/dist/{chunk-T2V2PESH.js → chunk-5ZBN3EEK.js} +2 -2
  18. package/dist/{chunk-DO7XPDG5.js → chunk-66DVP4DN.js} +9 -1
  19. package/dist/{chunk-NU62UT2S.js → chunk-FVMWUT2R.js} +122 -21
  20. package/dist/{chunk-AAMKTL6B.js → chunk-HL3C6Z7T.js} +3 -3
  21. package/dist/{chunk-LO56QXPO.js → chunk-IKXVLT4M.js} +2 -2
  22. package/dist/{chunk-ZLB7WX5D.js → chunk-VSZJVBVR.js} +1 -1
  23. package/dist/cli.js +9 -9
  24. package/dist/{demo-server-KDMG3APY.js → demo-server-WZIB4JKJ.js} +4 -4
  25. package/dist/index.js +6 -6
  26. package/dist/{intelligence-service-LAXJFE3U.js → intelligence-service-KC62A4X5.js} +2 -2
  27. package/dist/mcp.js +4 -4
  28. package/package.json +11 -11
  29. package/assets/assets/SiteHealthSection-hi54eSIt.js +0 -4
@@ -20,20 +20,20 @@ import {
20
20
  saveConfig,
21
21
  saveConfigPatch,
22
22
  sentimentInstallReadiness
23
- } from "./chunk-LO56QXPO.js";
23
+ } from "./chunk-IKXVLT4M.js";
24
24
  import {
25
25
  computeFactorAverages,
26
26
  deleteSiteCrawlGraphLayout,
27
27
  persistSiteCrawlGraphLayout,
28
28
  prepareSiteCrawlGraphLayout,
29
29
  recordedSharePct
30
- } from "./chunk-T2V2PESH.js";
30
+ } from "./chunk-5ZBN3EEK.js";
31
31
  import {
32
32
  CanonryMcpToolNames,
33
33
  CliError,
34
34
  PACKAGE_VERSION,
35
35
  canonryMcpTools
36
- } from "./chunk-ZLB7WX5D.js";
36
+ } from "./chunk-VSZJVBVR.js";
37
37
  import {
38
38
  CC_CACHE_DIR,
39
39
  DUCKDB_SPEC,
@@ -205,7 +205,7 @@ import {
205
205
  siteLivenessState,
206
206
  toAlertView,
207
207
  usageCounters
208
- } from "./chunk-KRFTA4I7.js";
208
+ } from "./chunk-52PHEGHT.js";
209
209
  import {
210
210
  AGENT_MEMORY_VALUE_MAX_BYTES,
211
211
  AGENT_NONE,
@@ -414,7 +414,7 @@ import {
414
414
  visibilityReportRequestSchema,
415
415
  winnabilityClassLabel,
416
416
  withRetry
417
- } from "./chunk-DO7XPDG5.js";
417
+ } from "./chunk-66DVP4DN.js";
418
418
 
419
419
  // src/runtime-context.ts
420
420
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -3543,6 +3543,7 @@ import { createRequire as createRequire3 } from "module";
3543
3543
  import crypto29 from "crypto";
3544
3544
  import fs9 from "fs";
3545
3545
  import path8 from "path";
3546
+ import { isIP } from "net";
3546
3547
  import { fileURLToPath as fileURLToPath3 } from "url";
3547
3548
  import { and as and23, eq as eq29 } from "drizzle-orm";
3548
3549
 
@@ -7872,7 +7873,7 @@ function nonBlank(value) {
7872
7873
  return trimmed ? trimmed : void 0;
7873
7874
  }
7874
7875
  function resolveBuildCommit(env = process.env) {
7875
- const embedded = true ? "c54a2244dca1abcb4657e792eaa6f89bb0d230d5" : void 0;
7876
+ const embedded = true ? "b8858fd6adad2abea13e838eab395ad7aef15323" : void 0;
7876
7877
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
7877
7878
  }
7878
7879
  function resolveInstanceIdentity(env = process.env) {
@@ -16465,7 +16466,7 @@ function partialLists(root) {
16465
16466
  if (uncounted.length === 1) {
16466
16467
  const index = uncounted[0];
16467
16468
  const key = lists[index][0];
16468
- const paged = cursorForList(object, path9, key, root) || typeof object.truncated === "boolean" || typeof object[`${key}Truncated`] === "boolean" || ["items", "rows", "results"].includes(key);
16469
+ const paged = object === root || cursorForList(object, path9, key, root) || typeof object.truncated === "boolean" || typeof object[`${key}Truncated`] === "boolean" || ["items", "rows", "results"].includes(key);
16469
16470
  if (paged) counts[index] = bareTotal(numbers);
16470
16471
  }
16471
16472
  for (const [index, [key, rows]] of lists.entries()) {
@@ -16746,12 +16747,12 @@ function projectionPath(path9) {
16746
16747
  const digest = createHash5("sha256").update(path9).digest("hex").slice(0, 12);
16747
16748
  return `${truncateUtf16(path9, 48)}...#${digest}${path9.slice(-24)}`;
16748
16749
  }
16749
- function boundedProjection(full) {
16750
+ function boundedProjection(full, partialRows, reserve = 0) {
16750
16751
  const value = JSON.parse(full);
16751
- const summary = {
16752
+ let summary = {
16752
16753
  droppedKeys: [],
16753
16754
  keptItems: {},
16754
- projection: "Only complete array rows and marked partial string prefixes are shown; omitted fields are not evidence. Never follow a cursor from a cut page; re-request the original cursor with a smaller limit."
16755
+ projection: partialRows ? "Array rows are complete unless slicedKeys or droppedKeys name a field inside one; sliced strings are partial prefixes and omitted fields are not evidence. Never follow a cursor from a cut page; re-request the original cursor with a smaller limit." : "Only complete array rows and marked partial string prefixes are shown; omitted fields are not evidence. Never follow a cursor from a cut page; re-request the original cursor with a smaller limit."
16755
16756
  };
16756
16757
  const skippedMetadata = () => {
16757
16758
  summary.moreMetadataEntries = (summary.moreMetadataEntries ?? 0) + 1;
@@ -16777,6 +16778,7 @@ function boundedProjection(full) {
16777
16778
  }
16778
16779
  if (dropped > summary.droppedKeys.length) summary.moreDroppedKeys = dropped - summary.droppedKeys.length;
16779
16780
  };
16781
+ const cutOwners = /* @__PURE__ */ new Set();
16780
16782
  const project = (input, budget, path9, owner, ownerPath = "") => {
16781
16783
  if (Array.isArray(input)) {
16782
16784
  const rows = [];
@@ -16784,11 +16786,26 @@ function boundedProjection(full) {
16784
16786
  for (const row of input) {
16785
16787
  const text = serializeResult(row);
16786
16788
  const cost = text.length + (rows.length > 0 ? 1 : 0);
16787
- if (used2 + cost > budget) break;
16788
- rows.push(text);
16789
- used2 += cost;
16789
+ if (used2 + cost <= budget) {
16790
+ rows.push(text);
16791
+ used2 += cost;
16792
+ continue;
16793
+ }
16794
+ if (partialRows && (rows.length === 0 || text.length > MAX_TOOL_RESULT_CHARS)) {
16795
+ const before = { summary: serializeResult(summary), dropped };
16796
+ const partial = project(row, budget - used2 - (rows.length > 0 ? 1 : 0), `${path9 || "items"}[${rows.length}]`);
16797
+ if (partial !== void 0 && partial !== "{}" && partial !== "[]") {
16798
+ partialRows.set(path9 || "items", rows.length);
16799
+ rows.push(partial);
16800
+ } else {
16801
+ summary = JSON.parse(before.summary);
16802
+ dropped = before.dropped;
16803
+ }
16804
+ }
16805
+ break;
16790
16806
  }
16791
16807
  if (rows.length < input.length) {
16808
+ if (partialRows && owner) cutOwners.add(owner);
16792
16809
  record2(summary.keptItems, path9 || "items", `${rows.length} of ${input.length}`);
16793
16810
  if (rows.length === 0) omit(path9 || "items");
16794
16811
  if (owner) {
@@ -16812,9 +16829,8 @@ function boundedProjection(full) {
16812
16829
  omit(path9 || "(root)");
16813
16830
  return void 0;
16814
16831
  }
16815
- const fields = Object.entries(input).filter(([key]) => !key.startsWith("__"));
16816
- const priority = ([key, child]) => key === "queryPage" && isRecord5(child) ? 0 : typeof child === "string" && child.length > budget ? 2 : Number(typeof child === "object" && child !== null);
16817
- fields.sort((a, b) => priority(a) - priority(b));
16832
+ const priority = ([key, child]) => key === "queryPage" && isRecord5(child) ? 0 : typeof child === "string" && child.length > budget ? 2 : typeof child !== "object" || child === null ? 0 : partialRows && serializeResult(child).length > budget ? 2 : 1;
16833
+ const fields = Object.entries(input).filter(([key]) => !key.startsWith("__")).map((field) => ({ field, rank: priority(field) })).sort((a, b) => a.rank - b.rank).map(({ field }) => field);
16818
16834
  const shown2 = [];
16819
16835
  let used = 2;
16820
16836
  for (const [key, child] of fields) {
@@ -16830,17 +16846,40 @@ function boundedProjection(full) {
16830
16846
  shown2.push(prefix + text);
16831
16847
  used += prefix.length + text.length + (shown2.length > 1 ? 1 : 0);
16832
16848
  }
16849
+ if (path9 && cutOwners.has(input)) shown2.push('"__truncated":true');
16833
16850
  return `{${shown2.join(",")}}`;
16834
16851
  };
16835
- const projected = project(value, MAX_TOOL_RESULT_CHARS - PROJECTION_SUMMARY_CHARS, "");
16852
+ const projected = project(value, MAX_TOOL_RESULT_CHARS - PROJECTION_SUMMARY_CHARS - reserve, "");
16836
16853
  const shown = projected === void 0 ? {} : JSON.parse(projected);
16837
16854
  const output = isRecord5(shown) ? shown : { items: shown };
16838
- return serializeResult({ ...output, __truncated: true, [TRUNCATION_SUMMARY_KEY]: summary });
16839
- }
16840
- function truncateToolResult(details) {
16855
+ const result2 = { ...output, __truncated: true, [TRUNCATION_SUMMARY_KEY]: summary };
16856
+ return serializeResult(partialRows ? withPartialLists(result2) : result2);
16857
+ }
16858
+ function rowsShown(cut, path9) {
16859
+ if (path9.includes("[")) return Infinity;
16860
+ const list = path9.split(".").reduce((owner, key) => isRecord5(owner) ? owner[key] : void 0, cut);
16861
+ return Array.isArray(list) ? list.length : 0;
16862
+ }
16863
+ function withPartialRows(full, whole) {
16864
+ const rescued = /* @__PURE__ */ new Map();
16865
+ let partial = boundedProjection(full, rescued);
16866
+ if (!fitsCap(partial)) {
16867
+ const { [PARTIAL_LISTS_KEY]: lists, __pagination: pagination } = JSON.parse(partial);
16868
+ rescued.clear();
16869
+ partial = boundedProjection(full, rescued, serializeResult({ lists, pagination }).length);
16870
+ }
16871
+ if (!fitsCap(partial)) return whole;
16872
+ const cut = JSON.parse(whole);
16873
+ return [...rescued].some(([path9, index]) => rowsShown(cut, path9) <= index) ? partial : whole;
16874
+ }
16875
+ function truncateToolResult(details, options = {}) {
16841
16876
  const annotated = withPartialLists(details);
16842
16877
  const full = serializeResult(annotated);
16843
16878
  if (full.length <= MAX_TOOL_RESULT_CHARS) return full;
16879
+ const whole = truncateWholeRows(details, full);
16880
+ return options.partialRows ? withPartialRows(full, whole) : whole;
16881
+ }
16882
+ function truncateWholeRows(details, full) {
16844
16883
  if (full.length > MAX_STRUCTURED_TRUNCATION_CHARS) return boundedProjection(full);
16845
16884
  if (Array.isArray(details)) {
16846
16885
  const render2 = (rows) => serializeResult({
@@ -18140,7 +18179,8 @@ function adaptRemoteTool(client, tool) {
18140
18179
  }
18141
18180
  }
18142
18181
  return {
18143
- content: [{ type: "text", text: truncateToolResult(shown) }],
18182
+ // A fetched document can be one row larger than the cap; show it in part rather than not at all.
18183
+ content: [{ type: "text", text: truncateToolResult(shown, { partialRows: true }) }],
18144
18184
  details: result2,
18145
18185
  isError: isRemoteToolError(result2)
18146
18186
  };
@@ -21280,6 +21320,28 @@ function isLoopbackBindHost(host) {
21280
21320
  if (/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(normalized)) return true;
21281
21321
  return false;
21282
21322
  }
21323
+ function isAllowedHost(host, allowedHosts) {
21324
+ const normalized = host.trim().toLowerCase().replace(/^\[|\]$/g, "");
21325
+ return allowedHosts.has(normalized) || isIP(normalized) !== 0;
21326
+ }
21327
+ function buildAllowedHosts(bindHost, ...configuredUrls) {
21328
+ const allowed = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "::1"]);
21329
+ if (bindHost) {
21330
+ const normalized = bindHost.trim().toLowerCase().replace(/^\[|\]$/g, "");
21331
+ if (normalized && !isLoopbackBindHost(normalized)) {
21332
+ allowed.add(normalized);
21333
+ }
21334
+ }
21335
+ for (const configuredUrl of configuredUrls) {
21336
+ if (!configuredUrl) continue;
21337
+ try {
21338
+ const url = new URL(configuredUrl.trim());
21339
+ if (url.hostname) allowed.add(url.hostname.toLowerCase().replace(/^\[|\]$/g, ""));
21340
+ } catch {
21341
+ }
21342
+ }
21343
+ return allowed;
21344
+ }
21283
21345
  function resolveGooglePublicUrl(config, basePath) {
21284
21346
  const configured = config.publicUrl?.trim();
21285
21347
  if (configured) return configured;
@@ -21432,6 +21494,45 @@ async function createServer(opts) {
21432
21494
  genReqId: () => crypto29.randomUUID(),
21433
21495
  trustProxy
21434
21496
  });
21497
+ const allowedHosts = buildAllowedHosts(opts.host, opts.config.apiUrl, opts.config.publicUrl);
21498
+ const embedAllowedOrigins = new Set(
21499
+ (embed.allowedOrigins ?? []).map((o) => {
21500
+ try {
21501
+ return new URL(o).origin;
21502
+ } catch {
21503
+ return null;
21504
+ }
21505
+ }).filter((h) => h !== null)
21506
+ );
21507
+ app.addHook("onRequest", async (req, reply) => {
21508
+ const reject = (message) => {
21509
+ const error = forbidden(message);
21510
+ return reply.status(error.statusCode).send(error.toJSON());
21511
+ };
21512
+ const rawHostHeader = req.headers.host?.toLowerCase() ?? "";
21513
+ let requestUrl;
21514
+ try {
21515
+ requestUrl = new URL(`http://${rawHostHeader}`);
21516
+ } catch {
21517
+ return reject("Unexpected Host header");
21518
+ }
21519
+ if (!isAllowedHost(requestUrl.hostname, allowedHosts)) {
21520
+ return reject("Unexpected Host header");
21521
+ }
21522
+ const origin = req.headers.origin;
21523
+ if (origin) {
21524
+ let originUrl;
21525
+ try {
21526
+ originUrl = new URL(origin);
21527
+ } catch {
21528
+ return reject("Invalid Origin header");
21529
+ }
21530
+ const requestHost = req.headers.host?.toLowerCase() ?? "";
21531
+ if (originUrl.host !== requestHost && !embedAllowedOrigins.has(originUrl.origin)) {
21532
+ return reject("Cross-origin request refused");
21533
+ }
21534
+ }
21535
+ });
21435
21536
  const registry = new ProviderRegistry();
21436
21537
  const providers = opts.config.providers ?? {};
21437
21538
  if (opts.config.geminiApiKey && !providers.gemini) {
@@ -4,14 +4,14 @@ import {
4
4
  installSkills,
5
5
  loadConfigRaw,
6
6
  saveConfigPatch
7
- } from "./chunk-LO56QXPO.js";
7
+ } from "./chunk-IKXVLT4M.js";
8
8
  import {
9
9
  PACKAGE_VERSION
10
- } from "./chunk-ZLB7WX5D.js";
10
+ } from "./chunk-VSZJVBVR.js";
11
11
  import {
12
12
  SKILL_MANIFEST_FILENAME,
13
13
  SkillsClients
14
- } from "./chunk-DO7XPDG5.js";
14
+ } from "./chunk-66DVP4DN.js";
15
15
 
16
16
  // src/skills-autosync.ts
17
17
  import fs from "fs";
@@ -5,7 +5,7 @@ import {
5
5
  PACKAGE_VERSION,
6
6
  canonryMcpTools,
7
7
  isMachineFormat
8
- } from "./chunk-ZLB7WX5D.js";
8
+ } from "./chunk-VSZJVBVR.js";
9
9
  import {
10
10
  AGENT_PROVIDER_IDS,
11
11
  CANONRY_NPM_PACKAGE_URL,
@@ -50,7 +50,7 @@ import {
50
50
  skillsClientSchema,
51
51
  upgradeCaveatFor,
52
52
  upgradeCommandFor
53
- } from "./chunk-DO7XPDG5.js";
53
+ } from "./chunk-66DVP4DN.js";
54
54
 
55
55
  // src/config.ts
56
56
  import fs from "fs";
@@ -138,7 +138,7 @@ import {
138
138
  trafficSeriesGranularitySchema,
139
139
  visibilityCompareSelectionSchema,
140
140
  visibilityReportRequestSchema
141
- } from "./chunk-DO7XPDG5.js";
141
+ } from "./chunk-66DVP4DN.js";
142
142
 
143
143
  // src/cli-error.ts
144
144
  function isMachineFormat(format) {
package/dist/cli.js CHANGED
@@ -32,11 +32,11 @@ import {
32
32
  trackCliCommandFinished,
33
33
  trackEvent,
34
34
  waitForServerRuntimeStartup
35
- } from "./chunk-NU62UT2S.js";
35
+ } from "./chunk-FVMWUT2R.js";
36
36
  import {
37
37
  autoSyncSkills,
38
38
  formatAutoSyncNotice
39
- } from "./chunk-AAMKTL6B.js";
39
+ } from "./chunk-HL3C6Z7T.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-LO56QXPO.js";
56
+ } from "./chunk-IKXVLT4M.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-T2V2PESH.js";
62
+ import "./chunk-5ZBN3EEK.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-ZLB7WX5D.js";
74
+ } from "./chunk-VSZJVBVR.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-KRFTA4I7.js";
103
+ } from "./chunk-52PHEGHT.js";
104
104
  import {
105
105
  AdsDeliverySnapshotStatuses,
106
106
  AdsHistoricalCampaignRollupStatuses,
@@ -229,7 +229,7 @@ import {
229
229
  visibilityCompareSelectionSchema,
230
230
  visibilityReportRequestSchema,
231
231
  winnabilityClassSchema
232
- } from "./chunk-DO7XPDG5.js";
232
+ } from "./chunk-66DVP4DN.js";
233
233
 
234
234
  // src/cli.ts
235
235
  import { pathToFileURL } from "url";
@@ -779,7 +779,7 @@ function parseDemoTrustedProxies(values) {
779
779
  async function demoCommand(options) {
780
780
  const { host, port } = parseDemoListenOptions(options);
781
781
  const trustProxy = parseDemoTrustedProxies(options.trustProxy);
782
- const { createDemoServer } = await import("./demo-server-KDMG3APY.js");
782
+ const { createDemoServer } = await import("./demo-server-WZIB4JKJ.js");
783
783
  const app = await createDemoServer({ trustProxy });
784
784
  let stopping = false;
785
785
  const stop = () => {
@@ -1193,7 +1193,7 @@ No DB writes performed. Re-run without --dry-run to apply.`);
1193
1193
  }
1194
1194
  }
1195
1195
  async function backfillInsightsCommand(project2, opts) {
1196
- const { IntelligenceService } = await import("./intelligence-service-LAXJFE3U.js");
1196
+ const { IntelligenceService } = await import("./intelligence-service-KC62A4X5.js");
1197
1197
  const config = loadConfig();
1198
1198
  const db = createClient(config.database);
1199
1199
  migrate(db);
@@ -5,11 +5,11 @@ import {
5
5
  computeFactorAverages,
6
6
  layoutSiteCrawlGraphInput,
7
7
  persistSiteCrawlGraphLayout
8
- } from "./chunk-T2V2PESH.js";
8
+ } from "./chunk-5ZBN3EEK.js";
9
9
  import {
10
10
  PACKAGE_VERSION,
11
11
  canonryMcpTools
12
- } from "./chunk-ZLB7WX5D.js";
12
+ } from "./chunk-VSZJVBVR.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-KRFTA4I7.js";
86
+ } from "./chunk-52PHEGHT.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-DO7XPDG5.js";
115
+ } from "./chunk-66DVP4DN.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-NU62UT2S.js";
6
+ } from "./chunk-FVMWUT2R.js";
7
7
  import {
8
8
  loadConfig
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";
9
+ } from "./chunk-IKXVLT4M.js";
10
+ import "./chunk-5ZBN3EEK.js";
11
+ import "./chunk-VSZJVBVR.js";
12
+ import "./chunk-52PHEGHT.js";
13
+ import "./chunk-66DVP4DN.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-KRFTA4I7.js";
5
- import "./chunk-DO7XPDG5.js";
4
+ } from "./chunk-52PHEGHT.js";
5
+ import "./chunk-66DVP4DN.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-AAMKTL6B.js";
3
+ } from "./chunk-HL3C6Z7T.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-LO56QXPO.js";
8
- import "./chunk-ZLB7WX5D.js";
7
+ } from "./chunk-IKXVLT4M.js";
8
+ import "./chunk-VSZJVBVR.js";
9
9
  import {
10
10
  isReadOnlyKey,
11
11
  updateCheckEnvOptOut
12
- } from "./chunk-DO7XPDG5.js";
12
+ } from "./chunk-66DVP4DN.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.9.0",
3
+ "version": "7.10.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": [
@@ -88,30 +88,30 @@
88
88
  "@ainyc/canonry-web": "0.0.0",
89
89
  "@ainyc/canonry-api-client": "0.0.0",
90
90
  "@ainyc/canonry-contracts": "0.0.0",
91
- "@ainyc/canonry-config": "0.0.0",
92
91
  "@ainyc/canonry-db": "0.0.0",
92
+ "@ainyc/canonry-config": "0.0.0",
93
93
  "@ainyc/canonry-api-routes": "0.0.0",
94
94
  "@ainyc/canonry-integration-bing": "0.0.0",
95
- "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
96
- "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
97
95
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
98
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
96
+ "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
97
+ "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
99
98
  "@ainyc/canonry-integration-google-ads": "0.0.0",
100
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
101
- "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
99
+ "@ainyc/canonry-integration-google": "0.0.0",
100
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
102
101
  "@ainyc/canonry-integration-google-places": "0.0.0",
103
- "@ainyc/canonry-integration-openai-ads": "0.0.0",
102
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
104
103
  "@ainyc/canonry-integration-traffic": "0.0.0",
105
104
  "@ainyc/canonry-integration-wordpress": "0.0.0",
106
- "@ainyc/canonry-intelligence": "0.0.0",
105
+ "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
107
106
  "@ainyc/canonry-provider-cdp": "0.0.0",
107
+ "@ainyc/canonry-intelligence": "0.0.0",
108
108
  "@ainyc/canonry-provider-gemini": "0.0.0",
109
- "@ainyc/canonry-integration-google": "0.0.0",
110
109
  "@ainyc/canonry-provider-local": "0.0.0",
111
- "@ainyc/canonry-provider-muse": "0.0.0",
112
110
  "@ainyc/canonry-provider-claude": "0.0.0",
111
+ "@ainyc/canonry-provider-muse": "0.0.0",
113
112
  "@ainyc/canonry-provider-openai": "0.0.0",
114
113
  "@ainyc/canonry-provider-perplexity": "0.0.0",
114
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
115
115
  "@ainyc/canonry-integration-typesafe": "0.0.0"
116
116
  },
117
117
  "scripts": {