@canonry/canonry 4.172.1 → 4.172.2

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 (31) hide show
  1. package/assets/agent-workspace/skills/aero/references/reporting.md +8 -4
  2. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +1 -1
  3. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +4 -3
  4. package/assets/assets/{AuditHistoryPanel-BO_TSFPx.js → AuditHistoryPanel-DnqySUw3.js} +1 -1
  5. package/assets/assets/{BacklinksPage-CNrzKbiR.js → BacklinksPage-CbcHWD-G.js} +1 -1
  6. package/assets/assets/{HistoryPage-CvzLzfj3.js → HistoryPage-BYFSyxuB.js} +1 -1
  7. package/assets/assets/{MeasurementPropertyPage-CUdAqft3.js → MeasurementPropertyPage-BBnXQPIv.js} +1 -1
  8. package/assets/assets/ProjectPage-Cq5bHpmk.js +9 -0
  9. package/assets/assets/{RunRow-BLZsQTiY.js → RunRow-lfyHktTf.js} +1 -1
  10. package/assets/assets/{RunsPage-CTuTDUcn.js → RunsPage-ngnP0Y_D.js} +1 -1
  11. package/assets/assets/{SettingsPage-BY-nM5uj.js → SettingsPage-DEg74T20.js} +1 -1
  12. package/assets/assets/{SiteHealthSection-br9-ha8G.js → SiteHealthSection-C6ycXwbt.js} +3 -3
  13. package/assets/assets/{TrafficPage-BgX1QlXy.js → TrafficPage-hrJ1IDqA.js} +1 -1
  14. package/assets/assets/{TrafficSourceDetailPage-D5bsBc6A.js → TrafficSourceDetailPage-fu7nPl3E.js} +1 -1
  15. package/assets/assets/{extract-error-message-BywQFP69.js → extract-error-message-dcdO9njP.js} +1 -1
  16. package/assets/assets/index-D1mXm81Z.css +1 -0
  17. package/assets/assets/{index-BpHZirJJ.js → index-DpQ_-QC_.js} +27 -27
  18. package/assets/assets/{react-sigma_core.esm.min-Do4rkEBs.js → react-sigma_core.esm.min-DZGxGBSe.js} +1 -1
  19. package/assets/index.html +2 -2
  20. package/dist/{chunk-X63CLHYM.js → chunk-EGGQSFQL.js} +4748 -4679
  21. package/dist/{chunk-3XN226N6.js → chunk-PXTSQ67Z.js} +651 -243
  22. package/dist/{chunk-IAX4WRAR.js → chunk-TI3SZAVI.js} +4 -4
  23. package/dist/{chunk-7L4453BU.js → chunk-U5JTZM66.js} +2 -2
  24. package/dist/{chunk-5MRE2TXR.js → chunk-YXDCVM5U.js} +8 -5
  25. package/dist/cli.js +36 -14
  26. package/dist/index.js +4 -4
  27. package/dist/{intelligence-service-FSHZXSGK.js → intelligence-service-H7756PBD.js} +2 -2
  28. package/dist/mcp.js +3 -3
  29. package/package.json +13 -13
  30. package/assets/assets/ProjectPage-xbRWsne7.js +0 -9
  31. package/assets/assets/index-BsQGKWA6.css +0 -1
@@ -9,7 +9,7 @@ import {
9
9
  loadConfig,
10
10
  loadConfigRaw,
11
11
  saveConfigPatch
12
- } from "./chunk-5MRE2TXR.js";
12
+ } from "./chunk-YXDCVM5U.js";
13
13
  import {
14
14
  CC_CACHE_DIR,
15
15
  DUCKDB_SPEC,
@@ -145,7 +145,7 @@ import {
145
145
  siteCrawlSnapshots,
146
146
  toAlertView,
147
147
  usageCounters
148
- } from "./chunk-3XN226N6.js";
148
+ } from "./chunk-PXTSQ67Z.js";
149
149
  import {
150
150
  AGENT_MEMORY_VALUE_MAX_BYTES,
151
151
  AGENT_PROVIDER_IDS,
@@ -282,7 +282,7 @@ import {
282
282
  validationError,
283
283
  winnabilityClassLabel,
284
284
  withRetry
285
- } from "./chunk-X63CLHYM.js";
285
+ } from "./chunk-EGGQSFQL.js";
286
286
 
287
287
  // src/telemetry.ts
288
288
  import crypto from "crypto";
@@ -11829,7 +11829,7 @@ function readStoredGroundingSources(rawResponse) {
11829
11829
  return result;
11830
11830
  }
11831
11831
  async function backfillInsightsCommand(project, opts) {
11832
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-FSHZXSGK.js");
11832
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-H7756PBD.js");
11833
11833
  const config = loadConfig();
11834
11834
  const db = createClient(config.database);
11835
11835
  migrate(db);
@@ -5,11 +5,11 @@ import {
5
5
  installSkills,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-5MRE2TXR.js";
8
+ } from "./chunk-YXDCVM5U.js";
9
9
  import {
10
10
  SKILL_MANIFEST_FILENAME,
11
11
  SkillsClients
12
- } from "./chunk-X63CLHYM.js";
12
+ } from "./chunk-EGGQSFQL.js";
13
13
 
14
14
  // src/skills-autosync.ts
15
15
  import fs from "fs";
@@ -91,7 +91,7 @@ import {
91
91
  trafficConnectWordpressRequestSchema,
92
92
  trafficEventKindSchema,
93
93
  trafficSeriesGranularitySchema
94
- } from "./chunk-X63CLHYM.js";
94
+ } from "./chunk-EGGQSFQL.js";
95
95
 
96
96
  // src/config.ts
97
97
  import fs from "fs";
@@ -8274,7 +8274,8 @@ var ApiClient = class {
8274
8274
  lastRuns: opts.lastRuns,
8275
8275
  groupBy: opts.groupBy,
8276
8276
  month: opts.month,
8277
- shareOfVoice: opts.shareOfVoice ? "1" : void 0
8277
+ shareOfVoice: opts.shareOfVoice ? "1" : void 0,
8278
+ queryClass: opts.queryClass
8278
8279
  }
8279
8280
  })
8280
8281
  );
@@ -9999,7 +10000,7 @@ var canonryMcpTools = [
9999
10000
  defineTool({
10000
10001
  name: "canonry_visibility_stats",
10001
10002
  title: "Get aggregated mention/citation stats",
10002
- description: 'Per-query mention (answer-text) and citation (source-list) counts WITH a sample size, pooled across many answer-visibility runs (probe-excluded) \u2014 the data to compute a confidence-aware (Wilson) proportion or detect drift without fetching every run. Tri-state aware: `checked` (the n for the mention proportion) counts only snapshots where answerMentioned was recorded; `null` ("not checked") is excluded, never counted as not-mentioned. Returns per-query `total`/`checked`/`mentioned`/`cited` + derived `mentionRate` (mentioned/checked) and `citedRate` (cited/total), `firstObserved`/`lastObserved`, and pooled `totals`. Window with `since`/`until` (ISO), `lastRuns`, or `month=YYYY-MM` (mutually exclusive); with none set, EVERY completed/partial run is pooled (`window.runCount` says how many) \u2014 pass `lastRuns` for a recent sample. Set `groupBy=provider` for a per-provider breakdown whose counts sum to the pooled counts (`groupBy` is omitted from the response otherwise). Set `shareOfVoice=true` for pooled project-vs-tracked-competitor brand-mention share across the same attributed snapshot set.',
10003
+ description: 'Per-query mention (answer-text) and citation (source-list) counts WITH a sample size, pooled across many answer-visibility runs (probe-excluded) \u2014 the data to compute a confidence-aware (Wilson) proportion or detect drift without fetching every run. Tri-state aware: `checked` (the n for the mention proportion) counts only snapshots where answerMentioned was recorded; `null` ("not checked") is excluded, never counted as not-mentioned. Returns per-query `total`/`checked`/`mentioned`/`cited` + derived `mentionRate` (mentioned/checked) and `citedRate` (cited/total), `firstObserved`/`lastObserved`, and pooled `totals`. Window with `since`/`until` (ISO), `lastRuns`, or `month=YYYY-MM` (mutually exclusive); with none set, EVERY completed/partial run is pooled (`window.runCount` says how many) \u2014 pass `lastRuns` for a recent sample. Set `groupBy=provider` for a per-provider breakdown whose counts sum to the pooled counts (`groupBy` is omitted from the response otherwise). Set `shareOfVoice=true` for project-vs-tracked-competitor brand-mention share across the same attributed snapshot set \u2014 scoped to NON-BRAND queries by default, because a branded query names the project (it is mentioned on nearly all of them and a competitor cannot be), so a pooled figure reports brand recall as category placement. Pass `queryClass="branded"` for the recall figure; the response echoes which class it served.',
10003
10004
  access: "read",
10004
10005
  tier: "monitoring",
10005
10006
  inputSchema: z3.object({
@@ -10009,7 +10010,8 @@ var canonryMcpTools = [
10009
10010
  lastRuns: z3.number().int().positive().optional().describe("Aggregate only the most recent N answer-visibility runs. Mutually exclusive with since/until/month."),
10010
10011
  month: z3.string().optional().describe("Aggregate one calendar month (YYYY-MM), expanded to that month's inclusive UTC bounds. Mutually exclusive with since/until/lastRuns."),
10011
10012
  groupBy: z3.enum(["provider"]).optional().describe('Set to "provider" for a per-provider breakdown.'),
10012
- shareOfVoice: z3.boolean().optional().describe("Include pooled project-vs-tracked-competitor brand-mention share across the same window.")
10013
+ shareOfVoice: z3.boolean().optional().describe("Include project-vs-tracked-competitor brand-mention share across the same window (non-brand queries unless queryClass says otherwise)."),
10014
+ queryClass: z3.enum(["branded", "non-brand"]).optional().describe('Query class for shareOfVoice. Defaults to non-brand. There is no "all": branded and non-brand never share a denominator.')
10013
10015
  }),
10014
10016
  annotations: readAnnotations(),
10015
10017
  openApiOperations: ["GET /api/v1/projects/{name}/visibility-stats"],
@@ -10019,7 +10021,8 @@ var canonryMcpTools = [
10019
10021
  lastRuns: input.lastRuns,
10020
10022
  groupBy: input.groupBy,
10021
10023
  month: input.month,
10022
- shareOfVoice: input.shareOfVoice
10024
+ shareOfVoice: input.shareOfVoice,
10025
+ queryClass: input.queryClass
10023
10026
  })
10024
10027
  }),
10025
10028
  defineTool({
package/dist/cli.js CHANGED
@@ -26,11 +26,11 @@ import {
26
26
  showFirstRunNotice,
27
27
  trackCliCommandFinished,
28
28
  trackEvent
29
- } from "./chunk-IAX4WRAR.js";
29
+ } from "./chunk-TI3SZAVI.js";
30
30
  import {
31
31
  autoSyncSkills,
32
32
  formatAutoSyncNotice
33
- } from "./chunk-7L4453BU.js";
33
+ } from "./chunk-U5JTZM66.js";
34
34
  import {
35
35
  CliError,
36
36
  EXIT_SYSTEM_ERROR,
@@ -55,7 +55,7 @@ import {
55
55
  saveConfigPatch,
56
56
  systemError,
57
57
  usageError
58
- } from "./chunk-5MRE2TXR.js";
58
+ } from "./chunk-YXDCVM5U.js";
59
59
  import {
60
60
  CLOUDFLARE_WORKER_BINDINGS,
61
61
  CLOUDFLARE_WORKER_GENERATED_MARKER,
@@ -69,7 +69,7 @@ import {
69
69
  projects,
70
70
  queries,
71
71
  renderReportHtml
72
- } from "./chunk-3XN226N6.js";
72
+ } from "./chunk-PXTSQ67Z.js";
73
73
  import {
74
74
  AdsDeliverySnapshotStatuses,
75
75
  AdsHistoricalCampaignRollupStatuses,
@@ -137,7 +137,7 @@ import {
137
137
  providerQuotaPolicySchema,
138
138
  resolveProviderInput,
139
139
  winnabilityClassSchema
140
- } from "./chunk-X63CLHYM.js";
140
+ } from "./chunk-EGGQSFQL.js";
141
141
 
142
142
  // src/cli.ts
143
143
  import { pathToFileURL } from "url";
@@ -13080,14 +13080,14 @@ async function showAllOverviews(opts) {
13080
13080
  console.log(`
13081
13081
  Overviews (${overviews.length} project${overviews.length === 1 ? "" : "s"}):
13082
13082
  `);
13083
- const cols = { project: 20, mention: 10, cited: 10, share: 18, queries: 10 };
13084
- console.log(` ${cell("Project", cols.project)}${cell("Mention", cols.mention)}${cell("Cited", cols.cited)}${cell("Share", cols.share)}${cell("Queries", cols.queries)}Latest run`);
13083
+ const cols = { project: 20, mention: 10, cited: 10, share: 42, queries: 10 };
13084
+ console.log(` ${cell("Project", cols.project)}${cell("Mention", cols.mention)}${cell("Cited", cols.cited)}${cell("Mention share \xB7 scope", cols.share)}${cell("Queries", cols.queries)}Latest run`);
13085
13085
  for (const ov of overviews) {
13086
13086
  const project = ov.project.displayName || ov.project.name;
13087
13087
  const queries2 = `${ov.queryCounts.citedQueries}/${ov.queryCounts.totalQueries}`;
13088
13088
  const latest = ov.latestRun.run?.finishedAt ?? ov.latestRun.run?.createdAt ?? "\u2014";
13089
13089
  console.log(
13090
- ` ${cell(project, cols.project)}${cell(ov.scores.mention.value, cols.mention)}${cell(ov.scores.visibility.value, cols.cited)}${cell(ov.scores.mentionShare.value, cols.share)}${cell(queries2, cols.queries)}${latest}`
13090
+ ` ${cell(project, cols.project)}${cell(ov.scores.mention.value, cols.mention)}${cell(ov.scores.visibility.value, cols.cited)}${cell(`${ov.scores.mentionShare.value} \xB7 ${ov.scores.mentionShare.scope} queries`, cols.share)}${cell(queries2, cols.queries)}${latest}`
13091
13091
  );
13092
13092
  }
13093
13093
  console.log();
@@ -16123,7 +16123,8 @@ async function showVisibilityStats(project, opts) {
16123
16123
  month: opts.month,
16124
16124
  lastRuns: opts.lastRuns,
16125
16125
  groupBy: opts.byProvider ? "provider" : void 0,
16126
- shareOfVoice: opts.shareOfVoice
16126
+ shareOfVoice: opts.shareOfVoice,
16127
+ queryClass: opts.queryClass
16127
16128
  });
16128
16129
  if (opts.format === "jsonl") {
16129
16130
  emitJsonl(data.queries.map((q) => ({ project: data.project, runCount: data.window.runCount, ...q })));
@@ -16149,6 +16150,9 @@ async function showVisibilityCompare(project, opts) {
16149
16150
  printVisibilityCompare(data);
16150
16151
  }
16151
16152
  function periodCell(p) {
16153
+ if (p.availability === "no-competitive-frame") {
16154
+ return `unavailable: no competitive frame (${p.numerator} observed)`;
16155
+ }
16152
16156
  if (p.point === null || p.ciLow === null || p.ciHigh === null) return "no data";
16153
16157
  const p1 = (v) => formatRatio(v);
16154
16158
  return `${p1(p.point)} [${p1(p.ciLow)}, ${p1(p.ciHigh)}]`;
@@ -16167,6 +16171,11 @@ function verdictCell(m) {
16167
16171
  return "model unknown";
16168
16172
  }
16169
16173
  }
16174
+ function metricQueryClassLabel(metric) {
16175
+ if (metric.queryClass === "non-brand") return "non-brand queries";
16176
+ if (metric.queryClass === "pooled") return "pooled queries; classification unavailable";
16177
+ return "all queries";
16178
+ }
16170
16179
  function printVisibilityCompare(data) {
16171
16180
  console.log(`AEO month over month: ${data.project} ${data.from.month} -> ${data.to.month}`);
16172
16181
  const b = data.basket;
@@ -16183,7 +16192,7 @@ function printVisibilityCompare(data) {
16183
16192
  }
16184
16193
  console.log("");
16185
16194
  const rows = data.metrics.map((m) => ({
16186
- label: `${m.label}${m.driftRobust ? " *" : ""}`,
16195
+ label: `${m.label} \xB7 ${metricQueryClassLabel(m)}${m.driftRobust ? " *" : ""}`,
16187
16196
  to: periodCell(m.to),
16188
16197
  from: periodCell(m.from),
16189
16198
  verdict: verdictCell(m)
@@ -16289,10 +16298,14 @@ function printVisibilityStats(data) {
16289
16298
  const sov = data.shareOfVoice;
16290
16299
  if (sov) {
16291
16300
  console.log("");
16292
- const pctStr = sov.percent === null ? "\u2014 (no competitors configured)" : `${sov.percent}%`;
16301
+ const pctStr = sov.percent !== null ? `${sov.percent}%` : sov.competitorCount === 0 ? "\u2014 (no competitors configured)" : sov.snapshotsWithAnswerText === 0 ? "\u2014 (no answer text in scope)" : "\u2014 (no brands mentioned in scope)";
16302
+ const scope = sov.queryClass === "pooled" ? "pooled queries \xB7 classification unavailable" : `${sov.queryClass} queries`;
16293
16303
  console.log(
16294
- `Share of voice: ${pctStr} (you ${sov.projectMentions} vs competitors ${sov.competitorMentions} brand mentions across ${sov.snapshotsWithAnswerText} answers)`
16304
+ `Share of voice (${scope}): ${pctStr} (you ${sov.projectMentions} vs competitors ${sov.competitorMentions} brand mentions across ${sov.snapshotsWithAnswerText} answers)`
16295
16305
  );
16306
+ if (sov.queryClass === "non-brand") {
16307
+ console.log(" branded queries excluded on purpose \u2014 re-run with --query-class branded for brand recall");
16308
+ }
16296
16309
  for (const c of sov.perCompetitor.slice(0, 8)) {
16297
16310
  console.log(` ${c.domain}: ${c.mentions}`);
16298
16311
  }
@@ -16300,7 +16313,14 @@ function printVisibilityStats(data) {
16300
16313
  }
16301
16314
 
16302
16315
  // src/cli-commands/visibility-stats.ts
16303
- var USAGE5 = "canonry visibility-stats <project> [--since <iso>] [--until <iso>] [--month <YYYY-MM>] [--last-runs <n>] [--by-provider] [--share-of-voice] [--format json|jsonl]";
16316
+ var USAGE5 = "canonry visibility-stats <project> [--since <iso>] [--until <iso>] [--month <YYYY-MM>] [--last-runs <n>] [--by-provider] [--share-of-voice] [--query-class branded|non-brand] [--format json|jsonl]";
16317
+ function parseQueryClass(value) {
16318
+ if (value === void 0 || value === "") return void 0;
16319
+ if (value !== "branded" && value !== "non-brand") {
16320
+ throw new Error(`--query-class must be "branded" or "non-brand" (got "${value}")`);
16321
+ }
16322
+ return value;
16323
+ }
16304
16324
  var COMPARE_USAGE = "canonry visibility-compare <project> --from <YYYY-MM> --to <YYYY-MM> [--format json]";
16305
16325
  var VISIBILITY_STATS_CLI_COMMANDS = [
16306
16326
  {
@@ -16312,7 +16332,8 @@ var VISIBILITY_STATS_CLI_COMMANDS = [
16312
16332
  month: stringOption(),
16313
16333
  "last-runs": stringOption(),
16314
16334
  "by-provider": { type: "boolean", default: false },
16315
- "share-of-voice": { type: "boolean", default: false }
16335
+ "share-of-voice": { type: "boolean", default: false },
16336
+ "query-class": stringOption()
16316
16337
  },
16317
16338
  run: async (input) => {
16318
16339
  const project = requireProject(input, "visibility-stats", USAGE5);
@@ -16327,6 +16348,7 @@ var VISIBILITY_STATS_CLI_COMMANDS = [
16327
16348
  }),
16328
16349
  byProvider: getBoolean(input.values, "by-provider"),
16329
16350
  shareOfVoice: getBoolean(input.values, "share-of-voice"),
16351
+ queryClass: parseQueryClass(getString(input.values, "query-class")),
16330
16352
  format: input.format
16331
16353
  });
16332
16354
  }
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-IAX4WRAR.js";
6
+ } from "./chunk-TI3SZAVI.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-5MRE2TXR.js";
10
- import "./chunk-3XN226N6.js";
11
- import "./chunk-X63CLHYM.js";
9
+ } from "./chunk-YXDCVM5U.js";
10
+ import "./chunk-PXTSQ67Z.js";
11
+ import "./chunk-EGGQSFQL.js";
12
12
  export {
13
13
  GoogleMarketingRuntimeError,
14
14
  createGoogleMarketingCredentialStore,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-3XN226N6.js";
4
- import "./chunk-X63CLHYM.js";
3
+ } from "./chunk-PXTSQ67Z.js";
4
+ import "./chunk-EGGQSFQL.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-7L4453BU.js";
3
+ } from "./chunk-U5JTZM66.js";
4
4
  import {
5
5
  CliError,
6
6
  PACKAGE_VERSION,
7
7
  canonryMcpTools,
8
8
  createApiClient
9
- } from "./chunk-5MRE2TXR.js";
9
+ } from "./chunk-YXDCVM5U.js";
10
10
  import {
11
11
  isReadOnlyKey
12
- } from "./chunk-X63CLHYM.js";
12
+ } from "./chunk-EGGQSFQL.js";
13
13
 
14
14
  // src/mcp/cli.ts
15
15
  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.172.1",
3
+ "version": "4.172.2",
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",
@@ -71,30 +71,30 @@
71
71
  "tsup": "^8.5.1",
72
72
  "tsx": "^4.19.0",
73
73
  "@ainyc/canonry-api-client": "0.0.0",
74
- "@ainyc/canonry-config": "0.0.0",
74
+ "@ainyc/canonry-api-routes": "0.0.0",
75
75
  "@ainyc/canonry-contracts": "0.0.0",
76
- "@ainyc/canonry-integration-bing": "0.0.0",
76
+ "@ainyc/canonry-config": "0.0.0",
77
77
  "@ainyc/canonry-db": "0.0.0",
78
+ "@ainyc/canonry-integration-bing": "0.0.0",
79
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
80
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
78
81
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
82
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
79
83
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
80
- "@ainyc/canonry-integration-openai-ads": "0.0.0",
81
- "@ainyc/canonry-api-routes": "0.0.0",
82
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
84
+ "@ainyc/canonry-integration-google": "0.0.0",
83
85
  "@ainyc/canonry-integration-google-ads": "0.0.0",
84
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
85
86
  "@ainyc/canonry-integration-google-places": "0.0.0",
86
87
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
87
88
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
88
- "@ainyc/canonry-integration-traffic": "0.0.0",
89
89
  "@ainyc/canonry-integration-wordpress": "0.0.0",
90
90
  "@ainyc/canonry-intelligence": "0.0.0",
91
- "@ainyc/canonry-provider-cdp": "0.0.0",
91
+ "@ainyc/canonry-integration-traffic": "0.0.0",
92
92
  "@ainyc/canonry-provider-local": "0.0.0",
93
- "@ainyc/canonry-integration-google": "0.0.0",
94
- "@ainyc/canonry-provider-openai": "0.0.0",
95
- "@ainyc/canonry-provider-perplexity": "0.0.0",
96
93
  "@ainyc/canonry-provider-gemini": "0.0.0",
97
- "@ainyc/canonry-provider-claude": "0.0.0"
94
+ "@ainyc/canonry-provider-cdp": "0.0.0",
95
+ "@ainyc/canonry-provider-openai": "0.0.0",
96
+ "@ainyc/canonry-provider-claude": "0.0.0",
97
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
98
98
  },
99
99
  "scripts": {
100
100
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",