siteplane 0.1.58 → 0.1.59

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,7 +5,7 @@ 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
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/manifest.js
8
+ // ../cli/dist/analytics/manifest.js
9
9
  import { mkdir, readFile, writeFile } from "fs/promises";
10
10
  import { dirname } from "path";
11
11
 
@@ -132,6 +132,7 @@ var analyticsMeasurementConfigSchema = z4.object({
132
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}$/;
135
136
  var analyticsSessionIdSchema = z5.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
136
137
  var analyticsVisitorIdSchema = z5.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
137
138
  var analyticsPersistedIdentityHashSchema = z5.string().regex(/^[a-f0-9]{64}$/u);
@@ -326,6 +327,10 @@ var analyticsNormalizedEventSchema = analyticsNormalizedEventBaseSchema.extend({
326
327
  function isServerOnlyAnalyticsEvent(eventName) {
327
328
  return serverOnlyAnalyticsEvents.includes(eventName);
328
329
  }
330
+ function getAnalyticsKeyLookup(rawKey) {
331
+ const match = ANALYTICS_KEY_PATTERN.exec(rawKey);
332
+ return match ? `${match[1]}_siteplane_${match[2]}` : null;
333
+ }
329
334
  function expandAnalyticsDataAttributeEvent(event) {
330
335
  if (event === "form") {
331
336
  return ["form_start", "form_submit", "form_error"];
@@ -1811,6 +1816,7 @@ var siteSetupEvidenceInputSchema = z16.object({
1811
1816
  bridgeSessionId: normalizedSafeTextSchema(256, "bridgeSessionId"),
1812
1817
  observations: z16.array(z16.object({
1813
1818
  fieldId: fieldIdSchema,
1819
+ fieldType: fieldTypeSchema,
1814
1820
  routeKey: siteFieldRouteKeySchema,
1815
1821
  renderedPath: renderedPathSchema,
1816
1822
  targetResolved: z16.boolean(),
@@ -2374,7 +2380,7 @@ var setupClaimDenialSchema = z27.object({
2374
2380
  ])
2375
2381
  }).strict();
2376
2382
 
2377
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/manifest.js
2383
+ // ../cli/dist/analytics/manifest.js
2378
2384
  async function readAnalyticsManifestFile(manifestPath) {
2379
2385
  return validateAnalyticsManifestInput(JSON.parse(await readFile(manifestPath, "utf8")));
2380
2386
  }
@@ -2389,10 +2395,10 @@ function validateAnalyticsManifestInput(input) {
2389
2395
  return redactAnalyticsManifest(analyticsManifestSchema.parse(input));
2390
2396
  }
2391
2397
 
2392
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/static-scan.js
2398
+ // ../cli/dist/analytics/static-scan.js
2393
2399
  import ts from "typescript";
2394
2400
 
2395
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/booking-providers.js
2401
+ // ../cli/dist/analytics/booking-providers.js
2396
2402
  function buildBookingProviderHintFromHref(href, mode, options = {}) {
2397
2403
  const url = parseStaticHttpUrl(href);
2398
2404
  if (!url) {
@@ -2452,7 +2458,7 @@ function normalizeHost(host) {
2452
2458
  return host.toLowerCase().replace(/\.$/u, "");
2453
2459
  }
2454
2460
 
2455
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/analytics/static-scan.js
2461
+ // ../cli/dist/analytics/static-scan.js
2456
2462
  function scanAnalyticsSourceFiles(files, input) {
2457
2463
  const targets = [];
2458
2464
  const hardErrors = [];
@@ -2739,7 +2745,7 @@ function inferRoute(filePath) {
2739
2745
  return route ? `/${route}` : "/";
2740
2746
  }
2741
2747
 
2742
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/booking/manifest.js
2748
+ // ../cli/dist/booking/manifest.js
2743
2749
  import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
2744
2750
  import { dirname as dirname2 } from "path";
2745
2751
  async function readBookingManifestFile(manifestPath) {
@@ -2782,7 +2788,7 @@ function collectRedactedBookingKeys(input, prefix = "") {
2782
2788
  });
2783
2789
  }
2784
2790
 
2785
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/booking/static-scan.js
2791
+ // ../cli/dist/booking/static-scan.js
2786
2792
  function scanBookingSourceFiles(files, input) {
2787
2793
  const embeds = files.flatMap(scanBookingEmbedFile);
2788
2794
  const findings = embeds.map(createEmbedFoundIssue);
@@ -2896,7 +2902,7 @@ function escapeRegExp(value) {
2896
2902
  return value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
2897
2903
  }
2898
2904
 
2899
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/check.js
2905
+ // ../cli/dist/commands/analytics/check.js
2900
2906
  import { readFile as readFile3 } from "fs/promises";
2901
2907
  async function analyticsCheckCommand(input) {
2902
2908
  const validatedManifest = await readAnalyticsManifestFile(input.manifestPath);
@@ -3035,7 +3041,7 @@ async function readCspWarnings(filePaths) {
3035
3041
  return warnings;
3036
3042
  }
3037
3043
 
3038
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/init.js
3044
+ // ../cli/dist/commands/analytics/init.js
3039
3045
  import { mkdir as mkdir3, writeFile as writeFile3 } from "fs/promises";
3040
3046
  import { dirname as dirname3, join } from "path";
3041
3047
  async function analyticsInitCommand(input) {
@@ -3132,10 +3138,10 @@ alwaysApply: true
3132
3138
 
3133
3139
  ${analyticsRulesTemplate}`;
3134
3140
 
3135
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/import.js
3141
+ // ../cli/dist/commands/analytics/import.js
3136
3142
  import { createHash } from "crypto";
3137
3143
 
3138
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/sync.js
3144
+ // ../cli/dist/commands/analytics/sync.js
3139
3145
  async function analyticsSyncCommand(input) {
3140
3146
  const redacted = validateAnalyticsManifestInput(input.manifest);
3141
3147
  const fetcher = input.fetchImpl ?? fetch;
@@ -3161,7 +3167,7 @@ function createAnalyticsCliRequestHeaders(config) {
3161
3167
  return headers;
3162
3168
  }
3163
3169
 
3164
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/import.js
3170
+ // ../cli/dist/commands/analytics/import.js
3165
3171
  async function analyticsImportCommand(input) {
3166
3172
  const payload = analyticsProviderImportSchema.parse(input.payload);
3167
3173
  const payloadHash = hashAnalyticsProviderImport(payload);
@@ -3187,7 +3193,7 @@ function hashAnalyticsProviderImport(payload) {
3187
3193
  return `sha256:${createHash("sha256").update(JSON.stringify(payload)).digest("hex")}`;
3188
3194
  }
3189
3195
 
3190
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/readiness.js
3196
+ // ../cli/dist/commands/analytics/readiness.js
3191
3197
  async function analyticsReadinessCommand(input) {
3192
3198
  const fetcher = input.fetchImpl ?? fetch;
3193
3199
  return fetcher(`${input.config.apiBaseUrl.replace(/\/$/u, "")}/api/cli/analytics/readiness`, {
@@ -3197,7 +3203,7 @@ async function analyticsReadinessCommand(input) {
3197
3203
  });
3198
3204
  }
3199
3205
 
3200
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/public-key.js
3206
+ // ../cli/dist/commands/analytics/public-key.js
3201
3207
  import { z as z28 } from "zod";
3202
3208
  var responseSchema = z28.object({
3203
3209
  ok: z28.literal(true),
@@ -3228,7 +3234,7 @@ async function analyticsPublicKeyCommand(input) {
3228
3234
  return parsed.data.data.rawPublicKey;
3229
3235
  }
3230
3236
 
3231
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/prepare.js
3237
+ // ../cli/dist/commands/analytics/prepare.js
3232
3238
  import { z as z29 } from "zod";
3233
3239
  var resultSchema = z29.object({
3234
3240
  ok: z29.literal(true),
@@ -3265,7 +3271,7 @@ async function analyticsPrepareCommand(input) {
3265
3271
  return parsed.data.data;
3266
3272
  }
3267
3273
 
3268
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/analytics/test.js
3274
+ // ../cli/dist/commands/analytics/test.js
3269
3275
  import { randomUUID } from "crypto";
3270
3276
  async function analyticsTestCommand(input) {
3271
3277
  const fetcher = input.fetchImpl ?? fetch;
@@ -3298,7 +3304,7 @@ async function analyticsTestCommand(input) {
3298
3304
  });
3299
3305
  }
3300
3306
 
3301
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/check.js
3307
+ // ../cli/dist/commands/booking/check.js
3302
3308
  import { readFile as readFile4 } from "fs/promises";
3303
3309
  async function bookingCheckCommand(input) {
3304
3310
  const validatedManifest = await readBookingManifestFile(input.manifestPath);
@@ -3341,7 +3347,7 @@ function createBoundaryErrors2(validation) {
3341
3347
  }));
3342
3348
  }
3343
3349
 
3344
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/init.js
3350
+ // ../cli/dist/commands/booking/init.js
3345
3351
  import { mkdir as mkdir4, writeFile as writeFile4 } from "fs/promises";
3346
3352
  import { dirname as dirname4, join as join2 } from "path";
3347
3353
  async function bookingInitCommand(input) {
@@ -3420,7 +3426,7 @@ alwaysApply: true
3420
3426
 
3421
3427
  ${bookingRulesTemplate}`;
3422
3428
 
3423
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/sync.js
3429
+ // ../cli/dist/commands/booking/sync.js
3424
3430
  async function bookingSyncCommand(input) {
3425
3431
  const redacted = validateBookingManifestInput(input.manifest);
3426
3432
  const fetcher = input.fetchImpl ?? fetch;
@@ -3446,7 +3452,7 @@ function createBookingCliRequestHeaders(config) {
3446
3452
  return headers;
3447
3453
  }
3448
3454
 
3449
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/booking/test.js
3455
+ // ../cli/dist/commands/booking/test.js
3450
3456
  async function bookingTestCommand(input) {
3451
3457
  const fetcher = input.fetchImpl ?? fetch;
3452
3458
  const booking = bookingCreateRequestSchema.parse(input.booking);
@@ -3462,7 +3468,7 @@ async function bookingTestCommand(input) {
3462
3468
  });
3463
3469
  }
3464
3470
 
3465
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/project-config.js
3471
+ // ../cli/dist/config/project-config.js
3466
3472
  import { access, chmod, open, readFile as readFile5, rename, rm } from "fs/promises";
3467
3473
  import { randomUUID as randomUUID2 } from "crypto";
3468
3474
  import { join as join3 } from "path";
@@ -3532,7 +3538,7 @@ async function writeJsonAtomically(path, value, mode) {
3532
3538
  }
3533
3539
  }
3534
3540
 
3535
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/credentials.js
3541
+ // ../cli/dist/config/credentials.js
3536
3542
  import { execFile } from "child_process";
3537
3543
  import { randomUUID as randomUUID3 } from "crypto";
3538
3544
  import { chmod as chmod2, lstat, mkdir as mkdir5, open as open2, readFile as readFile6, rename as rename2, rm as rm2 } from "fs/promises";
@@ -3653,18 +3659,18 @@ async function gitPathMatches(projectDir, path, command) {
3653
3659
  }
3654
3660
  }
3655
3661
 
3656
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/init.js
3662
+ // ../cli/dist/commands/init.js
3657
3663
  import { access as access3 } from "fs/promises";
3658
3664
  import { join as join7, relative as relative3 } from "path";
3659
3665
  import { z as z34 } from "zod";
3660
3666
 
3661
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-preflight.js
3667
+ // ../cli/dist/commands/setup-preflight.js
3662
3668
  import { createHash as createHash2 } from "crypto";
3663
3669
  import semver from "semver";
3664
3670
  import { minimatch } from "minimatch";
3665
3671
  import { parse as parseYaml } from "yaml";
3666
3672
 
3667
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/installed-package.js
3673
+ // ../cli/dist/config/installed-package.js
3668
3674
  import { createRequire } from "module";
3669
3675
  import { readFile as readFile7 } from "fs/promises";
3670
3676
  import { join as join5 } from "path";
@@ -3691,24 +3697,24 @@ async function assertExactSetupPackages(projectDir, packages) {
3691
3697
  dependencies: z32.record(z32.string(), z32.string()).optional(),
3692
3698
  devDependencies: z32.record(z32.string(), z32.string()).optional()
3693
3699
  }).parse(JSON.parse(await readFile7(join5(projectDir, "package.json"), "utf8")));
3694
- for (const [name2, version3] of [
3700
+ for (const [name2, version2] of [
3695
3701
  ["siteplane", packages.siteplane],
3696
3702
  ["@siteplane/runtime-next", packages.runtimeNext],
3697
3703
  ...packages.analytics ? [["@siteplane/analytics", packages.analytics]] : []
3698
3704
  ]) {
3699
3705
  const declared = manifest.dependencies?.[name2] ?? manifest.devDependencies?.[name2];
3700
3706
  const installed = await readInstalledPackage(projectDir, name2);
3701
- if (declared !== version3 || installed.version !== version3)
3707
+ if (declared !== version2 || installed.version !== version2)
3702
3708
  throw new Error("The installed Siteplane packages must match the current task's exact pins.");
3703
3709
  }
3704
3710
  }
3705
3711
 
3706
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-preflight.js
3712
+ // ../cli/dist/commands/setup-preflight.js
3707
3713
  import { access as access2, readFile as readFile8, realpath, readdir, readlink } from "fs/promises";
3708
3714
  import { dirname as dirname6, join as join6, relative as relative2, resolve, sep } from "path";
3709
3715
  import { z as z33 } from "zod";
3710
3716
 
3711
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-process.js
3717
+ // ../cli/dist/commands/setup-process.js
3712
3718
  import { spawn } from "child_process";
3713
3719
  var SetupFailure = class extends Error {
3714
3720
  code;
@@ -3806,7 +3812,7 @@ async function setupVercelApi(cwd, endpoint, body, method, options) {
3806
3812
  }
3807
3813
  }
3808
3814
 
3809
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-preflight.js
3815
+ // ../cli/dist/commands/setup-preflight.js
3810
3816
  var manifestSchema = z33.object({
3811
3817
  packageManager: z33.string().optional(),
3812
3818
  engines: z33.object({ node: z33.string().optional() }).optional(),
@@ -3836,7 +3842,7 @@ var exists = async (path) => access2(path).then(() => true, () => false);
3836
3842
  var fail = (code, message) => {
3837
3843
  throw new SetupFailure(code, message);
3838
3844
  };
3839
- var stable = (version3, major) => new RegExp(`^${major}\\.\\d+\\.\\d+$`, "u").test(version3);
3845
+ var stable = (version2, major) => new RegExp(`^${major}\\.\\d+\\.\\d+$`, "u").test(version2);
3840
3846
  async function inspectSetupLocalProject(projectDir) {
3841
3847
  const projectDirectory = await realpath(resolve(projectDir));
3842
3848
  const manifest = manifestSchema.parse(JSON.parse(await readFile8(join6(projectDirectory, "package.json"), "utf8")));
@@ -3909,7 +3915,7 @@ async function inspectSetupLocalProject(projectDir) {
3909
3915
  peerDependencies: z33.record(z33.string(), z33.string()).optional()
3910
3916
  })).optional()
3911
3917
  }).parse(JSON.parse(lockText)) : null;
3912
- async function version3(name3) {
3918
+ async function version2(name3) {
3913
3919
  try {
3914
3920
  return (await readInstalledPackage(projectDirectory, name3)).version;
3915
3921
  } catch {
@@ -3920,9 +3926,9 @@ async function inspectSetupLocalProject(projectDir) {
3920
3926
  }
3921
3927
  }
3922
3928
  const [nextVersion, reactVersion, reactDomVersion] = await Promise.all([
3923
- version3("next"),
3924
- version3("react"),
3925
- version3("react-dom")
3929
+ version2("next"),
3930
+ version2("react"),
3931
+ version2("react-dom")
3926
3932
  ]);
3927
3933
  if (!stable(nextVersion, 16))
3928
3934
  fail("unsupported_next_version", "Setup supports stable Next.js 16 App Router projects. Framework migration requires a separate owner decision.");
@@ -3963,8 +3969,6 @@ async function inspectSetupLocalProject(projectDir) {
3963
3969
  sourceConflicts.push("base_path");
3964
3970
  if (/\bloaderFile\s*:|\bloader\s*:\s*['"](?:custom|imgix|cloudinary|akamai)['"]/u.test(source))
3965
3971
  sourceConflicts.push(`inspect_image_loader:${file}`);
3966
- if (/\bmaximumRedirects\s*:\s*[1-9]/u.test(source))
3967
- sourceConflicts.push(`inspect_image_redirects:${file}`);
3968
3972
  }
3969
3973
  if (sourceConflicts.some((conflict) => conflict === "static_export" || conflict === "base_path"))
3970
3974
  fail("unsupported_server_configuration", "Resolve static export/basePath configuration explicitly; Siteplane requires its server-side admin and revalidation handlers.");
@@ -4127,7 +4131,7 @@ function safeGitRemote(value) {
4127
4131
  }
4128
4132
  }
4129
4133
 
4130
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/init.js
4134
+ // ../cli/dist/commands/init.js
4131
4135
  async function initCommand(input) {
4132
4136
  if (!input.setupToken.trim()) {
4133
4137
  throw new Error("A Siteplane setup token is required.");
@@ -4290,7 +4294,7 @@ function readErrorMessage(payload) {
4290
4294
  return null;
4291
4295
  }
4292
4296
 
4293
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/scan.js
4297
+ // ../cli/dist/commands/scan.js
4294
4298
  import { readdir as readdir2 } from "fs/promises";
4295
4299
  import { extname, join as join8 } from "path";
4296
4300
  var defaultScanRoots = ["app", "src", "pages", "components", "lib"];
@@ -4331,13 +4335,13 @@ async function collectSourceFiles(directory) {
4331
4335
  return files;
4332
4336
  }
4333
4337
 
4334
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/site-setup.js
4338
+ // ../cli/dist/commands/site-setup.js
4335
4339
  import { execFile as execFile2 } from "child_process";
4336
4340
  import { readFile as readFile9 } from "fs/promises";
4337
4341
  import { promisify as promisify2 } from "util";
4338
4342
  import { z as z35 } from "zod";
4339
4343
 
4340
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/scan/next-source-scan.js
4344
+ // ../cli/dist/scan/next-source-scan.js
4341
4345
  import ts2 from "typescript";
4342
4346
  import { isAbsolute, relative as relative4 } from "path";
4343
4347
  var eventPreviewHandlerMissingMessage = "Event preview fields must consume preview values with useSiteplanePreviewText from @siteplane/runtime-next/client or a siteplane:preview-value-applied listener.";
@@ -5038,7 +5042,7 @@ function isPositionalFieldReference(value) {
5038
5042
  return value ? /\[\d+\]|\.\d+(?:\.|$)/.test(value) : false;
5039
5043
  }
5040
5044
 
5041
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/site-setup.js
5045
+ // ../cli/dist/commands/site-setup.js
5042
5046
  var execFileAsync2 = promisify2(execFile2);
5043
5047
  var safeErrorSchema = z35.object({
5044
5048
  code: z35.string().trim().min(1),
@@ -5236,7 +5240,7 @@ async function siteSetupActivityCommand(input) {
5236
5240
  return response.ok && parsed.success ? parsed.data.data : actionRequired(response.payload, "Setup activity could not be recorded.");
5237
5241
  }
5238
5242
 
5239
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-start.js
5243
+ // ../cli/dist/commands/setup-start.js
5240
5244
  import { randomBytes, randomUUID as randomUUID4 } from "crypto";
5241
5245
  import { access as access4 } from "fs/promises";
5242
5246
  import { join as join9, relative as relative5 } from "path";
@@ -5369,7 +5373,7 @@ async function exists2(path) {
5369
5373
  }
5370
5374
  }
5371
5375
 
5372
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-review.js
5376
+ // ../cli/dist/commands/setup-review.js
5373
5377
  import { z as z37 } from "zod";
5374
5378
  var responseSchema2 = z37.object({
5375
5379
  ok: z37.literal(true),
@@ -5454,7 +5458,7 @@ async function setupReviewCommand(input) {
5454
5458
  }
5455
5459
  }
5456
5460
 
5457
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-prepare.js
5461
+ // ../cli/dist/commands/setup-prepare.js
5458
5462
  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";
5459
5463
  import { randomUUID as randomUUID5 } from "crypto";
5460
5464
  import { dirname as dirname7, join as join10, relative as relative6, sep as sep2 } from "path";
@@ -5601,7 +5605,7 @@ ${task.goal}
5601
5605
 
5602
5606
  ${task.discovery.rules.map((rule) => `- ${rule}`).join("\n")}
5603
5607
 
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.
5608
+ 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 adds only the exact Siteplane asset route and website /siteplane-assets/ pattern while preserving existing sources, loaders, and redirect policy. This grants no hosting permission. If the website uses a global or component image loader, keep it and verify Siteplane image delivery explicitly. Inspect CSP written by middleware/proxy/meta tags before deployment. Use the provider-selected public SITEPLANE_SITE_ORIGIN for local builds.
5605
5609
  `);
5606
5610
  for (const [path, content] of files) {
5607
5611
  if (path === layoutPath || path === nextPath || path === guidePath)
@@ -5727,7 +5731,7 @@ async function assertSourcePath(root, target) {
5727
5731
  }
5728
5732
  }
5729
5733
 
5730
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-lock.js
5734
+ // ../cli/dist/commands/setup-lock.js
5731
5735
  import { randomUUID as randomUUID6 } from "crypto";
5732
5736
  import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
5733
5737
  import { resolve as resolve2 } from "path";
@@ -5790,7 +5794,7 @@ function locked() {
5790
5794
  return new SetupFailure("setup_process_active", "Another setup process owns this repository. Wait for it to finish; a live lock is never replaced.");
5791
5795
  }
5792
5796
 
5793
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/config/build-provenance.js
5797
+ // ../cli/dist/config/build-provenance.js
5794
5798
  import { createHash as createHash3 } from "crypto";
5795
5799
  import { execFile as execFile3 } from "child_process";
5796
5800
  import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
@@ -5856,7 +5860,7 @@ async function writeBuildProvenance(checkout, revision) {
5856
5860
  await writeFile5(target, JSON.stringify(record), { flag: "wx", mode: 384 });
5857
5861
  }
5858
5862
 
5859
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-deploy.js
5863
+ // ../cli/dist/commands/setup-deploy.js
5860
5864
  import { createHash as createHash4, randomBytes as randomBytes2, randomUUID as randomUUID7 } from "crypto";
5861
5865
  import { access as access6, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
5862
5866
  import { tmpdir } from "os";
@@ -6327,7 +6331,7 @@ async function setupDeployCommand(input, deps = defaults) {
6327
6331
  }
6328
6332
  }
6329
6333
 
6330
- // ../../../../../../Web-Dev/Programme/Siteplane/packages/cli/dist/commands/setup-claim.js
6334
+ // ../cli/dist/commands/setup-claim.js
6331
6335
  import { z as z41 } from "zod";
6332
6336
  async function setupClaimCommand(input) {
6333
6337
  const code = setupClaimCodeSchema.safeParse(input.code);
@@ -6409,2100 +6413,6 @@ function required(code, message) {
6409
6413
  return { status: "action_required", code, message };
6410
6414
  }
6411
6415
 
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
-
8506
6416
  // src/bin/run-siteplane.ts
8507
6417
  async function runSiteplaneCli(args, dependencies = createDefaultDependencies()) {
8508
6418
  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");