@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.
Files changed (34) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +3 -1
  2. package/assets/assets/AuditHistoryPanel-CZWzgyrD.js +1 -0
  3. package/assets/assets/{BacklinksPage-HIM0fmV7.js → BacklinksPage-D23A-ahd.js} +1 -1
  4. package/assets/assets/{HistoryPage-BjEVp-fk.js → HistoryPage-BKGVxmNz.js} +1 -1
  5. package/assets/assets/{MeasurementPropertyPage-BnVDR2y_.js → MeasurementPropertyPage-BSxn6_RB.js} +1 -1
  6. package/assets/assets/ProjectPage-D9W8G_1m.js +8 -0
  7. package/assets/assets/{RunsPage-fJQe2qJc.js → RunsPage-CeBBjLSE.js} +1 -1
  8. package/assets/assets/{SettingsPage-1yam5tl6.js → SettingsPage-Jp5Yp4cz.js} +1 -1
  9. package/assets/assets/SiteHealthSection-DzVegBeN.js +4 -0
  10. package/assets/assets/{TrafficPage-BdNEscz8.js → TrafficPage-B66AYwWk.js} +2 -2
  11. package/assets/assets/{TrafficSourceDetailPage-CMEgr4Aw.js → TrafficSourceDetailPage-CXtq1yES.js} +1 -1
  12. package/assets/assets/{extract-error-message-D2dhaJaW.js → extract-error-message-BVa0lOze.js} +1 -1
  13. package/assets/assets/{index-CgT2Btdn.css → index-CMe_-fAB.css} +1 -1
  14. package/assets/assets/index-DuhS0WLM.js +86 -0
  15. package/assets/assets/{react-sigma_core.esm.min-oP23IWpt.js → react-sigma_core.esm.min-60drsJa6.js} +1 -1
  16. package/assets/assets/{v2-overview-adapter-DYatWs7N.js → v2-overview-adapter-CLUi2Lkv.js} +1 -1
  17. package/assets/index.html +2 -2
  18. package/dist/{chunk-A5PALGQD.js → chunk-22R5E5CY.js} +94 -190
  19. package/dist/{chunk-TUHQ5BBQ.js → chunk-2OQ6D26U.js} +2 -5
  20. package/dist/{chunk-LXWY4NKP.js → chunk-IAMECH2N.js} +3 -3
  21. package/dist/{chunk-HQJ25LI7.js → chunk-MTSFSXCG.js} +2 -2
  22. package/dist/{chunk-RRIZ5AKI.js → chunk-U2S5ABOR.js} +2 -2
  23. package/dist/{chunk-EZ54X4XH.js → chunk-VDX3LYKL.js} +110 -78
  24. package/dist/{chunk-OOUDIVIU.js → chunk-YGHPT5B2.js} +434 -182
  25. package/dist/cli.js +8 -8
  26. package/dist/{demo-server-LHHDVXQW.js → demo-server-TIMYQLXS.js} +4 -4
  27. package/dist/index.js +6 -6
  28. package/dist/{intelligence-service-ZVKZLLKL.js → intelligence-service-YCMRTVCI.js} +2 -2
  29. package/dist/mcp.js +4 -4
  30. package/package.json +10 -10
  31. package/assets/assets/AuditHistoryPanel-DBYsgVsn.js +0 -1
  32. package/assets/assets/ProjectPage-BhCM47KA.js +0 -8
  33. package/assets/assets/SiteHealthSection-DysU2M6C.js +0 -4
  34. 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-EZ54X4XH.js";
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-OOUDIVIU.js";
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-OOUDIVIU.js";
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 = (input.now ?? /* @__PURE__ */ new Date()).getTime();
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 = (input.now ?? /* @__PURE__ */ new Date()).toISOString();
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: snapshots.map((s) => {
19785
- const rawParsed = parseSnapshotRawResponse(s.rawResponse);
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 perQuery = /* @__PURE__ */ new Map();
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 = PLUGIN_DIR, pluginPkgJson = PLUGIN_PKG_JSON) {
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,