@canonry/canonry 4.165.2 → 4.167.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/assets/assets/{AuditHistoryPanel-DYBAiNCu.js → AuditHistoryPanel-Dvz6QFtW.js} +1 -1
  2. package/assets/assets/{BacklinksPage-p19FCIyh.js → BacklinksPage-BHOtOIr5.js} +1 -1
  3. package/assets/assets/{HistoryPage-CRSuA-J0.js → HistoryPage-Bc5Nx6dX.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-Bgr9VeUk.js → MeasurementPropertyPage-D4FIFiWv.js} +1 -1
  5. package/assets/assets/ProjectPage-CT5ZD7_A.js +9 -0
  6. package/assets/assets/{RunRow-_RMMaLPt.js → RunRow-CB2oG45_.js} +1 -1
  7. package/assets/assets/{RunsPage-CaDPSEfE.js → RunsPage-OLbocIOY.js} +1 -1
  8. package/assets/assets/SettingsPage-DVdPBrap.js +1 -0
  9. package/assets/assets/{SiteHealthSection-Byp_Fu5K.js → SiteHealthSection-B1bjMCqY.js} +3 -3
  10. package/assets/assets/{TrafficPage-BXkXNKYB.js → TrafficPage-BUWXjHhw.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-CReS8q0H.js → TrafficSourceDetailPage-DwoFzTu7.js} +1 -1
  12. package/assets/assets/{extract-error-message-CHW-A3AQ.js → extract-error-message-CNH2-nPH.js} +1 -1
  13. package/assets/assets/{index-CcS2bDjR.js → index-DdXb59Rg.js} +20 -20
  14. package/assets/assets/{react-sigma_core.esm.min-Cm0RA3Iv.js → react-sigma_core.esm.min-DLRh4X_G.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-BJLIMWL2.js → chunk-7M3QVRJD.js} +134 -57
  17. package/dist/{chunk-J56XZGG6.js → chunk-P5LR3NDQ.js} +6 -5
  18. package/dist/{chunk-UVDX2Y4N.js → chunk-SXENNCJF.js} +104 -96
  19. package/dist/{chunk-P2CQ57UV.js → chunk-TP4KXU3E.js} +20 -2
  20. package/dist/cli.js +36 -29
  21. package/dist/index.js +4 -4
  22. package/dist/{intelligence-service-QGBYYNWV.js → intelligence-service-ULDOVV5Y.js} +2 -2
  23. package/dist/mcp.js +2 -2
  24. package/package.json +11 -11
  25. package/assets/assets/ProjectPage-D6-9qYKU.js +0 -9
  26. package/assets/assets/SettingsPage-Dcp71zcu.js +0 -1
@@ -158,6 +158,21 @@ function internalError(message, details) {
158
158
  function runtimeStateMissing(message, details) {
159
159
  return new AppError("RUNTIME_STATE_MISSING", message, 503, details);
160
160
  }
161
+ function describeError(err) {
162
+ if (err instanceof Error) return err.message;
163
+ if (typeof err === "string") return err;
164
+ if (err === null || err === void 0) return "unknown error";
165
+ try {
166
+ const json = JSON.stringify(err);
167
+ if (json !== void 0) return json;
168
+ } catch {
169
+ }
170
+ try {
171
+ return String(err);
172
+ } catch {
173
+ return "unknown error";
174
+ }
175
+ }
161
176
 
162
177
  // ../contracts/src/provider.ts
163
178
  import { z } from "zod";
@@ -8702,8 +8717,8 @@ var siteCrawlCountsSchema = z25.object({
8702
8717
  var siteCrawlDeadLinksSummarySchema = z25.discriminatedUnion("state", [
8703
8718
  z25.object({ state: z25.literal("unavailable") }),
8704
8719
  z25.object({ state: z25.literal("disabled") }),
8705
- z25.object({ state: z25.literal("complete"), checked: z25.number().int().nonnegative(), found: z25.number().int().nonnegative() }),
8706
- z25.object({ state: z25.literal("partial"), checked: z25.number().int().nonnegative(), found: z25.number().int().nonnegative() })
8720
+ z25.object({ state: z25.literal("complete"), checked: z25.number().int().nonnegative(), found: z25.number().int().nonnegative(), unverified: z25.number().int().nonnegative() }),
8721
+ z25.object({ state: z25.literal("partial"), checked: z25.number().int().nonnegative(), found: z25.number().int().nonnegative(), unverified: z25.number().int().nonnegative() })
8707
8722
  ]);
8708
8723
  var siteCrawlSummarySchema = z25.object({
8709
8724
  project: z25.string(),
@@ -9385,6 +9400,7 @@ var siteCrawlDeadLinksResponseSchema = z25.discriminatedUnion("state", [
9385
9400
  checkDeadLinks: z25.literal(true),
9386
9401
  checked: z25.number().int().nonnegative(),
9387
9402
  found: z25.number().int().nonnegative(),
9403
+ unverified: z25.number().int().nonnegative(),
9388
9404
  total: z25.number().int().nonnegative(),
9389
9405
  nextCursor: z25.string().nullable(),
9390
9406
  deadLinks: z25.array(siteCrawlDeadLinkSchema).default([])
@@ -9396,6 +9412,7 @@ var siteCrawlDeadLinksResponseSchema = z25.discriminatedUnion("state", [
9396
9412
  checkDeadLinks: z25.literal(true),
9397
9413
  checked: z25.number().int().nonnegative(),
9398
9414
  found: z25.number().int().nonnegative(),
9415
+ unverified: z25.number().int().nonnegative(),
9399
9416
  total: z25.number().int().nonnegative(),
9400
9417
  nextCursor: z25.string().nullable(),
9401
9418
  deadLinks: z25.array(siteCrawlDeadLinkSchema).default([])
@@ -15010,6 +15027,7 @@ export {
15010
15027
  missingDependency,
15011
15028
  internalError,
15012
15029
  runtimeStateMissing,
15030
+ describeError,
15013
15031
  DEFAULT_MEASUREMENT_CONFIG,
15014
15032
  gaMeasurementAnalysisWindowSchema,
15015
15033
  gaMeasurementHostScopeSchema,
package/dist/cli.js CHANGED
@@ -31,7 +31,7 @@ import {
31
31
  showFirstRunNotice,
32
32
  trackCliCommandFinished,
33
33
  trackEvent
34
- } from "./chunk-UVDX2Y4N.js";
34
+ } from "./chunk-SXENNCJF.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-J56XZGG6.js";
54
+ } from "./chunk-P5LR3NDQ.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-BJLIMWL2.js";
68
+ } from "./chunk-7M3QVRJD.js";
69
69
  import {
70
70
  AdsDeliverySnapshotStatuses,
71
71
  AdsHistoricalCampaignRollupStatuses,
@@ -100,6 +100,7 @@ import {
100
100
  adsPauseRequestSchema,
101
101
  backlinkSourceSchema,
102
102
  buildModelChangeNotice,
103
+ describeError,
103
104
  discoveryBucketSchema,
104
105
  discoveryCompetitorTypeSchema,
105
106
  effectiveDomains,
@@ -129,7 +130,7 @@ import {
129
130
  providerQuotaPolicySchema,
130
131
  resolveProviderInput,
131
132
  winnabilityClassSchema
132
- } from "./chunk-P2CQ57UV.js";
133
+ } from "./chunk-TP4KXU3E.js";
133
134
 
134
135
  // src/cli.ts
135
136
  import { pathToFileURL } from "url";
@@ -1180,7 +1181,7 @@ async function bingRefresh(project, format) {
1180
1181
  );
1181
1182
  for (const r of results) {
1182
1183
  if (r.status === "rejected") {
1183
- errors.push(r.reason instanceof Error ? r.reason.message : String(r.reason));
1184
+ errors.push(describeError(r.reason));
1184
1185
  }
1185
1186
  }
1186
1187
  if (!isMachineFormat(format)) {
@@ -1522,7 +1523,7 @@ async function cdpStatus(format) {
1522
1523
  console.log("Launch Chrome with: chrome --remote-debugging-port=9222");
1523
1524
  }
1524
1525
  } catch (err) {
1525
- const msg = err instanceof Error ? err.message : String(err);
1526
+ const msg = describeError(err);
1526
1527
  if (msg.includes("501") || msg.includes("not configured")) {
1527
1528
  if (isMachineFormat(format)) {
1528
1529
  console.log(JSON.stringify({
@@ -1586,7 +1587,7 @@ async function cdpScreenshot(query, opts) {
1586
1587
  }
1587
1588
  }
1588
1589
  } catch (err) {
1589
- const msg = err instanceof Error ? err.message : String(err);
1590
+ const msg = describeError(err);
1590
1591
  throw new CliError({
1591
1592
  code: "CDP_SCREENSHOT_FAILED",
1592
1593
  message: `CDP screenshot failed: ${msg}`,
@@ -1699,7 +1700,7 @@ function summarizeAngles(sessions) {
1699
1700
  };
1700
1701
  }
1701
1702
  function errorMessage(err) {
1702
- return err instanceof Error ? err.message : String(err);
1703
+ return describeError(err);
1703
1704
  }
1704
1705
  async function discoverRun(project, opts) {
1705
1706
  const client = getClient4();
@@ -3005,8 +3006,8 @@ function readRequest(inputPath, schema) {
3005
3006
  if (err instanceof CliError) throw err;
3006
3007
  throw new CliError({
3007
3008
  code: "ADS_INPUT_INVALID",
3008
- message: err instanceof Error ? err.message : String(err),
3009
- displayMessage: `Error: invalid ads JSON input (${err instanceof Error ? err.message : String(err)})`,
3009
+ message: describeError(err),
3010
+ displayMessage: `Error: invalid ads JSON input (${describeError(err)})`,
3010
3011
  details: { inputPath }
3011
3012
  });
3012
3013
  }
@@ -3881,7 +3882,7 @@ async function gaConnect(project, opts) {
3881
3882
  JSON.parse(content);
3882
3883
  body.keyJson = content;
3883
3884
  } catch (e) {
3884
- const msg = e instanceof Error ? e.message : String(e);
3885
+ const msg = describeError(e);
3885
3886
  throw new CliError({
3886
3887
  code: "GA_KEY_FILE_READ_ERROR",
3887
3888
  message: `Failed to read key file: ${msg}`,
@@ -5694,7 +5695,7 @@ function configString(value, fallback = "(unset)") {
5694
5695
  return typeof value === "string" ? value : fallback;
5695
5696
  }
5696
5697
  function errorMessage2(error) {
5697
- return error instanceof Error ? error.message : String(error);
5698
+ return describeError(error);
5698
5699
  }
5699
5700
  function requireCloudflareQueueOption(project, value, option) {
5700
5701
  if (value?.trim()) return value.trim();
@@ -5998,7 +5999,7 @@ async function trafficConnectWordpress(project, opts) {
5998
5999
  try {
5999
6000
  applicationPassword = fs19.readFileSync(opts.appPasswordFile, "utf-8").trim();
6000
6001
  } catch (e) {
6001
- const msg = e instanceof Error ? e.message : String(e);
6002
+ const msg = describeError(e);
6002
6003
  throw new CliError({
6003
6004
  code: "TRAFFIC_WP_APP_PASSWORD_FILE_READ_ERROR",
6004
6005
  message: `Failed to read --app-password-file: ${msg}`,
@@ -6058,7 +6059,7 @@ async function trafficConnectCloudRun(project, opts) {
6058
6059
  keyJson = fs19.readFileSync(opts.serviceAccountKey, "utf-8");
6059
6060
  JSON.parse(keyJson);
6060
6061
  } catch (e) {
6061
- const msg = e instanceof Error ? e.message : String(e);
6062
+ const msg = describeError(e);
6062
6063
  throw new CliError({
6063
6064
  code: "TRAFFIC_KEY_FILE_READ_ERROR",
6064
6065
  message: `Failed to read service-account key: ${msg}`,
@@ -6119,7 +6120,7 @@ async function trafficConnectVercel(project, opts) {
6119
6120
  try {
6120
6121
  token = fs19.readFileSync(opts.tokenFile, "utf-8").trim();
6121
6122
  } catch (e) {
6122
- const msg = e instanceof Error ? e.message : String(e);
6123
+ const msg = describeError(e);
6123
6124
  throw new CliError({
6124
6125
  code: "TRAFFIC_VERCEL_TOKEN_FILE_READ_ERROR",
6125
6126
  message: `Failed to read --token-file: ${msg}`,
@@ -7517,7 +7518,7 @@ async function submitGscSitemaps(client, project, opts) {
7517
7518
  if (index === 0) throw cause;
7518
7519
  const attempted = aggregate.summary.total + batchSitemapUrls.length;
7519
7520
  const remaining = sitemapUrls.length - attempted;
7520
- const causeDetails = cause instanceof CliError ? { code: cause.code, message: cause.message, details: cause.details } : { message: cause instanceof Error ? cause.message : String(cause) };
7521
+ const causeDetails = cause instanceof CliError ? { code: cause.code, message: cause.message, details: cause.details } : { message: describeError(cause) };
7521
7522
  throw new CliError({
7522
7523
  code: "GOOGLE_SITEMAP_SUBMISSION_PARTIAL",
7523
7524
  message: `Sitemap submission stopped at batch ${index + 1}/${batches.length}; ${aggregate.summary.accepted} accepted, ${aggregate.summary.failed} failed, ${batchSitemapUrls.length} unconfirmed, ${remaining} not attempted.`,
@@ -9277,7 +9278,7 @@ function readJsonConfig(configPath) {
9277
9278
  } catch (err) {
9278
9279
  throw new CliError({
9279
9280
  code: "VALIDATION_ERROR",
9280
- message: `Failed to parse ${configPath}: ${err instanceof Error ? err.message : String(err)}`,
9281
+ message: `Failed to parse ${configPath}: ${describeError(err)}`,
9281
9282
  exitCode: 1,
9282
9283
  details: { configPath }
9283
9284
  });
@@ -9670,7 +9671,7 @@ async function applyConfigFile(filePath) {
9670
9671
  const result = await client.apply(config);
9671
9672
  applied.push(result);
9672
9673
  } catch (err) {
9673
- const msg = err instanceof Error ? err.message : String(err);
9674
+ const msg = describeError(err);
9674
9675
  errors.push(`Document ${i + 1}: ${msg}`);
9675
9676
  }
9676
9677
  }
@@ -9683,7 +9684,7 @@ async function applyConfigs(filePaths, format) {
9683
9684
  try {
9684
9685
  result = await applyConfigFile(filePath);
9685
9686
  } catch (err) {
9686
- const message = err instanceof Error ? err.message : String(err);
9687
+ const message = describeError(err);
9687
9688
  result = {
9688
9689
  filePath,
9689
9690
  applied: [],
@@ -10110,7 +10111,7 @@ async function showHistory(project, format, opts = {}) {
10110
10111
  if (entry.diff != null) console.log(` diff: ${JSON.stringify(entry.diff)}`);
10111
10112
  }
10112
10113
  } catch (err) {
10113
- const message = err instanceof Error ? err.message : String(err);
10114
+ const message = describeError(err);
10114
10115
  throw new CliError({
10115
10116
  code: "HISTORY_FETCH_FAILED",
10116
10117
  message: project ? `Failed to fetch history for project "${project}"` : "Failed to fetch instance history",
@@ -11065,7 +11066,7 @@ async function triggerRunAll(opts) {
11065
11066
  });
11066
11067
  }
11067
11068
  } catch (err) {
11068
- const msg = err instanceof Error ? err.message : String(err);
11069
+ const msg = describeError(err);
11069
11070
  results.push({ project: p.name, runId: "", status: "error", location: null, error: msg });
11070
11071
  }
11071
11072
  }
@@ -13554,7 +13555,7 @@ function stopDaemon(format = "text") {
13554
13555
  }
13555
13556
  console.log(`Canonry stopped (PID: ${pid})`);
13556
13557
  } catch (err) {
13557
- const msg = err instanceof Error ? err.message : String(err);
13558
+ const msg = describeError(err);
13558
13559
  throw new CliError({
13559
13560
  code: "DAEMON_STOP_FAILED",
13560
13561
  message: `Failed to stop Canonry (PID: ${pid}): ${msg}`,
@@ -13780,7 +13781,7 @@ async function initCommand(opts) {
13780
13781
  try {
13781
13782
  skillsSummary = await installSkills({ dir: skillsTarget });
13782
13783
  } catch (err) {
13783
- skillsTip = `Skills auto-install failed: ${err instanceof Error ? err.message : String(err)}. Run "canonry skills install" manually.`;
13784
+ skillsTip = `Skills auto-install failed: ${describeError(err)}. Run "canonry skills install" manually.`;
13784
13785
  }
13785
13786
  } else {
13786
13787
  skillsTip = 'Run "canonry skills install" in a project directory to add the canonry + Aero playbook to .claude/skills/ and .codex/skills/.';
@@ -13800,7 +13801,7 @@ async function initCommand(opts) {
13800
13801
  process.chdir(previousCwd);
13801
13802
  }
13802
13803
  } catch (err) {
13803
- mcpTip = `MCP auto-install failed: ${err instanceof Error ? err.message : String(err)}. Run "canonry mcp install --client claude-code" manually.`;
13804
+ mcpTip = `MCP auto-install failed: ${describeError(err)}. Run "canonry mcp install --client claude-code" manually.`;
13804
13805
  }
13805
13806
  } else {
13806
13807
  mcpTip = 'Run "canonry mcp install --client claude-code" in a project directory to register the canonry MCP server in `.mcp.json` for Claude Code sessions.';
@@ -14153,7 +14154,7 @@ async function serveCommand(format = "text") {
14153
14154
  );
14154
14155
  }
14155
14156
  } catch (err) {
14156
- const msg = err instanceof Error ? err.message : String(err);
14157
+ const msg = describeError(err);
14157
14158
  process.stderr.write(`warning: normalized-path backfill skipped: ${msg}
14158
14159
  `);
14159
14160
  }
@@ -14165,7 +14166,7 @@ async function serveCommand(format = "text") {
14165
14166
  );
14166
14167
  }
14167
14168
  } catch (err) {
14168
- const msg = err instanceof Error ? err.message : String(err);
14169
+ const msg = describeError(err);
14169
14170
  process.stderr.write(`warning: ai-referral-paths backfill skipped: ${msg}
14170
14171
  `);
14171
14172
  }
@@ -14223,7 +14224,7 @@ Canonry server running at ${url}`);
14223
14224
  providers: providerNames
14224
14225
  });
14225
14226
  } catch (err) {
14226
- const message = err instanceof Error ? err.message : String(err);
14227
+ const message = describeError(err);
14227
14228
  throw new CliError({
14228
14229
  code: "SERVE_START_FAILED",
14229
14230
  message: `Failed to start server: ${message}`,
@@ -14947,13 +14948,19 @@ async function technicalAeoDeadLinks(project, opts) {
14947
14948
  }
14948
14949
  const lines = [`Dead links: ${res.found} found from ${res.checked} checked (${res.state})`];
14949
14950
  for (const finding of res.deadLinks) lines.push(`${finding.sourceUrl ?? "-"} \u2192 ${finding.targetUrl ?? "-"}`);
14951
+ if (res.unverified > 0) lines.push(unverifiedNote(res.unverified));
14950
14952
  if (res.nextCursor) lines.push(`Next cursor: ${res.nextCursor}`);
14951
14953
  console.log(lines.join("\n"));
14952
14954
  }
14955
+ function unverifiedNote(unverified) {
14956
+ return `${unverified} link${unverified === 1 ? "" : "s"} could not be checked (the crawler never got a response). Not counted as broken; re-run to retry.`;
14957
+ }
14953
14958
  function formatDeadLinkState(value) {
14954
14959
  if (value.state === "disabled") return "disabled (opt in with --check-dead-links)";
14955
14960
  if (value.state === "unavailable") return "unavailable";
14956
- return `${value.found ?? 0} found / ${value.checked ?? 0} checked (${value.state})`;
14961
+ const unverified = value.unverified ?? 0;
14962
+ const suffix = unverified > 0 ? `, ${unverified} unchecked` : "";
14963
+ return `${value.found ?? 0} found / ${value.checked ?? 0} checked${suffix} (${value.state})`;
14957
14964
  }
14958
14965
  async function technicalAeoRun(project, opts) {
14959
14966
  const client = getClient27();
@@ -16347,7 +16354,7 @@ function resolveContent(input, command, usage, options) {
16347
16354
  try {
16348
16355
  return fs17.readFileSync(contentFile, "utf-8");
16349
16356
  } catch (error) {
16350
- const message = error instanceof Error ? error.message : String(error);
16357
+ const message = describeError(error);
16351
16358
  throw usageError(`Error: could not read --content-file "${contentFile}": ${message}`, {
16352
16359
  message: `could not read --content-file "${contentFile}": ${message}`,
16353
16360
  details: { command, usage }
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-UVDX2Y4N.js";
3
+ } from "./chunk-SXENNCJF.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-J56XZGG6.js";
7
- import "./chunk-BJLIMWL2.js";
8
- import "./chunk-P2CQ57UV.js";
6
+ } from "./chunk-P5LR3NDQ.js";
7
+ import "./chunk-7M3QVRJD.js";
8
+ import "./chunk-TP4KXU3E.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-BJLIMWL2.js";
4
- import "./chunk-P2CQ57UV.js";
3
+ } from "./chunk-7M3QVRJD.js";
4
+ import "./chunk-TP4KXU3E.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-J56XZGG6.js";
6
+ } from "./chunk-P5LR3NDQ.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-P2CQ57UV.js";
9
+ } from "./chunk-TP4KXU3E.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.165.2",
3
+ "version": "4.167.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
- "@ainyc/canonry-contracts": "0.0.0",
75
- "@ainyc/canonry-api-routes": "0.0.0",
76
73
  "@ainyc/canonry-config": "0.0.0",
77
74
  "@ainyc/canonry-db": "0.0.0",
75
+ "@ainyc/canonry-api-routes": "0.0.0",
76
+ "@ainyc/canonry-contracts": "0.0.0",
77
+ "@ainyc/canonry-api-client": "0.0.0",
78
78
  "@ainyc/canonry-integration-bing": "0.0.0",
79
+ "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
79
80
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
80
81
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
81
- "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
82
82
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
83
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
84
83
  "@ainyc/canonry-integration-google": "0.0.0",
84
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
85
85
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
86
- "@ainyc/canonry-integration-traffic": "0.0.0",
87
86
  "@ainyc/canonry-integration-google-places": "0.0.0",
87
+ "@ainyc/canonry-integration-traffic": "0.0.0",
88
+ "@ainyc/canonry-provider-cdp": "0.0.0",
88
89
  "@ainyc/canonry-integration-wordpress": "0.0.0",
89
- "@ainyc/canonry-intelligence": "0.0.0",
90
90
  "@ainyc/canonry-provider-claude": "0.0.0",
91
- "@ainyc/canonry-provider-local": "0.0.0",
92
91
  "@ainyc/canonry-provider-gemini": "0.0.0",
93
- "@ainyc/canonry-provider-cdp": "0.0.0",
94
92
  "@ainyc/canonry-provider-openai": "0.0.0",
95
- "@ainyc/canonry-provider-perplexity": "0.0.0"
93
+ "@ainyc/canonry-provider-local": "0.0.0",
94
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
95
+ "@ainyc/canonry-intelligence": "0.0.0"
96
96
  },
97
97
  "scripts": {
98
98
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",