@ainyc/canonry 4.46.0 → 4.46.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.
package/assets/index.html CHANGED
@@ -12,8 +12,8 @@
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-CFKPcvOe.js"></script>
16
- <link rel="stylesheet" crossorigin href="./assets/index-BVHV03Fk.css">
15
+ <script type="module" crossorigin src="./assets/index-CJWNAoK4.js"></script>
16
+ <link rel="stylesheet" crossorigin href="./assets/index-BDMNXVHa.css">
17
17
  </head>
18
18
  <body>
19
19
  <div id="root"></div>
@@ -5,7 +5,7 @@ import {
5
5
  loadConfig,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-GRFMZ7PD.js";
8
+ } from "./chunk-PRNO52YC.js";
9
9
  import {
10
10
  DEFAULT_RUN_HISTORY_LIMIT,
11
11
  IntelligenceService,
@@ -80,7 +80,7 @@ import {
80
80
  smoothedRunDelta,
81
81
  trafficSources,
82
82
  usageCounters
83
- } from "./chunk-TBADB57G.js";
83
+ } from "./chunk-K2TOOQ4F.js";
84
84
  import {
85
85
  AGENT_MEMORY_VALUE_MAX_BYTES,
86
86
  AGENT_PROVIDER_IDS,
@@ -193,7 +193,7 @@ import {
193
193
  visibilityStateFromAnswerMentioned,
194
194
  windowCutoff,
195
195
  wordpressEnvSchema
196
- } from "./chunk-Q7XFJO2V.js";
196
+ } from "./chunk-MM3A2CJK.js";
197
197
 
198
198
  // src/telemetry.ts
199
199
  import crypto from "crypto";
@@ -5636,8 +5636,13 @@ function normalizeDomain(domain) {
5636
5636
  }
5637
5637
  function extractPath(url) {
5638
5638
  if (!url) return "";
5639
- const match = /^https?:\/\/[^/]+(.*)$/.exec(url.trim());
5640
- const path16 = match ? match[1] : url.trim();
5639
+ const trimmed = url.trim();
5640
+ let path16;
5641
+ try {
5642
+ path16 = new URL(trimmed).pathname;
5643
+ } catch {
5644
+ path16 = trimmed;
5645
+ }
5641
5646
  const stripped = path16.replace(/\/+$/, "");
5642
5647
  return stripped || "/";
5643
5648
  }
@@ -11127,7 +11132,7 @@ function buildOperationId(method, path16) {
11127
11132
  }
11128
11133
  return part;
11129
11134
  });
11130
- return [method, ...parts].join("-").replace(/[^a-zA-Z0-9]+(.)/g, (_match, char) => char.toUpperCase()).replace(/^[^a-zA-Z]+/, "");
11135
+ return [method, ...parts].join("-").replace(/[^a-z0-9]+(.)/gi, (_match, char) => char.toUpperCase()).replace(/^[^a-z]+/i, "");
11131
11136
  }
11132
11137
 
11133
11138
  // ../api-routes/src/settings.ts
@@ -12045,7 +12050,9 @@ function escapeRegExp2(str) {
12045
12050
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
12046
12051
  }
12047
12052
  async function runReport(accessToken, propertyId, request) {
12048
- const url = `${GA4_DATA_API_BASE}/properties/${propertyId}:runReport`;
12053
+ validatePropertyId(propertyId);
12054
+ const safePropertyId = encodeURIComponent(propertyId);
12055
+ const url = `${GA4_DATA_API_BASE}/properties/${safePropertyId}:runReport`;
12049
12056
  const res = await fetch(url, {
12050
12057
  method: "POST",
12051
12058
  headers: {
@@ -12119,7 +12126,7 @@ async function batchRunReports(accessToken, propertyId, requests) {
12119
12126
  return data.reports;
12120
12127
  }
12121
12128
  function formatDate2(d) {
12122
- return d.toISOString().split("T")[0];
12129
+ return d.toISOString().slice(0, 10);
12123
12130
  }
12124
12131
  var AI_REFERRAL_SOURCE_FILTERS = [
12125
12132
  { matchType: "CONTAINS", value: "perplexity" },
@@ -12467,7 +12474,8 @@ async function fetchSocialReferrals(accessToken, propertyId, days) {
12467
12474
  const PAGE_SIZE = 1e3;
12468
12475
  const rows = [];
12469
12476
  let offset = 0;
12470
- while (true) {
12477
+ let pageCount = 0;
12478
+ while (pageCount < GA4_MAX_PAGES) {
12471
12479
  const request = {
12472
12480
  dateRanges: [{ startDate: formatDate2(startDate), endDate: formatDate2(endDate) }],
12473
12481
  dimensions: [
@@ -12506,6 +12514,7 @@ async function fetchSocialReferrals(accessToken, propertyId, days) {
12506
12514
  rows.push(...pageRows);
12507
12515
  const totalRows = response.rowCount ?? 0;
12508
12516
  offset += pageRows.length;
12517
+ pageCount += 1;
12509
12518
  if (pageRows.length < PAGE_SIZE || offset >= totalRows) break;
12510
12519
  }
12511
12520
  for (const row of rows) {
@@ -13421,7 +13430,7 @@ async function getCrawlIssues(apiKey, siteUrl) {
13421
13430
  // ../api-routes/src/bing.ts
13422
13431
  function parseBingDate(value) {
13423
13432
  if (!value) return null;
13424
- const match = /\/Date\((-?\d+)[^)]*\)\//.exec(value);
13433
+ const match = /\/Date\((-?\d+)(?:[-+]\d+)?\)\//.exec(value);
13425
13434
  if (!match) return null;
13426
13435
  const ms = parseInt(match[1], 10);
13427
13436
  if (ms <= 0) return null;
@@ -13438,7 +13447,7 @@ function isBlockingIssueType(issueType) {
13438
13447
  if (!issueType) return true;
13439
13448
  const trimmed = issueType.trim();
13440
13449
  if (!trimmed) return true;
13441
- return trimmed.split(/\s+/).some((flag) => !/^(None|Seo(Issues|Concerns))$/i.test(flag));
13450
+ return trimmed.split(/\s+/).some((flag) => !/^(?:None|Seo(?:Issues|Concerns))$/i.test(flag));
13442
13451
  }
13443
13452
  async function loadBlockingCrawlIssues(apiKey, siteUrl, domain) {
13444
13453
  const now = Date.now();
@@ -15163,7 +15172,7 @@ async function fetchText(url) {
15163
15172
  }
15164
15173
  }
15165
15174
  function stripHtml(input) {
15166
- return input.replace(/<script[\s\S]*?<\/script>/gi, " ").replace(/<style[\s\S]*?<\/style>/gi, " ").replace(/<[^>]+>/g, " ").replace(/&nbsp;/gi, " ").replace(/&amp;/gi, "&").replace(/&quot;/gi, '"').replace(/&#39;/gi, "'").replace(/&lt;/gi, "<").replace(/&gt;/gi, ">").replace(/\s+/g, " ").trim();
15175
+ return input.replace(/<script[\s\S]*?<\/script>/gi, " ").replace(/<style[\s\S]*?<\/style>/gi, " ").replace(/<[^>]+>/g, " ").replace(/&nbsp;/gi, " ").replace(/&amp;/gi, "&").replace(/&quot;/gi, '"').replace(/&#39;/g, "'").replace(/&lt;/gi, "<").replace(/&gt;/gi, ">").replace(/\s+/g, " ").trim();
15167
15176
  }
15168
15177
  function extractMetaContent(html, name) {
15169
15178
  const patterns = [
@@ -15183,7 +15192,7 @@ function extractTitle(html) {
15183
15192
  function extractGeneratorVersion(html) {
15184
15193
  const generator = extractMetaContent(html, "generator");
15185
15194
  if (!generator) return null;
15186
- const match = /WordPress\s+([0-9][^ ]*)/i.exec(generator);
15195
+ const match = /WordPress\s+(\d[^ ]*)/i.exec(generator);
15187
15196
  return match?.[1] ?? generator;
15188
15197
  }
15189
15198
  function extractSchemaBlocks(html) {
@@ -17345,7 +17354,7 @@ function numberOrNull(value) {
17345
17354
  }
17346
17355
  function latencyToMs(value) {
17347
17356
  if (!value) return null;
17348
- const secondsMatch = /^([0-9]+(?:\.[0-9]+)?)s$/.exec(value.trim());
17357
+ const secondsMatch = /^(\d+(?:\.\d+)?)s$/.exec(value.trim());
17349
17358
  if (!secondsMatch) return null;
17350
17359
  const seconds = Number(secondsMatch[1]);
17351
17360
  return Number.isFinite(seconds) ? Math.round(seconds * 1e6) / 1e3 : null;
@@ -21542,7 +21551,7 @@ function extractCitedDomainsFromSources(groundingSources) {
21542
21551
  }
21543
21552
  function extractDomainFromTitle(title) {
21544
21553
  const trimmed = title.trim().toLowerCase();
21545
- if (/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z]{2,})+$/.test(trimmed)) {
21554
+ if (/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z]{2,})+$/.test(trimmed)) {
21546
21555
  return trimmed.replace(/^www\./, "");
21547
21556
  }
21548
21557
  return null;
@@ -23156,7 +23165,7 @@ function extractCitedDomains(groundingSources) {
23156
23165
  return [...domains];
23157
23166
  }
23158
23167
  function extractDomainFromTitle2(title) {
23159
- const domainPattern = /^([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i;
23168
+ const domainPattern = /^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i;
23160
23169
  const firstWord = title.split(/[\s\-–—|]/)[0]?.trim();
23161
23170
  if (firstWord && domainPattern.test(firstWord)) {
23162
23171
  return firstWord.replace(/^www\./, "").toLowerCase();
@@ -24016,10 +24025,10 @@ function extractRecommendedCompetitors(answerText, ownDomains, citedDomains, com
24016
24025
  );
24017
24026
  if (knownCompetitorKeys.size === 0) return [];
24018
24027
  const candidatePatterns = [
24019
- /^\s*(?:[-*]|\d+\.)\s+(?:\*\*)?([A-Z0-9][A-Za-z0-9][\w\s.&',/()-]{1,50}?)(?:\*\*)?\s*[:\u2014\u2013–-]/gm,
24020
- /\*\*([A-Z0-9][A-Za-z0-9][\w\s.&',/()-]{1,50}?)\*\*/g,
24028
+ /^\s*(?:[-*]|\d+\.)\s+(?:\*\*)?([A-Z0-9][A-Za-z0-9][\w\s.&',/()-]{1,50}?)(?:\*\*)?\s*[:\u2014\u2013-]/gm,
24029
+ /\*\*([A-Z0-9][A-Za-z0-9][\w\s.&',/()-]{1,50})\*\*/g,
24021
24030
  /^#{1,4}\s+(?:\d+\.\s+)?(?:\*\*)?([A-Z0-9][A-Za-z0-9][\w\s.&',/()-]{1,50}?)(?:\*\*)?$/gm,
24022
- /\[([A-Z0-9][A-Za-z0-9][\w\s.&',/()-]{1,50}?)\]\(https?:\/\/[^\s)]+\)/g
24031
+ /\[([A-Z0-9][A-Za-z0-9][\w\s.&',/()-]{1,50})\]\(https?:\/\/[^\s)]+\)/g
24023
24032
  ];
24024
24033
  const genericKeys = /* @__PURE__ */ new Set([
24025
24034
  "additional",
@@ -24814,7 +24823,7 @@ import { eq as eq29, and as and20 } from "drizzle-orm";
24814
24823
 
24815
24824
  // src/sitemap-parser.ts
24816
24825
  var log3 = createLogger("SitemapParser");
24817
- var LOC_REGEX = /<loc>\s*([^<]+?)\s*<\/loc>/gi;
24826
+ var LOC_REGEX = /<loc>([^<]+)<\/loc>/gi;
24818
24827
  var SITEMAP_TAG_REGEX = /<sitemap>[\s\S]*?<\/sitemap>/gi;
24819
24828
  var PRIVATE_IP_PATTERNS = [
24820
24829
  /^169\.254\./,
@@ -24905,9 +24914,10 @@ async function parseSitemapRecursive(url, urls, visited, depth, isChild) {
24905
24914
  for (const entry of sitemapEntries) {
24906
24915
  const locMatch = LOC_REGEX.exec(entry);
24907
24916
  LOC_REGEX.lastIndex = 0;
24908
- if (locMatch?.[1]) {
24917
+ const inner = locMatch?.[1]?.trim();
24918
+ if (inner) {
24909
24919
  await parseSitemapRecursive(
24910
- locMatch[1],
24920
+ inner,
24911
24921
  urls,
24912
24922
  visited,
24913
24923
  depth + 1,
@@ -24920,8 +24930,9 @@ async function parseSitemapRecursive(url, urls, visited, depth, isChild) {
24920
24930
  }
24921
24931
  let match;
24922
24932
  while ((match = LOC_REGEX.exec(xml)) !== null) {
24923
- if (match[1]) {
24924
- urls.add(match[1]);
24933
+ const inner = match[1]?.trim();
24934
+ if (inner) {
24935
+ urls.add(inner);
24925
24936
  }
24926
24937
  }
24927
24938
  LOC_REGEX.lastIndex = 0;
@@ -25054,7 +25065,7 @@ import { eq as eq30, desc as desc14 } from "drizzle-orm";
25054
25065
  var log5 = createLogger("BingInspectSitemap");
25055
25066
  function parseBingDate2(value) {
25056
25067
  if (!value) return null;
25057
- const match = /\/Date\((-?\d+)[^)]*\)\//.exec(value);
25068
+ const match = /\/Date\((-?\d+)(?:[-+]\d+)?\)\//.exec(value);
25058
25069
  if (!match) return null;
25059
25070
  const ms = parseInt(match[1], 10);
25060
25071
  if (ms <= 0) return null;
@@ -25064,7 +25075,7 @@ function isBlockingIssueType2(issueType) {
25064
25075
  if (!issueType) return true;
25065
25076
  const trimmed = issueType.trim();
25066
25077
  if (!trimmed) return true;
25067
- return trimmed.split(/\s+/).some((flag) => !/^(None|Seo(Issues|Concerns))$/i.test(flag));
25078
+ return trimmed.split(/\s+/).some((flag) => !/^(?:None|Seo(?:Issues|Concerns))$/i.test(flag));
25068
25079
  }
25069
25080
  async function executeBingInspectSitemap(db, runId, projectId, opts) {
25070
25081
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -25781,7 +25792,7 @@ function parseQueryLines(text, max) {
25781
25792
  if (!line) continue;
25782
25793
  line = line.replace(/^\s*(?:\d+[.)]\s*|[-*•]\s*)/, "").replace(/^["']|["']$/g, "").trim();
25783
25794
  if (!line) continue;
25784
- if (/^(here are|sure|certainly|of course|i['']ve|these are|below are)/i.test(line)) continue;
25795
+ if (/^(?:here are|sure|certainly|of course|i[']ve|these are|below are)/i.test(line)) continue;
25785
25796
  const key = line.toLowerCase();
25786
25797
  if (seen.has(key)) continue;
25787
25798
  seen.add(key);
@@ -26314,7 +26325,7 @@ function readStoredGroundingSources(rawResponse) {
26314
26325
  return result;
26315
26326
  }
26316
26327
  async function backfillInsightsCommand(project, opts) {
26317
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-YFBVWCK2.js");
26328
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-R3KDVKIB.js");
26318
26329
  const config = loadConfig();
26319
26330
  const db = createClient(config.database);
26320
26331
  migrate(db);
@@ -27093,7 +27104,7 @@ function parseDescription(body) {
27093
27104
  if (end === -1) return "(no description)";
27094
27105
  const block = body.slice(3, end);
27095
27106
  for (const line of block.split("\n")) {
27096
- const match = line.match(/^description:\s*(.+)$/);
27107
+ const match = line.match(/^description:\s*(\S.*)$/);
27097
27108
  if (match) return match[1].trim().replace(/^["']|["']$/g, "");
27098
27109
  }
27099
27110
  return "(no description)";
@@ -28797,7 +28808,7 @@ function mapAuditFactor(factor) {
28797
28808
  };
28798
28809
  }
28799
28810
  function parseJsonObject(input) {
28800
- const fenced = input.match(/```(?:json)?\s*([\s\S]*?)```/i);
28811
+ const fenced = input.match(/```(?:json)?([\s\S]*?)```/i);
28801
28812
  const candidate = fenced?.[1] ?? input;
28802
28813
  const start = candidate.indexOf("{");
28803
28814
  const end = candidate.lastIndexOf("}");
@@ -28864,7 +28875,6 @@ var API_ADAPTERS = [
28864
28875
  var BROWSER_ADAPTERS = [
28865
28876
  cdpChatgptAdapter
28866
28877
  ];
28867
- var ALL_ADAPTERS = [...API_ADAPTERS, ...BROWSER_ADAPTERS];
28868
28878
  var adapterMap = Object.fromEntries(
28869
28879
  API_ADAPTERS.map((a) => [a.name, a])
28870
28880
  );
@@ -29880,7 +29890,7 @@ function parseQueryResponse(raw, count) {
29880
29890
  let cleaned = line.replace(/^\s*(?:\d+[.)]\s*|[-*•]\s*)/, "").trim();
29881
29891
  cleaned = cleaned.replace(/^["']|["']$/g, "").trim();
29882
29892
  if (!cleaned) continue;
29883
- if (/^(here are|sure|certainly|of course|i've|these are|below are)/i.test(cleaned)) continue;
29893
+ if (/^(?:here are|sure|certainly|of course|i['’]ve|these are|below are)/i.test(cleaned)) continue;
29884
29894
  if (cleaned.split(/\s+/).length > 8) continue;
29885
29895
  const key = cleaned.toLowerCase();
29886
29896
  if (seen.has(key)) continue;
@@ -9,7 +9,7 @@ import {
9
9
  categoryLabel,
10
10
  determineAnswerMentioned,
11
11
  normalizeProjectDomain
12
- } from "./chunk-Q7XFJO2V.js";
12
+ } from "./chunk-MM3A2CJK.js";
13
13
 
14
14
  // src/intelligence-service.ts
15
15
  import { eq, desc, asc, and, or, inArray } from "drizzle-orm";
@@ -2574,8 +2574,8 @@ function analyzeRuns(currentRun, previousRun, opts = {}) {
2574
2574
  }
2575
2575
 
2576
2576
  // ../intelligence/src/query-shape.ts
2577
- var TRANSACTIONAL = /\b(buy|price|pricing|cost|cheap|discount|coupon|deal|sale|trial|plan)\b/i;
2578
- var NAVIGATIONAL = /\b(login|sign[- ]?in|contact|support|help|download|app|homepage)\b|\.(com|io|net|org|app|ai)\b/i;
2577
+ var TRANSACTIONAL = /\b(?:buy|price|pricing|cost|cheap|discount|coupon|deal|sale|trial|plan)\b/i;
2578
+ var NAVIGATIONAL = /\b(?:login|sign[- ]?in|contact|support|help|download|app|homepage)\b|\.(?:com|io|net|org|app|ai)\b/i;
2579
2579
  function isBlogShapedQuery(query) {
2580
2580
  const trimmed = query.trim();
2581
2581
  if (!trimmed) return false;
@@ -2619,8 +2619,12 @@ function buildInventory(input) {
2619
2619
  function extractPath(url) {
2620
2620
  const trimmed = url.trim();
2621
2621
  if (!trimmed) return "";
2622
- const match = /^https?:\/\/[^/]+(.*)$/.exec(trimmed);
2623
- const path = match ? match[1] : trimmed;
2622
+ let path;
2623
+ try {
2624
+ path = new URL(trimmed).pathname;
2625
+ } catch {
2626
+ path = trimmed;
2627
+ }
2624
2628
  const stripped = path.replace(/\/+$/, "");
2625
2629
  return stripped || "/";
2626
2630
  }
@@ -3008,8 +3012,8 @@ function groupInsights(insights2, keyFn = (i) => JSON.stringify([i.query, i.prov
3008
3012
  }
3009
3013
 
3010
3014
  // ../intelligence/src/query-categorize.ts
3011
- var TRANSACTIONAL_RE = /\b(buy|price|pricing|cost|hire|near me|services?|agency|consultant|company)\b/i;
3012
- var INFORMATIONAL_RE = /\b(what|how|why|when|guide|tutorial|vs|versus|alternatives?|examples?|definition)\b/i;
3015
+ var TRANSACTIONAL_RE = /\b(?:buy|price|pricing|cost|hire|near me|services?|agency|consultant|company)\b/i;
3016
+ var INFORMATIONAL_RE = /\b(?:what|how|why|when|guide|tutorial|vs|versus|alternatives?|examples?|definition)\b/i;
3013
3017
  var MIN_BRAND_TOKEN_LENGTH = 3;
3014
3018
  function compact(value) {
3015
3019
  return value.toLowerCase().replace(/[^a-z0-9]/g, "");
@@ -142,7 +142,7 @@ var runDtoSchema = z2.object({
142
142
  error: runErrorSchema.nullable().optional(),
143
143
  createdAt: z2.string()
144
144
  });
145
- var PROVIDER_PREFIX = /^\[provider-[a-zA-Z0-9_-]+\]\s+/;
145
+ var PROVIDER_PREFIX = /^\[provider-[\w-]+\]\s+/;
146
146
  function parseProviderErrorMessage(msg) {
147
147
  const stripped = msg.replace(PROVIDER_PREFIX, "");
148
148
  try {
@@ -2002,7 +2002,7 @@ function normalizeUrlPath(input) {
2002
2002
  trimmed = trimmed.replace(/&nbsp;/g, " ").replace(/\s+/g, " ").trim();
2003
2003
  if (trimmed === "" || trimmed === "/") return "/";
2004
2004
  if (trimmed === "(not set)") return null;
2005
- trimmed = trimmed.replace(/([a-zA-Z0-9])([).]+)$/, "$1");
2005
+ trimmed = trimmed.replace(/([a-z0-9])[).]+$/i, "$1");
2006
2006
  if (trimmed.startsWith("/)") || trimmed.startsWith("/ ")) {
2007
2007
  trimmed = "/";
2008
2008
  }
@@ -22,7 +22,7 @@ import {
22
22
  trafficConnectVercelRequestSchema,
23
23
  trafficConnectWordpressRequestSchema,
24
24
  trafficEventKindSchema
25
- } from "./chunk-Q7XFJO2V.js";
25
+ } from "./chunk-MM3A2CJK.js";
26
26
 
27
27
  // src/config.ts
28
28
  import fs from "fs";
package/dist/cli.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  setTelemetrySource,
22
22
  showFirstRunNotice,
23
23
  trackEvent
24
- } from "./chunk-G2HQOLPK.js";
24
+ } from "./chunk-IYUI74JP.js";
25
25
  import {
26
26
  CliError,
27
27
  EXIT_SYSTEM_ERROR,
@@ -37,14 +37,14 @@ import {
37
37
  saveConfig,
38
38
  saveConfigPatch,
39
39
  usageError
40
- } from "./chunk-GRFMZ7PD.js";
40
+ } from "./chunk-PRNO52YC.js";
41
41
  import {
42
42
  apiKeys,
43
43
  createClient,
44
44
  migrate,
45
45
  projects,
46
46
  queries
47
- } from "./chunk-TBADB57G.js";
47
+ } from "./chunk-K2TOOQ4F.js";
48
48
  import {
49
49
  CcReleaseSyncStatuses,
50
50
  CheckScopes,
@@ -63,7 +63,7 @@ import {
63
63
  providerQuotaPolicySchema,
64
64
  resolveProviderInput,
65
65
  skillsClientSchema
66
- } from "./chunk-Q7XFJO2V.js";
66
+ } from "./chunk-MM3A2CJK.js";
67
67
 
68
68
  // src/cli.ts
69
69
  import { pathToFileURL } from "url";
@@ -7295,7 +7295,7 @@ function resolveBundledSkillsRoot(pkgDir) {
7295
7295
  function parseDescription(content) {
7296
7296
  const fmMatch = /^---\n([\s\S]*?)\n---/.exec(content);
7297
7297
  if (!fmMatch) return "";
7298
- const descMatch = /^description:\s*(.+?)$/m.exec(fmMatch[1]);
7298
+ const descMatch = /^description:\s*(\S.*)$/m.exec(fmMatch[1]);
7299
7299
  if (!descMatch) return "";
7300
7300
  return descMatch[1].replace(/^["']|["']$/g, "").trim();
7301
7301
  }
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-G2HQOLPK.js";
3
+ } from "./chunk-IYUI74JP.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-GRFMZ7PD.js";
7
- import "./chunk-TBADB57G.js";
8
- import "./chunk-Q7XFJO2V.js";
6
+ } from "./chunk-PRNO52YC.js";
7
+ import "./chunk-K2TOOQ4F.js";
8
+ import "./chunk-MM3A2CJK.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-TBADB57G.js";
4
- import "./chunk-Q7XFJO2V.js";
3
+ } from "./chunk-K2TOOQ4F.js";
4
+ import "./chunk-MM3A2CJK.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -2,8 +2,8 @@ import {
2
2
  CliError,
3
3
  canonryMcpTools,
4
4
  createApiClient
5
- } from "./chunk-GRFMZ7PD.js";
6
- import "./chunk-Q7XFJO2V.js";
5
+ } from "./chunk-PRNO52YC.js";
6
+ import "./chunk-MM3A2CJK.js";
7
7
 
8
8
  // src/mcp/cli.ts
9
9
  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.46.0",
3
+ "version": "4.46.1",
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",
@@ -60,23 +60,23 @@
60
60
  "@types/node-cron": "^3.0.11",
61
61
  "tsup": "^8.5.1",
62
62
  "tsx": "^4.19.0",
63
- "@ainyc/canonry-config": "0.0.0",
64
63
  "@ainyc/canonry-api-routes": "0.0.0",
64
+ "@ainyc/canonry-config": "0.0.0",
65
65
  "@ainyc/canonry-contracts": "0.0.0",
66
- "@ainyc/canonry-integration-bing": "0.0.0",
67
66
  "@ainyc/canonry-db": "0.0.0",
68
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
69
67
  "@ainyc/canonry-intelligence": "0.0.0",
68
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
69
+ "@ainyc/canonry-integration-bing": "0.0.0",
70
70
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
71
71
  "@ainyc/canonry-integration-google": "0.0.0",
72
72
  "@ainyc/canonry-integration-traffic": "0.0.0",
73
73
  "@ainyc/canonry-integration-wordpress": "0.0.0",
74
- "@ainyc/canonry-provider-claude": "0.0.0",
75
74
  "@ainyc/canonry-provider-cdp": "0.0.0",
76
- "@ainyc/canonry-provider-gemini": "0.0.0",
75
+ "@ainyc/canonry-provider-claude": "0.0.0",
77
76
  "@ainyc/canonry-provider-local": "0.0.0",
78
- "@ainyc/canonry-provider-perplexity": "0.0.0",
79
- "@ainyc/canonry-provider-openai": "0.0.0"
77
+ "@ainyc/canonry-provider-openai": "0.0.0",
78
+ "@ainyc/canonry-provider-gemini": "0.0.0",
79
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
80
80
  },
81
81
  "scripts": {
82
82
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",