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