@salsita-ai/sdk 0.50.0-develop.b5468d6828 → 0.50.0-develop.bb1eefaada

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 +8 -4
  2. package/dist/admin/default-admin-elements.d.ts +9 -0
  3. package/dist/admin/default-admin-elements.js +1 -0
  4. package/dist/admin/default-elements/built-in-entity-element.d.ts +10 -0
  5. package/dist/admin/default-elements/built-in-entity-element.js +1 -0
  6. package/dist/admin/default-elements/built-in-layout-element.d.ts +10 -0
  7. package/dist/admin/default-elements/built-in-layout-element.js +1 -0
  8. package/dist/admin/default-elements/index.d.ts +2 -0
  9. package/dist/admin/default-elements/index.js +1 -0
  10. package/dist/admin/index.d.ts +1 -0
  11. package/dist/admin/index.js +1 -1
  12. package/dist/application-spec/caching/content-diff.js +1 -1
  13. package/dist/application-spec/core/application-file.d.ts +0 -2
  14. package/dist/application-spec/core/application-file.js +1 -1
  15. package/dist/application-spec/errors/diagnostic-codes.d.ts +5 -0
  16. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  17. package/dist/application-spec/errors/diagnostic-messages.d.ts +5 -0
  18. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  19. package/dist/application-spec/generate-application/code/common/code-imports.js +1 -1
  20. package/dist/application-spec/generate-application/code/common/env-reader.js +2 -2
  21. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  22. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  23. package/dist/application-spec/generate-application/code/common/single-quoted-string.d.ts +6 -0
  24. package/dist/application-spec/generate-application/code/common/single-quoted-string.js +1 -0
  25. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  26. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +10 -14
  27. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  28. package/dist/application-spec/generate-application/code/templates/admin-config.js +3 -0
  29. package/dist/application-spec/generate-application/code/templates/common/format-property-key.d.ts +7 -0
  30. package/dist/application-spec/generate-application/code/templates/common/format-property-key.js +1 -0
  31. package/dist/application-spec/generate-application/code/templates/common/schema-to-type-string.js +3 -3
  32. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.d.ts +1 -1
  33. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +6 -6
  34. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-presets.js +1 -1
  35. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +13 -13
  36. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-states.d.ts +1 -1
  37. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-states.js +2 -2
  38. package/dist/application-spec/generate-application/code/templates/eslint-config.d.ts +5 -0
  39. package/dist/application-spec/generate-application/code/templates/eslint-config.js +4 -5
  40. package/dist/application-spec/generate-application/code/templates/gitignore.js +1 -3
  41. package/dist/application-spec/generate-application/code/templates/globals.js +7 -4
  42. package/dist/application-spec/generate-application/code/templates/index.d.ts +2 -2
  43. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  44. package/dist/application-spec/generate-application/code/templates/lingui-rc.d.ts +5 -0
  45. package/dist/application-spec/generate-application/code/templates/lingui-rc.js +4 -4
  46. package/dist/application-spec/generate-application/code/templates/prettier-config.d.ts +5 -0
  47. package/dist/application-spec/generate-application/code/templates/prettier-config.js +4 -5
  48. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  49. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +1 -1
  50. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +5 -5
  51. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +3 -3
  52. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  53. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +2 -2
  54. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +13 -2
  55. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  56. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.d.ts +58 -0
  57. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.js +1 -0
  58. package/dist/application-spec/generate-application/code/templates/spec-code/index.d.ts +2 -0
  59. package/dist/application-spec/generate-application/code/templates/spec-code/index.js +1 -0
  60. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.d.ts +18 -0
  61. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.js +41 -0
  62. package/dist/application-spec/generate-application/code/templates/spec-messages/index.d.ts +1 -0
  63. package/dist/application-spec/generate-application/code/templates/spec-messages/index.js +1 -0
  64. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.d.ts +20 -0
  65. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.js +6 -0
  66. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.d.ts +6 -4
  67. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.js +1 -1
  68. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +3 -2
  69. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  70. package/dist/application-spec/generate-application/runtime/admin-runtime/states-runtime.d.ts +2 -2
  71. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +13 -6
  72. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  73. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.d.ts +6 -4
  74. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.js +1 -1
  75. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +3 -2
  76. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  77. package/dist/application-spec/generate-application/runtime/configurator-runtime/states-runtime.d.ts +2 -2
  78. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +2 -2
  79. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +2 -2
  80. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +2 -1
  81. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  82. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.d.ts +2 -1
  83. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.js +1 -1
  84. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +3 -0
  85. package/dist/application-spec/generate-application/runtime/sections/component-optic.js +1 -1
  86. package/dist/application-spec/generate-application/runtime/sections/data-runtime.d.ts +4 -4
  87. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.d.ts +7 -4
  88. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  89. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.d.ts +9 -5
  90. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.js +1 -1
  91. package/dist/application-spec/generate-application/runtime/sections/reflection-constants-runtime.d.ts +3 -1
  92. package/dist/application-spec/generate-application/runtime/sections/reflection-constants-runtime.js +1 -1
  93. package/dist/application-spec/generate-application/runtime/sections/theme-runtime.d.ts +2 -2
  94. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +3 -3
  95. package/dist/application-spec/generate-application/runtime/spec-code/index.d.ts +2 -0
  96. package/dist/application-spec/generate-application/runtime/spec-code/index.js +1 -0
  97. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.d.ts +18 -0
  98. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.js +1 -0
  99. package/dist/application-spec/generate-application/runtime/spec-code/spec-code-module.d.ts +17 -0
  100. package/dist/application-spec/generate-application/runtime/spec-code/spec-code-module.js +1 -0
  101. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.d.ts +9 -0
  102. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.js +1 -0
  103. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.d.ts +8 -0
  104. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.js +1 -0
  105. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.d.ts +27 -0
  106. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.js +1 -0
  107. package/dist/application-spec/generate-application/runtime-spec/index.d.ts +5 -0
  108. package/dist/application-spec/generate-application/runtime-spec/index.js +1 -0
  109. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.d.ts +68 -0
  110. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.js +1 -0
  111. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.d.ts +40 -0
  112. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.js +1 -0
  113. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +18 -0
  114. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  115. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.d.ts +16 -0
  116. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.js +9 -0
  117. package/dist/application-spec/parse-application-files/raw-spec/parse-yaml-spec-file.js +1 -1
  118. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-spec.js +1 -1
  119. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/configurator-spec.js +1 -1
  120. package/dist/application-spec/parse-application-files/spec/common/index.d.ts +1 -0
  121. package/dist/application-spec/parse-application-files/spec/common/index.js +1 -1
  122. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.d.ts +3 -0
  123. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.js +1 -0
  124. package/dist/application-spec/parse-application-files/spec/common/value-type/index.d.ts +5 -0
  125. package/dist/application-spec/parse-application-files/spec/common/value-type/index.js +1 -0
  126. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.d.ts +6 -0
  127. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.js +1 -0
  128. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.d.ts +8 -0
  129. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.js +1 -0
  130. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.d.ts +10 -0
  131. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.js +1 -0
  132. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.d.ts +98 -0
  133. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.js +1 -0
  134. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.d.ts +13 -0
  135. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.js +1 -0
  136. package/dist/application-spec/parse-application-files/spec/components/bindings/index.d.ts +2 -0
  137. package/dist/application-spec/parse-application-files/spec/components/bindings/index.js +1 -1
  138. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.d.ts +24 -0
  139. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.js +1 -0
  140. package/dist/application-spec/parse-application-files/spec/components/component-state-type.d.ts +8 -0
  141. package/dist/application-spec/parse-application-files/spec/components/component-state-type.js +1 -0
  142. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.d.ts +13 -0
  143. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.js +1 -0
  144. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.d.ts +14 -0
  145. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.js +1 -0
  146. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.d.ts +6 -0
  147. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.js +1 -1
  148. package/dist/application-spec/parse-application-files/spec/components/user-components.d.ts +7 -4
  149. package/dist/application-spec/parse-application-files/spec/components/user-components.js +1 -1
  150. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.d.ts +24 -0
  151. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.js +1 -0
  152. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.d.ts +13 -0
  153. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.js +1 -0
  154. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.d.ts +9 -0
  155. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.js +1 -0
  156. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +6 -2
  157. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  158. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.d.ts +3 -1
  159. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  160. package/dist/application-spec/parse-application-files/spec/invariants/invariants.d.ts +2 -2
  161. package/dist/application-spec/parse-application-files/spec/invariants/invariants.js +1 -1
  162. package/dist/application-spec/parse-application-files/spec/model/index.d.ts +1 -0
  163. package/dist/application-spec/parse-application-files/spec/model/index.js +1 -1
  164. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.d.ts +10 -0
  165. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.js +1 -0
  166. package/dist/client/phoenix-api.d.ts +367 -0
  167. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +7 -1
  168. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  169. package/dist/configurator/application-runtime/extensions/systems/graphql-system/close-unclosed-braces.d.ts +12 -0
  170. package/dist/configurator/application-runtime/extensions/systems/graphql-system/close-unclosed-braces.js +1 -0
  171. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +1 -1
  172. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  173. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.d.ts +12 -0
  174. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.js +1 -0
  175. package/dist/configurator/configuration-not-found-page/index.d.ts +1 -0
  176. package/dist/configurator/configuration-not-found-page/index.js +1 -0
  177. package/dist/configurator/pages/ConfiguratorNotFoundPage.js +1 -1
  178. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +3 -2
  179. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  180. package/dist/configurator/pages/RootPage.js +1 -1
  181. package/dist/configurator/pages/default-configurator-elements.d.ts +3 -1
  182. package/dist/configurator/pages/default-configurator-elements.js +1 -1
  183. package/dist/configurator/pages/default-elements/built-in-entity-element.d.ts +10 -0
  184. package/dist/configurator/pages/default-elements/built-in-entity-element.js +1 -0
  185. package/dist/configurator/pages/default-elements/built-in-layout-element.d.ts +10 -0
  186. package/dist/configurator/pages/default-elements/built-in-layout-element.js +1 -0
  187. package/dist/configurator/pages/default-elements/domain-control-elements.d.ts +6 -0
  188. package/dist/configurator/pages/default-elements/domain-control-elements.js +1 -0
  189. package/dist/configurator/pages/default-elements/index.d.ts +4 -0
  190. package/dist/configurator/pages/default-elements/index.js +1 -0
  191. package/dist/configurator/pages/default-elements/recipe-panel-elements.d.ts +3 -0
  192. package/dist/configurator/pages/default-elements/recipe-panel-elements.js +1 -0
  193. package/dist/configurator/pages/default-elements/sidebar-footer-elements.d.ts +7 -0
  194. package/dist/configurator/pages/default-elements/sidebar-footer-elements.js +1 -0
  195. package/dist/configurator/pages/default-elements/toolbar-elements.d.ts +7 -0
  196. package/dist/configurator/pages/default-elements/toolbar-elements.js +1 -0
  197. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -2
  198. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  199. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -1
  200. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  201. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +1 -1
  202. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -1
  203. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +1 -1
  204. package/dist/configurator/ui/assistant/entity-link/index.d.ts +0 -1
  205. package/dist/configurator/ui/assistant/entity-link/index.js +1 -1
  206. package/dist/configurator/ui/assistant/form/AssistantForm.d.ts +19 -0
  207. package/dist/configurator/ui/assistant/form/AssistantForm.js +1 -0
  208. package/dist/configurator/ui/assistant/form/built-in-form-registry.d.ts +10 -0
  209. package/dist/configurator/ui/assistant/form/built-in-form-registry.js +1 -0
  210. package/dist/configurator/ui/assistant/form/compose-answer.d.ts +11 -0
  211. package/dist/configurator/ui/assistant/form/compose-answer.js +1 -0
  212. package/dist/configurator/ui/assistant/form/describe-build-errors.d.ts +6 -0
  213. package/dist/configurator/ui/assistant/form/describe-build-errors.js +1 -0
  214. package/dist/configurator/ui/assistant/form/form-element-definition.d.ts +14 -0
  215. package/dist/configurator/ui/assistant/form/form-element-definition.js +1 -0
  216. package/dist/configurator/ui/assistant/form/form-model.d.ts +38 -0
  217. package/dist/configurator/ui/assistant/form/form-model.js +1 -0
  218. package/dist/configurator/ui/assistant/form/form-registry.d.ts +31 -0
  219. package/dist/configurator/ui/assistant/form/form-registry.js +8 -0
  220. package/dist/configurator/ui/assistant/form/form-state.d.ts +4 -0
  221. package/dist/configurator/ui/assistant/form/form-state.js +1 -0
  222. package/dist/configurator/ui/assistant/form/index.d.ts +2 -0
  223. package/dist/configurator/ui/assistant/form/index.js +1 -0
  224. package/dist/configurator/ui/assistant/form/parse-form-block.d.ts +9 -0
  225. package/dist/configurator/ui/assistant/form/parse-form-block.js +1 -0
  226. package/dist/configurator/ui/assistant/form/read-form-attributes.d.ts +13 -0
  227. package/dist/configurator/ui/assistant/form/read-form-attributes.js +1 -0
  228. package/dist/configurator/ui/assistant/form-elements/FormGroup.d.ts +3 -0
  229. package/dist/configurator/ui/assistant/form-elements/FormGroup.js +1 -0
  230. package/dist/configurator/ui/assistant/form-elements/FormOptions.d.ts +3 -0
  231. package/dist/configurator/ui/assistant/form-elements/FormOptions.js +1 -0
  232. package/dist/configurator/ui/assistant/form-elements/FormReply.d.ts +3 -0
  233. package/dist/configurator/ui/assistant/form-elements/FormReply.js +1 -0
  234. package/dist/configurator/ui/assistant/form-elements/FormText.d.ts +3 -0
  235. package/dist/configurator/ui/assistant/form-elements/FormText.js +1 -0
  236. package/dist/configurator/ui/assistant/form-elements/form-element-props.d.ts +34 -0
  237. package/dist/configurator/ui/assistant/form-elements/form-element-props.js +1 -0
  238. package/dist/configurator/ui/assistant/form-elements/index.d.ts +5 -0
  239. package/dist/configurator/ui/assistant/form-elements/index.js +1 -0
  240. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.d.ts +16 -0
  241. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.js +1 -0
  242. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.d.ts +34 -0
  243. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.js +1 -0
  244. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.d.ts +25 -0
  245. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.js +1 -0
  246. package/dist/configurator/ui/assistant/reference-link/index.d.ts +3 -0
  247. package/dist/configurator/ui/assistant/reference-link/index.js +1 -0
  248. package/dist/configurator/ui/assistant/reference-link/reference-styles.d.ts +12 -0
  249. package/dist/configurator/ui/assistant/reference-link/reference-styles.js +1 -0
  250. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.d.ts +8 -0
  251. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.js +1 -0
  252. package/dist/configurator/ui/assistant/resource-image/AssistantImage.d.ts +9 -0
  253. package/dist/configurator/ui/assistant/resource-image/AssistantImage.js +1 -0
  254. package/dist/configurator/ui/assistant/resource-image/index.d.ts +3 -0
  255. package/dist/configurator/ui/assistant/resource-image/index.js +1 -0
  256. package/dist/configurator/ui/assistant/resource-image/resource-path.d.ts +11 -0
  257. package/dist/configurator/ui/assistant/resource-image/resource-path.js +1 -0
  258. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.d.ts +5 -0
  259. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.js +1 -0
  260. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +2 -0
  261. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -2
  262. package/dist/configurator/ui/assistant/thread-items.d.ts +8 -1
  263. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  264. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -1
  265. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  266. package/dist/configurator/ui/configurator-layout/slots/services/Services.js +1 -1
  267. package/dist/configurator/ui/legacy/layout/common/SummaryReadLayout.js +1 -1
  268. package/dist/configurator/ui/legacy/layout/simple/SimpleOwnerLayout.js +1 -1
  269. package/dist/configurator/ui/legacy/layout/steps/StepsOwnerLayout.js +1 -1
  270. package/dist/configurator/ui/legacy/layout/tabs/TabsOwnerLayout.js +1 -1
  271. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.d.ts +1 -0
  272. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.js +1 -1
  273. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.d.ts +1 -0
  274. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.js +1 -1
  275. package/dist/configurator/ui/preset-layout/CategoryPresetUi.js +1 -1
  276. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.d.ts +10 -0
  277. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.js +1 -0
  278. package/dist/configurator/ui/save-message-snackbars/index.d.ts +1 -0
  279. package/dist/configurator/ui/save-message-snackbars/index.js +1 -0
  280. package/dist/docs/controls/select-child-entity/cardselect.mdx +1 -0
  281. package/dist/docs/fabs/basic.mdx +2 -2
  282. package/dist/docs/index.json +1 -1
  283. package/dist/docs/layouts/custom-layout.mdx +324 -15
  284. package/dist/docs/other-features/not-found-404.mdx +1 -1
  285. package/dist/docs/phoenix/clerk-sign-in.mdx +1 -1
  286. package/dist/docs/phoenix/components.mdx +6 -0
  287. package/dist/docs/phoenix/configurator-interface.mdx +35 -11
  288. package/dist/docs/phoenix/domain-model.mdx +2 -0
  289. package/dist/docs/phoenix/getting-started.mdx +5 -3
  290. package/dist/docs/phoenix/layout-slots.mdx +9 -9
  291. package/dist/docs/phoenix/localization.mdx +6 -2
  292. package/dist/docs/phoenix/migration-guide.mdx +12 -10
  293. package/dist/docs/phoenix/phoenix-cli.mdx +31 -16
  294. package/dist/docs/phoenix/project-structure.mdx +52 -30
  295. package/dist/docs/phoenix/quickstart.mdx +7 -7
  296. package/dist/docs/phoenix/sdk-builder-workflow.mdx +6 -6
  297. package/dist/docs/phoenix/testing.mdx +8 -0
  298. package/dist/domain/application/assistant/assistant-form-elements.d.ts +28 -0
  299. package/dist/domain/application/assistant/assistant-form-elements.js +1 -0
  300. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  301. package/dist/domain/application/assistant/index.d.ts +2 -0
  302. package/dist/domain/application/assistant/index.js +1 -1
  303. package/dist/domain/application/assistant-recipe-groups.d.ts +3 -1
  304. package/dist/domain/core/schema/extended-schema-validator.js +1 -1
  305. package/dist/domain/domain-runtime/spec/module-checks/element-registration.d.ts +12 -11
  306. package/dist/domain/domain-runtime/spec/module-checks/element-registration.js +1 -1
  307. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +1 -1
  308. package/dist/domain/domain-runtime/spec/module-checks/index.js +1 -1
  309. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  310. package/dist/domain/system-components/child-entity-selection.js +1 -1
  311. package/dist/domain/system-components/common/scene-entity-control-schema.d.ts +3 -0
  312. package/dist/domain/system-components/common/scene-entity-control-schema.js +1 -1
  313. package/dist/editor/mocks/CreateMockYaml.js +2 -2
  314. package/dist/i18n/locales/cs/messages.js +1 -1
  315. package/dist/i18n/locales/da/messages.js +1 -1
  316. package/dist/i18n/locales/de/messages.js +1 -1
  317. package/dist/i18n/locales/de-AT/messages.js +1 -1
  318. package/dist/i18n/locales/en/messages.js +1 -1
  319. package/dist/i18n/locales/en-AU/messages.js +1 -1
  320. package/dist/i18n/locales/en-GB/messages.js +1 -1
  321. package/dist/i18n/locales/es/messages.js +1 -1
  322. package/dist/i18n/locales/fr/messages.js +1 -1
  323. package/dist/i18n/locales/hu/messages.js +1 -1
  324. package/dist/i18n/locales/it/messages.js +1 -1
  325. package/dist/i18n/locales/nl/messages.js +1 -1
  326. package/dist/i18n/locales/pl/messages.js +1 -1
  327. package/dist/i18n/locales/pt/messages.js +1 -1
  328. package/dist/i18n/locales/ro/messages.js +1 -1
  329. package/dist/i18n/locales/sk/messages.js +1 -1
  330. package/dist/i18n/locales/tr/messages.js +1 -1
  331. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  332. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  333. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +79 -80
  334. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +10 -11
  335. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +9 -10
  336. package/dist/phoenix/application-spec/application-spec-builder.d.ts +0 -2
  337. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  338. package/dist/phoenix/application-spec/generate-application-spec-project.d.ts +0 -2
  339. package/dist/phoenix/application-spec/generate-application-spec-project.js +2 -2
  340. package/dist/phoenix/application-spec/generate-application-spec-story.js +2 -2
  341. package/dist/phoenix/application-spec/generate-project-files.d.ts +0 -2
  342. package/dist/phoenix/application-spec/project-files.js +1 -1
  343. package/dist/phoenix/bin.d.ts +2 -0
  344. package/dist/phoenix/bin.js +2 -0
  345. package/dist/phoenix/check-configs/built-in-eslint-config.d.ts +9 -0
  346. package/dist/phoenix/check-configs/built-in-eslint-config.js +1 -0
  347. package/dist/phoenix/check-configs/eslint-config.d.ts +10 -0
  348. package/dist/phoenix/check-configs/eslint-config.js +1 -0
  349. package/dist/phoenix/check-configs/index.d.ts +8 -0
  350. package/dist/phoenix/check-configs/index.js +1 -0
  351. package/dist/phoenix/check-configs/typescript-project.d.ts +5 -0
  352. package/dist/phoenix/check-configs/typescript-project.js +1 -0
  353. package/dist/phoenix/cli.d.ts +0 -1
  354. package/dist/phoenix/cli.js +1 -2
  355. package/dist/phoenix/commands/build.js +1 -1
  356. package/dist/phoenix/commands/check.js +1 -1
  357. package/dist/phoenix/commands/clean.js +1 -1
  358. package/dist/phoenix/commands/deploy.js +2 -2
  359. package/dist/phoenix/commands/deps/deps.d.ts +22 -1
  360. package/dist/phoenix/commands/deps/deps.js +2 -2
  361. package/dist/phoenix/commands/deps/index.d.ts +1 -1
  362. package/dist/phoenix/commands/deps/index.js +1 -1
  363. package/dist/phoenix/commands/deps/sdk-manifest.js +1 -1
  364. package/dist/phoenix/commands/dev.js +4 -4
  365. package/dist/phoenix/commands/fix.js +1 -1
  366. package/dist/phoenix/commands/init.d.ts +17 -5
  367. package/dist/phoenix/commands/init.js +1 -1
  368. package/dist/phoenix/commands/link.js +1 -1
  369. package/dist/phoenix/commands/prettier.js +1 -1
  370. package/dist/phoenix/commands/sync.js +1 -1
  371. package/dist/phoenix/commands/unlink.js +1 -1
  372. package/dist/phoenix/services/application-spec-project-watcher.d.ts +0 -2
  373. package/dist/phoenix/services/application-spec-project-watcher.js +2 -2
  374. package/dist/phoenix/services/lingui.d.ts +8 -0
  375. package/dist/phoenix/services/lingui.js +1 -1
  376. package/dist/phoenix/services/swc.js +1 -1
  377. package/dist/phoenix/services/vite-config.js +1 -1
  378. package/dist/phoenix/utils/index.d.ts +3 -2
  379. package/dist/phoenix/utils/index.js +1 -1
  380. package/dist/phoenix/utils/node-version/index.d.ts +1 -0
  381. package/dist/phoenix/utils/node-version/index.js +1 -0
  382. package/dist/phoenix/utils/node-version/supported-node-version.d.ts +12 -0
  383. package/dist/phoenix/utils/node-version/supported-node-version.js +4 -0
  384. package/dist/phoenix/utils/package-info.d.ts +0 -9
  385. package/dist/phoenix/utils/package-info.js +1 -1
  386. package/dist/phoenix/utils/package-manager/index.d.ts +2 -0
  387. package/dist/phoenix/utils/package-manager/index.js +1 -0
  388. package/dist/phoenix/utils/package-manager/package-manager-commands.d.ts +19 -0
  389. package/dist/phoenix/utils/package-manager/package-manager-commands.js +1 -0
  390. package/dist/phoenix/utils/package-manager/pnpm-project.d.ts +9 -0
  391. package/dist/phoenix/utils/package-manager/pnpm-project.js +1 -0
  392. package/dist/phoenix/utils/run-command.d.ts +11 -0
  393. package/dist/phoenix/utils/run-command.js +1 -1
  394. package/dist/phoenix/utils/sdk-tool/index.d.ts +1 -0
  395. package/dist/phoenix/utils/sdk-tool/index.js +1 -0
  396. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.d.ts +15 -0
  397. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.js +1 -0
  398. package/dist/react-sdk/domain-application-context/DomainLifecycleBoundary.js +1 -1
  399. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +15 -4
  400. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -1
  401. package/dist/ui-sdk/theme/types.d.ts +1 -1
  402. package/package.json +16 -9
  403. package/schema/domain-spec.json +86 -8
  404. package/dist/application-spec/generate-application/code/templates/nvmrc.d.ts +0 -1
  405. package/dist/application-spec/generate-application/code/templates/nvmrc.js +0 -2
  406. package/dist/application-spec/generate-application/code/templates/package-json.d.ts +0 -10
  407. package/dist/application-spec/generate-application/code/templates/package-json.js +0 -1
  408. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +0 -5
  409. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +0 -1
  410. package/dist/phoenix/commands/generate-project-files.d.ts +0 -6
  411. package/dist/phoenix/commands/generate-project-files.js +0 -1
@@ -222,7 +222,7 @@ const controlViolations = phx.frontend.useControlViolations([])
222
222
  // Finalize violations
223
223
  const { disabled, hints } = phx.frontend.useFinalizeViolations()
224
224
 
225
- // Messages for the user: violations of a rejected change, side-effect hints and errors, one call each
225
+ // Messages for the user: violations of a rejected change, side-effect hints, errors and failed saves, one call each
226
226
  phx.frontend.useConfiguratorMessages(message => showToast(message.text))
227
227
 
228
228
  // Map violations to hints
@@ -397,6 +397,30 @@ const PresetAction = phx.frontend.createPresetPageAction(PresetHelpAction)
397
397
  const PresetOverlay = phx.frontend.createPresetDeviceNotSupported(SmallScreenNotice)
398
398
  ```
399
399
 
400
+ ### Configuration Not Found Page
401
+
402
+ A layout element registered under the name `ConfigurationNotFoundPage` replaces the page the configurator shows when it cannot open a configuration. Without it, Phoenix renders its built-in "Configuration not accessible" page, which is the default `ConfigurationNotFoundPage` registration in `defaultConfiguratorElements`.
403
+
404
+ ```typescript
405
+ // src/elements/ConfigurationNotFoundPage.tsx
406
+ import type { PropsWithChildren } from 'react'
407
+ import type { ConfigurationNotFoundPageProps } from '@salsita-ai/sdk/react'
408
+
409
+ export default phx.frontend.createCustomPhoenixLayoutElement(
410
+ 'ConfigurationNotFoundPage',
411
+ (props: PropsWithChildren<ConfigurationNotFoundPageProps>) => (
412
+ <main>
413
+ <h1>We could not find this configuration</h1>
414
+ {props.onBack && <button onClick={props.onBack}>Start a new one</button>}
415
+ </main>
416
+ )
417
+ )
418
+ ```
419
+
420
+ - The page receives one optional prop, `onBack`, which returns to the start of the configurator. It is set when a configuration fails to load or is opened without a valid access key. It is not set on the start page itself, so a page that offers a way back shows it only when `onBack` is set.
421
+ - The configurator renders the element in four cases: a configuration fails to load, for example because its ID does not exist or the server rejects its access key; a configuration is opened without an access key for it; a signed-in user whose role may not create configurations (`acl.canCreate`) opens the start page; the preset screen has no preset category to show, for example because the host's `presetTags` match no preset. The last case happens inside the built-in preset screen, so a project that replaces it with `createPresetUi` decides what to show itself.
422
+ - Two pages still show the built-in page directly, not the element: the default of the not-authenticated page, shown to an anonymous visitor who may not create a configuration (replace it with `createNotAuthenticatedPage`), and the admin's not-authorized page.
423
+
400
424
  ### Loaded Configuration UI
401
425
 
402
426
  A layout element registered under the name `ConfiguratorLayout` replaces the whole UI of a loaded configuration, in owner and in read mode, whatever `layout` the spec sets. Without it, Phoenix renders the layout the spec selects. [Custom Layout](?path=/docs/layouts-custom-layout--docs) is a worked example: a fully custom product page with its panel on the left, built from the scene, the safe-area hook and state hooks.
@@ -433,10 +457,10 @@ export default phx.frontend.createCustomPhoenixLayoutElement('ConfiguratorLayout
433
457
  - `LayoutSlots.DesktopSidebar` is the built-in desktop sidebar as one piece: the spec's tabs, back button, property pages and sidebar footer with their spacing, scrolling and empty states, and the assistant panel. Use it when the spec's property pages are what the customer should see and only their place changes, for example a sidebar on the left; build the controls yourself when they have to look like the brand's own. Without `width` it fills its container, so the layout positions and sizes that container; `miniSidebar` does not shrink it, so a layout that honours it reads `LayoutSlots.useSidebarContent().hasMiniSidebar` and lets the container take the sidebar's height. Its tabs sit outside it on the left; `side="start"` puts them on its right, for a sidebar on the left. In fullscreen it stays in place, transparent and inert, so a layout that wants the space back removes it while `phx.frontend.useIsFullscreenActive()` is set. See [Sidebar in a Custom Layout](?path=/docs/layouts-sidebar-in-a-custom-layout--docs).
434
458
  - Nothing of the built-in layouts is rendered for it. A project layout finalizes over the spec's `finalizeAction` components, see the finalize paragraph of [Hooks for a Project Layout](#hooks-for-a-project-layout). The `finalizePage` and `finalizeButton` components are legacy: they cannot be declared in YAML, only in TypeScript, and `Legacy.CommonFinalizePage`, which is deprecated, shows a `finalizePage` for projects that still have one. `LayoutDialog` renders only what the project registers with `createLayoutDialog` and is not part of the finalize flow. The preview start screen is `DesktopPreview` or `MobilePreview`, which the layout shows while `usePreview().isPreview` is set. Both previews frame the scene themselves, so the layout renders the component that calls `useSceneSafeArea()` only while `isPreview` is not set; it then measures when it mounts after the preview. The assistant panel is available to a project layout only inside `LayoutSlots.DesktopSidebar`.
435
459
  - The layout reads the state it has to react to from hooks, listed with what each returns in [Hooks for a Project Layout](#hooks-for-a-project-layout).
436
- - Messages for the user come one of two ways. `LayoutSlots.Services` shows violations of a rejected change, side-effect hints and errors as the built-in snackbars, which render into `LayoutSlots.DesktopSnackbarsRoot` or `LayoutSlots.MobileSnackbarsRoot` wherever the layout mounts it. `phx.frontend.useConfiguratorMessages(onMessage)` hands the same messages to the layout's own UI instead, with their text resolved, as the toast in [Custom Layout](?path=/docs/layouts-custom-layout--docs#show-messages) does; mount one of the two, not both, or every message is shown twice. Some messages stay snackbars either way: a failure to save the configuration and an error of the built-in finalize and other actions. They render into the snackbar root, so a layout that mounts none shows them outside the configurator, in the page's `body`. An error while a preset is applied appears on the preset screen, outside the layout. A finalize action the layout runs with `phx.frontend.useFinalizeAction` reports its error as that hook's `error` instead, neither as a message nor as a snackbar.
460
+ - Messages for the user come one of two ways. `LayoutSlots.Services` shows violations of a rejected change, side-effect hints, errors and failed saves as the built-in snackbars, which render into `LayoutSlots.DesktopSnackbarsRoot` or `LayoutSlots.MobileSnackbarsRoot` wherever the layout mounts it. `phx.frontend.useConfiguratorMessages(onMessage)` hands the same messages to the layout's own UI instead, with their text resolved, as the toast in [Custom Layout](?path=/docs/layouts-custom-layout--docs#show-messages) does; mount one of the two, not both, or every message is shown twice. A failure to save the configuration, and the first successful save after it, are messages too, so a layout that mounts neither shows no sign of a failed save. An error of the built-in finalize and other actions stays a snackbar either way. It renders into the snackbar root, so a layout that mounts none shows it outside the configurator, in the page's `body`. A failure to start a configuration from a preset is not a message of the hook either: it happens on the preset screen, before any `ConfiguratorLayout` mounts. In production with more than one preset it is a snackbar there, also on a preset screen replaced with `createPresetUi` (see [Preset UI](#preset-ui)), which reads the error from `phx.frontend.usePresetSelection().selectionError` and mounts `PresetSnackbarsRoot` to keep the snackbar inside the configurator. A finalize action the layout runs with `phx.frontend.useFinalizeAction` reports its error as that hook's `error` instead, neither as a message nor as a snackbar.
437
461
  - Any project layout element named `ConfiguratorLayout` takes over the page.
438
462
 
439
- `defaultConfiguratorElements`, exported from `@salsita-ai/sdk/configurator`, holds the built-in UI as a `ConfiguratorLayout` registration that renders the layout the spec selects. Generated code registers these defaults with `withDefaultElements`, apart from the project's elements, so the built-in UI is a registration like any other; a project element registered under the same name wins over a default.
463
+ `defaultConfiguratorElements`, exported from `@salsita-ai/sdk/configurator`, holds the built-in UI as a `ConfiguratorLayout` registration that renders the layout the spec selects, and the built-in not-found page as a `ConfigurationNotFoundPage` registration. Generated code registers these defaults with `withDefaultElements`, apart from the project's elements, so the built-in UI is a registration like any other; a project element registered under the same name wins over a default. The list also holds the configurator's built-in controls and layout elements under the kinds the spec names them by, such as `attributeSelect` or `undoToolbarButton`, so a project element registered under one of those names replaces the built-in one wherever the spec names that kind. A config assembled by hand, without generated code, calls `withDefaultElements(defaultConfiguratorElements)` too; the lists are the only way the built-in elements are registered, so without it the page shows a "not found" box instead of the configurator, and a project layout shows one in place of every built-in control. The admin mounts a full configurator, so its list, `defaultAdminElements` from `@salsita-ai/sdk/admin`, holds the configurator's defaults followed by the admin's built-in pages, sidebars and actions; generated admin code passes it to `withDefaultElements` in place of `defaultConfiguratorElements`, because each call replaces the defaults passed before.
440
464
 
441
465
  #### Hooks for a Project Layout
442
466
 
@@ -481,14 +505,14 @@ Texts from the spec, such as option titles and the `detail` fields, are `Localiz
481
505
 
482
506
  **Violations**
483
507
 
484
- | Hook | Returns |
485
- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
486
- | `phx.frontend.useStateValidity()` | The validity of the last committed state: `{ valid: true, severity: null }`, or `{ valid: true, severity: 'notice' \| 'warning', entityViolations }`. A change that leaves a `fixable` or `fatal` violation is rejected and never committed, and neither is a change during which an error was thrown, so neither is seen here. |
487
- | `phx.frontend.useFinalizeViolations()` | `{ disabled, hints, violations }`. `disabled` is `true` while a `warning`, `fixable` or `fatal` violation holds or the configuration failed to save; `hints` is the violations' text, or `undefined`. |
488
- | `phx.frontend.useConfiguratorMessages(onMessage)` | Nothing. It calls `onMessage(message)` once per message: `{ kind: 'violation', entityId, violation, text }` for each violation of the rejected state, including notices and warnings already present, so `violation.severity` tells the reason for the rejection (`fixable` or `fatal`) from them, `{ kind: 'sideEffect', text }` for each hint of a committed update, and `{ kind: 'error', error, text }` when an error is thrown while a change is validated, with `text` the generic "Oops, something went wrong". `text` is resolved to the current language; a violation's is its `message`, or its `type` without one, and the built-in snackbar prefixes it with `entityId`. Hints committed before the layout mounted are not delivered; when the most recent change was rejected or threw, its messages are delivered again when the hook mounts. `onMessage` may be a new function on every render. On `phx.frontend` the message is typed by the project, so `violation.type` narrows to its violation types; from `@salsita-ai/sdk/react` the type is `ConfiguratorMessage`. |
489
- | `phx.frontend.useFinalizeAction(handler)` | `{ run, isPending, error, disabled, hints }` for the `finalizeAction` whose `handler` it is given; see the Finalize paragraph below for how to call it. `run()` records the finalize-button click for analytics and runs the project's handler, and does nothing while `disabled` or `isPending`; `error` is what the handler's last run rejected with, or `null`; `disabled` and `hints` are those of `useFinalizeViolations()`. The type of the result is `UseFinalizeActionResult` from `@salsita-ai/sdk/configurator`, which also exports the hook. |
508
+ | Hook | Returns |
509
+ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
510
+ | `phx.frontend.useStateValidity()` | The validity of the last committed state: `{ valid: true, severity: null }`, or `{ valid: true, severity: 'notice' \| 'warning', entityViolations }`. A change that leaves a `fixable` or `fatal` violation is rejected and never committed, and neither is a change during which an error was thrown, so neither is seen here. |
511
+ | `phx.frontend.useFinalizeViolations()` | `{ disabled, hints, violations }`. `disabled` is `true` while a `warning`, `fixable` or `fatal` violation holds or the configuration failed to save; `hints` is the violations' text, or `undefined`. |
512
+ | `phx.frontend.useConfiguratorMessages(onMessage)` | Nothing. It calls `onMessage(message)` once per message: `{ kind: 'violation', entityId, violation, text }` for each violation of the rejected state, including notices and warnings already present, so `violation.severity` tells the reason for the rejection (`fixable` or `fatal`) from them, `{ kind: 'sideEffect', text }` for each hint of a committed update, `{ kind: 'error', error, text }` when an error is thrown while a change is validated, with `text` the generic "Oops, something went wrong", `{ kind: 'saveError', error, text }` each time saving the configuration fails, with `error` what the save rejected with and `text` a generic message, and `{ kind: 'saveRecovery', text }` when a save succeeds after a failed one, with `text` "Configuration updated". `text` is resolved to the current language; a violation's is its `message`, or its `type` without one, and the built-in snackbar prefixes it with `entityId`. Hints committed before the layout mounted are not delivered, nor is a save that failed before it mounted; when the most recent change was rejected or threw, its messages are delivered again when the hook mounts. `onMessage` may be a new function on every render. On `phx.frontend` the message is typed by the project, so `violation.type` narrows to its violation types; from `@salsita-ai/sdk/react` the type is `ConfiguratorMessage`. |
513
+ | `phx.frontend.useFinalizeAction(handler)` | `{ run, isPending, error, disabled, hints }` for the `finalizeAction` whose `handler` it is given; see the Finalize paragraph below for how to call it. `run()` records the finalize-button click for analytics and runs the project's handler, and does nothing while `disabled` or `isPending`; `error` is what the handler's last run rejected with, or `null`; `disabled` and `hints` are those of `useFinalizeViolations()`. The type of the result is `UseFinalizeActionResult` from `@salsita-ai/sdk/configurator`, which also exports the hook. |
490
514
 
491
- `LayoutSlots.Services` shows the messages of `useConfiguratorMessages` as snackbars; see the messages paragraph of [Loaded Configuration UI](#loaded-configuration-ui) for choosing between the two and for the messages that stay snackbars.
515
+ `LayoutSlots.Services` shows every message of `useConfiguratorMessages` as a snackbar, `saveError` and `saveRecovery` included; see the messages paragraph of [Loaded Configuration UI](#loaded-configuration-ui) for choosing between the two and for the messages that stay snackbars.
492
516
 
493
517
  **Finalize**
494
518
 
@@ -624,7 +648,7 @@ const NotAuthorizedAdminPage = phx.frontend.admin.createNotAuthorizedAdminPage((
624
648
  ```
625
649
 
626
650
  When no authentication-error page is registered, Phoenix falls back to the registered not-authorized page and then
627
- to the default configuration-not-found page.
651
+ to the built-in configuration-not-found page. The admin shows the built-in page even when the project registers a `ConfigurationNotFoundPage`, see [Configuration Not Found Page](#configuration-not-found-page).
628
652
 
629
653
  ## What We Learned
630
654
 
@@ -329,6 +329,8 @@ components:
329
329
 
330
330
  The code generator will automatically create an expression with the same name and infer the return type based on usage context.
331
331
 
332
+ The type of an expression must share values with the type every component expects where it is read, and with its declared type. An expression declared as a number and read into a `title`, or one read both into a `title` and into `offsetX`, has no value its implementation could return, so the build reports `EXPRESSION_READ_TYPE_CONFLICT` at the expression and names each place it is read. A type given only as `tsType` is not checked here.
333
+
332
334
  ## Constants
333
335
 
334
336
  Constants are pre-generated expressions that return fixed values. Under the hood, they are implemented as expressions but are automatically generated by the Phoenix system, so you don't need to write TypeScript implementation code for them.
@@ -22,10 +22,10 @@ The frontend SDK provides the core libraries and components for building configu
22
22
 
23
23
  The Phoenix CLI (`phoenix` command) is the unified tool for all configurator development. It combines domain code generation, webhook building, deployment management, and development workflows into a single interface:
24
24
 
25
- - `phoenix init` - Start a new project with a working starter spec
25
+ - `phoenix init` - Start a new project: a working starter spec and a `package.json` with the SDK, the packages it requires next to it, ESLint and Prettier
26
26
  - `phoenix dev` - Start the development server with hot reload
27
27
  - `phoenix build` - Build the configurator for production
28
- - `phoenix sync` - Synchronize dependencies and generated code
28
+ - `phoenix sync` - Regenerate the generated code and project files
29
29
  - `phoenix deps` - Add the SDK's missing peer dependencies to `package.json` and move out-of-range ones into range
30
30
  - `phoenix check` - Validate domain configuration and code
31
31
  - `phoenix fix` - Auto-fix common issues in domain files
@@ -58,12 +58,14 @@ This section provides practical guidance for developers who are new to Phoenix P
58
58
 
59
59
  Before diving into Phoenix Platform development, ensure you have:
60
60
 
61
- - **Node.js** and **pnpm** - Required versions are set automatically in the project
61
+ - **Node.js 22.13 or newer** and **a package manager** - The SDK and the Phoenix CLI run on Node.js 22.13 or newer (see [Starting a New Project](?path=/docs/phoenix-phoenix-cli--docs#starting-a-new-project)). A project installs with any package manager; with pnpm 11 it needs the settings in [Package manager](?path=/docs/phoenix-project-structure--docs#package-manager)
62
62
  - **JavaScript/TypeScript** - Phoenix generates TypeScript code and uses modern JavaScript patterns
63
63
  - **React** - The platform builds on React components, hooks, and modern React patterns
64
64
  - **Three.js** - Basic knowledge of 3D graphics, scenes, cameras, and rendering concepts
65
65
  - **React Three Fiber** - Understanding of declarative 3D development and R3F component patterns
66
66
 
67
+ The commands in this documentation use pnpm, as in `pnpm phoenix sync`. They work the same through any other package manager: `npx phoenix sync` with npm, `yarn phoenix sync` with Yarn, `bunx phoenix sync` with Bun.
68
+
67
69
  We assume you have working knowledge of these technologies before starting with Phoenix Platform. If you're new to any of these areas, we recommend familiarizing yourself with them first, as Phoenix Platform builds directly on these foundations.
68
70
 
69
71
  ### Your First Steps
@@ -31,18 +31,18 @@ export const Toolbar = () => (
31
31
 
32
32
  ## Canvas and services
33
33
 
34
- | Member | Shows | Fed by | With nothing configured | Read mode |
35
- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------------- | --------- |
36
- | `SharedCanvas` | The 3D scene, in a container that is `position: absolute; inset: 0` with the scene's background colour. The scene is hidden for a moment while the preview expands or collapses. | The scene of the spec, through `Canvas` | Always renders | No change |
37
- | `Canvas` | The WebGL canvas alone, or `GPUIssuePage` when the browser has no WebGL or no GPU acceleration. It reports the scene-assets loading phase the app loader waits for. | The scene, the canvas settings and the `CanvasLoader` element | Always renders | No change |
38
- | `Services` | Nothing visible: it mounts `InvariantViolations` and `SideEffects`, which show the messages of `useConfiguratorMessages()` as snackbars | The configurator's state | Always mounted | No change |
39
- | `InvariantViolations` | When a change is rejected, a snackbar for each violation of the rejected state, including notices and warnings already present, as `<entity id>: <message>` (a `notice` as info, a `warning` as warning, `fixable` and `fatal` as error), and "Oops, something went wrong" for an error thrown while the state was validated | The spec's invariants | Nothing | No change |
40
- | `SideEffects` | An info snackbar for each committed update that carries a hint | The hints of committed updates | Nothing | No change |
41
- | `DesktopSnackbarsRoot` | The element the snackbars are rendered into: a stack anchored to its bottom edge, at most 320 pixels wide | Every snackbar the configurator raises | An empty element | No change |
34
+ | Member | Shows | Fed by | With nothing configured | Read mode |
35
+ | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- |
36
+ | `SharedCanvas` | The 3D scene, in a container that is `position: absolute; inset: 0` with the scene's background colour. The scene is hidden for a moment while the preview expands or collapses. | The scene of the spec, through `Canvas` | Always renders | No change |
37
+ | `Canvas` | The WebGL canvas alone, or `GPUIssuePage` when the browser has no WebGL or no GPU acceleration. It reports the scene-assets loading phase the app loader waits for. | The scene, the canvas settings and the `CanvasLoader` element | Always renders | No change |
38
+ | `Services` | Nothing visible: it mounts `InvariantViolations` and `SideEffects`, which show the messages of `useConfiguratorMessages()` as snackbars, and shows a failed save of the configuration as a persistent error snackbar with **Dismiss**, followed by "Configuration updated" when a later save succeeds | The configurator's state | Always mounted | No change; the save-failure and "Configuration updated" snackbars are not shown, and one left from owner mode closes |
39
+ | `InvariantViolations` | When a change is rejected, a snackbar for each violation of the rejected state, including notices and warnings already present, as `<entity id>: <message>` (a `notice` as info, a `warning` as warning, `fixable` and `fatal` as error), and "Oops, something went wrong" for an error thrown while the state was validated | The spec's invariants | Nothing | No change |
40
+ | `SideEffects` | An info snackbar for each committed update that carries a hint | The hints of committed updates | Nothing | No change |
41
+ | `DesktopSnackbarsRoot` | The element the snackbars are rendered into: a stack anchored to its bottom edge, at most 320 pixels wide | Every snackbar the configurator raises | An empty element | No change |
42
42
 
43
43
  - Mount `SharedCanvas`, not `Canvas`: `Canvas` suspends while it probes the GPU on its first mount, and `SharedCanvas` holds the boundary that catches it. Without either, the app loader stays on screen unless the project sets `appLoader: legacy`.
44
44
  - `SharedCanvas` fills its nearest positioned ancestor and paints an opaque background, so the layout positions its own UI after it in the markup.
45
- - Snackbars are raised by `Services`, and also by the built-in finalize and footer actions when their handler fails and when saving the configuration fails. A layout that shows violations, side-effect hints and validation errors its own way calls `phx.frontend.useConfiguratorMessages(onMessage)` instead of mounting `Services`, see [Configurator Interface → Hooks for a Project Layout](?path=/docs/phoenix-configurator-interface--docs#hooks-for-a-project-layout); the other snackbars still need a root. They render into the snackbar root the layout mounts; with no root mounted they render into the page's `document.body`, outside the configurator. The desktop root is a zero-height element the snackbars stack upwards from, so the layout places it where their bottom edge belongs. The phone root leaves them fixed to the viewport, see `MobileSnackbarsRoot`. A finalize action the layout runs with `phx.frontend.useFinalizeAction` raises no snackbar; its error is the hook's `error`.
45
+ - Snackbars are raised by `Services`, for violations, side-effect hints, validation errors and a failed save, and also by the built-in finalize and footer actions when their handler fails. A layout that shows these messages its own way calls `phx.frontend.useConfiguratorMessages(onMessage)` instead of mounting `Services`, and then shows the failed save too, see [Configurator Interface → Hooks for a Project Layout](?path=/docs/phoenix-configurator-interface--docs#hooks-for-a-project-layout); the other snackbars still need a root. They render into the snackbar root the layout mounts; with no root mounted they render into the page's `document.body`, outside the configurator. The desktop root is a zero-height element the snackbars stack upwards from, so the layout places it where their bottom edge belongs. The phone root leaves them fixed to the viewport, see `MobileSnackbarsRoot`. A finalize action the layout runs with `phx.frontend.useFinalizeAction` raises no snackbar; its error is the hook's `error`.
46
46
 
47
47
  ## Desktop sidebar
48
48
 
@@ -152,6 +152,8 @@ entities:
152
152
 
153
153
  This is the way to go when you're dealing with content that might evolve over time. The message ID stays the same, so your existing translations remain valid even when you tweak the wording. Plus, you can use dot notation to create nice, organized namespaces for your translations.
154
154
 
155
+ A `$msg` compiles to a message descriptor. When an expression that holds one also declares a schema, the schema has to accept a message descriptor, such as `$ref: 'phx:Localizable'` or `$ref: 'phx:MessageDescriptor'`; a `$msg` declared as `type: string` or `type: number` is reported as `EXPRESSION_VALUE_TYPE_MISMATCH`.
156
+
155
157
  You can use both approaches throughout your domain specifications. Here are some common patterns that work well:
156
158
 
157
159
  ```yaml
@@ -547,6 +549,8 @@ When you're ready to ship:
547
549
  phx build
548
550
  ```
549
551
 
552
+ With the application-spec pipeline, `phx dev` and `phx build` compile the Lingui macros in your frontend code with the SDK's own Lingui macro plugin and the configuration in `.phoenix/.linguirc`, so the project installs no Babel macro packages for them (see [Current and legacy project tooling](?path=/docs/phoenix-phoenix-cli--docs#current-and-legacy-project-tooling)).
553
+
550
554
  ### Translation Files
551
555
 
552
556
  The `.po` files in `src/locales/` are standard GNU gettext format that most translation tools support:
@@ -565,7 +569,7 @@ During development, missing translations fall back to the message ID. In product
565
569
 
566
570
  ### Locale Fallback Configuration
567
571
 
568
- Phoenix automatically configures comprehensive locale fallbacks in the generated `.linguirc` file. When a translation is missing for a specific regional locale, it gracefully falls back to the base language before falling back to the default language (English).
572
+ Phoenix automatically configures comprehensive locale fallbacks in the Lingui configuration it generates. When a translation is missing for a specific regional locale, it gracefully falls back to the base language before falling back to the default language (English).
569
573
 
570
574
  **Fallback Rules:**
571
575
 
@@ -595,7 +599,7 @@ User locale: de-AT (Austrian German)
595
599
  └─ Translation in en? → Use it (default fallback)
596
600
  ```
597
601
 
598
- The fallback configuration is generated by `phx sync` and stored in `.linguirc`. You don't need to configure this manually - it's handled automatically based on your `availableLocales` in `spec/application.yaml`.
602
+ The fallback configuration is generated by `phx sync` and stored in `.phoenix/.linguirc` (in the project root on the legacy pipeline; see [Current and legacy project tooling](?path=/docs/phoenix-phoenix-cli--docs#current-and-legacy-project-tooling)). You don't need to configure this manually - it's handled automatically based on your `availableLocales` in `spec/application.yaml`.
599
603
 
600
604
  ## What We Learned
601
605
 
@@ -264,6 +264,8 @@ With the application-spec pipeline (`phoenix.applicationFlow` in `package.json`;
264
264
 
265
265
  A root `tsconfig.json` from the old multi-folder template, or one written by hand, stays as it is and does not pick up the generated settings or the global `phx` types in `.phoenix/globals.d.ts`, so `pnpm ts:check` fails. Delete it, or replace its content with the line above, before the first sync.
266
266
 
267
+ With the application-spec pipeline (see [Current and legacy project tooling](?path=/docs/phoenix-phoenix-cli--docs#current-and-legacy-project-tooling)), `eslint.config.js` and `prettier.config.js` are the project's. Sync replaces a file earlier SDK versions generated, the one under the "Auto-generated file. Do not modify this file manually." header that re-exports `eslintrc` or `prettierrc`, with a file that re-exports the same configuration from `@salsita-ai/sdk/common/eslint` or `@salsita-ai/sdk/common/prettier`, and writes that file into a project that has none. A file of your own stays as it is, and editors, `phoenix check` and `phoenix fix` use it; make sure it imports only packages the project still depends on, or delete it before the first sync. Without the file, `phoenix check` and `phoenix fix` use the SDK's configuration. The legacy pipeline rewrites both files on every sync.
268
+
267
269
  ### 10. Create Mocks (Optional)
268
270
 
269
271
  If you have mock files, move them to `mocks/`:
@@ -290,7 +292,7 @@ This will:
290
292
 
291
293
  Other useful commands:
292
294
 
293
- - `pnpm phoenix sync` - Sync dependencies in package.json
295
+ - `pnpm phoenix sync` - Regenerate the generated code and project files
294
296
  - `pnpm phoenix gen` - Regenerate project files
295
297
  - `pnpm phoenix dev` - Start development server with hot reload
296
298
  - `pnpm phoenix deployment:prepare` - Prepare for deployment
@@ -438,19 +440,19 @@ Use this checklist to verify migration completeness:
438
440
  - [ ] Configurator renders correctly
439
441
  - [ ] Admin interface works
440
442
  - [ ] All imports updated to new paths
441
- - [ ] Node 24 and pnpm v10 installed
443
+ - [ ] Node 24 and a package manager installed
442
444
 
443
445
  ## Removed Files
444
446
 
445
447
  The following files are no longer needed - they are auto-generated by the CLI:
446
448
 
447
- | File | Replacement |
448
- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
449
- | `src/domain/domain.ts` | Auto-generated in `.phoenix/domain.ts` |
450
- | `src/frontend/frontend.tsx` | Auto-generated in `.phoenix/configurator.ts` |
451
- | `tsconfig.json` | Delete before the first sync; with the application-spec pipeline, sync writes a one-line file that extends `.phoenix/tsconfig.json` |
452
- | `eslint.config.js` | Auto-generated by CLI |
453
- | `prettier.config.js` | Auto-generated by CLI |
449
+ | File | Replacement |
450
+ | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
451
+ | `src/domain/domain.ts` | Auto-generated in `.phoenix/domain.ts` |
452
+ | `src/frontend/frontend.tsx` | Auto-generated in `.phoenix/configurator.ts` |
453
+ | `tsconfig.json` | Delete before the first sync; with the application-spec pipeline, sync writes a one-line file that extends `.phoenix/tsconfig.json` |
454
+ | `eslint.config.js` | With the application-spec pipeline, sync replaces the file earlier SDK versions generated with one that re-exports the SDK's ESLint configuration, or writes one when there is none; a file of your own stays (see [step 9](#9-remove-auto-generated-files)) |
455
+ | `prettier.config.js` | With the application-spec pipeline, sync replaces the file earlier SDK versions generated with one that re-exports the SDK's Prettier configuration, or writes one when there is none; a file of your own stays (see [step 9](#9-remove-auto-generated-files)) |
454
456
 
455
457
  ## Builder Options Moved to YAML
456
458
 
@@ -484,7 +486,7 @@ Update imports to use these globals instead of importing from packages directly.
484
486
  ## Environment Requirements
485
487
 
486
488
  - Node 24
487
- - pnpm v10
489
+ - A package manager; the commands in this guide use pnpm
488
490
  - `RESOURCES_URL` is an optional frontend environment variable; in local development it defaults to the Vite dev server at `http://localhost:5173`
489
491
 
490
492
  ## Next Steps
@@ -14,7 +14,9 @@ The Phoenix CLI (`phoenix` command) is the unified tool for all configurator dev
14
14
 
15
15
  ## Starting a New Project
16
16
 
17
- `phoenix init [folder]` starts a configurator project in `[folder]` (default: the working directory):
17
+ The SDK and its CLI run on Node.js 22.13 or newer, the range declared in `engines.node` of `@salsita-ai/sdk`. On an older Node.js, `phoenix` stops before it runs a command, names the running version and the required range, and exits with a non-zero code. The legacy binaries run no such check; package managers warn about the range when the SDK is installed.
18
+
19
+ `phoenix init [folder]` starts a configurator project in `[folder]` (default: the working directory). The project installs with any package manager. The commands on this page use pnpm; with npm, run `npm install` and `npx phoenix sync`, with Yarn `yarn phoenix sync`, with Bun `bunx phoenix sync`:
18
20
 
19
21
  ```bash
20
22
  npx -p @salsita-ai/sdk@canary phoenix init my-configurator
@@ -28,12 +30,17 @@ pnpm phoenix dev
28
30
  `phoenix init`:
29
31
 
30
32
  1. Refuses to run when a `spec/` folder already exists, so it never touches an existing project.
31
- 2. Writes a `package.json` that depends on the CLI's SDK version when the folder has none. An existing `package.json` is kept, as long as it depends on the SDK.
33
+ 2. Writes a `package.json` when the folder has none, and an existing one is kept, as long as it depends on the SDK. Either way, `package.json` gains the entries it lacks, and an entry it already has stays as it is:
34
+ - the CLI's SDK version, in a new `package.json`;
35
+ - every package the SDK requires as a peer, at the version [`phoenix deps`](#phoenix-deps) writes: the lowest of the SDK's range, with the `@types/*` packages in `devDependencies`. A peer the project declares in any dependency field counts, whatever its version. `@clerk/clerk-react` is not among them, because the starter spec does not set `useClerk`;
36
+ - `eslint` and `prettier` in `devDependencies`, at the versions the SDK runs itself, so an editor formats and lints with the same versions as `phoenix check`.
37
+
38
+ With these, the install gives the project everything `phoenix dev`, `build` and `check` need. `init` writes no `packageManager` field and no package-manager settings: a project that installs with pnpm 11 adds the settings in [Package manager](?path=/docs/phoenix-project-structure--docs#package-manager) itself.
39
+
32
40
  3. Adds the `dev`, `build`, `deploy`, `check` and `fix` scripts to `package.json` (see [Project Scripts](#project-scripts)). A script the project already has under one of those names keeps its command.
33
41
  4. Writes a starter spec (`spec/application.yaml`, `spec/configurator.yaml`) with one resizable, recolorable box, and switches `package.json` to the application-spec pipeline.
34
- 5. Writes `pnpm-workspace.yaml` with the pnpm settings the first install needs: the build scripts of the SDK's dependencies are allowed or denied, and `@salsita-ai/*` packages are exempt from pnpm's minimum release age. A project inside a pnpm monorepo gets no file; the workspace root holds these settings.
35
42
 
36
- It asks nothing, writes no `.env` and contacts no server. `phoenix sync` then generates every other project file, including the agent skills described in [Project Structure](?path=/docs/phoenix-project-structure--docs). The `.gitignore` is among them only when the folder is inside a git repository, so run `git init` before the first sync, or sync again after it.
43
+ The next steps it prints use the package manager you ran it with, or name none when it cannot tell. It asks nothing, writes no `.env` and contacts no server. `phoenix sync` then generates every other project file, including the agent skills described in [Project Structure](?path=/docs/phoenix-project-structure--docs). The `.gitignore` is among them only when the folder is inside a git repository, so run `git init` before the first sync, or sync again after it.
37
44
 
38
45
  ### Which project `phoenix dev` develops in
39
46
 
@@ -135,15 +142,15 @@ The same streams are available in the editor's **Logs** sidebar panel with per-s
135
142
 
136
143
  ### `phoenix check`
137
144
 
138
- Runs all code quality checks in sequence:
145
+ Runs all code quality checks in sequence, with the TypeScript compiler, ESLint and Prettier the SDK installs as its own dependencies, so the versions in the project's `package.json` do not decide them:
139
146
 
140
- 1. **TypeScript** — Type checking with `tsc`, with the project's root `tsconfig.json`, or with `.phoenix/tsconfig.json` when the project has none (see [Project Structure](?path=/docs/phoenix-project-structure--docs#root-level-files))
141
- 2. **ESLint** — Linting rules, over `src/`; a project with no files there passes
142
- 3. **Prettier** — Code formatting
147
+ 1. **TypeScript** — Type checking with the SDK's `tsc` (TypeScript 7), with the project's root `tsconfig.json`, or with `.phoenix/tsconfig.json` when the project has none (see [Project Structure](?path=/docs/phoenix-project-structure--docs#root-level-files))
148
+ 2. **ESLint** — Linting rules, over `src/`; a project with no files there passes. ESLint uses the project's `eslint.config.js`, or the SDK's configuration when the project has none; its type-aware rules then read the same TypeScript configuration as the type check
149
+ 3. **Prettier** — Code formatting, with the project's Prettier configuration, or the SDK's when the project has none
143
150
 
144
151
  ### `phoenix fix`
145
152
 
146
- Auto-fixes ESLint and Prettier issues. Equivalent to running `eslint --fix` and `prettier --write` together.
153
+ Auto-fixes ESLint and Prettier issues, with the same tools and configurations as `phoenix check`. Equivalent to running the SDK's `eslint --fix` and `prettier --write` together.
147
154
 
148
155
  ## Environment Variables
149
156
 
@@ -178,7 +185,7 @@ spec/application.yaml → Server prepares environment → CLI writes the generat
178
185
  | `check` | `phoenix check` | Run all checks (TypeScript, ESLint, Prettier) |
179
186
  | `fix` | `phoenix fix` | Auto-fix lint and formatting issues |
180
187
 
181
- The scripts are yours: change, rename or delete them, and add your own. `phoenix sync` and `phoenix clean` leave the `scripts` section of `package.json` as it is, so they add no script, restore none you removed and remove none. Every CLI command also runs without a script, as `pnpm phoenix <command>`.
188
+ The scripts are yours: change, rename or delete them, and add your own. `phoenix sync` and `phoenix clean` leave the `scripts` section of `package.json` as it is, so they add no script, restore none you removed and remove none. Every CLI command also runs without a script, through your package manager: `pnpm phoenix <command>`, `npx phoenix <command>`, `yarn phoenix <command>` or `bunx phoenix <command>`.
182
189
 
183
190
  A project may have other scripts than these five, such as `sync`, `test` or `verify:fix`; they are its own and stay as they are. All of this holds for a project on the application-spec pipeline, which `phoenix init` selects. In a project on the legacy pipeline (see [Current and legacy project tooling](#current-and-legacy-project-tooling)), `phoenix sync` and `phoenix clean` write their own set of scripts into `package.json` on every run, over scripts of the same name.
184
191
 
@@ -305,6 +312,8 @@ Starts the full development environment: Vite dev server, development webhook tu
305
312
 
306
313
  With the application-spec pipeline, `phoenix dev` creates an empty `src/` folder when the project has none, so that it rebuilds when the first source file, such as `src/webhooks/index.ts`, is added.
307
314
 
315
+ With the application-spec pipeline, the SDK's own Lingui CLI runs with the configuration in `.phoenix/.linguirc`, both for `--withLingui` and when `phoenix sync` and `phoenix build` extract and compile the catalogs; see [Root Level Files](?path=/docs/phoenix-project-structure--docs#root-level-files). The dev server and `phoenix build` compile the Lingui macros (`msg`, `t`, `Trans` and the others, imported from `@lingui/core/macro`, `@lingui/react/macro` or `@lingui/macro`) with the SDK's own Lingui macro plugin and the same configuration, so the project needs neither `babel-plugin-macros` nor `@lingui/macro` for them. Babel macros of other packages are not compiled.
316
+
308
317
  In `server` persistence mode the project comes from `--projectSlug`, `PROJECT_SLUG` or `project` in the spec, and the credential from `DEVELOPMENT_KEY` or the `phoenix login` sign-in; see [Starting a New Project](#starting-a-new-project). When signed in, the environment is always your own development environment and `--environmentSlug` is ignored.
309
318
 
310
319
  The dev server watches for changes in:
@@ -394,7 +403,7 @@ Set initial values from a local production build with roughly 5–10% headroom t
394
403
 
395
404
  ### `phoenix clean`
396
405
 
397
- Removes all build artifacts (`.phoenix/`, `node_modules/`), reinstalls dependencies, and rebuilds all generated files from scratch. Use this when:
406
+ Removes `.phoenix/` and regenerates all project files from scratch. It installs nothing and leaves `node_modules/` as it is; to reinstall too, delete `node_modules/` and install with your package manager. In a project on the legacy pipeline (see [Current and legacy project tooling](#current-and-legacy-project-tooling)), `phoenix clean` also removes `node_modules/` and runs `pnpm install`. Use this when:
398
407
 
399
408
  - Generated files are corrupted or out of sync
400
409
  - After major SDK version upgrades
@@ -402,10 +411,12 @@ Removes all build artifacts (`.phoenix/`, `node_modules/`), reinstalls dependenc
402
411
 
403
412
  ### `phoenix sync`
404
413
 
405
- Syncs project dependencies and regenerates all project files without building Vite bundles or webhooks. Faster than `clean` — use this for routine updates after changing spec files or upgrading dependencies. Before installing, it adds the pnpm settings `phoenix init` writes to a standalone project's `pnpm-workspace.yaml` when they are missing; values you set there are kept.
414
+ Regenerates all project files without building Vite bundles or webhooks. Faster than `clean` — use this for routine updates after changing spec files or updating the SDK. It installs nothing: install with your package manager before syncing, after any change to `package.json`. It writes no package-manager settings; `pnpm-workspace.yaml` is the project's own. In a project on the legacy pipeline, `phoenix sync` runs `pnpm install` first.
406
415
 
407
416
  With the application-spec pipeline (see [Current and legacy project tooling](#current-and-legacy-project-tooling)), `.gitignore` is written only when the project is inside a git repository: the project folder or one of its parent folders holds a `.git` entry. Outside a repository, sync neither creates the file nor changes one that is already there, and the same holds for `dev`, `build` and `clean`. Run `git init` before the first sync, or sync again after it, to get the file. The legacy pipeline writes `.gitignore` in every project.
408
417
 
418
+ With the application-spec pipeline, sync never writes `package.json`. Before it generates any file, it checks that `package.json` declares every peer of the installed SDK at a version inside the SDK's range, and stops with a non-zero exit code when it does not. The message lists each peer that fails, with the range the SDK needs and the version found, or `missing`, and names the fix: run [`phoenix deps`](#phoenix-deps), then install with your package manager. `phoenix build`, `phoenix clean` and `phoenix dev` make the same check, and so does the platform build of [`phoenix deploy`](#phoenix-deploy). `phoenix dev` stops when the check fails at start; on a rebuild it reports the failure like a spec error and keeps running. [Dependencies](?path=/docs/phoenix-project-structure--docs#dependencies) has the rules. The legacy pipeline merges the SDK's dependencies into `package.json` on every sync.
419
+
409
420
  | Flag | Env Variable | Default | Description |
410
421
  | ---------------- | --------------- | ------- | ------------------------------ |
411
422
  | `--force` / `-f` | `FORCE_REBUILD` | `false` | Force full rebuild, skip cache |
@@ -419,12 +430,14 @@ pnpm phoenix deps
419
430
  pnpm install
420
431
  ```
421
432
 
433
+ Run it after every SDK update: `phoenix sync`, `dev` and `build` stop while `package.json` does not declare the SDK's peers (see [`phoenix sync`](#phoenix-sync)).
434
+
422
435
  - A missing peer is added at the lowest version of the SDK's range, as an exact version, in alphabetical order: type packages (`@types/*`) to `devDependencies`, the others to `dependencies`.
423
436
  - A peer declared with a version range whose lowest version falls outside the SDK's range is set to the lowest version of the SDK's range, in the field that declares it. The output says when that is a downgrade.
424
437
  - A peer declared with a specifier that is not a version range, such as `workspace:`, `npm:`, `catalog:`, `file:`, `link:` or a git URL, stays as it is.
425
438
  - `@salsita-ai/common`, `@salsita-ai/contracts`, `@salsita-ai/platform-project-sdk`, `@salsita-ai/platform-common` and `@salsita-ai/platform-contracts` are removed, because `@salsita-ai/sdk` replaces them. No other entry is removed.
426
439
 
427
- Every other part of `package.json` keeps its order and formatting. `phoenix deps` installs nothing: it lists each change and names `pnpm install` as the next step, or says that nothing needed to change. Running it again changes nothing. It reads the spec to learn whether the project uses Clerk, so it stops with the spec's errors when the spec does not parse.
440
+ Every other part of `package.json` keeps its order and formatting. `phoenix deps` installs nothing: it lists each change and names the install of the package manager you ran it with as the next step, or says that nothing needed to change. Running it again changes nothing. It reads the spec to learn whether the project uses Clerk, so it stops with the spec's errors when the spec does not parse.
428
441
 
429
442
  This holds for a project on the application-spec pipeline. In a project on the legacy pipeline (see [Current and legacy project tooling](#current-and-legacy-project-tooling)), `phoenix deps` changes nothing and says that `phoenix sync` manages the dependencies.
430
443
 
@@ -602,10 +615,11 @@ Generated projects carry the `phoenix-variants` agent skill, which tells coding
602
615
 
603
616
  ### `phoenix link`
604
617
 
605
- Link a local copy of the Phoenix SDK for development. This creates symlinks so that changes to the SDK source are reflected in your project without publishing.
618
+ An internal tool for working on the SDK itself, and pnpm only: in a project with another package manager's lockfile and no `pnpm-lock.yaml`, it stops and changes nothing. Link a local copy of the Phoenix SDK for development in a project installed with pnpm. It writes a `file:` override for each SDK package into `pnpm-workspace.yaml`, so that after the next install changes to the SDK source are reflected in your project without publishing. It installs nothing; run the install it prints next:
606
619
 
607
620
  ```bash
608
621
  phoenix link --sdk-path ../configurator-phoenix
622
+ pnpm install --config.optimistic-repeat-install=false
609
623
  ```
610
624
 
611
625
  | Flag | Default | Description |
@@ -616,10 +630,11 @@ When linked, `phoenix dev` automatically watches for changes in the linked SDK's
616
630
 
617
631
  ### `phoenix unlink`
618
632
 
619
- Remove the local SDK linking and restore normal package resolution.
633
+ Remove the local SDK linking: it deletes the overrides `phoenix link` wrote. Like `phoenix link`, it is an internal tool and pnpm only. It installs nothing; the install it prints restores normal package resolution:
620
634
 
621
635
  ```bash
622
636
  phoenix unlink
637
+ pnpm install --config.optimistic-repeat-install=false
623
638
  ```
624
639
 
625
640
  ## Utilities
@@ -735,7 +750,7 @@ Revokes the token on the server and removes it from the credentials file. `--reg
735
750
 
736
751
  ### `phoenix deploy`
737
752
 
738
- Validates the spec, adds the pnpm settings `phoenix init` writes to `pnpm-workspace.yaml` when they are missing, packs and uploads the project, starts its build on the server and follows it until the configurator is live. Before the upload the server compares the domain model with the deployed one: a model that changed under an already deployed model version is refused with the reason, and needs a new model version and a [migration](?path=/docs/phoenix-migrations--docs). Once the build starts it prints `Follow the build in Studio: <url>`, the build's page in the Studio you signed in through; a sign-in stored by an older CLI has no Studio URL, so sign in again to get the link. After `Your configurator is live at <url>` it prints one line for coding agents, which tells them to offer the run evaluation of the `phoenix-feedback` skill once you have nothing more to build; you can ignore it when you run the command yourself. `--region` or `--serverUrl` selects the server, as for `login`; `--no-wait` returns as soon as the build starts.
753
+ Validates the spec, packs and uploads the project, starts its build on the server and follows it until the configurator is live. Before the upload the server compares the domain model with the deployed one: a model that changed under an already deployed model version is refused with the reason, and needs a new model version and a [migration](?path=/docs/phoenix-migrations--docs). Once the build starts it prints `Follow the build in Studio: <url>`, the build's page in the Studio you signed in through; a sign-in stored by an older CLI has no Studio URL, so sign in again to get the link. After `Your configurator is live at <url>` it prints one line for coding agents, which tells them to offer the run evaluation of the `phoenix-feedback` skill once you have nothing more to build; you can ignore it when you run the command yourself. `--region` or `--serverUrl` selects the server, as for `login`; `--no-wait` returns as soon as the build starts.
739
754
 
740
755
  To keep the conversation that led to a build, place a reviewed UTF-8 transcript in `conversation.log` at the project root before deploying. Deploy automatically includes it in the private source archive. Download the build's sources from Studio to read it; access is the same as for the rest of that build's sources. The build extractor skips the log, so it is not an application build input or a public asset. Missing logs produce a warning and deployment continues. Directories, links and special files at that path are rejected.
741
756