siteplane 0.1.45 → 0.1.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -93,12 +93,41 @@ var analyticsProviderImportSchema = z3.object({
93
93
  rows: z3.array(analyticsProviderImportRowSchema).min(1).max(1e3)
94
94
  }).strict();
95
95
 
96
- // ../shared/dist/analytics-events.js
96
+ // ../shared/dist/analytics-config.js
97
97
  import { z as z4 } from "zod";
98
+ var ANALYTICS_CONFIG_LEASE_MS = 6e4;
99
+ var analyticsMeasurementConfigSchema = z4.object({
100
+ version: z4.literal(1),
101
+ installationGeneration: z4.number().int().positive(),
102
+ configRevision: z4.number().int().positive(),
103
+ effectiveSiteMode: z4.enum(["disabled", "session_only", "full_analytics"]),
104
+ measurementEnabled: z4.boolean(),
105
+ issuedAt: z4.string().datetime({ offset: true }),
106
+ expiresAt: z4.string().datetime({ offset: true })
107
+ }).strict().superRefine((config, context) => {
108
+ const lifetime = Date.parse(config.expiresAt) - Date.parse(config.issuedAt);
109
+ if (lifetime <= 0 || lifetime > ANALYTICS_CONFIG_LEASE_MS) {
110
+ context.addIssue({
111
+ code: "custom",
112
+ path: ["expiresAt"],
113
+ message: "Measurement permission must expire within 60 seconds."
114
+ });
115
+ }
116
+ if (config.measurementEnabled !== (config.effectiveSiteMode !== "disabled")) {
117
+ context.addIssue({
118
+ code: "custom",
119
+ path: ["measurementEnabled"],
120
+ message: "Measurement permission must match the effective site mode."
121
+ });
122
+ }
123
+ });
124
+
125
+ // ../shared/dist/analytics-events.js
126
+ import { z as z5 } from "zod";
98
127
  var ANALYTICS_SCHEMA_VERSION = "analytics.v1";
99
- var analyticsSessionIdSchema = z4.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
100
- var analyticsVisitorIdSchema = z4.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
101
- var analyticsPersistedIdentityHashSchema = z4.string().regex(/^[a-f0-9]{64}$/u);
128
+ var analyticsSessionIdSchema = z5.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
129
+ var analyticsVisitorIdSchema = z5.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
130
+ var analyticsPersistedIdentityHashSchema = z5.string().regex(/^[a-f0-9]{64}$/u);
102
131
  var analyticsEventNames = [
103
132
  "page_view",
104
133
  "section_view",
@@ -178,41 +207,43 @@ var analyticsValidityStatuses = [
178
207
  "rejected",
179
208
  "ignored"
180
209
  ];
181
- var analyticsEventNameSchema = z4.enum(analyticsEventNames);
182
- var serverOnlyAnalyticsEventSchema = z4.enum(serverOnlyAnalyticsEvents);
183
- var analyticsEventSourceSchema = z4.enum(analyticsEventSources);
184
- var analyticsIngestionChannelSchema = z4.enum(analyticsIngestionChannels);
185
- var analyticsTargetTypeSchema = z4.enum(analyticsTargetTypes);
186
- var analyticsDataAttributeEventSchema = z4.enum(analyticsDataAttributeEvents);
187
- var analyticsDeviceTypeSchema = z4.enum(analyticsDeviceTypes);
188
- var analyticsBotClassificationSchema = z4.enum(analyticsBotClassifications);
189
- var analyticsValidityStatusSchema = z4.enum(analyticsValidityStatuses);
190
- var analyticsPropertiesSchema = z4.record(z4.string(), z4.unknown());
191
- var analyticsTimestampSchema = z4.string().datetime({ offset: true });
192
- var analyticsBrowserEventSchema = z4.object({
193
- eventId: z4.string().min(1).max(160),
210
+ var analyticsEventNameSchema = z5.enum(analyticsEventNames);
211
+ var serverOnlyAnalyticsEventSchema = z5.enum(serverOnlyAnalyticsEvents);
212
+ var analyticsEventSourceSchema = z5.enum(analyticsEventSources);
213
+ var analyticsIngestionChannelSchema = z5.enum(analyticsIngestionChannels);
214
+ var analyticsTargetTypeSchema = z5.enum(analyticsTargetTypes);
215
+ var analyticsDataAttributeEventSchema = z5.enum(analyticsDataAttributeEvents);
216
+ var analyticsDeviceTypeSchema = z5.enum(analyticsDeviceTypes);
217
+ var analyticsBotClassificationSchema = z5.enum(analyticsBotClassifications);
218
+ var analyticsValidityStatusSchema = z5.enum(analyticsValidityStatuses);
219
+ var analyticsPropertiesSchema = z5.record(z5.string(), z5.unknown());
220
+ var analyticsTimestampSchema = z5.string().datetime({ offset: true });
221
+ var analyticsBrowserEventSchema = z5.object({
222
+ eventId: z5.string().min(1).max(160),
223
+ installationGeneration: z5.number().int().positive().optional(),
224
+ measurementMode: z5.enum(["session_only", "full_analytics"]).optional(),
194
225
  eventName: analyticsEventNameSchema,
195
226
  eventSource: analyticsEventSourceSchema.optional().default("browser"),
196
- targetId: z4.string().min(1).max(160).optional(),
227
+ targetId: z5.string().min(1).max(160).optional(),
197
228
  targetType: analyticsTargetTypeSchema.optional(),
198
229
  visitorId: analyticsVisitorIdSchema.optional(),
199
230
  sessionId: analyticsSessionIdSchema,
200
- idempotencyKey: z4.string().min(1).max(240).optional(),
231
+ idempotencyKey: z5.string().min(1).max(240).optional(),
201
232
  occurredAt: analyticsTimestampSchema,
202
- pageUrl: z4.string().url().max(2048).optional(),
203
- pagePath: z4.string().min(1).max(1024).optional(),
204
- routeTemplate: z4.string().min(1).max(1024).optional(),
205
- referrer: z4.string().url().max(2048).optional(),
206
- utmSource: z4.string().min(1).max(200).optional(),
207
- utmMedium: z4.string().min(1).max(200).optional(),
208
- utmCampaign: z4.string().min(1).max(200).optional(),
209
- utmContent: z4.string().min(1).max(200).optional(),
210
- utmTerm: z4.string().min(1).max(200).optional(),
233
+ pageUrl: z5.string().url().max(2048).optional(),
234
+ pagePath: z5.string().min(1).max(1024).optional(),
235
+ routeTemplate: z5.string().min(1).max(1024).optional(),
236
+ referrer: z5.string().url().max(2048).optional(),
237
+ utmSource: z5.string().min(1).max(200).optional(),
238
+ utmMedium: z5.string().min(1).max(200).optional(),
239
+ utmCampaign: z5.string().min(1).max(200).optional(),
240
+ utmContent: z5.string().min(1).max(200).optional(),
241
+ utmTerm: z5.string().min(1).max(200).optional(),
211
242
  deviceType: analyticsDeviceTypeSchema.optional(),
212
- browserName: z4.string().min(1).max(120).optional(),
213
- osName: z4.string().min(1).max(120).optional(),
214
- country: z4.string().min(1).max(80).optional(),
215
- region: z4.string().min(1).max(120).optional(),
243
+ browserName: z5.string().min(1).max(120).optional(),
244
+ osName: z5.string().min(1).max(120).optional(),
245
+ country: z5.string().min(1).max(80).optional(),
246
+ region: z5.string().min(1).max(120).optional(),
216
247
  properties: analyticsPropertiesSchema.optional().default({})
217
248
  }).superRefine((event, context) => {
218
249
  if (isServerOnlyAnalyticsEvent(event.eventName)) {
@@ -237,44 +268,44 @@ var analyticsBrowserEventSchema = z4.object({
237
268
  });
238
269
  }
239
270
  });
240
- var analyticsBrowserEventPayloadSchema = z4.object({
241
- siteKey: z4.string().min(1),
242
- schemaVersion: z4.literal(ANALYTICS_SCHEMA_VERSION),
243
- mode: z4.enum(["live", "test"]).optional().default("live"),
244
- events: z4.array(analyticsBrowserEventSchema).min(1).max(50)
271
+ var analyticsBrowserEventPayloadSchema = z5.object({
272
+ siteKey: z5.string().min(1),
273
+ schemaVersion: z5.literal(ANALYTICS_SCHEMA_VERSION),
274
+ mode: z5.enum(["live", "test"]).optional().default("live"),
275
+ events: z5.array(analyticsBrowserEventSchema).min(1).max(50)
245
276
  });
246
- var analyticsNormalizedEventBaseSchema = z4.object({
247
- site_id: z4.string().uuid(),
248
- event_id: z4.string().min(1).max(160),
249
- schema_version: z4.literal(ANALYTICS_SCHEMA_VERSION),
277
+ var analyticsNormalizedEventBaseSchema = z5.object({
278
+ site_id: z5.string().uuid(),
279
+ event_id: z5.string().min(1).max(160),
280
+ schema_version: z5.literal(ANALYTICS_SCHEMA_VERSION),
250
281
  event_name: analyticsEventNameSchema,
251
282
  event_source: analyticsEventSourceSchema,
252
283
  ingestion_channel: analyticsIngestionChannelSchema,
253
- target_id: z4.string().min(1).max(160).nullable().optional(),
284
+ target_id: z5.string().min(1).max(160).nullable().optional(),
254
285
  target_type: analyticsTargetTypeSchema.nullable().optional(),
255
- dedupe_key: z4.string().regex(/^analytics_dedupe_v1_[a-f0-9]{64}$/u).nullable().optional(),
256
- idempotency_key: z4.string().min(1).max(240).nullable().optional(),
286
+ dedupe_key: z5.string().regex(/^analytics_dedupe_v1_[a-f0-9]{64}$/u).nullable().optional(),
287
+ idempotency_key: z5.string().min(1).max(240).nullable().optional(),
257
288
  bot_classification: analyticsBotClassificationSchema,
258
289
  validity_status: analyticsValidityStatusSchema,
259
- rejection_reason: z4.string().min(1).max(240).nullable().optional(),
290
+ rejection_reason: z5.string().min(1).max(240).nullable().optional(),
260
291
  occurred_at: analyticsTimestampSchema,
261
292
  received_at: analyticsTimestampSchema,
262
- page_url: z4.string().url().max(2048).nullable().optional(),
263
- page_path: z4.string().min(1).max(1024).nullable().optional(),
264
- route_template: z4.string().min(1).max(1024).nullable().optional(),
265
- referrer: z4.string().url().max(2048).nullable().optional(),
266
- utm_source: z4.string().min(1).max(200).nullable().optional(),
267
- utm_medium: z4.string().min(1).max(200).nullable().optional(),
268
- utm_campaign: z4.string().min(1).max(200).nullable().optional(),
269
- utm_content: z4.string().min(1).max(200).nullable().optional(),
270
- utm_term: z4.string().min(1).max(200).nullable().optional(),
271
- country: z4.string().min(1).max(80).nullable().optional(),
272
- region: z4.string().min(1).max(120).nullable().optional(),
293
+ page_url: z5.string().url().max(2048).nullable().optional(),
294
+ page_path: z5.string().min(1).max(1024).nullable().optional(),
295
+ route_template: z5.string().min(1).max(1024).nullable().optional(),
296
+ referrer: z5.string().url().max(2048).nullable().optional(),
297
+ utm_source: z5.string().min(1).max(200).nullable().optional(),
298
+ utm_medium: z5.string().min(1).max(200).nullable().optional(),
299
+ utm_campaign: z5.string().min(1).max(200).nullable().optional(),
300
+ utm_content: z5.string().min(1).max(200).nullable().optional(),
301
+ utm_term: z5.string().min(1).max(200).nullable().optional(),
302
+ country: z5.string().min(1).max(80).nullable().optional(),
303
+ region: z5.string().min(1).max(120).nullable().optional(),
273
304
  device_type: analyticsDeviceTypeSchema,
274
- browser_name: z4.string().min(1).max(120).nullable().optional(),
275
- os_name: z4.string().min(1).max(120).nullable().optional(),
276
- provider: z4.string().min(1).max(120).nullable().optional(),
277
- provider_event_id: z4.string().min(1).max(240).nullable().optional(),
305
+ browser_name: z5.string().min(1).max(120).nullable().optional(),
306
+ os_name: z5.string().min(1).max(120).nullable().optional(),
307
+ provider: z5.string().min(1).max(120).nullable().optional(),
308
+ provider_event_id: z5.string().min(1).max(240).nullable().optional(),
278
309
  properties: analyticsPropertiesSchema
279
310
  });
280
311
  var analyticsRawNormalizedEventSchema = analyticsNormalizedEventBaseSchema.extend({
@@ -290,11 +321,11 @@ function isServerOnlyAnalyticsEvent(eventName) {
290
321
  }
291
322
 
292
323
  // ../shared/dist/analytics-manifest.js
293
- import { z as z5 } from "zod";
294
- var analyticsTargetIdSchema = z5.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
324
+ import { z as z6 } from "zod";
325
+ var analyticsTargetIdSchema = z6.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
295
326
  message: "Analytics target IDs must be stable identifiers without whitespace or visible copy."
296
327
  });
297
- var analyticsManifestRecordSchema = z5.record(z5.string(), z5.unknown());
328
+ var analyticsManifestRecordSchema = z6.record(z6.string(), z6.unknown());
298
329
  var analyticsFormPurposes = [
299
330
  "contact",
300
331
  "lead",
@@ -303,21 +334,21 @@ var analyticsFormPurposes = [
303
334
  "login",
304
335
  "other"
305
336
  ];
306
- var analyticsFormPurposeSchema = z5.enum(analyticsFormPurposes);
307
- var analyticsManifestRouteSchema = z5.object({
308
- path: z5.string().min(1).max(1024),
309
- pageType: z5.string().min(1).max(120).optional(),
310
- label: z5.string().min(1).max(200).optional()
337
+ var analyticsFormPurposeSchema = z6.enum(analyticsFormPurposes);
338
+ var analyticsManifestRouteSchema = z6.object({
339
+ path: z6.string().min(1).max(1024),
340
+ pageType: z6.string().min(1).max(120).optional(),
341
+ label: z6.string().min(1).max(200).optional()
311
342
  }).passthrough();
312
- var analyticsManifestTargetSchema = z5.object({
343
+ var analyticsManifestTargetSchema = z6.object({
313
344
  id: analyticsTargetIdSchema,
314
345
  type: analyticsTargetTypeSchema,
315
346
  event: analyticsEventNameSchema.optional(),
316
- events: z5.array(analyticsEventNameSchema).min(1).max(20).optional(),
317
- route: z5.string().min(1).max(1024).optional(),
318
- label: z5.string().min(1).max(200).optional(),
319
- description: z5.string().min(1).max(1e3).optional(),
320
- autoActive: z5.boolean().optional(),
347
+ events: z6.array(analyticsEventNameSchema).min(1).max(20).optional(),
348
+ route: z6.string().min(1).max(1024).optional(),
349
+ label: z6.string().min(1).max(200).optional(),
350
+ description: z6.string().min(1).max(1e3).optional(),
351
+ autoActive: z6.boolean().optional(),
321
352
  sourceHints: analyticsManifestRecordSchema.optional()
322
353
  }).passthrough().superRefine((target, context) => {
323
354
  if (target.event === void 0 && target.events === void 0) {
@@ -342,21 +373,21 @@ var analyticsManifestTargetSchema = z5.object({
342
373
  });
343
374
  }
344
375
  });
345
- var analyticsManifestSchema = z5.object({
346
- schemaVersion: z5.literal(ANALYTICS_SCHEMA_VERSION),
347
- siteId: z5.string().min(1),
348
- siteKeyRef: z5.string().regex(/^env:[A-Z][A-Z0-9_]*$/u, {
376
+ var analyticsManifestSchema = z6.object({
377
+ schemaVersion: z6.literal(ANALYTICS_SCHEMA_VERSION),
378
+ siteId: z6.string().min(1),
379
+ siteKeyRef: z6.string().regex(/^env:[A-Z][A-Z0-9_]*$/u, {
349
380
  message: "siteKeyRef must be an environment-variable reference."
350
381
  }),
351
- siteKeyLookup: z5.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}$/),
352
- routes: z5.array(analyticsManifestRouteSchema),
353
- targets: z5.array(analyticsManifestTargetSchema),
382
+ siteKeyLookup: z6.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}$/),
383
+ routes: z6.array(analyticsManifestRouteSchema),
384
+ targets: z6.array(analyticsManifestTargetSchema),
354
385
  metadata: analyticsManifestRecordSchema.optional(),
355
- siteKey: z5.string().optional(),
356
- secretKey: z5.string().optional(),
357
- rawKey: z5.string().optional(),
358
- token: z5.string().optional(),
359
- accessToken: z5.string().optional()
386
+ siteKey: z6.string().optional(),
387
+ secretKey: z6.string().optional(),
388
+ rawKey: z6.string().optional(),
389
+ token: z6.string().optional(),
390
+ accessToken: z6.string().optional()
360
391
  }).passthrough().superRefine((manifest, context) => {
361
392
  const targetIds = /* @__PURE__ */ new Set();
362
393
  for (const [index, target] of manifest.targets.entries()) {
@@ -400,9 +431,9 @@ function isPlainRecord(value) {
400
431
  }
401
432
 
402
433
  // ../shared/dist/analytics-metrics.js
403
- import { z as z6 } from "zod";
434
+ import { z as z7 } from "zod";
404
435
  var analyticsVisitorQualities = ["exact", "estimated"];
405
- var analyticsVisitorQualitySchema = z6.enum(analyticsVisitorQualities);
436
+ var analyticsVisitorQualitySchema = z7.enum(analyticsVisitorQualities);
406
437
  var analyticsKpiKeys = [
407
438
  "pageViews",
408
439
  "sessions",
@@ -414,7 +445,7 @@ var analyticsKpiKeys = [
414
445
  "conversionRate",
415
446
  "inquiryRate"
416
447
  ];
417
- var analyticsKpiKeySchema = z6.enum(analyticsKpiKeys);
448
+ var analyticsKpiKeySchema = z7.enum(analyticsKpiKeys);
418
449
 
419
450
  // ../shared/dist/analytics-privacy.js
420
451
  var serverPropertySchemas = {
@@ -452,7 +483,7 @@ function revenuePropertySchema() {
452
483
  }
453
484
 
454
485
  // ../shared/dist/assets.js
455
- import { z as z7 } from "zod";
486
+ import { z as z8 } from "zod";
456
487
  var ASSET_STAGES = ["staging", "final", "deleted"];
457
488
  var ASSET_VISIBILITIES = ["private", "public", "deleted"];
458
489
  var ASSET_USAGE_ENTITY_TYPES = [
@@ -461,13 +492,13 @@ var ASSET_USAGE_ENTITY_TYPES = [
461
492
  "change_set",
462
493
  "published_value"
463
494
  ];
464
- var assetStageSchema = z7.enum(ASSET_STAGES);
465
- var assetVisibilitySchema = z7.enum(ASSET_VISIBILITIES);
466
- var assetUsageEntityTypeSchema = z7.enum(ASSET_USAGE_ENTITY_TYPES);
467
- var brandingAccentColorSchema = z7.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
495
+ var assetStageSchema = z8.enum(ASSET_STAGES);
496
+ var assetVisibilitySchema = z8.enum(ASSET_VISIBILITIES);
497
+ var assetUsageEntityTypeSchema = z8.enum(ASSET_USAGE_ENTITY_TYPES);
498
+ var brandingAccentColorSchema = z8.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
468
499
 
469
500
  // ../shared/dist/booking-contracts.js
470
- import { z as z8 } from "zod";
501
+ import { z as z9 } from "zod";
471
502
  var bookingStatuses = [
472
503
  "pending_payment",
473
504
  "confirmed",
@@ -522,30 +553,30 @@ var bookingResourceKinds = [
522
553
  "equipment",
523
554
  "other"
524
555
  ];
525
- var bookingStatusSchema = z8.enum(bookingStatuses);
526
- var bookingPaymentStatusSchema = z8.enum(bookingPaymentStatuses);
527
- var bookingAccountReadinessStatusSchema = z8.enum(bookingAccountReadinessStatuses);
528
- var bookingRefundStatusSchema = z8.enum(bookingRefundStatuses);
529
- var bookingDisputeStatusSchema = z8.enum(bookingDisputeStatuses);
530
- var bookingPaymentModeSchema = z8.enum(bookingPaymentModes);
531
- var bookingPaymentCollectionTypeSchema = z8.enum(bookingPaymentCollectionTypes);
532
- var bookingPaymentCollectionSchema = z8.discriminatedUnion("type", [
533
- z8.object({ type: z8.literal("full_amount") }).strict(),
534
- z8.object({
535
- type: z8.literal("deposit_percent"),
536
- depositPercent: z8.number().int().min(10).max(90)
556
+ var bookingStatusSchema = z9.enum(bookingStatuses);
557
+ var bookingPaymentStatusSchema = z9.enum(bookingPaymentStatuses);
558
+ var bookingAccountReadinessStatusSchema = z9.enum(bookingAccountReadinessStatuses);
559
+ var bookingRefundStatusSchema = z9.enum(bookingRefundStatuses);
560
+ var bookingDisputeStatusSchema = z9.enum(bookingDisputeStatuses);
561
+ var bookingPaymentModeSchema = z9.enum(bookingPaymentModes);
562
+ var bookingPaymentCollectionTypeSchema = z9.enum(bookingPaymentCollectionTypes);
563
+ var bookingPaymentCollectionSchema = z9.discriminatedUnion("type", [
564
+ z9.object({ type: z9.literal("full_amount") }).strict(),
565
+ z9.object({
566
+ type: z9.literal("deposit_percent"),
567
+ depositPercent: z9.number().int().min(10).max(90)
537
568
  }).strict()
538
569
  ]);
539
570
  var bookingPaymentChoices = ["onsite", "online"];
540
- var bookingPaymentChoiceSchema = z8.enum(bookingPaymentChoices);
541
- var bookingPaymentSnapshotSchema = z8.object({
542
- snapshotId: z8.string().uuid(),
543
- snapshotVersion: z8.number().int().positive(),
544
- currency: z8.literal("EUR"),
545
- totalAmountCents: z8.number().int().min(0),
546
- onlineAmountCents: z8.number().int().min(0),
547
- onsiteRemainderCents: z8.number().int().min(0),
548
- maxStripeRefundAmountCents: z8.number().int().min(0)
571
+ var bookingPaymentChoiceSchema = z9.enum(bookingPaymentChoices);
572
+ var bookingPaymentSnapshotSchema = z9.object({
573
+ snapshotId: z9.string().uuid(),
574
+ snapshotVersion: z9.number().int().positive(),
575
+ currency: z9.literal("EUR"),
576
+ totalAmountCents: z9.number().int().min(0),
577
+ onlineAmountCents: z9.number().int().min(0),
578
+ onsiteRemainderCents: z9.number().int().min(0),
579
+ maxStripeRefundAmountCents: z9.number().int().min(0)
549
580
  }).strict().superRefine((snapshot, context) => {
550
581
  if (snapshot.onlineAmountCents + snapshot.onsiteRemainderCents !== snapshot.totalAmountCents) {
551
582
  context.addIssue({
@@ -560,17 +591,17 @@ var bookingPaymentSnapshotSchema = z8.object({
560
591
  });
561
592
  }
562
593
  });
563
- var bookingServiceVariantSchema = z8.object({
564
- id: z8.string().uuid(),
565
- name: z8.string().trim().min(1).max(120),
566
- durationMinutes: z8.number().int().min(1).max(1440),
567
- priceCents: z8.number().int().min(0).nullable()
594
+ var bookingServiceVariantSchema = z9.object({
595
+ id: z9.string().uuid(),
596
+ name: z9.string().trim().min(1).max(120),
597
+ durationMinutes: z9.number().int().min(1).max(1440),
598
+ priceCents: z9.number().int().min(0).nullable()
568
599
  }).strict();
569
- var bookingServiceVariantsSchema = z8.array(bookingServiceVariantSchema).min(1).max(20);
570
- var isoDateSchema = z8.string().regex(/^\d{4}-\d{2}-\d{2}$/);
571
- var utcDateTimeSchema = z8.string().datetime();
572
- var bookingLocalTimeSchema = z8.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
573
- var bookingAvailabilityIntervalsSchema = z8.array(z8.object({
600
+ var bookingServiceVariantsSchema = z9.array(bookingServiceVariantSchema).min(1).max(20);
601
+ var isoDateSchema = z9.string().regex(/^\d{4}-\d{2}-\d{2}$/);
602
+ var utcDateTimeSchema = z9.string().datetime();
603
+ var bookingLocalTimeSchema = z9.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
604
+ var bookingAvailabilityIntervalsSchema = z9.array(z9.object({
574
605
  start: bookingLocalTimeSchema,
575
606
  end: bookingLocalTimeSchema
576
607
  }).strict().refine((interval) => interval.end > interval.start)).superRefine((intervals, context) => {
@@ -585,75 +616,75 @@ var bookingAvailabilityIntervalsSchema = z8.array(z8.object({
585
616
  }
586
617
  }
587
618
  });
588
- var bookingPublicConfigSchema = z8.object({
589
- site: z8.object({
590
- displayName: z8.string().trim().min(1),
591
- timezone: z8.string().trim().min(1),
592
- locale: z8.string().trim().min(2),
593
- bookingPageSlug: z8.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
594
- privacyUrl: z8.string().url().nullable()
619
+ var bookingPublicConfigSchema = z9.object({
620
+ site: z9.object({
621
+ displayName: z9.string().trim().min(1),
622
+ timezone: z9.string().trim().min(1),
623
+ locale: z9.string().trim().min(2),
624
+ bookingPageSlug: z9.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
625
+ privacyUrl: z9.string().url().nullable()
595
626
  }),
596
- branding: z8.object({
597
- logoUrl: z8.string().url().nullable(),
598
- accentColor: z8.string().trim().min(1).nullable()
627
+ branding: z9.object({
628
+ logoUrl: z9.string().url().nullable(),
629
+ accentColor: z9.string().trim().min(1).nullable()
599
630
  }),
600
- settings: z8.object({
601
- slotIntervalMinutes: z8.number().int().positive(),
602
- minLeadMinutes: z8.number().int().min(0),
603
- maxAdvanceDays: z8.number().int().min(1),
604
- requirePhone: z8.boolean(),
605
- collectNote: z8.boolean(),
606
- confirmationMessage: z8.string().nullable()
631
+ settings: z9.object({
632
+ slotIntervalMinutes: z9.number().int().positive(),
633
+ minLeadMinutes: z9.number().int().min(0),
634
+ maxAdvanceDays: z9.number().int().min(1),
635
+ requirePhone: z9.boolean(),
636
+ collectNote: z9.boolean(),
637
+ confirmationMessage: z9.string().nullable()
607
638
  }),
608
639
  /** Freitexte des Salons, im Kassen-Schritt vor der Bestaetigung sichtbar. */
609
- policies: z8.object({
610
- cancellation: z8.string().nullable(),
611
- lateArrival: z8.string().nullable()
640
+ policies: z9.object({
641
+ cancellation: z9.string().nullable(),
642
+ lateArrival: z9.string().nullable()
612
643
  }),
613
- payment: z8.object({
644
+ payment: z9.object({
614
645
  mode: bookingPaymentModeSchema,
615
646
  collection: bookingPaymentCollectionSchema,
616
- onlinePaymentsReady: z8.boolean()
647
+ onlinePaymentsReady: z9.boolean()
617
648
  }).strict(),
618
- serviceCategories: z8.array(z8.object({
619
- id: z8.string().uuid(),
620
- name: z8.string().trim().min(1),
621
- sortOrder: z8.number().int()
649
+ serviceCategories: z9.array(z9.object({
650
+ id: z9.string().uuid(),
651
+ name: z9.string().trim().min(1),
652
+ sortOrder: z9.number().int()
622
653
  })),
623
- serviceSubcategories: z8.array(z8.object({
624
- id: z8.string().uuid(),
625
- categoryId: z8.string().uuid(),
626
- name: z8.string().trim().min(1),
627
- sortOrder: z8.number().int()
654
+ serviceSubcategories: z9.array(z9.object({
655
+ id: z9.string().uuid(),
656
+ categoryId: z9.string().uuid(),
657
+ name: z9.string().trim().min(1),
658
+ sortOrder: z9.number().int()
628
659
  })),
629
- services: z8.array(z8.object({
630
- id: z8.string().trim().min(1),
631
- name: z8.string().trim().min(1),
632
- durationMinutes: z8.number().int().positive(),
633
- priceCents: z8.number().int().min(0).nullable(),
634
- currency: z8.string().regex(/^[A-Z]{3}$/),
635
- description: z8.string().nullable(),
636
- categoryId: z8.string().uuid(),
637
- subcategoryId: z8.string().uuid().nullable(),
660
+ services: z9.array(z9.object({
661
+ id: z9.string().trim().min(1),
662
+ name: z9.string().trim().min(1),
663
+ durationMinutes: z9.number().int().positive(),
664
+ priceCents: z9.number().int().min(0).nullable(),
665
+ currency: z9.string().regex(/^[A-Z]{3}$/),
666
+ description: z9.string().nullable(),
667
+ categoryId: z9.string().uuid(),
668
+ subcategoryId: z9.string().uuid().nullable(),
638
669
  variants: bookingServiceVariantsSchema,
639
- allowsAnyResource: z8.boolean(),
640
- sortOrder: z8.number().int()
670
+ allowsAnyResource: z9.boolean(),
671
+ sortOrder: z9.number().int()
641
672
  })),
642
- resources: z8.array(z8.object({
643
- id: z8.string().trim().min(1),
644
- name: z8.string().trim().min(1),
645
- kind: z8.enum(bookingResourceKinds)
673
+ resources: z9.array(z9.object({
674
+ id: z9.string().trim().min(1),
675
+ name: z9.string().trim().min(1),
676
+ kind: z9.enum(bookingResourceKinds)
646
677
  })),
647
- serviceResources: z8.array(z8.object({
648
- serviceId: z8.string().trim().min(1),
649
- resourceId: z8.string().trim().min(1)
678
+ serviceResources: z9.array(z9.object({
679
+ serviceId: z9.string().trim().min(1),
680
+ resourceId: z9.string().trim().min(1)
650
681
  }))
651
682
  });
652
- var bookingItemSchema = z8.object({
653
- serviceId: z8.string().trim().min(1),
654
- variantId: z8.string().trim().min(1)
683
+ var bookingItemSchema = z9.object({
684
+ serviceId: z9.string().trim().min(1),
685
+ variantId: z9.string().trim().min(1)
655
686
  }).strict();
656
- var bookingItemsSchema = z8.array(bookingItemSchema).min(1).max(10);
687
+ var bookingItemsSchema = z9.array(bookingItemSchema).min(1).max(10);
657
688
  function parseBookingItemsParam(value) {
658
689
  const items = value.split(",").map((entry) => entry.trim()).filter((entry) => entry !== "").map((entry) => {
659
690
  const [serviceId, variantId, ...rest] = entry.split(":");
@@ -661,36 +692,36 @@ function parseBookingItemsParam(value) {
661
692
  });
662
693
  return items.every((item) => item !== null) ? items : null;
663
694
  }
664
- var bookingSlotsQuerySchema = z8.object({
665
- items: z8.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
666
- resourceId: z8.string().trim().min(1).optional(),
695
+ var bookingSlotsQuerySchema = z9.object({
696
+ items: z9.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
697
+ resourceId: z9.string().trim().min(1).optional(),
667
698
  fromDate: isoDateSchema,
668
699
  toDate: isoDateSchema
669
700
  });
670
- var bookingSlotsResponseSchema = z8.object({
671
- timezone: z8.string().trim().min(1),
701
+ var bookingSlotsResponseSchema = z9.object({
702
+ timezone: z9.string().trim().min(1),
672
703
  items: bookingItemsSchema,
673
704
  // Reine Behandlungsdauer ohne Puffer: das UI zeigt damit die Terminspanne,
674
705
  // ohne selbst rechnen zu muessen.
675
- totalDurationMinutes: z8.number().int().min(1),
676
- mode: z8.enum(["any", "resource"]),
677
- slots: z8.array(z8.object({
706
+ totalDurationMinutes: z9.number().int().min(1),
707
+ mode: z9.enum(["any", "resource"]),
708
+ slots: z9.array(z9.object({
678
709
  startUtc: utcDateTimeSchema,
679
- resourceId: z8.string().trim().min(1).optional()
710
+ resourceId: z9.string().trim().min(1).optional()
680
711
  }))
681
712
  });
682
- var bookingAvailabilityQuerySchema = z8.object({
683
- items: z8.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
684
- resourceId: z8.string().trim().min(1).optional(),
713
+ var bookingAvailabilityQuerySchema = z9.object({
714
+ items: z9.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
715
+ resourceId: z9.string().trim().min(1).optional(),
685
716
  fromDate: isoDateSchema,
686
717
  toDate: isoDateSchema
687
718
  });
688
- var bookingAvailabilityResponseSchema = z8.object({
689
- timezone: z8.string().trim().min(1),
690
- totalDurationMinutes: z8.number().int().min(1),
691
- days: z8.array(z8.object({
719
+ var bookingAvailabilityResponseSchema = z9.object({
720
+ timezone: z9.string().trim().min(1),
721
+ totalDurationMinutes: z9.number().int().min(1),
722
+ days: z9.array(z9.object({
692
723
  date: isoDateSchema,
693
- hasSlots: z8.boolean()
724
+ hasSlots: z9.boolean()
694
725
  })),
695
726
  /** Erster Tag mit Slot ab `fromDate`, auch ausserhalb des Fensters. */
696
727
  nextAvailableDate: isoDateSchema.nullable()
@@ -708,72 +739,72 @@ var bookingPublicErrorCodes = [
708
739
  "too_late",
709
740
  "not_found"
710
741
  ];
711
- var bookingPublicErrorSchema = z8.object({
712
- error: z8.enum(bookingPublicErrorCodes),
713
- message: z8.string().optional(),
714
- requestId: z8.string().optional()
742
+ var bookingPublicErrorSchema = z9.object({
743
+ error: z9.enum(bookingPublicErrorCodes),
744
+ message: z9.string().optional(),
745
+ requestId: z9.string().optional()
715
746
  }).strict();
716
- var bookingCreateRequestSchema = z8.object({
747
+ var bookingCreateRequestSchema = z9.object({
717
748
  items: bookingItemsSchema,
718
- resourceId: z8.string().min(1).nullable(),
749
+ resourceId: z9.string().min(1).nullable(),
719
750
  startUtc: utcDateTimeSchema,
720
- customer: z8.object({
721
- name: z8.string().min(1).max(120),
722
- email: z8.string().email().max(254),
723
- phone: z8.string().max(32).optional(),
724
- note: z8.string().max(1e3).optional()
751
+ customer: z9.object({
752
+ name: z9.string().min(1).max(120),
753
+ email: z9.string().email().max(254),
754
+ phone: z9.string().max(32).optional(),
755
+ note: z9.string().max(1e3).optional()
725
756
  }).strict(),
726
- hp: z8.string().optional(),
727
- clientToken: z8.string().uuid(),
757
+ hp: z9.string().optional(),
758
+ clientToken: z9.string().uuid(),
728
759
  paymentChoice: bookingPaymentChoiceSchema,
729
760
  // Werbe-Einwilligung. Bestaetigung, Erinnerung und Storno-Link sind davon
730
761
  // unabhaengig und werden immer versendet.
731
- consent: z8.object({
732
- marketingEmail: z8.boolean(),
733
- marketingSms: z8.boolean()
762
+ consent: z9.object({
763
+ marketingEmail: z9.boolean(),
764
+ marketingSms: z9.boolean()
734
765
  }).strict().optional()
735
766
  }).strict();
736
- var bookingPublicPaymentResponseSchema = z8.object({
737
- clientSecret: z8.string().min(1),
738
- stripeAccountId: z8.string().startsWith("acct_")
767
+ var bookingPublicPaymentResponseSchema = z9.object({
768
+ clientSecret: z9.string().min(1),
769
+ stripeAccountId: z9.string().startsWith("acct_")
739
770
  }).strict();
740
- var bookingCreateResponseSchema = z8.union([
741
- z8.object({
742
- status: z8.literal("confirmed"),
743
- booking: z8.object({
744
- id: z8.string().min(1),
771
+ var bookingCreateResponseSchema = z9.union([
772
+ z9.object({
773
+ status: z9.literal("confirmed"),
774
+ booking: z9.object({
775
+ id: z9.string().min(1),
745
776
  startUtc: utcDateTimeSchema,
746
777
  endUtc: utcDateTimeSchema,
747
- timezone: z8.string().trim().min(1),
748
- serviceName: z8.string().trim().min(1),
749
- resourceName: z8.string().trim().min(1)
778
+ timezone: z9.string().trim().min(1),
779
+ serviceName: z9.string().trim().min(1),
780
+ resourceName: z9.string().trim().min(1)
750
781
  }).strict(),
751
- manageUrl: z8.string().url(),
752
- confirmationMessage: z8.string().nullable()
782
+ manageUrl: z9.string().url(),
783
+ confirmationMessage: z9.string().nullable()
753
784
  }).strict(),
754
- z8.object({
755
- status: z8.literal("pending_payment"),
756
- bookingId: z8.string().min(1),
785
+ z9.object({
786
+ status: z9.literal("pending_payment"),
787
+ bookingId: z9.string().min(1),
757
788
  holdExpiresAt: utcDateTimeSchema,
758
789
  payment: bookingPublicPaymentResponseSchema,
759
- statusToken: z8.string().min(20),
760
- manageUrl: z8.string().url().optional()
790
+ statusToken: z9.string().min(20),
791
+ manageUrl: z9.string().url().optional()
761
792
  }).strict(),
762
793
  bookingPublicErrorSchema
763
794
  ]);
764
- var bookingStatusResponseSchema = z8.object({
795
+ var bookingStatusResponseSchema = z9.object({
765
796
  bookingStatus: bookingStatusSchema,
766
797
  paymentStatus: bookingPaymentStatusSchema,
767
798
  refundStatus: bookingRefundStatusSchema,
768
799
  disputeStatus: bookingDisputeStatusSchema,
769
800
  holdExpiresAt: utcDateTimeSchema.nullable()
770
801
  }).strict();
771
- var bookingCancelRequestSchema = z8.object({
772
- token: z8.string().min(20)
802
+ var bookingCancelRequestSchema = z9.object({
803
+ token: z9.string().min(20)
773
804
  });
774
- var bookingCancelResponseSchema = z8.union([
775
- z8.object({
776
- status: z8.enum(["cancelled", "already_cancelled", "too_late", "not_found"])
805
+ var bookingCancelResponseSchema = z9.union([
806
+ z9.object({
807
+ status: z9.enum(["cancelled", "already_cancelled", "too_late", "not_found"])
777
808
  }),
778
809
  bookingPublicErrorSchema
779
810
  ]);
@@ -782,34 +813,34 @@ var bookingMoveErrorCodes = [
782
813
  "booking_not_movable",
783
814
  "not_found"
784
815
  ];
785
- var bookingMoveRequestSchema = z8.object({
786
- bookingId: z8.string().uuid(),
816
+ var bookingMoveRequestSchema = z9.object({
817
+ bookingId: z9.string().uuid(),
787
818
  newStartUtc: utcDateTimeSchema,
788
- newResourceId: z8.string().uuid().optional(),
789
- notifyCustomer: z8.boolean().default(false),
790
- reason: z8.string().max(500).optional()
791
- });
792
- var bookingMoveResponseSchema = z8.union([
793
- z8.object({
794
- status: z8.literal("moved"),
795
- bookingId: z8.string().uuid(),
819
+ newResourceId: z9.string().uuid().optional(),
820
+ notifyCustomer: z9.boolean().default(false),
821
+ reason: z9.string().max(500).optional()
822
+ });
823
+ var bookingMoveResponseSchema = z9.union([
824
+ z9.object({
825
+ status: z9.literal("moved"),
826
+ bookingId: z9.string().uuid(),
796
827
  startUtc: utcDateTimeSchema,
797
828
  endUtc: utcDateTimeSchema,
798
- resourceId: z8.string().uuid()
829
+ resourceId: z9.string().uuid()
799
830
  }),
800
- z8.object({
801
- error: z8.enum(bookingMoveErrorCodes),
802
- message: z8.string().optional(),
803
- requestId: z8.string().optional()
831
+ z9.object({
832
+ error: z9.enum(bookingMoveErrorCodes),
833
+ message: z9.string().optional(),
834
+ requestId: z9.string().optional()
804
835
  })
805
836
  ]);
806
- var bookingManifestSchema = z8.object({
807
- schemaVersion: z8.number().int().positive(),
808
- siteId: z8.string().trim().min(1),
809
- siteKeyPrefix: z8.string().startsWith("bk_pub_"),
810
- bookingPageSlug: z8.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
811
- embedMode: z8.enum(["script", "web_component", "iframe"]).optional(),
812
- productionOrigin: z8.string().url().optional()
837
+ var bookingManifestSchema = z9.object({
838
+ schemaVersion: z9.number().int().positive(),
839
+ siteId: z9.string().trim().min(1),
840
+ siteKeyPrefix: z9.string().startsWith("bk_pub_"),
841
+ bookingPageSlug: z9.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
842
+ embedMode: z9.enum(["script", "web_component", "iframe"]).optional(),
843
+ productionOrigin: z9.string().url().optional()
813
844
  }).passthrough();
814
845
  var secretManifestKeys = /* @__PURE__ */ new Set([
815
846
  "siteKey",
@@ -831,20 +862,20 @@ function redactBookingManifest(value) {
831
862
  var BOOKING_CREATE_PAYLOAD_LIMIT_BYTES = 16 * 1024;
832
863
 
833
864
  // ../shared/dist/bridge-protocol.js
834
- import { z as z16 } from "zod";
865
+ import { z as z17 } from "zod";
835
866
 
836
867
  // ../shared/dist/field-id.js
837
- import { z as z9 } from "zod";
868
+ import { z as z10 } from "zod";
838
869
  var FIELD_ID_PATTERN = /^[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+$/;
839
- var fieldIdSchema = z9.string().regex(FIELD_ID_PATTERN, "Invalid field id");
870
+ var fieldIdSchema = z10.string().regex(FIELD_ID_PATTERN, "Invalid field id");
840
871
 
841
872
  // ../shared/dist/field-types.js
842
- import { z as z10 } from "zod";
873
+ import { z as z11 } from "zod";
843
874
  var FIELD_TYPES = ["text", "longText", "image", "link"];
844
- var fieldTypeSchema = z10.enum(FIELD_TYPES);
875
+ var fieldTypeSchema = z11.enum(FIELD_TYPES);
845
876
 
846
877
  // ../shared/dist/image-value.js
847
- import { z as z11 } from "zod";
878
+ import { z as z12 } from "zod";
848
879
  var SUPPORTED_IMAGE_CONTENT_TYPES = [
849
880
  "image/jpeg",
850
881
  "image/png",
@@ -853,21 +884,21 @@ var SUPPORTED_IMAGE_CONTENT_TYPES = [
853
884
  ];
854
885
  var maxImageUploadBytes = 10 * 1024 * 1024;
855
886
  var largeImageWarningBytes = 2 * 1024 * 1024;
856
- var imageContentTypeSchema = z11.enum(SUPPORTED_IMAGE_CONTENT_TYPES);
857
- var imageCropSchema = z11.object({
858
- x: z11.number().min(0).max(100),
859
- y: z11.number().min(0).max(100),
860
- zoom: z11.number().min(1).max(4),
861
- aspectRatio: z11.number().positive().max(10)
862
- });
863
- var imageValueSchema = z11.object({
864
- src: z11.string().trim().min(1),
865
- alt: z11.string().trim().min(1).max(300),
866
- width: z11.number().int().positive().optional(),
867
- height: z11.number().int().positive().optional(),
887
+ var imageContentTypeSchema = z12.enum(SUPPORTED_IMAGE_CONTENT_TYPES);
888
+ var imageCropSchema = z12.object({
889
+ x: z12.number().min(0).max(100),
890
+ y: z12.number().min(0).max(100),
891
+ zoom: z12.number().min(1).max(4),
892
+ aspectRatio: z12.number().positive().max(10)
893
+ });
894
+ var imageValueSchema = z12.object({
895
+ src: z12.string().trim().min(1),
896
+ alt: z12.string().trim().min(1).max(300),
897
+ width: z12.number().int().positive().optional(),
898
+ height: z12.number().int().positive().optional(),
868
899
  crop: imageCropSchema.optional(),
869
- assetId: z11.string().uuid().optional(),
870
- finalStorageProvider: z11.enum([
900
+ assetId: z12.string().uuid().optional(),
901
+ finalStorageProvider: z12.enum([
871
902
  "repo_static_assets",
872
903
  "repo_handoff",
873
904
  "site_owned_storage",
@@ -876,31 +907,36 @@ var imageValueSchema = z11.object({
876
907
  });
877
908
 
878
909
  // ../shared/dist/setup-deployment.js
879
- import { z as z12 } from "zod";
880
- var version = z12.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
881
- var hash = z12.string().regex(/^sha256:[0-9a-f]{64}$/u);
882
- var setupDeploymentRecordSchema = z12.object({
883
- version: z12.literal(1),
884
- operationId: z12.string().uuid(),
885
- provider: z12.literal("vercel"),
886
- projectId: z12.string().regex(/^prj_[A-Za-z0-9]+$/u),
887
- teamId: z12.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u),
888
- origin: z12.string().url().refine((value) => {
910
+ import { z as z13 } from "zod";
911
+ var version = z13.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
912
+ var siteSetupPackagesSchema = z13.object({
913
+ siteplane: version,
914
+ runtimeNext: version,
915
+ analytics: version.optional()
916
+ }).strict();
917
+ var hash = z13.string().regex(/^sha256:[0-9a-f]{64}$/u);
918
+ var setupDeploymentRecordSchema = z13.object({
919
+ version: z13.literal(1),
920
+ operationId: z13.string().uuid(),
921
+ provider: z13.literal("vercel"),
922
+ projectId: z13.string().regex(/^prj_[A-Za-z0-9]+$/u),
923
+ teamId: z13.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u),
924
+ origin: z13.string().url().refine((value) => {
889
925
  const url = new URL(value);
890
926
  return url.protocol === "https:" && url.origin === value && !url.username && !url.password;
891
927
  }),
892
- deploymentId: z12.string().regex(/^dpl_[A-Za-z0-9]+$/u).nullable(),
893
- revision: z12.string().regex(/^[0-9a-f]{40}$/u),
928
+ deploymentId: z13.string().regex(/^dpl_[A-Za-z0-9]+$/u).nullable(),
929
+ revision: z13.string().regex(/^[0-9a-f]{40}$/u),
894
930
  fieldContractHash: hash,
895
- packages: z12.object({ siteplane: version, runtimeNext: version }).strict(),
931
+ packages: siteSetupPackagesSchema,
896
932
  configurationFingerprint: hash,
897
- adminSecretGeneration: z12.string().uuid(),
898
- revalidationGeneration: z12.number().int().positive(),
899
- startedAt: z12.string().datetime(),
900
- environmentWrittenAt: z12.string().datetime().nullable(),
901
- deployRequestedAt: z12.string().datetime().nullable(),
902
- deadline: z12.string().datetime(),
903
- phase: z12.enum([
933
+ adminSecretGeneration: z13.string().uuid(),
934
+ revalidationGeneration: z13.number().int().positive(),
935
+ startedAt: z13.string().datetime(),
936
+ environmentWrittenAt: z13.string().datetime().nullable(),
937
+ deployRequestedAt: z13.string().datetime().nullable(),
938
+ deadline: z13.string().datetime(),
939
+ phase: z13.enum([
904
940
  "planned",
905
941
  "environment_written",
906
942
  "deploy_requested",
@@ -908,41 +944,41 @@ var setupDeploymentRecordSchema = z12.object({
908
944
  "verified",
909
945
  "failed"
910
946
  ]),
911
- build: z12.object({
947
+ build: z13.object({
912
948
  node: version,
913
- packageManager: z12.enum(["npm", "pnpm"]),
949
+ packageManager: z13.enum(["npm", "pnpm"]),
914
950
  packageManagerVersion: version,
915
951
  lockfileHash: hash
916
952
  }).strict().nullable()
917
953
  }).strict();
918
- var setupDeploymentInputSchema = z12.discriminatedUnion("action", [
919
- z12.object({ action: z12.literal("read") }).strict(),
920
- z12.object({
921
- action: z12.literal("record"),
922
- expectedOperationId: z12.string().uuid().nullable(),
954
+ var setupDeploymentInputSchema = z13.discriminatedUnion("action", [
955
+ z13.object({ action: z13.literal("read") }).strict(),
956
+ z13.object({
957
+ action: z13.literal("record"),
958
+ expectedOperationId: z13.string().uuid().nullable(),
923
959
  record: setupDeploymentRecordSchema
924
960
  }).strict()
925
961
  ]);
926
962
 
927
963
  // ../shared/dist/site-setup.js
928
- import { z as z15 } from "zod";
964
+ import { z as z16 } from "zod";
929
965
 
930
966
  // ../shared/dist/site-field-contract.js
931
- import { z as z14 } from "zod";
967
+ import { z as z15 } from "zod";
932
968
 
933
969
  // ../shared/dist/fallback-hash.js
934
- import { z as z13 } from "zod";
970
+ import { z as z14 } from "zod";
935
971
  var SAFE_REPRESENTATION_REASONS = [
936
972
  "asset_import_rewritten",
937
973
  "relative_url_normalized",
938
974
  "line_endings_normalized",
939
975
  "image_value_serialized"
940
976
  ];
941
- var safeRepresentationReasonSchema = z13.enum(SAFE_REPRESENTATION_REASONS);
942
- var linkFallbackSchema = z13.object({
943
- href: z13.string().trim().min(1),
944
- label: z13.string().trim().min(1).optional(),
945
- target: z13.enum(["_self", "_blank"]).optional()
977
+ var safeRepresentationReasonSchema = z14.enum(SAFE_REPRESENTATION_REASONS);
978
+ var linkFallbackSchema = z14.object({
979
+ href: z14.string().trim().min(1),
980
+ label: z14.string().trim().min(1).optional(),
981
+ target: z14.enum(["_self", "_blank"]).optional()
946
982
  }).passthrough();
947
983
  function stableJsonStringify(value) {
948
984
  return JSON.stringify(sortObjectKeys(value));
@@ -958,67 +994,67 @@ function sortObjectKeys(value) {
958
994
  }
959
995
 
960
996
  // ../shared/dist/site-field-contract.js
961
- var siteFieldStatusSchema = z14.enum(["hidden", "active"]);
962
- var semanticVersionSchema = z14.string().regex(/^\d+\.\d+\.\d+$/u);
963
- var siteFieldRouteKeySchema = z14.string().trim().refine((value) => value === "$global" || value.startsWith("/") && !value.includes("?") && !value.includes("#") && (value === "/" || !value.endsWith("/")), "Route keys must be canonical paths or $global.");
964
- var repositoryRelativePosixPathSchema = z14.string().trim().min(1).refine((value) => !value.startsWith("/") && !value.includes("\\") && !/^[a-z]:/iu.test(value) && !value.split("/").includes(".."), "Source paths must be repository-relative POSIX paths.");
965
- var sourceMappingSchema = z14.object({
966
- kind: z14.literal("function"),
997
+ var siteFieldStatusSchema = z15.enum(["hidden", "active"]);
998
+ var semanticVersionSchema = z15.string().regex(/^\d+\.\d+\.\d+$/u);
999
+ var siteFieldRouteKeySchema = z15.string().trim().refine((value) => value === "$global" || value.startsWith("/") && !value.includes("?") && !value.includes("#") && (value === "/" || !value.endsWith("/")), "Route keys must be canonical paths or $global.");
1000
+ var repositoryRelativePosixPathSchema = z15.string().trim().min(1).refine((value) => !value.startsWith("/") && !value.includes("\\") && !/^[a-z]:/iu.test(value) && !value.split("/").includes(".."), "Source paths must be repository-relative POSIX paths.");
1001
+ var sourceMappingSchema = z15.object({
1002
+ kind: z15.literal("function"),
967
1003
  filePath: repositoryRelativePosixPathSchema,
968
- exportName: z14.string().trim().min(1).optional(),
969
- sourcePath: z14.string().trim().min(1).optional(),
1004
+ exportName: z15.string().trim().min(1).optional(),
1005
+ sourcePath: z15.string().trim().min(1).optional(),
970
1006
  editTarget: fieldIdSchema.optional()
971
1007
  }).strict();
972
- var domMappingSchema = z14.object({
973
- attribute: z14.literal("data-siteplane-field-id"),
974
- previewStrategy: z14.enum(["dom", "event"])
1008
+ var domMappingSchema = z15.object({
1009
+ attribute: z15.literal("data-siteplane-field-id"),
1010
+ previewStrategy: z15.enum(["dom", "event"])
975
1011
  }).strict();
976
- var fieldBaseSchema = z14.object({
1012
+ var fieldBaseSchema = z15.object({
977
1013
  fieldId: fieldIdSchema,
978
1014
  routeKey: siteFieldRouteKeySchema,
979
1015
  source: sourceMappingSchema,
980
1016
  dom: domMappingSchema.optional()
981
1017
  }).strict();
982
- var linkFallbackSchema2 = z14.object({
983
- href: z14.string().trim().min(1),
984
- label: z14.string().trim().min(1).optional(),
985
- target: z14.enum(["_self", "_blank"]).optional()
1018
+ var linkFallbackSchema2 = z15.object({
1019
+ href: z15.string().trim().min(1),
1020
+ label: z15.string().trim().min(1).optional(),
1021
+ target: z15.enum(["_self", "_blank"]).optional()
986
1022
  }).strict();
987
- var imageFallbackSchema = z14.object({
988
- src: z14.string().trim().min(1),
989
- alt: z14.string().trim().max(300),
990
- width: z14.number().int().positive().optional(),
991
- height: z14.number().int().positive().optional(),
992
- crop: z14.object({
993
- x: z14.number().min(0).max(100),
994
- y: z14.number().min(0).max(100),
995
- zoom: z14.number().min(1).max(4),
996
- aspectRatio: z14.number().positive().max(10)
1023
+ var imageFallbackSchema = z15.object({
1024
+ src: z15.string().trim().min(1),
1025
+ alt: z15.string().trim().max(300),
1026
+ width: z15.number().int().positive().optional(),
1027
+ height: z15.number().int().positive().optional(),
1028
+ crop: z15.object({
1029
+ x: z15.number().min(0).max(100),
1030
+ y: z15.number().min(0).max(100),
1031
+ zoom: z15.number().min(1).max(4),
1032
+ aspectRatio: z15.number().positive().max(10)
997
1033
  }).strict().optional()
998
1034
  }).strict();
999
- var siteFieldContractFieldSchema = z14.discriminatedUnion("fieldType", [
1035
+ var siteFieldContractFieldSchema = z15.discriminatedUnion("fieldType", [
1000
1036
  fieldBaseSchema.extend({
1001
- fieldType: z14.literal("text"),
1002
- fallback: z14.string()
1037
+ fieldType: z15.literal("text"),
1038
+ fallback: z15.string()
1003
1039
  }),
1004
1040
  fieldBaseSchema.extend({
1005
- fieldType: z14.literal("longText"),
1006
- fallback: z14.string()
1041
+ fieldType: z15.literal("longText"),
1042
+ fallback: z15.string()
1007
1043
  }),
1008
1044
  fieldBaseSchema.extend({
1009
- fieldType: z14.literal("link"),
1045
+ fieldType: z15.literal("link"),
1010
1046
  fallback: linkFallbackSchema2
1011
1047
  }),
1012
1048
  fieldBaseSchema.extend({
1013
- fieldType: z14.literal("image"),
1049
+ fieldType: z15.literal("image"),
1014
1050
  fallback: imageFallbackSchema
1015
1051
  })
1016
1052
  ]);
1017
- var siteFieldContractV1Schema = z14.object({
1018
- version: z14.literal(1),
1053
+ var siteFieldContractV1Schema = z15.object({
1054
+ version: z15.literal(1),
1019
1055
  fieldContractVersion: semanticVersionSchema,
1020
1056
  scannerContractVersion: semanticVersionSchema,
1021
- fields: z14.array(siteFieldContractFieldSchema)
1057
+ fields: z15.array(siteFieldContractFieldSchema)
1022
1058
  }).strict().superRefine((contract, context) => {
1023
1059
  const seen = /* @__PURE__ */ new Set();
1024
1060
  for (const [index, field] of contract.fields.entries()) {
@@ -1067,20 +1103,20 @@ var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH = 2e3;
1067
1103
  var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES = 8e3;
1068
1104
  var CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES = 32 * 1024;
1069
1105
  var CONTINUE_SITE_SETUP_HTTP_BODY_MAX_BYTES = 64 * 1024;
1070
- var siteSetupRunStatusSchema = z15.enum(SITE_SETUP_RUN_STATUSES);
1071
- var siteSetupRunModeSchema = z15.enum(SITE_SETUP_RUN_MODES);
1072
- var siteSetupErrorCodeSchema = z15.enum(SITE_SETUP_ERROR_CODES);
1073
- var editorFieldSchema = z15.object({
1106
+ var siteSetupRunStatusSchema = z16.enum(SITE_SETUP_RUN_STATUSES);
1107
+ var siteSetupRunModeSchema = z16.enum(SITE_SETUP_RUN_MODES);
1108
+ var siteSetupErrorCodeSchema = z16.enum(SITE_SETUP_ERROR_CODES);
1109
+ var editorFieldSchema = z16.object({
1074
1110
  fieldId: fieldIdSchema,
1075
- label: z15.string().trim().min(1),
1076
- subsection: z15.string().trim().min(1).optional(),
1077
- description: z15.string().trim().min(1).optional(),
1078
- required: z15.boolean().optional(),
1079
- maxLength: z15.number().int().positive().optional()
1111
+ label: z16.string().trim().min(1),
1112
+ subsection: z16.string().trim().min(1).optional(),
1113
+ description: z16.string().trim().min(1).optional(),
1114
+ required: z16.boolean().optional(),
1115
+ maxLength: z16.number().int().positive().optional()
1080
1116
  }).strict();
1081
- var editorSectionSchema = z15.object({
1082
- label: z15.string().trim().min(1),
1083
- fields: z15.array(editorFieldSchema).min(1)
1117
+ var editorSectionSchema = z16.object({
1118
+ label: z16.string().trim().min(1),
1119
+ fields: z16.array(editorFieldSchema).min(1)
1084
1120
  }).strict().superRefine((section, context) => {
1085
1121
  const closedSubsections = /* @__PURE__ */ new Set();
1086
1122
  let currentSubsection;
@@ -1099,10 +1135,10 @@ var editorSectionSchema = z15.object({
1099
1135
  }
1100
1136
  }
1101
1137
  });
1102
- var editorRouteSchema = z15.object({
1138
+ var editorRouteSchema = z16.object({
1103
1139
  routeKey: siteFieldRouteKeySchema,
1104
- label: z15.string().trim().min(1),
1105
- sections: z15.array(editorSectionSchema).min(1)
1140
+ label: z16.string().trim().min(1),
1141
+ sections: z16.array(editorSectionSchema).min(1)
1106
1142
  }).strict().superRefine((route, context) => {
1107
1143
  const sections = /* @__PURE__ */ new Set();
1108
1144
  for (const [index, section] of route.sections.entries()) {
@@ -1116,9 +1152,9 @@ var editorRouteSchema = z15.object({
1116
1152
  sections.add(section.label);
1117
1153
  }
1118
1154
  });
1119
- var editorDefinitionV1Schema = z15.object({
1120
- version: z15.literal(1),
1121
- routes: z15.array(editorRouteSchema).min(1)
1155
+ var editorDefinitionV1Schema = z16.object({
1156
+ version: z16.literal(1),
1157
+ routes: z16.array(editorRouteSchema).min(1)
1122
1158
  }).strict().superRefine((definition, context) => {
1123
1159
  const routes = /* @__PURE__ */ new Set();
1124
1160
  const fields = /* @__PURE__ */ new Set();
@@ -1156,7 +1192,7 @@ var editorDefinitionV1Schema = z15.object({
1156
1192
  var forbiddenControlOrBidi = /[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
1157
1193
  var forbiddenOwnerNoteControlOrBidi = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
1158
1194
  var unsafeLocator = /<\/?[a-z][^>]*>|\b(?:javascript|data:text\/html)\s*:|\bon[a-z]+\s*=/iu;
1159
- var renderedPathSchema = z15.string().trim().transform((value) => value !== "/" ? value.replace(/\/+$/u, "") : value).superRefine((value, context) => {
1195
+ var renderedPathSchema = z16.string().trim().transform((value) => value !== "/" ? value.replace(/\/+$/u, "") : value).superRefine((value, context) => {
1160
1196
  if (!value.startsWith("/") || value === "$global" || value.includes("?") || value.includes("#")) {
1161
1197
  context.addIssue({
1162
1198
  code: "custom",
@@ -1166,7 +1202,7 @@ var renderedPathSchema = z15.string().trim().transform((value) => value !== "/"
1166
1202
  addSafeByteIssues(value, CONTINUE_SITE_SETUP_RENDERED_PATH_MAX_BYTES, "renderedPath", context);
1167
1203
  });
1168
1204
  function normalizedSafeTextSchema(maxBytes, label) {
1169
- return z15.string().transform((value) => value.trim().replace(new RegExp("\\p{White_Space}+", "gu"), " ")).pipe(z15.string().min(1)).superRefine((value, context) => {
1205
+ return z16.string().transform((value) => value.trim().replace(new RegExp("\\p{White_Space}+", "gu"), " ")).pipe(z16.string().min(1)).superRefine((value, context) => {
1170
1206
  addSafeByteIssues(value, maxBytes, label, context);
1171
1207
  if (label === "locatorHint" && unsafeLocator.test(value)) {
1172
1208
  context.addIssue({
@@ -1183,12 +1219,12 @@ var correctionItemBase = {
1183
1219
  requestedLabel: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_LABEL_MAX_BYTES, "requestedLabel").optional(),
1184
1220
  requestedSection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SECTION_MAX_BYTES, "requestedSection").optional(),
1185
1221
  requestedSubsection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SUBSECTION_MAX_BYTES, "requestedSubsection").optional(),
1186
- requestedSortOrder: z15.number().int().nonnegative().optional()
1222
+ requestedSortOrder: z16.number().int().nonnegative().optional()
1187
1223
  };
1188
- var setupCorrectionItemSchema = z15.discriminatedUnion("kind", [
1189
- z15.object({ kind: z15.literal("text"), ...correctionItemBase }).strict(),
1190
- z15.object({ kind: z15.literal("link"), ...correctionItemBase }).strict(),
1191
- z15.object({ kind: z15.literal("image"), ...correctionItemBase }).strict()
1224
+ var setupCorrectionItemSchema = z16.discriminatedUnion("kind", [
1225
+ z16.object({ kind: z16.literal("text"), ...correctionItemBase }).strict(),
1226
+ z16.object({ kind: z16.literal("link"), ...correctionItemBase }).strict(),
1227
+ z16.object({ kind: z16.literal("image"), ...correctionItemBase }).strict()
1192
1228
  ]).superRefine((item, context) => {
1193
1229
  if (item.requestedSubsection && !item.requestedSection) {
1194
1230
  context.addIssue({
@@ -1198,7 +1234,7 @@ var setupCorrectionItemSchema = z15.discriminatedUnion("kind", [
1198
1234
  });
1199
1235
  }
1200
1236
  });
1201
- var setupCorrectionItemsSchema = z15.array(setupCorrectionItemSchema).max(CONTINUE_SITE_SETUP_MAX_ITEMS).superRefine((items, context) => {
1237
+ var setupCorrectionItemsSchema = z16.array(setupCorrectionItemSchema).max(CONTINUE_SITE_SETUP_MAX_ITEMS).superRefine((items, context) => {
1202
1238
  const bytes = utf8Bytes(stableJsonStringify(items));
1203
1239
  if (bytes > CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES) {
1204
1240
  context.addIssue({
@@ -1207,7 +1243,7 @@ var setupCorrectionItemsSchema = z15.array(setupCorrectionItemSchema).max(CONTIN
1207
1243
  });
1208
1244
  }
1209
1245
  });
1210
- var siteSetupOwnerEditabilityNoteSchema = z15.string().max(SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH).superRefine((value, context) => {
1246
+ var siteSetupOwnerEditabilityNoteSchema = z16.string().max(SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH).superRefine((value, context) => {
1211
1247
  if (utf8Bytes(value) > SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES) {
1212
1248
  context.addIssue({
1213
1249
  code: "custom",
@@ -1232,7 +1268,7 @@ var SITE_SETUP_MODULE_SCOPES = {
1232
1268
  "analytics:public_key_read"
1233
1269
  ]
1234
1270
  };
1235
- var siteSetupModulesSchema = z15.array(z15.enum(["editing", "analytics"])).min(1).max(2).refine((modules) => modules[0] === "editing" && (modules.length === 1 || modules[1] === "analytics"), "Choose Editing with optional Analytics.");
1271
+ var siteSetupModulesSchema = z16.array(z16.enum(["editing", "analytics"])).min(1).max(2).refine((modules) => modules[0] === "editing" && (modules.length === 1 || modules[1] === "analytics"), "Choose Editing with optional Analytics.");
1236
1272
  function siteSetupScopes(modules) {
1237
1273
  return modules.flatMap((module) => [...SITE_SETUP_MODULE_SCOPES[module]]);
1238
1274
  }
@@ -1240,15 +1276,15 @@ function hasExactSiteSetupScopes(scopes, modules) {
1240
1276
  const matches = (expected) => scopes.length === expected.length && expected.every((scope) => scopes.includes(scope));
1241
1277
  return modules ? matches(siteSetupScopes(modules)) : matches(siteSetupScopes(["editing"])) || matches(siteSetupScopes(["editing", "analytics"]));
1242
1278
  }
1243
- var siteSetupActivityInputSchema = z15.object({
1244
- phase: z15.enum([
1279
+ var siteSetupActivityInputSchema = z16.object({
1280
+ phase: z16.enum([
1245
1281
  "inspecting",
1246
1282
  "integrating",
1247
1283
  "deploying",
1248
1284
  "verifying",
1249
1285
  "repairing"
1250
1286
  ]),
1251
- textId: z15.enum([
1287
+ textId: z16.enum([
1252
1288
  "inspecting",
1253
1289
  "integrating",
1254
1290
  "deploying",
@@ -1257,8 +1293,8 @@ var siteSetupActivityInputSchema = z15.object({
1257
1293
  ])
1258
1294
  }).strict().refine((value) => value.phase === value.textId, "Activity text must describe its phase.");
1259
1295
  var nextActionFields = {
1260
- actor: z15.enum(["agent", "user", "siteplane"]),
1261
- boundary: z15.enum([
1296
+ actor: z16.enum(["agent", "user", "siteplane"]),
1297
+ boundary: z16.enum([
1262
1298
  "source",
1263
1299
  "environment",
1264
1300
  "deployment",
@@ -1266,33 +1302,33 @@ var nextActionFields = {
1266
1302
  "authorization",
1267
1303
  "review"
1268
1304
  ]),
1269
- precondition: z15.string().min(1).max(1e3),
1270
- instruction: z15.string().min(1).max(2e3),
1271
- expectedEvidence: z15.string().min(1).max(1e3)
1305
+ precondition: z16.string().min(1).max(1e3),
1306
+ instruction: z16.string().min(1).max(2e3),
1307
+ expectedEvidence: z16.string().min(1).max(1e3)
1272
1308
  };
1273
- var siteSetupNextActionSchema = z15.discriminatedUnion("kind", [
1274
- z15.object({
1309
+ var siteSetupNextActionSchema = z16.discriminatedUnion("kind", [
1310
+ z16.object({
1275
1311
  ...nextActionFields,
1276
- kind: z15.literal("run_command"),
1277
- command: z15.string().min(1).max(500)
1312
+ kind: z16.literal("run_command"),
1313
+ command: z16.string().min(1).max(500)
1278
1314
  }).strict(),
1279
- z15.object({ ...nextActionFields, kind: z15.literal("agent_edit") }).strict(),
1280
- z15.object({ ...nextActionFields, kind: z15.literal("needs_user_action") }).strict(),
1281
- z15.object({ ...nextActionFields, kind: z15.literal("wait") }).strict(),
1282
- z15.object({ ...nextActionFields, kind: z15.literal("done") }).strict()
1315
+ z16.object({ ...nextActionFields, kind: z16.literal("agent_edit") }).strict(),
1316
+ z16.object({ ...nextActionFields, kind: z16.literal("needs_user_action") }).strict(),
1317
+ z16.object({ ...nextActionFields, kind: z16.literal("wait") }).strict(),
1318
+ z16.object({ ...nextActionFields, kind: z16.literal("done") }).strict()
1283
1319
  ]);
1284
- var siteSetupTaskRunSchema = z15.object({
1285
- runId: z15.string().uuid(),
1320
+ var siteSetupTaskRunSchema = z16.object({
1321
+ runId: z16.string().uuid(),
1286
1322
  mode: siteSetupRunModeSchema,
1287
1323
  status: siteSetupRunStatusSchema,
1288
- fieldContractHash: z15.string().nullable(),
1289
- deploymentOrigin: z15.string().url().nullable(),
1290
- deploymentRevision: z15.string().nullable(),
1291
- publicRuntimeKeyId: z15.string().uuid().nullable(),
1292
- reviewVersion: z15.string().nullable()
1324
+ fieldContractHash: z16.string().nullable(),
1325
+ deploymentOrigin: z16.string().url().nullable(),
1326
+ deploymentRevision: z16.string().nullable(),
1327
+ publicRuntimeKeyId: z16.string().uuid().nullable(),
1328
+ reviewVersion: z16.number().int().positive()
1293
1329
  }).strict();
1294
- var siteSetupTaskProgressSchema = z15.object({
1295
- progressStage: z15.enum([
1330
+ var siteSetupTaskProgressSchema = z16.object({
1331
+ progressStage: z16.enum([
1296
1332
  "waiting_for_connection",
1297
1333
  "agent_connected",
1298
1334
  "project_context_loaded",
@@ -1302,73 +1338,70 @@ var siteSetupTaskProgressSchema = z15.object({
1302
1338
  "action_required",
1303
1339
  "completed"
1304
1340
  ]),
1305
- lastVerifiedAt: z15.string().datetime().nullable(),
1306
- lastActivityAt: z15.string().datetime(),
1307
- activitySource: z15.enum(["user", "server", "agent"]),
1341
+ lastVerifiedAt: z16.string().datetime().nullable(),
1342
+ lastActivityAt: z16.string().datetime(),
1343
+ activitySource: z16.enum(["user", "server", "agent"]),
1308
1344
  activityPhase: siteSetupActivityInputSchema.shape.phase.nullable(),
1309
1345
  activityTextId: siteSetupActivityInputSchema.shape.textId.nullable()
1310
1346
  }).strict();
1311
- var siteSetupTaskSchema = z15.object({
1312
- contractVersion: z15.literal("siteplane.setup-task.v2"),
1313
- workflow: z15.enum(["initial_setup", "structure_update"]),
1314
- goal: z15.string().min(1),
1347
+ var siteSetupTaskSchema = z16.object({
1348
+ contractVersion: z16.literal("siteplane.setup-task.v2"),
1349
+ workflow: z16.enum(["initial_setup", "structure_update"]),
1350
+ goal: z16.string().min(1),
1315
1351
  modules: siteSetupModulesSchema,
1316
- authorizationVersion: z15.number().int().positive(),
1317
- authorizedScopes: z15.array(z15.string()).min(2),
1318
- site: z15.object({
1319
- siteId: z15.string().uuid(),
1320
- portalPath: z15.string(),
1321
- adminOrigin: z15.string().url()
1352
+ authorizationVersion: z16.number().int().positive(),
1353
+ authorizedScopes: z16.array(z16.string()).min(2),
1354
+ site: z16.object({
1355
+ siteId: z16.string().uuid(),
1356
+ portalPath: z16.string(),
1357
+ adminOrigin: z16.string().url()
1322
1358
  }).strict().nullable(),
1323
1359
  run: siteSetupTaskRunSchema.nullable(),
1324
1360
  progress: siteSetupTaskProgressSchema.nullable(),
1325
1361
  deployment: setupDeploymentRecordSchema.nullable(),
1326
- revalidationGeneration: z15.number().int().positive(),
1327
- assignment: z15.literal("owned"),
1328
- deadline: z15.string().datetime().nullable(),
1329
- userInstructions: z15.object({
1362
+ revalidationGeneration: z16.number().int().positive(),
1363
+ assignment: z16.literal("owned"),
1364
+ deadline: z16.string().datetime().nullable(),
1365
+ userInstructions: z16.object({
1330
1366
  text: siteSetupOwnerEditabilityNoteSchema,
1331
- source: z15.literal("user"),
1332
- trust: z15.literal("untrusted")
1367
+ source: z16.literal("user"),
1368
+ trust: z16.literal("untrusted")
1333
1369
  }).strict(),
1334
1370
  corrections: setupCorrectionItemsSchema,
1335
- contentSelectionSummary: z15.object({
1371
+ contentSelectionSummary: z16.object({
1336
1372
  text: siteSetupOwnerEditabilityNoteSchema,
1337
- source: z15.literal("agent"),
1338
- trust: z15.literal("untrusted")
1373
+ source: z16.literal("agent"),
1374
+ trust: z16.literal("untrusted")
1339
1375
  }).strict().nullable(),
1340
- environmentBindings: z15.array(z15.object({
1341
- name: z15.string().regex(/^[A-Z][A-Z0-9_]+$/u),
1342
- source: z15.string().min(1),
1343
- sensitivity: z15.enum(["public", "secret"]),
1344
- usage: z15.enum(["build", "server", "build_and_server"]),
1345
- evidence: z15.string().min(1)
1376
+ environmentBindings: z16.array(z16.object({
1377
+ name: z16.string().regex(/^[A-Z][A-Z0-9_]+$/u),
1378
+ source: z16.string().min(1),
1379
+ sensitivity: z16.enum(["public", "secret"]),
1380
+ usage: z16.enum(["build", "server", "build_and_server"]),
1381
+ evidence: z16.string().min(1)
1346
1382
  }).strict()),
1347
1383
  nextAction: siteSetupNextActionSchema,
1348
- error: z15.object({
1349
- code: z15.string().regex(/^[a-z0-9_.]+$/u).max(160),
1384
+ error: z16.object({
1385
+ code: z16.string().regex(/^[a-z0-9_.]+$/u).max(160),
1350
1386
  boundary: nextActionFields.boundary,
1351
1387
  responsibleActor: nextActionFields.actor,
1352
- retryable: z15.boolean(),
1353
- retryAfter: z15.number().int().nonnegative().nullable(),
1354
- requestId: z15.string().regex(/^[A-Za-z0-9_-]+$/u).max(128)
1388
+ retryable: z16.boolean(),
1389
+ retryAfter: z16.number().int().nonnegative().nullable(),
1390
+ requestId: z16.string().regex(/^[A-Za-z0-9_-]+$/u).max(128)
1355
1391
  }).strict().nullable(),
1356
- packages: z15.object({
1357
- siteplane: z15.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
1358
- runtimeNext: z15.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
1392
+ packages: siteSetupPackagesSchema,
1393
+ communication: z16.object({
1394
+ beforeSourceChanges: z16.string().min(1),
1395
+ updates: z16.array(z16.string().min(1)).min(1),
1396
+ blocker: z16.string().min(1)
1359
1397
  }).strict(),
1360
- communication: z15.object({
1361
- beforeSourceChanges: z15.string().min(1),
1362
- updates: z15.array(z15.string().min(1)).min(1),
1363
- blocker: z15.string().min(1)
1398
+ discovery: z16.object({
1399
+ inspectPublicRoutes: z16.boolean(),
1400
+ contentKinds: z16.array(z16.enum(["text", "longText", "link", "image"])).min(1),
1401
+ rules: z16.array(z16.string().min(1)).min(1)
1364
1402
  }).strict(),
1365
- discovery: z15.object({
1366
- inspectPublicRoutes: z15.boolean(),
1367
- contentKinds: z15.array(z15.enum(["text", "longText", "link", "image"])).min(1),
1368
- rules: z15.array(z15.string().min(1)).min(1)
1369
- }).strict(),
1370
- steps: z15.array(z15.object({
1371
- id: z15.enum([
1403
+ steps: z16.array(z16.object({
1404
+ id: z16.enum([
1372
1405
  "inspect_repository",
1373
1406
  "install_packages",
1374
1407
  "instrument_fields",
@@ -1376,32 +1409,52 @@ var siteSetupTaskSchema = z15.object({
1376
1409
  "deploy_production",
1377
1410
  "verify_deployment"
1378
1411
  ]),
1379
- instruction: z15.string().min(1)
1412
+ instruction: z16.string().min(1)
1380
1413
  }).strict()).length(6),
1381
- completion: z15.object({
1382
- verifiedStatus: z15.literal("ready_for_review"),
1383
- instruction: z15.string().min(1)
1414
+ completion: z16.object({
1415
+ verifiedStatus: z16.literal("ready_for_review"),
1416
+ instruction: z16.string().min(1)
1384
1417
  }).strict()
1385
- }).strict().refine((task) => hasExactSiteSetupScopes(task.authorizedScopes, task.modules), "Task scopes must exactly match its modules.");
1386
- var canonicalHashSchema = z15.string().regex(/^sha256:[0-9a-f]{64}$/iu);
1418
+ }).strict().refine((task) => hasExactSiteSetupScopes(task.authorizedScopes, task.modules), "Task scopes must exactly match its modules.").refine((task) => task.modules.includes("analytics") === (task.packages.analytics !== void 0), "The Analytics package pin must be present exactly when Analytics is selected.");
1419
+ var canonicalHashSchema = z16.string().regex(/^sha256:[0-9a-f]{64}$/iu);
1387
1420
  var deploymentRevisionSchema = normalizedSafeTextSchema(256, "deploymentRevision");
1388
- var continueSiteSetupInputSchema = z15.object({
1389
- siteId: z15.string().uuid(),
1390
- runId: z15.string().uuid(),
1421
+ var continueSiteSetupInputSchema = z16.object({
1422
+ siteId: z16.string().uuid(),
1423
+ runId: z16.string().uuid(),
1424
+ expectedReviewVersion: z16.number().int().positive(),
1425
+ mutationId: z16.string().uuid(),
1426
+ intent: z16.enum(["continue_review", "correct_completed_review"]),
1391
1427
  expectedFieldContractHash: canonicalHashSchema,
1392
1428
  expectedDeploymentRevision: deploymentRevisionSchema,
1393
1429
  correctionItems: setupCorrectionItemsSchema,
1394
1430
  ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema.optional()
1395
1431
  }).strict();
1396
- var saveSiteSetupOwnerNoteInputSchema = z15.object({
1397
- siteId: z15.string().uuid(),
1398
- runId: z15.string().uuid(),
1432
+ var saveSiteSetupOwnerNoteInputSchema = z16.object({
1433
+ siteId: z16.string().uuid(),
1434
+ runId: z16.string().uuid(),
1435
+ expectedReviewVersion: z16.number().int().positive(),
1399
1436
  expectedFieldContractHash: canonicalHashSchema,
1400
1437
  expectedDeploymentRevision: deploymentRevisionSchema,
1401
1438
  ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema
1402
1439
  }).strict();
1403
- var siteSetupContextInputSchema = z15.object({}).strict();
1404
- var siteSetupApplyInputSchema = z15.object({
1440
+ var setupReviewPreferenceSelectionSchema = z16.object({
1441
+ analyticsMode: z16.enum(["disabled", "session_only"]).nullable(),
1442
+ assetTargetType: z16.enum(["repo_static_assets", "siteplane_managed_fallback"]).nullable(),
1443
+ assetTargetId: z16.string().uuid().nullable()
1444
+ }).strict().refine((value) => value.assetTargetType !== null || value.assetTargetId === null, {
1445
+ message: "An asset target requires its delivery type."
1446
+ });
1447
+ var setupReviewPreferencesSchema = setupReviewPreferenceSelectionSchema.safeExtend({
1448
+ managedHostingApproved: z16.boolean()
1449
+ });
1450
+ var saveSetupReviewPreferencesInputSchema = z16.object({
1451
+ siteId: z16.string().uuid(),
1452
+ runId: z16.string().uuid(),
1453
+ expectedReviewVersion: z16.number().int().positive(),
1454
+ preferences: setupReviewPreferenceSelectionSchema
1455
+ }).strict();
1456
+ var siteSetupContextInputSchema = z16.object({}).strict();
1457
+ var siteSetupApplyInputSchema = z16.object({
1405
1458
  fieldContract: siteFieldContractV1Schema,
1406
1459
  editorDefinition: editorDefinitionV1Schema,
1407
1460
  contentSelectionSummary: siteSetupOwnerEditabilityNoteSchema.refine((text) => text.trim().length > 0, "Describe the selected content, important exclusions and any open gaps.")
@@ -1468,37 +1521,44 @@ var siteSetupApplyInputSchema = z15.object({
1468
1521
  }
1469
1522
  }
1470
1523
  });
1471
- var siteSetupVerifyInputSchema = z15.object({
1472
- deploymentUrl: z15.string().url().refine((value) => value.startsWith("https://")),
1524
+ var siteSetupVerifyInputSchema = z16.object({
1525
+ deploymentUrl: z16.string().url().refine((value) => value.startsWith("https://")),
1473
1526
  deploymentRevision: deploymentRevisionSchema,
1474
- wait: z15.boolean().optional()
1527
+ wait: z16.boolean().optional()
1475
1528
  }).strict();
1476
- var siteSetupEvidenceInputSchema = z15.object({
1477
- siteId: z15.string().uuid(),
1478
- runId: z15.string().uuid(),
1529
+ var siteSetupEvidenceInputSchema = z16.object({
1530
+ siteId: z16.string().uuid(),
1531
+ runId: z16.string().uuid(),
1479
1532
  expectedFieldContractHash: canonicalHashSchema,
1480
- expectedDeploymentOrigin: z15.string().url().refine((value) => value.startsWith("https://")),
1533
+ expectedDeploymentOrigin: z16.string().url().refine((value) => value.startsWith("https://")),
1481
1534
  expectedDeploymentRevision: deploymentRevisionSchema,
1482
- publicRuntimeKeyId: z15.string().uuid(),
1535
+ publicRuntimeKeyId: z16.string().uuid(),
1483
1536
  bridgeSessionId: normalizedSafeTextSchema(256, "bridgeSessionId"),
1484
- observations: z15.array(z15.object({
1537
+ observations: z16.array(z16.object({
1485
1538
  fieldId: fieldIdSchema,
1486
1539
  routeKey: siteFieldRouteKeySchema,
1487
1540
  renderedPath: renderedPathSchema,
1488
- targetResolved: z15.boolean(),
1489
- previewAck: z15.boolean()
1541
+ targetResolved: z16.boolean(),
1542
+ previewAck: z16.boolean()
1490
1543
  }).strict().refine((value) => !value.previewAck || value.targetResolved, "Preview ACK requires a resolved target.")).min(1).max(200)
1491
1544
  }).strict();
1492
- var completeSiteSetupInputSchema = z15.object({
1493
- siteId: z15.string().uuid(),
1494
- runId: z15.string().uuid(),
1545
+ var completeSetupReviewInputSchema = z16.object({
1546
+ siteId: z16.string().uuid(),
1547
+ runId: z16.string().uuid(),
1548
+ expectedReviewVersion: z16.number().int().positive(),
1495
1549
  expectedFieldContractHash: canonicalHashSchema,
1496
1550
  expectedDeploymentRevision: deploymentRevisionSchema,
1497
1551
  expectedReadyFingerprint: canonicalHashSchema
1498
1552
  }).strict();
1499
- var refreshSiteSetupDeploymentInputSchema = z15.object({
1500
- siteId: z15.string().uuid(),
1501
- deploymentUrl: z15.string().url().refine((value) => value.startsWith("https://")),
1553
+ var activateSiteSetupInputSchema = z16.object({
1554
+ siteId: z16.string().uuid(),
1555
+ runId: z16.string().uuid(),
1556
+ expectedReviewVersion: z16.number().int().positive(),
1557
+ expectedSnapshotHash: canonicalHashSchema
1558
+ }).strict();
1559
+ var refreshSiteSetupDeploymentInputSchema = z16.object({
1560
+ siteId: z16.string().uuid(),
1561
+ deploymentUrl: z16.string().url().refine((value) => value.startsWith("https://")),
1502
1562
  deploymentRevision: deploymentRevisionSchema
1503
1563
  }).strict();
1504
1564
  function addSafeByteIssues(value, maxBytes, label, context) {
@@ -1518,37 +1578,61 @@ function addSafeByteIssues(value, maxBytes, label, context) {
1518
1578
  function utf8Bytes(value) {
1519
1579
  return new TextEncoder().encode(value).byteLength;
1520
1580
  }
1581
+ var setupActivationApprovalSchema = z16.object({
1582
+ reviewVersion: z16.number().int().positive(),
1583
+ snapshotHash: canonicalHashSchema,
1584
+ analytics: z16.object({
1585
+ status: z16.enum(["active", "skipped"]),
1586
+ reviewVersion: z16.number().int().positive(),
1587
+ generation: z16.number().int().nonnegative()
1588
+ }).optional()
1589
+ });
1590
+ var activateSetupModulesInputSchema = activateSiteSetupInputSchema.extend({
1591
+ analytics: z16.discriminatedUnion("decision", [
1592
+ z16.object({ decision: z16.literal("pending") }).strict(),
1593
+ z16.object({
1594
+ decision: z16.literal("enable"),
1595
+ expectedInstallationGeneration: z16.number().int().positive(),
1596
+ measurementApproved: z16.literal(true)
1597
+ }).strict(),
1598
+ z16.object({
1599
+ decision: z16.literal("skip"),
1600
+ expectedInstallationGeneration: z16.number().int().nonnegative(),
1601
+ continueWithoutAnalytics: z16.literal(true)
1602
+ }).strict()
1603
+ ])
1604
+ }).strict();
1521
1605
 
1522
1606
  // ../shared/dist/bridge-protocol.js
1523
1607
  var BRIDGE_PROTOCOL_VERSION = 2;
1524
- var bridgeRectSchema = z16.object({
1525
- x: z16.number(),
1526
- y: z16.number(),
1527
- width: z16.number().nonnegative(),
1528
- height: z16.number().nonnegative()
1529
- });
1530
- var previewTextValueSchema = z16.object({
1531
- fieldType: z16.enum(["text", "longText"]),
1532
- value: z16.string()
1533
- });
1534
- var previewLinkValueSchema = z16.object({
1535
- fieldType: z16.literal("link"),
1536
- value: z16.object({
1537
- href: z16.string().trim().min(1),
1538
- label: z16.string().trim().min(1).optional()
1608
+ var bridgeRectSchema = z17.object({
1609
+ x: z17.number(),
1610
+ y: z17.number(),
1611
+ width: z17.number().nonnegative(),
1612
+ height: z17.number().nonnegative()
1613
+ });
1614
+ var previewTextValueSchema = z17.object({
1615
+ fieldType: z17.enum(["text", "longText"]),
1616
+ value: z17.string()
1617
+ });
1618
+ var previewLinkValueSchema = z17.object({
1619
+ fieldType: z17.literal("link"),
1620
+ value: z17.object({
1621
+ href: z17.string().trim().min(1),
1622
+ label: z17.string().trim().min(1).optional()
1539
1623
  })
1540
1624
  });
1541
- var previewImageValueSchema = z16.object({
1542
- fieldType: z16.literal("image"),
1625
+ var previewImageValueSchema = z17.object({
1626
+ fieldType: z17.literal("image"),
1543
1627
  value: imageValueSchema
1544
1628
  });
1545
- var bridgePreviewValueSchema = z16.discriminatedUnion("fieldType", [
1629
+ var bridgePreviewValueSchema = z17.discriminatedUnion("fieldType", [
1546
1630
  previewTextValueSchema,
1547
1631
  previewLinkValueSchema,
1548
1632
  previewImageValueSchema
1549
1633
  ]);
1550
- var fieldSelectionModeSchema = z16.enum(["replace", "range", "toggle"]);
1551
- var fieldBridgeMissingContentActionSchema = z16.enum([
1634
+ var fieldSelectionModeSchema = z17.enum(["replace", "range", "toggle"]);
1635
+ var fieldBridgeMissingContentActionSchema = z17.enum([
1552
1636
  "add",
1553
1637
  "select",
1554
1638
  "remove"
@@ -1565,79 +1649,81 @@ var FIELD_BRIDGE_MESSAGE_TYPES = [
1565
1649
  "siteplane:field-bridge:set-visual-control-state",
1566
1650
  "siteplane:field-bridge:missing-content",
1567
1651
  "siteplane:field-bridge:preview-scrolled",
1652
+ "siteplane:field-bridge:analytics-probe",
1653
+ "siteplane:field-bridge:analytics-probe-result",
1568
1654
  "siteplane:field-bridge:error"
1569
1655
  ];
1570
- var canonicalFieldContractHashSchema = z16.string().regex(/^sha256:[0-9a-f]{64}$/u);
1571
- var bridgeSectionSchema = z16.string().trim().min(1).max(256);
1572
- var realRenderedPathSchema = z16.string().trim().refine((value) => value.startsWith("/") && value !== "$global" && !value.includes("?") && !value.includes("#"), "A field bridge rendered path must be a real canonical path.");
1573
- var fieldBridgeIdentitySchema = z16.object({
1574
- publicRuntimeKeyId: z16.string().uuid(),
1656
+ var canonicalFieldContractHashSchema = z17.string().regex(/^sha256:[0-9a-f]{64}$/u);
1657
+ var bridgeSectionSchema = z17.string().trim().min(1).max(256);
1658
+ var realRenderedPathSchema = z17.string().trim().refine((value) => value.startsWith("/") && value !== "$global" && !value.includes("?") && !value.includes("#"), "A field bridge rendered path must be a real canonical path.");
1659
+ var fieldBridgeIdentitySchema = z17.object({
1660
+ publicRuntimeKeyId: z17.string().uuid(),
1575
1661
  fieldContractHash: canonicalFieldContractHashSchema,
1576
- deploymentRevision: z16.string().trim().min(1).max(256)
1662
+ deploymentRevision: z17.string().trim().min(1).max(256)
1577
1663
  }).strict();
1578
- var fieldBridgeBaseSchema = z16.object({
1579
- version: z16.literal(BRIDGE_PROTOCOL_VERSION),
1580
- type: z16.enum(FIELD_BRIDGE_MESSAGE_TYPES),
1581
- siteId: z16.string().uuid(),
1582
- sessionId: z16.string().trim().min(1),
1583
- publicRuntimeKeyId: z16.string().uuid(),
1664
+ var fieldBridgeBaseSchema = z17.object({
1665
+ version: z17.literal(BRIDGE_PROTOCOL_VERSION),
1666
+ type: z17.enum(FIELD_BRIDGE_MESSAGE_TYPES),
1667
+ siteId: z17.string().uuid(),
1668
+ sessionId: z17.string().trim().min(1),
1669
+ publicRuntimeKeyId: z17.string().uuid(),
1584
1670
  fieldContractHash: canonicalFieldContractHashSchema,
1585
- deploymentRevision: z16.string().trim().min(1).max(256),
1586
- requestId: z16.string().trim().min(1),
1587
- sentAt: z16.string().datetime()
1671
+ deploymentRevision: z17.string().trim().min(1).max(256),
1672
+ requestId: z17.string().trim().min(1),
1673
+ sentAt: z17.string().datetime()
1588
1674
  }).strict();
1589
- var fieldBridgeFieldSchema = z16.object({
1675
+ var fieldBridgeFieldSchema = z17.object({
1590
1676
  fieldId: fieldIdSchema,
1591
1677
  fieldType: fieldTypeSchema,
1592
1678
  routeKey: siteFieldRouteKeySchema,
1593
1679
  renderedPath: realRenderedPathSchema,
1594
- sourcePath: z16.string().trim().min(1).optional(),
1680
+ sourcePath: z17.string().trim().min(1).optional(),
1595
1681
  editTarget: fieldIdSchema,
1596
1682
  rect: bridgeRectSchema,
1597
- targetResolved: z16.literal(true),
1683
+ targetResolved: z17.literal(true),
1598
1684
  currentValue: bridgePreviewValueSchema.optional()
1599
1685
  }).strict();
1600
1686
  var fieldBridgeInitMessageSchema = fieldBridgeBaseSchema.extend({
1601
- type: z16.literal("siteplane:field-bridge:init"),
1602
- payload: z16.object({
1603
- adminOrigin: z16.string().url(),
1604
- customerOrigin: z16.string().url(),
1687
+ type: z17.literal("siteplane:field-bridge:init"),
1688
+ payload: z17.object({
1689
+ adminOrigin: z17.string().url(),
1690
+ customerOrigin: z17.string().url(),
1605
1691
  renderedPath: realRenderedPathSchema
1606
1692
  }).strict()
1607
1693
  });
1608
1694
  var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
1609
- type: z16.literal("siteplane:field-bridge:ready"),
1610
- payload: z16.object({
1695
+ type: z17.literal("siteplane:field-bridge:ready"),
1696
+ payload: z17.object({
1611
1697
  renderedPath: realRenderedPathSchema,
1612
- fieldCount: z16.number().int().nonnegative(),
1613
- capabilities: z16.tuple([
1614
- z16.literal("field_selection"),
1615
- z16.literal("preview_values"),
1616
- z16.literal("field_evidence"),
1617
- z16.literal("visual_field_control")
1618
- ])
1698
+ fieldCount: z17.number().int().nonnegative(),
1699
+ capabilities: z17.tuple([
1700
+ z17.literal("field_selection"),
1701
+ z17.literal("preview_values"),
1702
+ z17.literal("field_evidence"),
1703
+ z17.literal("visual_field_control")
1704
+ ]).rest(z17.literal("analytics_preview_readiness")).refine((capabilities) => capabilities.length <= 5)
1619
1705
  }).strict()
1620
1706
  });
1621
1707
  var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
1622
- type: z16.literal("siteplane:field-bridge:fields"),
1623
- payload: z16.object({
1708
+ type: z17.literal("siteplane:field-bridge:fields"),
1709
+ payload: z17.object({
1624
1710
  renderedPath: realRenderedPathSchema,
1625
- fields: z16.array(fieldBridgeFieldSchema)
1711
+ fields: z17.array(fieldBridgeFieldSchema)
1626
1712
  }).strict()
1627
1713
  });
1628
1714
  var fieldBridgeSelectFieldMessageSchema = fieldBridgeBaseSchema.extend({
1629
- type: z16.literal("siteplane:field-bridge:select-field"),
1630
- payload: z16.object({
1715
+ type: z17.literal("siteplane:field-bridge:select-field"),
1716
+ payload: z17.object({
1631
1717
  fieldId: fieldIdSchema,
1632
1718
  selectionMode: fieldSelectionModeSchema
1633
1719
  }).strict()
1634
1720
  });
1635
1721
  var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
1636
- type: z16.literal("siteplane:field-bridge:set-selected-field"),
1637
- payload: z16.object({
1638
- fieldIds: z16.array(fieldIdSchema).max(200),
1722
+ type: z17.literal("siteplane:field-bridge:set-selected-field"),
1723
+ payload: z17.object({
1724
+ fieldIds: z17.array(fieldIdSchema).max(200),
1639
1725
  primaryFieldId: fieldIdSchema.nullable(),
1640
- scrollIntoView: z16.boolean().optional()
1726
+ scrollIntoView: z17.boolean().optional()
1641
1727
  }).strict().superRefine((value, context) => {
1642
1728
  if (value.fieldIds.length > 0 && value.primaryFieldId === null) {
1643
1729
  context.addIssue({
@@ -1656,58 +1742,76 @@ var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
1656
1742
  })
1657
1743
  });
1658
1744
  var fieldBridgeApplyPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
1659
- type: z16.literal("siteplane:field-bridge:apply-preview-values"),
1660
- payload: z16.object({ values: z16.record(fieldIdSchema, bridgePreviewValueSchema) }).strict()
1745
+ type: z17.literal("siteplane:field-bridge:apply-preview-values"),
1746
+ payload: z17.object({ values: z17.record(fieldIdSchema, bridgePreviewValueSchema) }).strict()
1661
1747
  });
1662
1748
  var fieldBridgeTestPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
1663
- type: z16.literal("siteplane:field-bridge:test-preview-values"),
1664
- payload: z16.object({ fieldIds: z16.array(fieldIdSchema).min(1).max(200) }).strict()
1749
+ type: z17.literal("siteplane:field-bridge:test-preview-values"),
1750
+ payload: z17.object({ fieldIds: z17.array(fieldIdSchema).min(1).max(200) }).strict()
1665
1751
  });
1666
1752
  var fieldBridgePreviewAckMessageSchema = fieldBridgeBaseSchema.extend({
1667
- type: z16.literal("siteplane:field-bridge:preview-ack"),
1668
- payload: z16.object({
1669
- ackRequestId: z16.string().trim().min(1),
1670
- kind: z16.enum(["apply", "test"]),
1753
+ type: z17.literal("siteplane:field-bridge:preview-ack"),
1754
+ payload: z17.object({
1755
+ ackRequestId: z17.string().trim().min(1),
1756
+ kind: z17.enum(["apply", "test"]),
1671
1757
  renderedPath: realRenderedPathSchema,
1672
- fieldIds: z16.array(fieldIdSchema).max(200)
1758
+ fieldIds: z17.array(fieldIdSchema).max(200)
1673
1759
  }).strict()
1674
1760
  });
1675
1761
  var fieldBridgeSetVisualControlStateMessageSchema = fieldBridgeBaseSchema.extend({
1676
- type: z16.literal("siteplane:field-bridge:set-visual-control-state"),
1677
- payload: z16.object({
1678
- enabled: z16.boolean(),
1679
- fieldProximityEnabled: z16.boolean(),
1680
- pendingKeys: z16.array(z16.string().trim().min(1).max(2048)).max(50),
1681
- activeFieldIds: z16.array(fieldIdSchema),
1682
- fieldSections: z16.record(fieldIdSchema, bridgeSectionSchema),
1683
- selectedPending: z16.array(z16.object({
1684
- key: z16.string().trim().min(1).max(2048),
1685
- locatorHint: z16.string().trim().min(1).max(2048)
1762
+ type: z17.literal("siteplane:field-bridge:set-visual-control-state"),
1763
+ payload: z17.object({
1764
+ enabled: z17.boolean(),
1765
+ fieldProximityEnabled: z17.boolean(),
1766
+ pendingKeys: z17.array(z17.string().trim().min(1).max(2048)).max(50),
1767
+ activeFieldIds: z17.array(fieldIdSchema),
1768
+ fieldSections: z17.record(fieldIdSchema, bridgeSectionSchema),
1769
+ selectedPending: z17.array(z17.object({
1770
+ key: z17.string().trim().min(1).max(2048),
1771
+ locatorHint: z17.string().trim().min(1).max(2048)
1686
1772
  }).strict()).max(50),
1687
- scrollPendingIntoView: z16.boolean().optional()
1773
+ scrollPendingIntoView: z17.boolean().optional()
1688
1774
  }).strict()
1689
1775
  });
1690
1776
  var fieldBridgeMissingContentMessageSchema = fieldBridgeBaseSchema.extend({
1691
- type: z16.literal("siteplane:field-bridge:missing-content"),
1692
- payload: z16.object({
1777
+ type: z17.literal("siteplane:field-bridge:missing-content"),
1778
+ payload: z17.object({
1693
1779
  action: fieldBridgeMissingContentActionSchema,
1694
1780
  item: setupCorrectionItemSchema,
1695
1781
  suggestedSection: bridgeSectionSchema.optional()
1696
1782
  }).strict()
1697
1783
  });
1698
1784
  var fieldBridgePreviewScrolledMessageSchema = fieldBridgeBaseSchema.extend({
1699
- type: z16.literal("siteplane:field-bridge:preview-scrolled"),
1700
- payload: z16.object({ renderedPath: realRenderedPathSchema }).strict()
1785
+ type: z17.literal("siteplane:field-bridge:preview-scrolled"),
1786
+ payload: z17.object({ renderedPath: realRenderedPathSchema }).strict()
1787
+ });
1788
+ var analyticsPreviewChallengeSchema = z17.object({
1789
+ bridgeSessionId: z17.string().uuid(),
1790
+ challenge: z17.string().min(32).max(512),
1791
+ testRunId: z17.string().trim().min(1).max(160),
1792
+ expiresAt: z17.string().datetime()
1793
+ }).strict();
1794
+ var fieldBridgeAnalyticsProbeSchema = fieldBridgeBaseSchema.extend({
1795
+ type: z17.literal("siteplane:field-bridge:analytics-probe"),
1796
+ requestId: z17.string().min(1).max(256),
1797
+ payload: analyticsPreviewChallengeSchema
1798
+ });
1799
+ var fieldBridgeAnalyticsProbeResultSchema = fieldBridgeBaseSchema.extend({
1800
+ type: z17.literal("siteplane:field-bridge:analytics-probe-result"),
1801
+ payload: z17.object({
1802
+ ackRequestId: z17.string().min(1).max(256),
1803
+ status: z17.enum(["recorded", "failed"])
1804
+ }).strict()
1701
1805
  });
1702
1806
  var fieldBridgeErrorMessageSchema = fieldBridgeBaseSchema.extend({
1703
- type: z16.literal("siteplane:field-bridge:error"),
1704
- payload: z16.object({
1705
- code: z16.string().trim().min(1),
1706
- message: z16.string().trim().min(1),
1707
- recoverable: z16.boolean().default(false)
1807
+ type: z17.literal("siteplane:field-bridge:error"),
1808
+ payload: z17.object({
1809
+ code: z17.string().trim().min(1),
1810
+ message: z17.string().trim().min(1),
1811
+ recoverable: z17.boolean().default(false)
1708
1812
  }).strict()
1709
1813
  });
1710
- var fieldBridgeMessageSchema = z16.discriminatedUnion("type", [
1814
+ var fieldBridgeMessageSchema = z17.discriminatedUnion("type", [
1711
1815
  fieldBridgeInitMessageSchema,
1712
1816
  fieldBridgeReadyMessageSchema,
1713
1817
  fieldBridgeFieldsMessageSchema,
@@ -1719,55 +1823,57 @@ var fieldBridgeMessageSchema = z16.discriminatedUnion("type", [
1719
1823
  fieldBridgeSetVisualControlStateMessageSchema,
1720
1824
  fieldBridgeMissingContentMessageSchema,
1721
1825
  fieldBridgePreviewScrolledMessageSchema,
1722
- fieldBridgeErrorMessageSchema
1826
+ fieldBridgeErrorMessageSchema,
1827
+ fieldBridgeAnalyticsProbeSchema,
1828
+ fieldBridgeAnalyticsProbeResultSchema
1723
1829
  ]);
1724
1830
 
1725
1831
  // ../shared/dist/commands.js
1726
- import { z as z18 } from "zod";
1832
+ import { z as z19 } from "zod";
1727
1833
 
1728
1834
  // ../shared/dist/errors.js
1729
- import { z as z17 } from "zod";
1835
+ import { z as z18 } from "zod";
1730
1836
  var UI_ERROR_CATEGORIES = [
1731
1837
  "site_member",
1732
1838
  "workspace_member",
1733
1839
  "internal"
1734
1840
  ];
1735
- var uiErrorCategorySchema = z17.enum(UI_ERROR_CATEGORIES);
1736
- var commandErrorPayloadSchema = z17.object({
1737
- code: z17.string().min(1),
1738
- message: z17.string().min(1),
1841
+ var uiErrorCategorySchema = z18.enum(UI_ERROR_CATEGORIES);
1842
+ var commandErrorPayloadSchema = z18.object({
1843
+ code: z18.string().min(1),
1844
+ message: z18.string().min(1),
1739
1845
  category: uiErrorCategorySchema,
1740
- details: z17.record(z17.string(), z17.unknown()).optional()
1846
+ details: z18.record(z18.string(), z18.unknown()).optional()
1741
1847
  });
1742
1848
 
1743
1849
  // ../shared/dist/commands.js
1744
- var commandSuccessSchema = z18.object({
1745
- ok: z18.literal(true),
1746
- data: z18.unknown()
1850
+ var commandSuccessSchema = z19.object({
1851
+ ok: z19.literal(true),
1852
+ data: z19.unknown()
1747
1853
  });
1748
- var commandErrorSchema = z18.object({
1749
- ok: z18.literal(false),
1854
+ var commandErrorSchema = z19.object({
1855
+ ok: z19.literal(false),
1750
1856
  error: commandErrorPayloadSchema
1751
1857
  });
1752
- var commandResultSchema = z18.discriminatedUnion("ok", [
1858
+ var commandResultSchema = z19.discriminatedUnion("ok", [
1753
1859
  commandSuccessSchema,
1754
1860
  commandErrorSchema
1755
1861
  ]);
1756
1862
 
1757
1863
  // ../shared/dist/editor-settings.js
1758
- import { z as z19 } from "zod";
1759
- var editorColorSchemeSchema = z19.enum([
1864
+ import { z as z20 } from "zod";
1865
+ var editorColorSchemeSchema = z20.enum([
1760
1866
  "paper",
1761
1867
  "slate",
1762
1868
  "siteplane",
1763
1869
  "bloom"
1764
1870
  ]);
1765
1871
  var editorColorSchemes = editorColorSchemeSchema.options;
1766
- var editorColorModeSchema = z19.enum(["light", "dark"]);
1872
+ var editorColorModeSchema = z20.enum(["light", "dark"]);
1767
1873
  var editorColorModes = editorColorModeSchema.options;
1768
1874
 
1769
1875
  // ../shared/dist/site-slug.js
1770
- import { z as z20 } from "zod";
1876
+ import { z as z21 } from "zod";
1771
1877
  var SITE_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1772
1878
  var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
1773
1879
  "account",
@@ -1784,31 +1890,31 @@ var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
1784
1890
  "support",
1785
1891
  "workspace"
1786
1892
  ]);
1787
- var siteSlugSchema = z20.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
1893
+ var siteSlugSchema = z21.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
1788
1894
 
1789
1895
  // ../shared/dist/entitlements.js
1790
- import { z as z21 } from "zod";
1791
- var entitlementSnapshotSchema = z21.object({
1792
- planKey: z21.string().trim().min(1),
1793
- sitesLimit: z21.number().int().positive(),
1794
- siteMembersPerSiteLimit: z21.number().int().positive(),
1795
- customAdminDomainsEnabled: z21.boolean(),
1796
- agentMcpEnabled: z21.boolean(),
1797
- emailNotificationsEnabled: z21.boolean(),
1798
- analyticsEnabled: z21.boolean(),
1799
- analyticsSitesLimit: z21.number().int().min(0),
1800
- analyticsPortalPerformanceEnabled: z21.boolean(),
1801
- analyticsMonthlyReportsEnabled: z21.boolean(),
1802
- analyticsAiSummaryEnabled: z21.boolean(),
1803
- analyticsRawEventRetentionDays: z21.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
1804
- analyticsMonthlyEventLimit: z21.number().int().min(0),
1805
- bookingEnabled: z21.boolean().default(false),
1806
- bookingSitesLimit: z21.number().int().min(0).default(0),
1807
- bookingPortalManagementEnabled: z21.boolean().default(false),
1808
- bookingResourcesPerSiteLimit: z21.number().int().min(0).default(0),
1809
- bookingServicesPerSiteLimit: z21.number().int().min(0).default(0),
1810
- bookingMonthlyBookingsLimit: z21.number().int().min(0).default(0),
1811
- bookingRemindersEnabled: z21.boolean().default(false)
1896
+ import { z as z22 } from "zod";
1897
+ var entitlementSnapshotSchema = z22.object({
1898
+ planKey: z22.string().trim().min(1),
1899
+ sitesLimit: z22.number().int().positive(),
1900
+ siteMembersPerSiteLimit: z22.number().int().positive(),
1901
+ customAdminDomainsEnabled: z22.boolean(),
1902
+ agentMcpEnabled: z22.boolean(),
1903
+ emailNotificationsEnabled: z22.boolean(),
1904
+ analyticsEnabled: z22.boolean(),
1905
+ analyticsSitesLimit: z22.number().int().min(0),
1906
+ analyticsPortalPerformanceEnabled: z22.boolean(),
1907
+ analyticsMonthlyReportsEnabled: z22.boolean(),
1908
+ analyticsAiSummaryEnabled: z22.boolean(),
1909
+ analyticsRawEventRetentionDays: z22.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
1910
+ analyticsMonthlyEventLimit: z22.number().int().min(0),
1911
+ bookingEnabled: z22.boolean().default(false),
1912
+ bookingSitesLimit: z22.number().int().min(0).default(0),
1913
+ bookingPortalManagementEnabled: z22.boolean().default(false),
1914
+ bookingResourcesPerSiteLimit: z22.number().int().min(0).default(0),
1915
+ bookingServicesPerSiteLimit: z22.number().int().min(0).default(0),
1916
+ bookingMonthlyBookingsLimit: z22.number().int().min(0).default(0),
1917
+ bookingRemindersEnabled: z22.boolean().default(false)
1812
1918
  });
1813
1919
  var EARLY_ACCESS_PLAN = {
1814
1920
  planKey: "early_access_2026",
@@ -1834,7 +1940,7 @@ var EARLY_ACCESS_PLAN = {
1834
1940
  };
1835
1941
 
1836
1942
  // ../shared/dist/readiness.js
1837
- import { z as z22 } from "zod";
1943
+ import { z as z23 } from "zod";
1838
1944
  var READINESS_CHECK_KEYS = [
1839
1945
  "agent_instructions_installed",
1840
1946
  "runtime_package_connected",
@@ -1849,19 +1955,80 @@ var READINESS_STATUSES = [
1849
1955
  "failing",
1850
1956
  "warning"
1851
1957
  ];
1852
- var readinessCheckKeySchema = z22.enum(READINESS_CHECK_KEYS);
1853
- var readinessStatusSchema = z22.enum(READINESS_STATUSES);
1958
+ var readinessCheckKeySchema = z23.enum(READINESS_CHECK_KEYS);
1959
+ var readinessStatusSchema = z23.enum(READINESS_STATUSES);
1854
1960
 
1855
1961
  // ../shared/dist/site.js
1856
- import { z as z23 } from "zod";
1962
+ import { z as z24 } from "zod";
1857
1963
  var SITE_STATUSES = [
1858
1964
  "setup",
1859
1965
  "active",
1860
1966
  "disabled",
1861
1967
  "archived"
1862
1968
  ];
1863
- var siteStatusSchema = z23.enum(SITE_STATUSES);
1864
- var websiteUrlSchema = z23.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
1969
+ var siteStatusSchema = z24.enum(SITE_STATUSES);
1970
+ var websiteUrlSchema = z24.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
1971
+
1972
+ // ../shared/dist/setup-assets.js
1973
+ import { z as z25 } from "zod";
1974
+ var configureSetupAssetTargetInputSchema = z25.object({
1975
+ siteId: z25.string().uuid(),
1976
+ runId: z25.string().uuid(),
1977
+ expectedReviewVersion: z25.number().int().positive(),
1978
+ expectedSnapshotHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/u),
1979
+ mutationId: z25.string().uuid(),
1980
+ expectedApprovalId: z25.string().uuid().nullable(),
1981
+ targetId: z25.string().uuid().nullable(),
1982
+ targetType: z25.enum(["repo_static_assets", "siteplane_managed_fallback"]),
1983
+ approveManagedHosting: z25.boolean()
1984
+ }).strict().refine((value) => value.targetType === "siteplane_managed_fallback" || !value.approveManagedHosting);
1985
+ var setupAssetTargetApprovalSchema = z25.object({
1986
+ id: z25.string().uuid(),
1987
+ runId: z25.string().uuid(),
1988
+ reviewVersion: z25.number().int().positive(),
1989
+ snapshotHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/u),
1990
+ targetId: z25.string().uuid(),
1991
+ targetType: z25.enum(["repo_static_assets", "siteplane_managed_fallback"]),
1992
+ targetRevision: z25.number().int().positive(),
1993
+ deploymentOrigin: z25.string().url(),
1994
+ gitConnectionId: z25.string().uuid().nullable(),
1995
+ gitRevision: z25.number().int().positive().nullable(),
1996
+ managedHostingApproved: z25.boolean(),
1997
+ actorUserId: z25.string().uuid(),
1998
+ approvedAt: z25.string().datetime({ offset: true })
1999
+ }).strict();
2000
+ var setupAssetReadinessSchema = z25.union([
2001
+ z25.object({
2002
+ status: z25.enum([
2003
+ "not_required",
2004
+ "needs_choice",
2005
+ "stale_setup_review",
2006
+ "permission_denied"
2007
+ ])
2008
+ }).strict(),
2009
+ z25.object({
2010
+ status: z25.literal("stale_approval"),
2011
+ approval: setupAssetTargetApprovalSchema.optional()
2012
+ }).strict(),
2013
+ z25.object({
2014
+ status: z25.literal("not_verified"),
2015
+ approval: setupAssetTargetApprovalSchema,
2016
+ jobId: z25.string().uuid().optional(),
2017
+ checkedAt: z25.string().datetime({ offset: true }).nullable().optional()
2018
+ }).strict(),
2019
+ z25.object({
2020
+ status: z25.enum(["ready", "checking", "retrying"]),
2021
+ approval: setupAssetTargetApprovalSchema,
2022
+ jobId: z25.string().uuid(),
2023
+ checkedAt: z25.string().datetime({ offset: true }).nullable()
2024
+ }).strict().refine((value) => value.status !== "ready" || value.checkedAt !== null)
2025
+ ]);
2026
+ var checkSetupAssetTargetInputSchema = z25.object({
2027
+ siteId: z25.string().uuid(),
2028
+ runId: z25.string().uuid(),
2029
+ approvalId: z25.string().uuid(),
2030
+ intent: z25.enum(["start", "poll"])
2031
+ }).strict();
1865
2032
 
1866
2033
  // ../cli/dist/analytics/static-scan.js
1867
2034
  import ts from "typescript";
@@ -2038,6 +2205,9 @@ Analytics contract hash: ${ANALYTICS_CONTRACT_HASH}
2038
2205
  - Use stable data-siteplane-target-id values that do not depend on visible copy.
2039
2206
  - Use public site keys only through environment references.
2040
2207
  - Do not write secret analytics keys, setup tokens or project CLI tokens into source files.
2208
+ - Mount the SDK once in the existing client lifecycle. Wire installDataAttributeTracking and createNextAppRouterNavigationAdapter to analytics.track/getRouteViewId/setPageContext, feed initial and subsequent Next.js pathname changes, and refresh attribute targets after navigation. Dispose attribute tracking and the SDK on unmount.
2209
+ - Inspect existing consent management. Pass consentAdapter with getConsent and subscribe to initSiteplaneAnalytics for an existing CMP; return unknown while unresolved, disabled for denial and a permitted mode only for its actual visitor grant. Subscribe returns cleanup. Do not mirror CMP snapshots with setConsent or replace stored opt-outs.
2210
+ - Omit consentAdapter only after confirming no existing CMP. An unrecognized CMP blocks Analytics with a concrete repair diagnostic; do not invent a grant or a no-op adapter to pass a check.
2041
2211
  - Suppress editor-preview traffic from live analytics.
2042
2212
  - Run npx siteplane analytics check, npx siteplane analytics sync and npx siteplane analytics test after setup.
2043
2213
  `;
@@ -2051,19 +2221,70 @@ ${analyticsRulesTemplate}`;
2051
2221
  // ../cli/dist/commands/analytics/import.js
2052
2222
  import { createHash } from "crypto";
2053
2223
 
2224
+ // ../cli/dist/commands/analytics/sync.js
2225
+ function createAnalyticsCliRequestHeaders(config) {
2226
+ const headers = {
2227
+ authorization: `Bearer ${config.accessToken}`,
2228
+ "content-type": "application/json"
2229
+ };
2230
+ const bypassSecret = config.vercelAutomationBypassSecret?.trim();
2231
+ if (bypassSecret) {
2232
+ headers["x-vercel-protection-bypass"] = bypassSecret;
2233
+ }
2234
+ return headers;
2235
+ }
2236
+
2054
2237
  // ../cli/dist/commands/analytics/public-key.js
2055
- import { z as z24 } from "zod";
2056
- var responseSchema = z24.object({
2057
- ok: z24.literal(true),
2058
- data: z24.object({
2059
- rawPublicKey: z24.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/)
2238
+ import { z as z26 } from "zod";
2239
+ var responseSchema = z26.object({
2240
+ ok: z26.literal(true),
2241
+ data: z26.object({
2242
+ rawPublicKey: z26.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/)
2060
2243
  })
2061
2244
  });
2062
- var errorResponseSchema = z24.object({
2063
- error: z24.object({
2064
- code: z24.string().regex(/^[a-z][a-z0-9_.-]+$/u)
2245
+ var errorResponseSchema = z26.object({
2246
+ error: z26.object({
2247
+ code: z26.string().regex(/^[a-z][a-z0-9_.-]+$/u)
2065
2248
  })
2066
2249
  });
2250
+ async function analyticsPublicKeyCommand(input) {
2251
+ const fetcher = input.fetchImpl ?? fetch;
2252
+ const response = await fetcher(`${input.config.apiBaseUrl.replace(/\/$/u, "")}/api/cli/analytics/public-key`, {
2253
+ method: "POST",
2254
+ redirect: "error",
2255
+ signal: AbortSignal.timeout(2e4),
2256
+ headers: createAnalyticsCliRequestHeaders(input.config),
2257
+ body: JSON.stringify({ siteId: input.config.siteId })
2258
+ });
2259
+ const payload = await response.json().catch(() => null);
2260
+ const parsed = responseSchema.safeParse(payload);
2261
+ if (!response.ok || !parsed.success) {
2262
+ const error = errorResponseSchema.safeParse(payload);
2263
+ throw new Error(`${error.success ? error.data.error.code : "analytics_public_key.invalid_response"}: Unable to read the active Analytics public key.`);
2264
+ }
2265
+ return parsed.data.data.rawPublicKey;
2266
+ }
2267
+
2268
+ // ../cli/dist/commands/analytics/prepare.js
2269
+ import { z as z27 } from "zod";
2270
+ var resultSchema = z27.object({
2271
+ ok: z27.literal(true),
2272
+ data: z27.object({
2273
+ rawPublicKey: z27.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/u),
2274
+ generation: z27.number().int().positive(),
2275
+ status: z27.enum([
2276
+ "setup_started",
2277
+ "test_mode",
2278
+ "active",
2279
+ "paused",
2280
+ "error",
2281
+ "deleting"
2282
+ ])
2283
+ }).strict()
2284
+ }).strict();
2285
+ var errorSchema = z27.object({
2286
+ error: z27.object({ code: z27.string().regex(/^[a-z][a-z0-9_.-]+$/u) })
2287
+ });
2067
2288
 
2068
2289
  // ../cli/dist/commands/analytics/test.js
2069
2290
  import { randomUUID } from "crypto";
@@ -2257,22 +2478,19 @@ function requireContentExportScope(scopes) {
2257
2478
  import { access, chmod, open, readFile as readFile5, rename, rm } from "fs/promises";
2258
2479
  import { randomUUID as randomUUID2 } from "crypto";
2259
2480
  import { join as join3 } from "path";
2260
- import { z as z25 } from "zod";
2261
- var siteplaneProjectConfigSchema = z25.object({
2262
- version: z25.literal(2),
2263
- apiBaseUrl: z25.string().url(),
2264
- siteId: z25.string().uuid(),
2265
- publicSiteKeyId: z25.string().uuid(),
2266
- publicSiteKey: z25.string().trim().min(1),
2267
- runId: z25.string().uuid(),
2268
- appDirectory: z25.string().min(1),
2269
- taskContractVersion: z25.literal("siteplane.setup-task.v2"),
2270
- adminProtocolVersion: z25.literal(2),
2271
- packages: z25.object({
2272
- siteplane: z25.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
2273
- runtimeNext: z25.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
2274
- }).strict(),
2275
- fieldContractHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
2481
+ import { z as z28 } from "zod";
2482
+ var siteplaneProjectConfigSchema = z28.object({
2483
+ version: z28.literal(2),
2484
+ apiBaseUrl: z28.string().url(),
2485
+ siteId: z28.string().uuid(),
2486
+ publicSiteKeyId: z28.string().uuid(),
2487
+ publicSiteKey: z28.string().trim().min(1),
2488
+ runId: z28.string().uuid(),
2489
+ appDirectory: z28.string().min(1),
2490
+ taskContractVersion: z28.literal("siteplane.setup-task.v2"),
2491
+ adminProtocolVersion: z28.literal(2),
2492
+ packages: siteSetupPackagesSchema,
2493
+ fieldContractHash: z28.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
2276
2494
  }).strict();
2277
2495
  async function readProjectPackageJson(projectDir) {
2278
2496
  return JSON.parse(await readFile5(join3(projectDir, "package.json"), "utf8"));
@@ -2332,13 +2550,13 @@ import { randomUUID as randomUUID3 } from "crypto";
2332
2550
  import { chmod as chmod2, lstat, mkdir as mkdir5, open as open2, readFile as readFile6, rename as rename2, rm as rm2 } from "fs/promises";
2333
2551
  import { dirname as dirname5, join as join4, relative } from "path";
2334
2552
  import { promisify } from "util";
2335
- import { z as z26 } from "zod";
2336
- var siteplaneCredentialsSchema = z26.object({
2337
- accessToken: z26.string().trim().min(1),
2338
- siteRevalidationSecret: z26.string().trim().min(1),
2339
- adminSession: z26.object({
2340
- secret: z26.string().regex(/^[A-Za-z0-9_-]{43}$/u),
2341
- generation: z26.string().uuid()
2553
+ import { z as z29 } from "zod";
2554
+ var siteplaneCredentialsSchema = z29.object({
2555
+ accessToken: z29.string().trim().min(1),
2556
+ siteRevalidationSecret: z29.string().trim().min(1),
2557
+ adminSession: z29.object({
2558
+ secret: z29.string().regex(/^[A-Za-z0-9_-]{43}$/u),
2559
+ generation: z29.string().uuid()
2342
2560
  }).strict().optional()
2343
2561
  }).strict();
2344
2562
  async function assertLocalCredentialsPathSafe(projectDir, options = {}) {
@@ -2421,7 +2639,7 @@ async function gitPathMatches(projectDir, path, command) {
2421
2639
  // ../cli/dist/commands/init.js
2422
2640
  import { access as access3 } from "fs/promises";
2423
2641
  import { join as join7, relative as relative3 } from "path";
2424
- import { z as z29 } from "zod";
2642
+ import { z as z32 } from "zod";
2425
2643
 
2426
2644
  // ../cli/dist/commands/setup-preflight.js
2427
2645
  import { createHash as createHash2 } from "crypto";
@@ -2433,11 +2651,11 @@ import { parse as parseYaml } from "yaml";
2433
2651
  import { createRequire } from "module";
2434
2652
  import { readFile as readFile7 } from "fs/promises";
2435
2653
  import { join as join5 } from "path";
2436
- import { z as z27 } from "zod";
2437
- var packageSchema = z27.object({
2438
- name: z27.string().optional(),
2439
- version: z27.string(),
2440
- peerDependencies: z27.record(z27.string(), z27.string()).optional()
2654
+ import { z as z30 } from "zod";
2655
+ var packageSchema = z30.object({
2656
+ name: z30.string().optional(),
2657
+ version: z30.string(),
2658
+ peerDependencies: z30.record(z30.string(), z30.string()).optional()
2441
2659
  });
2442
2660
  async function readInstalledPackage(projectDir, name2) {
2443
2661
  const require2 = createRequire(join5(projectDir, "package.json"));
@@ -2455,7 +2673,7 @@ async function readInstalledPackage(projectDir, name2) {
2455
2673
  // ../cli/dist/commands/setup-preflight.js
2456
2674
  import { access as access2, readFile as readFile8, realpath, readdir, readlink } from "fs/promises";
2457
2675
  import { dirname as dirname6, join as join6, relative as relative2, resolve, sep } from "path";
2458
- import { z as z28 } from "zod";
2676
+ import { z as z31 } from "zod";
2459
2677
 
2460
2678
  // ../cli/dist/commands/setup-process.js
2461
2679
  import { spawn } from "child_process";
@@ -2556,29 +2774,29 @@ async function setupVercelApi(cwd, endpoint, body, method, options) {
2556
2774
  }
2557
2775
 
2558
2776
  // ../cli/dist/commands/setup-preflight.js
2559
- var manifestSchema = z28.object({
2560
- packageManager: z28.string().optional(),
2561
- engines: z28.object({ node: z28.string().optional() }).optional(),
2562
- dependencies: z28.record(z28.string(), z28.string()).optional(),
2563
- devDependencies: z28.record(z28.string(), z28.string()).optional(),
2564
- scripts: z28.record(z28.string(), z28.string()).optional(),
2565
- workspaces: z28.unknown().optional()
2566
- });
2567
- var vercelProjectSchema = z28.object({
2568
- id: z28.string(),
2569
- accountId: z28.string(),
2570
- name: z28.string(),
2571
- nodeVersion: z28.string().nullable().optional(),
2572
- rootDirectory: z28.string().nullable().optional(),
2573
- framework: z28.string().nullable().optional(),
2574
- installCommand: z28.string().nullable().optional(),
2575
- buildCommand: z28.string().nullable().optional(),
2576
- link: z28.object({
2577
- type: z28.string(),
2578
- repo: z28.string().optional(),
2579
- repoId: z28.union([z28.string(), z28.number()]).optional(),
2580
- org: z28.string().optional(),
2581
- productionBranch: z28.string().optional()
2777
+ var manifestSchema = z31.object({
2778
+ packageManager: z31.string().optional(),
2779
+ engines: z31.object({ node: z31.string().optional() }).optional(),
2780
+ dependencies: z31.record(z31.string(), z31.string()).optional(),
2781
+ devDependencies: z31.record(z31.string(), z31.string()).optional(),
2782
+ scripts: z31.record(z31.string(), z31.string()).optional(),
2783
+ workspaces: z31.unknown().optional()
2784
+ });
2785
+ var vercelProjectSchema = z31.object({
2786
+ id: z31.string(),
2787
+ accountId: z31.string(),
2788
+ name: z31.string(),
2789
+ nodeVersion: z31.string().nullable().optional(),
2790
+ rootDirectory: z31.string().nullable().optional(),
2791
+ framework: z31.string().nullable().optional(),
2792
+ installCommand: z31.string().nullable().optional(),
2793
+ buildCommand: z31.string().nullable().optional(),
2794
+ link: z31.object({
2795
+ type: z31.string(),
2796
+ repo: z31.string().optional(),
2797
+ repoId: z31.union([z31.string(), z31.number()]).optional(),
2798
+ org: z31.string().optional(),
2799
+ productionBranch: z31.string().optional()
2582
2800
  }).nullable().optional()
2583
2801
  });
2584
2802
  var exists = async (path) => access2(path).then(() => true, () => false);
@@ -2635,9 +2853,9 @@ async function inspectSetupLocalProject(projectDir) {
2635
2853
  const rootManifest = manifestSchema.parse(JSON.parse(await readFile8(join6(lockfileRoot, "package.json"), "utf8")));
2636
2854
  if (lockfileRoot !== projectDirectory) {
2637
2855
  const workspaceFile = join6(lockfileRoot, "pnpm-workspace.yaml");
2638
- const workspace = lockName === "pnpm-lock.yaml" && await exists(workspaceFile) ? z28.object({ packages: z28.array(z28.string()) }).parse(parseYaml(await readFile8(workspaceFile, "utf8"))).packages : z28.union([
2639
- z28.array(z28.string()),
2640
- z28.object({ packages: z28.array(z28.string()) }).transform((value) => value.packages)
2856
+ const workspace = lockName === "pnpm-lock.yaml" && await exists(workspaceFile) ? z31.object({ packages: z31.array(z31.string()) }).parse(parseYaml(await readFile8(workspaceFile, "utf8"))).packages : z31.union([
2857
+ z31.array(z31.string()),
2858
+ z31.object({ packages: z31.array(z31.string()) }).transform((value) => value.packages)
2641
2859
  ]).parse(rootManifest.workspaces);
2642
2860
  const selected = relative2(lockfileRoot, projectDirectory).split(sep).join("/");
2643
2861
  if (!workspace.some((pattern) => !pattern.startsWith("!") && minimatch(selected, pattern)) || workspace.some((pattern) => pattern.startsWith("!") && minimatch(selected, pattern.slice(1))))
@@ -2651,11 +2869,11 @@ async function inspectSetupLocalProject(projectDir) {
2651
2869
  break;
2652
2870
  }
2653
2871
  const lockText = await readFile8(join6(lockfileRoot, lockName), "utf8");
2654
- const npmLock = lockName === "package-lock.json" ? z28.object({
2655
- lockfileVersion: z28.number(),
2656
- packages: z28.record(z28.string(), z28.object({
2657
- version: z28.string().optional(),
2658
- peerDependencies: z28.record(z28.string(), z28.string()).optional()
2872
+ const npmLock = lockName === "package-lock.json" ? z31.object({
2873
+ lockfileVersion: z31.number(),
2874
+ packages: z31.record(z31.string(), z31.object({
2875
+ version: z31.string().optional(),
2876
+ peerDependencies: z31.record(z31.string(), z31.string()).optional()
2659
2877
  })).optional()
2660
2878
  }).parse(JSON.parse(lockText)) : null;
2661
2879
  async function version2(name3) {
@@ -2710,8 +2928,12 @@ async function inspectSetupLocalProject(projectDir) {
2710
2928
  sourceConflicts.push("static_export");
2711
2929
  if (/\bbasePath\s*:/u.test(source))
2712
2930
  sourceConflicts.push("base_path");
2931
+ if (/\bloaderFile\s*:|\bloader\s*:\s*['"](?:custom|imgix|cloudinary|akamai)['"]/u.test(source))
2932
+ sourceConflicts.push(`inspect_image_loader:${file}`);
2933
+ if (/\bmaximumRedirects\s*:\s*[1-9]/u.test(source))
2934
+ sourceConflicts.push(`inspect_image_redirects:${file}`);
2713
2935
  }
2714
- if (sourceConflicts.length)
2936
+ if (sourceConflicts.some((conflict) => conflict === "static_export" || conflict === "base_path"))
2715
2937
  fail("unsupported_server_configuration", "Resolve static export/basePath configuration explicitly; Siteplane requires its server-side admin and revalidation handlers.");
2716
2938
  for (const name3 of [
2717
2939
  "middleware.ts",
@@ -2723,8 +2945,14 @@ async function inspectSetupLocalProject(projectDir) {
2723
2945
  "src/proxy.ts",
2724
2946
  "src/proxy.js"
2725
2947
  ]) {
2726
- if (await exists(join6(projectDirectory, name3)))
2948
+ if (await exists(join6(projectDirectory, name3))) {
2727
2949
  sourceConflicts.push(`inspect_routing:${name3}`);
2950
+ if (await readlink(join6(projectDirectory, name3)).catch(() => null))
2951
+ continue;
2952
+ const policySource = await readFile8(join6(projectDirectory, name3), "utf8");
2953
+ if (/Content-Security-Policy|img-src|default-src/iu.test(policySource))
2954
+ sourceConflicts.push(`inspect_image_csp:${name3}`);
2955
+ }
2728
2956
  }
2729
2957
  async function inspectSource(directory) {
2730
2958
  for (const entry of await readdir(directory, { withFileTypes: true })) {
@@ -2738,6 +2966,8 @@ async function inspectSetupLocalProject(projectDir) {
2738
2966
  if (!/\.[cm]?[jt]sx?$/u.test(entry.name))
2739
2967
  continue;
2740
2968
  const source = await readFile8(path, "utf8");
2969
+ if (/Content-Security-Policy|img-src|default-src/iu.test(source))
2970
+ sourceConflicts.push(`inspect_image_csp:${relative2(projectDirectory, path)}`);
2741
2971
  if (/from\s*["']next\/image["']/u.test(source))
2742
2972
  sourceConflicts.push(`inspect_image_policy:${relative2(projectDirectory, path)}`);
2743
2973
  if (/\b(?:Cookiebot|OneTrust|cookieyes|consentManager|cookieConsent)\b/iu.test(source))
@@ -2783,9 +3013,9 @@ async function setupPreflightCommand(input) {
2783
3013
  linkDirectory = dirname6(linkDirectory);
2784
3014
  if (!await exists(join6(linkDirectory, ".vercel/project.json")))
2785
3015
  fail("vercel_project_not_linked", "Link this application to its intended Vercel project before setup; Siteplane will not guess a target.");
2786
- const linked = z28.object({
2787
- projectId: z28.string().regex(/^prj_[A-Za-z0-9]+$/u),
2788
- orgId: z28.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u)
3016
+ const linked = z31.object({
3017
+ projectId: z31.string().regex(/^prj_[A-Za-z0-9]+$/u),
3018
+ orgId: z31.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u)
2789
3019
  }).parse(JSON.parse(await readFile8(join6(linkDirectory, ".vercel/project.json"), "utf8")));
2790
3020
  const project = vercelProjectSchema.parse(await setupVercelApi(linkDirectory, `/v9/projects/${linked.projectId}?teamId=${linked.orgId}`));
2791
3021
  if (project.id !== linked.projectId || project.accountId !== linked.orgId)
@@ -2799,11 +3029,11 @@ async function setupPreflightCommand(input) {
2799
3029
  fail("vercel_production_branch_conflict", "The local branch differs from the bound Vercel Production branch.");
2800
3030
  if (project.link?.repo && project.link.org && !local.git.remote?.replace(/\.git$/u, "").endsWith(`${project.link.org}/${project.link.repo}`))
2801
3031
  fail("vercel_git_conflict", "The local origin repository differs from the Vercel Git connection.");
2802
- const env = z28.object({
2803
- envs: z28.array(z28.object({
2804
- key: z28.string(),
2805
- value: z28.string().optional(),
2806
- target: z28.array(z28.string()).optional()
3032
+ const env = z31.object({
3033
+ envs: z31.array(z31.object({
3034
+ key: z31.string(),
3035
+ value: z31.string().optional(),
3036
+ target: z31.array(z31.string()).optional()
2807
3037
  }))
2808
3038
  }).parse(await setupVercelApi(linkDirectory, `/v10/projects/${linked.projectId}/env?teamId=${linked.orgId}`));
2809
3039
  const corepack = env.envs.some((item) => item.key === "ENABLE_EXPERIMENTAL_COREPACK" && item.value === "1" && item.target?.includes("production"));
@@ -2893,29 +3123,26 @@ async function initCommand(input) {
2893
3123
  ]
2894
3124
  };
2895
3125
  }
2896
- var siteSetupBootstrapDataSchema = z29.object({
2897
- credentialPurpose: z29.literal("site_setup"),
2898
- apiBaseUrl: z29.string().url(),
2899
- siteId: z29.string().uuid(),
2900
- publicSiteKeyId: z29.string().uuid(),
2901
- publicSiteKey: z29.string().trim().min(1),
2902
- accessToken: z29.string().trim().min(1),
2903
- siteRevalidationSecret: z29.string().regex(/^[A-Za-z0-9_-]{43}$/u),
2904
- runId: z29.string().uuid(),
2905
- packages: z29.object({
2906
- siteplane: z29.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
2907
- runtimeNext: z29.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
2908
- }).strict()
3126
+ var siteSetupBootstrapDataSchema = z32.object({
3127
+ credentialPurpose: z32.literal("site_setup"),
3128
+ apiBaseUrl: z32.string().url(),
3129
+ siteId: z32.string().uuid(),
3130
+ publicSiteKeyId: z32.string().uuid(),
3131
+ publicSiteKey: z32.string().trim().min(1),
3132
+ accessToken: z32.string().trim().min(1),
3133
+ siteRevalidationSecret: z32.string().regex(/^[A-Za-z0-9_-]{43}$/u),
3134
+ runId: z32.string().uuid(),
3135
+ packages: siteSetupPackagesSchema
2909
3136
  }).strict();
2910
- var featureBootstrapDataSchema = z29.object({
2911
- credentialPurpose: z29.enum(["analytics", "booking"]),
2912
- apiBaseUrl: z29.string().url(),
2913
- siteId: z29.string().uuid(),
2914
- accessToken: z29.string().trim().min(1)
3137
+ var featureBootstrapDataSchema = z32.object({
3138
+ credentialPurpose: z32.enum(["analytics", "booking"]),
3139
+ apiBaseUrl: z32.string().url(),
3140
+ siteId: z32.string().uuid(),
3141
+ accessToken: z32.string().trim().min(1)
2915
3142
  }).strict();
2916
- var bootstrapResponseSchema = z29.object({
2917
- ok: z29.literal(true),
2918
- data: z29.discriminatedUnion("credentialPurpose", [
3143
+ var bootstrapResponseSchema = z32.object({
3144
+ ok: z32.literal(true),
3145
+ data: z32.discriminatedUnion("credentialPurpose", [
2919
3146
  siteSetupBootstrapDataSchema,
2920
3147
  featureBootstrapDataSchema
2921
3148
  ])
@@ -2982,7 +3209,7 @@ async function persistSiteSetupBootstrap(input, bootstrap, appDirectory) {
2982
3209
  readLocalCredentials(input.projectDir),
2983
3210
  readProjectConfig(input.projectDir)
2984
3211
  ]);
2985
- if (credentials.accessToken !== bootstrap.accessToken || credentials.siteRevalidationSecret !== bootstrap.siteRevalidationSecret || config.runId !== bootstrap.runId || config.packages.siteplane !== bootstrap.packages.siteplane || config.packages.runtimeNext !== bootstrap.packages.runtimeNext || config.apiBaseUrl !== bootstrap.apiBaseUrl || config.siteId !== bootstrap.siteId || config.publicSiteKeyId !== bootstrap.publicSiteKeyId || config.publicSiteKey !== bootstrap.publicSiteKey) {
3212
+ if (credentials.accessToken !== bootstrap.accessToken || credentials.siteRevalidationSecret !== bootstrap.siteRevalidationSecret || config.runId !== bootstrap.runId || config.packages.siteplane !== bootstrap.packages.siteplane || config.packages.runtimeNext !== bootstrap.packages.runtimeNext || config.packages.analytics !== bootstrap.packages.analytics || config.apiBaseUrl !== bootstrap.apiBaseUrl || config.siteId !== bootstrap.siteId || config.publicSiteKeyId !== bootstrap.publicSiteKeyId || config.publicSiteKey !== bootstrap.publicSiteKey) {
2986
3213
  throw new Error("Siteplane setup files could not be verified.");
2987
3214
  }
2988
3215
  return { configPath, credentialsPath };
@@ -3073,7 +3300,7 @@ async function collectSourceFiles(directory) {
3073
3300
  import { execFile as execFile2 } from "child_process";
3074
3301
  import { readFile as readFile9 } from "fs/promises";
3075
3302
  import { promisify as promisify2 } from "util";
3076
- import { z as z30 } from "zod";
3303
+ import { z as z33 } from "zod";
3077
3304
 
3078
3305
  // ../cli/dist/scan/next-source-scan.js
3079
3306
  import ts2 from "typescript";
@@ -3083,30 +3310,32 @@ var editableComponentNames = new Set(["Image", "Text", "LongText", "Link"].map((
3083
3310
 
3084
3311
  // ../cli/dist/commands/site-setup.js
3085
3312
  var execFileAsync2 = promisify2(execFile2);
3086
- var safeErrorSchema = z30.object({
3087
- code: z30.string().trim().min(1),
3088
- message: z30.string().trim().min(1)
3313
+ var safeErrorSchema = z33.object({
3314
+ code: z33.string().trim().min(1),
3315
+ message: z33.string().trim().min(1)
3089
3316
  }).passthrough();
3090
- var errorResponseSchema2 = z30.object({ ok: z30.literal(false), error: safeErrorSchema }).passthrough();
3091
- var contextDataSchema = z30.object({ task: siteSetupTaskSchema }).strict();
3092
- var contextResponseSchema = z30.object({ ok: z30.literal(true), data: contextDataSchema }).strict();
3093
- var applyDataSchema = z30.object({
3094
- status: z30.enum(["applied", "ready_for_review"]),
3095
- runId: z30.string().uuid().optional(),
3096
- contractVersionId: z30.string().uuid().optional(),
3097
- fieldContractHash: z30.string().regex(/^sha256:[0-9a-f]{64}$/u),
3098
- editorDefinitionHash: z30.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
3099
- fieldCount: z30.number().int().nonnegative().optional(),
3100
- routeCount: z30.number().int().nonnegative().optional()
3317
+ var errorResponseSchema2 = z33.object({ ok: z33.literal(false), error: safeErrorSchema }).passthrough();
3318
+ var contextDataSchema = z33.object({
3319
+ task: siteSetupTaskSchema.refine((task) => task.run !== null)
3101
3320
  }).strict();
3102
- var applyResponseSchema = z30.object({ ok: z30.literal(true), data: applyDataSchema }).strict();
3103
- var verifyDataSchema = z30.object({
3104
- status: z30.literal("ready_for_review"),
3105
- runId: z30.string().uuid().optional(),
3106
- deploymentOrigin: z30.string().url().optional(),
3107
- deploymentRevision: z30.string().optional()
3321
+ var contextResponseSchema = z33.object({ ok: z33.literal(true), data: contextDataSchema }).strict();
3322
+ var applyDataSchema = z33.object({
3323
+ status: z33.enum(["applied", "ready_for_review"]),
3324
+ runId: z33.string().uuid().optional(),
3325
+ contractVersionId: z33.string().uuid().optional(),
3326
+ fieldContractHash: z33.string().regex(/^sha256:[0-9a-f]{64}$/u),
3327
+ editorDefinitionHash: z33.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
3328
+ fieldCount: z33.number().int().nonnegative().optional(),
3329
+ routeCount: z33.number().int().nonnegative().optional()
3108
3330
  }).strict();
3109
- var verifyResponseSchema = z30.object({ ok: z30.literal(true), data: verifyDataSchema }).strict();
3331
+ var applyResponseSchema = z33.object({ ok: z33.literal(true), data: applyDataSchema }).strict();
3332
+ var verifyDataSchema = z33.object({
3333
+ status: z33.literal("ready_for_review"),
3334
+ runId: z33.string().uuid().optional(),
3335
+ deploymentOrigin: z33.string().url().optional(),
3336
+ deploymentRevision: z33.string().optional()
3337
+ }).strict();
3338
+ var verifyResponseSchema = z33.object({ ok: z33.literal(true), data: verifyDataSchema }).strict();
3110
3339
  async function siteSetupContextCommand(input) {
3111
3340
  const response = await postSiteSetup(input, "context", {});
3112
3341
  const parsed = contextResponseSchema.safeParse(response.payload);
@@ -3209,8 +3438,8 @@ import ts3 from "typescript";
3209
3438
  import { randomUUID as randomUUID5 } from "crypto";
3210
3439
  import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
3211
3440
  import { resolve as resolve2 } from "path";
3212
- import { z as z31 } from "zod";
3213
- var ownerSchema = z31.object({ pid: z31.number().int().positive(), nonce: z31.string().uuid() }).strict();
3441
+ import { z as z34 } from "zod";
3442
+ var ownerSchema = z34.object({ pid: z34.number().int().positive(), nonce: z34.string().uuid() }).strict();
3214
3443
 
3215
3444
  // ../cli/dist/config/build-provenance.js
3216
3445
  import { createHash as createHash3 } from "crypto";
@@ -3218,23 +3447,23 @@ import { execFile as execFile3 } from "child_process";
3218
3447
  import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
3219
3448
  import { dirname as dirname8, isAbsolute as isAbsolute2, join as join10, relative as relative6, resolve as resolve3, sep as sep3 } from "path";
3220
3449
  import { isDeepStrictEqual, promisify as promisify3 } from "util";
3221
- import { z as z32 } from "zod";
3450
+ import { z as z35 } from "zod";
3222
3451
  var execute = promisify3(execFile3);
3223
3452
  var name = ".siteplane/build-source.json";
3224
- var oid = z32.string().regex(/^[0-9a-f]{40}$/u);
3225
- var entrySchema = z32.object({
3226
- path: z32.string().min(1).max(4096),
3227
- mode: z32.enum(["100644", "100755", "120000"]),
3453
+ var oid = z35.string().regex(/^[0-9a-f]{40}$/u);
3454
+ var entrySchema = z35.object({
3455
+ path: z35.string().min(1).max(4096),
3456
+ mode: z35.enum(["100644", "100755", "120000"]),
3228
3457
  oid
3229
3458
  }).strict();
3230
- var schema = z32.object({
3231
- version: z32.literal(2),
3459
+ var schema = z35.object({
3460
+ version: z35.literal(2),
3232
3461
  revision: oid,
3233
- commit: z32.string().min(1).max(1048576),
3234
- entries: z32.array(entrySchema).min(1).max(1e5),
3235
- providerConfigurations: z32.array(z32.object({
3236
- path: z32.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3237
- source: z32.string().max(1048576)
3462
+ commit: z35.string().min(1).max(1048576),
3463
+ entries: z35.array(entrySchema).min(1).max(1e5),
3464
+ providerConfigurations: z35.array(z35.object({
3465
+ path: z35.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3466
+ source: z35.string().max(1048576)
3238
3467
  }).strict()).max(1e3)
3239
3468
  }).strict();
3240
3469
  async function writeBuildProvenance(checkout, revision) {
@@ -3283,37 +3512,38 @@ import { createHash as createHash4, randomBytes, randomUUID as randomUUID6 } fro
3283
3512
  import { access as access5, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
3284
3513
  import { tmpdir } from "os";
3285
3514
  import { join as join11 } from "path";
3286
- import { z as z33 } from "zod";
3287
- var envSchema = z33.object({
3288
- id: z33.string(),
3289
- key: z33.string(),
3290
- target: z33.array(z33.string()),
3291
- type: z33.string(),
3292
- comment: z33.string().optional(),
3293
- updatedAt: z33.number().optional()
3294
- });
3295
- var deploymentSchema = z33.object({
3296
- id: z33.string(),
3297
- projectId: z33.string(),
3298
- ownerId: z33.string().optional(),
3299
- target: z33.string().nullable(),
3300
- readyState: z33.string(),
3301
- createdAt: z33.number(),
3302
- url: z33.string(),
3303
- meta: z33.record(z33.string(), z33.unknown()).optional(),
3304
- gitSource: z33.object({ sha: z33.string().optional() }).nullable().optional()
3305
- });
3306
- var buildProofSchema = z33.object({
3307
- node: z33.string(),
3308
- packageManager: z33.enum(["npm", "pnpm"]),
3309
- packageManagerVersion: z33.string(),
3310
- lockfileHash: z33.string(),
3311
- revision: z33.string(),
3312
- fieldContractHash: z33.string(),
3313
- siteplane: z33.string(),
3314
- runtimeNext: z33.string(),
3315
- next: z33.string(),
3316
- react: z33.string()
3515
+ import { z as z36 } from "zod";
3516
+ var envSchema = z36.object({
3517
+ id: z36.string(),
3518
+ key: z36.string(),
3519
+ target: z36.array(z36.string()),
3520
+ type: z36.string(),
3521
+ comment: z36.string().optional(),
3522
+ updatedAt: z36.number().optional()
3523
+ });
3524
+ var deploymentSchema = z36.object({
3525
+ id: z36.string(),
3526
+ projectId: z36.string(),
3527
+ ownerId: z36.string().optional(),
3528
+ target: z36.string().nullable(),
3529
+ readyState: z36.string(),
3530
+ createdAt: z36.number(),
3531
+ url: z36.string(),
3532
+ meta: z36.record(z36.string(), z36.unknown()).optional(),
3533
+ gitSource: z36.object({ sha: z36.string().optional() }).nullable().optional()
3534
+ });
3535
+ var buildProofSchema = z36.object({
3536
+ node: z36.string(),
3537
+ packageManager: z36.enum(["npm", "pnpm"]),
3538
+ packageManagerVersion: z36.string(),
3539
+ lockfileHash: z36.string(),
3540
+ revision: z36.string(),
3541
+ fieldContractHash: z36.string(),
3542
+ siteplane: z36.string(),
3543
+ runtimeNext: z36.string(),
3544
+ analytics: z36.string().optional(),
3545
+ next: z36.string(),
3546
+ react: z36.string()
3317
3547
  }).strict();
3318
3548
  var defaults = {
3319
3549
  preflight: setupPreflightCommand,
@@ -3323,6 +3553,7 @@ var defaults = {
3323
3553
  verify: siteSetupVerifyCommand,
3324
3554
  post: postSiteSetup,
3325
3555
  writeBuildProvenance,
3556
+ analyticsPublicKey: analyticsPublicKeyCommand,
3326
3557
  now: Date.now,
3327
3558
  pause: (milliseconds) => new Promise((resolve4) => setTimeout(resolve4, milliseconds))
3328
3559
  };