siteplane 0.1.44 → 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/next.js CHANGED
@@ -100,12 +100,41 @@ var analyticsProviderImportSchema = z3.object({
100
100
  rows: z3.array(analyticsProviderImportRowSchema).min(1).max(1e3)
101
101
  }).strict();
102
102
 
103
- // ../shared/dist/analytics-events.js
103
+ // ../shared/dist/analytics-config.js
104
104
  import { z as z4 } from "zod";
105
+ var ANALYTICS_CONFIG_LEASE_MS = 6e4;
106
+ var analyticsMeasurementConfigSchema = z4.object({
107
+ version: z4.literal(1),
108
+ installationGeneration: z4.number().int().positive(),
109
+ configRevision: z4.number().int().positive(),
110
+ effectiveSiteMode: z4.enum(["disabled", "session_only", "full_analytics"]),
111
+ measurementEnabled: z4.boolean(),
112
+ issuedAt: z4.string().datetime({ offset: true }),
113
+ expiresAt: z4.string().datetime({ offset: true })
114
+ }).strict().superRefine((config, context) => {
115
+ const lifetime = Date.parse(config.expiresAt) - Date.parse(config.issuedAt);
116
+ if (lifetime <= 0 || lifetime > ANALYTICS_CONFIG_LEASE_MS) {
117
+ context.addIssue({
118
+ code: "custom",
119
+ path: ["expiresAt"],
120
+ message: "Measurement permission must expire within 60 seconds."
121
+ });
122
+ }
123
+ if (config.measurementEnabled !== (config.effectiveSiteMode !== "disabled")) {
124
+ context.addIssue({
125
+ code: "custom",
126
+ path: ["measurementEnabled"],
127
+ message: "Measurement permission must match the effective site mode."
128
+ });
129
+ }
130
+ });
131
+
132
+ // ../shared/dist/analytics-events.js
133
+ import { z as z5 } from "zod";
105
134
  var ANALYTICS_SCHEMA_VERSION = "analytics.v1";
106
- var analyticsSessionIdSchema = z4.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
107
- var analyticsVisitorIdSchema = z4.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
108
- var analyticsPersistedIdentityHashSchema = z4.string().regex(/^[a-f0-9]{64}$/u);
135
+ var analyticsSessionIdSchema = z5.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
136
+ var analyticsVisitorIdSchema = z5.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
137
+ var analyticsPersistedIdentityHashSchema = z5.string().regex(/^[a-f0-9]{64}$/u);
109
138
  var analyticsEventNames = [
110
139
  "page_view",
111
140
  "section_view",
@@ -185,41 +214,43 @@ var analyticsValidityStatuses = [
185
214
  "rejected",
186
215
  "ignored"
187
216
  ];
188
- var analyticsEventNameSchema = z4.enum(analyticsEventNames);
189
- var serverOnlyAnalyticsEventSchema = z4.enum(serverOnlyAnalyticsEvents);
190
- var analyticsEventSourceSchema = z4.enum(analyticsEventSources);
191
- var analyticsIngestionChannelSchema = z4.enum(analyticsIngestionChannels);
192
- var analyticsTargetTypeSchema = z4.enum(analyticsTargetTypes);
193
- var analyticsDataAttributeEventSchema = z4.enum(analyticsDataAttributeEvents);
194
- var analyticsDeviceTypeSchema = z4.enum(analyticsDeviceTypes);
195
- var analyticsBotClassificationSchema = z4.enum(analyticsBotClassifications);
196
- var analyticsValidityStatusSchema = z4.enum(analyticsValidityStatuses);
197
- var analyticsPropertiesSchema = z4.record(z4.string(), z4.unknown());
198
- var analyticsTimestampSchema = z4.string().datetime({ offset: true });
199
- var analyticsBrowserEventSchema = z4.object({
200
- eventId: z4.string().min(1).max(160),
217
+ var analyticsEventNameSchema = z5.enum(analyticsEventNames);
218
+ var serverOnlyAnalyticsEventSchema = z5.enum(serverOnlyAnalyticsEvents);
219
+ var analyticsEventSourceSchema = z5.enum(analyticsEventSources);
220
+ var analyticsIngestionChannelSchema = z5.enum(analyticsIngestionChannels);
221
+ var analyticsTargetTypeSchema = z5.enum(analyticsTargetTypes);
222
+ var analyticsDataAttributeEventSchema = z5.enum(analyticsDataAttributeEvents);
223
+ var analyticsDeviceTypeSchema = z5.enum(analyticsDeviceTypes);
224
+ var analyticsBotClassificationSchema = z5.enum(analyticsBotClassifications);
225
+ var analyticsValidityStatusSchema = z5.enum(analyticsValidityStatuses);
226
+ var analyticsPropertiesSchema = z5.record(z5.string(), z5.unknown());
227
+ var analyticsTimestampSchema = z5.string().datetime({ offset: true });
228
+ var analyticsBrowserEventSchema = z5.object({
229
+ eventId: z5.string().min(1).max(160),
230
+ installationGeneration: z5.number().int().positive().optional(),
231
+ measurementMode: z5.enum(["session_only", "full_analytics"]).optional(),
201
232
  eventName: analyticsEventNameSchema,
202
233
  eventSource: analyticsEventSourceSchema.optional().default("browser"),
203
- targetId: z4.string().min(1).max(160).optional(),
234
+ targetId: z5.string().min(1).max(160).optional(),
204
235
  targetType: analyticsTargetTypeSchema.optional(),
205
236
  visitorId: analyticsVisitorIdSchema.optional(),
206
237
  sessionId: analyticsSessionIdSchema,
207
- idempotencyKey: z4.string().min(1).max(240).optional(),
238
+ idempotencyKey: z5.string().min(1).max(240).optional(),
208
239
  occurredAt: analyticsTimestampSchema,
209
- pageUrl: z4.string().url().max(2048).optional(),
210
- pagePath: z4.string().min(1).max(1024).optional(),
211
- routeTemplate: z4.string().min(1).max(1024).optional(),
212
- referrer: z4.string().url().max(2048).optional(),
213
- utmSource: z4.string().min(1).max(200).optional(),
214
- utmMedium: z4.string().min(1).max(200).optional(),
215
- utmCampaign: z4.string().min(1).max(200).optional(),
216
- utmContent: z4.string().min(1).max(200).optional(),
217
- utmTerm: z4.string().min(1).max(200).optional(),
240
+ pageUrl: z5.string().url().max(2048).optional(),
241
+ pagePath: z5.string().min(1).max(1024).optional(),
242
+ routeTemplate: z5.string().min(1).max(1024).optional(),
243
+ referrer: z5.string().url().max(2048).optional(),
244
+ utmSource: z5.string().min(1).max(200).optional(),
245
+ utmMedium: z5.string().min(1).max(200).optional(),
246
+ utmCampaign: z5.string().min(1).max(200).optional(),
247
+ utmContent: z5.string().min(1).max(200).optional(),
248
+ utmTerm: z5.string().min(1).max(200).optional(),
218
249
  deviceType: analyticsDeviceTypeSchema.optional(),
219
- browserName: z4.string().min(1).max(120).optional(),
220
- osName: z4.string().min(1).max(120).optional(),
221
- country: z4.string().min(1).max(80).optional(),
222
- region: z4.string().min(1).max(120).optional(),
250
+ browserName: z5.string().min(1).max(120).optional(),
251
+ osName: z5.string().min(1).max(120).optional(),
252
+ country: z5.string().min(1).max(80).optional(),
253
+ region: z5.string().min(1).max(120).optional(),
223
254
  properties: analyticsPropertiesSchema.optional().default({})
224
255
  }).superRefine((event, context) => {
225
256
  if (isServerOnlyAnalyticsEvent(event.eventName)) {
@@ -244,44 +275,44 @@ var analyticsBrowserEventSchema = z4.object({
244
275
  });
245
276
  }
246
277
  });
247
- var analyticsBrowserEventPayloadSchema = z4.object({
248
- siteKey: z4.string().min(1),
249
- schemaVersion: z4.literal(ANALYTICS_SCHEMA_VERSION),
250
- mode: z4.enum(["live", "test"]).optional().default("live"),
251
- events: z4.array(analyticsBrowserEventSchema).min(1).max(50)
278
+ var analyticsBrowserEventPayloadSchema = z5.object({
279
+ siteKey: z5.string().min(1),
280
+ schemaVersion: z5.literal(ANALYTICS_SCHEMA_VERSION),
281
+ mode: z5.enum(["live", "test"]).optional().default("live"),
282
+ events: z5.array(analyticsBrowserEventSchema).min(1).max(50)
252
283
  });
253
- var analyticsNormalizedEventBaseSchema = z4.object({
254
- site_id: z4.string().uuid(),
255
- event_id: z4.string().min(1).max(160),
256
- schema_version: z4.literal(ANALYTICS_SCHEMA_VERSION),
284
+ var analyticsNormalizedEventBaseSchema = z5.object({
285
+ site_id: z5.string().uuid(),
286
+ event_id: z5.string().min(1).max(160),
287
+ schema_version: z5.literal(ANALYTICS_SCHEMA_VERSION),
257
288
  event_name: analyticsEventNameSchema,
258
289
  event_source: analyticsEventSourceSchema,
259
290
  ingestion_channel: analyticsIngestionChannelSchema,
260
- target_id: z4.string().min(1).max(160).nullable().optional(),
291
+ target_id: z5.string().min(1).max(160).nullable().optional(),
261
292
  target_type: analyticsTargetTypeSchema.nullable().optional(),
262
- dedupe_key: z4.string().regex(/^analytics_dedupe_v1_[a-f0-9]{64}$/u).nullable().optional(),
263
- idempotency_key: z4.string().min(1).max(240).nullable().optional(),
293
+ dedupe_key: z5.string().regex(/^analytics_dedupe_v1_[a-f0-9]{64}$/u).nullable().optional(),
294
+ idempotency_key: z5.string().min(1).max(240).nullable().optional(),
264
295
  bot_classification: analyticsBotClassificationSchema,
265
296
  validity_status: analyticsValidityStatusSchema,
266
- rejection_reason: z4.string().min(1).max(240).nullable().optional(),
297
+ rejection_reason: z5.string().min(1).max(240).nullable().optional(),
267
298
  occurred_at: analyticsTimestampSchema,
268
299
  received_at: analyticsTimestampSchema,
269
- page_url: z4.string().url().max(2048).nullable().optional(),
270
- page_path: z4.string().min(1).max(1024).nullable().optional(),
271
- route_template: z4.string().min(1).max(1024).nullable().optional(),
272
- referrer: z4.string().url().max(2048).nullable().optional(),
273
- utm_source: z4.string().min(1).max(200).nullable().optional(),
274
- utm_medium: z4.string().min(1).max(200).nullable().optional(),
275
- utm_campaign: z4.string().min(1).max(200).nullable().optional(),
276
- utm_content: z4.string().min(1).max(200).nullable().optional(),
277
- utm_term: z4.string().min(1).max(200).nullable().optional(),
278
- country: z4.string().min(1).max(80).nullable().optional(),
279
- region: z4.string().min(1).max(120).nullable().optional(),
300
+ page_url: z5.string().url().max(2048).nullable().optional(),
301
+ page_path: z5.string().min(1).max(1024).nullable().optional(),
302
+ route_template: z5.string().min(1).max(1024).nullable().optional(),
303
+ referrer: z5.string().url().max(2048).nullable().optional(),
304
+ utm_source: z5.string().min(1).max(200).nullable().optional(),
305
+ utm_medium: z5.string().min(1).max(200).nullable().optional(),
306
+ utm_campaign: z5.string().min(1).max(200).nullable().optional(),
307
+ utm_content: z5.string().min(1).max(200).nullable().optional(),
308
+ utm_term: z5.string().min(1).max(200).nullable().optional(),
309
+ country: z5.string().min(1).max(80).nullable().optional(),
310
+ region: z5.string().min(1).max(120).nullable().optional(),
280
311
  device_type: analyticsDeviceTypeSchema,
281
- browser_name: z4.string().min(1).max(120).nullable().optional(),
282
- os_name: z4.string().min(1).max(120).nullable().optional(),
283
- provider: z4.string().min(1).max(120).nullable().optional(),
284
- provider_event_id: z4.string().min(1).max(240).nullable().optional(),
312
+ browser_name: z5.string().min(1).max(120).nullable().optional(),
313
+ os_name: z5.string().min(1).max(120).nullable().optional(),
314
+ provider: z5.string().min(1).max(120).nullable().optional(),
315
+ provider_event_id: z5.string().min(1).max(240).nullable().optional(),
285
316
  properties: analyticsPropertiesSchema
286
317
  });
287
318
  var analyticsRawNormalizedEventSchema = analyticsNormalizedEventBaseSchema.extend({
@@ -297,11 +328,11 @@ function isServerOnlyAnalyticsEvent(eventName) {
297
328
  }
298
329
 
299
330
  // ../shared/dist/analytics-manifest.js
300
- import { z as z5 } from "zod";
301
- var analyticsTargetIdSchema = z5.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
331
+ import { z as z6 } from "zod";
332
+ var analyticsTargetIdSchema = z6.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
302
333
  message: "Analytics target IDs must be stable identifiers without whitespace or visible copy."
303
334
  });
304
- var analyticsManifestRecordSchema = z5.record(z5.string(), z5.unknown());
335
+ var analyticsManifestRecordSchema = z6.record(z6.string(), z6.unknown());
305
336
  var analyticsFormPurposes = [
306
337
  "contact",
307
338
  "lead",
@@ -310,21 +341,21 @@ var analyticsFormPurposes = [
310
341
  "login",
311
342
  "other"
312
343
  ];
313
- var analyticsFormPurposeSchema = z5.enum(analyticsFormPurposes);
314
- var analyticsManifestRouteSchema = z5.object({
315
- path: z5.string().min(1).max(1024),
316
- pageType: z5.string().min(1).max(120).optional(),
317
- label: z5.string().min(1).max(200).optional()
344
+ var analyticsFormPurposeSchema = z6.enum(analyticsFormPurposes);
345
+ var analyticsManifestRouteSchema = z6.object({
346
+ path: z6.string().min(1).max(1024),
347
+ pageType: z6.string().min(1).max(120).optional(),
348
+ label: z6.string().min(1).max(200).optional()
318
349
  }).passthrough();
319
- var analyticsManifestTargetSchema = z5.object({
350
+ var analyticsManifestTargetSchema = z6.object({
320
351
  id: analyticsTargetIdSchema,
321
352
  type: analyticsTargetTypeSchema,
322
353
  event: analyticsEventNameSchema.optional(),
323
- events: z5.array(analyticsEventNameSchema).min(1).max(20).optional(),
324
- route: z5.string().min(1).max(1024).optional(),
325
- label: z5.string().min(1).max(200).optional(),
326
- description: z5.string().min(1).max(1e3).optional(),
327
- autoActive: z5.boolean().optional(),
354
+ events: z6.array(analyticsEventNameSchema).min(1).max(20).optional(),
355
+ route: z6.string().min(1).max(1024).optional(),
356
+ label: z6.string().min(1).max(200).optional(),
357
+ description: z6.string().min(1).max(1e3).optional(),
358
+ autoActive: z6.boolean().optional(),
328
359
  sourceHints: analyticsManifestRecordSchema.optional()
329
360
  }).passthrough().superRefine((target, context) => {
330
361
  if (target.event === void 0 && target.events === void 0) {
@@ -349,21 +380,21 @@ var analyticsManifestTargetSchema = z5.object({
349
380
  });
350
381
  }
351
382
  });
352
- var analyticsManifestSchema = z5.object({
353
- schemaVersion: z5.literal(ANALYTICS_SCHEMA_VERSION),
354
- siteId: z5.string().min(1),
355
- siteKeyRef: z5.string().regex(/^env:[A-Z][A-Z0-9_]*$/u, {
383
+ var analyticsManifestSchema = z6.object({
384
+ schemaVersion: z6.literal(ANALYTICS_SCHEMA_VERSION),
385
+ siteId: z6.string().min(1),
386
+ siteKeyRef: z6.string().regex(/^env:[A-Z][A-Z0-9_]*$/u, {
356
387
  message: "siteKeyRef must be an environment-variable reference."
357
388
  }),
358
- siteKeyLookup: z5.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}$/),
359
- routes: z5.array(analyticsManifestRouteSchema),
360
- targets: z5.array(analyticsManifestTargetSchema),
389
+ siteKeyLookup: z6.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}$/),
390
+ routes: z6.array(analyticsManifestRouteSchema),
391
+ targets: z6.array(analyticsManifestTargetSchema),
361
392
  metadata: analyticsManifestRecordSchema.optional(),
362
- siteKey: z5.string().optional(),
363
- secretKey: z5.string().optional(),
364
- rawKey: z5.string().optional(),
365
- token: z5.string().optional(),
366
- accessToken: z5.string().optional()
393
+ siteKey: z6.string().optional(),
394
+ secretKey: z6.string().optional(),
395
+ rawKey: z6.string().optional(),
396
+ token: z6.string().optional(),
397
+ accessToken: z6.string().optional()
367
398
  }).passthrough().superRefine((manifest, context) => {
368
399
  const targetIds = /* @__PURE__ */ new Set();
369
400
  for (const [index, target] of manifest.targets.entries()) {
@@ -407,9 +438,9 @@ function isPlainRecord(value) {
407
438
  }
408
439
 
409
440
  // ../shared/dist/analytics-metrics.js
410
- import { z as z6 } from "zod";
441
+ import { z as z7 } from "zod";
411
442
  var analyticsVisitorQualities = ["exact", "estimated"];
412
- var analyticsVisitorQualitySchema = z6.enum(analyticsVisitorQualities);
443
+ var analyticsVisitorQualitySchema = z7.enum(analyticsVisitorQualities);
413
444
  var analyticsKpiKeys = [
414
445
  "pageViews",
415
446
  "sessions",
@@ -421,7 +452,7 @@ var analyticsKpiKeys = [
421
452
  "conversionRate",
422
453
  "inquiryRate"
423
454
  ];
424
- var analyticsKpiKeySchema = z6.enum(analyticsKpiKeys);
455
+ var analyticsKpiKeySchema = z7.enum(analyticsKpiKeys);
425
456
 
426
457
  // ../shared/dist/analytics-privacy.js
427
458
  var serverPropertySchemas = {
@@ -459,7 +490,7 @@ function revenuePropertySchema() {
459
490
  }
460
491
 
461
492
  // ../shared/dist/assets.js
462
- import { z as z7 } from "zod";
493
+ import { z as z8 } from "zod";
463
494
  var ASSET_STAGES = ["staging", "final", "deleted"];
464
495
  var ASSET_VISIBILITIES = ["private", "public", "deleted"];
465
496
  var ASSET_USAGE_ENTITY_TYPES = [
@@ -468,13 +499,13 @@ var ASSET_USAGE_ENTITY_TYPES = [
468
499
  "change_set",
469
500
  "published_value"
470
501
  ];
471
- var assetStageSchema = z7.enum(ASSET_STAGES);
472
- var assetVisibilitySchema = z7.enum(ASSET_VISIBILITIES);
473
- var assetUsageEntityTypeSchema = z7.enum(ASSET_USAGE_ENTITY_TYPES);
474
- var brandingAccentColorSchema = z7.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
502
+ var assetStageSchema = z8.enum(ASSET_STAGES);
503
+ var assetVisibilitySchema = z8.enum(ASSET_VISIBILITIES);
504
+ var assetUsageEntityTypeSchema = z8.enum(ASSET_USAGE_ENTITY_TYPES);
505
+ var brandingAccentColorSchema = z8.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
475
506
 
476
507
  // ../shared/dist/booking-contracts.js
477
- import { z as z8 } from "zod";
508
+ import { z as z9 } from "zod";
478
509
  var bookingStatuses = [
479
510
  "pending_payment",
480
511
  "confirmed",
@@ -529,30 +560,30 @@ var bookingResourceKinds = [
529
560
  "equipment",
530
561
  "other"
531
562
  ];
532
- var bookingStatusSchema = z8.enum(bookingStatuses);
533
- var bookingPaymentStatusSchema = z8.enum(bookingPaymentStatuses);
534
- var bookingAccountReadinessStatusSchema = z8.enum(bookingAccountReadinessStatuses);
535
- var bookingRefundStatusSchema = z8.enum(bookingRefundStatuses);
536
- var bookingDisputeStatusSchema = z8.enum(bookingDisputeStatuses);
537
- var bookingPaymentModeSchema = z8.enum(bookingPaymentModes);
538
- var bookingPaymentCollectionTypeSchema = z8.enum(bookingPaymentCollectionTypes);
539
- var bookingPaymentCollectionSchema = z8.discriminatedUnion("type", [
540
- z8.object({ type: z8.literal("full_amount") }).strict(),
541
- z8.object({
542
- type: z8.literal("deposit_percent"),
543
- depositPercent: z8.number().int().min(10).max(90)
563
+ var bookingStatusSchema = z9.enum(bookingStatuses);
564
+ var bookingPaymentStatusSchema = z9.enum(bookingPaymentStatuses);
565
+ var bookingAccountReadinessStatusSchema = z9.enum(bookingAccountReadinessStatuses);
566
+ var bookingRefundStatusSchema = z9.enum(bookingRefundStatuses);
567
+ var bookingDisputeStatusSchema = z9.enum(bookingDisputeStatuses);
568
+ var bookingPaymentModeSchema = z9.enum(bookingPaymentModes);
569
+ var bookingPaymentCollectionTypeSchema = z9.enum(bookingPaymentCollectionTypes);
570
+ var bookingPaymentCollectionSchema = z9.discriminatedUnion("type", [
571
+ z9.object({ type: z9.literal("full_amount") }).strict(),
572
+ z9.object({
573
+ type: z9.literal("deposit_percent"),
574
+ depositPercent: z9.number().int().min(10).max(90)
544
575
  }).strict()
545
576
  ]);
546
577
  var bookingPaymentChoices = ["onsite", "online"];
547
- var bookingPaymentChoiceSchema = z8.enum(bookingPaymentChoices);
548
- var bookingPaymentSnapshotSchema = z8.object({
549
- snapshotId: z8.string().uuid(),
550
- snapshotVersion: z8.number().int().positive(),
551
- currency: z8.literal("EUR"),
552
- totalAmountCents: z8.number().int().min(0),
553
- onlineAmountCents: z8.number().int().min(0),
554
- onsiteRemainderCents: z8.number().int().min(0),
555
- maxStripeRefundAmountCents: z8.number().int().min(0)
578
+ var bookingPaymentChoiceSchema = z9.enum(bookingPaymentChoices);
579
+ var bookingPaymentSnapshotSchema = z9.object({
580
+ snapshotId: z9.string().uuid(),
581
+ snapshotVersion: z9.number().int().positive(),
582
+ currency: z9.literal("EUR"),
583
+ totalAmountCents: z9.number().int().min(0),
584
+ onlineAmountCents: z9.number().int().min(0),
585
+ onsiteRemainderCents: z9.number().int().min(0),
586
+ maxStripeRefundAmountCents: z9.number().int().min(0)
556
587
  }).strict().superRefine((snapshot, context) => {
557
588
  if (snapshot.onlineAmountCents + snapshot.onsiteRemainderCents !== snapshot.totalAmountCents) {
558
589
  context.addIssue({
@@ -567,17 +598,17 @@ var bookingPaymentSnapshotSchema = z8.object({
567
598
  });
568
599
  }
569
600
  });
570
- var bookingServiceVariantSchema = z8.object({
571
- id: z8.string().uuid(),
572
- name: z8.string().trim().min(1).max(120),
573
- durationMinutes: z8.number().int().min(1).max(1440),
574
- priceCents: z8.number().int().min(0).nullable()
601
+ var bookingServiceVariantSchema = z9.object({
602
+ id: z9.string().uuid(),
603
+ name: z9.string().trim().min(1).max(120),
604
+ durationMinutes: z9.number().int().min(1).max(1440),
605
+ priceCents: z9.number().int().min(0).nullable()
575
606
  }).strict();
576
- var bookingServiceVariantsSchema = z8.array(bookingServiceVariantSchema).min(1).max(20);
577
- var isoDateSchema = z8.string().regex(/^\d{4}-\d{2}-\d{2}$/);
578
- var utcDateTimeSchema = z8.string().datetime();
579
- var bookingLocalTimeSchema = z8.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
580
- var bookingAvailabilityIntervalsSchema = z8.array(z8.object({
607
+ var bookingServiceVariantsSchema = z9.array(bookingServiceVariantSchema).min(1).max(20);
608
+ var isoDateSchema = z9.string().regex(/^\d{4}-\d{2}-\d{2}$/);
609
+ var utcDateTimeSchema = z9.string().datetime();
610
+ var bookingLocalTimeSchema = z9.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
611
+ var bookingAvailabilityIntervalsSchema = z9.array(z9.object({
581
612
  start: bookingLocalTimeSchema,
582
613
  end: bookingLocalTimeSchema
583
614
  }).strict().refine((interval) => interval.end > interval.start)).superRefine((intervals, context) => {
@@ -592,75 +623,75 @@ var bookingAvailabilityIntervalsSchema = z8.array(z8.object({
592
623
  }
593
624
  }
594
625
  });
595
- var bookingPublicConfigSchema = z8.object({
596
- site: z8.object({
597
- displayName: z8.string().trim().min(1),
598
- timezone: z8.string().trim().min(1),
599
- locale: z8.string().trim().min(2),
600
- bookingPageSlug: z8.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
601
- privacyUrl: z8.string().url().nullable()
626
+ var bookingPublicConfigSchema = z9.object({
627
+ site: z9.object({
628
+ displayName: z9.string().trim().min(1),
629
+ timezone: z9.string().trim().min(1),
630
+ locale: z9.string().trim().min(2),
631
+ bookingPageSlug: z9.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
632
+ privacyUrl: z9.string().url().nullable()
602
633
  }),
603
- branding: z8.object({
604
- logoUrl: z8.string().url().nullable(),
605
- accentColor: z8.string().trim().min(1).nullable()
634
+ branding: z9.object({
635
+ logoUrl: z9.string().url().nullable(),
636
+ accentColor: z9.string().trim().min(1).nullable()
606
637
  }),
607
- settings: z8.object({
608
- slotIntervalMinutes: z8.number().int().positive(),
609
- minLeadMinutes: z8.number().int().min(0),
610
- maxAdvanceDays: z8.number().int().min(1),
611
- requirePhone: z8.boolean(),
612
- collectNote: z8.boolean(),
613
- confirmationMessage: z8.string().nullable()
638
+ settings: z9.object({
639
+ slotIntervalMinutes: z9.number().int().positive(),
640
+ minLeadMinutes: z9.number().int().min(0),
641
+ maxAdvanceDays: z9.number().int().min(1),
642
+ requirePhone: z9.boolean(),
643
+ collectNote: z9.boolean(),
644
+ confirmationMessage: z9.string().nullable()
614
645
  }),
615
646
  /** Freitexte des Salons, im Kassen-Schritt vor der Bestaetigung sichtbar. */
616
- policies: z8.object({
617
- cancellation: z8.string().nullable(),
618
- lateArrival: z8.string().nullable()
647
+ policies: z9.object({
648
+ cancellation: z9.string().nullable(),
649
+ lateArrival: z9.string().nullable()
619
650
  }),
620
- payment: z8.object({
651
+ payment: z9.object({
621
652
  mode: bookingPaymentModeSchema,
622
653
  collection: bookingPaymentCollectionSchema,
623
- onlinePaymentsReady: z8.boolean()
654
+ onlinePaymentsReady: z9.boolean()
624
655
  }).strict(),
625
- serviceCategories: z8.array(z8.object({
626
- id: z8.string().uuid(),
627
- name: z8.string().trim().min(1),
628
- sortOrder: z8.number().int()
656
+ serviceCategories: z9.array(z9.object({
657
+ id: z9.string().uuid(),
658
+ name: z9.string().trim().min(1),
659
+ sortOrder: z9.number().int()
629
660
  })),
630
- serviceSubcategories: z8.array(z8.object({
631
- id: z8.string().uuid(),
632
- categoryId: z8.string().uuid(),
633
- name: z8.string().trim().min(1),
634
- sortOrder: z8.number().int()
661
+ serviceSubcategories: z9.array(z9.object({
662
+ id: z9.string().uuid(),
663
+ categoryId: z9.string().uuid(),
664
+ name: z9.string().trim().min(1),
665
+ sortOrder: z9.number().int()
635
666
  })),
636
- services: z8.array(z8.object({
637
- id: z8.string().trim().min(1),
638
- name: z8.string().trim().min(1),
639
- durationMinutes: z8.number().int().positive(),
640
- priceCents: z8.number().int().min(0).nullable(),
641
- currency: z8.string().regex(/^[A-Z]{3}$/),
642
- description: z8.string().nullable(),
643
- categoryId: z8.string().uuid(),
644
- subcategoryId: z8.string().uuid().nullable(),
667
+ services: z9.array(z9.object({
668
+ id: z9.string().trim().min(1),
669
+ name: z9.string().trim().min(1),
670
+ durationMinutes: z9.number().int().positive(),
671
+ priceCents: z9.number().int().min(0).nullable(),
672
+ currency: z9.string().regex(/^[A-Z]{3}$/),
673
+ description: z9.string().nullable(),
674
+ categoryId: z9.string().uuid(),
675
+ subcategoryId: z9.string().uuid().nullable(),
645
676
  variants: bookingServiceVariantsSchema,
646
- allowsAnyResource: z8.boolean(),
647
- sortOrder: z8.number().int()
677
+ allowsAnyResource: z9.boolean(),
678
+ sortOrder: z9.number().int()
648
679
  })),
649
- resources: z8.array(z8.object({
650
- id: z8.string().trim().min(1),
651
- name: z8.string().trim().min(1),
652
- kind: z8.enum(bookingResourceKinds)
680
+ resources: z9.array(z9.object({
681
+ id: z9.string().trim().min(1),
682
+ name: z9.string().trim().min(1),
683
+ kind: z9.enum(bookingResourceKinds)
653
684
  })),
654
- serviceResources: z8.array(z8.object({
655
- serviceId: z8.string().trim().min(1),
656
- resourceId: z8.string().trim().min(1)
685
+ serviceResources: z9.array(z9.object({
686
+ serviceId: z9.string().trim().min(1),
687
+ resourceId: z9.string().trim().min(1)
657
688
  }))
658
689
  });
659
- var bookingItemSchema = z8.object({
660
- serviceId: z8.string().trim().min(1),
661
- variantId: z8.string().trim().min(1)
690
+ var bookingItemSchema = z9.object({
691
+ serviceId: z9.string().trim().min(1),
692
+ variantId: z9.string().trim().min(1)
662
693
  }).strict();
663
- var bookingItemsSchema = z8.array(bookingItemSchema).min(1).max(10);
694
+ var bookingItemsSchema = z9.array(bookingItemSchema).min(1).max(10);
664
695
  function parseBookingItemsParam(value) {
665
696
  const items = value.split(",").map((entry) => entry.trim()).filter((entry) => entry !== "").map((entry) => {
666
697
  const [serviceId, variantId, ...rest] = entry.split(":");
@@ -668,36 +699,36 @@ function parseBookingItemsParam(value) {
668
699
  });
669
700
  return items.every((item) => item !== null) ? items : null;
670
701
  }
671
- var bookingSlotsQuerySchema = z8.object({
672
- items: z8.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
673
- resourceId: z8.string().trim().min(1).optional(),
702
+ var bookingSlotsQuerySchema = z9.object({
703
+ items: z9.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
704
+ resourceId: z9.string().trim().min(1).optional(),
674
705
  fromDate: isoDateSchema,
675
706
  toDate: isoDateSchema
676
707
  });
677
- var bookingSlotsResponseSchema = z8.object({
678
- timezone: z8.string().trim().min(1),
708
+ var bookingSlotsResponseSchema = z9.object({
709
+ timezone: z9.string().trim().min(1),
679
710
  items: bookingItemsSchema,
680
711
  // Reine Behandlungsdauer ohne Puffer: das UI zeigt damit die Terminspanne,
681
712
  // ohne selbst rechnen zu muessen.
682
- totalDurationMinutes: z8.number().int().min(1),
683
- mode: z8.enum(["any", "resource"]),
684
- slots: z8.array(z8.object({
713
+ totalDurationMinutes: z9.number().int().min(1),
714
+ mode: z9.enum(["any", "resource"]),
715
+ slots: z9.array(z9.object({
685
716
  startUtc: utcDateTimeSchema,
686
- resourceId: z8.string().trim().min(1).optional()
717
+ resourceId: z9.string().trim().min(1).optional()
687
718
  }))
688
719
  });
689
- var bookingAvailabilityQuerySchema = z8.object({
690
- items: z8.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
691
- resourceId: z8.string().trim().min(1).optional(),
720
+ var bookingAvailabilityQuerySchema = z9.object({
721
+ items: z9.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
722
+ resourceId: z9.string().trim().min(1).optional(),
692
723
  fromDate: isoDateSchema,
693
724
  toDate: isoDateSchema
694
725
  });
695
- var bookingAvailabilityResponseSchema = z8.object({
696
- timezone: z8.string().trim().min(1),
697
- totalDurationMinutes: z8.number().int().min(1),
698
- days: z8.array(z8.object({
726
+ var bookingAvailabilityResponseSchema = z9.object({
727
+ timezone: z9.string().trim().min(1),
728
+ totalDurationMinutes: z9.number().int().min(1),
729
+ days: z9.array(z9.object({
699
730
  date: isoDateSchema,
700
- hasSlots: z8.boolean()
731
+ hasSlots: z9.boolean()
701
732
  })),
702
733
  /** Erster Tag mit Slot ab `fromDate`, auch ausserhalb des Fensters. */
703
734
  nextAvailableDate: isoDateSchema.nullable()
@@ -715,72 +746,72 @@ var bookingPublicErrorCodes = [
715
746
  "too_late",
716
747
  "not_found"
717
748
  ];
718
- var bookingPublicErrorSchema = z8.object({
719
- error: z8.enum(bookingPublicErrorCodes),
720
- message: z8.string().optional(),
721
- requestId: z8.string().optional()
749
+ var bookingPublicErrorSchema = z9.object({
750
+ error: z9.enum(bookingPublicErrorCodes),
751
+ message: z9.string().optional(),
752
+ requestId: z9.string().optional()
722
753
  }).strict();
723
- var bookingCreateRequestSchema = z8.object({
754
+ var bookingCreateRequestSchema = z9.object({
724
755
  items: bookingItemsSchema,
725
- resourceId: z8.string().min(1).nullable(),
756
+ resourceId: z9.string().min(1).nullable(),
726
757
  startUtc: utcDateTimeSchema,
727
- customer: z8.object({
728
- name: z8.string().min(1).max(120),
729
- email: z8.string().email().max(254),
730
- phone: z8.string().max(32).optional(),
731
- note: z8.string().max(1e3).optional()
758
+ customer: z9.object({
759
+ name: z9.string().min(1).max(120),
760
+ email: z9.string().email().max(254),
761
+ phone: z9.string().max(32).optional(),
762
+ note: z9.string().max(1e3).optional()
732
763
  }).strict(),
733
- hp: z8.string().optional(),
734
- clientToken: z8.string().uuid(),
764
+ hp: z9.string().optional(),
765
+ clientToken: z9.string().uuid(),
735
766
  paymentChoice: bookingPaymentChoiceSchema,
736
767
  // Werbe-Einwilligung. Bestaetigung, Erinnerung und Storno-Link sind davon
737
768
  // unabhaengig und werden immer versendet.
738
- consent: z8.object({
739
- marketingEmail: z8.boolean(),
740
- marketingSms: z8.boolean()
769
+ consent: z9.object({
770
+ marketingEmail: z9.boolean(),
771
+ marketingSms: z9.boolean()
741
772
  }).strict().optional()
742
773
  }).strict();
743
- var bookingPublicPaymentResponseSchema = z8.object({
744
- clientSecret: z8.string().min(1),
745
- stripeAccountId: z8.string().startsWith("acct_")
774
+ var bookingPublicPaymentResponseSchema = z9.object({
775
+ clientSecret: z9.string().min(1),
776
+ stripeAccountId: z9.string().startsWith("acct_")
746
777
  }).strict();
747
- var bookingCreateResponseSchema = z8.union([
748
- z8.object({
749
- status: z8.literal("confirmed"),
750
- booking: z8.object({
751
- id: z8.string().min(1),
778
+ var bookingCreateResponseSchema = z9.union([
779
+ z9.object({
780
+ status: z9.literal("confirmed"),
781
+ booking: z9.object({
782
+ id: z9.string().min(1),
752
783
  startUtc: utcDateTimeSchema,
753
784
  endUtc: utcDateTimeSchema,
754
- timezone: z8.string().trim().min(1),
755
- serviceName: z8.string().trim().min(1),
756
- resourceName: z8.string().trim().min(1)
785
+ timezone: z9.string().trim().min(1),
786
+ serviceName: z9.string().trim().min(1),
787
+ resourceName: z9.string().trim().min(1)
757
788
  }).strict(),
758
- manageUrl: z8.string().url(),
759
- confirmationMessage: z8.string().nullable()
789
+ manageUrl: z9.string().url(),
790
+ confirmationMessage: z9.string().nullable()
760
791
  }).strict(),
761
- z8.object({
762
- status: z8.literal("pending_payment"),
763
- bookingId: z8.string().min(1),
792
+ z9.object({
793
+ status: z9.literal("pending_payment"),
794
+ bookingId: z9.string().min(1),
764
795
  holdExpiresAt: utcDateTimeSchema,
765
796
  payment: bookingPublicPaymentResponseSchema,
766
- statusToken: z8.string().min(20),
767
- manageUrl: z8.string().url().optional()
797
+ statusToken: z9.string().min(20),
798
+ manageUrl: z9.string().url().optional()
768
799
  }).strict(),
769
800
  bookingPublicErrorSchema
770
801
  ]);
771
- var bookingStatusResponseSchema = z8.object({
802
+ var bookingStatusResponseSchema = z9.object({
772
803
  bookingStatus: bookingStatusSchema,
773
804
  paymentStatus: bookingPaymentStatusSchema,
774
805
  refundStatus: bookingRefundStatusSchema,
775
806
  disputeStatus: bookingDisputeStatusSchema,
776
807
  holdExpiresAt: utcDateTimeSchema.nullable()
777
808
  }).strict();
778
- var bookingCancelRequestSchema = z8.object({
779
- token: z8.string().min(20)
809
+ var bookingCancelRequestSchema = z9.object({
810
+ token: z9.string().min(20)
780
811
  });
781
- var bookingCancelResponseSchema = z8.union([
782
- z8.object({
783
- status: z8.enum(["cancelled", "already_cancelled", "too_late", "not_found"])
812
+ var bookingCancelResponseSchema = z9.union([
813
+ z9.object({
814
+ status: z9.enum(["cancelled", "already_cancelled", "too_late", "not_found"])
784
815
  }),
785
816
  bookingPublicErrorSchema
786
817
  ]);
@@ -789,57 +820,57 @@ var bookingMoveErrorCodes = [
789
820
  "booking_not_movable",
790
821
  "not_found"
791
822
  ];
792
- var bookingMoveRequestSchema = z8.object({
793
- bookingId: z8.string().uuid(),
823
+ var bookingMoveRequestSchema = z9.object({
824
+ bookingId: z9.string().uuid(),
794
825
  newStartUtc: utcDateTimeSchema,
795
- newResourceId: z8.string().uuid().optional(),
796
- notifyCustomer: z8.boolean().default(false),
797
- reason: z8.string().max(500).optional()
798
- });
799
- var bookingMoveResponseSchema = z8.union([
800
- z8.object({
801
- status: z8.literal("moved"),
802
- bookingId: z8.string().uuid(),
826
+ newResourceId: z9.string().uuid().optional(),
827
+ notifyCustomer: z9.boolean().default(false),
828
+ reason: z9.string().max(500).optional()
829
+ });
830
+ var bookingMoveResponseSchema = z9.union([
831
+ z9.object({
832
+ status: z9.literal("moved"),
833
+ bookingId: z9.string().uuid(),
803
834
  startUtc: utcDateTimeSchema,
804
835
  endUtc: utcDateTimeSchema,
805
- resourceId: z8.string().uuid()
836
+ resourceId: z9.string().uuid()
806
837
  }),
807
- z8.object({
808
- error: z8.enum(bookingMoveErrorCodes),
809
- message: z8.string().optional(),
810
- requestId: z8.string().optional()
838
+ z9.object({
839
+ error: z9.enum(bookingMoveErrorCodes),
840
+ message: z9.string().optional(),
841
+ requestId: z9.string().optional()
811
842
  })
812
843
  ]);
813
- var bookingManifestSchema = z8.object({
814
- schemaVersion: z8.number().int().positive(),
815
- siteId: z8.string().trim().min(1),
816
- siteKeyPrefix: z8.string().startsWith("bk_pub_"),
817
- bookingPageSlug: z8.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
818
- embedMode: z8.enum(["script", "web_component", "iframe"]).optional(),
819
- productionOrigin: z8.string().url().optional()
844
+ var bookingManifestSchema = z9.object({
845
+ schemaVersion: z9.number().int().positive(),
846
+ siteId: z9.string().trim().min(1),
847
+ siteKeyPrefix: z9.string().startsWith("bk_pub_"),
848
+ bookingPageSlug: z9.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
849
+ embedMode: z9.enum(["script", "web_component", "iframe"]).optional(),
850
+ productionOrigin: z9.string().url().optional()
820
851
  }).passthrough();
821
852
 
822
853
  // ../shared/dist/booking-defaults.js
823
854
  var BOOKING_CREATE_PAYLOAD_LIMIT_BYTES = 16 * 1024;
824
855
 
825
856
  // ../shared/dist/bridge-protocol.js
826
- import { z as z16 } from "zod";
857
+ import { z as z17 } from "zod";
827
858
 
828
859
  // ../shared/dist/field-id.js
829
- import { z as z9 } from "zod";
860
+ import { z as z10 } from "zod";
830
861
  var FIELD_ID_PATTERN = /^[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+$/;
831
- var fieldIdSchema = z9.string().regex(FIELD_ID_PATTERN, "Invalid field id");
862
+ var fieldIdSchema = z10.string().regex(FIELD_ID_PATTERN, "Invalid field id");
832
863
  function isFieldId(value) {
833
864
  return typeof value === "string" && fieldIdSchema.safeParse(value).success;
834
865
  }
835
866
 
836
867
  // ../shared/dist/field-types.js
837
- import { z as z10 } from "zod";
868
+ import { z as z11 } from "zod";
838
869
  var FIELD_TYPES = ["text", "longText", "image", "link"];
839
- var fieldTypeSchema = z10.enum(FIELD_TYPES);
870
+ var fieldTypeSchema = z11.enum(FIELD_TYPES);
840
871
 
841
872
  // ../shared/dist/image-value.js
842
- import { z as z11 } from "zod";
873
+ import { z as z12 } from "zod";
843
874
  var SUPPORTED_IMAGE_CONTENT_TYPES = [
844
875
  "image/jpeg",
845
876
  "image/png",
@@ -848,21 +879,21 @@ var SUPPORTED_IMAGE_CONTENT_TYPES = [
848
879
  ];
849
880
  var maxImageUploadBytes = 10 * 1024 * 1024;
850
881
  var largeImageWarningBytes = 2 * 1024 * 1024;
851
- var imageContentTypeSchema = z11.enum(SUPPORTED_IMAGE_CONTENT_TYPES);
852
- var imageCropSchema = z11.object({
853
- x: z11.number().min(0).max(100),
854
- y: z11.number().min(0).max(100),
855
- zoom: z11.number().min(1).max(4),
856
- aspectRatio: z11.number().positive().max(10)
857
- });
858
- var imageValueSchema = z11.object({
859
- src: z11.string().trim().min(1),
860
- alt: z11.string().trim().min(1).max(300),
861
- width: z11.number().int().positive().optional(),
862
- height: z11.number().int().positive().optional(),
882
+ var imageContentTypeSchema = z12.enum(SUPPORTED_IMAGE_CONTENT_TYPES);
883
+ var imageCropSchema = z12.object({
884
+ x: z12.number().min(0).max(100),
885
+ y: z12.number().min(0).max(100),
886
+ zoom: z12.number().min(1).max(4),
887
+ aspectRatio: z12.number().positive().max(10)
888
+ });
889
+ var imageValueSchema = z12.object({
890
+ src: z12.string().trim().min(1),
891
+ alt: z12.string().trim().min(1).max(300),
892
+ width: z12.number().int().positive().optional(),
893
+ height: z12.number().int().positive().optional(),
863
894
  crop: imageCropSchema.optional(),
864
- assetId: z11.string().uuid().optional(),
865
- finalStorageProvider: z11.enum([
895
+ assetId: z12.string().uuid().optional(),
896
+ finalStorageProvider: z12.enum([
866
897
  "repo_static_assets",
867
898
  "repo_handoff",
868
899
  "site_owned_storage",
@@ -871,31 +902,36 @@ var imageValueSchema = z11.object({
871
902
  });
872
903
 
873
904
  // ../shared/dist/setup-deployment.js
874
- import { z as z12 } from "zod";
875
- var version = z12.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
876
- var hash = z12.string().regex(/^sha256:[0-9a-f]{64}$/u);
877
- var setupDeploymentRecordSchema = z12.object({
878
- version: z12.literal(1),
879
- operationId: z12.string().uuid(),
880
- provider: z12.literal("vercel"),
881
- projectId: z12.string().regex(/^prj_[A-Za-z0-9]+$/u),
882
- teamId: z12.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u),
883
- origin: z12.string().url().refine((value) => {
905
+ import { z as z13 } from "zod";
906
+ var version = z13.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
907
+ var siteSetupPackagesSchema = z13.object({
908
+ siteplane: version,
909
+ runtimeNext: version,
910
+ analytics: version.optional()
911
+ }).strict();
912
+ var hash = z13.string().regex(/^sha256:[0-9a-f]{64}$/u);
913
+ var setupDeploymentRecordSchema = z13.object({
914
+ version: z13.literal(1),
915
+ operationId: z13.string().uuid(),
916
+ provider: z13.literal("vercel"),
917
+ projectId: z13.string().regex(/^prj_[A-Za-z0-9]+$/u),
918
+ teamId: z13.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u),
919
+ origin: z13.string().url().refine((value) => {
884
920
  const url = new URL(value);
885
921
  return url.protocol === "https:" && url.origin === value && !url.username && !url.password;
886
922
  }),
887
- deploymentId: z12.string().regex(/^dpl_[A-Za-z0-9]+$/u).nullable(),
888
- revision: z12.string().regex(/^[0-9a-f]{40}$/u),
923
+ deploymentId: z13.string().regex(/^dpl_[A-Za-z0-9]+$/u).nullable(),
924
+ revision: z13.string().regex(/^[0-9a-f]{40}$/u),
889
925
  fieldContractHash: hash,
890
- packages: z12.object({ siteplane: version, runtimeNext: version }).strict(),
926
+ packages: siteSetupPackagesSchema,
891
927
  configurationFingerprint: hash,
892
- adminSecretGeneration: z12.string().uuid(),
893
- revalidationGeneration: z12.number().int().positive(),
894
- startedAt: z12.string().datetime(),
895
- environmentWrittenAt: z12.string().datetime().nullable(),
896
- deployRequestedAt: z12.string().datetime().nullable(),
897
- deadline: z12.string().datetime(),
898
- phase: z12.enum([
928
+ adminSecretGeneration: z13.string().uuid(),
929
+ revalidationGeneration: z13.number().int().positive(),
930
+ startedAt: z13.string().datetime(),
931
+ environmentWrittenAt: z13.string().datetime().nullable(),
932
+ deployRequestedAt: z13.string().datetime().nullable(),
933
+ deadline: z13.string().datetime(),
934
+ phase: z13.enum([
899
935
  "planned",
900
936
  "environment_written",
901
937
  "deploy_requested",
@@ -903,37 +939,37 @@ var setupDeploymentRecordSchema = z12.object({
903
939
  "verified",
904
940
  "failed"
905
941
  ]),
906
- build: z12.object({
942
+ build: z13.object({
907
943
  node: version,
908
- packageManager: z12.enum(["npm", "pnpm"]),
944
+ packageManager: z13.enum(["npm", "pnpm"]),
909
945
  packageManagerVersion: version,
910
946
  lockfileHash: hash
911
947
  }).strict().nullable()
912
948
  }).strict();
913
- var setupDeploymentInputSchema = z12.discriminatedUnion("action", [
914
- z12.object({ action: z12.literal("read") }).strict(),
915
- z12.object({
916
- action: z12.literal("record"),
917
- expectedOperationId: z12.string().uuid().nullable(),
949
+ var setupDeploymentInputSchema = z13.discriminatedUnion("action", [
950
+ z13.object({ action: z13.literal("read") }).strict(),
951
+ z13.object({
952
+ action: z13.literal("record"),
953
+ expectedOperationId: z13.string().uuid().nullable(),
918
954
  record: setupDeploymentRecordSchema
919
955
  }).strict()
920
956
  ]);
921
957
 
922
958
  // ../shared/dist/site-setup.js
923
- import { z as z15 } from "zod";
959
+ import { z as z16 } from "zod";
924
960
 
925
961
  // ../shared/dist/site-field-contract.js
926
- import { z as z14 } from "zod";
962
+ import { z as z15 } from "zod";
927
963
 
928
964
  // ../shared/dist/fallback-hash.js
929
- import { z as z13 } from "zod";
965
+ import { z as z14 } from "zod";
930
966
  var SAFE_REPRESENTATION_REASONS = [
931
967
  "asset_import_rewritten",
932
968
  "relative_url_normalized",
933
969
  "line_endings_normalized",
934
970
  "image_value_serialized"
935
971
  ];
936
- var safeRepresentationReasonSchema = z13.enum(SAFE_REPRESENTATION_REASONS);
972
+ var safeRepresentationReasonSchema = z14.enum(SAFE_REPRESENTATION_REASONS);
937
973
  function canonicalizeFallbackValue(input) {
938
974
  const fieldType = fieldTypeSchema.parse(input.fieldType);
939
975
  if (input.safeRepresentationReason !== void 0) {
@@ -969,10 +1005,10 @@ function createCanonicalFallbackHash(input) {
969
1005
  const payload = stableJsonStringify(canonical);
970
1006
  return `sha256:${sha256Hex(payload)}`;
971
1007
  }
972
- var linkFallbackSchema = z13.object({
973
- href: z13.string().trim().min(1),
974
- label: z13.string().trim().min(1).optional(),
975
- target: z13.enum(["_self", "_blank"]).optional()
1008
+ var linkFallbackSchema = z14.object({
1009
+ href: z14.string().trim().min(1),
1010
+ label: z14.string().trim().min(1).optional(),
1011
+ target: z14.enum(["_self", "_blank"]).optional()
976
1012
  }).passthrough();
977
1013
  function normalizeLineEndings(value) {
978
1014
  return value.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
@@ -1150,67 +1186,67 @@ var SHA256_CONSTANTS = [
1150
1186
  // ../shared/dist/site-field-contract.js
1151
1187
  var fieldContractVersion = "1.0.0";
1152
1188
  var scannerContractVersion = "1.0.0";
1153
- var siteFieldStatusSchema = z14.enum(["hidden", "active"]);
1154
- var semanticVersionSchema = z14.string().regex(/^\d+\.\d+\.\d+$/u);
1155
- 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.");
1156
- 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.");
1157
- var sourceMappingSchema = z14.object({
1158
- kind: z14.literal("function"),
1189
+ var siteFieldStatusSchema = z15.enum(["hidden", "active"]);
1190
+ var semanticVersionSchema = z15.string().regex(/^\d+\.\d+\.\d+$/u);
1191
+ 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.");
1192
+ 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.");
1193
+ var sourceMappingSchema = z15.object({
1194
+ kind: z15.literal("function"),
1159
1195
  filePath: repositoryRelativePosixPathSchema,
1160
- exportName: z14.string().trim().min(1).optional(),
1161
- sourcePath: z14.string().trim().min(1).optional(),
1196
+ exportName: z15.string().trim().min(1).optional(),
1197
+ sourcePath: z15.string().trim().min(1).optional(),
1162
1198
  editTarget: fieldIdSchema.optional()
1163
1199
  }).strict();
1164
- var domMappingSchema = z14.object({
1165
- attribute: z14.literal("data-siteplane-field-id"),
1166
- previewStrategy: z14.enum(["dom", "event"])
1200
+ var domMappingSchema = z15.object({
1201
+ attribute: z15.literal("data-siteplane-field-id"),
1202
+ previewStrategy: z15.enum(["dom", "event"])
1167
1203
  }).strict();
1168
- var fieldBaseSchema = z14.object({
1204
+ var fieldBaseSchema = z15.object({
1169
1205
  fieldId: fieldIdSchema,
1170
1206
  routeKey: siteFieldRouteKeySchema,
1171
1207
  source: sourceMappingSchema,
1172
1208
  dom: domMappingSchema.optional()
1173
1209
  }).strict();
1174
- var linkFallbackSchema2 = z14.object({
1175
- href: z14.string().trim().min(1),
1176
- label: z14.string().trim().min(1).optional(),
1177
- target: z14.enum(["_self", "_blank"]).optional()
1210
+ var linkFallbackSchema2 = z15.object({
1211
+ href: z15.string().trim().min(1),
1212
+ label: z15.string().trim().min(1).optional(),
1213
+ target: z15.enum(["_self", "_blank"]).optional()
1178
1214
  }).strict();
1179
- var imageFallbackSchema = z14.object({
1180
- src: z14.string().trim().min(1),
1181
- alt: z14.string().trim().max(300),
1182
- width: z14.number().int().positive().optional(),
1183
- height: z14.number().int().positive().optional(),
1184
- crop: z14.object({
1185
- x: z14.number().min(0).max(100),
1186
- y: z14.number().min(0).max(100),
1187
- zoom: z14.number().min(1).max(4),
1188
- aspectRatio: z14.number().positive().max(10)
1215
+ var imageFallbackSchema = z15.object({
1216
+ src: z15.string().trim().min(1),
1217
+ alt: z15.string().trim().max(300),
1218
+ width: z15.number().int().positive().optional(),
1219
+ height: z15.number().int().positive().optional(),
1220
+ crop: z15.object({
1221
+ x: z15.number().min(0).max(100),
1222
+ y: z15.number().min(0).max(100),
1223
+ zoom: z15.number().min(1).max(4),
1224
+ aspectRatio: z15.number().positive().max(10)
1189
1225
  }).strict().optional()
1190
1226
  }).strict();
1191
- var siteFieldContractFieldSchema = z14.discriminatedUnion("fieldType", [
1227
+ var siteFieldContractFieldSchema = z15.discriminatedUnion("fieldType", [
1192
1228
  fieldBaseSchema.extend({
1193
- fieldType: z14.literal("text"),
1194
- fallback: z14.string()
1229
+ fieldType: z15.literal("text"),
1230
+ fallback: z15.string()
1195
1231
  }),
1196
1232
  fieldBaseSchema.extend({
1197
- fieldType: z14.literal("longText"),
1198
- fallback: z14.string()
1233
+ fieldType: z15.literal("longText"),
1234
+ fallback: z15.string()
1199
1235
  }),
1200
1236
  fieldBaseSchema.extend({
1201
- fieldType: z14.literal("link"),
1237
+ fieldType: z15.literal("link"),
1202
1238
  fallback: linkFallbackSchema2
1203
1239
  }),
1204
1240
  fieldBaseSchema.extend({
1205
- fieldType: z14.literal("image"),
1241
+ fieldType: z15.literal("image"),
1206
1242
  fallback: imageFallbackSchema
1207
1243
  })
1208
1244
  ]);
1209
- var siteFieldContractV1Schema = z14.object({
1210
- version: z14.literal(1),
1245
+ var siteFieldContractV1Schema = z15.object({
1246
+ version: z15.literal(1),
1211
1247
  fieldContractVersion: semanticVersionSchema,
1212
1248
  scannerContractVersion: semanticVersionSchema,
1213
- fields: z14.array(siteFieldContractFieldSchema)
1249
+ fields: z15.array(siteFieldContractFieldSchema)
1214
1250
  }).strict().superRefine((contract, context) => {
1215
1251
  const seen = /* @__PURE__ */ new Set();
1216
1252
  for (const [index, field] of contract.fields.entries()) {
@@ -1270,20 +1306,20 @@ var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH = 2e3;
1270
1306
  var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES = 8e3;
1271
1307
  var CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES = 32 * 1024;
1272
1308
  var CONTINUE_SITE_SETUP_HTTP_BODY_MAX_BYTES = 64 * 1024;
1273
- var siteSetupRunStatusSchema = z15.enum(SITE_SETUP_RUN_STATUSES);
1274
- var siteSetupRunModeSchema = z15.enum(SITE_SETUP_RUN_MODES);
1275
- var siteSetupErrorCodeSchema = z15.enum(SITE_SETUP_ERROR_CODES);
1276
- var editorFieldSchema = z15.object({
1309
+ var siteSetupRunStatusSchema = z16.enum(SITE_SETUP_RUN_STATUSES);
1310
+ var siteSetupRunModeSchema = z16.enum(SITE_SETUP_RUN_MODES);
1311
+ var siteSetupErrorCodeSchema = z16.enum(SITE_SETUP_ERROR_CODES);
1312
+ var editorFieldSchema = z16.object({
1277
1313
  fieldId: fieldIdSchema,
1278
- label: z15.string().trim().min(1),
1279
- subsection: z15.string().trim().min(1).optional(),
1280
- description: z15.string().trim().min(1).optional(),
1281
- required: z15.boolean().optional(),
1282
- maxLength: z15.number().int().positive().optional()
1314
+ label: z16.string().trim().min(1),
1315
+ subsection: z16.string().trim().min(1).optional(),
1316
+ description: z16.string().trim().min(1).optional(),
1317
+ required: z16.boolean().optional(),
1318
+ maxLength: z16.number().int().positive().optional()
1283
1319
  }).strict();
1284
- var editorSectionSchema = z15.object({
1285
- label: z15.string().trim().min(1),
1286
- fields: z15.array(editorFieldSchema).min(1)
1320
+ var editorSectionSchema = z16.object({
1321
+ label: z16.string().trim().min(1),
1322
+ fields: z16.array(editorFieldSchema).min(1)
1287
1323
  }).strict().superRefine((section, context) => {
1288
1324
  const closedSubsections = /* @__PURE__ */ new Set();
1289
1325
  let currentSubsection;
@@ -1302,10 +1338,10 @@ var editorSectionSchema = z15.object({
1302
1338
  }
1303
1339
  }
1304
1340
  });
1305
- var editorRouteSchema = z15.object({
1341
+ var editorRouteSchema = z16.object({
1306
1342
  routeKey: siteFieldRouteKeySchema,
1307
- label: z15.string().trim().min(1),
1308
- sections: z15.array(editorSectionSchema).min(1)
1343
+ label: z16.string().trim().min(1),
1344
+ sections: z16.array(editorSectionSchema).min(1)
1309
1345
  }).strict().superRefine((route, context) => {
1310
1346
  const sections = /* @__PURE__ */ new Set();
1311
1347
  for (const [index, section] of route.sections.entries()) {
@@ -1319,9 +1355,9 @@ var editorRouteSchema = z15.object({
1319
1355
  sections.add(section.label);
1320
1356
  }
1321
1357
  });
1322
- var editorDefinitionV1Schema = z15.object({
1323
- version: z15.literal(1),
1324
- routes: z15.array(editorRouteSchema).min(1)
1358
+ var editorDefinitionV1Schema = z16.object({
1359
+ version: z16.literal(1),
1360
+ routes: z16.array(editorRouteSchema).min(1)
1325
1361
  }).strict().superRefine((definition, context) => {
1326
1362
  const routes = /* @__PURE__ */ new Set();
1327
1363
  const fields = /* @__PURE__ */ new Set();
@@ -1359,7 +1395,7 @@ var editorDefinitionV1Schema = z15.object({
1359
1395
  var forbiddenControlOrBidi = /[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
1360
1396
  var forbiddenOwnerNoteControlOrBidi = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
1361
1397
  var unsafeLocator = /<\/?[a-z][^>]*>|\b(?:javascript|data:text\/html)\s*:|\bon[a-z]+\s*=/iu;
1362
- var renderedPathSchema = z15.string().trim().transform((value) => value !== "/" ? value.replace(/\/+$/u, "") : value).superRefine((value, context) => {
1398
+ var renderedPathSchema = z16.string().trim().transform((value) => value !== "/" ? value.replace(/\/+$/u, "") : value).superRefine((value, context) => {
1363
1399
  if (!value.startsWith("/") || value === "$global" || value.includes("?") || value.includes("#")) {
1364
1400
  context.addIssue({
1365
1401
  code: "custom",
@@ -1369,7 +1405,7 @@ var renderedPathSchema = z15.string().trim().transform((value) => value !== "/"
1369
1405
  addSafeByteIssues(value, CONTINUE_SITE_SETUP_RENDERED_PATH_MAX_BYTES, "renderedPath", context);
1370
1406
  });
1371
1407
  function normalizedSafeTextSchema(maxBytes, label) {
1372
- return z15.string().transform((value) => value.trim().replace(new RegExp("\\p{White_Space}+", "gu"), " ")).pipe(z15.string().min(1)).superRefine((value, context) => {
1408
+ return z16.string().transform((value) => value.trim().replace(new RegExp("\\p{White_Space}+", "gu"), " ")).pipe(z16.string().min(1)).superRefine((value, context) => {
1373
1409
  addSafeByteIssues(value, maxBytes, label, context);
1374
1410
  if (label === "locatorHint" && unsafeLocator.test(value)) {
1375
1411
  context.addIssue({
@@ -1386,12 +1422,12 @@ var correctionItemBase = {
1386
1422
  requestedLabel: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_LABEL_MAX_BYTES, "requestedLabel").optional(),
1387
1423
  requestedSection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SECTION_MAX_BYTES, "requestedSection").optional(),
1388
1424
  requestedSubsection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SUBSECTION_MAX_BYTES, "requestedSubsection").optional(),
1389
- requestedSortOrder: z15.number().int().nonnegative().optional()
1425
+ requestedSortOrder: z16.number().int().nonnegative().optional()
1390
1426
  };
1391
- var setupCorrectionItemSchema = z15.discriminatedUnion("kind", [
1392
- z15.object({ kind: z15.literal("text"), ...correctionItemBase }).strict(),
1393
- z15.object({ kind: z15.literal("link"), ...correctionItemBase }).strict(),
1394
- z15.object({ kind: z15.literal("image"), ...correctionItemBase }).strict()
1427
+ var setupCorrectionItemSchema = z16.discriminatedUnion("kind", [
1428
+ z16.object({ kind: z16.literal("text"), ...correctionItemBase }).strict(),
1429
+ z16.object({ kind: z16.literal("link"), ...correctionItemBase }).strict(),
1430
+ z16.object({ kind: z16.literal("image"), ...correctionItemBase }).strict()
1395
1431
  ]).superRefine((item, context) => {
1396
1432
  if (item.requestedSubsection && !item.requestedSection) {
1397
1433
  context.addIssue({
@@ -1401,7 +1437,7 @@ var setupCorrectionItemSchema = z15.discriminatedUnion("kind", [
1401
1437
  });
1402
1438
  }
1403
1439
  });
1404
- var setupCorrectionItemsSchema = z15.array(setupCorrectionItemSchema).max(CONTINUE_SITE_SETUP_MAX_ITEMS).superRefine((items, context) => {
1440
+ var setupCorrectionItemsSchema = z16.array(setupCorrectionItemSchema).max(CONTINUE_SITE_SETUP_MAX_ITEMS).superRefine((items, context) => {
1405
1441
  const bytes = utf8Bytes(stableJsonStringify(items));
1406
1442
  if (bytes > CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES) {
1407
1443
  context.addIssue({
@@ -1410,7 +1446,7 @@ var setupCorrectionItemsSchema = z15.array(setupCorrectionItemSchema).max(CONTIN
1410
1446
  });
1411
1447
  }
1412
1448
  });
1413
- var siteSetupOwnerEditabilityNoteSchema = z15.string().max(SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH).superRefine((value, context) => {
1449
+ var siteSetupOwnerEditabilityNoteSchema = z16.string().max(SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH).superRefine((value, context) => {
1414
1450
  if (utf8Bytes(value) > SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES) {
1415
1451
  context.addIssue({
1416
1452
  code: "custom",
@@ -1435,7 +1471,7 @@ var SITE_SETUP_MODULE_SCOPES = {
1435
1471
  "analytics:public_key_read"
1436
1472
  ]
1437
1473
  };
1438
- 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.");
1474
+ 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.");
1439
1475
  function siteSetupScopes(modules) {
1440
1476
  return modules.flatMap((module) => [...SITE_SETUP_MODULE_SCOPES[module]]);
1441
1477
  }
@@ -1443,15 +1479,15 @@ function hasExactSiteSetupScopes(scopes, modules) {
1443
1479
  const matches = (expected) => scopes.length === expected.length && expected.every((scope) => scopes.includes(scope));
1444
1480
  return modules ? matches(siteSetupScopes(modules)) : matches(siteSetupScopes(["editing"])) || matches(siteSetupScopes(["editing", "analytics"]));
1445
1481
  }
1446
- var siteSetupActivityInputSchema = z15.object({
1447
- phase: z15.enum([
1482
+ var siteSetupActivityInputSchema = z16.object({
1483
+ phase: z16.enum([
1448
1484
  "inspecting",
1449
1485
  "integrating",
1450
1486
  "deploying",
1451
1487
  "verifying",
1452
1488
  "repairing"
1453
1489
  ]),
1454
- textId: z15.enum([
1490
+ textId: z16.enum([
1455
1491
  "inspecting",
1456
1492
  "integrating",
1457
1493
  "deploying",
@@ -1460,8 +1496,8 @@ var siteSetupActivityInputSchema = z15.object({
1460
1496
  ])
1461
1497
  }).strict().refine((value) => value.phase === value.textId, "Activity text must describe its phase.");
1462
1498
  var nextActionFields = {
1463
- actor: z15.enum(["agent", "user", "siteplane"]),
1464
- boundary: z15.enum([
1499
+ actor: z16.enum(["agent", "user", "siteplane"]),
1500
+ boundary: z16.enum([
1465
1501
  "source",
1466
1502
  "environment",
1467
1503
  "deployment",
@@ -1469,33 +1505,33 @@ var nextActionFields = {
1469
1505
  "authorization",
1470
1506
  "review"
1471
1507
  ]),
1472
- precondition: z15.string().min(1).max(1e3),
1473
- instruction: z15.string().min(1).max(2e3),
1474
- expectedEvidence: z15.string().min(1).max(1e3)
1508
+ precondition: z16.string().min(1).max(1e3),
1509
+ instruction: z16.string().min(1).max(2e3),
1510
+ expectedEvidence: z16.string().min(1).max(1e3)
1475
1511
  };
1476
- var siteSetupNextActionSchema = z15.discriminatedUnion("kind", [
1477
- z15.object({
1512
+ var siteSetupNextActionSchema = z16.discriminatedUnion("kind", [
1513
+ z16.object({
1478
1514
  ...nextActionFields,
1479
- kind: z15.literal("run_command"),
1480
- command: z15.string().min(1).max(500)
1515
+ kind: z16.literal("run_command"),
1516
+ command: z16.string().min(1).max(500)
1481
1517
  }).strict(),
1482
- z15.object({ ...nextActionFields, kind: z15.literal("agent_edit") }).strict(),
1483
- z15.object({ ...nextActionFields, kind: z15.literal("needs_user_action") }).strict(),
1484
- z15.object({ ...nextActionFields, kind: z15.literal("wait") }).strict(),
1485
- z15.object({ ...nextActionFields, kind: z15.literal("done") }).strict()
1518
+ z16.object({ ...nextActionFields, kind: z16.literal("agent_edit") }).strict(),
1519
+ z16.object({ ...nextActionFields, kind: z16.literal("needs_user_action") }).strict(),
1520
+ z16.object({ ...nextActionFields, kind: z16.literal("wait") }).strict(),
1521
+ z16.object({ ...nextActionFields, kind: z16.literal("done") }).strict()
1486
1522
  ]);
1487
- var siteSetupTaskRunSchema = z15.object({
1488
- runId: z15.string().uuid(),
1523
+ var siteSetupTaskRunSchema = z16.object({
1524
+ runId: z16.string().uuid(),
1489
1525
  mode: siteSetupRunModeSchema,
1490
1526
  status: siteSetupRunStatusSchema,
1491
- fieldContractHash: z15.string().nullable(),
1492
- deploymentOrigin: z15.string().url().nullable(),
1493
- deploymentRevision: z15.string().nullable(),
1494
- publicRuntimeKeyId: z15.string().uuid().nullable(),
1495
- reviewVersion: z15.string().nullable()
1527
+ fieldContractHash: z16.string().nullable(),
1528
+ deploymentOrigin: z16.string().url().nullable(),
1529
+ deploymentRevision: z16.string().nullable(),
1530
+ publicRuntimeKeyId: z16.string().uuid().nullable(),
1531
+ reviewVersion: z16.number().int().positive()
1496
1532
  }).strict();
1497
- var siteSetupTaskProgressSchema = z15.object({
1498
- progressStage: z15.enum([
1533
+ var siteSetupTaskProgressSchema = z16.object({
1534
+ progressStage: z16.enum([
1499
1535
  "waiting_for_connection",
1500
1536
  "agent_connected",
1501
1537
  "project_context_loaded",
@@ -1505,73 +1541,70 @@ var siteSetupTaskProgressSchema = z15.object({
1505
1541
  "action_required",
1506
1542
  "completed"
1507
1543
  ]),
1508
- lastVerifiedAt: z15.string().datetime().nullable(),
1509
- lastActivityAt: z15.string().datetime(),
1510
- activitySource: z15.enum(["user", "server", "agent"]),
1544
+ lastVerifiedAt: z16.string().datetime().nullable(),
1545
+ lastActivityAt: z16.string().datetime(),
1546
+ activitySource: z16.enum(["user", "server", "agent"]),
1511
1547
  activityPhase: siteSetupActivityInputSchema.shape.phase.nullable(),
1512
1548
  activityTextId: siteSetupActivityInputSchema.shape.textId.nullable()
1513
1549
  }).strict();
1514
- var siteSetupTaskSchema = z15.object({
1515
- contractVersion: z15.literal("siteplane.setup-task.v2"),
1516
- workflow: z15.enum(["initial_setup", "structure_update"]),
1517
- goal: z15.string().min(1),
1550
+ var siteSetupTaskSchema = z16.object({
1551
+ contractVersion: z16.literal("siteplane.setup-task.v2"),
1552
+ workflow: z16.enum(["initial_setup", "structure_update"]),
1553
+ goal: z16.string().min(1),
1518
1554
  modules: siteSetupModulesSchema,
1519
- authorizationVersion: z15.number().int().positive(),
1520
- authorizedScopes: z15.array(z15.string()).min(2),
1521
- site: z15.object({
1522
- siteId: z15.string().uuid(),
1523
- portalPath: z15.string(),
1524
- adminOrigin: z15.string().url()
1555
+ authorizationVersion: z16.number().int().positive(),
1556
+ authorizedScopes: z16.array(z16.string()).min(2),
1557
+ site: z16.object({
1558
+ siteId: z16.string().uuid(),
1559
+ portalPath: z16.string(),
1560
+ adminOrigin: z16.string().url()
1525
1561
  }).strict().nullable(),
1526
1562
  run: siteSetupTaskRunSchema.nullable(),
1527
1563
  progress: siteSetupTaskProgressSchema.nullable(),
1528
1564
  deployment: setupDeploymentRecordSchema.nullable(),
1529
- revalidationGeneration: z15.number().int().positive(),
1530
- assignment: z15.literal("owned"),
1531
- deadline: z15.string().datetime().nullable(),
1532
- userInstructions: z15.object({
1565
+ revalidationGeneration: z16.number().int().positive(),
1566
+ assignment: z16.literal("owned"),
1567
+ deadline: z16.string().datetime().nullable(),
1568
+ userInstructions: z16.object({
1533
1569
  text: siteSetupOwnerEditabilityNoteSchema,
1534
- source: z15.literal("user"),
1535
- trust: z15.literal("untrusted")
1570
+ source: z16.literal("user"),
1571
+ trust: z16.literal("untrusted")
1536
1572
  }).strict(),
1537
1573
  corrections: setupCorrectionItemsSchema,
1538
- contentSelectionSummary: z15.object({
1574
+ contentSelectionSummary: z16.object({
1539
1575
  text: siteSetupOwnerEditabilityNoteSchema,
1540
- source: z15.literal("agent"),
1541
- trust: z15.literal("untrusted")
1576
+ source: z16.literal("agent"),
1577
+ trust: z16.literal("untrusted")
1542
1578
  }).strict().nullable(),
1543
- environmentBindings: z15.array(z15.object({
1544
- name: z15.string().regex(/^[A-Z][A-Z0-9_]+$/u),
1545
- source: z15.string().min(1),
1546
- sensitivity: z15.enum(["public", "secret"]),
1547
- usage: z15.enum(["build", "server", "build_and_server"]),
1548
- evidence: z15.string().min(1)
1579
+ environmentBindings: z16.array(z16.object({
1580
+ name: z16.string().regex(/^[A-Z][A-Z0-9_]+$/u),
1581
+ source: z16.string().min(1),
1582
+ sensitivity: z16.enum(["public", "secret"]),
1583
+ usage: z16.enum(["build", "server", "build_and_server"]),
1584
+ evidence: z16.string().min(1)
1549
1585
  }).strict()),
1550
1586
  nextAction: siteSetupNextActionSchema,
1551
- error: z15.object({
1552
- code: z15.string().regex(/^[a-z0-9_.]+$/u).max(160),
1587
+ error: z16.object({
1588
+ code: z16.string().regex(/^[a-z0-9_.]+$/u).max(160),
1553
1589
  boundary: nextActionFields.boundary,
1554
1590
  responsibleActor: nextActionFields.actor,
1555
- retryable: z15.boolean(),
1556
- retryAfter: z15.number().int().nonnegative().nullable(),
1557
- requestId: z15.string().regex(/^[A-Za-z0-9_-]+$/u).max(128)
1591
+ retryable: z16.boolean(),
1592
+ retryAfter: z16.number().int().nonnegative().nullable(),
1593
+ requestId: z16.string().regex(/^[A-Za-z0-9_-]+$/u).max(128)
1558
1594
  }).strict().nullable(),
1559
- packages: z15.object({
1560
- siteplane: z15.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
1561
- runtimeNext: z15.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
1562
- }).strict(),
1563
- communication: z15.object({
1564
- beforeSourceChanges: z15.string().min(1),
1565
- updates: z15.array(z15.string().min(1)).min(1),
1566
- blocker: z15.string().min(1)
1595
+ packages: siteSetupPackagesSchema,
1596
+ communication: z16.object({
1597
+ beforeSourceChanges: z16.string().min(1),
1598
+ updates: z16.array(z16.string().min(1)).min(1),
1599
+ blocker: z16.string().min(1)
1567
1600
  }).strict(),
1568
- discovery: z15.object({
1569
- inspectPublicRoutes: z15.boolean(),
1570
- contentKinds: z15.array(z15.enum(["text", "longText", "link", "image"])).min(1),
1571
- rules: z15.array(z15.string().min(1)).min(1)
1601
+ discovery: z16.object({
1602
+ inspectPublicRoutes: z16.boolean(),
1603
+ contentKinds: z16.array(z16.enum(["text", "longText", "link", "image"])).min(1),
1604
+ rules: z16.array(z16.string().min(1)).min(1)
1572
1605
  }).strict(),
1573
- steps: z15.array(z15.object({
1574
- id: z15.enum([
1606
+ steps: z16.array(z16.object({
1607
+ id: z16.enum([
1575
1608
  "inspect_repository",
1576
1609
  "install_packages",
1577
1610
  "instrument_fields",
@@ -1579,32 +1612,52 @@ var siteSetupTaskSchema = z15.object({
1579
1612
  "deploy_production",
1580
1613
  "verify_deployment"
1581
1614
  ]),
1582
- instruction: z15.string().min(1)
1615
+ instruction: z16.string().min(1)
1583
1616
  }).strict()).length(6),
1584
- completion: z15.object({
1585
- verifiedStatus: z15.literal("ready_for_review"),
1586
- instruction: z15.string().min(1)
1617
+ completion: z16.object({
1618
+ verifiedStatus: z16.literal("ready_for_review"),
1619
+ instruction: z16.string().min(1)
1587
1620
  }).strict()
1588
- }).strict().refine((task) => hasExactSiteSetupScopes(task.authorizedScopes, task.modules), "Task scopes must exactly match its modules.");
1589
- var canonicalHashSchema = z15.string().regex(/^sha256:[0-9a-f]{64}$/iu);
1621
+ }).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.");
1622
+ var canonicalHashSchema = z16.string().regex(/^sha256:[0-9a-f]{64}$/iu);
1590
1623
  var deploymentRevisionSchema = normalizedSafeTextSchema(256, "deploymentRevision");
1591
- var continueSiteSetupInputSchema = z15.object({
1592
- siteId: z15.string().uuid(),
1593
- runId: z15.string().uuid(),
1624
+ var continueSiteSetupInputSchema = z16.object({
1625
+ siteId: z16.string().uuid(),
1626
+ runId: z16.string().uuid(),
1627
+ expectedReviewVersion: z16.number().int().positive(),
1628
+ mutationId: z16.string().uuid(),
1629
+ intent: z16.enum(["continue_review", "correct_completed_review"]),
1594
1630
  expectedFieldContractHash: canonicalHashSchema,
1595
1631
  expectedDeploymentRevision: deploymentRevisionSchema,
1596
1632
  correctionItems: setupCorrectionItemsSchema,
1597
1633
  ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema.optional()
1598
1634
  }).strict();
1599
- var saveSiteSetupOwnerNoteInputSchema = z15.object({
1600
- siteId: z15.string().uuid(),
1601
- runId: z15.string().uuid(),
1635
+ var saveSiteSetupOwnerNoteInputSchema = z16.object({
1636
+ siteId: z16.string().uuid(),
1637
+ runId: z16.string().uuid(),
1638
+ expectedReviewVersion: z16.number().int().positive(),
1602
1639
  expectedFieldContractHash: canonicalHashSchema,
1603
1640
  expectedDeploymentRevision: deploymentRevisionSchema,
1604
1641
  ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema
1605
1642
  }).strict();
1606
- var siteSetupContextInputSchema = z15.object({}).strict();
1607
- var siteSetupApplyInputSchema = z15.object({
1643
+ var setupReviewPreferenceSelectionSchema = z16.object({
1644
+ analyticsMode: z16.enum(["disabled", "session_only"]).nullable(),
1645
+ assetTargetType: z16.enum(["repo_static_assets", "siteplane_managed_fallback"]).nullable(),
1646
+ assetTargetId: z16.string().uuid().nullable()
1647
+ }).strict().refine((value) => value.assetTargetType !== null || value.assetTargetId === null, {
1648
+ message: "An asset target requires its delivery type."
1649
+ });
1650
+ var setupReviewPreferencesSchema = setupReviewPreferenceSelectionSchema.safeExtend({
1651
+ managedHostingApproved: z16.boolean()
1652
+ });
1653
+ var saveSetupReviewPreferencesInputSchema = z16.object({
1654
+ siteId: z16.string().uuid(),
1655
+ runId: z16.string().uuid(),
1656
+ expectedReviewVersion: z16.number().int().positive(),
1657
+ preferences: setupReviewPreferenceSelectionSchema
1658
+ }).strict();
1659
+ var siteSetupContextInputSchema = z16.object({}).strict();
1660
+ var siteSetupApplyInputSchema = z16.object({
1608
1661
  fieldContract: siteFieldContractV1Schema,
1609
1662
  editorDefinition: editorDefinitionV1Schema,
1610
1663
  contentSelectionSummary: siteSetupOwnerEditabilityNoteSchema.refine((text) => text.trim().length > 0, "Describe the selected content, important exclusions and any open gaps.")
@@ -1671,37 +1724,44 @@ var siteSetupApplyInputSchema = z15.object({
1671
1724
  }
1672
1725
  }
1673
1726
  });
1674
- var siteSetupVerifyInputSchema = z15.object({
1675
- deploymentUrl: z15.string().url().refine((value) => value.startsWith("https://")),
1727
+ var siteSetupVerifyInputSchema = z16.object({
1728
+ deploymentUrl: z16.string().url().refine((value) => value.startsWith("https://")),
1676
1729
  deploymentRevision: deploymentRevisionSchema,
1677
- wait: z15.boolean().optional()
1730
+ wait: z16.boolean().optional()
1678
1731
  }).strict();
1679
- var siteSetupEvidenceInputSchema = z15.object({
1680
- siteId: z15.string().uuid(),
1681
- runId: z15.string().uuid(),
1732
+ var siteSetupEvidenceInputSchema = z16.object({
1733
+ siteId: z16.string().uuid(),
1734
+ runId: z16.string().uuid(),
1682
1735
  expectedFieldContractHash: canonicalHashSchema,
1683
- expectedDeploymentOrigin: z15.string().url().refine((value) => value.startsWith("https://")),
1736
+ expectedDeploymentOrigin: z16.string().url().refine((value) => value.startsWith("https://")),
1684
1737
  expectedDeploymentRevision: deploymentRevisionSchema,
1685
- publicRuntimeKeyId: z15.string().uuid(),
1738
+ publicRuntimeKeyId: z16.string().uuid(),
1686
1739
  bridgeSessionId: normalizedSafeTextSchema(256, "bridgeSessionId"),
1687
- observations: z15.array(z15.object({
1740
+ observations: z16.array(z16.object({
1688
1741
  fieldId: fieldIdSchema,
1689
1742
  routeKey: siteFieldRouteKeySchema,
1690
1743
  renderedPath: renderedPathSchema,
1691
- targetResolved: z15.boolean(),
1692
- previewAck: z15.boolean()
1744
+ targetResolved: z16.boolean(),
1745
+ previewAck: z16.boolean()
1693
1746
  }).strict().refine((value) => !value.previewAck || value.targetResolved, "Preview ACK requires a resolved target.")).min(1).max(200)
1694
1747
  }).strict();
1695
- var completeSiteSetupInputSchema = z15.object({
1696
- siteId: z15.string().uuid(),
1697
- runId: z15.string().uuid(),
1748
+ var completeSetupReviewInputSchema = z16.object({
1749
+ siteId: z16.string().uuid(),
1750
+ runId: z16.string().uuid(),
1751
+ expectedReviewVersion: z16.number().int().positive(),
1698
1752
  expectedFieldContractHash: canonicalHashSchema,
1699
1753
  expectedDeploymentRevision: deploymentRevisionSchema,
1700
1754
  expectedReadyFingerprint: canonicalHashSchema
1701
1755
  }).strict();
1702
- var refreshSiteSetupDeploymentInputSchema = z15.object({
1703
- siteId: z15.string().uuid(),
1704
- deploymentUrl: z15.string().url().refine((value) => value.startsWith("https://")),
1756
+ var activateSiteSetupInputSchema = z16.object({
1757
+ siteId: z16.string().uuid(),
1758
+ runId: z16.string().uuid(),
1759
+ expectedReviewVersion: z16.number().int().positive(),
1760
+ expectedSnapshotHash: canonicalHashSchema
1761
+ }).strict();
1762
+ var refreshSiteSetupDeploymentInputSchema = z16.object({
1763
+ siteId: z16.string().uuid(),
1764
+ deploymentUrl: z16.string().url().refine((value) => value.startsWith("https://")),
1705
1765
  deploymentRevision: deploymentRevisionSchema
1706
1766
  }).strict();
1707
1767
  function addSafeByteIssues(value, maxBytes, label, context) {
@@ -1721,37 +1781,61 @@ function addSafeByteIssues(value, maxBytes, label, context) {
1721
1781
  function utf8Bytes(value) {
1722
1782
  return new TextEncoder().encode(value).byteLength;
1723
1783
  }
1784
+ var setupActivationApprovalSchema = z16.object({
1785
+ reviewVersion: z16.number().int().positive(),
1786
+ snapshotHash: canonicalHashSchema,
1787
+ analytics: z16.object({
1788
+ status: z16.enum(["active", "skipped"]),
1789
+ reviewVersion: z16.number().int().positive(),
1790
+ generation: z16.number().int().nonnegative()
1791
+ }).optional()
1792
+ });
1793
+ var activateSetupModulesInputSchema = activateSiteSetupInputSchema.extend({
1794
+ analytics: z16.discriminatedUnion("decision", [
1795
+ z16.object({ decision: z16.literal("pending") }).strict(),
1796
+ z16.object({
1797
+ decision: z16.literal("enable"),
1798
+ expectedInstallationGeneration: z16.number().int().positive(),
1799
+ measurementApproved: z16.literal(true)
1800
+ }).strict(),
1801
+ z16.object({
1802
+ decision: z16.literal("skip"),
1803
+ expectedInstallationGeneration: z16.number().int().nonnegative(),
1804
+ continueWithoutAnalytics: z16.literal(true)
1805
+ }).strict()
1806
+ ])
1807
+ }).strict();
1724
1808
 
1725
1809
  // ../shared/dist/bridge-protocol.js
1726
1810
  var BRIDGE_PROTOCOL_VERSION = 2;
1727
- var bridgeRectSchema = z16.object({
1728
- x: z16.number(),
1729
- y: z16.number(),
1730
- width: z16.number().nonnegative(),
1731
- height: z16.number().nonnegative()
1732
- });
1733
- var previewTextValueSchema = z16.object({
1734
- fieldType: z16.enum(["text", "longText"]),
1735
- value: z16.string()
1736
- });
1737
- var previewLinkValueSchema = z16.object({
1738
- fieldType: z16.literal("link"),
1739
- value: z16.object({
1740
- href: z16.string().trim().min(1),
1741
- label: z16.string().trim().min(1).optional()
1811
+ var bridgeRectSchema = z17.object({
1812
+ x: z17.number(),
1813
+ y: z17.number(),
1814
+ width: z17.number().nonnegative(),
1815
+ height: z17.number().nonnegative()
1816
+ });
1817
+ var previewTextValueSchema = z17.object({
1818
+ fieldType: z17.enum(["text", "longText"]),
1819
+ value: z17.string()
1820
+ });
1821
+ var previewLinkValueSchema = z17.object({
1822
+ fieldType: z17.literal("link"),
1823
+ value: z17.object({
1824
+ href: z17.string().trim().min(1),
1825
+ label: z17.string().trim().min(1).optional()
1742
1826
  })
1743
1827
  });
1744
- var previewImageValueSchema = z16.object({
1745
- fieldType: z16.literal("image"),
1828
+ var previewImageValueSchema = z17.object({
1829
+ fieldType: z17.literal("image"),
1746
1830
  value: imageValueSchema
1747
1831
  });
1748
- var bridgePreviewValueSchema = z16.discriminatedUnion("fieldType", [
1832
+ var bridgePreviewValueSchema = z17.discriminatedUnion("fieldType", [
1749
1833
  previewTextValueSchema,
1750
1834
  previewLinkValueSchema,
1751
1835
  previewImageValueSchema
1752
1836
  ]);
1753
- var fieldSelectionModeSchema = z16.enum(["replace", "range", "toggle"]);
1754
- var fieldBridgeMissingContentActionSchema = z16.enum([
1837
+ var fieldSelectionModeSchema = z17.enum(["replace", "range", "toggle"]);
1838
+ var fieldBridgeMissingContentActionSchema = z17.enum([
1755
1839
  "add",
1756
1840
  "select",
1757
1841
  "remove"
@@ -1768,79 +1852,81 @@ var FIELD_BRIDGE_MESSAGE_TYPES = [
1768
1852
  "siteplane:field-bridge:set-visual-control-state",
1769
1853
  "siteplane:field-bridge:missing-content",
1770
1854
  "siteplane:field-bridge:preview-scrolled",
1855
+ "siteplane:field-bridge:analytics-probe",
1856
+ "siteplane:field-bridge:analytics-probe-result",
1771
1857
  "siteplane:field-bridge:error"
1772
1858
  ];
1773
- var canonicalFieldContractHashSchema = z16.string().regex(/^sha256:[0-9a-f]{64}$/u);
1774
- var bridgeSectionSchema = z16.string().trim().min(1).max(256);
1775
- 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.");
1776
- var fieldBridgeIdentitySchema = z16.object({
1777
- publicRuntimeKeyId: z16.string().uuid(),
1859
+ var canonicalFieldContractHashSchema = z17.string().regex(/^sha256:[0-9a-f]{64}$/u);
1860
+ var bridgeSectionSchema = z17.string().trim().min(1).max(256);
1861
+ 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.");
1862
+ var fieldBridgeIdentitySchema = z17.object({
1863
+ publicRuntimeKeyId: z17.string().uuid(),
1778
1864
  fieldContractHash: canonicalFieldContractHashSchema,
1779
- deploymentRevision: z16.string().trim().min(1).max(256)
1865
+ deploymentRevision: z17.string().trim().min(1).max(256)
1780
1866
  }).strict();
1781
- var fieldBridgeBaseSchema = z16.object({
1782
- version: z16.literal(BRIDGE_PROTOCOL_VERSION),
1783
- type: z16.enum(FIELD_BRIDGE_MESSAGE_TYPES),
1784
- siteId: z16.string().uuid(),
1785
- sessionId: z16.string().trim().min(1),
1786
- publicRuntimeKeyId: z16.string().uuid(),
1867
+ var fieldBridgeBaseSchema = z17.object({
1868
+ version: z17.literal(BRIDGE_PROTOCOL_VERSION),
1869
+ type: z17.enum(FIELD_BRIDGE_MESSAGE_TYPES),
1870
+ siteId: z17.string().uuid(),
1871
+ sessionId: z17.string().trim().min(1),
1872
+ publicRuntimeKeyId: z17.string().uuid(),
1787
1873
  fieldContractHash: canonicalFieldContractHashSchema,
1788
- deploymentRevision: z16.string().trim().min(1).max(256),
1789
- requestId: z16.string().trim().min(1),
1790
- sentAt: z16.string().datetime()
1874
+ deploymentRevision: z17.string().trim().min(1).max(256),
1875
+ requestId: z17.string().trim().min(1),
1876
+ sentAt: z17.string().datetime()
1791
1877
  }).strict();
1792
- var fieldBridgeFieldSchema = z16.object({
1878
+ var fieldBridgeFieldSchema = z17.object({
1793
1879
  fieldId: fieldIdSchema,
1794
1880
  fieldType: fieldTypeSchema,
1795
1881
  routeKey: siteFieldRouteKeySchema,
1796
1882
  renderedPath: realRenderedPathSchema,
1797
- sourcePath: z16.string().trim().min(1).optional(),
1883
+ sourcePath: z17.string().trim().min(1).optional(),
1798
1884
  editTarget: fieldIdSchema,
1799
1885
  rect: bridgeRectSchema,
1800
- targetResolved: z16.literal(true),
1886
+ targetResolved: z17.literal(true),
1801
1887
  currentValue: bridgePreviewValueSchema.optional()
1802
1888
  }).strict();
1803
1889
  var fieldBridgeInitMessageSchema = fieldBridgeBaseSchema.extend({
1804
- type: z16.literal("siteplane:field-bridge:init"),
1805
- payload: z16.object({
1806
- adminOrigin: z16.string().url(),
1807
- customerOrigin: z16.string().url(),
1890
+ type: z17.literal("siteplane:field-bridge:init"),
1891
+ payload: z17.object({
1892
+ adminOrigin: z17.string().url(),
1893
+ customerOrigin: z17.string().url(),
1808
1894
  renderedPath: realRenderedPathSchema
1809
1895
  }).strict()
1810
1896
  });
1811
1897
  var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
1812
- type: z16.literal("siteplane:field-bridge:ready"),
1813
- payload: z16.object({
1898
+ type: z17.literal("siteplane:field-bridge:ready"),
1899
+ payload: z17.object({
1814
1900
  renderedPath: realRenderedPathSchema,
1815
- fieldCount: z16.number().int().nonnegative(),
1816
- capabilities: z16.tuple([
1817
- z16.literal("field_selection"),
1818
- z16.literal("preview_values"),
1819
- z16.literal("field_evidence"),
1820
- z16.literal("visual_field_control")
1821
- ])
1901
+ fieldCount: z17.number().int().nonnegative(),
1902
+ capabilities: z17.tuple([
1903
+ z17.literal("field_selection"),
1904
+ z17.literal("preview_values"),
1905
+ z17.literal("field_evidence"),
1906
+ z17.literal("visual_field_control")
1907
+ ]).rest(z17.literal("analytics_preview_readiness")).refine((capabilities) => capabilities.length <= 5)
1822
1908
  }).strict()
1823
1909
  });
1824
1910
  var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
1825
- type: z16.literal("siteplane:field-bridge:fields"),
1826
- payload: z16.object({
1911
+ type: z17.literal("siteplane:field-bridge:fields"),
1912
+ payload: z17.object({
1827
1913
  renderedPath: realRenderedPathSchema,
1828
- fields: z16.array(fieldBridgeFieldSchema)
1914
+ fields: z17.array(fieldBridgeFieldSchema)
1829
1915
  }).strict()
1830
1916
  });
1831
1917
  var fieldBridgeSelectFieldMessageSchema = fieldBridgeBaseSchema.extend({
1832
- type: z16.literal("siteplane:field-bridge:select-field"),
1833
- payload: z16.object({
1918
+ type: z17.literal("siteplane:field-bridge:select-field"),
1919
+ payload: z17.object({
1834
1920
  fieldId: fieldIdSchema,
1835
1921
  selectionMode: fieldSelectionModeSchema
1836
1922
  }).strict()
1837
1923
  });
1838
1924
  var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
1839
- type: z16.literal("siteplane:field-bridge:set-selected-field"),
1840
- payload: z16.object({
1841
- fieldIds: z16.array(fieldIdSchema).max(200),
1925
+ type: z17.literal("siteplane:field-bridge:set-selected-field"),
1926
+ payload: z17.object({
1927
+ fieldIds: z17.array(fieldIdSchema).max(200),
1842
1928
  primaryFieldId: fieldIdSchema.nullable(),
1843
- scrollIntoView: z16.boolean().optional()
1929
+ scrollIntoView: z17.boolean().optional()
1844
1930
  }).strict().superRefine((value, context) => {
1845
1931
  if (value.fieldIds.length > 0 && value.primaryFieldId === null) {
1846
1932
  context.addIssue({
@@ -1859,58 +1945,76 @@ var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
1859
1945
  })
1860
1946
  });
1861
1947
  var fieldBridgeApplyPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
1862
- type: z16.literal("siteplane:field-bridge:apply-preview-values"),
1863
- payload: z16.object({ values: z16.record(fieldIdSchema, bridgePreviewValueSchema) }).strict()
1948
+ type: z17.literal("siteplane:field-bridge:apply-preview-values"),
1949
+ payload: z17.object({ values: z17.record(fieldIdSchema, bridgePreviewValueSchema) }).strict()
1864
1950
  });
1865
1951
  var fieldBridgeTestPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
1866
- type: z16.literal("siteplane:field-bridge:test-preview-values"),
1867
- payload: z16.object({ fieldIds: z16.array(fieldIdSchema).min(1).max(200) }).strict()
1952
+ type: z17.literal("siteplane:field-bridge:test-preview-values"),
1953
+ payload: z17.object({ fieldIds: z17.array(fieldIdSchema).min(1).max(200) }).strict()
1868
1954
  });
1869
1955
  var fieldBridgePreviewAckMessageSchema = fieldBridgeBaseSchema.extend({
1870
- type: z16.literal("siteplane:field-bridge:preview-ack"),
1871
- payload: z16.object({
1872
- ackRequestId: z16.string().trim().min(1),
1873
- kind: z16.enum(["apply", "test"]),
1956
+ type: z17.literal("siteplane:field-bridge:preview-ack"),
1957
+ payload: z17.object({
1958
+ ackRequestId: z17.string().trim().min(1),
1959
+ kind: z17.enum(["apply", "test"]),
1874
1960
  renderedPath: realRenderedPathSchema,
1875
- fieldIds: z16.array(fieldIdSchema).max(200)
1961
+ fieldIds: z17.array(fieldIdSchema).max(200)
1876
1962
  }).strict()
1877
1963
  });
1878
1964
  var fieldBridgeSetVisualControlStateMessageSchema = fieldBridgeBaseSchema.extend({
1879
- type: z16.literal("siteplane:field-bridge:set-visual-control-state"),
1880
- payload: z16.object({
1881
- enabled: z16.boolean(),
1882
- fieldProximityEnabled: z16.boolean(),
1883
- pendingKeys: z16.array(z16.string().trim().min(1).max(2048)).max(50),
1884
- activeFieldIds: z16.array(fieldIdSchema),
1885
- fieldSections: z16.record(fieldIdSchema, bridgeSectionSchema),
1886
- selectedPending: z16.array(z16.object({
1887
- key: z16.string().trim().min(1).max(2048),
1888
- locatorHint: z16.string().trim().min(1).max(2048)
1965
+ type: z17.literal("siteplane:field-bridge:set-visual-control-state"),
1966
+ payload: z17.object({
1967
+ enabled: z17.boolean(),
1968
+ fieldProximityEnabled: z17.boolean(),
1969
+ pendingKeys: z17.array(z17.string().trim().min(1).max(2048)).max(50),
1970
+ activeFieldIds: z17.array(fieldIdSchema),
1971
+ fieldSections: z17.record(fieldIdSchema, bridgeSectionSchema),
1972
+ selectedPending: z17.array(z17.object({
1973
+ key: z17.string().trim().min(1).max(2048),
1974
+ locatorHint: z17.string().trim().min(1).max(2048)
1889
1975
  }).strict()).max(50),
1890
- scrollPendingIntoView: z16.boolean().optional()
1976
+ scrollPendingIntoView: z17.boolean().optional()
1891
1977
  }).strict()
1892
1978
  });
1893
1979
  var fieldBridgeMissingContentMessageSchema = fieldBridgeBaseSchema.extend({
1894
- type: z16.literal("siteplane:field-bridge:missing-content"),
1895
- payload: z16.object({
1980
+ type: z17.literal("siteplane:field-bridge:missing-content"),
1981
+ payload: z17.object({
1896
1982
  action: fieldBridgeMissingContentActionSchema,
1897
1983
  item: setupCorrectionItemSchema,
1898
1984
  suggestedSection: bridgeSectionSchema.optional()
1899
1985
  }).strict()
1900
1986
  });
1901
1987
  var fieldBridgePreviewScrolledMessageSchema = fieldBridgeBaseSchema.extend({
1902
- type: z16.literal("siteplane:field-bridge:preview-scrolled"),
1903
- payload: z16.object({ renderedPath: realRenderedPathSchema }).strict()
1988
+ type: z17.literal("siteplane:field-bridge:preview-scrolled"),
1989
+ payload: z17.object({ renderedPath: realRenderedPathSchema }).strict()
1990
+ });
1991
+ var analyticsPreviewChallengeSchema = z17.object({
1992
+ bridgeSessionId: z17.string().uuid(),
1993
+ challenge: z17.string().min(32).max(512),
1994
+ testRunId: z17.string().trim().min(1).max(160),
1995
+ expiresAt: z17.string().datetime()
1996
+ }).strict();
1997
+ var fieldBridgeAnalyticsProbeSchema = fieldBridgeBaseSchema.extend({
1998
+ type: z17.literal("siteplane:field-bridge:analytics-probe"),
1999
+ requestId: z17.string().min(1).max(256),
2000
+ payload: analyticsPreviewChallengeSchema
2001
+ });
2002
+ var fieldBridgeAnalyticsProbeResultSchema = fieldBridgeBaseSchema.extend({
2003
+ type: z17.literal("siteplane:field-bridge:analytics-probe-result"),
2004
+ payload: z17.object({
2005
+ ackRequestId: z17.string().min(1).max(256),
2006
+ status: z17.enum(["recorded", "failed"])
2007
+ }).strict()
1904
2008
  });
1905
2009
  var fieldBridgeErrorMessageSchema = fieldBridgeBaseSchema.extend({
1906
- type: z16.literal("siteplane:field-bridge:error"),
1907
- payload: z16.object({
1908
- code: z16.string().trim().min(1),
1909
- message: z16.string().trim().min(1),
1910
- recoverable: z16.boolean().default(false)
2010
+ type: z17.literal("siteplane:field-bridge:error"),
2011
+ payload: z17.object({
2012
+ code: z17.string().trim().min(1),
2013
+ message: z17.string().trim().min(1),
2014
+ recoverable: z17.boolean().default(false)
1911
2015
  }).strict()
1912
2016
  });
1913
- var fieldBridgeMessageSchema = z16.discriminatedUnion("type", [
2017
+ var fieldBridgeMessageSchema = z17.discriminatedUnion("type", [
1914
2018
  fieldBridgeInitMessageSchema,
1915
2019
  fieldBridgeReadyMessageSchema,
1916
2020
  fieldBridgeFieldsMessageSchema,
@@ -1922,55 +2026,57 @@ var fieldBridgeMessageSchema = z16.discriminatedUnion("type", [
1922
2026
  fieldBridgeSetVisualControlStateMessageSchema,
1923
2027
  fieldBridgeMissingContentMessageSchema,
1924
2028
  fieldBridgePreviewScrolledMessageSchema,
1925
- fieldBridgeErrorMessageSchema
2029
+ fieldBridgeErrorMessageSchema,
2030
+ fieldBridgeAnalyticsProbeSchema,
2031
+ fieldBridgeAnalyticsProbeResultSchema
1926
2032
  ]);
1927
2033
 
1928
2034
  // ../shared/dist/commands.js
1929
- import { z as z18 } from "zod";
2035
+ import { z as z19 } from "zod";
1930
2036
 
1931
2037
  // ../shared/dist/errors.js
1932
- import { z as z17 } from "zod";
2038
+ import { z as z18 } from "zod";
1933
2039
  var UI_ERROR_CATEGORIES = [
1934
2040
  "site_member",
1935
2041
  "workspace_member",
1936
2042
  "internal"
1937
2043
  ];
1938
- var uiErrorCategorySchema = z17.enum(UI_ERROR_CATEGORIES);
1939
- var commandErrorPayloadSchema = z17.object({
1940
- code: z17.string().min(1),
1941
- message: z17.string().min(1),
2044
+ var uiErrorCategorySchema = z18.enum(UI_ERROR_CATEGORIES);
2045
+ var commandErrorPayloadSchema = z18.object({
2046
+ code: z18.string().min(1),
2047
+ message: z18.string().min(1),
1942
2048
  category: uiErrorCategorySchema,
1943
- details: z17.record(z17.string(), z17.unknown()).optional()
2049
+ details: z18.record(z18.string(), z18.unknown()).optional()
1944
2050
  });
1945
2051
 
1946
2052
  // ../shared/dist/commands.js
1947
- var commandSuccessSchema = z18.object({
1948
- ok: z18.literal(true),
1949
- data: z18.unknown()
2053
+ var commandSuccessSchema = z19.object({
2054
+ ok: z19.literal(true),
2055
+ data: z19.unknown()
1950
2056
  });
1951
- var commandErrorSchema = z18.object({
1952
- ok: z18.literal(false),
2057
+ var commandErrorSchema = z19.object({
2058
+ ok: z19.literal(false),
1953
2059
  error: commandErrorPayloadSchema
1954
2060
  });
1955
- var commandResultSchema = z18.discriminatedUnion("ok", [
2061
+ var commandResultSchema = z19.discriminatedUnion("ok", [
1956
2062
  commandSuccessSchema,
1957
2063
  commandErrorSchema
1958
2064
  ]);
1959
2065
 
1960
2066
  // ../shared/dist/editor-settings.js
1961
- import { z as z19 } from "zod";
1962
- var editorColorSchemeSchema = z19.enum([
2067
+ import { z as z20 } from "zod";
2068
+ var editorColorSchemeSchema = z20.enum([
1963
2069
  "paper",
1964
2070
  "slate",
1965
2071
  "siteplane",
1966
2072
  "bloom"
1967
2073
  ]);
1968
2074
  var editorColorSchemes = editorColorSchemeSchema.options;
1969
- var editorColorModeSchema = z19.enum(["light", "dark"]);
2075
+ var editorColorModeSchema = z20.enum(["light", "dark"]);
1970
2076
  var editorColorModes = editorColorModeSchema.options;
1971
2077
 
1972
2078
  // ../shared/dist/site-slug.js
1973
- import { z as z20 } from "zod";
2079
+ import { z as z21 } from "zod";
1974
2080
  var SITE_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1975
2081
  var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
1976
2082
  "account",
@@ -1987,31 +2093,31 @@ var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
1987
2093
  "support",
1988
2094
  "workspace"
1989
2095
  ]);
1990
- var siteSlugSchema = z20.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
2096
+ var siteSlugSchema = z21.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
1991
2097
 
1992
2098
  // ../shared/dist/entitlements.js
1993
- import { z as z21 } from "zod";
1994
- var entitlementSnapshotSchema = z21.object({
1995
- planKey: z21.string().trim().min(1),
1996
- sitesLimit: z21.number().int().positive(),
1997
- siteMembersPerSiteLimit: z21.number().int().positive(),
1998
- customAdminDomainsEnabled: z21.boolean(),
1999
- agentMcpEnabled: z21.boolean(),
2000
- emailNotificationsEnabled: z21.boolean(),
2001
- analyticsEnabled: z21.boolean(),
2002
- analyticsSitesLimit: z21.number().int().min(0),
2003
- analyticsPortalPerformanceEnabled: z21.boolean(),
2004
- analyticsMonthlyReportsEnabled: z21.boolean(),
2005
- analyticsAiSummaryEnabled: z21.boolean(),
2006
- analyticsRawEventRetentionDays: z21.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
2007
- analyticsMonthlyEventLimit: z21.number().int().min(0),
2008
- bookingEnabled: z21.boolean().default(false),
2009
- bookingSitesLimit: z21.number().int().min(0).default(0),
2010
- bookingPortalManagementEnabled: z21.boolean().default(false),
2011
- bookingResourcesPerSiteLimit: z21.number().int().min(0).default(0),
2012
- bookingServicesPerSiteLimit: z21.number().int().min(0).default(0),
2013
- bookingMonthlyBookingsLimit: z21.number().int().min(0).default(0),
2014
- bookingRemindersEnabled: z21.boolean().default(false)
2099
+ import { z as z22 } from "zod";
2100
+ var entitlementSnapshotSchema = z22.object({
2101
+ planKey: z22.string().trim().min(1),
2102
+ sitesLimit: z22.number().int().positive(),
2103
+ siteMembersPerSiteLimit: z22.number().int().positive(),
2104
+ customAdminDomainsEnabled: z22.boolean(),
2105
+ agentMcpEnabled: z22.boolean(),
2106
+ emailNotificationsEnabled: z22.boolean(),
2107
+ analyticsEnabled: z22.boolean(),
2108
+ analyticsSitesLimit: z22.number().int().min(0),
2109
+ analyticsPortalPerformanceEnabled: z22.boolean(),
2110
+ analyticsMonthlyReportsEnabled: z22.boolean(),
2111
+ analyticsAiSummaryEnabled: z22.boolean(),
2112
+ analyticsRawEventRetentionDays: z22.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
2113
+ analyticsMonthlyEventLimit: z22.number().int().min(0),
2114
+ bookingEnabled: z22.boolean().default(false),
2115
+ bookingSitesLimit: z22.number().int().min(0).default(0),
2116
+ bookingPortalManagementEnabled: z22.boolean().default(false),
2117
+ bookingResourcesPerSiteLimit: z22.number().int().min(0).default(0),
2118
+ bookingServicesPerSiteLimit: z22.number().int().min(0).default(0),
2119
+ bookingMonthlyBookingsLimit: z22.number().int().min(0).default(0),
2120
+ bookingRemindersEnabled: z22.boolean().default(false)
2015
2121
  });
2016
2122
  var EARLY_ACCESS_PLAN = {
2017
2123
  planKey: "early_access_2026",
@@ -2037,7 +2143,7 @@ var EARLY_ACCESS_PLAN = {
2037
2143
  };
2038
2144
 
2039
2145
  // ../shared/dist/readiness.js
2040
- import { z as z22 } from "zod";
2146
+ import { z as z23 } from "zod";
2041
2147
  var READINESS_CHECK_KEYS = [
2042
2148
  "agent_instructions_installed",
2043
2149
  "runtime_package_connected",
@@ -2052,19 +2158,80 @@ var READINESS_STATUSES = [
2052
2158
  "failing",
2053
2159
  "warning"
2054
2160
  ];
2055
- var readinessCheckKeySchema = z22.enum(READINESS_CHECK_KEYS);
2056
- var readinessStatusSchema = z22.enum(READINESS_STATUSES);
2161
+ var readinessCheckKeySchema = z23.enum(READINESS_CHECK_KEYS);
2162
+ var readinessStatusSchema = z23.enum(READINESS_STATUSES);
2057
2163
 
2058
2164
  // ../shared/dist/site.js
2059
- import { z as z23 } from "zod";
2165
+ import { z as z24 } from "zod";
2060
2166
  var SITE_STATUSES = [
2061
2167
  "setup",
2062
2168
  "active",
2063
2169
  "disabled",
2064
2170
  "archived"
2065
2171
  ];
2066
- var siteStatusSchema = z23.enum(SITE_STATUSES);
2067
- var websiteUrlSchema = z23.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
2172
+ var siteStatusSchema = z24.enum(SITE_STATUSES);
2173
+ var websiteUrlSchema = z24.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
2174
+
2175
+ // ../shared/dist/setup-assets.js
2176
+ import { z as z25 } from "zod";
2177
+ var configureSetupAssetTargetInputSchema = z25.object({
2178
+ siteId: z25.string().uuid(),
2179
+ runId: z25.string().uuid(),
2180
+ expectedReviewVersion: z25.number().int().positive(),
2181
+ expectedSnapshotHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/u),
2182
+ mutationId: z25.string().uuid(),
2183
+ expectedApprovalId: z25.string().uuid().nullable(),
2184
+ targetId: z25.string().uuid().nullable(),
2185
+ targetType: z25.enum(["repo_static_assets", "siteplane_managed_fallback"]),
2186
+ approveManagedHosting: z25.boolean()
2187
+ }).strict().refine((value) => value.targetType === "siteplane_managed_fallback" || !value.approveManagedHosting);
2188
+ var setupAssetTargetApprovalSchema = z25.object({
2189
+ id: z25.string().uuid(),
2190
+ runId: z25.string().uuid(),
2191
+ reviewVersion: z25.number().int().positive(),
2192
+ snapshotHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/u),
2193
+ targetId: z25.string().uuid(),
2194
+ targetType: z25.enum(["repo_static_assets", "siteplane_managed_fallback"]),
2195
+ targetRevision: z25.number().int().positive(),
2196
+ deploymentOrigin: z25.string().url(),
2197
+ gitConnectionId: z25.string().uuid().nullable(),
2198
+ gitRevision: z25.number().int().positive().nullable(),
2199
+ managedHostingApproved: z25.boolean(),
2200
+ actorUserId: z25.string().uuid(),
2201
+ approvedAt: z25.string().datetime({ offset: true })
2202
+ }).strict();
2203
+ var setupAssetReadinessSchema = z25.union([
2204
+ z25.object({
2205
+ status: z25.enum([
2206
+ "not_required",
2207
+ "needs_choice",
2208
+ "stale_setup_review",
2209
+ "permission_denied"
2210
+ ])
2211
+ }).strict(),
2212
+ z25.object({
2213
+ status: z25.literal("stale_approval"),
2214
+ approval: setupAssetTargetApprovalSchema.optional()
2215
+ }).strict(),
2216
+ z25.object({
2217
+ status: z25.literal("not_verified"),
2218
+ approval: setupAssetTargetApprovalSchema,
2219
+ jobId: z25.string().uuid().optional(),
2220
+ checkedAt: z25.string().datetime({ offset: true }).nullable().optional()
2221
+ }).strict(),
2222
+ z25.object({
2223
+ status: z25.enum(["ready", "checking", "retrying"]),
2224
+ approval: setupAssetTargetApprovalSchema,
2225
+ jobId: z25.string().uuid(),
2226
+ checkedAt: z25.string().datetime({ offset: true }).nullable()
2227
+ }).strict().refine((value) => value.status !== "ready" || value.checkedAt !== null)
2228
+ ]);
2229
+ var checkSetupAssetTargetInputSchema = z25.object({
2230
+ siteId: z25.string().uuid(),
2231
+ runId: z25.string().uuid(),
2232
+ approvalId: z25.string().uuid(),
2233
+ intent: z25.enum(["start", "poll"])
2234
+ }).strict();
2068
2235
 
2069
2236
  // ../cli/dist/analytics/static-scan.js
2070
2237
  import ts from "typescript";
@@ -2088,6 +2255,9 @@ Analytics contract hash: ${ANALYTICS_CONTRACT_HASH}
2088
2255
  - Use stable data-siteplane-target-id values that do not depend on visible copy.
2089
2256
  - Use public site keys only through environment references.
2090
2257
  - Do not write secret analytics keys, setup tokens or project CLI tokens into source files.
2258
+ - 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.
2259
+ - 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.
2260
+ - 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.
2091
2261
  - Suppress editor-preview traffic from live analytics.
2092
2262
  - Run npx siteplane analytics check, npx siteplane analytics sync and npx siteplane analytics test after setup.
2093
2263
  `;
@@ -2101,19 +2271,70 @@ ${analyticsRulesTemplate}`;
2101
2271
  // ../cli/dist/commands/analytics/import.js
2102
2272
  import { createHash } from "crypto";
2103
2273
 
2274
+ // ../cli/dist/commands/analytics/sync.js
2275
+ function createAnalyticsCliRequestHeaders(config) {
2276
+ const headers = {
2277
+ authorization: `Bearer ${config.accessToken}`,
2278
+ "content-type": "application/json"
2279
+ };
2280
+ const bypassSecret = config.vercelAutomationBypassSecret?.trim();
2281
+ if (bypassSecret) {
2282
+ headers["x-vercel-protection-bypass"] = bypassSecret;
2283
+ }
2284
+ return headers;
2285
+ }
2286
+
2104
2287
  // ../cli/dist/commands/analytics/public-key.js
2105
- import { z as z24 } from "zod";
2106
- var responseSchema = z24.object({
2107
- ok: z24.literal(true),
2108
- data: z24.object({
2109
- rawPublicKey: z24.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/)
2288
+ import { z as z26 } from "zod";
2289
+ var responseSchema = z26.object({
2290
+ ok: z26.literal(true),
2291
+ data: z26.object({
2292
+ rawPublicKey: z26.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/)
2110
2293
  })
2111
2294
  });
2112
- var errorResponseSchema = z24.object({
2113
- error: z24.object({
2114
- code: z24.string().regex(/^[a-z][a-z0-9_.-]+$/u)
2295
+ var errorResponseSchema = z26.object({
2296
+ error: z26.object({
2297
+ code: z26.string().regex(/^[a-z][a-z0-9_.-]+$/u)
2115
2298
  })
2116
2299
  });
2300
+ async function analyticsPublicKeyCommand(input) {
2301
+ const fetcher = input.fetchImpl ?? fetch;
2302
+ const response = await fetcher(`${input.config.apiBaseUrl.replace(/\/$/u, "")}/api/cli/analytics/public-key`, {
2303
+ method: "POST",
2304
+ redirect: "error",
2305
+ signal: AbortSignal.timeout(2e4),
2306
+ headers: createAnalyticsCliRequestHeaders(input.config),
2307
+ body: JSON.stringify({ siteId: input.config.siteId })
2308
+ });
2309
+ const payload = await response.json().catch(() => null);
2310
+ const parsed = responseSchema.safeParse(payload);
2311
+ if (!response.ok || !parsed.success) {
2312
+ const error = errorResponseSchema.safeParse(payload);
2313
+ throw new Error(`${error.success ? error.data.error.code : "analytics_public_key.invalid_response"}: Unable to read the active Analytics public key.`);
2314
+ }
2315
+ return parsed.data.data.rawPublicKey;
2316
+ }
2317
+
2318
+ // ../cli/dist/commands/analytics/prepare.js
2319
+ import { z as z27 } from "zod";
2320
+ var resultSchema = z27.object({
2321
+ ok: z27.literal(true),
2322
+ data: z27.object({
2323
+ rawPublicKey: z27.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/u),
2324
+ generation: z27.number().int().positive(),
2325
+ status: z27.enum([
2326
+ "setup_started",
2327
+ "test_mode",
2328
+ "active",
2329
+ "paused",
2330
+ "error",
2331
+ "deleting"
2332
+ ])
2333
+ }).strict()
2334
+ }).strict();
2335
+ var errorSchema = z27.object({
2336
+ error: z27.object({ code: z27.string().regex(/^[a-z][a-z0-9_.-]+$/u) })
2337
+ });
2117
2338
 
2118
2339
  // ../cli/dist/commands/analytics/test.js
2119
2340
  import { randomUUID } from "crypto";
@@ -2145,22 +2366,19 @@ ${bookingRulesTemplate}`;
2145
2366
  import { access, chmod, open, readFile as readFile5, rename, rm } from "fs/promises";
2146
2367
  import { randomUUID as randomUUID2 } from "crypto";
2147
2368
  import { join as join3 } from "path";
2148
- import { z as z25 } from "zod";
2149
- var siteplaneProjectConfigSchema = z25.object({
2150
- version: z25.literal(2),
2151
- apiBaseUrl: z25.string().url(),
2152
- siteId: z25.string().uuid(),
2153
- publicSiteKeyId: z25.string().uuid(),
2154
- publicSiteKey: z25.string().trim().min(1),
2155
- runId: z25.string().uuid(),
2156
- appDirectory: z25.string().min(1),
2157
- taskContractVersion: z25.literal("siteplane.setup-task.v2"),
2158
- adminProtocolVersion: z25.literal(2),
2159
- packages: z25.object({
2160
- siteplane: z25.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
2161
- runtimeNext: z25.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
2162
- }).strict(),
2163
- fieldContractHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
2369
+ import { z as z28 } from "zod";
2370
+ var siteplaneProjectConfigSchema = z28.object({
2371
+ version: z28.literal(2),
2372
+ apiBaseUrl: z28.string().url(),
2373
+ siteId: z28.string().uuid(),
2374
+ publicSiteKeyId: z28.string().uuid(),
2375
+ publicSiteKey: z28.string().trim().min(1),
2376
+ runId: z28.string().uuid(),
2377
+ appDirectory: z28.string().min(1),
2378
+ taskContractVersion: z28.literal("siteplane.setup-task.v2"),
2379
+ adminProtocolVersion: z28.literal(2),
2380
+ packages: siteSetupPackagesSchema,
2381
+ fieldContractHash: z28.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
2164
2382
  }).strict();
2165
2383
  async function readProjectConfig(projectDir) {
2166
2384
  return siteplaneProjectConfigSchema.parse(JSON.parse(await readFile5(join3(projectDir, "siteplane.config.json"), "utf8")));
@@ -2172,13 +2390,13 @@ import { randomUUID as randomUUID3 } from "crypto";
2172
2390
  import { chmod as chmod2, lstat, mkdir as mkdir5, open as open2, readFile as readFile6, rename as rename2, rm as rm2 } from "fs/promises";
2173
2391
  import { dirname as dirname5, join as join4, relative } from "path";
2174
2392
  import { promisify } from "util";
2175
- import { z as z26 } from "zod";
2176
- var siteplaneCredentialsSchema = z26.object({
2177
- accessToken: z26.string().trim().min(1),
2178
- siteRevalidationSecret: z26.string().trim().min(1),
2179
- adminSession: z26.object({
2180
- secret: z26.string().regex(/^[A-Za-z0-9_-]{43}$/u),
2181
- generation: z26.string().uuid()
2393
+ import { z as z29 } from "zod";
2394
+ var siteplaneCredentialsSchema = z29.object({
2395
+ accessToken: z29.string().trim().min(1),
2396
+ siteRevalidationSecret: z29.string().trim().min(1),
2397
+ adminSession: z29.object({
2398
+ secret: z29.string().regex(/^[A-Za-z0-9_-]{43}$/u),
2399
+ generation: z29.string().uuid()
2182
2400
  }).strict().optional()
2183
2401
  }).strict();
2184
2402
  async function assertLocalCredentialsPathSafe(projectDir, options = {}) {
@@ -2233,7 +2451,7 @@ async function gitPathMatches(projectDir, path, command) {
2233
2451
  // ../cli/dist/commands/init.js
2234
2452
  import { access as access3 } from "fs/promises";
2235
2453
  import { join as join7, relative as relative3 } from "path";
2236
- import { z as z29 } from "zod";
2454
+ import { z as z32 } from "zod";
2237
2455
 
2238
2456
  // ../cli/dist/commands/setup-preflight.js
2239
2457
  import { createHash as createHash2 } from "crypto";
@@ -2245,11 +2463,11 @@ import { parse as parseYaml } from "yaml";
2245
2463
  import { createRequire } from "module";
2246
2464
  import { readFile as readFile7 } from "fs/promises";
2247
2465
  import { join as join5 } from "path";
2248
- import { z as z27 } from "zod";
2249
- var packageSchema = z27.object({
2250
- name: z27.string().optional(),
2251
- version: z27.string(),
2252
- peerDependencies: z27.record(z27.string(), z27.string()).optional()
2466
+ import { z as z30 } from "zod";
2467
+ var packageSchema = z30.object({
2468
+ name: z30.string().optional(),
2469
+ version: z30.string(),
2470
+ peerDependencies: z30.record(z30.string(), z30.string()).optional()
2253
2471
  });
2254
2472
  async function readInstalledPackage(projectDir, name2) {
2255
2473
  const require2 = createRequire(join5(projectDir, "package.json"));
@@ -2267,7 +2485,7 @@ async function readInstalledPackage(projectDir, name2) {
2267
2485
  // ../cli/dist/commands/setup-preflight.js
2268
2486
  import { access as access2, readFile as readFile8, realpath, readdir, readlink } from "fs/promises";
2269
2487
  import { dirname as dirname6, join as join6, relative as relative2, resolve, sep } from "path";
2270
- import { z as z28 } from "zod";
2488
+ import { z as z31 } from "zod";
2271
2489
 
2272
2490
  // ../cli/dist/commands/setup-process.js
2273
2491
  import { spawn } from "child_process";
@@ -2368,29 +2586,29 @@ async function setupVercelApi(cwd, endpoint, body, method, options) {
2368
2586
  }
2369
2587
 
2370
2588
  // ../cli/dist/commands/setup-preflight.js
2371
- var manifestSchema = z28.object({
2372
- packageManager: z28.string().optional(),
2373
- engines: z28.object({ node: z28.string().optional() }).optional(),
2374
- dependencies: z28.record(z28.string(), z28.string()).optional(),
2375
- devDependencies: z28.record(z28.string(), z28.string()).optional(),
2376
- scripts: z28.record(z28.string(), z28.string()).optional(),
2377
- workspaces: z28.unknown().optional()
2378
- });
2379
- var vercelProjectSchema = z28.object({
2380
- id: z28.string(),
2381
- accountId: z28.string(),
2382
- name: z28.string(),
2383
- nodeVersion: z28.string().nullable().optional(),
2384
- rootDirectory: z28.string().nullable().optional(),
2385
- framework: z28.string().nullable().optional(),
2386
- installCommand: z28.string().nullable().optional(),
2387
- buildCommand: z28.string().nullable().optional(),
2388
- link: z28.object({
2389
- type: z28.string(),
2390
- repo: z28.string().optional(),
2391
- repoId: z28.union([z28.string(), z28.number()]).optional(),
2392
- org: z28.string().optional(),
2393
- productionBranch: z28.string().optional()
2589
+ var manifestSchema = z31.object({
2590
+ packageManager: z31.string().optional(),
2591
+ engines: z31.object({ node: z31.string().optional() }).optional(),
2592
+ dependencies: z31.record(z31.string(), z31.string()).optional(),
2593
+ devDependencies: z31.record(z31.string(), z31.string()).optional(),
2594
+ scripts: z31.record(z31.string(), z31.string()).optional(),
2595
+ workspaces: z31.unknown().optional()
2596
+ });
2597
+ var vercelProjectSchema = z31.object({
2598
+ id: z31.string(),
2599
+ accountId: z31.string(),
2600
+ name: z31.string(),
2601
+ nodeVersion: z31.string().nullable().optional(),
2602
+ rootDirectory: z31.string().nullable().optional(),
2603
+ framework: z31.string().nullable().optional(),
2604
+ installCommand: z31.string().nullable().optional(),
2605
+ buildCommand: z31.string().nullable().optional(),
2606
+ link: z31.object({
2607
+ type: z31.string(),
2608
+ repo: z31.string().optional(),
2609
+ repoId: z31.union([z31.string(), z31.number()]).optional(),
2610
+ org: z31.string().optional(),
2611
+ productionBranch: z31.string().optional()
2394
2612
  }).nullable().optional()
2395
2613
  });
2396
2614
  var exists = async (path) => access2(path).then(() => true, () => false);
@@ -2447,9 +2665,9 @@ async function inspectSetupLocalProject(projectDir) {
2447
2665
  const rootManifest = manifestSchema.parse(JSON.parse(await readFile8(join6(lockfileRoot, "package.json"), "utf8")));
2448
2666
  if (lockfileRoot !== projectDirectory) {
2449
2667
  const workspaceFile = join6(lockfileRoot, "pnpm-workspace.yaml");
2450
- 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([
2451
- z28.array(z28.string()),
2452
- z28.object({ packages: z28.array(z28.string()) }).transform((value) => value.packages)
2668
+ 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([
2669
+ z31.array(z31.string()),
2670
+ z31.object({ packages: z31.array(z31.string()) }).transform((value) => value.packages)
2453
2671
  ]).parse(rootManifest.workspaces);
2454
2672
  const selected = relative2(lockfileRoot, projectDirectory).split(sep).join("/");
2455
2673
  if (!workspace.some((pattern) => !pattern.startsWith("!") && minimatch(selected, pattern)) || workspace.some((pattern) => pattern.startsWith("!") && minimatch(selected, pattern.slice(1))))
@@ -2463,11 +2681,11 @@ async function inspectSetupLocalProject(projectDir) {
2463
2681
  break;
2464
2682
  }
2465
2683
  const lockText = await readFile8(join6(lockfileRoot, lockName), "utf8");
2466
- const npmLock = lockName === "package-lock.json" ? z28.object({
2467
- lockfileVersion: z28.number(),
2468
- packages: z28.record(z28.string(), z28.object({
2469
- version: z28.string().optional(),
2470
- peerDependencies: z28.record(z28.string(), z28.string()).optional()
2684
+ const npmLock = lockName === "package-lock.json" ? z31.object({
2685
+ lockfileVersion: z31.number(),
2686
+ packages: z31.record(z31.string(), z31.object({
2687
+ version: z31.string().optional(),
2688
+ peerDependencies: z31.record(z31.string(), z31.string()).optional()
2471
2689
  })).optional()
2472
2690
  }).parse(JSON.parse(lockText)) : null;
2473
2691
  async function version2(name3) {
@@ -2522,8 +2740,12 @@ async function inspectSetupLocalProject(projectDir) {
2522
2740
  sourceConflicts.push("static_export");
2523
2741
  if (/\bbasePath\s*:/u.test(source))
2524
2742
  sourceConflicts.push("base_path");
2743
+ if (/\bloaderFile\s*:|\bloader\s*:\s*['"](?:custom|imgix|cloudinary|akamai)['"]/u.test(source))
2744
+ sourceConflicts.push(`inspect_image_loader:${file}`);
2745
+ if (/\bmaximumRedirects\s*:\s*[1-9]/u.test(source))
2746
+ sourceConflicts.push(`inspect_image_redirects:${file}`);
2525
2747
  }
2526
- if (sourceConflicts.length)
2748
+ if (sourceConflicts.some((conflict) => conflict === "static_export" || conflict === "base_path"))
2527
2749
  fail("unsupported_server_configuration", "Resolve static export/basePath configuration explicitly; Siteplane requires its server-side admin and revalidation handlers.");
2528
2750
  for (const name3 of [
2529
2751
  "middleware.ts",
@@ -2535,8 +2757,14 @@ async function inspectSetupLocalProject(projectDir) {
2535
2757
  "src/proxy.ts",
2536
2758
  "src/proxy.js"
2537
2759
  ]) {
2538
- if (await exists(join6(projectDirectory, name3)))
2760
+ if (await exists(join6(projectDirectory, name3))) {
2539
2761
  sourceConflicts.push(`inspect_routing:${name3}`);
2762
+ if (await readlink(join6(projectDirectory, name3)).catch(() => null))
2763
+ continue;
2764
+ const policySource = await readFile8(join6(projectDirectory, name3), "utf8");
2765
+ if (/Content-Security-Policy|img-src|default-src/iu.test(policySource))
2766
+ sourceConflicts.push(`inspect_image_csp:${name3}`);
2767
+ }
2540
2768
  }
2541
2769
  async function inspectSource(directory) {
2542
2770
  for (const entry of await readdir(directory, { withFileTypes: true })) {
@@ -2550,6 +2778,8 @@ async function inspectSetupLocalProject(projectDir) {
2550
2778
  if (!/\.[cm]?[jt]sx?$/u.test(entry.name))
2551
2779
  continue;
2552
2780
  const source = await readFile8(path, "utf8");
2781
+ if (/Content-Security-Policy|img-src|default-src/iu.test(source))
2782
+ sourceConflicts.push(`inspect_image_csp:${relative2(projectDirectory, path)}`);
2553
2783
  if (/from\s*["']next\/image["']/u.test(source))
2554
2784
  sourceConflicts.push(`inspect_image_policy:${relative2(projectDirectory, path)}`);
2555
2785
  if (/\b(?:Cookiebot|OneTrust|cookieyes|consentManager|cookieConsent)\b/iu.test(source))
@@ -2595,9 +2825,9 @@ async function setupPreflightCommand(input) {
2595
2825
  linkDirectory = dirname6(linkDirectory);
2596
2826
  if (!await exists(join6(linkDirectory, ".vercel/project.json")))
2597
2827
  fail("vercel_project_not_linked", "Link this application to its intended Vercel project before setup; Siteplane will not guess a target.");
2598
- const linked = z28.object({
2599
- projectId: z28.string().regex(/^prj_[A-Za-z0-9]+$/u),
2600
- orgId: z28.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u)
2828
+ const linked = z31.object({
2829
+ projectId: z31.string().regex(/^prj_[A-Za-z0-9]+$/u),
2830
+ orgId: z31.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u)
2601
2831
  }).parse(JSON.parse(await readFile8(join6(linkDirectory, ".vercel/project.json"), "utf8")));
2602
2832
  const project = vercelProjectSchema.parse(await setupVercelApi(linkDirectory, `/v9/projects/${linked.projectId}?teamId=${linked.orgId}`));
2603
2833
  if (project.id !== linked.projectId || project.accountId !== linked.orgId)
@@ -2611,11 +2841,11 @@ async function setupPreflightCommand(input) {
2611
2841
  fail("vercel_production_branch_conflict", "The local branch differs from the bound Vercel Production branch.");
2612
2842
  if (project.link?.repo && project.link.org && !local.git.remote?.replace(/\.git$/u, "").endsWith(`${project.link.org}/${project.link.repo}`))
2613
2843
  fail("vercel_git_conflict", "The local origin repository differs from the Vercel Git connection.");
2614
- const env = z28.object({
2615
- envs: z28.array(z28.object({
2616
- key: z28.string(),
2617
- value: z28.string().optional(),
2618
- target: z28.array(z28.string()).optional()
2844
+ const env = z31.object({
2845
+ envs: z31.array(z31.object({
2846
+ key: z31.string(),
2847
+ value: z31.string().optional(),
2848
+ target: z31.array(z31.string()).optional()
2619
2849
  }))
2620
2850
  }).parse(await setupVercelApi(linkDirectory, `/v10/projects/${linked.projectId}/env?teamId=${linked.orgId}`));
2621
2851
  const corepack = env.envs.some((item) => item.key === "ENABLE_EXPERIMENTAL_COREPACK" && item.value === "1" && item.target?.includes("production"));
@@ -2677,29 +2907,26 @@ function safeGitRemote(value) {
2677
2907
  }
2678
2908
 
2679
2909
  // ../cli/dist/commands/init.js
2680
- var siteSetupBootstrapDataSchema = z29.object({
2681
- credentialPurpose: z29.literal("site_setup"),
2682
- apiBaseUrl: z29.string().url(),
2683
- siteId: z29.string().uuid(),
2684
- publicSiteKeyId: z29.string().uuid(),
2685
- publicSiteKey: z29.string().trim().min(1),
2686
- accessToken: z29.string().trim().min(1),
2687
- siteRevalidationSecret: z29.string().regex(/^[A-Za-z0-9_-]{43}$/u),
2688
- runId: z29.string().uuid(),
2689
- packages: z29.object({
2690
- siteplane: z29.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
2691
- runtimeNext: z29.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
2692
- }).strict()
2910
+ var siteSetupBootstrapDataSchema = z32.object({
2911
+ credentialPurpose: z32.literal("site_setup"),
2912
+ apiBaseUrl: z32.string().url(),
2913
+ siteId: z32.string().uuid(),
2914
+ publicSiteKeyId: z32.string().uuid(),
2915
+ publicSiteKey: z32.string().trim().min(1),
2916
+ accessToken: z32.string().trim().min(1),
2917
+ siteRevalidationSecret: z32.string().regex(/^[A-Za-z0-9_-]{43}$/u),
2918
+ runId: z32.string().uuid(),
2919
+ packages: siteSetupPackagesSchema
2693
2920
  }).strict();
2694
- var featureBootstrapDataSchema = z29.object({
2695
- credentialPurpose: z29.enum(["analytics", "booking"]),
2696
- apiBaseUrl: z29.string().url(),
2697
- siteId: z29.string().uuid(),
2698
- accessToken: z29.string().trim().min(1)
2921
+ var featureBootstrapDataSchema = z32.object({
2922
+ credentialPurpose: z32.enum(["analytics", "booking"]),
2923
+ apiBaseUrl: z32.string().url(),
2924
+ siteId: z32.string().uuid(),
2925
+ accessToken: z32.string().trim().min(1)
2699
2926
  }).strict();
2700
- var bootstrapResponseSchema = z29.object({
2701
- ok: z29.literal(true),
2702
- data: z29.discriminatedUnion("credentialPurpose", [
2927
+ var bootstrapResponseSchema = z32.object({
2928
+ ok: z32.literal(true),
2929
+ data: z32.discriminatedUnion("credentialPurpose", [
2703
2930
  siteSetupBootstrapDataSchema,
2704
2931
  featureBootstrapDataSchema
2705
2932
  ])
@@ -2750,7 +2977,7 @@ async function collectSourceFiles(directory) {
2750
2977
  import { execFile as execFile2 } from "child_process";
2751
2978
  import { readFile as readFile9 } from "fs/promises";
2752
2979
  import { promisify as promisify2 } from "util";
2753
- import { z as z30 } from "zod";
2980
+ import { z as z33 } from "zod";
2754
2981
 
2755
2982
  // ../cli/dist/scan/next-source-scan.js
2756
2983
  import ts2 from "typescript";
@@ -3417,30 +3644,32 @@ function isPositionalFieldReference(value) {
3417
3644
 
3418
3645
  // ../cli/dist/commands/site-setup.js
3419
3646
  var execFileAsync2 = promisify2(execFile2);
3420
- var safeErrorSchema = z30.object({
3421
- code: z30.string().trim().min(1),
3422
- message: z30.string().trim().min(1)
3647
+ var safeErrorSchema = z33.object({
3648
+ code: z33.string().trim().min(1),
3649
+ message: z33.string().trim().min(1)
3423
3650
  }).passthrough();
3424
- var errorResponseSchema2 = z30.object({ ok: z30.literal(false), error: safeErrorSchema }).passthrough();
3425
- var contextDataSchema = z30.object({ task: siteSetupTaskSchema }).strict();
3426
- var contextResponseSchema = z30.object({ ok: z30.literal(true), data: contextDataSchema }).strict();
3427
- var applyDataSchema = z30.object({
3428
- status: z30.enum(["applied", "ready_for_review"]),
3429
- runId: z30.string().uuid().optional(),
3430
- contractVersionId: z30.string().uuid().optional(),
3431
- fieldContractHash: z30.string().regex(/^sha256:[0-9a-f]{64}$/u),
3432
- editorDefinitionHash: z30.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
3433
- fieldCount: z30.number().int().nonnegative().optional(),
3434
- routeCount: z30.number().int().nonnegative().optional()
3651
+ var errorResponseSchema2 = z33.object({ ok: z33.literal(false), error: safeErrorSchema }).passthrough();
3652
+ var contextDataSchema = z33.object({
3653
+ task: siteSetupTaskSchema.refine((task) => task.run !== null)
3654
+ }).strict();
3655
+ var contextResponseSchema = z33.object({ ok: z33.literal(true), data: contextDataSchema }).strict();
3656
+ var applyDataSchema = z33.object({
3657
+ status: z33.enum(["applied", "ready_for_review"]),
3658
+ runId: z33.string().uuid().optional(),
3659
+ contractVersionId: z33.string().uuid().optional(),
3660
+ fieldContractHash: z33.string().regex(/^sha256:[0-9a-f]{64}$/u),
3661
+ editorDefinitionHash: z33.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
3662
+ fieldCount: z33.number().int().nonnegative().optional(),
3663
+ routeCount: z33.number().int().nonnegative().optional()
3435
3664
  }).strict();
3436
- var applyResponseSchema = z30.object({ ok: z30.literal(true), data: applyDataSchema }).strict();
3437
- var verifyDataSchema = z30.object({
3438
- status: z30.literal("ready_for_review"),
3439
- runId: z30.string().uuid().optional(),
3440
- deploymentOrigin: z30.string().url().optional(),
3441
- deploymentRevision: z30.string().optional()
3665
+ var applyResponseSchema = z33.object({ ok: z33.literal(true), data: applyDataSchema }).strict();
3666
+ var verifyDataSchema = z33.object({
3667
+ status: z33.literal("ready_for_review"),
3668
+ runId: z33.string().uuid().optional(),
3669
+ deploymentOrigin: z33.string().url().optional(),
3670
+ deploymentRevision: z33.string().optional()
3442
3671
  }).strict();
3443
- var verifyResponseSchema = z30.object({ ok: z30.literal(true), data: verifyDataSchema }).strict();
3672
+ var verifyResponseSchema = z33.object({ ok: z33.literal(true), data: verifyDataSchema }).strict();
3444
3673
  async function siteSetupContextCommand(input) {
3445
3674
  const response = await postSiteSetup(input, "context", {});
3446
3675
  const parsed = contextResponseSchema.safeParse(response.payload);
@@ -3543,8 +3772,8 @@ import ts3 from "typescript";
3543
3772
  import { randomUUID as randomUUID5 } from "crypto";
3544
3773
  import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
3545
3774
  import { resolve as resolve2 } from "path";
3546
- import { z as z31 } from "zod";
3547
- var ownerSchema = z31.object({ pid: z31.number().int().positive(), nonce: z31.string().uuid() }).strict();
3775
+ import { z as z34 } from "zod";
3776
+ var ownerSchema = z34.object({ pid: z34.number().int().positive(), nonce: z34.string().uuid() }).strict();
3548
3777
 
3549
3778
  // ../cli/dist/config/build-provenance.js
3550
3779
  import { createHash as createHash3 } from "crypto";
@@ -3552,23 +3781,23 @@ import { execFile as execFile3 } from "child_process";
3552
3781
  import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
3553
3782
  import { dirname as dirname8, isAbsolute as isAbsolute2, join as join10, relative as relative6, resolve as resolve3, sep as sep3 } from "path";
3554
3783
  import { isDeepStrictEqual, promisify as promisify3 } from "util";
3555
- import { z as z32 } from "zod";
3784
+ import { z as z35 } from "zod";
3556
3785
  var execute = promisify3(execFile3);
3557
3786
  var name = ".siteplane/build-source.json";
3558
- var oid = z32.string().regex(/^[0-9a-f]{40}$/u);
3559
- var entrySchema = z32.object({
3560
- path: z32.string().min(1).max(4096),
3561
- mode: z32.enum(["100644", "100755", "120000"]),
3787
+ var oid = z35.string().regex(/^[0-9a-f]{40}$/u);
3788
+ var entrySchema = z35.object({
3789
+ path: z35.string().min(1).max(4096),
3790
+ mode: z35.enum(["100644", "100755", "120000"]),
3562
3791
  oid
3563
3792
  }).strict();
3564
- var schema = z32.object({
3565
- version: z32.literal(2),
3793
+ var schema = z35.object({
3794
+ version: z35.literal(2),
3566
3795
  revision: oid,
3567
- commit: z32.string().min(1).max(1048576),
3568
- entries: z32.array(entrySchema).min(1).max(1e5),
3569
- providerConfigurations: z32.array(z32.object({
3570
- path: z32.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3571
- source: z32.string().max(1048576)
3796
+ commit: z35.string().min(1).max(1048576),
3797
+ entries: z35.array(entrySchema).min(1).max(1e5),
3798
+ providerConfigurations: z35.array(z35.object({
3799
+ path: z35.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3800
+ source: z35.string().max(1048576)
3572
3801
  }).strict()).max(1e3)
3573
3802
  }).strict();
3574
3803
  var gitHash = (type, content) => createHash3("sha1").update(`${type} ${content.length}\0`).update(content).digest("hex");
@@ -3668,7 +3897,7 @@ async function readBuildProvenance(projectDirectory) {
3668
3897
  const original = configurations.get(entry.path);
3669
3898
  if (contents && original && entry.mode !== "120000") {
3670
3899
  try {
3671
- const object = z32.record(z32.string(), z32.unknown());
3900
+ const object = z35.record(z35.string(), z35.unknown());
3672
3901
  const actual = object.parse(JSON.parse(contents.toString("utf8")));
3673
3902
  const expected = object.parse(JSON.parse(original));
3674
3903
  if (!Object.hasOwn(expected, "version") && actual.version === 2)
@@ -3722,37 +3951,38 @@ import { createHash as createHash4, randomBytes, randomUUID as randomUUID6 } fro
3722
3951
  import { access as access5, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
3723
3952
  import { tmpdir } from "os";
3724
3953
  import { join as join11 } from "path";
3725
- import { z as z33 } from "zod";
3726
- var envSchema = z33.object({
3727
- id: z33.string(),
3728
- key: z33.string(),
3729
- target: z33.array(z33.string()),
3730
- type: z33.string(),
3731
- comment: z33.string().optional(),
3732
- updatedAt: z33.number().optional()
3733
- });
3734
- var deploymentSchema = z33.object({
3735
- id: z33.string(),
3736
- projectId: z33.string(),
3737
- ownerId: z33.string().optional(),
3738
- target: z33.string().nullable(),
3739
- readyState: z33.string(),
3740
- createdAt: z33.number(),
3741
- url: z33.string(),
3742
- meta: z33.record(z33.string(), z33.unknown()).optional(),
3743
- gitSource: z33.object({ sha: z33.string().optional() }).nullable().optional()
3744
- });
3745
- var buildProofSchema = z33.object({
3746
- node: z33.string(),
3747
- packageManager: z33.enum(["npm", "pnpm"]),
3748
- packageManagerVersion: z33.string(),
3749
- lockfileHash: z33.string(),
3750
- revision: z33.string(),
3751
- fieldContractHash: z33.string(),
3752
- siteplane: z33.string(),
3753
- runtimeNext: z33.string(),
3754
- next: z33.string(),
3755
- react: z33.string()
3954
+ import { z as z36 } from "zod";
3955
+ var envSchema = z36.object({
3956
+ id: z36.string(),
3957
+ key: z36.string(),
3958
+ target: z36.array(z36.string()),
3959
+ type: z36.string(),
3960
+ comment: z36.string().optional(),
3961
+ updatedAt: z36.number().optional()
3962
+ });
3963
+ var deploymentSchema = z36.object({
3964
+ id: z36.string(),
3965
+ projectId: z36.string(),
3966
+ ownerId: z36.string().optional(),
3967
+ target: z36.string().nullable(),
3968
+ readyState: z36.string(),
3969
+ createdAt: z36.number(),
3970
+ url: z36.string(),
3971
+ meta: z36.record(z36.string(), z36.unknown()).optional(),
3972
+ gitSource: z36.object({ sha: z36.string().optional() }).nullable().optional()
3973
+ });
3974
+ var buildProofSchema = z36.object({
3975
+ node: z36.string(),
3976
+ packageManager: z36.enum(["npm", "pnpm"]),
3977
+ packageManagerVersion: z36.string(),
3978
+ lockfileHash: z36.string(),
3979
+ revision: z36.string(),
3980
+ fieldContractHash: z36.string(),
3981
+ siteplane: z36.string(),
3982
+ runtimeNext: z36.string(),
3983
+ analytics: z36.string().optional(),
3984
+ next: z36.string(),
3985
+ react: z36.string()
3756
3986
  }).strict();
3757
3987
  var defaults = {
3758
3988
  preflight: setupPreflightCommand,
@@ -3762,6 +3992,7 @@ var defaults = {
3762
3992
  verify: siteSetupVerifyCommand,
3763
3993
  post: postSiteSetup,
3764
3994
  writeBuildProvenance,
3995
+ analyticsPublicKey: analyticsPublicKeyCommand,
3765
3996
  now: Date.now,
3766
3997
  pause: (milliseconds) => new Promise((resolve5) => setTimeout(resolve5, milliseconds))
3767
3998
  };
@@ -3836,11 +4067,17 @@ async function withSiteplane(nextConfig, options = {}) {
3836
4067
  buildRevision,
3837
4068
  scan.fieldContractHash
3838
4069
  );
4070
+ const hasImages = scan.contract.fields.some(
4071
+ (field) => field.fieldType === "image"
4072
+ );
4073
+ const imageOrigin = hasImages ? readImageWebsiteOrigin() : null;
3839
4074
  return {
3840
4075
  ...nextConfig,
4076
+ ...imageOrigin ? { images: prepareImagePatterns(nextConfig.images, imageOrigin) } : {},
3841
4077
  headers: async () => frameHeaders(
3842
4078
  await nextConfig.headers?.() ?? [],
3843
- new URL(config.apiBaseUrl).origin
4079
+ new URL(config.apiBaseUrl).origin,
4080
+ imageOrigin
3844
4081
  ),
3845
4082
  env: {
3846
4083
  ...nextConfig.env ?? {},
@@ -3861,7 +4098,7 @@ async function readGitRevision2(projectDir) {
3861
4098
  return "";
3862
4099
  }
3863
4100
  }
3864
- function frameHeaders(rules, adminOrigin) {
4101
+ function frameHeaders(rules, adminOrigin, imageOrigin) {
3865
4102
  const policy = `frame-ancestors 'self' ${adminOrigin}`;
3866
4103
  const prepared = rules.map((rule) => ({
3867
4104
  ...rule,
@@ -3880,9 +4117,10 @@ function frameHeaders(rules, adminOrigin) {
3880
4117
  "frame_policy_conflict",
3881
4118
  "Keep the existing CSP directives and explicitly allow only the canonical Siteplane admin origin in frame-ancestors."
3882
4119
  );
4120
+ const value = ancestors ? header.value : `${header.value.replace(/;\s*$/u, "")}; ${policy}`;
3883
4121
  return {
3884
4122
  ...header,
3885
- value: ancestors ? header.value : `${header.value.replace(/;\s*$/u, "")}; ${policy}`
4123
+ value: imageOrigin ? prepareImageCsp(value, imageOrigin) : value
3886
4124
  };
3887
4125
  })
3888
4126
  }));
@@ -3894,13 +4132,98 @@ function frameHeaders(rules, adminOrigin) {
3894
4132
  ...prepared
3895
4133
  ];
3896
4134
  }
4135
+ var managedImageOrigin = "https://siteplane.io";
4136
+ function readImageWebsiteOrigin() {
4137
+ try {
4138
+ const value = process.env.SITEPLANE_SITE_ORIGIN;
4139
+ const url = new URL(value ?? "");
4140
+ if (url.protocol !== "https:" || url.username || url.password || url.port || url.pathname !== "/" || url.search || url.hash || !url.hostname.includes(".") || /(?:^|\.)(?:localhost|local|internal)$/iu.test(url.hostname) || /^[\d.]+$/u.test(url.hostname) || url.hostname.includes(":"))
4141
+ throw new Error("Invalid image origin");
4142
+ return url.origin;
4143
+ } catch {
4144
+ throw new SiteplaneNextContractError(
4145
+ "image_origin_missing",
4146
+ "Image fields require SITEPLANE_SITE_ORIGIN to be the exact public HTTPS website origin. setup deploy sets it from the verified provider domain; use that same origin for local builds. Never substitute a wildcard or private host."
4147
+ );
4148
+ }
4149
+ }
4150
+ function prepareImagePatterns(images, websiteOrigin) {
4151
+ if (images?.loaderFile || images?.loader && images.loader !== "default")
4152
+ throw new SiteplaneNextContractError(
4153
+ "image_policy_conflict",
4154
+ "The website uses a custom image loader. Reconcile its handling of Siteplane and repository image URLs while preserving existing images; do not bypass optimization globally."
4155
+ );
4156
+ if (images?.maximumRedirects !== void 0 && images.maximumRedirects !== 0)
4157
+ throw new SiteplaneNextContractError(
4158
+ "image_policy_conflict",
4159
+ "The website explicitly follows image redirects. Resolve redirecting sources before setting maximumRedirects to 0; Siteplane image destinations must be fetched directly."
4160
+ );
4161
+ const remotePatterns = [...images?.remotePatterns ?? []];
4162
+ for (const [origin, pathname] of [
4163
+ [managedImageOrigin, "/api/assets/*/content"],
4164
+ [websiteOrigin, "/siteplane-assets/**"]
4165
+ ]) {
4166
+ const pattern = {
4167
+ protocol: "https",
4168
+ hostname: new URL(origin).hostname,
4169
+ port: "",
4170
+ pathname,
4171
+ search: ""
4172
+ };
4173
+ if (!remotePatterns.some(
4174
+ (existing) => existing.protocol === pattern.protocol && existing.hostname === pattern.hostname && existing.port === "" && existing.pathname === pathname && existing.search === ""
4175
+ ))
4176
+ remotePatterns.push(pattern);
4177
+ }
4178
+ const localPatterns = images?.localPatterns ? [...images.localPatterns] : void 0;
4179
+ if (localPatterns && !localPatterns.some(
4180
+ (pattern) => pattern.pathname === "/siteplane-assets/**" && pattern.search === ""
4181
+ ))
4182
+ localPatterns.push({ pathname: "/siteplane-assets/**", search: "" });
4183
+ return {
4184
+ ...images,
4185
+ remotePatterns,
4186
+ ...localPatterns ? { localPatterns } : {},
4187
+ maximumRedirects: 0
4188
+ };
4189
+ }
4190
+ function prepareImageCsp(policy, websiteOrigin) {
4191
+ if (policy.includes(","))
4192
+ throw new SiteplaneNextContractError(
4193
+ "image_policy_conflict",
4194
+ "Split combined CSP policies into separate header rules before image preparation; preserve every existing directive."
4195
+ );
4196
+ const directives = policy.split(";").map((part) => part.trim()).filter(Boolean);
4197
+ const find = (name2) => directives.map((part, index) => ({ index, tokens: part.split(/\s+/u) })).filter((part) => part.tokens[0]?.toLowerCase() === name2);
4198
+ const image = find("img-src"), defaults2 = find("default-src");
4199
+ if (image.length > 1 || defaults2.length > 1)
4200
+ throw new SiteplaneNextContractError(
4201
+ "image_policy_conflict",
4202
+ "Remove ambiguous duplicate img-src/default-src directives before image preparation without changing unrelated policies."
4203
+ );
4204
+ const existing = image[0] ?? defaults2[0];
4205
+ if (!existing) return policy;
4206
+ const sources = existing.tokens.slice(1).filter((source) => source !== "'none'");
4207
+ for (const source of [
4208
+ `${managedImageOrigin}/api/assets/`,
4209
+ `${websiteOrigin}/siteplane-assets/`,
4210
+ `${websiteOrigin}/_next/image`
4211
+ ]) {
4212
+ if (!sources.includes(source)) sources.push(source);
4213
+ }
4214
+ const value = `img-src ${sources.join(" ")}`;
4215
+ if (image[0]) directives[image[0].index] = value;
4216
+ else directives.push(value);
4217
+ return directives.join("; ");
4218
+ }
3897
4219
  async function emitBuildProof(projectDir, packages, revision, fieldContractHash) {
3898
4220
  const [cli, runtime, next, react] = await Promise.all(
3899
4221
  ["siteplane", "@siteplane/runtime-next", "next", "react"].map(
3900
4222
  (name2) => readInstalledPackage(projectDir, name2)
3901
4223
  )
3902
4224
  );
3903
- if (cli.version !== packages.siteplane || runtime.version !== packages.runtimeNext)
4225
+ const analytics = packages.analytics ? await readInstalledPackage(projectDir, "@siteplane/analytics") : void 0;
4226
+ if (analytics?.version !== packages.analytics || cli.version !== packages.siteplane || runtime.version !== packages.runtimeNext)
3904
4227
  throw new SiteplaneNextContractError(
3905
4228
  "build_identity_missing",
3906
4229
  "The provider installed different Siteplane package versions than the task requires."
@@ -3937,7 +4260,7 @@ async function emitBuildProof(projectDir, packages, revision, fieldContractHash)
3937
4260
  "The provider build is missing the selected canonical lockfile."
3938
4261
  );
3939
4262
  console.info(
3940
- `SITEPLANE_BUILD_PROOF=${JSON.stringify({ node: process.versions.node, packageManager, packageManagerVersion, lockfileHash: `sha256:${createHash5("sha256").update(lock).digest("hex")}`, revision, fieldContractHash, siteplane: cli.version, runtimeNext: runtime.version, next: next.version, react: react.version })}`
4263
+ `SITEPLANE_BUILD_PROOF=${JSON.stringify({ node: process.versions.node, packageManager, packageManagerVersion, lockfileHash: `sha256:${createHash5("sha256").update(lock).digest("hex")}`, revision, fieldContractHash, siteplane: cli.version, runtimeNext: runtime.version, ...analytics ? { analytics: analytics.version } : {}, next: next.version, react: react.version })}`
3941
4264
  );
3942
4265
  }
3943
4266
  export {