@canonry/canonry 4.178.3 → 4.178.4

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.
@@ -5,11 +5,11 @@ import {
5
5
  installSkills,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-2UKCBT7D.js";
8
+ } from "./chunk-HNY2FNJH.js";
9
9
  import {
10
10
  SKILL_MANIFEST_FILENAME,
11
11
  SkillsClients
12
- } from "./chunk-BNYDRPKC.js";
12
+ } from "./chunk-IMEJQQZU.js";
13
13
 
14
14
  // src/skills-autosync.ts
15
15
  import fs from "fs";
@@ -92,7 +92,7 @@ import {
92
92
  trafficConnectWordpressRequestSchema,
93
93
  trafficEventKindSchema,
94
94
  trafficSeriesGranularitySchema
95
- } from "./chunk-BNYDRPKC.js";
95
+ } from "./chunk-IMEJQQZU.js";
96
96
 
97
97
  // src/config.ts
98
98
  import fs from "fs";
@@ -16749,7 +16749,6 @@ export {
16749
16749
  siteCrawlDeadLinksResponseSchema,
16750
16750
  SITE_AUDIT_DEFAULT_PAGE_LIMIT,
16751
16751
  SITE_AUDIT_MAX_PAGE_LIMIT,
16752
- SITE_AUDIT_DEFAULT_EDGE_LIMIT,
16753
16752
  SITE_AUDIT_MAX_EDGE_LIMIT,
16754
16753
  siteAuditRunRequestSchema,
16755
16754
  normalizeSiteAuditRunRequest,
@@ -638,7 +638,7 @@ import {
638
638
  wordpressSchemaDeployResultDtoSchema,
639
639
  wordpressSchemaStatusResultDtoSchema,
640
640
  wordpressStatusDtoSchema
641
- } from "./chunk-BNYDRPKC.js";
641
+ } from "./chunk-IMEJQQZU.js";
642
642
 
643
643
  // src/intelligence-service.ts
644
644
  import { eq as eq62, desc as desc27, asc as asc11, and as and51, ne as ne8, or as or14, inArray as inArray21, gte as gte14, lte as lte12, isNull as isNull9, sql as sql25, exists } from "drizzle-orm";
@@ -11,7 +11,7 @@ import {
11
11
  loadConfig,
12
12
  loadConfigRaw,
13
13
  saveConfigPatch
14
- } from "./chunk-2UKCBT7D.js";
14
+ } from "./chunk-HNY2FNJH.js";
15
15
  import {
16
16
  CC_CACHE_DIR,
17
17
  DUCKDB_SPEC,
@@ -157,7 +157,7 @@ import {
157
157
  siteCrawlSnapshots,
158
158
  toAlertView,
159
159
  usageCounters
160
- } from "./chunk-2ZWW62T3.js";
160
+ } from "./chunk-KMK6AOB5.js";
161
161
  import {
162
162
  AGENT_MEMORY_VALUE_MAX_BYTES,
163
163
  AGENT_PROVIDER_IDS,
@@ -191,7 +191,6 @@ import {
191
191
  RunKinds,
192
192
  RunStatuses,
193
193
  RunTriggers,
194
- SITE_AUDIT_DEFAULT_EDGE_LIMIT,
195
194
  SITE_AUDIT_DEFAULT_PAGE_LIMIT,
196
195
  SITE_AUDIT_MAX_EDGE_LIMIT,
197
196
  SITE_AUDIT_MAX_PAGE_LIMIT,
@@ -296,7 +295,7 @@ import {
296
295
  validationError,
297
296
  winnabilityClassLabel,
298
297
  withRetry
299
- } from "./chunk-BNYDRPKC.js";
298
+ } from "./chunk-IMEJQQZU.js";
300
299
 
301
300
  // src/telemetry.ts
302
301
  import crypto from "crypto";
@@ -10742,7 +10741,7 @@ function clampSiteAuditLimit(limit) {
10742
10741
  return Math.max(1, Math.min(SITE_AUDIT_MAX_PAGE_LIMIT, Math.floor(limit)));
10743
10742
  }
10744
10743
  function clampSiteAuditEdgeLimit(limit) {
10745
- if (limit == null || !Number.isFinite(limit)) return SITE_AUDIT_DEFAULT_EDGE_LIMIT;
10744
+ if (limit == null || !Number.isFinite(limit)) return void 0;
10746
10745
  return Math.max(1, Math.min(SITE_AUDIT_MAX_EDGE_LIMIT, Math.floor(limit)));
10747
10746
  }
10748
10747
  function toPageFactor(factor) {
@@ -10873,43 +10872,6 @@ function deadLinkCheckedCount(edges, pages) {
10873
10872
  }
10874
10873
  return new Set([...edges].filter((edge) => edge.type === "anchor" && edge.classification === "internal" && attemptedUrls.has(edge.to)).map((edge) => edge.to)).size;
10875
10874
  }
10876
- var RATE_LIMITED_STATUS = 429;
10877
- function partitionDeadLinks(deadLinks) {
10878
- const reported = deadLinks.findings;
10879
- const engineUnverified = deadLinks.unverified ?? [];
10880
- const answeredWithError = (finding) => typeof finding.statusCode === "number" && finding.statusCode >= 400;
10881
- const dead = reported.filter((finding) => answeredWithError(finding) && finding.statusCode !== RATE_LIMITED_STATUS);
10882
- const unverified = [
10883
- ...reported.filter((finding) => !answeredWithError(finding) || finding.statusCode === RATE_LIMITED_STATUS),
10884
- ...engineUnverified
10885
- ];
10886
- return { dead, unverified };
10887
- }
10888
- function reportedTermination(summary) {
10889
- const limits = summary.limits;
10890
- if (limits) {
10891
- if (limits.maxBytes && (summary.bytesRead ?? 0) >= limits.maxBytes) return "max-bytes";
10892
- if (limits.maxDurationMs && (summary.elapsedMs ?? 0) >= limits.maxDurationMs) return "max-duration";
10893
- if (limits.maxFetches && (summary.fetchesStarted ?? 0) >= limits.maxFetches) return "max-fetches";
10894
- }
10895
- return summary.terminationReason ?? "complete";
10896
- }
10897
- function crawlBudgetsFor(maxPages) {
10898
- return {
10899
- // 2x the ~745 KB/page measured on a media-heavy production site, so the
10900
- // byte cap is headroom rather than the thing that stops the crawl.
10901
- maxBytes: maxPages * 15e5,
10902
- // ~5 pages/s at the engine's default concurrency of 5, doubled for slow
10903
- // origins, and never below the engine's own 2-minute floor.
10904
- maxDurationMs: Math.max(12e4, Math.ceil(maxPages / 5 * 1e3 * 2)),
10905
- // Redirects and dead-link probes cost fetches without producing pages.
10906
- maxFetches: Math.ceil(maxPages * 1.5),
10907
- // Raised off the default of 10 because it is an ADMISSION limit: a sitemap
10908
- // with many query-parameter variants trips it during seeding and latches a
10909
- // soft reason that then masks whatever really stops the crawl.
10910
- maxQueryVariants: Math.max(50, Math.ceil(maxPages / 10))
10911
- };
10912
- }
10913
10875
  async function executeSiteAudit(db, runId, projectId, opts = {}) {
10914
10876
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
10915
10877
  const claim = db.update(runs).set({ status: "running", startedAt }).where(and12(eq15(runs.id, runId), eq15(runs.projectId, projectId), eq15(runs.status, "queued"))).run();
@@ -11210,7 +11172,6 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
11210
11172
  maxEdges,
11211
11173
  maxDepth: opts.maxDepth ?? null
11212
11174
  });
11213
- const budgets = crawlBudgetsFor(maxPages);
11214
11175
  const report = await runSiteCrawl(crawlRootUrl, {
11215
11176
  mode: "summary",
11216
11177
  sitemapUrl: opts.sitemapUrl,
@@ -11218,7 +11179,6 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
11218
11179
  maxEdges,
11219
11180
  maxDepth: opts.maxDepth,
11220
11181
  checkDeadLinks: opts.checkDeadLinks ?? false,
11221
- ...budgets,
11222
11182
  signal: opts.signal,
11223
11183
  onEvent: persistEvent
11224
11184
  });
@@ -11253,7 +11213,8 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
11253
11213
  const errorCount = observedErrorCount(observedPages.values());
11254
11214
  const terminalStatus = crawlSummary.complete ? "completed" : "partial";
11255
11215
  const deadLinksChecked = opts.checkDeadLinks ? deadLinkCheckedCount(observedEdges.values(), observedPages.values()) : 0;
11256
- const { dead: deadLinkFindings, unverified: unverifiedLinks } = partitionDeadLinks(report.deadLinks);
11216
+ const deadLinkFindings = report.deadLinks.findings;
11217
+ const unverifiedLinks = report.deadLinks.unverified;
11257
11218
  const deadLinksFound = deadLinkFindings.length;
11258
11219
  const deadLinksUnverified = new Set(unverifiedLinks.map((finding) => finding.to)).size;
11259
11220
  const legacyIssues = factors.map((factor) => toLegacyIssue(factor, crawlSummary.auditRollup.auditedPages)).filter((issue) => issue !== null);
@@ -11345,7 +11306,7 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
11345
11306
  maxDepth: opts.maxDepth ?? null,
11346
11307
  checkDeadLinks: opts.checkDeadLinks ?? false,
11347
11308
  complete: crawlSummary.complete,
11348
- termination: reportedTermination(crawlSummary),
11309
+ termination: crawlSummary.terminationReason ?? "complete",
11349
11310
  detailsAvailable: true,
11350
11311
  pagesDiscovered: crawlSummary.pagesDiscovered,
11351
11312
  pagesFetched: crawlSummary.pagesFetched,
@@ -11896,7 +11857,7 @@ function readStoredGroundingSources(rawResponse) {
11896
11857
  return result;
11897
11858
  }
11898
11859
  async function backfillInsightsCommand(project, opts) {
11899
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-LSQGK34A.js");
11860
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-XPAKDZJI.js");
11900
11861
  const config = loadConfig();
11901
11862
  const db = createClient(config.database);
11902
11863
  migrate(db);
package/dist/cli.js CHANGED
@@ -26,11 +26,11 @@ import {
26
26
  showFirstRunNotice,
27
27
  trackCliCommandFinished,
28
28
  trackEvent
29
- } from "./chunk-GHO4574A.js";
29
+ } from "./chunk-WYCHM3EP.js";
30
30
  import {
31
31
  autoSyncSkills,
32
32
  formatAutoSyncNotice
33
- } from "./chunk-XLVNLY2I.js";
33
+ } from "./chunk-EBRGLDTB.js";
34
34
  import {
35
35
  CliError,
36
36
  EXIT_SYSTEM_ERROR,
@@ -55,7 +55,7 @@ import {
55
55
  saveConfigPatch,
56
56
  systemError,
57
57
  usageError
58
- } from "./chunk-2UKCBT7D.js";
58
+ } from "./chunk-HNY2FNJH.js";
59
59
  import {
60
60
  CLOUDFLARE_WORKER_BINDINGS,
61
61
  CLOUDFLARE_WORKER_GENERATED_MARKER,
@@ -69,7 +69,7 @@ import {
69
69
  projects,
70
70
  queries,
71
71
  renderReportHtml
72
- } from "./chunk-2ZWW62T3.js";
72
+ } from "./chunk-KMK6AOB5.js";
73
73
  import {
74
74
  AdsDeliverySnapshotStatuses,
75
75
  AdsHistoricalCampaignRollupStatuses,
@@ -138,7 +138,7 @@ import {
138
138
  providerQuotaPolicySchema,
139
139
  resolveProviderInput,
140
140
  winnabilityClassSchema
141
- } from "./chunk-BNYDRPKC.js";
141
+ } from "./chunk-IMEJQQZU.js";
142
142
 
143
143
  // src/cli.ts
144
144
  import { pathToFileURL } from "url";
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-GHO4574A.js";
6
+ } from "./chunk-WYCHM3EP.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-2UKCBT7D.js";
10
- import "./chunk-2ZWW62T3.js";
11
- import "./chunk-BNYDRPKC.js";
9
+ } from "./chunk-HNY2FNJH.js";
10
+ import "./chunk-KMK6AOB5.js";
11
+ import "./chunk-IMEJQQZU.js";
12
12
  export {
13
13
  GoogleMarketingRuntimeError,
14
14
  createGoogleMarketingCredentialStore,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-2ZWW62T3.js";
4
- import "./chunk-BNYDRPKC.js";
3
+ } from "./chunk-KMK6AOB5.js";
4
+ import "./chunk-IMEJQQZU.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-XLVNLY2I.js";
3
+ } from "./chunk-EBRGLDTB.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-2UKCBT7D.js";
7
+ } from "./chunk-HNY2FNJH.js";
8
8
  import {
9
9
  isReadOnlyKey
10
- } from "./chunk-BNYDRPKC.js";
10
+ } from "./chunk-IMEJQQZU.js";
11
11
 
12
12
  // src/mcp/cli.ts
13
13
  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.178.3",
3
+ "version": "4.178.4",
4
4
  "type": "module",
5
5
  "description": "Self-hosted AI visibility (AEO) platform: track how ChatGPT, Claude, Gemini, and Perplexity cite your domain, join it with Search Console, GA4, server-side traffic, and paid media, and fix what you find through agent tools (CLI, REST, MCP). Local SQLite.",
6
6
  "license": "FSL-1.1-ALv2",
@@ -41,7 +41,7 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@anthropic-ai/sdk": "^0.91.1",
44
- "@canonry/aeo-audit": "4.7.0",
44
+ "@canonry/aeo-audit": "7.1.0",
45
45
  "@fastify/rate-limit": "^11.2.0",
46
46
  "@fastify/static": "^9.1.1",
47
47
  "@google/genai": "^1.46.0",
@@ -70,30 +70,30 @@
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",
73
74
  "@ainyc/canonry-config": "0.0.0",
75
+ "@ainyc/canonry-contracts": "0.0.0",
74
76
  "@ainyc/canonry-api-routes": "0.0.0",
75
77
  "@ainyc/canonry-db": "0.0.0",
76
- "@ainyc/canonry-contracts": "0.0.0",
77
- "@ainyc/canonry-api-client": "0.0.0",
78
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
79
78
  "@ainyc/canonry-integration-bing": "0.0.0",
79
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
80
80
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
81
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
82
- "@ainyc/canonry-integration-google": "0.0.0",
83
81
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
82
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
84
83
  "@ainyc/canonry-integration-google-ads": "0.0.0",
85
- "@ainyc/canonry-integration-google-places": "0.0.0",
84
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
86
85
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
86
+ "@ainyc/canonry-integration-google-places": "0.0.0",
87
87
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
88
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
88
+ "@ainyc/canonry-integration-google": "0.0.0",
89
89
  "@ainyc/canonry-integration-traffic": "0.0.0",
90
90
  "@ainyc/canonry-integration-wordpress": "0.0.0",
91
- "@ainyc/canonry-intelligence": "0.0.0",
92
91
  "@ainyc/canonry-provider-cdp": "0.0.0",
93
- "@ainyc/canonry-provider-gemini": "0.0.0",
94
92
  "@ainyc/canonry-provider-claude": "0.0.0",
95
- "@ainyc/canonry-provider-local": "0.0.0",
93
+ "@ainyc/canonry-intelligence": "0.0.0",
94
+ "@ainyc/canonry-provider-gemini": "0.0.0",
96
95
  "@ainyc/canonry-provider-openai": "0.0.0",
96
+ "@ainyc/canonry-provider-local": "0.0.0",
97
97
  "@ainyc/canonry-provider-perplexity": "0.0.0"
98
98
  },
99
99
  "scripts": {