@ainyc/canonry 4.188.4 → 4.189.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 (27) hide show
  1. package/assets/assets/{AuditHistoryPanel-Cn1xsaFZ.js → AuditHistoryPanel-CZ7ygQfy.js} +1 -1
  2. package/assets/assets/{BacklinksPage-CfTxBHZn.js → BacklinksPage-CYEYxjE8.js} +1 -1
  3. package/assets/assets/{HistoryPage-BvgKqrbW.js → HistoryPage-CvAllKzD.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-CGbNTIdz.js → MeasurementPropertyPage-BED9ak5a.js} +1 -1
  5. package/assets/assets/ProjectPage-Cgl5v16o.js +9 -0
  6. package/assets/assets/{RunRow-DzneLSnv.js → RunRow-DUlFaUBp.js} +1 -1
  7. package/assets/assets/{RunsPage-BgByi_t3.js → RunsPage-BcbBe_aQ.js} +1 -1
  8. package/assets/assets/{SettingsPage-DBv-GyPu.js → SettingsPage-gCyOuoD_.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-DaNslx5J.js → SiteHealthSection-DJfFmT3n.js} +3 -3
  10. package/assets/assets/{TrafficPage-B6mfVlPe.js → TrafficPage-2ATExz7V.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-BXwAVIDo.js → TrafficSourceDetailPage-0PBMk9UH.js} +1 -1
  12. package/assets/assets/{extract-error-message-DMJa2ku8.js → extract-error-message-D8N7K1pb.js} +1 -1
  13. package/assets/assets/index-Bhwxe6W_.js +86 -0
  14. package/assets/assets/{react-sigma_core.esm.min-DiTvmmQd.js → react-sigma_core.esm.min-CU1UA6VY.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-3HZELBZZ.js → chunk-CDI3YR57.js} +2587 -2569
  17. package/dist/{chunk-7NMMQ7QO.js → chunk-HG6NLN7H.js} +330 -30
  18. package/dist/{chunk-VJRQTKUB.js → chunk-J533DKYE.js} +2 -2
  19. package/dist/{chunk-AC3ZIRHR.js → chunk-QQLMRABM.js} +645 -502
  20. package/dist/{chunk-OXYM6VCJ.js → chunk-YDYB3H4O.js} +19 -1
  21. package/dist/cli.js +48 -22
  22. package/dist/index.js +4 -4
  23. package/dist/{intelligence-service-GMG2S55U.js → intelligence-service-M5TYY4TH.js} +2 -2
  24. package/dist/mcp.js +3 -3
  25. package/package.json +11 -11
  26. package/assets/assets/ProjectPage-BQ4lzu49.js +0 -9
  27. package/assets/assets/index-BRnD7hdh.js +0 -86
@@ -99,7 +99,7 @@ import {
99
99
  trafficEventKindSchema,
100
100
  trafficSeriesGranularitySchema,
101
101
  visibilityReportRequestSchema
102
- } from "./chunk-3HZELBZZ.js";
102
+ } from "./chunk-CDI3YR57.js";
103
103
 
104
104
  // src/cli-error.ts
105
105
  function isMachineFormat(format) {
@@ -12404,6 +12404,23 @@ function zodErrorMessage(error) {
12404
12404
  }
12405
12405
 
12406
12406
  // src/mcp/toolkits.ts
12407
+ var CANONRY_MCP_TIERS = [
12408
+ "core",
12409
+ "monitoring",
12410
+ "setup",
12411
+ "gsc",
12412
+ "ga",
12413
+ "gbp",
12414
+ // `ads` is deliberately OpenAI / ChatGPT Ads. Google Ads has its own
12415
+ // toolkit so an agent never mistakes the two provider surfaces.
12416
+ "ads",
12417
+ "google-ads",
12418
+ "gtm",
12419
+ "conversion-tracking",
12420
+ "traffic",
12421
+ "agent",
12422
+ "discovery"
12423
+ ];
12407
12424
  var CANONRY_MCP_TOOLKIT_NAMES = [
12408
12425
  "monitoring",
12409
12426
  "setup",
@@ -13095,6 +13112,7 @@ export {
13095
13112
  runMeasurementDraftAction,
13096
13113
  canonryMcpTools,
13097
13114
  CanonryMcpToolNames,
13115
+ CANONRY_MCP_TIERS,
13098
13116
  CANONRY_MCP_TOOLKIT_NAMES,
13099
13117
  createCanonryMcpServer
13100
13118
  };
package/dist/cli.js CHANGED
@@ -28,11 +28,11 @@ import {
28
28
  trackCliCommandFinished,
29
29
  trackEvent,
30
30
  waitForServerRuntimeStartup
31
- } from "./chunk-7NMMQ7QO.js";
31
+ } from "./chunk-HG6NLN7H.js";
32
32
  import {
33
33
  autoSyncSkills,
34
34
  formatAutoSyncNotice
35
- } from "./chunk-VJRQTKUB.js";
35
+ } from "./chunk-J533DKYE.js";
36
36
  import {
37
37
  CliError,
38
38
  EXIT_SYSTEM_ERROR,
@@ -58,7 +58,7 @@ import {
58
58
  saveConfigPatch,
59
59
  systemError,
60
60
  usageError
61
- } from "./chunk-OXYM6VCJ.js";
61
+ } from "./chunk-YDYB3H4O.js";
62
62
  import {
63
63
  CLOUDFLARE_WORKER_BINDINGS,
64
64
  CLOUDFLARE_WORKER_GENERATED_MARKER,
@@ -72,7 +72,7 @@ import {
72
72
  projects,
73
73
  queries,
74
74
  renderReportHtml
75
- } from "./chunk-AC3ZIRHR.js";
75
+ } from "./chunk-QQLMRABM.js";
76
76
  import {
77
77
  AdsDeliverySnapshotStatuses,
78
78
  AdsHistoricalCampaignRollupStatuses,
@@ -146,7 +146,7 @@ import {
146
146
  shareOfVoiceReason,
147
147
  visibilityReportRequestSchema,
148
148
  winnabilityClassSchema
149
- } from "./chunk-3HZELBZZ.js";
149
+ } from "./chunk-CDI3YR57.js";
150
150
 
151
151
  // src/cli.ts
152
152
  import { pathToFileURL } from "url";
@@ -12723,6 +12723,9 @@ async function setSchedule(project, opts) {
12723
12723
  if (opts.sourceId) body.sourceId = opts.sourceId;
12724
12724
  if (opts.preset) body.preset = opts.preset;
12725
12725
  if (opts.cron) body.cron = opts.cron;
12726
+ if (opts.everyDays || opts.startDate || opts.at) {
12727
+ body.recurrence = { everyDays: Number(opts.everyDays), startDate: opts.startDate, time: opts.at };
12728
+ }
12726
12729
  if (opts.timezone) body.timezone = opts.timezone;
12727
12730
  if (opts.providers?.length) body.providers = opts.providers;
12728
12731
  const result = await client.putSchedule(project, body);
@@ -12745,8 +12748,9 @@ async function showSchedule(project, format, kind) {
12745
12748
  async function enableSchedule(project, format, kind) {
12746
12749
  const client = getClient24();
12747
12750
  const current = await client.getSchedule(project, kind);
12748
- const body = { kind: current.kind, timezone: current.timezone, enabled: true };
12749
- if (current.preset) body.preset = current.preset;
12751
+ const body = { kind: current.kind, timezone: current.timezone, enabled: true, expectedUpdatedAt: current.updatedAt };
12752
+ if (current.recurrence) body.recurrence = current.recurrence;
12753
+ else if (current.preset) body.preset = current.preset;
12750
12754
  else body.cron = current.cronExpr;
12751
12755
  if (current.providers.length) body.providers = current.providers;
12752
12756
  if (current.sourceId) body.sourceId = current.sourceId;
@@ -12760,8 +12764,9 @@ async function enableSchedule(project, format, kind) {
12760
12764
  async function disableSchedule(project, format, kind) {
12761
12765
  const client = getClient24();
12762
12766
  const current = await client.getSchedule(project, kind);
12763
- const body = { kind: current.kind, timezone: current.timezone, enabled: false };
12764
- if (current.preset) body.preset = current.preset;
12767
+ const body = { kind: current.kind, timezone: current.timezone, enabled: false, expectedUpdatedAt: current.updatedAt };
12768
+ if (current.recurrence) body.recurrence = current.recurrence;
12769
+ else if (current.preset) body.preset = current.preset;
12765
12770
  else body.cron = current.cronExpr;
12766
12771
  if (current.providers.length) body.providers = current.providers;
12767
12772
  if (current.sourceId) body.sourceId = current.sourceId;
@@ -12787,7 +12792,13 @@ function printSchedule(s) {
12787
12792
  if (s.preset) {
12788
12793
  console.log(` Preset: ${s.preset}`);
12789
12794
  }
12790
- console.log(` Cron: ${s.cronExpr}`);
12795
+ if (s.recurrence) {
12796
+ console.log(` Every: ${s.recurrence.everyDays} day(s)`);
12797
+ console.log(` Start: ${s.recurrence.startDate}`);
12798
+ console.log(` At: ${s.recurrence.time}`);
12799
+ } else {
12800
+ console.log(` Cron: ${s.cronExpr}`);
12801
+ }
12791
12802
  console.log(` Timezone: ${s.timezone}`);
12792
12803
  console.log(` Enabled: ${s.enabled ? "yes" : "no"}`);
12793
12804
  if (s.kind === "traffic-sync" && s.sourceId) {
@@ -12808,33 +12819,48 @@ function printSchedule(s) {
12808
12819
  var SCHEDULE_CLI_COMMANDS = [
12809
12820
  {
12810
12821
  path: ["schedule", "set"],
12811
- usage: "canonry schedule set <project> (--preset <preset> | --cron <expr>) [--kind answer-visibility|traffic-sync|gbp-sync|data-refresh|backlinks-sync] [--source <id>] [--timezone <tz>] [--provider <name>...] [--format json]",
12822
+ usage: "canonry schedule set <project> (--preset <preset> | --cron <expr> | --every-days <n> --start-date <YYYY-MM-DD> --at <HH:mm>) [--kind answer-visibility|traffic-sync|gbp-sync|data-refresh|backlinks-sync] [--source <id>] [--timezone <tz>] [--provider <name>...] [--format json]",
12812
12823
  options: {
12813
12824
  preset: stringOption(),
12814
12825
  cron: stringOption(),
12826
+ "every-days": stringOption(),
12827
+ "start-date": stringOption(),
12828
+ at: stringOption(),
12815
12829
  kind: stringOption(),
12816
12830
  source: stringOption(),
12817
12831
  timezone: stringOption(),
12818
12832
  provider: multiStringOption()
12819
12833
  },
12820
12834
  run: async (input) => {
12821
- const usage = "canonry schedule set <project> (--preset <preset> | --cron <expr>) [--kind answer-visibility|traffic-sync|gbp-sync|data-refresh|backlinks-sync] [--source <id>] [--timezone <tz>] [--provider <name>...] [--format json]";
12835
+ const usage = "canonry schedule set <project> (--preset <preset> | --cron <expr> | --every-days <n> --start-date <YYYY-MM-DD> --at <HH:mm>) [--kind answer-visibility|traffic-sync|gbp-sync|data-refresh|backlinks-sync] [--source <id>] [--timezone <tz>] [--provider <name>...] [--format json]";
12822
12836
  const project = requireProject(input, "schedule.set", usage);
12823
- if (!getString(input.values, "preset") && !getString(input.values, "cron")) {
12824
- throw usageError("Error: --preset or --cron is required", {
12825
- message: "schedule preset or cron is required",
12826
- details: {
12827
- command: "schedule.set",
12828
- usage,
12829
- required: ["preset | cron"]
12830
- }
12837
+ const preset = getString(input.values, "preset");
12838
+ const cron = getString(input.values, "cron");
12839
+ const everyDays = getString(input.values, "every-days");
12840
+ const startDate = getString(input.values, "start-date");
12841
+ const at = getString(input.values, "at");
12842
+ const recurrenceFlags = [everyDays, startDate, at].filter(Boolean);
12843
+ if (recurrenceFlags.length > 0 && recurrenceFlags.length < 3) {
12844
+ throw usageError("Error: --every-days, --start-date, and --at must be used together", {
12845
+ message: "schedule recurrence requires every-days, start-date, and at",
12846
+ details: { command: "schedule.set", usage, required: ["every-days + start-date + at"] }
12847
+ });
12848
+ }
12849
+ const timingCount = Number(Boolean(preset)) + Number(Boolean(cron)) + Number(recurrenceFlags.length === 3);
12850
+ if (timingCount !== 1) {
12851
+ throw usageError("Error: exactly one schedule timing is required", {
12852
+ message: "exactly one of schedule preset, cron, or recurrence is required",
12853
+ details: { command: "schedule.set", usage, required: ["preset | cron | recurrence"] }
12831
12854
  });
12832
12855
  }
12833
12856
  await setSchedule(project, {
12834
12857
  kind: getString(input.values, "kind"),
12835
12858
  sourceId: getString(input.values, "source"),
12836
- preset: getString(input.values, "preset"),
12837
- cron: getString(input.values, "cron"),
12859
+ preset,
12860
+ cron,
12861
+ everyDays,
12862
+ startDate,
12863
+ at,
12838
12864
  timezone: getString(input.values, "timezone"),
12839
12865
  providers: getStringArray(input.values, "provider"),
12840
12866
  format: input.format
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-7NMMQ7QO.js";
6
+ } from "./chunk-HG6NLN7H.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-OXYM6VCJ.js";
10
- import "./chunk-AC3ZIRHR.js";
11
- import "./chunk-3HZELBZZ.js";
9
+ } from "./chunk-YDYB3H4O.js";
10
+ import "./chunk-QQLMRABM.js";
11
+ import "./chunk-CDI3YR57.js";
12
12
  export {
13
13
  GoogleMarketingRuntimeError,
14
14
  createGoogleMarketingCredentialStore,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-AC3ZIRHR.js";
4
- import "./chunk-3HZELBZZ.js";
3
+ } from "./chunk-QQLMRABM.js";
4
+ import "./chunk-CDI3YR57.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-VJRQTKUB.js";
3
+ } from "./chunk-J533DKYE.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-OXYM6VCJ.js";
7
+ } from "./chunk-YDYB3H4O.js";
8
8
  import {
9
9
  isReadOnlyKey
10
- } from "./chunk-3HZELBZZ.js";
10
+ } from "./chunk-CDI3YR57.js";
11
11
 
12
12
  // src/mcp/cli.ts
13
13
  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.188.4",
3
+ "version": "4.189.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
  "license": "FSL-1.1-ALv2",
@@ -72,28 +72,28 @@
72
72
  "tsx": "^4.19.0",
73
73
  "@ainyc/canonry-web": "0.0.0",
74
74
  "@ainyc/canonry-api-client": "0.0.0",
75
- "@ainyc/canonry-api-routes": "0.0.0",
76
- "@ainyc/canonry-contracts": "0.0.0",
77
75
  "@ainyc/canonry-config": "0.0.0",
76
+ "@ainyc/canonry-contracts": "0.0.0",
77
+ "@ainyc/canonry-api-routes": "0.0.0",
78
78
  "@ainyc/canonry-db": "0.0.0",
79
- "@ainyc/canonry-integration-bing": "0.0.0",
80
79
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
80
+ "@ainyc/canonry-integration-bing": "0.0.0",
81
+ "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
81
82
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
82
83
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
83
84
  "@ainyc/canonry-integration-google": "0.0.0",
84
- "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
85
85
  "@ainyc/canonry-integration-google-ads": "0.0.0",
86
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
87
86
  "@ainyc/canonry-integration-google-places": "0.0.0",
88
- "@ainyc/canonry-integration-traffic": "0.0.0",
89
- "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
90
87
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
88
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
89
+ "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
90
+ "@ainyc/canonry-integration-traffic": "0.0.0",
91
+ "@ainyc/canonry-intelligence": "0.0.0",
91
92
  "@ainyc/canonry-integration-wordpress": "0.0.0",
92
93
  "@ainyc/canonry-provider-claude": "0.0.0",
93
- "@ainyc/canonry-provider-cdp": "0.0.0",
94
- "@ainyc/canonry-provider-gemini": "0.0.0",
95
- "@ainyc/canonry-intelligence": "0.0.0",
96
94
  "@ainyc/canonry-provider-local": "0.0.0",
95
+ "@ainyc/canonry-provider-gemini": "0.0.0",
96
+ "@ainyc/canonry-provider-cdp": "0.0.0",
97
97
  "@ainyc/canonry-provider-openai": "0.0.0",
98
98
  "@ainyc/canonry-provider-perplexity": "0.0.0"
99
99
  },