@ainyc/canonry 4.93.0 → 4.94.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 (24) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +4 -0
  2. package/assets/agent-workspace/skills/canonry/references/google-business-profile.md +1 -1
  3. package/assets/assets/{BacklinksPage-nkgAbbjk.js → BacklinksPage-FeUApIRv.js} +1 -1
  4. package/assets/assets/{ChartPrimitives-kdfylr1f.js → ChartPrimitives-DFCM9oRt.js} +1 -1
  5. package/assets/assets/{ProjectPage-BQYmq7FP.js → ProjectPage-Dyx8eZf_.js} +1 -1
  6. package/assets/assets/{RunRow-P-n5OkiY.js → RunRow-CF4jm8w8.js} +1 -1
  7. package/assets/assets/{RunsPage-DfBb4WCS.js → RunsPage-Dlyl-dmG.js} +1 -1
  8. package/assets/assets/{SettingsPage-CRGuFgeK.js → SettingsPage-DaQ0YNHz.js} +1 -1
  9. package/assets/assets/{TrafficPage-CMqP0AGZ.js → TrafficPage-38zf4QS8.js} +1 -1
  10. package/assets/assets/{TrafficSourceDetailPage-XRGzkKWk.js → TrafficSourceDetailPage-DJY18oUo.js} +1 -1
  11. package/assets/assets/{arrow-left-BCR55g4n.js → arrow-left-CRHf1qtt.js} +1 -1
  12. package/assets/assets/{extract-error-message-BG1AlucT.js → extract-error-message-uWeOU6mU.js} +1 -1
  13. package/assets/assets/{index-BPjIZIDO.js → index-B7ZT1i67.js} +3 -3
  14. package/assets/assets/{trash-2-Cme1gNjU.js → trash-2-B1qn8ZLk.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-ADTLQHJY.js → chunk-3TTBKG73.js} +4 -4
  17. package/dist/{chunk-PK46TKGM.js → chunk-K4QOSPBX.js} +5 -2
  18. package/dist/{chunk-AUQNKEHV.js → chunk-PV3RAHMK.js} +1 -0
  19. package/dist/{chunk-KBDQ5OE4.js → chunk-ZJADMHJ5.js} +45 -11
  20. package/dist/cli.js +26 -10
  21. package/dist/index.js +4 -4
  22. package/dist/{intelligence-service-4ATCJITP.js → intelligence-service-M33PXIWS.js} +2 -2
  23. package/dist/mcp.js +2 -2
  24. package/package.json +12 -12
@@ -1 +1 @@
1
- import{c}from"./index-BPjIZIDO.js";const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],h=c("circle-check",a);const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],n=c("circle-question-mark",e);const o=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],s=c("download",o);const t=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],r=c("trash-2",t);export{h as C,s as D,r as T,n as a};
1
+ import{c}from"./index-B7ZT1i67.js";const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],h=c("circle-check",a);const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],n=c("circle-question-mark",e);const o=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],s=c("download",o);const t=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],r=c("trash-2",t);export{h as C,s as D,r as T,n as a};
package/assets/index.html CHANGED
@@ -12,7 +12,7 @@
12
12
  <link rel="icon" type="image/png" sizes="32x32" href="./favicon-32.png" />
13
13
  <link rel="apple-touch-icon" href="./apple-touch-icon.png" />
14
14
  <title>Canonry</title>
15
- <script type="module" crossorigin src="./assets/index-BPjIZIDO.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-B7ZT1i67.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Dq7p98wZ.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-B57xfQbP.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-ClRVR6aX.js">
@@ -9,7 +9,7 @@ import {
9
9
  loadConfig,
10
10
  loadConfigRaw,
11
11
  saveConfigPatch
12
- } from "./chunk-PK46TKGM.js";
12
+ } from "./chunk-K4QOSPBX.js";
13
13
  import {
14
14
  CC_CACHE_DIR,
15
15
  DUCKDB_SPEC,
@@ -111,7 +111,7 @@ import {
111
111
  siteAuditPages,
112
112
  siteAuditSnapshots,
113
113
  usageCounters
114
- } from "./chunk-KBDQ5OE4.js";
114
+ } from "./chunk-ZJADMHJ5.js";
115
115
  import {
116
116
  AGENT_MEMORY_VALUE_MAX_BYTES,
117
117
  AGENT_PROVIDER_IDS,
@@ -171,7 +171,7 @@ import {
171
171
  validationError,
172
172
  winnabilityClassLabel,
173
173
  withRetry
174
- } from "./chunk-AUQNKEHV.js";
174
+ } from "./chunk-PV3RAHMK.js";
175
175
 
176
176
  // src/telemetry.ts
177
177
  import crypto from "crypto";
@@ -6387,7 +6387,7 @@ function readStoredGroundingSources(rawResponse) {
6387
6387
  return result;
6388
6388
  }
6389
6389
  async function backfillInsightsCommand(project, opts) {
6390
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-4ATCJITP.js");
6390
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-M33PXIWS.js");
6391
6391
  const config = loadConfig();
6392
6392
  const db = createClient(config.database);
6393
6393
  migrate(db);
@@ -23,7 +23,7 @@ import {
23
23
  trafficConnectVercelRequestSchema,
24
24
  trafficConnectWordpressRequestSchema,
25
25
  trafficEventKindSchema
26
- } from "./chunk-AUQNKEHV.js";
26
+ } from "./chunk-PV3RAHMK.js";
27
27
 
28
28
  // src/config.ts
29
29
  import fs from "fs";
@@ -5024,7 +5024,10 @@ var ApiClient = class {
5024
5024
  path: { name: project },
5025
5025
  query: {
5026
5026
  dismissed: opts?.dismissed ? "true" : void 0,
5027
- runId: opts?.runId
5027
+ runId: opts?.runId,
5028
+ type: opts?.type,
5029
+ severity: opts?.severity,
5030
+ limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
5028
5031
  }
5029
5032
  })
5030
5033
  );
@@ -1009,6 +1009,7 @@ var gbpAttributeDtoSchema = z8.object({
1009
1009
  name: z8.string(),
1010
1010
  valueType: z8.string(),
1011
1011
  values: z8.array(z8.union([z8.boolean(), z8.string()])),
1012
+ unsetValues: z8.array(z8.string()),
1012
1013
  uris: z8.array(z8.string())
1013
1014
  });
1014
1015
  var gbpAttributesDtoSchema = z8.object({
@@ -259,7 +259,7 @@ import {
259
259
  wordpressSchemaDeployResultDtoSchema,
260
260
  wordpressSchemaStatusResultDtoSchema,
261
261
  wordpressStatusDtoSchema
262
- } from "./chunk-AUQNKEHV.js";
262
+ } from "./chunk-PV3RAHMK.js";
263
263
 
264
264
  // src/intelligence-service.ts
265
265
  import { eq as eq37, desc as desc18, asc as asc5, and as and27, ne as ne5, or as or5, inArray as inArray14, gte as gte7, lte as lte4 } from "drizzle-orm";
@@ -8117,7 +8117,15 @@ function buildCategoryCounts(counts2) {
8117
8117
  }
8118
8118
 
8119
8119
  // ../api-routes/src/intelligence.ts
8120
- import { eq as eq11, desc as desc4, and as and6, inArray as inArray4 } from "drizzle-orm";
8120
+ import { eq as eq11, desc as desc4, and as and6, inArray as inArray4, like } from "drizzle-orm";
8121
+ var SEVERITY_RANK = { low: 0, medium: 1, high: 2, critical: 3 };
8122
+ function severitiesAtOrAbove(min) {
8123
+ const floor = SEVERITY_RANK[min];
8124
+ if (floor === void 0) {
8125
+ throw validationError(`Invalid severity "${min}". Use one of: low, medium, high, critical.`);
8126
+ }
8127
+ return Object.keys(SEVERITY_RANK).filter((s) => SEVERITY_RANK[s] >= floor);
8128
+ }
8121
8129
  function emptyHealthSnapshot(projectId) {
8122
8130
  return {
8123
8131
  id: `no-data:${projectId}`,
@@ -8231,9 +8239,28 @@ async function intelligenceRoutes(app) {
8231
8239
  if (request.query.runId) {
8232
8240
  conditions.push(eq11(insights.runId, request.query.runId));
8233
8241
  }
8242
+ const typeFilter = request.query.type?.trim();
8243
+ if (typeFilter) {
8244
+ conditions.push(
8245
+ typeFilter.endsWith("*") ? like(insights.type, `${typeFilter.slice(0, -1)}%`) : eq11(insights.type, typeFilter)
8246
+ );
8247
+ }
8248
+ const severityFilter = request.query.severity?.trim();
8249
+ if (severityFilter) {
8250
+ conditions.push(inArray4(insights.severity, severitiesAtOrAbove(severityFilter)));
8251
+ }
8252
+ let limit;
8253
+ if (request.query.limit !== void 0) {
8254
+ const parsed = Number(request.query.limit);
8255
+ if (!Number.isInteger(parsed) || parsed < 1) {
8256
+ throw validationError(`Invalid limit "${request.query.limit}". Use a positive integer.`);
8257
+ }
8258
+ limit = parsed;
8259
+ }
8234
8260
  const rows = app.db.select().from(insights).where(conditions.length === 1 ? conditions[0] : and6(...conditions)).orderBy(desc4(insights.createdAt)).all();
8235
8261
  const showDismissed = request.query.dismissed === "true";
8236
- const result = rows.filter((r) => showDismissed || !r.dismissed).map(mapInsightRow);
8262
+ let result = rows.filter((r) => showDismissed || !r.dismissed).map(mapInsightRow);
8263
+ if (limit !== void 0) result = result.slice(0, limit);
8237
8264
  return reply.send(result);
8238
8265
  });
8239
8266
  app.get("/projects/:name/insights/:id", async (request, reply) => {
@@ -13050,7 +13077,7 @@ async function visibilityStatsRoutes(app) {
13050
13077
  }
13051
13078
 
13052
13079
  // ../api-routes/src/composites.ts
13053
- import { eq as eq17, and as and12, desc as desc9, sql as sql7, like, or as or4, inArray as inArray9 } from "drizzle-orm";
13080
+ import { eq as eq17, and as and12, desc as desc9, sql as sql7, like as like2, or as or4, inArray as inArray9 } from "drizzle-orm";
13054
13081
  var TOP_INSIGHT_LIMIT = 5;
13055
13082
  var SEARCH_HIT_HARD_LIMIT = 50;
13056
13083
  var SEARCH_SNIPPET_RADIUS = 80;
@@ -13230,7 +13257,7 @@ async function compositeRoutes(app) {
13230
13257
  sql7`${querySnapshots.answerText} LIKE ${pattern} ESCAPE '\\'`,
13231
13258
  sql7`${querySnapshots.citedDomains} LIKE ${pattern} ESCAPE '\\'`,
13232
13259
  sql7`${querySnapshots.rawResponse} LIKE ${pattern} ESCAPE '\\'`,
13233
- like(queries.query, pattern)
13260
+ like2(queries.query, pattern)
13234
13261
  )
13235
13262
  )
13236
13263
  ).orderBy(desc9(querySnapshots.createdAt)).limit(limit + 1).all());
@@ -13238,8 +13265,8 @@ async function compositeRoutes(app) {
13238
13265
  and12(
13239
13266
  eq17(insights.projectId, project.id),
13240
13267
  or4(
13241
- like(insights.title, pattern),
13242
- like(insights.query, pattern),
13268
+ like2(insights.title, pattern),
13269
+ like2(insights.query, pattern),
13243
13270
  sql7`${insights.recommendation} LIKE ${pattern} ESCAPE '\\'`,
13244
13271
  sql7`${insights.cause} LIKE ${pattern} ESCAPE '\\'`
13245
13272
  )
@@ -16765,7 +16792,10 @@ var routeCatalog = [
16765
16792
  parameters: [
16766
16793
  nameParameter,
16767
16794
  { name: "dismissed", in: "query", description: "Include dismissed insights (true/false).", schema: stringSchema },
16768
- { name: "runId", in: "query", description: "Filter by run ID.", schema: stringSchema }
16795
+ { name: "runId", in: "query", description: "Filter by run ID.", schema: stringSchema },
16796
+ { name: "type", in: "query", description: "Filter by insight type. Exact match, or a trailing `*` for a prefix (e.g. `gbp-*`).", schema: stringSchema },
16797
+ { name: "severity", in: "query", description: "Minimum severity (low|medium|high|critical); e.g. `high` returns high + critical.", schema: stringSchema },
16798
+ { name: "limit", in: "query", description: "Cap the number of (newest-first) insights returned.", schema: stringSchema }
16769
16799
  ],
16770
16800
  responses: {
16771
16801
  // TODO: Add `InsightDto` Zod schema in contracts.
@@ -20147,11 +20177,12 @@ function normalizeAttribute(raw) {
20147
20177
  if (typeof v === "boolean" || typeof v === "string") values.push(v);
20148
20178
  }
20149
20179
  for (const s of raw.repeatedEnumValue?.setValues ?? []) values.push(s);
20180
+ const unsetValues = [...raw.repeatedEnumValue?.unsetValues ?? []];
20150
20181
  const uris = [];
20151
20182
  for (const u of raw.uriValues ?? []) {
20152
- if (u?.uri) uris.push(u.uri);
20183
+ if (u.uri) uris.push(u.uri);
20153
20184
  }
20154
- return { name: raw.name ?? "", valueType: raw.valueType ?? "", values, uris };
20185
+ return { name: raw.name ?? "", valueType: raw.valueType ?? "", values, unsetValues, uris };
20155
20186
  }
20156
20187
  function countAttributes(attrs) {
20157
20188
  return attrs.length;
@@ -21390,7 +21421,10 @@ async function googleRoutes(app, opts) {
21390
21421
  locationName: r.locationName,
21391
21422
  attributeCount: r.attributeCount,
21392
21423
  syncedAt: r.syncedAt,
21393
- attributes: r.attributes
21424
+ attributes: r.attributes.map((attr) => ({
21425
+ ...attr,
21426
+ unsetValues: attr.unsetValues ?? []
21427
+ }))
21394
21428
  }));
21395
21429
  return { attributes, total: attributes.length };
21396
21430
  });
package/dist/cli.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  setTelemetrySource,
28
28
  showFirstRunNotice,
29
29
  trackEvent
30
- } from "./chunk-ADTLQHJY.js";
30
+ } from "./chunk-3TTBKG73.js";
31
31
  import {
32
32
  CliError,
33
33
  EXIT_SYSTEM_ERROR,
@@ -44,7 +44,7 @@ import {
44
44
  saveConfig,
45
45
  saveConfigPatch,
46
46
  usageError
47
- } from "./chunk-PK46TKGM.js";
47
+ } from "./chunk-K4QOSPBX.js";
48
48
  import {
49
49
  apiKeys,
50
50
  createClient,
@@ -52,7 +52,7 @@ import {
52
52
  projects,
53
53
  queries,
54
54
  renderReportHtml
55
- } from "./chunk-KBDQ5OE4.js";
55
+ } from "./chunk-ZJADMHJ5.js";
56
56
  import {
57
57
  BacklinkSources,
58
58
  CcReleaseSyncStatuses,
@@ -77,7 +77,7 @@ import {
77
77
  providerQuotaPolicySchema,
78
78
  resolveProviderInput,
79
79
  winnabilityClassSchema
80
- } from "./chunk-AUQNKEHV.js";
80
+ } from "./chunk-PV3RAHMK.js";
81
81
 
82
82
  // src/cli.ts
83
83
  import { pathToFileURL } from "url";
@@ -3534,7 +3534,11 @@ async function gbpAttributes(project, opts) {
3534
3534
  console.log(` ${a.locationName} ${a.attributeCount} attribute(s)`);
3535
3535
  for (const attr of a.attributes) {
3536
3536
  const key = attr.name.replace(/^attributes\//, "");
3537
- const val = attr.uris.length > 0 ? attr.uris.join(", ") : attr.values.join(", ");
3537
+ const val = [
3538
+ ...attr.values.map(String),
3539
+ ...attr.unsetValues.map((v) => `unset:${v}`),
3540
+ ...attr.uris
3541
+ ].join(", ");
3538
3542
  console.log(` ${key}: ${val}`);
3539
3543
  }
3540
3544
  }
@@ -9294,7 +9298,13 @@ var SNAPSHOT_CLI_COMMANDS = [
9294
9298
  // src/commands/insights.ts
9295
9299
  async function listInsights(project, opts) {
9296
9300
  const client = createApiClient();
9297
- const insights = await client.getInsights(project, { dismissed: opts.dismissed, runId: opts.runId });
9301
+ const insights = await client.getInsights(project, {
9302
+ dismissed: opts.dismissed,
9303
+ runId: opts.runId,
9304
+ type: opts.type,
9305
+ severity: opts.severity,
9306
+ limit: opts.limit
9307
+ });
9298
9308
  if (opts.format === "json") {
9299
9309
  console.log(JSON.stringify(insights, null, 2));
9300
9310
  return;
@@ -9699,17 +9709,23 @@ function printGaps2(data) {
9699
9709
  var INTELLIGENCE_CLI_COMMANDS = [
9700
9710
  {
9701
9711
  path: ["insights"],
9702
- usage: "canonry insights <project> [--dismissed] [--run-id <id>] [--format json]",
9712
+ usage: "canonry insights <project> [--type <type|prefix*>] [--severity <low|medium|high|critical>] [--limit <n>] [--dismissed] [--run-id <id>] [--format json]",
9703
9713
  options: {
9704
9714
  dismissed: { type: "boolean" },
9705
- "run-id": { type: "string" }
9715
+ "run-id": { type: "string" },
9716
+ type: { type: "string" },
9717
+ severity: { type: "string" },
9718
+ limit: { type: "string" }
9706
9719
  },
9707
9720
  run: async (input) => {
9708
- const usage = "canonry insights <project> [--dismissed] [--run-id <id>] [--format json]";
9721
+ const usage = "canonry insights <project> [--type <type|prefix*>] [--severity <low|medium|high|critical>] [--limit <n>] [--dismissed] [--run-id <id>] [--format json]";
9709
9722
  const project = requireProject(input, "insights", usage);
9710
9723
  const dismissed = input.values.dismissed === true;
9711
9724
  const runId = getString(input.values, "run-id");
9712
- await listInsights(project, { dismissed, runId, format: input.format });
9725
+ const type = getString(input.values, "type");
9726
+ const severity = getString(input.values, "severity");
9727
+ const limit = parseIntegerOption(input, "limit", { message: "limit must be an integer", usage, command: "insights" });
9728
+ await listInsights(project, { dismissed, runId, type, severity, limit, format: input.format });
9713
9729
  }
9714
9730
  },
9715
9731
  {
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-ADTLQHJY.js";
3
+ } from "./chunk-3TTBKG73.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-PK46TKGM.js";
7
- import "./chunk-KBDQ5OE4.js";
8
- import "./chunk-AUQNKEHV.js";
6
+ } from "./chunk-K4QOSPBX.js";
7
+ import "./chunk-ZJADMHJ5.js";
8
+ import "./chunk-PV3RAHMK.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-KBDQ5OE4.js";
4
- import "./chunk-AUQNKEHV.js";
3
+ } from "./chunk-ZJADMHJ5.js";
4
+ import "./chunk-PV3RAHMK.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-PK46TKGM.js";
6
+ } from "./chunk-K4QOSPBX.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-AUQNKEHV.js";
9
+ } from "./chunk-PV3RAHMK.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": "@ainyc/canonry",
3
- "version": "4.93.0",
3
+ "version": "4.94.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",
@@ -63,26 +63,26 @@
63
63
  "tsup": "^8.5.1",
64
64
  "tsx": "^4.19.0",
65
65
  "@ainyc/canonry-api-client": "0.0.0",
66
- "@ainyc/canonry-api-routes": "0.0.0",
67
66
  "@ainyc/canonry-contracts": "0.0.0",
68
67
  "@ainyc/canonry-config": "0.0.0",
69
- "@ainyc/canonry-integration-bing": "0.0.0",
70
- "@ainyc/canonry-integration-openai-ads": "0.0.0",
71
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
68
+ "@ainyc/canonry-api-routes": "0.0.0",
72
69
  "@ainyc/canonry-db": "0.0.0",
73
- "@ainyc/canonry-integration-google": "0.0.0",
70
+ "@ainyc/canonry-integration-bing": "0.0.0",
74
71
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
72
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
73
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
75
74
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
76
- "@ainyc/canonry-integration-google-places": "0.0.0",
77
- "@ainyc/canonry-integration-wordpress": "0.0.0",
75
+ "@ainyc/canonry-integration-google": "0.0.0",
78
76
  "@ainyc/canonry-integration-traffic": "0.0.0",
79
- "@ainyc/canonry-provider-cdp": "0.0.0",
80
77
  "@ainyc/canonry-intelligence": "0.0.0",
81
- "@ainyc/canonry-provider-local": "0.0.0",
78
+ "@ainyc/canonry-integration-google-places": "0.0.0",
79
+ "@ainyc/canonry-provider-cdp": "0.0.0",
80
+ "@ainyc/canonry-integration-wordpress": "0.0.0",
81
+ "@ainyc/canonry-provider-claude": "0.0.0",
82
82
  "@ainyc/canonry-provider-gemini": "0.0.0",
83
83
  "@ainyc/canonry-provider-openai": "0.0.0",
84
- "@ainyc/canonry-provider-claude": "0.0.0",
85
- "@ainyc/canonry-provider-perplexity": "0.0.0"
84
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
85
+ "@ainyc/canonry-provider-local": "0.0.0"
86
86
  },
87
87
  "scripts": {
88
88
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",