@canonry/canonry 4.164.0 → 4.165.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 (26) hide show
  1. package/README.md +120 -66
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +4 -1
  3. package/assets/assets/{AuditHistoryPanel-CD1GVkS9.js → AuditHistoryPanel-IYMElyK5.js} +1 -1
  4. package/assets/assets/{BacklinksPage-B0Ijhntp.js → BacklinksPage-BMqIPRvZ.js} +1 -1
  5. package/assets/assets/{HistoryPage-DIKtpT_z.js → HistoryPage-iuETLmwO.js} +1 -1
  6. package/assets/assets/{MeasurementPropertyPage-BfPwwIsT.js → MeasurementPropertyPage-BzNAaB8X.js} +1 -1
  7. package/assets/assets/{ProjectPage-3czWArKE.js → ProjectPage-DIzi4Ggo.js} +1 -1
  8. package/assets/assets/{RunRow-CHyd0gQH.js → RunRow-BkkYxEjl.js} +1 -1
  9. package/assets/assets/{RunsPage-Dujt0SQ5.js → RunsPage-DGTrqrTA.js} +1 -1
  10. package/assets/assets/{SettingsPage-CJE9Oeg9.js → SettingsPage-Cwb_Ft9u.js} +1 -1
  11. package/assets/assets/{SiteHealthSection-DvuvziPJ.js → SiteHealthSection-k4I71wfJ.js} +3 -3
  12. package/assets/assets/{TrafficPage-B0tru9ek.js → TrafficPage-C8nyb8l1.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-DshEUtQX.js → TrafficSourceDetailPage-ry7Da0pV.js} +1 -1
  14. package/assets/assets/{extract-error-message-O2dirpiH.js → extract-error-message-BYyBW07F.js} +1 -1
  15. package/assets/assets/{index-C_y0aGQL.js → index-rqOXhYwp.js} +13 -13
  16. package/assets/assets/{react-sigma_core.esm.min-sVSSzmzq.js → react-sigma_core.esm.min-BtG8TWTe.js} +1 -1
  17. package/assets/index.html +1 -1
  18. package/dist/{chunk-BFGHZ2GU.js → chunk-BU6C2DKF.js} +23 -0
  19. package/dist/{chunk-RULHNUBH.js → chunk-L5SMSDZB.js} +4 -4
  20. package/dist/{chunk-C4WKYU5C.js → chunk-QDOZEMDK.js} +29 -1
  21. package/dist/{chunk-GCQPFCP2.js → chunk-QKLNTSQ2.js} +161 -14
  22. package/dist/cli.js +46 -8
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-Z3XS2UXQ.js → intelligence-service-RDGUEEZQ.js} +2 -2
  25. package/dist/mcp.js +2 -2
  26. package/package.json +10 -10
package/dist/cli.js CHANGED
@@ -31,7 +31,7 @@ import {
31
31
  showFirstRunNotice,
32
32
  trackCliCommandFinished,
33
33
  trackEvent
34
- } from "./chunk-RULHNUBH.js";
34
+ } from "./chunk-L5SMSDZB.js";
35
35
  import {
36
36
  CliError,
37
37
  EXIT_SYSTEM_ERROR,
@@ -51,7 +51,7 @@ import {
51
51
  saveConfigPatch,
52
52
  systemError,
53
53
  usageError
54
- } from "./chunk-C4WKYU5C.js";
54
+ } from "./chunk-QDOZEMDK.js";
55
55
  import {
56
56
  CLOUDFLARE_WORKER_BINDINGS,
57
57
  CLOUDFLARE_WORKER_GENERATED_MARKER,
@@ -65,7 +65,7 @@ import {
65
65
  projects,
66
66
  queries,
67
67
  renderReportHtml
68
- } from "./chunk-GCQPFCP2.js";
68
+ } from "./chunk-QKLNTSQ2.js";
69
69
  import {
70
70
  AdsDeliverySnapshotStatuses,
71
71
  AdsHistoricalCampaignRollupStatuses,
@@ -129,7 +129,7 @@ import {
129
129
  providerQuotaPolicySchema,
130
130
  resolveProviderInput,
131
131
  winnabilityClassSchema
132
- } from "./chunk-BFGHZ2GU.js";
132
+ } from "./chunk-BU6C2DKF.js";
133
133
 
134
134
  // src/cli.ts
135
135
  import { pathToFileURL } from "url";
@@ -3941,12 +3941,42 @@ async function gaStatus(project, format) {
3941
3941
  console.log(` Last Synced: ${result.lastSyncedAt ?? "(never)"}`);
3942
3942
  console.log(` Connected: ${result.createdAt ?? "unknown"}`);
3943
3943
  }
3944
+ async function gaProperties(project, format) {
3945
+ const client = getClient7();
3946
+ const result = await client.gaProperties(project);
3947
+ if (format === "jsonl") {
3948
+ emitJsonl(result.properties.map((p) => ({ project, ...p })));
3949
+ return;
3950
+ }
3951
+ if (isMachineFormat(format)) {
3952
+ console.log(JSON.stringify(result, null, 2));
3953
+ return;
3954
+ }
3955
+ if (result.properties.length === 0) {
3956
+ console.log(`No GA4 properties visible to the connected account for "${project}".`);
3957
+ return;
3958
+ }
3959
+ console.log("Available GA4 properties:\n");
3960
+ const idWidth = Math.max(11, ...result.properties.map((p) => p.propertyId.length));
3961
+ const nameWidth = Math.max(12, ...result.properties.map((p) => p.displayName.length));
3962
+ console.log(` ${"PROPERTY ID".padEnd(idWidth)} ${"DISPLAY NAME".padEnd(nameWidth)} ACCOUNT`);
3963
+ console.log(` ${"\u2500".repeat(idWidth)} ${"\u2500".repeat(nameWidth)} ${"\u2500".repeat(12)}`);
3964
+ for (const p of result.properties) {
3965
+ console.log(` ${p.propertyId.padEnd(idWidth)} ${p.displayName.padEnd(nameWidth)} ${p.accountName}`);
3966
+ }
3967
+ console.log('\nUse "canonry ga connect <project> --property-id <id>" to select one.');
3968
+ }
3944
3969
  async function gaSync(project, opts) {
3945
3970
  const client = getClient7();
3946
3971
  const body = {};
3947
3972
  if (opts?.days) body.days = opts.days;
3948
3973
  if (opts?.only) body.only = opts.only;
3949
3974
  const result = await client.gaSync(project, body);
3975
+ if (result.clamped) {
3976
+ console.error(
3977
+ `Warning: requested ${result.requestedDays} days but synced ${result.days} \u2014 GA4's supported sync window bounded the request. Only ${result.days} days of history were written.`
3978
+ );
3979
+ }
3950
3980
  if (isMachineFormat(opts?.format)) {
3951
3981
  console.log(JSON.stringify(result, null, 2));
3952
3982
  return;
@@ -3958,7 +3988,7 @@ async function gaSync(project, opts) {
3958
3988
  console.log(` Page rows: ${result.rowCount}`);
3959
3989
  console.log(` AI rows: ${result.aiReferralCount}`);
3960
3990
  console.log(` Social rows: ${result.socialReferralCount}`);
3961
- console.log(` Period: ${result.days} days`);
3991
+ console.log(` Period: ${result.days} days${result.clamped ? ` (requested ${result.requestedDays})` : ""}`);
3962
3992
  console.log(` Synced at: ${result.syncedAt}`);
3963
3993
  }
3964
3994
  async function gaTraffic(project, opts) {
@@ -4501,14 +4531,14 @@ function rangeValues(values) {
4501
4531
  var GA_CLI_COMMANDS = [
4502
4532
  {
4503
4533
  path: ["ga", "connect"],
4504
- usage: "canonry ga connect <project> --property-id <id> --key-file <path> [--key-json <json>] [--format json]",
4534
+ usage: "canonry ga connect <project> --property-id <id> [--key-file <path>] [--key-json <json>] [--format json]",
4505
4535
  options: {
4506
4536
  "property-id": stringOption(),
4507
4537
  "key-file": stringOption(),
4508
4538
  "key-json": stringOption()
4509
4539
  },
4510
4540
  run: async (input) => {
4511
- const project = requireProject(input, "ga.connect", "canonry ga connect <project> --property-id <id> --key-file <path>");
4541
+ const project = requireProject(input, "ga.connect", "canonry ga connect <project> --property-id <id> [--key-file <path>]");
4512
4542
  const propertyId = getString(input.values, "property-id");
4513
4543
  if (!propertyId) {
4514
4544
  throw new Error("--property-id is required");
@@ -4529,6 +4559,14 @@ var GA_CLI_COMMANDS = [
4529
4559
  await gaDisconnect(project, input.format);
4530
4560
  }
4531
4561
  },
4562
+ {
4563
+ path: ["ga", "properties"],
4564
+ usage: "canonry ga properties <project> [--format json]",
4565
+ run: async (input) => {
4566
+ const project = requireProject(input, "ga.properties", "canonry ga properties <project> [--format json]");
4567
+ await gaProperties(project, input.format);
4568
+ }
4569
+ },
4532
4570
  {
4533
4571
  path: ["ga", "status"],
4534
4572
  usage: "canonry ga status <project> [--format json]",
@@ -4686,7 +4724,7 @@ var GA_CLI_COMMANDS = [
4686
4724
  unknownSubcommand(input.positionals[0], {
4687
4725
  command: "ga",
4688
4726
  usage: "canonry ga <subcommand> <project> [args]",
4689
- available: ["connect", "disconnect", "status", "sync", "measurement-analysis", "traffic", "coverage", "ai-referral-history", "ai-referral-daily", "social-referral-history", "session-history", "social-referral-summary", "attribution"]
4727
+ available: ["connect", "disconnect", "status", "properties", "sync", "measurement-analysis", "traffic", "coverage", "ai-referral-history", "ai-referral-daily", "social-referral-history", "session-history", "social-referral-summary", "attribution"]
4690
4728
  });
4691
4729
  }
4692
4730
  }
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-RULHNUBH.js";
3
+ } from "./chunk-L5SMSDZB.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-C4WKYU5C.js";
7
- import "./chunk-GCQPFCP2.js";
8
- import "./chunk-BFGHZ2GU.js";
6
+ } from "./chunk-QDOZEMDK.js";
7
+ import "./chunk-QKLNTSQ2.js";
8
+ import "./chunk-BU6C2DKF.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-GCQPFCP2.js";
4
- import "./chunk-BFGHZ2GU.js";
3
+ } from "./chunk-QKLNTSQ2.js";
4
+ import "./chunk-BU6C2DKF.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-C4WKYU5C.js";
6
+ } from "./chunk-QDOZEMDK.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-BFGHZ2GU.js";
9
+ } from "./chunk-BU6C2DKF.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": "@canonry/canonry",
3
- "version": "4.164.0",
3
+ "version": "4.165.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",
@@ -70,29 +70,29 @@
70
70
  "@types/node-cron": "^3.0.11",
71
71
  "tsup": "^8.5.1",
72
72
  "tsx": "^4.19.0",
73
- "@ainyc/canonry-api-client": "0.0.0",
74
73
  "@ainyc/canonry-api-routes": "0.0.0",
74
+ "@ainyc/canonry-api-client": "0.0.0",
75
75
  "@ainyc/canonry-config": "0.0.0",
76
76
  "@ainyc/canonry-contracts": "0.0.0",
77
77
  "@ainyc/canonry-db": "0.0.0",
78
78
  "@ainyc/canonry-integration-bing": "0.0.0",
79
79
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
80
80
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
81
- "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
82
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
83
81
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
82
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
83
+ "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
84
84
  "@ainyc/canonry-integration-google": "0.0.0",
85
+ "@ainyc/canonry-integration-google-places": "0.0.0",
86
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
85
87
  "@ainyc/canonry-integration-wordpress": "0.0.0",
86
- "@ainyc/canonry-intelligence": "0.0.0",
87
88
  "@ainyc/canonry-integration-traffic": "0.0.0",
88
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
89
- "@ainyc/canonry-integration-google-places": "0.0.0",
90
- "@ainyc/canonry-provider-cdp": "0.0.0",
89
+ "@ainyc/canonry-intelligence": "0.0.0",
91
90
  "@ainyc/canonry-provider-claude": "0.0.0",
91
+ "@ainyc/canonry-provider-local": "0.0.0",
92
92
  "@ainyc/canonry-provider-gemini": "0.0.0",
93
+ "@ainyc/canonry-provider-cdp": "0.0.0",
93
94
  "@ainyc/canonry-provider-openai": "0.0.0",
94
- "@ainyc/canonry-provider-perplexity": "0.0.0",
95
- "@ainyc/canonry-provider-local": "0.0.0"
95
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
96
96
  },
97
97
  "scripts": {
98
98
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",