@canonry/canonry 4.157.0 → 4.158.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/assets/{AuditHistoryPanel-D12lHs6n.js → AuditHistoryPanel-McQfjoU9.js} +1 -1
- package/assets/assets/{BacklinksPage-D2ScFYru.js → BacklinksPage-Da8y1Wv8.js} +1 -1
- package/assets/assets/{HistoryPage-jZ_I4rwX.js → HistoryPage-9MJfhRyT.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-BIdQjXJT.js → MeasurementPropertyPage-BiNAHEJW.js} +1 -1
- package/assets/assets/ProjectPage-mWSMjXrR.js +15 -0
- package/assets/assets/{RunRow-Q2X0NR74.js → RunRow-DCG2LBlS.js} +1 -1
- package/assets/assets/{RunsPage-Cw7YVsbJ.js → RunsPage-ByWA_FSk.js} +1 -1
- package/assets/assets/{SettingsPage-bFl2EXOD.js → SettingsPage-DdSeKAKF.js} +1 -1
- package/assets/assets/{TrafficPage-DJjhk7Jw.js → TrafficPage-5u8rPcBt.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-CGKwIu9A.js → TrafficSourceDetailPage-Dm-fK87u.js} +1 -1
- package/assets/assets/{extract-error-message-BHm98tXH.js → extract-error-message-CtxkAd6E.js} +1 -1
- package/assets/assets/{index-VO6nKq5b.js → index-DUfg50Pl.js} +25 -25
- package/assets/assets/index-cXb3mfeQ.css +1 -0
- package/assets/assets/{react-sigma_core.esm.min-EzswMBkr.js → react-sigma_core.esm.min-ComIyDKi.js} +1 -1
- package/assets/index.html +2 -2
- package/dist/{chunk-AEIKAWOW.js → chunk-4VZP64GZ.js} +189 -11
- package/dist/{chunk-TRRVBTU5.js → chunk-DEVAEC2S.js} +50 -1
- package/dist/{chunk-KMTRO56O.js → chunk-LK6YFHG4.js} +1 -1
- package/dist/{chunk-MEBL4EJO.js → chunk-YP4K2KXH.js} +114 -21
- package/dist/cli.js +4 -4
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-YUUPSJRC.js → intelligence-service-LQ6ZRWMF.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +11 -10
- package/assets/assets/ProjectPage-CLvLOOtj.js +0 -15
- package/assets/assets/index-BxegEwic.css +0 -1
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
loadConfig,
|
|
11
11
|
loadConfigRaw,
|
|
12
12
|
saveConfigPatch
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-LK6YFHG4.js";
|
|
14
14
|
import {
|
|
15
15
|
CC_CACHE_DIR,
|
|
16
16
|
DUCKDB_SPEC,
|
|
@@ -136,7 +136,7 @@ import {
|
|
|
136
136
|
siteCrawlSnapshots,
|
|
137
137
|
toAlertView,
|
|
138
138
|
usageCounters
|
|
139
|
-
} from "./chunk-
|
|
139
|
+
} from "./chunk-YP4K2KXH.js";
|
|
140
140
|
import {
|
|
141
141
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
142
142
|
AGENT_PROVIDER_IDS,
|
|
@@ -236,7 +236,7 @@ import {
|
|
|
236
236
|
validationError,
|
|
237
237
|
winnabilityClassLabel,
|
|
238
238
|
withRetry
|
|
239
|
-
} from "./chunk-
|
|
239
|
+
} from "./chunk-DEVAEC2S.js";
|
|
240
240
|
|
|
241
241
|
// src/telemetry.ts
|
|
242
242
|
import crypto from "crypto";
|
|
@@ -7004,7 +7004,6 @@ import { createRequire as createRequire3 } from "module";
|
|
|
7004
7004
|
import { Worker } from "worker_threads";
|
|
7005
7005
|
import { and as and10, asc, count, desc as desc6, eq as eq13, isNull, ne as ne2, or, sql as sql5 } from "drizzle-orm";
|
|
7006
7006
|
import { alias } from "drizzle-orm/sqlite-core";
|
|
7007
|
-
var SITE_CRAWL_GRAPH_LAYOUT_VERSION = "site-health-fa2-v1";
|
|
7008
7007
|
var SITE_CRAWL_GRAPH_LAYOUT_TIMEOUT_MS = 15e3;
|
|
7009
7008
|
var SITE_CRAWL_GRAPH_SEED_SCALE = 100;
|
|
7010
7009
|
var graphSourcePage = alias(siteCrawlPages, "layout_graph_source_page");
|
|
@@ -7014,20 +7013,81 @@ var FORCE_ATLAS_SETTINGS = Object.freeze({
|
|
|
7014
7013
|
barnesHutOptimize: true,
|
|
7015
7014
|
barnesHutTheta: 0.5,
|
|
7016
7015
|
edgeWeightInfluence: 0.5,
|
|
7017
|
-
gravity:
|
|
7018
|
-
linLogMode:
|
|
7019
|
-
outboundAttractionDistribution:
|
|
7020
|
-
scalingRatio:
|
|
7016
|
+
gravity: 0.2,
|
|
7017
|
+
linLogMode: true,
|
|
7018
|
+
outboundAttractionDistribution: true,
|
|
7019
|
+
scalingRatio: 2,
|
|
7021
7020
|
slowDown: 10,
|
|
7022
7021
|
strongGravityMode: false
|
|
7023
7022
|
});
|
|
7023
|
+
var RENDER_MAX_NODE_SIZE = 14;
|
|
7024
|
+
var RENDER_HALF_EXTENT_PX = 420;
|
|
7025
|
+
var NODE_SIZE_EXTENT_FRACTION = RENDER_MAX_NODE_SIZE / RENDER_HALF_EXTENT_PX;
|
|
7026
|
+
var NOVERLAP_SETTINGS = Object.freeze({
|
|
7027
|
+
/** Half a node of clear space between two touching nodes. */
|
|
7028
|
+
marginFactor: 0.5,
|
|
7029
|
+
expansion: 1.1,
|
|
7030
|
+
ratio: 1,
|
|
7031
|
+
speed: 3,
|
|
7032
|
+
/**
|
|
7033
|
+
* Node discs may claim at most this share of the graph's bounding box. At
|
|
7034
|
+
* the 20k cap the extent-derived size asks for spacing the graph physically
|
|
7035
|
+
* does not have, and noverlap either runs for minutes or overflows its
|
|
7036
|
+
* collision set. This bound keeps the pass solvable at every graph size,
|
|
7037
|
+
* and it only binds on graphs far too dense to read node-by-node anyway.
|
|
7038
|
+
*/
|
|
7039
|
+
maxPackingFraction: 0.15,
|
|
7040
|
+
/** Cells hold a handful of nodes each, which is what keeps the pass linear. */
|
|
7041
|
+
gridSizeMin: 10,
|
|
7042
|
+
gridSizeMax: 200,
|
|
7043
|
+
iterationLadder: [
|
|
7044
|
+
{ maxNodes: 1e3, iterations: 120 },
|
|
7045
|
+
{ maxNodes: 5e3, iterations: 60 }
|
|
7046
|
+
],
|
|
7047
|
+
iterationsFloor: 20
|
|
7048
|
+
});
|
|
7049
|
+
function noverlapGridSize(nodeCount) {
|
|
7050
|
+
return Math.max(
|
|
7051
|
+
NOVERLAP_SETTINGS.gridSizeMin,
|
|
7052
|
+
Math.min(NOVERLAP_SETTINGS.gridSizeMax, Math.ceil(Math.sqrt(Math.max(1, nodeCount))))
|
|
7053
|
+
);
|
|
7054
|
+
}
|
|
7055
|
+
function noverlapMaxIterations(nodeCount) {
|
|
7056
|
+
for (const step of NOVERLAP_SETTINGS.iterationLadder) {
|
|
7057
|
+
if (nodeCount <= step.maxNodes) return step.iterations;
|
|
7058
|
+
}
|
|
7059
|
+
return NOVERLAP_SETTINGS.iterationsFloor;
|
|
7060
|
+
}
|
|
7061
|
+
var OUTLIER_RING_INNER_FACTOR = 1.25;
|
|
7062
|
+
var OUTLIER_RING_OUTER_FACTOR = 1.75;
|
|
7063
|
+
var OUTLIER_RING_MAX_RINGS = 4;
|
|
7064
|
+
var OUTLIER_RING_TARGET_PER_RING = 16;
|
|
7065
|
+
var OUTLIER_RING_MIN_RADIUS = 1;
|
|
7066
|
+
function siteCrawlGraphLayoutSettingsFingerprint(settings) {
|
|
7067
|
+
return crypto16.createHash("sha256").update(JSON.stringify(settings)).digest("hex").slice(0, 8);
|
|
7068
|
+
}
|
|
7069
|
+
var SITE_CRAWL_GRAPH_LAYOUT_ALGORITHM = "site-health-fa2-v2";
|
|
7070
|
+
var SITE_CRAWL_GRAPH_LAYOUT_VERSION = `${SITE_CRAWL_GRAPH_LAYOUT_ALGORITHM}-${siteCrawlGraphLayoutSettingsFingerprint({
|
|
7071
|
+
forceAtlas: FORCE_ATLAS_SETTINGS,
|
|
7072
|
+
noverlap: NOVERLAP_SETTINGS,
|
|
7073
|
+
nodeSizeExtentFraction: NODE_SIZE_EXTENT_FRACTION,
|
|
7074
|
+
outlierRing: {
|
|
7075
|
+
inner: OUTLIER_RING_INNER_FACTOR,
|
|
7076
|
+
outer: OUTLIER_RING_OUTER_FACTOR,
|
|
7077
|
+
maxRings: OUTLIER_RING_MAX_RINGS,
|
|
7078
|
+
targetPerRing: OUTLIER_RING_TARGET_PER_RING,
|
|
7079
|
+
minRadius: OUTLIER_RING_MIN_RADIUS
|
|
7080
|
+
}
|
|
7081
|
+
})}`;
|
|
7024
7082
|
var WORKER_SOURCE = String.raw`
|
|
7025
7083
|
const {parentPort, workerData} = require('node:worker_threads');
|
|
7026
7084
|
try {
|
|
7027
7085
|
const graphologyModule = require(workerData.graphologyPath);
|
|
7028
7086
|
const forceAtlasModule = require(workerData.forceAtlasPath);
|
|
7087
|
+
const noverlapModule = require(workerData.noverlapPath);
|
|
7029
7088
|
const MultiDirectedGraph = graphologyModule.MultiDirectedGraph;
|
|
7030
7089
|
const forceAtlas2 = forceAtlasModule.default || forceAtlasModule;
|
|
7090
|
+
const noverlap = noverlapModule.default || noverlapModule;
|
|
7031
7091
|
const graph = new MultiDirectedGraph({allowSelfLoops: true});
|
|
7032
7092
|
for (const node of workerData.input.nodes) {
|
|
7033
7093
|
graph.addNode(node.nodeKey, {x: node.x, y: node.y});
|
|
@@ -7043,6 +7103,45 @@ try {
|
|
|
7043
7103
|
settings: workerData.settings,
|
|
7044
7104
|
});
|
|
7045
7105
|
}
|
|
7106
|
+
// Anti-overlap runs on the spatialization ForceAtlas2 just produced. Node
|
|
7107
|
+
// size is uniform and derived from the graph's own extent, so the pass is
|
|
7108
|
+
// scale invariant and stays deterministic for a fixed input.
|
|
7109
|
+
if (graph.order > 1) {
|
|
7110
|
+
let sumX = 0;
|
|
7111
|
+
let sumY = 0;
|
|
7112
|
+
graph.forEachNode(function (nodeKey, attributes) {
|
|
7113
|
+
sumX += attributes.x;
|
|
7114
|
+
sumY += attributes.y;
|
|
7115
|
+
});
|
|
7116
|
+
const centerX = sumX / graph.order;
|
|
7117
|
+
const centerY = sumY / graph.order;
|
|
7118
|
+
let extent = 0;
|
|
7119
|
+
graph.forEachNode(function (nodeKey, attributes) {
|
|
7120
|
+
extent = Math.max(extent, Math.abs(attributes.x - centerX), Math.abs(attributes.y - centerY));
|
|
7121
|
+
});
|
|
7122
|
+
if (Number.isFinite(extent) && extent > 0) {
|
|
7123
|
+
// Whichever bound is tighter: one render-sized node, or the largest disc
|
|
7124
|
+
// that still leaves the graph mostly empty space at this node count.
|
|
7125
|
+
const byExtent = extent * workerData.nodeSizeExtentFraction;
|
|
7126
|
+
const byArea = Math.sqrt(
|
|
7127
|
+
(workerData.noverlap.maxPackingFraction * Math.pow(2 * extent, 2)) / graph.order,
|
|
7128
|
+
) / 2;
|
|
7129
|
+
const nodeSize = Math.min(byExtent, byArea);
|
|
7130
|
+
graph.forEachNode(function (nodeKey) {
|
|
7131
|
+
graph.setNodeAttribute(nodeKey, 'size', nodeSize);
|
|
7132
|
+
});
|
|
7133
|
+
noverlap.assign(graph, {
|
|
7134
|
+
maxIterations: workerData.noverlap.maxIterations,
|
|
7135
|
+
settings: {
|
|
7136
|
+
gridSize: workerData.noverlap.gridSize,
|
|
7137
|
+
margin: nodeSize * workerData.noverlap.marginFactor,
|
|
7138
|
+
expansion: workerData.noverlap.expansion,
|
|
7139
|
+
ratio: workerData.noverlap.ratio,
|
|
7140
|
+
speed: workerData.noverlap.speed,
|
|
7141
|
+
},
|
|
7142
|
+
});
|
|
7143
|
+
}
|
|
7144
|
+
}
|
|
7046
7145
|
const positions = [];
|
|
7047
7146
|
graph.forEachNode((nodeKey, attributes) => {
|
|
7048
7147
|
positions.push({nodeKey, x: attributes.x, y: attributes.y});
|
|
@@ -7113,8 +7212,15 @@ async function computeForceAtlasPositions(input, options = {}) {
|
|
|
7113
7212
|
workerData: {
|
|
7114
7213
|
graphologyPath: requireFromPackage.resolve("graphology"),
|
|
7115
7214
|
forceAtlasPath: requireFromPackage.resolve("graphology-layout-forceatlas2"),
|
|
7215
|
+
noverlapPath: requireFromPackage.resolve("graphology-layout-noverlap"),
|
|
7116
7216
|
input,
|
|
7117
|
-
settings: FORCE_ATLAS_SETTINGS
|
|
7217
|
+
settings: FORCE_ATLAS_SETTINGS,
|
|
7218
|
+
noverlap: {
|
|
7219
|
+
...NOVERLAP_SETTINGS,
|
|
7220
|
+
gridSize: noverlapGridSize(input.nodes.length),
|
|
7221
|
+
maxIterations: noverlapMaxIterations(input.nodes.length)
|
|
7222
|
+
},
|
|
7223
|
+
nodeSizeExtentFraction: NODE_SIZE_EXTENT_FRACTION
|
|
7118
7224
|
}
|
|
7119
7225
|
});
|
|
7120
7226
|
const timeoutMs = options.timeoutMs ?? SITE_CRAWL_GRAPH_LAYOUT_TIMEOUT_MS;
|
|
@@ -7143,6 +7249,77 @@ async function computeForceAtlasPositions(input, options = {}) {
|
|
|
7143
7249
|
});
|
|
7144
7250
|
});
|
|
7145
7251
|
}
|
|
7252
|
+
function siteCrawlGraphComponents(nodeKeys, edges) {
|
|
7253
|
+
const parent = new Map(nodeKeys.map((key) => [key, key]));
|
|
7254
|
+
const find = (key) => {
|
|
7255
|
+
let root = key;
|
|
7256
|
+
while (parent.get(root) !== root) root = parent.get(root);
|
|
7257
|
+
let cursor = key;
|
|
7258
|
+
while (parent.get(cursor) !== root) {
|
|
7259
|
+
const next = parent.get(cursor);
|
|
7260
|
+
parent.set(cursor, root);
|
|
7261
|
+
cursor = next;
|
|
7262
|
+
}
|
|
7263
|
+
return root;
|
|
7264
|
+
};
|
|
7265
|
+
for (const edge of edges) {
|
|
7266
|
+
if (!parent.has(edge.sourceNodeKey) || !parent.has(edge.targetNodeKey)) continue;
|
|
7267
|
+
const sourceRoot = find(edge.sourceNodeKey);
|
|
7268
|
+
const targetRoot = find(edge.targetNodeKey);
|
|
7269
|
+
if (sourceRoot === targetRoot) continue;
|
|
7270
|
+
if (sourceRoot < targetRoot) parent.set(targetRoot, sourceRoot);
|
|
7271
|
+
else parent.set(sourceRoot, targetRoot);
|
|
7272
|
+
}
|
|
7273
|
+
const members = /* @__PURE__ */ new Map();
|
|
7274
|
+
for (const key of [...nodeKeys].sort()) {
|
|
7275
|
+
const root = find(key);
|
|
7276
|
+
const group = members.get(root);
|
|
7277
|
+
if (group) group.push(key);
|
|
7278
|
+
else members.set(root, [key]);
|
|
7279
|
+
}
|
|
7280
|
+
let mainRoot = null;
|
|
7281
|
+
for (const [root, group] of members) {
|
|
7282
|
+
if (mainRoot === null) {
|
|
7283
|
+
mainRoot = root;
|
|
7284
|
+
continue;
|
|
7285
|
+
}
|
|
7286
|
+
const best = members.get(mainRoot);
|
|
7287
|
+
if (group.length > best.length || group.length === best.length && root < mainRoot) mainRoot = root;
|
|
7288
|
+
}
|
|
7289
|
+
const main = new Set(mainRoot === null ? [] : members.get(mainRoot));
|
|
7290
|
+
const outliers = [...members.entries()].filter(([root]) => root !== mainRoot).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).flatMap(([, group]) => group);
|
|
7291
|
+
return { main, outliers };
|
|
7292
|
+
}
|
|
7293
|
+
function frameDisconnectedNodes(positions, edges) {
|
|
7294
|
+
const { main, outliers } = siteCrawlGraphComponents(positions.map((p) => p.nodeKey), edges);
|
|
7295
|
+
if (outliers.length === 0 || main.size === 0) return [...positions];
|
|
7296
|
+
const mainPositions = positions.filter((position) => main.has(position.nodeKey));
|
|
7297
|
+
const centerX = mainPositions.reduce((sum, p) => sum + p.x, 0) / mainPositions.length;
|
|
7298
|
+
const centerY = mainPositions.reduce((sum, p) => sum + p.y, 0) / mainPositions.length;
|
|
7299
|
+
if (!Number.isFinite(centerX) || !Number.isFinite(centerY)) return [...positions];
|
|
7300
|
+
const mainRadius = Math.max(
|
|
7301
|
+
OUTLIER_RING_MIN_RADIUS,
|
|
7302
|
+
...mainPositions.map((p) => Math.hypot(p.x - centerX, p.y - centerY)).filter(Number.isFinite)
|
|
7303
|
+
);
|
|
7304
|
+
const ringCount = Math.max(1, Math.min(
|
|
7305
|
+
OUTLIER_RING_MAX_RINGS,
|
|
7306
|
+
Math.ceil(outliers.length / OUTLIER_RING_TARGET_PER_RING)
|
|
7307
|
+
));
|
|
7308
|
+
const placed = /* @__PURE__ */ new Map();
|
|
7309
|
+
for (const [index, nodeKey] of outliers.entries()) {
|
|
7310
|
+
const ring = index % ringCount;
|
|
7311
|
+
const ringRadius = mainRadius * (ringCount === 1 ? OUTLIER_RING_INNER_FACTOR : OUTLIER_RING_INNER_FACTOR + (OUTLIER_RING_OUTER_FACTOR - OUTLIER_RING_INNER_FACTOR) * (ring / (ringCount - 1)));
|
|
7312
|
+
const slot = Math.floor(index / ringCount);
|
|
7313
|
+
const slotsOnRing = Math.ceil((outliers.length - ring) / ringCount);
|
|
7314
|
+
const angle = (slot + ring % 2 * 0.5) / Math.max(1, slotsOnRing) * Math.PI * 2;
|
|
7315
|
+
placed.set(nodeKey, {
|
|
7316
|
+
nodeKey,
|
|
7317
|
+
x: centerX + Math.cos(angle) * ringRadius,
|
|
7318
|
+
y: centerY + Math.sin(angle) * ringRadius
|
|
7319
|
+
});
|
|
7320
|
+
}
|
|
7321
|
+
return positions.map((position) => placed.get(position.nodeKey) ?? position);
|
|
7322
|
+
}
|
|
7146
7323
|
function normalizePositions(seededNodes, computed, rootNodeKey) {
|
|
7147
7324
|
const byKey = new Map(computed.map((position) => [position.nodeKey, position]));
|
|
7148
7325
|
if (byKey.size !== seededNodes.length) throw new Error("Graph layout returned an incomplete node set");
|
|
@@ -7190,6 +7367,7 @@ async function layoutSiteCrawlGraphInput(input, options = {}) {
|
|
|
7190
7367
|
iterations: adaptiveForceAtlasIterations(input.nodes.length, input.edges.length)
|
|
7191
7368
|
}, { signal: options.signal, timeoutMs: options.timeoutMs });
|
|
7192
7369
|
options.signal?.throwIfAborted();
|
|
7370
|
+
const framed = frameDisconnectedNodes(positions, input.edges);
|
|
7193
7371
|
return {
|
|
7194
7372
|
state: "ready",
|
|
7195
7373
|
layoutVersion: SITE_CRAWL_GRAPH_LAYOUT_VERSION,
|
|
@@ -7197,7 +7375,7 @@ async function layoutSiteCrawlGraphInput(input, options = {}) {
|
|
|
7197
7375
|
totalEdges: input.totalEdges,
|
|
7198
7376
|
nodeCount: input.nodes.length,
|
|
7199
7377
|
edgeCount: input.edges.length,
|
|
7200
|
-
nodes: normalizePositions(seeded,
|
|
7378
|
+
nodes: normalizePositions(seeded, framed, input.rootNodeKey),
|
|
7201
7379
|
edges: input.edges.map((edge, sampleRank) => ({ ...edge, sampleRank }))
|
|
7202
7380
|
};
|
|
7203
7381
|
} catch (error) {
|
|
@@ -8472,7 +8650,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
8472
8650
|
return result;
|
|
8473
8651
|
}
|
|
8474
8652
|
async function backfillInsightsCommand(project, opts) {
|
|
8475
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
8653
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-LQ6ZRWMF.js");
|
|
8476
8654
|
const config = loadConfig();
|
|
8477
8655
|
const db = createClient(config.database);
|
|
8478
8656
|
migrate(db);
|
|
@@ -8561,7 +8561,24 @@ var siteCrawlSummarySchema = z24.object({
|
|
|
8561
8561
|
counts: siteCrawlCountsSchema,
|
|
8562
8562
|
deadLinks: siteCrawlDeadLinksSummarySchema
|
|
8563
8563
|
});
|
|
8564
|
+
var siteCrawlTerminationSchema = z24.enum([
|
|
8565
|
+
"complete",
|
|
8566
|
+
"unknown",
|
|
8567
|
+
"max-pages",
|
|
8568
|
+
"max-edges",
|
|
8569
|
+
"max-fetches",
|
|
8570
|
+
"max-duration",
|
|
8571
|
+
"max-bytes",
|
|
8572
|
+
"max-page-bytes",
|
|
8573
|
+
"max-depth",
|
|
8574
|
+
"max-links-per-page",
|
|
8575
|
+
"max-query-variants",
|
|
8576
|
+
"max-sitemap-fanout",
|
|
8577
|
+
"max-sitemap-urls",
|
|
8578
|
+
"root-host-redirect"
|
|
8579
|
+
]);
|
|
8564
8580
|
var siteHealthStateSchema = z24.enum(["eligible", "hidden", "failed", "unchecked"]);
|
|
8581
|
+
var SiteHealthStates = siteHealthStateSchema.enum;
|
|
8565
8582
|
var SiteCrawlFetchStates = {
|
|
8566
8583
|
discovered: "discovered",
|
|
8567
8584
|
robotsBlocked: "robots-blocked",
|
|
@@ -8762,6 +8779,13 @@ var siteCrawlGraphEdgeSchema = z24.object({
|
|
|
8762
8779
|
followable: z24.boolean(),
|
|
8763
8780
|
occurrences: z24.number().int().positive()
|
|
8764
8781
|
});
|
|
8782
|
+
var siteCrawlGraphLayoutUnavailableReasonSchema = z24.enum([
|
|
8783
|
+
"no-crawl",
|
|
8784
|
+
"legacy-snapshot",
|
|
8785
|
+
"details-unavailable",
|
|
8786
|
+
"layout-failed",
|
|
8787
|
+
"empty-crawl"
|
|
8788
|
+
]);
|
|
8765
8789
|
var siteCrawlGraphLayoutSchema = z24.discriminatedUnion("state", [
|
|
8766
8790
|
z24.object({
|
|
8767
8791
|
state: z24.literal("ready"),
|
|
@@ -8771,13 +8795,20 @@ var siteCrawlGraphLayoutSchema = z24.discriminatedUnion("state", [
|
|
|
8771
8795
|
z24.object({
|
|
8772
8796
|
state: z24.literal("unavailable"),
|
|
8773
8797
|
version: z24.null(),
|
|
8774
|
-
reason:
|
|
8798
|
+
reason: siteCrawlGraphLayoutUnavailableReasonSchema
|
|
8775
8799
|
})
|
|
8776
8800
|
]);
|
|
8777
8801
|
var siteCrawlGraphResponseSchema = z24.object({
|
|
8778
8802
|
project: z24.string(),
|
|
8779
8803
|
hasCrawlData: z24.boolean(),
|
|
8780
8804
|
runId: z24.string().nullable(),
|
|
8805
|
+
/**
|
|
8806
|
+
* Server-owned identity of the crawl root, resolved from the snapshot root
|
|
8807
|
+
* URL (or the depth-0 page). Consumers must not infer the home page from a
|
|
8808
|
+
* path or a link score. It is null when the crawl persisted no page detail,
|
|
8809
|
+
* and it can name a page that graph sampling left out of `nodes`.
|
|
8810
|
+
*/
|
|
8811
|
+
rootNodeKey: z24.string().nullable(),
|
|
8781
8812
|
layout: siteCrawlGraphLayoutSchema,
|
|
8782
8813
|
/** Total canonical pages in the persisted crawl before graph sampling. */
|
|
8783
8814
|
totalNodes: z24.number().int().nonnegative(),
|
|
@@ -9020,6 +9051,20 @@ var siteAuditRunResponseSchema = z24.object({
|
|
|
9020
9051
|
runId: z24.string(),
|
|
9021
9052
|
status: runStatusSchema
|
|
9022
9053
|
});
|
|
9054
|
+
var siteHealthScanSchema = z24.object({
|
|
9055
|
+
runId: z24.string(),
|
|
9056
|
+
status: runStatusSchema,
|
|
9057
|
+
createdAt: z24.string(),
|
|
9058
|
+
startedAt: z24.string().nullable(),
|
|
9059
|
+
finishedAt: z24.string().nullable(),
|
|
9060
|
+
hasCrawlData: z24.boolean()
|
|
9061
|
+
});
|
|
9062
|
+
var siteHealthScansResponseSchema = z24.object({
|
|
9063
|
+
project: z24.string(),
|
|
9064
|
+
scans: z24.array(siteHealthScanSchema).default([])
|
|
9065
|
+
});
|
|
9066
|
+
var SITE_HEALTH_SCANS_DEFAULT_LIMIT = 20;
|
|
9067
|
+
var SITE_HEALTH_SCANS_MAX_LIMIT = 100;
|
|
9023
9068
|
|
|
9024
9069
|
// ../contracts/src/schedule.ts
|
|
9025
9070
|
import { z as z25 } from "zod";
|
|
@@ -14699,6 +14744,7 @@ export {
|
|
|
14699
14744
|
siteAuditPagesResponseSchema,
|
|
14700
14745
|
siteAuditTrendResponseSchema,
|
|
14701
14746
|
siteCrawlSummarySchema,
|
|
14747
|
+
siteHealthStateSchema,
|
|
14702
14748
|
SiteCrawlFetchedStates,
|
|
14703
14749
|
deriveSiteHealthState,
|
|
14704
14750
|
siteCrawlAuditFactorSchema,
|
|
@@ -14734,6 +14780,9 @@ export {
|
|
|
14734
14780
|
normalizeSiteAuditRunRequest,
|
|
14735
14781
|
siteAuditRequestIdentity,
|
|
14736
14782
|
siteAuditRunResponseSchema,
|
|
14783
|
+
siteHealthScansResponseSchema,
|
|
14784
|
+
SITE_HEALTH_SCANS_DEFAULT_LIMIT,
|
|
14785
|
+
SITE_HEALTH_SCANS_MAX_LIMIT,
|
|
14737
14786
|
schedulableRunKindSchema,
|
|
14738
14787
|
SchedulableRunKinds,
|
|
14739
14788
|
scheduleDtoSchema,
|