@ainyc/canonry 4.191.0 → 4.192.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-C2dvjYNh.js → AuditHistoryPanel-C7MwfCl9.js} +1 -1
- package/assets/assets/{BacklinksPage-D1yPQtfF.js → BacklinksPage-1Nq1zbRk.js} +1 -1
- package/assets/assets/{ChartPrimitives-DLEICrrL.js → ChartPrimitives-Bxa_vFmq.js} +1 -1
- package/assets/assets/{HistoryPage-DOEa7naA.js → HistoryPage-BNACyEiz.js} +1 -1
- package/assets/assets/MeasurementPropertyPage-BqjpIYAw.js +1 -0
- package/assets/assets/ProjectPage-BhBzznlv.js +8 -0
- package/assets/assets/{RunRow-BO7lyC1C.js → RunRow-DINPo5ES.js} +1 -1
- package/assets/assets/{RunsPage-DHSWfTav.js → RunsPage-BFuDLm7p.js} +1 -1
- package/assets/assets/{SettingsPage-oiJdhiq0.js → SettingsPage-CkqmyTSK.js} +1 -1
- package/assets/assets/{SiteHealthSection-gVdylFY-.js → SiteHealthSection-DzFKj9lX.js} +3 -3
- package/assets/assets/{TrafficPage-YIdwRpQh.js → TrafficPage-CkIGVLET.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-B4Cop6ox.js → TrafficSourceDetailPage-CTmn_FmZ.js} +1 -1
- package/assets/assets/{extract-error-message-XavUZNf3.js → extract-error-message-CC2kxd3e.js} +1 -1
- package/assets/assets/{index-njfYnO22.js → index-CCPMPGar.js} +25 -25
- package/assets/assets/{react-sigma_core.esm.min-V7giUpEn.js → react-sigma_core.esm.min-DkpQa1sf.js} +1 -1
- package/assets/assets/{vendor-lucide-dNHw1I5G.js → vendor-lucide-CW2qe0uH.js} +1 -1
- package/assets/assets/{vendor-markdown-9tTeP8v7.js → vendor-markdown-B-Oq2NYq.js} +1 -1
- package/assets/assets/{vendor-radix-BpmvLvpp.js → vendor-radix-twS1M3FF.js} +1 -1
- package/assets/assets/{vendor-recharts-FA0uySU7.js → vendor-recharts-D-cUuLZo.js} +1 -1
- package/assets/assets/{vendor-tanstack-CYBjbqVr.js → vendor-tanstack-ZXXkndVj.js} +1 -1
- package/assets/index.html +6 -6
- package/dist/{chunk-WSD5J6O4.js → chunk-32Q2NZ4S.js} +2 -2
- package/dist/{chunk-2A7E5TDU.js → chunk-36RKISAI.js} +5 -4
- package/dist/{chunk-KBUV3HGS.js → chunk-BULKBROE.js} +1326 -1227
- package/dist/{chunk-ZK4FJDCH.js → chunk-FTKZAOFD.js} +436 -205
- package/dist/{chunk-XI6FN52S.js → chunk-JOSSB4QC.js} +45 -14
- package/dist/cli.js +14 -10
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-EVRWZHDG.js → intelligence-service-MEQ5VX5L.js} +2 -2
- package/dist/mcp.js +3 -3
- package/package.json +10 -10
- package/assets/assets/MeasurementPropertyPage-D-O8vnMS.js +0 -1
- package/assets/assets/ProjectPage-DqTCcimz.js +0 -8
|
@@ -3880,6 +3880,8 @@ var measurementV2TargetSchema = z6.object({
|
|
|
3880
3880
|
stableKey: measurementV2StableKeySchema,
|
|
3881
3881
|
label: z6.string().trim().min(1),
|
|
3882
3882
|
aliases: z6.array(z6.string().min(1)),
|
|
3883
|
+
/** Explicit qualified identity phrases for names shared with other places/businesses. */
|
|
3884
|
+
identityAliases: z6.array(z6.string().trim().min(1)).optional(),
|
|
3883
3885
|
urlMatchers: z6.array(measurementV2UrlMatcherSchema),
|
|
3884
3886
|
/** An aliasless Target can be cited but never mentioned; the flag keeps that out of a 0% reading. */
|
|
3885
3887
|
mentionNotApplicable: z6.boolean(),
|
|
@@ -4124,6 +4126,7 @@ function canonicalMeasurementPlanV2(plan) {
|
|
|
4124
4126
|
targets: [...plan.targets].map((target) => ({
|
|
4125
4127
|
...target,
|
|
4126
4128
|
aliases: [...target.aliases].sort(compareText),
|
|
4129
|
+
...target.identityAliases === void 0 ? {} : { identityAliases: [...target.identityAliases].sort(compareText) },
|
|
4127
4130
|
urlMatchers: [...target.urlMatchers].sort((left, right) => compareText(matcherOrderKey(left), matcherOrderKey(right)))
|
|
4128
4131
|
})).sort((left, right) => compareText(left.stableKey, right.stableKey)),
|
|
4129
4132
|
groups: [...plan.groups].map((group) => ({
|
|
@@ -4171,6 +4174,7 @@ var measurementMetricUnavailableReasonSchema = z6.enum([
|
|
|
4171
4174
|
"plan_v1",
|
|
4172
4175
|
"no_population",
|
|
4173
4176
|
"evidence_incomplete",
|
|
4177
|
+
"identity_ambiguous",
|
|
4174
4178
|
"not_applicable"
|
|
4175
4179
|
]);
|
|
4176
4180
|
var measurementMetricValueSchema = z6.discriminatedUnion("state", [
|
|
@@ -6179,7 +6183,7 @@ var visibilityReportRateSchema = z15.object({
|
|
|
6179
6183
|
numerator: z15.number().int().nonnegative().nullable(),
|
|
6180
6184
|
denominator: z15.number().int().nonnegative().nullable(),
|
|
6181
6185
|
rate: z15.number().min(0).max(1).nullable(),
|
|
6182
|
-
reason: z15.enum(["no-population", "incomplete", "evidence-incomplete", "not-applicable"]).optional()
|
|
6186
|
+
reason: z15.enum(["no-population", "incomplete", "evidence-incomplete", "identity-ambiguous", "not-applicable"]).optional()
|
|
6183
6187
|
}).strict().superRefine((value, ctx) => {
|
|
6184
6188
|
const unavailable = value.numerator === null || value.denominator === null || value.rate === null;
|
|
6185
6189
|
if (unavailable) {
|
|
@@ -6288,6 +6292,7 @@ var visibilityReportEvidenceRowSchema = z15.object({
|
|
|
6288
6292
|
location: z15.string().nullable(),
|
|
6289
6293
|
targetKeys: z15.array(nonBlankIdSchema),
|
|
6290
6294
|
mentioned: z15.boolean().nullable(),
|
|
6295
|
+
mentionUnavailableReason: z15.literal("identity-ambiguous").optional(),
|
|
6291
6296
|
cited: z15.boolean().nullable(),
|
|
6292
6297
|
/** Present only for a query-key detail reading; aggregate listings never return answer bodies. */
|
|
6293
6298
|
answerText: z15.string().nullable(),
|
|
@@ -6729,6 +6734,7 @@ var measurementUsageEdgeTypeSchema = z17.enum(["baseline", "target"]);
|
|
|
6729
6734
|
var measurementMetricReasonSchema = z17.enum([
|
|
6730
6735
|
"incomplete",
|
|
6731
6736
|
"evidence-incomplete",
|
|
6737
|
+
"identity-ambiguous",
|
|
6732
6738
|
"no-population",
|
|
6733
6739
|
"aliasless",
|
|
6734
6740
|
"no-competitors",
|
|
@@ -7367,6 +7373,7 @@ var measurementDraftTargetSchema = z19.object({
|
|
|
7367
7373
|
label: z19.string().trim().min(1),
|
|
7368
7374
|
status: measurementDraftTargetStatusSchema,
|
|
7369
7375
|
aliases: z19.array(z19.string().trim().min(1)),
|
|
7376
|
+
identityAliases: z19.array(z19.string().trim().min(1)).optional(),
|
|
7370
7377
|
urlMatchers: z19.array(z19.string().trim().min(1)),
|
|
7371
7378
|
source: measurementDraftTargetSourceSchema,
|
|
7372
7379
|
discoveredUrl: z19.string().trim().min(1).optional(),
|
|
@@ -8465,14 +8472,14 @@ function roundSignificant(value, sig = 6) {
|
|
|
8465
8472
|
const factor = 10 ** (sig - magnitude);
|
|
8466
8473
|
return (Math.round(value * factor) + 0) / factor;
|
|
8467
8474
|
}
|
|
8468
|
-
function wilsonInterval(successes, n,
|
|
8475
|
+
function wilsonInterval(successes, n, z61 = 1.96) {
|
|
8469
8476
|
if (!Number.isFinite(n) || n <= 0) return null;
|
|
8470
8477
|
const s = Math.max(0, Math.min(successes, n));
|
|
8471
8478
|
const p = s / n;
|
|
8472
|
-
const z210 =
|
|
8479
|
+
const z210 = z61 * z61;
|
|
8473
8480
|
const denom = 1 + z210 / n;
|
|
8474
8481
|
const center = (p + z210 / (2 * n)) / denom;
|
|
8475
|
-
const margin =
|
|
8482
|
+
const margin = z61 / denom * Math.sqrt(p * (1 - p) / n + z210 / (4 * n * n));
|
|
8476
8483
|
return {
|
|
8477
8484
|
low: round(Math.max(0, center - margin)),
|
|
8478
8485
|
high: round(Math.min(1, center + margin))
|
|
@@ -14523,10 +14530,86 @@ function citationStateToCited(state) {
|
|
|
14523
14530
|
}
|
|
14524
14531
|
|
|
14525
14532
|
// ../contracts/src/report.ts
|
|
14533
|
+
import { z as z52 } from "zod";
|
|
14534
|
+
|
|
14535
|
+
// ../contracts/src/report-visibility.ts
|
|
14526
14536
|
import { z as z51 } from "zod";
|
|
14537
|
+
var reportVisibilitySchema = z51.object({
|
|
14538
|
+
selection: visibilityReportSelectionSchema,
|
|
14539
|
+
/** History window only; the latest summary remains available even outside it. */
|
|
14540
|
+
historyWindow: z51.object({ from: z51.string().datetime(), to: z51.string().datetime() }).optional(),
|
|
14541
|
+
populations: z51.array(visibilityReportPopulationSchema.pick({ queryClass: true, summary: true, trend: true }))
|
|
14542
|
+
});
|
|
14543
|
+
var REPORT_VISIBILITY_COPY = {
|
|
14544
|
+
title: "AI visibility",
|
|
14545
|
+
description: "Each answer is counted once for its assigned properties. Branded and non-brand queries are measured separately.",
|
|
14546
|
+
simpleDescription: "Each saved answer is counted once. Branded and non-brand queries are measured separately.",
|
|
14547
|
+
queryType: "Query type",
|
|
14548
|
+
queries: "Queries measured",
|
|
14549
|
+
answers: "Answers measured",
|
|
14550
|
+
mentioned: "Mentioned",
|
|
14551
|
+
cited: "Cited",
|
|
14552
|
+
history: "Measurement history",
|
|
14553
|
+
latestMeasurement: "Latest measurement",
|
|
14554
|
+
allLocations: "All measured locations",
|
|
14555
|
+
noLocation: "No provider location",
|
|
14556
|
+
location: "Location",
|
|
14557
|
+
previousOutsideWindow: "Previous measurement outside this period",
|
|
14558
|
+
date: "Date",
|
|
14559
|
+
comparison: "Comparison",
|
|
14560
|
+
notMeasured: "Not measured",
|
|
14561
|
+
incomplete: "Evidence incomplete",
|
|
14562
|
+
ambiguous: "Property identity unverified",
|
|
14563
|
+
noPopulation: "No measured answers",
|
|
14564
|
+
notApplicable: "Not applicable",
|
|
14565
|
+
comparable: "Comparable",
|
|
14566
|
+
baseline: "Baseline",
|
|
14567
|
+
changed: "Measurement changed",
|
|
14568
|
+
unknownHistory: "Comparison unavailable"
|
|
14569
|
+
};
|
|
14570
|
+
function reportQueryClassLabel(value) {
|
|
14571
|
+
return { branded: "Branded", "non-brand": "Non-brand", unknown: "Unclassified" }[value];
|
|
14572
|
+
}
|
|
14573
|
+
function reportVisibilityRate(value) {
|
|
14574
|
+
return value.rate === null ? REPORT_VISIBILITY_COPY.notMeasured : `${Number((value.rate * 100).toFixed(1))}%`;
|
|
14575
|
+
}
|
|
14576
|
+
function reportVisibilityEvidence(value) {
|
|
14577
|
+
if (value.numerator !== null && value.denominator !== null) return `${value.numerator} of ${value.denominator} answers`;
|
|
14578
|
+
switch (value.reason) {
|
|
14579
|
+
case "no-population":
|
|
14580
|
+
return REPORT_VISIBILITY_COPY.noPopulation;
|
|
14581
|
+
case "not-applicable":
|
|
14582
|
+
return REPORT_VISIBILITY_COPY.notApplicable;
|
|
14583
|
+
// Identity ambiguity is an explicit evidence state, never a negative result.
|
|
14584
|
+
case "identity-ambiguous":
|
|
14585
|
+
return REPORT_VISIBILITY_COPY.ambiguous;
|
|
14586
|
+
default:
|
|
14587
|
+
return REPORT_VISIBILITY_COPY.incomplete;
|
|
14588
|
+
}
|
|
14589
|
+
}
|
|
14590
|
+
function reportVisibilityComparison(state, outsideWindow = false) {
|
|
14591
|
+
const label = state === "first" ? REPORT_VISIBILITY_COPY.baseline : state === "comparable" ? REPORT_VISIBILITY_COPY.comparable : state === "legacy-unknown" ? REPORT_VISIBILITY_COPY.unknownHistory : REPORT_VISIBILITY_COPY.changed;
|
|
14592
|
+
return outsideWindow ? `${label} \xB7 ${REPORT_VISIBILITY_COPY.previousOutsideWindow}` : label;
|
|
14593
|
+
}
|
|
14594
|
+
function reportVisibilityMeasurementLabel(visibility) {
|
|
14595
|
+
const date = visibility.selection.measurement.completedAt?.slice(0, 10) ?? REPORT_VISIBILITY_COPY.notMeasured;
|
|
14596
|
+
return `${REPORT_VISIBILITY_COPY.latestMeasurement}: ${date}`;
|
|
14597
|
+
}
|
|
14598
|
+
function reportVisibilityHistoryLabel(visibility) {
|
|
14599
|
+
const window = visibility.historyWindow;
|
|
14600
|
+
return window === void 0 ? REPORT_VISIBILITY_COPY.history : `${REPORT_VISIBILITY_COPY.history} (${window.from.slice(0, 10)} \u2013 ${window.to.slice(0, 10)})`;
|
|
14601
|
+
}
|
|
14602
|
+
function reportVisibilityLocationLabel(visibility) {
|
|
14603
|
+
const location = visibility.selection.location;
|
|
14604
|
+
if (location.kind === "all") return REPORT_VISIBILITY_COPY.allLocations;
|
|
14605
|
+
if (location.kind === "none") return REPORT_VISIBILITY_COPY.noLocation;
|
|
14606
|
+
return `${REPORT_VISIBILITY_COPY.location}: ${location.value}`;
|
|
14607
|
+
}
|
|
14608
|
+
|
|
14609
|
+
// ../contracts/src/report.ts
|
|
14527
14610
|
var REPORT_PERIOD_OPTIONS = [7, 14, 30, 90];
|
|
14528
14611
|
var REPORT_DEFAULT_PERIOD_DAYS = 30;
|
|
14529
|
-
var reportPeriodSchema =
|
|
14612
|
+
var reportPeriodSchema = z52.union([z52.literal(7), z52.literal(14), z52.literal(30), z52.literal(90)]).describe("Report window in days (7, 14, 30, or 90). Defaults to 30 when omitted.");
|
|
14530
14613
|
function isReportPeriodDays(n) {
|
|
14531
14614
|
return REPORT_PERIOD_OPTIONS.includes(n);
|
|
14532
14615
|
}
|
|
@@ -14541,45 +14624,45 @@ function parseReportPeriodDays(value) {
|
|
|
14541
14624
|
function reportComparisonWindowDays(periodDays) {
|
|
14542
14625
|
return Math.max(1, Math.floor(periodDays / 2));
|
|
14543
14626
|
}
|
|
14544
|
-
var providerLocationTreatmentSchema =
|
|
14627
|
+
var providerLocationTreatmentSchema = z52.enum([
|
|
14545
14628
|
"prompt",
|
|
14546
14629
|
"request-param",
|
|
14547
14630
|
"browser-geo",
|
|
14548
14631
|
"ignored"
|
|
14549
14632
|
]);
|
|
14550
|
-
var reportMetaLocationSchema =
|
|
14633
|
+
var reportMetaLocationSchema = z52.object({
|
|
14551
14634
|
/** Human-readable label as configured on the project (e.g. "michigan"). */
|
|
14552
|
-
label:
|
|
14635
|
+
label: z52.string(),
|
|
14553
14636
|
/** Resolved city/region/country from the project's `LocationContext`. */
|
|
14554
|
-
city:
|
|
14555
|
-
region:
|
|
14556
|
-
country:
|
|
14637
|
+
city: z52.string(),
|
|
14638
|
+
region: z52.string(),
|
|
14639
|
+
country: z52.string(),
|
|
14557
14640
|
/**
|
|
14558
14641
|
* Other locations configured on the project that did NOT power this report.
|
|
14559
14642
|
* When non-empty, callers should make clear that the report is location-scoped:
|
|
14560
14643
|
* a separate sweep is needed to see how AI engines respond from each one.
|
|
14561
14644
|
*/
|
|
14562
|
-
otherConfiguredLabels:
|
|
14645
|
+
otherConfiguredLabels: z52.array(z52.string())
|
|
14563
14646
|
});
|
|
14564
|
-
var reportProviderLocationHandlingSchema =
|
|
14647
|
+
var reportProviderLocationHandlingSchema = z52.object({
|
|
14565
14648
|
/** Provider name (matches `query_snapshots.provider`). */
|
|
14566
|
-
provider:
|
|
14649
|
+
provider: z52.string(),
|
|
14567
14650
|
/** How this provider applied the configured location during this run. */
|
|
14568
14651
|
treatment: providerLocationTreatmentSchema,
|
|
14569
14652
|
/** One-sentence explanation suitable for the report. */
|
|
14570
|
-
description:
|
|
14653
|
+
description: z52.string()
|
|
14571
14654
|
});
|
|
14572
|
-
var reportMetaSchema =
|
|
14655
|
+
var reportMetaSchema = z52.object({
|
|
14573
14656
|
/** ISO timestamp the report was generated (server clock). */
|
|
14574
|
-
generatedAt:
|
|
14657
|
+
generatedAt: z52.string(),
|
|
14575
14658
|
/** Project the report covers. */
|
|
14576
|
-
project:
|
|
14577
|
-
id:
|
|
14578
|
-
name:
|
|
14579
|
-
displayName:
|
|
14580
|
-
canonicalDomain:
|
|
14581
|
-
country:
|
|
14582
|
-
language:
|
|
14659
|
+
project: z52.object({
|
|
14660
|
+
id: z52.string(),
|
|
14661
|
+
name: z52.string(),
|
|
14662
|
+
displayName: z52.string(),
|
|
14663
|
+
canonicalDomain: z52.string(),
|
|
14664
|
+
country: z52.string(),
|
|
14665
|
+
language: z52.string()
|
|
14583
14666
|
}),
|
|
14584
14667
|
/**
|
|
14585
14668
|
* The location that powered the latest visibility run, when one was set.
|
|
@@ -14594,31 +14677,33 @@ var reportMetaSchema = z51.object({
|
|
|
14594
14677
|
* each provider's answer — some providers append it to the prompt, some
|
|
14595
14678
|
* pass it as a structured request field, and some (CDP) ignore it.
|
|
14596
14679
|
*/
|
|
14597
|
-
providerLocationHandling:
|
|
14680
|
+
providerLocationHandling: z52.array(reportProviderLocationHandlingSchema),
|
|
14598
14681
|
/** Earliest data point referenced by the report (ISO date). */
|
|
14599
|
-
periodStart:
|
|
14682
|
+
periodStart: z52.string().nullable(),
|
|
14600
14683
|
/** Latest data point referenced by the report (ISO date). */
|
|
14601
|
-
periodEnd:
|
|
14684
|
+
periodEnd: z52.string().nullable(),
|
|
14602
14685
|
/**
|
|
14603
14686
|
* The selected report window, in days (one of `REPORT_PERIOD_OPTIONS`).
|
|
14604
14687
|
* Every time-windowed section scopes to this many days; renderers read it to
|
|
14605
14688
|
* label the window ("Last 30 days", "(30d)"). Defaults to
|
|
14606
14689
|
* `REPORT_DEFAULT_PERIOD_DAYS` when no `period` is requested.
|
|
14607
14690
|
*/
|
|
14608
|
-
periodDays:
|
|
14691
|
+
periodDays: z52.number().int().positive()
|
|
14609
14692
|
});
|
|
14610
|
-
var reportExecutiveSummarySchema =
|
|
14693
|
+
var reportExecutiveSummarySchema = z52.object({
|
|
14694
|
+
/** Legacy project/query scalars are unavailable for Advanced portfolios. Use visibility instead. */
|
|
14695
|
+
visibilityBasis: z52.enum(["legacy-project-queries", "frozen-populations"]).optional(),
|
|
14611
14696
|
/**
|
|
14612
14697
|
* 0..100 — share of tracked queries that were cited by at least one
|
|
14613
14698
|
* provider in the latest run. "Cited" means the project's domain appeared
|
|
14614
14699
|
* in the source list / grounding the AI used to answer. Computed per-query
|
|
14615
14700
|
* (not per-(query × provider)) so the rate is invariant to provider count.
|
|
14616
14701
|
*/
|
|
14617
|
-
citationRate:
|
|
14702
|
+
citationRate: z52.number().nullable(),
|
|
14618
14703
|
/** Numerator of `citationRate` — distinct tracked queries cited by ≥1 provider in the latest run. */
|
|
14619
|
-
citedQueryCount:
|
|
14704
|
+
citedQueryCount: z52.number().nullable(),
|
|
14620
14705
|
/** Denominator of `citationRate` — total tracked queries. */
|
|
14621
|
-
totalQueryCount:
|
|
14706
|
+
totalQueryCount: z52.number().nullable(),
|
|
14622
14707
|
/**
|
|
14623
14708
|
* 0..100 — share of tracked queries where the project's brand or domain
|
|
14624
14709
|
* appeared in at least one provider's answer text in the latest run.
|
|
@@ -14626,71 +14711,71 @@ var reportExecutiveSummarySchema = z51.object({
|
|
|
14626
14711
|
* the prose without citing your domain in its sources, and vice versa.
|
|
14627
14712
|
* Same per-query denominator as `citationRate` for consistency.
|
|
14628
14713
|
*/
|
|
14629
|
-
mentionRate:
|
|
14714
|
+
mentionRate: z52.number().nullable(),
|
|
14630
14715
|
/** Numerator of `mentionRate` — distinct tracked queries mentioned in ≥1 provider's answer text. */
|
|
14631
|
-
mentionedQueryCount:
|
|
14716
|
+
mentionedQueryCount: z52.number().nullable(),
|
|
14632
14717
|
/** Compared to the previous run: 'up' | 'down' | 'flat' | 'unknown' (no prior run). */
|
|
14633
|
-
trend:
|
|
14718
|
+
trend: z52.enum(["up", "down", "flat", "unknown"]),
|
|
14634
14719
|
/** Total tracked queries. */
|
|
14635
|
-
queryCount:
|
|
14720
|
+
queryCount: z52.number(),
|
|
14636
14721
|
/** Total tracked competitors. */
|
|
14637
|
-
competitorCount:
|
|
14722
|
+
competitorCount: z52.number(),
|
|
14638
14723
|
/** Number of providers in the latest run. */
|
|
14639
|
-
providerCount:
|
|
14724
|
+
providerCount: z52.number(),
|
|
14640
14725
|
/** GSC totals across the most-recent sync window. Null when GSC is not connected. */
|
|
14641
|
-
gsc:
|
|
14642
|
-
clicks:
|
|
14643
|
-
impressions:
|
|
14644
|
-
ctr:
|
|
14645
|
-
avgPosition:
|
|
14646
|
-
periodStart:
|
|
14647
|
-
periodEnd:
|
|
14726
|
+
gsc: z52.object({
|
|
14727
|
+
clicks: z52.number(),
|
|
14728
|
+
impressions: z52.number(),
|
|
14729
|
+
ctr: z52.number(),
|
|
14730
|
+
avgPosition: z52.number(),
|
|
14731
|
+
periodStart: z52.string(),
|
|
14732
|
+
periodEnd: z52.string()
|
|
14648
14733
|
}).nullable(),
|
|
14649
14734
|
/** GA4 totals across the most-recent sync period. Null when GA4 is not connected. */
|
|
14650
|
-
ga:
|
|
14651
|
-
sessions:
|
|
14652
|
-
users:
|
|
14653
|
-
periodStart:
|
|
14654
|
-
periodEnd:
|
|
14735
|
+
ga: z52.object({
|
|
14736
|
+
sessions: z52.number(),
|
|
14737
|
+
users: z52.number(),
|
|
14738
|
+
periodStart: z52.string(),
|
|
14739
|
+
periodEnd: z52.string()
|
|
14655
14740
|
}).nullable(),
|
|
14656
14741
|
/** Top 3-5 findings, each rendered as a single-sentence narrative. */
|
|
14657
|
-
findings:
|
|
14658
|
-
title:
|
|
14659
|
-
detail:
|
|
14660
|
-
tone:
|
|
14742
|
+
findings: z52.array(z52.object({
|
|
14743
|
+
title: z52.string(),
|
|
14744
|
+
detail: z52.string(),
|
|
14745
|
+
tone: z52.enum(["positive", "caution", "negative", "neutral"])
|
|
14661
14746
|
}))
|
|
14662
14747
|
});
|
|
14663
|
-
var citationCellSchema =
|
|
14664
|
-
citationState:
|
|
14665
|
-
answerMentioned:
|
|
14666
|
-
model:
|
|
14748
|
+
var citationCellSchema = z52.object({
|
|
14749
|
+
citationState: z52.enum(["cited", "not-cited", "pending"]),
|
|
14750
|
+
answerMentioned: z52.boolean().nullable(),
|
|
14751
|
+
model: z52.string().nullable()
|
|
14667
14752
|
});
|
|
14668
|
-
var citationScorecardSchema =
|
|
14669
|
-
queries:
|
|
14670
|
-
providers:
|
|
14753
|
+
var citationScorecardSchema = z52.object({
|
|
14754
|
+
queries: z52.array(z52.string()),
|
|
14755
|
+
providers: z52.array(z52.string()),
|
|
14671
14756
|
/** matrix[queryIndex][providerIndex] — null when no snapshot exists for the pair. */
|
|
14672
|
-
matrix:
|
|
14757
|
+
matrix: z52.array(z52.array(citationCellSchema.nullable())),
|
|
14673
14758
|
/** Per-provider citation + mention rates (0..100). */
|
|
14674
|
-
providerRates:
|
|
14675
|
-
provider:
|
|
14676
|
-
citedCount:
|
|
14759
|
+
providerRates: z52.array(z52.object({
|
|
14760
|
+
provider: z52.string(),
|
|
14761
|
+
citedCount: z52.number(),
|
|
14677
14762
|
/** Number of snapshots for this provider where the answer text mentioned the project. */
|
|
14678
|
-
mentionedCount:
|
|
14679
|
-
totalCount:
|
|
14680
|
-
citationRate:
|
|
14681
|
-
mentionRate:
|
|
14763
|
+
mentionedCount: z52.number(),
|
|
14764
|
+
totalCount: z52.number(),
|
|
14765
|
+
citationRate: z52.number(),
|
|
14766
|
+
mentionRate: z52.number()
|
|
14682
14767
|
}))
|
|
14683
14768
|
});
|
|
14684
|
-
var competitorRowSchema =
|
|
14685
|
-
domain:
|
|
14769
|
+
var competitorRowSchema = z52.object({
|
|
14770
|
+
domain: z52.string(),
|
|
14686
14771
|
/** Number of (query × provider) pairs that cited this competitor. */
|
|
14687
|
-
citationCount:
|
|
14772
|
+
citationCount: z52.number(),
|
|
14688
14773
|
/** Out-of count for the same denominator. */
|
|
14689
|
-
totalCount:
|
|
14774
|
+
totalCount: z52.number(),
|
|
14690
14775
|
/** 'High' | 'Moderate' | 'Low' | 'None' — from buildPortfolioProject pressure logic. */
|
|
14691
|
-
pressureLabel:
|
|
14776
|
+
pressureLabel: z52.enum(["High", "Moderate", "Low", "None"]),
|
|
14692
14777
|
/** Distinct queries on which this competitor was cited. */
|
|
14693
|
-
citedQueries:
|
|
14778
|
+
citedQueries: z52.array(z52.string()),
|
|
14694
14779
|
/**
|
|
14695
14780
|
* Citation share 0..100. Numerator = this competitor's `citationCount`.
|
|
14696
14781
|
* Denominator = sum of `citationCount` across all competitors plus the
|
|
@@ -14698,30 +14783,30 @@ var competitorRowSchema = z51.object({
|
|
|
14698
14783
|
* slots in the snapshot. Distinct from the project-level Mention Share
|
|
14699
14784
|
* gauge — that one is brand-in-answer-text, this one is domain-in-source-list.
|
|
14700
14785
|
*/
|
|
14701
|
-
sharePct:
|
|
14786
|
+
sharePct: z52.number(),
|
|
14702
14787
|
/**
|
|
14703
14788
|
* URLs from the latest run's grounding sources whose host matches this
|
|
14704
14789
|
* competitor's domain, with the queries each URL was cited for. Empty
|
|
14705
14790
|
* when no grounding-source data is available (e.g. no `rawResponse` JSON
|
|
14706
14791
|
* stored for the snapshots).
|
|
14707
14792
|
*/
|
|
14708
|
-
theirCitedPages:
|
|
14793
|
+
theirCitedPages: z52.array(z52.object({ url: z52.string(), citedFor: z52.array(z52.string()) }))
|
|
14709
14794
|
});
|
|
14710
|
-
var competitorLandscapeSchema =
|
|
14795
|
+
var competitorLandscapeSchema = z52.object({
|
|
14711
14796
|
/** Project's own citation count (for the bar chart comparing project vs competitors). */
|
|
14712
|
-
projectCitationCount:
|
|
14713
|
-
competitors:
|
|
14797
|
+
projectCitationCount: z52.number(),
|
|
14798
|
+
competitors: z52.array(competitorRowSchema)
|
|
14714
14799
|
});
|
|
14715
|
-
var mentionRowSchema =
|
|
14716
|
-
domain:
|
|
14800
|
+
var mentionRowSchema = z52.object({
|
|
14801
|
+
domain: z52.string(),
|
|
14717
14802
|
/** Number of (query × provider) pairs whose answer text mentioned this competitor's brand or domain. */
|
|
14718
|
-
mentionCount:
|
|
14803
|
+
mentionCount: z52.number(),
|
|
14719
14804
|
/** Out-of count for the same denominator (snapshots that had answer text). */
|
|
14720
|
-
totalCount:
|
|
14805
|
+
totalCount: z52.number(),
|
|
14721
14806
|
/** 'High' | 'Moderate' | 'Low' | 'None' — mention frequency tier (mirrors CompetitorRow.pressureLabel). */
|
|
14722
|
-
pressureLabel:
|
|
14807
|
+
pressureLabel: z52.enum(["High", "Moderate", "Low", "None"]),
|
|
14723
14808
|
/** Distinct queries on which this competitor was mentioned. */
|
|
14724
|
-
mentionedQueries:
|
|
14809
|
+
mentionedQueries: z52.array(z52.string()),
|
|
14725
14810
|
/**
|
|
14726
14811
|
* Mention share 0..100. Numerator = this competitor's `mentionCount`.
|
|
14727
14812
|
* Denominator = sum of `mentionCount` across all competitors plus the
|
|
@@ -14730,122 +14815,122 @@ var mentionRowSchema = z51.object({
|
|
|
14730
14815
|
* split of the same head-to-head measure the project's hero
|
|
14731
14816
|
* `MentionShareDto` gauge headlines.
|
|
14732
14817
|
*/
|
|
14733
|
-
sharePct:
|
|
14818
|
+
sharePct: z52.number().nullable()
|
|
14734
14819
|
});
|
|
14735
|
-
var mentionLandscapeSectionSchema =
|
|
14820
|
+
var mentionLandscapeSectionSchema = z52.object({
|
|
14736
14821
|
shareOfVoice: visibilityStatsShareOfVoiceSchema.optional(),
|
|
14737
14822
|
/** Project's own mention count (for the bar chart comparing project vs competitors). */
|
|
14738
|
-
projectMentionCount:
|
|
14823
|
+
projectMentionCount: z52.number(),
|
|
14739
14824
|
/** Snapshots considered — those with non-empty answerText. Drives the totalCount denominator. */
|
|
14740
|
-
totalAnswerSnapshots:
|
|
14741
|
-
competitors:
|
|
14825
|
+
totalAnswerSnapshots: z52.number(),
|
|
14826
|
+
competitors: z52.array(mentionRowSchema)
|
|
14742
14827
|
});
|
|
14743
14828
|
var mentionLandscapeSchema = mentionLandscapeSectionSchema.extend({
|
|
14744
14829
|
/** `pooled` only when the project has no usable brand alias to classify by. */
|
|
14745
|
-
scope:
|
|
14830
|
+
scope: z52.enum(["non-brand", "pooled"]),
|
|
14746
14831
|
/** Non-brand queries — identical to the top-level counts, named so a reader can tell. */
|
|
14747
14832
|
nonBrand: mentionLandscapeSectionSchema,
|
|
14748
14833
|
/** Branded queries — recognition, not competitive placement. */
|
|
14749
14834
|
branded: mentionLandscapeSectionSchema
|
|
14750
14835
|
});
|
|
14751
|
-
var aiSourceCategoryBucketSchema =
|
|
14836
|
+
var aiSourceCategoryBucketSchema = z52.object({
|
|
14752
14837
|
/** Category slug from packages/contracts/src/source-categories. */
|
|
14753
|
-
category:
|
|
14838
|
+
category: z52.string(),
|
|
14754
14839
|
/** Display label. */
|
|
14755
|
-
label:
|
|
14840
|
+
label: z52.string(),
|
|
14756
14841
|
/** Number of citations falling in this category. */
|
|
14757
|
-
count:
|
|
14842
|
+
count: z52.number(),
|
|
14758
14843
|
/** 0..100 share of total citations. */
|
|
14759
|
-
sharePct:
|
|
14844
|
+
sharePct: z52.number()
|
|
14760
14845
|
});
|
|
14761
|
-
var aiSourceOriginSchema =
|
|
14762
|
-
categories:
|
|
14846
|
+
var aiSourceOriginSchema = z52.object({
|
|
14847
|
+
categories: z52.array(aiSourceCategoryBucketSchema),
|
|
14763
14848
|
/** Top 20 source domains by citation count (excluding the project's own domain). */
|
|
14764
|
-
topDomains:
|
|
14765
|
-
domain:
|
|
14766
|
-
count:
|
|
14849
|
+
topDomains: z52.array(z52.object({
|
|
14850
|
+
domain: z52.string(),
|
|
14851
|
+
count: z52.number(),
|
|
14767
14852
|
/** True when the domain is one of the project's tracked competitors. */
|
|
14768
|
-
isCompetitor:
|
|
14853
|
+
isCompetitor: z52.boolean()
|
|
14769
14854
|
}))
|
|
14770
14855
|
});
|
|
14771
|
-
var gscQueryRowSchema =
|
|
14772
|
-
query:
|
|
14773
|
-
clicks:
|
|
14774
|
-
impressions:
|
|
14775
|
-
ctr:
|
|
14776
|
-
avgPosition:
|
|
14856
|
+
var gscQueryRowSchema = z52.object({
|
|
14857
|
+
query: z52.string(),
|
|
14858
|
+
clicks: z52.number(),
|
|
14859
|
+
impressions: z52.number(),
|
|
14860
|
+
ctr: z52.number(),
|
|
14861
|
+
avgPosition: z52.number(),
|
|
14777
14862
|
/** Heuristic categorization: 'brand' | 'lead-gen' | 'industry' | 'other'. */
|
|
14778
|
-
category:
|
|
14779
|
-
});
|
|
14780
|
-
var gscSectionSchema =
|
|
14781
|
-
periodStart:
|
|
14782
|
-
periodEnd:
|
|
14783
|
-
totalClicks:
|
|
14784
|
-
totalImpressions:
|
|
14785
|
-
ctr:
|
|
14786
|
-
avgPosition:
|
|
14787
|
-
topQueries:
|
|
14788
|
-
categoryBreakdown:
|
|
14789
|
-
category:
|
|
14790
|
-
clicks:
|
|
14791
|
-
impressions:
|
|
14792
|
-
sharePct:
|
|
14863
|
+
category: z52.enum(["brand", "lead-gen", "industry", "other"])
|
|
14864
|
+
});
|
|
14865
|
+
var gscSectionSchema = z52.object({
|
|
14866
|
+
periodStart: z52.string(),
|
|
14867
|
+
periodEnd: z52.string(),
|
|
14868
|
+
totalClicks: z52.number(),
|
|
14869
|
+
totalImpressions: z52.number(),
|
|
14870
|
+
ctr: z52.number(),
|
|
14871
|
+
avgPosition: z52.number(),
|
|
14872
|
+
topQueries: z52.array(gscQueryRowSchema),
|
|
14873
|
+
categoryBreakdown: z52.array(z52.object({
|
|
14874
|
+
category: z52.enum(["brand", "lead-gen", "industry", "other"]),
|
|
14875
|
+
clicks: z52.number(),
|
|
14876
|
+
impressions: z52.number(),
|
|
14877
|
+
sharePct: z52.number()
|
|
14793
14878
|
})),
|
|
14794
|
-
trend:
|
|
14879
|
+
trend: z52.array(z52.object({ date: z52.string(), clicks: z52.number(), impressions: z52.number() })),
|
|
14795
14880
|
/**
|
|
14796
14881
|
* Tracked AEO queries that have no GSC impressions in the report window.
|
|
14797
14882
|
* Surfaces queries that may not represent real search demand.
|
|
14798
14883
|
*/
|
|
14799
|
-
trackedButNoGsc:
|
|
14884
|
+
trackedButNoGsc: z52.array(z52.string()),
|
|
14800
14885
|
/**
|
|
14801
14886
|
* GSC top queries (sorted by impressions desc) that are not tracked as
|
|
14802
14887
|
* AEO queries — the candidate set for adding to the AEO project.
|
|
14803
14888
|
*/
|
|
14804
|
-
gscButNotTracked:
|
|
14805
|
-
});
|
|
14806
|
-
var gaTrafficSectionSchema =
|
|
14807
|
-
totalSessions:
|
|
14808
|
-
totalUsers:
|
|
14809
|
-
totalOrganicSessions:
|
|
14810
|
-
periodStart:
|
|
14811
|
-
periodEnd:
|
|
14812
|
-
topLandingPages:
|
|
14813
|
-
page:
|
|
14814
|
-
sessions:
|
|
14889
|
+
gscButNotTracked: z52.array(z52.string())
|
|
14890
|
+
});
|
|
14891
|
+
var gaTrafficSectionSchema = z52.object({
|
|
14892
|
+
totalSessions: z52.number(),
|
|
14893
|
+
totalUsers: z52.number(),
|
|
14894
|
+
totalOrganicSessions: z52.number(),
|
|
14895
|
+
periodStart: z52.string(),
|
|
14896
|
+
periodEnd: z52.string(),
|
|
14897
|
+
topLandingPages: z52.array(z52.object({
|
|
14898
|
+
page: z52.string(),
|
|
14899
|
+
sessions: z52.number(),
|
|
14815
14900
|
/**
|
|
14816
14901
|
* @deprecated Never emitted. A per-landing-page user count cannot be
|
|
14817
14902
|
* summed: GA evaluates users as a COUNT DISTINCT at the requested grain,
|
|
14818
14903
|
* so a visitor is counted once per page and per day. Kept optional so
|
|
14819
14904
|
* existing consumers keep parsing.
|
|
14820
14905
|
*/
|
|
14821
|
-
users:
|
|
14822
|
-
organicSessions:
|
|
14906
|
+
users: z52.number().optional(),
|
|
14907
|
+
organicSessions: z52.number()
|
|
14823
14908
|
})),
|
|
14824
|
-
channelBreakdown:
|
|
14825
|
-
channel:
|
|
14826
|
-
sessions:
|
|
14827
|
-
sharePct:
|
|
14909
|
+
channelBreakdown: z52.array(z52.object({
|
|
14910
|
+
channel: z52.string(),
|
|
14911
|
+
sessions: z52.number(),
|
|
14912
|
+
sharePct: z52.number()
|
|
14828
14913
|
}))
|
|
14829
14914
|
});
|
|
14830
|
-
var socialReferralSectionSchema =
|
|
14831
|
-
totalSessions:
|
|
14832
|
-
organicSessions:
|
|
14833
|
-
paidSessions:
|
|
14834
|
-
channels:
|
|
14835
|
-
channelGroup:
|
|
14836
|
-
sessions:
|
|
14837
|
-
sharePct:
|
|
14915
|
+
var socialReferralSectionSchema = z52.object({
|
|
14916
|
+
totalSessions: z52.number(),
|
|
14917
|
+
organicSessions: z52.number(),
|
|
14918
|
+
paidSessions: z52.number(),
|
|
14919
|
+
channels: z52.array(z52.object({
|
|
14920
|
+
channelGroup: z52.string(),
|
|
14921
|
+
sessions: z52.number(),
|
|
14922
|
+
sharePct: z52.number()
|
|
14838
14923
|
})),
|
|
14839
|
-
topCampaigns:
|
|
14840
|
-
source:
|
|
14841
|
-
medium:
|
|
14842
|
-
sessions:
|
|
14924
|
+
topCampaigns: z52.array(z52.object({
|
|
14925
|
+
source: z52.string(),
|
|
14926
|
+
medium: z52.string(),
|
|
14927
|
+
sessions: z52.number()
|
|
14843
14928
|
}))
|
|
14844
14929
|
});
|
|
14845
|
-
var aiReferralSectionSchema =
|
|
14846
|
-
totalSessions:
|
|
14847
|
-
paidSessions:
|
|
14848
|
-
organicSessions:
|
|
14930
|
+
var aiReferralSectionSchema = z52.object({
|
|
14931
|
+
totalSessions: z52.number(),
|
|
14932
|
+
paidSessions: z52.number(),
|
|
14933
|
+
organicSessions: z52.number(),
|
|
14849
14934
|
/**
|
|
14850
14935
|
* @deprecated Never emitted since 4.127.0 and removed in the next major.
|
|
14851
14936
|
*
|
|
@@ -14858,38 +14943,38 @@ var aiReferralSectionSchema = z51.object({
|
|
|
14858
14943
|
* deleted so existing API / `canonry report --format json` / MCP consumers
|
|
14859
14944
|
* keep parsing; they now read `undefined` instead of an inflated number.
|
|
14860
14945
|
*/
|
|
14861
|
-
totalUsers:
|
|
14946
|
+
totalUsers: z52.number().optional(),
|
|
14862
14947
|
/** @deprecated See `totalUsers`. Never emitted since 4.127.0. */
|
|
14863
|
-
paidUsers:
|
|
14948
|
+
paidUsers: z52.number().optional(),
|
|
14864
14949
|
/** @deprecated See `totalUsers`. Never emitted since 4.127.0. */
|
|
14865
|
-
organicUsers:
|
|
14866
|
-
bySource:
|
|
14867
|
-
source:
|
|
14868
|
-
sessions:
|
|
14950
|
+
organicUsers: z52.number().optional(),
|
|
14951
|
+
bySource: z52.array(z52.object({
|
|
14952
|
+
source: z52.string(),
|
|
14953
|
+
sessions: z52.number(),
|
|
14869
14954
|
/** @deprecated See `totalUsers`. Never emitted since 4.127.0. */
|
|
14870
|
-
users:
|
|
14871
|
-
paidSessions:
|
|
14872
|
-
organicSessions:
|
|
14873
|
-
sharePct:
|
|
14955
|
+
users: z52.number().optional(),
|
|
14956
|
+
paidSessions: z52.number(),
|
|
14957
|
+
organicSessions: z52.number(),
|
|
14958
|
+
sharePct: z52.number()
|
|
14874
14959
|
})),
|
|
14875
|
-
trend:
|
|
14876
|
-
topLandingPages:
|
|
14877
|
-
page:
|
|
14878
|
-
sessions:
|
|
14960
|
+
trend: z52.array(z52.object({ date: z52.string(), sessions: z52.number() })),
|
|
14961
|
+
topLandingPages: z52.array(z52.object({
|
|
14962
|
+
page: z52.string(),
|
|
14963
|
+
sessions: z52.number(),
|
|
14879
14964
|
/** @deprecated See `totalUsers`. Never emitted since 4.127.0. */
|
|
14880
|
-
users:
|
|
14965
|
+
users: z52.number().optional()
|
|
14881
14966
|
}))
|
|
14882
14967
|
});
|
|
14883
|
-
var serverActivitySectionSchema =
|
|
14968
|
+
var serverActivitySectionSchema = z52.object({
|
|
14884
14969
|
/** ISO8601 inclusive lower bound of the report window (default: 7 days). */
|
|
14885
|
-
windowStart:
|
|
14970
|
+
windowStart: z52.string(),
|
|
14886
14971
|
/** ISO8601 inclusive upper bound. */
|
|
14887
|
-
windowEnd:
|
|
14888
|
-
hasData:
|
|
14972
|
+
windowEnd: z52.string(),
|
|
14973
|
+
hasData: z52.boolean(),
|
|
14889
14974
|
/** Last-7d total verified crawler hits, with prior 7d for delta. */
|
|
14890
|
-
verifiedCrawlerHits:
|
|
14975
|
+
verifiedCrawlerHits: z52.object({ current: z52.number(), prior: z52.number(), deltaPct: z52.number().nullable() }),
|
|
14891
14976
|
/** Last-7d total unverified crawler hits, separated from verified trust metrics. */
|
|
14892
|
-
unverifiedCrawlerHits:
|
|
14977
|
+
unverifiedCrawlerHits: z52.object({ current: z52.number(), prior: z52.number(), deltaPct: z52.number().nullable() }),
|
|
14893
14978
|
/**
|
|
14894
14979
|
* Last-7d on-demand per-user fetches from AI surfaces (ChatGPT-User,
|
|
14895
14980
|
* Perplexity-User, MistralAI-User). Disjoint from `verifiedCrawlerHits` /
|
|
@@ -14898,7 +14983,7 @@ var serverActivitySectionSchema = z51.object({
|
|
|
14898
14983
|
* because the operational question for user-fetch is "is this happening?"
|
|
14899
14984
|
* not "is this a confirmed bot identity?"
|
|
14900
14985
|
*/
|
|
14901
|
-
aiUserFetchHits:
|
|
14986
|
+
aiUserFetchHits: z52.object({ current: z52.number(), prior: z52.number(), deltaPct: z52.number().nullable() }),
|
|
14902
14987
|
/**
|
|
14903
14988
|
* Last-7d AI-referral sessions (sessionized from server-side request
|
|
14904
14989
|
* evidence). Paid + organic + unclassified. Excludes subresource fetches and
|
|
@@ -14906,7 +14991,7 @@ var serverActivitySectionSchema = z51.object({
|
|
|
14906
14991
|
* not an arrival, and its destination raises its own row. Redirect-answered
|
|
14907
14992
|
* requests are reported separately in `referralRedirects`.
|
|
14908
14993
|
*/
|
|
14909
|
-
referralArrivals:
|
|
14994
|
+
referralArrivals: z52.object({ current: z52.number(), prior: z52.number(), deltaPct: z52.number().nullable() }),
|
|
14910
14995
|
/**
|
|
14911
14996
|
* AI-referred requests in the current window that were answered with a
|
|
14912
14997
|
* Location redirect instead of a page. Not arrivals — but a site where this
|
|
@@ -14914,7 +14999,7 @@ var serverActivitySectionSchema = z51.object({
|
|
|
14914
14999
|
* is exactly the thing to fix, so the report must be able to say it rather
|
|
14915
15000
|
* than render an empty section.
|
|
14916
15001
|
*/
|
|
14917
|
-
referralRedirects:
|
|
15002
|
+
referralRedirects: z52.number().int().nonnegative(),
|
|
14918
15003
|
/**
|
|
14919
15004
|
* `referralArrivals` split by traffic class. The three buckets sum to it.
|
|
14920
15005
|
*
|
|
@@ -14923,23 +15008,23 @@ var serverActivitySectionSchema = z51.object({
|
|
|
14923
15008
|
* never be resolved. Reporting them as organic would overstate earned AI
|
|
14924
15009
|
* traffic by exactly a client's ad volume.
|
|
14925
15010
|
*/
|
|
14926
|
-
referralArrivalsByClass:
|
|
14927
|
-
paid:
|
|
14928
|
-
organic:
|
|
14929
|
-
unclassified:
|
|
15011
|
+
referralArrivalsByClass: z52.object({
|
|
15012
|
+
paid: z52.object({ current: z52.number(), prior: z52.number(), deltaPct: z52.number().nullable() }),
|
|
15013
|
+
organic: z52.object({ current: z52.number(), prior: z52.number(), deltaPct: z52.number().nullable() }),
|
|
15014
|
+
unclassified: z52.object({ current: z52.number(), prior: z52.number(), deltaPct: z52.number().nullable() })
|
|
14930
15015
|
}),
|
|
14931
15016
|
/** Pre-rendered one-line breakdown, e.g. "Paid 1,200 · Organic 24". Empty when there is nothing to split. */
|
|
14932
|
-
referralArrivalsClassSummary:
|
|
15017
|
+
referralArrivalsClassSummary: z52.string(),
|
|
14933
15018
|
/** Per-AI-operator breakdown (OpenAI, Anthropic, Google AI, Perplexity, …). */
|
|
14934
|
-
byOperator:
|
|
14935
|
-
operator:
|
|
14936
|
-
verifiedHits:
|
|
15019
|
+
byOperator: z52.array(z52.object({
|
|
15020
|
+
operator: z52.string(),
|
|
15021
|
+
verifiedHits: z52.number(),
|
|
14937
15022
|
/** Shown to agency audience only: claimed-bot UA, source IP not in a published range. */
|
|
14938
|
-
unverifiedHits:
|
|
15023
|
+
unverifiedHits: z52.number(),
|
|
14939
15024
|
/** Per-user fetches from this operator's AI surface (ChatGPT-User, …). */
|
|
14940
|
-
userFetchHits:
|
|
14941
|
-
referralArrivals:
|
|
14942
|
-
deltaPct:
|
|
15025
|
+
userFetchHits: z52.number(),
|
|
15026
|
+
referralArrivals: z52.number(),
|
|
15027
|
+
deltaPct: z52.number().nullable()
|
|
14943
15028
|
})),
|
|
14944
15029
|
/**
|
|
14945
15030
|
* Top crawled paths (verified only, last-7d). Path-level citation cross-reference
|
|
@@ -14949,9 +15034,9 @@ var serverActivitySectionSchema = z51.object({
|
|
|
14949
15034
|
* citation evidence can extend this entry with a `citationState` field without
|
|
14950
15035
|
* breaking the contract.
|
|
14951
15036
|
*/
|
|
14952
|
-
topCrawledPaths:
|
|
14953
|
-
path:
|
|
14954
|
-
verifiedHits:
|
|
15037
|
+
topCrawledPaths: z52.array(z52.object({
|
|
15038
|
+
path: z52.string(),
|
|
15039
|
+
verifiedHits: z52.number(),
|
|
14955
15040
|
/**
|
|
14956
15041
|
* Hits from a crawler that identified itself but whose source IP could not
|
|
14957
15042
|
* be matched against the operator's published ranges. Additive, not an
|
|
@@ -14959,88 +15044,88 @@ var serverActivitySectionSchema = z51.object({
|
|
|
14959
15044
|
* logs, for one), so for those projects every hit lands here and a
|
|
14960
15045
|
* verified-only view reports zero against real crawl activity.
|
|
14961
15046
|
*/
|
|
14962
|
-
unverifiedHits:
|
|
15047
|
+
unverifiedHits: z52.number().default(0),
|
|
14963
15048
|
/** How many distinct AI operators crawled this path in the window. */
|
|
14964
|
-
distinctOperators:
|
|
15049
|
+
distinctOperators: z52.number()
|
|
14965
15050
|
})),
|
|
14966
15051
|
/** AI products that sent ≥1 session in the window (referral by destination). */
|
|
14967
|
-
referralProducts:
|
|
14968
|
-
product:
|
|
14969
|
-
arrivals:
|
|
14970
|
-
distinctLandingPaths:
|
|
15052
|
+
referralProducts: z52.array(z52.object({
|
|
15053
|
+
product: z52.string(),
|
|
15054
|
+
arrivals: z52.number(),
|
|
15055
|
+
distinctLandingPaths: z52.number()
|
|
14971
15056
|
})),
|
|
14972
15057
|
/** Daily trend, last 14d for sparkline / chart rendering. */
|
|
14973
|
-
dailyTrend:
|
|
14974
|
-
date:
|
|
14975
|
-
verifiedCrawlerHits:
|
|
15058
|
+
dailyTrend: z52.array(z52.object({
|
|
15059
|
+
date: z52.string(),
|
|
15060
|
+
verifiedCrawlerHits: z52.number(),
|
|
14976
15061
|
/** See topCrawledPaths.unverifiedHits. Plotted alongside, never instead. */
|
|
14977
|
-
unverifiedCrawlerHits:
|
|
14978
|
-
userFetchHits:
|
|
14979
|
-
referralArrivals:
|
|
15062
|
+
unverifiedCrawlerHits: z52.number().default(0),
|
|
15063
|
+
userFetchHits: z52.number(),
|
|
15064
|
+
referralArrivals: z52.number()
|
|
14980
15065
|
})),
|
|
14981
15066
|
/**
|
|
14982
15067
|
* Top landing paths for AI-referral sessions (last-7d).
|
|
14983
15068
|
* Complements `topCrawledPaths` (what bots fetch) with what humans actually land on.
|
|
14984
15069
|
*/
|
|
14985
|
-
topReferralLandingPaths:
|
|
14986
|
-
path:
|
|
14987
|
-
arrivals:
|
|
14988
|
-
distinctProducts:
|
|
15070
|
+
topReferralLandingPaths: z52.array(z52.object({
|
|
15071
|
+
path: z52.string(),
|
|
15072
|
+
arrivals: z52.number(),
|
|
15073
|
+
distinctProducts: z52.number()
|
|
14989
15074
|
}))
|
|
14990
15075
|
});
|
|
14991
|
-
var indexingHealthSectionSchema =
|
|
15076
|
+
var indexingHealthSectionSchema = z52.object({
|
|
14992
15077
|
/** Source: 'google' | 'bing' | null when neither is connected. */
|
|
14993
|
-
provider:
|
|
14994
|
-
total:
|
|
14995
|
-
indexed:
|
|
14996
|
-
notIndexed:
|
|
15078
|
+
provider: z52.enum(["google", "bing"]).nullable(),
|
|
15079
|
+
total: z52.number(),
|
|
15080
|
+
indexed: z52.number(),
|
|
15081
|
+
notIndexed: z52.number(),
|
|
14997
15082
|
/** Google-only — pages explicitly marked as deindexed. Bing reports 'unknown' instead. */
|
|
14998
|
-
deindexed:
|
|
15083
|
+
deindexed: z52.number(),
|
|
14999
15084
|
/** Bing-only — pages with no inspection data yet. */
|
|
15000
|
-
unknown:
|
|
15085
|
+
unknown: z52.number(),
|
|
15001
15086
|
/** 0..100. */
|
|
15002
|
-
indexedPct:
|
|
15087
|
+
indexedPct: z52.number()
|
|
15003
15088
|
});
|
|
15004
|
-
var citationsTrendPointSchema =
|
|
15089
|
+
var citationsTrendPointSchema = z52.object({
|
|
15005
15090
|
/** Run ID — anchor for cross-section linking. */
|
|
15006
|
-
runId:
|
|
15091
|
+
runId: z52.string(),
|
|
15007
15092
|
/** ISO timestamp when the run finished (or createdAt fallback). */
|
|
15008
|
-
date:
|
|
15093
|
+
date: z52.string(),
|
|
15009
15094
|
/**
|
|
15010
15095
|
* 0..100 — same per-query unique-cited definition as
|
|
15011
15096
|
* `ReportExecutiveSummary.citationRate`. Stable across runs with different
|
|
15012
15097
|
* provider counts so the trend line measures real movement rather than
|
|
15013
15098
|
* provider-count variance.
|
|
15014
15099
|
*/
|
|
15015
|
-
citationRate:
|
|
15100
|
+
citationRate: z52.number(),
|
|
15016
15101
|
/** Numerator of `citationRate` for this run. */
|
|
15017
|
-
citedQueryCount:
|
|
15102
|
+
citedQueryCount: z52.number(),
|
|
15018
15103
|
/** Denominator of `citationRate` for this run. */
|
|
15019
|
-
totalQueryCount:
|
|
15104
|
+
totalQueryCount: z52.number(),
|
|
15020
15105
|
/** 0..100 — same per-query unique-mentioned definition as `ReportExecutiveSummary.mentionRate`. */
|
|
15021
|
-
mentionRate:
|
|
15106
|
+
mentionRate: z52.number(),
|
|
15022
15107
|
/** Numerator of `mentionRate` for this run. */
|
|
15023
|
-
mentionedQueryCount:
|
|
15108
|
+
mentionedQueryCount: z52.number(),
|
|
15024
15109
|
/**
|
|
15025
15110
|
* Per-provider rates for the same run. Each provider's rate is per-pair
|
|
15026
15111
|
* within that provider (`cited / scanned`), so it remains comparable
|
|
15027
15112
|
* between providers in the same run.
|
|
15028
15113
|
*/
|
|
15029
|
-
providerRates:
|
|
15030
|
-
provider:
|
|
15031
|
-
citationRate:
|
|
15032
|
-
mentionRate:
|
|
15114
|
+
providerRates: z52.array(z52.object({
|
|
15115
|
+
provider: z52.string(),
|
|
15116
|
+
citationRate: z52.number(),
|
|
15117
|
+
mentionRate: z52.number()
|
|
15033
15118
|
}))
|
|
15034
15119
|
});
|
|
15035
|
-
var reportInsightSchema =
|
|
15036
|
-
id:
|
|
15037
|
-
type:
|
|
15038
|
-
severity:
|
|
15039
|
-
title:
|
|
15040
|
-
query:
|
|
15041
|
-
provider:
|
|
15042
|
-
recommendation:
|
|
15043
|
-
createdAt:
|
|
15120
|
+
var reportInsightSchema = z52.object({
|
|
15121
|
+
id: z52.string(),
|
|
15122
|
+
type: z52.enum(["regression", "gain", "opportunity"]),
|
|
15123
|
+
severity: z52.enum(["critical", "high", "medium", "low"]),
|
|
15124
|
+
title: z52.string(),
|
|
15125
|
+
query: z52.string(),
|
|
15126
|
+
provider: z52.string(),
|
|
15127
|
+
recommendation: z52.string().nullable(),
|
|
15128
|
+
createdAt: z52.string(),
|
|
15044
15129
|
/**
|
|
15045
15130
|
* How many times this insight fired across recent runs for the same
|
|
15046
15131
|
* `(query, provider, type)` tuple. Always ≥ 1. Insights returned by the
|
|
@@ -15048,64 +15133,64 @@ var reportInsightSchema = z51.object({
|
|
|
15048
15133
|
* surfacing the multiplicity. Use it directly instead of grouping again
|
|
15049
15134
|
* client-side — counts derived from raw insight rows will overcount.
|
|
15050
15135
|
*/
|
|
15051
|
-
instanceCount:
|
|
15136
|
+
instanceCount: z52.number()
|
|
15052
15137
|
});
|
|
15053
|
-
var recommendedNextStepSchema =
|
|
15138
|
+
var recommendedNextStepSchema = z52.object({
|
|
15054
15139
|
/** 'immediate' | 'short-term' | 'medium-term' — bucketed by severity heuristic. */
|
|
15055
|
-
horizon:
|
|
15056
|
-
title:
|
|
15057
|
-
rationale:
|
|
15140
|
+
horizon: z52.enum(["immediate", "short-term", "medium-term"]),
|
|
15141
|
+
title: z52.string(),
|
|
15142
|
+
rationale: z52.string()
|
|
15058
15143
|
});
|
|
15059
|
-
var reportRateDeltaSchema =
|
|
15144
|
+
var reportRateDeltaSchema = z52.object({
|
|
15060
15145
|
/** Current value (0..100 for rates, raw count otherwise). When `window`
|
|
15061
15146
|
* is present this is the average over the last `window` checks. */
|
|
15062
|
-
current:
|
|
15147
|
+
current: z52.number(),
|
|
15063
15148
|
/** Prior value compared against. When `window` is present this is the
|
|
15064
15149
|
* average over the prior `window` checks before that. */
|
|
15065
|
-
prior:
|
|
15150
|
+
prior: z52.number(),
|
|
15066
15151
|
/** Absolute delta (current − prior). Negative = decrease. */
|
|
15067
|
-
deltaAbs:
|
|
15152
|
+
deltaAbs: z52.number(),
|
|
15068
15153
|
/**
|
|
15069
15154
|
* Signed percent change vs `prior`, rounded to a whole number. Null when
|
|
15070
15155
|
* `prior <= 0` (percentage undefined). Renderers route count/traffic tiles
|
|
15071
15156
|
* through the "smart %" rule — percentage when the prior base is large
|
|
15072
15157
|
* enough (`MIN_PCT_BASE`), otherwise a rounded raw delta.
|
|
15073
15158
|
*/
|
|
15074
|
-
deltaPct:
|
|
15159
|
+
deltaPct: z52.number().nullable(),
|
|
15075
15160
|
/**
|
|
15076
15161
|
* Direction tag for tone mapping. Threshold is metric-specific (3pp for
|
|
15077
15162
|
* rates, 0.5 for counts) so small noise lands as 'flat' rather than
|
|
15078
15163
|
* flipping up/down each run.
|
|
15079
15164
|
*/
|
|
15080
|
-
direction:
|
|
15165
|
+
direction: z52.enum(["up", "down", "flat"]),
|
|
15081
15166
|
/**
|
|
15082
15167
|
* How many points went into each side of the average. Omitted (or 1)
|
|
15083
15168
|
* means point-to-point (legacy "since last check"). Higher values mean
|
|
15084
15169
|
* a rolling-average comparison — renderers should label it as
|
|
15085
15170
|
* "vs prior N checks" when this is ≥ 2.
|
|
15086
15171
|
*/
|
|
15087
|
-
window:
|
|
15172
|
+
window: z52.number().optional()
|
|
15088
15173
|
});
|
|
15089
|
-
var reportProviderMovementSchema =
|
|
15090
|
-
provider:
|
|
15091
|
-
current:
|
|
15092
|
-
prior:
|
|
15093
|
-
deltaAbs:
|
|
15094
|
-
direction:
|
|
15174
|
+
var reportProviderMovementSchema = z52.object({
|
|
15175
|
+
provider: z52.string(),
|
|
15176
|
+
current: z52.number(),
|
|
15177
|
+
prior: z52.number(),
|
|
15178
|
+
deltaAbs: z52.number(),
|
|
15179
|
+
direction: z52.enum(["up", "down", "flat"])
|
|
15095
15180
|
});
|
|
15096
|
-
var whatsChangedSectionSchema =
|
|
15181
|
+
var whatsChangedSectionSchema = z52.object({
|
|
15097
15182
|
/**
|
|
15098
15183
|
* False when there's no prior run (or fewer than the trend baseline),
|
|
15099
15184
|
* meaning all per-metric deltas will be null. Renderers use this to swap
|
|
15100
15185
|
* in a "establishing baseline" fallback rather than rendering empty
|
|
15101
15186
|
* delta tiles.
|
|
15102
15187
|
*/
|
|
15103
|
-
enoughHistory:
|
|
15188
|
+
enoughHistory: z52.boolean(),
|
|
15104
15189
|
/**
|
|
15105
15190
|
* One-sentence narrative summary suitable as a section subtitle.
|
|
15106
15191
|
* Always present — even on baseline, narrates whatever signal exists.
|
|
15107
15192
|
*/
|
|
15108
|
-
headline:
|
|
15193
|
+
headline: z52.string(),
|
|
15109
15194
|
/** Citation rate delta vs the prior completed run. Null when no prior run. */
|
|
15110
15195
|
citationRate: reportRateDeltaSchema.nullable(),
|
|
15111
15196
|
/** Mention rate delta vs the prior completed run. Null when no prior run. */
|
|
@@ -15133,30 +15218,30 @@ var whatsChangedSectionSchema = z51.object({
|
|
|
15133
15218
|
* deltas "vs prior {comparisonWindowDays} days" off this single value so the
|
|
15134
15219
|
* SPA and HTML stay verbatim-identical.
|
|
15135
15220
|
*/
|
|
15136
|
-
comparisonWindowDays:
|
|
15221
|
+
comparisonWindowDays: z52.number().int().positive(),
|
|
15137
15222
|
/**
|
|
15138
15223
|
* Per-provider citation rate movements (latest run vs prior run). Empty
|
|
15139
15224
|
* when no prior run. Sorted by |deltaAbs| desc — providers with the
|
|
15140
15225
|
* biggest swing first.
|
|
15141
15226
|
*/
|
|
15142
|
-
providerMovements:
|
|
15227
|
+
providerMovements: z52.array(reportProviderMovementSchema),
|
|
15143
15228
|
/**
|
|
15144
15229
|
* Top wins this period — gains surfaced by the intelligence engine.
|
|
15145
15230
|
* Capped at 5; sourced from `insights` filtered to `type: 'gain'`.
|
|
15146
15231
|
*/
|
|
15147
|
-
wins:
|
|
15232
|
+
wins: z52.array(reportInsightSchema),
|
|
15148
15233
|
/**
|
|
15149
15234
|
* Top regressions this period — citations or mentions lost. Capped at 5;
|
|
15150
15235
|
* sourced from `insights` filtered to `type: 'regression'`.
|
|
15151
15236
|
*/
|
|
15152
|
-
regressions:
|
|
15153
|
-
});
|
|
15154
|
-
var reportAudienceSchema =
|
|
15155
|
-
var reportActionAudienceSchema =
|
|
15156
|
-
var reportActionHorizonSchema =
|
|
15157
|
-
var reportActionConfidenceSchema =
|
|
15158
|
-
var reportToneSchema =
|
|
15159
|
-
var reportActionCategorySchema =
|
|
15237
|
+
regressions: z52.array(reportInsightSchema)
|
|
15238
|
+
});
|
|
15239
|
+
var reportAudienceSchema = z52.enum(["agency", "client"]);
|
|
15240
|
+
var reportActionAudienceSchema = z52.enum(["agency", "client", "both"]);
|
|
15241
|
+
var reportActionHorizonSchema = z52.enum(["immediate", "short-term", "medium-term"]);
|
|
15242
|
+
var reportActionConfidenceSchema = z52.enum(["high", "medium", "low"]);
|
|
15243
|
+
var reportToneSchema = z52.enum(["positive", "caution", "negative", "neutral"]);
|
|
15244
|
+
var reportActionCategorySchema = z52.enum([
|
|
15160
15245
|
"content",
|
|
15161
15246
|
"competitors",
|
|
15162
15247
|
"provider",
|
|
@@ -15165,23 +15250,23 @@ var reportActionCategorySchema = z51.enum([
|
|
|
15165
15250
|
"location",
|
|
15166
15251
|
"monitoring"
|
|
15167
15252
|
]);
|
|
15168
|
-
var reportActionPlanItemSchema =
|
|
15253
|
+
var reportActionPlanItemSchema = z52.object({
|
|
15169
15254
|
/** Which report audience should see this action. `both` renders in both modes. */
|
|
15170
15255
|
audience: reportActionAudienceSchema,
|
|
15171
15256
|
/** Stable sort priority. Lower numbers render earlier. */
|
|
15172
|
-
priority:
|
|
15257
|
+
priority: z52.number(),
|
|
15173
15258
|
/** When this should be tackled. */
|
|
15174
15259
|
horizon: reportActionHorizonSchema,
|
|
15175
15260
|
category: reportActionCategorySchema,
|
|
15176
|
-
title:
|
|
15261
|
+
title: z52.string(),
|
|
15177
15262
|
/** Direct next step written as an operator/client-friendly imperative. */
|
|
15178
|
-
action:
|
|
15263
|
+
action: z52.string(),
|
|
15179
15264
|
/** Why this matters. Keep each entry concise and evidence-backed. */
|
|
15180
|
-
why:
|
|
15265
|
+
why: z52.array(z52.string()),
|
|
15181
15266
|
/** Specific observations that justify the action. */
|
|
15182
|
-
evidence:
|
|
15267
|
+
evidence: z52.array(z52.string()),
|
|
15183
15268
|
/** What should move if the action worked. */
|
|
15184
|
-
successMetric:
|
|
15269
|
+
successMetric: z52.string(),
|
|
15185
15270
|
/** Confidence in the recommendation based on the available evidence. */
|
|
15186
15271
|
confidence: reportActionConfidenceSchema,
|
|
15187
15272
|
/**
|
|
@@ -15193,23 +15278,23 @@ var reportActionPlanItemSchema = z51.object({
|
|
|
15193
15278
|
* load. Actions sourced from other signals (competitor gaps, indexing
|
|
15194
15279
|
* issues, etc.) omit this and use their own dismiss flows.
|
|
15195
15280
|
*/
|
|
15196
|
-
targetRef:
|
|
15281
|
+
targetRef: z52.string().optional()
|
|
15197
15282
|
});
|
|
15198
|
-
var reportClientSummarySchema =
|
|
15199
|
-
headline:
|
|
15200
|
-
overview:
|
|
15201
|
-
actionItems:
|
|
15202
|
-
confidenceNotes:
|
|
15283
|
+
var reportClientSummarySchema = z52.object({
|
|
15284
|
+
headline: z52.string(),
|
|
15285
|
+
overview: z52.string(),
|
|
15286
|
+
actionItems: z52.array(reportActionPlanItemSchema),
|
|
15287
|
+
confidenceNotes: z52.array(z52.string())
|
|
15203
15288
|
});
|
|
15204
|
-
var reportAgencyDiagnosticSchema =
|
|
15205
|
-
title:
|
|
15206
|
-
detail:
|
|
15207
|
-
severity:
|
|
15208
|
-
evidence:
|
|
15289
|
+
var reportAgencyDiagnosticSchema = z52.object({
|
|
15290
|
+
title: z52.string(),
|
|
15291
|
+
detail: z52.string(),
|
|
15292
|
+
severity: z52.enum(["positive", "caution", "negative", "neutral"]),
|
|
15293
|
+
evidence: z52.array(z52.string())
|
|
15209
15294
|
});
|
|
15210
|
-
var reportAgencyDiagnosticsSchema =
|
|
15211
|
-
priorities:
|
|
15212
|
-
diagnostics:
|
|
15295
|
+
var reportAgencyDiagnosticsSchema = z52.object({
|
|
15296
|
+
priorities: z52.array(reportActionPlanItemSchema),
|
|
15297
|
+
diagnostics: z52.array(reportAgencyDiagnosticSchema)
|
|
15213
15298
|
});
|
|
15214
15299
|
function reportActionTone(action) {
|
|
15215
15300
|
if (action.horizon === "immediate") return "negative";
|
|
@@ -15267,7 +15352,9 @@ function reportConfidenceLabel(confidence) {
|
|
|
15267
15352
|
return "Low";
|
|
15268
15353
|
}
|
|
15269
15354
|
}
|
|
15270
|
-
var projectReportDtoSchema =
|
|
15355
|
+
var projectReportDtoSchema = z52.object({
|
|
15356
|
+
/** Authoritative assignment-aware answer coverage, separated by frozen query class. */
|
|
15357
|
+
visibility: reportVisibilitySchema.optional(),
|
|
15271
15358
|
meta: reportMetaSchema,
|
|
15272
15359
|
executiveSummary: reportExecutiveSummarySchema,
|
|
15273
15360
|
citationScorecard: citationScorecardSchema,
|
|
@@ -15281,16 +15368,16 @@ var projectReportDtoSchema = z51.object({
|
|
|
15281
15368
|
/** Server-side log-evidence visibility (crawls + click-through sessions). Null when no traffic source connected. */
|
|
15282
15369
|
serverActivity: serverActivitySectionSchema.nullable(),
|
|
15283
15370
|
indexingHealth: indexingHealthSectionSchema.nullable(),
|
|
15284
|
-
citationsTrend:
|
|
15371
|
+
citationsTrend: z52.array(citationsTrendPointSchema),
|
|
15285
15372
|
/**
|
|
15286
15373
|
* Trend-focused "what's changed" summary for the report's act 2. Always
|
|
15287
15374
|
* present; renderers gate empty/baseline states via `enoughHistory`.
|
|
15288
15375
|
*/
|
|
15289
15376
|
whatsChanged: whatsChangedSectionSchema,
|
|
15290
|
-
insights:
|
|
15291
|
-
recommendedNextSteps:
|
|
15377
|
+
insights: z52.array(reportInsightSchema),
|
|
15378
|
+
recommendedNextSteps: z52.array(recommendedNextStepSchema),
|
|
15292
15379
|
/** Canonical structured actions shared by the client and agency render modes. */
|
|
15293
|
-
actionPlan:
|
|
15380
|
+
actionPlan: z52.array(reportActionPlanItemSchema),
|
|
15294
15381
|
/** Polished client-facing summary and action shortlist. */
|
|
15295
15382
|
clientSummary: reportClientSummarySchema,
|
|
15296
15383
|
/** Technical, evidence-oriented operator diagnostics for agency mode. */
|
|
@@ -15300,114 +15387,114 @@ var projectReportDtoSchema = z51.object({
|
|
|
15300
15387
|
* intelligence layer (`buildContentTargetRows`). Empty when no run has
|
|
15301
15388
|
* produced candidate queries with demand or competitor signal.
|
|
15302
15389
|
*/
|
|
15303
|
-
contentOpportunities:
|
|
15390
|
+
contentOpportunities: z52.array(contentTargetRowDtoSchema),
|
|
15304
15391
|
/**
|
|
15305
15392
|
* Queries where competitors were cited but the project was not. Sourced
|
|
15306
15393
|
* from `buildContentGapRows`. Empty until the first answer-visibility run.
|
|
15307
15394
|
*/
|
|
15308
|
-
contentGaps:
|
|
15395
|
+
contentGaps: z52.array(contentGapRowDtoSchema),
|
|
15309
15396
|
/**
|
|
15310
15397
|
* Per-query grounding source map (own + competitor cited URLs). Sourced
|
|
15311
15398
|
* from `buildContentSourceRows`. Empty until the first answer-visibility run.
|
|
15312
15399
|
*/
|
|
15313
|
-
groundingSources:
|
|
15400
|
+
groundingSources: z52.array(contentSourceRowDtoSchema)
|
|
15314
15401
|
});
|
|
15315
15402
|
|
|
15316
15403
|
// ../contracts/src/organic-evidence.ts
|
|
15317
|
-
import { z as
|
|
15318
|
-
var organicEvidencePeriodSchema =
|
|
15319
|
-
var cohortNameSchema =
|
|
15320
|
-
var countSchema =
|
|
15321
|
-
clicks:
|
|
15322
|
-
impressions:
|
|
15404
|
+
import { z as z53 } from "zod";
|
|
15405
|
+
var organicEvidencePeriodSchema = z53.union([z53.literal(60), z53.literal(90)]);
|
|
15406
|
+
var cohortNameSchema = z53.enum(["earliest", "middle", "prior", "latest"]);
|
|
15407
|
+
var countSchema = z53.object({
|
|
15408
|
+
clicks: z53.number().int().nonnegative(),
|
|
15409
|
+
impressions: z53.number().int().nonnegative()
|
|
15323
15410
|
});
|
|
15324
|
-
var cohortSchema =
|
|
15411
|
+
var cohortSchema = z53.object({
|
|
15325
15412
|
name: cohortNameSchema,
|
|
15326
|
-
startDate:
|
|
15327
|
-
endDate:
|
|
15413
|
+
startDate: z53.string(),
|
|
15414
|
+
endDate: z53.string()
|
|
15328
15415
|
});
|
|
15329
15416
|
var searchCohortSchema = cohortSchema.extend({ totals: countSchema });
|
|
15330
15417
|
var sessionCohortSchema = cohortSchema.extend({
|
|
15331
|
-
organicSessions:
|
|
15332
|
-
});
|
|
15333
|
-
var sourceCoverageSchema =
|
|
15334
|
-
startDate:
|
|
15335
|
-
endDate:
|
|
15336
|
-
observedDays:
|
|
15337
|
-
});
|
|
15338
|
-
var crawlerCountsSchema =
|
|
15339
|
-
verified:
|
|
15340
|
-
claimedUnverified:
|
|
15341
|
-
unknownAiLike:
|
|
15342
|
-
});
|
|
15343
|
-
var referralCountsSchema =
|
|
15344
|
-
total:
|
|
15345
|
-
paid:
|
|
15346
|
-
organic:
|
|
15347
|
-
unknown:
|
|
15348
|
-
});
|
|
15349
|
-
var organicEvidenceDtoSchema =
|
|
15350
|
-
contractVersion:
|
|
15418
|
+
organicSessions: z53.number().int().nonnegative()
|
|
15419
|
+
});
|
|
15420
|
+
var sourceCoverageSchema = z53.object({
|
|
15421
|
+
startDate: z53.string(),
|
|
15422
|
+
endDate: z53.string(),
|
|
15423
|
+
observedDays: z53.number().int().nonnegative()
|
|
15424
|
+
});
|
|
15425
|
+
var crawlerCountsSchema = z53.object({
|
|
15426
|
+
verified: z53.number().int().nonnegative(),
|
|
15427
|
+
claimedUnverified: z53.number().int().nonnegative(),
|
|
15428
|
+
unknownAiLike: z53.number().int().nonnegative()
|
|
15429
|
+
});
|
|
15430
|
+
var referralCountsSchema = z53.object({
|
|
15431
|
+
total: z53.number().int().nonnegative(),
|
|
15432
|
+
paid: z53.number().int().nonnegative(),
|
|
15433
|
+
organic: z53.number().int().nonnegative(),
|
|
15434
|
+
unknown: z53.number().int().nonnegative()
|
|
15435
|
+
});
|
|
15436
|
+
var organicEvidenceDtoSchema = z53.object({
|
|
15437
|
+
contractVersion: z53.literal("organic-evidence/v1"),
|
|
15351
15438
|
periodDays: organicEvidencePeriodSchema,
|
|
15352
15439
|
/** Latest headline evidence date, preferring the GSC property date when available. */
|
|
15353
|
-
asOfDate:
|
|
15354
|
-
coverage:
|
|
15355
|
-
gsc:
|
|
15356
|
-
ga4:
|
|
15357
|
-
server:
|
|
15358
|
-
visibility:
|
|
15440
|
+
asOfDate: z53.string().nullable(),
|
|
15441
|
+
coverage: z53.object({
|
|
15442
|
+
gsc: z53.boolean(),
|
|
15443
|
+
ga4: z53.boolean(),
|
|
15444
|
+
server: z53.boolean(),
|
|
15445
|
+
visibility: z53.boolean()
|
|
15359
15446
|
}),
|
|
15360
|
-
sourceCoverage:
|
|
15447
|
+
sourceCoverage: z53.object({
|
|
15361
15448
|
gsc: sourceCoverageSchema.nullable(),
|
|
15362
15449
|
ga4: sourceCoverageSchema.nullable(),
|
|
15363
15450
|
server: sourceCoverageSchema.nullable(),
|
|
15364
|
-
visibility:
|
|
15451
|
+
visibility: z53.object({ completedAt: z53.string(), ageDays: z53.number().nonnegative() }).nullable()
|
|
15365
15452
|
}),
|
|
15366
|
-
gsc:
|
|
15453
|
+
gsc: z53.object({
|
|
15367
15454
|
propertyTotals: countSchema,
|
|
15368
15455
|
namedBrand: countSchema,
|
|
15369
15456
|
namedNonBrand: countSchema,
|
|
15370
15457
|
suppressedOrUnreportedResidual: countSchema,
|
|
15371
|
-
cohorts:
|
|
15458
|
+
cohorts: z53.array(searchCohortSchema)
|
|
15372
15459
|
}).nullable(),
|
|
15373
|
-
ga4:
|
|
15374
|
-
organicSessions:
|
|
15375
|
-
cohorts:
|
|
15460
|
+
ga4: z53.object({
|
|
15461
|
+
organicSessions: z53.number().int().nonnegative(),
|
|
15462
|
+
cohorts: z53.array(sessionCohortSchema)
|
|
15376
15463
|
}).nullable(),
|
|
15377
|
-
gaAiReferrals:
|
|
15378
|
-
paidSessions:
|
|
15379
|
-
organicSessions:
|
|
15464
|
+
gaAiReferrals: z53.object({
|
|
15465
|
+
paidSessions: z53.number().int().nonnegative(),
|
|
15466
|
+
organicSessions: z53.number().int().nonnegative()
|
|
15380
15467
|
}).nullable(),
|
|
15381
|
-
server:
|
|
15468
|
+
server: z53.object({
|
|
15382
15469
|
crawlerHits: crawlerCountsSchema,
|
|
15383
15470
|
userFetchHits: crawlerCountsSchema,
|
|
15384
15471
|
referralSessions: referralCountsSchema
|
|
15385
15472
|
}).nullable(),
|
|
15386
|
-
visibility:
|
|
15387
|
-
runId:
|
|
15388
|
-
completedAt:
|
|
15389
|
-
ageDays:
|
|
15390
|
-
answerPairs:
|
|
15391
|
-
mentionedPairs:
|
|
15392
|
-
citedPairs:
|
|
15473
|
+
visibility: z53.object({
|
|
15474
|
+
runId: z53.string(),
|
|
15475
|
+
completedAt: z53.string(),
|
|
15476
|
+
ageDays: z53.number().nonnegative(),
|
|
15477
|
+
answerPairs: z53.number().int().nonnegative(),
|
|
15478
|
+
mentionedPairs: z53.number().int().nonnegative(),
|
|
15479
|
+
citedPairs: z53.number().int().nonnegative()
|
|
15393
15480
|
}).nullable(),
|
|
15394
15481
|
measurement: gaMeasurementAnalysisDtoSchema,
|
|
15395
|
-
pages:
|
|
15396
|
-
path:
|
|
15482
|
+
pages: z53.array(z53.object({
|
|
15483
|
+
path: z53.string(),
|
|
15397
15484
|
gsc: countSchema,
|
|
15398
|
-
ga4OrganicSessions:
|
|
15399
|
-
server:
|
|
15485
|
+
ga4OrganicSessions: z53.number().int().nonnegative(),
|
|
15486
|
+
server: z53.object({
|
|
15400
15487
|
crawlerHits: crawlerCountsSchema,
|
|
15401
15488
|
userFetchHits: crawlerCountsSchema,
|
|
15402
15489
|
referralSessions: referralCountsSchema
|
|
15403
15490
|
})
|
|
15404
15491
|
})),
|
|
15405
|
-
findings:
|
|
15406
|
-
tone:
|
|
15407
|
-
title:
|
|
15408
|
-
detail:
|
|
15492
|
+
findings: z53.array(z53.object({
|
|
15493
|
+
tone: z53.enum(["positive", "caution", "neutral"]),
|
|
15494
|
+
title: z53.string(),
|
|
15495
|
+
detail: z53.string()
|
|
15409
15496
|
})),
|
|
15410
|
-
limitations:
|
|
15497
|
+
limitations: z53.array(z53.object({ code: z53.string(), detail: z53.string() }))
|
|
15411
15498
|
});
|
|
15412
15499
|
|
|
15413
15500
|
// ../contracts/src/report-dedup.ts
|
|
@@ -15478,10 +15565,10 @@ function dedupeReportOpportunities(report) {
|
|
|
15478
15565
|
}
|
|
15479
15566
|
|
|
15480
15567
|
// ../contracts/src/skills.ts
|
|
15481
|
-
import { z as
|
|
15482
|
-
var codingAgentSchema =
|
|
15568
|
+
import { z as z54 } from "zod";
|
|
15569
|
+
var codingAgentSchema = z54.enum(["claude", "codex"]);
|
|
15483
15570
|
var CodingAgents = codingAgentSchema.enum;
|
|
15484
|
-
var skillsClientSchema =
|
|
15571
|
+
var skillsClientSchema = z54.enum(["claude", "codex", "all"]);
|
|
15485
15572
|
var SkillsClients = skillsClientSchema.enum;
|
|
15486
15573
|
var SKILL_MANIFEST_FILENAME = ".canonry-skill-manifest.json";
|
|
15487
15574
|
function classifySkillFile(params) {
|
|
@@ -15499,22 +15586,22 @@ function coerceSkillManifest(parsed) {
|
|
|
15499
15586
|
}
|
|
15500
15587
|
|
|
15501
15588
|
// ../contracts/src/traffic.ts
|
|
15502
|
-
import { z as
|
|
15503
|
-
var trafficCrawlerSegmentsSchema =
|
|
15504
|
-
content:
|
|
15505
|
-
sitemap:
|
|
15506
|
-
robots:
|
|
15507
|
-
asset:
|
|
15508
|
-
other:
|
|
15509
|
-
});
|
|
15510
|
-
var trafficPathClassSchema =
|
|
15589
|
+
import { z as z55 } from "zod";
|
|
15590
|
+
var trafficCrawlerSegmentsSchema = z55.object({
|
|
15591
|
+
content: z55.number().int().nonnegative(),
|
|
15592
|
+
sitemap: z55.number().int().nonnegative(),
|
|
15593
|
+
robots: z55.number().int().nonnegative(),
|
|
15594
|
+
asset: z55.number().int().nonnegative(),
|
|
15595
|
+
other: z55.number().int().nonnegative()
|
|
15596
|
+
});
|
|
15597
|
+
var trafficPathClassSchema = z55.enum([
|
|
15511
15598
|
"content",
|
|
15512
15599
|
"sitemap",
|
|
15513
15600
|
"robots",
|
|
15514
15601
|
"asset",
|
|
15515
15602
|
"other"
|
|
15516
15603
|
]);
|
|
15517
|
-
var trafficSourceTypeSchema =
|
|
15604
|
+
var trafficSourceTypeSchema = z55.enum([
|
|
15518
15605
|
"cloud-run",
|
|
15519
15606
|
"wordpress",
|
|
15520
15607
|
"cloudflare",
|
|
@@ -15522,7 +15609,7 @@ var trafficSourceTypeSchema = z54.enum([
|
|
|
15522
15609
|
"generic-log"
|
|
15523
15610
|
]);
|
|
15524
15611
|
var TrafficSourceTypes = trafficSourceTypeSchema.enum;
|
|
15525
|
-
var trafficAdapterCapabilitySchema =
|
|
15612
|
+
var trafficAdapterCapabilitySchema = z55.enum([
|
|
15526
15613
|
"raw-request-events",
|
|
15527
15614
|
"aggregate-request-metrics",
|
|
15528
15615
|
"request-url",
|
|
@@ -15533,87 +15620,87 @@ var trafficAdapterCapabilitySchema = z54.enum([
|
|
|
15533
15620
|
"cursor-pull"
|
|
15534
15621
|
]);
|
|
15535
15622
|
var TrafficAdapterCapabilities = trafficAdapterCapabilitySchema.enum;
|
|
15536
|
-
var trafficEvidenceKindSchema =
|
|
15623
|
+
var trafficEvidenceKindSchema = z55.enum(["raw-request", "aggregate-bucket"]);
|
|
15537
15624
|
var TrafficEvidenceKinds = trafficEvidenceKindSchema.enum;
|
|
15538
|
-
var trafficEventConfidenceSchema =
|
|
15625
|
+
var trafficEventConfidenceSchema = z55.enum(["observed", "provider-aggregated", "inferred"]);
|
|
15539
15626
|
var TrafficEventConfidences = trafficEventConfidenceSchema.enum;
|
|
15540
|
-
var trafficProviderResourceSchema =
|
|
15541
|
-
type:
|
|
15542
|
-
labels:
|
|
15627
|
+
var trafficProviderResourceSchema = z55.object({
|
|
15628
|
+
type: z55.string().nullable(),
|
|
15629
|
+
labels: z55.record(z55.string(), z55.string())
|
|
15543
15630
|
});
|
|
15544
|
-
var normalizedTrafficRequestSchema =
|
|
15631
|
+
var normalizedTrafficRequestSchema = z55.object({
|
|
15545
15632
|
sourceType: trafficSourceTypeSchema,
|
|
15546
|
-
evidenceKind:
|
|
15547
|
-
confidence:
|
|
15548
|
-
eventId:
|
|
15549
|
-
observedAt:
|
|
15550
|
-
method:
|
|
15551
|
-
requestUrl:
|
|
15552
|
-
host:
|
|
15553
|
-
path:
|
|
15554
|
-
queryString:
|
|
15555
|
-
status:
|
|
15556
|
-
userAgent:
|
|
15557
|
-
remoteIp:
|
|
15558
|
-
referer:
|
|
15559
|
-
latencyMs:
|
|
15560
|
-
requestSizeBytes:
|
|
15561
|
-
responseSizeBytes:
|
|
15633
|
+
evidenceKind: z55.literal(TrafficEvidenceKinds["raw-request"]),
|
|
15634
|
+
confidence: z55.literal(TrafficEventConfidences.observed),
|
|
15635
|
+
eventId: z55.string().min(1),
|
|
15636
|
+
observedAt: z55.string().min(1),
|
|
15637
|
+
method: z55.string().nullable(),
|
|
15638
|
+
requestUrl: z55.string().nullable(),
|
|
15639
|
+
host: z55.string().nullable(),
|
|
15640
|
+
path: z55.string().min(1),
|
|
15641
|
+
queryString: z55.string().nullable(),
|
|
15642
|
+
status: z55.number().int().nullable(),
|
|
15643
|
+
userAgent: z55.string().nullable(),
|
|
15644
|
+
remoteIp: z55.string().nullable(),
|
|
15645
|
+
referer: z55.string().nullable(),
|
|
15646
|
+
latencyMs: z55.number().nullable(),
|
|
15647
|
+
requestSizeBytes: z55.number().int().nullable(),
|
|
15648
|
+
responseSizeBytes: z55.number().int().nullable(),
|
|
15562
15649
|
providerResource: trafficProviderResourceSchema,
|
|
15563
|
-
providerLabels:
|
|
15650
|
+
providerLabels: z55.record(z55.string(), z55.string())
|
|
15564
15651
|
});
|
|
15565
|
-
var normalizedTrafficPullPageSchema =
|
|
15566
|
-
events:
|
|
15567
|
-
rawEntryCount:
|
|
15568
|
-
skippedEntryCount:
|
|
15569
|
-
nextPageToken:
|
|
15570
|
-
filter:
|
|
15652
|
+
var normalizedTrafficPullPageSchema = z55.object({
|
|
15653
|
+
events: z55.array(normalizedTrafficRequestSchema),
|
|
15654
|
+
rawEntryCount: z55.number().int().nonnegative(),
|
|
15655
|
+
skippedEntryCount: z55.number().int().nonnegative(),
|
|
15656
|
+
nextPageToken: z55.string().optional(),
|
|
15657
|
+
filter: z55.string()
|
|
15571
15658
|
});
|
|
15572
|
-
var trafficSourceStatusSchema =
|
|
15659
|
+
var trafficSourceStatusSchema = z55.enum(["connected", "paused", "error", "archived"]);
|
|
15573
15660
|
var TrafficSourceStatuses = trafficSourceStatusSchema.enum;
|
|
15574
|
-
var trafficSourceAuthModeSchema =
|
|
15661
|
+
var trafficSourceAuthModeSchema = z55.enum(["oauth", "service-account"]);
|
|
15575
15662
|
var TrafficSourceAuthModes = trafficSourceAuthModeSchema.enum;
|
|
15576
|
-
var verificationStatusSchema =
|
|
15663
|
+
var verificationStatusSchema = z55.enum(["verified", "claimed_unverified", "unknown_ai_like"]);
|
|
15577
15664
|
var VerificationStatuses = verificationStatusSchema.enum;
|
|
15578
|
-
var trafficVerificationManifestSchema =
|
|
15665
|
+
var trafficVerificationManifestSchema = z55.object({
|
|
15579
15666
|
/** Stable identity: source + publisher version + canonical prefix-content digest. */
|
|
15580
|
-
id:
|
|
15581
|
-
source:
|
|
15582
|
-
version:
|
|
15667
|
+
id: z55.string().min(1),
|
|
15668
|
+
source: z55.string().min(1),
|
|
15669
|
+
version: z55.string().min(1)
|
|
15583
15670
|
});
|
|
15584
|
-
var trafficVerificationManifestUsageSchema =
|
|
15585
|
-
manifestId:
|
|
15671
|
+
var trafficVerificationManifestUsageSchema = z55.object({
|
|
15672
|
+
manifestId: z55.string().min(1),
|
|
15586
15673
|
manifest: trafficVerificationManifestSchema.nullable(),
|
|
15587
|
-
hits:
|
|
15674
|
+
hits: z55.number().int().nonnegative()
|
|
15588
15675
|
});
|
|
15589
|
-
var cloudRunSourceConfigSchema =
|
|
15590
|
-
gcpProjectId:
|
|
15591
|
-
serviceName:
|
|
15592
|
-
location:
|
|
15676
|
+
var cloudRunSourceConfigSchema = z55.object({
|
|
15677
|
+
gcpProjectId: z55.string().min(1),
|
|
15678
|
+
serviceName: z55.string().nullable().optional(),
|
|
15679
|
+
location: z55.string().nullable().optional(),
|
|
15593
15680
|
authMode: trafficSourceAuthModeSchema
|
|
15594
15681
|
});
|
|
15595
|
-
var wordpressTrafficSourceConfigSchema =
|
|
15596
|
-
baseUrl:
|
|
15597
|
-
username:
|
|
15682
|
+
var wordpressTrafficSourceConfigSchema = z55.object({
|
|
15683
|
+
baseUrl: z55.string().url(),
|
|
15684
|
+
username: z55.string().min(1)
|
|
15598
15685
|
});
|
|
15599
|
-
var vercelTrafficEnvironmentSchema =
|
|
15686
|
+
var vercelTrafficEnvironmentSchema = z55.enum(["production", "preview"]);
|
|
15600
15687
|
var VercelTrafficEnvironments = vercelTrafficEnvironmentSchema.enum;
|
|
15601
|
-
var vercelTrafficSourceConfigSchema =
|
|
15688
|
+
var vercelTrafficSourceConfigSchema = z55.object({
|
|
15602
15689
|
/** Vercel project id (e.g. `prj_...`). */
|
|
15603
|
-
projectId:
|
|
15690
|
+
projectId: z55.string().min(1),
|
|
15604
15691
|
/** Vercel team or account id: the org that owns the project. */
|
|
15605
|
-
teamId:
|
|
15692
|
+
teamId: z55.string().min(1),
|
|
15606
15693
|
environment: vercelTrafficEnvironmentSchema
|
|
15607
15694
|
});
|
|
15608
|
-
var trafficSourceDtoSchema =
|
|
15609
|
-
id:
|
|
15610
|
-
projectId:
|
|
15695
|
+
var trafficSourceDtoSchema = z55.object({
|
|
15696
|
+
id: z55.string(),
|
|
15697
|
+
projectId: z55.string(),
|
|
15611
15698
|
sourceType: trafficSourceTypeSchema,
|
|
15612
|
-
displayName:
|
|
15699
|
+
displayName: z55.string(),
|
|
15613
15700
|
status: trafficSourceStatusSchema,
|
|
15614
|
-
lastSyncedAt:
|
|
15615
|
-
lastCursor:
|
|
15616
|
-
lastError:
|
|
15701
|
+
lastSyncedAt: z55.string().nullable(),
|
|
15702
|
+
lastCursor: z55.string().nullable(),
|
|
15703
|
+
lastError: z55.string().nullable(),
|
|
15617
15704
|
/**
|
|
15618
15705
|
* Newest instant a sync clamped past instead of ingesting, or null when no
|
|
15619
15706
|
* skip is outstanding. Non-null means this source has a known gap in its
|
|
@@ -15622,226 +15709,226 @@ var trafficSourceDtoSchema = z54.object({
|
|
|
15622
15709
|
* what the skipping sync did. WordPress generic replace-mode backfill is
|
|
15623
15710
|
* deliberately unavailable because the retained feed cannot prove coverage.
|
|
15624
15711
|
*/
|
|
15625
|
-
skippedThroughAt:
|
|
15712
|
+
skippedThroughAt: z55.string().nullable(),
|
|
15626
15713
|
/** Residual Cloudflare Queue depth reported by the most recent bounded pull. */
|
|
15627
|
-
queueBacklogCount:
|
|
15714
|
+
queueBacklogCount: z55.number().int().nonnegative().nullable(),
|
|
15628
15715
|
/** Instant at which `queueBacklogCount` was observed, or null before the first pull. */
|
|
15629
|
-
queueBacklogObservedAt:
|
|
15630
|
-
archivedAt:
|
|
15631
|
-
config:
|
|
15632
|
-
createdAt:
|
|
15633
|
-
updatedAt:
|
|
15634
|
-
});
|
|
15635
|
-
var trafficConnectCloudRunRequestSchema =
|
|
15636
|
-
gcpProjectId:
|
|
15637
|
-
serviceName:
|
|
15638
|
-
location:
|
|
15639
|
-
displayName:
|
|
15716
|
+
queueBacklogObservedAt: z55.string().nullable(),
|
|
15717
|
+
archivedAt: z55.string().nullable(),
|
|
15718
|
+
config: z55.record(z55.string(), z55.unknown()),
|
|
15719
|
+
createdAt: z55.string(),
|
|
15720
|
+
updatedAt: z55.string()
|
|
15721
|
+
});
|
|
15722
|
+
var trafficConnectCloudRunRequestSchema = z55.object({
|
|
15723
|
+
gcpProjectId: z55.string().min(1),
|
|
15724
|
+
serviceName: z55.string().min(1).optional(),
|
|
15725
|
+
location: z55.string().min(1).optional(),
|
|
15726
|
+
displayName: z55.string().min(1).optional(),
|
|
15640
15727
|
/** Service-account JSON content (string). When omitted, defaults to OAuth via `canonry google connect <project> --type ga4` flow. */
|
|
15641
|
-
keyJson:
|
|
15728
|
+
keyJson: z55.string().optional()
|
|
15642
15729
|
});
|
|
15643
|
-
var trafficConnectWordpressRequestSchema =
|
|
15644
|
-
baseUrl:
|
|
15645
|
-
username:
|
|
15730
|
+
var trafficConnectWordpressRequestSchema = z55.object({
|
|
15731
|
+
baseUrl: z55.string().url(),
|
|
15732
|
+
username: z55.string().min(1),
|
|
15646
15733
|
/** WordPress Application Password (the same auth used by the content client). */
|
|
15647
|
-
applicationPassword:
|
|
15648
|
-
displayName:
|
|
15734
|
+
applicationPassword: z55.string().min(1),
|
|
15735
|
+
displayName: z55.string().min(1).optional()
|
|
15649
15736
|
});
|
|
15650
|
-
var trafficConnectVercelRequestSchema =
|
|
15737
|
+
var trafficConnectVercelRequestSchema = z55.object({
|
|
15651
15738
|
/** Vercel project id (e.g. `prj_...`) — from the Vercel dashboard or `.vercel/project.json`. */
|
|
15652
|
-
projectId:
|
|
15739
|
+
projectId: z55.string().min(1),
|
|
15653
15740
|
/** Vercel team or account id: the org that owns the project ("orgId" in .vercel/project.json). */
|
|
15654
|
-
teamId:
|
|
15741
|
+
teamId: z55.string().min(1),
|
|
15655
15742
|
/** Vercel personal access token. Stored in `~/.canonry/config.yaml`, never the DB. */
|
|
15656
|
-
token:
|
|
15743
|
+
token: z55.string().min(1),
|
|
15657
15744
|
/** Which deployment environment's request logs to pull. Default: `production`. */
|
|
15658
15745
|
environment: vercelTrafficEnvironmentSchema.optional(),
|
|
15659
|
-
displayName:
|
|
15746
|
+
displayName: z55.string().min(1).optional()
|
|
15660
15747
|
});
|
|
15661
|
-
var cloudflareTrafficDeliveryModeSchema =
|
|
15748
|
+
var cloudflareTrafficDeliveryModeSchema = z55.enum(["direct-push", "queue-pull"]);
|
|
15662
15749
|
var CloudflareTrafficDeliveryModes = cloudflareTrafficDeliveryModeSchema.enum;
|
|
15663
|
-
var cloudflareQueueNameSchema =
|
|
15750
|
+
var cloudflareQueueNameSchema = z55.string().regex(
|
|
15664
15751
|
/^(?=.{1,63}$)[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
|
|
15665
15752
|
"Cloudflare Queue name must be 1-63 characters, use only letters, numbers, or dashes, and start and end with a letter or number"
|
|
15666
15753
|
);
|
|
15667
|
-
var cloudflareTrafficSourceBaseSchema =
|
|
15668
|
-
schemaVersion:
|
|
15754
|
+
var cloudflareTrafficSourceBaseSchema = z55.object({
|
|
15755
|
+
schemaVersion: z55.literal(1),
|
|
15669
15756
|
/** Semver of the Worker script bundle that was generated at connect/rotate time. */
|
|
15670
|
-
workerVersion:
|
|
15757
|
+
workerVersion: z55.string().min(1),
|
|
15671
15758
|
/** Identifier of the bot/referer keyword set baked into the deployed Worker. */
|
|
15672
|
-
expectedBotListVersion:
|
|
15759
|
+
expectedBotListVersion: z55.string().min(1),
|
|
15673
15760
|
/** Target Cloudflare zone for the operator-managed Worker route. */
|
|
15674
|
-
zoneId:
|
|
15761
|
+
zoneId: z55.string().nullable()
|
|
15675
15762
|
});
|
|
15676
15763
|
var cloudflareDirectPushTrafficSourceConfigSchema = cloudflareTrafficSourceBaseSchema.extend({
|
|
15677
|
-
deliveryMode:
|
|
15764
|
+
deliveryMode: z55.literal(CloudflareTrafficDeliveryModes["direct-push"]),
|
|
15678
15765
|
/** Cloudflare account id used to target the correct account during Wrangler deploy. */
|
|
15679
|
-
accountId:
|
|
15766
|
+
accountId: z55.string().nullable()
|
|
15680
15767
|
});
|
|
15681
15768
|
var cloudflareQueuePullTrafficSourceConfigSchema = cloudflareTrafficSourceBaseSchema.extend({
|
|
15682
|
-
deliveryMode:
|
|
15769
|
+
deliveryMode: z55.literal(CloudflareTrafficDeliveryModes["queue-pull"]),
|
|
15683
15770
|
/** Cloudflare account that owns the Queue. */
|
|
15684
|
-
accountId:
|
|
15771
|
+
accountId: z55.string().min(1),
|
|
15685
15772
|
/** Cloudflare Queue id used by Canonry's pull consumer. */
|
|
15686
|
-
queueId:
|
|
15773
|
+
queueId: z55.string().min(1),
|
|
15687
15774
|
/** Queue producer binding target written to the generated Wrangler file. */
|
|
15688
15775
|
queueName: cloudflareQueueNameSchema,
|
|
15689
15776
|
/** Operator-recorded Queue retention for configuration drift checks. */
|
|
15690
|
-
retentionSeconds:
|
|
15777
|
+
retentionSeconds: z55.number().int().min(60).max(1209600)
|
|
15691
15778
|
});
|
|
15692
15779
|
function defaultCloudflareDeliveryMode(value) {
|
|
15693
15780
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return value;
|
|
15694
15781
|
const record = value;
|
|
15695
15782
|
return "deliveryMode" in record ? value : { ...record, deliveryMode: "direct-push" };
|
|
15696
15783
|
}
|
|
15697
|
-
var cloudflareTrafficSourceConfigSchema =
|
|
15784
|
+
var cloudflareTrafficSourceConfigSchema = z55.preprocess(
|
|
15698
15785
|
defaultCloudflareDeliveryMode,
|
|
15699
|
-
|
|
15786
|
+
z55.discriminatedUnion("deliveryMode", [
|
|
15700
15787
|
cloudflareDirectPushTrafficSourceConfigSchema,
|
|
15701
15788
|
cloudflareQueuePullTrafficSourceConfigSchema
|
|
15702
15789
|
])
|
|
15703
15790
|
);
|
|
15704
|
-
var trafficConnectCloudflareBaseRequestSchema =
|
|
15705
|
-
displayName:
|
|
15791
|
+
var trafficConnectCloudflareBaseRequestSchema = z55.object({
|
|
15792
|
+
displayName: z55.string().min(1).optional(),
|
|
15706
15793
|
/** Target Cloudflare zone. Canonry does not validate it against Cloudflare. */
|
|
15707
|
-
zoneId:
|
|
15794
|
+
zoneId: z55.string().min(1).optional()
|
|
15708
15795
|
});
|
|
15709
15796
|
var trafficConnectCloudflareDirectPushRequestSchema = trafficConnectCloudflareBaseRequestSchema.extend({
|
|
15710
|
-
deliveryMode:
|
|
15797
|
+
deliveryMode: z55.literal(CloudflareTrafficDeliveryModes["direct-push"]),
|
|
15711
15798
|
/** Cloudflare account id. Set it when Wrangler can access more than one account. */
|
|
15712
|
-
accountId:
|
|
15799
|
+
accountId: z55.string().min(1).optional()
|
|
15713
15800
|
});
|
|
15714
15801
|
var trafficConnectCloudflareQueuePullRequestSchema = trafficConnectCloudflareBaseRequestSchema.extend({
|
|
15715
|
-
deliveryMode:
|
|
15716
|
-
accountId:
|
|
15717
|
-
queueId:
|
|
15802
|
+
deliveryMode: z55.literal(CloudflareTrafficDeliveryModes["queue-pull"]),
|
|
15803
|
+
accountId: z55.string().min(1),
|
|
15804
|
+
queueId: z55.string().min(1),
|
|
15718
15805
|
queueName: cloudflareQueueNameSchema,
|
|
15719
|
-
retentionSeconds:
|
|
15806
|
+
retentionSeconds: z55.number().int().min(60).max(1209600),
|
|
15720
15807
|
/** Queue pull token; secret-store only, never persisted in configJson or returned. */
|
|
15721
|
-
apiToken:
|
|
15808
|
+
apiToken: z55.string().min(1)
|
|
15722
15809
|
});
|
|
15723
|
-
var trafficConnectCloudflareRequestSchema =
|
|
15810
|
+
var trafficConnectCloudflareRequestSchema = z55.preprocess(
|
|
15724
15811
|
defaultCloudflareDeliveryMode,
|
|
15725
|
-
|
|
15812
|
+
z55.discriminatedUnion("deliveryMode", [
|
|
15726
15813
|
trafficConnectCloudflareDirectPushRequestSchema,
|
|
15727
15814
|
trafficConnectCloudflareQueuePullRequestSchema
|
|
15728
15815
|
])
|
|
15729
15816
|
);
|
|
15730
|
-
var trafficConnectCloudflareResponseBaseSchema =
|
|
15731
|
-
sourceId:
|
|
15732
|
-
workerScript:
|
|
15733
|
-
wranglerToml:
|
|
15734
|
-
workerVersion:
|
|
15735
|
-
instructions:
|
|
15817
|
+
var trafficConnectCloudflareResponseBaseSchema = z55.object({
|
|
15818
|
+
sourceId: z55.string().min(1),
|
|
15819
|
+
workerScript: z55.string().min(1),
|
|
15820
|
+
wranglerToml: z55.string().min(1),
|
|
15821
|
+
workerVersion: z55.string().min(1),
|
|
15822
|
+
instructions: z55.string().min(1)
|
|
15736
15823
|
});
|
|
15737
15824
|
var trafficConnectCloudflareDirectPushResponseSchema = trafficConnectCloudflareResponseBaseSchema.extend({
|
|
15738
|
-
deliveryMode:
|
|
15739
|
-
activationRequired:
|
|
15825
|
+
deliveryMode: z55.literal(CloudflareTrafficDeliveryModes["direct-push"]),
|
|
15826
|
+
activationRequired: z55.boolean().default(false)
|
|
15740
15827
|
});
|
|
15741
15828
|
var trafficConnectCloudflareQueuePullResponseSchema = trafficConnectCloudflareResponseBaseSchema.extend({
|
|
15742
|
-
deliveryMode:
|
|
15743
|
-
activationRequired:
|
|
15744
|
-
accountId:
|
|
15745
|
-
queueId:
|
|
15829
|
+
deliveryMode: z55.literal(CloudflareTrafficDeliveryModes["queue-pull"]),
|
|
15830
|
+
activationRequired: z55.boolean().default(false),
|
|
15831
|
+
accountId: z55.string().min(1),
|
|
15832
|
+
queueId: z55.string().min(1),
|
|
15746
15833
|
queueName: cloudflareQueueNameSchema,
|
|
15747
|
-
retentionSeconds:
|
|
15834
|
+
retentionSeconds: z55.number().int().min(60).max(1209600)
|
|
15748
15835
|
});
|
|
15749
|
-
var trafficConnectCloudflareResponseSchema =
|
|
15836
|
+
var trafficConnectCloudflareResponseSchema = z55.discriminatedUnion("deliveryMode", [
|
|
15750
15837
|
trafficConnectCloudflareDirectPushResponseSchema,
|
|
15751
15838
|
trafficConnectCloudflareQueuePullResponseSchema
|
|
15752
15839
|
]);
|
|
15753
|
-
var cloudflareEdgeEventSchema =
|
|
15840
|
+
var cloudflareEdgeEventSchema = z55.object({
|
|
15754
15841
|
/** Cloudflare `cf-ray` request id — globally unique per request. */
|
|
15755
|
-
eventId:
|
|
15756
|
-
observedAt:
|
|
15757
|
-
method:
|
|
15758
|
-
host:
|
|
15759
|
-
path:
|
|
15760
|
-
queryString:
|
|
15761
|
-
status:
|
|
15762
|
-
userAgent:
|
|
15763
|
-
remoteIp:
|
|
15764
|
-
referer:
|
|
15765
|
-
cf:
|
|
15766
|
-
verifiedBot:
|
|
15767
|
-
botScore:
|
|
15768
|
-
country:
|
|
15769
|
-
asn:
|
|
15770
|
-
asOrganization:
|
|
15842
|
+
eventId: z55.string().min(1),
|
|
15843
|
+
observedAt: z55.string().datetime(),
|
|
15844
|
+
method: z55.string().nullable(),
|
|
15845
|
+
host: z55.string().nullable(),
|
|
15846
|
+
path: z55.string().min(1),
|
|
15847
|
+
queryString: z55.string().nullable(),
|
|
15848
|
+
status: z55.number().int().nullable(),
|
|
15849
|
+
userAgent: z55.string().nullable(),
|
|
15850
|
+
remoteIp: z55.string().nullable(),
|
|
15851
|
+
referer: z55.string().nullable(),
|
|
15852
|
+
cf: z55.object({
|
|
15853
|
+
verifiedBot: z55.boolean().nullable(),
|
|
15854
|
+
botScore: z55.number().int().nullable(),
|
|
15855
|
+
country: z55.string().nullable(),
|
|
15856
|
+
asn: z55.number().int().nullable(),
|
|
15857
|
+
asOrganization: z55.string().nullable()
|
|
15771
15858
|
}).nullable()
|
|
15772
15859
|
});
|
|
15773
|
-
var cloudflareEdgeEventBatchSchema =
|
|
15774
|
-
schemaVersion:
|
|
15775
|
-
workerVersion:
|
|
15776
|
-
events:
|
|
15860
|
+
var cloudflareEdgeEventBatchSchema = z55.object({
|
|
15861
|
+
schemaVersion: z55.literal(1),
|
|
15862
|
+
workerVersion: z55.string().min(1),
|
|
15863
|
+
events: z55.array(cloudflareEdgeEventSchema).min(1).max(100)
|
|
15777
15864
|
});
|
|
15778
15865
|
var cloudflareWorkerIngestRequestSchema = cloudflareEdgeEventBatchSchema;
|
|
15779
|
-
var cloudflareWorkerIngestResponseSchema =
|
|
15780
|
-
acceptedEvents:
|
|
15781
|
-
droppedEvents:
|
|
15782
|
-
workerVersionAck:
|
|
15783
|
-
crawlerBucketRows:
|
|
15784
|
-
aiUserFetchBucketRows:
|
|
15785
|
-
aiReferralBucketRows:
|
|
15786
|
-
sampleRows:
|
|
15787
|
-
});
|
|
15788
|
-
var trafficSyncResponseSchema =
|
|
15789
|
-
sourceId:
|
|
15790
|
-
runId:
|
|
15791
|
-
syncedAt:
|
|
15792
|
-
pulledEvents:
|
|
15866
|
+
var cloudflareWorkerIngestResponseSchema = z55.object({
|
|
15867
|
+
acceptedEvents: z55.number().int(),
|
|
15868
|
+
droppedEvents: z55.number().int(),
|
|
15869
|
+
workerVersionAck: z55.string(),
|
|
15870
|
+
crawlerBucketRows: z55.number().int(),
|
|
15871
|
+
aiUserFetchBucketRows: z55.number().int(),
|
|
15872
|
+
aiReferralBucketRows: z55.number().int(),
|
|
15873
|
+
sampleRows: z55.number().int()
|
|
15874
|
+
});
|
|
15875
|
+
var trafficSyncResponseSchema = z55.object({
|
|
15876
|
+
sourceId: z55.string(),
|
|
15877
|
+
runId: z55.string(),
|
|
15878
|
+
syncedAt: z55.string(),
|
|
15879
|
+
pulledEvents: z55.number().int().nonnegative(),
|
|
15793
15880
|
/** Self-traffic events (Canonry's own tooling) dropped before rollup. */
|
|
15794
|
-
selfTrafficExcluded:
|
|
15795
|
-
crawlerHits:
|
|
15796
|
-
aiUserFetchHits:
|
|
15797
|
-
aiReferralHits:
|
|
15798
|
-
unknownHits:
|
|
15799
|
-
crawlerBucketRows:
|
|
15800
|
-
aiUserFetchBucketRows:
|
|
15801
|
-
aiReferralBucketRows:
|
|
15802
|
-
sampleRows:
|
|
15881
|
+
selfTrafficExcluded: z55.number().int().nonnegative(),
|
|
15882
|
+
crawlerHits: z55.number().int().nonnegative(),
|
|
15883
|
+
aiUserFetchHits: z55.number().int().nonnegative(),
|
|
15884
|
+
aiReferralHits: z55.number().int().nonnegative(),
|
|
15885
|
+
unknownHits: z55.number().int().nonnegative(),
|
|
15886
|
+
crawlerBucketRows: z55.number().int().nonnegative(),
|
|
15887
|
+
aiUserFetchBucketRows: z55.number().int().nonnegative(),
|
|
15888
|
+
aiReferralBucketRows: z55.number().int().nonnegative(),
|
|
15889
|
+
sampleRows: z55.number().int().nonnegative(),
|
|
15803
15890
|
/** Residual upstream Queue depth after a bounded sync; present for Queue pull. */
|
|
15804
|
-
remainingBacklogCount:
|
|
15805
|
-
windowStart:
|
|
15806
|
-
windowEnd:
|
|
15891
|
+
remainingBacklogCount: z55.number().int().nonnegative().optional(),
|
|
15892
|
+
windowStart: z55.string(),
|
|
15893
|
+
windowEnd: z55.string()
|
|
15807
15894
|
});
|
|
15808
|
-
var trafficBackfillRequestSchema =
|
|
15895
|
+
var trafficBackfillRequestSchema = z55.object({
|
|
15809
15896
|
/** Lookback window in days. Default: 30; capped server-side at the adapter ceiling. WordPress always requires a retention-aware repair, not this generic replace operation. */
|
|
15810
|
-
days:
|
|
15897
|
+
days: z55.number().int().positive().optional()
|
|
15811
15898
|
});
|
|
15812
|
-
var trafficResetRequestSchema =
|
|
15813
|
-
advanceToNow:
|
|
15899
|
+
var trafficResetRequestSchema = z55.object({
|
|
15900
|
+
advanceToNow: z55.literal(true)
|
|
15814
15901
|
});
|
|
15815
|
-
var trafficBackfillResponseSchema =
|
|
15816
|
-
sourceId:
|
|
15817
|
-
runId:
|
|
15902
|
+
var trafficBackfillResponseSchema = z55.object({
|
|
15903
|
+
sourceId: z55.string(),
|
|
15904
|
+
runId: z55.string(),
|
|
15818
15905
|
status: runStatusSchema,
|
|
15819
|
-
windowStart:
|
|
15820
|
-
windowEnd:
|
|
15906
|
+
windowStart: z55.string(),
|
|
15907
|
+
windowEnd: z55.string(),
|
|
15821
15908
|
/** Days actually used after server-side clamping (≤ requested). */
|
|
15822
|
-
daysRequested:
|
|
15823
|
-
daysApplied:
|
|
15909
|
+
daysRequested: z55.number().int().positive(),
|
|
15910
|
+
daysApplied: z55.number().int().positive()
|
|
15824
15911
|
});
|
|
15825
|
-
var trafficSourceTotalsSchema =
|
|
15912
|
+
var trafficSourceTotalsSchema = z55.object({
|
|
15826
15913
|
/**
|
|
15827
15914
|
* Total classified-crawler hits in the window. UNCHANGED contract — still the
|
|
15828
15915
|
* full count across every path class. Use `crawlerContentHits` for the
|
|
15829
15916
|
* "content was actually crawled" signal.
|
|
15830
15917
|
*/
|
|
15831
|
-
crawlerHits:
|
|
15918
|
+
crawlerHits: z55.number().int().nonnegative(),
|
|
15832
15919
|
/** Crawler hits against content/document paths only (= `crawlerSegments.content`). */
|
|
15833
|
-
crawlerContentHits:
|
|
15920
|
+
crawlerContentHits: z55.number().int().nonnegative(),
|
|
15834
15921
|
/** Infrastructure crawler hits — sitemap + robots + asset fetches (`crawlerSegments.{sitemap,robots,asset}`). */
|
|
15835
|
-
crawlerInfraHits:
|
|
15922
|
+
crawlerInfraHits: z55.number().int().nonnegative(),
|
|
15836
15923
|
/** Full per-class crawler-hit breakdown; the five buckets sum to `crawlerHits`. */
|
|
15837
15924
|
crawlerSegments: trafficCrawlerSegmentsSchema,
|
|
15838
|
-
aiUserFetchHits:
|
|
15925
|
+
aiUserFetchHits: z55.number().int().nonnegative(),
|
|
15839
15926
|
/**
|
|
15840
15927
|
* Every request carrying AI-origin evidence. UNCHANGED contract — still the
|
|
15841
15928
|
* full count across every status. Use `aiReferralLandedHits` for the
|
|
15842
15929
|
* "someone actually arrived" signal.
|
|
15843
15930
|
*/
|
|
15844
|
-
aiReferralHits:
|
|
15931
|
+
aiReferralHits: z55.number().int().nonnegative(),
|
|
15845
15932
|
/**
|
|
15846
15933
|
* Countable referral SESSIONS: excludes requests answered with a proven
|
|
15847
15934
|
* Location redirect (301/302/303/307/308) AND static subresource fetches,
|
|
@@ -15852,7 +15939,7 @@ var trafficSourceTotalsSchema = z54.object({
|
|
|
15852
15939
|
* `landed + redirected <= total`; the gap is subresource noise, which is
|
|
15853
15940
|
* neither a session nor a hop.
|
|
15854
15941
|
*/
|
|
15855
|
-
aiReferralLandedHits:
|
|
15942
|
+
aiReferralLandedHits: z55.number().int().nonnegative(),
|
|
15856
15943
|
/**
|
|
15857
15944
|
* Referral hits answered with a Location redirect. The visitor got no
|
|
15858
15945
|
* content here; the destination raises its own row when it carries the same
|
|
@@ -15860,50 +15947,50 @@ var trafficSourceTotalsSchema = z54.object({
|
|
|
15860
15947
|
* where this is most of the total is a finding in itself: its AI arrivals
|
|
15861
15948
|
* all bounce off a redirect.
|
|
15862
15949
|
*/
|
|
15863
|
-
aiReferralRedirectedHits:
|
|
15864
|
-
sampleCount:
|
|
15950
|
+
aiReferralRedirectedHits: z55.number().int().nonnegative(),
|
|
15951
|
+
sampleCount: z55.number().int().nonnegative()
|
|
15865
15952
|
});
|
|
15866
|
-
var trafficSourceListResponseSchema =
|
|
15867
|
-
sources:
|
|
15953
|
+
var trafficSourceListResponseSchema = z55.object({
|
|
15954
|
+
sources: z55.array(trafficSourceDtoSchema)
|
|
15868
15955
|
});
|
|
15869
15956
|
var trafficSourceDetailDtoSchema = trafficSourceDtoSchema.extend({
|
|
15870
15957
|
totals24h: trafficSourceTotalsSchema,
|
|
15871
|
-
latestRun:
|
|
15872
|
-
runId:
|
|
15958
|
+
latestRun: z55.object({
|
|
15959
|
+
runId: z55.string(),
|
|
15873
15960
|
status: runStatusSchema,
|
|
15874
|
-
startedAt:
|
|
15875
|
-
finishedAt:
|
|
15876
|
-
error:
|
|
15961
|
+
startedAt: z55.string().nullable(),
|
|
15962
|
+
finishedAt: z55.string().nullable(),
|
|
15963
|
+
error: z55.string().nullable()
|
|
15877
15964
|
}).nullable()
|
|
15878
15965
|
});
|
|
15879
|
-
var trafficStatusResponseSchema =
|
|
15880
|
-
sources:
|
|
15966
|
+
var trafficStatusResponseSchema = z55.object({
|
|
15967
|
+
sources: z55.array(trafficSourceDetailDtoSchema)
|
|
15881
15968
|
});
|
|
15882
|
-
var trafficEventKindSchema =
|
|
15969
|
+
var trafficEventKindSchema = z55.enum(["crawler", "ai-user-fetch", "ai-referral"]);
|
|
15883
15970
|
var TrafficEventKinds = trafficEventKindSchema.enum;
|
|
15884
|
-
var trafficSeriesGranularitySchema =
|
|
15971
|
+
var trafficSeriesGranularitySchema = z55.enum(["hour", "day"]);
|
|
15885
15972
|
var TrafficSeriesGranularities = trafficSeriesGranularitySchema.enum;
|
|
15886
|
-
var trafficSeriesPointSchema =
|
|
15973
|
+
var trafficSeriesPointSchema = z55.object({
|
|
15887
15974
|
/**
|
|
15888
15975
|
* UTC bucket key: an ISO hour for hourly series, or `YYYY-MM-DD` for daily
|
|
15889
15976
|
* series. The response includes zero-value buckets across the full window.
|
|
15890
15977
|
*/
|
|
15891
|
-
bucket:
|
|
15892
|
-
crawlerHits:
|
|
15893
|
-
aiUserFetchHits:
|
|
15894
|
-
aiReferralHits:
|
|
15978
|
+
bucket: z55.string(),
|
|
15979
|
+
crawlerHits: z55.number().int().nonnegative(),
|
|
15980
|
+
aiUserFetchHits: z55.number().int().nonnegative(),
|
|
15981
|
+
aiReferralHits: z55.number().int().nonnegative(),
|
|
15895
15982
|
/**
|
|
15896
15983
|
* The part of `aiReferralHits` not answered with a Location redirect — the
|
|
15897
15984
|
* series to chart under any label that says sessions or visits.
|
|
15898
15985
|
*/
|
|
15899
|
-
aiReferralLandedHits:
|
|
15986
|
+
aiReferralLandedHits: z55.number().int().nonnegative(),
|
|
15900
15987
|
/**
|
|
15901
15988
|
* The part of `crawlerHits` that is a real content page, excluding robots,
|
|
15902
15989
|
* sitemaps and assets. `crawlerHits` keeps its full-count contract; this is
|
|
15903
15990
|
* the series to chart under any label that says "pages crawled", because a
|
|
15904
15991
|
* sitemap re-fetch is not a page an engine read.
|
|
15905
15992
|
*/
|
|
15906
|
-
crawlerContentHits:
|
|
15993
|
+
crawlerContentHits: z55.number().int().nonnegative(),
|
|
15907
15994
|
/**
|
|
15908
15995
|
* False for a bucket that predates any observation for this project, i.e.
|
|
15909
15996
|
* before `series.coverageStart`. Such a bucket reads 0 because nothing was
|
|
@@ -15911,74 +15998,74 @@ var trafficSeriesPointSchema = z54.object({
|
|
|
15911
15998
|
* those as a measured zero. Derived here rather than in a component so the
|
|
15912
15999
|
* CLI draws the same distinction.
|
|
15913
16000
|
*/
|
|
15914
|
-
measured:
|
|
15915
|
-
});
|
|
15916
|
-
var trafficCrawlerEventEntrySchema =
|
|
15917
|
-
kind:
|
|
15918
|
-
sourceId:
|
|
15919
|
-
tsHour:
|
|
15920
|
-
botId:
|
|
15921
|
-
operator:
|
|
15922
|
-
verificationStatus:
|
|
15923
|
-
verificationManifests:
|
|
15924
|
-
verificationUnattributedHits:
|
|
15925
|
-
pathNormalized:
|
|
16001
|
+
measured: z55.boolean()
|
|
16002
|
+
});
|
|
16003
|
+
var trafficCrawlerEventEntrySchema = z55.object({
|
|
16004
|
+
kind: z55.literal(TrafficEventKinds.crawler),
|
|
16005
|
+
sourceId: z55.string(),
|
|
16006
|
+
tsHour: z55.string(),
|
|
16007
|
+
botId: z55.string(),
|
|
16008
|
+
operator: z55.string(),
|
|
16009
|
+
verificationStatus: z55.string(),
|
|
16010
|
+
verificationManifests: z55.array(trafficVerificationManifestUsageSchema).optional(),
|
|
16011
|
+
verificationUnattributedHits: z55.number().int().nonnegative().optional(),
|
|
16012
|
+
pathNormalized: z55.string(),
|
|
15926
16013
|
/** Coarse class of the fetched path — lets the UI split content crawls from sitemap/robots/asset polling. */
|
|
15927
16014
|
pathClass: trafficPathClassSchema,
|
|
15928
|
-
status:
|
|
15929
|
-
hits:
|
|
15930
|
-
});
|
|
15931
|
-
var trafficAiUserFetchEventEntrySchema =
|
|
15932
|
-
kind:
|
|
15933
|
-
sourceId:
|
|
15934
|
-
tsHour:
|
|
15935
|
-
botId:
|
|
15936
|
-
operator:
|
|
15937
|
-
verificationStatus:
|
|
15938
|
-
verificationManifests:
|
|
15939
|
-
verificationUnattributedHits:
|
|
15940
|
-
pathNormalized:
|
|
15941
|
-
status:
|
|
15942
|
-
hits:
|
|
15943
|
-
});
|
|
15944
|
-
var trafficAiReferralEventEntrySchema =
|
|
15945
|
-
kind:
|
|
15946
|
-
sourceId:
|
|
15947
|
-
tsHour:
|
|
15948
|
-
product:
|
|
15949
|
-
operator:
|
|
15950
|
-
sourceDomain:
|
|
15951
|
-
evidenceType:
|
|
15952
|
-
landingPathNormalized:
|
|
15953
|
-
status:
|
|
16015
|
+
status: z55.number().int(),
|
|
16016
|
+
hits: z55.number().int().nonnegative()
|
|
16017
|
+
});
|
|
16018
|
+
var trafficAiUserFetchEventEntrySchema = z55.object({
|
|
16019
|
+
kind: z55.literal(TrafficEventKinds["ai-user-fetch"]),
|
|
16020
|
+
sourceId: z55.string(),
|
|
16021
|
+
tsHour: z55.string(),
|
|
16022
|
+
botId: z55.string(),
|
|
16023
|
+
operator: z55.string(),
|
|
16024
|
+
verificationStatus: z55.string(),
|
|
16025
|
+
verificationManifests: z55.array(trafficVerificationManifestUsageSchema).optional(),
|
|
16026
|
+
verificationUnattributedHits: z55.number().int().nonnegative().optional(),
|
|
16027
|
+
pathNormalized: z55.string(),
|
|
16028
|
+
status: z55.number().int(),
|
|
16029
|
+
hits: z55.number().int().nonnegative()
|
|
16030
|
+
});
|
|
16031
|
+
var trafficAiReferralEventEntrySchema = z55.object({
|
|
16032
|
+
kind: z55.literal(TrafficEventKinds["ai-referral"]),
|
|
16033
|
+
sourceId: z55.string(),
|
|
16034
|
+
tsHour: z55.string(),
|
|
16035
|
+
product: z55.string(),
|
|
16036
|
+
operator: z55.string(),
|
|
16037
|
+
sourceDomain: z55.string(),
|
|
16038
|
+
evidenceType: z55.string(),
|
|
16039
|
+
landingPathNormalized: z55.string(),
|
|
16040
|
+
status: z55.number().int(),
|
|
15954
16041
|
/** Total AI-referral sessions in the bucket. `paidHits + organicHits + unknownHits === hits`. */
|
|
15955
|
-
hits:
|
|
16042
|
+
hits: z55.number().int().nonnegative(),
|
|
15956
16043
|
/** Sessions carrying paid-attribution UTM evidence (`utm_medium=cpc`, …). */
|
|
15957
|
-
paidHits:
|
|
16044
|
+
paidHits: z55.number().int().nonnegative(),
|
|
15958
16045
|
/** Sessions with no paid-attribution evidence. Not proof the click was unpaid — an untagged ad click is indistinguishable. */
|
|
15959
|
-
organicHits:
|
|
16046
|
+
organicHits: z55.number().int().nonnegative(),
|
|
15960
16047
|
/**
|
|
15961
16048
|
* Sessions ingested before the classifier shipped. Their UTM tags were never
|
|
15962
16049
|
* persisted, so they can never be resolved to paid or organic. Never fold
|
|
15963
16050
|
* these into `organicHits`.
|
|
15964
16051
|
*/
|
|
15965
|
-
unknownHits:
|
|
16052
|
+
unknownHits: z55.number().int().nonnegative()
|
|
15966
16053
|
});
|
|
15967
|
-
var trafficEventEntrySchema =
|
|
16054
|
+
var trafficEventEntrySchema = z55.discriminatedUnion("kind", [
|
|
15968
16055
|
trafficCrawlerEventEntrySchema,
|
|
15969
16056
|
trafficAiUserFetchEventEntrySchema,
|
|
15970
16057
|
trafficAiReferralEventEntrySchema
|
|
15971
16058
|
]);
|
|
15972
|
-
var trafficEventsResponseSchema =
|
|
15973
|
-
windowStart:
|
|
15974
|
-
windowEnd:
|
|
16059
|
+
var trafficEventsResponseSchema = z55.object({
|
|
16060
|
+
windowStart: z55.string(),
|
|
16061
|
+
windowEnd: z55.string(),
|
|
15975
16062
|
/**
|
|
15976
16063
|
* Full-window chart data, aggregated independently from the capped detail
|
|
15977
16064
|
* rows below. This prevents dense windows from silently losing old buckets.
|
|
15978
16065
|
*/
|
|
15979
|
-
series:
|
|
16066
|
+
series: z55.object({
|
|
15980
16067
|
granularity: trafficSeriesGranularitySchema,
|
|
15981
|
-
points:
|
|
16068
|
+
points: z55.array(trafficSeriesPointSchema),
|
|
15982
16069
|
/**
|
|
15983
16070
|
* Earliest event ever observed for this project, across ALL of its traffic
|
|
15984
16071
|
* sources, or null when nothing has been recorded. Buckets before it were
|
|
@@ -15987,7 +16074,7 @@ var trafficEventsResponseSchema = z54.object({
|
|
|
15987
16074
|
* nothing. The cost is that a source connected much later hides its own
|
|
15988
16075
|
* early gap, which is the better error than marking real data unmeasured.
|
|
15989
16076
|
*/
|
|
15990
|
-
coverageStart:
|
|
16077
|
+
coverageStart: z55.string().nullable(),
|
|
15991
16078
|
/**
|
|
15992
16079
|
* Least-squares fit per charted metric, over the densified points.
|
|
15993
16080
|
*
|
|
@@ -15996,52 +16083,52 @@ var trafficEventsResponseSchema = z54.object({
|
|
|
15996
16083
|
* UI/CLI parity rule. `null` for a metric with fewer than two observations,
|
|
15997
16084
|
* so a caller renders "no trend" instead of a fabricated flat line.
|
|
15998
16085
|
*/
|
|
15999
|
-
trends:
|
|
16086
|
+
trends: z55.object({
|
|
16000
16087
|
crawlerContentHits: linearTrendSchema.nullable(),
|
|
16001
16088
|
aiUserFetchHits: linearTrendSchema.nullable(),
|
|
16002
16089
|
aiReferralLandedHits: linearTrendSchema.nullable()
|
|
16003
16090
|
})
|
|
16004
16091
|
}),
|
|
16005
|
-
totals:
|
|
16092
|
+
totals: z55.object({
|
|
16006
16093
|
/** Total classified-crawler hits across the window. UNCHANGED contract. */
|
|
16007
|
-
crawlerHits:
|
|
16094
|
+
crawlerHits: z55.number().int().nonnegative(),
|
|
16008
16095
|
/** Crawler hits against content/document paths only (= `crawlerSegments.content`). */
|
|
16009
|
-
crawlerContentHits:
|
|
16096
|
+
crawlerContentHits: z55.number().int().nonnegative(),
|
|
16010
16097
|
/** Infrastructure crawler hits — sitemap + robots + asset fetches. */
|
|
16011
|
-
crawlerInfraHits:
|
|
16098
|
+
crawlerInfraHits: z55.number().int().nonnegative(),
|
|
16012
16099
|
/** Full per-class crawler-hit breakdown; the five buckets sum to `crawlerHits`. */
|
|
16013
16100
|
crawlerSegments: trafficCrawlerSegmentsSchema,
|
|
16014
|
-
aiUserFetchHits:
|
|
16101
|
+
aiUserFetchHits: z55.number().int().nonnegative(),
|
|
16015
16102
|
/**
|
|
16016
16103
|
* Every AI-referral request in the window, whatever the server answered.
|
|
16017
16104
|
* NOT a session count: use `aiReferralLandedHits` for anything presented
|
|
16018
16105
|
* as sessions or visits. The three class buckets sum to the LANDED figure,
|
|
16019
16106
|
* because a redirect hop's paid tags are not a paid session.
|
|
16020
16107
|
*/
|
|
16021
|
-
aiReferralHits:
|
|
16108
|
+
aiReferralHits: z55.number().int().nonnegative(),
|
|
16022
16109
|
/**
|
|
16023
16110
|
* Countable referral SESSIONS: no redirect hops, no static subresource
|
|
16024
16111
|
* fetches — the same predicate the report uses, so windowed totals here
|
|
16025
16112
|
* and report arrivals cannot disagree.
|
|
16026
16113
|
*/
|
|
16027
|
-
aiReferralLandedHits:
|
|
16114
|
+
aiReferralLandedHits: z55.number().int().nonnegative(),
|
|
16028
16115
|
/** Referral hits answered with a Location redirect — hops, not arrivals. */
|
|
16029
|
-
aiReferralRedirectedHits:
|
|
16116
|
+
aiReferralRedirectedHits: z55.number().int().nonnegative(),
|
|
16030
16117
|
/** LANDED sessions carrying paid-attribution UTM evidence. */
|
|
16031
|
-
aiReferralPaidHits:
|
|
16118
|
+
aiReferralPaidHits: z55.number().int().nonnegative(),
|
|
16032
16119
|
/** LANDED sessions with no paid-attribution evidence. */
|
|
16033
|
-
aiReferralOrganicHits:
|
|
16120
|
+
aiReferralOrganicHits: z55.number().int().nonnegative(),
|
|
16034
16121
|
/** LANDED sessions ingested before the classifier shipped; unresolvable, never organic. */
|
|
16035
|
-
aiReferralUnknownHits:
|
|
16122
|
+
aiReferralUnknownHits: z55.number().int().nonnegative()
|
|
16036
16123
|
}),
|
|
16037
|
-
eventRows:
|
|
16124
|
+
eventRows: z55.object({
|
|
16038
16125
|
/** Total detail rows matching the window/source/kind filters before `limit`. */
|
|
16039
|
-
total:
|
|
16126
|
+
total: z55.number().int().nonnegative(),
|
|
16040
16127
|
/** Number of newest detail rows included in `events`. */
|
|
16041
|
-
returned:
|
|
16042
|
-
truncated:
|
|
16128
|
+
returned: z55.number().int().nonnegative(),
|
|
16129
|
+
truncated: z55.boolean()
|
|
16043
16130
|
}),
|
|
16044
|
-
events:
|
|
16131
|
+
events: z55.array(trafficEventEntrySchema)
|
|
16045
16132
|
});
|
|
16046
16133
|
|
|
16047
16134
|
// ../contracts/src/traffic-path.ts
|
|
@@ -16180,76 +16267,76 @@ function sumInfraHits(segments) {
|
|
|
16180
16267
|
}
|
|
16181
16268
|
|
|
16182
16269
|
// ../contracts/src/research.ts
|
|
16183
|
-
import { z as
|
|
16270
|
+
import { z as z57 } from "zod";
|
|
16184
16271
|
|
|
16185
16272
|
// ../contracts/src/users.ts
|
|
16186
|
-
import { z as
|
|
16273
|
+
import { z as z56 } from "zod";
|
|
16187
16274
|
var UserRoles = {
|
|
16188
16275
|
admin: "admin",
|
|
16189
16276
|
viewer: "viewer"
|
|
16190
16277
|
};
|
|
16191
|
-
var userRoleSchema =
|
|
16278
|
+
var userRoleSchema = z56.enum(["admin", "viewer"]);
|
|
16192
16279
|
var USER_NAME_PATTERN = /^[a-z\d][\w.-]{0,63}$/i;
|
|
16193
|
-
var userNameSchema =
|
|
16280
|
+
var userNameSchema = z56.string().regex(
|
|
16194
16281
|
USER_NAME_PATTERN,
|
|
16195
16282
|
"A name may use letters, digits, dots, dashes and underscores, and must start with a letter or digit."
|
|
16196
16283
|
);
|
|
16197
16284
|
var USER_PASSWORD_MIN_LENGTH = 12;
|
|
16198
|
-
var userPasswordSchema =
|
|
16285
|
+
var userPasswordSchema = z56.string().min(
|
|
16199
16286
|
USER_PASSWORD_MIN_LENGTH,
|
|
16200
16287
|
`A password must be at least ${USER_PASSWORD_MIN_LENGTH} characters.`
|
|
16201
16288
|
);
|
|
16202
16289
|
function normalizeUserName(name) {
|
|
16203
16290
|
return name.trim().toLowerCase();
|
|
16204
16291
|
}
|
|
16205
|
-
var userDtoSchema =
|
|
16206
|
-
id:
|
|
16207
|
-
name:
|
|
16292
|
+
var userDtoSchema = z56.object({
|
|
16293
|
+
id: z56.string(),
|
|
16294
|
+
name: z56.string(),
|
|
16208
16295
|
role: userRoleSchema,
|
|
16209
|
-
createdAt:
|
|
16210
|
-
lastLoginAt:
|
|
16296
|
+
createdAt: z56.string(),
|
|
16297
|
+
lastLoginAt: z56.string().nullable()
|
|
16211
16298
|
});
|
|
16212
|
-
var userListDtoSchema =
|
|
16213
|
-
users:
|
|
16299
|
+
var userListDtoSchema = z56.object({
|
|
16300
|
+
users: z56.array(userDtoSchema)
|
|
16214
16301
|
});
|
|
16215
|
-
var createUserRequestSchema =
|
|
16302
|
+
var createUserRequestSchema = z56.object({
|
|
16216
16303
|
name: userNameSchema,
|
|
16217
16304
|
password: userPasswordSchema,
|
|
16218
16305
|
role: userRoleSchema
|
|
16219
16306
|
});
|
|
16220
|
-
var loginRequestSchema =
|
|
16221
|
-
name:
|
|
16222
|
-
password:
|
|
16307
|
+
var loginRequestSchema = z56.object({
|
|
16308
|
+
name: z56.string().min(1),
|
|
16309
|
+
password: z56.string().min(1)
|
|
16223
16310
|
});
|
|
16224
|
-
var authSessionDtoSchema =
|
|
16311
|
+
var authSessionDtoSchema = z56.object({
|
|
16225
16312
|
/** True once at least one account exists, so the dashboard must sign in. */
|
|
16226
|
-
authRequired:
|
|
16313
|
+
authRequired: z56.boolean(),
|
|
16227
16314
|
/** The signed-in person, or null when nobody is signed in. */
|
|
16228
16315
|
user: userDtoSchema.pick({ name: true, role: true }).nullable()
|
|
16229
16316
|
});
|
|
16230
16317
|
var LOGIN_FAILED_MESSAGE = "Incorrect name or password.";
|
|
16231
16318
|
|
|
16232
16319
|
// ../contracts/src/research.ts
|
|
16233
|
-
var researchRunStatusSchema =
|
|
16320
|
+
var researchRunStatusSchema = z57.enum(["queued", "running", "completed", "partial", "failed"]);
|
|
16234
16321
|
var ResearchRunStatuses = researchRunStatusSchema.enum;
|
|
16235
|
-
var researchQueryStatusSchema =
|
|
16322
|
+
var researchQueryStatusSchema = z57.enum(["queued", "running", "completed", "failed"]);
|
|
16236
16323
|
var ResearchQueryStatuses = researchQueryStatusSchema.enum;
|
|
16237
16324
|
var DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT = 20;
|
|
16238
16325
|
var MAX_RESEARCH_BATCH_RUNS = 20;
|
|
16239
16326
|
var MAX_RESEARCH_BATCH_QUERIES = 50;
|
|
16240
|
-
var researchScopeSelectionSchema =
|
|
16241
|
-
kind:
|
|
16327
|
+
var researchScopeSelectionSchema = z57.object({
|
|
16328
|
+
kind: z57.enum(["market", "property"]),
|
|
16242
16329
|
key: measurementV2StableKeySchema,
|
|
16243
16330
|
/** Guards a reviewed scope preview from silently using a newer plan revision. */
|
|
16244
|
-
expectedPlanRevision:
|
|
16331
|
+
expectedPlanRevision: z57.number().int().positive().optional()
|
|
16245
16332
|
}).strict();
|
|
16246
|
-
var researchRunScopeSchema =
|
|
16247
|
-
kind:
|
|
16333
|
+
var researchRunScopeSchema = z57.object({
|
|
16334
|
+
kind: z57.enum(["market", "property"]),
|
|
16248
16335
|
key: measurementV2StableKeySchema,
|
|
16249
|
-
label:
|
|
16250
|
-
planRevision:
|
|
16336
|
+
label: z57.string().trim().min(1),
|
|
16337
|
+
planRevision: z57.number().int().positive()
|
|
16251
16338
|
}).strict();
|
|
16252
|
-
var researchQueryTextSchema =
|
|
16339
|
+
var researchQueryTextSchema = z57.string().min(1).max(4e3).refine((value) => value.trim().length > 0, "Research queries cannot be blank.");
|
|
16253
16340
|
function deduplicateResearchQueries(queries) {
|
|
16254
16341
|
const seen = /* @__PURE__ */ new Set();
|
|
16255
16342
|
return queries.filter((query) => {
|
|
@@ -16274,271 +16361,275 @@ function expandResearchTemplate(template, scope, location) {
|
|
|
16274
16361
|
const bindings = Object.fromEntries(template.variables.map((variable) => [variable, available[variable]]));
|
|
16275
16362
|
return { bindings, output: expandQueryTemplate(template.pattern, bindings) };
|
|
16276
16363
|
}
|
|
16277
|
-
var researchTemplateSelectionSchema =
|
|
16278
|
-
templateId:
|
|
16279
|
-
templateVersion:
|
|
16364
|
+
var researchTemplateSelectionSchema = z57.object({
|
|
16365
|
+
templateId: z57.string().trim().min(1).max(256),
|
|
16366
|
+
templateVersion: z57.string().trim().min(1).max(256),
|
|
16367
|
+
/** Original preview context used to expand names, independent of the final engine location. */
|
|
16368
|
+
bindingLocation: locationContextSchema.nullable().optional()
|
|
16280
16369
|
}).strict();
|
|
16281
|
-
var researchRunCreateSchema =
|
|
16282
|
-
queries:
|
|
16283
|
-
provider:
|
|
16284
|
-
model:
|
|
16370
|
+
var researchRunCreateSchema = z57.object({
|
|
16371
|
+
queries: z57.array(researchQueryTextSchema).min(1).max(50),
|
|
16372
|
+
provider: z57.string().trim().min(1).optional(),
|
|
16373
|
+
model: z57.string().trim().min(1).max(200).optional(),
|
|
16285
16374
|
location: locationContextSchema.nullable().optional(),
|
|
16286
16375
|
scope: researchScopeSelectionSchema.optional(),
|
|
16287
16376
|
template: researchTemplateSelectionSchema.optional(),
|
|
16288
|
-
idempotencyKey:
|
|
16377
|
+
idempotencyKey: z57.string().trim().min(1).max(128).optional()
|
|
16289
16378
|
}).superRefine((value, ctx) => {
|
|
16290
|
-
if (value.model && !value.provider) ctx.addIssue({ code:
|
|
16379
|
+
if (value.model && !value.provider) ctx.addIssue({ code: z57.ZodIssueCode.custom, path: ["provider"], message: "provider is required when model is supplied" });
|
|
16291
16380
|
});
|
|
16292
16381
|
var researchBatchScopeSelectionSchema = researchScopeSelectionSchema.extend({
|
|
16293
|
-
expectedPlanRevision:
|
|
16382
|
+
expectedPlanRevision: z57.number().int().positive()
|
|
16294
16383
|
}).strict();
|
|
16295
|
-
var researchBatchRunCreateSchema =
|
|
16296
|
-
queries:
|
|
16297
|
-
provider:
|
|
16298
|
-
model:
|
|
16384
|
+
var researchBatchRunCreateSchema = z57.object({
|
|
16385
|
+
queries: z57.array(researchQueryTextSchema).min(1).max(MAX_RESEARCH_BATCH_QUERIES),
|
|
16386
|
+
provider: z57.string().trim().min(1),
|
|
16387
|
+
model: z57.string().trim().min(1).max(200),
|
|
16299
16388
|
location: locationContextSchema.nullable(),
|
|
16300
16389
|
scope: researchBatchScopeSelectionSchema.optional(),
|
|
16301
16390
|
template: researchTemplateSelectionSchema.optional()
|
|
16302
16391
|
}).strict();
|
|
16303
|
-
var researchBatchCreateSchema =
|
|
16304
|
-
idempotencyKey:
|
|
16305
|
-
runs:
|
|
16392
|
+
var researchBatchCreateSchema = z57.object({
|
|
16393
|
+
idempotencyKey: z57.string().trim().min(1).max(128),
|
|
16394
|
+
runs: z57.array(researchBatchRunCreateSchema).min(1).max(MAX_RESEARCH_BATCH_RUNS)
|
|
16306
16395
|
}).strict().superRefine((value, ctx) => {
|
|
16307
16396
|
const totalQueries = value.runs.reduce((total, run) => total + run.queries.length, 0);
|
|
16308
16397
|
if (totalQueries > MAX_RESEARCH_BATCH_QUERIES) {
|
|
16309
|
-
ctx.addIssue({ code:
|
|
16398
|
+
ctx.addIssue({ code: z57.ZodIssueCode.custom, path: ["runs"], message: `A research batch may contain at most ${MAX_RESEARCH_BATCH_QUERIES} concrete queries across all destinations` });
|
|
16310
16399
|
}
|
|
16311
16400
|
});
|
|
16312
|
-
var researchRunPrincipalSchema =
|
|
16313
|
-
kind:
|
|
16314
|
-
id:
|
|
16315
|
-
name:
|
|
16401
|
+
var researchRunPrincipalSchema = z57.object({
|
|
16402
|
+
kind: z57.enum(["api-key", "user"]),
|
|
16403
|
+
id: z57.string(),
|
|
16404
|
+
name: z57.string(),
|
|
16316
16405
|
role: userRoleSchema.nullable(),
|
|
16317
16406
|
/** Consumes the shared limited-research budget. Legacy viewers count by role. */
|
|
16318
|
-
limited:
|
|
16407
|
+
limited: z57.boolean().optional()
|
|
16319
16408
|
});
|
|
16320
|
-
var researchRunSummarySchema =
|
|
16321
|
-
id:
|
|
16322
|
-
projectId:
|
|
16409
|
+
var researchRunSummarySchema = z57.object({
|
|
16410
|
+
id: z57.string(),
|
|
16411
|
+
projectId: z57.string(),
|
|
16323
16412
|
status: researchRunStatusSchema,
|
|
16324
|
-
provider:
|
|
16325
|
-
requestedModel:
|
|
16326
|
-
resolvedModel:
|
|
16413
|
+
provider: z57.string(),
|
|
16414
|
+
requestedModel: z57.string().nullable(),
|
|
16415
|
+
resolvedModel: z57.string(),
|
|
16327
16416
|
location: locationContextSchema.nullable(),
|
|
16328
16417
|
scope: researchRunScopeSchema.nullable().optional(),
|
|
16329
16418
|
template: queryTrackingTemplateProvenanceSchema.nullable().optional(),
|
|
16330
|
-
totalQueries:
|
|
16331
|
-
completedQueries:
|
|
16332
|
-
failedQueries:
|
|
16333
|
-
error:
|
|
16419
|
+
totalQueries: z57.number().int(),
|
|
16420
|
+
completedQueries: z57.number().int(),
|
|
16421
|
+
failedQueries: z57.number().int(),
|
|
16422
|
+
error: z57.string().nullable(),
|
|
16334
16423
|
initiatedBy: researchRunPrincipalSchema.nullable(),
|
|
16335
|
-
startedAt:
|
|
16336
|
-
finishedAt:
|
|
16337
|
-
createdAt:
|
|
16424
|
+
startedAt: z57.string().nullable(),
|
|
16425
|
+
finishedAt: z57.string().nullable(),
|
|
16426
|
+
createdAt: z57.string()
|
|
16338
16427
|
});
|
|
16339
|
-
var researchRunQuerySchema =
|
|
16340
|
-
id:
|
|
16341
|
-
position:
|
|
16342
|
-
query:
|
|
16428
|
+
var researchRunQuerySchema = z57.object({
|
|
16429
|
+
id: z57.string(),
|
|
16430
|
+
position: z57.number().int(),
|
|
16431
|
+
query: z57.string(),
|
|
16343
16432
|
queryClass: queryClassSchema.nullable().optional(),
|
|
16344
16433
|
status: researchQueryStatusSchema,
|
|
16345
|
-
requestedModel:
|
|
16346
|
-
resolvedModel:
|
|
16347
|
-
servedModel:
|
|
16348
|
-
answerText:
|
|
16349
|
-
groundingSources:
|
|
16350
|
-
citedDomains:
|
|
16351
|
-
searchQueries:
|
|
16352
|
-
namedCompetitors:
|
|
16353
|
-
citedCompetitorDomains:
|
|
16354
|
-
answerMentioned:
|
|
16434
|
+
requestedModel: z57.string().nullable(),
|
|
16435
|
+
resolvedModel: z57.string(),
|
|
16436
|
+
servedModel: z57.string().nullable(),
|
|
16437
|
+
answerText: z57.string().nullable(),
|
|
16438
|
+
groundingSources: z57.array(groundingSourceSchema),
|
|
16439
|
+
citedDomains: z57.array(z57.string()),
|
|
16440
|
+
searchQueries: z57.array(z57.string()),
|
|
16441
|
+
namedCompetitors: z57.array(z57.string()).default([]),
|
|
16442
|
+
citedCompetitorDomains: z57.array(z57.string()).default([]),
|
|
16443
|
+
answerMentioned: z57.boolean().nullable(),
|
|
16355
16444
|
citationState: citationStateSchema.nullable(),
|
|
16356
|
-
error:
|
|
16357
|
-
startedAt:
|
|
16358
|
-
finishedAt:
|
|
16359
|
-
createdAt:
|
|
16360
|
-
});
|
|
16361
|
-
var researchRunDetailSchema = researchRunSummarySchema.extend({ queries:
|
|
16362
|
-
var researchBatchSchema =
|
|
16363
|
-
var researchProviderOptionSchema =
|
|
16364
|
-
name:
|
|
16365
|
-
displayName:
|
|
16366
|
-
modelConfigurable:
|
|
16367
|
-
defaultModel:
|
|
16368
|
-
knownModels:
|
|
16369
|
-
});
|
|
16370
|
-
var researchRunListSchema =
|
|
16371
|
-
runs:
|
|
16372
|
-
|
|
16445
|
+
error: z57.string().nullable(),
|
|
16446
|
+
startedAt: z57.string().nullable(),
|
|
16447
|
+
finishedAt: z57.string().nullable(),
|
|
16448
|
+
createdAt: z57.string()
|
|
16449
|
+
});
|
|
16450
|
+
var researchRunDetailSchema = researchRunSummarySchema.extend({ queries: z57.array(researchRunQuerySchema) });
|
|
16451
|
+
var researchBatchSchema = z57.object({ runs: z57.array(researchRunDetailSchema) });
|
|
16452
|
+
var researchProviderOptionSchema = z57.object({
|
|
16453
|
+
name: z57.string(),
|
|
16454
|
+
displayName: z57.string(),
|
|
16455
|
+
modelConfigurable: z57.boolean(),
|
|
16456
|
+
defaultModel: z57.string(),
|
|
16457
|
+
knownModels: z57.array(z57.object({ id: z57.string(), displayName: z57.string() }))
|
|
16458
|
+
});
|
|
16459
|
+
var researchRunListSchema = z57.object({
|
|
16460
|
+
runs: z57.array(researchRunSummarySchema),
|
|
16461
|
+
/** Opaque continuation after the last returned (createdAt, id); null ends history. */
|
|
16462
|
+
nextCursor: z57.string().nullable().optional(),
|
|
16463
|
+
providers: z57.array(researchProviderOptionSchema).optional(),
|
|
16373
16464
|
/** Credential-specific admission policy, shared by UI, CLI and MCP consumers. */
|
|
16374
|
-
access:
|
|
16465
|
+
access: z57.object({ canRun: z57.boolean(), dailyRunLimit: z57.number().int().positive().nullable() }).optional()
|
|
16375
16466
|
});
|
|
16376
16467
|
|
|
16377
16468
|
// ../contracts/src/ads.ts
|
|
16378
|
-
import { z as
|
|
16469
|
+
import { z as z58 } from "zod";
|
|
16379
16470
|
var AdsReviewStatuses = {
|
|
16380
16471
|
approved: "approved"
|
|
16381
16472
|
};
|
|
16382
16473
|
var AdsIntegrityDecisions = {
|
|
16383
16474
|
allowed: "allowed"
|
|
16384
16475
|
};
|
|
16385
|
-
var adsConnectRequestSchema =
|
|
16476
|
+
var adsConnectRequestSchema = z58.object({
|
|
16386
16477
|
/** Ads Manager "SDK key" scoped to one ad account. Stored in config.yaml, never the DB. */
|
|
16387
|
-
apiKey:
|
|
16388
|
-
});
|
|
16389
|
-
var adsAccountDtoSchema =
|
|
16390
|
-
id:
|
|
16391
|
-
name:
|
|
16392
|
-
status:
|
|
16393
|
-
currencyCode:
|
|
16394
|
-
timezone:
|
|
16395
|
-
url:
|
|
16396
|
-
reviewStatus:
|
|
16397
|
-
integrityReviewStatus:
|
|
16398
|
-
integrityDecision:
|
|
16399
|
-
});
|
|
16400
|
-
var adsGeoSearchQuerySchema =
|
|
16401
|
-
q:
|
|
16402
|
-
limit:
|
|
16403
|
-
});
|
|
16404
|
-
var adsGeoLocationDtoSchema =
|
|
16405
|
-
id:
|
|
16406
|
-
type:
|
|
16407
|
-
canonicalName:
|
|
16408
|
-
countryCode:
|
|
16409
|
-
name:
|
|
16410
|
-
regionCode:
|
|
16411
|
-
});
|
|
16412
|
-
var adsGeoSearchResponseSchema =
|
|
16413
|
-
count:
|
|
16414
|
-
query:
|
|
16415
|
-
results:
|
|
16416
|
-
});
|
|
16417
|
-
var adsConversionPixelDtoSchema =
|
|
16418
|
-
id:
|
|
16419
|
-
clientType:
|
|
16420
|
-
name:
|
|
16421
|
-
pixelId:
|
|
16422
|
-
});
|
|
16423
|
-
var adsConversionPixelListResponseSchema =
|
|
16424
|
-
pixels:
|
|
16425
|
-
});
|
|
16426
|
-
var adsConversionEventSettingSourceDtoSchema =
|
|
16427
|
-
id:
|
|
16428
|
-
name:
|
|
16429
|
-
});
|
|
16430
|
-
var adsConversionEventSettingDtoSchema =
|
|
16431
|
-
id:
|
|
16432
|
-
name:
|
|
16433
|
-
eventType:
|
|
16434
|
-
customEventName:
|
|
16435
|
-
attributionWindowDays:
|
|
16436
|
-
adAccountId:
|
|
16437
|
-
sourceIds:
|
|
16438
|
-
sources:
|
|
16439
|
-
archived:
|
|
16440
|
-
version:
|
|
16441
|
-
});
|
|
16442
|
-
var adsConversionEventSettingListResponseSchema =
|
|
16443
|
-
eventSettings:
|
|
16444
|
-
});
|
|
16445
|
-
var adsConnectionStatusDtoSchema =
|
|
16446
|
-
connected:
|
|
16447
|
-
adAccountId:
|
|
16448
|
-
displayName:
|
|
16449
|
-
currencyCode:
|
|
16450
|
-
timezone:
|
|
16451
|
-
status:
|
|
16452
|
-
reviewStatus:
|
|
16453
|
-
integrityReviewStatus:
|
|
16454
|
-
integrityDecision:
|
|
16455
|
-
lastSyncedAt:
|
|
16478
|
+
apiKey: z58.string().min(1)
|
|
16479
|
+
});
|
|
16480
|
+
var adsAccountDtoSchema = z58.object({
|
|
16481
|
+
id: z58.string(),
|
|
16482
|
+
name: z58.string(),
|
|
16483
|
+
status: z58.string(),
|
|
16484
|
+
currencyCode: z58.string().nullable(),
|
|
16485
|
+
timezone: z58.string().nullable(),
|
|
16486
|
+
url: z58.string().nullable(),
|
|
16487
|
+
reviewStatus: z58.string().nullable(),
|
|
16488
|
+
integrityReviewStatus: z58.string().nullable(),
|
|
16489
|
+
integrityDecision: z58.string().nullable()
|
|
16490
|
+
});
|
|
16491
|
+
var adsGeoSearchQuerySchema = z58.object({
|
|
16492
|
+
q: z58.string().trim().min(1).max(200),
|
|
16493
|
+
limit: z58.number().int().min(1).max(100).default(20)
|
|
16494
|
+
});
|
|
16495
|
+
var adsGeoLocationDtoSchema = z58.object({
|
|
16496
|
+
id: z58.string(),
|
|
16497
|
+
type: z58.string(),
|
|
16498
|
+
canonicalName: z58.string(),
|
|
16499
|
+
countryCode: z58.string(),
|
|
16500
|
+
name: z58.string(),
|
|
16501
|
+
regionCode: z58.string().nullable()
|
|
16502
|
+
});
|
|
16503
|
+
var adsGeoSearchResponseSchema = z58.object({
|
|
16504
|
+
count: z58.number().int().nonnegative(),
|
|
16505
|
+
query: z58.string(),
|
|
16506
|
+
results: z58.array(adsGeoLocationDtoSchema)
|
|
16507
|
+
});
|
|
16508
|
+
var adsConversionPixelDtoSchema = z58.object({
|
|
16509
|
+
id: z58.string(),
|
|
16510
|
+
clientType: z58.string().optional(),
|
|
16511
|
+
name: z58.string().optional(),
|
|
16512
|
+
pixelId: z58.string().optional()
|
|
16513
|
+
});
|
|
16514
|
+
var adsConversionPixelListResponseSchema = z58.object({
|
|
16515
|
+
pixels: z58.array(adsConversionPixelDtoSchema)
|
|
16516
|
+
});
|
|
16517
|
+
var adsConversionEventSettingSourceDtoSchema = z58.object({
|
|
16518
|
+
id: z58.string(),
|
|
16519
|
+
name: z58.string().optional()
|
|
16520
|
+
});
|
|
16521
|
+
var adsConversionEventSettingDtoSchema = z58.object({
|
|
16522
|
+
id: z58.string(),
|
|
16523
|
+
name: z58.string().optional(),
|
|
16524
|
+
eventType: z58.string().optional(),
|
|
16525
|
+
customEventName: z58.string().nullable().optional(),
|
|
16526
|
+
attributionWindowDays: z58.number().int().positive().optional(),
|
|
16527
|
+
adAccountId: z58.string().optional(),
|
|
16528
|
+
sourceIds: z58.array(z58.string()).optional(),
|
|
16529
|
+
sources: z58.array(adsConversionEventSettingSourceDtoSchema).optional(),
|
|
16530
|
+
archived: z58.boolean().optional(),
|
|
16531
|
+
version: z58.number().int().nonnegative().optional()
|
|
16532
|
+
});
|
|
16533
|
+
var adsConversionEventSettingListResponseSchema = z58.object({
|
|
16534
|
+
eventSettings: z58.array(adsConversionEventSettingDtoSchema)
|
|
16535
|
+
});
|
|
16536
|
+
var adsConnectionStatusDtoSchema = z58.object({
|
|
16537
|
+
connected: z58.boolean(),
|
|
16538
|
+
adAccountId: z58.string().nullable().optional(),
|
|
16539
|
+
displayName: z58.string().nullable().optional(),
|
|
16540
|
+
currencyCode: z58.string().nullable().optional(),
|
|
16541
|
+
timezone: z58.string().nullable().optional(),
|
|
16542
|
+
status: z58.string().nullable().optional(),
|
|
16543
|
+
reviewStatus: z58.string().nullable().optional(),
|
|
16544
|
+
integrityReviewStatus: z58.string().nullable().optional(),
|
|
16545
|
+
integrityDecision: z58.string().nullable().optional(),
|
|
16546
|
+
lastSyncedAt: z58.string().nullable().optional(),
|
|
16456
16547
|
/** Whether the ad account has OpenAI conversion tracking (pixel or CAPI) configured,
|
|
16457
16548
|
* detected from synced campaigns carrying conversion_event_setting_ids. Optional:
|
|
16458
16549
|
* only present when connected. */
|
|
16459
|
-
conversionTrackingConfigured:
|
|
16550
|
+
conversionTrackingConfigured: z58.boolean().optional()
|
|
16460
16551
|
});
|
|
16461
|
-
var adsDisconnectResponseSchema =
|
|
16462
|
-
disconnected:
|
|
16552
|
+
var adsDisconnectResponseSchema = z58.object({
|
|
16553
|
+
disconnected: z58.boolean()
|
|
16463
16554
|
});
|
|
16464
|
-
var adsSyncResponseSchema =
|
|
16465
|
-
runId:
|
|
16466
|
-
status:
|
|
16555
|
+
var adsSyncResponseSchema = z58.object({
|
|
16556
|
+
runId: z58.string(),
|
|
16557
|
+
status: z58.string()
|
|
16467
16558
|
});
|
|
16468
|
-
var adsCreativeDtoSchema =
|
|
16469
|
-
type:
|
|
16470
|
-
title:
|
|
16471
|
-
body:
|
|
16472
|
-
targetUrl:
|
|
16473
|
-
fileId:
|
|
16559
|
+
var adsCreativeDtoSchema = z58.object({
|
|
16560
|
+
type: z58.string().nullable().optional(),
|
|
16561
|
+
title: z58.string().nullable().optional(),
|
|
16562
|
+
body: z58.string().nullable().optional(),
|
|
16563
|
+
targetUrl: z58.string().nullable().optional(),
|
|
16564
|
+
fileId: z58.string().nullable().optional()
|
|
16474
16565
|
});
|
|
16475
|
-
var adsCampaignBiddingTypeSchema =
|
|
16566
|
+
var adsCampaignBiddingTypeSchema = z58.enum(["impressions", "clicks"]);
|
|
16476
16567
|
var AdsCampaignBiddingTypes = adsCampaignBiddingTypeSchema.enum;
|
|
16477
|
-
var adsAdGroupBillingEventTypeSchema =
|
|
16568
|
+
var adsAdGroupBillingEventTypeSchema = z58.enum(["impression", "click"]);
|
|
16478
16569
|
var AdsAdGroupBillingEventTypes = adsAdGroupBillingEventTypeSchema.enum;
|
|
16479
|
-
var adsAdDtoSchema =
|
|
16480
|
-
id:
|
|
16481
|
-
adGroupId:
|
|
16482
|
-
name:
|
|
16483
|
-
status:
|
|
16484
|
-
reviewStatus:
|
|
16570
|
+
var adsAdDtoSchema = z58.object({
|
|
16571
|
+
id: z58.string(),
|
|
16572
|
+
adGroupId: z58.string(),
|
|
16573
|
+
name: z58.string(),
|
|
16574
|
+
status: z58.string(),
|
|
16575
|
+
reviewStatus: z58.string().nullable().optional(),
|
|
16485
16576
|
creative: adsCreativeDtoSchema.nullable().optional(),
|
|
16486
|
-
upstreamUpdatedAt:
|
|
16487
|
-
syncedAt:
|
|
16488
|
-
});
|
|
16489
|
-
var adsAdGroupDtoSchema =
|
|
16490
|
-
id:
|
|
16491
|
-
campaignId:
|
|
16492
|
-
name:
|
|
16493
|
-
description:
|
|
16494
|
-
status:
|
|
16495
|
-
billingEventType:
|
|
16496
|
-
maxBidMicros:
|
|
16577
|
+
upstreamUpdatedAt: z58.number().int().nullable().optional(),
|
|
16578
|
+
syncedAt: z58.string().optional()
|
|
16579
|
+
});
|
|
16580
|
+
var adsAdGroupDtoSchema = z58.object({
|
|
16581
|
+
id: z58.string(),
|
|
16582
|
+
campaignId: z58.string(),
|
|
16583
|
+
name: z58.string(),
|
|
16584
|
+
description: z58.string().nullable().optional(),
|
|
16585
|
+
status: z58.string(),
|
|
16586
|
+
billingEventType: z58.union([adsAdGroupBillingEventTypeSchema, z58.null()]).optional(),
|
|
16587
|
+
maxBidMicros: z58.number().int().nullable().optional(),
|
|
16497
16588
|
/**
|
|
16498
16589
|
* The targeting primitive: entries are multi-line strings of
|
|
16499
16590
|
* newline-separated example queries (the live Ads Manager format).
|
|
16500
16591
|
*/
|
|
16501
|
-
contextHints:
|
|
16502
|
-
ads:
|
|
16503
|
-
upstreamUpdatedAt:
|
|
16504
|
-
syncedAt:
|
|
16505
|
-
});
|
|
16506
|
-
var adsCampaignDtoSchema =
|
|
16507
|
-
id:
|
|
16508
|
-
name:
|
|
16509
|
-
description:
|
|
16510
|
-
status:
|
|
16511
|
-
startTime:
|
|
16512
|
-
endTime:
|
|
16513
|
-
biddingType:
|
|
16514
|
-
dailySpendLimitMicros:
|
|
16515
|
-
lifetimeSpendLimitMicros:
|
|
16516
|
-
conversionEventSettingIds:
|
|
16517
|
-
locationIds:
|
|
16518
|
-
adGroups:
|
|
16519
|
-
upstreamUpdatedAt:
|
|
16520
|
-
syncedAt:
|
|
16521
|
-
});
|
|
16522
|
-
var adsCampaignListResponseSchema =
|
|
16523
|
-
campaigns:
|
|
16524
|
-
});
|
|
16525
|
-
var adsInsightLevelSchema =
|
|
16592
|
+
contextHints: z58.array(z58.string()).default([]),
|
|
16593
|
+
ads: z58.array(adsAdDtoSchema).default([]),
|
|
16594
|
+
upstreamUpdatedAt: z58.number().int().nullable().optional(),
|
|
16595
|
+
syncedAt: z58.string().optional()
|
|
16596
|
+
});
|
|
16597
|
+
var adsCampaignDtoSchema = z58.object({
|
|
16598
|
+
id: z58.string(),
|
|
16599
|
+
name: z58.string(),
|
|
16600
|
+
description: z58.string().nullable().optional(),
|
|
16601
|
+
status: z58.string(),
|
|
16602
|
+
startTime: z58.number().int().nullable().optional(),
|
|
16603
|
+
endTime: z58.number().int().nullable().optional(),
|
|
16604
|
+
biddingType: z58.union([adsCampaignBiddingTypeSchema, z58.null()]).optional(),
|
|
16605
|
+
dailySpendLimitMicros: z58.number().int().nullable().optional(),
|
|
16606
|
+
lifetimeSpendLimitMicros: z58.number().int().nullable().optional(),
|
|
16607
|
+
conversionEventSettingIds: z58.array(z58.string()).default([]),
|
|
16608
|
+
locationIds: z58.array(z58.string()).optional(),
|
|
16609
|
+
adGroups: z58.array(adsAdGroupDtoSchema).default([]),
|
|
16610
|
+
upstreamUpdatedAt: z58.number().int().nullable().optional(),
|
|
16611
|
+
syncedAt: z58.string().optional()
|
|
16612
|
+
});
|
|
16613
|
+
var adsCampaignListResponseSchema = z58.object({
|
|
16614
|
+
campaigns: z58.array(adsCampaignDtoSchema)
|
|
16615
|
+
});
|
|
16616
|
+
var adsInsightLevelSchema = z58.enum(["campaign", "ad_group"]);
|
|
16526
16617
|
var AdsInsightLevels = adsInsightLevelSchema.enum;
|
|
16527
|
-
var adsInsightRowDtoSchema =
|
|
16618
|
+
var adsInsightRowDtoSchema = z58.object({
|
|
16528
16619
|
level: adsInsightLevelSchema,
|
|
16529
|
-
entityId:
|
|
16530
|
-
date:
|
|
16531
|
-
impressions:
|
|
16532
|
-
clicks:
|
|
16533
|
-
spendMicros:
|
|
16620
|
+
entityId: z58.string(),
|
|
16621
|
+
date: z58.string(),
|
|
16622
|
+
impressions: z58.number().int(),
|
|
16623
|
+
clicks: z58.number().int(),
|
|
16624
|
+
spendMicros: z58.number().int(),
|
|
16534
16625
|
/** Conversion count for the row. 0 when conversion tracking is not configured.
|
|
16535
16626
|
* Conversion VALUE (for ROAS) is a deliberate follow-up: the upstream value
|
|
16536
16627
|
* field is not yet captured against a live conversion-tracking account. */
|
|
16537
|
-
conversions:
|
|
16628
|
+
conversions: z58.number().int(),
|
|
16538
16629
|
/** clicks / impressions; null when impressions is 0. */
|
|
16539
|
-
ctr:
|
|
16630
|
+
ctr: z58.number().nullable(),
|
|
16540
16631
|
/** spendMicros / clicks, rounded to integer micros; null when clicks is 0. */
|
|
16541
|
-
cpcMicros:
|
|
16632
|
+
cpcMicros: z58.number().int().nullable(),
|
|
16542
16633
|
/**
|
|
16543
16634
|
* True when `date` is the ad account's CURRENT local calendar date, so this
|
|
16544
16635
|
* row is a running figure rather than a closed day. The sync re-reads the
|
|
@@ -16551,42 +16642,42 @@ var adsInsightRowDtoSchema = z57.object({
|
|
|
16551
16642
|
* conversion metrics, so the count stays at 0 until the day closes and the
|
|
16552
16643
|
* next sync reads the real figure. Treat it as not yet reported.
|
|
16553
16644
|
*/
|
|
16554
|
-
inProgress:
|
|
16645
|
+
inProgress: z58.boolean()
|
|
16555
16646
|
});
|
|
16556
|
-
var adsInsightsResponseSchema =
|
|
16557
|
-
rows:
|
|
16647
|
+
var adsInsightsResponseSchema = z58.object({
|
|
16648
|
+
rows: z58.array(adsInsightRowDtoSchema),
|
|
16558
16649
|
/** Account currency for rendering spend/cpc; null before the first sync. */
|
|
16559
|
-
currencyCode:
|
|
16560
|
-
});
|
|
16561
|
-
var adsRollupWindowDtoSchema =
|
|
16562
|
-
from:
|
|
16563
|
-
to:
|
|
16564
|
-
inProgressDate:
|
|
16565
|
-
});
|
|
16566
|
-
var adsTotalsDtoSchema =
|
|
16567
|
-
impressions:
|
|
16568
|
-
clicks:
|
|
16569
|
-
spendMicros:
|
|
16570
|
-
conversions:
|
|
16571
|
-
ctr:
|
|
16572
|
-
cpcMicros:
|
|
16573
|
-
});
|
|
16574
|
-
var adsSummaryDtoSchema =
|
|
16575
|
-
connected:
|
|
16576
|
-
displayName:
|
|
16577
|
-
currencyCode:
|
|
16578
|
-
lastSyncedAt:
|
|
16579
|
-
campaignCount:
|
|
16580
|
-
adGroupCount:
|
|
16581
|
-
adCount:
|
|
16650
|
+
currencyCode: z58.string().nullable().optional()
|
|
16651
|
+
});
|
|
16652
|
+
var adsRollupWindowDtoSchema = z58.object({
|
|
16653
|
+
from: z58.string().nullable(),
|
|
16654
|
+
to: z58.string().nullable(),
|
|
16655
|
+
inProgressDate: z58.string().nullable()
|
|
16656
|
+
});
|
|
16657
|
+
var adsTotalsDtoSchema = z58.object({
|
|
16658
|
+
impressions: z58.number().int(),
|
|
16659
|
+
clicks: z58.number().int(),
|
|
16660
|
+
spendMicros: z58.number().int(),
|
|
16661
|
+
conversions: z58.number().int(),
|
|
16662
|
+
ctr: z58.number().nullable(),
|
|
16663
|
+
cpcMicros: z58.number().int().nullable()
|
|
16664
|
+
});
|
|
16665
|
+
var adsSummaryDtoSchema = z58.object({
|
|
16666
|
+
connected: z58.boolean(),
|
|
16667
|
+
displayName: z58.string().nullable().optional(),
|
|
16668
|
+
currencyCode: z58.string().nullable().optional(),
|
|
16669
|
+
lastSyncedAt: z58.string().nullable().optional(),
|
|
16670
|
+
campaignCount: z58.number().int(),
|
|
16671
|
+
adGroupCount: z58.number().int(),
|
|
16672
|
+
adCount: z58.number().int(),
|
|
16582
16673
|
/** Date range the totals cover (oldest/newest rollup date), null when empty. */
|
|
16583
16674
|
window: adsRollupWindowDtoSchema,
|
|
16584
16675
|
/** Campaign-level rollup totals over the window (levels are not summed across). */
|
|
16585
16676
|
totals: adsTotalsDtoSchema
|
|
16586
16677
|
});
|
|
16587
|
-
var adsDeliverySnapshotStatusSchema =
|
|
16678
|
+
var adsDeliverySnapshotStatusSchema = z58.enum(["unavailable", "partial", "complete"]);
|
|
16588
16679
|
var AdsDeliverySnapshotStatuses = adsDeliverySnapshotStatusSchema.enum;
|
|
16589
|
-
var adsDeliverySnapshotIssueSchema =
|
|
16680
|
+
var adsDeliverySnapshotIssueSchema = z58.enum([
|
|
16590
16681
|
"no_ads_connection",
|
|
16591
16682
|
"connection_not_synced",
|
|
16592
16683
|
"no_ads_sync",
|
|
@@ -16597,12 +16688,12 @@ var adsDeliverySnapshotIssueSchema = z57.enum([
|
|
|
16597
16688
|
"source_sync_not_completed"
|
|
16598
16689
|
]);
|
|
16599
16690
|
var AdsDeliverySnapshotIssues = adsDeliverySnapshotIssueSchema.enum;
|
|
16600
|
-
var adsHistoricalCampaignRollupStatusSchema =
|
|
16691
|
+
var adsHistoricalCampaignRollupStatusSchema = z58.enum(["unavailable", "reported"]);
|
|
16601
16692
|
var AdsHistoricalCampaignRollupStatuses = adsHistoricalCampaignRollupStatusSchema.enum;
|
|
16602
16693
|
var AdsDeliveryConfigurationBases = {
|
|
16603
16694
|
storedSnapshot: "stored_ads_snapshot"
|
|
16604
16695
|
};
|
|
16605
|
-
var adsActivityAssessmentStateSchema =
|
|
16696
|
+
var adsActivityAssessmentStateSchema = z58.enum([
|
|
16606
16697
|
"unavailable",
|
|
16607
16698
|
"partial_snapshot",
|
|
16608
16699
|
"metrics_unavailable",
|
|
@@ -16610,76 +16701,76 @@ var adsActivityAssessmentStateSchema = z57.enum([
|
|
|
16610
16701
|
"no_observed_activity"
|
|
16611
16702
|
]);
|
|
16612
16703
|
var AdsActivityAssessmentStates = adsActivityAssessmentStateSchema.enum;
|
|
16613
|
-
var adsDeliveryDiagnosticsAdSchema =
|
|
16614
|
-
id:
|
|
16615
|
-
name:
|
|
16616
|
-
status:
|
|
16617
|
-
reviewStatus:
|
|
16618
|
-
});
|
|
16619
|
-
var adsDeliveryDiagnosticsAdGroupSchema =
|
|
16620
|
-
id:
|
|
16621
|
-
name:
|
|
16622
|
-
status:
|
|
16623
|
-
billingEventType:
|
|
16624
|
-
maxBidMicros:
|
|
16625
|
-
contextHints:
|
|
16626
|
-
ads:
|
|
16627
|
-
});
|
|
16628
|
-
var adsDeliveryDiagnosticsCampaignSchema =
|
|
16629
|
-
id:
|
|
16630
|
-
name:
|
|
16631
|
-
status:
|
|
16632
|
-
biddingType:
|
|
16633
|
-
dailySpendLimitMicros:
|
|
16634
|
-
lifetimeSpendLimitMicros:
|
|
16635
|
-
conversionEventSettingIds:
|
|
16636
|
-
adGroups:
|
|
16637
|
-
});
|
|
16638
|
-
var adsDeliveryDiagnosticsDtoSchema =
|
|
16639
|
-
snapshot:
|
|
16704
|
+
var adsDeliveryDiagnosticsAdSchema = z58.object({
|
|
16705
|
+
id: z58.string(),
|
|
16706
|
+
name: z58.string(),
|
|
16707
|
+
status: z58.string(),
|
|
16708
|
+
reviewStatus: z58.string().nullable()
|
|
16709
|
+
});
|
|
16710
|
+
var adsDeliveryDiagnosticsAdGroupSchema = z58.object({
|
|
16711
|
+
id: z58.string(),
|
|
16712
|
+
name: z58.string(),
|
|
16713
|
+
status: z58.string(),
|
|
16714
|
+
billingEventType: z58.union([adsAdGroupBillingEventTypeSchema, z58.null()]),
|
|
16715
|
+
maxBidMicros: z58.number().int().nullable(),
|
|
16716
|
+
contextHints: z58.array(z58.string()),
|
|
16717
|
+
ads: z58.array(adsDeliveryDiagnosticsAdSchema)
|
|
16718
|
+
});
|
|
16719
|
+
var adsDeliveryDiagnosticsCampaignSchema = z58.object({
|
|
16720
|
+
id: z58.string(),
|
|
16721
|
+
name: z58.string(),
|
|
16722
|
+
status: z58.string(),
|
|
16723
|
+
biddingType: z58.union([adsCampaignBiddingTypeSchema, z58.null()]),
|
|
16724
|
+
dailySpendLimitMicros: z58.number().int().nullable(),
|
|
16725
|
+
lifetimeSpendLimitMicros: z58.number().int().nullable(),
|
|
16726
|
+
conversionEventSettingIds: z58.array(z58.string()),
|
|
16727
|
+
adGroups: z58.array(adsDeliveryDiagnosticsAdGroupSchema)
|
|
16728
|
+
});
|
|
16729
|
+
var adsDeliveryDiagnosticsDtoSchema = z58.object({
|
|
16730
|
+
snapshot: z58.object({
|
|
16640
16731
|
status: adsDeliverySnapshotStatusSchema,
|
|
16641
16732
|
// A union keeps the OpenAPI form explicit enough for the generated SDK to
|
|
16642
16733
|
// retain the complete-snapshot `null` value (rather than narrowing it to
|
|
16643
16734
|
// the issue enum alone).
|
|
16644
|
-
issue:
|
|
16645
|
-
lastSyncedAt:
|
|
16646
|
-
campaignCount:
|
|
16647
|
-
adGroupCount:
|
|
16648
|
-
adCount:
|
|
16649
|
-
sourceSync:
|
|
16650
|
-
runId:
|
|
16735
|
+
issue: z58.union([adsDeliverySnapshotIssueSchema, z58.null()]),
|
|
16736
|
+
lastSyncedAt: z58.string().nullable(),
|
|
16737
|
+
campaignCount: z58.number().int().nonnegative(),
|
|
16738
|
+
adGroupCount: z58.number().int().nonnegative(),
|
|
16739
|
+
adCount: z58.number().int().nonnegative(),
|
|
16740
|
+
sourceSync: z58.object({
|
|
16741
|
+
runId: z58.string(),
|
|
16651
16742
|
status: runStatusSchema
|
|
16652
16743
|
}).nullable()
|
|
16653
16744
|
}),
|
|
16654
|
-
historicalCampaignRollups:
|
|
16745
|
+
historicalCampaignRollups: z58.object({
|
|
16655
16746
|
status: adsHistoricalCampaignRollupStatusSchema,
|
|
16656
16747
|
window: adsRollupWindowDtoSchema,
|
|
16657
16748
|
totals: adsTotalsDtoSchema.nullable()
|
|
16658
16749
|
}),
|
|
16659
|
-
storedConfiguration:
|
|
16660
|
-
basis:
|
|
16661
|
-
connection:
|
|
16662
|
-
status:
|
|
16663
|
-
reviewStatus:
|
|
16664
|
-
integrityReviewStatus:
|
|
16665
|
-
integrityDecision:
|
|
16666
|
-
conversionTrackingConfigured:
|
|
16750
|
+
storedConfiguration: z58.object({
|
|
16751
|
+
basis: z58.literal(AdsDeliveryConfigurationBases.storedSnapshot),
|
|
16752
|
+
connection: z58.object({
|
|
16753
|
+
status: z58.string().nullable(),
|
|
16754
|
+
reviewStatus: z58.string().nullable(),
|
|
16755
|
+
integrityReviewStatus: z58.string().nullable(),
|
|
16756
|
+
integrityDecision: z58.string().nullable(),
|
|
16757
|
+
conversionTrackingConfigured: z58.boolean()
|
|
16667
16758
|
}).nullable(),
|
|
16668
|
-
campaigns:
|
|
16759
|
+
campaigns: z58.array(adsDeliveryDiagnosticsCampaignSchema)
|
|
16669
16760
|
}),
|
|
16670
|
-
assessment:
|
|
16671
|
-
});
|
|
16672
|
-
var adsOperationKeySchema =
|
|
16673
|
-
var adsEntityIdSchema =
|
|
16674
|
-
var adsNameSchema =
|
|
16675
|
-
var adsTimestampSchema =
|
|
16676
|
-
var adsMicrosSchema =
|
|
16677
|
-
var adsSha256Schema =
|
|
16678
|
-
var adsConversionEventSettingIdsSchema =
|
|
16679
|
-
var adsHttpsUrlSchema =
|
|
16761
|
+
assessment: z58.object({ state: adsActivityAssessmentStateSchema })
|
|
16762
|
+
});
|
|
16763
|
+
var adsOperationKeySchema = z58.string().min(8).max(128).regex(/^[\w.:-]+$/, "operationKey may contain letters, numbers, dot, underscore, colon, and hyphen");
|
|
16764
|
+
var adsEntityIdSchema = z58.string().min(1).max(200);
|
|
16765
|
+
var adsNameSchema = z58.string().min(3).max(1e3).refine((value) => value.trim().length > 0);
|
|
16766
|
+
var adsTimestampSchema = z58.number().int().min(946684800).max(4102444800);
|
|
16767
|
+
var adsMicrosSchema = z58.number().int().positive().max(Number.MAX_SAFE_INTEGER);
|
|
16768
|
+
var adsSha256Schema = z58.string().regex(/^[a-f0-9]{64}$/);
|
|
16769
|
+
var adsConversionEventSettingIdsSchema = z58.array(adsEntityIdSchema).max(100).refine((ids) => new Set(ids).size === ids.length, "conversionEventSettingIds must be unique");
|
|
16770
|
+
var adsHttpsUrlSchema = z58.string().url().refine((value) => new URL(value).protocol === "https:", {
|
|
16680
16771
|
message: "URL must use https"
|
|
16681
16772
|
});
|
|
16682
|
-
var adsOperationKindSchema =
|
|
16773
|
+
var adsOperationKindSchema = z58.enum([
|
|
16683
16774
|
"image_upload",
|
|
16684
16775
|
"campaign_create",
|
|
16685
16776
|
"campaign_update",
|
|
@@ -16696,25 +16787,25 @@ var adsOperationKindSchema = z57.enum([
|
|
|
16696
16787
|
"ad_archive"
|
|
16697
16788
|
]);
|
|
16698
16789
|
var AdsOperationKinds = adsOperationKindSchema.enum;
|
|
16699
|
-
var adsOperationStateSchema =
|
|
16790
|
+
var adsOperationStateSchema = z58.enum(["pending", "reconciling", "succeeded", "failed", "unknown"]);
|
|
16700
16791
|
var AdsOperationStates = adsOperationStateSchema.enum;
|
|
16701
|
-
var adsReconcileStrategySchema =
|
|
16792
|
+
var adsReconcileStrategySchema = z58.enum(["known_entity", "create_fingerprint", "manual_only"]);
|
|
16702
16793
|
var AdsReconcileStrategies = adsReconcileStrategySchema.enum;
|
|
16703
|
-
var adsUnresolvedOperationStateSchema =
|
|
16794
|
+
var adsUnresolvedOperationStateSchema = z58.enum([
|
|
16704
16795
|
AdsOperationStates.pending,
|
|
16705
16796
|
AdsOperationStates.unknown,
|
|
16706
16797
|
AdsOperationStates.reconciling
|
|
16707
16798
|
]);
|
|
16708
16799
|
var AdsUnresolvedOperationStates = adsUnresolvedOperationStateSchema.enum;
|
|
16709
|
-
var adsEntityStatusSchema =
|
|
16800
|
+
var adsEntityStatusSchema = z58.enum(["active", "paused", "archived"]);
|
|
16710
16801
|
var AdsEntityStatuses = adsEntityStatusSchema.enum;
|
|
16711
|
-
var adsEntityTypeSchema =
|
|
16802
|
+
var adsEntityTypeSchema = z58.enum(["file", "campaign", "ad_group", "ad"]);
|
|
16712
16803
|
var AdsEntityTypes = adsEntityTypeSchema.enum;
|
|
16713
|
-
var adsActivationEntityTypeSchema =
|
|
16804
|
+
var adsActivationEntityTypeSchema = z58.enum(["campaign", "ad_group", "ad"]);
|
|
16714
16805
|
var AdsActivationEntityTypes = adsActivationEntityTypeSchema.enum;
|
|
16715
|
-
var adsActivationEntityRefSchema =
|
|
16806
|
+
var adsActivationEntityRefSchema = z58.object({
|
|
16716
16807
|
id: adsEntityIdSchema,
|
|
16717
|
-
expectedUpdatedAt:
|
|
16808
|
+
expectedUpdatedAt: z58.number().int().nonnegative()
|
|
16718
16809
|
}).strict();
|
|
16719
16810
|
var adsActivationAdSchema = adsActivationEntityRefSchema;
|
|
16720
16811
|
var ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES = 1e3;
|
|
@@ -16726,10 +16817,10 @@ function countAdsActivationManifestEntities(manifest) {
|
|
|
16726
16817
|
);
|
|
16727
16818
|
}
|
|
16728
16819
|
var adsActivationAdGroupSchema = adsActivationEntityRefSchema.extend({
|
|
16729
|
-
ads:
|
|
16820
|
+
ads: z58.array(adsActivationAdSchema).min(1).max(ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES - 1)
|
|
16730
16821
|
}).strict();
|
|
16731
16822
|
var adsActivationCampaignSchema = adsActivationEntityRefSchema.extend({
|
|
16732
|
-
adGroups:
|
|
16823
|
+
adGroups: z58.array(adsActivationAdGroupSchema).min(1).max(ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES - 1)
|
|
16733
16824
|
}).strict();
|
|
16734
16825
|
function compareAdsActivationEntityIds(left, right) {
|
|
16735
16826
|
if (left < right) return -1;
|
|
@@ -16748,7 +16839,7 @@ function addCanonicalEntityOrderIssue(items, path, ctx) {
|
|
|
16748
16839
|
}
|
|
16749
16840
|
}
|
|
16750
16841
|
}
|
|
16751
|
-
var adsActivationManifestSchema =
|
|
16842
|
+
var adsActivationManifestSchema = z58.object({
|
|
16752
16843
|
campaign: adsActivationCampaignSchema
|
|
16753
16844
|
}).strict().superRefine((manifest, ctx) => {
|
|
16754
16845
|
const entityCount = countAdsActivationManifestEntities(manifest);
|
|
@@ -16791,7 +16882,7 @@ function canonicalizeAdsActivationManifest(manifest) {
|
|
|
16791
16882
|
};
|
|
16792
16883
|
}
|
|
16793
16884
|
var adsActivationManifestHashSchema = adsSha256Schema;
|
|
16794
|
-
var adsActivationGrantStateSchema =
|
|
16885
|
+
var adsActivationGrantStateSchema = z58.enum([
|
|
16795
16886
|
"approved",
|
|
16796
16887
|
"executing",
|
|
16797
16888
|
"consumed",
|
|
@@ -16800,7 +16891,7 @@ var adsActivationGrantStateSchema = z57.enum([
|
|
|
16800
16891
|
"unknown"
|
|
16801
16892
|
]);
|
|
16802
16893
|
var AdsActivationGrantStates = adsActivationGrantStateSchema.enum;
|
|
16803
|
-
var adsOperationStepStateSchema =
|
|
16894
|
+
var adsOperationStepStateSchema = z58.enum([
|
|
16804
16895
|
"pending",
|
|
16805
16896
|
"executing",
|
|
16806
16897
|
"active",
|
|
@@ -16811,35 +16902,35 @@ var adsOperationStepStateSchema = z57.enum([
|
|
|
16811
16902
|
"unknown"
|
|
16812
16903
|
]);
|
|
16813
16904
|
var AdsOperationStepStates = adsOperationStepStateSchema.enum;
|
|
16814
|
-
var adsReconcileFieldsSchema =
|
|
16905
|
+
var adsReconcileFieldsSchema = z58.object({
|
|
16815
16906
|
name: adsNameSchema.optional(),
|
|
16816
|
-
description:
|
|
16907
|
+
description: z58.string().max(4e3).nullable().optional(),
|
|
16817
16908
|
status: adsEntityStatusSchema.optional(),
|
|
16818
16909
|
startTime: adsTimestampSchema.nullable().optional(),
|
|
16819
16910
|
endTime: adsTimestampSchema.nullable().optional(),
|
|
16820
16911
|
lifetimeSpendLimitMicros: adsMicrosSchema.min(1e6).optional(),
|
|
16821
|
-
locationIds:
|
|
16912
|
+
locationIds: z58.array(adsEntityIdSchema).max(100).optional(),
|
|
16822
16913
|
biddingType: adsCampaignBiddingTypeSchema.optional(),
|
|
16823
16914
|
conversionEventSettingIds: adsConversionEventSettingIdsSchema.optional(),
|
|
16824
16915
|
campaignId: adsEntityIdSchema.optional(),
|
|
16825
|
-
contextHints:
|
|
16916
|
+
contextHints: z58.array(z58.string().min(1).max(1e3)).max(100).optional(),
|
|
16826
16917
|
maxBidMicros: adsMicrosSchema.max(1e8).optional(),
|
|
16827
16918
|
billingEventType: adsAdGroupBillingEventTypeSchema.optional(),
|
|
16828
16919
|
adGroupId: adsEntityIdSchema.optional(),
|
|
16829
16920
|
creativeFingerprint: adsSha256Schema.optional()
|
|
16830
16921
|
}).strict();
|
|
16831
|
-
var adsImageUploadRequestSchema =
|
|
16922
|
+
var adsImageUploadRequestSchema = z58.object({
|
|
16832
16923
|
operationKey: adsOperationKeySchema,
|
|
16833
16924
|
imageUrl: adsHttpsUrlSchema
|
|
16834
16925
|
});
|
|
16835
|
-
var adsCampaignCreateRequestSchema =
|
|
16926
|
+
var adsCampaignCreateRequestSchema = z58.object({
|
|
16836
16927
|
operationKey: adsOperationKeySchema,
|
|
16837
16928
|
name: adsNameSchema,
|
|
16838
|
-
description:
|
|
16929
|
+
description: z58.string().max(4e3).optional(),
|
|
16839
16930
|
startTime: adsTimestampSchema.optional(),
|
|
16840
16931
|
endTime: adsTimestampSchema.optional(),
|
|
16841
16932
|
lifetimeSpendLimitMicros: adsMicrosSchema.min(1e6),
|
|
16842
|
-
locationIds:
|
|
16933
|
+
locationIds: z58.array(adsEntityIdSchema).min(1).max(100),
|
|
16843
16934
|
// biddingType is BILLING (what the account pays for) and is immutable once
|
|
16844
16935
|
// the provider creates the campaign. conversionEventSettingIds is
|
|
16845
16936
|
// OPTIMIZATION (what delivery is steered toward). The two are independent,
|
|
@@ -16852,22 +16943,22 @@ var adsCampaignCreateRequestSchema = z57.object({
|
|
|
16852
16943
|
ctx.addIssue({ code: "custom", path: ["endTime"], message: "endTime must be after startTime" });
|
|
16853
16944
|
}
|
|
16854
16945
|
});
|
|
16855
|
-
var adsAdGroupCreateRequestSchema =
|
|
16946
|
+
var adsAdGroupCreateRequestSchema = z58.object({
|
|
16856
16947
|
operationKey: adsOperationKeySchema,
|
|
16857
16948
|
campaignId: adsEntityIdSchema,
|
|
16858
16949
|
name: adsNameSchema,
|
|
16859
|
-
description:
|
|
16860
|
-
contextHints:
|
|
16950
|
+
description: z58.string().max(4e3).optional(),
|
|
16951
|
+
contextHints: z58.array(z58.string().min(1).max(1e3)).min(1).max(100),
|
|
16861
16952
|
maxBidMicros: adsMicrosSchema.max(1e8),
|
|
16862
16953
|
billingEventType: adsAdGroupBillingEventTypeSchema.optional()
|
|
16863
16954
|
});
|
|
16864
|
-
var adsChatCardCreativeRequestSchema =
|
|
16865
|
-
title:
|
|
16866
|
-
body:
|
|
16955
|
+
var adsChatCardCreativeRequestSchema = z58.object({
|
|
16956
|
+
title: z58.string().min(3).max(50),
|
|
16957
|
+
body: z58.string().min(1).max(100),
|
|
16867
16958
|
targetUrl: adsHttpsUrlSchema,
|
|
16868
16959
|
fileId: adsEntityIdSchema
|
|
16869
16960
|
});
|
|
16870
|
-
var adsAdCreateRequestSchema =
|
|
16961
|
+
var adsAdCreateRequestSchema = z58.object({
|
|
16871
16962
|
operationKey: adsOperationKeySchema,
|
|
16872
16963
|
adGroupId: adsEntityIdSchema,
|
|
16873
16964
|
name: adsNameSchema,
|
|
@@ -16876,62 +16967,62 @@ var adsAdCreateRequestSchema = z57.object({
|
|
|
16876
16967
|
function hasMutationField(value) {
|
|
16877
16968
|
return Object.keys(value).some((key) => key !== "operationKey" && key !== "expectedUpdatedAt");
|
|
16878
16969
|
}
|
|
16879
|
-
var adsCampaignUpdateRequestSchema =
|
|
16970
|
+
var adsCampaignUpdateRequestSchema = z58.object({
|
|
16880
16971
|
operationKey: adsOperationKeySchema,
|
|
16881
|
-
expectedUpdatedAt:
|
|
16972
|
+
expectedUpdatedAt: z58.number().int().nonnegative(),
|
|
16882
16973
|
name: adsNameSchema.optional(),
|
|
16883
|
-
description:
|
|
16974
|
+
description: z58.string().max(4e3).nullable().optional(),
|
|
16884
16975
|
startTime: adsTimestampSchema.nullable().optional(),
|
|
16885
16976
|
endTime: adsTimestampSchema.nullable().optional(),
|
|
16886
16977
|
lifetimeSpendLimitMicros: adsMicrosSchema.min(1e6).optional(),
|
|
16887
|
-
locationIds:
|
|
16978
|
+
locationIds: z58.array(adsEntityIdSchema).min(1).max(100).optional()
|
|
16888
16979
|
}).refine(hasMutationField, { message: "At least one campaign field must be updated" });
|
|
16889
|
-
var adsAdGroupUpdateRequestSchema =
|
|
16980
|
+
var adsAdGroupUpdateRequestSchema = z58.object({
|
|
16890
16981
|
operationKey: adsOperationKeySchema,
|
|
16891
|
-
expectedUpdatedAt:
|
|
16982
|
+
expectedUpdatedAt: z58.number().int().nonnegative(),
|
|
16892
16983
|
name: adsNameSchema.optional(),
|
|
16893
|
-
description:
|
|
16894
|
-
contextHints:
|
|
16984
|
+
description: z58.string().max(4e3).nullable().optional(),
|
|
16985
|
+
contextHints: z58.array(z58.string().min(1).max(1e3)).min(1).max(100).optional(),
|
|
16895
16986
|
maxBidMicros: adsMicrosSchema.max(1e8).optional()
|
|
16896
16987
|
}).refine(hasMutationField, { message: "At least one ad group field must be updated" });
|
|
16897
|
-
var adsAdUpdateRequestSchema =
|
|
16988
|
+
var adsAdUpdateRequestSchema = z58.object({
|
|
16898
16989
|
operationKey: adsOperationKeySchema,
|
|
16899
|
-
expectedUpdatedAt:
|
|
16990
|
+
expectedUpdatedAt: z58.number().int().nonnegative(),
|
|
16900
16991
|
name: adsNameSchema.optional(),
|
|
16901
16992
|
creative: adsChatCardCreativeRequestSchema.optional()
|
|
16902
16993
|
}).refine(hasMutationField, { message: "At least one ad field must be updated" });
|
|
16903
|
-
var adsPauseRequestSchema =
|
|
16994
|
+
var adsPauseRequestSchema = z58.object({
|
|
16904
16995
|
operationKey: adsOperationKeySchema
|
|
16905
16996
|
});
|
|
16906
|
-
var adsArchiveRequestSchema =
|
|
16997
|
+
var adsArchiveRequestSchema = z58.object({
|
|
16907
16998
|
operationKey: adsOperationKeySchema,
|
|
16908
|
-
expectedUpdatedAt:
|
|
16999
|
+
expectedUpdatedAt: z58.number().int().nonnegative()
|
|
16909
17000
|
});
|
|
16910
|
-
var adsOperationDtoSchema =
|
|
16911
|
-
id:
|
|
16912
|
-
adAccountId:
|
|
16913
|
-
operationKey:
|
|
17001
|
+
var adsOperationDtoSchema = z58.object({
|
|
17002
|
+
id: z58.string(),
|
|
17003
|
+
adAccountId: z58.string().nullable(),
|
|
17004
|
+
operationKey: z58.string(),
|
|
16914
17005
|
kind: adsOperationKindSchema,
|
|
16915
17006
|
state: adsOperationStateSchema,
|
|
16916
|
-
entityType:
|
|
16917
|
-
entityId:
|
|
16918
|
-
upstreamUpdatedAt:
|
|
16919
|
-
errorCode:
|
|
16920
|
-
errorMessage:
|
|
16921
|
-
reconcileStrategy:
|
|
17007
|
+
entityType: z58.union([adsEntityTypeSchema, z58.null()]),
|
|
17008
|
+
entityId: z58.string().nullable(),
|
|
17009
|
+
upstreamUpdatedAt: z58.number().int().nullable(),
|
|
17010
|
+
errorCode: z58.string().nullable(),
|
|
17011
|
+
errorMessage: z58.string().nullable(),
|
|
17012
|
+
reconcileStrategy: z58.union([adsReconcileStrategySchema, z58.null()]),
|
|
16922
17013
|
reconcileParentId: adsEntityIdSchema.nullable(),
|
|
16923
17014
|
reconcileFingerprint: adsSha256Schema.nullable(),
|
|
16924
17015
|
reconcileFields: adsReconcileFieldsSchema.nullable(),
|
|
16925
|
-
reconcileAttempts:
|
|
16926
|
-
lastReconciledAt:
|
|
16927
|
-
createdAt:
|
|
16928
|
-
updatedAt:
|
|
17016
|
+
reconcileAttempts: z58.number().int().nonnegative(),
|
|
17017
|
+
lastReconciledAt: z58.string().nullable(),
|
|
17018
|
+
createdAt: z58.string(),
|
|
17019
|
+
updatedAt: z58.string()
|
|
16929
17020
|
});
|
|
16930
|
-
var adsOperationResponseSchema =
|
|
17021
|
+
var adsOperationResponseSchema = z58.object({
|
|
16931
17022
|
operation: adsOperationDtoSchema,
|
|
16932
|
-
replayed:
|
|
17023
|
+
replayed: z58.boolean()
|
|
16933
17024
|
});
|
|
16934
|
-
var adsActivationIsoTimestampSchema =
|
|
17025
|
+
var adsActivationIsoTimestampSchema = z58.iso.datetime({ offset: true });
|
|
16935
17026
|
var adsActivationGrantBaseShape = {
|
|
16936
17027
|
id: adsEntityIdSchema,
|
|
16937
17028
|
projectId: adsEntityIdSchema,
|
|
@@ -16946,61 +17037,61 @@ var adsActivationGrantBaseShape = {
|
|
|
16946
17037
|
updatedAt: adsActivationIsoTimestampSchema,
|
|
16947
17038
|
revocationRequestedAt: adsActivationIsoTimestampSchema.nullable()
|
|
16948
17039
|
};
|
|
16949
|
-
var adsActivationGrantApprovedDtoSchema =
|
|
17040
|
+
var adsActivationGrantApprovedDtoSchema = z58.object({
|
|
16950
17041
|
...adsActivationGrantBaseShape,
|
|
16951
|
-
state:
|
|
16952
|
-
operationId:
|
|
16953
|
-
executionStartedAt:
|
|
16954
|
-
consumedAt:
|
|
16955
|
-
revokedAt:
|
|
16956
|
-
expiredAt:
|
|
16957
|
-
}).strict();
|
|
16958
|
-
var adsActivationGrantExecutingDtoSchema =
|
|
17042
|
+
state: z58.literal(AdsActivationGrantStates.approved),
|
|
17043
|
+
operationId: z58.null(),
|
|
17044
|
+
executionStartedAt: z58.null(),
|
|
17045
|
+
consumedAt: z58.null(),
|
|
17046
|
+
revokedAt: z58.null(),
|
|
17047
|
+
expiredAt: z58.null()
|
|
17048
|
+
}).strict();
|
|
17049
|
+
var adsActivationGrantExecutingDtoSchema = z58.object({
|
|
16959
17050
|
...adsActivationGrantBaseShape,
|
|
16960
|
-
state:
|
|
17051
|
+
state: z58.literal(AdsActivationGrantStates.executing),
|
|
16961
17052
|
operationId: adsEntityIdSchema,
|
|
16962
17053
|
executionStartedAt: adsActivationIsoTimestampSchema,
|
|
16963
|
-
consumedAt:
|
|
16964
|
-
revokedAt:
|
|
16965
|
-
expiredAt:
|
|
17054
|
+
consumedAt: z58.null(),
|
|
17055
|
+
revokedAt: z58.null(),
|
|
17056
|
+
expiredAt: z58.null()
|
|
16966
17057
|
}).strict();
|
|
16967
|
-
var adsActivationGrantConsumedDtoSchema =
|
|
17058
|
+
var adsActivationGrantConsumedDtoSchema = z58.object({
|
|
16968
17059
|
...adsActivationGrantBaseShape,
|
|
16969
|
-
state:
|
|
17060
|
+
state: z58.literal(AdsActivationGrantStates.consumed),
|
|
16970
17061
|
operationId: adsEntityIdSchema,
|
|
16971
17062
|
executionStartedAt: adsActivationIsoTimestampSchema,
|
|
16972
17063
|
consumedAt: adsActivationIsoTimestampSchema,
|
|
16973
|
-
revokedAt:
|
|
16974
|
-
expiredAt:
|
|
17064
|
+
revokedAt: z58.null(),
|
|
17065
|
+
expiredAt: z58.null()
|
|
16975
17066
|
}).strict();
|
|
16976
|
-
var adsActivationGrantRevokedDtoSchema =
|
|
17067
|
+
var adsActivationGrantRevokedDtoSchema = z58.object({
|
|
16977
17068
|
...adsActivationGrantBaseShape,
|
|
16978
|
-
state:
|
|
16979
|
-
operationId:
|
|
16980
|
-
executionStartedAt:
|
|
16981
|
-
consumedAt:
|
|
17069
|
+
state: z58.literal(AdsActivationGrantStates.revoked),
|
|
17070
|
+
operationId: z58.null(),
|
|
17071
|
+
executionStartedAt: z58.null(),
|
|
17072
|
+
consumedAt: z58.null(),
|
|
16982
17073
|
revokedAt: adsActivationIsoTimestampSchema,
|
|
16983
|
-
expiredAt:
|
|
17074
|
+
expiredAt: z58.null()
|
|
16984
17075
|
}).strict();
|
|
16985
|
-
var adsActivationGrantExpiredDtoSchema =
|
|
17076
|
+
var adsActivationGrantExpiredDtoSchema = z58.object({
|
|
16986
17077
|
...adsActivationGrantBaseShape,
|
|
16987
|
-
state:
|
|
16988
|
-
operationId:
|
|
16989
|
-
executionStartedAt:
|
|
16990
|
-
consumedAt:
|
|
16991
|
-
revokedAt:
|
|
17078
|
+
state: z58.literal(AdsActivationGrantStates.expired),
|
|
17079
|
+
operationId: z58.null(),
|
|
17080
|
+
executionStartedAt: z58.null(),
|
|
17081
|
+
consumedAt: z58.null(),
|
|
17082
|
+
revokedAt: z58.null(),
|
|
16992
17083
|
expiredAt: adsActivationIsoTimestampSchema
|
|
16993
17084
|
}).strict();
|
|
16994
|
-
var adsActivationGrantUnknownDtoSchema =
|
|
17085
|
+
var adsActivationGrantUnknownDtoSchema = z58.object({
|
|
16995
17086
|
...adsActivationGrantBaseShape,
|
|
16996
|
-
state:
|
|
17087
|
+
state: z58.literal(AdsActivationGrantStates.unknown),
|
|
16997
17088
|
operationId: adsEntityIdSchema,
|
|
16998
17089
|
executionStartedAt: adsActivationIsoTimestampSchema,
|
|
16999
|
-
consumedAt:
|
|
17000
|
-
revokedAt:
|
|
17001
|
-
expiredAt:
|
|
17090
|
+
consumedAt: z58.null(),
|
|
17091
|
+
revokedAt: z58.null(),
|
|
17092
|
+
expiredAt: z58.null()
|
|
17002
17093
|
}).strict();
|
|
17003
|
-
var adsActivationGrantDtoSchema =
|
|
17094
|
+
var adsActivationGrantDtoSchema = z58.discriminatedUnion("state", [
|
|
17004
17095
|
adsActivationGrantApprovedDtoSchema,
|
|
17005
17096
|
adsActivationGrantExecutingDtoSchema,
|
|
17006
17097
|
adsActivationGrantConsumedDtoSchema,
|
|
@@ -17026,92 +17117,92 @@ var adsActivationGrantDtoSchema = z57.discriminatedUnion("state", [
|
|
|
17026
17117
|
var adsOperationStepBaseShape = {
|
|
17027
17118
|
id: adsEntityIdSchema,
|
|
17028
17119
|
operationId: adsEntityIdSchema,
|
|
17029
|
-
ordinal:
|
|
17120
|
+
ordinal: z58.number().int().nonnegative(),
|
|
17030
17121
|
entityType: adsActivationEntityTypeSchema,
|
|
17031
17122
|
entityId: adsEntityIdSchema,
|
|
17032
|
-
expectedUpdatedAt:
|
|
17123
|
+
expectedUpdatedAt: z58.number().int().nonnegative(),
|
|
17033
17124
|
createdAt: adsActivationIsoTimestampSchema,
|
|
17034
17125
|
updatedAt: adsActivationIsoTimestampSchema
|
|
17035
17126
|
};
|
|
17036
17127
|
var adsOperationStepNoErrorShape = {
|
|
17037
|
-
errorCode:
|
|
17038
|
-
errorMessage:
|
|
17128
|
+
errorCode: z58.null(),
|
|
17129
|
+
errorMessage: z58.null()
|
|
17039
17130
|
};
|
|
17040
17131
|
var adsOperationStepErrorShape = {
|
|
17041
|
-
errorCode:
|
|
17042
|
-
errorMessage:
|
|
17043
|
-
remediation:
|
|
17132
|
+
errorCode: z58.string().min(1).max(100),
|
|
17133
|
+
errorMessage: z58.string().min(1).max(500),
|
|
17134
|
+
remediation: z58.string().min(1).max(500)
|
|
17044
17135
|
};
|
|
17045
|
-
var adsOperationStepPendingDtoSchema =
|
|
17136
|
+
var adsOperationStepPendingDtoSchema = z58.object({
|
|
17046
17137
|
...adsOperationStepBaseShape,
|
|
17047
17138
|
...adsOperationStepNoErrorShape,
|
|
17048
|
-
state:
|
|
17049
|
-
providerUpdatedAt:
|
|
17050
|
-
remediation:
|
|
17051
|
-
startedAt:
|
|
17052
|
-
finishedAt:
|
|
17139
|
+
state: z58.literal(AdsOperationStepStates.pending),
|
|
17140
|
+
providerUpdatedAt: z58.null(),
|
|
17141
|
+
remediation: z58.null(),
|
|
17142
|
+
startedAt: z58.null(),
|
|
17143
|
+
finishedAt: z58.null()
|
|
17053
17144
|
}).strict();
|
|
17054
|
-
var adsOperationStepExecutingDtoSchema =
|
|
17145
|
+
var adsOperationStepExecutingDtoSchema = z58.object({
|
|
17055
17146
|
...adsOperationStepBaseShape,
|
|
17056
17147
|
...adsOperationStepNoErrorShape,
|
|
17057
|
-
state:
|
|
17058
|
-
providerUpdatedAt:
|
|
17059
|
-
remediation:
|
|
17148
|
+
state: z58.literal(AdsOperationStepStates.executing),
|
|
17149
|
+
providerUpdatedAt: z58.null(),
|
|
17150
|
+
remediation: z58.null(),
|
|
17060
17151
|
startedAt: adsActivationIsoTimestampSchema,
|
|
17061
|
-
finishedAt:
|
|
17152
|
+
finishedAt: z58.null()
|
|
17062
17153
|
}).strict();
|
|
17063
|
-
var adsOperationStepActiveDtoSchema =
|
|
17154
|
+
var adsOperationStepActiveDtoSchema = z58.object({
|
|
17064
17155
|
...adsOperationStepBaseShape,
|
|
17065
17156
|
...adsOperationStepNoErrorShape,
|
|
17066
|
-
state:
|
|
17067
|
-
providerUpdatedAt:
|
|
17068
|
-
remediation:
|
|
17157
|
+
state: z58.literal(AdsOperationStepStates.active),
|
|
17158
|
+
providerUpdatedAt: z58.number().int().nonnegative(),
|
|
17159
|
+
remediation: z58.null(),
|
|
17069
17160
|
startedAt: adsActivationIsoTimestampSchema,
|
|
17070
17161
|
finishedAt: adsActivationIsoTimestampSchema
|
|
17071
17162
|
}).strict();
|
|
17072
|
-
var adsOperationStepFailedDtoSchema =
|
|
17163
|
+
var adsOperationStepFailedDtoSchema = z58.object({
|
|
17073
17164
|
...adsOperationStepBaseShape,
|
|
17074
17165
|
...adsOperationStepErrorShape,
|
|
17075
|
-
state:
|
|
17076
|
-
providerUpdatedAt:
|
|
17166
|
+
state: z58.literal(AdsOperationStepStates.failed),
|
|
17167
|
+
providerUpdatedAt: z58.union([z58.number().int().nonnegative(), z58.null()]),
|
|
17077
17168
|
startedAt: adsActivationIsoTimestampSchema,
|
|
17078
17169
|
finishedAt: adsActivationIsoTimestampSchema
|
|
17079
17170
|
}).strict();
|
|
17080
|
-
var adsOperationStepRollbackExecutingDtoSchema =
|
|
17171
|
+
var adsOperationStepRollbackExecutingDtoSchema = z58.object({
|
|
17081
17172
|
...adsOperationStepBaseShape,
|
|
17082
17173
|
...adsOperationStepNoErrorShape,
|
|
17083
|
-
state:
|
|
17084
|
-
providerUpdatedAt:
|
|
17085
|
-
remediation:
|
|
17174
|
+
state: z58.literal(AdsOperationStepStates.rollback_executing),
|
|
17175
|
+
providerUpdatedAt: z58.number().int().nonnegative(),
|
|
17176
|
+
remediation: z58.string().min(1).max(500),
|
|
17086
17177
|
startedAt: adsActivationIsoTimestampSchema,
|
|
17087
|
-
finishedAt:
|
|
17178
|
+
finishedAt: z58.null()
|
|
17088
17179
|
}).strict();
|
|
17089
|
-
var adsOperationStepRolledBackDtoSchema =
|
|
17180
|
+
var adsOperationStepRolledBackDtoSchema = z58.object({
|
|
17090
17181
|
...adsOperationStepBaseShape,
|
|
17091
17182
|
...adsOperationStepNoErrorShape,
|
|
17092
|
-
state:
|
|
17093
|
-
providerUpdatedAt:
|
|
17094
|
-
remediation:
|
|
17183
|
+
state: z58.literal(AdsOperationStepStates.rolled_back),
|
|
17184
|
+
providerUpdatedAt: z58.number().int().nonnegative(),
|
|
17185
|
+
remediation: z58.string().min(1).max(500),
|
|
17095
17186
|
startedAt: adsActivationIsoTimestampSchema,
|
|
17096
17187
|
finishedAt: adsActivationIsoTimestampSchema
|
|
17097
17188
|
}).strict();
|
|
17098
|
-
var adsOperationStepRollbackFailedDtoSchema =
|
|
17189
|
+
var adsOperationStepRollbackFailedDtoSchema = z58.object({
|
|
17099
17190
|
...adsOperationStepBaseShape,
|
|
17100
17191
|
...adsOperationStepErrorShape,
|
|
17101
|
-
state:
|
|
17102
|
-
providerUpdatedAt:
|
|
17192
|
+
state: z58.literal(AdsOperationStepStates.rollback_failed),
|
|
17193
|
+
providerUpdatedAt: z58.number().int().nonnegative(),
|
|
17103
17194
|
startedAt: adsActivationIsoTimestampSchema,
|
|
17104
17195
|
finishedAt: adsActivationIsoTimestampSchema
|
|
17105
17196
|
}).strict();
|
|
17106
|
-
var adsOperationStepUnknownDtoSchema =
|
|
17197
|
+
var adsOperationStepUnknownDtoSchema = z58.object({
|
|
17107
17198
|
...adsOperationStepBaseShape,
|
|
17108
17199
|
...adsOperationStepErrorShape,
|
|
17109
|
-
state:
|
|
17110
|
-
providerUpdatedAt:
|
|
17200
|
+
state: z58.literal(AdsOperationStepStates.unknown),
|
|
17201
|
+
providerUpdatedAt: z58.union([z58.number().int().nonnegative(), z58.null()]),
|
|
17111
17202
|
startedAt: adsActivationIsoTimestampSchema,
|
|
17112
17203
|
finishedAt: adsActivationIsoTimestampSchema
|
|
17113
17204
|
}).strict();
|
|
17114
|
-
var adsOperationStepDtoSchema =
|
|
17205
|
+
var adsOperationStepDtoSchema = z58.discriminatedUnion("state", [
|
|
17115
17206
|
adsOperationStepPendingDtoSchema,
|
|
17116
17207
|
adsOperationStepExecutingDtoSchema,
|
|
17117
17208
|
adsOperationStepActiveDtoSchema,
|
|
@@ -17125,29 +17216,29 @@ var AdsActivationVersionPolicies = {
|
|
|
17125
17216
|
exact: "exact",
|
|
17126
17217
|
refreshSemanticallyUnchanged: "refresh_semantically_unchanged"
|
|
17127
17218
|
};
|
|
17128
|
-
var adsActivationVersionPolicySchema =
|
|
17219
|
+
var adsActivationVersionPolicySchema = z58.enum([
|
|
17129
17220
|
AdsActivationVersionPolicies.exact,
|
|
17130
17221
|
AdsActivationVersionPolicies.refreshSemanticallyUnchanged
|
|
17131
17222
|
]);
|
|
17132
|
-
var adsActivationGrantCreateRequestSchema =
|
|
17223
|
+
var adsActivationGrantCreateRequestSchema = z58.object({
|
|
17133
17224
|
manifest: adsActivationManifestSchema,
|
|
17134
17225
|
executorApiKeyId: adsEntityIdSchema,
|
|
17135
17226
|
expiresAt: adsActivationIsoTimestampSchema,
|
|
17136
17227
|
versionPolicy: adsActivationVersionPolicySchema.default(AdsActivationVersionPolicies.exact)
|
|
17137
17228
|
}).strict();
|
|
17138
|
-
var adsActivationGrantResponseSchema =
|
|
17229
|
+
var adsActivationGrantResponseSchema = z58.object({
|
|
17139
17230
|
grant: adsActivationGrantDtoSchema
|
|
17140
17231
|
}).strict();
|
|
17141
|
-
var adsActivationGrantRevokeRequestSchema =
|
|
17142
|
-
var adsActivateTreeRequestSchema =
|
|
17232
|
+
var adsActivationGrantRevokeRequestSchema = z58.object({}).strict();
|
|
17233
|
+
var adsActivateTreeRequestSchema = z58.object({
|
|
17143
17234
|
operationKey: adsOperationKeySchema,
|
|
17144
17235
|
grantId: adsEntityIdSchema,
|
|
17145
17236
|
manifestHash: adsActivationManifestHashSchema
|
|
17146
17237
|
}).strict();
|
|
17147
|
-
var adsActivateTreeResponseSchema =
|
|
17238
|
+
var adsActivateTreeResponseSchema = z58.object({
|
|
17148
17239
|
grant: adsActivationGrantDtoSchema,
|
|
17149
17240
|
operation: adsOperationDtoSchema,
|
|
17150
|
-
steps:
|
|
17241
|
+
steps: z58.array(adsOperationStepDtoSchema)
|
|
17151
17242
|
}).strict();
|
|
17152
17243
|
var adsUnresolvedOperationStatesDefault = [
|
|
17153
17244
|
AdsOperationStates.pending,
|
|
@@ -17166,102 +17257,102 @@ function parseUnresolvedOperationStates(value) {
|
|
|
17166
17257
|
}
|
|
17167
17258
|
return typeof value === "string" ? value.split(",").filter(Boolean) : value;
|
|
17168
17259
|
}
|
|
17169
|
-
var adsUnresolvedOperationListQuerySchema =
|
|
17170
|
-
state:
|
|
17260
|
+
var adsUnresolvedOperationListQuerySchema = z58.object({
|
|
17261
|
+
state: z58.preprocess(
|
|
17171
17262
|
parseUnresolvedOperationStates,
|
|
17172
|
-
|
|
17263
|
+
z58.array(adsUnresolvedOperationStateSchema).min(1).max(3).refine((states) => new Set(states).size === states.length, "state values must be unique")
|
|
17173
17264
|
),
|
|
17174
|
-
limit:
|
|
17175
|
-
cursor:
|
|
17265
|
+
limit: z58.coerce.number().int().min(1).max(200).default(100),
|
|
17266
|
+
cursor: z58.string().min(1).max(1e3).optional()
|
|
17176
17267
|
});
|
|
17177
|
-
var adsUnresolvedOperationListResponseSchema =
|
|
17178
|
-
operations:
|
|
17179
|
-
count:
|
|
17180
|
-
nextCursor:
|
|
17268
|
+
var adsUnresolvedOperationListResponseSchema = z58.object({
|
|
17269
|
+
operations: z58.array(adsOperationDtoSchema),
|
|
17270
|
+
count: z58.number().int().nonnegative(),
|
|
17271
|
+
nextCursor: z58.string().nullable()
|
|
17181
17272
|
});
|
|
17182
|
-
var adsOperationReconcileRequestSchema =
|
|
17183
|
-
var adsOperationReconcileResponseSchema =
|
|
17273
|
+
var adsOperationReconcileRequestSchema = z58.object({}).strict();
|
|
17274
|
+
var adsOperationReconcileResponseSchema = z58.object({
|
|
17184
17275
|
operation: adsOperationDtoSchema,
|
|
17185
|
-
resolved:
|
|
17276
|
+
resolved: z58.boolean()
|
|
17186
17277
|
});
|
|
17187
|
-
var adsLiveDeliveryQuerySchema =
|
|
17188
|
-
campaignId:
|
|
17189
|
-
lookbackDays:
|
|
17278
|
+
var adsLiveDeliveryQuerySchema = z58.object({
|
|
17279
|
+
campaignId: z58.string().min(1).max(200).optional(),
|
|
17280
|
+
lookbackDays: z58.coerce.number().int().min(1).max(30).default(7)
|
|
17190
17281
|
});
|
|
17191
|
-
var adsLiveEntityTypeSchema =
|
|
17282
|
+
var adsLiveEntityTypeSchema = z58.enum(["campaign", "ad_group", "ad"]);
|
|
17192
17283
|
var AdsLiveEntityTypes = adsLiveEntityTypeSchema.enum;
|
|
17193
|
-
var adsLivePresenceSchema =
|
|
17284
|
+
var adsLivePresenceSchema = z58.enum(["both", "live-only", "stored-only"]);
|
|
17194
17285
|
var AdsLivePresences = adsLivePresenceSchema.enum;
|
|
17195
|
-
var adsLiveDeliveryBasisSchema =
|
|
17286
|
+
var adsLiveDeliveryBasisSchema = z58.literal("live-provider-read");
|
|
17196
17287
|
var AdsLiveDeliveryBases = { liveProviderRead: "live-provider-read" };
|
|
17197
|
-
var adsLiveMetricRowSchema =
|
|
17198
|
-
date:
|
|
17199
|
-
startTime:
|
|
17200
|
-
endTime:
|
|
17201
|
-
impressions:
|
|
17202
|
-
clicks:
|
|
17203
|
-
spend:
|
|
17204
|
-
conversions:
|
|
17205
|
-
ctr:
|
|
17206
|
-
cpc:
|
|
17207
|
-
cpm:
|
|
17208
|
-
});
|
|
17209
|
-
var adsLiveMetricValuesSchema =
|
|
17210
|
-
impressions:
|
|
17211
|
-
clicks:
|
|
17212
|
-
spendMicros:
|
|
17213
|
-
conversions:
|
|
17214
|
-
});
|
|
17215
|
-
var adsLiveMetricDeltaSchema =
|
|
17216
|
-
date:
|
|
17288
|
+
var adsLiveMetricRowSchema = z58.object({
|
|
17289
|
+
date: z58.string().nullable(),
|
|
17290
|
+
startTime: z58.number().nullable(),
|
|
17291
|
+
endTime: z58.number().nullable(),
|
|
17292
|
+
impressions: z58.number().nullable(),
|
|
17293
|
+
clicks: z58.number().nullable(),
|
|
17294
|
+
spend: z58.number().nullable(),
|
|
17295
|
+
conversions: z58.number().nullable(),
|
|
17296
|
+
ctr: z58.number().nullable(),
|
|
17297
|
+
cpc: z58.number().nullable(),
|
|
17298
|
+
cpm: z58.number().nullable()
|
|
17299
|
+
});
|
|
17300
|
+
var adsLiveMetricValuesSchema = z58.object({
|
|
17301
|
+
impressions: z58.number().int(),
|
|
17302
|
+
clicks: z58.number().int(),
|
|
17303
|
+
spendMicros: z58.number().int(),
|
|
17304
|
+
conversions: z58.number().int()
|
|
17305
|
+
});
|
|
17306
|
+
var adsLiveMetricDeltaSchema = z58.object({
|
|
17307
|
+
date: z58.string(),
|
|
17217
17308
|
live: adsLiveMetricValuesSchema.nullable(),
|
|
17218
17309
|
stored: adsLiveMetricValuesSchema.nullable(),
|
|
17219
|
-
drifted:
|
|
17220
|
-
});
|
|
17221
|
-
var adsLiveFieldDeltaSchema =
|
|
17222
|
-
field:
|
|
17223
|
-
live:
|
|
17224
|
-
stored:
|
|
17225
|
-
});
|
|
17226
|
-
var adsLiveEntityStateSchema =
|
|
17227
|
-
name:
|
|
17228
|
-
status:
|
|
17229
|
-
reviewStatus:
|
|
17230
|
-
mode:
|
|
17231
|
-
updatedAt:
|
|
17232
|
-
});
|
|
17233
|
-
var adsStoredEntityStateSchema =
|
|
17234
|
-
name:
|
|
17235
|
-
status:
|
|
17236
|
-
reviewStatus:
|
|
17237
|
-
upstreamUpdatedAt:
|
|
17238
|
-
syncedAt:
|
|
17239
|
-
});
|
|
17240
|
-
var adsLiveEntityComparisonSchema =
|
|
17310
|
+
drifted: z58.boolean()
|
|
17311
|
+
});
|
|
17312
|
+
var adsLiveFieldDeltaSchema = z58.object({
|
|
17313
|
+
field: z58.string(),
|
|
17314
|
+
live: z58.string().nullable(),
|
|
17315
|
+
stored: z58.string().nullable()
|
|
17316
|
+
});
|
|
17317
|
+
var adsLiveEntityStateSchema = z58.object({
|
|
17318
|
+
name: z58.string().nullable(),
|
|
17319
|
+
status: z58.string(),
|
|
17320
|
+
reviewStatus: z58.string().nullable(),
|
|
17321
|
+
mode: z58.string().nullable(),
|
|
17322
|
+
updatedAt: z58.number().nullable()
|
|
17323
|
+
});
|
|
17324
|
+
var adsStoredEntityStateSchema = z58.object({
|
|
17325
|
+
name: z58.string(),
|
|
17326
|
+
status: z58.string(),
|
|
17327
|
+
reviewStatus: z58.string().nullable(),
|
|
17328
|
+
upstreamUpdatedAt: z58.number().nullable(),
|
|
17329
|
+
syncedAt: z58.string()
|
|
17330
|
+
});
|
|
17331
|
+
var adsLiveEntityComparisonSchema = z58.object({
|
|
17241
17332
|
entityType: adsLiveEntityTypeSchema,
|
|
17242
|
-
id:
|
|
17243
|
-
parentId:
|
|
17333
|
+
id: z58.string(),
|
|
17334
|
+
parentId: z58.string().nullable(),
|
|
17244
17335
|
presence: adsLivePresenceSchema,
|
|
17245
17336
|
live: adsLiveEntityStateSchema.nullable(),
|
|
17246
17337
|
stored: adsStoredEntityStateSchema.nullable(),
|
|
17247
|
-
fieldDeltas:
|
|
17338
|
+
fieldDeltas: z58.array(adsLiveFieldDeltaSchema),
|
|
17248
17339
|
/** Provider rows, unaggregated. Null for ads (no per-ad insights surface). */
|
|
17249
|
-
liveMetrics:
|
|
17250
|
-
metricDeltas:
|
|
17251
|
-
drifted:
|
|
17340
|
+
liveMetrics: z58.array(adsLiveMetricRowSchema).nullable(),
|
|
17341
|
+
metricDeltas: z58.array(adsLiveMetricDeltaSchema).nullable(),
|
|
17342
|
+
drifted: z58.boolean()
|
|
17252
17343
|
});
|
|
17253
|
-
var adsLiveReadFailureSchema =
|
|
17254
|
-
surface:
|
|
17255
|
-
entityId:
|
|
17256
|
-
upstreamStatus:
|
|
17344
|
+
var adsLiveReadFailureSchema = z58.object({
|
|
17345
|
+
surface: z58.string(),
|
|
17346
|
+
entityId: z58.string().nullable(),
|
|
17347
|
+
upstreamStatus: z58.number().int().nullable()
|
|
17257
17348
|
});
|
|
17258
|
-
var adsLiveDeliveryDtoSchema =
|
|
17349
|
+
var adsLiveDeliveryDtoSchema = z58.object({
|
|
17259
17350
|
basis: adsLiveDeliveryBasisSchema,
|
|
17260
17351
|
/** Instant the live read was issued; the metrics window is measured back from it. */
|
|
17261
|
-
fetchedAt:
|
|
17262
|
-
adAccountId:
|
|
17263
|
-
storedSnapshotSyncedAt:
|
|
17264
|
-
metricsWindow:
|
|
17352
|
+
fetchedAt: z58.string(),
|
|
17353
|
+
adAccountId: z58.string(),
|
|
17354
|
+
storedSnapshotSyncedAt: z58.string().nullable(),
|
|
17355
|
+
metricsWindow: z58.object({ lookbackDays: z58.number().int().positive() }),
|
|
17265
17356
|
/**
|
|
17266
17357
|
* Two different units live here, and confusing them understates the cost of
|
|
17267
17358
|
* this endpoint by two orders of magnitude.
|
|
@@ -17277,28 +17368,28 @@ var adsLiveDeliveryDtoSchema = z57.object({
|
|
|
17277
17368
|
* no observed HTTP-request count: the pagination happens inside the provider
|
|
17278
17369
|
* client, below the injected reader seam, so the route cannot see it.
|
|
17279
17370
|
*/
|
|
17280
|
-
bounds:
|
|
17281
|
-
maxCampaigns:
|
|
17282
|
-
maxAdGroupsPerCampaign:
|
|
17283
|
-
maxAdsPerAdGroup:
|
|
17371
|
+
bounds: z58.object({
|
|
17372
|
+
maxCampaigns: z58.number().int().positive(),
|
|
17373
|
+
maxAdGroupsPerCampaign: z58.number().int().positive(),
|
|
17374
|
+
maxAdsPerAdGroup: z58.number().int().positive(),
|
|
17284
17375
|
/** Budget in logical reader calls, NOT in upstream HTTP requests. */
|
|
17285
|
-
maxReaderCalls:
|
|
17376
|
+
maxReaderCalls: z58.number().int().positive(),
|
|
17286
17377
|
/** Reader calls this read actually issued. Observed, not a bound. */
|
|
17287
|
-
readerCalls:
|
|
17378
|
+
readerCalls: z58.number().int().nonnegative(),
|
|
17288
17379
|
/** Pages one paginated reader call may fetch before the client gives up. */
|
|
17289
|
-
maxPagesPerReaderCall:
|
|
17380
|
+
maxPagesPerReaderCall: z58.number().int().positive(),
|
|
17290
17381
|
/** Worst-case upstream HTTP requests. A documented bound, not an observation. */
|
|
17291
|
-
maxUpstreamHttpRequests:
|
|
17292
|
-
truncated:
|
|
17382
|
+
maxUpstreamHttpRequests: z58.number().int().positive(),
|
|
17383
|
+
truncated: z58.boolean()
|
|
17293
17384
|
}),
|
|
17294
|
-
entities:
|
|
17295
|
-
drift:
|
|
17296
|
-
entitiesCompared:
|
|
17297
|
-
driftedEntities:
|
|
17298
|
-
statusDrifted:
|
|
17299
|
-
metricsDrifted:
|
|
17385
|
+
entities: z58.array(adsLiveEntityComparisonSchema),
|
|
17386
|
+
drift: z58.object({
|
|
17387
|
+
entitiesCompared: z58.number().int().nonnegative(),
|
|
17388
|
+
driftedEntities: z58.number().int().nonnegative(),
|
|
17389
|
+
statusDrifted: z58.number().int().nonnegative(),
|
|
17390
|
+
metricsDrifted: z58.number().int().nonnegative()
|
|
17300
17391
|
}),
|
|
17301
|
-
errors:
|
|
17392
|
+
errors: z58.array(adsLiveReadFailureSchema)
|
|
17302
17393
|
});
|
|
17303
17394
|
function adsCtr(clicks, impressions) {
|
|
17304
17395
|
return impressions > 0 ? clicks / impressions : null;
|
|
@@ -17326,9 +17417,9 @@ function isLocationRedirectStatus(status) {
|
|
|
17326
17417
|
}
|
|
17327
17418
|
|
|
17328
17419
|
// ../contracts/src/health.ts
|
|
17329
|
-
import { z as
|
|
17330
|
-
var mcpHealthSchema =
|
|
17331
|
-
status:
|
|
17420
|
+
import { z as z59 } from "zod";
|
|
17421
|
+
var mcpHealthSchema = z59.object({
|
|
17422
|
+
status: z59.enum(["available", "unavailable", "not-supported"])
|
|
17332
17423
|
});
|
|
17333
17424
|
|
|
17334
17425
|
// ../contracts/src/sql-like.ts
|
|
@@ -17491,16 +17582,16 @@ function classifyProviderErrorMessages(messages) {
|
|
|
17491
17582
|
}
|
|
17492
17583
|
|
|
17493
17584
|
// ../contracts/src/telemetry.ts
|
|
17494
|
-
import { z as
|
|
17585
|
+
import { z as z60 } from "zod";
|
|
17495
17586
|
var ONBOARDING_FLOW_VERSION = 1;
|
|
17496
|
-
var onboardingStepSchema =
|
|
17587
|
+
var onboardingStepSchema = z60.enum([
|
|
17497
17588
|
"system",
|
|
17498
17589
|
"project",
|
|
17499
17590
|
"queries",
|
|
17500
17591
|
"competitors",
|
|
17501
17592
|
"run"
|
|
17502
17593
|
]);
|
|
17503
|
-
var onboardingCountBucketSchema =
|
|
17594
|
+
var onboardingCountBucketSchema = z60.enum([
|
|
17504
17595
|
"0",
|
|
17505
17596
|
"1",
|
|
17506
17597
|
"2-3",
|
|
@@ -17516,7 +17607,7 @@ function bucketOnboardingCount(value) {
|
|
|
17516
17607
|
if (value < 11) return "6-10";
|
|
17517
17608
|
return "11+";
|
|
17518
17609
|
}
|
|
17519
|
-
var onboardingBlockReasonSchema =
|
|
17610
|
+
var onboardingBlockReasonSchema = z60.enum([
|
|
17520
17611
|
"api_unavailable",
|
|
17521
17612
|
"database_unavailable",
|
|
17522
17613
|
"worker_unavailable",
|
|
@@ -17536,39 +17627,39 @@ var onboardingBlockReasonSchema = z59.enum([
|
|
|
17536
17627
|
"network",
|
|
17537
17628
|
"unknown"
|
|
17538
17629
|
]);
|
|
17539
|
-
var onboardingSurfaceSchema =
|
|
17630
|
+
var onboardingSurfaceSchema = z60.enum([
|
|
17540
17631
|
"wizard",
|
|
17541
17632
|
"platform",
|
|
17542
17633
|
"site_health"
|
|
17543
17634
|
]);
|
|
17544
|
-
var onboardingEventBaseSchema =
|
|
17545
|
-
eventId:
|
|
17546
|
-
flowVersion:
|
|
17547
|
-
onboardingSessionId:
|
|
17635
|
+
var onboardingEventBaseSchema = z60.object({
|
|
17636
|
+
eventId: z60.string().uuid(),
|
|
17637
|
+
flowVersion: z60.literal(ONBOARDING_FLOW_VERSION),
|
|
17638
|
+
onboardingSessionId: z60.string().uuid(),
|
|
17548
17639
|
surface: onboardingSurfaceSchema.optional()
|
|
17549
17640
|
});
|
|
17550
|
-
var onboardingTelemetryEventSchema =
|
|
17641
|
+
var onboardingTelemetryEventSchema = z60.discriminatedUnion("event", [
|
|
17551
17642
|
onboardingEventBaseSchema.extend({
|
|
17552
|
-
event:
|
|
17643
|
+
event: z60.literal("onboarding.started"),
|
|
17553
17644
|
step: onboardingStepSchema,
|
|
17554
|
-
resumed:
|
|
17645
|
+
resumed: z60.boolean()
|
|
17555
17646
|
}).strict(),
|
|
17556
17647
|
onboardingEventBaseSchema.extend({
|
|
17557
|
-
event:
|
|
17648
|
+
event: z60.literal("onboarding.step_completed"),
|
|
17558
17649
|
step: onboardingStepSchema,
|
|
17559
|
-
method:
|
|
17650
|
+
method: z60.enum(["existing", "inline", "manual", "generated", "skipped", "automatic"]),
|
|
17560
17651
|
countBucket: onboardingCountBucketSchema.optional()
|
|
17561
17652
|
}).strict(),
|
|
17562
17653
|
onboardingEventBaseSchema.extend({
|
|
17563
|
-
event:
|
|
17654
|
+
event: z60.literal("onboarding.blocked"),
|
|
17564
17655
|
step: onboardingStepSchema,
|
|
17565
|
-
action:
|
|
17656
|
+
action: z60.enum(["continue", "configure_provider", "generate_queries", "save", "launch_run", "retry_run"]),
|
|
17566
17657
|
reasonCode: onboardingBlockReasonSchema
|
|
17567
17658
|
}).strict(),
|
|
17568
17659
|
onboardingEventBaseSchema.extend({
|
|
17569
|
-
event:
|
|
17570
|
-
origin:
|
|
17571
|
-
result:
|
|
17660
|
+
event: z60.literal("run.requested"),
|
|
17661
|
+
origin: z60.literal("dashboard_setup"),
|
|
17662
|
+
result: z60.enum(["queued", "rejected"]),
|
|
17572
17663
|
/**
|
|
17573
17664
|
* What kind of run was asked for. A site-health crawl has no providers and
|
|
17574
17665
|
* no tracked queries, so its buckets are legitimately `0`; without this
|
|
@@ -17577,7 +17668,7 @@ var onboardingTelemetryEventSchema = z59.discriminatedUnion("event", [
|
|
|
17577
17668
|
* `surface`: a documented fallback that nothing applies becomes a null
|
|
17578
17669
|
* bucket downstream.
|
|
17579
17670
|
*/
|
|
17580
|
-
kind:
|
|
17671
|
+
kind: z60.enum(["answer_visibility", "site_health"]).optional(),
|
|
17581
17672
|
providerCountBucket: onboardingCountBucketSchema,
|
|
17582
17673
|
queryCountBucket: onboardingCountBucketSchema,
|
|
17583
17674
|
reasonCode: onboardingBlockReasonSchema.optional()
|
|
@@ -17587,8 +17678,8 @@ function normalizeOnboardingEventForCollection(event) {
|
|
|
17587
17678
|
const surfaced = { ...event, surface: event.surface ?? "wizard" };
|
|
17588
17679
|
return surfaced.event === "run.requested" ? { ...surfaced, kind: surfaced.kind ?? "answer_visibility" } : surfaced;
|
|
17589
17680
|
}
|
|
17590
|
-
var telemetryEventAcceptedDtoSchema =
|
|
17591
|
-
accepted:
|
|
17681
|
+
var telemetryEventAcceptedDtoSchema = z60.object({
|
|
17682
|
+
accepted: z60.boolean()
|
|
17592
17683
|
});
|
|
17593
17684
|
var GHOST_TELEMETRY_TEST_LOCATIONS = /* @__PURE__ */ new Set(["nyc", "lax", "chi"]);
|
|
17594
17685
|
function isGhostTelemetryEvent(eventName, properties) {
|
|
@@ -18198,6 +18289,14 @@ export {
|
|
|
18198
18289
|
citationVisibilityResponseSchema,
|
|
18199
18290
|
emptyCitationVisibility,
|
|
18200
18291
|
citationStateToCited,
|
|
18292
|
+
REPORT_VISIBILITY_COPY,
|
|
18293
|
+
reportQueryClassLabel,
|
|
18294
|
+
reportVisibilityRate,
|
|
18295
|
+
reportVisibilityEvidence,
|
|
18296
|
+
reportVisibilityComparison,
|
|
18297
|
+
reportVisibilityMeasurementLabel,
|
|
18298
|
+
reportVisibilityHistoryLabel,
|
|
18299
|
+
reportVisibilityLocationLabel,
|
|
18201
18300
|
REPORT_PERIOD_OPTIONS,
|
|
18202
18301
|
reportPeriodSchema,
|
|
18203
18302
|
parseReportPeriodDays,
|