siteplane 0.1.56 → 0.1.58

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.
@@ -5,16 +5,16 @@ import { randomUUID as randomUUID8 } from "crypto";
5
5
  import { access as access7, readFile as readFile13 } from "fs/promises";
6
6
  import { join as join13, resolve as resolve4 } from "path";
7
7
 
8
- // ../cli/dist/analytics/manifest.js
8
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/manifest.js
9
9
  import { mkdir, readFile, writeFile } from "fs/promises";
10
10
  import { dirname } from "path";
11
11
 
12
- // ../shared/dist/actors.js
12
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/actors.js
13
13
  import { z } from "zod";
14
14
  var ACTOR_TYPES = ["workspace_member", "site_member", "agent", "setup_guest", "system"];
15
15
  var actorTypeSchema = z.enum(ACTOR_TYPES);
16
16
 
17
- // ../shared/dist/analytics-defaults.js
17
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-defaults.js
18
18
  var ANALYTICS_BATCH_LIMITS = {
19
19
  maxEventsPerRequest: 50,
20
20
  maxJsonBodyBytes: 64 * 1024,
@@ -29,7 +29,7 @@ var ANALYTICS_RETENTION_DEFAULTS = {
29
29
  lateEventWindowHours: 72
30
30
  };
31
31
 
32
- // ../shared/dist/analytics-booking.js
32
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-booking.js
33
33
  import { z as z2 } from "zod";
34
34
  var bookingProviders = ["treatwell", "beautinda", "other"];
35
35
  var bookingAttributionModes = [
@@ -72,7 +72,7 @@ var bookingProviderHintSchema = z2.object({
72
72
  }
73
73
  });
74
74
 
75
- // ../shared/dist/analytics-contract.js
75
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-contract.js
76
76
  import { z as z3 } from "zod";
77
77
  var ANALYTICS_CONTRACT_VERSION = "analytics-contract.v1";
78
78
  var ANALYTICS_CONTRACT_HASH = "sha256:a91bddcc3c5e4196933b0335d03eaf41ff929cb736bdd694fe54d07ab52dada1";
@@ -100,7 +100,7 @@ var analyticsProviderImportSchema = z3.object({
100
100
  rows: z3.array(analyticsProviderImportRowSchema).min(1).max(1e3)
101
101
  }).strict();
102
102
 
103
- // ../shared/dist/analytics-config.js
103
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-config.js
104
104
  import { z as z4 } from "zod";
105
105
  var ANALYTICS_CONFIG_LEASE_MS = 6e4;
106
106
  var analyticsMeasurementConfigSchema = z4.object({
@@ -129,10 +129,9 @@ var analyticsMeasurementConfigSchema = z4.object({
129
129
  }
130
130
  });
131
131
 
132
- // ../shared/dist/analytics-events.js
132
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-events.js
133
133
  import { z as z5 } from "zod";
134
134
  var ANALYTICS_SCHEMA_VERSION = "analytics.v1";
135
- var ANALYTICS_KEY_PATTERN = /^(pk|sk)_siteplane_([A-Za-z0-9_-]{16})_[A-Za-z0-9_-]{43}$/;
136
135
  var analyticsSessionIdSchema = z5.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
137
136
  var analyticsVisitorIdSchema = z5.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
138
137
  var analyticsPersistedIdentityHashSchema = z5.string().regex(/^[a-f0-9]{64}$/u);
@@ -327,10 +326,6 @@ var analyticsNormalizedEventSchema = analyticsNormalizedEventBaseSchema.extend({
327
326
  function isServerOnlyAnalyticsEvent(eventName) {
328
327
  return serverOnlyAnalyticsEvents.includes(eventName);
329
328
  }
330
- function getAnalyticsKeyLookup(rawKey) {
331
- const match = ANALYTICS_KEY_PATTERN.exec(rawKey);
332
- return match ? `${match[1]}_siteplane_${match[2]}` : null;
333
- }
334
329
  function expandAnalyticsDataAttributeEvent(event) {
335
330
  if (event === "form") {
336
331
  return ["form_start", "form_submit", "form_error"];
@@ -338,7 +333,7 @@ function expandAnalyticsDataAttributeEvent(event) {
338
333
  return [event];
339
334
  }
340
335
 
341
- // ../shared/dist/analytics-manifest.js
336
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-manifest.js
342
337
  import { z as z6 } from "zod";
343
338
  var analyticsTargetIdSchema = z6.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
344
339
  message: "Analytics target IDs must be stable identifiers without whitespace or visible copy."
@@ -491,7 +486,7 @@ function isPlainRecord(value) {
491
486
  return typeof value === "object" && value !== null;
492
487
  }
493
488
 
494
- // ../shared/dist/analytics-metrics.js
489
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-metrics.js
495
490
  import { z as z7 } from "zod";
496
491
  var analyticsVisitorQualities = ["exact", "estimated"];
497
492
  var analyticsVisitorQualitySchema = z7.enum(analyticsVisitorQualities);
@@ -508,7 +503,7 @@ var analyticsKpiKeys = [
508
503
  ];
509
504
  var analyticsKpiKeySchema = z7.enum(analyticsKpiKeys);
510
505
 
511
- // ../shared/dist/analytics-privacy.js
506
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/analytics-privacy.js
512
507
  var serverPropertySchemas = {
513
508
  lead_created: {
514
509
  conversionId: "identifier",
@@ -543,7 +538,7 @@ function revenuePropertySchema() {
543
538
  };
544
539
  }
545
540
 
546
- // ../shared/dist/assets.js
541
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/assets.js
547
542
  import { z as z8 } from "zod";
548
543
  var ASSET_STAGES = ["staging", "final", "deleted"];
549
544
  var ASSET_VISIBILITIES = ["private", "public", "deleted"];
@@ -558,7 +553,7 @@ var assetVisibilitySchema = z8.enum(ASSET_VISIBILITIES);
558
553
  var assetUsageEntityTypeSchema = z8.enum(ASSET_USAGE_ENTITY_TYPES);
559
554
  var brandingAccentColorSchema = z8.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
560
555
 
561
- // ../shared/dist/booking-contracts.js
556
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/booking-contracts.js
562
557
  import { z as z9 } from "zod";
563
558
  var bookingStatuses = [
564
559
  "pending_payment",
@@ -919,13 +914,13 @@ function redactBookingManifest(value) {
919
914
  return value;
920
915
  }
921
916
 
922
- // ../shared/dist/booking-defaults.js
917
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/booking-defaults.js
923
918
  var BOOKING_CREATE_PAYLOAD_LIMIT_BYTES = 16 * 1024;
924
919
 
925
- // ../shared/dist/bridge-protocol.js
920
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/bridge-protocol.js
926
921
  import { z as z17 } from "zod";
927
922
 
928
- // ../shared/dist/field-id.js
923
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/field-id.js
929
924
  import { z as z10 } from "zod";
930
925
  var FIELD_ID_PATTERN = /^[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+$/;
931
926
  var fieldIdSchema = z10.string().regex(FIELD_ID_PATTERN, "Invalid field id");
@@ -933,12 +928,12 @@ function isFieldId(value) {
933
928
  return typeof value === "string" && fieldIdSchema.safeParse(value).success;
934
929
  }
935
930
 
936
- // ../shared/dist/field-types.js
931
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/field-types.js
937
932
  import { z as z11 } from "zod";
938
933
  var FIELD_TYPES = ["text", "longText", "image", "link"];
939
934
  var fieldTypeSchema = z11.enum(FIELD_TYPES);
940
935
 
941
- // ../shared/dist/image-value.js
936
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/image-value.js
942
937
  import { z as z12 } from "zod";
943
938
  var SUPPORTED_IMAGE_CONTENT_TYPES = [
944
939
  "image/jpeg",
@@ -970,7 +965,7 @@ var imageValueSchema = z12.object({
970
965
  ]).optional()
971
966
  });
972
967
 
973
- // ../shared/dist/setup-deployment.js
968
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/setup-deployment.js
974
969
  import { z as z13 } from "zod";
975
970
  var version = z13.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
976
971
  var siteSetupPackagesSchema = z13.object({
@@ -1024,13 +1019,13 @@ var setupDeploymentInputSchema = z13.discriminatedUnion("action", [
1024
1019
  }).strict()
1025
1020
  ]);
1026
1021
 
1027
- // ../shared/dist/site-setup.js
1022
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/site-setup.js
1028
1023
  import { z as z16 } from "zod";
1029
1024
 
1030
- // ../shared/dist/site-field-contract.js
1025
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/site-field-contract.js
1031
1026
  import { z as z15 } from "zod";
1032
1027
 
1033
- // ../shared/dist/fallback-hash.js
1028
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/fallback-hash.js
1034
1029
  import { z as z14 } from "zod";
1035
1030
  var SAFE_REPRESENTATION_REASONS = [
1036
1031
  "asset_import_rewritten",
@@ -1252,7 +1247,7 @@ var SHA256_CONSTANTS = [
1252
1247
  3329325298
1253
1248
  ];
1254
1249
 
1255
- // ../shared/dist/site-field-contract.js
1250
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/site-field-contract.js
1256
1251
  var fieldContractVersion = "1.0.0";
1257
1252
  var scannerContractVersion = "1.0.0";
1258
1253
  var siteFieldStatusSchema = z15.enum(["hidden", "active"]);
@@ -1341,7 +1336,7 @@ function createSiteFieldContractHash(input) {
1341
1336
  return `sha256:${sha256Hex(payload)}`;
1342
1337
  }
1343
1338
 
1344
- // ../shared/dist/site-setup.js
1339
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/site-setup.js
1345
1340
  var SITE_SETUP_RUN_STATUSES = [
1346
1341
  "waiting_for_agent",
1347
1342
  "working",
@@ -1884,7 +1879,7 @@ var activateSetupModulesInputSchema = activateSiteSetupInputSchema.extend({
1884
1879
  ])
1885
1880
  }).strict();
1886
1881
 
1887
- // ../shared/dist/bridge-protocol.js
1882
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/bridge-protocol.js
1888
1883
  var BRIDGE_PROTOCOL_VERSION = 2;
1889
1884
  var bridgeRectSchema = z17.object({
1890
1885
  x: z17.number(),
@@ -2122,10 +2117,10 @@ var fieldBridgeMessageSchema = z17.discriminatedUnion("type", [
2122
2117
  fieldBridgeAnalyticsProbeResultSchema
2123
2118
  ]);
2124
2119
 
2125
- // ../shared/dist/commands.js
2120
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/commands.js
2126
2121
  import { z as z19 } from "zod";
2127
2122
 
2128
- // ../shared/dist/errors.js
2123
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/errors.js
2129
2124
  import { z as z18 } from "zod";
2130
2125
  var UI_ERROR_CATEGORIES = [
2131
2126
  "site_member",
@@ -2140,7 +2135,7 @@ var commandErrorPayloadSchema = z18.object({
2140
2135
  details: z18.record(z18.string(), z18.unknown()).optional()
2141
2136
  });
2142
2137
 
2143
- // ../shared/dist/commands.js
2138
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/commands.js
2144
2139
  var commandSuccessSchema = z19.object({
2145
2140
  ok: z19.literal(true),
2146
2141
  data: z19.unknown()
@@ -2154,7 +2149,7 @@ var commandResultSchema = z19.discriminatedUnion("ok", [
2154
2149
  commandErrorSchema
2155
2150
  ]);
2156
2151
 
2157
- // ../shared/dist/editor-settings.js
2152
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/editor-settings.js
2158
2153
  import { z as z20 } from "zod";
2159
2154
  var editorColorSchemeSchema = z20.enum([
2160
2155
  "paper",
@@ -2166,7 +2161,7 @@ var editorColorSchemes = editorColorSchemeSchema.options;
2166
2161
  var editorColorModeSchema = z20.enum(["light", "dark"]);
2167
2162
  var editorColorModes = editorColorModeSchema.options;
2168
2163
 
2169
- // ../shared/dist/site-slug.js
2164
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/site-slug.js
2170
2165
  import { z as z21 } from "zod";
2171
2166
  var SITE_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
2172
2167
  var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
@@ -2186,7 +2181,7 @@ var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
2186
2181
  ]);
2187
2182
  var siteSlugSchema = z21.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
2188
2183
 
2189
- // ../shared/dist/entitlements.js
2184
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/entitlements.js
2190
2185
  import { z as z22 } from "zod";
2191
2186
  var entitlementSnapshotSchema = z22.object({
2192
2187
  planKey: z22.string().trim().min(1),
@@ -2233,10 +2228,10 @@ var EARLY_ACCESS_PLAN = {
2233
2228
  bookingRemindersEnabled: true
2234
2229
  };
2235
2230
 
2236
- // ../shared/dist/first-party-image-upload.js
2231
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/first-party-image-upload.js
2237
2232
  var maxFirstPartyImageUploadBytes = 4 * 1024 * 1024;
2238
2233
 
2239
- // ../shared/dist/readiness.js
2234
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/readiness.js
2240
2235
  import { z as z23 } from "zod";
2241
2236
  var READINESS_CHECK_KEYS = [
2242
2237
  "agent_instructions_installed",
@@ -2255,7 +2250,7 @@ var READINESS_STATUSES = [
2255
2250
  var readinessCheckKeySchema = z23.enum(READINESS_CHECK_KEYS);
2256
2251
  var readinessStatusSchema = z23.enum(READINESS_STATUSES);
2257
2252
 
2258
- // ../shared/dist/site.js
2253
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/site.js
2259
2254
  import { z as z24 } from "zod";
2260
2255
  var SITE_STATUSES = [
2261
2256
  "setup",
@@ -2266,7 +2261,7 @@ var SITE_STATUSES = [
2266
2261
  var siteStatusSchema = z24.enum(SITE_STATUSES);
2267
2262
  var websiteUrlSchema = z24.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
2268
2263
 
2269
- // ../shared/dist/setup-assets.js
2264
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/setup-assets.js
2270
2265
  import { z as z25 } from "zod";
2271
2266
  var configureSetupAssetTargetInputSchema = z25.object({
2272
2267
  siteId: z25.string().uuid(),
@@ -2327,7 +2322,7 @@ var checkSetupAssetTargetInputSchema = z25.object({
2327
2322
  intent: z25.enum(["start", "poll"])
2328
2323
  }).strict();
2329
2324
 
2330
- // ../shared/dist/setup-installation.js
2325
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/setup-installation.js
2331
2326
  import { z as z26 } from "zod";
2332
2327
  var setupInstallationRequestSchema = z26.object({
2333
2328
  modules: siteSetupModulesSchema,
@@ -2338,7 +2333,7 @@ var setupInstallationRequestSchema = z26.object({
2338
2333
  }).strict()
2339
2334
  }).strict();
2340
2335
 
2341
- // ../shared/dist/setup-claim.js
2336
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/shared/dist/setup-claim.js
2342
2337
  import { z as z27 } from "zod";
2343
2338
  var setupClaimCodeSchema = z27.string().regex(/^[0-9A-HJKMNP-TV-Z]{8}$/u);
2344
2339
  var setupClaimBindingSchema = z27.object({
@@ -2379,7 +2374,7 @@ var setupClaimDenialSchema = z27.object({
2379
2374
  ])
2380
2375
  }).strict();
2381
2376
 
2382
- // ../cli/dist/analytics/manifest.js
2377
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/manifest.js
2383
2378
  async function readAnalyticsManifestFile(manifestPath) {
2384
2379
  return validateAnalyticsManifestInput(JSON.parse(await readFile(manifestPath, "utf8")));
2385
2380
  }
@@ -2394,10 +2389,10 @@ function validateAnalyticsManifestInput(input) {
2394
2389
  return redactAnalyticsManifest(analyticsManifestSchema.parse(input));
2395
2390
  }
2396
2391
 
2397
- // ../cli/dist/analytics/static-scan.js
2392
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/static-scan.js
2398
2393
  import ts from "typescript";
2399
2394
 
2400
- // ../cli/dist/analytics/booking-providers.js
2395
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/booking-providers.js
2401
2396
  function buildBookingProviderHintFromHref(href, mode, options = {}) {
2402
2397
  const url = parseStaticHttpUrl(href);
2403
2398
  if (!url) {
@@ -2457,7 +2452,7 @@ function normalizeHost(host) {
2457
2452
  return host.toLowerCase().replace(/\.$/u, "");
2458
2453
  }
2459
2454
 
2460
- // ../cli/dist/analytics/static-scan.js
2455
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/static-scan.js
2461
2456
  function scanAnalyticsSourceFiles(files, input) {
2462
2457
  const targets = [];
2463
2458
  const hardErrors = [];
@@ -2744,7 +2739,7 @@ function inferRoute(filePath) {
2744
2739
  return route ? `/${route}` : "/";
2745
2740
  }
2746
2741
 
2747
- // ../cli/dist/booking/manifest.js
2742
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/booking/manifest.js
2748
2743
  import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
2749
2744
  import { dirname as dirname2 } from "path";
2750
2745
  async function readBookingManifestFile(manifestPath) {
@@ -2787,7 +2782,7 @@ function collectRedactedBookingKeys(input, prefix = "") {
2787
2782
  });
2788
2783
  }
2789
2784
 
2790
- // ../cli/dist/booking/static-scan.js
2785
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/booking/static-scan.js
2791
2786
  function scanBookingSourceFiles(files, input) {
2792
2787
  const embeds = files.flatMap(scanBookingEmbedFile);
2793
2788
  const findings = embeds.map(createEmbedFoundIssue);
@@ -2901,7 +2896,7 @@ function escapeRegExp(value) {
2901
2896
  return value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
2902
2897
  }
2903
2898
 
2904
- // ../cli/dist/commands/analytics/check.js
2899
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/check.js
2905
2900
  import { readFile as readFile3 } from "fs/promises";
2906
2901
  async function analyticsCheckCommand(input) {
2907
2902
  const validatedManifest = await readAnalyticsManifestFile(input.manifestPath);
@@ -3040,7 +3035,7 @@ async function readCspWarnings(filePaths) {
3040
3035
  return warnings;
3041
3036
  }
3042
3037
 
3043
- // ../cli/dist/commands/analytics/init.js
3038
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/init.js
3044
3039
  import { mkdir as mkdir3, writeFile as writeFile3 } from "fs/promises";
3045
3040
  import { dirname as dirname3, join } from "path";
3046
3041
  async function analyticsInitCommand(input) {
@@ -3137,10 +3132,10 @@ alwaysApply: true
3137
3132
 
3138
3133
  ${analyticsRulesTemplate}`;
3139
3134
 
3140
- // ../cli/dist/commands/analytics/import.js
3135
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/import.js
3141
3136
  import { createHash } from "crypto";
3142
3137
 
3143
- // ../cli/dist/commands/analytics/sync.js
3138
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/sync.js
3144
3139
  async function analyticsSyncCommand(input) {
3145
3140
  const redacted = validateAnalyticsManifestInput(input.manifest);
3146
3141
  const fetcher = input.fetchImpl ?? fetch;
@@ -3166,7 +3161,7 @@ function createAnalyticsCliRequestHeaders(config) {
3166
3161
  return headers;
3167
3162
  }
3168
3163
 
3169
- // ../cli/dist/commands/analytics/import.js
3164
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/import.js
3170
3165
  async function analyticsImportCommand(input) {
3171
3166
  const payload = analyticsProviderImportSchema.parse(input.payload);
3172
3167
  const payloadHash = hashAnalyticsProviderImport(payload);
@@ -3192,7 +3187,7 @@ function hashAnalyticsProviderImport(payload) {
3192
3187
  return `sha256:${createHash("sha256").update(JSON.stringify(payload)).digest("hex")}`;
3193
3188
  }
3194
3189
 
3195
- // ../cli/dist/commands/analytics/readiness.js
3190
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/readiness.js
3196
3191
  async function analyticsReadinessCommand(input) {
3197
3192
  const fetcher = input.fetchImpl ?? fetch;
3198
3193
  return fetcher(`${input.config.apiBaseUrl.replace(/\/$/u, "")}/api/cli/analytics/readiness`, {
@@ -3202,7 +3197,7 @@ async function analyticsReadinessCommand(input) {
3202
3197
  });
3203
3198
  }
3204
3199
 
3205
- // ../cli/dist/commands/analytics/public-key.js
3200
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/public-key.js
3206
3201
  import { z as z28 } from "zod";
3207
3202
  var responseSchema = z28.object({
3208
3203
  ok: z28.literal(true),
@@ -3233,7 +3228,7 @@ async function analyticsPublicKeyCommand(input) {
3233
3228
  return parsed.data.data.rawPublicKey;
3234
3229
  }
3235
3230
 
3236
- // ../cli/dist/commands/analytics/prepare.js
3231
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/prepare.js
3237
3232
  import { z as z29 } from "zod";
3238
3233
  var resultSchema = z29.object({
3239
3234
  ok: z29.literal(true),
@@ -3270,7 +3265,7 @@ async function analyticsPrepareCommand(input) {
3270
3265
  return parsed.data.data;
3271
3266
  }
3272
3267
 
3273
- // ../cli/dist/commands/analytics/test.js
3268
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/test.js
3274
3269
  import { randomUUID } from "crypto";
3275
3270
  async function analyticsTestCommand(input) {
3276
3271
  const fetcher = input.fetchImpl ?? fetch;
@@ -3303,7 +3298,7 @@ async function analyticsTestCommand(input) {
3303
3298
  });
3304
3299
  }
3305
3300
 
3306
- // ../cli/dist/commands/booking/check.js
3301
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/check.js
3307
3302
  import { readFile as readFile4 } from "fs/promises";
3308
3303
  async function bookingCheckCommand(input) {
3309
3304
  const validatedManifest = await readBookingManifestFile(input.manifestPath);
@@ -3346,7 +3341,7 @@ function createBoundaryErrors2(validation) {
3346
3341
  }));
3347
3342
  }
3348
3343
 
3349
- // ../cli/dist/commands/booking/init.js
3344
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/init.js
3350
3345
  import { mkdir as mkdir4, writeFile as writeFile4 } from "fs/promises";
3351
3346
  import { dirname as dirname4, join as join2 } from "path";
3352
3347
  async function bookingInitCommand(input) {
@@ -3425,7 +3420,7 @@ alwaysApply: true
3425
3420
 
3426
3421
  ${bookingRulesTemplate}`;
3427
3422
 
3428
- // ../cli/dist/commands/booking/sync.js
3423
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/sync.js
3429
3424
  async function bookingSyncCommand(input) {
3430
3425
  const redacted = validateBookingManifestInput(input.manifest);
3431
3426
  const fetcher = input.fetchImpl ?? fetch;
@@ -3451,7 +3446,7 @@ function createBookingCliRequestHeaders(config) {
3451
3446
  return headers;
3452
3447
  }
3453
3448
 
3454
- // ../cli/dist/commands/booking/test.js
3449
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/test.js
3455
3450
  async function bookingTestCommand(input) {
3456
3451
  const fetcher = input.fetchImpl ?? fetch;
3457
3452
  const booking = bookingCreateRequestSchema.parse(input.booking);
@@ -3467,7 +3462,7 @@ async function bookingTestCommand(input) {
3467
3462
  });
3468
3463
  }
3469
3464
 
3470
- // ../cli/dist/config/project-config.js
3465
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/project-config.js
3471
3466
  import { access, chmod, open, readFile as readFile5, rename, rm } from "fs/promises";
3472
3467
  import { randomUUID as randomUUID2 } from "crypto";
3473
3468
  import { join as join3 } from "path";
@@ -3537,7 +3532,7 @@ async function writeJsonAtomically(path, value, mode) {
3537
3532
  }
3538
3533
  }
3539
3534
 
3540
- // ../cli/dist/config/credentials.js
3535
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/credentials.js
3541
3536
  import { execFile } from "child_process";
3542
3537
  import { randomUUID as randomUUID3 } from "crypto";
3543
3538
  import { chmod as chmod2, lstat, mkdir as mkdir5, open as open2, readFile as readFile6, rename as rename2, rm as rm2 } from "fs/promises";
@@ -3658,18 +3653,18 @@ async function gitPathMatches(projectDir, path, command) {
3658
3653
  }
3659
3654
  }
3660
3655
 
3661
- // ../cli/dist/commands/init.js
3656
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/init.js
3662
3657
  import { access as access3 } from "fs/promises";
3663
3658
  import { join as join7, relative as relative3 } from "path";
3664
3659
  import { z as z34 } from "zod";
3665
3660
 
3666
- // ../cli/dist/commands/setup-preflight.js
3661
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-preflight.js
3667
3662
  import { createHash as createHash2 } from "crypto";
3668
3663
  import semver from "semver";
3669
3664
  import { minimatch } from "minimatch";
3670
3665
  import { parse as parseYaml } from "yaml";
3671
3666
 
3672
- // ../cli/dist/config/installed-package.js
3667
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/installed-package.js
3673
3668
  import { createRequire } from "module";
3674
3669
  import { readFile as readFile7 } from "fs/promises";
3675
3670
  import { join as join5 } from "path";
@@ -3696,24 +3691,24 @@ async function assertExactSetupPackages(projectDir, packages) {
3696
3691
  dependencies: z32.record(z32.string(), z32.string()).optional(),
3697
3692
  devDependencies: z32.record(z32.string(), z32.string()).optional()
3698
3693
  }).parse(JSON.parse(await readFile7(join5(projectDir, "package.json"), "utf8")));
3699
- for (const [name2, version2] of [
3694
+ for (const [name2, version3] of [
3700
3695
  ["siteplane", packages.siteplane],
3701
3696
  ["@siteplane/runtime-next", packages.runtimeNext],
3702
3697
  ...packages.analytics ? [["@siteplane/analytics", packages.analytics]] : []
3703
3698
  ]) {
3704
3699
  const declared = manifest.dependencies?.[name2] ?? manifest.devDependencies?.[name2];
3705
3700
  const installed = await readInstalledPackage(projectDir, name2);
3706
- if (declared !== version2 || installed.version !== version2)
3701
+ if (declared !== version3 || installed.version !== version3)
3707
3702
  throw new Error("The installed Siteplane packages must match the current task's exact pins.");
3708
3703
  }
3709
3704
  }
3710
3705
 
3711
- // ../cli/dist/commands/setup-preflight.js
3706
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-preflight.js
3712
3707
  import { access as access2, readFile as readFile8, realpath, readdir, readlink } from "fs/promises";
3713
3708
  import { dirname as dirname6, join as join6, relative as relative2, resolve, sep } from "path";
3714
3709
  import { z as z33 } from "zod";
3715
3710
 
3716
- // ../cli/dist/commands/setup-process.js
3711
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-process.js
3717
3712
  import { spawn } from "child_process";
3718
3713
  var SetupFailure = class extends Error {
3719
3714
  code;
@@ -3811,7 +3806,7 @@ async function setupVercelApi(cwd, endpoint, body, method, options) {
3811
3806
  }
3812
3807
  }
3813
3808
 
3814
- // ../cli/dist/commands/setup-preflight.js
3809
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-preflight.js
3815
3810
  var manifestSchema = z33.object({
3816
3811
  packageManager: z33.string().optional(),
3817
3812
  engines: z33.object({ node: z33.string().optional() }).optional(),
@@ -3841,7 +3836,7 @@ var exists = async (path) => access2(path).then(() => true, () => false);
3841
3836
  var fail = (code, message) => {
3842
3837
  throw new SetupFailure(code, message);
3843
3838
  };
3844
- var stable = (version2, major) => new RegExp(`^${major}\\.\\d+\\.\\d+$`, "u").test(version2);
3839
+ var stable = (version3, major) => new RegExp(`^${major}\\.\\d+\\.\\d+$`, "u").test(version3);
3845
3840
  async function inspectSetupLocalProject(projectDir) {
3846
3841
  const projectDirectory = await realpath(resolve(projectDir));
3847
3842
  const manifest = manifestSchema.parse(JSON.parse(await readFile8(join6(projectDirectory, "package.json"), "utf8")));
@@ -3914,7 +3909,7 @@ async function inspectSetupLocalProject(projectDir) {
3914
3909
  peerDependencies: z33.record(z33.string(), z33.string()).optional()
3915
3910
  })).optional()
3916
3911
  }).parse(JSON.parse(lockText)) : null;
3917
- async function version2(name3) {
3912
+ async function version3(name3) {
3918
3913
  try {
3919
3914
  return (await readInstalledPackage(projectDirectory, name3)).version;
3920
3915
  } catch {
@@ -3925,9 +3920,9 @@ async function inspectSetupLocalProject(projectDir) {
3925
3920
  }
3926
3921
  }
3927
3922
  const [nextVersion, reactVersion, reactDomVersion] = await Promise.all([
3928
- version2("next"),
3929
- version2("react"),
3930
- version2("react-dom")
3923
+ version3("next"),
3924
+ version3("react"),
3925
+ version3("react-dom")
3931
3926
  ]);
3932
3927
  if (!stable(nextVersion, 16))
3933
3928
  fail("unsupported_next_version", "Setup supports stable Next.js 16 App Router projects. Framework migration requires a separate owner decision.");
@@ -4132,7 +4127,7 @@ function safeGitRemote(value) {
4132
4127
  }
4133
4128
  }
4134
4129
 
4135
- // ../cli/dist/commands/init.js
4130
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/init.js
4136
4131
  async function initCommand(input) {
4137
4132
  if (!input.setupToken.trim()) {
4138
4133
  throw new Error("A Siteplane setup token is required.");
@@ -4295,7 +4290,7 @@ function readErrorMessage(payload) {
4295
4290
  return null;
4296
4291
  }
4297
4292
 
4298
- // ../cli/dist/commands/scan.js
4293
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/scan.js
4299
4294
  import { readdir as readdir2 } from "fs/promises";
4300
4295
  import { extname, join as join8 } from "path";
4301
4296
  var defaultScanRoots = ["app", "src", "pages", "components", "lib"];
@@ -4336,13 +4331,13 @@ async function collectSourceFiles(directory) {
4336
4331
  return files;
4337
4332
  }
4338
4333
 
4339
- // ../cli/dist/commands/site-setup.js
4334
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/site-setup.js
4340
4335
  import { execFile as execFile2 } from "child_process";
4341
4336
  import { readFile as readFile9 } from "fs/promises";
4342
4337
  import { promisify as promisify2 } from "util";
4343
4338
  import { z as z35 } from "zod";
4344
4339
 
4345
- // ../cli/dist/scan/next-source-scan.js
4340
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/scan/next-source-scan.js
4346
4341
  import ts2 from "typescript";
4347
4342
  import { isAbsolute, relative as relative4 } from "path";
4348
4343
  var eventPreviewHandlerMissingMessage = "Event preview fields must consume preview values with useSiteplanePreviewText from @siteplane/runtime-next/client or a siteplane:preview-value-applied listener.";
@@ -5043,7 +5038,7 @@ function isPositionalFieldReference(value) {
5043
5038
  return value ? /\[\d+\]|\.\d+(?:\.|$)/.test(value) : false;
5044
5039
  }
5045
5040
 
5046
- // ../cli/dist/commands/site-setup.js
5041
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/site-setup.js
5047
5042
  var execFileAsync2 = promisify2(execFile2);
5048
5043
  var safeErrorSchema = z35.object({
5049
5044
  code: z35.string().trim().min(1),
@@ -5241,7 +5236,7 @@ async function siteSetupActivityCommand(input) {
5241
5236
  return response.ok && parsed.success ? parsed.data.data : actionRequired(response.payload, "Setup activity could not be recorded.");
5242
5237
  }
5243
5238
 
5244
- // ../cli/dist/commands/setup-start.js
5239
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-start.js
5245
5240
  import { randomBytes, randomUUID as randomUUID4 } from "crypto";
5246
5241
  import { access as access4 } from "fs/promises";
5247
5242
  import { join as join9, relative as relative5 } from "path";
@@ -5374,7 +5369,7 @@ async function exists2(path) {
5374
5369
  }
5375
5370
  }
5376
5371
 
5377
- // ../cli/dist/commands/setup-review.js
5372
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-review.js
5378
5373
  import { z as z37 } from "zod";
5379
5374
  var responseSchema2 = z37.object({
5380
5375
  ok: z37.literal(true),
@@ -5459,7 +5454,7 @@ async function setupReviewCommand(input) {
5459
5454
  }
5460
5455
  }
5461
5456
 
5462
- // ../cli/dist/commands/setup-prepare.js
5457
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-prepare.js
5463
5458
  import { access as access5, lstat as lstat2, mkdir as mkdir6, open as open3, readFile as readFile10, rename as rename3, rm as rm3 } from "fs/promises";
5464
5459
  import { randomUUID as randomUUID5 } from "crypto";
5465
5460
  import { dirname as dirname7, join as join10, relative as relative6, sep as sep2 } from "path";
@@ -5479,8 +5474,8 @@ async function setupPrepareCommand(input) {
5479
5474
  if (context.status !== "ok")
5480
5475
  return context;
5481
5476
  const task = context.task;
5482
- if (task.site?.siteId !== config.siteId || task.run?.runId !== config.runId || task.packages.siteplane !== config.packages.siteplane || task.packages.analytics !== config.packages.analytics || task.packages.runtimeNext !== config.packages.runtimeNext) {
5483
- throw new SetupFailure("setup_contract_conflict", "The local configuration does not match this server task and its exact package versions.");
5477
+ if (task.site?.siteId !== config.siteId || task.run?.runId !== config.runId) {
5478
+ throw new SetupFailure("setup_contract_conflict", "The local configuration does not match this server task's site and setup run.");
5484
5479
  }
5485
5480
  if (task.run.status === "completed" || task.run.status === "ready_for_review")
5486
5481
  return {
@@ -5597,7 +5592,8 @@ ${layoutSource.slice(0, point)}<SiteplaneBridge />${layoutSource.slice(point)}`)
5597
5592
  files.set(nextPath, `import { withSiteplane } from "siteplane/next";
5598
5593
  ${nextSource.slice(0, expression.getStart(ast))}withSiteplane(${expression.getText(ast)})${nextSource.slice(expression.end)}`);
5599
5594
  }
5600
- files.set(join10(directory, ".siteplane/setup-guide-v2.md"), `# Siteplane setup task v2
5595
+ const guidePath = join10(directory, ".siteplane/setup-guide-v2.md");
5596
+ files.set(guidePath, `# Siteplane setup task v2
5601
5597
 
5602
5598
  ${task.goal}
5603
5599
 
@@ -5608,11 +5604,13 @@ ${task.discovery.rules.map((rule) => `- ${rule}`).join("\n")}
5608
5604
  Run setup context for the current user instructions and authorized modules. Keep the user instructions distinct from your selection summary. Use setup deploy --wait for environment transfer and deployment; never read or print credential values. For image fields, withSiteplane prepares the exact Siteplane asset route and the website /siteplane-assets/ path in Next Image and existing img-src policies at build time. This grants no hosting permission. Preserve existing image sources; explicitly resolve custom loaders, redirect dependencies, or CSP written by middleware/proxy/meta tags before deployment. Use the provider-selected public SITEPLANE_SITE_ORIGIN for local builds.
5609
5605
  `);
5610
5606
  for (const [path, content] of files) {
5611
- if (path === layoutPath || path === nextPath)
5607
+ if (path === layoutPath || path === nextPath || path === guidePath)
5612
5608
  continue;
5613
5609
  if (await exists3(path) && await readFile10(path, "utf8") !== content)
5614
5610
  throw new SetupFailure("owned_file_conflict", `Preserve the existing ${relative6(directory, path)} and reconcile its integration with the current Siteplane guide before retrying.`);
5615
5611
  }
5612
+ files.set(configPath, `${JSON.stringify({ ...config, packages: task.packages }, null, 2)}
5613
+ `);
5616
5614
  for (const path of files.keys())
5617
5615
  await assertSourcePath(directory, path);
5618
5616
  const before = /* @__PURE__ */ new Map();
@@ -5729,7 +5727,7 @@ async function assertSourcePath(root, target) {
5729
5727
  }
5730
5728
  }
5731
5729
 
5732
- // ../cli/dist/commands/setup-lock.js
5730
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-lock.js
5733
5731
  import { randomUUID as randomUUID6 } from "crypto";
5734
5732
  import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
5735
5733
  import { resolve as resolve2 } from "path";
@@ -5792,7 +5790,7 @@ function locked() {
5792
5790
  return new SetupFailure("setup_process_active", "Another setup process owns this repository. Wait for it to finish; a live lock is never replaced.");
5793
5791
  }
5794
5792
 
5795
- // ../cli/dist/config/build-provenance.js
5793
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/build-provenance.js
5796
5794
  import { createHash as createHash3 } from "crypto";
5797
5795
  import { execFile as execFile3 } from "child_process";
5798
5796
  import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
@@ -5858,7 +5856,7 @@ async function writeBuildProvenance(checkout, revision) {
5858
5856
  await writeFile5(target, JSON.stringify(record), { flag: "wx", mode: 384 });
5859
5857
  }
5860
5858
 
5861
- // ../cli/dist/commands/setup-deploy.js
5859
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-deploy.js
5862
5860
  import { createHash as createHash4, randomBytes as randomBytes2, randomUUID as randomUUID7 } from "crypto";
5863
5861
  import { access as access6, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
5864
5862
  import { tmpdir } from "os";
@@ -6329,7 +6327,7 @@ async function setupDeployCommand(input, deps = defaults) {
6329
6327
  }
6330
6328
  }
6331
6329
 
6332
- // ../cli/dist/commands/setup-claim.js
6330
+ // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-claim.js
6333
6331
  import { z as z41 } from "zod";
6334
6332
  async function setupClaimCommand(input) {
6335
6333
  const code = setupClaimCodeSchema.safeParse(input.code);
@@ -6411,6 +6409,2100 @@ function required(code, message) {
6411
6409
  return { status: "action_required", code, message };
6412
6410
  }
6413
6411
 
6412
+ // ../shared/dist/actors.js
6413
+ import { z as z42 } from "zod";
6414
+ var ACTOR_TYPES2 = ["workspace_member", "site_member", "agent", "setup_guest", "system"];
6415
+ var actorTypeSchema2 = z42.enum(ACTOR_TYPES2);
6416
+
6417
+ // ../shared/dist/analytics-defaults.js
6418
+ var ANALYTICS_BATCH_LIMITS2 = {
6419
+ maxEventsPerRequest: 50,
6420
+ maxJsonBodyBytes: 64 * 1024,
6421
+ maxPropertiesJsonBytes: 8 * 1024
6422
+ };
6423
+ var ANALYTICS_RETENTION_DEFAULTS2 = {
6424
+ enabledRawEventRetentionDays: 30,
6425
+ higherTierRawEventRetentionDays: 90,
6426
+ maxRawEventRetentionDaysWithoutAdr: 180,
6427
+ diagnosticsRetentionDays: 30,
6428
+ rateLimitBucketRetentionDays: 2,
6429
+ lateEventWindowHours: 72
6430
+ };
6431
+
6432
+ // ../shared/dist/analytics-booking.js
6433
+ import { z as z43 } from "zod";
6434
+ var bookingProviders2 = ["treatwell", "beautinda", "other"];
6435
+ var bookingAttributionModes2 = [
6436
+ "outbound_click_and_utm",
6437
+ "provider_redirect",
6438
+ "provider_reported",
6439
+ "manual_import",
6440
+ "verified_webhook"
6441
+ ];
6442
+ var bookingSignalSources2 = [
6443
+ "outbound_click",
6444
+ "provider_redirect",
6445
+ "provider_reported",
6446
+ "manual_import",
6447
+ "verified_webhook"
6448
+ ];
6449
+ var bookingAttributionConfidences2 = [
6450
+ "provider_redirect",
6451
+ "provider_reported",
6452
+ "manual_import",
6453
+ "verified_webhook"
6454
+ ];
6455
+ var bookingProviderSchema2 = z43.enum(bookingProviders2);
6456
+ var bookingAttributionModeSchema2 = z43.enum(bookingAttributionModes2);
6457
+ var bookingSignalSourceSchema2 = z43.enum(bookingSignalSources2);
6458
+ var bookingAttributionConfidenceSchema2 = z43.enum(bookingAttributionConfidences2);
6459
+ var bookingProviderHintSchema2 = z43.object({
6460
+ bookingProvider: bookingProviderSchema2,
6461
+ bookingUrlHost: z43.string().min(1).max(253),
6462
+ bookingAttributionMode: bookingAttributionModeSchema2,
6463
+ utmContent: z43.string().min(1).max(200).optional(),
6464
+ successCondition: z43.literal("redirect_status=succeeded").optional()
6465
+ }).superRefine((hint, context) => {
6466
+ if (hint.successCondition !== void 0 && hint.bookingAttributionMode !== "provider_redirect") {
6467
+ context.addIssue({
6468
+ code: "custom",
6469
+ message: "successCondition is allowed only for provider_redirect booking hints.",
6470
+ path: ["successCondition"]
6471
+ });
6472
+ }
6473
+ });
6474
+
6475
+ // ../shared/dist/analytics-contract.js
6476
+ import { z as z44 } from "zod";
6477
+ var ANALYTICS_IMPORT_SCHEMA_VERSION2 = "analytics-provider-import.v1";
6478
+ var analyticsImportTargetIdSchema2 = z44.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u);
6479
+ var analyticsProviderImportRowSchema2 = z44.object({
6480
+ targetId: analyticsImportTargetIdSchema2,
6481
+ occurredAt: z44.string().datetime({ offset: true }),
6482
+ attributionConfidence: z44.enum(["provider_reported", "manual_import"]),
6483
+ providerEventId: z44.string().trim().min(1).max(160).optional(),
6484
+ idempotencyKey: z44.string().trim().min(1).max(160).optional()
6485
+ }).strict().superRefine((row, context) => {
6486
+ if (!row.providerEventId && !row.idempotencyKey) {
6487
+ context.addIssue({
6488
+ code: "custom",
6489
+ message: "Each import row requires providerEventId or idempotencyKey.",
6490
+ path: ["providerEventId"]
6491
+ });
6492
+ }
6493
+ });
6494
+ var analyticsProviderImportSchema2 = z44.object({
6495
+ schemaVersion: z44.literal(ANALYTICS_IMPORT_SCHEMA_VERSION2),
6496
+ provider: z44.enum(["treatwell", "beautinda", "other"]),
6497
+ sourceName: z44.string().trim().min(1).max(160).optional(),
6498
+ rows: z44.array(analyticsProviderImportRowSchema2).min(1).max(1e3)
6499
+ }).strict();
6500
+
6501
+ // ../shared/dist/analytics-config.js
6502
+ import { z as z45 } from "zod";
6503
+ var ANALYTICS_CONFIG_LEASE_MS2 = 6e4;
6504
+ var analyticsMeasurementConfigSchema2 = z45.object({
6505
+ version: z45.literal(1),
6506
+ installationGeneration: z45.number().int().positive(),
6507
+ configRevision: z45.number().int().positive(),
6508
+ effectiveSiteMode: z45.enum(["disabled", "session_only", "full_analytics"]),
6509
+ measurementEnabled: z45.boolean(),
6510
+ issuedAt: z45.string().datetime({ offset: true }),
6511
+ expiresAt: z45.string().datetime({ offset: true })
6512
+ }).strict().superRefine((config, context) => {
6513
+ const lifetime = Date.parse(config.expiresAt) - Date.parse(config.issuedAt);
6514
+ if (lifetime <= 0 || lifetime > ANALYTICS_CONFIG_LEASE_MS2) {
6515
+ context.addIssue({
6516
+ code: "custom",
6517
+ path: ["expiresAt"],
6518
+ message: "Measurement permission must expire within 60 seconds."
6519
+ });
6520
+ }
6521
+ if (config.measurementEnabled !== (config.effectiveSiteMode !== "disabled")) {
6522
+ context.addIssue({
6523
+ code: "custom",
6524
+ path: ["measurementEnabled"],
6525
+ message: "Measurement permission must match the effective site mode."
6526
+ });
6527
+ }
6528
+ });
6529
+
6530
+ // ../shared/dist/analytics-events.js
6531
+ import { z as z46 } from "zod";
6532
+ var ANALYTICS_SCHEMA_VERSION2 = "analytics.v1";
6533
+ var ANALYTICS_KEY_PATTERN = /^(pk|sk)_siteplane_([A-Za-z0-9_-]{16})_[A-Za-z0-9_-]{43}$/;
6534
+ var analyticsSessionIdSchema2 = z46.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
6535
+ var analyticsVisitorIdSchema2 = z46.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
6536
+ var analyticsPersistedIdentityHashSchema2 = z46.string().regex(/^[a-f0-9]{64}$/u);
6537
+ var analyticsEventNames2 = [
6538
+ "page_view",
6539
+ "section_view",
6540
+ "cta_click",
6541
+ "outbound_click",
6542
+ "email_click",
6543
+ "phone_click",
6544
+ "file_download",
6545
+ "form_start",
6546
+ "form_submit",
6547
+ "form_error",
6548
+ "lead_created",
6549
+ "checkout_started",
6550
+ "conversion",
6551
+ "checkout_completed",
6552
+ "payment_succeeded",
6553
+ "subscription_started",
6554
+ "purchase_completed",
6555
+ "trial_started"
6556
+ ];
6557
+ var serverOnlyAnalyticsEvents2 = [
6558
+ "checkout_completed",
6559
+ "payment_succeeded",
6560
+ "subscription_started",
6561
+ "purchase_completed",
6562
+ "trial_started"
6563
+ ];
6564
+ var analyticsEventSources2 = [
6565
+ "browser",
6566
+ "server",
6567
+ "test",
6568
+ "editor_preview",
6569
+ "system"
6570
+ ];
6571
+ var analyticsIngestionChannels2 = [
6572
+ "browser_collector",
6573
+ "server_sdk",
6574
+ "provider_endpoint",
6575
+ "provider_import",
6576
+ "test",
6577
+ "editor_preview",
6578
+ "system_job"
6579
+ ];
6580
+ var analyticsTargetTypes2 = [
6581
+ "cta",
6582
+ "form",
6583
+ "section",
6584
+ "file",
6585
+ "link",
6586
+ "conversion",
6587
+ "server_conversion"
6588
+ ];
6589
+ var analyticsDataAttributeEvents2 = [
6590
+ "cta_click",
6591
+ "outbound_click",
6592
+ "email_click",
6593
+ "phone_click",
6594
+ "file_download",
6595
+ "section_view",
6596
+ "checkout_started",
6597
+ "form"
6598
+ ];
6599
+ var analyticsDeviceTypes2 = [
6600
+ "desktop",
6601
+ "tablet",
6602
+ "mobile",
6603
+ "unknown"
6604
+ ];
6605
+ var analyticsBotClassifications2 = [
6606
+ "normal",
6607
+ "known_bot",
6608
+ "suspicious",
6609
+ "invalid"
6610
+ ];
6611
+ var analyticsValidityStatuses2 = [
6612
+ "accepted",
6613
+ "rejected",
6614
+ "ignored"
6615
+ ];
6616
+ var analyticsEventNameSchema2 = z46.enum(analyticsEventNames2);
6617
+ var serverOnlyAnalyticsEventSchema2 = z46.enum(serverOnlyAnalyticsEvents2);
6618
+ var analyticsEventSourceSchema2 = z46.enum(analyticsEventSources2);
6619
+ var analyticsIngestionChannelSchema2 = z46.enum(analyticsIngestionChannels2);
6620
+ var analyticsTargetTypeSchema2 = z46.enum(analyticsTargetTypes2);
6621
+ var analyticsDataAttributeEventSchema2 = z46.enum(analyticsDataAttributeEvents2);
6622
+ var analyticsDeviceTypeSchema2 = z46.enum(analyticsDeviceTypes2);
6623
+ var analyticsBotClassificationSchema2 = z46.enum(analyticsBotClassifications2);
6624
+ var analyticsValidityStatusSchema2 = z46.enum(analyticsValidityStatuses2);
6625
+ var analyticsPropertiesSchema2 = z46.record(z46.string(), z46.unknown());
6626
+ var analyticsTimestampSchema2 = z46.string().datetime({ offset: true });
6627
+ var analyticsBrowserEventSchema2 = z46.object({
6628
+ eventId: z46.string().min(1).max(160),
6629
+ installationGeneration: z46.number().int().positive().optional(),
6630
+ measurementMode: z46.enum(["session_only", "full_analytics"]).optional(),
6631
+ eventName: analyticsEventNameSchema2,
6632
+ eventSource: analyticsEventSourceSchema2.optional().default("browser"),
6633
+ targetId: z46.string().min(1).max(160).optional(),
6634
+ targetType: analyticsTargetTypeSchema2.optional(),
6635
+ visitorId: analyticsVisitorIdSchema2.optional(),
6636
+ sessionId: analyticsSessionIdSchema2,
6637
+ idempotencyKey: z46.string().min(1).max(240).optional(),
6638
+ occurredAt: analyticsTimestampSchema2,
6639
+ pageUrl: z46.string().url().max(2048).optional(),
6640
+ pagePath: z46.string().min(1).max(1024).optional(),
6641
+ routeTemplate: z46.string().min(1).max(1024).optional(),
6642
+ referrer: z46.string().url().max(2048).optional(),
6643
+ utmSource: z46.string().min(1).max(200).optional(),
6644
+ utmMedium: z46.string().min(1).max(200).optional(),
6645
+ utmCampaign: z46.string().min(1).max(200).optional(),
6646
+ utmContent: z46.string().min(1).max(200).optional(),
6647
+ utmTerm: z46.string().min(1).max(200).optional(),
6648
+ deviceType: analyticsDeviceTypeSchema2.optional(),
6649
+ browserName: z46.string().min(1).max(120).optional(),
6650
+ osName: z46.string().min(1).max(120).optional(),
6651
+ country: z46.string().min(1).max(80).optional(),
6652
+ region: z46.string().min(1).max(120).optional(),
6653
+ properties: analyticsPropertiesSchema2.optional().default({})
6654
+ }).superRefine((event, context) => {
6655
+ if (isServerOnlyAnalyticsEvent2(event.eventName)) {
6656
+ context.addIssue({
6657
+ code: "custom",
6658
+ message: "Browser analytics payloads cannot contain server-only events.",
6659
+ path: ["eventName"]
6660
+ });
6661
+ }
6662
+ if (event.eventSource === "server" || event.eventSource === "system") {
6663
+ context.addIssue({
6664
+ code: "custom",
6665
+ message: "Browser analytics payloads cannot use server/system sources.",
6666
+ path: ["eventSource"]
6667
+ });
6668
+ }
6669
+ if (event.targetType === "server_conversion") {
6670
+ context.addIssue({
6671
+ code: "custom",
6672
+ message: "Browser analytics payloads cannot use server conversion targets.",
6673
+ path: ["targetType"]
6674
+ });
6675
+ }
6676
+ });
6677
+ var analyticsBrowserEventPayloadSchema2 = z46.object({
6678
+ siteKey: z46.string().min(1),
6679
+ schemaVersion: z46.literal(ANALYTICS_SCHEMA_VERSION2),
6680
+ mode: z46.enum(["live", "test"]).optional().default("live"),
6681
+ events: z46.array(analyticsBrowserEventSchema2).min(1).max(50)
6682
+ });
6683
+ var analyticsNormalizedEventBaseSchema2 = z46.object({
6684
+ site_id: z46.string().uuid(),
6685
+ event_id: z46.string().min(1).max(160),
6686
+ schema_version: z46.literal(ANALYTICS_SCHEMA_VERSION2),
6687
+ event_name: analyticsEventNameSchema2,
6688
+ event_source: analyticsEventSourceSchema2,
6689
+ ingestion_channel: analyticsIngestionChannelSchema2,
6690
+ target_id: z46.string().min(1).max(160).nullable().optional(),
6691
+ target_type: analyticsTargetTypeSchema2.nullable().optional(),
6692
+ dedupe_key: z46.string().regex(/^analytics_dedupe_v1_[a-f0-9]{64}$/u).nullable().optional(),
6693
+ idempotency_key: z46.string().min(1).max(240).nullable().optional(),
6694
+ bot_classification: analyticsBotClassificationSchema2,
6695
+ validity_status: analyticsValidityStatusSchema2,
6696
+ rejection_reason: z46.string().min(1).max(240).nullable().optional(),
6697
+ occurred_at: analyticsTimestampSchema2,
6698
+ received_at: analyticsTimestampSchema2,
6699
+ page_url: z46.string().url().max(2048).nullable().optional(),
6700
+ page_path: z46.string().min(1).max(1024).nullable().optional(),
6701
+ route_template: z46.string().min(1).max(1024).nullable().optional(),
6702
+ referrer: z46.string().url().max(2048).nullable().optional(),
6703
+ utm_source: z46.string().min(1).max(200).nullable().optional(),
6704
+ utm_medium: z46.string().min(1).max(200).nullable().optional(),
6705
+ utm_campaign: z46.string().min(1).max(200).nullable().optional(),
6706
+ utm_content: z46.string().min(1).max(200).nullable().optional(),
6707
+ utm_term: z46.string().min(1).max(200).nullable().optional(),
6708
+ country: z46.string().min(1).max(80).nullable().optional(),
6709
+ region: z46.string().min(1).max(120).nullable().optional(),
6710
+ device_type: analyticsDeviceTypeSchema2,
6711
+ browser_name: z46.string().min(1).max(120).nullable().optional(),
6712
+ os_name: z46.string().min(1).max(120).nullable().optional(),
6713
+ provider: z46.string().min(1).max(120).nullable().optional(),
6714
+ provider_event_id: z46.string().min(1).max(240).nullable().optional(),
6715
+ properties: analyticsPropertiesSchema2
6716
+ });
6717
+ var analyticsRawNormalizedEventSchema2 = analyticsNormalizedEventBaseSchema2.extend({
6718
+ visitor_id: analyticsVisitorIdSchema2.nullable().optional(),
6719
+ session_id: analyticsSessionIdSchema2.nullable().optional()
6720
+ });
6721
+ var analyticsNormalizedEventSchema2 = analyticsNormalizedEventBaseSchema2.extend({
6722
+ visitor_id: analyticsPersistedIdentityHashSchema2.nullable().optional(),
6723
+ session_id: analyticsPersistedIdentityHashSchema2.nullable().optional()
6724
+ });
6725
+ function isServerOnlyAnalyticsEvent2(eventName) {
6726
+ return serverOnlyAnalyticsEvents2.includes(eventName);
6727
+ }
6728
+ function getAnalyticsKeyLookup(rawKey) {
6729
+ const match = ANALYTICS_KEY_PATTERN.exec(rawKey);
6730
+ return match ? `${match[1]}_siteplane_${match[2]}` : null;
6731
+ }
6732
+
6733
+ // ../shared/dist/analytics-manifest.js
6734
+ import { z as z47 } from "zod";
6735
+ var analyticsTargetIdSchema2 = z47.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
6736
+ message: "Analytics target IDs must be stable identifiers without whitespace or visible copy."
6737
+ });
6738
+ var analyticsManifestRecordSchema2 = z47.record(z47.string(), z47.unknown());
6739
+ var analyticsFormPurposes2 = [
6740
+ "contact",
6741
+ "lead",
6742
+ "newsletter",
6743
+ "search",
6744
+ "login",
6745
+ "other"
6746
+ ];
6747
+ var analyticsFormPurposeSchema2 = z47.enum(analyticsFormPurposes2);
6748
+ var analyticsManifestRouteSchema2 = z47.object({
6749
+ path: z47.string().min(1).max(1024),
6750
+ pageType: z47.string().min(1).max(120).optional(),
6751
+ label: z47.string().min(1).max(200).optional()
6752
+ }).passthrough();
6753
+ var analyticsManifestTargetSchema2 = z47.object({
6754
+ id: analyticsTargetIdSchema2,
6755
+ type: analyticsTargetTypeSchema2,
6756
+ event: analyticsEventNameSchema2.optional(),
6757
+ events: z47.array(analyticsEventNameSchema2).min(1).max(20).optional(),
6758
+ route: z47.string().min(1).max(1024).optional(),
6759
+ label: z47.string().min(1).max(200).optional(),
6760
+ description: z47.string().min(1).max(1e3).optional(),
6761
+ autoActive: z47.boolean().optional(),
6762
+ sourceHints: analyticsManifestRecordSchema2.optional()
6763
+ }).passthrough().superRefine((target, context) => {
6764
+ if (target.event === void 0 && target.events === void 0) {
6765
+ context.addIssue({
6766
+ code: "custom",
6767
+ message: "Analytics targets require event or events.",
6768
+ path: ["event"]
6769
+ });
6770
+ }
6771
+ if (target.event !== void 0 && target.events !== void 0) {
6772
+ context.addIssue({
6773
+ code: "custom",
6774
+ message: "Analytics targets must use event or events, never both.",
6775
+ path: ["events"]
6776
+ });
6777
+ }
6778
+ if (target.type === "form" && !analyticsFormPurposeSchema2.safeParse(target.sourceHints?.formPurpose).success) {
6779
+ context.addIssue({
6780
+ code: "custom",
6781
+ message: "Analytics form targets require a typed sourceHints.formPurpose.",
6782
+ path: ["sourceHints", "formPurpose"]
6783
+ });
6784
+ }
6785
+ });
6786
+ var analyticsManifestSchema2 = z47.object({
6787
+ schemaVersion: z47.literal(ANALYTICS_SCHEMA_VERSION2),
6788
+ siteId: z47.string().min(1),
6789
+ siteKeyRef: z47.string().regex(/^env:[A-Z][A-Z0-9_]*$/u, {
6790
+ message: "siteKeyRef must be an environment-variable reference."
6791
+ }),
6792
+ siteKeyLookup: z47.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}$/),
6793
+ routes: z47.array(analyticsManifestRouteSchema2),
6794
+ targets: z47.array(analyticsManifestTargetSchema2),
6795
+ metadata: analyticsManifestRecordSchema2.optional(),
6796
+ siteKey: z47.string().optional(),
6797
+ secretKey: z47.string().optional(),
6798
+ rawKey: z47.string().optional(),
6799
+ token: z47.string().optional(),
6800
+ accessToken: z47.string().optional()
6801
+ }).passthrough().superRefine((manifest, context) => {
6802
+ const targetIds = /* @__PURE__ */ new Set();
6803
+ for (const [index, target] of manifest.targets.entries()) {
6804
+ if (targetIds.has(target.id)) {
6805
+ context.addIssue({
6806
+ code: "custom",
6807
+ message: `Duplicate analytics target ID: ${target.id}`,
6808
+ path: ["targets", index, "id"]
6809
+ });
6810
+ }
6811
+ targetIds.add(target.id);
6812
+ }
6813
+ for (const issue of findUnsafeSecretReferences2(manifest)) {
6814
+ context.addIssue({
6815
+ code: "custom",
6816
+ message: "Raw secret material is not allowed in analytics manifests.",
6817
+ path: issue
6818
+ });
6819
+ }
6820
+ });
6821
+ var secretValuePattern2 = /(?:\bsk_(?:live|test)_|\bcpb_|\bpmt_(?:pc|setup|cli)_|\bservice_role\b|bearer\s+[a-z0-9._~-]+)/iu;
6822
+ function findUnsafeSecretReferences2(value, path = []) {
6823
+ if (Array.isArray(value)) {
6824
+ return value.flatMap((item, index) => findUnsafeSecretReferences2(item, [...path, index]));
6825
+ }
6826
+ if (!isPlainRecord2(value)) {
6827
+ return [];
6828
+ }
6829
+ return Object.entries(value).flatMap(([key, childValue]) => {
6830
+ const childPath = [...path, key];
6831
+ const referenceLikeKey = /(?:ref|lookup|prefix)$/iu.test(key);
6832
+ const unsafeHere = referenceLikeKey && typeof childValue === "string" && secretValuePattern2.test(childValue);
6833
+ return [
6834
+ ...unsafeHere ? [childPath] : [],
6835
+ ...findUnsafeSecretReferences2(childValue, childPath)
6836
+ ];
6837
+ });
6838
+ }
6839
+ function isPlainRecord2(value) {
6840
+ return typeof value === "object" && value !== null;
6841
+ }
6842
+
6843
+ // ../shared/dist/analytics-metrics.js
6844
+ import { z as z48 } from "zod";
6845
+ var analyticsVisitorQualities2 = ["exact", "estimated"];
6846
+ var analyticsVisitorQualitySchema2 = z48.enum(analyticsVisitorQualities2);
6847
+ var analyticsKpiKeys2 = [
6848
+ "pageViews",
6849
+ "sessions",
6850
+ "visitors",
6851
+ "estimatedVisitors",
6852
+ "inquiries",
6853
+ "leads",
6854
+ "conversions",
6855
+ "conversionRate",
6856
+ "inquiryRate"
6857
+ ];
6858
+ var analyticsKpiKeySchema2 = z48.enum(analyticsKpiKeys2);
6859
+
6860
+ // ../shared/dist/analytics-privacy.js
6861
+ var serverPropertySchemas2 = {
6862
+ lead_created: {
6863
+ conversionId: "identifier",
6864
+ formId: "identifier",
6865
+ formType: "enum",
6866
+ customerRef: "identifier"
6867
+ },
6868
+ conversion: {
6869
+ conversionId: "identifier",
6870
+ conversionType: "enum",
6871
+ attributionConfidence: "enum",
6872
+ bookingSignalSource: "enum",
6873
+ bookingProvider: "enum",
6874
+ redirectStatus: "enum",
6875
+ importId: "identifier"
6876
+ },
6877
+ checkout_completed: revenuePropertySchema2(),
6878
+ payment_succeeded: revenuePropertySchema2(),
6879
+ subscription_started: revenuePropertySchema2(),
6880
+ purchase_completed: revenuePropertySchema2(),
6881
+ trial_started: revenuePropertySchema2()
6882
+ };
6883
+ function revenuePropertySchema2() {
6884
+ return {
6885
+ conversionId: "identifier",
6886
+ checkoutId: "identifier",
6887
+ customerRef: "identifier",
6888
+ amount: "amount",
6889
+ currency: "enum",
6890
+ planId: "identifier",
6891
+ productId: "identifier"
6892
+ };
6893
+ }
6894
+
6895
+ // ../shared/dist/assets.js
6896
+ import { z as z49 } from "zod";
6897
+ var ASSET_STAGES2 = ["staging", "final", "deleted"];
6898
+ var ASSET_VISIBILITIES2 = ["private", "public", "deleted"];
6899
+ var ASSET_USAGE_ENTITY_TYPES2 = [
6900
+ "branding",
6901
+ "draft",
6902
+ "change_set",
6903
+ "published_value"
6904
+ ];
6905
+ var assetStageSchema2 = z49.enum(ASSET_STAGES2);
6906
+ var assetVisibilitySchema2 = z49.enum(ASSET_VISIBILITIES2);
6907
+ var assetUsageEntityTypeSchema2 = z49.enum(ASSET_USAGE_ENTITY_TYPES2);
6908
+ var brandingAccentColorSchema2 = z49.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
6909
+
6910
+ // ../shared/dist/booking-contracts.js
6911
+ import { z as z50 } from "zod";
6912
+ var bookingStatuses2 = [
6913
+ "pending_payment",
6914
+ "confirmed",
6915
+ "payment_expired",
6916
+ "cancelled",
6917
+ "no_show"
6918
+ ];
6919
+ var bookingPaymentStatuses2 = [
6920
+ "payment_not_required",
6921
+ "checkout_open",
6922
+ "processing",
6923
+ "succeeded",
6924
+ "failed",
6925
+ "cancelled",
6926
+ "expired"
6927
+ ];
6928
+ var bookingAccountReadinessStatuses2 = [
6929
+ "not_started",
6930
+ "setup_required",
6931
+ "under_review",
6932
+ "payments_ready",
6933
+ "payouts_restricted",
6934
+ "payments_restricted",
6935
+ "deactivated"
6936
+ ];
6937
+ var bookingRefundStatuses2 = [
6938
+ "none",
6939
+ "pending",
6940
+ "partially_refunded",
6941
+ "refunded",
6942
+ "failed"
6943
+ ];
6944
+ var bookingDisputeStatuses2 = [
6945
+ "none",
6946
+ "needs_response",
6947
+ "under_review",
6948
+ "won",
6949
+ "lost"
6950
+ ];
6951
+ var bookingPaymentModes2 = [
6952
+ "onsite_only",
6953
+ "online_required",
6954
+ "customer_choice"
6955
+ ];
6956
+ var bookingPaymentCollectionTypes2 = [
6957
+ "full_amount",
6958
+ "deposit_percent"
6959
+ ];
6960
+ var bookingResourceKinds2 = [
6961
+ "person",
6962
+ "room",
6963
+ "equipment",
6964
+ "other"
6965
+ ];
6966
+ var bookingStatusSchema2 = z50.enum(bookingStatuses2);
6967
+ var bookingPaymentStatusSchema2 = z50.enum(bookingPaymentStatuses2);
6968
+ var bookingAccountReadinessStatusSchema2 = z50.enum(bookingAccountReadinessStatuses2);
6969
+ var bookingRefundStatusSchema2 = z50.enum(bookingRefundStatuses2);
6970
+ var bookingDisputeStatusSchema2 = z50.enum(bookingDisputeStatuses2);
6971
+ var bookingPaymentModeSchema2 = z50.enum(bookingPaymentModes2);
6972
+ var bookingPaymentCollectionTypeSchema2 = z50.enum(bookingPaymentCollectionTypes2);
6973
+ var bookingPaymentCollectionSchema2 = z50.discriminatedUnion("type", [
6974
+ z50.object({ type: z50.literal("full_amount") }).strict(),
6975
+ z50.object({
6976
+ type: z50.literal("deposit_percent"),
6977
+ depositPercent: z50.number().int().min(10).max(90)
6978
+ }).strict()
6979
+ ]);
6980
+ var bookingPaymentChoices2 = ["onsite", "online"];
6981
+ var bookingPaymentChoiceSchema2 = z50.enum(bookingPaymentChoices2);
6982
+ var bookingPaymentSnapshotSchema2 = z50.object({
6983
+ snapshotId: z50.string().uuid(),
6984
+ snapshotVersion: z50.number().int().positive(),
6985
+ currency: z50.literal("EUR"),
6986
+ totalAmountCents: z50.number().int().min(0),
6987
+ onlineAmountCents: z50.number().int().min(0),
6988
+ onsiteRemainderCents: z50.number().int().min(0),
6989
+ maxStripeRefundAmountCents: z50.number().int().min(0)
6990
+ }).strict().superRefine((snapshot, context) => {
6991
+ if (snapshot.onlineAmountCents + snapshot.onsiteRemainderCents !== snapshot.totalAmountCents) {
6992
+ context.addIssue({
6993
+ code: "custom",
6994
+ message: "Payment snapshot amounts must add up to the total amount."
6995
+ });
6996
+ }
6997
+ if (snapshot.maxStripeRefundAmountCents > snapshot.onlineAmountCents) {
6998
+ context.addIssue({
6999
+ code: "custom",
7000
+ message: "Stripe refund basis cannot exceed the online amount."
7001
+ });
7002
+ }
7003
+ });
7004
+ var bookingServiceVariantSchema2 = z50.object({
7005
+ id: z50.string().uuid(),
7006
+ name: z50.string().trim().min(1).max(120),
7007
+ durationMinutes: z50.number().int().min(1).max(1440),
7008
+ priceCents: z50.number().int().min(0).nullable()
7009
+ }).strict();
7010
+ var bookingServiceVariantsSchema2 = z50.array(bookingServiceVariantSchema2).min(1).max(20);
7011
+ var isoDateSchema2 = z50.string().regex(/^\d{4}-\d{2}-\d{2}$/);
7012
+ var utcDateTimeSchema2 = z50.string().datetime();
7013
+ var bookingLocalTimeSchema2 = z50.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
7014
+ var bookingAvailabilityIntervalsSchema2 = z50.array(z50.object({
7015
+ start: bookingLocalTimeSchema2,
7016
+ end: bookingLocalTimeSchema2
7017
+ }).strict().refine((interval) => interval.end > interval.start)).superRefine((intervals, context) => {
7018
+ const sorted = [...intervals].sort((left, right) => left.start.localeCompare(right.start));
7019
+ for (let index = 1; index < sorted.length; index += 1) {
7020
+ if (sorted[index].start < sorted[index - 1].end) {
7021
+ context.addIssue({
7022
+ code: "custom",
7023
+ message: "Booking availability intervals must not overlap."
7024
+ });
7025
+ return;
7026
+ }
7027
+ }
7028
+ });
7029
+ var bookingPublicConfigSchema2 = z50.object({
7030
+ site: z50.object({
7031
+ displayName: z50.string().trim().min(1),
7032
+ timezone: z50.string().trim().min(1),
7033
+ locale: z50.string().trim().min(2),
7034
+ bookingPageSlug: z50.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
7035
+ privacyUrl: z50.string().url().nullable()
7036
+ }),
7037
+ branding: z50.object({
7038
+ logoUrl: z50.string().url().nullable(),
7039
+ accentColor: z50.string().trim().min(1).nullable()
7040
+ }),
7041
+ settings: z50.object({
7042
+ slotIntervalMinutes: z50.number().int().positive(),
7043
+ minLeadMinutes: z50.number().int().min(0),
7044
+ maxAdvanceDays: z50.number().int().min(1),
7045
+ requirePhone: z50.boolean(),
7046
+ collectNote: z50.boolean(),
7047
+ confirmationMessage: z50.string().nullable()
7048
+ }),
7049
+ /** Freitexte des Salons, im Kassen-Schritt vor der Bestaetigung sichtbar. */
7050
+ policies: z50.object({
7051
+ cancellation: z50.string().nullable(),
7052
+ lateArrival: z50.string().nullable()
7053
+ }),
7054
+ payment: z50.object({
7055
+ mode: bookingPaymentModeSchema2,
7056
+ collection: bookingPaymentCollectionSchema2,
7057
+ onlinePaymentsReady: z50.boolean()
7058
+ }).strict(),
7059
+ serviceCategories: z50.array(z50.object({
7060
+ id: z50.string().uuid(),
7061
+ name: z50.string().trim().min(1),
7062
+ sortOrder: z50.number().int()
7063
+ })),
7064
+ serviceSubcategories: z50.array(z50.object({
7065
+ id: z50.string().uuid(),
7066
+ categoryId: z50.string().uuid(),
7067
+ name: z50.string().trim().min(1),
7068
+ sortOrder: z50.number().int()
7069
+ })),
7070
+ services: z50.array(z50.object({
7071
+ id: z50.string().trim().min(1),
7072
+ name: z50.string().trim().min(1),
7073
+ durationMinutes: z50.number().int().positive(),
7074
+ priceCents: z50.number().int().min(0).nullable(),
7075
+ currency: z50.string().regex(/^[A-Z]{3}$/),
7076
+ description: z50.string().nullable(),
7077
+ categoryId: z50.string().uuid(),
7078
+ subcategoryId: z50.string().uuid().nullable(),
7079
+ variants: bookingServiceVariantsSchema2,
7080
+ allowsAnyResource: z50.boolean(),
7081
+ sortOrder: z50.number().int()
7082
+ })),
7083
+ resources: z50.array(z50.object({
7084
+ id: z50.string().trim().min(1),
7085
+ name: z50.string().trim().min(1),
7086
+ kind: z50.enum(bookingResourceKinds2)
7087
+ })),
7088
+ serviceResources: z50.array(z50.object({
7089
+ serviceId: z50.string().trim().min(1),
7090
+ resourceId: z50.string().trim().min(1)
7091
+ }))
7092
+ });
7093
+ var bookingItemSchema2 = z50.object({
7094
+ serviceId: z50.string().trim().min(1),
7095
+ variantId: z50.string().trim().min(1)
7096
+ }).strict();
7097
+ var bookingItemsSchema2 = z50.array(bookingItemSchema2).min(1).max(10);
7098
+ function parseBookingItemsParam2(value) {
7099
+ const items = value.split(",").map((entry) => entry.trim()).filter((entry) => entry !== "").map((entry) => {
7100
+ const [serviceId, variantId, ...rest] = entry.split(":");
7101
+ return serviceId && variantId && rest.length === 0 ? { serviceId, variantId } : null;
7102
+ });
7103
+ return items.every((item) => item !== null) ? items : null;
7104
+ }
7105
+ var bookingSlotsQuerySchema2 = z50.object({
7106
+ items: z50.preprocess((value) => typeof value === "string" ? parseBookingItemsParam2(value) : value, bookingItemsSchema2),
7107
+ resourceId: z50.string().trim().min(1).optional(),
7108
+ fromDate: isoDateSchema2,
7109
+ toDate: isoDateSchema2
7110
+ });
7111
+ var bookingSlotsResponseSchema2 = z50.object({
7112
+ timezone: z50.string().trim().min(1),
7113
+ items: bookingItemsSchema2,
7114
+ // Reine Behandlungsdauer ohne Puffer: das UI zeigt damit die Terminspanne,
7115
+ // ohne selbst rechnen zu muessen.
7116
+ totalDurationMinutes: z50.number().int().min(1),
7117
+ mode: z50.enum(["any", "resource"]),
7118
+ slots: z50.array(z50.object({
7119
+ startUtc: utcDateTimeSchema2,
7120
+ resourceId: z50.string().trim().min(1).optional()
7121
+ }))
7122
+ });
7123
+ var bookingAvailabilityQuerySchema2 = z50.object({
7124
+ items: z50.preprocess((value) => typeof value === "string" ? parseBookingItemsParam2(value) : value, bookingItemsSchema2),
7125
+ resourceId: z50.string().trim().min(1).optional(),
7126
+ fromDate: isoDateSchema2,
7127
+ toDate: isoDateSchema2
7128
+ });
7129
+ var bookingAvailabilityResponseSchema2 = z50.object({
7130
+ timezone: z50.string().trim().min(1),
7131
+ totalDurationMinutes: z50.number().int().min(1),
7132
+ days: z50.array(z50.object({
7133
+ date: isoDateSchema2,
7134
+ hasSlots: z50.boolean()
7135
+ })),
7136
+ /** Erster Tag mit Slot ab `fromDate`, auch ausserhalb des Fensters. */
7137
+ nextAvailableDate: isoDateSchema2.nullable()
7138
+ });
7139
+ var bookingPublicErrorCodes2 = [
7140
+ "slot_unavailable",
7141
+ "validation_error",
7142
+ "origin_not_allowed",
7143
+ "invalid_key",
7144
+ "rate_limited",
7145
+ "payment_required",
7146
+ "payment_unavailable",
7147
+ "payment_amount_too_small",
7148
+ "already_cancelled",
7149
+ "too_late",
7150
+ "not_found"
7151
+ ];
7152
+ var bookingPublicErrorSchema2 = z50.object({
7153
+ error: z50.enum(bookingPublicErrorCodes2),
7154
+ message: z50.string().optional(),
7155
+ requestId: z50.string().optional()
7156
+ }).strict();
7157
+ var bookingCreateRequestSchema2 = z50.object({
7158
+ items: bookingItemsSchema2,
7159
+ resourceId: z50.string().min(1).nullable(),
7160
+ startUtc: utcDateTimeSchema2,
7161
+ customer: z50.object({
7162
+ name: z50.string().min(1).max(120),
7163
+ email: z50.string().email().max(254),
7164
+ phone: z50.string().max(32).optional(),
7165
+ note: z50.string().max(1e3).optional()
7166
+ }).strict(),
7167
+ hp: z50.string().optional(),
7168
+ clientToken: z50.string().uuid(),
7169
+ paymentChoice: bookingPaymentChoiceSchema2,
7170
+ // Werbe-Einwilligung. Bestaetigung, Erinnerung und Storno-Link sind davon
7171
+ // unabhaengig und werden immer versendet.
7172
+ consent: z50.object({
7173
+ marketingEmail: z50.boolean(),
7174
+ marketingSms: z50.boolean()
7175
+ }).strict().optional()
7176
+ }).strict();
7177
+ var bookingPublicPaymentResponseSchema2 = z50.object({
7178
+ clientSecret: z50.string().min(1),
7179
+ stripeAccountId: z50.string().startsWith("acct_")
7180
+ }).strict();
7181
+ var bookingCreateResponseSchema2 = z50.union([
7182
+ z50.object({
7183
+ status: z50.literal("confirmed"),
7184
+ booking: z50.object({
7185
+ id: z50.string().min(1),
7186
+ startUtc: utcDateTimeSchema2,
7187
+ endUtc: utcDateTimeSchema2,
7188
+ timezone: z50.string().trim().min(1),
7189
+ serviceName: z50.string().trim().min(1),
7190
+ resourceName: z50.string().trim().min(1)
7191
+ }).strict(),
7192
+ manageUrl: z50.string().url(),
7193
+ confirmationMessage: z50.string().nullable()
7194
+ }).strict(),
7195
+ z50.object({
7196
+ status: z50.literal("pending_payment"),
7197
+ bookingId: z50.string().min(1),
7198
+ holdExpiresAt: utcDateTimeSchema2,
7199
+ payment: bookingPublicPaymentResponseSchema2,
7200
+ statusToken: z50.string().min(20),
7201
+ manageUrl: z50.string().url().optional()
7202
+ }).strict(),
7203
+ bookingPublicErrorSchema2
7204
+ ]);
7205
+ var bookingStatusResponseSchema2 = z50.object({
7206
+ bookingStatus: bookingStatusSchema2,
7207
+ paymentStatus: bookingPaymentStatusSchema2,
7208
+ refundStatus: bookingRefundStatusSchema2,
7209
+ disputeStatus: bookingDisputeStatusSchema2,
7210
+ holdExpiresAt: utcDateTimeSchema2.nullable()
7211
+ }).strict();
7212
+ var bookingCancelRequestSchema2 = z50.object({
7213
+ token: z50.string().min(20)
7214
+ });
7215
+ var bookingCancelResponseSchema2 = z50.union([
7216
+ z50.object({
7217
+ status: z50.enum(["cancelled", "already_cancelled", "too_late", "not_found"])
7218
+ }),
7219
+ bookingPublicErrorSchema2
7220
+ ]);
7221
+ var bookingMoveErrorCodes2 = [
7222
+ "slot_unavailable",
7223
+ "booking_not_movable",
7224
+ "not_found"
7225
+ ];
7226
+ var bookingMoveRequestSchema2 = z50.object({
7227
+ bookingId: z50.string().uuid(),
7228
+ newStartUtc: utcDateTimeSchema2,
7229
+ newResourceId: z50.string().uuid().optional(),
7230
+ notifyCustomer: z50.boolean().default(false),
7231
+ reason: z50.string().max(500).optional()
7232
+ });
7233
+ var bookingMoveResponseSchema2 = z50.union([
7234
+ z50.object({
7235
+ status: z50.literal("moved"),
7236
+ bookingId: z50.string().uuid(),
7237
+ startUtc: utcDateTimeSchema2,
7238
+ endUtc: utcDateTimeSchema2,
7239
+ resourceId: z50.string().uuid()
7240
+ }),
7241
+ z50.object({
7242
+ error: z50.enum(bookingMoveErrorCodes2),
7243
+ message: z50.string().optional(),
7244
+ requestId: z50.string().optional()
7245
+ })
7246
+ ]);
7247
+ var bookingManifestSchema2 = z50.object({
7248
+ schemaVersion: z50.number().int().positive(),
7249
+ siteId: z50.string().trim().min(1),
7250
+ siteKeyPrefix: z50.string().startsWith("bk_pub_"),
7251
+ bookingPageSlug: z50.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
7252
+ embedMode: z50.enum(["script", "web_component", "iframe"]).optional(),
7253
+ productionOrigin: z50.string().url().optional()
7254
+ }).passthrough();
7255
+
7256
+ // ../shared/dist/booking-defaults.js
7257
+ var BOOKING_CREATE_PAYLOAD_LIMIT_BYTES2 = 16 * 1024;
7258
+
7259
+ // ../shared/dist/bridge-protocol.js
7260
+ import { z as z58 } from "zod";
7261
+
7262
+ // ../shared/dist/field-id.js
7263
+ import { z as z51 } from "zod";
7264
+ var FIELD_ID_PATTERN2 = /^[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+$/;
7265
+ var fieldIdSchema2 = z51.string().regex(FIELD_ID_PATTERN2, "Invalid field id");
7266
+
7267
+ // ../shared/dist/field-types.js
7268
+ import { z as z52 } from "zod";
7269
+ var FIELD_TYPES2 = ["text", "longText", "image", "link"];
7270
+ var fieldTypeSchema2 = z52.enum(FIELD_TYPES2);
7271
+
7272
+ // ../shared/dist/image-value.js
7273
+ import { z as z53 } from "zod";
7274
+ var SUPPORTED_IMAGE_CONTENT_TYPES2 = [
7275
+ "image/jpeg",
7276
+ "image/png",
7277
+ "image/webp",
7278
+ "image/avif"
7279
+ ];
7280
+ var maxImageUploadBytes2 = 10 * 1024 * 1024;
7281
+ var largeImageWarningBytes2 = 2 * 1024 * 1024;
7282
+ var imageContentTypeSchema2 = z53.enum(SUPPORTED_IMAGE_CONTENT_TYPES2);
7283
+ var imageCropSchema2 = z53.object({
7284
+ x: z53.number().min(0).max(100),
7285
+ y: z53.number().min(0).max(100),
7286
+ zoom: z53.number().min(1).max(4),
7287
+ aspectRatio: z53.number().positive().max(10)
7288
+ });
7289
+ var imageValueSchema2 = z53.object({
7290
+ src: z53.string().trim().min(1),
7291
+ alt: z53.string().trim().min(1).max(300),
7292
+ width: z53.number().int().positive().optional(),
7293
+ height: z53.number().int().positive().optional(),
7294
+ crop: imageCropSchema2.optional(),
7295
+ assetId: z53.string().uuid().optional(),
7296
+ finalStorageProvider: z53.enum([
7297
+ "repo_static_assets",
7298
+ "repo_handoff",
7299
+ "site_owned_storage",
7300
+ "siteplane_managed_fallback"
7301
+ ]).optional()
7302
+ });
7303
+
7304
+ // ../shared/dist/setup-deployment.js
7305
+ import { z as z54 } from "zod";
7306
+ var version2 = z54.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
7307
+ var siteSetupPackagesSchema2 = z54.object({
7308
+ siteplane: version2,
7309
+ runtimeNext: version2,
7310
+ analytics: version2.optional()
7311
+ }).strict();
7312
+ var hash2 = z54.string().regex(/^sha256:[0-9a-f]{64}$/u);
7313
+ var setupDeploymentRecordSchema2 = z54.object({
7314
+ version: z54.literal(1),
7315
+ operationId: z54.string().uuid(),
7316
+ provider: z54.literal("vercel"),
7317
+ projectId: z54.string().regex(/^prj_[A-Za-z0-9]+$/u),
7318
+ teamId: z54.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u),
7319
+ origin: z54.string().url().refine((value) => {
7320
+ const url = new URL(value);
7321
+ return url.protocol === "https:" && url.origin === value && !url.username && !url.password;
7322
+ }),
7323
+ deploymentId: z54.string().regex(/^dpl_[A-Za-z0-9]+$/u).nullable(),
7324
+ revision: z54.string().regex(/^[0-9a-f]{40}$/u),
7325
+ fieldContractHash: hash2,
7326
+ packages: siteSetupPackagesSchema2,
7327
+ configurationFingerprint: hash2,
7328
+ adminSecretGeneration: z54.string().uuid(),
7329
+ revalidationGeneration: z54.number().int().positive(),
7330
+ startedAt: z54.string().datetime(),
7331
+ environmentWrittenAt: z54.string().datetime().nullable(),
7332
+ deployRequestedAt: z54.string().datetime().nullable(),
7333
+ deadline: z54.string().datetime(),
7334
+ phase: z54.enum([
7335
+ "planned",
7336
+ "environment_written",
7337
+ "deploy_requested",
7338
+ "deployed",
7339
+ "verified",
7340
+ "failed"
7341
+ ]),
7342
+ build: z54.object({
7343
+ node: version2,
7344
+ packageManager: z54.enum(["npm", "pnpm"]),
7345
+ packageManagerVersion: version2,
7346
+ lockfileHash: hash2
7347
+ }).strict().nullable()
7348
+ }).strict();
7349
+ var setupDeploymentInputSchema2 = z54.discriminatedUnion("action", [
7350
+ z54.object({ action: z54.literal("read") }).strict(),
7351
+ z54.object({
7352
+ action: z54.literal("record"),
7353
+ expectedOperationId: z54.string().uuid().nullable(),
7354
+ record: setupDeploymentRecordSchema2
7355
+ }).strict()
7356
+ ]);
7357
+
7358
+ // ../shared/dist/site-setup.js
7359
+ import { z as z57 } from "zod";
7360
+
7361
+ // ../shared/dist/site-field-contract.js
7362
+ import { z as z56 } from "zod";
7363
+
7364
+ // ../shared/dist/fallback-hash.js
7365
+ import { z as z55 } from "zod";
7366
+ var SAFE_REPRESENTATION_REASONS2 = [
7367
+ "asset_import_rewritten",
7368
+ "relative_url_normalized",
7369
+ "line_endings_normalized",
7370
+ "image_value_serialized"
7371
+ ];
7372
+ var safeRepresentationReasonSchema2 = z55.enum(SAFE_REPRESENTATION_REASONS2);
7373
+ var linkFallbackSchema3 = z55.object({
7374
+ href: z55.string().trim().min(1),
7375
+ label: z55.string().trim().min(1).optional(),
7376
+ target: z55.enum(["_self", "_blank"]).optional()
7377
+ }).passthrough();
7378
+ function stableJsonStringify2(value) {
7379
+ return JSON.stringify(sortObjectKeys2(value));
7380
+ }
7381
+ function sortObjectKeys2(value) {
7382
+ if (Array.isArray(value)) {
7383
+ return value.map(sortObjectKeys2);
7384
+ }
7385
+ if (!value || typeof value !== "object") {
7386
+ return value;
7387
+ }
7388
+ return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, entryValue]) => [key, sortObjectKeys2(entryValue)]));
7389
+ }
7390
+
7391
+ // ../shared/dist/site-field-contract.js
7392
+ var siteFieldStatusSchema2 = z56.enum(["hidden", "active"]);
7393
+ var semanticVersionSchema2 = z56.string().regex(/^\d+\.\d+\.\d+$/u);
7394
+ var siteFieldRouteKeySchema2 = z56.string().trim().refine((value) => value === "$global" || value.startsWith("/") && !value.includes("?") && !value.includes("#") && (value === "/" || !value.endsWith("/")), "Route keys must be canonical paths or $global.");
7395
+ var repositoryRelativePosixPathSchema2 = z56.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.");
7396
+ var sourceMappingSchema2 = z56.object({
7397
+ kind: z56.literal("function"),
7398
+ filePath: repositoryRelativePosixPathSchema2,
7399
+ exportName: z56.string().trim().min(1).optional(),
7400
+ sourcePath: z56.string().trim().min(1).optional(),
7401
+ editTarget: fieldIdSchema2.optional()
7402
+ }).strict();
7403
+ var domMappingSchema2 = z56.object({
7404
+ attribute: z56.literal("data-siteplane-field-id"),
7405
+ previewStrategy: z56.enum(["dom", "event"])
7406
+ }).strict();
7407
+ var fieldBaseSchema2 = z56.object({
7408
+ fieldId: fieldIdSchema2,
7409
+ routeKey: siteFieldRouteKeySchema2,
7410
+ source: sourceMappingSchema2,
7411
+ dom: domMappingSchema2.optional()
7412
+ }).strict();
7413
+ var linkFallbackSchema4 = z56.object({
7414
+ href: z56.string().trim().min(1),
7415
+ label: z56.string().trim().min(1).optional(),
7416
+ target: z56.enum(["_self", "_blank"]).optional()
7417
+ }).strict();
7418
+ var imageFallbackSchema2 = z56.object({
7419
+ src: z56.string().trim().min(1),
7420
+ alt: z56.string().trim().max(300),
7421
+ width: z56.number().int().positive().optional(),
7422
+ height: z56.number().int().positive().optional(),
7423
+ crop: z56.object({
7424
+ x: z56.number().min(0).max(100),
7425
+ y: z56.number().min(0).max(100),
7426
+ zoom: z56.number().min(1).max(4),
7427
+ aspectRatio: z56.number().positive().max(10)
7428
+ }).strict().optional()
7429
+ }).strict();
7430
+ var siteFieldContractFieldSchema2 = z56.discriminatedUnion("fieldType", [
7431
+ fieldBaseSchema2.extend({
7432
+ fieldType: z56.literal("text"),
7433
+ fallback: z56.string()
7434
+ }),
7435
+ fieldBaseSchema2.extend({
7436
+ fieldType: z56.literal("longText"),
7437
+ fallback: z56.string()
7438
+ }),
7439
+ fieldBaseSchema2.extend({
7440
+ fieldType: z56.literal("link"),
7441
+ fallback: linkFallbackSchema4
7442
+ }),
7443
+ fieldBaseSchema2.extend({
7444
+ fieldType: z56.literal("image"),
7445
+ fallback: imageFallbackSchema2
7446
+ })
7447
+ ]);
7448
+ var siteFieldContractV1Schema2 = z56.object({
7449
+ version: z56.literal(1),
7450
+ fieldContractVersion: semanticVersionSchema2,
7451
+ scannerContractVersion: semanticVersionSchema2,
7452
+ fields: z56.array(siteFieldContractFieldSchema2)
7453
+ }).strict().superRefine((contract, context) => {
7454
+ const seen = /* @__PURE__ */ new Set();
7455
+ for (const [index, field] of contract.fields.entries()) {
7456
+ if (seen.has(field.fieldId)) {
7457
+ context.addIssue({
7458
+ code: "custom",
7459
+ message: `Duplicate field id: ${field.fieldId}`,
7460
+ path: ["fields", index, "fieldId"]
7461
+ });
7462
+ }
7463
+ seen.add(field.fieldId);
7464
+ }
7465
+ });
7466
+
7467
+ // ../shared/dist/site-setup.js
7468
+ var SITE_SETUP_RUN_STATUSES2 = [
7469
+ "waiting_for_agent",
7470
+ "working",
7471
+ "action_required",
7472
+ "ready_for_review",
7473
+ "completed"
7474
+ ];
7475
+ var SITE_SETUP_RUN_MODES2 = ["initial", "update"];
7476
+ var SITE_SETUP_ERROR_CODES2 = [
7477
+ "action_required",
7478
+ "deployment_evidence_required",
7479
+ "field_contract_scan_failed",
7480
+ "invalid_editor_definition",
7481
+ "invalid_field_contract",
7482
+ "missing_build_revision",
7483
+ "missing_field_contract",
7484
+ "review_locked",
7485
+ "stale_deployment_contract",
7486
+ "stale_field_contract",
7487
+ "stale_setup_review",
7488
+ "update_required"
7489
+ ];
7490
+ var CONTINUE_SITE_SETUP_MAX_ITEMS2 = 50;
7491
+ var CONTINUE_SITE_SETUP_RENDERED_PATH_MAX_BYTES2 = 512;
7492
+ var CONTINUE_SITE_SETUP_VISIBLE_VALUE_MAX_BYTES2 = 256;
7493
+ var CONTINUE_SITE_SETUP_LOCATOR_HINT_MAX_BYTES2 = 512;
7494
+ var CONTINUE_SITE_SETUP_REQUESTED_LABEL_MAX_BYTES2 = 120;
7495
+ var CONTINUE_SITE_SETUP_REQUESTED_SECTION_MAX_BYTES2 = 120;
7496
+ var CONTINUE_SITE_SETUP_REQUESTED_SUBSECTION_MAX_BYTES2 = 120;
7497
+ var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH2 = 2e3;
7498
+ var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES2 = 8e3;
7499
+ var CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES2 = 32 * 1024;
7500
+ var CONTINUE_SITE_SETUP_HTTP_BODY_MAX_BYTES2 = 64 * 1024;
7501
+ var siteSetupRunStatusSchema2 = z57.enum(SITE_SETUP_RUN_STATUSES2);
7502
+ var siteSetupRunModeSchema2 = z57.enum(SITE_SETUP_RUN_MODES2);
7503
+ var siteSetupErrorCodeSchema2 = z57.enum(SITE_SETUP_ERROR_CODES2);
7504
+ var editorFieldSchema2 = z57.object({
7505
+ fieldId: fieldIdSchema2,
7506
+ label: z57.string().trim().min(1),
7507
+ subsection: z57.string().trim().min(1).optional(),
7508
+ description: z57.string().trim().min(1).optional(),
7509
+ required: z57.boolean().optional(),
7510
+ maxLength: z57.number().int().positive().optional()
7511
+ }).strict();
7512
+ var editorSectionSchema2 = z57.object({
7513
+ label: z57.string().trim().min(1),
7514
+ fields: z57.array(editorFieldSchema2).min(1)
7515
+ }).strict().superRefine((section, context) => {
7516
+ const closedSubsections = /* @__PURE__ */ new Set();
7517
+ let currentSubsection;
7518
+ for (const [index, field] of section.fields.entries()) {
7519
+ if (field.subsection === currentSubsection)
7520
+ continue;
7521
+ if (currentSubsection)
7522
+ closedSubsections.add(currentSubsection);
7523
+ currentSubsection = field.subsection;
7524
+ if (currentSubsection && closedSubsections.has(currentSubsection)) {
7525
+ context.addIssue({
7526
+ code: "custom",
7527
+ message: `Subgroup fields must stay contiguous: ${currentSubsection}`,
7528
+ path: ["fields", index, "subsection"]
7529
+ });
7530
+ }
7531
+ }
7532
+ });
7533
+ var editorRouteSchema2 = z57.object({
7534
+ routeKey: siteFieldRouteKeySchema2,
7535
+ previewPath: z57.string().trim().refine((path) => path.startsWith("/") && !path.startsWith("//") && !/[\\\[\]?#\s]/u.test(path) && (path === "/" || !path.endsWith("/")), "previewPath must be a concrete same-site path, for example /services/consultation.").optional(),
7536
+ label: z57.string().trim().min(1),
7537
+ sections: z57.array(editorSectionSchema2).min(1)
7538
+ }).strict().superRefine((route, context) => {
7539
+ if (route.routeKey.includes("[") && !route.previewPath) {
7540
+ context.addIssue({
7541
+ code: "custom",
7542
+ path: ["previewPath"],
7543
+ message: "Dynamic editor routes need a previewPath for an existing page; keep the canonical routeKey unchanged."
7544
+ });
7545
+ }
7546
+ const sections = /* @__PURE__ */ new Set();
7547
+ for (const [index, section] of route.sections.entries()) {
7548
+ if (sections.has(section.label)) {
7549
+ context.addIssue({
7550
+ code: "custom",
7551
+ message: `Duplicate section label: ${section.label}`,
7552
+ path: ["sections", index, "label"]
7553
+ });
7554
+ }
7555
+ sections.add(section.label);
7556
+ }
7557
+ });
7558
+ var editorDefinitionV1Schema2 = z57.object({
7559
+ version: z57.literal(1),
7560
+ routes: z57.array(editorRouteSchema2).min(1)
7561
+ }).strict().superRefine((definition, context) => {
7562
+ const routes = /* @__PURE__ */ new Set();
7563
+ const fields = /* @__PURE__ */ new Set();
7564
+ for (const [routeIndex, route] of definition.routes.entries()) {
7565
+ if (routes.has(route.routeKey)) {
7566
+ context.addIssue({
7567
+ code: "custom",
7568
+ message: `Duplicate route key: ${route.routeKey}`,
7569
+ path: ["routes", routeIndex, "routeKey"]
7570
+ });
7571
+ }
7572
+ routes.add(route.routeKey);
7573
+ for (const [sectionIndex, section] of route.sections.entries()) {
7574
+ for (const [fieldIndex, field] of section.fields.entries()) {
7575
+ if (fields.has(field.fieldId)) {
7576
+ context.addIssue({
7577
+ code: "custom",
7578
+ message: `Duplicate editor field id: ${field.fieldId}`,
7579
+ path: [
7580
+ "routes",
7581
+ routeIndex,
7582
+ "sections",
7583
+ sectionIndex,
7584
+ "fields",
7585
+ fieldIndex,
7586
+ "fieldId"
7587
+ ]
7588
+ });
7589
+ }
7590
+ fields.add(field.fieldId);
7591
+ }
7592
+ }
7593
+ }
7594
+ });
7595
+ var forbiddenControlOrBidi2 = /[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
7596
+ var forbiddenOwnerNoteControlOrBidi2 = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
7597
+ var unsafeLocator2 = /<\/?[a-z][^>]*>|\b(?:javascript|data:text\/html)\s*:|\bon[a-z]+\s*=/iu;
7598
+ var renderedPathSchema2 = z57.string().trim().transform((value) => value !== "/" ? value.replace(/\/+$/u, "") : value).superRefine((value, context) => {
7599
+ if (!value.startsWith("/") || value === "$global" || value.includes("?") || value.includes("#")) {
7600
+ context.addIssue({
7601
+ code: "custom",
7602
+ message: "renderedPath must be a canonical real path."
7603
+ });
7604
+ }
7605
+ addSafeByteIssues2(value, CONTINUE_SITE_SETUP_RENDERED_PATH_MAX_BYTES2, "renderedPath", context);
7606
+ });
7607
+ function normalizedSafeTextSchema2(maxBytes, label) {
7608
+ return z57.string().transform((value) => value.trim().replace(new RegExp("\\p{White_Space}+", "gu"), " ")).pipe(z57.string().min(1)).superRefine((value, context) => {
7609
+ addSafeByteIssues2(value, maxBytes, label, context);
7610
+ if (label === "locatorHint" && unsafeLocator2.test(value)) {
7611
+ context.addIssue({
7612
+ code: "custom",
7613
+ message: "locatorHint contains unsafe markup or executable content."
7614
+ });
7615
+ }
7616
+ });
7617
+ }
7618
+ var correctionItemBase2 = {
7619
+ renderedPath: renderedPathSchema2,
7620
+ visibleValue: normalizedSafeTextSchema2(CONTINUE_SITE_SETUP_VISIBLE_VALUE_MAX_BYTES2, "visibleValue"),
7621
+ locatorHint: normalizedSafeTextSchema2(CONTINUE_SITE_SETUP_LOCATOR_HINT_MAX_BYTES2, "locatorHint"),
7622
+ requestedLabel: normalizedSafeTextSchema2(CONTINUE_SITE_SETUP_REQUESTED_LABEL_MAX_BYTES2, "requestedLabel").optional(),
7623
+ requestedSection: normalizedSafeTextSchema2(CONTINUE_SITE_SETUP_REQUESTED_SECTION_MAX_BYTES2, "requestedSection").optional(),
7624
+ requestedSubsection: normalizedSafeTextSchema2(CONTINUE_SITE_SETUP_REQUESTED_SUBSECTION_MAX_BYTES2, "requestedSubsection").optional(),
7625
+ requestedSortOrder: z57.number().int().nonnegative().optional()
7626
+ };
7627
+ var setupCorrectionItemSchema2 = z57.discriminatedUnion("kind", [
7628
+ z57.object({ kind: z57.literal("text"), ...correctionItemBase2 }).strict(),
7629
+ z57.object({ kind: z57.literal("link"), ...correctionItemBase2 }).strict(),
7630
+ z57.object({ kind: z57.literal("image"), ...correctionItemBase2 }).strict()
7631
+ ]).superRefine((item, context) => {
7632
+ if (item.requestedSubsection && !item.requestedSection) {
7633
+ context.addIssue({
7634
+ code: "custom",
7635
+ message: "requestedSubsection requires requestedSection.",
7636
+ path: ["requestedSubsection"]
7637
+ });
7638
+ }
7639
+ });
7640
+ var setupCorrectionItemsSchema2 = z57.array(setupCorrectionItemSchema2).max(CONTINUE_SITE_SETUP_MAX_ITEMS2).superRefine((items, context) => {
7641
+ const bytes = utf8Bytes2(stableJsonStringify2(items));
7642
+ if (bytes > CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES2) {
7643
+ context.addIssue({
7644
+ code: "custom",
7645
+ message: "Correction items exceed the 32 KiB canonical payload limit."
7646
+ });
7647
+ }
7648
+ });
7649
+ var siteSetupOwnerEditabilityNoteSchema2 = z57.string().max(SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH2).superRefine((value, context) => {
7650
+ if (utf8Bytes2(value) > SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES2) {
7651
+ context.addIssue({
7652
+ code: "custom",
7653
+ message: `ownerEditabilityNote exceeds ${SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES2} UTF-8 bytes.`
7654
+ });
7655
+ }
7656
+ if (forbiddenOwnerNoteControlOrBidi2.test(value)) {
7657
+ context.addIssue({
7658
+ code: "custom",
7659
+ message: "ownerEditabilityNote contains a forbidden control or bidi character."
7660
+ });
7661
+ }
7662
+ });
7663
+ var SITE_SETUP_MODULE_SCOPES2 = {
7664
+ editing: ["setup:read", "setup:write"],
7665
+ analytics: [
7666
+ "analytics:setup",
7667
+ "analytics:sync",
7668
+ "analytics:test",
7669
+ "analytics:readiness",
7670
+ "analytics:agent_instructions",
7671
+ "analytics:public_key_read"
7672
+ ]
7673
+ };
7674
+ var siteSetupModulesSchema2 = z57.array(z57.enum(["editing", "analytics"])).min(1).max(2).refine((modules) => modules[0] === "editing" && (modules.length === 1 || modules[1] === "analytics"), "Choose Editing with optional Analytics.");
7675
+ function siteSetupScopes2(modules) {
7676
+ return modules.flatMap((module) => [...SITE_SETUP_MODULE_SCOPES2[module]]);
7677
+ }
7678
+ function hasExactSiteSetupScopes2(scopes, modules) {
7679
+ const matches = (expected) => scopes.length === expected.length && expected.every((scope) => scopes.includes(scope));
7680
+ return modules ? matches(siteSetupScopes2(modules)) : matches(siteSetupScopes2(["editing"])) || matches(siteSetupScopes2(["editing", "analytics"]));
7681
+ }
7682
+ var siteSetupActivityInputSchema2 = z57.object({
7683
+ phase: z57.enum([
7684
+ "inspecting",
7685
+ "integrating",
7686
+ "deploying",
7687
+ "verifying",
7688
+ "repairing"
7689
+ ]),
7690
+ textId: z57.enum([
7691
+ "inspecting",
7692
+ "integrating",
7693
+ "deploying",
7694
+ "verifying",
7695
+ "repairing"
7696
+ ])
7697
+ }).strict().refine((value) => value.phase === value.textId, "Activity text must describe its phase.");
7698
+ var nextActionFields2 = {
7699
+ actor: z57.enum(["agent", "user", "siteplane"]),
7700
+ boundary: z57.enum([
7701
+ "source",
7702
+ "environment",
7703
+ "deployment",
7704
+ "verification",
7705
+ "authorization",
7706
+ "review"
7707
+ ]),
7708
+ precondition: z57.string().min(1).max(1e3),
7709
+ instruction: z57.string().min(1).max(2e3),
7710
+ expectedEvidence: z57.string().min(1).max(1e3)
7711
+ };
7712
+ var siteSetupNextActionSchema2 = z57.discriminatedUnion("kind", [
7713
+ z57.object({
7714
+ ...nextActionFields2,
7715
+ kind: z57.literal("run_command"),
7716
+ command: z57.string().min(1).max(500)
7717
+ }).strict(),
7718
+ z57.object({ ...nextActionFields2, kind: z57.literal("agent_edit") }).strict(),
7719
+ z57.object({ ...nextActionFields2, kind: z57.literal("needs_user_action") }).strict(),
7720
+ z57.object({ ...nextActionFields2, kind: z57.literal("wait") }).strict(),
7721
+ z57.object({ ...nextActionFields2, kind: z57.literal("done") }).strict()
7722
+ ]);
7723
+ var siteSetupTaskRunSchema2 = z57.object({
7724
+ runId: z57.string().uuid(),
7725
+ mode: siteSetupRunModeSchema2,
7726
+ status: siteSetupRunStatusSchema2,
7727
+ fieldContractHash: z57.string().nullable(),
7728
+ deploymentOrigin: z57.string().url().nullable(),
7729
+ deploymentRevision: z57.string().nullable(),
7730
+ publicRuntimeKeyId: z57.string().uuid().nullable(),
7731
+ reviewVersion: z57.number().int().positive()
7732
+ }).strict();
7733
+ var siteSetupTaskProgressSchema2 = z57.object({
7734
+ progressStage: z57.enum([
7735
+ "waiting_for_connection",
7736
+ "agent_connected",
7737
+ "project_context_loaded",
7738
+ "fields_prepared",
7739
+ "deployment_verification",
7740
+ "ready_for_review",
7741
+ "action_required",
7742
+ "completed"
7743
+ ]),
7744
+ lastVerifiedAt: z57.string().datetime().nullable(),
7745
+ lastActivityAt: z57.string().datetime(),
7746
+ activitySource: z57.enum(["user", "server", "agent"]),
7747
+ activityPhase: siteSetupActivityInputSchema2.shape.phase.nullable(),
7748
+ activityTextId: siteSetupActivityInputSchema2.shape.textId.nullable()
7749
+ }).strict();
7750
+ var siteSetupTaskSchema2 = z57.object({
7751
+ contractVersion: z57.literal("siteplane.setup-task.v2"),
7752
+ workflow: z57.enum(["initial_setup", "structure_update"]),
7753
+ goal: z57.string().min(1),
7754
+ modules: siteSetupModulesSchema2,
7755
+ authorizationVersion: z57.number().int().positive(),
7756
+ authorizedScopes: z57.array(z57.string()).min(2),
7757
+ site: z57.object({
7758
+ siteId: z57.string().uuid(),
7759
+ portalPath: z57.string(),
7760
+ adminOrigin: z57.string().url()
7761
+ }).strict().nullable(),
7762
+ run: siteSetupTaskRunSchema2.nullable(),
7763
+ progress: siteSetupTaskProgressSchema2.nullable(),
7764
+ deployment: setupDeploymentRecordSchema2.nullable(),
7765
+ revalidationGeneration: z57.number().int().positive(),
7766
+ assignment: z57.enum(["owned", "provisional", "claimed"]),
7767
+ deadline: z57.string().datetime().nullable(),
7768
+ userInstructions: z57.object({
7769
+ text: siteSetupOwnerEditabilityNoteSchema2,
7770
+ source: z57.literal("user"),
7771
+ trust: z57.literal("untrusted")
7772
+ }).strict(),
7773
+ corrections: setupCorrectionItemsSchema2,
7774
+ contentSelectionSummary: z57.object({
7775
+ text: siteSetupOwnerEditabilityNoteSchema2,
7776
+ source: z57.literal("agent"),
7777
+ trust: z57.literal("untrusted")
7778
+ }).strict().nullable(),
7779
+ environmentBindings: z57.array(z57.object({
7780
+ name: z57.string().regex(/^[A-Z][A-Z0-9_]+$/u),
7781
+ source: z57.string().min(1),
7782
+ sensitivity: z57.enum(["public", "secret"]),
7783
+ usage: z57.enum(["build", "server", "build_and_server"]),
7784
+ evidence: z57.string().min(1)
7785
+ }).strict()),
7786
+ nextAction: siteSetupNextActionSchema2,
7787
+ error: z57.object({
7788
+ code: z57.string().regex(/^[a-z0-9_.]+$/u).max(160),
7789
+ boundary: nextActionFields2.boundary,
7790
+ responsibleActor: nextActionFields2.actor,
7791
+ retryable: z57.boolean(),
7792
+ retryAfter: z57.number().int().nonnegative().nullable(),
7793
+ requestId: z57.string().regex(/^[A-Za-z0-9_-]+$/u).max(128)
7794
+ }).strict().nullable(),
7795
+ packages: siteSetupPackagesSchema2,
7796
+ communication: z57.object({
7797
+ beforeSourceChanges: z57.string().min(1),
7798
+ updates: z57.array(z57.string().min(1)).min(1),
7799
+ blocker: z57.string().min(1)
7800
+ }).strict(),
7801
+ discovery: z57.object({
7802
+ inspectPublicRoutes: z57.boolean(),
7803
+ contentKinds: z57.array(z57.enum(["text", "longText", "link", "image"])).min(1),
7804
+ rules: z57.array(z57.string().min(1)).min(1)
7805
+ }).strict(),
7806
+ steps: z57.array(z57.object({
7807
+ id: z57.enum([
7808
+ "inspect_repository",
7809
+ "install_packages",
7810
+ "instrument_fields",
7811
+ "apply_contract",
7812
+ "deploy_production",
7813
+ "verify_deployment"
7814
+ ]),
7815
+ instruction: z57.string().min(1)
7816
+ }).strict()).length(6),
7817
+ completion: z57.object({
7818
+ verifiedStatus: z57.literal("ready_for_review"),
7819
+ instruction: z57.string().min(1)
7820
+ }).strict()
7821
+ }).strict().refine((task) => hasExactSiteSetupScopes2(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.");
7822
+ var canonicalHashSchema2 = z57.string().regex(/^sha256:[0-9a-f]{64}$/iu);
7823
+ var deploymentRevisionSchema2 = normalizedSafeTextSchema2(256, "deploymentRevision");
7824
+ var continueSiteSetupInputSchema2 = z57.object({
7825
+ siteId: z57.string().uuid(),
7826
+ runId: z57.string().uuid(),
7827
+ expectedReviewVersion: z57.number().int().positive(),
7828
+ mutationId: z57.string().uuid(),
7829
+ intent: z57.enum(["continue_review", "correct_completed_review"]),
7830
+ expectedFieldContractHash: canonicalHashSchema2,
7831
+ expectedDeploymentRevision: deploymentRevisionSchema2,
7832
+ correctionItems: setupCorrectionItemsSchema2,
7833
+ ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema2.optional()
7834
+ }).strict();
7835
+ var saveSiteSetupOwnerNoteInputSchema2 = z57.object({
7836
+ siteId: z57.string().uuid(),
7837
+ runId: z57.string().uuid(),
7838
+ expectedReviewVersion: z57.number().int().positive(),
7839
+ expectedFieldContractHash: canonicalHashSchema2,
7840
+ expectedDeploymentRevision: deploymentRevisionSchema2,
7841
+ ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema2
7842
+ }).strict();
7843
+ var setupReviewPreferenceSelectionSchema2 = z57.object({
7844
+ analyticsMode: z57.enum(["disabled", "session_only"]).nullable(),
7845
+ assetTargetType: z57.enum(["repo_static_assets", "siteplane_managed_fallback"]).nullable(),
7846
+ assetTargetId: z57.string().uuid().nullable()
7847
+ }).strict().refine((value) => value.assetTargetType !== null || value.assetTargetId === null, {
7848
+ message: "An asset target requires its delivery type."
7849
+ });
7850
+ var setupReviewPreferencesSchema2 = setupReviewPreferenceSelectionSchema2.safeExtend({
7851
+ managedHostingApproved: z57.boolean()
7852
+ });
7853
+ var saveSetupReviewPreferencesInputSchema2 = z57.object({
7854
+ siteId: z57.string().uuid(),
7855
+ runId: z57.string().uuid(),
7856
+ expectedReviewVersion: z57.number().int().positive(),
7857
+ preferences: setupReviewPreferenceSelectionSchema2
7858
+ }).strict();
7859
+ var siteSetupContextInputSchema2 = z57.object({}).strict();
7860
+ var siteSetupApplyInputSchema2 = z57.object({
7861
+ fieldContract: siteFieldContractV1Schema2,
7862
+ editorDefinition: editorDefinitionV1Schema2,
7863
+ contentSelectionSummary: siteSetupOwnerEditabilityNoteSchema2.refine((text) => text.trim().length > 0, "Describe the selected content, important exclusions and any open gaps.")
7864
+ }).strict().superRefine((input, context) => {
7865
+ const contractRoutesByFieldId = new Map(input.fieldContract.fields.map((field) => [
7866
+ field.fieldId,
7867
+ field.routeKey
7868
+ ]));
7869
+ const definitionFieldIds = /* @__PURE__ */ new Set();
7870
+ for (const [routeIndex, route] of input.editorDefinition.routes.entries()) {
7871
+ for (const [sectionIndex, section] of route.sections.entries()) {
7872
+ for (const [fieldIndex, field] of section.fields.entries()) {
7873
+ const fieldPath = [
7874
+ "editorDefinition",
7875
+ "routes",
7876
+ routeIndex,
7877
+ "sections",
7878
+ sectionIndex,
7879
+ "fields",
7880
+ fieldIndex,
7881
+ "fieldId"
7882
+ ];
7883
+ const contractRouteKey = contractRoutesByFieldId.get(field.fieldId);
7884
+ const contractField = input.fieldContract.fields.find((candidate) => candidate.fieldId === field.fieldId);
7885
+ definitionFieldIds.add(field.fieldId);
7886
+ if (!contractRouteKey) {
7887
+ context.addIssue({
7888
+ code: "custom",
7889
+ message: `Unknown editor field id: ${field.fieldId}`,
7890
+ path: fieldPath
7891
+ });
7892
+ } else if (contractRouteKey !== route.routeKey) {
7893
+ context.addIssue({
7894
+ code: "custom",
7895
+ message: `Editor field ${field.fieldId} must use route ${contractRouteKey}.`,
7896
+ path: fieldPath
7897
+ });
7898
+ } else if (field.maxLength !== void 0 && contractField?.fieldType !== "text" && contractField?.fieldType !== "longText") {
7899
+ context.addIssue({
7900
+ code: "custom",
7901
+ message: `maxLength is not supported for ${contractField?.fieldType ?? "unknown"} fields.`,
7902
+ path: [
7903
+ "editorDefinition",
7904
+ "routes",
7905
+ routeIndex,
7906
+ "sections",
7907
+ sectionIndex,
7908
+ "fields",
7909
+ fieldIndex,
7910
+ "maxLength"
7911
+ ]
7912
+ });
7913
+ }
7914
+ }
7915
+ }
7916
+ }
7917
+ for (const field of input.fieldContract.fields) {
7918
+ if (!definitionFieldIds.has(field.fieldId)) {
7919
+ context.addIssue({
7920
+ code: "custom",
7921
+ message: `Missing editor field id: ${field.fieldId}`,
7922
+ path: ["editorDefinition", "routes"]
7923
+ });
7924
+ }
7925
+ }
7926
+ });
7927
+ var siteSetupVerifyInputSchema2 = z57.object({
7928
+ deploymentUrl: z57.string().url().refine((value) => value.startsWith("https://")),
7929
+ deploymentRevision: deploymentRevisionSchema2,
7930
+ wait: z57.boolean().optional()
7931
+ }).strict();
7932
+ var siteSetupEvidenceInputSchema2 = z57.object({
7933
+ siteId: z57.string().uuid(),
7934
+ runId: z57.string().uuid(),
7935
+ expectedFieldContractHash: canonicalHashSchema2,
7936
+ expectedDeploymentOrigin: z57.string().url().refine((value) => value.startsWith("https://")),
7937
+ expectedDeploymentRevision: deploymentRevisionSchema2,
7938
+ publicRuntimeKeyId: z57.string().uuid(),
7939
+ bridgeSessionId: normalizedSafeTextSchema2(256, "bridgeSessionId"),
7940
+ observations: z57.array(z57.object({
7941
+ fieldId: fieldIdSchema2,
7942
+ fieldType: fieldTypeSchema2,
7943
+ routeKey: siteFieldRouteKeySchema2,
7944
+ renderedPath: renderedPathSchema2,
7945
+ targetResolved: z57.boolean(),
7946
+ previewAck: z57.boolean()
7947
+ }).strict().refine((value) => !value.previewAck || value.targetResolved, "Preview ACK requires a resolved target.")).min(1).max(200)
7948
+ }).strict();
7949
+ var completeSetupReviewInputSchema2 = z57.object({
7950
+ siteId: z57.string().uuid(),
7951
+ runId: z57.string().uuid(),
7952
+ expectedReviewVersion: z57.number().int().positive(),
7953
+ expectedFieldContractHash: canonicalHashSchema2,
7954
+ expectedDeploymentRevision: deploymentRevisionSchema2,
7955
+ expectedReadyFingerprint: canonicalHashSchema2
7956
+ }).strict();
7957
+ var activateSiteSetupInputSchema2 = z57.object({
7958
+ siteId: z57.string().uuid(),
7959
+ runId: z57.string().uuid(),
7960
+ expectedReviewVersion: z57.number().int().positive(),
7961
+ expectedSnapshotHash: canonicalHashSchema2
7962
+ }).strict();
7963
+ var refreshSiteSetupDeploymentInputSchema2 = z57.object({
7964
+ siteId: z57.string().uuid(),
7965
+ deploymentUrl: z57.string().url().refine((value) => value.startsWith("https://")),
7966
+ deploymentRevision: deploymentRevisionSchema2
7967
+ }).strict();
7968
+ function addSafeByteIssues2(value, maxBytes, label, context) {
7969
+ if (utf8Bytes2(value) > maxBytes) {
7970
+ context.addIssue({
7971
+ code: "custom",
7972
+ message: `${label} exceeds ${maxBytes} UTF-8 bytes.`
7973
+ });
7974
+ }
7975
+ if (forbiddenControlOrBidi2.test(value)) {
7976
+ context.addIssue({
7977
+ code: "custom",
7978
+ message: `${label} contains a forbidden control or bidi character.`
7979
+ });
7980
+ }
7981
+ }
7982
+ function utf8Bytes2(value) {
7983
+ return new TextEncoder().encode(value).byteLength;
7984
+ }
7985
+ var setupActivationApprovalSchema2 = z57.object({
7986
+ reviewVersion: z57.number().int().positive(),
7987
+ snapshotHash: canonicalHashSchema2,
7988
+ analytics: z57.object({
7989
+ status: z57.enum(["active", "skipped"]),
7990
+ reviewVersion: z57.number().int().positive(),
7991
+ generation: z57.number().int().nonnegative()
7992
+ }).optional()
7993
+ });
7994
+ var activateSetupModulesInputSchema2 = activateSiteSetupInputSchema2.extend({
7995
+ analytics: z57.discriminatedUnion("decision", [
7996
+ z57.object({ decision: z57.literal("pending") }).strict(),
7997
+ z57.object({
7998
+ decision: z57.literal("enable"),
7999
+ readinessTestRunId: z57.string().regex(/^analytics_owner_[0-9a-f-]{36}$/u),
8000
+ expectedInstallationGeneration: z57.number().int().positive(),
8001
+ measurementApproved: z57.literal(true)
8002
+ }).strict(),
8003
+ z57.object({
8004
+ decision: z57.literal("skip"),
8005
+ expectedInstallationGeneration: z57.number().int().nonnegative(),
8006
+ continueWithoutAnalytics: z57.literal(true)
8007
+ }).strict()
8008
+ ])
8009
+ }).strict();
8010
+
8011
+ // ../shared/dist/bridge-protocol.js
8012
+ var BRIDGE_PROTOCOL_VERSION2 = 2;
8013
+ var bridgeRectSchema2 = z58.object({
8014
+ x: z58.number(),
8015
+ y: z58.number(),
8016
+ width: z58.number().nonnegative(),
8017
+ height: z58.number().nonnegative()
8018
+ });
8019
+ var previewTextValueSchema2 = z58.object({
8020
+ fieldType: z58.enum(["text", "longText"]),
8021
+ value: z58.string()
8022
+ });
8023
+ var previewLinkValueSchema2 = z58.object({
8024
+ fieldType: z58.literal("link"),
8025
+ value: z58.object({
8026
+ href: z58.string().trim().min(1),
8027
+ label: z58.string().trim().min(1).optional()
8028
+ })
8029
+ });
8030
+ var previewImageValueSchema2 = z58.object({
8031
+ fieldType: z58.literal("image"),
8032
+ value: imageValueSchema2
8033
+ });
8034
+ var bridgePreviewValueSchema2 = z58.discriminatedUnion("fieldType", [
8035
+ previewTextValueSchema2,
8036
+ previewLinkValueSchema2,
8037
+ previewImageValueSchema2
8038
+ ]);
8039
+ var fieldSelectionModeSchema2 = z58.enum(["replace", "range", "toggle"]);
8040
+ var fieldBridgeMissingContentActionSchema2 = z58.enum([
8041
+ "add",
8042
+ "select",
8043
+ "remove"
8044
+ ]);
8045
+ var FIELD_BRIDGE_MESSAGE_TYPES2 = [
8046
+ "siteplane:field-bridge:init",
8047
+ "siteplane:field-bridge:ready",
8048
+ "siteplane:field-bridge:fields",
8049
+ "siteplane:field-bridge:select-field",
8050
+ "siteplane:field-bridge:set-selected-field",
8051
+ "siteplane:field-bridge:apply-preview-values",
8052
+ "siteplane:field-bridge:test-preview-values",
8053
+ "siteplane:field-bridge:preview-ack",
8054
+ "siteplane:field-bridge:set-visual-control-state",
8055
+ "siteplane:field-bridge:missing-content",
8056
+ "siteplane:field-bridge:preview-scrolled",
8057
+ "siteplane:field-bridge:analytics-probe",
8058
+ "siteplane:field-bridge:analytics-probe-result",
8059
+ "siteplane:field-bridge:error"
8060
+ ];
8061
+ var canonicalFieldContractHashSchema2 = z58.string().regex(/^sha256:[0-9a-f]{64}$/u);
8062
+ var bridgeSectionSchema2 = z58.string().trim().min(1).max(256);
8063
+ var realRenderedPathSchema2 = z58.string().trim().refine((value) => value.startsWith("/") && value !== "$global" && !value.includes("?") && !value.includes("#"), "A field bridge rendered path must be a real canonical path.");
8064
+ var fieldBridgeIdentitySchema2 = z58.object({
8065
+ publicRuntimeKeyId: z58.string().uuid(),
8066
+ fieldContractHash: canonicalFieldContractHashSchema2,
8067
+ deploymentRevision: z58.string().trim().min(1).max(256)
8068
+ }).strict();
8069
+ var setupPreviewAccessSchema2 = z58.object({
8070
+ capability: z58.string().regex(/^v1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{43}$/u).max(4096),
8071
+ expiresAt: z58.string().datetime()
8072
+ }).strict();
8073
+ var setupPreviewReadSchema2 = fieldBridgeIdentitySchema2.extend({
8074
+ scope: z58.literal("setup_preview"),
8075
+ siteId: z58.string().uuid(),
8076
+ runId: z58.string().uuid(),
8077
+ bridgeSessionId: z58.string().min(1),
8078
+ expiresAt: z58.string().datetime(),
8079
+ contract: siteFieldContractV1Schema2
8080
+ }).strict();
8081
+ var fieldBridgeBaseSchema2 = z58.object({
8082
+ version: z58.literal(BRIDGE_PROTOCOL_VERSION2),
8083
+ type: z58.enum(FIELD_BRIDGE_MESSAGE_TYPES2),
8084
+ siteId: z58.string().uuid(),
8085
+ sessionId: z58.string().trim().min(1),
8086
+ publicRuntimeKeyId: z58.string().uuid(),
8087
+ fieldContractHash: canonicalFieldContractHashSchema2,
8088
+ deploymentRevision: z58.string().trim().min(1).max(256),
8089
+ requestId: z58.string().trim().min(1),
8090
+ sentAt: z58.string().datetime()
8091
+ }).strict();
8092
+ var fieldBridgeFieldSchema2 = z58.object({
8093
+ fieldId: fieldIdSchema2,
8094
+ fieldType: fieldTypeSchema2,
8095
+ routeKey: siteFieldRouteKeySchema2,
8096
+ renderedPath: realRenderedPathSchema2,
8097
+ sourcePath: z58.string().trim().min(1).optional(),
8098
+ editTarget: fieldIdSchema2,
8099
+ rect: bridgeRectSchema2,
8100
+ targetResolved: z58.literal(true),
8101
+ currentValue: bridgePreviewValueSchema2.optional()
8102
+ }).strict();
8103
+ var fieldBridgeInitMessageSchema2 = fieldBridgeBaseSchema2.extend({
8104
+ type: z58.literal("siteplane:field-bridge:init"),
8105
+ payload: z58.object({
8106
+ adminOrigin: z58.string().url(),
8107
+ customerOrigin: z58.string().url(),
8108
+ renderedPath: realRenderedPathSchema2,
8109
+ setupPreview: setupPreviewAccessSchema2.optional()
8110
+ }).strict()
8111
+ });
8112
+ var fieldBridgeReadyMessageSchema2 = fieldBridgeBaseSchema2.extend({
8113
+ type: z58.literal("siteplane:field-bridge:ready"),
8114
+ payload: z58.object({
8115
+ renderedPath: realRenderedPathSchema2,
8116
+ fieldCount: z58.number().int().nonnegative(),
8117
+ capabilities: z58.tuple([
8118
+ z58.literal("field_selection"),
8119
+ z58.literal("preview_values"),
8120
+ z58.literal("field_evidence"),
8121
+ z58.literal("visual_field_control")
8122
+ ]).rest(z58.enum(["analytics_preview_readiness", "setup_preview"])).refine((capabilities) => capabilities.length <= 6)
8123
+ }).strict()
8124
+ });
8125
+ var fieldBridgeFieldsMessageSchema2 = fieldBridgeBaseSchema2.extend({
8126
+ type: z58.literal("siteplane:field-bridge:fields"),
8127
+ payload: z58.object({
8128
+ renderedPath: realRenderedPathSchema2,
8129
+ fields: z58.array(fieldBridgeFieldSchema2)
8130
+ }).strict()
8131
+ });
8132
+ var fieldBridgeSelectFieldMessageSchema2 = fieldBridgeBaseSchema2.extend({
8133
+ type: z58.literal("siteplane:field-bridge:select-field"),
8134
+ payload: z58.object({
8135
+ fieldId: fieldIdSchema2,
8136
+ selectionMode: fieldSelectionModeSchema2
8137
+ }).strict()
8138
+ });
8139
+ var fieldBridgeSetSelectedFieldMessageSchema2 = fieldBridgeBaseSchema2.extend({
8140
+ type: z58.literal("siteplane:field-bridge:set-selected-field"),
8141
+ payload: z58.object({
8142
+ fieldIds: z58.array(fieldIdSchema2).max(200),
8143
+ primaryFieldId: fieldIdSchema2.nullable(),
8144
+ scrollIntoView: z58.boolean().optional()
8145
+ }).strict().superRefine((value, context) => {
8146
+ if (value.fieldIds.length > 0 && value.primaryFieldId === null) {
8147
+ context.addIssue({
8148
+ code: "custom",
8149
+ message: "A non-empty selection needs a primary field.",
8150
+ path: ["primaryFieldId"]
8151
+ });
8152
+ }
8153
+ if (value.primaryFieldId !== null && !value.fieldIds.includes(value.primaryFieldId)) {
8154
+ context.addIssue({
8155
+ code: "custom",
8156
+ message: "The primary field must be part of the selection.",
8157
+ path: ["primaryFieldId"]
8158
+ });
8159
+ }
8160
+ })
8161
+ });
8162
+ var fieldBridgeApplyPreviewValuesMessageSchema2 = fieldBridgeBaseSchema2.extend({
8163
+ type: z58.literal("siteplane:field-bridge:apply-preview-values"),
8164
+ payload: z58.object({ values: z58.record(fieldIdSchema2, bridgePreviewValueSchema2) }).strict()
8165
+ });
8166
+ var fieldBridgeTestPreviewValuesMessageSchema2 = fieldBridgeBaseSchema2.extend({
8167
+ type: z58.literal("siteplane:field-bridge:test-preview-values"),
8168
+ payload: z58.object({ fieldIds: z58.array(fieldIdSchema2).min(1).max(200) }).strict()
8169
+ });
8170
+ var fieldBridgePreviewAckMessageSchema2 = fieldBridgeBaseSchema2.extend({
8171
+ type: z58.literal("siteplane:field-bridge:preview-ack"),
8172
+ payload: z58.object({
8173
+ ackRequestId: z58.string().trim().min(1),
8174
+ kind: z58.enum(["apply", "test"]),
8175
+ renderedPath: realRenderedPathSchema2,
8176
+ fieldIds: z58.array(fieldIdSchema2).max(200)
8177
+ }).strict()
8178
+ });
8179
+ var fieldBridgeSetVisualControlStateMessageSchema2 = fieldBridgeBaseSchema2.extend({
8180
+ type: z58.literal("siteplane:field-bridge:set-visual-control-state"),
8181
+ payload: z58.object({
8182
+ enabled: z58.boolean(),
8183
+ fieldProximityEnabled: z58.boolean(),
8184
+ pendingKeys: z58.array(z58.string().trim().min(1).max(2048)).max(50),
8185
+ activeFieldIds: z58.array(fieldIdSchema2),
8186
+ fieldSections: z58.record(fieldIdSchema2, bridgeSectionSchema2),
8187
+ selectedPending: z58.array(z58.object({
8188
+ key: z58.string().trim().min(1).max(2048),
8189
+ locatorHint: z58.string().trim().min(1).max(2048)
8190
+ }).strict()).max(50),
8191
+ scrollPendingIntoView: z58.boolean().optional()
8192
+ }).strict()
8193
+ });
8194
+ var fieldBridgeMissingContentMessageSchema2 = fieldBridgeBaseSchema2.extend({
8195
+ type: z58.literal("siteplane:field-bridge:missing-content"),
8196
+ payload: z58.object({
8197
+ action: fieldBridgeMissingContentActionSchema2,
8198
+ item: setupCorrectionItemSchema2,
8199
+ suggestedSection: bridgeSectionSchema2.optional()
8200
+ }).strict()
8201
+ });
8202
+ var fieldBridgePreviewScrolledMessageSchema2 = fieldBridgeBaseSchema2.extend({
8203
+ type: z58.literal("siteplane:field-bridge:preview-scrolled"),
8204
+ payload: z58.object({ renderedPath: realRenderedPathSchema2 }).strict()
8205
+ });
8206
+ var analyticsPreviewChallengeSchema2 = z58.object({
8207
+ bridgeSessionId: z58.string().uuid(),
8208
+ challenge: z58.string().min(32).max(512),
8209
+ testRunId: z58.string().trim().min(1).max(160),
8210
+ expiresAt: z58.string().datetime()
8211
+ }).strict();
8212
+ var fieldBridgeAnalyticsProbeSchema2 = fieldBridgeBaseSchema2.extend({
8213
+ type: z58.literal("siteplane:field-bridge:analytics-probe"),
8214
+ requestId: z58.string().min(1).max(256),
8215
+ payload: analyticsPreviewChallengeSchema2
8216
+ });
8217
+ var fieldBridgeAnalyticsProbeResultSchema2 = fieldBridgeBaseSchema2.extend({
8218
+ type: z58.literal("siteplane:field-bridge:analytics-probe-result"),
8219
+ payload: z58.object({
8220
+ ackRequestId: z58.string().min(1).max(256),
8221
+ status: z58.enum(["recorded", "failed"])
8222
+ }).strict()
8223
+ });
8224
+ var fieldBridgeErrorMessageSchema2 = fieldBridgeBaseSchema2.extend({
8225
+ type: z58.literal("siteplane:field-bridge:error"),
8226
+ payload: z58.object({
8227
+ code: z58.string().trim().min(1),
8228
+ message: z58.string().trim().min(1),
8229
+ recoverable: z58.boolean().default(false)
8230
+ }).strict()
8231
+ });
8232
+ var fieldBridgeMessageSchema2 = z58.discriminatedUnion("type", [
8233
+ fieldBridgeInitMessageSchema2,
8234
+ fieldBridgeReadyMessageSchema2,
8235
+ fieldBridgeFieldsMessageSchema2,
8236
+ fieldBridgeSelectFieldMessageSchema2,
8237
+ fieldBridgeSetSelectedFieldMessageSchema2,
8238
+ fieldBridgeApplyPreviewValuesMessageSchema2,
8239
+ fieldBridgeTestPreviewValuesMessageSchema2,
8240
+ fieldBridgePreviewAckMessageSchema2,
8241
+ fieldBridgeSetVisualControlStateMessageSchema2,
8242
+ fieldBridgeMissingContentMessageSchema2,
8243
+ fieldBridgePreviewScrolledMessageSchema2,
8244
+ fieldBridgeErrorMessageSchema2,
8245
+ fieldBridgeAnalyticsProbeSchema2,
8246
+ fieldBridgeAnalyticsProbeResultSchema2
8247
+ ]);
8248
+
8249
+ // ../shared/dist/commands.js
8250
+ import { z as z60 } from "zod";
8251
+
8252
+ // ../shared/dist/errors.js
8253
+ import { z as z59 } from "zod";
8254
+ var UI_ERROR_CATEGORIES2 = [
8255
+ "site_member",
8256
+ "workspace_member",
8257
+ "internal"
8258
+ ];
8259
+ var uiErrorCategorySchema2 = z59.enum(UI_ERROR_CATEGORIES2);
8260
+ var commandErrorPayloadSchema2 = z59.object({
8261
+ code: z59.string().min(1),
8262
+ message: z59.string().min(1),
8263
+ category: uiErrorCategorySchema2,
8264
+ details: z59.record(z59.string(), z59.unknown()).optional()
8265
+ });
8266
+
8267
+ // ../shared/dist/commands.js
8268
+ var commandSuccessSchema2 = z60.object({
8269
+ ok: z60.literal(true),
8270
+ data: z60.unknown()
8271
+ });
8272
+ var commandErrorSchema2 = z60.object({
8273
+ ok: z60.literal(false),
8274
+ error: commandErrorPayloadSchema2
8275
+ });
8276
+ var commandResultSchema2 = z60.discriminatedUnion("ok", [
8277
+ commandSuccessSchema2,
8278
+ commandErrorSchema2
8279
+ ]);
8280
+
8281
+ // ../shared/dist/editor-settings.js
8282
+ import { z as z61 } from "zod";
8283
+ var editorColorSchemeSchema2 = z61.enum([
8284
+ "paper",
8285
+ "slate",
8286
+ "siteplane",
8287
+ "bloom"
8288
+ ]);
8289
+ var editorColorSchemes2 = editorColorSchemeSchema2.options;
8290
+ var editorColorModeSchema2 = z61.enum(["light", "dark"]);
8291
+ var editorColorModes2 = editorColorModeSchema2.options;
8292
+
8293
+ // ../shared/dist/site-slug.js
8294
+ import { z as z62 } from "zod";
8295
+ var SITE_SLUG_PATTERN2 = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
8296
+ var RESERVED_SITE_SLUGS2 = /* @__PURE__ */ new Set([
8297
+ "account",
8298
+ "admin",
8299
+ "api",
8300
+ "app",
8301
+ "auth",
8302
+ "book",
8303
+ "claim",
8304
+ "dev",
8305
+ "login",
8306
+ "new",
8307
+ "portal",
8308
+ "support",
8309
+ "workspace"
8310
+ ]);
8311
+ var siteSlugSchema2 = z62.string().regex(SITE_SLUG_PATTERN2, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS2.has(value), "Reserved site slug");
8312
+
8313
+ // ../shared/dist/entitlements.js
8314
+ import { z as z63 } from "zod";
8315
+ var entitlementSnapshotSchema2 = z63.object({
8316
+ planKey: z63.string().trim().min(1),
8317
+ sitesLimit: z63.number().int().positive(),
8318
+ siteMembersPerSiteLimit: z63.number().int().positive(),
8319
+ customAdminDomainsEnabled: z63.boolean(),
8320
+ agentMcpEnabled: z63.boolean(),
8321
+ emailNotificationsEnabled: z63.boolean(),
8322
+ analyticsEnabled: z63.boolean(),
8323
+ analyticsSitesLimit: z63.number().int().min(0),
8324
+ analyticsPortalPerformanceEnabled: z63.boolean(),
8325
+ analyticsMonthlyReportsEnabled: z63.boolean(),
8326
+ analyticsAiSummaryEnabled: z63.boolean(),
8327
+ analyticsRawEventRetentionDays: z63.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS2.maxRawEventRetentionDaysWithoutAdr),
8328
+ analyticsMonthlyEventLimit: z63.number().int().min(0),
8329
+ bookingEnabled: z63.boolean().default(false),
8330
+ bookingSitesLimit: z63.number().int().min(0).default(0),
8331
+ bookingPortalManagementEnabled: z63.boolean().default(false),
8332
+ bookingResourcesPerSiteLimit: z63.number().int().min(0).default(0),
8333
+ bookingServicesPerSiteLimit: z63.number().int().min(0).default(0),
8334
+ bookingMonthlyBookingsLimit: z63.number().int().min(0).default(0),
8335
+ bookingRemindersEnabled: z63.boolean().default(false)
8336
+ });
8337
+ var EARLY_ACCESS_PLAN2 = {
8338
+ planKey: "early_access_2026",
8339
+ sitesLimit: 3,
8340
+ siteMembersPerSiteLimit: 5,
8341
+ customAdminDomainsEnabled: true,
8342
+ agentMcpEnabled: true,
8343
+ emailNotificationsEnabled: true,
8344
+ analyticsEnabled: true,
8345
+ analyticsSitesLimit: 3,
8346
+ analyticsPortalPerformanceEnabled: false,
8347
+ analyticsMonthlyReportsEnabled: false,
8348
+ analyticsAiSummaryEnabled: false,
8349
+ analyticsRawEventRetentionDays: ANALYTICS_RETENTION_DEFAULTS2.enabledRawEventRetentionDays,
8350
+ analyticsMonthlyEventLimit: 0,
8351
+ bookingEnabled: true,
8352
+ bookingSitesLimit: 3,
8353
+ bookingPortalManagementEnabled: true,
8354
+ bookingResourcesPerSiteLimit: 10,
8355
+ bookingServicesPerSiteLimit: 50,
8356
+ bookingMonthlyBookingsLimit: 0,
8357
+ bookingRemindersEnabled: true
8358
+ };
8359
+
8360
+ // ../shared/dist/first-party-image-upload.js
8361
+ var maxFirstPartyImageUploadBytes2 = 4 * 1024 * 1024;
8362
+
8363
+ // ../shared/dist/readiness.js
8364
+ import { z as z64 } from "zod";
8365
+ var READINESS_CHECK_KEYS2 = [
8366
+ "agent_instructions_installed",
8367
+ "runtime_package_connected",
8368
+ "secure_server_access_configured",
8369
+ "preview_bridge_working",
8370
+ "admin_access_url_selected",
8371
+ "default_publishing_mode_selected"
8372
+ ];
8373
+ var READINESS_STATUSES2 = [
8374
+ "pending",
8375
+ "passing",
8376
+ "failing",
8377
+ "warning"
8378
+ ];
8379
+ var readinessCheckKeySchema2 = z64.enum(READINESS_CHECK_KEYS2);
8380
+ var readinessStatusSchema2 = z64.enum(READINESS_STATUSES2);
8381
+
8382
+ // ../shared/dist/site.js
8383
+ import { z as z65 } from "zod";
8384
+ var SITE_STATUSES2 = [
8385
+ "setup",
8386
+ "active",
8387
+ "disabled",
8388
+ "archived"
8389
+ ];
8390
+ var siteStatusSchema2 = z65.enum(SITE_STATUSES2);
8391
+ var websiteUrlSchema2 = z65.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
8392
+
8393
+ // ../shared/dist/setup-assets.js
8394
+ import { z as z66 } from "zod";
8395
+ var configureSetupAssetTargetInputSchema2 = z66.object({
8396
+ siteId: z66.string().uuid(),
8397
+ runId: z66.string().uuid(),
8398
+ expectedReviewVersion: z66.number().int().positive(),
8399
+ expectedSnapshotHash: z66.string().regex(/^sha256:[0-9a-f]{64}$/u),
8400
+ mutationId: z66.string().uuid(),
8401
+ expectedApprovalId: z66.string().uuid().nullable(),
8402
+ targetId: z66.string().uuid().nullable(),
8403
+ targetType: z66.enum(["repo_static_assets", "siteplane_managed_fallback"]),
8404
+ approveManagedHosting: z66.boolean()
8405
+ }).strict().refine((value) => value.targetType === "siteplane_managed_fallback" || !value.approveManagedHosting);
8406
+ var setupAssetTargetApprovalSchema2 = z66.object({
8407
+ id: z66.string().uuid(),
8408
+ runId: z66.string().uuid(),
8409
+ reviewVersion: z66.number().int().positive(),
8410
+ snapshotHash: z66.string().regex(/^sha256:[0-9a-f]{64}$/u),
8411
+ targetId: z66.string().uuid(),
8412
+ targetType: z66.enum(["repo_static_assets", "siteplane_managed_fallback"]),
8413
+ targetRevision: z66.number().int().positive(),
8414
+ deploymentOrigin: z66.string().url(),
8415
+ gitConnectionId: z66.string().uuid().nullable(),
8416
+ gitRevision: z66.number().int().positive().nullable(),
8417
+ managedHostingApproved: z66.boolean(),
8418
+ actorUserId: z66.string().uuid(),
8419
+ approvedAt: z66.string().datetime({ offset: true })
8420
+ }).strict();
8421
+ var setupAssetReadinessSchema2 = z66.union([
8422
+ z66.object({
8423
+ status: z66.enum([
8424
+ "not_required",
8425
+ "needs_choice",
8426
+ "stale_setup_review",
8427
+ "permission_denied"
8428
+ ])
8429
+ }).strict(),
8430
+ z66.object({
8431
+ status: z66.literal("stale_approval"),
8432
+ approval: setupAssetTargetApprovalSchema2.optional()
8433
+ }).strict(),
8434
+ z66.object({
8435
+ status: z66.literal("not_verified"),
8436
+ approval: setupAssetTargetApprovalSchema2,
8437
+ jobId: z66.string().uuid().optional(),
8438
+ checkedAt: z66.string().datetime({ offset: true }).nullable().optional()
8439
+ }).strict(),
8440
+ z66.object({
8441
+ status: z66.enum(["ready", "checking", "retrying"]),
8442
+ approval: setupAssetTargetApprovalSchema2,
8443
+ jobId: z66.string().uuid(),
8444
+ checkedAt: z66.string().datetime({ offset: true }).nullable()
8445
+ }).strict().refine((value) => value.status !== "ready" || value.checkedAt !== null)
8446
+ ]);
8447
+ var checkSetupAssetTargetInputSchema2 = z66.object({
8448
+ siteId: z66.string().uuid(),
8449
+ runId: z66.string().uuid(),
8450
+ approvalId: z66.string().uuid(),
8451
+ intent: z66.enum(["start", "poll"])
8452
+ }).strict();
8453
+
8454
+ // ../shared/dist/setup-installation.js
8455
+ import { z as z67 } from "zod";
8456
+ var setupInstallationRequestSchema2 = z67.object({
8457
+ modules: siteSetupModulesSchema2,
8458
+ ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema2,
8459
+ provider: z67.object({
8460
+ projectId: z67.string().min(1).max(200),
8461
+ teamId: z67.string().min(1).max(200)
8462
+ }).strict()
8463
+ }).strict();
8464
+
8465
+ // ../shared/dist/setup-claim.js
8466
+ import { z as z68 } from "zod";
8467
+ var setupClaimCodeSchema2 = z68.string().regex(/^[0-9A-HJKMNP-TV-Z]{8}$/u);
8468
+ var setupClaimBindingSchema2 = z68.object({
8469
+ siteId: z68.string().uuid(),
8470
+ runId: z68.string().uuid()
8471
+ });
8472
+ var setupClaimReceiptSchema2 = setupClaimBindingSchema2.extend({
8473
+ status: z68.literal("claimed"),
8474
+ requestId: z68.string().uuid(),
8475
+ workspaceId: z68.string().uuid(),
8476
+ userId: z68.string().uuid(),
8477
+ claimedAt: z68.string().datetime({ offset: true })
8478
+ }).strict();
8479
+ var setupClaimInspectionSchema2 = setupClaimBindingSchema2.extend({
8480
+ status: z68.literal("pending"),
8481
+ requestId: z68.string().uuid(),
8482
+ siteName: z68.string(),
8483
+ userId: z68.string().uuid(),
8484
+ accountEmail: z68.string().email(),
8485
+ workspaceId: z68.string().uuid(),
8486
+ workspaceName: z68.string(),
8487
+ expiresAt: z68.string().datetime({ offset: true })
8488
+ }).strict();
8489
+ var setupClaimDenialSchema2 = z68.object({
8490
+ status: z68.enum([
8491
+ "invalid_claim_request",
8492
+ "invalid_installation",
8493
+ "already_claimed",
8494
+ "project_expired",
8495
+ "invalid_guest_session",
8496
+ "stale_setup_review",
8497
+ "verified_account_required",
8498
+ "workspace_access_denied",
8499
+ "workspace_entitlement_required",
8500
+ "site_limit_reached",
8501
+ "provisional_relationship_conflict",
8502
+ "rate_limited"
8503
+ ])
8504
+ }).strict();
8505
+
6414
8506
  // src/bin/run-siteplane.ts
6415
8507
  async function runSiteplaneCli(args, dependencies = createDefaultDependencies()) {
6416
8508
  const writes = args[0] === "init" || args[0] === "analytics" && args[1] === "init" || args[0] === "setup" && (["start", "apply", "prepare", "deploy"].includes(args[1] ?? "") || args[1] === "claim" && args[2] === "confirm");