@canonry/canonry 7.71.0 → 7.72.1

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 (133) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +1 -1
  2. package/assets/assets/{AgentSetupPage-DexQKsfX.js → AgentSetupPage-D39M9CRK.js} +1 -1
  3. package/assets/assets/{AuditHistoryPanel-C0tKUYig.js → AuditHistoryPanel-BS-iFyHX.js} +1 -1
  4. package/assets/assets/{BacklinksPage-CXKsDXhy.js → BacklinksPage-BW2bEGF4.js} +1 -1
  5. package/assets/assets/{HistoryPage-D1UkPELF.js → HistoryPage-Dh6o2iVd.js} +1 -1
  6. package/assets/assets/MeasurementPropertyPage-DL9cbtVz.js +4 -0
  7. package/assets/assets/{ProjectPage-DVQora-C.js → ProjectPage-DXh97uDN.js} +5 -5
  8. package/assets/assets/{RunsPage-CnPgX-bf.js → RunsPage-BM4ETLsm.js} +1 -1
  9. package/assets/assets/SettingsPage-DpJTB2-Q.js +1 -0
  10. package/assets/assets/SiteHealthSection-CmlMQ17V.js +2 -0
  11. package/assets/assets/{ToneBadge-aGjnkfBI.js → ToneBadge-CmvL5mFG.js} +1 -1
  12. package/assets/assets/{TrafficPage-DIa6lxo2.js → TrafficPage-ClH3Dxnm.js} +4 -4
  13. package/assets/assets/{TrafficSourceDetailPage-BTFJ4JkC.js → TrafficSourceDetailPage-DE-NyNGz.js} +1 -1
  14. package/assets/assets/{account-context-RobEwj-E.js → account-context-BwV6ox8O.js} +1 -1
  15. package/assets/assets/{card-BLjXAqaV.js → card-DhkoBNyY.js} +1 -1
  16. package/assets/assets/{extract-error-message-BnVETQ_r.js → extract-error-message-dNDtiSBo.js} +1 -1
  17. package/assets/assets/{format-helpers-2INiLwsz.js → format-helpers-Bt4tx-f3.js} +1 -1
  18. package/assets/assets/{index-zdoJudA4.js → index-MbApCekj.js} +16 -16
  19. package/assets/assets/{query-client-BMplcUQL.js → query-client-D-zMw63p.js} +1 -1
  20. package/assets/assets/{react-query-BYjj2p2M.js → react-query-EdiRRB2q.js} +1 -1
  21. package/assets/assets/{react-sigma_core.esm.min-CerNhJzW.js → react-sigma_core.esm.min-Bidr1Gxk.js} +1 -1
  22. package/assets/assets/service-BUi8JgGI.js +1 -0
  23. package/assets/index.html +7 -7
  24. package/dist/{ads-P75E4E3Q.js → ads-FFUUMS4J.js} +3 -3
  25. package/dist/{agent-WKTCTJL7.js → agent-LCD2VG7C.js} +7 -7
  26. package/dist/{agent-ask-CI4I5UER.js → agent-ask-OBHTCYFR.js} +3 -3
  27. package/dist/{agent-conversations-2LXN6PC5.js → agent-conversations-VMZ4NFIX.js} +3 -3
  28. package/dist/{agent-memory-STJUYUEI.js → agent-memory-UPFJFNWC.js} +3 -3
  29. package/dist/{agent-providers-HRQCKR57.js → agent-providers-4GOWLBZK.js} +3 -3
  30. package/dist/{agent-transcript-SMNVT5UA.js → agent-transcript-RGXIVZUP.js} +3 -3
  31. package/dist/{analytics-GZRA5LS4.js → analytics-FBK4XV5P.js} +3 -3
  32. package/dist/{apply-QXMZGXAY.js → apply-Y2DVE3YB.js} +3 -3
  33. package/dist/{backfill-3VVYI6XX.js → backfill-7SGCPH6J.js} +9 -9
  34. package/dist/{backlinks-VUTZFYJY.js → backlinks-YWHFC7DZ.js} +3 -3
  35. package/dist/{bing-DKYPVXU4.js → bing-7BP3DWPK.js} +3 -3
  36. package/dist/{bootstrap-3CMHZS6G.js → bootstrap-Z7QSKVPL.js} +10 -10
  37. package/dist/{cdp-XP4RGCA6.js → cdp-OL6RENO3.js} +7 -7
  38. package/dist/{chunk-SNCRERSZ.js → chunk-3AG3LPZX.js} +1 -1
  39. package/dist/{chunk-JCECURGF.js → chunk-4LTL5RNY.js} +4 -4
  40. package/dist/{chunk-ALXQPMYR.js → chunk-6MYHGP46.js} +1 -1
  41. package/dist/{chunk-SZSJALQM.js → chunk-7KOAP47B.js} +21 -8
  42. package/dist/{chunk-T6IV35KG.js → chunk-ATT3ZCSS.js} +2 -2
  43. package/dist/{chunk-U6EUBP4B.js → chunk-BADJCT6U.js} +1 -1
  44. package/dist/{chunk-JB4NDUWJ.js → chunk-BZZDFIY2.js} +1 -1
  45. package/dist/{chunk-Z6BDB4KS.js → chunk-DFCKSJQI.js} +4 -4
  46. package/dist/{chunk-ETMB45WP.js → chunk-DRGCVTYH.js} +1 -1
  47. package/dist/{chunk-WE3SK5GQ.js → chunk-GA2EHZTI.js} +4 -4
  48. package/dist/{chunk-XSRKTGRG.js → chunk-GPTRCOKV.js} +38 -21
  49. package/dist/{chunk-VLFPI3T3.js → chunk-H4HNXCDF.js} +2 -2
  50. package/dist/{chunk-ILLWCY2P.js → chunk-IV6VZ63E.js} +3 -3
  51. package/dist/{chunk-FNVUPIMW.js → chunk-IZMT4WLZ.js} +2 -2
  52. package/dist/{chunk-WHH7HWN7.js → chunk-J523Y7X2.js} +1 -1
  53. package/dist/{chunk-3NOFNFGV.js → chunk-JE5QURTR.js} +1 -1
  54. package/dist/{chunk-WNBN4FYE.js → chunk-JEBY6MS6.js} +1 -1
  55. package/dist/{chunk-K4S2T6C5.js → chunk-JO73L677.js} +2 -2
  56. package/dist/{chunk-DEMNY4YE.js → chunk-MJYO6UK2.js} +2 -2
  57. package/dist/{chunk-IX7AKQBJ.js → chunk-NZZWJCKS.js} +3 -3
  58. package/dist/{chunk-EDQ4V4PJ.js → chunk-O7WOCTBD.js} +13 -1
  59. package/dist/{chunk-OOXR7SZ5.js → chunk-P3UGNR2Y.js} +4 -4
  60. package/dist/{chunk-NPHBHVAY.js → chunk-PPM6Z7CM.js} +1 -1
  61. package/dist/{chunk-AVNEHYTZ.js → chunk-Q25JQANW.js} +1 -1
  62. package/dist/{chunk-2G3J62KV.js → chunk-QDN3FL2A.js} +1 -1
  63. package/dist/{chunk-JEC5Z22M.js → chunk-QKMGGM4B.js} +5 -5
  64. package/dist/{chunk-JHCIMIB5.js → chunk-TEDY3MHN.js} +3 -3
  65. package/dist/{chunk-DP5V4C3I.js → chunk-TOX6HAQJ.js} +3 -3
  66. package/dist/{chunk-AAPMP2T3.js → chunk-TUVG7BIF.js} +8 -8
  67. package/dist/{chunk-ZCIC3DLS.js → chunk-UWBJWKDQ.js} +2 -2
  68. package/dist/{chunk-C3ZH2HLV.js → chunk-WJ2JU32O.js} +5 -5
  69. package/dist/{chunk-QREFWO3Q.js → chunk-XR6ZVMYK.js} +1 -1
  70. package/dist/{chunk-KRDMSGNZ.js → chunk-YFITKHCV.js} +334 -334
  71. package/dist/{chunk-A3NSYJJL.js → chunk-YXAKL5HM.js} +9 -1
  72. package/dist/{citations-X24SQ4ZU.js → citations-RVSC67GE.js} +3 -3
  73. package/dist/{cli-catalog-RYUJEUAY.js → cli-catalog-NEZE5QU5.js} +3 -3
  74. package/dist/{cli-commands-DFTOVHCU.js → cli-commands-HGCYU4MQ.js} +7 -7
  75. package/dist/cli.js +13 -13
  76. package/dist/{competitor-4GIR3D4Q.js → competitor-BX3M3OYS.js} +3 -3
  77. package/dist/{content-FPMODFJ4.js → content-PKJMVMHJ.js} +3 -3
  78. package/dist/{dashboard-IJCLC5MW.js → dashboard-SVHZBVM6.js} +6 -6
  79. package/dist/{demo-52GRHFQH.js → demo-HYDPECCK.js} +1 -1
  80. package/dist/{demo-server-QZPEIXU2.js → demo-server-KEOO7WFO.js} +11 -11
  81. package/dist/{discover-Y7I3V75V.js → discover-JDP44ZHX.js} +3 -3
  82. package/dist/{discover-eval-TS67TA2C.js → discover-eval-6ORCVYYR.js} +3 -3
  83. package/dist/{doctor-E3OPJGNR.js → doctor-TVZRMBSS.js} +3 -3
  84. package/dist/{evidence-HBPR3QYE.js → evidence-FNIAFBBG.js} +3 -3
  85. package/dist/{export-cmd-AXSRXCD5.js → export-cmd-HQNF2SSD.js} +3 -3
  86. package/dist/{ga-JXHGIEMK.js → ga-PIO5OXMK.js} +3 -3
  87. package/dist/{gbp-4M54KRXG.js → gbp-3R5FME43.js} +3 -3
  88. package/dist/{google-TBZLFQTN.js → google-BYZREX2O.js} +4 -4
  89. package/dist/{google-marketing-EFUITED7.js → google-marketing-SPQ2GW6X.js} +1 -1
  90. package/dist/{health-cmd-5SCHBHXS.js → health-cmd-HH5RYMSV.js} +3 -3
  91. package/dist/{history-BLOGMFLZ.js → history-Q35NLLMJ.js} +3 -3
  92. package/dist/index.d.ts +84 -67
  93. package/dist/index.js +24 -24
  94. package/dist/{init-2WCCRDYU.js → init-TV4ZKAAW.js} +11 -11
  95. package/dist/{insights-AUTLWRQS.js → insights-SH73B4PD.js} +3 -3
  96. package/dist/intelligence-service-YNHDEY4M.js +15 -0
  97. package/dist/{journeys-7Y3HE5AX.js → journeys-SIV7HPW7.js} +3 -3
  98. package/dist/{keys-3T65JGMW.js → keys-O656YWSW.js} +3 -3
  99. package/dist/{keyword-2MQEXEYJ.js → keyword-FZ2N4EW7.js} +3 -3
  100. package/dist/{logs-4AWZCX2X.js → logs-2NPN7HBI.js} +3 -3
  101. package/dist/{mcp-RCMC554F.js → mcp-RHQY3DV6.js} +2 -2
  102. package/dist/mcp.js +9 -9
  103. package/dist/{measurement-plan-HFPXGBVZ.js → measurement-plan-JQKVSJRL.js} +5 -5
  104. package/dist/{notify-GEUMV4QL.js → notify-VTAYBHC6.js} +3 -3
  105. package/dist/{organic-evidence-TAH2R2U4.js → organic-evidence-HPXXEPOW.js} +3 -3
  106. package/dist/{overview-WBZW5QMX.js → overview-FSBNDYZJ.js} +4 -4
  107. package/dist/{project-52XSBNDM.js → project-MAPPXURS.js} +3 -3
  108. package/dist/{query-7DHBS2QS.js → query-R6DLPIPJ.js} +3 -3
  109. package/dist/{research-VDLJDU72.js → research-FXKOEUQB.js} +3 -3
  110. package/dist/{results-export-4XMDISAJ.js → results-export-X2PUM63S.js} +3 -3
  111. package/dist/{run-NQ664S64.js → run-6ENTG4IO.js} +4 -4
  112. package/dist/{schedule-CFG2I3BJ.js → schedule-DMMVRT7P.js} +3 -3
  113. package/dist/{search-Q5HSLPLD.js → search-FHI6APT7.js} +3 -3
  114. package/dist/{serve-4X3LDV6K.js → serve-76BGQFPW.js} +25 -25
  115. package/dist/{session-3JP36MHE.js → session-JBTIV7SS.js} +12 -12
  116. package/dist/{settings-Y7RLRCLF.js → settings-FMB4QED4.js} +3 -3
  117. package/dist/{skills-ZVV7HCF5.js → skills-HBIMHSOI.js} +2 -2
  118. package/dist/{snapshot-UAWGXBKI.js → snapshot-RBA2EL7R.js} +3 -3
  119. package/dist/{src-6ZMVHPAY.js → src-BXXGJOQB.js} +2 -2
  120. package/dist/{status-A2FZZJ4M.js → status-ATFDFAVG.js} +4 -4
  121. package/dist/{technical-aeo-HXGF72PP.js → technical-aeo-JWQTGCTB.js} +6 -4
  122. package/dist/{telemetry-7SHJAUQD.js → telemetry-6QFGJL2I.js} +4 -4
  123. package/dist/{tools-3HY3R5J5.js → tools-4VRHKUBE.js} +11 -11
  124. package/dist/{traffic-6LPWSVRR.js → traffic-5R7M4CK5.js} +5 -5
  125. package/dist/{users-UHABRTME.js → users-24TIUYJY.js} +3 -3
  126. package/dist/{visibility-stats-Z5D6ITSA.js → visibility-stats-YLQPPBJJ.js} +3 -3
  127. package/dist/{wordpress-HEIQZGMP.js → wordpress-7VDPHMUZ.js} +3 -3
  128. package/package.json +2 -2
  129. package/assets/assets/MeasurementPropertyPage-CsSUHpB7.js +0 -4
  130. package/assets/assets/SettingsPage-DfiH_eyL.js +0 -1
  131. package/assets/assets/SiteHealthSection-BTfTcF_w.js +0 -2
  132. package/assets/assets/service-DM_6LxOl.js +0 -1
  133. package/dist/intelligence-service-XDGWLXW4.js +0 -15
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-DEMNY4YE.js";
5
+ } from "./chunk-MJYO6UK2.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-3NOFNFGV.js";
8
+ } from "./chunk-JE5QURTR.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-U6EUBP4B.js";
11
+ } from "./chunk-BADJCT6U.js";
12
12
  import {
13
13
  AGENT_NONE,
14
14
  OutcomeSurfaces,
@@ -19,7 +19,7 @@ import {
19
19
  integrationConnectionPropertiesSchema,
20
20
  normalizeAgentSlug,
21
21
  usageSurfaceSchema
22
- } from "./chunk-A3NSYJJL.js";
22
+ } from "./chunk-YXAKL5HM.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  API_PROVIDER_NAMES,
3
3
  ProviderNames
4
- } from "./chunk-A3NSYJJL.js";
4
+ } from "./chunk-YXAKL5HM.js";
5
5
 
6
6
  // src/provider-registration.ts
7
7
  function isApiProviderRegistrable(name, entry) {
@@ -9,14 +9,14 @@ import {
9
9
  normalizeCloudflareWorkerEvent,
10
10
  sessionizeJourneyRequests,
11
11
  verifyRequestSignature
12
- } from "./chunk-WNBN4FYE.js";
12
+ } from "./chunk-JEBY6MS6.js";
13
13
  import {
14
14
  currentOutcomeAttribution,
15
15
  getRequestContext,
16
16
  registerRequestContext,
17
17
  requestAuditIdentity,
18
18
  sanitizeRequestContext
19
- } from "./chunk-U6EUBP4B.js";
19
+ } from "./chunk-BADJCT6U.js";
20
20
  import {
21
21
  SentimentIdempotencyConflict,
22
22
  SentimentRepository,
@@ -156,7 +156,7 @@ import {
156
156
  userSessions,
157
157
  users,
158
158
  writeNegativeReviewMaxStars
159
- } from "./chunk-EDQ4V4PJ.js";
159
+ } from "./chunk-O7WOCTBD.js";
160
160
  import {
161
161
  ADS_ACTIVATE_SCOPE,
162
162
  ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
@@ -1194,7 +1194,7 @@ import {
1194
1194
  wordpressSchemaDeployResultDtoSchema,
1195
1195
  wordpressSchemaStatusResultDtoSchema,
1196
1196
  wordpressStatusDtoSchema
1197
- } from "./chunk-A3NSYJJL.js";
1197
+ } from "./chunk-YXAKL5HM.js";
1198
1198
 
1199
1199
  // ../api-routes/src/user-session.ts
1200
1200
  import crypto2 from "crypto";
@@ -7433,8 +7433,15 @@ var SentimentService = class {
7433
7433
  result: sentimentResults.result,
7434
7434
  returnedModel: sentimentResults.returnedModel
7435
7435
  }).from(sentimentWorkItems).leftJoin(sentimentResults, eq15(sentimentResults.workItemId, sentimentWorkItems.id)).where(scope).all();
7436
- const inputs = withInput ? new Map(this.db.select({ id: sentimentWorkItems.id, input: sentimentWorkItems.input }).from(sentimentWorkItems).where(scope).all().map((row) => [row.id, row.input])) : null;
7437
- return rows.flatMap(({ resultOutcome, result, returnedModel, ...work }) => {
7436
+ const admitted = rows.filter((row) => allowed.has(`${row.snapshotId}:${row.sourceTextHash}:${row.subjectHash}`));
7437
+ const inputs = withInput ? /* @__PURE__ */ new Map() : null;
7438
+ if (inputs) {
7439
+ const ids = admitted.map((row) => row.id);
7440
+ for (let index = 0; index < ids.length; index += 500) {
7441
+ for (const row of this.db.select({ id: sentimentWorkItems.id, input: sentimentWorkItems.input }).from(sentimentWorkItems).where(and9(scope, inArray6(sentimentWorkItems.id, ids.slice(index, index + 500)))).all()) inputs.set(row.id, row.input);
7442
+ }
7443
+ }
7444
+ return admitted.flatMap(({ resultOutcome, result, returnedModel, ...work }) => {
7438
7445
  const member = allowed.get(`${work.snapshotId}:${work.sourceTextHash}:${work.subjectHash}`);
7439
7446
  if (!member) return [];
7440
7447
  const edges = member.edges.filter((edge) => matchesSentimentEdge(edge, filter));
@@ -42312,7 +42319,7 @@ var routeCatalog = [
42312
42319
  { name: "nodeKey", in: "query", description: "Return only the page with this node key. Combined with a filter it answers whether that exact page is in the filtered set, without paging through the list.", schema: stringSchema },
42313
42320
  { name: "healthState", in: "query", description: "Filter by the derived Site Health state shared with the dashboard and agents. Unlike `indexabilityState` this folds fetch state, canonical identity, and the crawler reasons into one decision. `hidden` means the SITE told answer engines not to index the page (noindex, canonical-away, robots.txt); a non-HTML file is `resource` and a redirect is `redirect`, because neither is suppressed. Values: `eligible`, `hidden`, `resource`, `redirect`, `failed`, `unchecked`.", schema: { type: "string", enum: ["eligible", "hidden", "resource", "redirect", "failed", "unchecked"] } },
42314
42321
  { name: "auditState", in: "query", description: "Filter by audit state. A URL version has `url-version`: it was fetched and classified but not scored.", schema: stringSchema },
42315
- { name: "urlVersions", in: "query", description: "URL versions are parameter addresses (filters, views, cache settings) whose canonical names the same path, so the site marks them as copies of that page. The audit does not score them or count them in fixes, and `inventorySummary.urlVersions` counts them. `include` (default) keeps every crawled address, `exclude` lists pages only, as the dashboard does, and `only` lists the URL versions, each with `urlVersionOf`. Scans made before URL versions were set aside have none.", schema: { type: "string", enum: ["include", "exclude", "only"] } },
42322
+ { name: "urlVersions", in: "query", description: "URL versions are parameter addresses (filters, views, cache settings) whose canonical names the same path, so the site marks them as copies of that page. The audit does not score them or count them in fixes, and `inventorySummary.urlVersions` counts them. `include` (default) keeps every crawled address, `exclude` lists pages only, as the dashboard does, and `only` lists the URL versions, each with `urlVersionOf`. Once a few addresses with the same parameter pattern prove to be copies, the crawl stops fetching that pattern: those have no rows and `inventorySummary.urlVersionsNotFetched` counts them. Scans made before URL versions were set aside have none.", schema: { type: "string", enum: ["include", "exclude", "only"] } },
42316
42323
  { name: "sort", in: "query", description: "Sort order. Defaults to `url`.", schema: { type: "string", enum: ["url", "path", "score-asc", "score-desc"] } },
42317
42324
  crawlCursorParameter,
42318
42325
  crawlLimitParameter
@@ -72580,13 +72587,19 @@ async function technicalAeoRoutes(app, opts) {
72580
72587
  const total = groups.reduce((sum, group) => sum + group.pages, 0);
72581
72588
  const eligible = groups.reduce((sum, group) => sum + (group.inventoryEligible ? group.pages : 0), 0);
72582
72589
  const urlVersions = app.db.select({ value: count8() }).from(siteCrawlPages).where(and83(inScope, isNotNull10(siteCrawlPages.urlVersionOf))).get()?.value ?? 0;
72590
+ const urlVersionsNotFetched = app.db.select({ value: siteCrawlAttempts.urlVersionsSkipped }).from(siteCrawlAttempts).where(and83(
72591
+ eq100(siteCrawlAttempts.projectId, scope.projectId),
72592
+ eq100(siteCrawlAttempts.runId, scope.runId),
72593
+ eq100(siteCrawlAttempts.id, scope.attemptId)
72594
+ )).get()?.value ?? 0;
72583
72595
  return {
72584
72596
  scope: "selected-snapshot",
72585
72597
  total,
72586
72598
  eligible,
72587
72599
  excluded: total - eligible,
72588
72600
  excludedReasons: reasonCounts(groups.filter((group) => !group.inventoryEligible)),
72589
- urlVersions
72601
+ urlVersions,
72602
+ urlVersionsNotFetched
72590
72603
  };
72591
72604
  };
72592
72605
  const completenessOf = (target) => ({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadConfig
3
- } from "./chunk-3NOFNFGV.js";
3
+ } from "./chunk-JE5QURTR.js";
4
4
  import {
5
5
  PACKAGE_VERSION
6
6
  } from "./chunk-AOJU5LKX.js";
@@ -36,7 +36,7 @@ import {
36
36
  sentimentSettingsReadSchema,
37
37
  sentimentSummaryReadSchema,
38
38
  upgradeCommandFor
39
- } from "./chunk-A3NSYJJL.js";
39
+ } from "./chunk-YXAKL5HM.js";
40
40
 
41
41
  // ../api-client-generated/src/generated/core/bodySerializer.gen.ts
42
42
  var jsonBodySerializer = {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  USAGE_TELEMETRY_HEADERS,
3
3
  redactLogString
4
- } from "./chunk-A3NSYJJL.js";
4
+ } from "./chunk-YXAKL5HM.js";
5
5
 
6
6
  // ../api-routes/src/request-context.ts
7
7
  import { AsyncLocalStorage } from "async_hooks";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cloudflareQueueNameSchema
3
- } from "./chunk-A3NSYJJL.js";
3
+ } from "./chunk-YXAKL5HM.js";
4
4
 
5
5
  // src/cloudflare-traffic-config.ts
6
6
  function unsupportedDeliveryMode(deliveryMode) {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  registeredProviderNames
3
- } from "./chunk-ALXQPMYR.js";
3
+ } from "./chunk-6MYHGP46.js";
4
4
  import {
5
5
  configExists,
6
6
  loadConfigRaw
7
- } from "./chunk-3NOFNFGV.js";
7
+ } from "./chunk-JE5QURTR.js";
8
8
 
9
9
  // src/setup-state.ts
10
10
  import fs from "fs";
@@ -28,7 +28,7 @@ async function buildSetupState() {
28
28
  }
29
29
  if (dbPath && fs.existsSync(dbPath)) {
30
30
  try {
31
- const { createClient, projects, queries: queriesTable } = await import("./src-6ZMVHPAY.js");
31
+ const { createClient, projects, queries: queriesTable } = await import("./src-BXXGJOQB.js");
32
32
  const db = createClient(dbPath);
33
33
  project_count = db.select({ id: projects.id }).from(projects).all().length;
34
34
  const firstQuery = db.select({ id: queriesTable.id }).from(queriesTable).limit(1).all();
@@ -47,7 +47,7 @@ function queueServeHandoff() {
47
47
  async function runPendingServeHandoff(format) {
48
48
  if (!pendingServeHandoff) return;
49
49
  pendingServeHandoff = false;
50
- const { serveCommand } = await import("./serve-4X3LDV6K.js");
50
+ const { serveCommand } = await import("./serve-76BGQFPW.js");
51
51
  await serveCommand(format);
52
52
  }
53
53
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hostMatchesDomain
3
- } from "./chunk-A3NSYJJL.js";
3
+ } from "./chunk-YXAKL5HM.js";
4
4
 
5
5
  // src/citation-utils.ts
6
6
  function pickProjectCitedDomain(citedDomains, projectDomains) {
@@ -2,11 +2,11 @@ import {
2
2
  dedupeGscSitemapUrls,
3
3
  resolveDiscoveredGscSitemapUrls,
4
4
  submitGscSitemapBatches
5
- } from "./chunk-WHH7HWN7.js";
5
+ } from "./chunk-J523Y7X2.js";
6
6
  import {
7
7
  measurementDraftOperationSchema,
8
8
  runMeasurementDraftAction
9
- } from "./chunk-SNCRERSZ.js";
9
+ } from "./chunk-3AG3LPZX.js";
10
10
  import {
11
11
  CliError
12
12
  } from "./chunk-HGMYEDAQ.js";
@@ -177,7 +177,7 @@ import {
177
177
  trafficSeriesGranularitySchema,
178
178
  visibilityCompareSelectionSchema,
179
179
  visibilityReportRequestSchema
180
- } from "./chunk-A3NSYJJL.js";
180
+ } from "./chunk-YXAKL5HM.js";
181
181
 
182
182
  // src/mcp/tool-registry.ts
183
183
  import { z as z2 } from "zod";
@@ -1035,7 +1035,7 @@ var technicalAeoCrawlPagesInputSchema = z2.object({
1035
1035
  fetchState: z2.string().min(1).optional().describe("Filter crawler fetch state, for example html, redirect, non-html, or fetch-error."),
1036
1036
  indexabilityState: z2.string().min(1).optional().describe("Filter crawler-derived indexability state. This is not Google index coverage."),
1037
1037
  auditState: z2.string().min(1).optional().describe("Filter audit state. url-version marks a URL version: fetched and classified, not scored."),
1038
- urlVersions: z2.enum(["include", "exclude", "only"]).optional().describe("URL versions are parameter addresses whose canonical names the same path, so the site marks them as copies of that page; the audit does not score them or count them in fixes. include (default) keeps every address, exclude lists pages only (the dashboard view), only lists the URL versions with urlVersionOf."),
1038
+ urlVersions: z2.enum(["include", "exclude", "only"]).optional().describe("URL versions are parameter addresses whose canonical names the same path, so the site marks them as copies of that page; the audit does not score them or count them in fixes. include (default) keeps every address, exclude lists pages only (the dashboard view), only lists the URL versions with urlVersionOf. Once a few addresses with one parameter pattern prove to be copies, the crawl stops fetching that pattern; those have no rows and inventorySummary.urlVersionsNotFetched counts them."),
1039
1039
  sort: z2.enum(["url", "path", "score-asc", "score-desc"]).optional(),
1040
1040
  cursor: z2.string().min(1).optional().describe("Opaque cursor from the previous crawl-pages result."),
1041
1041
  limit: z2.number().int().positive().max(200).optional()
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  answerServiceAdapters,
3
3
  answerServiceDescriptors
4
- } from "./chunk-QREFWO3Q.js";
4
+ } from "./chunk-XR6ZVMYK.js";
5
5
  import {
6
6
  AeroLlmUsageFeatures,
7
7
  aeroTurnStatus,
@@ -27,14 +27,14 @@ import {
27
27
  resolveConfiguredAgentProvider,
28
28
  resolveSessionProviderAndModel,
29
29
  setAeroSystemPrompt
30
- } from "./chunk-C3ZH2HLV.js";
30
+ } from "./chunk-WJ2JU32O.js";
31
31
  import {
32
32
  AeroToolProfiles,
33
33
  AeroToolScopes,
34
34
  buildAeroStateTools,
35
35
  isAeroToolProfile,
36
36
  truncateToolResult
37
- } from "./chunk-OOXR7SZ5.js";
37
+ } from "./chunk-P3UGNR2Y.js";
38
38
  import {
39
39
  getGoogleAuthConfig,
40
40
  getGoogleConnection,
@@ -53,7 +53,7 @@ import {
53
53
  removeCloudflareTrafficConnection,
54
54
  removeCloudflareTrafficConnectionBySourceId,
55
55
  upsertCloudflareTrafficConnection
56
- } from "./chunk-JB4NDUWJ.js";
56
+ } from "./chunk-BZZDFIY2.js";
57
57
  import {
58
58
  claudeAdapter,
59
59
  embedQueries,
@@ -64,7 +64,7 @@ import {
64
64
  openaiAdapter,
65
65
  openrouterAdapter,
66
66
  perplexityAdapter
67
- } from "./chunk-K4S2T6C5.js";
67
+ } from "./chunk-JO73L677.js";
68
68
  import {
69
69
  classifyUsageSurface,
70
70
  createApiUsageTelemetry,
@@ -76,7 +76,7 @@ import {
76
76
  startOutcomeTimer,
77
77
  trackFeatureCompleted,
78
78
  trackInstallState
79
- } from "./chunk-JCECURGF.js";
79
+ } from "./chunk-4LTL5RNY.js";
80
80
  import {
81
81
  isLoopbackBindHost
82
82
  } from "./chunk-TSENU4GG.js";
@@ -84,7 +84,7 @@ import {
84
84
  isApiProviderRegistrable,
85
85
  isCdpProviderRegistrable,
86
86
  registeredProviderNames
87
- } from "./chunk-ALXQPMYR.js";
87
+ } from "./chunk-6MYHGP46.js";
88
88
  import {
89
89
  checkLatestVersionForServer,
90
90
  getOrCreateAnonymousId,
@@ -95,17 +95,17 @@ import {
95
95
  recordDashboardEvent,
96
96
  setTelemetryPreference,
97
97
  trackEvent
98
- } from "./chunk-DEMNY4YE.js";
98
+ } from "./chunk-MJYO6UK2.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-ILLWCY2P.js";
101
+ } from "./chunk-IV6VZ63E.js";
102
102
  import {
103
103
  CANONRY_MCP_TIERS,
104
104
  CANONRY_MCP_TOOLKIT_NAMES
105
105
  } from "./chunk-NDTU7FGL.js";
106
106
  import {
107
107
  ApiClient
108
- } from "./chunk-T6IV35KG.js";
108
+ } from "./chunk-ATT3ZCSS.js";
109
109
  import {
110
110
  AGENT_PROVIDERS,
111
111
  adapterSupportsBatch,
@@ -136,21 +136,21 @@ import {
136
136
  saveConfigPatch,
137
137
  sentimentInstallReadiness,
138
138
  updateSharedProviderExecutionGate
139
- } from "./chunk-3NOFNFGV.js";
139
+ } from "./chunk-JE5QURTR.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
- } from "./chunk-NPHBHVAY.js";
142
+ } from "./chunk-PPM6Z7CM.js";
143
143
  import {
144
144
  computeFactorAverages,
145
145
  deleteSiteCrawlGraphLayout,
146
146
  persistSiteCrawlGraphLayout,
147
147
  prepareSiteCrawlGraphLayout,
148
148
  recordedSharePct
149
- } from "./chunk-FNVUPIMW.js";
149
+ } from "./chunk-IZMT4WLZ.js";
150
150
  import {
151
151
  CanonryMcpToolNames,
152
152
  canonryMcpTools
153
- } from "./chunk-WE3SK5GQ.js";
153
+ } from "./chunk-GA2EHZTI.js";
154
154
  import {
155
155
  PACKAGE_VERSION
156
156
  } from "./chunk-AOJU5LKX.js";
@@ -162,11 +162,11 @@ import {
162
162
  addLogListener,
163
163
  createFastifyLogger,
164
164
  createLogger
165
- } from "./chunk-JEC5Z22M.js";
165
+ } from "./chunk-QKMGGM4B.js";
166
166
  import {
167
167
  computeCitedCompetitorDomains,
168
168
  determineCitationState
169
- } from "./chunk-ETMB45WP.js";
169
+ } from "./chunk-DRGCVTYH.js";
170
170
  import {
171
171
  BingApiError,
172
172
  CC_CACHE_DIR,
@@ -286,7 +286,7 @@ import {
286
286
  webhookResponseReason,
287
287
  webhookTargetRefusalReason,
288
288
  writeAuditLog
289
- } from "./chunk-SZSJALQM.js";
289
+ } from "./chunk-7KOAP47B.js";
290
290
  import {
291
291
  OperationalLogStore,
292
292
  SentimentIdempotencyConflict,
@@ -372,7 +372,7 @@ import {
372
372
  siteLivenessState,
373
373
  trafficSources,
374
374
  usageCounters
375
- } from "./chunk-EDQ4V4PJ.js";
375
+ } from "./chunk-O7WOCTBD.js";
376
376
  import {
377
377
  AGENT_MEMORY_VALUE_MAX_BYTES,
378
378
  AI_ENGINE_DOMAINS,
@@ -624,7 +624,7 @@ import {
624
624
  winnabilityClassLabel,
625
625
  withRetry,
626
626
  withSkippedProviders
627
- } from "./chunk-A3NSYJJL.js";
627
+ } from "./chunk-YXAKL5HM.js";
628
628
 
629
629
  // src/google-marketing-runtime.ts
630
630
  import crypto2 from "crypto";
@@ -5807,7 +5807,7 @@ function nonBlank(value) {
5807
5807
  return trimmed ? trimmed : void 0;
5808
5808
  }
5809
5809
  function resolveBuildCommit(env = process.env) {
5810
- const embedded = true ? "9caa25b0ba175e5a81276cef6fe4c541f3f40073" : void 0;
5810
+ const embedded = true ? "f363ee51db531415324bfdb27933588afe17a5f3" : void 0;
5811
5811
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5812
5812
  }
5813
5813
  function resolveInstanceIdentity(env = process.env) {
@@ -11884,6 +11884,7 @@ var log14 = createLogger("SiteAudit");
11884
11884
  var SiteAuditCancelledError = class extends Error {
11885
11885
  name = "SiteAuditCancelledError";
11886
11886
  };
11887
+ var SITE_AUDIT_SKIP_URL_VERSIONS_AFTER = 3;
11887
11888
  var NON_PAGE_MEDIA_EXTENSIONS = /\.(?:jpe?g|png|gif|webp|avif|bmp|ico|tiff?|svg|mp4|webm|mov|avi|mp3|wav|ogg|woff2?|ttf|otf|eot)(?:$|\?)/i;
11888
11889
  var NON_PAGE_MEDIA_CONTENT_TYPE = /^(?:image|video|audio|font)\//i;
11889
11890
  function isNonPageMedia(page) {
@@ -12317,6 +12318,8 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
12317
12318
  pagesFetched: progress.pagesFetched,
12318
12319
  pagesEligible: event.type === "summary" ? observedPages.size === 0 ? 0 : [...observedPages.values()].filter(isInventoryEligible).length : sql6`${siteCrawlAttempts.pagesEligible}`,
12319
12320
  pagesErrored: event.type === "summary" ? observedErrorCount(observedPages.values()) : sql6`${siteCrawlAttempts.pagesErrored}`,
12321
+ // Only the summary knows how many URL versions the crawl left unfetched.
12322
+ urlVersionsSkipped: event.type === "summary" ? event.summary.urlVersions?.skipped ?? 0 : sql6`${siteCrawlAttempts.urlVersionsSkipped}`,
12320
12323
  edgesDiscovered: progress.edgesObserved,
12321
12324
  updatedAt: now
12322
12325
  }).where(eq18(siteCrawlAttempts.id, attemptId)).run();
@@ -12361,6 +12364,7 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
12361
12364
  checkDeadLinks: opts.checkDeadLinks ?? false,
12362
12365
  includeGeo: opts.includeGeo ?? false,
12363
12366
  includeAgentSkills: opts.includeAgentSkills ?? true,
12367
+ skipUrlVersionsAfter: SITE_AUDIT_SKIP_URL_VERSIONS_AFTER,
12364
12368
  signal: opts.signal,
12365
12369
  onEvent: persistEvent
12366
12370
  });
@@ -12560,7 +12564,20 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
12560
12564
  if (current?.status === "cancelled") throw new SiteAuditCancelledError(`Site audit cancelled before publication: ${runId}`);
12561
12565
  throw new Error(`Site audit run was no longer running before publication: ${runId}`);
12562
12566
  }
12563
- log14.info("completed", { runId, projectId, status: terminalStatus, complete: crawlSummary.complete, pages: crawlSummary.pagesObserved });
12567
+ log14.info("completed", {
12568
+ runId,
12569
+ projectId,
12570
+ status: terminalStatus,
12571
+ complete: crawlSummary.complete,
12572
+ pages: crawlSummary.pagesObserved,
12573
+ urlVersionsSkipped: crawlSummary.urlVersions?.skipped ?? 0,
12574
+ urlVersionPatterns: (crawlSummary.urlVersions?.patterns ?? []).map((pattern) => ({
12575
+ section: pattern.section,
12576
+ parameters: pattern.parameters,
12577
+ copies: pattern.copies,
12578
+ skipped: pattern.skipped
12579
+ }))
12580
+ });
12564
12581
  trackSiteAuditOutcome(db, {
12565
12582
  runId,
12566
12583
  projectId,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  trackIntegrationConnection
3
- } from "./chunk-JCECURGF.js";
3
+ } from "./chunk-4LTL5RNY.js";
4
4
  import {
5
5
  cliRuntimeContext
6
- } from "./chunk-DEMNY4YE.js";
6
+ } from "./chunk-MJYO6UK2.js";
7
7
 
8
8
  // src/cli-connection-telemetry.ts
9
9
  function trackCliConnection(properties) {
@@ -6,12 +6,12 @@ import {
6
6
  import {
7
7
  createApiClient,
8
8
  runWithUsageTags
9
- } from "./chunk-T6IV35KG.js";
9
+ } from "./chunk-ATT3ZCSS.js";
10
10
  import {
11
11
  canonryMcpTools,
12
12
  mcpOutputSchema,
13
13
  toolOperationAccess
14
- } from "./chunk-WE3SK5GQ.js";
14
+ } from "./chunk-GA2EHZTI.js";
15
15
  import {
16
16
  PACKAGE_VERSION
17
17
  } from "./chunk-AOJU5LKX.js";
@@ -24,7 +24,7 @@ import {
24
24
  isReadOnlyKey,
25
25
  restrictedWriteScopes,
26
26
  upgradeCaveatFor
27
- } from "./chunk-A3NSYJJL.js";
27
+ } from "./chunk-YXAKL5HM.js";
28
28
 
29
29
  // src/mcp/server.ts
30
30
  import { randomUUID } from "crypto";
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-EDQ4V4PJ.js";
8
+ } from "./chunk-O7WOCTBD.js";
9
9
  import {
10
10
  SITE_CRAWL_GRAPH_MAX_EDGES,
11
11
  SITE_CRAWL_GRAPH_MAX_NODES,
@@ -15,7 +15,7 @@ import {
15
15
  factorStatusFromDistribution,
16
16
  factorStatusFromScore,
17
17
  roundPreservingTotal
18
- } from "./chunk-A3NSYJJL.js";
18
+ } from "./chunk-YXAKL5HM.js";
19
19
 
20
20
  // src/site-audit-factors.ts
21
21
  function recordedSharePct(factor) {
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-HGMYEDAQ.js";
5
5
  import {
6
6
  describeError
7
- } from "./chunk-A3NSYJJL.js";
7
+ } from "./chunk-YXAKL5HM.js";
8
8
 
9
9
  // src/gsc-sitemap-submission.ts
10
10
  function dedupeGscSitemapUrls(urls) {
@@ -20,7 +20,7 @@ import {
20
20
  resolveProviderModel,
21
21
  schedulableRunKindSchema,
22
22
  sentimentEvaluatorProviderSchema
23
- } from "./chunk-A3NSYJJL.js";
23
+ } from "./chunk-YXAKL5HM.js";
24
24
 
25
25
  // ../config/src/index.ts
26
26
  import { z as z4 } from "zod";
@@ -8,7 +8,7 @@ import {
8
8
  classifyJourneyEntry,
9
9
  hostMatchesDomain,
10
10
  hostOf
11
- } from "./chunk-A3NSYJJL.js";
11
+ } from "./chunk-YXAKL5HM.js";
12
12
 
13
13
  // ../integration-traffic/src/ip-ranges/amazonbot.json
14
14
  var amazonbot_default = {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseJsonColumn
3
- } from "./chunk-EDQ4V4PJ.js";
3
+ } from "./chunk-O7WOCTBD.js";
4
4
  import {
5
5
  AI_ENGINE_DOMAINS,
6
6
  AI_ENGINE_SELF_DOMAINS,
@@ -26,7 +26,7 @@ import {
26
26
  retryAfterDelayMs,
27
27
  usageCount,
28
28
  withRetry
29
- } from "./chunk-A3NSYJJL.js";
29
+ } from "./chunk-YXAKL5HM.js";
30
30
 
31
31
  // ../provider-openai/src/normalize.ts
32
32
  import OpenAI from "openai";
@@ -5,7 +5,7 @@ import {
5
5
  loadConfig,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-3NOFNFGV.js";
8
+ } from "./chunk-JE5QURTR.js";
9
9
  import {
10
10
  CANONRY_NPM_PACKAGE_URL,
11
11
  compareSemver,
@@ -18,7 +18,7 @@ import {
18
18
  updateCheckEnvOptOut,
19
19
  upgradeCaveatFor,
20
20
  upgradeCommandFor
21
- } from "./chunk-A3NSYJJL.js";
21
+ } from "./chunk-YXAKL5HM.js";
22
22
 
23
23
  // src/runtime-context.ts
24
24
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -3,7 +3,7 @@ import {
3
3
  resolveCliAccess,
4
4
  resolveCliAccessForInvocation,
5
5
  windowOptions
6
- } from "./chunk-2G3J62KV.js";
6
+ } from "./chunk-QDN3FL2A.js";
7
7
  import {
8
8
  emitJsonl
9
9
  } from "./chunk-Z7IUAJOF.js";
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-HGMYEDAQ.js";
15
15
  import {
16
16
  OperationAccesses
17
- } from "./chunk-A3NSYJJL.js";
17
+ } from "./chunk-YXAKL5HM.js";
18
18
 
19
19
  // src/cli-catalog.ts
20
20
  import { createRequire } from "module";
@@ -111,7 +111,7 @@ async function dispatchRegisteredCommand(args, fallbackFormat, specs) {
111
111
  const accessValue = accessFilterFromArgs(argsWithoutHelp);
112
112
  validateAccessFilter(accessValue);
113
113
  if (fallbackFormat !== "text") {
114
- const { printCliCatalog: printCliCatalog2 } = await import("./cli-catalog-RYUJEUAY.js");
114
+ const { printCliCatalog: printCliCatalog2 } = await import("./cli-catalog-NEZE5QU5.js");
115
115
  const group2 = argsWithoutHelp.find((arg) => !arg.startsWith("--"));
116
116
  printCliCatalog2(specs, fallbackFormat, group2, accessValue);
117
117
  return true;
@@ -20,7 +20,7 @@ import {
20
20
  templateLinkRatio,
21
21
  templateLinkUbiquityAvailable,
22
22
  validationError
23
- } from "./chunk-A3NSYJJL.js";
23
+ } from "./chunk-YXAKL5HM.js";
24
24
  import {
25
25
  __export
26
26
  } from "./chunk-MLKGABMK.js";
@@ -1298,6 +1298,8 @@ var siteCrawlAttempts = sqliteTable2("site_crawl_attempts", {
1298
1298
  pagesFetched: integer2("pages_fetched").notNull().default(0),
1299
1299
  pagesEligible: integer2("pages_eligible").notNull().default(0),
1300
1300
  pagesErrored: integer2("pages_errored").notNull().default(0),
1301
+ /** URL versions the crawl recognised by parameter pattern and did not fetch; they have no page rows. */
1302
+ urlVersionsSkipped: integer2("url_versions_skipped").notNull().default(0),
1301
1303
  edgesDiscovered: integer2("edges_discovered").notNull().default(0),
1302
1304
  startedAt: text2("started_at"),
1303
1305
  finishedAt: text2("finished_at"),
@@ -8272,6 +8274,16 @@ var MIGRATION_VERSIONS = [
8272
8274
  statements: [
8273
8275
  `ALTER TABLE site_crawl_pages ADD COLUMN url_version_of TEXT`
8274
8276
  ]
8277
+ },
8278
+ {
8279
+ // URL versions a crawl skipped without fetching, once their parameter
8280
+ // pattern proved to make copies. They have no page rows, so the count
8281
+ // lives on the attempt. 0 for earlier scans, which fetched every address.
8282
+ version: 198,
8283
+ name: "site-crawl-url-versions-skipped",
8284
+ statements: [
8285
+ `ALTER TABLE site_crawl_attempts ADD COLUMN url_versions_skipped INTEGER NOT NULL DEFAULT 0`
8286
+ ]
8275
8287
  }
8276
8288
  ];
8277
8289
  var AERO_LEDGER_REBUILDS = [
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  runWithUsageTags
3
- } from "./chunk-T6IV35KG.js";
3
+ } from "./chunk-ATT3ZCSS.js";
4
4
  import {
5
5
  CanonryMcpToolNames,
6
6
  canonryMcpTools
7
- } from "./chunk-WE3SK5GQ.js";
7
+ } from "./chunk-GA2EHZTI.js";
8
8
  import {
9
9
  CliError
10
10
  } from "./chunk-HGMYEDAQ.js";
11
11
  import {
12
12
  buildOpenApiDocument
13
- } from "./chunk-SZSJALQM.js";
13
+ } from "./chunk-7KOAP47B.js";
14
14
  import {
15
15
  DEFAULT_COMPETITOR_AUTO_ALIAS_MODE,
16
16
  MeasurementPortfolioLists,
@@ -23,7 +23,7 @@ import {
23
23
  seoDatasetWithoutVendor,
24
24
  seoProviderSchema,
25
25
  truncateUtf16
26
- } from "./chunk-A3NSYJJL.js";
26
+ } from "./chunk-YXAKL5HM.js";
27
27
 
28
28
  // src/agent/tools.ts
29
29
  import { Type as Type2 } from "@earendil-works/pi-ai";
@@ -15,7 +15,7 @@ import {
15
15
  formatCanonryPluginUpdateHint,
16
16
  formatCanonryPluginVersionMismatch,
17
17
  skillsClientSchema
18
- } from "./chunk-A3NSYJJL.js";
18
+ } from "./chunk-YXAKL5HM.js";
19
19
 
20
20
  // src/commands/skills.ts
21
21
  import crypto from "crypto";