@canonry/canonry 4.133.2 → 4.134.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 +0 -13
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +25 -0
  3. package/assets/assets/{AuditHistoryPanel-CVDg3GXg.js → AuditHistoryPanel-DBUWbfNk.js} +1 -1
  4. package/assets/assets/{BacklinksPage-Dh4RIvS7.js → BacklinksPage-BFm0VdUO.js} +1 -1
  5. package/assets/assets/{ChartPrimitives-BK89G5H_.js → ChartPrimitives-oV_nduTH.js} +1 -1
  6. package/assets/assets/{HistoryPage-D8rMu_Js.js → HistoryPage-IF2FMem3.js} +1 -1
  7. package/assets/assets/{ProjectPage-CiTDveNK.js → ProjectPage-ClwxX9Ga.js} +2 -2
  8. package/assets/assets/{RunRow-DVOwbmTp.js → RunRow-De5zdch5.js} +1 -1
  9. package/assets/assets/{RunsPage-tz3Oil7N.js → RunsPage-xtRF78r8.js} +1 -1
  10. package/assets/assets/{SettingsPage-C698YidM.js → SettingsPage-B_GAxaWu.js} +1 -1
  11. package/assets/assets/{TrafficPage-XDXWMtey.js → TrafficPage-E8I5ineJ.js} +1 -1
  12. package/assets/assets/{TrafficSourceDetailPage-Clz8kOR8.js → TrafficSourceDetailPage-DGk2MqSp.js} +1 -1
  13. package/assets/assets/{arrow-left-GWLbh0pE.js → arrow-left-D-4QMxi9.js} +1 -1
  14. package/assets/assets/{extract-error-message-Dk8w-sb1.js → extract-error-message-DuqIFU8Z.js} +1 -1
  15. package/assets/assets/{index-jTshRRh0.js → index-De1MKbc7.js} +90 -90
  16. package/assets/assets/{trash-2-DwnzsuH1.js → trash-2-BVh__r6G.js} +1 -1
  17. package/assets/index.html +1 -1
  18. package/dist/{chunk-IEZTETUZ.js → chunk-LIXWDIDR.js} +787 -42
  19. package/dist/{chunk-ZPQX5ZQ2.js → chunk-PC7AYXND.js} +325 -2
  20. package/dist/{chunk-V2YR3YK6.js → chunk-TKXWTDV6.js} +73 -7
  21. package/dist/{chunk-JTJQZ4UC.js → chunk-ZUQPHGEN.js} +73 -2
  22. package/dist/cli.js +109 -4
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-WZNE23TV.js → intelligence-service-4XOFUN5E.js} +2 -2
  25. package/dist/mcp.js +2 -2
  26. package/package.json +10 -10
package/dist/cli.js CHANGED
@@ -29,7 +29,7 @@ import {
29
29
  setTelemetrySource,
30
30
  showFirstRunNotice,
31
31
  trackEvent
32
- } from "./chunk-V2YR3YK6.js";
32
+ } from "./chunk-TKXWTDV6.js";
33
33
  import {
34
34
  CliError,
35
35
  EXIT_SYSTEM_ERROR,
@@ -46,7 +46,7 @@ import {
46
46
  saveConfig,
47
47
  saveConfigPatch,
48
48
  usageError
49
- } from "./chunk-JTJQZ4UC.js";
49
+ } from "./chunk-ZUQPHGEN.js";
50
50
  import {
51
51
  apiKeys,
52
52
  createClient,
@@ -54,8 +54,11 @@ import {
54
54
  projects,
55
55
  queries,
56
56
  renderReportHtml
57
- } from "./chunk-IEZTETUZ.js";
57
+ } from "./chunk-LIXWDIDR.js";
58
58
  import {
59
+ AdsDeliverySnapshotStatuses,
60
+ AdsHistoricalCampaignRollupStatuses,
61
+ AdsLiveEntityTypes,
59
62
  AdsOperationKinds,
60
63
  AdsOperationStates,
61
64
  AdsOperationStepStates,
@@ -97,7 +100,7 @@ import {
97
100
  providerQuotaPolicySchema,
98
101
  resolveProviderInput,
99
102
  winnabilityClassSchema
100
- } from "./chunk-ZPQX5ZQ2.js";
103
+ } from "./chunk-PC7AYXND.js";
101
104
 
102
105
  // src/cli.ts
103
106
  import { pathToFileURL } from "url";
@@ -2690,6 +2693,12 @@ function printDetail(project, detail, format) {
2690
2693
  console.log(` ${query.query.slice(0, 58).padEnd(58)} ${query.status.padEnd(10)} ${cited.padEnd(5)} ${mentioned}`);
2691
2694
  if (query.error) console.log(` Error: ${query.error}`);
2692
2695
  if (query.answerText) console.log(` Answer: ${query.answerText}`);
2696
+ if (query.namedCompetitors.length > 0) {
2697
+ console.log(` Named competitors: ${query.namedCompetitors.join(", ")}`);
2698
+ }
2699
+ if (query.citedCompetitorDomains.length > 0) {
2700
+ console.log(` Cited competitor domains: ${query.citedCompetitorDomains.join(", ")}`);
2701
+ }
2693
2702
  if (query.groundingSources.length > 0) {
2694
2703
  console.log(" Sources:");
2695
2704
  for (const source of query.groundingSources) {
@@ -3381,6 +3390,73 @@ async function adsSummary(project, opts) {
3381
3390
  console.log(`Spend: ${formatMicros(result.totals.spendMicros, result.currencyCode ?? "USD")}${result.totals.cpcMicros != null ? ` (CPC ${formatMicros(result.totals.cpcMicros, result.currencyCode ?? "USD")})` : ""}`);
3382
3391
  console.log(`Last synced: ${result.lastSyncedAt ?? "never"}`);
3383
3392
  }
3393
+ async function adsDeliveryDiagnostics(project, opts) {
3394
+ const result = await getClient6().getAdsDeliveryDiagnostics(project);
3395
+ if (isMachineFormat(opts?.format)) {
3396
+ console.log(JSON.stringify(result, null, 2));
3397
+ return;
3398
+ }
3399
+ console.log(`Snapshot: ${result.snapshot.status}${result.snapshot.issue ? ` (${result.snapshot.issue})` : ""}`);
3400
+ console.log(`Source sync: ${result.snapshot.sourceSync ? `${result.snapshot.sourceSync.runId} [${result.snapshot.sourceSync.status}]` : "none"}`);
3401
+ console.log(`Structure: ${result.snapshot.campaignCount} campaigns / ${result.snapshot.adGroupCount} ad groups / ${result.snapshot.adCount} ads`);
3402
+ console.log(`Last synced: ${result.snapshot.lastSyncedAt ?? "never"}`);
3403
+ console.log(`Activity: ${result.assessment.state}`);
3404
+ if (result.historicalCampaignRollups.status === AdsHistoricalCampaignRollupStatuses.reported && result.historicalCampaignRollups.totals !== null) {
3405
+ console.log(`Historical: ${result.historicalCampaignRollups.totals.impressions} impressions / ${result.historicalCampaignRollups.totals.clicks} clicks (${result.historicalCampaignRollups.window.from} \u2192 ${result.historicalCampaignRollups.window.to})`);
3406
+ } else {
3407
+ console.log("Historical: no stored campaign rollups");
3408
+ }
3409
+ console.log("Evidence: stored snapshot and historical rollups only; not an OpenAI eligibility or serving verdict.");
3410
+ if (result.snapshot.status !== AdsDeliverySnapshotStatuses.complete) {
3411
+ console.log("Structure details suppressed until a complete trusted snapshot exists.");
3412
+ return;
3413
+ }
3414
+ for (const campaign of result.storedConfiguration.campaigns) {
3415
+ const budget = campaign.dailySpendLimitMicros !== null ? `${formatMicros(campaign.dailySpendLimitMicros)}/day` : campaign.lifetimeSpendLimitMicros !== null ? `${formatMicros(campaign.lifetimeSpendLimitMicros)} lifetime` : "no stored budget";
3416
+ console.log(`${campaign.name} [${campaign.status}] \u2014 ${campaign.biddingType ?? "unknown bidding"}, ${budget}, ${campaign.conversionEventSettingIds.length} conversion settings`);
3417
+ for (const group of campaign.adGroups) {
3418
+ const bid = group.maxBidMicros === null ? "no stored max bid" : `max bid ${formatMicros(group.maxBidMicros)}`;
3419
+ console.log(` - ${group.name} [${group.status}] \u2014 ${group.billingEventType ?? "unknown billing"}, ${bid}, ${group.contextHints.length} context hints`);
3420
+ for (const ad of group.ads) console.log(` ${ad.name} [${ad.status}] review=${ad.reviewStatus ?? "unknown"}`);
3421
+ }
3422
+ }
3423
+ }
3424
+ async function adsLiveDelivery(project, opts) {
3425
+ const result = await getClient6().getAdsLiveDelivery(project, {
3426
+ campaignId: opts?.campaignId,
3427
+ lookbackDays: opts?.lookbackDays
3428
+ });
3429
+ if (isMachineFormat(opts?.format)) {
3430
+ console.log(JSON.stringify(result, null, 2));
3431
+ return;
3432
+ }
3433
+ console.log(`Read at: ${result.fetchedAt} (live provider read)`);
3434
+ console.log(`Ad account: ${result.adAccountId}`);
3435
+ console.log(`Snapshot: last synced ${result.storedSnapshotSyncedAt ?? "never"}`);
3436
+ console.log(`Metrics: last ${result.metricsWindow.lookbackDays}d, as the provider reported them`);
3437
+ console.log(`Provider: ${result.bounds.readerCalls}/${result.bounds.maxReaderCalls} reader calls, up to ${result.bounds.maxUpstreamHttpRequests} upstream HTTP requests${result.bounds.truncated ? " (TRUNCATED, walk hit a cap)" : ""}`);
3438
+ console.log(`Drift: ${result.drift.driftedEntities}/${result.drift.entitiesCompared} entities (${result.drift.statusDrifted} status, ${result.drift.metricsDrifted} metrics)`);
3439
+ for (const failure of result.errors) {
3440
+ console.log(`Read failed: ${failure.surface}${failure.entityId ? ` ${failure.entityId}` : ""}${failure.upstreamStatus === null ? "" : ` [HTTP ${failure.upstreamStatus}]`}`);
3441
+ }
3442
+ for (const entity of result.entities) {
3443
+ const indent = entity.entityType === AdsLiveEntityTypes.campaign ? "" : entity.entityType === AdsLiveEntityTypes.ad_group ? " " : " ";
3444
+ const label = entity.live?.name ?? entity.stored?.name ?? entity.id;
3445
+ const liveStatus = entity.live === null ? "absent upstream" : entity.live.status;
3446
+ const storedStatus = entity.stored === null ? "absent locally" : entity.stored.status;
3447
+ const marker = entity.drifted ? "DRIFT" : "match";
3448
+ console.log(`${indent}${label} [${entity.entityType}]: live ${liveStatus} / stored ${storedStatus} (${marker})`);
3449
+ for (const delta of entity.fieldDeltas) {
3450
+ console.log(`${indent} ${delta.field}: live ${delta.live ?? "none"} / stored ${delta.stored ?? "none"}`);
3451
+ }
3452
+ for (const delta of entity.metricDeltas ?? []) {
3453
+ if (!delta.drifted) continue;
3454
+ const live = delta.live === null ? "no provider row" : `${delta.live.impressions} impr / ${delta.live.clicks} clicks / ${formatMicros(delta.live.spendMicros)}`;
3455
+ const stored = delta.stored === null ? "no stored row" : `${delta.stored.impressions} impr / ${delta.stored.clicks} clicks / ${formatMicros(delta.stored.spendMicros)}`;
3456
+ console.log(`${indent} ${delta.date}: live ${live} / stored ${stored}`);
3457
+ }
3458
+ }
3459
+ }
3384
3460
 
3385
3461
  // src/cli-commands/ads.ts
3386
3462
  var ADS_CLI_COMMANDS = [
@@ -3736,6 +3812,35 @@ Usage: ${usage}`, {
3736
3812
  const project = requireProject(input, "ads.summary", "canonry ads summary <project> [--format json]");
3737
3813
  await adsSummary(project, { format: input.format });
3738
3814
  }
3815
+ },
3816
+ {
3817
+ path: ["ads", "live-delivery"],
3818
+ usage: "canonry ads live-delivery <project> [--campaign <id>] [--lookback-days <n>] [--format json]",
3819
+ options: {
3820
+ campaign: stringOption(),
3821
+ "lookback-days": stringOption()
3822
+ },
3823
+ run: async (input) => {
3824
+ const usage = "canonry ads live-delivery <project> [--campaign <id>] [--lookback-days <n>] [--format json]";
3825
+ const project = requireProject(input, "ads.live-delivery", usage);
3826
+ await adsLiveDelivery(project, {
3827
+ campaignId: getString(input.values, "campaign"),
3828
+ lookbackDays: parseIntegerOption(input, "lookback-days", {
3829
+ command: "ads.live-delivery",
3830
+ message: "--lookback-days must be an integer from 1 to 30",
3831
+ usage
3832
+ }),
3833
+ format: input.format
3834
+ });
3835
+ }
3836
+ },
3837
+ {
3838
+ path: ["ads", "delivery-diagnostics"],
3839
+ usage: "canonry ads delivery-diagnostics <project> [--format json]",
3840
+ run: async (input) => {
3841
+ const project = requireProject(input, "ads.delivery-diagnostics", "canonry ads delivery-diagnostics <project> [--format json]");
3842
+ await adsDeliveryDiagnostics(project, { format: input.format });
3843
+ }
3739
3844
  }
3740
3845
  ];
3741
3846
 
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-V2YR3YK6.js";
3
+ } from "./chunk-TKXWTDV6.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-JTJQZ4UC.js";
7
- import "./chunk-IEZTETUZ.js";
8
- import "./chunk-ZPQX5ZQ2.js";
6
+ } from "./chunk-ZUQPHGEN.js";
7
+ import "./chunk-LIXWDIDR.js";
8
+ import "./chunk-PC7AYXND.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-IEZTETUZ.js";
4
- import "./chunk-ZPQX5ZQ2.js";
3
+ } from "./chunk-LIXWDIDR.js";
4
+ import "./chunk-PC7AYXND.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-JTJQZ4UC.js";
6
+ } from "./chunk-ZUQPHGEN.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-ZPQX5ZQ2.js";
9
+ } from "./chunk-PC7AYXND.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.133.2",
3
+ "version": "4.134.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",
@@ -68,24 +68,24 @@
68
68
  "@ainyc/canonry-api-client": "0.0.0",
69
69
  "@ainyc/canonry-api-routes": "0.0.0",
70
70
  "@ainyc/canonry-config": "0.0.0",
71
- "@ainyc/canonry-contracts": "0.0.0",
72
71
  "@ainyc/canonry-db": "0.0.0",
72
+ "@ainyc/canonry-contracts": "0.0.0",
73
73
  "@ainyc/canonry-integration-bing": "0.0.0",
74
74
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
75
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
76
- "@ainyc/canonry-integration-google": "0.0.0",
77
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
78
75
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
76
+ "@ainyc/canonry-integration-google": "0.0.0",
79
77
  "@ainyc/canonry-integration-google-places": "0.0.0",
80
- "@ainyc/canonry-integration-wordpress": "0.0.0",
78
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
81
79
  "@ainyc/canonry-integration-traffic": "0.0.0",
80
+ "@ainyc/canonry-integration-wordpress": "0.0.0",
81
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
82
82
  "@ainyc/canonry-provider-cdp": "0.0.0",
83
- "@ainyc/canonry-intelligence": "0.0.0",
84
83
  "@ainyc/canonry-provider-claude": "0.0.0",
85
- "@ainyc/canonry-provider-gemini": "0.0.0",
86
84
  "@ainyc/canonry-provider-local": "0.0.0",
87
- "@ainyc/canonry-provider-perplexity": "0.0.0",
88
- "@ainyc/canonry-provider-openai": "0.0.0"
85
+ "@ainyc/canonry-provider-gemini": "0.0.0",
86
+ "@ainyc/canonry-intelligence": "0.0.0",
87
+ "@ainyc/canonry-provider-openai": "0.0.0",
88
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
89
89
  },
90
90
  "scripts": {
91
91
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",