siteplane 0.1.36 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/next.js CHANGED
@@ -10,7 +10,7 @@ import { dirname } from "path";
10
10
 
11
11
  // ../shared/dist/actors.js
12
12
  import { z } from "zod";
13
- var ACTOR_TYPES = ["developer", "client", "agent", "system"];
13
+ var ACTOR_TYPES = ["workspace_member", "site_member", "agent", "system"];
14
14
  var actorTypeSchema = z.enum(ACTOR_TYPES);
15
15
 
16
16
  // ../shared/dist/analytics-defaults.js
@@ -593,7 +593,7 @@ var bookingAvailabilityIntervalsSchema = z8.array(z8.object({
593
593
  });
594
594
  var bookingPublicConfigSchema = z8.object({
595
595
  site: z8.object({
596
- name: z8.string().trim().min(1),
596
+ displayName: z8.string().trim().min(1),
597
597
  timezone: z8.string().trim().min(1),
598
598
  locale: z8.string().trim().min(2),
599
599
  bookingPageSlug: z8.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
@@ -1213,6 +1213,9 @@ var CONTINUE_SITE_SETUP_MAX_ITEMS = 50;
1213
1213
  var CONTINUE_SITE_SETUP_RENDERED_PATH_MAX_BYTES = 512;
1214
1214
  var CONTINUE_SITE_SETUP_VISIBLE_VALUE_MAX_BYTES = 256;
1215
1215
  var CONTINUE_SITE_SETUP_LOCATOR_HINT_MAX_BYTES = 512;
1216
+ var CONTINUE_SITE_SETUP_REQUESTED_LABEL_MAX_BYTES = 120;
1217
+ var CONTINUE_SITE_SETUP_REQUESTED_SECTION_MAX_BYTES = 120;
1218
+ var CONTINUE_SITE_SETUP_REQUESTED_SUBSECTION_MAX_BYTES = 120;
1216
1219
  var CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES = 32 * 1024;
1217
1220
  var CONTINUE_SITE_SETUP_HTTP_BODY_MAX_BYTES = 64 * 1024;
1218
1221
  var siteSetupRunStatusSchema = z14.enum(SITE_SETUP_RUN_STATUSES);
@@ -1221,6 +1224,7 @@ var siteSetupErrorCodeSchema = z14.enum(SITE_SETUP_ERROR_CODES);
1221
1224
  var editorFieldSchema = z14.object({
1222
1225
  fieldId: fieldIdSchema,
1223
1226
  label: z14.string().trim().min(1),
1227
+ subsection: z14.string().trim().min(1).optional(),
1224
1228
  description: z14.string().trim().min(1).optional(),
1225
1229
  required: z14.boolean().optional(),
1226
1230
  maxLength: z14.number().int().positive().optional()
@@ -1228,7 +1232,24 @@ var editorFieldSchema = z14.object({
1228
1232
  var editorSectionSchema = z14.object({
1229
1233
  label: z14.string().trim().min(1),
1230
1234
  fields: z14.array(editorFieldSchema).min(1)
1231
- }).strict();
1235
+ }).strict().superRefine((section, context) => {
1236
+ const closedSubsections = /* @__PURE__ */ new Set();
1237
+ let currentSubsection;
1238
+ for (const [index, field] of section.fields.entries()) {
1239
+ if (field.subsection === currentSubsection)
1240
+ continue;
1241
+ if (currentSubsection)
1242
+ closedSubsections.add(currentSubsection);
1243
+ currentSubsection = field.subsection;
1244
+ if (currentSubsection && closedSubsections.has(currentSubsection)) {
1245
+ context.addIssue({
1246
+ code: "custom",
1247
+ message: `Subgroup fields must stay contiguous: ${currentSubsection}`,
1248
+ path: ["fields", index, "subsection"]
1249
+ });
1250
+ }
1251
+ }
1252
+ });
1232
1253
  var editorRouteSchema = z14.object({
1233
1254
  routeKey: siteFieldRouteKeySchema,
1234
1255
  label: z14.string().trim().min(1),
@@ -1308,13 +1329,34 @@ function normalizedSafeTextSchema(maxBytes, label) {
1308
1329
  var correctionItemBase = {
1309
1330
  renderedPath: renderedPathSchema,
1310
1331
  visibleValue: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_VISIBLE_VALUE_MAX_BYTES, "visibleValue"),
1311
- locatorHint: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_LOCATOR_HINT_MAX_BYTES, "locatorHint")
1332
+ locatorHint: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_LOCATOR_HINT_MAX_BYTES, "locatorHint"),
1333
+ requestedLabel: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_LABEL_MAX_BYTES, "requestedLabel").optional(),
1334
+ requestedSection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SECTION_MAX_BYTES, "requestedSection").optional(),
1335
+ requestedSubsection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SUBSECTION_MAX_BYTES, "requestedSubsection").optional(),
1336
+ requestedSortOrder: z14.number().int().nonnegative().optional()
1312
1337
  };
1313
1338
  var setupCorrectionItemSchema = z14.discriminatedUnion("kind", [
1314
1339
  z14.object({ kind: z14.literal("text"), ...correctionItemBase }).strict(),
1315
1340
  z14.object({ kind: z14.literal("link"), ...correctionItemBase }).strict(),
1316
1341
  z14.object({ kind: z14.literal("image"), ...correctionItemBase }).strict()
1317
- ]);
1342
+ ]).superRefine((item, context) => {
1343
+ if (item.requestedSubsection && !item.requestedSection) {
1344
+ context.addIssue({
1345
+ code: "custom",
1346
+ message: "requestedSubsection requires requestedSection.",
1347
+ path: ["requestedSubsection"]
1348
+ });
1349
+ }
1350
+ });
1351
+ var setupCorrectionItemsSchema = z14.array(setupCorrectionItemSchema).max(CONTINUE_SITE_SETUP_MAX_ITEMS).superRefine((items, context) => {
1352
+ const bytes = utf8Bytes(stableJsonStringify(items));
1353
+ if (bytes > CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES) {
1354
+ context.addIssue({
1355
+ code: "custom",
1356
+ message: "Correction items exceed the 32 KiB canonical payload limit."
1357
+ });
1358
+ }
1359
+ });
1318
1360
  var canonicalHashSchema = z14.string().regex(/^sha256:[0-9a-f]{64}$/iu);
1319
1361
  var deploymentRevisionSchema = normalizedSafeTextSchema(256, "deploymentRevision");
1320
1362
  var continueSiteSetupInputSchema = z14.object({
@@ -1322,17 +1364,8 @@ var continueSiteSetupInputSchema = z14.object({
1322
1364
  runId: z14.string().uuid(),
1323
1365
  expectedFieldContractHash: canonicalHashSchema,
1324
1366
  expectedDeploymentRevision: deploymentRevisionSchema,
1325
- correctionItems: z14.array(setupCorrectionItemSchema).max(CONTINUE_SITE_SETUP_MAX_ITEMS)
1326
- }).strict().superRefine((input, context) => {
1327
- const bytes = utf8Bytes(stableJsonStringify(input.correctionItems));
1328
- if (bytes > CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES) {
1329
- context.addIssue({
1330
- code: "custom",
1331
- message: "Correction items exceed the 32 KiB canonical payload limit.",
1332
- path: ["correctionItems"]
1333
- });
1334
- }
1335
- });
1367
+ correctionItems: setupCorrectionItemsSchema
1368
+ }).strict();
1336
1369
  var siteSetupContextInputSchema = z14.object({}).strict();
1337
1370
  var siteSetupApplyInputSchema = z14.object({
1338
1371
  fieldContract: siteFieldContractV1Schema,
@@ -1426,25 +1459,8 @@ var completeSiteSetupInputSchema = z14.object({
1426
1459
  runId: z14.string().uuid(),
1427
1460
  expectedFieldContractHash: canonicalHashSchema,
1428
1461
  expectedDeploymentRevision: deploymentRevisionSchema,
1429
- accessMode: z14.enum(["fallback", "custom_domain"]),
1430
- siteDomainId: z14.string().uuid().optional(),
1431
- defaultCanPublish: z14.boolean()
1432
- }).strict().superRefine((input, context) => {
1433
- if (input.accessMode === "fallback" && input.siteDomainId) {
1434
- context.addIssue({
1435
- code: "custom",
1436
- message: "Fallback access cannot use a custom domain.",
1437
- path: ["siteDomainId"]
1438
- });
1439
- }
1440
- if (input.accessMode === "custom_domain" && !input.siteDomainId) {
1441
- context.addIssue({
1442
- code: "custom",
1443
- message: "Custom-domain access requires a site domain.",
1444
- path: ["siteDomainId"]
1445
- });
1446
- }
1447
- });
1462
+ expectedReadyFingerprint: canonicalHashSchema
1463
+ }).strict();
1448
1464
  var refreshSiteSetupDeploymentInputSchema = z14.object({
1449
1465
  siteId: z14.string().uuid(),
1450
1466
  deploymentUrl: z14.string().url().refine((value) => value.startsWith("https://")),
@@ -1469,7 +1485,7 @@ function utf8Bytes(value) {
1469
1485
  }
1470
1486
 
1471
1487
  // ../shared/dist/bridge-protocol.js
1472
- var BRIDGE_PROTOCOL_VERSION = 1;
1488
+ var BRIDGE_PROTOCOL_VERSION = 2;
1473
1489
  var bridgeRectSchema = z15.object({
1474
1490
  x: z15.number(),
1475
1491
  y: z15.number(),
@@ -1496,6 +1512,12 @@ var bridgePreviewValueSchema = z15.discriminatedUnion("fieldType", [
1496
1512
  previewLinkValueSchema,
1497
1513
  previewImageValueSchema
1498
1514
  ]);
1515
+ var fieldSelectionModeSchema = z15.enum(["replace", "range", "toggle"]);
1516
+ var fieldBridgeMissingContentActionSchema = z15.enum([
1517
+ "add",
1518
+ "select",
1519
+ "remove"
1520
+ ]);
1499
1521
  var FIELD_BRIDGE_MESSAGE_TYPES = [
1500
1522
  "siteplane:field-bridge:init",
1501
1523
  "siteplane:field-bridge:ready",
@@ -1505,11 +1527,12 @@ var FIELD_BRIDGE_MESSAGE_TYPES = [
1505
1527
  "siteplane:field-bridge:apply-preview-values",
1506
1528
  "siteplane:field-bridge:test-preview-values",
1507
1529
  "siteplane:field-bridge:preview-ack",
1508
- "siteplane:field-bridge:set-editability-review",
1530
+ "siteplane:field-bridge:set-visual-control-state",
1509
1531
  "siteplane:field-bridge:missing-content",
1510
1532
  "siteplane:field-bridge:error"
1511
1533
  ];
1512
1534
  var canonicalFieldContractHashSchema = z15.string().regex(/^sha256:[0-9a-f]{64}$/u);
1535
+ var bridgeSectionSchema = z15.string().trim().min(1).max(256);
1513
1536
  var realRenderedPathSchema = z15.string().trim().refine((value) => value.startsWith("/") && value !== "$global" && !value.includes("?") && !value.includes("#"), "A field bridge rendered path must be a real canonical path.");
1514
1537
  var fieldBridgeIdentitySchema = z15.object({
1515
1538
  publicRuntimeKeyId: z15.string().uuid(),
@@ -1555,7 +1578,7 @@ var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
1555
1578
  z15.literal("field_selection"),
1556
1579
  z15.literal("preview_values"),
1557
1580
  z15.literal("field_evidence"),
1558
- z15.literal("editability_review")
1581
+ z15.literal("visual_field_control")
1559
1582
  ])
1560
1583
  }).strict()
1561
1584
  });
@@ -1568,14 +1591,33 @@ var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
1568
1591
  });
1569
1592
  var fieldBridgeSelectFieldMessageSchema = fieldBridgeBaseSchema.extend({
1570
1593
  type: z15.literal("siteplane:field-bridge:select-field"),
1571
- payload: z15.object({ fieldId: fieldIdSchema }).strict()
1594
+ payload: z15.object({
1595
+ fieldId: fieldIdSchema,
1596
+ selectionMode: fieldSelectionModeSchema
1597
+ }).strict()
1572
1598
  });
1573
1599
  var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
1574
1600
  type: z15.literal("siteplane:field-bridge:set-selected-field"),
1575
1601
  payload: z15.object({
1576
- fieldId: fieldIdSchema.nullable(),
1602
+ fieldIds: z15.array(fieldIdSchema).max(200),
1603
+ primaryFieldId: fieldIdSchema.nullable(),
1577
1604
  scrollIntoView: z15.boolean().optional()
1578
- }).strict()
1605
+ }).strict().superRefine((value, context) => {
1606
+ if (value.fieldIds.length > 0 && value.primaryFieldId === null) {
1607
+ context.addIssue({
1608
+ code: "custom",
1609
+ message: "A non-empty selection needs a primary field.",
1610
+ path: ["primaryFieldId"]
1611
+ });
1612
+ }
1613
+ if (value.primaryFieldId !== null && !value.fieldIds.includes(value.primaryFieldId)) {
1614
+ context.addIssue({
1615
+ code: "custom",
1616
+ message: "The primary field must be part of the selection.",
1617
+ path: ["primaryFieldId"]
1618
+ });
1619
+ }
1620
+ })
1579
1621
  });
1580
1622
  var fieldBridgeApplyPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
1581
1623
  type: z15.literal("siteplane:field-bridge:apply-preview-values"),
@@ -1594,13 +1636,28 @@ var fieldBridgePreviewAckMessageSchema = fieldBridgeBaseSchema.extend({
1594
1636
  fieldIds: z15.array(fieldIdSchema).max(200)
1595
1637
  }).strict()
1596
1638
  });
1597
- var fieldBridgeSetEditabilityReviewMessageSchema = fieldBridgeBaseSchema.extend({
1598
- type: z15.literal("siteplane:field-bridge:set-editability-review"),
1599
- payload: z15.object({ enabled: z15.boolean() }).strict()
1639
+ var fieldBridgeSetVisualControlStateMessageSchema = fieldBridgeBaseSchema.extend({
1640
+ type: z15.literal("siteplane:field-bridge:set-visual-control-state"),
1641
+ payload: z15.object({
1642
+ enabled: z15.boolean(),
1643
+ fieldProximityEnabled: z15.boolean(),
1644
+ pendingKeys: z15.array(z15.string().trim().min(1).max(2048)).max(50),
1645
+ activeFieldIds: z15.array(fieldIdSchema),
1646
+ fieldSections: z15.record(fieldIdSchema, bridgeSectionSchema),
1647
+ selectedPending: z15.array(z15.object({
1648
+ key: z15.string().trim().min(1).max(2048),
1649
+ locatorHint: z15.string().trim().min(1).max(2048)
1650
+ }).strict()).max(50),
1651
+ scrollPendingIntoView: z15.boolean().optional()
1652
+ }).strict()
1600
1653
  });
1601
1654
  var fieldBridgeMissingContentMessageSchema = fieldBridgeBaseSchema.extend({
1602
1655
  type: z15.literal("siteplane:field-bridge:missing-content"),
1603
- payload: z15.object({ item: setupCorrectionItemSchema }).strict()
1656
+ payload: z15.object({
1657
+ action: fieldBridgeMissingContentActionSchema,
1658
+ item: setupCorrectionItemSchema,
1659
+ suggestedSection: bridgeSectionSchema.optional()
1660
+ }).strict()
1604
1661
  });
1605
1662
  var fieldBridgeErrorMessageSchema = fieldBridgeBaseSchema.extend({
1606
1663
  type: z15.literal("siteplane:field-bridge:error"),
@@ -1619,7 +1676,7 @@ var fieldBridgeMessageSchema = z15.discriminatedUnion("type", [
1619
1676
  fieldBridgeApplyPreviewValuesMessageSchema,
1620
1677
  fieldBridgeTestPreviewValuesMessageSchema,
1621
1678
  fieldBridgePreviewAckMessageSchema,
1622
- fieldBridgeSetEditabilityReviewMessageSchema,
1679
+ fieldBridgeSetVisualControlStateMessageSchema,
1623
1680
  fieldBridgeMissingContentMessageSchema,
1624
1681
  fieldBridgeErrorMessageSchema
1625
1682
  ]);
@@ -1630,8 +1687,8 @@ import { z as z17 } from "zod";
1630
1687
  // ../shared/dist/errors.js
1631
1688
  import { z as z16 } from "zod";
1632
1689
  var UI_ERROR_CATEGORIES = [
1633
- "client",
1634
- "developer",
1690
+ "site_member",
1691
+ "workspace_member",
1635
1692
  "internal"
1636
1693
  ];
1637
1694
  var uiErrorCategorySchema = z16.enum(UI_ERROR_CATEGORIES);
@@ -1656,52 +1713,79 @@ var commandResultSchema = z17.discriminatedUnion("ok", [
1656
1713
  commandErrorSchema
1657
1714
  ]);
1658
1715
 
1659
- // ../shared/dist/fallback-portal.js
1716
+ // ../shared/dist/editor-settings.js
1660
1717
  import { z as z18 } from "zod";
1661
- var FALLBACK_PORTAL_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1662
- var fallbackPortalSlugSchema = z18.string().regex(FALLBACK_PORTAL_SLUG_PATTERN, "Invalid fallback portal slug");
1718
+ var editorColorSchemeSchema = z18.enum([
1719
+ "paper",
1720
+ "slate",
1721
+ "siteplane",
1722
+ "bloom"
1723
+ ]);
1724
+ var editorColorSchemes = editorColorSchemeSchema.options;
1725
+ var editorColorModeSchema = z18.enum(["light", "dark"]);
1726
+ var editorColorModes = editorColorModeSchema.options;
1663
1727
 
1664
- // ../shared/dist/entitlements.js
1728
+ // ../shared/dist/site-slug.js
1665
1729
  import { z as z19 } from "zod";
1666
- var entitlementSnapshotSchema = z19.object({
1667
- planKey: z19.string().trim().min(1),
1668
- sitesLimit: z19.number().int().positive(),
1669
- clientAccountsPerSiteLimit: z19.number().int().positive(),
1670
- customAdminDomainsEnabled: z19.boolean(),
1671
- agentMcpEnabled: z19.boolean(),
1672
- emailNotificationsEnabled: z19.boolean(),
1673
- analyticsEnabled: z19.boolean(),
1674
- analyticsSitesLimit: z19.number().int().min(0),
1675
- analyticsClientPerformanceEnabled: z19.boolean(),
1676
- analyticsMonthlyReportsEnabled: z19.boolean(),
1677
- analyticsAiSummaryEnabled: z19.boolean(),
1678
- analyticsRawEventRetentionDays: z19.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
1679
- analyticsMonthlyEventLimit: z19.number().int().min(0),
1680
- bookingEnabled: z19.boolean().default(false),
1681
- bookingSitesLimit: z19.number().int().min(0).default(0),
1682
- bookingClientManagementEnabled: z19.boolean().default(false),
1683
- bookingResourcesPerSiteLimit: z19.number().int().min(0).default(0),
1684
- bookingServicesPerSiteLimit: z19.number().int().min(0).default(0),
1685
- bookingMonthlyBookingsLimit: z19.number().int().min(0).default(0),
1686
- bookingRemindersEnabled: z19.boolean().default(false)
1730
+ var SITE_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1731
+ var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
1732
+ "account",
1733
+ "admin",
1734
+ "api",
1735
+ "app",
1736
+ "auth",
1737
+ "book",
1738
+ "claim",
1739
+ "dev",
1740
+ "login",
1741
+ "new",
1742
+ "portal",
1743
+ "support",
1744
+ "workspace"
1745
+ ]);
1746
+ var siteSlugSchema = z19.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
1747
+
1748
+ // ../shared/dist/entitlements.js
1749
+ import { z as z20 } from "zod";
1750
+ var entitlementSnapshotSchema = z20.object({
1751
+ planKey: z20.string().trim().min(1),
1752
+ sitesLimit: z20.number().int().positive(),
1753
+ siteMembersPerSiteLimit: z20.number().int().positive(),
1754
+ customAdminDomainsEnabled: z20.boolean(),
1755
+ agentMcpEnabled: z20.boolean(),
1756
+ emailNotificationsEnabled: z20.boolean(),
1757
+ analyticsEnabled: z20.boolean(),
1758
+ analyticsSitesLimit: z20.number().int().min(0),
1759
+ analyticsPortalPerformanceEnabled: z20.boolean(),
1760
+ analyticsMonthlyReportsEnabled: z20.boolean(),
1761
+ analyticsAiSummaryEnabled: z20.boolean(),
1762
+ analyticsRawEventRetentionDays: z20.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
1763
+ analyticsMonthlyEventLimit: z20.number().int().min(0),
1764
+ bookingEnabled: z20.boolean().default(false),
1765
+ bookingSitesLimit: z20.number().int().min(0).default(0),
1766
+ bookingPortalManagementEnabled: z20.boolean().default(false),
1767
+ bookingResourcesPerSiteLimit: z20.number().int().min(0).default(0),
1768
+ bookingServicesPerSiteLimit: z20.number().int().min(0).default(0),
1769
+ bookingMonthlyBookingsLimit: z20.number().int().min(0).default(0),
1770
+ bookingRemindersEnabled: z20.boolean().default(false)
1687
1771
  });
1688
1772
  var EARLY_ACCESS_PLAN = {
1689
1773
  planKey: "early_access_2026",
1690
1774
  sitesLimit: 3,
1691
- clientAccountsPerSiteLimit: 5,
1775
+ siteMembersPerSiteLimit: 5,
1692
1776
  customAdminDomainsEnabled: true,
1693
1777
  agentMcpEnabled: true,
1694
1778
  emailNotificationsEnabled: true,
1695
1779
  analyticsEnabled: false,
1696
1780
  analyticsSitesLimit: 0,
1697
- analyticsClientPerformanceEnabled: false,
1781
+ analyticsPortalPerformanceEnabled: false,
1698
1782
  analyticsMonthlyReportsEnabled: false,
1699
1783
  analyticsAiSummaryEnabled: false,
1700
1784
  analyticsRawEventRetentionDays: ANALYTICS_RETENTION_DEFAULTS.enabledRawEventRetentionDays,
1701
1785
  analyticsMonthlyEventLimit: 0,
1702
1786
  bookingEnabled: true,
1703
1787
  bookingSitesLimit: 3,
1704
- bookingClientManagementEnabled: true,
1788
+ bookingPortalManagementEnabled: true,
1705
1789
  bookingResourcesPerSiteLimit: 10,
1706
1790
  bookingServicesPerSiteLimit: 50,
1707
1791
  bookingMonthlyBookingsLimit: 0,
@@ -1709,7 +1793,7 @@ var EARLY_ACCESS_PLAN = {
1709
1793
  };
1710
1794
 
1711
1795
  // ../shared/dist/readiness.js
1712
- import { z as z20 } from "zod";
1796
+ import { z as z21 } from "zod";
1713
1797
  var READINESS_CHECK_KEYS = [
1714
1798
  "agent_instructions_installed",
1715
1799
  "runtime_package_connected",
@@ -1724,19 +1808,19 @@ var READINESS_STATUSES = [
1724
1808
  "failing",
1725
1809
  "warning"
1726
1810
  ];
1727
- var readinessCheckKeySchema = z20.enum(READINESS_CHECK_KEYS);
1728
- var readinessStatusSchema = z20.enum(READINESS_STATUSES);
1811
+ var readinessCheckKeySchema = z21.enum(READINESS_CHECK_KEYS);
1812
+ var readinessStatusSchema = z21.enum(READINESS_STATUSES);
1729
1813
 
1730
1814
  // ../shared/dist/site.js
1731
- import { z as z21 } from "zod";
1815
+ import { z as z22 } from "zod";
1732
1816
  var SITE_STATUSES = [
1733
1817
  "setup",
1734
- "client_ready",
1818
+ "active",
1735
1819
  "disabled",
1736
1820
  "archived"
1737
1821
  ];
1738
- var siteStatusSchema = z21.enum(SITE_STATUSES);
1739
- var websiteUrlSchema = z21.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
1822
+ var siteStatusSchema = z22.enum(SITE_STATUSES);
1823
+ var websiteUrlSchema = z22.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
1740
1824
 
1741
1825
  // ../cli/dist/analytics/static-scan.js
1742
1826
  import ts from "typescript";
@@ -1774,16 +1858,16 @@ ${analyticsRulesTemplate}`;
1774
1858
  import { createHash } from "crypto";
1775
1859
 
1776
1860
  // ../cli/dist/commands/analytics/public-key.js
1777
- import { z as z22 } from "zod";
1778
- var responseSchema = z22.object({
1779
- ok: z22.literal(true),
1780
- data: z22.object({
1781
- rawPublicKey: z22.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/)
1861
+ import { z as z23 } from "zod";
1862
+ var responseSchema = z23.object({
1863
+ ok: z23.literal(true),
1864
+ data: z23.object({
1865
+ rawPublicKey: z23.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/)
1782
1866
  })
1783
1867
  });
1784
- var errorResponseSchema = z22.object({
1785
- error: z22.object({
1786
- code: z22.string().regex(/^[a-z][a-z0-9_.-]+$/u)
1868
+ var errorResponseSchema = z23.object({
1869
+ error: z23.object({
1870
+ code: z23.string().regex(/^[a-z][a-z0-9_.-]+$/u)
1787
1871
  })
1788
1872
  });
1789
1873
 
@@ -1813,28 +1897,15 @@ alwaysApply: true
1813
1897
 
1814
1898
  ${bookingRulesTemplate}`;
1815
1899
 
1816
- // ../cli/dist/config/project-config.js
1817
- import { access, chmod, open, readFile as readFile5, rename, rm } from "fs/promises";
1818
- import { randomUUID as randomUUID2 } from "crypto";
1819
- import { join as join3 } from "path";
1820
- import { z as z23 } from "zod";
1821
- var siteplaneProjectConfigSchema = z23.object({
1822
- version: z23.literal(1),
1823
- apiBaseUrl: z23.string().url(),
1824
- siteId: z23.string().uuid(),
1825
- publicSiteKeyId: z23.string().uuid(),
1826
- publicSiteKey: z23.string().trim().min(1),
1827
- fieldContractHash: z23.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
1828
- }).strict();
1829
- async function readProjectConfig(projectDir) {
1830
- return siteplaneProjectConfigSchema.parse(JSON.parse(await readFile5(join3(projectDir, "siteplane.config.json"), "utf8")));
1831
- }
1900
+ // ../cli/dist/commands/connect.js
1901
+ import { randomBytes } from "crypto";
1902
+ import { z as z27 } from "zod";
1832
1903
 
1833
1904
  // ../cli/dist/config/credentials.js
1834
1905
  import { execFile } from "child_process";
1835
- import { randomUUID as randomUUID3 } from "crypto";
1836
- import { chmod as chmod2, mkdir as mkdir5, open as open2, readFile as readFile6, rename as rename2, rm as rm2 } from "fs/promises";
1837
- import { dirname as dirname5, join as join4, relative } from "path";
1906
+ import { randomUUID as randomUUID2 } from "crypto";
1907
+ import { chmod, mkdir as mkdir5, open, readFile as readFile5, rename, rm } from "fs/promises";
1908
+ import { dirname as dirname5, join as join3, relative } from "path";
1838
1909
  import { promisify } from "util";
1839
1910
  import { z as z24 } from "zod";
1840
1911
  var siteplaneCredentialsSchema = z24.object({
@@ -1843,32 +1914,66 @@ var siteplaneCredentialsSchema = z24.object({
1843
1914
  }).strict();
1844
1915
  var execFileAsync = promisify(execFile);
1845
1916
 
1846
- // ../cli/dist/commands/init.js
1847
- import { join as join5 } from "path";
1917
+ // ../cli/dist/config/project-config.js
1918
+ import { access, chmod as chmod2, open as open2, readFile as readFile6, rename as rename2, rm as rm2 } from "fs/promises";
1919
+ import { randomUUID as randomUUID3 } from "crypto";
1920
+ import { join as join4 } from "path";
1848
1921
  import { z as z25 } from "zod";
1849
- var siteSetupBootstrapDataSchema = z25.object({
1850
- credentialPurpose: z25.literal("site_setup"),
1922
+ var siteplaneProjectConfigSchema = z25.object({
1923
+ version: z25.literal(1),
1851
1924
  apiBaseUrl: z25.string().url(),
1852
1925
  siteId: z25.string().uuid(),
1853
1926
  publicSiteKeyId: z25.string().uuid(),
1854
1927
  publicSiteKey: z25.string().trim().min(1),
1855
- accessToken: z25.string().trim().min(1),
1856
- siteRevalidationSecret: z25.string().regex(/^[A-Za-z0-9_-]{43}$/u)
1928
+ fieldContractHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
1857
1929
  }).strict();
1858
- var featureBootstrapDataSchema = z25.object({
1859
- credentialPurpose: z25.enum(["analytics", "booking"]),
1860
- apiBaseUrl: z25.string().url(),
1861
- siteId: z25.string().uuid(),
1862
- accessToken: z25.string().trim().min(1)
1930
+ async function readProjectConfig(projectDir) {
1931
+ return siteplaneProjectConfigSchema.parse(JSON.parse(await readFile6(join4(projectDir, "siteplane.config.json"), "utf8")));
1932
+ }
1933
+
1934
+ // ../cli/dist/commands/init.js
1935
+ import { join as join5 } from "path";
1936
+ import { z as z26 } from "zod";
1937
+ var siteSetupBootstrapDataSchema = z26.object({
1938
+ credentialPurpose: z26.literal("site_setup"),
1939
+ apiBaseUrl: z26.string().url(),
1940
+ siteId: z26.string().uuid(),
1941
+ publicSiteKeyId: z26.string().uuid(),
1942
+ publicSiteKey: z26.string().trim().min(1),
1943
+ accessToken: z26.string().trim().min(1),
1944
+ siteRevalidationSecret: z26.string().regex(/^[A-Za-z0-9_-]{43}$/u)
1863
1945
  }).strict();
1864
- var bootstrapResponseSchema = z25.object({
1865
- ok: z25.literal(true),
1866
- data: z25.discriminatedUnion("credentialPurpose", [
1946
+ var featureBootstrapDataSchema = z26.object({
1947
+ credentialPurpose: z26.enum(["analytics", "booking"]),
1948
+ apiBaseUrl: z26.string().url(),
1949
+ siteId: z26.string().uuid(),
1950
+ accessToken: z26.string().trim().min(1)
1951
+ }).strict();
1952
+ var bootstrapResponseSchema = z26.object({
1953
+ ok: z26.literal(true),
1954
+ data: z26.discriminatedUnion("credentialPurpose", [
1867
1955
  siteSetupBootstrapDataSchema,
1868
1956
  featureBootstrapDataSchema
1869
1957
  ])
1870
1958
  }).strict();
1871
1959
 
1960
+ // ../cli/dist/commands/connect.js
1961
+ var claimResponseSchema = z27.object({
1962
+ ok: z27.literal(true),
1963
+ data: z27.object({
1964
+ pairingId: z27.string().uuid(),
1965
+ status: z27.literal("approval_required")
1966
+ }).passthrough()
1967
+ }).strict();
1968
+ var waitingResponseSchema = z27.object({
1969
+ ok: z27.literal(true),
1970
+ data: z27.object({ status: z27.literal("approval_required") }).strict()
1971
+ }).strict();
1972
+ var bootstrapResponseSchema2 = z27.object({
1973
+ ok: z27.literal(true),
1974
+ data: siteSetupBootstrapDataSchema
1975
+ }).strict();
1976
+
1872
1977
  // ../cli/dist/commands/scan.js
1873
1978
  import { readdir } from "fs/promises";
1874
1979
  import { extname, join as join6 } from "path";
@@ -1914,7 +2019,7 @@ async function collectSourceFiles(directory) {
1914
2019
  import { execFile as execFile2 } from "child_process";
1915
2020
  import { readFile as readFile7 } from "fs/promises";
1916
2021
  import { promisify as promisify2 } from "util";
1917
- import { z as z26 } from "zod";
2022
+ import { z as z28 } from "zod";
1918
2023
 
1919
2024
  // ../cli/dist/scan/next-source-scan.js
1920
2025
  import ts2 from "typescript";
@@ -2581,49 +2686,52 @@ function isPositionalFieldReference(value) {
2581
2686
 
2582
2687
  // ../cli/dist/commands/site-setup.js
2583
2688
  var execFileAsync2 = promisify2(execFile2);
2584
- var safeErrorSchema = z26.object({
2585
- code: z26.string().trim().min(1),
2586
- message: z26.string().trim().min(1)
2689
+ var safeErrorSchema = z28.object({
2690
+ code: z28.string().trim().min(1),
2691
+ message: z28.string().trim().min(1)
2587
2692
  }).passthrough();
2588
- var errorResponseSchema2 = z26.object({ ok: z26.literal(false), error: safeErrorSchema }).passthrough();
2589
- var contextDataSchema = z26.object({
2590
- site: z26.object({ siteId: z26.string().uuid(), websiteUrl: z26.string().url() }),
2591
- run: z26.object({
2592
- runId: z26.string().uuid(),
2593
- mode: z26.enum(["initial", "update"]),
2594
- status: z26.enum([
2693
+ var errorResponseSchema2 = z28.object({ ok: z28.literal(false), error: safeErrorSchema }).passthrough();
2694
+ var contextDataSchema = z28.object({
2695
+ site: z28.object({ siteId: z28.string().uuid(), portalPath: z28.string() }),
2696
+ run: z28.object({
2697
+ runId: z28.string().uuid(),
2698
+ mode: z28.enum(["initial", "update"]),
2699
+ status: z28.enum([
2595
2700
  "waiting_for_agent",
2596
2701
  "working",
2597
2702
  "action_required",
2598
2703
  "ready_for_review"
2599
2704
  ]),
2600
- fieldContractHash: z26.string().nullable(),
2601
- deploymentOrigin: z26.string().nullable(),
2602
- deploymentRevision: z26.string().nullable(),
2603
- errorCode: z26.string().nullable(),
2604
- errorMessage: z26.string().nullable()
2705
+ fieldContractHash: z28.string().nullable(),
2706
+ deploymentOrigin: z28.string().nullable(),
2707
+ deploymentRevision: z28.string().nullable(),
2708
+ errorCode: z28.string().nullable(),
2709
+ errorMessage: z28.string().nullable()
2605
2710
  }),
2606
- allowedTasks: z26.array(z26.string()),
2607
- requiredEnvironmentNames: z26.array(z26.string())
2711
+ structureHandoff: z28.object({
2712
+ pendingFields: z28.array(setupCorrectionItemSchema).min(1).max(50)
2713
+ }).strict().nullable(),
2714
+ allowedTasks: z28.array(z28.string()),
2715
+ requiredEnvironmentNames: z28.array(z28.string())
2608
2716
  }).strict();
2609
- var contextResponseSchema = z26.object({ ok: z26.literal(true), data: contextDataSchema }).strict();
2610
- var applyDataSchema = z26.object({
2611
- status: z26.enum(["applied", "ready_for_review"]),
2612
- runId: z26.string().uuid().optional(),
2613
- contractVersionId: z26.string().uuid().optional(),
2614
- fieldContractHash: z26.string().regex(/^sha256:[0-9a-f]{64}$/u),
2615
- editorDefinitionHash: z26.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
2616
- fieldCount: z26.number().int().nonnegative().optional(),
2617
- routeCount: z26.number().int().nonnegative().optional()
2717
+ var contextResponseSchema = z28.object({ ok: z28.literal(true), data: contextDataSchema }).strict();
2718
+ var applyDataSchema = z28.object({
2719
+ status: z28.enum(["applied", "ready_for_review"]),
2720
+ runId: z28.string().uuid().optional(),
2721
+ contractVersionId: z28.string().uuid().optional(),
2722
+ fieldContractHash: z28.string().regex(/^sha256:[0-9a-f]{64}$/u),
2723
+ editorDefinitionHash: z28.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
2724
+ fieldCount: z28.number().int().nonnegative().optional(),
2725
+ routeCount: z28.number().int().nonnegative().optional()
2618
2726
  }).strict();
2619
- var applyResponseSchema = z26.object({ ok: z26.literal(true), data: applyDataSchema }).strict();
2620
- var verifyDataSchema = z26.object({
2621
- status: z26.literal("ready_for_review"),
2622
- runId: z26.string().uuid().optional(),
2623
- deploymentOrigin: z26.string().url().optional(),
2624
- deploymentRevision: z26.string().optional()
2727
+ var applyResponseSchema = z28.object({ ok: z28.literal(true), data: applyDataSchema }).strict();
2728
+ var verifyDataSchema = z28.object({
2729
+ status: z28.literal("ready_for_review"),
2730
+ runId: z28.string().uuid().optional(),
2731
+ deploymentOrigin: z28.string().url().optional(),
2732
+ deploymentRevision: z28.string().optional()
2625
2733
  }).strict();
2626
- var verifyResponseSchema = z26.object({ ok: z26.literal(true), data: verifyDataSchema }).strict();
2734
+ var verifyResponseSchema = z28.object({ ok: z28.literal(true), data: verifyDataSchema }).strict();
2627
2735
 
2628
2736
  // src/next.ts
2629
2737
  var SiteplaneNextContractError = class extends Error {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "siteplane",
3
3
  "private": false,
4
- "version": "0.1.36",
4
+ "version": "0.1.38",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
7
7
  "publishConfig": {