@canonry/canonry 7.43.2 → 7.44.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 (38) hide show
  1. package/assets/agent-workspace/skills/aero/references/agent-operations.md +9 -0
  2. package/assets/agent-workspace/skills/aero/references/site-health.md +12 -0
  3. package/assets/agent-workspace/skills/canonry/SKILL.md +9 -0
  4. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +3 -0
  5. package/assets/assets/{AuditHistoryPanel-C5oZsvsR.js → AuditHistoryPanel-CvANw3ds.js} +1 -1
  6. package/assets/assets/{BacklinksPage-CF5sGSTQ.js → BacklinksPage-C6x9ELjk.js} +1 -1
  7. package/assets/assets/{HistoryPage-DumL6cl5.js → HistoryPage-r36HX1cC.js} +1 -1
  8. package/assets/assets/{MeasurementPropertyPage-DCegOp_w.js → MeasurementPropertyPage-ComoCzR4.js} +1 -1
  9. package/assets/assets/{ProjectPage-CWDk48Y6.js → ProjectPage-CIeU-buk.js} +1 -1
  10. package/assets/assets/{RunsPage-Bb1VMWYu.js → RunsPage-DI6eJATZ.js} +1 -1
  11. package/assets/assets/{SettingsPage-CHGh169l.js → SettingsPage-Bw7GdXxs.js} +1 -1
  12. package/assets/assets/{SiteHealthSection-bGzH9m9-.js → SiteHealthSection-C-JaNKpS.js} +3 -3
  13. package/assets/assets/{TrafficPage-cfnEZ2Mu.js → TrafficPage-Cnsp276v.js} +1 -1
  14. package/assets/assets/{TrafficSourceDetailPage-BQS0MAXE.js → TrafficSourceDetailPage-CBIaJk7e.js} +1 -1
  15. package/assets/assets/{extract-error-message-IWhACkO_.js → extract-error-message-C_Owa0n9.js} +1 -1
  16. package/assets/assets/{index-BDY3-V1S.js → index-ZS9sSTMS.js} +20 -20
  17. package/assets/assets/{react-sigma_core.esm.min-BQt189AI.js → react-sigma_core.esm.min-ugyh-ooq.js} +1 -1
  18. package/assets/assets/{v2-overview-adapter-ZC3VuoTT.js → v2-overview-adapter-BLSrVQ7K.js} +1 -1
  19. package/assets/index.html +1 -1
  20. package/dist/{chunk-WU2BRWXY.js → chunk-3JVF3ULD.js} +5 -1
  21. package/dist/{chunk-WRUKKEGR.js → chunk-45Z5RJZW.js} +3 -3
  22. package/dist/{chunk-KOIOZ7QW.js → chunk-5LY7EG4U.js} +47 -3
  23. package/dist/{chunk-C2I7M3B2.js → chunk-EJRV7RBZ.js} +127 -9
  24. package/dist/{chunk-65BHDVYO.js → chunk-G47XJVAS.js} +830 -465
  25. package/dist/{chunk-E43JM3QV.js → chunk-GZ2KIONF.js} +92 -1
  26. package/dist/{chunk-BWR5MNL5.js → chunk-JVBI6VBT.js} +2 -2
  27. package/dist/{chunk-LYKDNJXR.js → chunk-MPWBFKGK.js} +44 -1
  28. package/dist/{chunk-WXX3NL4C.js → chunk-QQYQDTFZ.js} +40 -12
  29. package/dist/{chunk-BPFRGC7K.js → chunk-SW54HXSZ.js} +3 -3
  30. package/dist/{cli-catalog-J3O6W726.js → cli-catalog-PNJEQV5H.js} +3 -3
  31. package/dist/cli-commands-4UT2CRXX.js +15 -0
  32. package/dist/cli.js +10 -10
  33. package/dist/{demo-server-KA7DWTY6.js → demo-server-WRHR25HF.js} +4 -4
  34. package/dist/index.js +6 -6
  35. package/dist/{intelligence-service-LHZZTJPH.js → intelligence-service-QXXRUB2G.js} +2 -2
  36. package/dist/mcp.js +4 -4
  37. package/package.json +9 -9
  38. package/dist/cli-commands-QST2CPDG.js +0 -15
@@ -7505,7 +7505,9 @@ var siteCrawlAuditFactorSchema = siteAuditPageFactorSchema.extend({
7505
7505
  /** `null` means the engine did not explicitly classify applicability. */
7506
7506
  applicable: z15.boolean().nullable(),
7507
7507
  findings: z15.array(siteCrawlAuditFindingSchema).default([]),
7508
- recommendations: z15.array(z15.string()).default([])
7508
+ recommendations: z15.array(z15.string()).default([]),
7509
+ /** Optional review advice, also present in recommendations; absent on older evidence. */
7510
+ advisoryRecommendations: z15.array(z15.string()).optional()
7509
7511
  });
7510
7512
  var siteCrawlCriticalDefectSchema = z15.object({
7511
7513
  id: z15.string().min(1),
@@ -8049,6 +8051,86 @@ var siteAuditLivePageHealthSchema = z15.object({
8049
8051
  updatedAt: z15.string().nullable(),
8050
8052
  examples: z15.array(siteAuditLivePageHealthExampleSchema).max(12).default([])
8051
8053
  });
8054
+ var siteCrawlIssueEvidenceSchema = z15.object({
8055
+ schemaVersion: z15.literal("1.0"),
8056
+ groupIdentityVersion: z15.literal("duplicate-metadata-v1"),
8057
+ siteIssues: z15.array(z15.object({
8058
+ /** Null preserves unfamiliar evidence without inventing cross-run identity. */
8059
+ key: z15.string().min(1).nullable(),
8060
+ code: z15.string().min(1),
8061
+ message: z15.string(),
8062
+ affectedUrls: z15.array(z15.string().min(1))
8063
+ }))
8064
+ });
8065
+ var SITE_AUDIT_ISSUES_DEFAULT_LIMIT = 25;
8066
+ var SITE_AUDIT_ISSUES_MAX_LIMIT = 100;
8067
+ var siteAuditIssueListQuerySchema = z15.object({
8068
+ runId: z15.string().min(1).max(128).optional(),
8069
+ cursor: z15.string().min(1).max(2048).optional(),
8070
+ limit: z15.number().int().min(1).max(SITE_AUDIT_ISSUES_MAX_LIMIT).optional()
8071
+ }).strict();
8072
+ var siteAuditIssueDispositionSchema = z15.enum(["actionable", "advisory", "unverified", "informational"]);
8073
+ var SiteAuditIssueRecommendationScopes = { factor: "factor", issue: "issue", none: "none" };
8074
+ var siteAuditIssuePageSchema = z15.object({
8075
+ nodeKey: z15.string().nullable(),
8076
+ url: z15.string(),
8077
+ message: z15.string().max(400),
8078
+ messageTruncated: z15.boolean(),
8079
+ /** Scope identifies whole-factor guidance versus the critical defect's own recommendation. */
8080
+ recommendations: z15.array(z15.string().max(400)).max(3),
8081
+ recommendationsScope: z15.enum(["factor", "issue", "none"]),
8082
+ recommendationsTruncated: z15.boolean()
8083
+ });
8084
+ var siteAuditIssueSchema = z15.object({
8085
+ id: z15.string(),
8086
+ stableIdentity: z15.boolean(),
8087
+ code: z15.string(),
8088
+ source: z15.enum(["page-finding", "cross-page", "critical-defect"]),
8089
+ /** Independent critical-defect severity; page findings do not invent a severity from scores. */
8090
+ severity: z15.enum(["critical", "warning"]).nullable(),
8091
+ factorId: z15.string().nullable(),
8092
+ findingType: siteCrawlAuditFindingSchema.shape.type,
8093
+ /** Prioritization hint, not a score penalty, permission to edit, or proof of ranking impact. */
8094
+ disposition: siteAuditIssueDispositionSchema,
8095
+ message: z15.string().max(400),
8096
+ messageTruncated: z15.boolean(),
8097
+ affectedPages: z15.number().int().nonnegative(),
8098
+ examples: z15.array(siteAuditIssuePageSchema).max(3),
8099
+ examplesTruncated: z15.boolean()
8100
+ });
8101
+ var siteAuditIssueCoverageSchema = z15.object({
8102
+ pageFindings: z15.enum(["available", "partial", "unavailable"]),
8103
+ crossPage: z15.enum(["available", "unavailable"]),
8104
+ /** Pages with a stored score or a versioned audit-evidence envelope. */
8105
+ auditedPages: z15.number().int().nonnegative(),
8106
+ pagesWithFindingEvidence: z15.number().int().nonnegative(),
8107
+ pagesWithoutFindingEvidence: z15.number().int().nonnegative(),
8108
+ /** Malformed or uncoded records omitted from grouping; positive values preclude a clean verdict. */
8109
+ omittedFindings: z15.number().int().nonnegative()
8110
+ });
8111
+ var siteAuditIssueProvenanceSchema = z15.object({
8112
+ project: z15.string(),
8113
+ runId: z15.string().nullable(),
8114
+ attemptId: z15.string().nullable(),
8115
+ /** Stored observation time, never the time of this read. */
8116
+ auditedAt: z15.string().nullable(),
8117
+ runStatus: nullableRunStatusSchema,
8118
+ complete: z15.boolean(),
8119
+ termination: z15.string().nullable(),
8120
+ runSelection: siteAuditRunSelectionSchema.optional(),
8121
+ state: z15.enum(["no-crawl", "unavailable", "partial", "available"]),
8122
+ coverage: siteAuditIssueCoverageSchema,
8123
+ /** Exact groups/members among retained evidence. Null means no usable evidence was retained. */
8124
+ total: z15.number().int().nonnegative().nullable(),
8125
+ nextCursor: z15.string().nullable()
8126
+ });
8127
+ var siteAuditIssuesResponseSchema = siteAuditIssueProvenanceSchema.extend({
8128
+ issues: z15.array(siteAuditIssueSchema).max(SITE_AUDIT_ISSUES_MAX_LIMIT)
8129
+ });
8130
+ var siteAuditIssuePagesResponseSchema = siteAuditIssueProvenanceSchema.extend({
8131
+ issueId: z15.string(),
8132
+ pages: z15.array(siteAuditIssuePageSchema).max(SITE_AUDIT_ISSUES_MAX_LIMIT)
8133
+ });
8052
8134
 
8053
8135
  // ../contracts/src/answer-prose.ts
8054
8136
  var TOP_LEVEL_DOMAINS = new Set(tlds_default2.map((tld) => tld.toLowerCase()));
@@ -12656,6 +12738,8 @@ var STORED_READ_OPERATIONS = /* @__PURE__ */ new Set([
12656
12738
  "GET /api/v1/projects/{name}/technical-aeo/graph",
12657
12739
  "GET /api/v1/projects/{name}/technical-aeo/crawl/pages",
12658
12740
  "GET /api/v1/projects/{name}/technical-aeo/crawl/pages/audit",
12741
+ "GET /api/v1/projects/{name}/technical-aeo/issues",
12742
+ "GET /api/v1/projects/{name}/technical-aeo/issues/{issueId}/pages",
12659
12743
  "GET /api/v1/projects/{name}/technical-aeo/structure",
12660
12744
  "GET /api/v1/projects/{name}/technical-aeo/internal-links",
12661
12745
  "GET /api/v1/projects/{name}/technical-aeo/internal-links/neighbors",
@@ -24264,6 +24348,7 @@ export {
24264
24348
  templateLinkDetection,
24265
24349
  classifyTemplateLinkEdge,
24266
24350
  templateLinkSource,
24351
+ siteCrawlAuditFindingSchema,
24267
24352
  siteCrawlAuditFactorSchema,
24268
24353
  siteCrawlCriticalDefectSchema,
24269
24354
  siteCrawlPageAuditSchema,
@@ -24303,6 +24388,12 @@ export {
24303
24388
  SITE_HEALTH_SCANS_MAX_LIMIT,
24304
24389
  siteAuditRunProgressSchema,
24305
24390
  siteAuditLivePageHealthSchema,
24391
+ siteCrawlIssueEvidenceSchema,
24392
+ SITE_AUDIT_ISSUES_DEFAULT_LIMIT,
24393
+ siteAuditIssueListQuerySchema,
24394
+ SiteAuditIssueRecommendationScopes,
24395
+ siteAuditIssuesResponseSchema,
24396
+ siteAuditIssuePagesResponseSchema,
24306
24397
  answerProseForMentions,
24307
24398
  MIN_DOMAIN_BRAND_KEY_LENGTH,
24308
24399
  MIN_BRAND_ALIAS_KEY_LENGTH,
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-65BHDVYO.js";
8
+ } from "./chunk-G47XJVAS.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-E43JM3QV.js";
18
+ } from "./chunk-GZ2KIONF.js";
19
19
 
20
20
  // src/site-audit-factors.ts
21
21
  function recordedSharePct(factor) {
@@ -147,6 +147,9 @@ import {
147
147
  sentimentSummaryIncludeSchema,
148
148
  sentimentSummaryReadSchema,
149
149
  settingsDtoSchema,
150
+ siteAuditIssueListQuerySchema,
151
+ siteAuditIssuePagesResponseSchema,
152
+ siteAuditIssuesResponseSchema,
150
153
  siteAuditPageBudgetSchema,
151
154
  snapshotRequestInputSchema,
152
155
  telemetryStatusDtoSchema,
@@ -159,7 +162,7 @@ import {
159
162
  trafficSeriesGranularitySchema,
160
163
  visibilityCompareSelectionSchema,
161
164
  visibilityReportRequestSchema
162
- } from "./chunk-E43JM3QV.js";
165
+ } from "./chunk-GZ2KIONF.js";
163
166
 
164
167
  // src/package-version.ts
165
168
  import { createRequire } from "module";
@@ -1106,6 +1109,14 @@ var technicalAeoCrawlInputSchema = z3.object({
1106
1109
  runId: crawlRunIdSchema,
1107
1110
  date: calendarDateSchema.optional().describe("Exact UTC scan date YYYY-MM-DD, mutually exclusive with runId. A dated no-data result may include availableScanDates. When the user omitted the year, resolve it from matchingMonthDayDates and request that exact returned date before concluding the scan is missing. Never silently select another date.")
1108
1111
  });
1112
+ var siteHealthIssuesInputSchema = siteAuditIssueListQuerySchema.extend({
1113
+ project: projectNameSchema,
1114
+ runId: siteAuditIssueListQuerySchema.shape.runId.describe("Select an exact saved scan. Omit for the default scan; use its returned runId for subsequent pages and issue details."),
1115
+ cursor: siteAuditIssueListQuerySchema.shape.cursor.describe("Opaque nextCursor from this same scan and issue feed.")
1116
+ });
1117
+ var siteHealthIssuePagesInputSchema = siteHealthIssuesInputSchema.extend({
1118
+ issueId: z3.string().min(1).describe("Exact issue ID from canonry_site_health_issues. Keep the returned runId when inspecting affected pages.")
1119
+ });
1109
1120
  var siteHealthPageAuditInputSchema = z3.object({
1110
1121
  project: projectNameSchema,
1111
1122
  runId: crawlRunIdSchema,
@@ -3773,6 +3784,38 @@ var rawCanonryMcpTools = [
3773
3784
  openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/crawl"],
3774
3785
  handler: (client, input) => client.getTechnicalAeoCrawl(input.project, { runId: input.runId, date: input.date })
3775
3786
  }),
3787
+ defineTool({
3788
+ name: "canonry_site_health_issues",
3789
+ title: "List stored Site Health issues",
3790
+ description: "Read paginated finding groups from a saved audit, including duplicate metadata and critical defects regardless of aggregate score. Never starts a crawl. Preserve scan date, run/attempt identity, coverage and partial/unavailable states: an empty result does not prove the site is clean. Disposition separates actionable findings, advisory guidance, unverified checks and information; severity retains the recorded critical-defect level. recommendationsScope distinguishes issue-specific defect guidance from whole-factor advice. stableIdentity=false means the ID cannot establish continuity across scans. Follow nextCursor with the returned runId, or inspect one issue with canonry_site_health_issue_pages.",
3791
+ access: "read",
3792
+ tier: "monitoring",
3793
+ inputSchema: siteHealthIssuesInputSchema,
3794
+ outputSchema: siteAuditIssuesResponseSchema,
3795
+ annotations: readAnnotations(),
3796
+ openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/issues"],
3797
+ handler: (client, input) => client.getSiteAuditIssues(input.project, {
3798
+ runId: input.runId,
3799
+ cursor: input.cursor,
3800
+ limit: input.limit
3801
+ })
3802
+ }),
3803
+ defineTool({
3804
+ name: "canonry_site_health_issue_pages",
3805
+ title: "Read pages affected by a saved audit issue",
3806
+ description: "Read paginated affected URLs and saved messages for one issue in the selected audit. Use the issue ID and runId from canonry_site_health_issues; continue with nextCursor without changing the selection. Null node keys and unavailable/partial coverage remain explicit. recommendationsScope identifies issue-specific defect guidance or broader factor advice; do not present factor advice as an exact fix for this finding. This stored read never crawls, changes content or authorizes edits.",
3807
+ access: "read",
3808
+ tier: "monitoring",
3809
+ inputSchema: siteHealthIssuePagesInputSchema,
3810
+ outputSchema: siteAuditIssuePagesResponseSchema,
3811
+ annotations: readAnnotations(),
3812
+ openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/issues/{issueId}/pages"],
3813
+ handler: (client, input) => client.getSiteAuditIssuePages(input.project, input.issueId, {
3814
+ runId: input.runId,
3815
+ cursor: input.cursor,
3816
+ limit: input.limit
3817
+ })
3818
+ }),
3776
3819
  defineTool({
3777
3820
  name: "canonry_site_health_page_audit",
3778
3821
  title: "Get Site Health page audit",
@@ -21,19 +21,19 @@ import {
21
21
  saveConfig,
22
22
  saveConfigPatch,
23
23
  sentimentInstallReadiness
24
- } from "./chunk-KOIOZ7QW.js";
24
+ } from "./chunk-5LY7EG4U.js";
25
25
  import {
26
26
  computeFactorAverages,
27
27
  deleteSiteCrawlGraphLayout,
28
28
  persistSiteCrawlGraphLayout,
29
29
  prepareSiteCrawlGraphLayout,
30
30
  recordedSharePct
31
- } from "./chunk-BWR5MNL5.js";
31
+ } from "./chunk-JVBI6VBT.js";
32
32
  import {
33
33
  CanonryMcpToolNames,
34
34
  PACKAGE_VERSION,
35
35
  canonryMcpTools
36
- } from "./chunk-LYKDNJXR.js";
36
+ } from "./chunk-MPWBFKGK.js";
37
37
  import {
38
38
  CliError
39
39
  } from "./chunk-HGMYEDAQ.js";
@@ -240,7 +240,7 @@ import {
240
240
  webhookResponseReason,
241
241
  webhookTargetRefusalReason,
242
242
  writeAuditLog
243
- } from "./chunk-65BHDVYO.js";
243
+ } from "./chunk-G47XJVAS.js";
244
244
  import {
245
245
  AGENT_MEMORY_VALUE_MAX_BYTES,
246
246
  AGENT_NONE,
@@ -487,7 +487,7 @@ import {
487
487
  winnabilityClassLabel,
488
488
  withRetry,
489
489
  withSkippedProviders
490
- } from "./chunk-E43JM3QV.js";
490
+ } from "./chunk-GZ2KIONF.js";
491
491
 
492
492
  // src/runtime-context.ts
493
493
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -8357,7 +8357,7 @@ function nonBlank(value) {
8357
8357
  return trimmed ? trimmed : void 0;
8358
8358
  }
8359
8359
  function resolveBuildCommit(env = process.env) {
8360
- const embedded = true ? "01789509e9cc5d3516928fae0e96bb1dedbdacd3" : void 0;
8360
+ const embedded = true ? "89a7b4bb64371e151e3acebd92b4250075933dce" : void 0;
8361
8361
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
8362
8362
  }
8363
8363
  function resolveInstanceIdentity(env = process.env) {
@@ -14421,6 +14421,31 @@ function classifySiteCrawlTemplateLinks(db, scope, pagesFetched, placementRulese
14421
14421
  };
14422
14422
  }
14423
14423
 
14424
+ // src/site-audit-issues.ts
14425
+ import { createHash as createHash4 } from "crypto";
14426
+ var GROUP_IDENTITY_VERSION = "duplicate-metadata-v1";
14427
+ function buildSiteCrawlIssueEvidence(siteIssues, pages) {
14428
+ if (siteIssues === void 0) return null;
14429
+ const metadataByUrl = /* @__PURE__ */ new Map();
14430
+ if (siteIssues.length > 0) {
14431
+ for (const page of pages) {
14432
+ if (page.state === "html" && page.indexability.state === "indexable" && page.finalUrl && page.audit) {
14433
+ metadataByUrl.set(page.finalUrl, page.audit.metadata);
14434
+ }
14435
+ }
14436
+ }
14437
+ const groups = siteIssues.map((issue) => {
14438
+ const affectedUrls = [...new Set(issue.affectedUrls)].sort();
14439
+ const field = issue.code === "site.duplicate-title" ? "pageTitle" : issue.code === "site.duplicate-meta-description" ? "metaDescription" : null;
14440
+ const values = field ? affectedUrls.map((url) => metadataByUrl.get(url)?.[field]?.trim()) : [];
14441
+ const value = values[0];
14442
+ const key = value && values.every((candidate) => candidate === value) ? `site-issue:${createHash4("sha256").update(JSON.stringify([GROUP_IDENTITY_VERSION, issue.code, value])).digest("hex")}` : null;
14443
+ return { key, code: issue.code, message: issue.message, affectedUrls };
14444
+ });
14445
+ groups.sort((left, right) => left.code.localeCompare(right.code) || (left.key ?? "").localeCompare(right.key ?? "") || JSON.stringify(left.affectedUrls).localeCompare(JSON.stringify(right.affectedUrls)));
14446
+ return { schemaVersion: "1.0", groupIdentityVersion: GROUP_IDENTITY_VERSION, siteIssues: groups };
14447
+ }
14448
+
14424
14449
  // src/execute-site-audit.ts
14425
14450
  var log14 = createLogger("SiteAudit");
14426
14451
  var SiteAuditCancelledError = class extends Error {
@@ -14461,7 +14486,8 @@ function toCrawlAuditFactor(factor) {
14461
14486
  status: factorStatusFromScore(factor.score),
14462
14487
  applicable: factor.applicable ?? null,
14463
14488
  findings: factor.findings,
14464
- recommendations: factor.recommendations
14489
+ recommendations: factor.recommendations,
14490
+ ...factor.advisoryRecommendations === void 0 ? {} : { advisoryRecommendations: factor.advisoryRecommendations }
14465
14491
  };
14466
14492
  }
14467
14493
  function crawlAuditFields(audit) {
@@ -14929,6 +14955,7 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
14929
14955
  const deadLinksFound = deadLinkFindings.length;
14930
14956
  const deadLinksUnverified = new Set(unverifiedLinks.map((finding) => finding.to)).size;
14931
14957
  const legacyIssues = factors.map((factor) => toLegacyIssue(factor, crawlSummary.auditRollup.auditedPages)).filter((issue) => issue !== null);
14958
+ const issueEvidence = buildSiteCrawlIssueEvidence(crawlSummary.siteIssues, observedPages.values());
14932
14959
  try {
14933
14960
  persistSiteCrawlGraphLayout(db, { projectId, runId, attemptId }, graphLayout, finishedAt);
14934
14961
  } catch (error) {
@@ -15027,6 +15054,7 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
15027
15054
  pagesErrored: errorCount,
15028
15055
  edgesDiscovered: crawlSummary.edgesObserved,
15029
15056
  findingsCount: deadLinksFound,
15057
+ issueEvidence,
15030
15058
  deadLinkState: report.deadLinks.state,
15031
15059
  deadLinksChecked,
15032
15060
  deadLinksFound,
@@ -15700,7 +15728,7 @@ import { Type as Type3 } from "@earendil-works/pi-ai";
15700
15728
 
15701
15729
  // src/agent/mcp-to-agent-tool.ts
15702
15730
  import { Type as Type2 } from "@earendil-works/pi-ai";
15703
- import { createHash as createHash4, randomUUID as randomUUID2 } from "crypto";
15731
+ import { createHash as createHash5, randomUUID as randomUUID2 } from "crypto";
15704
15732
 
15705
15733
  // src/agent/tool-result-units.ts
15706
15734
  var SUCCESS_STATUSES = ["200", "201", "202"];
@@ -16179,7 +16207,7 @@ function hasOtherLists(value, primary) {
16179
16207
  }
16180
16208
  function projectionPath(path11) {
16181
16209
  if (path11.length <= MAX_SUMMARY_PATH_CHARS) return path11;
16182
- const digest = createHash4("sha256").update(path11).digest("hex").slice(0, 12);
16210
+ const digest = createHash5("sha256").update(path11).digest("hex").slice(0, 12);
16183
16211
  return `${truncateUtf16(path11, 48)}...#${digest}${path11.slice(-24)}`;
16184
16212
  }
16185
16213
  function boundedProjection(full, partialRows, reserve = 0) {
@@ -17901,7 +17929,7 @@ function assertProviderReloadKeepsPendingBatches(db, previous, next, executing =
17901
17929
  }
17902
17930
 
17903
17931
  // src/provider-model-catalog.ts
17904
- import { createHash as createHash5 } from "crypto";
17932
+ import { createHash as createHash6 } from "crypto";
17905
17933
  var TTL_MS = 60 * 60 * 1e3;
17906
17934
  var RETRY_MS = 60 * 1e3;
17907
17935
  var TIMEOUT_MS3 = 3e3;
@@ -17915,7 +17943,7 @@ function createProviderModelCatalog(registry) {
17915
17943
  }
17916
17944
  const fallback = provider.adapter.modelRegistry.knownModels;
17917
17945
  if (!provider.adapter.listModels) return fallback;
17918
- const identity = createHash5("sha256").update(JSON.stringify(provider.config)).digest("hex");
17946
+ const identity = createHash6("sha256").update(JSON.stringify(provider.config)).digest("hex");
17919
17947
  let entry = cache.get(name);
17920
17948
  if (entry?.identity !== identity) {
17921
17949
  entry = { identity, expiresAt: 0 };
@@ -17954,7 +17982,7 @@ function createProviderModelCatalog(registry) {
17954
17982
  const provider = registry.get(name);
17955
17983
  if (!provider) return [];
17956
17984
  const entry = cache.get(name);
17957
- const identity = createHash5("sha256").update(JSON.stringify(provider.config)).digest("hex");
17985
+ const identity = createHash6("sha256").update(JSON.stringify(provider.config)).digest("hex");
17958
17986
  return (entry?.identity === identity ? entry.models : void 0) ?? provider.adapter.modelRegistry.knownModels;
17959
17987
  };
17960
17988
  return Object.assign(read, { cached: cached2 });
@@ -4,14 +4,14 @@ import {
4
4
  installSkills,
5
5
  loadConfigRaw,
6
6
  saveConfigPatch
7
- } from "./chunk-KOIOZ7QW.js";
7
+ } from "./chunk-5LY7EG4U.js";
8
8
  import {
9
9
  PACKAGE_VERSION
10
- } from "./chunk-LYKDNJXR.js";
10
+ } from "./chunk-MPWBFKGK.js";
11
11
  import {
12
12
  SKILL_MANIFEST_FILENAME,
13
13
  SkillsClients
14
- } from "./chunk-E43JM3QV.js";
14
+ } from "./chunk-GZ2KIONF.js";
15
15
 
16
16
  // src/skills-autosync.ts
17
17
  import fs from "fs";
@@ -3,10 +3,10 @@ import {
3
3
  buildCliCatalog,
4
4
  printCliCatalog,
5
5
  renderTopLevelHelp
6
- } from "./chunk-WRUKKEGR.js";
7
- import "./chunk-WU2BRWXY.js";
6
+ } from "./chunk-45Z5RJZW.js";
7
+ import "./chunk-3JVF3ULD.js";
8
8
  import "./chunk-HGMYEDAQ.js";
9
- import "./chunk-E43JM3QV.js";
9
+ import "./chunk-GZ2KIONF.js";
10
10
  export {
11
11
  CLI_ROOT_SUMMARIES,
12
12
  buildCliCatalog,
@@ -0,0 +1,15 @@
1
+ import {
2
+ REGISTERED_CLI_COMMANDS
3
+ } from "./chunk-EJRV7RBZ.js";
4
+ import "./chunk-QQYQDTFZ.js";
5
+ import "./chunk-5LY7EG4U.js";
6
+ import "./chunk-3JVF3ULD.js";
7
+ import "./chunk-RB2F4D3Z.js";
8
+ import "./chunk-JVBI6VBT.js";
9
+ import "./chunk-MPWBFKGK.js";
10
+ import "./chunk-HGMYEDAQ.js";
11
+ import "./chunk-G47XJVAS.js";
12
+ import "./chunk-GZ2KIONF.js";
13
+ export {
14
+ REGISTERED_CLI_COMMANDS
15
+ };
package/dist/cli.js CHANGED
@@ -2,18 +2,18 @@
2
2
  import {
3
3
  autoSyncSkills,
4
4
  formatAutoSyncNotice
5
- } from "./chunk-BPFRGC7K.js";
5
+ } from "./chunk-SW54HXSZ.js";
6
6
  import {
7
7
  accessFilterFromArgs,
8
8
  dispatchRegisteredCommand,
9
9
  printCliCatalog
10
- } from "./chunk-WRUKKEGR.js";
10
+ } from "./chunk-45Z5RJZW.js";
11
11
  import {
12
12
  REGISTERED_CLI_COMMANDS,
13
13
  buildSetupState,
14
14
  consumePendingServeHandoff,
15
15
  serveCommand
16
- } from "./chunk-C2I7M3B2.js";
16
+ } from "./chunk-EJRV7RBZ.js";
17
17
  import {
18
18
  checkLatestVersionForCli,
19
19
  cliRuntimeContext,
@@ -27,14 +27,14 @@ import {
27
27
  showFirstRunNotice,
28
28
  trackCliCommandFinished,
29
29
  trackEvent
30
- } from "./chunk-WXX3NL4C.js";
31
- import "./chunk-KOIOZ7QW.js";
30
+ } from "./chunk-QQYQDTFZ.js";
31
+ import "./chunk-5LY7EG4U.js";
32
32
  import {
33
33
  resolveCliAccess
34
- } from "./chunk-WU2BRWXY.js";
34
+ } from "./chunk-3JVF3ULD.js";
35
35
  import "./chunk-RB2F4D3Z.js";
36
- import "./chunk-BWR5MNL5.js";
37
- import "./chunk-LYKDNJXR.js";
36
+ import "./chunk-JVBI6VBT.js";
37
+ import "./chunk-MPWBFKGK.js";
38
38
  import {
39
39
  CliError,
40
40
  EXIT_SYSTEM_ERROR,
@@ -42,10 +42,10 @@ import {
42
42
  printCliError,
43
43
  usageError
44
44
  } from "./chunk-HGMYEDAQ.js";
45
- import "./chunk-65BHDVYO.js";
45
+ import "./chunk-G47XJVAS.js";
46
46
  import {
47
47
  OperationAccesses
48
- } from "./chunk-E43JM3QV.js";
48
+ } from "./chunk-GZ2KIONF.js";
49
49
 
50
50
  // src/cli.ts
51
51
  import { pathToFileURL } from "url";
@@ -5,11 +5,11 @@ import {
5
5
  computeFactorAverages,
6
6
  layoutSiteCrawlGraphInput,
7
7
  persistSiteCrawlGraphLayout
8
- } from "./chunk-BWR5MNL5.js";
8
+ } from "./chunk-JVBI6VBT.js";
9
9
  import {
10
10
  PACKAGE_VERSION,
11
11
  canonryMcpTools
12
- } from "./chunk-LYKDNJXR.js";
12
+ } from "./chunk-MPWBFKGK.js";
13
13
  import "./chunk-HGMYEDAQ.js";
14
14
  import {
15
15
  HISTORY_WINDOW_RUNS,
@@ -86,7 +86,7 @@ import {
86
86
  siteCrawlPages,
87
87
  siteCrawlSnapshots,
88
88
  trafficSources
89
- } from "./chunk-65BHDVYO.js";
89
+ } from "./chunk-G47XJVAS.js";
90
90
  import {
91
91
  RunKinds,
92
92
  SiteCrawlFetchStates,
@@ -116,7 +116,7 @@ import {
116
116
  roundPreservingTotal,
117
117
  siteAuditPageFactorSchema,
118
118
  wilsonInterval
119
- } from "./chunk-E43JM3QV.js";
119
+ } from "./chunk-GZ2KIONF.js";
120
120
 
121
121
  // src/demo-server.ts
122
122
  import { dirname, join as join2 } from "path";
package/dist/index.js CHANGED
@@ -3,15 +3,15 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-WXX3NL4C.js";
6
+ } from "./chunk-QQYQDTFZ.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-KOIOZ7QW.js";
10
- import "./chunk-BWR5MNL5.js";
11
- import "./chunk-LYKDNJXR.js";
9
+ } from "./chunk-5LY7EG4U.js";
10
+ import "./chunk-JVBI6VBT.js";
11
+ import "./chunk-MPWBFKGK.js";
12
12
  import "./chunk-HGMYEDAQ.js";
13
- import "./chunk-65BHDVYO.js";
14
- import "./chunk-E43JM3QV.js";
13
+ import "./chunk-G47XJVAS.js";
14
+ import "./chunk-GZ2KIONF.js";
15
15
  export {
16
16
  GoogleMarketingRuntimeError,
17
17
  createGoogleMarketingCredentialStore,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  HISTORY_WINDOW_RUNS,
3
3
  IntelligenceService
4
- } from "./chunk-65BHDVYO.js";
5
- import "./chunk-E43JM3QV.js";
4
+ } from "./chunk-G47XJVAS.js";
5
+ import "./chunk-GZ2KIONF.js";
6
6
  export {
7
7
  HISTORY_WINDOW_RUNS,
8
8
  IntelligenceService
package/dist/mcp.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-BPFRGC7K.js";
3
+ } from "./chunk-SW54HXSZ.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-KOIOZ7QW.js";
8
- import "./chunk-LYKDNJXR.js";
7
+ } from "./chunk-5LY7EG4U.js";
8
+ import "./chunk-MPWBFKGK.js";
9
9
  import "./chunk-HGMYEDAQ.js";
10
10
  import {
11
11
  isReadOnlyKey,
12
12
  updateCheckEnvOptOut
13
- } from "./chunk-E43JM3QV.js";
13
+ } from "./chunk-GZ2KIONF.js";
14
14
 
15
15
  // src/mcp/cli.ts
16
16
  import { randomUUID } from "crypto";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonry/canonry",
3
- "version": "7.43.2",
3
+ "version": "7.44.0",
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
  "keywords": [
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@anthropic-ai/sdk": "^0.91.1",
60
- "@canonry/aeo-audit": "7.2.0",
60
+ "@canonry/aeo-audit": "7.3.0",
61
61
  "@fastify/rate-limit": "^11.2.0",
62
62
  "@fastify/static": "^9.1.1",
63
63
  "@google/genai": "^1.46.0",
@@ -87,32 +87,32 @@
87
87
  "tsx": "^4.19.0",
88
88
  "@ainyc/canonry-api-client": "0.0.0",
89
89
  "@ainyc/canonry-web": "0.0.0",
90
+ "@ainyc/canonry-config": "0.0.0",
90
91
  "@ainyc/canonry-api-routes": "0.0.0",
91
92
  "@ainyc/canonry-contracts": "0.0.0",
92
93
  "@ainyc/canonry-db": "0.0.0",
93
- "@ainyc/canonry-config": "0.0.0",
94
94
  "@ainyc/canonry-integration-bing": "0.0.0",
95
95
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
96
96
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
97
97
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
98
98
  "@ainyc/canonry-integration-google": "0.0.0",
99
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
100
99
  "@ainyc/canonry-integration-google-ads": "0.0.0",
100
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
101
101
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
102
+ "@ainyc/canonry-integration-google-places": "0.0.0",
102
103
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
103
104
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
104
105
  "@ainyc/canonry-integration-traffic": "0.0.0",
105
- "@ainyc/canonry-integration-google-places": "0.0.0",
106
106
  "@ainyc/canonry-integration-wordpress": "0.0.0",
107
107
  "@ainyc/canonry-intelligence": "0.0.0",
108
- "@ainyc/canonry-provider-cdp": "0.0.0",
109
108
  "@ainyc/canonry-provider-claude": "0.0.0",
110
109
  "@ainyc/canonry-provider-gemini": "0.0.0",
111
- "@ainyc/canonry-provider-local": "0.0.0",
112
110
  "@ainyc/canonry-provider-muse": "0.0.0",
111
+ "@ainyc/canonry-provider-local": "0.0.0",
112
+ "@ainyc/canonry-provider-cdp": "0.0.0",
113
113
  "@ainyc/canonry-provider-openai": "0.0.0",
114
- "@ainyc/canonry-integration-typesafe": "0.0.0",
115
- "@ainyc/canonry-provider-perplexity": "0.0.0"
114
+ "@ainyc/canonry-provider-perplexity": "0.0.0",
115
+ "@ainyc/canonry-integration-typesafe": "0.0.0"
116
116
  },
117
117
  "scripts": {
118
118
  "build": "pnpm run build:cli && pnpm run build:web",
@@ -1,15 +0,0 @@
1
- import {
2
- REGISTERED_CLI_COMMANDS
3
- } from "./chunk-C2I7M3B2.js";
4
- import "./chunk-WXX3NL4C.js";
5
- import "./chunk-KOIOZ7QW.js";
6
- import "./chunk-WU2BRWXY.js";
7
- import "./chunk-RB2F4D3Z.js";
8
- import "./chunk-BWR5MNL5.js";
9
- import "./chunk-LYKDNJXR.js";
10
- import "./chunk-HGMYEDAQ.js";
11
- import "./chunk-65BHDVYO.js";
12
- import "./chunk-E43JM3QV.js";
13
- export {
14
- REGISTERED_CLI_COMMANDS
15
- };