@canonry/canonry 7.43.2 → 7.44.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 (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-C2I7M3B2.js → chunk-57MGI2UT.js} +127 -9
  23. package/dist/{chunk-KOIOZ7QW.js → chunk-5LY7EG4U.js} +47 -3
  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-WXX3NL4C.js → chunk-LK7O7RM6.js} +62 -19
  28. package/dist/{chunk-LYKDNJXR.js → chunk-MPWBFKGK.js} +44 -1
  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-D3JIQ2ID.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 +10 -10
  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) {
@@ -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) {
@@ -4812,6 +4812,7 @@ function listModels(config, signal) {
4812
4812
  }
4813
4813
 
4814
4814
  // ../provider-gemini/src/adapter.ts
4815
+ import { FinishReason } from "@google/genai";
4815
4816
  function toGeminiConfig(config) {
4816
4817
  return {
4817
4818
  apiKey: config.apiKey ?? "",
@@ -4840,17 +4841,27 @@ function toRawQueryResult(raw) {
4840
4841
  servedModel: raw.servedModel,
4841
4842
  groundingSources: raw.groundingSources,
4842
4843
  searchQueries: raw.searchQueries,
4843
- // Retrieval detection is not implemented for this provider. Its candidate
4844
- // marker is present on 100% of stored rows, so it has never been shown to
4845
- // discriminate a non-retrieving answer and wiring it up would hardcode
4846
- // `used`. `unknown` states what we actually know. The contract is a
4847
- // declaration about how we build the request, so it is always knowable.
4848
- retrievalStatus: "unknown",
4844
+ retrievalStatus: readRetrievalStatus(raw.rawResponse),
4849
4845
  retrievalContract: "native-auto-v1",
4850
4846
  usage: raw.usage,
4851
4847
  stopReason: raw.stopReason
4852
4848
  };
4853
4849
  }
4850
+ function readRetrievalStatus(rawResponse) {
4851
+ const response = rawResponse;
4852
+ if (usageCount(response.usageMetadata?.toolUsePromptTokenCount) > 0) return RetrievalStatuses.used;
4853
+ const candidate = Array.isArray(response.candidates) ? response.candidates[0] : void 0;
4854
+ if (!candidate) return RetrievalStatuses.unknown;
4855
+ const metadata2 = candidate.groundingMetadata;
4856
+ const queries2 = metadata2?.webSearchQueries;
4857
+ const chunks = metadata2?.groundingChunks;
4858
+ if (Array.isArray(queries2) && queries2.some((query) => typeof query === "string" && query.trim().length > 0) || Array.isArray(chunks) && chunks.some((chunk) => typeof chunk.web?.uri === "string" && chunk.web.uri.trim().length > 0)) {
4859
+ return RetrievalStatuses.used;
4860
+ }
4861
+ const parts = candidate.content?.parts;
4862
+ const hasAnswer = Array.isArray(parts) && parts.some((part) => !part.thought && typeof part.text === "string" && part.text.trim().length > 0);
4863
+ return candidate.finishReason === FinishReason.STOP && hasAnswer ? RetrievalStatuses["not-used"] : RetrievalStatuses.unknown;
4864
+ }
4854
4865
  var geminiAdapter = {
4855
4866
  name: "gemini",
4856
4867
  displayName: "Gemini",
@@ -4923,7 +4934,7 @@ var geminiAdapter = {
4923
4934
  citedDomains: normalized.citedDomains,
4924
4935
  groundingSources: normalized.groundingSources,
4925
4936
  searchQueries: normalized.searchQueries,
4926
- retrievalStatus: "unknown"
4937
+ retrievalStatus: readRetrievalStatus(raw.rawResponse)
4927
4938
  };
4928
4939
  },
4929
4940
  async generateText(prompt, config) {
@@ -8357,7 +8368,7 @@ function nonBlank(value) {
8357
8368
  return trimmed ? trimmed : void 0;
8358
8369
  }
8359
8370
  function resolveBuildCommit(env = process.env) {
8360
- const embedded = true ? "01789509e9cc5d3516928fae0e96bb1dedbdacd3" : void 0;
8371
+ const embedded = true ? "e030cb7a90ea9f96ff105df0274d1490664614f1" : void 0;
8361
8372
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
8362
8373
  }
8363
8374
  function resolveInstanceIdentity(env = process.env) {
@@ -14421,6 +14432,31 @@ function classifySiteCrawlTemplateLinks(db, scope, pagesFetched, placementRulese
14421
14432
  };
14422
14433
  }
14423
14434
 
14435
+ // src/site-audit-issues.ts
14436
+ import { createHash as createHash4 } from "crypto";
14437
+ var GROUP_IDENTITY_VERSION = "duplicate-metadata-v1";
14438
+ function buildSiteCrawlIssueEvidence(siteIssues, pages) {
14439
+ if (siteIssues === void 0) return null;
14440
+ const metadataByUrl = /* @__PURE__ */ new Map();
14441
+ if (siteIssues.length > 0) {
14442
+ for (const page of pages) {
14443
+ if (page.state === "html" && page.indexability.state === "indexable" && page.finalUrl && page.audit) {
14444
+ metadataByUrl.set(page.finalUrl, page.audit.metadata);
14445
+ }
14446
+ }
14447
+ }
14448
+ const groups = siteIssues.map((issue) => {
14449
+ const affectedUrls = [...new Set(issue.affectedUrls)].sort();
14450
+ const field = issue.code === "site.duplicate-title" ? "pageTitle" : issue.code === "site.duplicate-meta-description" ? "metaDescription" : null;
14451
+ const values = field ? affectedUrls.map((url) => metadataByUrl.get(url)?.[field]?.trim()) : [];
14452
+ const value = values[0];
14453
+ const key = value && values.every((candidate) => candidate === value) ? `site-issue:${createHash4("sha256").update(JSON.stringify([GROUP_IDENTITY_VERSION, issue.code, value])).digest("hex")}` : null;
14454
+ return { key, code: issue.code, message: issue.message, affectedUrls };
14455
+ });
14456
+ groups.sort((left, right) => left.code.localeCompare(right.code) || (left.key ?? "").localeCompare(right.key ?? "") || JSON.stringify(left.affectedUrls).localeCompare(JSON.stringify(right.affectedUrls)));
14457
+ return { schemaVersion: "1.0", groupIdentityVersion: GROUP_IDENTITY_VERSION, siteIssues: groups };
14458
+ }
14459
+
14424
14460
  // src/execute-site-audit.ts
14425
14461
  var log14 = createLogger("SiteAudit");
14426
14462
  var SiteAuditCancelledError = class extends Error {
@@ -14461,7 +14497,8 @@ function toCrawlAuditFactor(factor) {
14461
14497
  status: factorStatusFromScore(factor.score),
14462
14498
  applicable: factor.applicable ?? null,
14463
14499
  findings: factor.findings,
14464
- recommendations: factor.recommendations
14500
+ recommendations: factor.recommendations,
14501
+ ...factor.advisoryRecommendations === void 0 ? {} : { advisoryRecommendations: factor.advisoryRecommendations }
14465
14502
  };
14466
14503
  }
14467
14504
  function crawlAuditFields(audit) {
@@ -14929,6 +14966,7 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
14929
14966
  const deadLinksFound = deadLinkFindings.length;
14930
14967
  const deadLinksUnverified = new Set(unverifiedLinks.map((finding) => finding.to)).size;
14931
14968
  const legacyIssues = factors.map((factor) => toLegacyIssue(factor, crawlSummary.auditRollup.auditedPages)).filter((issue) => issue !== null);
14969
+ const issueEvidence = buildSiteCrawlIssueEvidence(crawlSummary.siteIssues, observedPages.values());
14932
14970
  try {
14933
14971
  persistSiteCrawlGraphLayout(db, { projectId, runId, attemptId }, graphLayout, finishedAt);
14934
14972
  } catch (error) {
@@ -15027,6 +15065,7 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
15027
15065
  pagesErrored: errorCount,
15028
15066
  edgesDiscovered: crawlSummary.edgesObserved,
15029
15067
  findingsCount: deadLinksFound,
15068
+ issueEvidence,
15030
15069
  deadLinkState: report.deadLinks.state,
15031
15070
  deadLinksChecked,
15032
15071
  deadLinksFound,
@@ -15506,6 +15545,10 @@ function resolveModelForCapability(provider, capability, modelIdOverride) {
15506
15545
  const baseUrl = base.endsWith("/v1beta") ? base : `${base}/v1beta`;
15507
15546
  return { ...model, baseUrl };
15508
15547
  }
15548
+ if (provider === AgentProviderIds.zai && process.env.ZAI_BASE_URL) {
15549
+ const baseUrl = process.env.ZAI_BASE_URL.replace(/\/+$/, "");
15550
+ return { ...model, baseUrl };
15551
+ }
15509
15552
  return model;
15510
15553
  }
15511
15554
  function isAgentModelAvailable(provider, id) {
@@ -15700,7 +15743,7 @@ import { Type as Type3 } from "@earendil-works/pi-ai";
15700
15743
 
15701
15744
  // src/agent/mcp-to-agent-tool.ts
15702
15745
  import { Type as Type2 } from "@earendil-works/pi-ai";
15703
- import { createHash as createHash4, randomUUID as randomUUID2 } from "crypto";
15746
+ import { createHash as createHash5, randomUUID as randomUUID2 } from "crypto";
15704
15747
 
15705
15748
  // src/agent/tool-result-units.ts
15706
15749
  var SUCCESS_STATUSES = ["200", "201", "202"];
@@ -16179,7 +16222,7 @@ function hasOtherLists(value, primary) {
16179
16222
  }
16180
16223
  function projectionPath(path11) {
16181
16224
  if (path11.length <= MAX_SUMMARY_PATH_CHARS) return path11;
16182
- const digest = createHash4("sha256").update(path11).digest("hex").slice(0, 12);
16225
+ const digest = createHash5("sha256").update(path11).digest("hex").slice(0, 12);
16183
16226
  return `${truncateUtf16(path11, 48)}...#${digest}${path11.slice(-24)}`;
16184
16227
  }
16185
16228
  function boundedProjection(full, partialRows, reserve = 0) {
@@ -17901,7 +17944,7 @@ function assertProviderReloadKeepsPendingBatches(db, previous, next, executing =
17901
17944
  }
17902
17945
 
17903
17946
  // src/provider-model-catalog.ts
17904
- import { createHash as createHash5 } from "crypto";
17947
+ import { createHash as createHash6 } from "crypto";
17905
17948
  var TTL_MS = 60 * 60 * 1e3;
17906
17949
  var RETRY_MS = 60 * 1e3;
17907
17950
  var TIMEOUT_MS3 = 3e3;
@@ -17915,7 +17958,7 @@ function createProviderModelCatalog(registry) {
17915
17958
  }
17916
17959
  const fallback = provider.adapter.modelRegistry.knownModels;
17917
17960
  if (!provider.adapter.listModels) return fallback;
17918
- const identity = createHash5("sha256").update(JSON.stringify(provider.config)).digest("hex");
17961
+ const identity = createHash6("sha256").update(JSON.stringify(provider.config)).digest("hex");
17919
17962
  let entry = cache.get(name);
17920
17963
  if (entry?.identity !== identity) {
17921
17964
  entry = { identity, expiresAt: 0 };
@@ -17954,7 +17997,7 @@ function createProviderModelCatalog(registry) {
17954
17997
  const provider = registry.get(name);
17955
17998
  if (!provider) return [];
17956
17999
  const entry = cache.get(name);
17957
- const identity = createHash5("sha256").update(JSON.stringify(provider.config)).digest("hex");
18000
+ const identity = createHash6("sha256").update(JSON.stringify(provider.config)).digest("hex");
17958
18001
  return (entry?.identity === identity ? entry.models : void 0) ?? provider.adapter.modelRegistry.knownModels;
17959
18002
  };
17960
18003
  return Object.assign(read, { cached: cached2 });
@@ -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",
@@ -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-57MGI2UT.js";
4
+ import "./chunk-LK7O7RM6.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-57MGI2UT.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-LK7O7RM6.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-LK7O7RM6.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";