@canonry/canonry 4.154.0 → 4.155.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/README.md +2 -2
- package/assets/agent-workspace/AGENTS.md +2 -2
- package/assets/agent-workspace/skills/aero/references/orchestration.md +3 -3
- package/assets/agent-workspace/skills/canonry/SKILL.md +6 -21
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +14 -6
- package/assets/assets/{AuditHistoryPanel-WWT1n8jp.js → AuditHistoryPanel-BlbMBxOY.js} +1 -1
- package/assets/assets/BacklinksPage-DA9EaV9q.js +1 -0
- package/assets/assets/HistoryPage-BTrIHjMQ.js +1 -0
- package/assets/assets/MeasurementPropertyPage-CN6o5xFg.js +1 -0
- package/assets/assets/{ProjectPage-BR5ECwUP.js → ProjectPage-CsDbgp_0.js} +9 -9
- package/assets/assets/{RunRow-OE5tiuih.js → RunRow-ch_OlCPs.js} +1 -1
- package/assets/assets/RunsPage-T89Y_yS8.js +1 -0
- package/assets/assets/SettingsPage-DnmEq3F9.js +1 -0
- package/assets/assets/TrafficPage-CW1UhaJt.js +1 -0
- package/assets/assets/TrafficSourceDetailPage-r4Ji3wJm.js +1 -0
- package/assets/assets/extract-error-message-a8EErBoZ.js +1 -0
- package/assets/assets/index-BKq6k5Of.js +83 -0
- package/assets/assets/vendor-lucide-ByU7vBHt.js +1 -0
- package/assets/assets/vendor-yaml-GWJz5H2G.js +131 -0
- package/assets/index.html +3 -1
- package/dist/{chunk-ANSQ6JNO.js → chunk-OSHRDV36.js} +317 -4
- package/dist/{chunk-NNW7TJUZ.js → chunk-VIKPFI6F.js} +200 -5
- package/dist/{chunk-IFZS2TXV.js → chunk-VOL2BSM5.js} +1133 -104
- package/dist/{chunk-X5I7CAXH.js → chunk-YSESZNVT.js} +609 -165
- package/dist/cli.js +342 -7
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-B5AETQ5N.js → intelligence-service-G4NV3X36.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +9 -9
- package/assets/assets/BacklinksPage-DIjUnsVL.js +0 -1
- package/assets/assets/HistoryPage-CrIBhGuW.js +0 -1
- package/assets/assets/MeasurementPropertyPage-uN4BWigS.js +0 -1
- package/assets/assets/RunsPage-C6xBmjps.js +0 -1
- package/assets/assets/SettingsPage-CUjjr8U0.js +0 -1
- package/assets/assets/TrafficPage-DrEfsHiE.js +0 -1
- package/assets/assets/TrafficSourceDetailPage-B3DX5BEk.js +0 -1
- package/assets/assets/arrow-left-CLmqvCqU.js +0 -1
- package/assets/assets/extract-error-message-BEBd1a5v.js +0 -1
- package/assets/assets/index-CsM-Xxia.js +0 -213
- package/assets/assets/refresh-cw-DYSS2Wd-.js +0 -1
- package/assets/assets/trash-2-VoiF_ckU.js +0 -1
|
@@ -81,7 +81,7 @@ import {
|
|
|
81
81
|
trafficConnectWordpressRequestSchema,
|
|
82
82
|
trafficEventKindSchema,
|
|
83
83
|
trafficSeriesGranularitySchema
|
|
84
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-VIKPFI6F.js";
|
|
85
85
|
|
|
86
86
|
// src/config.ts
|
|
87
87
|
import fs from "fs";
|
|
@@ -4907,6 +4907,78 @@ var getApiV1ProjectsByNameTechnicalAeoTrend = (options) => {
|
|
|
4907
4907
|
...options
|
|
4908
4908
|
});
|
|
4909
4909
|
};
|
|
4910
|
+
var getApiV1ProjectsByNameTechnicalAeoCrawl = (options) => {
|
|
4911
|
+
return (options.client ?? client).get({
|
|
4912
|
+
security: [
|
|
4913
|
+
{
|
|
4914
|
+
scheme: "bearer",
|
|
4915
|
+
type: "http"
|
|
4916
|
+
}
|
|
4917
|
+
],
|
|
4918
|
+
url: "/api/v1/projects/{name}/technical-aeo/crawl",
|
|
4919
|
+
...options
|
|
4920
|
+
});
|
|
4921
|
+
};
|
|
4922
|
+
var getApiV1ProjectsByNameTechnicalAeoCrawlPages = (options) => {
|
|
4923
|
+
return (options.client ?? client).get({
|
|
4924
|
+
security: [
|
|
4925
|
+
{
|
|
4926
|
+
scheme: "bearer",
|
|
4927
|
+
type: "http"
|
|
4928
|
+
}
|
|
4929
|
+
],
|
|
4930
|
+
url: "/api/v1/projects/{name}/technical-aeo/crawl/pages",
|
|
4931
|
+
...options
|
|
4932
|
+
});
|
|
4933
|
+
};
|
|
4934
|
+
var getApiV1ProjectsByNameTechnicalAeoStructure = (options) => {
|
|
4935
|
+
return (options.client ?? client).get({
|
|
4936
|
+
security: [
|
|
4937
|
+
{
|
|
4938
|
+
scheme: "bearer",
|
|
4939
|
+
type: "http"
|
|
4940
|
+
}
|
|
4941
|
+
],
|
|
4942
|
+
url: "/api/v1/projects/{name}/technical-aeo/structure",
|
|
4943
|
+
...options
|
|
4944
|
+
});
|
|
4945
|
+
};
|
|
4946
|
+
var getApiV1ProjectsByNameTechnicalAeoInternalLinks = (options) => {
|
|
4947
|
+
return (options.client ?? client).get({
|
|
4948
|
+
security: [
|
|
4949
|
+
{
|
|
4950
|
+
scheme: "bearer",
|
|
4951
|
+
type: "http"
|
|
4952
|
+
}
|
|
4953
|
+
],
|
|
4954
|
+
url: "/api/v1/projects/{name}/technical-aeo/internal-links",
|
|
4955
|
+
...options
|
|
4956
|
+
});
|
|
4957
|
+
};
|
|
4958
|
+
var getApiV1ProjectsByNameTechnicalAeoInternalLinksNeighbors = (options) => {
|
|
4959
|
+
return (options.client ?? client).get({
|
|
4960
|
+
security: [
|
|
4961
|
+
{
|
|
4962
|
+
scheme: "bearer",
|
|
4963
|
+
type: "http"
|
|
4964
|
+
}
|
|
4965
|
+
],
|
|
4966
|
+
url: "/api/v1/projects/{name}/technical-aeo/internal-links/neighbors",
|
|
4967
|
+
...options
|
|
4968
|
+
});
|
|
4969
|
+
};
|
|
4970
|
+
var getApiV1ProjectsByNameTechnicalAeoDeadLinks = (options) => {
|
|
4971
|
+
return (options.client ?? client).get({
|
|
4972
|
+
security: [
|
|
4973
|
+
{
|
|
4974
|
+
scheme: "bearer",
|
|
4975
|
+
type: "http"
|
|
4976
|
+
}
|
|
4977
|
+
],
|
|
4978
|
+
url: "/api/v1/projects/{name}/technical-aeo/dead-links",
|
|
4979
|
+
...options
|
|
4980
|
+
});
|
|
4981
|
+
};
|
|
4910
4982
|
var postApiV1ProjectsByNameTechnicalAeoRuns = (options) => {
|
|
4911
4983
|
return (options.client ?? client).post({
|
|
4912
4984
|
security: [
|
|
@@ -7041,6 +7113,96 @@ var ApiClient = class {
|
|
|
7041
7113
|
})
|
|
7042
7114
|
);
|
|
7043
7115
|
}
|
|
7116
|
+
/** Persisted full-crawl metadata. This never synthesizes a graph from legacy audit rows. */
|
|
7117
|
+
async getTechnicalAeoCrawl(project, opts) {
|
|
7118
|
+
return this.invoke(
|
|
7119
|
+
() => getApiV1ProjectsByNameTechnicalAeoCrawl({
|
|
7120
|
+
client: this.heyClient,
|
|
7121
|
+
path: { name: project },
|
|
7122
|
+
query: { runId: opts?.runId }
|
|
7123
|
+
})
|
|
7124
|
+
);
|
|
7125
|
+
}
|
|
7126
|
+
/** Bounded, cursor-paged crawl nodes. */
|
|
7127
|
+
async getTechnicalAeoCrawlPages(project, opts) {
|
|
7128
|
+
return this.invoke(
|
|
7129
|
+
() => getApiV1ProjectsByNameTechnicalAeoCrawlPages({
|
|
7130
|
+
client: this.heyClient,
|
|
7131
|
+
path: { name: project },
|
|
7132
|
+
query: {
|
|
7133
|
+
runId: opts?.runId,
|
|
7134
|
+
inventoryEligible: opts?.inventoryEligible,
|
|
7135
|
+
fetchState: opts?.fetchState,
|
|
7136
|
+
indexabilityState: opts?.indexabilityState,
|
|
7137
|
+
auditState: opts?.auditState,
|
|
7138
|
+
sort: opts?.sort,
|
|
7139
|
+
cursor: opts?.cursor,
|
|
7140
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7141
|
+
}
|
|
7142
|
+
})
|
|
7143
|
+
);
|
|
7144
|
+
}
|
|
7145
|
+
/** One bounded path level from a persisted crawl. */
|
|
7146
|
+
async getTechnicalAeoStructure(project, opts) {
|
|
7147
|
+
return this.invoke(
|
|
7148
|
+
() => getApiV1ProjectsByNameTechnicalAeoStructure({
|
|
7149
|
+
client: this.heyClient,
|
|
7150
|
+
path: { name: project },
|
|
7151
|
+
query: {
|
|
7152
|
+
runId: opts?.runId,
|
|
7153
|
+
parentPath: opts?.parentPath,
|
|
7154
|
+
cursor: opts?.cursor,
|
|
7155
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7156
|
+
}
|
|
7157
|
+
})
|
|
7158
|
+
);
|
|
7159
|
+
}
|
|
7160
|
+
/** Bounded, cursor-paged internal crawl edges. */
|
|
7161
|
+
async getTechnicalAeoInternalLinks(project, opts) {
|
|
7162
|
+
return this.invoke(
|
|
7163
|
+
() => getApiV1ProjectsByNameTechnicalAeoInternalLinks({
|
|
7164
|
+
client: this.heyClient,
|
|
7165
|
+
path: { name: project },
|
|
7166
|
+
query: {
|
|
7167
|
+
runId: opts?.runId,
|
|
7168
|
+
sourceUrl: opts?.sourceUrl,
|
|
7169
|
+
targetUrl: opts?.targetUrl,
|
|
7170
|
+
followable: opts?.followable,
|
|
7171
|
+
cursor: opts?.cursor,
|
|
7172
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7173
|
+
}
|
|
7174
|
+
})
|
|
7175
|
+
);
|
|
7176
|
+
}
|
|
7177
|
+
/** Bounded inbound/outbound internal edges for one crawl node. */
|
|
7178
|
+
async getTechnicalAeoInternalLinkNeighbors(project, opts) {
|
|
7179
|
+
return this.invoke(
|
|
7180
|
+
() => getApiV1ProjectsByNameTechnicalAeoInternalLinksNeighbors({
|
|
7181
|
+
client: this.heyClient,
|
|
7182
|
+
path: { name: project },
|
|
7183
|
+
query: {
|
|
7184
|
+
runId: opts.runId,
|
|
7185
|
+
nodeKey: opts.nodeKey,
|
|
7186
|
+
url: opts.url,
|
|
7187
|
+
limit: opts.limit !== void 0 ? String(opts.limit) : void 0
|
|
7188
|
+
}
|
|
7189
|
+
})
|
|
7190
|
+
);
|
|
7191
|
+
}
|
|
7192
|
+
/** Dead-link state/findings; `disabled` means the crawl did not opt in. */
|
|
7193
|
+
async getTechnicalAeoDeadLinks(project, opts) {
|
|
7194
|
+
return this.invoke(
|
|
7195
|
+
() => getApiV1ProjectsByNameTechnicalAeoDeadLinks({
|
|
7196
|
+
client: this.heyClient,
|
|
7197
|
+
path: { name: project },
|
|
7198
|
+
query: {
|
|
7199
|
+
runId: opts?.runId,
|
|
7200
|
+
cursor: opts?.cursor,
|
|
7201
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7202
|
+
}
|
|
7203
|
+
})
|
|
7204
|
+
);
|
|
7205
|
+
}
|
|
7044
7206
|
async triggerSiteAudit(project, body) {
|
|
7045
7207
|
return this.invoke(
|
|
7046
7208
|
() => postApiV1ProjectsByNameTechnicalAeoRuns({
|
|
@@ -8209,10 +8371,61 @@ var technicalAeoTrendInputSchema = z3.object({
|
|
|
8209
8371
|
project: projectNameSchema,
|
|
8210
8372
|
limit: z3.number().int().positive().max(365).optional()
|
|
8211
8373
|
});
|
|
8374
|
+
var technicalAeoCrawlInputSchema = z3.object({
|
|
8375
|
+
project: projectNameSchema,
|
|
8376
|
+
runId: runIdSchema.optional().describe("Historical crawl-bearing site-audit run ID. Omit for the latest persisted crawl.")
|
|
8377
|
+
});
|
|
8378
|
+
var technicalAeoCrawlPagesInputSchema = z3.object({
|
|
8379
|
+
project: projectNameSchema,
|
|
8380
|
+
runId: runIdSchema.optional(),
|
|
8381
|
+
inventoryEligible: z3.boolean().optional().describe("Filter Canonry technical-inventory eligibility. This is not actual Google index coverage."),
|
|
8382
|
+
fetchState: z3.string().min(1).optional().describe("Filter crawler fetch state, for example html, redirect, non-html, or fetch-error."),
|
|
8383
|
+
indexabilityState: z3.string().min(1).optional().describe("Filter crawler-derived indexability state. This is not Google index coverage."),
|
|
8384
|
+
auditState: z3.string().min(1).optional().describe("Filter audit state."),
|
|
8385
|
+
sort: z3.enum(["url", "path", "score-asc", "score-desc"]).optional(),
|
|
8386
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous crawl-pages result."),
|
|
8387
|
+
limit: z3.number().int().positive().max(200).optional()
|
|
8388
|
+
});
|
|
8389
|
+
var technicalAeoStructureInputSchema = z3.object({
|
|
8390
|
+
project: projectNameSchema,
|
|
8391
|
+
runId: runIdSchema.optional(),
|
|
8392
|
+
parentPath: z3.string().min(1).optional().describe("Path whose immediate children to list. Defaults to /. This never returns a whole site tree."),
|
|
8393
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous structure result."),
|
|
8394
|
+
limit: z3.number().int().positive().max(100).optional()
|
|
8395
|
+
});
|
|
8396
|
+
var technicalAeoInternalLinksInputSchema = z3.object({
|
|
8397
|
+
project: projectNameSchema,
|
|
8398
|
+
runId: runIdSchema.optional(),
|
|
8399
|
+
sourceUrl: z3.string().url().optional(),
|
|
8400
|
+
targetUrl: z3.string().url().optional(),
|
|
8401
|
+
followable: z3.boolean().optional(),
|
|
8402
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous internal-links result."),
|
|
8403
|
+
limit: z3.number().int().positive().max(200).optional()
|
|
8404
|
+
});
|
|
8405
|
+
var technicalAeoLinkNeighborsInputSchema = z3.object({
|
|
8406
|
+
project: projectNameSchema,
|
|
8407
|
+
runId: runIdSchema.optional(),
|
|
8408
|
+
nodeKey: z3.string().min(1).optional(),
|
|
8409
|
+
url: z3.string().url().optional(),
|
|
8410
|
+
limit: z3.number().int().positive().max(100).optional()
|
|
8411
|
+
}).refine((value) => Boolean(value.nodeKey || value.url), {
|
|
8412
|
+
message: "Provide nodeKey or url.",
|
|
8413
|
+
path: ["nodeKey"]
|
|
8414
|
+
});
|
|
8415
|
+
var technicalAeoDeadLinksInputSchema = z3.object({
|
|
8416
|
+
project: projectNameSchema,
|
|
8417
|
+
runId: runIdSchema.optional(),
|
|
8418
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous dead-links result."),
|
|
8419
|
+
limit: z3.number().int().positive().max(200).optional()
|
|
8420
|
+
});
|
|
8212
8421
|
var technicalAeoRunInputSchema = z3.object({
|
|
8213
8422
|
project: projectNameSchema,
|
|
8214
8423
|
sitemapUrl: z3.string().url().optional().describe("Override the sitemap URL. Defaults to https://<canonicalDomain>/sitemap.xml."),
|
|
8215
|
-
limit: z3.number().int().positive().max(2e3).optional().describe("
|
|
8424
|
+
limit: z3.number().int().positive().max(2e3).optional().describe("Deprecated compatibility alias for maxPages."),
|
|
8425
|
+
maxPages: z3.number().int().positive().max(5e4).optional().describe("Maximum pages crawled and audited. Defaults to 1,000; hard maximum 50,000."),
|
|
8426
|
+
maxEdges: z3.number().int().positive().max(1e6).optional().describe("Maximum link observations retained for this crawl. Defaults to 100,000; hard maximum 1,000,000."),
|
|
8427
|
+
maxDepth: z3.number().int().min(0).max(100).optional().describe("Maximum internal-link depth from the root page."),
|
|
8428
|
+
checkDeadLinks: z3.boolean().optional().describe("Opt in to internal dead-link checks. Omitted and false both disable checks.")
|
|
8216
8429
|
});
|
|
8217
8430
|
var AGENT_WEBHOOK_EVENTS = [
|
|
8218
8431
|
notificationEventSchema.enum["run.completed"],
|
|
@@ -10060,10 +10273,106 @@ var canonryMcpTools = [
|
|
|
10060
10273
|
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/trend"],
|
|
10061
10274
|
handler: (client2, input) => client2.getTechnicalAeoTrend(input.project, input.limit !== void 0 ? { limit: input.limit } : void 0)
|
|
10062
10275
|
}),
|
|
10276
|
+
defineTool({
|
|
10277
|
+
name: "canonry_technical_aeo_crawl",
|
|
10278
|
+
title: "Get persisted Technical AEO crawl",
|
|
10279
|
+
description: "Read persisted full-crawl metadata for the latest or selected Technical AEO site-audit run: root URL, crawl/indexability/link-score versions, effective budgets, completeness, counts, and explicit dead-link check state. This does not fabricate a graph from older scorecard-only audits.",
|
|
10280
|
+
access: "read",
|
|
10281
|
+
tier: "monitoring",
|
|
10282
|
+
inputSchema: technicalAeoCrawlInputSchema,
|
|
10283
|
+
annotations: readAnnotations(),
|
|
10284
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/crawl"],
|
|
10285
|
+
handler: (client2, input) => client2.getTechnicalAeoCrawl(input.project, { runId: input.runId })
|
|
10286
|
+
}),
|
|
10287
|
+
defineTool({
|
|
10288
|
+
name: "canonry_technical_aeo_crawl_pages",
|
|
10289
|
+
title: "List Technical AEO crawl pages",
|
|
10290
|
+
description: "Read one bounded, cursor-paged list of canonical crawl nodes. Filter crawler-derived indexability and audit state, then follow nextCursor; this is technical inventory eligibility, not a claim about Google index coverage.",
|
|
10291
|
+
access: "read",
|
|
10292
|
+
tier: "monitoring",
|
|
10293
|
+
inputSchema: technicalAeoCrawlPagesInputSchema,
|
|
10294
|
+
annotations: readAnnotations(),
|
|
10295
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/crawl/pages"],
|
|
10296
|
+
handler: (client2, input) => client2.getTechnicalAeoCrawlPages(input.project, {
|
|
10297
|
+
runId: input.runId,
|
|
10298
|
+
inventoryEligible: input.inventoryEligible,
|
|
10299
|
+
fetchState: input.fetchState,
|
|
10300
|
+
indexabilityState: input.indexabilityState,
|
|
10301
|
+
auditState: input.auditState,
|
|
10302
|
+
sort: input.sort,
|
|
10303
|
+
cursor: input.cursor,
|
|
10304
|
+
limit: input.limit
|
|
10305
|
+
})
|
|
10306
|
+
}),
|
|
10307
|
+
defineTool({
|
|
10308
|
+
name: "canonry_technical_aeo_structure",
|
|
10309
|
+
title: "List Technical AEO site structure",
|
|
10310
|
+
description: "Read one bounded level of the persisted site hierarchy below parentPath. Follow nextCursor for more siblings; request a child path separately rather than attempting to materialize the entire website tree.",
|
|
10311
|
+
access: "read",
|
|
10312
|
+
tier: "monitoring",
|
|
10313
|
+
inputSchema: technicalAeoStructureInputSchema,
|
|
10314
|
+
annotations: readAnnotations(),
|
|
10315
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/structure"],
|
|
10316
|
+
handler: (client2, input) => client2.getTechnicalAeoStructure(input.project, {
|
|
10317
|
+
runId: input.runId,
|
|
10318
|
+
parentPath: input.parentPath,
|
|
10319
|
+
cursor: input.cursor,
|
|
10320
|
+
limit: input.limit
|
|
10321
|
+
})
|
|
10322
|
+
}),
|
|
10323
|
+
defineTool({
|
|
10324
|
+
name: "canonry_technical_aeo_internal_links",
|
|
10325
|
+
title: "List Technical AEO internal links",
|
|
10326
|
+
description: "Read a bounded, cursor-paged list of persisted internal crawl edges. Filter by source URL, target URL, or followability. Use the neighbors tool for one page rather than loading a graph.",
|
|
10327
|
+
access: "read",
|
|
10328
|
+
tier: "monitoring",
|
|
10329
|
+
inputSchema: technicalAeoInternalLinksInputSchema,
|
|
10330
|
+
annotations: readAnnotations(),
|
|
10331
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/internal-links"],
|
|
10332
|
+
handler: (client2, input) => client2.getTechnicalAeoInternalLinks(input.project, {
|
|
10333
|
+
runId: input.runId,
|
|
10334
|
+
sourceUrl: input.sourceUrl,
|
|
10335
|
+
targetUrl: input.targetUrl,
|
|
10336
|
+
followable: input.followable,
|
|
10337
|
+
cursor: input.cursor,
|
|
10338
|
+
limit: input.limit
|
|
10339
|
+
})
|
|
10340
|
+
}),
|
|
10341
|
+
defineTool({
|
|
10342
|
+
name: "canonry_technical_aeo_link_neighbors",
|
|
10343
|
+
title: "Get Technical AEO page link neighbors",
|
|
10344
|
+
description: "Read bounded inbound and outbound internal links for exactly one crawl node, selected by nodeKey or URL. It returns independent truncation flags for inbound and outbound edges, not a transitive traversal.",
|
|
10345
|
+
access: "read",
|
|
10346
|
+
tier: "monitoring",
|
|
10347
|
+
inputSchema: technicalAeoLinkNeighborsInputSchema,
|
|
10348
|
+
annotations: readAnnotations(),
|
|
10349
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/internal-links/neighbors"],
|
|
10350
|
+
handler: (client2, input) => client2.getTechnicalAeoInternalLinkNeighbors(input.project, {
|
|
10351
|
+
runId: input.runId,
|
|
10352
|
+
nodeKey: input.nodeKey,
|
|
10353
|
+
url: input.url,
|
|
10354
|
+
limit: input.limit
|
|
10355
|
+
})
|
|
10356
|
+
}),
|
|
10357
|
+
defineTool({
|
|
10358
|
+
name: "canonry_technical_aeo_dead_links",
|
|
10359
|
+
title: "List Technical AEO dead links",
|
|
10360
|
+
description: "Read the persisted dead-link check state and a bounded, cursor-paged list of findings. A disabled result means the crawl was run without opt-in checks; it never means zero dead links.",
|
|
10361
|
+
access: "read",
|
|
10362
|
+
tier: "monitoring",
|
|
10363
|
+
inputSchema: technicalAeoDeadLinksInputSchema,
|
|
10364
|
+
annotations: readAnnotations(),
|
|
10365
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/dead-links"],
|
|
10366
|
+
handler: (client2, input) => client2.getTechnicalAeoDeadLinks(input.project, {
|
|
10367
|
+
runId: input.runId,
|
|
10368
|
+
cursor: input.cursor,
|
|
10369
|
+
limit: input.limit
|
|
10370
|
+
})
|
|
10371
|
+
}),
|
|
10063
10372
|
defineTool({
|
|
10064
10373
|
name: "canonry_technical_aeo_run",
|
|
10065
10374
|
title: "Run Technical AEO site audit",
|
|
10066
|
-
description: "
|
|
10375
|
+
description: "Start a site-audit run. The run discovers root, sitemap, and linked pages. Its unattended default is 1,000 pages and 100,000 link observations; callers may explicitly raise either to its hard maximum. It returns {runId, status} and continues in the background. If an active run has identical effective options, this tool returns it; different options are refused. Poll canonry_run_get, then read the crawl and score tools.",
|
|
10067
10376
|
access: "write",
|
|
10068
10377
|
tier: "monitoring",
|
|
10069
10378
|
inputSchema: technicalAeoRunInputSchema,
|
|
@@ -10071,7 +10380,11 @@ var canonryMcpTools = [
|
|
|
10071
10380
|
openApiOperations: ["POST /api/v1/projects/{name}/technical-aeo/runs"],
|
|
10072
10381
|
handler: (client2, input) => client2.triggerSiteAudit(input.project, {
|
|
10073
10382
|
sitemapUrl: input.sitemapUrl,
|
|
10074
|
-
limit: input.limit
|
|
10383
|
+
limit: input.limit,
|
|
10384
|
+
maxPages: input.maxPages,
|
|
10385
|
+
maxEdges: input.maxEdges,
|
|
10386
|
+
maxDepth: input.maxDepth,
|
|
10387
|
+
checkDeadLinks: input.checkDeadLinks
|
|
10075
10388
|
})
|
|
10076
10389
|
}),
|
|
10077
10390
|
// ----- OpenAI ads (ChatGPT ads) -----
|
|
@@ -8441,6 +8441,7 @@ var snapshotReportSchema = z23.object({
|
|
|
8441
8441
|
|
|
8442
8442
|
// ../contracts/src/technical-aeo.ts
|
|
8443
8443
|
import { z as z24 } from "zod";
|
|
8444
|
+
var nullableRunStatusSchema = z24.union([runStatusSchema, z24.null()]);
|
|
8444
8445
|
var siteAuditFactorStatusSchema = z24.enum(["pass", "partial", "fail"]);
|
|
8445
8446
|
var SiteAuditFactorStatuses = siteAuditFactorStatusSchema.enum;
|
|
8446
8447
|
function factorStatusFromScore(score) {
|
|
@@ -8475,7 +8476,7 @@ var siteAuditScoreSchema = z24.object({
|
|
|
8475
8476
|
project: z24.string(),
|
|
8476
8477
|
hasData: z24.boolean(),
|
|
8477
8478
|
runId: z24.string().nullable(),
|
|
8478
|
-
runStatus:
|
|
8479
|
+
runStatus: nullableRunStatusSchema,
|
|
8479
8480
|
sitemapUrl: z24.string().nullable(),
|
|
8480
8481
|
auditedAt: z24.string().nullable(),
|
|
8481
8482
|
aggregateScore: z24.number(),
|
|
@@ -8523,12 +8524,194 @@ var siteAuditTrendResponseSchema = z24.object({
|
|
|
8523
8524
|
project: z24.string(),
|
|
8524
8525
|
points: z24.array(siteAuditTrendPointSchema).default([])
|
|
8525
8526
|
});
|
|
8527
|
+
var siteCrawlDeadLinkStateSchema = z24.enum(["disabled", "complete", "partial", "unavailable"]);
|
|
8528
|
+
var SiteCrawlDeadLinkStates = siteCrawlDeadLinkStateSchema.enum;
|
|
8529
|
+
var siteCrawlCountsSchema = z24.object({
|
|
8530
|
+
pagesDiscovered: z24.number().int().nonnegative(),
|
|
8531
|
+
pagesFetched: z24.number().int().nonnegative(),
|
|
8532
|
+
pagesEligible: z24.number().int().nonnegative(),
|
|
8533
|
+
edges: z24.number().int().nonnegative(),
|
|
8534
|
+
findings: z24.number().int().nonnegative()
|
|
8535
|
+
});
|
|
8536
|
+
var siteCrawlDeadLinksSummarySchema = z24.discriminatedUnion("state", [
|
|
8537
|
+
z24.object({ state: z24.literal("unavailable") }),
|
|
8538
|
+
z24.object({ state: z24.literal("disabled") }),
|
|
8539
|
+
z24.object({ state: z24.literal("complete"), checked: z24.number().int().nonnegative(), found: z24.number().int().nonnegative() }),
|
|
8540
|
+
z24.object({ state: z24.literal("partial"), checked: z24.number().int().nonnegative(), found: z24.number().int().nonnegative() })
|
|
8541
|
+
]);
|
|
8542
|
+
var siteCrawlSummarySchema = z24.object({
|
|
8543
|
+
project: z24.string(),
|
|
8544
|
+
hasCrawlData: z24.boolean(),
|
|
8545
|
+
legacyAuditAvailable: z24.boolean(),
|
|
8546
|
+
runId: z24.string().nullable(),
|
|
8547
|
+
runStatus: nullableRunStatusSchema,
|
|
8548
|
+
rootUrl: z24.string().nullable(),
|
|
8549
|
+
crawlSchemaVersion: z24.string().nullable().optional(),
|
|
8550
|
+
engineVersion: z24.string().nullable().optional(),
|
|
8551
|
+
normalizationVersion: z24.string().nullable().optional(),
|
|
8552
|
+
indexabilityVersion: z24.string().nullable().optional(),
|
|
8553
|
+
linkScoreVersion: z24.string().nullable().optional(),
|
|
8554
|
+
effectiveOptions: z24.record(z24.string(), z24.unknown()).default({}),
|
|
8555
|
+
complete: z24.boolean(),
|
|
8556
|
+
termination: z24.string().nullable(),
|
|
8557
|
+
detailsAvailable: z24.boolean(),
|
|
8558
|
+
counts: siteCrawlCountsSchema,
|
|
8559
|
+
deadLinks: siteCrawlDeadLinksSummarySchema
|
|
8560
|
+
});
|
|
8561
|
+
var siteCrawlPageSchema = z24.object({
|
|
8562
|
+
nodeKey: z24.string(),
|
|
8563
|
+
url: z24.string(),
|
|
8564
|
+
finalUrl: z24.string().nullable(),
|
|
8565
|
+
path: z24.string(),
|
|
8566
|
+
parentPath: z24.string(),
|
|
8567
|
+
discoverySource: z24.string(),
|
|
8568
|
+
fetchState: z24.string(),
|
|
8569
|
+
httpStatus: z24.number().int().nullable(),
|
|
8570
|
+
canonicalUrl: z24.string().nullable(),
|
|
8571
|
+
indexabilityState: z24.string(),
|
|
8572
|
+
indexabilityReasons: z24.array(z24.string()).default([]),
|
|
8573
|
+
auditState: z24.string(),
|
|
8574
|
+
auditScore: z24.number().nullable(),
|
|
8575
|
+
inventoryEligible: z24.boolean(),
|
|
8576
|
+
depth: z24.number().int().nullable(),
|
|
8577
|
+
inboundUniqueEdges: z24.number().int().nonnegative(),
|
|
8578
|
+
outboundUniqueEdges: z24.number().int().nonnegative(),
|
|
8579
|
+
inboundOccurrences: z24.number().int().nonnegative(),
|
|
8580
|
+
outboundOccurrences: z24.number().int().nonnegative(),
|
|
8581
|
+
linkScoreRaw: z24.number().nullable(),
|
|
8582
|
+
linkScoreNormalized: z24.number().nullable()
|
|
8583
|
+
});
|
|
8584
|
+
var siteCrawlPagesResponseSchema = z24.object({
|
|
8585
|
+
project: z24.string(),
|
|
8586
|
+
hasCrawlData: z24.boolean(),
|
|
8587
|
+
runId: z24.string().nullable(),
|
|
8588
|
+
total: z24.number().int().nonnegative(),
|
|
8589
|
+
nextCursor: z24.string().nullable(),
|
|
8590
|
+
pages: z24.array(siteCrawlPageSchema).default([])
|
|
8591
|
+
});
|
|
8592
|
+
var siteCrawlStructureChildSchema = z24.object({
|
|
8593
|
+
path: z24.string(),
|
|
8594
|
+
/** URL of the exact folder landing page, null for a synthetic hierarchy node. */
|
|
8595
|
+
url: z24.string().nullable(),
|
|
8596
|
+
hasPage: z24.boolean(),
|
|
8597
|
+
pageCount: z24.number().int().positive(),
|
|
8598
|
+
inventoryEligibleCount: z24.number().int().nonnegative(),
|
|
8599
|
+
fetchedCount: z24.number().int().nonnegative()
|
|
8600
|
+
});
|
|
8601
|
+
var siteCrawlStructureResponseSchema = z24.object({
|
|
8602
|
+
project: z24.string(),
|
|
8603
|
+
hasCrawlData: z24.boolean(),
|
|
8604
|
+
runId: z24.string().nullable(),
|
|
8605
|
+
parentPath: z24.string(),
|
|
8606
|
+
nextCursor: z24.string().nullable(),
|
|
8607
|
+
children: z24.array(siteCrawlStructureChildSchema).default([])
|
|
8608
|
+
});
|
|
8609
|
+
var siteCrawlEdgeSchema = z24.object({
|
|
8610
|
+
edgeKey: z24.string(),
|
|
8611
|
+
sourceNodeKey: z24.string(),
|
|
8612
|
+
sourceUrl: z24.string(),
|
|
8613
|
+
targetNodeKey: z24.string().nullable(),
|
|
8614
|
+
targetUrl: z24.string(),
|
|
8615
|
+
relation: z24.string(),
|
|
8616
|
+
internal: z24.boolean(),
|
|
8617
|
+
followable: z24.boolean(),
|
|
8618
|
+
occurrences: z24.number().int().positive(),
|
|
8619
|
+
followableOccurrences: z24.number().int().nonnegative(),
|
|
8620
|
+
nofollowOccurrences: z24.number().int().nonnegative(),
|
|
8621
|
+
anchors: z24.array(z24.string()).default([])
|
|
8622
|
+
});
|
|
8623
|
+
var siteCrawlInternalLinksResponseSchema = z24.object({
|
|
8624
|
+
project: z24.string(),
|
|
8625
|
+
hasCrawlData: z24.boolean(),
|
|
8626
|
+
runId: z24.string().nullable(),
|
|
8627
|
+
total: z24.number().int().nonnegative(),
|
|
8628
|
+
nextCursor: z24.string().nullable(),
|
|
8629
|
+
edges: z24.array(siteCrawlEdgeSchema).default([])
|
|
8630
|
+
});
|
|
8631
|
+
var siteCrawlNeighborsResponseSchema = z24.object({
|
|
8632
|
+
project: z24.string(),
|
|
8633
|
+
hasCrawlData: z24.boolean(),
|
|
8634
|
+
runId: z24.string().nullable(),
|
|
8635
|
+
nodeKey: z24.string().nullable(),
|
|
8636
|
+
url: z24.string().nullable(),
|
|
8637
|
+
inbound: z24.array(siteCrawlEdgeSchema).default([]),
|
|
8638
|
+
outbound: z24.array(siteCrawlEdgeSchema).default([]),
|
|
8639
|
+
inboundTruncated: z24.boolean(),
|
|
8640
|
+
outboundTruncated: z24.boolean()
|
|
8641
|
+
});
|
|
8642
|
+
var siteCrawlDeadLinkSchema = z24.object({
|
|
8643
|
+
findingKey: z24.string(),
|
|
8644
|
+
severity: z24.string(),
|
|
8645
|
+
sourceNodeKey: z24.string().nullable(),
|
|
8646
|
+
sourceUrl: z24.string().nullable(),
|
|
8647
|
+
targetNodeKey: z24.string().nullable(),
|
|
8648
|
+
targetUrl: z24.string().nullable(),
|
|
8649
|
+
evidence: z24.record(z24.string(), z24.unknown()).default({})
|
|
8650
|
+
});
|
|
8651
|
+
var siteCrawlDeadLinksResponseSchema = z24.discriminatedUnion("state", [
|
|
8652
|
+
z24.object({ project: z24.string(), runId: z24.string().nullable(), state: z24.literal("unavailable"), legacyAuditAvailable: z24.boolean() }),
|
|
8653
|
+
z24.object({ project: z24.string(), runId: z24.string(), state: z24.literal("disabled"), checkDeadLinks: z24.literal(false) }),
|
|
8654
|
+
z24.object({
|
|
8655
|
+
project: z24.string(),
|
|
8656
|
+
runId: z24.string(),
|
|
8657
|
+
state: z24.literal("complete"),
|
|
8658
|
+
checkDeadLinks: z24.literal(true),
|
|
8659
|
+
checked: z24.number().int().nonnegative(),
|
|
8660
|
+
found: z24.number().int().nonnegative(),
|
|
8661
|
+
total: z24.number().int().nonnegative(),
|
|
8662
|
+
nextCursor: z24.string().nullable(),
|
|
8663
|
+
deadLinks: z24.array(siteCrawlDeadLinkSchema).default([])
|
|
8664
|
+
}),
|
|
8665
|
+
z24.object({
|
|
8666
|
+
project: z24.string(),
|
|
8667
|
+
runId: z24.string(),
|
|
8668
|
+
state: z24.literal("partial"),
|
|
8669
|
+
checkDeadLinks: z24.literal(true),
|
|
8670
|
+
checked: z24.number().int().nonnegative(),
|
|
8671
|
+
found: z24.number().int().nonnegative(),
|
|
8672
|
+
total: z24.number().int().nonnegative(),
|
|
8673
|
+
nextCursor: z24.string().nullable(),
|
|
8674
|
+
deadLinks: z24.array(siteCrawlDeadLinkSchema).default([])
|
|
8675
|
+
})
|
|
8676
|
+
]);
|
|
8677
|
+
var SITE_AUDIT_DEFAULT_PAGE_LIMIT = 1e3;
|
|
8678
|
+
var SITE_AUDIT_MAX_PAGE_LIMIT = 5e4;
|
|
8679
|
+
var SITE_AUDIT_DEFAULT_EDGE_LIMIT = 1e5;
|
|
8680
|
+
var SITE_AUDIT_MAX_EDGE_LIMIT = 1e6;
|
|
8526
8681
|
var siteAuditRunRequestSchema = z24.object({
|
|
8527
|
-
/**
|
|
8682
|
+
/** @deprecated Prefer the configured project sitemap; retained for compatibility. */
|
|
8528
8683
|
sitemapUrl: z24.string().url().optional(),
|
|
8529
|
-
/**
|
|
8530
|
-
limit: z24.number().int().positive().max(2e3).optional()
|
|
8531
|
-
|
|
8684
|
+
/** @deprecated Prefer `maxPages`; retained for compatibility. */
|
|
8685
|
+
limit: z24.number().int().positive().max(2e3).optional(),
|
|
8686
|
+
/** Crawl page budget. When omitted, Canonry crawls up to 1,000 pages. */
|
|
8687
|
+
maxPages: z24.number().int().positive().max(5e4).optional(),
|
|
8688
|
+
/** Internal-link observation budget. When omitted, Canonry retains up to 100,000 edges. */
|
|
8689
|
+
maxEdges: z24.number().int().positive().max(1e6).optional(),
|
|
8690
|
+
/** Maximum crawl depth from the root. */
|
|
8691
|
+
maxDepth: z24.number().int().min(0).max(100).optional(),
|
|
8692
|
+
/** Off by default; derives findings only from observed internal targets. External links are never probed. */
|
|
8693
|
+
checkDeadLinks: z24.boolean().default(false)
|
|
8694
|
+
});
|
|
8695
|
+
function normalizeSiteAuditRunRequest(request) {
|
|
8696
|
+
return {
|
|
8697
|
+
schemaVersion: 1,
|
|
8698
|
+
sitemapUrl: request.sitemapUrl ? new URL(request.sitemapUrl).toString() : null,
|
|
8699
|
+
maxPages: request.maxPages ?? request.limit ?? SITE_AUDIT_DEFAULT_PAGE_LIMIT,
|
|
8700
|
+
maxEdges: request.maxEdges ?? SITE_AUDIT_DEFAULT_EDGE_LIMIT,
|
|
8701
|
+
maxDepth: request.maxDepth ?? null,
|
|
8702
|
+
checkDeadLinks: request.checkDeadLinks === true
|
|
8703
|
+
};
|
|
8704
|
+
}
|
|
8705
|
+
function siteAuditRequestIdentity(request) {
|
|
8706
|
+
return JSON.stringify([
|
|
8707
|
+
request.schemaVersion,
|
|
8708
|
+
request.sitemapUrl,
|
|
8709
|
+
request.maxPages,
|
|
8710
|
+
request.maxEdges,
|
|
8711
|
+
request.maxDepth,
|
|
8712
|
+
request.checkDeadLinks
|
|
8713
|
+
]);
|
|
8714
|
+
}
|
|
8532
8715
|
var siteAuditRunResponseSchema = z24.object({
|
|
8533
8716
|
runId: z24.string(),
|
|
8534
8717
|
status: runStatusSchema
|
|
@@ -14145,7 +14328,19 @@ export {
|
|
|
14145
14328
|
siteAuditScoreSchema,
|
|
14146
14329
|
siteAuditPagesResponseSchema,
|
|
14147
14330
|
siteAuditTrendResponseSchema,
|
|
14331
|
+
siteCrawlSummarySchema,
|
|
14332
|
+
siteCrawlPagesResponseSchema,
|
|
14333
|
+
siteCrawlStructureResponseSchema,
|
|
14334
|
+
siteCrawlInternalLinksResponseSchema,
|
|
14335
|
+
siteCrawlNeighborsResponseSchema,
|
|
14336
|
+
siteCrawlDeadLinksResponseSchema,
|
|
14337
|
+
SITE_AUDIT_DEFAULT_PAGE_LIMIT,
|
|
14338
|
+
SITE_AUDIT_MAX_PAGE_LIMIT,
|
|
14339
|
+
SITE_AUDIT_DEFAULT_EDGE_LIMIT,
|
|
14340
|
+
SITE_AUDIT_MAX_EDGE_LIMIT,
|
|
14148
14341
|
siteAuditRunRequestSchema,
|
|
14342
|
+
normalizeSiteAuditRunRequest,
|
|
14343
|
+
siteAuditRequestIdentity,
|
|
14149
14344
|
siteAuditRunResponseSchema,
|
|
14150
14345
|
schedulableRunKindSchema,
|
|
14151
14346
|
SchedulableRunKinds,
|