@epilot/cli 0.1.187 → 0.1.189

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.
Files changed (77) hide show
  1. package/README.md +1 -1
  2. package/definitions/chat.json +1092 -1
  3. package/definitions/journey.json +356 -10
  4. package/definitions/pricing.json +949 -130
  5. package/dist/{access-token-K3EEFITL.js → access-token-UJUJQOUE.js} +2 -2
  6. package/dist/{add-component-OHVF6GHM.js → add-component-4HL3TUU4.js} +2 -2
  7. package/dist/{add-function-EA5TLKE2.js → add-function-EM6WZYWO.js} +2 -2
  8. package/dist/{address-Q563EUDC.js → address-55TGVABB.js} +2 -2
  9. package/dist/{address-suggestions-J67M2EZM.js → address-suggestions-TIMMLNQB.js} +2 -2
  10. package/dist/{ai-agents-KPSDQOQE.js → ai-agents-RDL7T77Z.js} +2 -2
  11. package/dist/{api-DN6H6NZL.js → api-P45NF5FD.js} +2 -2
  12. package/dist/app-UVBNHZSK.js +26 -0
  13. package/dist/{audit-logs-4W2KJG4S.js → audit-logs-R542PF5Z.js} +2 -2
  14. package/dist/{automation-HNNOLK54.js → automation-4IDC5B26.js} +2 -2
  15. package/dist/{billing-IHYHZGCM.js → billing-2MMFM7KK.js} +2 -2
  16. package/dist/bin/epilot.js +59 -59
  17. package/dist/{blueprint-manifest-WMQKKRR6.js → blueprint-manifest-PJHTF5LA.js} +2 -2
  18. package/dist/{calendar-QAOQCWMU.js → calendar-ZCSK5LBJ.js} +2 -2
  19. package/dist/{chat-FB6S42LR.js → chat-HX5FFFSM.js} +2 -2
  20. package/dist/{chunk-XGWPL4S5.js → chunk-CO4V7P7K.js} +1 -1
  21. package/dist/{chunk-YG5ECCJY.js → chunk-DKMPNHV3.js} +1 -1
  22. package/dist/{chunk-SNOVAU6A.js → chunk-JHYOEUZW.js} +1 -1
  23. package/dist/{chunk-7PFIKD6A.js → chunk-SLIK7OKM.js} +4 -2
  24. package/dist/{completion-66QFFIPF.js → completion-EIR3ZIXT.js} +1 -1
  25. package/dist/{configuration-hub-2RKCSLMK.js → configuration-hub-YW6B6TQV.js} +2 -2
  26. package/dist/{consent-KUZLQGSQ.js → consent-UFYBI6NG.js} +2 -2
  27. package/dist/{customer-portal-L4OAHC25.js → customer-portal-HSQ77RKF.js} +2 -2
  28. package/dist/{dashboard-J6O7DHS5.js → dashboard-LWVTV6WW.js} +2 -2
  29. package/dist/{data-governance-ZTNSO4L6.js → data-governance-7RR7F37N.js} +2 -2
  30. package/dist/{deduplication-JJUFITO5.js → deduplication-KKUK4MTF.js} +2 -2
  31. package/dist/{deploy-QI74LC3D.js → deploy-R3LWHLYC.js} +2 -2
  32. package/dist/{design-24OWTREI.js → design-WAVFXO2W.js} +2 -2
  33. package/dist/{dev-7GTJJUWI.js → dev-6RVM6CNK.js} +2 -2
  34. package/dist/{document-XWYU4VUR.js → document-2VCLGYEE.js} +2 -2
  35. package/dist/{email-settings-4FNVKKGV.js → email-settings-FRCW37U3.js} +2 -2
  36. package/dist/{email-template-ABJVGRMS.js → email-template-Y5EAT2UK.js} +2 -2
  37. package/dist/{entity-MVS7KKYJ.js → entity-2UFS2OY4.js} +2 -2
  38. package/dist/{entity-mapping-SZPA74XW.js → entity-mapping-X2Z4QHBT.js} +2 -2
  39. package/dist/{environments-PJSBW4KC.js → environments-R54GEDYZ.js} +2 -2
  40. package/dist/{event-catalog-SFVC2TZ7.js → event-catalog-RLMNBT6X.js} +2 -2
  41. package/dist/{export-EWKCSRVL.js → export-JC5X2SPO.js} +2 -2
  42. package/dist/{file-3ZKFSH6X.js → file-PZLBKQ3U.js} +2 -2
  43. package/dist/{iban-IOPTU3FC.js → iban-MEB4KAS5.js} +2 -2
  44. package/dist/{identity-ETX5ULDF.js → identity-NRIXV4GK.js} +2 -2
  45. package/dist/{init-GGNG6IZP.js → init-ZEPYSB4O.js} +2 -2
  46. package/dist/{integration-toolkit-NRJ4R4G6.js → integration-toolkit-YYCLXFIA.js} +2 -2
  47. package/dist/{journey-VF7CPPQ4.js → journey-DEO3NAGR.js} +2 -2
  48. package/dist/{kanban-YKMTDP2O.js → kanban-5JQXZW46.js} +2 -2
  49. package/dist/{message-6LNPHKAQ.js → message-2FWWOXOY.js} +2 -2
  50. package/dist/{metering-AQEOH4PR.js → metering-LRQIIUJO.js} +2 -2
  51. package/dist/{notes-I22AIJYK.js → notes-EHL4T5RL.js} +2 -2
  52. package/dist/{notification-OEK2WBIM.js → notification-W6N3DYAP.js} +2 -2
  53. package/dist/{organization-WSP4VTUD.js → organization-WJM5DZAA.js} +2 -2
  54. package/dist/{partner-directory-LFGXNXS5.js → partner-directory-GIZKJO2U.js} +2 -2
  55. package/dist/{permissions-6IBCUAPQ.js → permissions-2P5LYYSY.js} +2 -2
  56. package/dist/{pricing-I6GSXY2I.js → pricing-ZHYD7L6E.js} +2 -2
  57. package/dist/{pricing-tier-USE6246Q.js → pricing-tier-7S56JOST.js} +2 -2
  58. package/dist/{purpose-2JMP6CTG.js → purpose-KQVLO7V7.js} +2 -2
  59. package/dist/{query-WL7WCZ7U.js → query-WAF2QDBY.js} +2 -2
  60. package/dist/{remove-component-DFHGAD4D.js → remove-component-EGBBJ43V.js} +2 -2
  61. package/dist/{review-G7KAQU56.js → review-NJTIE5ZW.js} +2 -2
  62. package/dist/{sandbox-OFY7FYGU.js → sandbox-TUHU5KDY.js} +2 -2
  63. package/dist/{sharing-DEPPPDIM.js → sharing-DFUEKWI2.js} +2 -2
  64. package/dist/{snapshot-U33QHUNG.js → snapshot-6U45AVFX.js} +2 -2
  65. package/dist/{submission-EWZK2TCC.js → submission-CP43MPNC.js} +2 -2
  66. package/dist/{targeting-JXNBGXZD.js → targeting-PMJ4AQXS.js} +2 -2
  67. package/dist/{template-variables-J3MAF5XC.js → template-variables-FICUOY2R.js} +2 -2
  68. package/dist/{upgrade-CTI2BSVA.js → upgrade-YL5RDPCW.js} +1 -1
  69. package/dist/{user-4Q4NL5RK.js → user-TBE54MCQ.js} +2 -2
  70. package/dist/{validate-K4HFNGEP.js → validate-BM5LIBZE.js} +2 -2
  71. package/dist/{validation-rules-6PJBDCEO.js → validation-rules-XTGQM4XT.js} +2 -2
  72. package/dist/{versions-MEZD24QW.js → versions-IO5XYEF5.js} +2 -2
  73. package/dist/{webhooks-AK7XHMWD.js → webhooks-TN2WPIBR.js} +2 -2
  74. package/dist/{workflow-R7XZRKNG.js → workflow-DNNWRX5J.js} +2 -2
  75. package/dist/{workflow-definition-7WT3RAQS.js → workflow-definition-CW2UEFH2.js} +2 -2
  76. package/package.json +1 -1
  77. package/dist/app-FTWXW43W.js +0 -26
@@ -527,10 +527,13 @@
527
527
  "get": {
528
528
  "operationId": "getJourneyEnvironment",
529
529
  "summary": "getJourneyEnvironment",
530
- "description": "Resolve the environment variables referenced by this journey. Only browser-safe value types are returned.",
530
+ "description": "Resolve the environment variables referenced by this journey: the environment-backed datasources declared in its steps, whether they source a block's options or supply the value an attached validation rule compares against, answered per datasource id; and the variables its logic conditions read, keyed by variable key (`variables` / `variableErrors`). Only browser-safe value types are returned; validation-rule values additionally exclude `Map`. Accepts either the public journey access token bound to this journey, or the caller's own portal (ECP) or epilot user token. A PRIVATE journey is served only to a portal or user token permitted to view it, the same rule getJourney applies.",
531
531
  "security": [
532
532
  {
533
533
  "EpilotAuth": []
534
+ },
535
+ {
536
+ "PortalAuth": []
534
537
  }
535
538
  ],
536
539
  "tags": [
@@ -540,7 +543,7 @@
540
543
  {
541
544
  "name": "id",
542
545
  "in": "path",
543
- "description": "Journey ID bound to the supplied journey access token",
546
+ "description": "Journey ID",
544
547
  "required": true,
545
548
  "schema": {
546
549
  "type": "string",
@@ -550,7 +553,7 @@
550
553
  ],
551
554
  "responses": {
552
555
  "200": {
553
- "description": "Resolved environment-backed datasources",
556
+ "description": "Resolved environment-backed datasources and validation-rule environment values",
554
557
  "headers": {
555
558
  "Cache-Control": {
556
559
  "schema": {
@@ -568,10 +571,10 @@
568
571
  }
569
572
  },
570
573
  "401": {
571
- "description": "Journey access token missing"
574
+ "description": "Token missing, invalid, or naming no organization"
572
575
  },
573
576
  "403": {
574
- "description": "Journey access token does not match the journey"
577
+ "description": "Journey access token does not match the journey, or the journey is PRIVATE and the token is not permitted to view it"
575
578
  },
576
579
  "502": {
577
580
  "description": "Environment resolver unavailable"
@@ -579,11 +582,74 @@
579
582
  }
580
583
  }
581
584
  },
585
+ "/v1/journey/configuration/{id}/external-values": {
586
+ "post": {
587
+ "operationId": "resolveJourneyExternalValues",
588
+ "summary": "resolveJourneyExternalValues",
589
+ "description": "Resolve the External Values hooks this journey's validation rules compare against.\n\nThe journey runtime never calls external-values-api itself. A request names a datasource\nid declared by the saved journey config; the app and hook it resolves are read from that\nconfig, so a visitor cannot aim an installed app's integration at an arbitrary hook.\n\nRequires a portal token: a hook call reaches the organization's third-party system, so it\nstays behind the identified-customer boundary. Public journeys skip these conditions.\n\nAnswers 200 whenever the request itself was valid, including when a hook failed — per\ndatasource, so one unreachable system never fails the rules that did resolve.\n",
590
+ "security": [
591
+ {
592
+ "PortalAuth": []
593
+ }
594
+ ],
595
+ "tags": [
596
+ "Journeys"
597
+ ],
598
+ "parameters": [
599
+ {
600
+ "name": "id",
601
+ "in": "path",
602
+ "description": "Journey ID",
603
+ "required": true,
604
+ "schema": {
605
+ "type": "string",
606
+ "format": "uuid"
607
+ }
608
+ }
609
+ ],
610
+ "requestBody": {
611
+ "required": true,
612
+ "content": {
613
+ "application/json": {
614
+ "schema": {
615
+ "$ref": "#/components/schemas/JourneyExternalValuesRequest"
616
+ }
617
+ }
618
+ }
619
+ },
620
+ "responses": {
621
+ "200": {
622
+ "description": "Resolution result per requested datasource",
623
+ "headers": {
624
+ "Cache-Control": {
625
+ "schema": {
626
+ "type": "string"
627
+ },
628
+ "description": "Always private, no-store"
629
+ }
630
+ },
631
+ "content": {
632
+ "application/json": {
633
+ "schema": {
634
+ "$ref": "#/components/schemas/JourneyExternalValuesResponse"
635
+ }
636
+ }
637
+ }
638
+ },
639
+ "400": {
640
+ "description": "Malformed request body"
641
+ },
642
+ "403": {
643
+ "description": "Not an identified portal user, or not permitted to read this journey"
644
+ }
645
+ }
646
+ }
647
+ },
582
648
  "/v1/journey/environment-variables": {
583
649
  "get": {
584
650
  "operationId": "getJourneyEnvironmentVariables",
585
651
  "summary": "getJourneyEnvironmentVariables",
586
- "description": "List the organization's environment variables that a journey block may use as an options source. Only Map variables that currently hold a valid value are returned. Intended for the journey builder's authoring UI; requires a journey authoring token, not an environments token.",
652
+ "description": "List the organization's client-safe environment variables a journey may use: Map and List<Link> as an options source; Text, Number, Boolean and lists of them in logic conditions. Only variables that currently hold a valid value are returned. Intended for the journey builder's authoring UI; requires a journey authoring token, not an environments token.",
587
653
  "security": [
588
654
  {
589
655
  "EpilotAuth": []
@@ -594,7 +660,7 @@
594
660
  ],
595
661
  "responses": {
596
662
  "200": {
597
- "description": "Map environment variables available as an options source",
663
+ "description": "Environment variables available to journeys",
598
664
  "headers": {
599
665
  "Cache-Control": {
600
666
  "schema": {
@@ -1476,6 +1542,40 @@
1476
1542
  }
1477
1543
  }
1478
1544
  },
1545
+ "EnvironmentScalarList": {
1546
+ "description": "A list of scalars, served under this service's own `List<Text>`,\n`List<Number>` or `List<Boolean>` token (ER-5455). Read by logic\nconditions; flattened to `items` by the journey runtime.\n",
1547
+ "type": "object",
1548
+ "required": [
1549
+ "itemType",
1550
+ "items"
1551
+ ],
1552
+ "properties": {
1553
+ "itemType": {
1554
+ "type": "string",
1555
+ "enum": [
1556
+ "Text",
1557
+ "Number",
1558
+ "Boolean"
1559
+ ]
1560
+ },
1561
+ "items": {
1562
+ "type": "array",
1563
+ "items": {
1564
+ "oneOf": [
1565
+ {
1566
+ "type": "string"
1567
+ },
1568
+ {
1569
+ "type": "number"
1570
+ },
1571
+ {
1572
+ "type": "boolean"
1573
+ }
1574
+ ]
1575
+ }
1576
+ }
1577
+ }
1578
+ },
1479
1579
  "JourneyEnvironmentResponse": {
1480
1580
  "type": "object",
1481
1581
  "required": [
@@ -1552,6 +1652,194 @@
1552
1652
  }
1553
1653
  }
1554
1654
  }
1655
+ },
1656
+ "variables": {
1657
+ "description": "Values read by logic conditions, keyed by variable key.",
1658
+ "type": "array",
1659
+ "items": {
1660
+ "type": "object",
1661
+ "required": [
1662
+ "key",
1663
+ "type",
1664
+ "value"
1665
+ ],
1666
+ "properties": {
1667
+ "key": {
1668
+ "type": "string"
1669
+ },
1670
+ "type": {
1671
+ "type": "string",
1672
+ "enum": [
1673
+ "Text",
1674
+ "Number",
1675
+ "Boolean",
1676
+ "List<Text>",
1677
+ "List<Number>",
1678
+ "List<Boolean>"
1679
+ ]
1680
+ },
1681
+ "value": {
1682
+ "oneOf": [
1683
+ {
1684
+ "type": "string"
1685
+ },
1686
+ {
1687
+ "type": "number"
1688
+ },
1689
+ {
1690
+ "type": "boolean"
1691
+ },
1692
+ {
1693
+ "$ref": "#/components/schemas/EnvironmentScalarList"
1694
+ }
1695
+ ]
1696
+ }
1697
+ }
1698
+ }
1699
+ },
1700
+ "variableErrors": {
1701
+ "description": "Logic-condition keys that did not resolve, keyed by variable key.",
1702
+ "type": "array",
1703
+ "items": {
1704
+ "type": "object",
1705
+ "required": [
1706
+ "key",
1707
+ "code"
1708
+ ],
1709
+ "properties": {
1710
+ "key": {
1711
+ "type": "string"
1712
+ },
1713
+ "code": {
1714
+ "type": "string",
1715
+ "enum": [
1716
+ "not_found",
1717
+ "unsupported_type",
1718
+ "not_set",
1719
+ "invalid_value"
1720
+ ]
1721
+ }
1722
+ }
1723
+ }
1724
+ }
1725
+ }
1726
+ },
1727
+ "JourneyExternalValuesRequest": {
1728
+ "type": "object",
1729
+ "required": [
1730
+ "items"
1731
+ ],
1732
+ "properties": {
1733
+ "items": {
1734
+ "type": "array",
1735
+ "minItems": 1,
1736
+ "maxItems": 10,
1737
+ "description": "The External Values datasources to resolve. A datasource is named by the id the journey config declares; the app and hook it points at are read from that config, never from this request.",
1738
+ "items": {
1739
+ "type": "object",
1740
+ "required": [
1741
+ "datasourceId",
1742
+ "context"
1743
+ ],
1744
+ "properties": {
1745
+ "datasourceId": {
1746
+ "type": "string"
1747
+ },
1748
+ "context": {
1749
+ "type": "object",
1750
+ "additionalProperties": true,
1751
+ "description": "Everything the hook reads, as one named map passed to it as `Context`: the validated value under `input`, plus each configured context binding under the name it was bound as."
1752
+ }
1753
+ }
1754
+ }
1755
+ }
1756
+ }
1757
+ },
1758
+ "JourneyExternalValuesResponse": {
1759
+ "type": "object",
1760
+ "required": [
1761
+ "items",
1762
+ "errors"
1763
+ ],
1764
+ "properties": {
1765
+ "items": {
1766
+ "type": "array",
1767
+ "items": {
1768
+ "type": "object",
1769
+ "required": [
1770
+ "datasourceId",
1771
+ "values"
1772
+ ],
1773
+ "properties": {
1774
+ "datasourceId": {
1775
+ "type": "string"
1776
+ },
1777
+ "values": {
1778
+ "type": "object",
1779
+ "description": "Successfully extracted and coerced results, keyed by `result_id` and narrowed to the results the journey declares.",
1780
+ "additionalProperties": true
1781
+ },
1782
+ "errors": {
1783
+ "type": "array",
1784
+ "items": {
1785
+ "$ref": "#/components/schemas/ExternalValueError"
1786
+ }
1787
+ },
1788
+ "policy": {
1789
+ "type": "object",
1790
+ "properties": {
1791
+ "on_unavailable": {
1792
+ "type": "string",
1793
+ "enum": [
1794
+ "skip",
1795
+ "block"
1796
+ ]
1797
+ }
1798
+ }
1799
+ }
1800
+ }
1801
+ }
1802
+ },
1803
+ "errors": {
1804
+ "type": "array",
1805
+ "description": "Datasources that produced no result at all.",
1806
+ "items": {
1807
+ "type": "object",
1808
+ "required": [
1809
+ "datasourceId",
1810
+ "code"
1811
+ ],
1812
+ "properties": {
1813
+ "datasourceId": {
1814
+ "type": "string"
1815
+ },
1816
+ "code": {
1817
+ "type": "string",
1818
+ "enum": [
1819
+ "unknown_datasource",
1820
+ "resolver_unavailable"
1821
+ ]
1822
+ }
1823
+ }
1824
+ }
1825
+ }
1826
+ }
1827
+ },
1828
+ "ExternalValueError": {
1829
+ "type": "object",
1830
+ "required": [
1831
+ "code"
1832
+ ],
1833
+ "properties": {
1834
+ "result_id": {
1835
+ "type": "string",
1836
+ "description": "Absent for hook-level failures, when no result was produced."
1837
+ },
1838
+ "code": {
1839
+ "type": "string"
1840
+ },
1841
+ "message": {
1842
+ "type": "string"
1555
1843
  }
1556
1844
  }
1557
1845
  },
@@ -1577,17 +1865,35 @@
1577
1865
  "type": {
1578
1866
  "type": "string",
1579
1867
  "enum": [
1868
+ "Text",
1869
+ "Number",
1870
+ "Boolean",
1580
1871
  "Map",
1581
- "List<Link>"
1872
+ "List<Link>",
1873
+ "List<Text>",
1874
+ "List<Number>",
1875
+ "List<Boolean>"
1582
1876
  ]
1583
1877
  },
1584
1878
  "value": {
1585
1879
  "oneOf": [
1880
+ {
1881
+ "type": "string"
1882
+ },
1883
+ {
1884
+ "type": "number"
1885
+ },
1886
+ {
1887
+ "type": "boolean"
1888
+ },
1586
1889
  {
1587
1890
  "$ref": "#/components/schemas/EnvironmentMap"
1588
1891
  },
1589
1892
  {
1590
1893
  "$ref": "#/components/schemas/EnvironmentLinkList"
1894
+ },
1895
+ {
1896
+ "$ref": "#/components/schemas/EnvironmentScalarList"
1591
1897
  }
1592
1898
  ]
1593
1899
  },
@@ -1736,6 +2042,10 @@
1736
2042
  "type": "boolean",
1737
2043
  "nullable": true
1738
2044
  },
2045
+ "guestVisible": {
2046
+ "type": "boolean",
2047
+ "nullable": true
2048
+ },
1739
2049
  "name": {
1740
2050
  "type": "string"
1741
2051
  },
@@ -1889,7 +2199,7 @@
1889
2199
  },
1890
2200
  "referenceType": {
1891
2201
  "type": "string",
1892
- "description": "Indicates reference type (block or context parameter)"
2202
+ "description": "Indicates reference type: block, context-parameter, datasource, global or environment (an organization environment variable, by key; ER-5455)"
1893
2203
  },
1894
2204
  "referenceId": {
1895
2205
  "type": "string",
@@ -2198,6 +2508,17 @@
2198
2508
  "thirdPartyCookies": {
2199
2509
  "type": "boolean",
2200
2510
  "description": "If false, third-party cookies are disabled to comply with GDPR regulations without asking for consent."
2511
+ },
2512
+ "betaFeatures": {
2513
+ "type": "object",
2514
+ "description": "Per-journey opt-ins to beta features. One named boolean per feature (no free-form map), so a mistyped key is rejected with 400 and generated client types stay explicit. Additive: a feature is on when its key is true OR the organization-wide PostHog flag for that feature is on.\n",
2515
+ "additionalProperties": false,
2516
+ "properties": {
2517
+ "modernProducts": {
2518
+ "type": "boolean",
2519
+ "description": "Opt this journey into the modern product presentation (product tiles and details modal). Effective when true OR the organization flag `journey-modern-products` is on.\n"
2520
+ }
2521
+ }
2201
2522
  }
2202
2523
  },
2203
2524
  "required": [
@@ -2217,6 +2538,11 @@
2217
2538
  "example": "123e4567-e89b-12d3-a456-426614174000"
2218
2539
  }
2219
2540
  },
2541
+ "blueprint_customization": {
2542
+ "type": "object",
2543
+ "description": "Blueprint field-locking contract (server-managed). Carries the\nauthor plane (locks, default level) and the org plane (server-derived\noverlay). Public writes never persist client-supplied values — the\nstored contract is authoritative; it is written only by the\nBlueprints install pipeline.\n",
2544
+ "additionalProperties": true
2545
+ },
2220
2546
  "createdBy": {
2221
2547
  "type": "string"
2222
2548
  },
@@ -2290,6 +2616,10 @@
2290
2616
  "type": "boolean",
2291
2617
  "nullable": true
2292
2618
  },
2619
+ "guestVisible": {
2620
+ "type": "boolean",
2621
+ "nullable": true
2622
+ },
2293
2623
  "name": {
2294
2624
  "type": "string"
2295
2625
  },
@@ -2443,7 +2773,7 @@
2443
2773
  },
2444
2774
  "referenceType": {
2445
2775
  "type": "string",
2446
- "description": "Indicates reference type (block or context parameter)"
2776
+ "description": "Indicates reference type: block, context-parameter, datasource, global or environment (an organization environment variable, by key; ER-5455)"
2447
2777
  },
2448
2778
  "referenceId": {
2449
2779
  "type": "string",
@@ -2734,6 +3064,17 @@
2734
3064
  "type": "number"
2735
3065
  }
2736
3066
  }
3067
+ },
3068
+ "betaFeatures": {
3069
+ "type": "object",
3070
+ "description": "Per-journey opt-ins to beta features. One named boolean per feature (no free-form map), so a mistyped key is rejected with 400 and generated client types stay explicit. Additive: a feature is on when its key is true OR the organization-wide PostHog flag for that feature is on.\n",
3071
+ "additionalProperties": false,
3072
+ "properties": {
3073
+ "modernProducts": {
3074
+ "type": "boolean",
3075
+ "description": "Opt this journey into the modern product presentation (product tiles and details modal). Effective when true OR the organization flag `journey-modern-products` is on.\n"
3076
+ }
3077
+ }
2737
3078
  }
2738
3079
  },
2739
3080
  "additionalProperties": false
@@ -2749,6 +3090,11 @@
2749
3090
  "format": "uuid",
2750
3091
  "example": "123e4567-e89b-12d3-a456-426614174000"
2751
3092
  }
3093
+ },
3094
+ "blueprint_customization": {
3095
+ "type": "object",
3096
+ "description": "Blueprint field-locking contract (server-managed). Carries the\nauthor plane (locks, default level) and the org plane (server-derived\noverlay). Public writes never persist client-supplied values — the\nstored contract is authoritative; it is written only by the\nBlueprints install pipeline.\n",
3097
+ "additionalProperties": true
2752
3098
  }
2753
3099
  },
2754
3100
  "required": [