@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.
- package/assets/agent-workspace/skills/aero/references/agent-operations.md +9 -0
- package/assets/agent-workspace/skills/aero/references/site-health.md +12 -0
- package/assets/agent-workspace/skills/canonry/SKILL.md +9 -0
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +3 -0
- package/assets/assets/{AuditHistoryPanel-C5oZsvsR.js → AuditHistoryPanel-CvANw3ds.js} +1 -1
- package/assets/assets/{BacklinksPage-CF5sGSTQ.js → BacklinksPage-C6x9ELjk.js} +1 -1
- package/assets/assets/{HistoryPage-DumL6cl5.js → HistoryPage-r36HX1cC.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-DCegOp_w.js → MeasurementPropertyPage-ComoCzR4.js} +1 -1
- package/assets/assets/{ProjectPage-CWDk48Y6.js → ProjectPage-CIeU-buk.js} +1 -1
- package/assets/assets/{RunsPage-Bb1VMWYu.js → RunsPage-DI6eJATZ.js} +1 -1
- package/assets/assets/{SettingsPage-CHGh169l.js → SettingsPage-Bw7GdXxs.js} +1 -1
- package/assets/assets/{SiteHealthSection-bGzH9m9-.js → SiteHealthSection-C-JaNKpS.js} +3 -3
- package/assets/assets/{TrafficPage-cfnEZ2Mu.js → TrafficPage-Cnsp276v.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-BQS0MAXE.js → TrafficSourceDetailPage-CBIaJk7e.js} +1 -1
- package/assets/assets/{extract-error-message-IWhACkO_.js → extract-error-message-C_Owa0n9.js} +1 -1
- package/assets/assets/{index-BDY3-V1S.js → index-ZS9sSTMS.js} +20 -20
- package/assets/assets/{react-sigma_core.esm.min-BQt189AI.js → react-sigma_core.esm.min-ugyh-ooq.js} +1 -1
- package/assets/assets/{v2-overview-adapter-ZC3VuoTT.js → v2-overview-adapter-BLSrVQ7K.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-WU2BRWXY.js → chunk-3JVF3ULD.js} +5 -1
- package/dist/{chunk-WRUKKEGR.js → chunk-45Z5RJZW.js} +3 -3
- package/dist/{chunk-KOIOZ7QW.js → chunk-5LY7EG4U.js} +47 -3
- package/dist/{chunk-C2I7M3B2.js → chunk-EJRV7RBZ.js} +127 -9
- package/dist/{chunk-65BHDVYO.js → chunk-G47XJVAS.js} +830 -465
- package/dist/{chunk-E43JM3QV.js → chunk-GZ2KIONF.js} +92 -1
- package/dist/{chunk-BWR5MNL5.js → chunk-JVBI6VBT.js} +2 -2
- package/dist/{chunk-LYKDNJXR.js → chunk-MPWBFKGK.js} +44 -1
- package/dist/{chunk-WXX3NL4C.js → chunk-QQYQDTFZ.js} +40 -12
- package/dist/{chunk-BPFRGC7K.js → chunk-SW54HXSZ.js} +3 -3
- package/dist/{cli-catalog-J3O6W726.js → cli-catalog-PNJEQV5H.js} +3 -3
- package/dist/cli-commands-4UT2CRXX.js +15 -0
- package/dist/cli.js +10 -10
- package/dist/{demo-server-KA7DWTY6.js → demo-server-WRHR25HF.js} +4 -4
- package/dist/index.js +6 -6
- package/dist/{intelligence-service-LHZZTJPH.js → intelligence-service-QXXRUB2G.js} +2 -2
- package/dist/mcp.js +4 -4
- package/package.json +9 -9
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
31
|
+
} from "./chunk-JVBI6VBT.js";
|
|
32
32
|
import {
|
|
33
33
|
CanonryMcpToolNames,
|
|
34
34
|
PACKAGE_VERSION,
|
|
35
35
|
canonryMcpTools
|
|
36
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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 ? "
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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-
|
|
7
|
+
} from "./chunk-5LY7EG4U.js";
|
|
8
8
|
import {
|
|
9
9
|
PACKAGE_VERSION
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-MPWBFKGK.js";
|
|
11
11
|
import {
|
|
12
12
|
SKILL_MANIFEST_FILENAME,
|
|
13
13
|
SkillsClients
|
|
14
|
-
} from "./chunk-
|
|
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-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-45Z5RJZW.js";
|
|
7
|
+
import "./chunk-3JVF3ULD.js";
|
|
8
8
|
import "./chunk-HGMYEDAQ.js";
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
5
|
+
} from "./chunk-SW54HXSZ.js";
|
|
6
6
|
import {
|
|
7
7
|
accessFilterFromArgs,
|
|
8
8
|
dispatchRegisteredCommand,
|
|
9
9
|
printCliCatalog
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
31
|
-
import "./chunk-
|
|
30
|
+
} from "./chunk-QQYQDTFZ.js";
|
|
31
|
+
import "./chunk-5LY7EG4U.js";
|
|
32
32
|
import {
|
|
33
33
|
resolveCliAccess
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-3JVF3ULD.js";
|
|
35
35
|
import "./chunk-RB2F4D3Z.js";
|
|
36
|
-
import "./chunk-
|
|
37
|
-
import "./chunk-
|
|
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-
|
|
45
|
+
import "./chunk-G47XJVAS.js";
|
|
46
46
|
import {
|
|
47
47
|
OperationAccesses
|
|
48
|
-
} from "./chunk-
|
|
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-
|
|
8
|
+
} from "./chunk-JVBI6VBT.js";
|
|
9
9
|
import {
|
|
10
10
|
PACKAGE_VERSION,
|
|
11
11
|
canonryMcpTools
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
6
|
+
} from "./chunk-QQYQDTFZ.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-5LY7EG4U.js";
|
|
10
|
+
import "./chunk-JVBI6VBT.js";
|
|
11
|
+
import "./chunk-MPWBFKGK.js";
|
|
12
12
|
import "./chunk-HGMYEDAQ.js";
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-G47XJVAS.js";
|
|
14
|
+
import "./chunk-GZ2KIONF.js";
|
|
15
15
|
export {
|
|
16
16
|
GoogleMarketingRuntimeError,
|
|
17
17
|
createGoogleMarketingCredentialStore,
|
package/dist/mcp.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoSyncSkills
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SW54HXSZ.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient,
|
|
6
6
|
createCanonryMcpServer
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
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-
|
|
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.
|
|
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.
|
|
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-
|
|
115
|
-
"@ainyc/canonry-
|
|
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
|
-
};
|