@salsita-ai/sdk 0.50.0-develop.24077d65e6 → 0.50.0-develop.257ef311fd

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 (542) hide show
  1. package/README.md +19 -14
  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/generate-application-code.d.ts +3 -2
  27. package/dist/application-spec/generate-application/code/generate-application-code.js +1 -1
  28. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +15 -14
  29. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  30. package/dist/application-spec/generate-application/code/standalone-app-files.d.ts +2 -2
  31. package/dist/application-spec/generate-application/code/standalone-app-files.js +1 -1
  32. package/dist/application-spec/generate-application/code/story-files.js +1 -1
  33. package/dist/application-spec/generate-application/code/templates/admin-config.js +3 -0
  34. package/dist/application-spec/generate-application/code/templates/common/format-property-key.d.ts +7 -0
  35. package/dist/application-spec/generate-application/code/templates/common/format-property-key.js +1 -0
  36. package/dist/application-spec/generate-application/code/templates/common/schema-to-type-string.js +3 -3
  37. package/dist/application-spec/generate-application/code/templates/configurator-config.js +6 -4
  38. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/domain-factory-types.d.ts +35 -0
  39. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/domain-factory-types.js +5 -0
  40. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/index.d.ts +1 -0
  41. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/index.js +1 -0
  42. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.d.ts +1 -1
  43. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +6 -6
  44. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +59 -63
  45. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.d.ts +8 -0
  46. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.js +1 -1
  47. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-presets.js +1 -1
  48. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +13 -13
  49. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-states.d.ts +1 -1
  50. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-states.js +2 -2
  51. package/dist/application-spec/generate-application/code/templates/domain-spec/index.d.ts +2 -1
  52. package/dist/application-spec/generate-application/code/templates/domain-spec/index.js +1 -1
  53. package/dist/application-spec/generate-application/code/templates/eslint-config.d.ts +5 -0
  54. package/dist/application-spec/generate-application/code/templates/eslint-config.js +4 -5
  55. package/dist/application-spec/generate-application/code/templates/frontend-config.js +3 -5
  56. package/dist/application-spec/generate-application/code/templates/gitignore.js +0 -3
  57. package/dist/application-spec/generate-application/code/templates/global-definition/generate-phx-types.d.ts +43 -0
  58. package/dist/application-spec/generate-application/code/templates/global-definition/generate-phx-types.js +31 -0
  59. package/dist/application-spec/generate-application/code/templates/global-definition/index.d.ts +1 -0
  60. package/dist/application-spec/generate-application/code/templates/global-definition/index.js +1 -1
  61. package/dist/application-spec/generate-application/code/templates/globals.js +24 -44
  62. package/dist/application-spec/generate-application/code/templates/index.d.ts +3 -3
  63. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  64. package/dist/application-spec/generate-application/code/templates/lingui-rc.d.ts +5 -0
  65. package/dist/application-spec/generate-application/code/templates/lingui-rc.js +4 -4
  66. package/dist/application-spec/generate-application/code/templates/prettier-config.d.ts +5 -0
  67. package/dist/application-spec/generate-application/code/templates/prettier-config.js +4 -5
  68. package/dist/application-spec/generate-application/code/templates/root-tsconfig.d.ts +6 -0
  69. package/dist/application-spec/generate-application/code/templates/root-tsconfig.js +2 -0
  70. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  71. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +1 -1
  72. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +5 -5
  73. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +3 -3
  74. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  75. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +2 -2
  76. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +24 -7
  77. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  78. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.d.ts +58 -0
  79. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.js +1 -0
  80. package/dist/application-spec/generate-application/code/templates/spec-code/index.d.ts +2 -0
  81. package/dist/application-spec/generate-application/code/templates/spec-code/index.js +1 -0
  82. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.d.ts +18 -0
  83. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.js +41 -0
  84. package/dist/application-spec/generate-application/code/templates/spec-messages/index.d.ts +1 -0
  85. package/dist/application-spec/generate-application/code/templates/spec-messages/index.js +1 -0
  86. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.d.ts +20 -0
  87. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.js +6 -0
  88. package/dist/application-spec/generate-application/code/templates/story/phx-module.d.ts +8 -2
  89. package/dist/application-spec/generate-application/code/templates/story/phx-module.js +15 -3
  90. package/dist/application-spec/generate-application/code/templates/story/wrapper.d.ts +3 -0
  91. package/dist/application-spec/generate-application/code/templates/story/wrapper.js +2 -1
  92. package/dist/application-spec/generate-application/code/templates/tsconfig.d.ts +5 -0
  93. package/dist/application-spec/generate-application/code/templates/tsconfig.js +1 -1
  94. package/dist/application-spec/generate-application/code/templates/webhook-index.d.ts +6 -1
  95. package/dist/application-spec/generate-application/code/templates/webhook-index.js +10 -1
  96. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -3
  97. package/dist/application-spec/generate-application/index.d.ts +2 -0
  98. package/dist/application-spec/generate-application/index.js +1 -1
  99. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.d.ts +6 -4
  100. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.js +1 -1
  101. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +8 -3
  102. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  103. package/dist/application-spec/generate-application/runtime/admin-runtime/states-runtime.d.ts +2 -2
  104. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +19 -5
  105. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  106. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.d.ts +6 -4
  107. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.js +1 -1
  108. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +7 -2
  109. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  110. package/dist/application-spec/generate-application/runtime/configurator-runtime/states-runtime.d.ts +2 -2
  111. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.d.ts +43 -0
  112. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.js +1 -0
  113. package/dist/application-spec/generate-application/runtime/factory-data/index.d.ts +3 -0
  114. package/dist/application-spec/generate-application/runtime/factory-data/index.js +1 -0
  115. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.d.ts +13 -0
  116. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -0
  117. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +16 -0
  118. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -0
  119. package/dist/application-spec/generate-application/runtime/migrations/index.d.ts +1 -0
  120. package/dist/application-spec/generate-application/runtime/migrations/index.js +1 -0
  121. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +53 -0
  122. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.js +1 -0
  123. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +2 -2
  124. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +2 -1
  125. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  126. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.d.ts +2 -1
  127. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.js +1 -1
  128. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +3 -0
  129. package/dist/application-spec/generate-application/runtime/sections/component-optic.js +1 -1
  130. package/dist/application-spec/generate-application/runtime/sections/data-runtime.d.ts +4 -4
  131. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.d.ts +7 -4
  132. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  133. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.d.ts +9 -5
  134. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.js +1 -1
  135. package/dist/application-spec/generate-application/runtime/sections/reflection-constants-runtime.d.ts +3 -1
  136. package/dist/application-spec/generate-application/runtime/sections/reflection-constants-runtime.js +1 -1
  137. package/dist/application-spec/generate-application/runtime/sections/theme-runtime.d.ts +2 -2
  138. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +3 -3
  139. package/dist/application-spec/generate-application/runtime/spec-code/index.d.ts +2 -0
  140. package/dist/application-spec/generate-application/runtime/spec-code/index.js +1 -0
  141. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.d.ts +18 -0
  142. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.js +1 -0
  143. package/dist/application-spec/generate-application/runtime/spec-code/spec-code-module.d.ts +17 -0
  144. package/dist/application-spec/generate-application/runtime/spec-code/spec-code-module.js +1 -0
  145. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.d.ts +9 -0
  146. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.js +1 -0
  147. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.d.ts +8 -0
  148. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.js +1 -0
  149. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.d.ts +27 -0
  150. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.js +1 -0
  151. package/dist/application-spec/generate-application/runtime-spec/index.d.ts +5 -0
  152. package/dist/application-spec/generate-application/runtime-spec/index.js +1 -0
  153. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.d.ts +68 -0
  154. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.js +1 -0
  155. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.d.ts +40 -0
  156. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.js +1 -0
  157. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +34 -0
  158. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  159. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.d.ts +16 -0
  160. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.js +9 -0
  161. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.d.ts +9 -0
  162. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.js +1 -0
  163. package/dist/application-spec/parse-application-files/raw-spec/parse-yaml-spec-file.js +1 -1
  164. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-spec.js +1 -1
  165. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/configurator-spec.js +1 -1
  166. package/dist/application-spec/parse-application-files/spec/common/index.d.ts +1 -0
  167. package/dist/application-spec/parse-application-files/spec/common/index.js +1 -1
  168. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.d.ts +3 -0
  169. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.js +1 -0
  170. package/dist/application-spec/parse-application-files/spec/common/value-type/index.d.ts +5 -0
  171. package/dist/application-spec/parse-application-files/spec/common/value-type/index.js +1 -0
  172. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.d.ts +6 -0
  173. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.js +1 -0
  174. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.d.ts +8 -0
  175. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.js +1 -0
  176. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.d.ts +10 -0
  177. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.js +1 -0
  178. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.d.ts +98 -0
  179. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.js +1 -0
  180. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.d.ts +13 -0
  181. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.js +1 -0
  182. package/dist/application-spec/parse-application-files/spec/components/bindings/index.d.ts +2 -0
  183. package/dist/application-spec/parse-application-files/spec/components/bindings/index.js +1 -1
  184. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.d.ts +24 -0
  185. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.js +1 -0
  186. package/dist/application-spec/parse-application-files/spec/components/component-state-type.d.ts +8 -0
  187. package/dist/application-spec/parse-application-files/spec/components/component-state-type.js +1 -0
  188. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.d.ts +13 -0
  189. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.js +1 -0
  190. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.d.ts +14 -0
  191. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.js +1 -0
  192. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.d.ts +6 -0
  193. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.js +1 -1
  194. package/dist/application-spec/parse-application-files/spec/components/user-components.d.ts +7 -4
  195. package/dist/application-spec/parse-application-files/spec/components/user-components.js +1 -1
  196. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.d.ts +24 -0
  197. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.js +1 -0
  198. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.d.ts +13 -0
  199. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.js +1 -0
  200. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.d.ts +9 -0
  201. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.js +1 -0
  202. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +6 -2
  203. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  204. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.d.ts +3 -1
  205. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  206. package/dist/application-spec/parse-application-files/spec/invariants/invariants.d.ts +2 -2
  207. package/dist/application-spec/parse-application-files/spec/invariants/invariants.js +1 -1
  208. package/dist/application-spec/parse-application-files/spec/model/index.d.ts +1 -0
  209. package/dist/application-spec/parse-application-files/spec/model/index.js +1 -1
  210. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.d.ts +10 -0
  211. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.js +1 -0
  212. package/dist/client/phoenix-api.d.ts +367 -0
  213. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +36 -1
  214. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  215. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +7 -1
  216. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  217. package/dist/configurator/application-runtime/extensions/systems/graphql-system/close-unclosed-braces.d.ts +12 -0
  218. package/dist/configurator/application-runtime/extensions/systems/graphql-system/close-unclosed-braces.js +1 -0
  219. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +7 -1
  220. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  221. package/dist/configurator/common/configurator-interface.d.ts +21 -1
  222. package/dist/configurator/common/configurator-interface.js +1 -1
  223. package/dist/configurator/common/index.d.ts +3 -1
  224. package/dist/configurator/common/index.js +1 -1
  225. package/dist/configurator/common/use-finalize-action.d.ts +31 -0
  226. package/dist/configurator/common/use-finalize-action.js +1 -0
  227. package/dist/configurator/common/use-reset-camera.d.ts +6 -0
  228. package/dist/configurator/common/use-reset-camera.js +1 -0
  229. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.d.ts +12 -0
  230. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.js +1 -0
  231. package/dist/configurator/configuration-not-found-page/index.d.ts +1 -0
  232. package/dist/configurator/configuration-not-found-page/index.js +1 -0
  233. package/dist/configurator/configurator-context/PresetSelectionProvider.js +1 -1
  234. package/dist/configurator/pages/ConfiguratorNotFoundPage.js +1 -1
  235. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +3 -2
  236. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  237. package/dist/configurator/pages/RootPage.js +1 -1
  238. package/dist/configurator/pages/configurator-layout-name.d.ts +2 -0
  239. package/dist/configurator/pages/configurator-layout-name.js +1 -0
  240. package/dist/configurator/pages/default-configurator-elements.d.ts +9 -0
  241. package/dist/configurator/pages/default-configurator-elements.js +1 -0
  242. package/dist/configurator/pages/default-elements/built-in-entity-element.d.ts +10 -0
  243. package/dist/configurator/pages/default-elements/built-in-entity-element.js +1 -0
  244. package/dist/configurator/pages/default-elements/built-in-layout-element.d.ts +10 -0
  245. package/dist/configurator/pages/default-elements/built-in-layout-element.js +1 -0
  246. package/dist/configurator/pages/default-elements/domain-control-elements.d.ts +6 -0
  247. package/dist/configurator/pages/default-elements/domain-control-elements.js +1 -0
  248. package/dist/configurator/pages/default-elements/index.d.ts +4 -0
  249. package/dist/configurator/pages/default-elements/index.js +1 -0
  250. package/dist/configurator/pages/default-elements/recipe-panel-elements.d.ts +3 -0
  251. package/dist/configurator/pages/default-elements/recipe-panel-elements.js +1 -0
  252. package/dist/configurator/pages/default-elements/sidebar-footer-elements.d.ts +7 -0
  253. package/dist/configurator/pages/default-elements/sidebar-footer-elements.js +1 -0
  254. package/dist/configurator/pages/default-elements/toolbar-elements.d.ts +7 -0
  255. package/dist/configurator/pages/default-elements/toolbar-elements.js +1 -0
  256. package/dist/configurator/pages/index.d.ts +1 -0
  257. package/dist/configurator/pages/index.js +1 -1
  258. package/dist/configurator/scene/scene-controls/DeleteEntityFab.js +1 -1
  259. package/dist/configurator/scene/scene-controls/SelectionHotspot.js +1 -1
  260. package/dist/configurator/ui/assistant/AssistantChips.d.ts +8 -2
  261. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  262. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -2
  263. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  264. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -1
  265. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  266. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +1 -1
  267. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -1
  268. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +1 -1
  269. package/dist/configurator/ui/assistant/entity-link/index.d.ts +0 -1
  270. package/dist/configurator/ui/assistant/entity-link/index.js +1 -1
  271. package/dist/configurator/ui/assistant/form/AssistantForm.d.ts +19 -0
  272. package/dist/configurator/ui/assistant/form/AssistantForm.js +1 -0
  273. package/dist/configurator/ui/assistant/form/built-in-form-registry.d.ts +10 -0
  274. package/dist/configurator/ui/assistant/form/built-in-form-registry.js +1 -0
  275. package/dist/configurator/ui/assistant/form/compose-answer.d.ts +11 -0
  276. package/dist/configurator/ui/assistant/form/compose-answer.js +1 -0
  277. package/dist/configurator/ui/assistant/form/describe-build-errors.d.ts +6 -0
  278. package/dist/configurator/ui/assistant/form/describe-build-errors.js +1 -0
  279. package/dist/configurator/ui/assistant/form/form-element-definition.d.ts +14 -0
  280. package/dist/configurator/ui/assistant/form/form-element-definition.js +1 -0
  281. package/dist/configurator/ui/assistant/form/form-model.d.ts +38 -0
  282. package/dist/configurator/ui/assistant/form/form-model.js +1 -0
  283. package/dist/configurator/ui/assistant/form/form-registry.d.ts +31 -0
  284. package/dist/configurator/ui/assistant/form/form-registry.js +8 -0
  285. package/dist/configurator/ui/assistant/form/form-state.d.ts +4 -0
  286. package/dist/configurator/ui/assistant/form/form-state.js +1 -0
  287. package/dist/configurator/ui/assistant/form/index.d.ts +2 -0
  288. package/dist/configurator/ui/assistant/form/index.js +1 -0
  289. package/dist/configurator/ui/assistant/form/parse-form-block.d.ts +9 -0
  290. package/dist/configurator/ui/assistant/form/parse-form-block.js +1 -0
  291. package/dist/configurator/ui/assistant/form/read-form-attributes.d.ts +13 -0
  292. package/dist/configurator/ui/assistant/form/read-form-attributes.js +1 -0
  293. package/dist/configurator/ui/assistant/form-elements/FormGroup.d.ts +3 -0
  294. package/dist/configurator/ui/assistant/form-elements/FormGroup.js +1 -0
  295. package/dist/configurator/ui/assistant/form-elements/FormOptions.d.ts +3 -0
  296. package/dist/configurator/ui/assistant/form-elements/FormOptions.js +1 -0
  297. package/dist/configurator/ui/assistant/form-elements/FormReply.d.ts +3 -0
  298. package/dist/configurator/ui/assistant/form-elements/FormReply.js +1 -0
  299. package/dist/configurator/ui/assistant/form-elements/FormText.d.ts +3 -0
  300. package/dist/configurator/ui/assistant/form-elements/FormText.js +1 -0
  301. package/dist/configurator/ui/assistant/form-elements/form-element-props.d.ts +34 -0
  302. package/dist/configurator/ui/assistant/form-elements/form-element-props.js +1 -0
  303. package/dist/configurator/ui/assistant/form-elements/index.d.ts +5 -0
  304. package/dist/configurator/ui/assistant/form-elements/index.js +1 -0
  305. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.d.ts +16 -0
  306. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.js +1 -0
  307. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.d.ts +34 -0
  308. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.js +1 -0
  309. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.d.ts +25 -0
  310. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.js +1 -0
  311. package/dist/configurator/ui/assistant/reference-link/index.d.ts +3 -0
  312. package/dist/configurator/ui/assistant/reference-link/index.js +1 -0
  313. package/dist/configurator/ui/assistant/reference-link/reference-styles.d.ts +12 -0
  314. package/dist/configurator/ui/assistant/reference-link/reference-styles.js +1 -0
  315. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.d.ts +8 -0
  316. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.js +1 -0
  317. package/dist/configurator/ui/assistant/resource-image/AssistantImage.d.ts +9 -0
  318. package/dist/configurator/ui/assistant/resource-image/AssistantImage.js +1 -0
  319. package/dist/configurator/ui/assistant/resource-image/index.d.ts +3 -0
  320. package/dist/configurator/ui/assistant/resource-image/index.js +1 -0
  321. package/dist/configurator/ui/assistant/resource-image/resource-path.d.ts +11 -0
  322. package/dist/configurator/ui/assistant/resource-image/resource-path.js +1 -0
  323. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.d.ts +5 -0
  324. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.js +1 -0
  325. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +2 -0
  326. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -2
  327. package/dist/configurator/ui/assistant/thread-items.d.ts +8 -1
  328. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  329. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -1
  330. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  331. package/dist/configurator/ui/configurator-layout/slots/services/Services.js +1 -1
  332. package/dist/configurator/ui/legacy/layout/common/CommonFinalizeButton.js +1 -1
  333. package/dist/configurator/ui/legacy/layout/common/CommonSummaryButton.js +1 -1
  334. package/dist/configurator/ui/legacy/layout/common/CommonTopNavigation.js +1 -1
  335. package/dist/configurator/ui/legacy/layout/common/ResponsiveFinalizeButton.js +1 -1
  336. package/dist/configurator/ui/legacy/layout/common/SummaryReadLayout.js +1 -1
  337. package/dist/configurator/ui/legacy/layout/simple/SimpleOwnerLayout.js +1 -1
  338. package/dist/configurator/ui/legacy/layout/simple/SimpleTopNavigation.js +1 -1
  339. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.js +1 -1
  340. package/dist/configurator/ui/legacy/layout/steps/StepsOwnerLayout.js +1 -1
  341. package/dist/configurator/ui/legacy/layout/steps/StepsSidebarFooter.js +1 -1
  342. package/dist/configurator/ui/legacy/layout/tabs/TabsOwnerLayout.js +1 -1
  343. package/dist/configurator/ui/legacy/toolbar/common/DimensionUnitSelector.js +1 -1
  344. package/dist/configurator/ui/legacy/toolbar/common/MeasurementsIndicatorsSwitch.js +1 -1
  345. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/FullscreenToolbarAction.js +1 -1
  346. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/HelpToolbarAction.js +1 -1
  347. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/MeasurementsToolbarAction.js +1 -1
  348. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/UndoRedoToolbarGroup.js +1 -1
  349. package/dist/configurator/ui/phoenix-layout-elements/EnterFullscreenToolbarButton.js +1 -1
  350. package/dist/configurator/ui/phoenix-layout-elements/ExitFullscreenToolbarButton.js +1 -1
  351. package/dist/configurator/ui/phoenix-layout-elements/HelpToolbarButton.js +1 -1
  352. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.d.ts +1 -0
  353. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.js +1 -1
  354. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.d.ts +1 -0
  355. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.js +1 -1
  356. package/dist/configurator/ui/phoenix-layout-elements/MeasurementsToolbarButton.js +1 -1
  357. package/dist/configurator/ui/phoenix-layout-elements/RedoToolbarButton.js +1 -1
  358. package/dist/configurator/ui/phoenix-layout-elements/UndoToolbarButton.js +1 -1
  359. package/dist/configurator/ui/phoenix-layout-elements/header/common/back-button/use-go-back-action.js +1 -1
  360. package/dist/configurator/ui/phoenix-layout-elements/header/common/horizontal-tabs/DesktopHorizontalTabs.js +1 -1
  361. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.js +1 -1
  362. package/dist/configurator/ui/phoenix-layout-elements/measurements/DimensionUnitSelector.js +1 -1
  363. package/dist/configurator/ui/phoenix-layout-elements/measurements/MeasurementsIndicatorsSwitch.js +1 -1
  364. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/basic/BasicFinalizeButton.js +1 -1
  365. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/CustomFinalizeButton.js +1 -1
  366. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/EnterSummaryButton.js +1 -1
  367. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/NextStepButton.js +1 -1
  368. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/PreviousStepButton.js +1 -1
  369. package/dist/configurator/ui/preset-layout/CategoryPresetUi.js +1 -1
  370. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.d.ts +10 -0
  371. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.js +1 -0
  372. package/dist/configurator/ui/save-message-snackbars/index.d.ts +1 -0
  373. package/dist/configurator/ui/save-message-snackbars/index.js +1 -0
  374. package/dist/docs/controls/select-child-entity/cardselect.mdx +1 -0
  375. package/dist/docs/fabs/basic.mdx +2 -2
  376. package/dist/docs/index.json +1 -1
  377. package/dist/docs/layouts/custom-layout.mdx +1471 -200
  378. package/dist/docs/other-features/not-found-404.mdx +1 -1
  379. package/dist/docs/phoenix/clerk-sign-in.mdx +1 -1
  380. package/dist/docs/phoenix/components.mdx +6 -0
  381. package/dist/docs/phoenix/configurator-interface.mdx +99 -21
  382. package/dist/docs/phoenix/deployments.mdx +2 -6
  383. package/dist/docs/phoenix/domain-model.mdx +2 -0
  384. package/dist/docs/phoenix/finalization.mdx +1 -1
  385. package/dist/docs/phoenix/getting-started.mdx +6 -3
  386. package/dist/docs/phoenix/layout-slots.mdx +12 -10
  387. package/dist/docs/phoenix/localization.mdx +10 -6
  388. package/dist/docs/phoenix/migration-guide.mdx +24 -11
  389. package/dist/docs/phoenix/phoenix-cli.mdx +67 -20
  390. package/dist/docs/phoenix/project-structure.mdx +70 -33
  391. package/dist/docs/phoenix/quickstart.mdx +7 -7
  392. package/dist/docs/phoenix/sdk-builder-workflow.mdx +7 -7
  393. package/dist/docs/phoenix/testing.mdx +8 -0
  394. package/dist/docs/phoenix/webhooks.mdx +21 -4
  395. package/dist/domain/application/application-config.d.ts +3 -1
  396. package/dist/domain/application/assistant/assistant-form-elements.d.ts +28 -0
  397. package/dist/domain/application/assistant/assistant-form-elements.js +1 -0
  398. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  399. package/dist/domain/application/assistant/index.d.ts +2 -0
  400. package/dist/domain/application/assistant/index.js +1 -1
  401. package/dist/domain/application/assistant-recipe-groups.d.ts +3 -1
  402. package/dist/domain/application/configurator-builder.d.ts +4 -1
  403. package/dist/domain/application/configurator-builder.js +1 -1
  404. package/dist/domain/core/schema/extended-schema-validator.js +1 -1
  405. package/dist/domain/domain-context/index.d.ts +1 -1
  406. package/dist/domain/domain-context/undo-system.d.ts +28 -1
  407. package/dist/domain/domain-context/undo-system.js +1 -1
  408. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  409. package/dist/domain/domain-runtime/spec/module-checks/element-registration.d.ts +12 -11
  410. package/dist/domain/domain-runtime/spec/module-checks/element-registration.js +1 -1
  411. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +1 -1
  412. package/dist/domain/domain-runtime/spec/module-checks/index.js +1 -1
  413. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  414. package/dist/domain/domain-runtime/spec/types.d.ts +2 -0
  415. package/dist/domain/system-components/child-entity-selection.js +1 -1
  416. package/dist/domain/system-components/common/scene-entity-control-schema.d.ts +3 -0
  417. package/dist/domain/system-components/common/scene-entity-control-schema.js +1 -1
  418. package/dist/editor/Editor.d.ts +7 -0
  419. package/dist/editor/Editor.js +1 -1
  420. package/dist/editor/mocks/CreateMockYaml.js +2 -2
  421. package/dist/editor/mocks/EditorMockContext.d.ts +2 -0
  422. package/dist/editor/mocks/EditorMockContext.js +1 -1
  423. package/dist/globals/index.d.ts +2 -0
  424. package/dist/i18n/locales/cs/messages.js +1 -1
  425. package/dist/i18n/locales/da/messages.js +1 -1
  426. package/dist/i18n/locales/de/messages.js +1 -1
  427. package/dist/i18n/locales/de-AT/messages.js +1 -1
  428. package/dist/i18n/locales/en/messages.js +1 -1
  429. package/dist/i18n/locales/en-AU/messages.js +1 -1
  430. package/dist/i18n/locales/en-GB/messages.js +1 -1
  431. package/dist/i18n/locales/es/messages.js +1 -1
  432. package/dist/i18n/locales/fr/messages.js +1 -1
  433. package/dist/i18n/locales/hu/messages.js +1 -1
  434. package/dist/i18n/locales/it/messages.js +1 -1
  435. package/dist/i18n/locales/nl/messages.js +1 -1
  436. package/dist/i18n/locales/pl/messages.js +1 -1
  437. package/dist/i18n/locales/pt/messages.js +1 -1
  438. package/dist/i18n/locales/ro/messages.js +1 -1
  439. package/dist/i18n/locales/sk/messages.js +1 -1
  440. package/dist/i18n/locales/tr/messages.js +1 -1
  441. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  442. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  443. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +79 -80
  444. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  445. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  446. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  447. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +7 -2
  448. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +15 -14
  449. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +14 -12
  450. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +14 -13
  451. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +13 -11
  452. package/dist/phoenix/application-spec/application-spec-builder.d.ts +0 -2
  453. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  454. package/dist/phoenix/application-spec/generate-application-spec-project.d.ts +0 -2
  455. package/dist/phoenix/application-spec/generate-application-spec-project.js +2 -2
  456. package/dist/phoenix/application-spec/generate-application-spec-story.js +2 -2
  457. package/dist/phoenix/application-spec/generate-project-files.d.ts +0 -2
  458. package/dist/phoenix/application-spec/project-files.js +1 -1
  459. package/dist/phoenix/bin.d.ts +2 -0
  460. package/dist/phoenix/bin.js +2 -0
  461. package/dist/phoenix/check-configs/built-in-eslint-config.d.ts +9 -0
  462. package/dist/phoenix/check-configs/built-in-eslint-config.js +1 -0
  463. package/dist/phoenix/check-configs/eslint-config.d.ts +10 -0
  464. package/dist/phoenix/check-configs/eslint-config.js +1 -0
  465. package/dist/phoenix/check-configs/index.d.ts +8 -0
  466. package/dist/phoenix/check-configs/index.js +1 -0
  467. package/dist/phoenix/check-configs/typescript-project.d.ts +5 -0
  468. package/dist/phoenix/check-configs/typescript-project.js +1 -0
  469. package/dist/phoenix/cli.d.ts +0 -1
  470. package/dist/phoenix/cli.js +1 -2
  471. package/dist/phoenix/commands/build.js +1 -1
  472. package/dist/phoenix/commands/check.js +1 -1
  473. package/dist/phoenix/commands/clean.js +1 -1
  474. package/dist/phoenix/commands/deploy.js +2 -2
  475. package/dist/phoenix/commands/deps/deps.d.ts +73 -0
  476. package/dist/phoenix/commands/deps/deps.js +3 -0
  477. package/dist/phoenix/commands/deps/index.d.ts +1 -0
  478. package/dist/phoenix/commands/deps/index.js +1 -0
  479. package/dist/phoenix/commands/deps/sdk-manifest.d.ts +12 -0
  480. package/dist/phoenix/commands/deps/sdk-manifest.js +1 -0
  481. package/dist/phoenix/commands/dev.js +5 -5
  482. package/dist/phoenix/commands/fix.js +1 -1
  483. package/dist/phoenix/commands/index.d.ts +1 -0
  484. package/dist/phoenix/commands/index.js +1 -1
  485. package/dist/phoenix/commands/init.d.ts +17 -5
  486. package/dist/phoenix/commands/init.js +1 -1
  487. package/dist/phoenix/commands/link.js +1 -1
  488. package/dist/phoenix/commands/prettier.js +1 -1
  489. package/dist/phoenix/commands/sync.js +1 -1
  490. package/dist/phoenix/commands/unlink.js +1 -1
  491. package/dist/phoenix/services/application-spec-project-watcher.d.ts +2 -2
  492. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  493. package/dist/phoenix/services/lingui.d.ts +8 -0
  494. package/dist/phoenix/services/lingui.js +1 -1
  495. package/dist/phoenix/services/swc.js +1 -1
  496. package/dist/phoenix/services/vite-config.js +1 -1
  497. package/dist/phoenix/utils/index.d.ts +4 -2
  498. package/dist/phoenix/utils/index.js +1 -1
  499. package/dist/phoenix/utils/node-version/index.d.ts +1 -0
  500. package/dist/phoenix/utils/node-version/index.js +1 -0
  501. package/dist/phoenix/utils/node-version/supported-node-version.d.ts +12 -0
  502. package/dist/phoenix/utils/node-version/supported-node-version.js +4 -0
  503. package/dist/phoenix/utils/package-info.d.ts +0 -9
  504. package/dist/phoenix/utils/package-info.js +1 -1
  505. package/dist/phoenix/utils/package-manager/index.d.ts +2 -0
  506. package/dist/phoenix/utils/package-manager/index.js +1 -0
  507. package/dist/phoenix/utils/package-manager/package-manager-commands.d.ts +19 -0
  508. package/dist/phoenix/utils/package-manager/package-manager-commands.js +1 -0
  509. package/dist/phoenix/utils/package-manager/pnpm-project.d.ts +9 -0
  510. package/dist/phoenix/utils/package-manager/pnpm-project.js +1 -0
  511. package/dist/phoenix/utils/run-command.d.ts +11 -0
  512. package/dist/phoenix/utils/run-command.js +1 -1
  513. package/dist/phoenix/utils/sdk-tool/index.d.ts +1 -0
  514. package/dist/phoenix/utils/sdk-tool/index.js +1 -0
  515. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.d.ts +15 -0
  516. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.js +1 -0
  517. package/dist/react-sdk/application-runtime/common-services/analytics/index.d.ts +1 -0
  518. package/dist/react-sdk/application-runtime/common-services/analytics/index.js +1 -1
  519. package/dist/react-sdk/domain-application-context/DomainLifecycleBoundary.js +1 -1
  520. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +15 -4
  521. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -1
  522. package/dist/react-sdk/domain-context/index.d.ts +2 -1
  523. package/dist/react-sdk/domain-context/index.js +1 -1
  524. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +5 -0
  525. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  526. package/dist/react-sdk/domain-context/system-hooks/undo-redo-hooks.d.ts +20 -0
  527. package/dist/react-sdk/domain-context/system-hooks/undo-redo-hooks.js +1 -0
  528. package/dist/ui-sdk/theme/types.d.ts +1 -1
  529. package/package.json +46 -35
  530. package/schema/domain-spec.json +86 -8
  531. package/dist/application-spec/generate-application/code/templates/nvmrc.d.ts +0 -1
  532. package/dist/application-spec/generate-application/code/templates/nvmrc.js +0 -2
  533. package/dist/application-spec/generate-application/code/templates/package-json.d.ts +0 -10
  534. package/dist/application-spec/generate-application/code/templates/package-json.js +0 -1
  535. package/dist/application-spec/generate-application/code/templates/webhook-implementation.d.ts +0 -1
  536. package/dist/application-spec/generate-application/code/templates/webhook-implementation.js +0 -7
  537. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +0 -5
  538. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +0 -1
  539. package/dist/phoenix/commands/generate-project-files.d.ts +0 -6
  540. package/dist/phoenix/commands/generate-project-files.js +0 -1
  541. /package/dist/{configurator/common → react-sdk/application-runtime/common-services/analytics}/frontend-analytics.d.ts +0 -0
  542. /package/dist/{configurator/common → react-sdk/application-runtime/common-services/analytics}/frontend-analytics.js +0 -0
@@ -3549,20 +3549,20 @@ export interface DomainSpecification {
3549
3549
  screenOffsetHorizontal?: EnhancedNumberRead;
3550
3550
  screenOffsetVertical?: EnhancedNumberRead;
3551
3551
  azimuthAngleLimits?: {
3552
- min?: EnhancedNumberRead;
3553
- max?: EnhancedNumberRead;
3552
+ min: EnhancedNumberRead;
3553
+ max: EnhancedNumberRead;
3554
3554
  smoothZone?: EnhancedNumberRead;
3555
3555
  minOpacity?: EnhancedNumberRead;
3556
3556
  } | ReadEnhancement;
3557
3557
  polarAngleLimits?: {
3558
- min?: EnhancedNumberRead;
3559
- max?: EnhancedNumberRead;
3558
+ min: EnhancedNumberRead;
3559
+ max: EnhancedNumberRead;
3560
3560
  smoothZone?: EnhancedNumberRead;
3561
3561
  minOpacity?: EnhancedNumberRead;
3562
3562
  } | ReadEnhancement;
3563
3563
  distanceLimits?: {
3564
- min?: EnhancedNumberRead;
3565
- max?: EnhancedNumberRead;
3564
+ min: EnhancedNumberRead;
3565
+ max: EnhancedNumberRead;
3566
3566
  smoothZone?: EnhancedNumberRead;
3567
3567
  minOpacity?: EnhancedNumberRead;
3568
3568
  } | ReadEnhancement;
@@ -3590,20 +3590,20 @@ export interface DomainSpecification {
3590
3590
  screenOffsetHorizontal?: EnhancedNumberRead;
3591
3591
  screenOffsetVertical?: EnhancedNumberRead;
3592
3592
  azimuthAngleLimits?: {
3593
- min?: EnhancedNumberRead;
3594
- max?: EnhancedNumberRead;
3593
+ min: EnhancedNumberRead;
3594
+ max: EnhancedNumberRead;
3595
3595
  smoothZone?: EnhancedNumberRead;
3596
3596
  minOpacity?: EnhancedNumberRead;
3597
3597
  } | ReadEnhancement;
3598
3598
  polarAngleLimits?: {
3599
- min?: EnhancedNumberRead;
3600
- max?: EnhancedNumberRead;
3599
+ min: EnhancedNumberRead;
3600
+ max: EnhancedNumberRead;
3601
3601
  smoothZone?: EnhancedNumberRead;
3602
3602
  minOpacity?: EnhancedNumberRead;
3603
3603
  } | ReadEnhancement;
3604
3604
  distanceLimits?: {
3605
- min?: EnhancedNumberRead;
3606
- max?: EnhancedNumberRead;
3605
+ min: EnhancedNumberRead;
3606
+ max: EnhancedNumberRead;
3607
3607
  smoothZone?: EnhancedNumberRead;
3608
3608
  minOpacity?: EnhancedNumberRead;
3609
3609
  } | ReadEnhancement;
@@ -3641,20 +3641,20 @@ export interface DomainSpecification {
3641
3641
  screenOffsetHorizontal?: EnhancedNumberRead;
3642
3642
  screenOffsetVertical?: EnhancedNumberRead;
3643
3643
  azimuthAngleLimits?: {
3644
- min?: EnhancedNumberRead;
3645
- max?: EnhancedNumberRead;
3644
+ min: EnhancedNumberRead;
3645
+ max: EnhancedNumberRead;
3646
3646
  smoothZone?: EnhancedNumberRead;
3647
3647
  minOpacity?: EnhancedNumberRead;
3648
3648
  } | ReadEnhancement;
3649
3649
  polarAngleLimits?: {
3650
- min?: EnhancedNumberRead;
3651
- max?: EnhancedNumberRead;
3650
+ min: EnhancedNumberRead;
3651
+ max: EnhancedNumberRead;
3652
3652
  smoothZone?: EnhancedNumberRead;
3653
3653
  minOpacity?: EnhancedNumberRead;
3654
3654
  } | ReadEnhancement;
3655
3655
  distanceLimits?: {
3656
- min?: EnhancedNumberRead;
3657
- max?: EnhancedNumberRead;
3656
+ min: EnhancedNumberRead;
3657
+ max: EnhancedNumberRead;
3658
3658
  smoothZone?: EnhancedNumberRead;
3659
3659
  minOpacity?: EnhancedNumberRead;
3660
3660
  } | ReadEnhancement;
@@ -3684,20 +3684,20 @@ export interface DomainSpecification {
3684
3684
  screenOffsetHorizontal?: EnhancedNumberRead;
3685
3685
  screenOffsetVertical?: EnhancedNumberRead;
3686
3686
  azimuthAngleLimits?: {
3687
- min?: EnhancedNumberRead;
3688
- max?: EnhancedNumberRead;
3687
+ min: EnhancedNumberRead;
3688
+ max: EnhancedNumberRead;
3689
3689
  smoothZone?: EnhancedNumberRead;
3690
3690
  minOpacity?: EnhancedNumberRead;
3691
3691
  } | ReadEnhancement;
3692
3692
  polarAngleLimits?: {
3693
- min?: EnhancedNumberRead;
3694
- max?: EnhancedNumberRead;
3693
+ min: EnhancedNumberRead;
3694
+ max: EnhancedNumberRead;
3695
3695
  smoothZone?: EnhancedNumberRead;
3696
3696
  minOpacity?: EnhancedNumberRead;
3697
3697
  } | ReadEnhancement;
3698
3698
  distanceLimits?: {
3699
- min?: EnhancedNumberRead;
3700
- max?: EnhancedNumberRead;
3699
+ min: EnhancedNumberRead;
3700
+ max: EnhancedNumberRead;
3701
3701
  smoothZone?: EnhancedNumberRead;
3702
3702
  minOpacity?: EnhancedNumberRead;
3703
3703
  } | ReadEnhancement;
@@ -3722,20 +3722,20 @@ export interface DomainSpecification {
3722
3722
  screenOffsetHorizontal?: EnhancedNumberRead;
3723
3723
  screenOffsetVertical?: EnhancedNumberRead;
3724
3724
  azimuthAngleLimits?: {
3725
- min?: EnhancedNumberRead;
3726
- max?: EnhancedNumberRead;
3725
+ min: EnhancedNumberRead;
3726
+ max: EnhancedNumberRead;
3727
3727
  smoothZone?: EnhancedNumberRead;
3728
3728
  minOpacity?: EnhancedNumberRead;
3729
3729
  } | ReadEnhancement;
3730
3730
  polarAngleLimits?: {
3731
- min?: EnhancedNumberRead;
3732
- max?: EnhancedNumberRead;
3731
+ min: EnhancedNumberRead;
3732
+ max: EnhancedNumberRead;
3733
3733
  smoothZone?: EnhancedNumberRead;
3734
3734
  minOpacity?: EnhancedNumberRead;
3735
3735
  } | ReadEnhancement;
3736
3736
  distanceLimits?: {
3737
- min?: EnhancedNumberRead;
3738
- max?: EnhancedNumberRead;
3737
+ min: EnhancedNumberRead;
3738
+ max: EnhancedNumberRead;
3739
3739
  smoothZone?: EnhancedNumberRead;
3740
3740
  minOpacity?: EnhancedNumberRead;
3741
3741
  } | ReadEnhancement;
@@ -3759,20 +3759,20 @@ export interface DomainSpecification {
3759
3759
  screenOffsetHorizontal?: EnhancedNumberRead;
3760
3760
  screenOffsetVertical?: EnhancedNumberRead;
3761
3761
  azimuthAngleLimits?: {
3762
- min?: EnhancedNumberRead;
3763
- max?: EnhancedNumberRead;
3762
+ min: EnhancedNumberRead;
3763
+ max: EnhancedNumberRead;
3764
3764
  smoothZone?: EnhancedNumberRead;
3765
3765
  minOpacity?: EnhancedNumberRead;
3766
3766
  } | ReadEnhancement;
3767
3767
  polarAngleLimits?: {
3768
- min?: EnhancedNumberRead;
3769
- max?: EnhancedNumberRead;
3768
+ min: EnhancedNumberRead;
3769
+ max: EnhancedNumberRead;
3770
3770
  smoothZone?: EnhancedNumberRead;
3771
3771
  minOpacity?: EnhancedNumberRead;
3772
3772
  } | ReadEnhancement;
3773
3773
  distanceLimits?: {
3774
- min?: EnhancedNumberRead;
3775
- max?: EnhancedNumberRead;
3774
+ min: EnhancedNumberRead;
3775
+ max: EnhancedNumberRead;
3776
3776
  smoothZone?: EnhancedNumberRead;
3777
3777
  minOpacity?: EnhancedNumberRead;
3778
3778
  } | ReadEnhancement;
@@ -3799,20 +3799,20 @@ export interface DomainSpecification {
3799
3799
  screenOffsetHorizontal?: EnhancedNumberRead;
3800
3800
  screenOffsetVertical?: EnhancedNumberRead;
3801
3801
  azimuthAngleLimits?: {
3802
- min?: EnhancedNumberRead;
3803
- max?: EnhancedNumberRead;
3802
+ min: EnhancedNumberRead;
3803
+ max: EnhancedNumberRead;
3804
3804
  smoothZone?: EnhancedNumberRead;
3805
3805
  minOpacity?: EnhancedNumberRead;
3806
3806
  } | ReadEnhancement;
3807
3807
  polarAngleLimits?: {
3808
- min?: EnhancedNumberRead;
3809
- max?: EnhancedNumberRead;
3808
+ min: EnhancedNumberRead;
3809
+ max: EnhancedNumberRead;
3810
3810
  smoothZone?: EnhancedNumberRead;
3811
3811
  minOpacity?: EnhancedNumberRead;
3812
3812
  } | ReadEnhancement;
3813
3813
  distanceLimits?: {
3814
- min?: EnhancedNumberRead;
3815
- max?: EnhancedNumberRead;
3814
+ min: EnhancedNumberRead;
3815
+ max: EnhancedNumberRead;
3816
3816
  smoothZone?: EnhancedNumberRead;
3817
3817
  minOpacity?: EnhancedNumberRead;
3818
3818
  } | ReadEnhancement;
@@ -4539,9 +4539,8 @@ export interface DomainSpecification {
4539
4539
  id: string | ReadEnhancement;
4540
4540
  [k: string]: unknown;
4541
4541
  }[] | ReadEnhancement;
4542
- keepChildren?: EnhancedBooleanRead;
4543
- [k: string]: unknown;
4544
4542
  }[] | ReadEnhancement;
4543
+ keepChildren?: EnhancedBooleanRead;
4545
4544
  $filter?: ComponentSystemFilter;
4546
4545
  } | {
4547
4546
  $read: string;
@@ -4723,20 +4722,20 @@ export interface DomainSpecification {
4723
4722
  screenSized?: EnhancedBooleanRead;
4724
4723
  angleUnit?: ('degree' | 'radian') | ReadEnhancement;
4725
4724
  azimuthAngleLimits?: {
4726
- min?: EnhancedNumberRead;
4727
- max?: EnhancedNumberRead;
4725
+ min: EnhancedNumberRead;
4726
+ max: EnhancedNumberRead;
4728
4727
  smoothZone?: EnhancedNumberRead;
4729
4728
  minOpacity?: EnhancedNumberRead;
4730
4729
  } | ReadEnhancement;
4731
4730
  polarAngleLimits?: {
4732
- min?: EnhancedNumberRead;
4733
- max?: EnhancedNumberRead;
4731
+ min: EnhancedNumberRead;
4732
+ max: EnhancedNumberRead;
4734
4733
  smoothZone?: EnhancedNumberRead;
4735
4734
  minOpacity?: EnhancedNumberRead;
4736
4735
  } | ReadEnhancement;
4737
4736
  distanceLimits?: {
4738
- min?: EnhancedNumberRead;
4739
- max?: EnhancedNumberRead;
4737
+ min: EnhancedNumberRead;
4738
+ max: EnhancedNumberRead;
4740
4739
  smoothZone?: EnhancedNumberRead;
4741
4740
  minOpacity?: EnhancedNumberRead;
4742
4741
  } | ReadEnhancement;
@@ -4815,20 +4814,20 @@ export interface DomainSpecification {
4815
4814
  labelPrefix?: (string | EnhancedMessageDescriptor | MultilingualString) | ReadEnhancement;
4816
4815
  labelPrefixFontColor?: (string | number) | ReadEnhancement;
4817
4816
  azimuthAngleLimits?: {
4818
- min?: EnhancedNumberRead;
4819
- max?: EnhancedNumberRead;
4817
+ min: EnhancedNumberRead;
4818
+ max: EnhancedNumberRead;
4820
4819
  smoothZone?: EnhancedNumberRead;
4821
4820
  minOpacity?: EnhancedNumberRead;
4822
4821
  } | ReadEnhancement;
4823
4822
  polarAngleLimits?: {
4824
- min?: EnhancedNumberRead;
4825
- max?: EnhancedNumberRead;
4823
+ min: EnhancedNumberRead;
4824
+ max: EnhancedNumberRead;
4826
4825
  smoothZone?: EnhancedNumberRead;
4827
4826
  minOpacity?: EnhancedNumberRead;
4828
4827
  } | ReadEnhancement;
4829
4828
  distanceLimits?: {
4830
- min?: EnhancedNumberRead;
4831
- max?: EnhancedNumberRead;
4829
+ min: EnhancedNumberRead;
4830
+ max: EnhancedNumberRead;
4832
4831
  smoothZone?: EnhancedNumberRead;
4833
4832
  minOpacity?: EnhancedNumberRead;
4834
4833
  } | ReadEnhancement;
@@ -4973,20 +4972,20 @@ export interface DomainSpecification {
4973
4972
  }) | ReadEnhancement;
4974
4973
  } | ReadEnhancement;
4975
4974
  azimuthAngleLimits?: {
4976
- min?: EnhancedNumberRead;
4977
- max?: EnhancedNumberRead;
4975
+ min: EnhancedNumberRead;
4976
+ max: EnhancedNumberRead;
4978
4977
  smoothZone?: EnhancedNumberRead;
4979
4978
  minOpacity?: EnhancedNumberRead;
4980
4979
  } | ReadEnhancement;
4981
4980
  polarAngleLimits?: {
4982
- min?: EnhancedNumberRead;
4983
- max?: EnhancedNumberRead;
4981
+ min: EnhancedNumberRead;
4982
+ max: EnhancedNumberRead;
4984
4983
  smoothZone?: EnhancedNumberRead;
4985
4984
  minOpacity?: EnhancedNumberRead;
4986
4985
  } | ReadEnhancement;
4987
4986
  distanceLimits?: {
4988
- min?: EnhancedNumberRead;
4989
- max?: EnhancedNumberRead;
4987
+ min: EnhancedNumberRead;
4988
+ max: EnhancedNumberRead;
4990
4989
  smoothZone?: EnhancedNumberRead;
4991
4990
  minOpacity?: EnhancedNumberRead;
4992
4991
  } | ReadEnhancement;
@@ -5065,20 +5064,20 @@ export interface DomainSpecification {
5065
5064
  labelPrefix?: (string | EnhancedMessageDescriptor | MultilingualString) | ReadEnhancement;
5066
5065
  labelPrefixFontColor?: (string | number) | ReadEnhancement;
5067
5066
  azimuthAngleLimits?: {
5068
- min?: EnhancedNumberRead;
5069
- max?: EnhancedNumberRead;
5067
+ min: EnhancedNumberRead;
5068
+ max: EnhancedNumberRead;
5070
5069
  smoothZone?: EnhancedNumberRead;
5071
5070
  minOpacity?: EnhancedNumberRead;
5072
5071
  } | ReadEnhancement;
5073
5072
  polarAngleLimits?: {
5074
- min?: EnhancedNumberRead;
5075
- max?: EnhancedNumberRead;
5073
+ min: EnhancedNumberRead;
5074
+ max: EnhancedNumberRead;
5076
5075
  smoothZone?: EnhancedNumberRead;
5077
5076
  minOpacity?: EnhancedNumberRead;
5078
5077
  } | ReadEnhancement;
5079
5078
  distanceLimits?: {
5080
- min?: EnhancedNumberRead;
5081
- max?: EnhancedNumberRead;
5079
+ min: EnhancedNumberRead;
5080
+ max: EnhancedNumberRead;
5082
5081
  smoothZone?: EnhancedNumberRead;
5083
5082
  minOpacity?: EnhancedNumberRead;
5084
5083
  } | ReadEnhancement;
@@ -5157,20 +5156,20 @@ export interface DomainSpecification {
5157
5156
  labelPrefix?: (string | EnhancedMessageDescriptor | MultilingualString) | ReadEnhancement;
5158
5157
  labelPrefixFontColor?: (string | number) | ReadEnhancement;
5159
5158
  azimuthAngleLimits?: {
5160
- min?: EnhancedNumberRead;
5161
- max?: EnhancedNumberRead;
5159
+ min: EnhancedNumberRead;
5160
+ max: EnhancedNumberRead;
5162
5161
  smoothZone?: EnhancedNumberRead;
5163
5162
  minOpacity?: EnhancedNumberRead;
5164
5163
  } | ReadEnhancement;
5165
5164
  polarAngleLimits?: {
5166
- min?: EnhancedNumberRead;
5167
- max?: EnhancedNumberRead;
5165
+ min: EnhancedNumberRead;
5166
+ max: EnhancedNumberRead;
5168
5167
  smoothZone?: EnhancedNumberRead;
5169
5168
  minOpacity?: EnhancedNumberRead;
5170
5169
  } | ReadEnhancement;
5171
5170
  distanceLimits?: {
5172
- min?: EnhancedNumberRead;
5173
- max?: EnhancedNumberRead;
5171
+ min: EnhancedNumberRead;
5172
+ max: EnhancedNumberRead;
5174
5173
  smoothZone?: EnhancedNumberRead;
5175
5174
  minOpacity?: EnhancedNumberRead;
5176
5175
  } | ReadEnhancement;
@@ -5197,20 +5196,20 @@ export interface DomainSpecification {
5197
5196
  screenOffsetHorizontal?: EnhancedNumberRead;
5198
5197
  screenOffsetVertical?: EnhancedNumberRead;
5199
5198
  azimuthAngleLimits?: {
5200
- min?: EnhancedNumberRead;
5201
- max?: EnhancedNumberRead;
5199
+ min: EnhancedNumberRead;
5200
+ max: EnhancedNumberRead;
5202
5201
  smoothZone?: EnhancedNumberRead;
5203
5202
  minOpacity?: EnhancedNumberRead;
5204
5203
  } | ReadEnhancement;
5205
5204
  polarAngleLimits?: {
5206
- min?: EnhancedNumberRead;
5207
- max?: EnhancedNumberRead;
5205
+ min: EnhancedNumberRead;
5206
+ max: EnhancedNumberRead;
5208
5207
  smoothZone?: EnhancedNumberRead;
5209
5208
  minOpacity?: EnhancedNumberRead;
5210
5209
  } | ReadEnhancement;
5211
5210
  distanceLimits?: {
5212
- min?: EnhancedNumberRead;
5213
- max?: EnhancedNumberRead;
5211
+ min: EnhancedNumberRead;
5212
+ max: EnhancedNumberRead;
5214
5213
  smoothZone?: EnhancedNumberRead;
5215
5214
  minOpacity?: EnhancedNumberRead;
5216
5215
  } | ReadEnhancement;
@@ -1,2 +1,2 @@
1
1
  export declare const mergeClaudeMdContent: (existingContent: string | undefined) => string;
2
- export declare const claudeMdFile = "[PHOENIX-SDK-START]\n## Phoenix Configurator Project\n\nDeclarative 3D product configurator built with Phoenix SDK. Domain model defined in YAML, custom logic in TypeScript.\n\n## Build Commands\n- `pnpm phoenix build` \u2014 Full production build\n- `pnpm phoenix dev` \u2014 Development mode with hot reload\n- `pnpm phoenix sync` \u2014 Sync generated files without full build\n\n## Dev Logs\n- `pnpm phoenix dev` writes all logs to `.phoenix/phoenix-dev.log`\n- Contains: spec parse errors, build errors, browser runtime errors, file watcher events\n- After making changes, always check the log for errors: `tail -50 .phoenix/phoenix-dev.log` or `grep ERROR .phoenix/phoenix-dev.log`\n- Rotated automatically at 10MB (`.log.1`, `.log.2` are older rotations)\n\n## Project Structure\n- `spec/` \u2014 Domain YAML specs (entities, relations, expressions, invariants, components, application config)\n- `src/expressions/` \u2014 Computed/derived entity properties (`phx.domain.implementCustomExpressions()`)\n- `src/invariants/` \u2014 Business rule constraints (`phx.domain.implementCustomInvariants()`)\n- `src/transformers/` \u2014 Automatic state fixers (`phx.frontend.transformerBuilder`)\n- `src/components/` \u2014 ECS system components (`phx.domain.attachComponent.withEntity()`)\n- `src/elements/` \u2014 Page-level React components (`phx.frontend.createCustomPhoenixLayoutElement()`)\n - A layout element named `ConfiguratorLayout` replaces everything the built-in layout renders for a loaded configuration, finalization included, so prefer arranging the layout in the spec; when you register it, mount `LayoutSlots.SharedCanvas` (from `@salsita-ai/sdk/configurator`) in it, or the app loader stays on screen, and call `useSceneSafeArea()` (same import) with its `containerRef` on the element covering the whole canvas and its `safeAreaRef` on the region the layout's UI leaves free, so the camera frames the scene there, and to keep the spec's tabs, property pages, sidebar footer and assistant panel while moving them, mount `LayoutSlots.DesktopSidebar` (same import) in a positioned container that sets its size, with `side=\"start\"` when it is on the left\n - The hooks such a layout reads, with what each returns, are listed under \"Hooks for a Project Layout\" in `docs/phoenix/configurator-interface.mdx` (read it with `pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx`), and the `LayoutSlots` members in `docs/phoenix/layout-slots.mdx`; it finalizes over the spec's `finalizeAction` components, since `finalizePage` and `finalizeButton` are legacy\n- `src/handlers/` \u2014 Event & lifecycle handlers\n- `src/webhooks/` \u2014 Server-side webhook handlers (`phx.webhooks.*Builder`)\n- `src/migrations/` \u2014 Schema version migrations (v*.ts)\n- `src/locales/` \u2014 Locale catalogs (authored .po sources; compiled .ts, do not edit)\n- `src/admin/` \u2014 Admin interface (mirrors main src/ structure)\n- `src/_shared/` \u2014 Shared utilities (NOT auto-imported, requires explicit imports)\n- `.phoenix/` \u2014 Auto-generated files (DO NOT EDIT)\n- `public/` \u2014 Static assets (3D models, textures, images, HDRI maps, fonts)\n- `assets/` \u2014 Uploadable resources (PDF templates, email assets)\n\n## Architecture Principles\n- YAML-first: 99% of configuration in spec/*.yaml, custom code is last resort\n- ECS pattern: entities (domain objects) + components (behavior/UI) + systems (SDK runtime)\n- Reactive state: immutable domain state flows through RxJS pipelines\n- Data binding: `$read` (read-only), `$write` (write-only), `$bind` (bidirectional) connect components to domain\n- memoEval: all component implementations must use memoEval for stable object references\n\n## Key Patterns\n- Expressions = computed properties on entities (prefix: `$`), implemented per-entity in src/expressions/\n- Invariants = validation rules returning violations, static or dynamic\n- Transformers = auto-fixers maintaining consistency after state changes\n- Components defined in YAML with `$read`/`$bind` bindings, or custom in src/components/ using attachComponent builder\n- Webhooks = server-side finalization tasks (PDF, email, CSV, image rendering)\n- Filters = contextual component activation via navigationStates, viewStates, modes, selectedEntityIds\n\n## File Conventions\n- Components: PascalCase (.tsx)\n- Utilities: kebab-case (.ts)\n- Expressions: entity-name.ts\n- Migrations: v*.ts (sequential)\n- Specs: kebab-case.yaml\n- Underscore folders (_shared/, _utils/) are NOT auto-imported\n\n## Export Rules\nAll files in src/expressions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.\n\n## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.\n\n## Do Not Edit\n- `.phoenix/` directory \u2014 completely regenerated on each build\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files \u2014 compiled from .po files\n\n## Code Review\nUse `/review` command to review code changes before committing.\n\n## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` \u2014 Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` \u2014 Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` \u2014 Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` \u2014 Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` \u2014 List docs in a category\n- `pnpm phoenix docs -l` \u2014 List all doc paths with titles\n\n### 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`\n\n### Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (default: `./screenshot.png`)\n- `--width, -w` \u2014 Width in pixels (default: 1920)\n- `--height` \u2014 Height in pixels (default: 1080)\n- `--format, -f` \u2014 Image format: PNG or JPEG (default: PNG)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders\n\n### Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--sections, -s` \u2014 Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` \u2014 domain data loaded\n- `domainContextReady` \u2014 domain context initialized (entities available)\n- `configuratorReady` \u2014 3D configurator initialized\n- `sessionAuthenticated` \u2014 session service active\n- `editorMode` \u2014 editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation\n\n### Inspect: Data\n\nGet the current editor context data as JSON via `pnpm phoenix inspect:data`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** publishedData, frontendData, backendData, sessionData, accessData, webComponentProperties\n\n**Example:** `pnpm phoenix inspect:data -o ./data.json`\n\n**Tips:** Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:data | head -30`).\n\n**Use cases:** AI agent context, debugging published/session/access data\n\n### Inspect: Scene\n\nGet the current Three.js scene graph as JSON via `pnpm phoenix inspect:scene`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** Recursive scene tree with per-node: name, type, visible, position, rotation, scale, userData (entityId), and for meshes: geometry name, bounding box, material properties (color, metalness, roughness, opacity, textures), morph target influences. Lights include color, intensity, and type-specific properties.\n\n**Example:** `pnpm phoenix inspect:scene -o ./scene.json`\n\n**Tips:** Scene graphs can be large. Pipe through `head`/`tail` for partial output.\n\n**Use cases:** AI agent context, debugging 3D scene layout, inspecting materials and lighting\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` \u2014 Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` \u2014 End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` \u2014 Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` \u2014 ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` \u2014 Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` \u2014 YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` \u2014 Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` \u2014 Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` \u2014 Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` \u2014 Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` \u2014 Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \"camera\"`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep \"example\"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep \"camera\"`\n5. Search generated files directly when needed: `grep -rn \"camera\" \"$(pnpm phoenix docs --dir)\"`\n6. Browse a topic area: `pnpm phoenix docs -c \"Layouts\"`\n\n### Playwright MCP Setup (for AI agents)\n\nTo interact with the 3D configurator in a browser, Playwright MCP needs GPU-enabled flags for WebGL rendering. Add to `~/.claude/.mcp.json`:\n\n```json\n{\n \"mcpServers\": {\n \"playwright\": {\n \"command\": \"npx\",\n \"args\": [\n \"@playwright/mcp@latest\",\n \"--headed\",\n \"--launch-options\",\n \"{\\\"args\\\":[\\\"--use-gl=swiftshader\\\",\\\"--enable-webgl\\\",\\\"--ignore-gpu-blocklist\\\"]}\"\n ]\n }\n }\n}\n```\n\nKey flags:\n- `--headed` \u2014 visible browser (required for GPU rendering)\n- `--use-gl=swiftshader` \u2014 software GPU fallback for environments without a physical GPU\n- `--enable-webgl` + `--ignore-gpu-blocklist` \u2014 ensure WebGL is available\n[PHOENIX-SDK-END]\n";
2
+ export declare const claudeMdFile = "[PHOENIX-SDK-START]\n## Phoenix Configurator Project\n\nDeclarative 3D product configurator built with Phoenix SDK. Domain model defined in YAML, custom logic in TypeScript.\n\n## Build Commands\n- `pnpm phoenix build` \u2014 Full production build\n- `pnpm phoenix dev` \u2014 Development mode with hot reload\n- `pnpm phoenix sync` \u2014 Sync generated files without full build\n\n## Dev Logs\n- `pnpm phoenix dev` writes all logs to `.phoenix/phoenix-dev.log`\n- Contains: spec parse errors, build errors, browser runtime errors, file watcher events\n- After making changes, always check the log for errors: `tail -50 .phoenix/phoenix-dev.log` or `grep ERROR .phoenix/phoenix-dev.log`\n- Rotated automatically at 10MB (`.log.1`, `.log.2` are older rotations)\n\n## Project Structure\n- `spec/` \u2014 Domain YAML specs (entities, relations, expressions, invariants, components, application config)\n- `src/expressions/` \u2014 Computed/derived entity properties (`phx.domain.implementCustomExpressions()`)\n- `src/invariants/` \u2014 Business rule constraints (`phx.domain.implementCustomInvariants()`)\n- `src/transformers/` \u2014 Automatic state fixers (`phx.frontend.transformerBuilder`)\n- `src/components/` \u2014 ECS system components (`phx.domain.attachComponent.withEntity()`)\n- `src/elements/` \u2014 Page-level React components (`phx.frontend.createCustomPhoenixLayoutElement()`)\n - `ConfiguratorLayout`: a layout element with this name replaces everything the built-in layout renders for a loaded configuration, in owner and read mode, finalization included. Prefer arranging the spec's layout components; write one for shell-level changes, such as moving the sidebar or adding an area the built-in layout has no place for\n - Mount `LayoutSlots.SharedCanvas` (from `@salsita-ai/sdk/configurator`) in a positioned root covering the page, or the app loader stays on screen; put the UI above it, positioned and after it in the markup. Call `useSceneSafeArea()` (same import) and put `containerRef` on the element covering the whole canvas and `safeAreaRef` on the region the UI leaves free, with `pointerEvents: 'none'`, so the camera frames the scene there\n - Sidebar moved, contents as the spec configures them: mount `LayoutSlots.DesktopSidebar` in a positioned container that sets its size, with `side=\"start\"` on the left; `docs/layouts/sidebar/in-a-custom-layout.mdx` is the whole layout\n - Your own UI: \"Hooks for a Project Layout\" in `docs/phoenix/configurator-interface.mdx` lists the hooks with what each returns (`pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx`), `docs/phoenix/layout-slots.mdx` the built-in pieces you can still mount, and `docs/layouts/custom-layout.mdx` is a worked example\n - Messages: mount `LayoutSlots.Services` for the built-in snackbars, or show violations, side-effect hints and errors yourself with `phx.frontend.useConfiguratorMessages(onMessage)`, not both. Either way mount a snackbar root (`LayoutSlots.DesktopSnackbarsRoot` or `LayoutSlots.MobileSnackbarsRoot`): save and built-in action errors are always snackbars\n - Finalize over the spec's `finalizeAction` components, each naming a handler registered with `phx.frontend.createPhoenixHandler`: run each with `phx.frontend.useFinalizeAction(handler)` in a component of its own wrapped in `PhoenixHandlerBoundary` (from `@salsita-ai/sdk/react`), or mount `FinalizeActions` (from `@salsita-ai/sdk/configurator`) for the built-in buttons. `finalizePage` and `finalizeButton` are legacy\n - Read mode and fullscreen are the layout's job, no hook enforces them: hide what a viewer must not change while `phx.frontend.useAccessService().accessInfo.viewMode` is `true`, and remove panels while `phx.frontend.useIsFullscreenActive()` is set; `phx.frontend.useSetFullscreen()` returns its setter\n- `src/handlers/` \u2014 Event & lifecycle handlers\n- `src/webhooks/` \u2014 Server-side webhook handlers (`phx.webhooks.*Builder`)\n- `src/migrations/` \u2014 Schema version migrations (v*.ts)\n- `src/locales/` \u2014 Locale catalogs (authored .po sources; compiled .ts, do not edit)\n- `src/admin/` \u2014 Admin interface (mirrors main src/ structure)\n- `src/_shared/` \u2014 Shared utilities (NOT auto-imported, requires explicit imports)\n- `.phoenix/` \u2014 Auto-generated files (DO NOT EDIT)\n- `public/` \u2014 Static assets (3D models, textures, images, HDRI maps, fonts)\n- `assets/` \u2014 Uploadable resources (PDF templates, email assets)\n\n## Architecture Principles\n- YAML-first: 99% of configuration in spec/*.yaml, custom code is last resort\n- ECS pattern: entities (domain objects) + components (behavior/UI) + systems (SDK runtime)\n- Reactive state: immutable domain state flows through RxJS pipelines\n- Data binding: `$read` (read-only), `$write` (write-only), `$bind` (bidirectional) connect components to domain\n- memoEval: all component implementations must use memoEval for stable object references\n\n## Key Patterns\n- Expressions = computed properties on entities (prefix: `$`), implemented per-entity in src/expressions/\n- Invariants = validation rules returning violations, static or dynamic\n- Transformers = auto-fixers maintaining consistency after state changes\n- Components defined in YAML with `$read`/`$bind` bindings, or custom in src/components/ using attachComponent builder\n- Webhooks = server-side finalization tasks (PDF, email, CSV, image rendering)\n- Filters = contextual component activation via navigationStates, viewStates, modes, selectedEntityIds\n\n## File Conventions\n- Components: PascalCase (.tsx)\n- Utilities: kebab-case (.ts)\n- Expressions: entity-name.ts\n- Migrations: v*.ts (sequential)\n- Specs: kebab-case.yaml\n- Underscore folders (_shared/, _utils/) are NOT auto-imported\n\n## Export Rules\nAll files in src/expressions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.\n\n## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.\n\n## Do Not Edit\n- `.phoenix/` directory \u2014 completely regenerated on each build\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files \u2014 compiled from .po files\n\n## Code Review\nUse `/review` command to review code changes before committing.\n\n## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` \u2014 Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` \u2014 Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` \u2014 Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` \u2014 Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` \u2014 List docs in a category\n- `pnpm phoenix docs -l` \u2014 List all doc paths with titles\n\n### 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`\n\n### Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (default: `./screenshot.png`)\n- `--width, -w` \u2014 Width in pixels (default: 1920)\n- `--height` \u2014 Height in pixels (default: 1080)\n- `--format, -f` \u2014 Image format: PNG or JPEG (default: PNG)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders\n\n### Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--sections, -s` \u2014 Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` \u2014 domain data loaded\n- `domainContextReady` \u2014 domain context initialized (entities available)\n- `configuratorReady` \u2014 3D configurator initialized\n- `sessionAuthenticated` \u2014 session service active\n- `editorMode` \u2014 editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation\n\n### Inspect: Data\n\nGet the current editor context data as JSON via `pnpm phoenix inspect:data`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** publishedData, frontendData, backendData, sessionData, accessData, webComponentProperties\n\n**Example:** `pnpm phoenix inspect:data -o ./data.json`\n\n**Tips:** Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:data | head -30`).\n\n**Use cases:** AI agent context, debugging published/session/access data\n\n### Inspect: Scene\n\nGet the current Three.js scene graph as JSON via `pnpm phoenix inspect:scene`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** Recursive scene tree with per-node: name, type, visible, position, rotation, scale, userData (entityId), and for meshes: geometry name, bounding box, material properties (color, metalness, roughness, opacity, textures), morph target influences. Lights include color, intensity, and type-specific properties.\n\n**Example:** `pnpm phoenix inspect:scene -o ./scene.json`\n\n**Tips:** Scene graphs can be large. Pipe through `head`/`tail` for partial output.\n\n**Use cases:** AI agent context, debugging 3D scene layout, inspecting materials and lighting\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` \u2014 Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` \u2014 End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` \u2014 Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` \u2014 ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` \u2014 Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` \u2014 YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` \u2014 Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` \u2014 Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` \u2014 Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` \u2014 Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` \u2014 Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \"camera\"`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep \"example\"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep \"camera\"`\n5. Search generated files directly when needed: `grep -rn \"camera\" \"$(pnpm phoenix docs --dir)\"`\n6. Browse a topic area: `pnpm phoenix docs -c \"Layouts\"`\n\n### Playwright MCP Setup (for AI agents)\n\nTo interact with the 3D configurator in a browser, Playwright MCP needs GPU-enabled flags for WebGL rendering. Add to `~/.claude/.mcp.json`:\n\n```json\n{\n \"mcpServers\": {\n \"playwright\": {\n \"command\": \"npx\",\n \"args\": [\n \"@playwright/mcp@latest\",\n \"--headed\",\n \"--launch-options\",\n \"{\\\"args\\\":[\\\"--use-gl=swiftshader\\\",\\\"--enable-webgl\\\",\\\"--ignore-gpu-blocklist\\\"]}\"\n ]\n }\n }\n}\n```\n\nKey flags:\n- `--headed` \u2014 visible browser (required for GPU rendering)\n- `--use-gl=swiftshader` \u2014 software GPU fallback for environments without a physical GPU\n- `--enable-webgl` + `--ignore-gpu-blocklist` \u2014 ensure WebGL is available\n[PHOENIX-SDK-END]\n";
@@ -1,2 +1,2 @@
1
1
  export declare const mergeCursorRulesContent: (existingContent: string | undefined) => string;
2
- export declare const cursorRulesFile = "---\ndescription: Phoenix SDK project rules\nglobs:\nalwaysApply: true\n---\n\n[PHOENIX-SDK-START]\n## Phoenix Configurator Project\n\nDeclarative 3D product configurator built with Phoenix SDK. Domain model defined in YAML, custom logic in TypeScript.\n\n## Build Commands\n- `pnpm phoenix build` \u2014 Full production build\n- `pnpm phoenix dev` \u2014 Development mode with hot reload\n- `pnpm phoenix sync` \u2014 Sync generated files without full build\n\n## Dev Logs\n- `pnpm phoenix dev` writes all logs to `.phoenix/phoenix-dev.log`\n- Contains: spec parse errors, build errors, browser runtime errors, file watcher events\n- After making changes, always check the log for errors: `tail -50 .phoenix/phoenix-dev.log` or `grep ERROR .phoenix/phoenix-dev.log`\n- Rotated automatically at 10MB (`.log.1`, `.log.2` are older rotations)\n\n## Project Structure\n- `spec/` \u2014 Domain YAML specs (entities, relations, expressions, invariants, components, application config)\n- `src/expressions/` \u2014 Computed/derived entity properties (`phx.domain.implementCustomExpressions()`)\n- `src/invariants/` \u2014 Business rule constraints (`phx.domain.implementCustomInvariants()`)\n- `src/transformers/` \u2014 Automatic state fixers (`phx.frontend.transformerBuilder`)\n- `src/components/` \u2014 ECS system components (`phx.domain.attachComponent.withEntity()`)\n- `src/elements/` \u2014 Page-level React components (`phx.frontend.createCustomPhoenixLayoutElement()`)\n - A layout element named `ConfiguratorLayout` replaces everything the built-in layout renders for a loaded configuration, finalization included, so prefer arranging the layout in the spec; when you register it, mount `LayoutSlots.SharedCanvas` (from `@salsita-ai/sdk/configurator`) in it, or the app loader stays on screen, and call `useSceneSafeArea()` (same import) with its `containerRef` on the element covering the whole canvas and its `safeAreaRef` on the region the layout's UI leaves free, so the camera frames the scene there, and to keep the spec's tabs, property pages, sidebar footer and assistant panel while moving them, mount `LayoutSlots.DesktopSidebar` (same import) in a positioned container that sets its size, with `side=\"start\"` when it is on the left\n - The hooks such a layout reads, with what each returns, are listed under \"Hooks for a Project Layout\" in `docs/phoenix/configurator-interface.mdx` (read it with `pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx`), and the `LayoutSlots` members in `docs/phoenix/layout-slots.mdx`; it finalizes over the spec's `finalizeAction` components, since `finalizePage` and `finalizeButton` are legacy\n- `src/handlers/` \u2014 Event & lifecycle handlers\n- `src/webhooks/` \u2014 Server-side webhook handlers (`phx.webhooks.*Builder`)\n- `src/migrations/` \u2014 Schema version migrations (v*.ts)\n- `src/locales/` \u2014 Locale catalogs (authored .po sources; compiled .ts, do not edit)\n- `src/admin/` \u2014 Admin interface (mirrors main src/ structure)\n- `src/_shared/` \u2014 Shared utilities (NOT auto-imported, requires explicit imports)\n- `.phoenix/` \u2014 Auto-generated files (DO NOT EDIT)\n- `public/` \u2014 Static assets (3D models, textures, images, HDRI maps, fonts)\n- `assets/` \u2014 Uploadable resources (PDF templates, email assets)\n\n## Architecture Principles\n- YAML-first: 99% of configuration in spec/*.yaml, custom code is last resort\n- ECS pattern: entities (domain objects) + components (behavior/UI) + systems (SDK runtime)\n- Reactive state: immutable domain state flows through RxJS pipelines\n- Data binding: `$read` (read-only), `$write` (write-only), `$bind` (bidirectional) connect components to domain\n- memoEval: all component implementations must use memoEval for stable object references\n\n## Key Patterns\n- Expressions = computed properties on entities (prefix: `$`), implemented per-entity in src/expressions/\n- Invariants = validation rules returning violations, static or dynamic\n- Transformers = auto-fixers maintaining consistency after state changes\n- Components defined in YAML with `$read`/`$bind` bindings, or custom in src/components/ using attachComponent builder\n- Webhooks = server-side finalization tasks (PDF, email, CSV, image rendering)\n- Filters = contextual component activation via navigationStates, viewStates, modes, selectedEntityIds\n\n## File Conventions\n- Components: PascalCase (.tsx)\n- Utilities: kebab-case (.ts)\n- Expressions: entity-name.ts\n- Migrations: v*.ts (sequential)\n- Specs: kebab-case.yaml\n- Underscore folders (_shared/, _utils/) are NOT auto-imported\n\n## Export Rules\nAll files in src/expressions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.\n\n## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.\n\n## Do Not Edit\n- `.phoenix/` directory \u2014 completely regenerated on each build\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files \u2014 compiled from .po files\n\n## Code Review\nUse `/review` command to review code changes before committing.\n\n## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` \u2014 Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` \u2014 Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` \u2014 Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` \u2014 Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` \u2014 List docs in a category\n- `pnpm phoenix docs -l` \u2014 List all doc paths with titles\n\n### 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`\n\n### Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (default: `./screenshot.png`)\n- `--width, -w` \u2014 Width in pixels (default: 1920)\n- `--height` \u2014 Height in pixels (default: 1080)\n- `--format, -f` \u2014 Image format: PNG or JPEG (default: PNG)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders\n\n### Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--sections, -s` \u2014 Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` \u2014 domain data loaded\n- `domainContextReady` \u2014 domain context initialized (entities available)\n- `configuratorReady` \u2014 3D configurator initialized\n- `sessionAuthenticated` \u2014 session service active\n- `editorMode` \u2014 editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation\n\n### Inspect: Data\n\nGet the current editor context data as JSON via `pnpm phoenix inspect:data`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** publishedData, frontendData, backendData, sessionData, accessData, webComponentProperties\n\n**Example:** `pnpm phoenix inspect:data -o ./data.json`\n\n**Tips:** Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:data | head -30`).\n\n**Use cases:** AI agent context, debugging published/session/access data\n\n### Inspect: Scene\n\nGet the current Three.js scene graph as JSON via `pnpm phoenix inspect:scene`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** Recursive scene tree with per-node: name, type, visible, position, rotation, scale, userData (entityId), and for meshes: geometry name, bounding box, material properties (color, metalness, roughness, opacity, textures), morph target influences. Lights include color, intensity, and type-specific properties.\n\n**Example:** `pnpm phoenix inspect:scene -o ./scene.json`\n\n**Tips:** Scene graphs can be large. Pipe through `head`/`tail` for partial output.\n\n**Use cases:** AI agent context, debugging 3D scene layout, inspecting materials and lighting\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` \u2014 Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` \u2014 End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` \u2014 Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` \u2014 ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` \u2014 Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` \u2014 YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` \u2014 Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` \u2014 Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` \u2014 Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` \u2014 Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` \u2014 Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \"camera\"`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep \"example\"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep \"camera\"`\n5. Search generated files directly when needed: `grep -rn \"camera\" \"$(pnpm phoenix docs --dir)\"`\n6. Browse a topic area: `pnpm phoenix docs -c \"Layouts\"`\n\n### Playwright MCP Setup (for AI agents)\n\nTo interact with the 3D configurator in a browser, Playwright MCP needs GPU-enabled flags for WebGL rendering. Add to `~/.claude/.mcp.json`:\n\n```json\n{\n \"mcpServers\": {\n \"playwright\": {\n \"command\": \"npx\",\n \"args\": [\n \"@playwright/mcp@latest\",\n \"--headed\",\n \"--launch-options\",\n \"{\\\"args\\\":[\\\"--use-gl=swiftshader\\\",\\\"--enable-webgl\\\",\\\"--ignore-gpu-blocklist\\\"]}\"\n ]\n }\n }\n}\n```\n\nKey flags:\n- `--headed` \u2014 visible browser (required for GPU rendering)\n- `--use-gl=swiftshader` \u2014 software GPU fallback for environments without a physical GPU\n- `--enable-webgl` + `--ignore-gpu-blocklist` \u2014 ensure WebGL is available\n[PHOENIX-SDK-END]\n";
2
+ export declare const cursorRulesFile = "---\ndescription: Phoenix SDK project rules\nglobs:\nalwaysApply: true\n---\n\n[PHOENIX-SDK-START]\n## Phoenix Configurator Project\n\nDeclarative 3D product configurator built with Phoenix SDK. Domain model defined in YAML, custom logic in TypeScript.\n\n## Build Commands\n- `pnpm phoenix build` \u2014 Full production build\n- `pnpm phoenix dev` \u2014 Development mode with hot reload\n- `pnpm phoenix sync` \u2014 Sync generated files without full build\n\n## Dev Logs\n- `pnpm phoenix dev` writes all logs to `.phoenix/phoenix-dev.log`\n- Contains: spec parse errors, build errors, browser runtime errors, file watcher events\n- After making changes, always check the log for errors: `tail -50 .phoenix/phoenix-dev.log` or `grep ERROR .phoenix/phoenix-dev.log`\n- Rotated automatically at 10MB (`.log.1`, `.log.2` are older rotations)\n\n## Project Structure\n- `spec/` \u2014 Domain YAML specs (entities, relations, expressions, invariants, components, application config)\n- `src/expressions/` \u2014 Computed/derived entity properties (`phx.domain.implementCustomExpressions()`)\n- `src/invariants/` \u2014 Business rule constraints (`phx.domain.implementCustomInvariants()`)\n- `src/transformers/` \u2014 Automatic state fixers (`phx.frontend.transformerBuilder`)\n- `src/components/` \u2014 ECS system components (`phx.domain.attachComponent.withEntity()`)\n- `src/elements/` \u2014 Page-level React components (`phx.frontend.createCustomPhoenixLayoutElement()`)\n - `ConfiguratorLayout`: a layout element with this name replaces everything the built-in layout renders for a loaded configuration, in owner and read mode, finalization included. Prefer arranging the spec's layout components; write one for shell-level changes, such as moving the sidebar or adding an area the built-in layout has no place for\n - Mount `LayoutSlots.SharedCanvas` (from `@salsita-ai/sdk/configurator`) in a positioned root covering the page, or the app loader stays on screen; put the UI above it, positioned and after it in the markup. Call `useSceneSafeArea()` (same import) and put `containerRef` on the element covering the whole canvas and `safeAreaRef` on the region the UI leaves free, with `pointerEvents: 'none'`, so the camera frames the scene there\n - Sidebar moved, contents as the spec configures them: mount `LayoutSlots.DesktopSidebar` in a positioned container that sets its size, with `side=\"start\"` on the left; `docs/layouts/sidebar/in-a-custom-layout.mdx` is the whole layout\n - Your own UI: \"Hooks for a Project Layout\" in `docs/phoenix/configurator-interface.mdx` lists the hooks with what each returns (`pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx`), `docs/phoenix/layout-slots.mdx` the built-in pieces you can still mount, and `docs/layouts/custom-layout.mdx` is a worked example\n - Messages: mount `LayoutSlots.Services` for the built-in snackbars, or show violations, side-effect hints and errors yourself with `phx.frontend.useConfiguratorMessages(onMessage)`, not both. Either way mount a snackbar root (`LayoutSlots.DesktopSnackbarsRoot` or `LayoutSlots.MobileSnackbarsRoot`): save and built-in action errors are always snackbars\n - Finalize over the spec's `finalizeAction` components, each naming a handler registered with `phx.frontend.createPhoenixHandler`: run each with `phx.frontend.useFinalizeAction(handler)` in a component of its own wrapped in `PhoenixHandlerBoundary` (from `@salsita-ai/sdk/react`), or mount `FinalizeActions` (from `@salsita-ai/sdk/configurator`) for the built-in buttons. `finalizePage` and `finalizeButton` are legacy\n - Read mode and fullscreen are the layout's job, no hook enforces them: hide what a viewer must not change while `phx.frontend.useAccessService().accessInfo.viewMode` is `true`, and remove panels while `phx.frontend.useIsFullscreenActive()` is set; `phx.frontend.useSetFullscreen()` returns its setter\n- `src/handlers/` \u2014 Event & lifecycle handlers\n- `src/webhooks/` \u2014 Server-side webhook handlers (`phx.webhooks.*Builder`)\n- `src/migrations/` \u2014 Schema version migrations (v*.ts)\n- `src/locales/` \u2014 Locale catalogs (authored .po sources; compiled .ts, do not edit)\n- `src/admin/` \u2014 Admin interface (mirrors main src/ structure)\n- `src/_shared/` \u2014 Shared utilities (NOT auto-imported, requires explicit imports)\n- `.phoenix/` \u2014 Auto-generated files (DO NOT EDIT)\n- `public/` \u2014 Static assets (3D models, textures, images, HDRI maps, fonts)\n- `assets/` \u2014 Uploadable resources (PDF templates, email assets)\n\n## Architecture Principles\n- YAML-first: 99% of configuration in spec/*.yaml, custom code is last resort\n- ECS pattern: entities (domain objects) + components (behavior/UI) + systems (SDK runtime)\n- Reactive state: immutable domain state flows through RxJS pipelines\n- Data binding: `$read` (read-only), `$write` (write-only), `$bind` (bidirectional) connect components to domain\n- memoEval: all component implementations must use memoEval for stable object references\n\n## Key Patterns\n- Expressions = computed properties on entities (prefix: `$`), implemented per-entity in src/expressions/\n- Invariants = validation rules returning violations, static or dynamic\n- Transformers = auto-fixers maintaining consistency after state changes\n- Components defined in YAML with `$read`/`$bind` bindings, or custom in src/components/ using attachComponent builder\n- Webhooks = server-side finalization tasks (PDF, email, CSV, image rendering)\n- Filters = contextual component activation via navigationStates, viewStates, modes, selectedEntityIds\n\n## File Conventions\n- Components: PascalCase (.tsx)\n- Utilities: kebab-case (.ts)\n- Expressions: entity-name.ts\n- Migrations: v*.ts (sequential)\n- Specs: kebab-case.yaml\n- Underscore folders (_shared/, _utils/) are NOT auto-imported\n\n## Export Rules\nAll files in src/expressions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.\n\n## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.\n\n## Do Not Edit\n- `.phoenix/` directory \u2014 completely regenerated on each build\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files \u2014 compiled from .po files\n\n## Code Review\nUse `/review` command to review code changes before committing.\n\n## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` \u2014 Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` \u2014 Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` \u2014 Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` \u2014 Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` \u2014 List docs in a category\n- `pnpm phoenix docs -l` \u2014 List all doc paths with titles\n\n### 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`\n\n### Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (default: `./screenshot.png`)\n- `--width, -w` \u2014 Width in pixels (default: 1920)\n- `--height` \u2014 Height in pixels (default: 1080)\n- `--format, -f` \u2014 Image format: PNG or JPEG (default: PNG)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders\n\n### Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--sections, -s` \u2014 Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` \u2014 domain data loaded\n- `domainContextReady` \u2014 domain context initialized (entities available)\n- `configuratorReady` \u2014 3D configurator initialized\n- `sessionAuthenticated` \u2014 session service active\n- `editorMode` \u2014 editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation\n\n### Inspect: Data\n\nGet the current editor context data as JSON via `pnpm phoenix inspect:data`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** publishedData, frontendData, backendData, sessionData, accessData, webComponentProperties\n\n**Example:** `pnpm phoenix inspect:data -o ./data.json`\n\n**Tips:** Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:data | head -30`).\n\n**Use cases:** AI agent context, debugging published/session/access data\n\n### Inspect: Scene\n\nGet the current Three.js scene graph as JSON via `pnpm phoenix inspect:scene`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** Recursive scene tree with per-node: name, type, visible, position, rotation, scale, userData (entityId), and for meshes: geometry name, bounding box, material properties (color, metalness, roughness, opacity, textures), morph target influences. Lights include color, intensity, and type-specific properties.\n\n**Example:** `pnpm phoenix inspect:scene -o ./scene.json`\n\n**Tips:** Scene graphs can be large. Pipe through `head`/`tail` for partial output.\n\n**Use cases:** AI agent context, debugging 3D scene layout, inspecting materials and lighting\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` \u2014 Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` \u2014 End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` \u2014 Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` \u2014 ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` \u2014 Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` \u2014 YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` \u2014 Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` \u2014 Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` \u2014 Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` \u2014 Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` \u2014 Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \"camera\"`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep \"example\"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep \"camera\"`\n5. Search generated files directly when needed: `grep -rn \"camera\" \"$(pnpm phoenix docs --dir)\"`\n6. Browse a topic area: `pnpm phoenix docs -c \"Layouts\"`\n\n### Playwright MCP Setup (for AI agents)\n\nTo interact with the 3D configurator in a browser, Playwright MCP needs GPU-enabled flags for WebGL rendering. Add to `~/.claude/.mcp.json`:\n\n```json\n{\n \"mcpServers\": {\n \"playwright\": {\n \"command\": \"npx\",\n \"args\": [\n \"@playwright/mcp@latest\",\n \"--headed\",\n \"--launch-options\",\n \"{\\\"args\\\":[\\\"--use-gl=swiftshader\\\",\\\"--enable-webgl\\\",\\\"--ignore-gpu-blocklist\\\"]}\"\n ]\n }\n }\n}\n```\n\nKey flags:\n- `--headed` \u2014 visible browser (required for GPU rendering)\n- `--use-gl=swiftshader` \u2014 software GPU fallback for environments without a physical GPU\n- `--enable-webgl` + `--ignore-gpu-blocklist` \u2014 ensure WebGL is available\n[PHOENIX-SDK-END]\n";
@@ -1 +1 @@
1
- export declare const sdkContent = "[PHOENIX-SDK-START]\n## Phoenix Configurator Project\n\nDeclarative 3D product configurator built with Phoenix SDK. Domain model defined in YAML, custom logic in TypeScript.\n\n## Build Commands\n- `pnpm phoenix build` \u2014 Full production build\n- `pnpm phoenix dev` \u2014 Development mode with hot reload\n- `pnpm phoenix sync` \u2014 Sync generated files without full build\n\n## Dev Logs\n- `pnpm phoenix dev` writes all logs to `.phoenix/phoenix-dev.log`\n- Contains: spec parse errors, build errors, browser runtime errors, file watcher events\n- After making changes, always check the log for errors: `tail -50 .phoenix/phoenix-dev.log` or `grep ERROR .phoenix/phoenix-dev.log`\n- Rotated automatically at 10MB (`.log.1`, `.log.2` are older rotations)\n\n## Project Structure\n- `spec/` \u2014 Domain YAML specs (entities, relations, expressions, invariants, components, application config)\n- `src/expressions/` \u2014 Computed/derived entity properties (`phx.domain.implementCustomExpressions()`)\n- `src/invariants/` \u2014 Business rule constraints (`phx.domain.implementCustomInvariants()`)\n- `src/transformers/` \u2014 Automatic state fixers (`phx.frontend.transformerBuilder`)\n- `src/components/` \u2014 ECS system components (`phx.domain.attachComponent.withEntity()`)\n- `src/elements/` \u2014 Page-level React components (`phx.frontend.createCustomPhoenixLayoutElement()`)\n - A layout element named `ConfiguratorLayout` replaces everything the built-in layout renders for a loaded configuration, finalization included, so prefer arranging the layout in the spec; when you register it, mount `LayoutSlots.SharedCanvas` (from `@salsita-ai/sdk/configurator`) in it, or the app loader stays on screen, and call `useSceneSafeArea()` (same import) with its `containerRef` on the element covering the whole canvas and its `safeAreaRef` on the region the layout's UI leaves free, so the camera frames the scene there, and to keep the spec's tabs, property pages, sidebar footer and assistant panel while moving them, mount `LayoutSlots.DesktopSidebar` (same import) in a positioned container that sets its size, with `side=\"start\"` when it is on the left\n - The hooks such a layout reads, with what each returns, are listed under \"Hooks for a Project Layout\" in `docs/phoenix/configurator-interface.mdx` (read it with `pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx`), and the `LayoutSlots` members in `docs/phoenix/layout-slots.mdx`; it finalizes over the spec's `finalizeAction` components, since `finalizePage` and `finalizeButton` are legacy\n- `src/handlers/` \u2014 Event & lifecycle handlers\n- `src/webhooks/` \u2014 Server-side webhook handlers (`phx.webhooks.*Builder`)\n- `src/migrations/` \u2014 Schema version migrations (v*.ts)\n- `src/locales/` \u2014 Locale catalogs (authored .po sources; compiled .ts, do not edit)\n- `src/admin/` \u2014 Admin interface (mirrors main src/ structure)\n- `src/_shared/` \u2014 Shared utilities (NOT auto-imported, requires explicit imports)\n- `.phoenix/` \u2014 Auto-generated files (DO NOT EDIT)\n- `public/` \u2014 Static assets (3D models, textures, images, HDRI maps, fonts)\n- `assets/` \u2014 Uploadable resources (PDF templates, email assets)\n\n## Architecture Principles\n- YAML-first: 99% of configuration in spec/*.yaml, custom code is last resort\n- ECS pattern: entities (domain objects) + components (behavior/UI) + systems (SDK runtime)\n- Reactive state: immutable domain state flows through RxJS pipelines\n- Data binding: `$read` (read-only), `$write` (write-only), `$bind` (bidirectional) connect components to domain\n- memoEval: all component implementations must use memoEval for stable object references\n\n## Key Patterns\n- Expressions = computed properties on entities (prefix: `$`), implemented per-entity in src/expressions/\n- Invariants = validation rules returning violations, static or dynamic\n- Transformers = auto-fixers maintaining consistency after state changes\n- Components defined in YAML with `$read`/`$bind` bindings, or custom in src/components/ using attachComponent builder\n- Webhooks = server-side finalization tasks (PDF, email, CSV, image rendering)\n- Filters = contextual component activation via navigationStates, viewStates, modes, selectedEntityIds\n\n## File Conventions\n- Components: PascalCase (.tsx)\n- Utilities: kebab-case (.ts)\n- Expressions: entity-name.ts\n- Migrations: v*.ts (sequential)\n- Specs: kebab-case.yaml\n- Underscore folders (_shared/, _utils/) are NOT auto-imported\n\n## Export Rules\nAll files in src/expressions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.\n\n## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.\n\n## Do Not Edit\n- `.phoenix/` directory \u2014 completely regenerated on each build\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files \u2014 compiled from .po files\n\n## Code Review\nUse `/review` command to review code changes before committing.\n\n## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` \u2014 Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` \u2014 Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` \u2014 Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` \u2014 Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` \u2014 List docs in a category\n- `pnpm phoenix docs -l` \u2014 List all doc paths with titles\n\n### 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`\n\n### Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (default: `./screenshot.png`)\n- `--width, -w` \u2014 Width in pixels (default: 1920)\n- `--height` \u2014 Height in pixels (default: 1080)\n- `--format, -f` \u2014 Image format: PNG or JPEG (default: PNG)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders\n\n### Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--sections, -s` \u2014 Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` \u2014 domain data loaded\n- `domainContextReady` \u2014 domain context initialized (entities available)\n- `configuratorReady` \u2014 3D configurator initialized\n- `sessionAuthenticated` \u2014 session service active\n- `editorMode` \u2014 editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation\n\n### Inspect: Data\n\nGet the current editor context data as JSON via `pnpm phoenix inspect:data`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** publishedData, frontendData, backendData, sessionData, accessData, webComponentProperties\n\n**Example:** `pnpm phoenix inspect:data -o ./data.json`\n\n**Tips:** Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:data | head -30`).\n\n**Use cases:** AI agent context, debugging published/session/access data\n\n### Inspect: Scene\n\nGet the current Three.js scene graph as JSON via `pnpm phoenix inspect:scene`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** Recursive scene tree with per-node: name, type, visible, position, rotation, scale, userData (entityId), and for meshes: geometry name, bounding box, material properties (color, metalness, roughness, opacity, textures), morph target influences. Lights include color, intensity, and type-specific properties.\n\n**Example:** `pnpm phoenix inspect:scene -o ./scene.json`\n\n**Tips:** Scene graphs can be large. Pipe through `head`/`tail` for partial output.\n\n**Use cases:** AI agent context, debugging 3D scene layout, inspecting materials and lighting\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` \u2014 Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` \u2014 End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` \u2014 Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` \u2014 ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` \u2014 Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` \u2014 YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` \u2014 Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` \u2014 Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` \u2014 Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` \u2014 Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` \u2014 Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \"camera\"`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep \"example\"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep \"camera\"`\n5. Search generated files directly when needed: `grep -rn \"camera\" \"$(pnpm phoenix docs --dir)\"`\n6. Browse a topic area: `pnpm phoenix docs -c \"Layouts\"`\n\n### Playwright MCP Setup (for AI agents)\n\nTo interact with the 3D configurator in a browser, Playwright MCP needs GPU-enabled flags for WebGL rendering. Add to `~/.claude/.mcp.json`:\n\n```json\n{\n \"mcpServers\": {\n \"playwright\": {\n \"command\": \"npx\",\n \"args\": [\n \"@playwright/mcp@latest\",\n \"--headed\",\n \"--launch-options\",\n \"{\\\"args\\\":[\\\"--use-gl=swiftshader\\\",\\\"--enable-webgl\\\",\\\"--ignore-gpu-blocklist\\\"]}\"\n ]\n }\n }\n}\n```\n\nKey flags:\n- `--headed` \u2014 visible browser (required for GPU rendering)\n- `--use-gl=swiftshader` \u2014 software GPU fallback for environments without a physical GPU\n- `--enable-webgl` + `--ignore-gpu-blocklist` \u2014 ensure WebGL is available\n[PHOENIX-SDK-END]";
1
+ export declare const sdkContent = "[PHOENIX-SDK-START]\n## Phoenix Configurator Project\n\nDeclarative 3D product configurator built with Phoenix SDK. Domain model defined in YAML, custom logic in TypeScript.\n\n## Build Commands\n- `pnpm phoenix build` \u2014 Full production build\n- `pnpm phoenix dev` \u2014 Development mode with hot reload\n- `pnpm phoenix sync` \u2014 Sync generated files without full build\n\n## Dev Logs\n- `pnpm phoenix dev` writes all logs to `.phoenix/phoenix-dev.log`\n- Contains: spec parse errors, build errors, browser runtime errors, file watcher events\n- After making changes, always check the log for errors: `tail -50 .phoenix/phoenix-dev.log` or `grep ERROR .phoenix/phoenix-dev.log`\n- Rotated automatically at 10MB (`.log.1`, `.log.2` are older rotations)\n\n## Project Structure\n- `spec/` \u2014 Domain YAML specs (entities, relations, expressions, invariants, components, application config)\n- `src/expressions/` \u2014 Computed/derived entity properties (`phx.domain.implementCustomExpressions()`)\n- `src/invariants/` \u2014 Business rule constraints (`phx.domain.implementCustomInvariants()`)\n- `src/transformers/` \u2014 Automatic state fixers (`phx.frontend.transformerBuilder`)\n- `src/components/` \u2014 ECS system components (`phx.domain.attachComponent.withEntity()`)\n- `src/elements/` \u2014 Page-level React components (`phx.frontend.createCustomPhoenixLayoutElement()`)\n - `ConfiguratorLayout`: a layout element with this name replaces everything the built-in layout renders for a loaded configuration, in owner and read mode, finalization included. Prefer arranging the spec's layout components; write one for shell-level changes, such as moving the sidebar or adding an area the built-in layout has no place for\n - Mount `LayoutSlots.SharedCanvas` (from `@salsita-ai/sdk/configurator`) in a positioned root covering the page, or the app loader stays on screen; put the UI above it, positioned and after it in the markup. Call `useSceneSafeArea()` (same import) and put `containerRef` on the element covering the whole canvas and `safeAreaRef` on the region the UI leaves free, with `pointerEvents: 'none'`, so the camera frames the scene there\n - Sidebar moved, contents as the spec configures them: mount `LayoutSlots.DesktopSidebar` in a positioned container that sets its size, with `side=\"start\"` on the left; `docs/layouts/sidebar/in-a-custom-layout.mdx` is the whole layout\n - Your own UI: \"Hooks for a Project Layout\" in `docs/phoenix/configurator-interface.mdx` lists the hooks with what each returns (`pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx`), `docs/phoenix/layout-slots.mdx` the built-in pieces you can still mount, and `docs/layouts/custom-layout.mdx` is a worked example\n - Messages: mount `LayoutSlots.Services` for the built-in snackbars, or show violations, side-effect hints and errors yourself with `phx.frontend.useConfiguratorMessages(onMessage)`, not both. Either way mount a snackbar root (`LayoutSlots.DesktopSnackbarsRoot` or `LayoutSlots.MobileSnackbarsRoot`): save and built-in action errors are always snackbars\n - Finalize over the spec's `finalizeAction` components, each naming a handler registered with `phx.frontend.createPhoenixHandler`: run each with `phx.frontend.useFinalizeAction(handler)` in a component of its own wrapped in `PhoenixHandlerBoundary` (from `@salsita-ai/sdk/react`), or mount `FinalizeActions` (from `@salsita-ai/sdk/configurator`) for the built-in buttons. `finalizePage` and `finalizeButton` are legacy\n - Read mode and fullscreen are the layout's job, no hook enforces them: hide what a viewer must not change while `phx.frontend.useAccessService().accessInfo.viewMode` is `true`, and remove panels while `phx.frontend.useIsFullscreenActive()` is set; `phx.frontend.useSetFullscreen()` returns its setter\n- `src/handlers/` \u2014 Event & lifecycle handlers\n- `src/webhooks/` \u2014 Server-side webhook handlers (`phx.webhooks.*Builder`)\n- `src/migrations/` \u2014 Schema version migrations (v*.ts)\n- `src/locales/` \u2014 Locale catalogs (authored .po sources; compiled .ts, do not edit)\n- `src/admin/` \u2014 Admin interface (mirrors main src/ structure)\n- `src/_shared/` \u2014 Shared utilities (NOT auto-imported, requires explicit imports)\n- `.phoenix/` \u2014 Auto-generated files (DO NOT EDIT)\n- `public/` \u2014 Static assets (3D models, textures, images, HDRI maps, fonts)\n- `assets/` \u2014 Uploadable resources (PDF templates, email assets)\n\n## Architecture Principles\n- YAML-first: 99% of configuration in spec/*.yaml, custom code is last resort\n- ECS pattern: entities (domain objects) + components (behavior/UI) + systems (SDK runtime)\n- Reactive state: immutable domain state flows through RxJS pipelines\n- Data binding: `$read` (read-only), `$write` (write-only), `$bind` (bidirectional) connect components to domain\n- memoEval: all component implementations must use memoEval for stable object references\n\n## Key Patterns\n- Expressions = computed properties on entities (prefix: `$`), implemented per-entity in src/expressions/\n- Invariants = validation rules returning violations, static or dynamic\n- Transformers = auto-fixers maintaining consistency after state changes\n- Components defined in YAML with `$read`/`$bind` bindings, or custom in src/components/ using attachComponent builder\n- Webhooks = server-side finalization tasks (PDF, email, CSV, image rendering)\n- Filters = contextual component activation via navigationStates, viewStates, modes, selectedEntityIds\n\n## File Conventions\n- Components: PascalCase (.tsx)\n- Utilities: kebab-case (.ts)\n- Expressions: entity-name.ts\n- Migrations: v*.ts (sequential)\n- Specs: kebab-case.yaml\n- Underscore folders (_shared/, _utils/) are NOT auto-imported\n\n## Export Rules\nAll files in src/expressions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.\n\n## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.\n\n## Do Not Edit\n- `.phoenix/` directory \u2014 completely regenerated on each build\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files \u2014 compiled from .po files\n\n## Code Review\nUse `/review` command to review code changes before committing.\n\n## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` \u2014 Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` \u2014 Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` \u2014 Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` \u2014 Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` \u2014 List docs in a category\n- `pnpm phoenix docs -l` \u2014 List all doc paths with titles\n\n### 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`\n\n### Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (default: `./screenshot.png`)\n- `--width, -w` \u2014 Width in pixels (default: 1920)\n- `--height` \u2014 Height in pixels (default: 1080)\n- `--format, -f` \u2014 Image format: PNG or JPEG (default: PNG)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders\n\n### Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--sections, -s` \u2014 Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` \u2014 domain data loaded\n- `domainContextReady` \u2014 domain context initialized (entities available)\n- `configuratorReady` \u2014 3D configurator initialized\n- `sessionAuthenticated` \u2014 session service active\n- `editorMode` \u2014 editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation\n\n### Inspect: Data\n\nGet the current editor context data as JSON via `pnpm phoenix inspect:data`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** publishedData, frontendData, backendData, sessionData, accessData, webComponentProperties\n\n**Example:** `pnpm phoenix inspect:data -o ./data.json`\n\n**Tips:** Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:data | head -30`).\n\n**Use cases:** AI agent context, debugging published/session/access data\n\n### Inspect: Scene\n\nGet the current Three.js scene graph as JSON via `pnpm phoenix inspect:scene`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` \u2014 Output file path (prints to stdout if omitted)\n- `--pretty` \u2014 Pretty-print JSON (default: true)\n- `--port` \u2014 WebSocket server port (default: 3020)\n\n**Returns:** Recursive scene tree with per-node: name, type, visible, position, rotation, scale, userData (entityId), and for meshes: geometry name, bounding box, material properties (color, metalness, roughness, opacity, textures), morph target influences. Lights include color, intensity, and type-specific properties.\n\n**Example:** `pnpm phoenix inspect:scene -o ./scene.json`\n\n**Tips:** Scene graphs can be large. Pipe through `head`/`tail` for partial output.\n\n**Use cases:** AI agent context, debugging 3D scene layout, inspecting materials and lighting\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` \u2014 Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` \u2014 End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` \u2014 Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` \u2014 ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` \u2014 Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` \u2014 YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` \u2014 Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` \u2014 Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` \u2014 Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` \u2014 Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` \u2014 Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \"camera\"`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep \"example\"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep \"camera\"`\n5. Search generated files directly when needed: `grep -rn \"camera\" \"$(pnpm phoenix docs --dir)\"`\n6. Browse a topic area: `pnpm phoenix docs -c \"Layouts\"`\n\n### Playwright MCP Setup (for AI agents)\n\nTo interact with the 3D configurator in a browser, Playwright MCP needs GPU-enabled flags for WebGL rendering. Add to `~/.claude/.mcp.json`:\n\n```json\n{\n \"mcpServers\": {\n \"playwright\": {\n \"command\": \"npx\",\n \"args\": [\n \"@playwright/mcp@latest\",\n \"--headed\",\n \"--launch-options\",\n \"{\\\"args\\\":[\\\"--use-gl=swiftshader\\\",\\\"--enable-webgl\\\",\\\"--ignore-gpu-blocklist\\\"]}\"\n ]\n }\n }\n}\n```\n\nKey flags:\n- `--headed` \u2014 visible browser (required for GPU rendering)\n- `--use-gl=swiftshader` \u2014 software GPU fallback for environments without a physical GPU\n- `--enable-webgl` + `--ignore-gpu-blocklist` \u2014 ensure WebGL is available\n[PHOENIX-SDK-END]";
@@ -21,8 +21,13 @@ Declarative 3D product configurator built with Phoenix SDK. Domain model defined
21
21
  - \`src/transformers/\` — Automatic state fixers (\`phx.frontend.transformerBuilder\`)
22
22
  - \`src/components/\` — ECS system components (\`phx.domain.attachComponent.withEntity()\`)
23
23
  - \`src/elements/\` — Page-level React components (\`phx.frontend.createCustomPhoenixLayoutElement()\`)
24
- - A layout element named \`ConfiguratorLayout\` replaces everything the built-in layout renders for a loaded configuration, finalization included, so prefer arranging the layout in the spec; when you register it, mount \`LayoutSlots.SharedCanvas\` (from \`@salsita-ai/sdk/configurator\`) in it, or the app loader stays on screen, and call \`useSceneSafeArea()\` (same import) with its \`containerRef\` on the element covering the whole canvas and its \`safeAreaRef\` on the region the layout's UI leaves free, so the camera frames the scene there, and to keep the spec's tabs, property pages, sidebar footer and assistant panel while moving them, mount \`LayoutSlots.DesktopSidebar\` (same import) in a positioned container that sets its size, with \`side="start"\` when it is on the left
25
- - The hooks such a layout reads, with what each returns, are listed under "Hooks for a Project Layout" in \`docs/phoenix/configurator-interface.mdx\` (read it with \`pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx\`), and the \`LayoutSlots\` members in \`docs/phoenix/layout-slots.mdx\`; it finalizes over the spec's \`finalizeAction\` components, since \`finalizePage\` and \`finalizeButton\` are legacy
24
+ - \`ConfiguratorLayout\`: a layout element with this name replaces everything the built-in layout renders for a loaded configuration, in owner and read mode, finalization included. Prefer arranging the spec's layout components; write one for shell-level changes, such as moving the sidebar or adding an area the built-in layout has no place for
25
+ - Mount \`LayoutSlots.SharedCanvas\` (from \`@salsita-ai/sdk/configurator\`) in a positioned root covering the page, or the app loader stays on screen; put the UI above it, positioned and after it in the markup. Call \`useSceneSafeArea()\` (same import) and put \`containerRef\` on the element covering the whole canvas and \`safeAreaRef\` on the region the UI leaves free, with \`pointerEvents: 'none'\`, so the camera frames the scene there
26
+ - Sidebar moved, contents as the spec configures them: mount \`LayoutSlots.DesktopSidebar\` in a positioned container that sets its size, with \`side="start"\` on the left; \`docs/layouts/sidebar/in-a-custom-layout.mdx\` is the whole layout
27
+ - Your own UI: "Hooks for a Project Layout" in \`docs/phoenix/configurator-interface.mdx\` lists the hooks with what each returns (\`pnpm phoenix docs -r docs/phoenix/configurator-interface.mdx\`), \`docs/phoenix/layout-slots.mdx\` the built-in pieces you can still mount, and \`docs/layouts/custom-layout.mdx\` is a worked example
28
+ - Messages: mount \`LayoutSlots.Services\` for the built-in snackbars, or show violations, side-effect hints and errors yourself with \`phx.frontend.useConfiguratorMessages(onMessage)\`, not both. Either way mount a snackbar root (\`LayoutSlots.DesktopSnackbarsRoot\` or \`LayoutSlots.MobileSnackbarsRoot\`): save and built-in action errors are always snackbars
29
+ - Finalize over the spec's \`finalizeAction\` components, each naming a handler registered with \`phx.frontend.createPhoenixHandler\`: run each with \`phx.frontend.useFinalizeAction(handler)\` in a component of its own wrapped in \`PhoenixHandlerBoundary\` (from \`@salsita-ai/sdk/react\`), or mount \`FinalizeActions\` (from \`@salsita-ai/sdk/configurator\`) for the built-in buttons. \`finalizePage\` and \`finalizeButton\` are legacy
30
+ - Read mode and fullscreen are the layout's job, no hook enforces them: hide what a viewer must not change while \`phx.frontend.useAccessService().accessInfo.viewMode\` is \`true\`, and remove panels while \`phx.frontend.useIsFullscreenActive()\` is set; \`phx.frontend.useSetFullscreen()\` returns its setter
26
31
  - \`src/handlers/\` — Event & lifecycle handlers
27
32
  - \`src/webhooks/\` — Server-side webhook handlers (\`phx.webhooks.*Builder\`)
28
33
  - \`src/migrations/\` — Schema version migrations (v*.ts)