@salsita-ai/sdk 0.50.0-develop.c1dcc73e88 → 0.50.0-develop.ca72986c39

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 (411) hide show
  1. package/README.md +13 -12
  2. package/dist/application-spec/core/components/component-filter.d.ts +53 -0
  3. package/dist/application-spec/core/components/component-filter.js +1 -0
  4. package/dist/application-spec/core/components/index.d.ts +2 -0
  5. package/dist/application-spec/core/components/index.js +1 -0
  6. package/dist/application-spec/core/components/sdk-code-ref.d.ts +9 -0
  7. package/dist/application-spec/core/components/sdk-code-ref.js +1 -0
  8. package/dist/application-spec/core/enhanced-json-value.d.ts +0 -68
  9. package/dist/application-spec/core/enhanced-json-value.js +1 -1
  10. package/dist/application-spec/core/expressions/index.d.ts +2 -0
  11. package/dist/application-spec/core/expressions/index.js +1 -0
  12. package/dist/application-spec/core/expressions/relation-expression-params.d.ts +11 -0
  13. package/dist/application-spec/core/expressions/relation-expression-params.js +1 -0
  14. package/dist/application-spec/core/expressions/sdk-expression-implementation.d.ts +24 -0
  15. package/dist/application-spec/core/expressions/sdk-expression-implementation.js +1 -0
  16. package/dist/application-spec/core/index.d.ts +2 -0
  17. package/dist/application-spec/core/index.js +1 -1
  18. package/dist/application-spec/core/json-value.d.ts +1 -1
  19. package/dist/application-spec/{core → enhanced-json}/eval-to-constant.d.ts +1 -1
  20. package/dist/application-spec/enhanced-json/index.d.ts +4 -0
  21. package/dist/application-spec/enhanced-json/index.js +1 -0
  22. package/dist/application-spec/enhanced-json/is-enhanced-json-array.d.ts +2 -0
  23. package/dist/application-spec/enhanced-json/is-enhanced-json-array.js +1 -0
  24. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.d.ts +18 -0
  25. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.js +1 -0
  26. package/dist/application-spec/enhanced-json/schema-from-value.d.ts +24 -0
  27. package/dist/application-spec/enhanced-json/schema-from-value.js +1 -0
  28. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.d.ts +14 -0
  29. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.js +1 -0
  30. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.d.ts +12 -0
  31. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.js +1 -0
  32. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.d.ts +13 -0
  33. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.js +1 -0
  34. package/dist/application-spec/errors/diagnostic-codes.d.ts +4 -0
  35. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  36. package/dist/application-spec/errors/diagnostic-messages.d.ts +7 -0
  37. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  38. package/dist/application-spec/generate-application/code/generate-application-code.d.ts +3 -2
  39. package/dist/application-spec/generate-application/code/generate-application-code.js +1 -1
  40. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +9 -4
  41. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  42. package/dist/application-spec/generate-application/code/standalone-app-files.d.ts +2 -2
  43. package/dist/application-spec/generate-application/code/standalone-app-files.js +1 -1
  44. package/dist/application-spec/generate-application/code/templates/configurator-config.js +6 -4
  45. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +4 -4
  46. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.js +1 -1
  47. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +41 -40
  48. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-phx-globals.js +3 -0
  49. package/dist/application-spec/generate-application/code/templates/frontend-config.js +3 -5
  50. package/dist/application-spec/generate-application/code/templates/gitignore.js +1 -2
  51. package/dist/application-spec/generate-application/code/templates/globals.js +3 -3
  52. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -1
  53. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  54. package/dist/application-spec/generate-application/code/templates/package-json.js +1 -1
  55. package/dist/application-spec/generate-application/code/templates/root-tsconfig.d.ts +6 -0
  56. package/dist/application-spec/generate-application/code/templates/root-tsconfig.js +2 -0
  57. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  58. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +9 -3
  59. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  60. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +15 -7
  61. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  62. package/dist/application-spec/generate-application/code/templates/tsconfig.d.ts +5 -0
  63. package/dist/application-spec/generate-application/code/templates/tsconfig.js +1 -1
  64. package/dist/application-spec/generate-application/code/templates/webhook-index.d.ts +6 -1
  65. package/dist/application-spec/generate-application/code/templates/webhook-index.js +10 -1
  66. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -3
  67. package/dist/application-spec/generate-application/index.d.ts +2 -0
  68. package/dist/application-spec/generate-application/index.js +1 -1
  69. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +6 -2
  70. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  71. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +8 -1
  72. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  73. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +5 -1
  74. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  75. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.d.ts +43 -0
  76. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.js +1 -0
  77. package/dist/application-spec/generate-application/runtime/factory-data/index.d.ts +3 -0
  78. package/dist/application-spec/generate-application/runtime/factory-data/index.js +1 -0
  79. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.d.ts +13 -0
  80. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -0
  81. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +16 -0
  82. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -0
  83. package/dist/application-spec/generate-application/runtime/migrations/index.d.ts +1 -0
  84. package/dist/application-spec/generate-application/runtime/migrations/index.js +1 -0
  85. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +53 -0
  86. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.js +1 -0
  87. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +1 -1
  88. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  89. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  90. package/dist/application-spec/index.d.ts +1 -0
  91. package/dist/application-spec/index.js +1 -1
  92. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +16 -0
  93. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  94. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.d.ts +9 -0
  95. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.js +1 -0
  96. package/dist/application-spec/parse-application-files/categorize/module-analysis.d.ts +1 -1
  97. package/dist/application-spec/parse-application-files/categorize/module-analysis.js +1 -1
  98. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +16 -3
  99. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  100. package/dist/application-spec/parse-application-files/raw-spec/raw-spec-file.js +1 -1
  101. package/dist/application-spec/parse-application-files/spec/components/component-entry.d.ts +1 -9
  102. package/dist/application-spec/parse-application-files/spec/components/component-entry.js +1 -1
  103. package/dist/application-spec/parse-application-files/spec/components/component-filter.d.ts +1 -54
  104. package/dist/application-spec/parse-application-files/spec/components/component-filter.js +1 -1
  105. package/dist/application-spec/parse-application-files/spec/components/index.d.ts +1 -1
  106. package/dist/application-spec/parse-application-files/spec/components/index.js +1 -1
  107. package/dist/application-spec/parse-application-files/spec/expressions/expression.d.ts +1 -28
  108. package/dist/application-spec/parse-application-files/spec/expressions/expression.js +1 -1
  109. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +1 -1
  110. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  111. package/dist/application-spec/parse-application-files/spec/expressions/index.d.ts +0 -1
  112. package/dist/application-spec/parse-application-files/spec/expressions/index.js +1 -1
  113. package/dist/application-spec/parse-application-files/spec/expressions/memo-eval-plan.js +1 -1
  114. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  115. package/dist/application-spec/parse-application-files/spec/model/defaults.js +1 -1
  116. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  117. package/dist/client/phoenix-api.d.ts +463 -0
  118. package/dist/configurator/application-runtime/extensions/create-configurator-extensions.js +1 -1
  119. package/dist/configurator/application-runtime/extensions/selectors.d.ts +3 -1
  120. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  121. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +32 -1
  122. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  123. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +7 -1
  124. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  125. package/dist/configurator/application-runtime/extensions/systems/drag-and-drop-system/drag-and-drop-system.d.ts +3 -3
  126. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +20 -4
  127. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  128. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.d.ts +11 -0
  129. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.js +1 -0
  130. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -2
  131. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  132. package/dist/configurator/common/configurator-interface.d.ts +22 -1
  133. package/dist/configurator/common/configurator-interface.js +1 -1
  134. package/dist/configurator/common/frontend-analytics.d.ts +2 -0
  135. package/dist/configurator/common/frontend-analytics.js +1 -1
  136. package/dist/configurator/common/index.d.ts +2 -0
  137. package/dist/configurator/common/index.js +1 -1
  138. package/dist/configurator/common/use-finalize-action.d.ts +31 -0
  139. package/dist/configurator/common/use-finalize-action.js +1 -0
  140. package/dist/configurator/common/use-reset-camera.d.ts +6 -0
  141. package/dist/configurator/common/use-reset-camera.js +1 -0
  142. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +1 -1
  143. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +2 -2
  144. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  145. package/dist/configurator/pages/configurator-layout-name.d.ts +2 -0
  146. package/dist/configurator/pages/configurator-layout-name.js +1 -0
  147. package/dist/configurator/pages/default-configurator-elements.d.ts +7 -0
  148. package/dist/configurator/pages/default-configurator-elements.js +1 -0
  149. package/dist/configurator/pages/index.d.ts +1 -0
  150. package/dist/configurator/pages/index.js +1 -1
  151. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragHandle.d.ts +1 -1
  152. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragSceneHandle.d.ts +1 -1
  153. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicator.d.ts +1 -1
  154. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicatorInternal.d.ts +1 -1
  155. package/dist/configurator/scene/scene-entity/drag-and-drop/shared.d.ts +2 -2
  156. package/dist/configurator/scene/scene-entity/drag-and-drop/use-drag-object.d.ts +1 -1
  157. package/dist/configurator/scene/scene-entity/materials/RemoteReplacedMaterial.js +1 -1
  158. package/dist/configurator/scene/scene-entity/objects/SceneEntityObjectTextDecal.d.ts +1 -1
  159. package/dist/configurator/ui/assistant/AssistantChips.d.ts +8 -2
  160. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  161. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +1 -1
  162. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  163. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  164. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +13 -0
  165. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -0
  166. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.d.ts +22 -0
  167. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.js +1 -0
  168. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +27 -0
  169. package/dist/configurator/ui/assistant/entity-link/entity-link-state.js +1 -0
  170. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +5 -0
  171. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +1 -0
  172. package/dist/configurator/ui/assistant/entity-link/index.d.ts +3 -0
  173. package/dist/configurator/ui/assistant/entity-link/index.js +1 -0
  174. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.d.ts +1 -0
  175. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.js +1 -0
  176. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.d.ts +11 -0
  177. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.js +1 -0
  178. package/dist/configurator/ui/configurator-layout/{universal → slots/desktop-sidebar}/DesktopSidebar.d.ts +23 -14
  179. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.js +16 -0
  180. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.d.ts +1 -0
  181. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.js +1 -0
  182. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.d.ts +4 -4
  183. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  184. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.d.ts +3 -6
  185. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.js +1 -1
  186. package/dist/configurator/ui/configurator-layout/slots/slots.d.ts +1 -0
  187. package/dist/configurator/ui/configurator-layout/slots/slots.js +1 -1
  188. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.d.ts +1 -1
  189. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +2 -2
  190. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.d.ts +2 -2
  191. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.d.ts +2 -2
  192. package/dist/docs/dimensions/3d-scene-integration/dimension-indicators.mdx +2 -2
  193. package/dist/docs/dimensions/3d-scene-integration/editable-angle-indicator.mdx +1 -1
  194. package/dist/docs/dimensions/3d-scene-integration/editable-distance-dimension-indicator.mdx +1 -1
  195. package/dist/docs/dimensions/3d-scene-integration/list-selector-dimension-indicator.mdx +1 -1
  196. package/dist/docs/drag-and-drop/drag-handle.mdx +1 -1
  197. package/dist/docs/drag-and-drop/hotspot-handle.mdx +1 -1
  198. package/dist/docs/drag-and-drop/planes.mdx +1 -1
  199. package/dist/docs/drag-and-drop/rotatable.mdx +2 -2
  200. package/dist/docs/index.json +42 -1
  201. package/dist/docs/layouts/custom-layout.mdx +2125 -0
  202. package/dist/docs/layouts/header/fixed.mdx +2 -2
  203. package/dist/docs/layouts/header/floating.mdx +2 -2
  204. package/dist/docs/layouts/sidebar/in-a-custom-layout.mdx +380 -0
  205. package/dist/docs/layouts/sidebar-footer/basic.mdx +32 -77
  206. package/dist/docs/other-features/client-side-rendering/declarative.mdx +1 -1
  207. package/dist/docs/other-features/transformers.mdx +4 -0
  208. package/dist/docs/phoenix/application-states.mdx +9 -7
  209. package/dist/docs/phoenix/configurator-interface.mdx +136 -18
  210. package/dist/docs/phoenix/deployments.mdx +2 -6
  211. package/dist/docs/phoenix/finalization.mdx +1 -1
  212. package/dist/docs/phoenix/getting-started.mdx +1 -0
  213. package/dist/docs/phoenix/layout-slots.mdx +116 -0
  214. package/dist/docs/phoenix/localization.mdx +4 -4
  215. package/dist/docs/phoenix/migration-guide.mdx +19 -8
  216. package/dist/docs/phoenix/phoenix-cli.mdx +44 -8
  217. package/dist/docs/phoenix/project-structure.mdx +23 -7
  218. package/dist/docs/phoenix/sdk-builder-workflow.mdx +2 -2
  219. package/dist/docs/phoenix/testing.mdx +140 -0
  220. package/dist/docs/phoenix/webhook-membership.mdx +10 -9
  221. package/dist/docs/phoenix/webhooks.mdx +21 -4
  222. package/dist/domain/application/application-config.d.ts +3 -1
  223. package/dist/domain/application/assistant/assistant-fields.d.ts +12 -0
  224. package/dist/domain/application/assistant/assistant-fields.js +1 -0
  225. package/dist/domain/application/assistant/assistant-manifest.d.ts +9 -1
  226. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +38 -2
  227. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -1
  228. package/dist/domain/application/assistant/build-assistant-lenses.d.ts +14 -0
  229. package/dist/domain/application/assistant/build-assistant-lenses.js +5 -0
  230. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  231. package/dist/domain/application/assistant/create-assistant-execution-schema.d.ts +32 -0
  232. package/dist/domain/application/assistant/create-assistant-execution-schema.js +1 -0
  233. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  234. package/dist/domain/application/assistant/index.d.ts +6 -1
  235. package/dist/domain/application/assistant/index.js +1 -1
  236. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +20 -0
  237. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.js +1 -0
  238. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +10 -0
  239. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -0
  240. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +48 -0
  241. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -0
  242. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +15 -0
  243. package/dist/domain/application/assistant/session-setup/create-session-assistant.js +1 -0
  244. package/dist/domain/application/assistant/session-setup/index.d.ts +4 -0
  245. package/dist/domain/application/assistant/session-setup/index.js +1 -0
  246. package/dist/domain/application/configurator-builder.d.ts +5 -2
  247. package/dist/domain/application/configurator-builder.js +1 -1
  248. package/dist/domain/core/expression/constant-expressions.d.ts +16 -8
  249. package/dist/domain/core/invariant/violation.d.ts +50 -2
  250. package/dist/domain/core/invariant/violation.js +1 -1
  251. package/dist/domain/core/model/model.d.ts +1 -1
  252. package/dist/domain/domain-context/index.d.ts +1 -1
  253. package/dist/domain/domain-context/undo-system.d.ts +28 -1
  254. package/dist/domain/domain-context/undo-system.js +1 -1
  255. package/dist/domain/domain-runtime/access/selectors.d.ts +9 -0
  256. package/dist/domain/domain-runtime/access/selectors.js +1 -1
  257. package/dist/domain/domain-runtime/access/types.d.ts +2 -0
  258. package/dist/domain/domain-runtime/access/types.js +1 -1
  259. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  260. package/dist/domain/domain-runtime/domain-context/types.d.ts +4 -1
  261. package/dist/domain/domain-runtime/domain-runtime.d.ts +16 -0
  262. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +19 -0
  263. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -0
  264. package/dist/domain/domain-runtime/errors/implementation-error.d.ts +46 -0
  265. package/dist/domain/domain-runtime/errors/implementation-error.js +1 -0
  266. package/dist/domain/domain-runtime/errors/implementation-errors.d.ts +13 -0
  267. package/dist/domain/domain-runtime/errors/implementation-errors.js +1 -0
  268. package/dist/domain/domain-runtime/errors/index.d.ts +4 -0
  269. package/dist/domain/domain-runtime/errors/index.js +1 -0
  270. package/dist/domain/domain-runtime/errors/to-implementation-errors.d.ts +10 -0
  271. package/dist/domain/domain-runtime/errors/to-implementation-errors.js +1 -0
  272. package/dist/domain/domain-runtime/index.d.ts +1 -0
  273. package/dist/domain/domain-runtime/index.js +1 -1
  274. package/dist/domain/domain-runtime/spec/initialize.d.ts +11 -0
  275. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  276. package/dist/domain/domain-runtime/spec/module-checks/project-modules.d.ts +8 -1
  277. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +1 -1
  278. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.js +1 -1
  279. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -1
  280. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +1 -1
  281. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.js +1 -1
  282. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  283. package/dist/domain/domain-runtime/spec/types.d.ts +2 -0
  284. package/dist/domain/extensions/attribute-switch.d.ts +1 -1
  285. package/dist/domain/extensions/attribute-switch.js +1 -1
  286. package/dist/domain/extensions/canvas-config.d.ts +1 -1
  287. package/dist/domain/extensions/client-side-image.d.ts +2 -2
  288. package/dist/domain/extensions/client-side-image.js +1 -1
  289. package/dist/domain/extensions/common/angle-indicator-schema.d.ts +2 -2
  290. package/dist/domain/extensions/common/dimension-indicator-schema.d.ts +2 -2
  291. package/dist/domain/extensions/editable-angle-indicator.d.ts +1 -1
  292. package/dist/domain/extensions/editable-distance-dimension-indicator.d.ts +1 -1
  293. package/dist/domain/extensions/editable-offset-indicator.d.ts +1 -1
  294. package/dist/domain/extensions/editable-offset-indicator.js +1 -1
  295. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -1
  296. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -1
  297. package/dist/domain/extensions/horizontal-tabs.d.ts +2 -2
  298. package/dist/domain/extensions/list-selector-dimension-indicator.d.ts +1 -1
  299. package/dist/domain/extensions/navigation-steps.d.ts +2 -2
  300. package/dist/domain/extensions/offset-indicator.js +1 -1
  301. package/dist/domain/extensions/rotation-handle.d.ts +2 -2
  302. package/dist/domain/extensions/save-template-thumbnail.d.ts +2 -2
  303. package/dist/domain/extensions/save-template-thumbnail.js +1 -1
  304. package/dist/domain/extensions/scene-entity-animation.js +1 -1
  305. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +9 -0
  306. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  307. package/dist/domain/mocks/create-mock-domain.js +1 -1
  308. package/dist/domain/mocks/create-test-application-config.d.ts +59 -0
  309. package/dist/domain/mocks/create-test-application-config.js +1 -0
  310. package/dist/domain/mocks/index.d.ts +1 -0
  311. package/dist/domain/mocks/index.js +1 -1
  312. package/dist/domain/system-components/application-config.d.ts +2 -2
  313. package/dist/domain/system-components/child-entity-selection.js +1 -1
  314. package/dist/domain/system-components/collision-box-geometry.d.ts +4 -2
  315. package/dist/domain/system-components/collision-geometry.d.ts +4 -2
  316. package/dist/domain/system-components/collision-point-geometry.d.ts +4 -2
  317. package/dist/domain/system-components/common/material-override-schema.d.ts +2 -2
  318. package/dist/domain/system-components/common/recipes.d.ts +21 -3
  319. package/dist/domain/system-components/common/recipes.js +1 -1
  320. package/dist/domain/system-components/constraint.d.ts +10 -23
  321. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  322. package/dist/domain/system-components/drag-handle.js +1 -1
  323. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  324. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  325. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  326. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  327. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -1
  328. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  329. package/dist/domain/system-components/material-swatch.js +1 -1
  330. package/dist/domain/system-components/scene-entity-material-override.d.ts +1 -1
  331. package/dist/domain/system-components/scene-entity-object-material-override.d.ts +1 -1
  332. package/dist/domain/system-components/scene-entity-object-text-decal.d.ts +1 -1
  333. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.d.ts +1 -1
  334. package/dist/domain/system-components/scene-entity-transimissive-material-override.d.ts +1 -1
  335. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  336. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  337. package/dist/editor/mocks/EditorMockContext.js +1 -1
  338. package/dist/globals/index.d.ts +2 -0
  339. package/dist/i18n/locales/cs/messages.js +1 -1
  340. package/dist/i18n/locales/da/messages.js +1 -1
  341. package/dist/i18n/locales/de/messages.js +1 -1
  342. package/dist/i18n/locales/de-AT/messages.js +1 -1
  343. package/dist/i18n/locales/en/messages.js +1 -1
  344. package/dist/i18n/locales/en-AU/messages.js +1 -1
  345. package/dist/i18n/locales/en-GB/messages.js +1 -1
  346. package/dist/i18n/locales/es/messages.js +1 -1
  347. package/dist/i18n/locales/fr/messages.js +1 -1
  348. package/dist/i18n/locales/hu/messages.js +1 -1
  349. package/dist/i18n/locales/it/messages.js +1 -1
  350. package/dist/i18n/locales/nl/messages.js +1 -1
  351. package/dist/i18n/locales/pl/messages.js +1 -1
  352. package/dist/i18n/locales/pt/messages.js +1 -1
  353. package/dist/i18n/locales/ro/messages.js +1 -1
  354. package/dist/i18n/locales/sk/messages.js +1 -1
  355. package/dist/i18n/locales/tr/messages.js +1 -1
  356. package/dist/legacy/domain-cli/gen/constant-expressions.js +1 -1
  357. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  358. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  359. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +81 -68
  360. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  361. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  362. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  363. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +7 -1
  364. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -16
  365. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +14 -12
  366. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +13 -11
  367. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +13 -11
  368. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  369. package/dist/phoenix/application-spec/project-files.js +1 -1
  370. package/dist/phoenix/cli.js +1 -1
  371. package/dist/phoenix/commands/check.js +1 -1
  372. package/dist/phoenix/commands/deploy.js +1 -1
  373. package/dist/phoenix/commands/deps/deps.d.ts +52 -0
  374. package/dist/phoenix/commands/deps/deps.js +3 -0
  375. package/dist/phoenix/commands/deps/index.d.ts +1 -0
  376. package/dist/phoenix/commands/deps/index.js +1 -0
  377. package/dist/phoenix/commands/deps/sdk-manifest.d.ts +12 -0
  378. package/dist/phoenix/commands/deps/sdk-manifest.js +1 -0
  379. package/dist/phoenix/commands/dev.js +5 -5
  380. package/dist/phoenix/commands/fix.js +1 -1
  381. package/dist/phoenix/commands/index.d.ts +1 -0
  382. package/dist/phoenix/commands/index.js +1 -1
  383. package/dist/phoenix/services/application-spec-project-watcher.d.ts +2 -0
  384. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  385. package/dist/phoenix/services/source-archive.d.ts +1 -0
  386. package/dist/phoenix/services/source-archive.js +1 -1
  387. package/dist/phoenix/services/swc.js +1 -1
  388. package/dist/phoenix/utils/index.d.ts +1 -0
  389. package/dist/phoenix/utils/index.js +1 -1
  390. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +2 -0
  391. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  392. package/dist/react-sdk/application-runtime/routing/access-service.d.ts +1 -0
  393. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +17 -0
  394. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  395. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +30 -0
  396. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -0
  397. package/dist/react-sdk/domain-context/index.d.ts +2 -1
  398. package/dist/react-sdk/domain-context/index.js +1 -1
  399. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +5 -0
  400. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  401. package/dist/react-sdk/domain-controls/hooks/use-angle-dimension.d.ts +1 -1
  402. package/dist/ui-sdk/theme/types.d.ts +1 -1
  403. package/dist/webhook/builders/webhook-builder.js +1 -1
  404. package/package.json +33 -29
  405. package/schema/domain-spec.json +1115 -209
  406. package/dist/application-spec/generate-application/code/templates/webhook-implementation.d.ts +0 -1
  407. package/dist/application-spec/generate-application/code/templates/webhook-implementation.js +0 -7
  408. package/dist/configurator/ui/configurator-layout/universal/DesktopSidebar.js +0 -16
  409. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.d.ts +0 -0
  410. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.js +0 -0
  411. /package/dist/application-spec/{core → enhanced-json}/eval-to-constant.js +0 -0
@@ -0,0 +1,3 @@
1
+ import{existsSync as e}from"fs";import{readFile as r,writeFile as t}from"fs/promises";import{join as a}from"path";import{lt as n,minVersion as i,satisfies as o,validRange as s}from"semver";import{RuntimeReferenceStore as p,buildPhoenixDefinitions as l,parseApplicationFiles as d}from"#package/application-spec";import{getAllPhxDefinitions as c}from"#package/domain";import{readApplicationFiles as m}from"../../application-spec/application-spec-file-reader.js";import{swcEvalExpressionParser as f,swcModuleAnalyzer as u}from"../../application-spec/swc-module-analyzer.js";import{naturalCompare as h}from"../../utils/index.js";import{readSdkManifest as g}from"./sdk-manifest.js";let j=["@salsita-ai/platform-project-sdk","@salsita-ai/platform-common","@salsita-ai/platform-contracts","@salsita-ai/common","@salsita-ai/contracts"],k=["dependencies","devDependencies","optionalDependencies"],v=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),$=async t=>{let a;if(!e(t))throw Error(`phoenix deps found no package.json at ${t}. It brings the dependencies of an existing project in line with the SDK, so run it in the project folder.`);let n=await r(t,"utf-8");try{a=JSON.parse(n)}catch(e){throw Error(`phoenix deps could not read package.json because it is not valid JSON: ${e instanceof Error?e.message:String(e)} Fix the file and run phoenix deps again.`)}if(!v(a))throw Error("phoenix deps could not read package.json because it is not a JSON object. Fix the file and run phoenix deps again.");return{content:n,packageJson:a}},w=async(e,r)=>{let t=d({rawProjectFiles:await m({projectRoot:e,envs:{}}),phxDefinitions:l(c())},{analyzer:u,evalExpressionParser:f,referenceStore:new p,logger:r});if(!t.ok)throw Error(`phoenix deps could not parse the application spec, which says through useClerk whether the project needs @clerk/clerk-react:
2
+ ${t.errors.map(e=>` [${e.code}] ${e.message}`).join("\n")}
3
+ Fix these errors and run phoenix deps again.`);return t.value.applicationSpec.appMetadata.useClerk},x=e=>Object.fromEntries(k.map(r=>{let t=e[r];return[r,v(t)?Object.fromEntries(Object.entries(t).filter(e=>"string"==typeof e[1])):{}]})),b=({peer:e,found:r})=>void 0===r?{kind:"add",field:e.field,name:e.name,to:e.version}:{kind:"update",field:r.field,name:e.name,from:r.specifier,to:e.version,range:e.range},y=(e,r)=>{let t=new Set(r.flatMap(e=>"remove"===e.kind?[e.name]:[])),a=new Map(r.flatMap(e=>"update"===e.kind?[[e.name,e.to]]:[])),n=r.flatMap(e=>"add"===e.kind?[e]:[]),i=Object.entries(v(e)?e:{}).filter(([e])=>!t.has(e)).map(([e,r])=>[e,a.get(e)??r]);return Object.fromEntries([...n].sort((e,r)=>h(e.name,r.name)).reduce((e,r)=>{var t,a;let n;return t=r.name,a=r.to,-1===(n=e.findIndex(([e])=>h(e,t)>0))?[...e,[t,a]]:[...e.slice(0,n),[t,a],...e.slice(n)]},i))},S=e=>{switch(e.kind){case"add":return` ${e.field}: added ${e.name} ${e.to}`;case"update":var r,t;let a;return(r=e.from,t=e.to,null!==(a=i(r))&&n(t,a))?` ${e.field}: downgraded ${e.name} ${e.from} → ${e.to}, because the SDK supports ${e.range}`:` ${e.field}: updated ${e.name} ${e.from} → ${e.to}`;case"remove":return` ${e.field}: removed ${e.name}, which @salsita-ai/sdk replaces`}};export const findSdkPeerMismatches=({packageJson:e,useClerk:r})=>{let t=x(e);return(e=>{let{peerDependencies:r,optionalPeers:t}=g();return Object.entries(r).filter(([r])=>"@clerk/clerk-react"===r&&e||!t.includes(r)).map(([e,r])=>((e,r)=>{let t=i(r);if(null===t)throw Error(`The SDK's peer range "${r}" for ${e} matches no version, so no version of it can be required. The SDK installation is damaged; reinstall @salsita-ai/sdk.`);return{name:e,range:r,version:t.version,field:e.startsWith("@types/")?"devDependencies":"dependencies"}})(e,r))})(r).flatMap(e=>{let r=k.flatMap(r=>{let a=t[r]?.[e.name];return void 0===a?[]:[{field:r,specifier:a}]});return 0===r.length?[{peer:e,found:void 0}]:r.filter(r=>!((e,r)=>{if(null===s(e))return!0;let t=i(e);return null!==t&&o(t,r,{includePrerelease:!0})})(r.specifier,e.range)).map(r=>({peer:e,found:r}))})};export const runDepsCommand=async(e,{logger:r})=>{var n,i;let o,s,p,l,d,c,m,f=a(e.projectRoot,"package.json"),{content:u,packageJson:h}=await $(f),g=await w(e.projectRoot,r),v=(n=findSdkPeerMismatches({packageJson:h,useClerk:g}),o=x(h),s=k.flatMap(e=>j.filter(r=>o[e]?.[r]!==void 0).map(r=>({kind:"remove",field:e,name:r}))),[...n.map(b),...s]);0===v.length?r.success("package.json already declares every package the SDK needs. Nothing to change."):(await t(f,(p=e=>v.filter(r=>r.field===e),l=k.filter(e=>p(e).length>0),i=Object.fromEntries([...Object.entries(h).map(([e,r])=>{let t=l.find(r=>r===e);return void 0===t?[e,r]:[e,y(r,p(t))]}),...l.filter(e=>!(e in h)).map(e=>[e,y(void 0,p(e))])]),d=/^[ \t]+(?=")/m.exec(u)?.[0]??" ",c=u.includes("\r\n")?"\r\n":"\n",m=/\r?\n$/.test(u)?c:"",JSON.stringify(i,null,d).replace(/\n/g,c)+m)),r.success("Updated package.json:"),r.info(["",...v.map(S),"","Next step: pnpm install"].join("\n")))};
@@ -0,0 +1 @@
1
+ export { findSdkPeerMismatches, runDepsCommand } from './deps.js';
@@ -0,0 +1 @@
1
+ export{findSdkPeerMismatches,runDepsCommand}from"./deps.js";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The part of the SDK's own `package.json` that says which packages a project must install next to it. The SDK's
3
+ * `peerDependencies` are the single source of those versions: `phoenix deps` writes them into a project.
4
+ */
5
+ export interface SdkManifest {
6
+ /** Peer name to the semver range the SDK supports. */
7
+ readonly peerDependencies: Readonly<Record<string, string>>;
8
+ /** Peers the SDK marks optional, which a project installs only when it uses the feature behind them. */
9
+ readonly optionalPeers: readonly string[];
10
+ }
11
+ /** Reads the manifest of the SDK this CLI runs from. */
12
+ export declare const readSdkManifest: () => SdkManifest;
@@ -0,0 +1 @@
1
+ import{readFileSync as e}from"fs";import{fileURLToPath as r}from"url";import{z as t}from"zod";let a=t.object({peerDependencies:t.record(t.string(),t.string()).default({}),peerDependenciesMeta:t.record(t.string(),t.object({optional:t.boolean().optional()})).default({})}),o=r(new URL("../../../../package.json",import.meta.url));export const readSdkManifest=()=>{let r=a.safeParse(JSON.parse(e(o,"utf-8")));if(!r.success)throw Error(`The SDK's package.json at ${o} has no readable peerDependencies: ${r.error.message}. The SDK installation is damaged; reinstall @salsita-ai/sdk.`);let{peerDependencies:t,peerDependenciesMeta:s}=r.data;return{peerDependencies:t,optionalPeers:Object.entries(s).filter(([,e])=>!0===e.optional).map(([e])=>e)}};
@@ -1,5 +1,5 @@
1
- import{format as e}from"node:util";import{createServer as r}from"vite";import{startEditorServer as t}from"../editor-server/index.js";import{getDevelopmentCredentialHint as o}from"../services/development-credential.js";import{ApplicationSpecProjectWatcher as n,LinguiWatcher as s,LogBus as i,MockTemplateWatcher as a,PhoenixApplication as l,PhoenixPubSub as c,PhoenixStore as p,VariantPreviewService as d,WebhookTunnelMonitor as u,createBusLogger as m,getViteDevConfig as w,patchConsole as g,setViteLogSink as v}from"../services/index.js";import{prepareDevelopmentEnvironment as h}from"../services/prepare-development-environment.js";import{createWebhookTunnelTransport as f,readOrCreateTunnelSessionId as E,startWebhookService as b}from"../services/webhook-service/index.js";import{startTui as S}from"../tui/index.js";import{FileLogger as I,createLogger as k,exists as $}from"../utils/index.js";import{buildWebhooks as j,setLogger as x,webhookLogContext as P}from"../webhooks/index.js";import{generateProjectFilesAndInstallDependencies as R}from"./generate-project-files.js";import{readGeneratedEnvMarkers as T}from"./generated-env-markers.js";export const runDevCommand=async(N,D)=>{let{logger:y}=D,{sdkVersion:_,projectSlug:O,environmentSlug:L,cliUseWorkspace:U,enableEditor:V,editorWsPort:M,debug:W=!1,withLingui:G=!1,persistenceMode:Y,force:C=!1,tui:H=!1,serverUrl:B,credential:X,skipUpload:q}=N,F=null,J=null,Q=null,z=null,A=null,K=null,Z=null,ee=new I,er=new c,et=new i,eo=H&&!!process.stdout.isTTY&&!!process.stdin.isTTY,en=!eo,es=null;H&&!eo&&y.warn("TUI requested but stdin/stdout is not an interactive terminal — falling back to plain log output. Run phoenix dev --tui directly in a terminal to use the TUI.");let ei=null,ea=y,el=null,ec=()=>{es&&(es(),es=null),ei&&(ei.unmount(),ei=null,ea=k({debug:W,fileLogger:ee}))},ep=(e=0)=>el||(el=(async()=>{process.off("SIGINT",ed),process.off("SIGTERM",ed),process.off("uncaughtException",eu),ec(),ea.debug("Shutting down...");let r=[];for(let e of[{name:"lingui watcher",close:()=>z?.close()},{name:"project watcher",close:()=>K?.close()},{name:"mock template watcher",close:()=>A?.close()},{name:"editor server",close:()=>Q?.close()},{name:"variant previews",close:()=>Z?.close()},{name:"vite server",close:()=>F?.close()},{name:"webhook tunnel",close:()=>J?.stop()}])try{ea.debug(`Shutting down ${e.name}`),await e.close()}catch(t){r.push(`${e.name}: ${t instanceof Error?t.message:String(t)}`)}r.length>0&&ea.warn(`Cleanup warnings:
2
- ${r.join("\n ")}`),ea.debug("Shutdown complete"),await ee.close(),process.exit(e)})()),ed=()=>{ep(0)},eu=e=>{ec(),ea.error(`Uncaught exception: ${e.message}`),ep(1)};process.once("SIGINT",ed),process.once("SIGTERM",ed),process.once("uncaughtException",eu);try{await ee.init(".phoenix"),ea=m({bus:et,stream:"spec",debug:W,fileLogger:ee,echo:!0}),v((e,r)=>et.push("vite",e,r),{echo:en}),x({transports:[],log:(r,...t)=>{et.push("webhook","warn"===r||"error"===r?r:"info",e(...t)),en&&process.stdout.write(`${e(r,...t)}
3
- `)}}),er.browserConsole$.subscribe(e=>{et.push("browser",e.level,e.source?`[${e.source}] ${e.message}`:e.message);let r=`[${e.source?`browser:${e.source}`:"browser"}] ${e.message}`;ee.write("warn",r),en&&process.stderr.write(`⚠️ ${r}
4
- `)}),en&&(es=g(et,{echo:!0})),process.env.NODE_ENV="development",Y&&(process.env.PERSISTENCE_MODE=Y);let i=!Y||"server"===Y;i&&B&&(process.env.SERVER_URL=B);let c=i&&B?new u(B):void 0;if(ea.step("Starting development mode"),!await $("spec")){ea.error('Spec folder not found. Run "phoenix init" first.'),await ep(1);return}if(i){if(!B||!X)throw Error("Server persistence needs a server and a credential. Run `phoenix login <workspace>`, or create a development environment in Studio and paste its .env block into .env.");let e=await T(".env.generated");e?.PHOENIX_PROJECT_SLUG!==O||e.PHOENIX_ENVIRONMENT_SLUG!==L||e.PHOENIX_SERVER_URL!==B?(ea.step("Preparing development deployment"),await h({serverUrl:B,projectSlug:O,environmentSlug:L,credential:X,outFile:".env.generated",skipUpload:q,overrideSchema:!0,debug:W,projectVersion:_},{logger:ea})):ea.debug(".env.generated matches the current development environment, skipping prepare")}ea.step("Building project files");let{templateFiles:I}=await R({sdkVersion:_,projectSlug:O,environmentSlug:L,cliUseWorkspace:U,enableEditor:V,withLingui:G,force:C},{logger:ea});if(ea.success("Project files built successfully"),eo&&(ea=m({bus:et,stream:"spec",debug:W,fileLogger:ee}),es=g(et),ei=S(et,{onQuit:()=>void ep(0)})),G?(z=new s({logger:ea})).start():ea.warn("Lingui is disabled: i18n messages are not extracted or compiled during dev. Pass --withLingui or set WITH_LINGUI=true to enable."),i&&(ea.step("Building webhooks"),await P.run("webhook",async()=>{await j({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js"})})),i&&B&&X){let e=await T(".env.generated");if(!e?.DEPLOYMENT_ID)throw Error("Webhook tunnel cannot start because .env.generated has no DEPLOYMENT_ID. Rerun phoenix dev to prepare the development deployment.");let r=await E();J=await b({experimental:!0,transport:f({serverUrl:B,credential:X,projectSlug:O,environmentSlug:L}),rejectionHint:o(X,O),environmentSlug:L,deploymentId:e.DEPLOYMENT_ID,sessionId:r,onStatus:(t,o)=>{c?.setStatus(t,{deploymentId:e.DEPLOYMENT_ID,sessionId:r,message:o??null})},onRequest:e=>c?.record(e)}),c?.setStatus("waiting",{deploymentId:e.DEPLOYMENT_ID,sessionId:r}),J.stopped.catch(e=>{ec(),ea.error(`Webhook tunnel failed: ${e instanceof Error?e.message:String(e)}`),ep(1)}),ea.success("Webhook tunnel started")}K=new n({pubsub:er,logger:ea,onRebuilt:()=>z?.trigger(),onViteServerChange:e=>{F=e},sdkVersion:_,projectSlug:O,environmentSlug:L,cliUseWorkspace:U,enableEditor:V??!0,inlineTemplates:!1,useServer:i});let k=new p;if(Z=new l({store:k,pubsub:er,variantPreviews:new d({projectRoot:process.cwd()},{store:k,logger:ea,projectWatcher:K})}),V&&M){ea.step("Starting editor WebSocket server");let e=parseInt(M,10);Q=t({port:e,projectRoot:process.cwd(),application:Z,logger:ea,logBus:et,tunnelMonitor:c,debug:W,prepareDeployment:i&&B&&X?()=>h({serverUrl:B,projectSlug:O,environmentSlug:L,credential:X,outFile:".env.generated",skipUpload:!0,overrideSchema:!0,debug:!1,projectVersion:_},{logger:ea}):void 0}),await Q.ready,ea.debug(`Editor WebSocket server started on port ${e}`),(A=new a({projectRoot:process.cwd(),pubsub:er,logger:ea})).start()}let N=await w({templateFiles:I});F=await r(N),await F.listen(),ea.step("Starting Vite dev server"),K.start(F);let D=F.resolvedUrls?.local[0];if(eo)ea.success("Vite dev server started — watching for changes"),D&&ea.info(`Preview: ${D}`),V&&M&&ea.info(`Editor WebSocket: ws://localhost:${M}`);else if(W)ea.success("Vite dev server started"),D&&ea.info(`Preview: ${D}`);else{let e=e=>{et.push("spec","info",e),process.stdout.write(`${e}
5
- `)};e("\n\uD83D\uDE80 Phoenix Dev Server\n"),D&&(e(`Preview: ${D}`),ee.write("info",`Preview: ${D}`)),V&&M&&e(`Editor WebSocket: ws://localhost:${M}`),e("\n\uD83D\uDC40 Watching for changes...\n")}}catch(e){ec(),ea.error(`Dev mode failed: ${e instanceof Error?e.message:String(e)}`,e),await ep(1)}};
1
+ import{mkdir as e}from"node:fs/promises";import{dirname as r}from"node:path";import{format as t}from"node:util";import{createServer as o}from"vite";import{resolveGeneratedEnvFile as s}from"@salsita-ai/common/env";import{startEditorServer as n}from"../editor-server/index.js";import{getDevelopmentCredentialHint as i}from"../services/development-credential.js";import{ApplicationSpecProjectWatcher as a,LinguiWatcher as l,LogBus as c,MockTemplateWatcher as p,PhoenixApplication as d,PhoenixPubSub as u,PhoenixStore as m,VariantPreviewService as w,WebhookTunnelMonitor as v,createBusLogger as g,getViteDevConfig as h,patchConsole as f,setViteLogSink as E}from"../services/index.js";import{prepareDevelopmentEnvironment as b}from"../services/prepare-development-environment.js";import{createWebhookTunnelTransport as S,readOrCreateTunnelSessionId as k,startWebhookService as I}from"../services/webhook-service/index.js";import{startTui as $}from"../tui/index.js";import{FileLogger as x,createLogger as j,exists as P}from"../utils/index.js";import{buildWebhooks as R,setLogger as T,webhookLogContext as N}from"../webhooks/index.js";import{generateProjectFilesAndInstallDependencies as y}from"./generate-project-files.js";import{readGeneratedEnvMarkers as D}from"./generated-env-markers.js";export const runDevCommand=async(_,U)=>{let{logger:O}=U,{sdkVersion:L,projectSlug:M,environmentSlug:V,cliUseWorkspace:W,enableEditor:G,editorWsPort:Y,debug:C=!1,withLingui:H=!1,persistenceMode:B,force:X=!1,tui:q=!1,serverUrl:J,credential:Q,skipUpload:z}=_,A=null,F=null,K=null,Z=null,ee=null,er=null,et=null,eo=new x,es=new u,en=new c,ei=q&&!!process.stdout.isTTY&&!!process.stdin.isTTY,ea=!ei,el=null;q&&!ei&&O.warn("TUI requested but stdin/stdout is not an interactive terminal — falling back to plain log output. Run phoenix dev --tui directly in a terminal to use the TUI.");let ec=null,ep=O,ed=null,eu=async(t,o)=>{let n=s(".");await e(r(n),{recursive:!0}),await b({serverUrl:t.serverUrl,projectSlug:M,environmentSlug:V,credential:t.credential,outFile:n,skipUpload:o.skipUpload,overrideSchema:!0,debug:o.debug,projectVersion:L},{logger:ep})},em=()=>{el&&(el(),el=null),ec&&(ec.unmount(),ec=null,ep=j({debug:C,fileLogger:eo}))},ew=(e=0)=>ed||(ed=(async()=>{process.off("SIGINT",ev),process.off("SIGTERM",ev),process.off("uncaughtException",eg),em(),ep.debug("Shutting down...");let r=[];for(let e of[{name:"lingui watcher",close:()=>Z?.close()},{name:"project watcher",close:()=>er?.close()},{name:"mock template watcher",close:()=>ee?.close()},{name:"editor server",close:()=>K?.close()},{name:"variant previews",close:()=>et?.close()},{name:"vite server",close:()=>A?.close()},{name:"webhook tunnel",close:()=>F?.stop()}])try{ep.debug(`Shutting down ${e.name}`),await e.close()}catch(t){r.push(`${e.name}: ${t instanceof Error?t.message:String(t)}`)}r.length>0&&ep.warn(`Cleanup warnings:
2
+ ${r.join("\n ")}`),ep.debug("Shutdown complete"),await eo.close(),process.exit(e)})()),ev=()=>{ew(0)},eg=e=>{em(),ep.error(`Uncaught exception: ${e.message}`),ew(1)};process.once("SIGINT",ev),process.once("SIGTERM",ev),process.once("uncaughtException",eg);try{await eo.init(".phoenix"),ep=g({bus:en,stream:"spec",debug:C,fileLogger:eo,echo:!0}),E((e,r)=>en.push("vite",e,r),{echo:ea}),T({transports:[],log:(e,...r)=>{en.push("webhook","warn"===e||"error"===e?e:"info",t(...r)),ea&&process.stdout.write(`${t(e,...r)}
3
+ `)}}),es.browserConsole$.subscribe(e=>{en.push("browser",e.level,e.source?`[${e.source}] ${e.message}`:e.message);let r=`[${e.source?`browser:${e.source}`:"browser"}] ${e.message}`;eo.write("warn",r),ea&&process.stderr.write(`⚠️ ${r}
4
+ `)}),ea&&(el=f(en,{echo:!0})),process.env.NODE_ENV="development",B&&(process.env.PERSISTENCE_MODE=B);let e=!B||"server"===B;e&&J&&(process.env.SERVER_URL=J);let r=e&&J?new v(J):void 0;if(ep.step("Starting development mode"),!await P("spec")){ep.error('Spec folder not found. Run "phoenix init" first.'),await ew(1);return}if(e){if(!J||!Q)throw Error("Server persistence needs a server and a credential. Run `phoenix login <workspace>`, or create a development environment in Studio and paste its .env block into .env.");let e=s("."),r=await D(e);r?.PHOENIX_PROJECT_SLUG!==M||r.PHOENIX_ENVIRONMENT_SLUG!==V||r.PHOENIX_SERVER_URL!==J?(ep.step("Preparing development deployment"),await eu({serverUrl:J,credential:Q},{skipUpload:z,debug:C})):ep.debug(`${e} matches the current development environment, skipping prepare`)}ep.step("Building project files");let{templateFiles:c}=await y({sdkVersion:L,projectSlug:M,environmentSlug:V,cliUseWorkspace:W,enableEditor:G,withLingui:H,force:X},{logger:ep});if(ep.success("Project files built successfully"),ei&&(ep=g({bus:en,stream:"spec",debug:C,fileLogger:eo}),el=f(en),ec=$(en,{onQuit:()=>void ew(0)})),H?(Z=new l({logger:ep})).start():ep.warn("Lingui is disabled: i18n messages are not extracted or compiled during dev. Pass --withLingui or set WITH_LINGUI=true to enable."),e&&(ep.step("Building webhooks"),await N.run("webhook",async()=>{await R({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js"})})),e&&J&&Q){let e=s("."),t=await D(e);if(!t?.DEPLOYMENT_ID)throw Error(`Webhook tunnel cannot start because ${e} has no DEPLOYMENT_ID. Rerun phoenix dev to prepare the development deployment.`);let o=await k();F=await I({experimental:!0,transport:S({serverUrl:J,credential:Q,projectSlug:M,environmentSlug:V}),rejectionHint:i(Q,M),environmentSlug:V,deploymentId:t.DEPLOYMENT_ID,sessionId:o,onStatus:(e,s)=>{r?.setStatus(e,{deploymentId:t.DEPLOYMENT_ID,sessionId:o,message:s??null})},onRequest:e=>r?.record(e)}),r?.setStatus("waiting",{deploymentId:t.DEPLOYMENT_ID,sessionId:o}),F.stopped.catch(e=>{em(),ep.error(`Webhook tunnel failed: ${e instanceof Error?e.message:String(e)}`),ew(1)}),ep.success("Webhook tunnel started")}er=new a({pubsub:es,logger:ep,onRebuilt:()=>Z?.trigger(),onViteServerChange:e=>{A=e},sdkVersion:L,projectSlug:M,environmentSlug:V,cliUseWorkspace:W,enableEditor:G??!0,inlineTemplates:!1,useServer:e});let u=new m;if(et=new d({store:u,pubsub:es,variantPreviews:new w({projectRoot:process.cwd()},{store:u,logger:ep,projectWatcher:er})}),G&&Y){ep.step("Starting editor WebSocket server");let t=parseInt(Y,10);K=n({port:t,projectRoot:process.cwd(),application:et,logger:ep,logBus:en,tunnelMonitor:r,debug:C,prepareDeployment:e&&J&&Q?()=>eu({serverUrl:J,credential:Q},{skipUpload:!0,debug:!1}):void 0}),await K.ready,ep.debug(`Editor WebSocket server started on port ${t}`),(ee=new p({projectRoot:process.cwd(),pubsub:es,logger:ep})).start()}let b=await h({templateFiles:c});A=await o(b),await A.listen(),ep.step("Starting Vite dev server"),er.start(A);let x=A.resolvedUrls?.local[0];if(ei)ep.success("Vite dev server started — watching for changes"),x&&ep.info(`Preview: ${x}`),G&&Y&&ep.info(`Editor WebSocket: ws://localhost:${Y}`);else if(C)ep.success("Vite dev server started"),x&&ep.info(`Preview: ${x}`);else{let e=e=>{en.push("spec","info",e),process.stdout.write(`${e}
5
+ `)};e("\n\uD83D\uDE80 Phoenix Dev Server\n"),x&&(e(`Preview: ${x}`),eo.write("info",`Preview: ${x}`)),G&&Y&&e(`Editor WebSocket: ws://localhost:${Y}`),e("\n\uD83D\uDC40 Watching for changes...\n")}}catch(e){em(),ep.error(`Dev mode failed: ${e instanceof Error?e.message:String(e)}`,e),await ew(1)}};
@@ -1 +1 @@
1
- import{runCommand as t}from"../utils/index.js";import{formatFiles as e}from"./prettier.js";export const runFixCommand=async(i,r)=>{let{logger:s}=r,o=!0===i.lint||!0===i.format,n=!o||!0===i.lint,c=!o||!0===i.format;try{s.step("Running fixes"),n&&await t({command:"eslint",args:["src","--fix"],description:"ESLint fix",quiet:!0},{logger:s}),c&&(s.step("Prettier fix"),await e(".",{logger:s}),s.success("Prettier fix completed")),s.success("Fixes completed!")}catch(t){s.error(`Fix failed: ${t instanceof Error?t.message:String(t)}`,t),process.exit(1)}};
1
+ import{runCommand as t}from"../utils/index.js";import{formatFiles as e}from"./prettier.js";export const runFixCommand=async(r,i)=>{let{logger:s}=i,n=!0===r.lint||!0===r.format,o=!n||!0===r.lint,a=!n||!0===r.format;try{s.step("Running fixes"),o&&await t({command:"eslint",args:["src","--fix","--no-error-on-unmatched-pattern"],description:"ESLint fix",quiet:!0},{logger:s}),a&&(s.step("Prettier fix"),await e(".",{logger:s}),s.success("Prettier fix completed")),s.success("Fixes completed!")}catch(t){s.error(`Fix failed: ${t instanceof Error?t.message:String(t)}`,t),process.exit(1)}};
@@ -12,6 +12,7 @@ export { prepareDevelopmentEnvironment } from '../services/prepare-development-e
12
12
  export { prepareLocalEnvironment } from './prepare-local-environment-command.js';
13
13
  export { runFinishDeploymentCommand } from './finish-deployment-command.js';
14
14
  export { runDeploymentBuildEnvsCommand } from './deployment-build-envs-command.js';
15
+ export { runDepsCommand } from './deps/index.js';
15
16
  export { runDevCommand } from './dev.js';
16
17
  export { runFixCommand } from './fix.js';
17
18
  export { runLinkCommand } from './link.js';
@@ -1 +1 @@
1
- export{runBuildCommand}from"./build.js";export{runCheckCommand}from"./check.js";export{runCleanCommand}from"./clean.js";export{runActivateDeploymentCommand}from"./activate-deployment.js";export{runCreateEnvironmentCommand}from"./create-environment.js";export{runCleanupEnvironmentCommand}from"./cleanup-environment.js";export{runListEnvironmentsCommand}from"./list-environments.js";export{runRegisterDeploymentCommand}from"./register-deployment.js";export{runPrepareDeploymentCommand}from"./prepare-deployment-command.js";export{prepareDevelopmentEnvironment}from"../services/prepare-development-environment.js";export{prepareLocalEnvironment}from"./prepare-local-environment-command.js";export{runFinishDeploymentCommand}from"./finish-deployment-command.js";export{runDeploymentBuildEnvsCommand}from"./deployment-build-envs-command.js";export{runDevCommand}from"./dev.js";export{runFixCommand}from"./fix.js";export{runLinkCommand}from"./link.js";export{runUnlinkCommand}from"./unlink.js";export{runPrepareCiCommand}from"./prepare-ci.js";export{runStoryCommand}from"./story.js";export{runStoryBuildCommand}from"./story-build.js";export{runStoryCreateCommand}from"./story-create.js";export{runStoryDevCommand}from"./story-dev.js";export{runInitCommand}from"./init.js";export{runSyncCommand}from"./sync.js";export{runChangelogCommand}from"./changelog.js";export{runDocsCommand}from"./docs.js";export{runInspectAssetsCommand}from"./inspect-assets.js";export{runScreenshotCommand}from"./screenshot.js";export{runStateCommand}from"./state.js";export{runDataCommand}from"./data.js";export{runSceneCommand}from"./scene.js";export{runVariantsCommand}from"./variants.js";export{runLoginCommand}from"./login.js";export{runLogoutCommand}from"./logout.js";export{runDeployCommand}from"./deploy.js";export{runFeedbackCommand}from"./feedback.js";export{runExtractSourcesCommand}from"./extract-sources-command.js";
1
+ export{runBuildCommand}from"./build.js";export{runCheckCommand}from"./check.js";export{runCleanCommand}from"./clean.js";export{runActivateDeploymentCommand}from"./activate-deployment.js";export{runCreateEnvironmentCommand}from"./create-environment.js";export{runCleanupEnvironmentCommand}from"./cleanup-environment.js";export{runListEnvironmentsCommand}from"./list-environments.js";export{runRegisterDeploymentCommand}from"./register-deployment.js";export{runPrepareDeploymentCommand}from"./prepare-deployment-command.js";export{prepareDevelopmentEnvironment}from"../services/prepare-development-environment.js";export{prepareLocalEnvironment}from"./prepare-local-environment-command.js";export{runFinishDeploymentCommand}from"./finish-deployment-command.js";export{runDeploymentBuildEnvsCommand}from"./deployment-build-envs-command.js";export{runDepsCommand}from"./deps/index.js";export{runDevCommand}from"./dev.js";export{runFixCommand}from"./fix.js";export{runLinkCommand}from"./link.js";export{runUnlinkCommand}from"./unlink.js";export{runPrepareCiCommand}from"./prepare-ci.js";export{runStoryCommand}from"./story.js";export{runStoryBuildCommand}from"./story-build.js";export{runStoryCreateCommand}from"./story-create.js";export{runStoryDevCommand}from"./story-dev.js";export{runInitCommand}from"./init.js";export{runSyncCommand}from"./sync.js";export{runChangelogCommand}from"./changelog.js";export{runDocsCommand}from"./docs.js";export{runInspectAssetsCommand}from"./inspect-assets.js";export{runScreenshotCommand}from"./screenshot.js";export{runStateCommand}from"./state.js";export{runDataCommand}from"./data.js";export{runSceneCommand}from"./scene.js";export{runVariantsCommand}from"./variants.js";export{runLoginCommand}from"./login.js";export{runLogoutCommand}from"./logout.js";export{runDeployCommand}from"./deploy.js";export{runFeedbackCommand}from"./feedback.js";export{runExtractSourcesCommand}from"./extract-sources-command.js";
@@ -2,6 +2,8 @@ import { type ViteDevServer } from 'vite';
2
2
  import type { Logger } from '../utils/index.js';
3
3
  import type { PhoenixPubSub } from './phoenix-pubsub.js';
4
4
  import type { VariantFileEdit } from './variant-file-session.js';
5
+ export declare const WATCH_PATTERNS: string[];
6
+ export declare const IGNORED_PATTERNS: string[];
5
7
  /** Configuration for {@link ApplicationSpecProjectWatcher}. */
6
8
  export interface ApplicationSpecProjectWatcherConfig {
7
9
  readonly pubsub: PhoenixPubSub;
@@ -1,4 +1,4 @@
1
- import{resolve as e}from"path";import t from"promise-queue";import{Subject as i,buffer as s,debounceTime as r}from"rxjs";import{createServer as o,normalizePath as n}from"vite";import{watch as l}from"#package/watch";import{ApplicationSpecBuilder as h}from"../application-spec/application-spec-builder.js";import{logDiagnostics as a}from"../application-spec/metrics/index.js";import{syncTemplateFiles as c}from"../application-spec/template-files.js";import{buildWebhooks as u}from"../webhooks/index.js";import{getViteDevConfig as p}from"./vite-config.js";let g=["spec/**/*.{yaml,yml}","src/**/*.{ts,tsx,yaml,yml,json,html,css}","templates/*.html",".env",".env.generated"],d=["src/locales/**/*.{ts,tsx}",".phoenix/**"];export class ApplicationSpecProjectWatcher{watcher=null;subscription=null;rebuildQueue=new t(1,1/0);changeSubject$=new i;viteServer=null;pubsub;logger;onRebuilt;onViteServerChange;builder;useServer;isShuttingDown=!1;suspended=!1;heldChanges=new Set;constructor(e){this.pubsub=e.pubsub,this.logger=e.logger,this.onRebuilt=e.onRebuilt,this.onViteServerChange=e.onViteServerChange,this.builder=new h({logger:e.logger,sdkVersion:e.sdkVersion,projectSlug:e.projectSlug,environmentSlug:e.environmentSlug,cliUseWorkspace:e.cliUseWorkspace,name:e.name,description:e.description,enableEditor:e.enableEditor,inlineTemplates:e.inlineTemplates}),this.useServer=e.useServer}start(e){this.viteServer=e,this.setupFileWatcher(),this.setupRebuildSubscription()}applyVariantFiles(e){this.rebuildQueue.add(async()=>{this.isShuttingDown||await this.rebuild(new Set(e.map(e=>e.fileName)),!1,!0)})}suspend(){this.suspended=!0}resume(){for(let e of(this.suspended=!1,this.heldChanges))this.changeSubject$.next(e);this.heldChanges.clear()}async close(){this.isShuttingDown=!0,this.watcher&&(await this.watcher.close(),this.watcher=null),this.subscription?.unsubscribe(),this.changeSubject$.complete()}setupFileWatcher(){this.watcher=l(g,{ignored:d,cwd:process.cwd(),persistent:!0,ignoreInitial:!1}),this.watcher.on("all",(e,t)=>{if("change"===e||"add"===e||"unlink"===e){if(this.suspended)return void this.heldChanges.add(t);this.logger.info(`
2
- 📝 Detected ${e}: ${t}`),this.changeSubject$.next(t)}})}setupRebuildSubscription(){let e=this.changeSubject$.pipe(r(10));this.subscription=this.changeSubject$.pipe(s(e)).subscribe(e=>{let t=new Set(e),i=t.has(".env");this.rebuildQueue.add(async()=>{this.isShuttingDown||(this.logger.info(`
1
+ import{mkdirSync as e}from"fs";import{resolve as t}from"path";import i from"promise-queue";import{Subject as s,buffer as r,debounceTime as o}from"rxjs";import{createServer as n,normalizePath as l}from"vite";import{watch as a}from"#package/watch";import{ApplicationSpecBuilder as h}from"../application-spec/application-spec-builder.js";import{logDiagnostics as c}from"../application-spec/metrics/index.js";import{syncTemplateFiles as u}from"../application-spec/template-files.js";import{buildWebhooks as p}from"../webhooks/index.js";import{getViteDevConfig as g}from"./vite-config.js";export const WATCH_PATTERNS=["spec/**/*.{yaml,yml}","src/**/*.{ts,tsx,yaml,yml,json,html,css}","templates/*.html",".env",".env.generated",".phoenix/.env.generated"];export const IGNORED_PATTERNS=["src/locales/**/*.{ts,tsx}",".phoenix/!(.env.generated)/**"];export class ApplicationSpecProjectWatcher{watcher=null;subscription=null;rebuildQueue=new i(1,1/0);changeSubject$=new s;viteServer=null;pubsub;logger;onRebuilt;onViteServerChange;builder;useServer;isShuttingDown=!1;suspended=!1;heldChanges=new Set;constructor(e){this.pubsub=e.pubsub,this.logger=e.logger,this.onRebuilt=e.onRebuilt,this.onViteServerChange=e.onViteServerChange,this.builder=new h({logger:e.logger,sdkVersion:e.sdkVersion,projectSlug:e.projectSlug,environmentSlug:e.environmentSlug,cliUseWorkspace:e.cliUseWorkspace,name:e.name,description:e.description,enableEditor:e.enableEditor,inlineTemplates:e.inlineTemplates}),this.useServer=e.useServer}start(e){this.viteServer=e,this.setupFileWatcher(),this.setupRebuildSubscription()}applyVariantFiles(e){this.rebuildQueue.add(async()=>{this.isShuttingDown||await this.rebuild(new Set(e.map(e=>e.fileName)),!1,!0)})}suspend(){this.suspended=!0}resume(){for(let e of(this.suspended=!1,this.heldChanges))this.changeSubject$.next(e);this.heldChanges.clear()}async close(){this.isShuttingDown=!0,this.watcher&&(await this.watcher.close(),this.watcher=null),this.subscription?.unsubscribe(),this.changeSubject$.complete()}setupFileWatcher(){e(t(process.cwd(),"src"),{recursive:!0}),this.watcher=a(WATCH_PATTERNS,{ignored:IGNORED_PATTERNS,cwd:process.cwd(),persistent:!0,ignoreInitial:!1}),this.watcher.on("all",(e,t)=>{if("change"===e||"add"===e||"unlink"===e){if(this.suspended)return void this.heldChanges.add(t);this.logger.info(`
2
+ 📝 Detected ${e}: ${t}`),this.changeSubject$.next(t)}})}setupRebuildSubscription(){let e=this.changeSubject$.pipe(o(10));this.subscription=this.changeSubject$.pipe(r(e)).subscribe(e=>{let t=new Set(e),i=t.has(".env");this.rebuildQueue.add(async()=>{this.isShuttingDown||(this.logger.info(`
3
3
  🔨 Rebuilding spec files...
4
- `),await this.rebuild(t,i,!1))})})}async rebuild(t,i,s){try{let r=this.viteServer;if(!r)throw Error("Cannot rebuild the project: the watcher has no Vite server yet, because it was not started. Start the watcher before applying files");let l=await c();if(this.isShuttingDown)return;let h=await this.builder.build({compile:!s});if(this.isShuttingDown)return;if(a(h.diagnostics,this.logger),!h.ok){for(let e of h.errors)this.logger.error(`[${e.code}] ${e.message}${e.file?` (${e.file})`:""}`);this.pubsub.specFile$.next({rawProjectFiles:h.rawProjectFiles,projectRoot:process.cwd()});return}this.onRebuilt?.();let{application:g,changedFiles:d}=h,w=r.moduleGraph,b=Date.now(),f=new Set,m=process.cwd(),S=e=>{let t=w.getModulesByFile(n(e));if(t)for(let e of t)w.invalidateModule(e,f,b,!0)};for(let i of t)S(e(m,i));for(let t of d)S(e(m,`.phoenix/${t.path}`));if(this.pubsub.specFile$.next({rawProjectFiles:g.rawProjectFiles,projectRoot:process.cwd(),configurationSchemaHash:g.applicationSpec.configurator.configurationSchema.hash}),this.isShuttingDown)return;if(i){if(await r.close(),this.isShuttingDown)return;let e=await p({templateFiles:l});if(this.isShuttingDown)return;let t=await o(e);if(this.isShuttingDown||(await t.listen(),this.isShuttingDown))return void await t.close();this.viteServer=t,this.onViteServerChange?.(t),this.logger.success("Vite server restarted (env changed)")}if(this.useServer&&!s){if(this.logger.step("Building webhooks"),await u({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js",preserveExistingOutput:!0}),this.isShuttingDown)return;this.logger.success("Webhooks rebuilt successfully")}this.logger.success("Project files rebuilt successfully")}catch(e){this.logger.error(`Build failed: ${e instanceof Error?e.message:String(e)}`,e)}}}
4
+ `),await this.rebuild(t,i,!1))})})}async rebuild(e,i,s){try{let r=this.viteServer;if(!r)throw Error("Cannot rebuild the project: the watcher has no Vite server yet, because it was not started. Start the watcher before applying files");let o=await u();if(this.isShuttingDown)return;let a=await this.builder.build({compile:!s});if(this.isShuttingDown)return;if(c(a.diagnostics,this.logger),!a.ok){for(let e of a.errors)this.logger.error(`[${e.code}] ${e.message}${e.file?` (${e.file})`:""}`);this.pubsub.specFile$.next({rawProjectFiles:a.rawProjectFiles,projectRoot:process.cwd()});return}this.onRebuilt?.();let{application:h,changedFiles:d}=a,w=r.moduleGraph,b=Date.now(),f=new Set,S=process.cwd(),m=e=>{let t=w.getModulesByFile(l(e));if(t)for(let e of t)w.invalidateModule(e,f,b,!0)};for(let i of e)m(t(S,i));for(let e of d)m(t(S,`.phoenix/${e.path}`));if(this.pubsub.specFile$.next({rawProjectFiles:h.rawProjectFiles,projectRoot:process.cwd(),configurationSchemaHash:h.applicationSpec.configurator.configurationSchema.hash}),this.isShuttingDown)return;if(i){if(await r.close(),this.isShuttingDown)return;let e=await g({templateFiles:o});if(this.isShuttingDown)return;let t=await n(e);if(this.isShuttingDown||(await t.listen(),this.isShuttingDown))return void await t.close();this.viteServer=t,this.onViteServerChange?.(t),this.logger.success("Vite server restarted (env changed)")}if(this.useServer&&!s){if(this.logger.step("Building webhooks"),await p({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js",preserveExistingOutput:!0}),this.isShuttingDown)return;this.logger.success("Webhooks rebuilt successfully")}this.logger.success("Project files rebuilt successfully")}catch(e){this.logger.error(`Build failed: ${e instanceof Error?e.message:String(e)}`,e)}}}
@@ -3,6 +3,7 @@ export interface SourceArchive {
3
3
  readonly path: string;
4
4
  readonly fileCount: number;
5
5
  readonly size: number;
6
+ readonly hasConversationLog: boolean;
6
7
  readonly cleanup: () => Promise<void>;
7
8
  }
8
9
  /** What `extractSourceArchive` wrote and what it left out. */
@@ -1 +1 @@
1
- import{execFile as e}from"node:child_process";import{createReadStream as r,createWriteStream as t}from"node:fs";import{lstat as o,mkdir as i,mkdtemp as a,readdir as n,rm as s,stat as c,writeFile as l}from"node:fs/promises";import{tmpdir as h}from"node:os";import{dirname as p,join as f}from"node:path";import{Transform as d}from"node:stream";import{pipeline as w}from"node:stream/promises";import{promisify as m}from"node:util";import{createGunzip as u}from"node:zlib";import{extract as g}from"tar-stream";import{isProjectFile as y,listProjectEntries as v}from"../application-spec/project-files.js";let x=m(e);export const createSourceArchive=async e=>{let r=await Promise.all((await v(e)).map(async r=>({name:r,entry:await o(f(e,r))}))),t=r.filter(({entry:e})=>!e.isDirectory()&&(!e.isFile()||e.nlink>1)),i=r.filter(({entry:e})=>e.isFile()).map(({name:e})=>e);if(t.length>0)throw Error(`These project files are links or special files, which builds do not accept: ${t.map(({name:e})=>e).join(", ")}. Replace them with regular files and deploy again.`);if(0===i.length)throw Error(`No project files were found in ${e}, so there is nothing to deploy. Run phoenix deploy in the folder of an application-spec project.`);let n=await a(f(h(),"phoenix-deploy-")),p="sources.tgz",d=f(n,p),w=f(n,"files");try{await l(w,i.join("\0")),await x("tar",["-czf",p,"-C",e,"--null","-T",w],{cwd:n,env:{...process.env,COPYFILE_DISABLE:"1"}})}catch(r){await s(n,{recursive:!0,force:!0});let e=r instanceof Error?r.message:String(r);throw Error(`Packing the project with tar failed: ${e}. Check that tar is installed and on the PATH.`)}return{path:d,fileCount:i.length,size:(await c(d)).size,cleanup:()=>s(n,{recursive:!0,force:!0})}};let E=(e,...r)=>e instanceof Error&&"code"in e&&"string"==typeof e.code&&r.includes(e.code),j=async e=>{try{return 0===(await n(e)).length}catch(e){if(E(e,"ENOENT"))return!0;throw e}},T=class ArchiveRefusal extends Error{},b=e=>e.length>0&&!e.startsWith("/")&&!e.includes("\\")&&!/^[A-Za-z]:/.test(e)&&!/[\x00-\x1f\x7f]/.test(e)&&!e.split("/").includes("..");export const extractSourceArchive=async e=>{let o,a,{archivePath:n,targetDir:l}=e,h=(await c(n)).size;if(h>0xc800000)throw Error(`The source archive is ${h} bytes, over the 209715200 byte limit. Remove large files from the project and deploy again.`);if(!await j(l))throw Error(`The folder ${l} is not empty, and extracted sources must not mix with existing files. Extract into a new or empty folder.`);let m=g(),v=new AbortController,x=w(r(n),u(),(a=0,new d({transform(e,r,t){(a+=e.length)>0x40000000?t(new T("The source archive extracts to more than 1073741824 bytes. Remove large files from the project and deploy again.")):t(null,e)}})),m).catch(e=>{o??=e,v.abort()}),$=[],z=0,R=0;try{for await(let e of m){let{type:r}=e.header,o=e.header.name.replace(/^(\.\/)+/,""),a=JSON.stringify(o);if("directory"===r){e.resume();continue}if((R+=1)>1e5)throw new T("The source archive has more than 100000 files. Remove generated or unused files from the project and deploy again.");if(!b(o))throw new T(`The source archive contains ${a}, which is not a plain relative path inside the project. Pack the project with phoenix deploy.`);if("file"!==r)throw new T(`The source archive contains ${a}, which is a ${r??"special file"}. Builds accept only regular files; replace it with a regular file and deploy again.`);if(!y(o)){$.push(o),e.resume();continue}let n=f(l,...o.split("/"));try{await i(p(n),{recursive:!0}),await w(e,t(n,{flags:"wx"}),{signal:v.signal})}catch(e){if(E(e,"EEXIST","ENOTDIR","EISDIR"))throw new T(`The source archive contains ${a}, which repeats or collides with an earlier entry, so its content is ambiguous. Pack the project with phoenix deploy.`);throw e}z+=1}if(await x,void 0!==o)throw o}catch(t){let e=t instanceof T?t:o??t;if(m.destroy(),await x,await s(l,{recursive:!0,force:!0}),e instanceof T)throw e;let r=e instanceof Error?e.message:String(e);throw Error(`The source archive could not be read: ${r}. It is truncated or not a gzip tarball; pack the project with phoenix deploy.`)}return{fileCount:z,skipped:$}};
1
+ import{execFile as e}from"node:child_process";import{createReadStream as r,createWriteStream as t}from"node:fs";import{lstat as o,mkdir as i,mkdtemp as a,readdir as n,rm as s,stat as c,writeFile as l}from"node:fs/promises";import{tmpdir as h}from"node:os";import{dirname as p,join as f}from"node:path";import{Transform as d}from"node:stream";import{pipeline as w}from"node:stream/promises";import{promisify as m}from"node:util";import{createGunzip as u}from"node:zlib";import{extract as g}from"tar-stream";import{isProjectFile as y,listProjectEntries as v}from"../application-spec/project-files.js";let x=m(e);export const createSourceArchive=async e=>{let r=(await n(e)).includes("conversation.log"),t=[...await v(e),...r?["conversation.log"]:[]],i=await Promise.all(t.map(async r=>({name:r,entry:await o(f(e,r))})));if(i.some(({name:e,entry:r})=>"conversation.log"===e&&r.isDirectory()))throw Error("conversation.log is a directory. Replace it with a regular transcript file and deploy again.");let p=i.filter(({entry:e})=>!e.isDirectory()&&(!e.isFile()||e.nlink>1)),d=i.filter(({entry:e})=>e.isFile()).map(({name:e})=>e);if(p.length>0)throw Error(`These project files are links or special files, which builds do not accept: ${p.map(({name:e})=>e).join(", ")}. Replace them with regular files and deploy again.`);if(0===d.length)throw Error(`No project files were found in ${e}, so there is nothing to deploy. Run phoenix deploy in the folder of an application-spec project.`);let w=await a(f(h(),"phoenix-deploy-")),m="sources.tgz",u=f(w,m),g=f(w,"files");try{await l(g,d.join("\0")),await x("tar",["-czf",m,"-C",e,"--null","-T",g],{cwd:w,env:{...process.env,COPYFILE_DISABLE:"1"}})}catch(r){await s(w,{recursive:!0,force:!0});let e=r instanceof Error?r.message:String(r);throw Error(`Packing the project with tar failed: ${e}. Check that tar is installed and on the PATH.`)}return{path:u,fileCount:d.length,size:(await c(u)).size,hasConversationLog:r,cleanup:()=>s(w,{recursive:!0,force:!0})}};let E=(e,...r)=>e instanceof Error&&"code"in e&&"string"==typeof e.code&&r.includes(e.code),j=async e=>{try{return 0===(await n(e)).length}catch(e){if(E(e,"ENOENT"))return!0;throw e}},T=class ArchiveRefusal extends Error{},b=e=>e.length>0&&!e.startsWith("/")&&!e.includes("\\")&&!/^[A-Za-z]:/.test(e)&&!/[\x00-\x1f\x7f]/.test(e)&&!e.split("/").includes("..");export const extractSourceArchive=async e=>{let o,a,{archivePath:n,targetDir:l}=e,h=(await c(n)).size;if(h>0xc800000)throw Error(`The source archive is ${h} bytes, over the 209715200 byte limit. Remove large files from the project and deploy again.`);if(!await j(l))throw Error(`The folder ${l} is not empty, and extracted sources must not mix with existing files. Extract into a new or empty folder.`);let m=g(),v=new AbortController,x=w(r(n),u(),(a=0,new d({transform(e,r,t){(a+=e.length)>0x40000000?t(new T("The source archive extracts to more than 1073741824 bytes. Remove large files from the project and deploy again.")):t(null,e)}})),m).catch(e=>{o??=e,v.abort()}),$=[],R=0,z=0;try{for await(let e of m){let{type:r}=e.header,o=e.header.name.replace(/^(\.\/)+/,""),a=JSON.stringify(o);if("directory"===r){e.resume();continue}if((z+=1)>1e5)throw new T("The source archive has more than 100000 files. Remove generated or unused files from the project and deploy again.");if(!b(o))throw new T(`The source archive contains ${a}, which is not a plain relative path inside the project. Pack the project with phoenix deploy.`);if("file"!==r)throw new T(`The source archive contains ${a}, which is a ${r??"special file"}. Builds accept only regular files; replace it with a regular file and deploy again.`);if(!y(o)){$.push(o),e.resume();continue}let n=f(l,...o.split("/"));try{await i(p(n),{recursive:!0}),await w(e,t(n,{flags:"wx"}),{signal:v.signal})}catch(e){if(E(e,"EEXIST","ENOTDIR","EISDIR"))throw new T(`The source archive contains ${a}, which repeats or collides with an earlier entry, so its content is ambiguous. Pack the project with phoenix deploy.`);throw e}R+=1}if(await x,void 0!==o)throw o}catch(t){let e=t instanceof T?t:o??t;if(m.destroy(),await x,await s(l,{recursive:!0,force:!0}),e instanceof T)throw e;let r=e instanceof Error?e.message:String(e);throw Error(`The source archive could not be read: ${r}. It is truncated or not a gzip tarball; pack the project with phoenix deploy.`)}return{fileCount:R,skipped:$}};
@@ -1,3 +1,3 @@
1
- import{transform as e}from"@swc/core";import{remove as t}from"fs-extra";import{copyFile as s,mkdir as o,readFile as a,writeFile as i}from"fs/promises";import{globby as r}from"globby";import{dirname as c,relative as l,resolve as n}from"path";import{Subject as p}from"rxjs";import{watch as m}from"#package/watch";import{createLogger as w}from"../utils/index.js";let u=()=>({sourceMaps:!0,module:{type:"es6"},jsc:{target:"es2022",parser:{syntax:"typescript",tsx:!0},transform:{react:{runtime:"automatic"}},keepClassNames:!0,experimental:{plugins:[["@lingui/swc-plugin",{}]]}}}),d=async(e,t,a)=>{let i=process.cwd(),p=n(i,e),m=n(i,t),w=await r(["**/*.{html,css,json,txt,md}","**/.env*"],{cwd:p,ignore:["**/*.{spec,test}.{html,css,json,txt,md}","**/__tests__/**","**/__mocks__/**","**/tsconfig.json"],absolute:!1}),u=0,d=0;for(let e of w)try{let t=n(p,e),a=n(m,e);await o(c(a),{recursive:!0}),await s(t,a),u++}catch(t){d++,console.error(`Failed to copy ${l(i,n(p,e))}:`,t)}if(d>0)throw Error(`Failed to copy ${d} file(s)`);u>0&&a.debug(`Copied ${u} non-compilable file(s)`)};export const compileWithSwc=async(s,p)=>{let{sourceDir:m="src",outDir:f="./node_modules/.phoenix"}=s??{},g=p?.logger??w(),h=process.cwd(),x=n(h,m),_=n(h,f);await t(_);let y=await r(["**/*.{ts,tsx}"],{cwd:x,ignore:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/__mocks__/**"],absolute:!1}),b=u(),$=0,j=0;for(let t of y)try{let s=n(x,t),r=n(_,t.replace(/\.tsx?$/,".js")),l=await a(s,"utf-8"),p=await e(l,{...b,filename:s,sourceMaps:!0,outputPath:r});await o(c(r),{recursive:!0}),await i(r,p.code,"utf-8"),p.map&&await i(`${r}.map`,p.map,"utf-8"),$++}catch(e){j++,console.error(`Failed to compile ${l(h,n(x,t))}:`,e)}if(j>0)throw Error(`Failed to compile ${j} file(s)`);g.isDebug&&g.debug(`Compiled ${$} file(s) with swc`),await d(m,f,g)};let f=async(t,s,r)=>{let l=process.cwd(),p=n(l,s),m=n(l,r),w=u(),d=n(p,t),f=n(m,t.replace(/\.tsx?$/,".js")),g=await a(d,"utf-8"),h=await e(g,{...w,filename:d,sourceMaps:!0,outputPath:f});await o(c(f),{recursive:!0}),await i(f,h.code,"utf-8"),h.map&&await i(`${f}.map`,h.map,"utf-8")},g=async(e,t,a)=>{let i=process.cwd(),r=n(i,t),l=n(i,a),p=n(r,e),m=n(l,e);await o(c(m),{recursive:!0}),await s(p,m)};export const watchWithSwc=async(e,t)=>{let{sourceDir:s="src",outDir:o="./node_modules/.phoenix"}=e??{},a=t?.logger??w(),i=n(process.cwd(),s);a.isDebug&&a.step("Running initial SWC compilation"),await compileWithSwc({sourceDir:s,outDir:o},t),a.isDebug&&a.success("Initial compilation complete");let r=new p,c=m(["**/*.{ts,tsx,html,css,json,txt,md}","../.env*"],{cwd:i,ignored:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/cache.json"],persistent:!0,ignoreInitial:!0});return c.on("all",(e,t)=>{("change"===e||"add"===e)&&r.next({file:t,type:e})}),r.subscribe(async({file:e})=>{let t=l(i,n(i,e));try{e.match(/\.tsx?$/)?(await f(t,s,o),a.fileChanged(t)):(e.match(/\.(html|css|json|txt|md)$/)||e.match(/\.env/))&&(await g(t,s,o),a.fileChanged(t))}catch(e){a.error(`Failed to process ${t}`),a.isDebug&&console.error(e)}}),a.isDebug&&console.log(`
1
+ import{transform as e}from"@swc/core";import{remove as t}from"fs-extra";import{copyFile as s,mkdir as o,readFile as a,writeFile as i}from"fs/promises";import{globby as r}from"globby";import{dirname as c,relative as l,resolve as n}from"path";import{Subject as p}from"rxjs";import{watch as m}from"#package/watch";import{createLogger as w}from"../utils/index.js";let d=()=>({sourceMaps:!0,module:{type:"es6"},jsc:{target:"es2022",parser:{syntax:"typescript",tsx:!0},transform:{react:{runtime:"automatic"}},keepClassNames:!0,experimental:{plugins:[["@lingui/swc-plugin",{}]]}}}),u=async(e,t,a)=>{let i=process.cwd(),p=n(i,e),m=n(i,t),w=await r(["**/*.{html,css,json,txt,md}","**/.env*"],{cwd:p,ignore:["**/*.{spec,test}.{html,css,json,txt,md}","**/__tests__/**","**/__mocks__/**","**/tsconfig.json",".env.generated"],absolute:!1}),d=0,u=0;for(let e of w)try{let t=n(p,e),a=n(m,e);await o(c(a),{recursive:!0}),await s(t,a),d++}catch(t){u++,console.error(`Failed to copy ${l(i,n(p,e))}:`,t)}if(u>0)throw Error(`Failed to copy ${u} file(s)`);d>0&&a.debug(`Copied ${d} non-compilable file(s)`)};export const compileWithSwc=async(s,p)=>{let{sourceDir:m="src",outDir:f="./node_modules/.phoenix"}=s??{},g=p?.logger??w(),h=process.cwd(),x=n(h,m),_=n(h,f);await t(_);let y=await r(["**/*.{ts,tsx}"],{cwd:x,ignore:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/__mocks__/**"],absolute:!1}),b=d(),$=0,j=0;for(let t of y)try{let s=n(x,t),r=n(_,t.replace(/\.tsx?$/,".js")),l=await a(s,"utf-8"),p=await e(l,{...b,filename:s,sourceMaps:!0,outputPath:r});await o(c(r),{recursive:!0}),await i(r,p.code,"utf-8"),p.map&&await i(`${r}.map`,p.map,"utf-8"),$++}catch(e){j++,console.error(`Failed to compile ${l(h,n(x,t))}:`,e)}if(j>0)throw Error(`Failed to compile ${j} file(s)`);g.isDebug&&g.debug(`Compiled ${$} file(s) with swc`),await u(m,f,g)};let f=async(t,s,r)=>{let l=process.cwd(),p=n(l,s),m=n(l,r),w=d(),u=n(p,t),f=n(m,t.replace(/\.tsx?$/,".js")),g=await a(u,"utf-8"),h=await e(g,{...w,filename:u,sourceMaps:!0,outputPath:f});await o(c(f),{recursive:!0}),await i(f,h.code,"utf-8"),h.map&&await i(`${f}.map`,h.map,"utf-8")},g=async(e,t,a)=>{let i=process.cwd(),r=n(i,t),l=n(i,a),p=n(r,e),m=n(l,e);await o(c(m),{recursive:!0}),await s(p,m)};export const watchWithSwc=async(e,t)=>{let{sourceDir:s="src",outDir:o="./node_modules/.phoenix"}=e??{},a=t?.logger??w(),i=n(process.cwd(),s);a.isDebug&&a.step("Running initial SWC compilation"),await compileWithSwc({sourceDir:s,outDir:o},t),a.isDebug&&a.success("Initial compilation complete");let r=new p,c=m(["**/*.{ts,tsx,html,css,json,txt,md}","../.env*"],{cwd:i,ignored:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/cache.json"],persistent:!0,ignoreInitial:!0});return c.on("all",(e,t)=>{("change"===e||"add"===e)&&r.next({file:t,type:e})}),r.subscribe(async({file:e})=>{let t=l(i,n(i,e));try{e.match(/\.tsx?$/)?(await f(t,s,o),a.fileChanged(t)):(e.match(/\.(html|css|json|txt|md)$/)||e.match(/\.env/))&&(await g(t,s,o),a.fileChanged(t))}catch(e){a.error(`Failed to process ${t}`),a.isDebug&&console.error(e)}}),a.isDebug&&console.log(`
2
2
  👀 Watching ${s} for changes...
3
3
  `),{stop:async()=>{await c.close(),a.isDebug&&a.info("SWC watcher stopped")}}};
@@ -7,6 +7,7 @@ export { FileLogger } from './file-logger.js';
7
7
  export { isInsideGitRepository } from './git/index.js';
8
8
  export { type Logger, type CreateLoggerOptions, createLogger } from './logger.js';
9
9
  export { addWorkspaceOverrides, ensureWorkspaceInstallSettings, getLocalOverrides, getSdkPackages, getWorkspaceDir, hasLocalOverrides, readPackageJson, removeWorkspaceOverrides, } from './package-info.js';
10
+ export { naturalCompare } from './natural-compare.js';
10
11
  export { toPascalCase } from './pascal-case.js';
11
12
  export { readGitCommit } from './read-git-commit.js';
12
13
  export { type RunCommandProps, runCommand } from './run-command.js';
@@ -1 +1 @@
1
- export{askQuestion}from"./ask-question.js";export{checkBundleSizeBudgets}from"./check-bundle-size-budgets.js";export{formatEnvContent,formatEnvLine}from"./env-file.js";export{parseChangelog,getLatestVersion,getVersion,paginateVersions,getVersionNumbers}from"./changelog-parser.js";export{createDirectoryFromYaml,exists,scanFolderForFiles,syncChangedFiles,syncExistingFolders,validateFolders,writeFileIfNotExists,writeFilesIfNotExists,writeRawFiles}from"./file-system.js";export{FileLogger}from"./file-logger.js";export{isInsideGitRepository}from"./git/index.js";export{createLogger}from"./logger.js";export{addWorkspaceOverrides,ensureWorkspaceInstallSettings,getLocalOverrides,getSdkPackages,getWorkspaceDir,hasLocalOverrides,readPackageJson,removeWorkspaceOverrides}from"./package-info.js";export{toPascalCase}from"./pascal-case.js";export{readGitCommit}from"./read-git-commit.js";export{runCommand}from"./run-command.js";export{uploadFilesWithPresignedUrls,readUploadLinks}from"./upload-utils.js";
1
+ export{askQuestion}from"./ask-question.js";export{checkBundleSizeBudgets}from"./check-bundle-size-budgets.js";export{formatEnvContent,formatEnvLine}from"./env-file.js";export{parseChangelog,getLatestVersion,getVersion,paginateVersions,getVersionNumbers}from"./changelog-parser.js";export{createDirectoryFromYaml,exists,scanFolderForFiles,syncChangedFiles,syncExistingFolders,validateFolders,writeFileIfNotExists,writeFilesIfNotExists,writeRawFiles}from"./file-system.js";export{FileLogger}from"./file-logger.js";export{isInsideGitRepository}from"./git/index.js";export{createLogger}from"./logger.js";export{addWorkspaceOverrides,ensureWorkspaceInstallSettings,getLocalOverrides,getSdkPackages,getWorkspaceDir,hasLocalOverrides,readPackageJson,removeWorkspaceOverrides}from"./package-info.js";export{naturalCompare}from"./natural-compare.js";export{toPascalCase}from"./pascal-case.js";export{readGitCommit}from"./read-git-commit.js";export{runCommand}from"./run-command.js";export{uploadFilesWithPresignedUrls,readUploadLinks}from"./upload-utils.js";
@@ -12,12 +12,14 @@ export declare const useConfiguratorRawAccessService: () => AccessService | null
12
12
  export declare const useAdminRawAccessService: () => AccessService | null;
13
13
  export declare const useConfiguratorRawAccessInfo: () => {
14
14
  raw: string;
15
+ access: import("@salsita-ai/contracts/api").AccessLevel;
15
16
  viewMode: boolean;
16
17
  revisionId: string | undefined;
17
18
  configurationId: string;
18
19
  } | null;
19
20
  export declare const useAdminRawAccessInfo: () => {
20
21
  raw: string;
22
+ access: import("@salsita-ai/contracts/api").AccessLevel;
21
23
  viewMode: boolean;
22
24
  revisionId: string | undefined;
23
25
  configurationId: string;
@@ -1 +1 @@
1
- import{memoOnce as e}from"@salsita-ai/common/utils";import{createDomainRuntime as t,createMockDomainRuntimeServices as o,createMockSessionContext as n}from"#package/domain";import{createCommonServicesSelectors as s}from"../common-services/index.js";import{createDomainApplicationContextSelectors as i}from"../domain-application-context/index.js";import{createIntegrationActions as a,createIntegrationSelectors as r,initializeIntegration as c}from"../integration/index.js";import{createRoutingActions as m,createRoutingSelectors as d,initializeRouting as p}from"../routing/index.js";import{SessionService as l,createSessionRuntimeActions as S,createSessionRuntimeSelectors as g,initializeSessionRuntime as v}from"../session/index.js";import{createMockWebComponentApi as u}from"../web-component/index.js";export const createMockApplicationRuntime=(f,C)=>{var x;let b,y,w,A,D,k,E,I,h,j,R,T,O,L,F,{sessionData:M,mode:U,role:V}=C,z=o(),q=(x={webComponentOptions:C.webComponentOptions??f.mount.options,webComponentApi:C.webComponentApi??u()},w=v(),A=t({config:f,services:z,getExtensionSystems:e=>F[e].getInitializableSystems()}),D=new Set,k=()=>{D.forEach(e=>{e()})},b=c({actions:E=a({setIntegration:e=>{b=e(b),k()}})}),I=r({getState:()=>({integration:b})}),h=m({setRouting:e=>{y=e(y),k()}}),y=p(),j=d({getState:()=>({...A.getState(),routing:y}),actions:h,accessActions:A.actions.access,loadedDataActions:A.actions.loadedData,domainServicesSelectors:A.selectors.domainServices,overridesSelectors:A.selectors.overrides}),R=s({getState:()=>({...A.getState(),session:w}),environmentSelectors:A.selectors.environment,specSelectors:A.selectors.spec,accessSelectors:A.selectors.access,domainServicesSelectors:A.selectors.domainServices,webComponentOptions:x.webComponentOptions,webComponentApi:x.webComponentApi,getSessionService:()=>L(),routingSelectors:j}),T=S({setSessionRuntime:e=>{w=e(w),k()}}),O=g({getState:()=>({...A.getState(),session:w}),sessionContextSelectors:A.selectors.sessionContext}),L=e(()=>new l({getLogger:()=>A.selectors.domainServices.getLogger(),getAnalyticsService:()=>A.selectors.domainServices.getAnalyticsService(),getUnauthenticatedClient:R.getUnauthenticatedClient,environmentSelectors:A.selectors.environment,sessionActions:T,setSessionContext:A.actions.sessionContext.setSessionContext,sessionSelectors:O,specSelectors:A.selectors.spec})),F={configurator:i({applicationType:"configurator",commonServicesSelectors:R,domainServicesSelectors:A.selectors.domainServices,domainContextSelectors:A.selectors.domainContext.configurator,getApplicationRuntimeExtensions:()=>[]}),admin:i({applicationType:"admin",commonServicesSelectors:R,domainServicesSelectors:A.selectors.domainServices,domainContextSelectors:A.selectors.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})},{subscribe:e=>{D.add(e);let t=A.subscribe(e);return()=>{D.delete(e),t()}},getState:()=>({...A.getState(),integration:b,routing:y,session:w}),selectors:{...A.selectors,commonServices:R,integration:I,routing:j,session:O,domainApplicationContext:F},actions:{...A.actions,integration:E,routing:h,session:T}}),B=q.getState().spec;return q.actions.spec.updateSpec({...B,configurator:{...B.configurator,createTransformers:e=>C.transformers.map(t=>t.transformer.register(e,t.priority??1/0))}}),q.actions.sessionContext.setSessionContext(n(V,M)),q.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",viewMode:"read"===U,revisionId:void 0,configurationId:"mock"}),q.actions.domainData.setDomainData({publishedData:C.publishedData,frontendData:C.frontendData,backendData:C.backendData}),q.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:C.entities,modelVersion:f.domain.domainFactory.modelVersion,rootEntityType:C.rootEntityType,schemaIdentity:f.domain.domainFactory}),q};
1
+ import{memoOnce as e}from"@salsita-ai/common/utils";import{AccessLevel as t}from"@salsita-ai/contracts/api";import{createDomainRuntime as o,createMockDomainRuntimeServices as n,createMockSessionContext as s}from"#package/domain";import{createCommonServicesSelectors as i}from"../common-services/index.js";import{createDomainApplicationContextSelectors as a}from"../domain-application-context/index.js";import{createIntegrationActions as r,createIntegrationSelectors as c,initializeIntegration as m}from"../integration/index.js";import{createRoutingActions as d,createRoutingSelectors as p,initializeRouting as l}from"../routing/index.js";import{SessionService as S,createSessionRuntimeActions as g,createSessionRuntimeSelectors as v,initializeSessionRuntime as u}from"../session/index.js";import{createMockWebComponentApi as f}from"../web-component/index.js";export const createMockApplicationRuntime=(C,x)=>{var b;let w,y,A,D,k,E,I,R,h,j,O,T,L,F,M,{sessionData:U,mode:V,role:z}=x,q=n(),B=(b={webComponentOptions:x.webComponentOptions??C.mount.options,webComponentApi:x.webComponentApi??f()},A=u(),D=o({config:C,services:q,getExtensionSystems:e=>M[e].getInitializableSystems()}),k=new Set,E=()=>{k.forEach(e=>{e()})},w=m({actions:I=r({setIntegration:e=>{w=e(w),E()}})}),R=c({getState:()=>({integration:w})}),h=d({setRouting:e=>{y=e(y),E()}}),y=l(),j=p({getState:()=>({...D.getState(),routing:y}),actions:h,accessActions:D.actions.access,loadedDataActions:D.actions.loadedData,domainServicesSelectors:D.selectors.domainServices,overridesSelectors:D.selectors.overrides}),O=i({getState:()=>({...D.getState(),session:A}),environmentSelectors:D.selectors.environment,specSelectors:D.selectors.spec,accessSelectors:D.selectors.access,domainServicesSelectors:D.selectors.domainServices,webComponentOptions:b.webComponentOptions,webComponentApi:b.webComponentApi,getSessionService:()=>F(),routingSelectors:j}),T=g({setSessionRuntime:e=>{A=e(A),E()}}),L=v({getState:()=>({...D.getState(),session:A}),sessionContextSelectors:D.selectors.sessionContext}),F=e(()=>new S({getLogger:()=>D.selectors.domainServices.getLogger(),getAnalyticsService:()=>D.selectors.domainServices.getAnalyticsService(),getUnauthenticatedClient:O.getUnauthenticatedClient,environmentSelectors:D.selectors.environment,sessionActions:T,setSessionContext:D.actions.sessionContext.setSessionContext,sessionSelectors:L,specSelectors:D.selectors.spec})),M={configurator:a({applicationType:"configurator",commonServicesSelectors:O,domainServicesSelectors:D.selectors.domainServices,domainContextSelectors:D.selectors.domainContext.configurator,getApplicationRuntimeExtensions:()=>[]}),admin:a({applicationType:"admin",commonServicesSelectors:O,domainServicesSelectors:D.selectors.domainServices,domainContextSelectors:D.selectors.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})},{subscribe:e=>{k.add(e);let t=D.subscribe(e);return()=>{k.delete(e),t()}},getState:()=>({...D.getState(),integration:w,routing:y,session:A}),selectors:{...D.selectors,commonServices:O,integration:R,routing:j,session:L,domainApplicationContext:M},actions:{...D.actions,integration:I,routing:h,session:T}}),G=B.getState().spec;return B.actions.spec.updateSpec({...G,configurator:{...G.configurator,createTransformers:e=>x.transformers.map(t=>t.transformer.register(e,t.priority??1/0))}}),B.actions.sessionContext.setSessionContext(s(z,U)),B.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",access:"read"===V?t.Read:t.Owner,viewMode:"read"===V,revisionId:void 0,configurationId:"mock"}),B.actions.domainData.setDomainData({publishedData:x.publishedData,frontendData:x.frontendData,backendData:x.backendData}),B.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:x.entities,modelVersion:C.domain.domainFactory.modelVersion,rootEntityType:x.rootEntityType,schemaIdentity:C.domain.domainFactory}),B};
@@ -3,6 +3,7 @@ export declare const getAccessTokenFromLocalStorage: (configurationId: string) =
3
3
  export declare const removeAccessTokenFromLocalStorage: (configurationId: string) => void;
4
4
  export declare const getAccessInfo: (configurationId: string, accessToken?: string) => {
5
5
  raw: string;
6
+ access: import("@salsita-ai/contracts/api").AccessLevel;
6
7
  viewMode: boolean;
7
8
  revisionId: string | undefined;
8
9
  configurationId: string;
@@ -36,6 +36,7 @@ interface Props<State extends ApplicationRuntimeState, CONFIGURATOR_EXTENSIONS e
36
36
  * `createDomainRuntimeSlices`, which this composes.
37
37
  */
38
38
  export declare function createApplicationRuntimeSlices<State extends ApplicationRuntimeState, CONFIGURATOR_EXTENSIONS extends readonly AnyApplicationRuntimeExtension[]>(props: Props<State, CONFIGURATOR_EXTENSIONS>): {
39
+ getState: () => State;
39
40
  initialize: () => {
40
41
  spec: import("#package/domain").ApplicationSpec;
41
42
  overrides: import("#package/domain").ApplicationOverrides;
@@ -278,24 +279,28 @@ export declare function createApplicationRuntimeSlices<State extends Application
278
279
  access: {
279
280
  selectConfiguratorRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
280
281
  raw: string;
282
+ access: import("@salsita-ai/contracts/api").AccessLevel;
281
283
  viewMode: boolean;
282
284
  revisionId: string | undefined;
283
285
  configurationId: string;
284
286
  } | null>;
285
287
  selectAdminRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
286
288
  raw: string;
289
+ access: import("@salsita-ai/contracts/api").AccessLevel;
287
290
  viewMode: boolean;
288
291
  revisionId: string | undefined;
289
292
  configurationId: string;
290
293
  } | null>;
291
294
  selectConfiguratorAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
292
295
  raw: string;
296
+ access: import("@salsita-ai/contracts/api").AccessLevel;
293
297
  viewMode: boolean;
294
298
  revisionId: string | undefined;
295
299
  configurationId: string;
296
300
  }>;
297
301
  selectAdminAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
298
302
  raw: string;
303
+ access: import("@salsita-ai/contracts/api").AccessLevel;
299
304
  viewMode: boolean;
300
305
  revisionId: string | undefined;
301
306
  configurationId: string;
@@ -308,24 +313,28 @@ export declare function createApplicationRuntimeSlices<State extends Application
308
313
  selectAdminConfigurationId: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, string>;
309
314
  getConfiguratorRawAccessInfo: () => {
310
315
  raw: string;
316
+ access: import("@salsita-ai/contracts/api").AccessLevel;
311
317
  viewMode: boolean;
312
318
  revisionId: string | undefined;
313
319
  configurationId: string;
314
320
  } | null;
315
321
  getAdminRawAccessInfo: () => {
316
322
  raw: string;
323
+ access: import("@salsita-ai/contracts/api").AccessLevel;
317
324
  viewMode: boolean;
318
325
  revisionId: string | undefined;
319
326
  configurationId: string;
320
327
  } | null;
321
328
  getConfiguratorAccessInfo: () => {
322
329
  raw: string;
330
+ access: import("@salsita-ai/contracts/api").AccessLevel;
323
331
  viewMode: boolean;
324
332
  revisionId: string | undefined;
325
333
  configurationId: string;
326
334
  };
327
335
  getAdminAccessInfo: () => {
328
336
  raw: string;
337
+ access: import("@salsita-ai/contracts/api").AccessLevel;
329
338
  viewMode: boolean;
330
339
  revisionId: string | undefined;
331
340
  configurationId: string;
@@ -938,24 +947,28 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
938
947
  access: {
939
948
  selectConfiguratorRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
940
949
  raw: string;
950
+ access: import("@salsita-ai/contracts/api").AccessLevel;
941
951
  viewMode: boolean;
942
952
  revisionId: string | undefined;
943
953
  configurationId: string;
944
954
  } | null>;
945
955
  selectAdminRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
946
956
  raw: string;
957
+ access: import("@salsita-ai/contracts/api").AccessLevel;
947
958
  viewMode: boolean;
948
959
  revisionId: string | undefined;
949
960
  configurationId: string;
950
961
  } | null>;
951
962
  selectConfiguratorAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
952
963
  raw: string;
964
+ access: import("@salsita-ai/contracts/api").AccessLevel;
953
965
  viewMode: boolean;
954
966
  revisionId: string | undefined;
955
967
  configurationId: string;
956
968
  }>;
957
969
  selectAdminAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
958
970
  raw: string;
971
+ access: import("@salsita-ai/contracts/api").AccessLevel;
959
972
  viewMode: boolean;
960
973
  revisionId: string | undefined;
961
974
  configurationId: string;
@@ -968,24 +981,28 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
968
981
  selectAdminConfigurationId: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, string>;
969
982
  getConfiguratorRawAccessInfo: () => {
970
983
  raw: string;
984
+ access: import("@salsita-ai/contracts/api").AccessLevel;
971
985
  viewMode: boolean;
972
986
  revisionId: string | undefined;
973
987
  configurationId: string;
974
988
  } | null;
975
989
  getAdminRawAccessInfo: () => {
976
990
  raw: string;
991
+ access: import("@salsita-ai/contracts/api").AccessLevel;
977
992
  viewMode: boolean;
978
993
  revisionId: string | undefined;
979
994
  configurationId: string;
980
995
  } | null;
981
996
  getConfiguratorAccessInfo: () => {
982
997
  raw: string;
998
+ access: import("@salsita-ai/contracts/api").AccessLevel;
983
999
  viewMode: boolean;
984
1000
  revisionId: string | undefined;
985
1001
  configurationId: string;
986
1002
  };
987
1003
  getAdminAccessInfo: () => {
988
1004
  raw: string;
1005
+ access: import("@salsita-ai/contracts/api").AccessLevel;
989
1006
  viewMode: boolean;
990
1007
  revisionId: string | undefined;
991
1008
  configurationId: string;
@@ -1 +1 @@
1
- import{BehaviorSubject as e}from"rxjs";import{memoOnce as t}from"@salsita-ai/common/utils";import{createDomainRuntimeSlices as i,resolveIsDev as n}from"#package/domain";import{initializeAnalyticsService as o}from"../common-services/analytics/analytics-service.js";import{initializeI18n as s,initializeLogger as r}from"../common-services/initialize.js";import{createCommonServicesSelectors as a}from"../common-services/selectors.js";import{createDomainApplicationContextSelectors as c}from"../domain-application-context/index.js";import{createIntegrationActions as m,createIntegrationSelectors as l,initializeIntegration as p}from"../integration/index.js";import{createRoutingActions as u,createRoutingSelectors as d,initializeRouting as g}from"../routing/index.js";import{SessionService as S,createSessionRuntimeActions as v,createSessionRuntimeSelectors as x,initializeSessionRuntime as f}from"../session/index.js";import{registerGodModeGlobal as C}from"./god-mode.js";export function createApplicationRuntimeSlices(e){let{config:y,bootConfig:A,getSubject:b,getConfiguratorExtensions:j}=e,w=n(y),R=r(y,w),I={analyticsService:o(y,R,w),i18n:s(y),logger:R},{initialize:E,selectors:h,actions:z}=i({config:y,services:I,getSubject:b,getExtensionSystems:e=>J[e].getInitializableSystems()}),D=E(),T=m({setIntegration:e=>{let t=b(),i=e(t.value.integration);t.next({...t.value,integration:i})}}),L=l({getState:()=>b().value}),O=p({actions:T}),U=u({setRouting:e=>{let t=b(),i=e(t.value.routing);t.next({...t.value,routing:i})}}),k=d({getState:()=>b().value,actions:U,accessActions:z.access,loadedDataActions:z.loadedData,domainServicesSelectors:h.domainServices,overridesSelectors:h.overrides}),G=g(),$=a({getState:()=>b().value,environmentSelectors:h.environment,specSelectors:h.spec,accessSelectors:h.access,domainServicesSelectors:h.domainServices,webComponentOptions:A.webComponentOptions,webComponentApi:A.webComponentApi,getSessionService:()=>H(),routingSelectors:k}),q=v({setSessionRuntime:e=>{let t=b(),i=e(t.value.session);t.next({...t.value,session:i})}}),B=x({getState:()=>b().value,sessionContextSelectors:h.sessionContext}),F=f(),H=t(()=>new S({getLogger:()=>h.domainServices.getLogger(),getAnalyticsService:()=>h.domainServices.getAnalyticsService(),getUnauthenticatedClient:$.getUnauthenticatedClient,environmentSelectors:h.environment,sessionActions:q,setSessionContext:z.sessionContext.setSessionContext,sessionSelectors:B,specSelectors:h.spec})),J={configurator:c({applicationType:"configurator",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.configurator,getApplicationRuntimeExtensions:j}),admin:c({applicationType:"admin",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})};return C({environmentActions:z.environment}),R.info(`Configurator Application loaded with deployment ID: ${y.deploymentId}!`),R.appendToGlobalContext({deploymentId:y.deploymentId}),{initialize:()=>({...D,integration:O,routing:G,session:F}),selectors:{...h,commonServices:$,integration:L,routing:k,session:B,domainApplicationContext:J},actions:{...z,integration:T,routing:U,session:q}}}export function createApplicationRuntime(t,i,n){return((t,i,n)=>{let o=null,s=null,r=()=>{if(!o)throw Error("Subject not yet initialized!");return o},{initialize:a,...c}=createApplicationRuntimeSlices({config:t,bootConfig:i,getSubject:r,getConfiguratorExtensions:()=>s});return s=n?n(c):[],c.selectors.domainApplicationContext.configurator.getSystems(),o=new e(a()),{...c,getState:()=>r().value,subscribe:e=>{let t=r().subscribe(()=>e());return()=>t.unsubscribe()}}})(t,i,n)}
1
+ import{BehaviorSubject as e}from"rxjs";import{memoOnce as t}from"@salsita-ai/common/utils";import{createDomainRuntimeSlices as i,resolveIsDev as n}from"#package/domain";import{initializeAnalyticsService as o}from"../common-services/analytics/analytics-service.js";import{initializeI18n as s,initializeLogger as r}from"../common-services/initialize.js";import{createCommonServicesSelectors as a}from"../common-services/selectors.js";import{createDomainApplicationContextSelectors as c}from"../domain-application-context/index.js";import{createIntegrationActions as m,createIntegrationSelectors as l,initializeIntegration as p}from"../integration/index.js";import{createRoutingActions as u,createRoutingSelectors as d,initializeRouting as g}from"../routing/index.js";import{SessionService as S,createSessionRuntimeActions as v,createSessionRuntimeSelectors as x,initializeSessionRuntime as f}from"../session/index.js";import{registerGodModeGlobal as C}from"./god-mode.js";export function createApplicationRuntimeSlices(e){let{config:y,bootConfig:A,getSubject:b,getConfiguratorExtensions:j}=e,w=n(y),R=r(y,w),I={analyticsService:o(y,R,w),i18n:s(y),logger:R},{initialize:E,selectors:h,actions:z}=i({config:y,services:I,getSubject:b,getExtensionSystems:e=>J[e].getInitializableSystems()}),D=E(),T=m({setIntegration:e=>{let t=b(),i=e(t.value.integration);t.next({...t.value,integration:i})}}),L=l({getState:()=>b().value}),O=p({actions:T}),U=u({setRouting:e=>{let t=b(),i=e(t.value.routing);t.next({...t.value,routing:i})}}),k=d({getState:()=>b().value,actions:U,accessActions:z.access,loadedDataActions:z.loadedData,domainServicesSelectors:h.domainServices,overridesSelectors:h.overrides}),G=g(),$=a({getState:()=>b().value,environmentSelectors:h.environment,specSelectors:h.spec,accessSelectors:h.access,domainServicesSelectors:h.domainServices,webComponentOptions:A.webComponentOptions,webComponentApi:A.webComponentApi,getSessionService:()=>H(),routingSelectors:k}),q=v({setSessionRuntime:e=>{let t=b(),i=e(t.value.session);t.next({...t.value,session:i})}}),B=x({getState:()=>b().value,sessionContextSelectors:h.sessionContext}),F=f(),H=t(()=>new S({getLogger:()=>h.domainServices.getLogger(),getAnalyticsService:()=>h.domainServices.getAnalyticsService(),getUnauthenticatedClient:$.getUnauthenticatedClient,environmentSelectors:h.environment,sessionActions:q,setSessionContext:z.sessionContext.setSessionContext,sessionSelectors:B,specSelectors:h.spec})),J={configurator:c({applicationType:"configurator",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.configurator,getApplicationRuntimeExtensions:j}),admin:c({applicationType:"admin",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})};return C({environmentActions:z.environment}),R.info(`Configurator Application loaded with deployment ID: ${y.deploymentId}!`),R.appendToGlobalContext({deploymentId:y.deploymentId}),{getState:()=>b().value,initialize:()=>({...D,integration:O,routing:G,session:F}),selectors:{...h,commonServices:$,integration:L,routing:k,session:B,domainApplicationContext:J},actions:{...z,integration:T,routing:U,session:q}}}export function createApplicationRuntime(t,i,n){return((t,i,n)=>{let o=null,s=null,r=()=>{if(!o)throw Error("Subject not yet initialized!");return o},{initialize:a,...c}=createApplicationRuntimeSlices({config:t,bootConfig:i,getSubject:r,getConfiguratorExtensions:()=>s});return s=n?n(c):[],c.selectors.domainApplicationContext.configurator.getSystems(),o=new e(a()),{...c,getState:()=>r().value,subscribe:e=>{let t=r().subscribe(()=>e());return()=>t.unsubscribe()}}})(t,i,n)}
@@ -0,0 +1,30 @@
1
+ import type { $DomainEntity, DomainEntity, EntityViolation, ViolationTypesOf$Entity } from '#package/domain';
2
+ /**
3
+ * A message for the user about a change to the configuration, with its text resolved to the current language.
4
+ * Typed per project like `StateValidationResult`, so a layout can narrow on `violation.type`.
5
+ * - `violation`: a change was rejected because it breaks an invariant. There is one message per violation of the
6
+ * rejected state, including notices and warnings that were already present; `violation.severity` tells them
7
+ * apart. `text` is the violation's message, or its type when it has none; `entityId` names the entity.
8
+ * - `sideEffect`: a committed change carried a hint, for example from a transformer that adjusted another field.
9
+ * - `error`: an error was thrown while the changed state was validated; `text` is a generic message for the user.
10
+ */
11
+ export type ConfiguratorMessage<ENTITIES extends DomainEntity<string> = DomainEntity<string>, VIOLATION_TYPE extends string = string> = ({
12
+ readonly kind: 'violation';
13
+ readonly text: string;
14
+ } & EntityViolation<ENTITIES, VIOLATION_TYPE>) | {
15
+ readonly kind: 'sideEffect';
16
+ readonly text: string;
17
+ } | {
18
+ readonly kind: 'error';
19
+ readonly error: Error;
20
+ readonly text: string;
21
+ };
22
+ export type UseConfiguratorMessages<ENTITIES extends DomainEntity<string> = DomainEntity<string>, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>> = Record<ENTITIES['type'], $DomainEntity<ENTITIES>>> = (onMessage: (message: ConfiguratorMessage<ENTITIES, ViolationTypesOf$Entity<$MAP[ENTITIES['type']]>>) => void) => void;
23
+ /**
24
+ * Calls `onMessage` once for every violation, side-effect hint and validation error: the violations of a rejected
25
+ * change, the hints of a committed change and an error thrown while a change was validated. Hints committed before the
26
+ * component mounted are not delivered; when the most recent change was rejected or threw, its messages are
27
+ * delivered again on mount, because the store keeps that emission. `onMessage` may be a new function on every
28
+ * render; the latest one is called.
29
+ */
30
+ export declare const useConfiguratorMessages: (onMessage: (message: ConfiguratorMessage) => void) => void;
@@ -0,0 +1 @@
1
+ import{useSubscription as e}from"observable-hooks";import{useMemo as t}from"react";import{distinctUntilChanged as i,map as o,skip as r}from"rxjs";import{useResolveLocalizable as s}from"../../localizable/index.js";import{useDomain as a}from"./use-domain-context.js";let n={id:"sdk.messages.validation.uncaughtError.message",message:"Oops, something went wrong"};export const useConfiguratorMessages=m=>{let{storeSystem:l}=a(),d=s(),p=t(()=>l.stateSlices.potentiallyInvalid.pipe(o(e=>e.validity)),[l]),f=t(()=>l.stateSlices.committed.pipe(r(1),i(),o(e=>"updates"in e?e.updates.flatMap(e=>e.hint?[e.hint]:[]):[])),[l]);e(p,e=>{if(!e.valid){if("uncaught"===e.severity)return void m({kind:"error",error:e.error,text:d(n)});e.entityViolations.forEach(({entityId:e,violation:t})=>{m({kind:"violation",entityId:e,violation:t,text:d(t.message??t.type)})})}}),e(f,e=>{e.forEach(e=>{m({kind:"sideEffect",text:d(e)})})})};
@@ -2,12 +2,13 @@ export { useDomain, type UseDomainContext } from './common-hooks/use-domain-cont
2
2
  export { useStoreSelector, useRenderedSelector, useRenderedSelector$, useStoreSelector$, type UseSynchronizedSelector, type UseSynchronizedSelector$, } from './common-hooks/use-store-selector.js';
3
3
  export { useEagerObservableSelector, usePatientObservableSelector, usePatientObservableValue, useEagerObservableValue, } from './common-hooks/use-observable-selector.js';
4
4
  export { useStateValidity, type UseStateValidity, useMapViolationHints, type UseMapViolationHints, useControlViolations, type UseControlViolations, useFinalizeViolations, type UseFinalizeViolations, } from './common-hooks/use-state-validity.js';
5
+ export { useConfiguratorMessages, type UseConfiguratorMessages, type ConfiguratorMessage, } from './common-hooks/use-configurator-messages.js';
5
6
  export { useComponent, useRenderedComponent, type UseComponent, useComponents, useDynamicComponents, useRenderedComponents, type UseComponents, useRootComponents, useRootRenderedComponents, type UseRootComponents, useFirstComponent, useFirstRenderedComponent, type UseFirstComponent, useFirstRootComponent, useFirstRootRenderedComponent, type UseFirstRootComponent, } from './component-hooks/use-component.js';
6
7
  export { useCommittedState, useCommittedSlice, useRenderedSlice, useRenderedState, type UseSlice, type UseState, } from './common-hooks/use-slices.js';
7
8
  export { useDomainEntityState, useDomainEntityRenderedState, type UseDomainEntityState, } from './entity-hooks/use-domain-entity-state.js';
8
9
  export { useEntityPrice, useRootEntityPrice, type UseEntityPrice, type UseRootEntityPrice, } from './entity-hooks/use-entity-price.js';
9
10
  export { useSelectEntity, type UseSelectEntity, useSelectedEntity, type UseSelectedEntity, useSelectedEntityId, type UseSelectedEntityId, useSelectedDomainEntityId, type UseSelectedDomainEntityId, useDeselect, type UseDeselect, useSelectParent, type UseSelectParent, } from './system-hooks/selection-hooks.js';
10
- export { useActiveNavigationState, type UseActiveNavigationState, useActiveViewState, type UseActiveViewState, useActiveToolState, type UseActiveToolState, useIsFullscreenActive, type UseIsFullscreenActive, useSetFullscreen, type UseSetFullscreen, useActiveViewports, type UseActiveViewports, useDraggedDomainEntityId, type UseDraggedDomainEntityId, useNavigate, type UseNavigate, usePushNavigate, type UsePushNavigate, usePopNavigate, type UsePopNavigate, } from './system-hooks/navigation-hooks.js';
11
+ export { useActiveNavigationState, type UseActiveNavigationState, useActiveViewState, type UseActiveViewState, useSetViewState, type UseSetViewState, useActiveToolState, type UseActiveToolState, useIsFullscreenActive, type UseIsFullscreenActive, useSetFullscreen, type UseSetFullscreen, useActiveViewports, type UseActiveViewports, useDraggedDomainEntityId, type UseDraggedDomainEntityId, useNavigate, type UseNavigate, usePushNavigate, type UsePushNavigate, usePopNavigate, type UsePopNavigate, } from './system-hooks/navigation-hooks.js';
11
12
  export { useComposition, type UseComposition } from './system-hooks/composition-hooks.js';
12
13
  export { useHoveredDomainEntityId, useHoveredEntity, useHoveredEntityId, type UseHoveredDomainEntityId, type UseHoveredEntity, type UseHoveredEntityId, } from './system-hooks/hover-hooks.js';
13
14
  export { type UseRootEntityState, useRootEntityState, useRootEntityRenderedState, } from './entity-hooks/use-root-entity-state.js';
@@ -1 +1 @@
1
- export{useDomain}from"./common-hooks/use-domain-context.js";export{useStoreSelector,useRenderedSelector,useRenderedSelector$,useStoreSelector$}from"./common-hooks/use-store-selector.js";export{useEagerObservableSelector,usePatientObservableSelector,usePatientObservableValue,useEagerObservableValue}from"./common-hooks/use-observable-selector.js";export{useStateValidity,useMapViolationHints,useControlViolations,useFinalizeViolations}from"./common-hooks/use-state-validity.js";export{useComponent,useRenderedComponent,useComponents,useDynamicComponents,useRenderedComponents,useRootComponents,useRootRenderedComponents,useFirstComponent,useFirstRenderedComponent,useFirstRootComponent,useFirstRootRenderedComponent}from"./component-hooks/use-component.js";export{useCommittedState,useCommittedSlice,useRenderedSlice,useRenderedState}from"./common-hooks/use-slices.js";export{useDomainEntityState,useDomainEntityRenderedState}from"./entity-hooks/use-domain-entity-state.js";export{useEntityPrice,useRootEntityPrice}from"./entity-hooks/use-entity-price.js";export{useSelectEntity,useSelectedEntity,useSelectedEntityId,useSelectedDomainEntityId,useDeselect,useSelectParent}from"./system-hooks/selection-hooks.js";export{useActiveNavigationState,useActiveViewState,useActiveToolState,useIsFullscreenActive,useSetFullscreen,useActiveViewports,useDraggedDomainEntityId,useNavigate,usePushNavigate,usePopNavigate}from"./system-hooks/navigation-hooks.js";export{useComposition}from"./system-hooks/composition-hooks.js";export{useHoveredDomainEntityId,useHoveredEntity,useHoveredEntityId}from"./system-hooks/hover-hooks.js";export{useRootEntityState,useRootEntityRenderedState}from"./entity-hooks/use-root-entity-state.js";export{useRootEntityId,useRootEntityRenderedId}from"./entity-hooks/use-root-entity-id.js";export{useEntitySelector,useRootEntitySelector,useRenderedEntitySelector,useRenderedRootEntitySelector}from"./common-hooks/use-entity-selector.js";export{useDimensionState,useDimensions,useDimensionConfig}from"./system-hooks/dimension-hooks.js";
1
+ export{useDomain}from"./common-hooks/use-domain-context.js";export{useStoreSelector,useRenderedSelector,useRenderedSelector$,useStoreSelector$}from"./common-hooks/use-store-selector.js";export{useEagerObservableSelector,usePatientObservableSelector,usePatientObservableValue,useEagerObservableValue}from"./common-hooks/use-observable-selector.js";export{useStateValidity,useMapViolationHints,useControlViolations,useFinalizeViolations}from"./common-hooks/use-state-validity.js";export{useConfiguratorMessages}from"./common-hooks/use-configurator-messages.js";export{useComponent,useRenderedComponent,useComponents,useDynamicComponents,useRenderedComponents,useRootComponents,useRootRenderedComponents,useFirstComponent,useFirstRenderedComponent,useFirstRootComponent,useFirstRootRenderedComponent}from"./component-hooks/use-component.js";export{useCommittedState,useCommittedSlice,useRenderedSlice,useRenderedState}from"./common-hooks/use-slices.js";export{useDomainEntityState,useDomainEntityRenderedState}from"./entity-hooks/use-domain-entity-state.js";export{useEntityPrice,useRootEntityPrice}from"./entity-hooks/use-entity-price.js";export{useSelectEntity,useSelectedEntity,useSelectedEntityId,useSelectedDomainEntityId,useDeselect,useSelectParent}from"./system-hooks/selection-hooks.js";export{useActiveNavigationState,useActiveViewState,useSetViewState,useActiveToolState,useIsFullscreenActive,useSetFullscreen,useActiveViewports,useDraggedDomainEntityId,useNavigate,usePushNavigate,usePopNavigate}from"./system-hooks/navigation-hooks.js";export{useComposition}from"./system-hooks/composition-hooks.js";export{useHoveredDomainEntityId,useHoveredEntity,useHoveredEntityId}from"./system-hooks/hover-hooks.js";export{useRootEntityState,useRootEntityRenderedState}from"./entity-hooks/use-root-entity-state.js";export{useRootEntityId,useRootEntityRenderedId}from"./entity-hooks/use-root-entity-id.js";export{useEntitySelector,useRootEntitySelector,useRenderedEntitySelector,useRenderedRootEntitySelector}from"./common-hooks/use-entity-selector.js";export{useDimensionState,useDimensions,useDimensionConfig}from"./system-hooks/dimension-hooks.js";
@@ -9,6 +9,11 @@ export type UseActiveViewState<VIEW_STATE extends string> = () => VIEW_STATE;
9
9
  * Get the currently active view state
10
10
  */
11
11
  export declare const useActiveViewState: () => string;
12
+ export type UseSetViewState<VIEW_STATE extends string> = () => (state: VIEW_STATE) => void;
13
+ /**
14
+ * Hook to make the given view state the active one. Setting the state that is already active keeps it
15
+ */
16
+ export declare const useSetViewState: () => (state: string) => void;
12
17
  export type UseActiveToolState<TOOL_STATE extends string> = () => TOOL_STATE;
13
18
  /**
14
19
  * Get the currently active tool state
@@ -1 +1 @@
1
- import{useCallback as t}from"react";import{useDomain as e}from"../common-hooks/use-domain-context.js";import{useStoreSelector as o}from"../common-hooks/use-store-selector.js";export const useActiveNavigationState=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveNavigationState(e.state),[t])};export const useActiveViewState=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveViewState(e.state),[t])};export const useActiveToolState=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveToolState(e.state),[t])};export const useIsFullscreenActive=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveFullscreenState(e.state),[t])};export const useSetFullscreen=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(t=>{o.stageAndCommit([s.getFullscreenUpdate(t)])},[o,s])};export const useDraggedDomainEntityId=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveDragState(e.state),[t])};export const useActiveViewports=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveViewportState(e.state),[t])};export const useNavigate=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(t=>{o.stageAndCommit([s.getNavigationUpdate(t)])},[o,s])};export const usePushNavigate=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(t=>{o.stageAndCommit([s.getPushNavigationUpdate(t,o.stateSlices.committed.value.state)])},[o,s])};export const usePopNavigate=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(()=>{let t=s.getPopNavigationUpdate(o.stateSlices.committed.value.state);t&&o.stageAndCommit([t])},[o,s])};
1
+ import{useCallback as t}from"react";import{useDomain as e}from"../common-hooks/use-domain-context.js";import{useStoreSelector as o}from"../common-hooks/use-store-selector.js";export const useActiveNavigationState=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveNavigationState(e.state),[t])};export const useActiveViewState=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveViewState(e.state),[t])};export const useSetViewState=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(t=>{o.stageAndCommit([s.getViewUpdate(t)])},[o,s])};export const useActiveToolState=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveToolState(e.state),[t])};export const useIsFullscreenActive=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveFullscreenState(e.state),[t])};export const useSetFullscreen=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(t=>{o.stageAndCommit([s.getFullscreenUpdate(t)])},[o,s])};export const useDraggedDomainEntityId=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveDragState(e.state),[t])};export const useActiveViewports=()=>{let{navigationSystem:t}=e();return o(e=>t.getActiveViewportState(e.state),[t])};export const useNavigate=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(t=>{o.stageAndCommit([s.getNavigationUpdate(t)])},[o,s])};export const usePushNavigate=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(t=>{o.stageAndCommit([s.getPushNavigationUpdate(t,o.stateSlices.committed.value.state)])},[o,s])};export const usePopNavigate=()=>{let{storeSystem:o,navigationSystem:s}=e();return t(()=>{let t=s.getPopNavigationUpdate(o.stateSlices.committed.value.state);t&&o.stageAndCommit([t])},[o,s])};
@@ -2,7 +2,7 @@ import { type AnalyticsEvent, type AngleDimensionComponent, AngleUnit, type Comp
2
2
  export declare const AngleDimensionSliderUpdateTag = "setAngleDimension";
3
3
  export type IsAngleDimensionUpdate<ENTITIES extends DomainEntity<string>> = (update: StateUpdate<ENTITIES, ENTITIES>, types: ReadonlyArray<ENTITIES['type']>, instanceName: string) => update is ComponentModification<AngleDimensionComponent>;
4
4
  export declare const isAngleDimensionUpdate: (update: StateUpdate<DomainEntity<string>, DomainEntity<string>>, types: readonly string[], instanceName: string) => update is ComponentModification<AngleDimensionComponent>;
5
- export declare const useAngleDimension: (entityId: DomainEntityId<string>, instanceName: string, fixableViolations?: string[], createAnalyticsEvent?: (instanceName: string, entityId: DomainEntityId<string>, value: number) => AnalyticsEvent, stageOnUpdate?: boolean) => {
5
+ export declare const useAngleDimension: (entityId: DomainEntityId<string>, instanceName: string, fixableViolations?: readonly string[], createAnalyticsEvent?: (instanceName: string, entityId: DomainEntityId<string>, value: number) => AnalyticsEvent, stageOnUpdate?: boolean) => {
6
6
  value: number;
7
7
  min: number | undefined;
8
8
  max: number | undefined;
@@ -44,7 +44,7 @@ declare module '@mui/material/styles' {
44
44
  PhxChat: 'root';
45
45
  PhxChatFooter: 'root' | 'formLayout' | 'input';
46
46
  PhxChatMessage: 'base' | 'assistant' | 'user' | 'widget' | 'error' | 'helper';
47
- PhxAssistantPanel: 'root' | 'header' | 'title' | 'closeButton' | 'thread' | 'greeting' | 'messages' | 'userMessage' | 'assistantMessage' | 'chips' | 'activity' | 'activityIcon' | 'chip' | 'status' | 'separator' | 'earlierButton' | 'notice' | 'newReplyButton' | 'composer' | 'inputFrame' | 'input' | 'sendButton' | 'stopButton' | 'hint';
47
+ PhxAssistantPanel: 'root' | 'header' | 'title' | 'closeButton' | 'thread' | 'greeting' | 'messages' | 'userMessage' | 'assistantMessage' | 'entityLink' | 'chips' | 'activity' | 'activityIcon' | 'chip' | 'undoButton' | 'status' | 'separator' | 'earlierButton' | 'notice' | 'newReplyButton' | 'composer' | 'inputFrame' | 'input' | 'sendButton' | 'stopButton' | 'hint';
48
48
  PhxTopNavigation: 'root' | 'stepper' | 'step';
49
49
  PhxListSelector: 'root';
50
50
  PhxListSelectorItem: 'root' | 'radio' | 'title' | 'description' | 'formControlLabel';