@canonry/canonry 7.0.0 → 7.1.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.
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +3 -1
- package/assets/assets/AuditHistoryPanel-CZWzgyrD.js +1 -0
- package/assets/assets/{BacklinksPage-HIM0fmV7.js → BacklinksPage-D23A-ahd.js} +1 -1
- package/assets/assets/{HistoryPage-BjEVp-fk.js → HistoryPage-BKGVxmNz.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-BnVDR2y_.js → MeasurementPropertyPage-BSxn6_RB.js} +1 -1
- package/assets/assets/ProjectPage-D9W8G_1m.js +8 -0
- package/assets/assets/{RunsPage-fJQe2qJc.js → RunsPage-CeBBjLSE.js} +1 -1
- package/assets/assets/{SettingsPage-1yam5tl6.js → SettingsPage-Jp5Yp4cz.js} +1 -1
- package/assets/assets/SiteHealthSection-DzVegBeN.js +4 -0
- package/assets/assets/{TrafficPage-BdNEscz8.js → TrafficPage-B66AYwWk.js} +2 -2
- package/assets/assets/{TrafficSourceDetailPage-CMEgr4Aw.js → TrafficSourceDetailPage-CXtq1yES.js} +1 -1
- package/assets/assets/{extract-error-message-D2dhaJaW.js → extract-error-message-BVa0lOze.js} +1 -1
- package/assets/assets/{index-CgT2Btdn.css → index-CMe_-fAB.css} +1 -1
- package/assets/assets/index-DuhS0WLM.js +86 -0
- package/assets/assets/{react-sigma_core.esm.min-oP23IWpt.js → react-sigma_core.esm.min-60drsJa6.js} +1 -1
- package/assets/assets/{v2-overview-adapter-DYatWs7N.js → v2-overview-adapter-CLUi2Lkv.js} +1 -1
- package/assets/index.html +2 -2
- package/dist/{chunk-A5PALGQD.js → chunk-22R5E5CY.js} +94 -190
- package/dist/{chunk-TUHQ5BBQ.js → chunk-2OQ6D26U.js} +2 -5
- package/dist/{chunk-LXWY4NKP.js → chunk-IAMECH2N.js} +3 -3
- package/dist/{chunk-HQJ25LI7.js → chunk-MTSFSXCG.js} +2 -2
- package/dist/{chunk-RRIZ5AKI.js → chunk-U2S5ABOR.js} +2 -2
- package/dist/{chunk-EZ54X4XH.js → chunk-VDX3LYKL.js} +110 -78
- package/dist/{chunk-OOUDIVIU.js → chunk-YGHPT5B2.js} +434 -182
- package/dist/cli.js +8 -8
- package/dist/{demo-server-LHHDVXQW.js → demo-server-TIMYQLXS.js} +4 -4
- package/dist/index.js +6 -6
- package/dist/{intelligence-service-ZVKZLLKL.js → intelligence-service-YCMRTVCI.js} +2 -2
- package/dist/mcp.js +4 -4
- package/package.json +10 -10
- package/assets/assets/AuditHistoryPanel-DBYsgVsn.js +0 -1
- package/assets/assets/ProjectPage-BhCM47KA.js +0 -8
- package/assets/assets/SiteHealthSection-DysU2M6C.js +0 -4
- package/assets/assets/index-D9ODLKpH.js +0 -86
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
siteCrawlGraphNodes,
|
|
6
6
|
siteCrawlPages,
|
|
7
7
|
siteCrawlSnapshots
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VDX3LYKL.js";
|
|
9
9
|
import {
|
|
10
10
|
SITE_CRAWL_GRAPH_MAX_EDGES,
|
|
11
11
|
SITE_CRAWL_GRAPH_MAX_NODES,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
TEMPLATE_LINK_RATIO_THRESHOLD,
|
|
14
14
|
factorStatusFromScore,
|
|
15
15
|
roundPreservingTotal
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-YGHPT5B2.js";
|
|
17
17
|
|
|
18
18
|
// src/site-audit-factors.ts
|
|
19
19
|
function recordedSharePct(factor) {
|
|
@@ -726,6 +726,7 @@ import {
|
|
|
726
726
|
stripCitationChips,
|
|
727
727
|
sumInfraHits,
|
|
728
728
|
summarizeCheckResults,
|
|
729
|
+
summarizeObservedQueryCounts,
|
|
729
730
|
summarizeRunUsage,
|
|
730
731
|
surfaceClassFromCompetitorType,
|
|
731
732
|
surfaceClassLabel,
|
|
@@ -750,6 +751,7 @@ import {
|
|
|
750
751
|
trafficSourceListResponseSchema,
|
|
751
752
|
trafficStatusResponseSchema,
|
|
752
753
|
trafficSyncResponseSchema,
|
|
754
|
+
uiTelemetryEventSchema,
|
|
753
755
|
unsupportedKind,
|
|
754
756
|
upgradeCaveatFor,
|
|
755
757
|
userDtoSchema,
|
|
@@ -777,7 +779,7 @@ import {
|
|
|
777
779
|
wordpressSchemaDeployResultDtoSchema,
|
|
778
780
|
wordpressSchemaStatusResultDtoSchema,
|
|
779
781
|
wordpressStatusDtoSchema
|
|
780
|
-
} from "./chunk-
|
|
782
|
+
} from "./chunk-YGHPT5B2.js";
|
|
781
783
|
|
|
782
784
|
// src/intelligence-service.ts
|
|
783
785
|
import { eq as eq82, desc as desc36, asc as asc15, and as and69, ne as ne14, or as or19, inArray as inArray31, gte as gte22, lte as lte20, isNull as isNull16, sql as sql31, exists } from "drizzle-orm";
|
|
@@ -19061,7 +19063,7 @@ function evaluateRunFill(db, run, input = {}) {
|
|
|
19061
19063
|
"The measurement plan was republished since this run, so answers added now would mix two revisions in one run."
|
|
19062
19064
|
);
|
|
19063
19065
|
}
|
|
19064
|
-
const now =
|
|
19066
|
+
const now = Date.now();
|
|
19065
19067
|
const age = runFillAgeAnchor(run, { hadProviderBatch: runHadProviderBatch(db, run.id) });
|
|
19066
19068
|
const anchoredAt = Date.parse(age.anchor);
|
|
19067
19069
|
if (Number.isFinite(anchoredAt) && now - anchoredAt > RUN_FILL_MAX_AGE_MS) {
|
|
@@ -19195,7 +19197,7 @@ function queueRunFill(db, runId, input = {}) {
|
|
|
19195
19197
|
if (activeFill) return { kind: "fill-in-progress", fillId: activeFill.id };
|
|
19196
19198
|
const activeSweep = activeSweepFor(txDb, run.projectId);
|
|
19197
19199
|
if (activeSweep) return { kind: "run-in-progress", activeRunId: activeSweep.id };
|
|
19198
|
-
const now = (
|
|
19200
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
19199
19201
|
const id = crypto14.randomUUID();
|
|
19200
19202
|
txDb.insert(runFills).values({
|
|
19201
19203
|
id,
|
|
@@ -19777,61 +19779,66 @@ function loadRunDetail(app, run) {
|
|
|
19777
19779
|
rawResponse: querySnapshots.rawResponse,
|
|
19778
19780
|
createdAt: querySnapshots.createdAt
|
|
19779
19781
|
}).from(querySnapshots).leftJoin(queries, eq24(querySnapshots.queryId, queries.id)).where(eq24(querySnapshots.runId, run.id)).all();
|
|
19782
|
+
const mappedSnapshots = snapshots.map((s) => {
|
|
19783
|
+
const rawParsed = parseSnapshotRawResponse(s.rawResponse);
|
|
19784
|
+
const signalGroundingSources = rawParsed.groundingSources.filter(
|
|
19785
|
+
(source) => typeof source === "object" && source !== null && typeof source.uri === "string"
|
|
19786
|
+
);
|
|
19787
|
+
const competitiveSignals = competitiveSignalResolver.resolve({
|
|
19788
|
+
citedDomains: s.citedDomains,
|
|
19789
|
+
groundingSources: signalGroundingSources,
|
|
19790
|
+
answerText: s.answerText
|
|
19791
|
+
});
|
|
19792
|
+
const answerMentioned = project ? resolveSnapshotAnswerMentioned(s, project) : s.answerMentioned ?? false;
|
|
19793
|
+
return {
|
|
19794
|
+
id: s.id,
|
|
19795
|
+
runId: s.runId,
|
|
19796
|
+
queryId: s.queryId,
|
|
19797
|
+
query: s.query,
|
|
19798
|
+
provider: s.provider,
|
|
19799
|
+
citationState: s.citationState,
|
|
19800
|
+
answerMentioned,
|
|
19801
|
+
// Legacy alias of `mentionState`, retained for backwards compatibility.
|
|
19802
|
+
visibilityState: project ? resolveSnapshotVisibilityState(s, project) : answerMentioned ? "visible" : "not-visible",
|
|
19803
|
+
// Canonical vocabulary for answer-text presence; new consumers prefer this.
|
|
19804
|
+
mentionState: project ? resolveSnapshotMentionState(s, project) : answerMentioned ? "mentioned" : "not-mentioned",
|
|
19805
|
+
answerText: s.answerText,
|
|
19806
|
+
citedDomains: s.citedDomains,
|
|
19807
|
+
citedUrls: s.citedUrls,
|
|
19808
|
+
captureStatus: s.captureStatus,
|
|
19809
|
+
sourceCount: s.sourceCount,
|
|
19810
|
+
resolvedCount: s.resolvedCount,
|
|
19811
|
+
captureVersion: s.captureVersion,
|
|
19812
|
+
...competitiveSignals,
|
|
19813
|
+
// Legacy mixed signal retained for backwards compatibility.
|
|
19814
|
+
competitorOverlap: s.competitorOverlap,
|
|
19815
|
+
recommendedCompetitors: s.recommendedCompetitors,
|
|
19816
|
+
matchedTerms: project ? resolveSnapshotMatchedTerms(s, project) : [],
|
|
19817
|
+
model: s.model ?? rawParsed.model,
|
|
19818
|
+
// Column only. `model` may fall back to the stored envelope because both
|
|
19819
|
+
// record the same requested value; a served id has no such equivalent —
|
|
19820
|
+
// an unrecoverable one stays null rather than echoing configuration.
|
|
19821
|
+
servedModel: s.servedModel,
|
|
19822
|
+
location: s.location,
|
|
19823
|
+
requestedContext: s.requestedContext,
|
|
19824
|
+
supportedContext: s.supportedContext,
|
|
19825
|
+
dispatchMode: s.dispatchMode,
|
|
19826
|
+
stopReason: s.stopReason,
|
|
19827
|
+
usage: s.usage,
|
|
19828
|
+
groundingSources: rawParsed.groundingSources,
|
|
19829
|
+
searchQueries: rawParsed.searchQueries,
|
|
19830
|
+
createdAt: s.createdAt
|
|
19831
|
+
};
|
|
19832
|
+
});
|
|
19833
|
+
const identifiedSignals = mappedSnapshots.flatMap(
|
|
19834
|
+
(snapshot) => typeof snapshot.queryId === "string" && snapshot.queryId.length > 0 ? [{ queryId: snapshot.queryId, citationState: snapshot.citationState, answerMentioned: snapshot.answerMentioned }] : []
|
|
19835
|
+
);
|
|
19780
19836
|
return {
|
|
19781
19837
|
...formatRun(run),
|
|
19782
19838
|
providerBatches: readRunProviderBatches(app.db, run.id),
|
|
19783
19839
|
usage: summarizeRunUsage(snapshots),
|
|
19784
|
-
snapshots:
|
|
19785
|
-
|
|
19786
|
-
const signalGroundingSources = rawParsed.groundingSources.filter(
|
|
19787
|
-
(source) => typeof source === "object" && source !== null && typeof source.uri === "string"
|
|
19788
|
-
);
|
|
19789
|
-
const competitiveSignals = competitiveSignalResolver.resolve({
|
|
19790
|
-
citedDomains: s.citedDomains,
|
|
19791
|
-
groundingSources: signalGroundingSources,
|
|
19792
|
-
answerText: s.answerText
|
|
19793
|
-
});
|
|
19794
|
-
const answerMentioned = project ? resolveSnapshotAnswerMentioned(s, project) : s.answerMentioned ?? false;
|
|
19795
|
-
return {
|
|
19796
|
-
id: s.id,
|
|
19797
|
-
runId: s.runId,
|
|
19798
|
-
queryId: s.queryId,
|
|
19799
|
-
query: s.query,
|
|
19800
|
-
provider: s.provider,
|
|
19801
|
-
citationState: s.citationState,
|
|
19802
|
-
answerMentioned,
|
|
19803
|
-
// Legacy alias of `mentionState`, retained for backwards compatibility.
|
|
19804
|
-
visibilityState: project ? resolveSnapshotVisibilityState(s, project) : answerMentioned ? "visible" : "not-visible",
|
|
19805
|
-
// Canonical vocabulary for answer-text presence; new consumers prefer this.
|
|
19806
|
-
mentionState: project ? resolveSnapshotMentionState(s, project) : answerMentioned ? "mentioned" : "not-mentioned",
|
|
19807
|
-
answerText: s.answerText,
|
|
19808
|
-
citedDomains: s.citedDomains,
|
|
19809
|
-
citedUrls: s.citedUrls,
|
|
19810
|
-
captureStatus: s.captureStatus,
|
|
19811
|
-
sourceCount: s.sourceCount,
|
|
19812
|
-
resolvedCount: s.resolvedCount,
|
|
19813
|
-
captureVersion: s.captureVersion,
|
|
19814
|
-
...competitiveSignals,
|
|
19815
|
-
// Legacy mixed signal retained for backwards compatibility.
|
|
19816
|
-
competitorOverlap: s.competitorOverlap,
|
|
19817
|
-
recommendedCompetitors: s.recommendedCompetitors,
|
|
19818
|
-
matchedTerms: project ? resolveSnapshotMatchedTerms(s, project) : [],
|
|
19819
|
-
model: s.model ?? rawParsed.model,
|
|
19820
|
-
// Column only. `model` may fall back to the stored envelope because both
|
|
19821
|
-
// record the same requested value; a served id has no such equivalent —
|
|
19822
|
-
// an unrecoverable one stays null rather than echoing configuration.
|
|
19823
|
-
servedModel: s.servedModel,
|
|
19824
|
-
location: s.location,
|
|
19825
|
-
requestedContext: s.requestedContext,
|
|
19826
|
-
supportedContext: s.supportedContext,
|
|
19827
|
-
dispatchMode: s.dispatchMode,
|
|
19828
|
-
stopReason: s.stopReason,
|
|
19829
|
-
usage: s.usage,
|
|
19830
|
-
groundingSources: rawParsed.groundingSources,
|
|
19831
|
-
searchQueries: rawParsed.searchQueries,
|
|
19832
|
-
createdAt: s.createdAt
|
|
19833
|
-
};
|
|
19834
|
-
})
|
|
19840
|
+
snapshots: mappedSnapshots,
|
|
19841
|
+
queryCounts: identifiedSignals.length === mappedSnapshots.length ? summarizeObservedQueryCounts(identifiedSignals) : null
|
|
19835
19842
|
};
|
|
19836
19843
|
}
|
|
19837
19844
|
|
|
@@ -34050,6 +34057,11 @@ function readEarliestGscDataDate(db, projectId) {
|
|
|
34050
34057
|
const dimensioned = db.select({ earliest: min(gscSearchData.date) }).from(gscSearchData).where(eq44(gscSearchData.projectId, projectId)).get()?.earliest ?? null;
|
|
34051
34058
|
return [property, dimensioned].filter((d) => d !== null).reduce((earliest, d) => earliest === null || d < earliest ? d : earliest, null);
|
|
34052
34059
|
}
|
|
34060
|
+
function readEarliestGscQueryDataDate(db, projectId) {
|
|
34061
|
+
const accurate = db.select({ earliest: min(gscQueryDailyTotals.date) }).from(gscQueryDailyTotals).where(and39(eq44(gscQueryDailyTotals.projectId, projectId), sql17`${gscQueryDailyTotals.date} <> ''`)).get()?.earliest ?? null;
|
|
34062
|
+
const dimensioned = db.select({ earliest: min(gscSearchData.date) }).from(gscSearchData).where(and39(eq44(gscSearchData.projectId, projectId), sql17`${gscSearchData.date} <> ''`)).get()?.earliest ?? null;
|
|
34063
|
+
return [accurate, dimensioned].filter((d) => d !== null).reduce((earliest, d) => earliest === null || d < earliest ? d : earliest, null);
|
|
34064
|
+
}
|
|
34053
34065
|
function readGscDailyTotals(db, projectId, startDate, endDate) {
|
|
34054
34066
|
const rows = db.select({
|
|
34055
34067
|
date: gscDailyTotals.date,
|
|
@@ -34588,34 +34600,17 @@ function summarizeFromSnapshots(snapshots) {
|
|
|
34588
34600
|
providers: []
|
|
34589
34601
|
};
|
|
34590
34602
|
if (snapshots.length === 0) return empty;
|
|
34591
|
-
const
|
|
34592
|
-
const perQueryMentioned = /* @__PURE__ */ new Map();
|
|
34603
|
+
const { totalQueries, citedQueries, mentionedQueries } = summarizeObservedQueryCounts(snapshots);
|
|
34593
34604
|
const perProvider = /* @__PURE__ */ new Map();
|
|
34594
34605
|
for (const snap of snapshots) {
|
|
34595
34606
|
const cited = snap.citationState === CitationStates.cited;
|
|
34596
|
-
if (!perQuery.has(snap.queryId) || cited) {
|
|
34597
|
-
perQuery.set(snap.queryId, cited);
|
|
34598
|
-
}
|
|
34599
|
-
const mentioned = snap.answerMentioned === true;
|
|
34600
|
-
if (!perQueryMentioned.has(snap.queryId) || mentioned) {
|
|
34601
|
-
perQueryMentioned.set(snap.queryId, mentioned);
|
|
34602
|
-
}
|
|
34603
34607
|
const bucket = perProvider.get(snap.provider) ?? { cited: 0, total: 0 };
|
|
34604
34608
|
bucket.total += 1;
|
|
34605
34609
|
if (cited) bucket.cited += 1;
|
|
34606
34610
|
perProvider.set(snap.provider, bucket);
|
|
34607
34611
|
}
|
|
34608
|
-
const totalQueries = perQuery.size;
|
|
34609
|
-
let citedQueries = 0;
|
|
34610
|
-
for (const wasCited of perQuery.values()) {
|
|
34611
|
-
if (wasCited) citedQueries += 1;
|
|
34612
|
-
}
|
|
34613
34612
|
const notCitedQueries = totalQueries - citedQueries;
|
|
34614
34613
|
const citedRate = totalQueries === 0 ? 0 : Number((citedQueries / totalQueries).toFixed(4));
|
|
34615
|
-
let mentionedQueries = 0;
|
|
34616
|
-
for (const wasMentioned of perQueryMentioned.values()) {
|
|
34617
|
-
if (wasMentioned) mentionedQueries += 1;
|
|
34618
|
-
}
|
|
34619
34614
|
const notMentionedQueries = totalQueries - mentionedQueries;
|
|
34620
34615
|
const mentionRate3 = totalQueries === 0 ? 0 : Number((mentionedQueries / totalQueries).toFixed(4));
|
|
34621
34616
|
const providers = [...perProvider.entries()].map(([provider, { cited, total }]) => ({
|
|
@@ -36011,6 +36006,7 @@ var SCHEMA_TABLE = {
|
|
|
36011
36006
|
MeasurementSetupResponse: measurementSetupResponseSchema,
|
|
36012
36007
|
NotificationDto: notificationDtoSchema,
|
|
36013
36008
|
OnboardingTelemetryEvent: onboardingTelemetryEventSchema,
|
|
36009
|
+
UiTelemetryEvent: uiTelemetryEventSchema,
|
|
36014
36010
|
OrganicEvidenceDto: organicEvidenceDtoSchema,
|
|
36015
36011
|
ProjectCreateRequest: projectCreateRequestSchema,
|
|
36016
36012
|
ProjectDto: projectDtoSchema,
|
|
@@ -38386,6 +38382,7 @@ var routeCatalog = [
|
|
|
38386
38382
|
method: "get",
|
|
38387
38383
|
path: "/api/v1/runs/{id}",
|
|
38388
38384
|
summary: "Get a run and its snapshots",
|
|
38385
|
+
description: "Includes independent citation and mention counts over distinct observed query IDs in this exact run. queryCounts is null when any snapshot lacks query identity; these counts are not planned-slot completeness.",
|
|
38389
38386
|
tags: ["runs"],
|
|
38390
38387
|
parameters: [runIdParameter],
|
|
38391
38388
|
responses: {
|
|
@@ -39175,6 +39172,25 @@ var routeCatalog = [
|
|
|
39175
39172
|
400: errorResponse("Invalid onboarding telemetry event.")
|
|
39176
39173
|
}
|
|
39177
39174
|
},
|
|
39175
|
+
{
|
|
39176
|
+
method: "post",
|
|
39177
|
+
path: "/api/v1/telemetry/ui",
|
|
39178
|
+
summary: "Record a privacy-safe dashboard usage event",
|
|
39179
|
+
description: "Page views (route patterns), allowlisted feature actions, UI errors (class names and route templates only), and web vitals ratings from the dashboard. Forwarded through the opt-in anonymous telemetry path; accepted:false when this host does not collect telemetry.",
|
|
39180
|
+
tags: ["telemetry"],
|
|
39181
|
+
requestBody: {
|
|
39182
|
+
required: true,
|
|
39183
|
+
content: {
|
|
39184
|
+
"application/json": {
|
|
39185
|
+
schema: { $ref: "#/components/schemas/UiTelemetryEvent" }
|
|
39186
|
+
}
|
|
39187
|
+
}
|
|
39188
|
+
},
|
|
39189
|
+
responses: {
|
|
39190
|
+
202: jsonResponse("UI event accepted.", "TelemetryEventAcceptedDto"),
|
|
39191
|
+
400: errorResponse("Invalid UI telemetry event.")
|
|
39192
|
+
}
|
|
39193
|
+
},
|
|
39178
39194
|
{
|
|
39179
39195
|
method: "post",
|
|
39180
39196
|
path: "/api/v1/feedback",
|
|
@@ -39918,7 +39934,7 @@ var routeCatalog = [
|
|
|
39918
39934
|
method: "get",
|
|
39919
39935
|
path: "/api/v1/projects/{name}/google/gsc/query-totals",
|
|
39920
39936
|
summary: "Get GSC totals per query for a date window",
|
|
39921
|
-
description: "One row per search query over the window, read from stored sync data (no call to Google, no writes): clicks, impressions, CTR, impression-weighted average position (sum(position*impressions)/sum(impressions)) and the number of days the query appeared. Rows are ordered by clicks desc, impressions desc, then query ascending by code point, and paged with `limit` / `offset`; `totalMatching` counts every query and `truncated` says more rows follow. The rows cover the queries Google names only: Google leaves rare and anonymised queries out of per-query data, so their sum is below the property total (read `/google/gsc/performance/daily` for that). Each row carries `source`: `google` when every day came from Google's per-query fetch, `page-summed` when every day came from the legacy page-dimensioned table (impressions over-count), `mixed` when the window spans both.",
|
|
39937
|
+
description: "One row per search query over the window, read from stored sync data (no call to Google, no writes): clicks, impressions, CTR, impression-weighted average position (sum(position*impressions)/sum(impressions)) and the number of days the query appeared. Rows are ordered by clicks desc, impressions desc, then query ascending by code point, and paged with `limit` / `offset`; `totalMatching` counts every query and `truncated` says more rows follow. The rows cover the queries Google names only: Google leaves rare and anonymised queries out of per-query data, so their sum is below the property total (read `/google/gsc/performance/daily` for that). Each row carries `source`: `google` when every day came from Google's per-query fetch, `page-summed` when every day came from the legacy page-dimensioned table (impressions over-count), `mixed` when the window spans both. `window.earliestDataDate` is the first stored per-query date (null with none): a window that starts before it is only partly covered, so its missing days were never synced rather than zero traffic.",
|
|
39922
39938
|
tags: ["google"],
|
|
39923
39939
|
parameters: [
|
|
39924
39940
|
nameParameter,
|
|
@@ -43927,6 +43943,19 @@ async function telemetryRoutes(app, opts) {
|
|
|
43927
43943
|
opts.recordOnboardingEvent?.(normalizeOnboardingEventForCollection(parsed.data));
|
|
43928
43944
|
return reply.status(202).send({ accepted: Boolean(opts.recordOnboardingEvent) });
|
|
43929
43945
|
});
|
|
43946
|
+
app.post("/telemetry/ui", async (request, reply) => {
|
|
43947
|
+
const parsed = uiTelemetryEventSchema.safeParse(request.body);
|
|
43948
|
+
if (!parsed.success) {
|
|
43949
|
+
throw validationError("Invalid UI telemetry event", {
|
|
43950
|
+
issues: parsed.error.issues.map((issue) => ({
|
|
43951
|
+
code: issue.code,
|
|
43952
|
+
path: issue.path.join(".")
|
|
43953
|
+
}))
|
|
43954
|
+
});
|
|
43955
|
+
}
|
|
43956
|
+
const accepted = opts.recordUiEvent ? opts.recordUiEvent(parsed.data) : false;
|
|
43957
|
+
return reply.status(202).send({ accepted });
|
|
43958
|
+
});
|
|
43930
43959
|
}
|
|
43931
43960
|
|
|
43932
43961
|
// ../api-routes/src/feedback.ts
|
|
@@ -47362,7 +47391,9 @@ async function googleRoutes(app, opts) {
|
|
|
47362
47391
|
// Measured from where this page ends, so a page past the end is not
|
|
47363
47392
|
// reported as truncated.
|
|
47364
47393
|
truncated: offsetVal + rows.length < totalMatching,
|
|
47365
|
-
window
|
|
47394
|
+
// The floor beside the frontier, so a caller can tell a window the store
|
|
47395
|
+
// does not reach from one with little traffic.
|
|
47396
|
+
window: { ...window, earliestDataDate: readEarliestGscQueryDataDate(app.db, project.id) }
|
|
47366
47397
|
};
|
|
47367
47398
|
});
|
|
47368
47399
|
app.post("/projects/:name/google/gsc/inspect", async (request) => {
|
|
@@ -59044,7 +59075,7 @@ async function installDuckdb(opts = {}) {
|
|
|
59044
59075
|
const version = readInstalledVersion({ pluginPkgJson }) ?? "unknown";
|
|
59045
59076
|
return { alreadyPresent: false, version, path: pluginDir };
|
|
59046
59077
|
}
|
|
59047
|
-
async function ensurePluginDir(pluginDir
|
|
59078
|
+
async function ensurePluginDir(pluginDir, pluginPkgJson) {
|
|
59048
59079
|
await fs4.mkdir(pluginDir, { recursive: true });
|
|
59049
59080
|
try {
|
|
59050
59081
|
await fs4.access(pluginPkgJson);
|
|
@@ -75230,7 +75261,6 @@ async function resolveRetainedStart(options, unservableStartMs, endMs) {
|
|
|
75230
75261
|
async function drainVercelTrafficEvents(options) {
|
|
75231
75262
|
const startMs = toMs(options.startDate);
|
|
75232
75263
|
const endMs = toMs(options.endDate);
|
|
75233
|
-
const now = options.now ?? (() => Date.now());
|
|
75234
75264
|
const events = [];
|
|
75235
75265
|
const seenEventIds = /* @__PURE__ */ new Set();
|
|
75236
75266
|
if (endMs <= startMs) {
|
|
@@ -75249,7 +75279,7 @@ async function drainVercelTrafficEvents(options) {
|
|
|
75249
75279
|
const truncatedSliceStartsMs = [];
|
|
75250
75280
|
const deadlineSkippedSliceStartsMs = [];
|
|
75251
75281
|
while (cursorMs < endMs) {
|
|
75252
|
-
if (options.deadlineMs !== void 0 && now() >= options.deadlineMs) {
|
|
75282
|
+
if (options.deadlineMs !== void 0 && Date.now() >= options.deadlineMs) {
|
|
75253
75283
|
deadlineReached = true;
|
|
75254
75284
|
if (cursorMs === effectiveStartMs && subWindowCount > 0 && cursorMs < endMs) {
|
|
75255
75285
|
deadlineSkippedSliceStartsMs.push(cursorMs);
|
|
@@ -86928,7 +86958,8 @@ async function apiRoutes(app, opts) {
|
|
|
86928
86958
|
await api.register(telemetryRoutes, {
|
|
86929
86959
|
getTelemetryStatus: opts.getTelemetryStatus,
|
|
86930
86960
|
setTelemetryEnabled: opts.setTelemetryEnabled,
|
|
86931
|
-
recordOnboardingEvent: opts.recordOnboardingEvent
|
|
86961
|
+
recordOnboardingEvent: opts.recordOnboardingEvent,
|
|
86962
|
+
recordUiEvent: opts.recordUiEvent
|
|
86932
86963
|
});
|
|
86933
86964
|
await api.register(feedbackRoutes, {
|
|
86934
86965
|
submitFeedback: opts.submitFeedback
|
|
@@ -88520,6 +88551,7 @@ export {
|
|
|
88520
88551
|
createCredentialChecker,
|
|
88521
88552
|
requireInstanceAdministrator,
|
|
88522
88553
|
hashApiKey,
|
|
88554
|
+
notProbeRun,
|
|
88523
88555
|
registerAgentConversationRoutes,
|
|
88524
88556
|
measurementSlotKey,
|
|
88525
88557
|
measurementRunSlotState,
|