@salsita-ai/sdk 0.50.0-develop.30e4093851 → 0.50.0-develop.30ea3b5e1a

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 (418) hide show
  1. package/dist/application-spec/core/components/component-filter.d.ts +53 -0
  2. package/dist/application-spec/core/components/component-filter.js +1 -0
  3. package/dist/application-spec/core/components/index.d.ts +2 -0
  4. package/dist/application-spec/core/components/index.js +1 -0
  5. package/dist/application-spec/core/components/sdk-code-ref.d.ts +9 -0
  6. package/dist/application-spec/core/components/sdk-code-ref.js +1 -0
  7. package/dist/application-spec/core/enhanced-json-value.d.ts +0 -68
  8. package/dist/application-spec/core/enhanced-json-value.js +1 -1
  9. package/dist/application-spec/core/expressions/index.d.ts +2 -0
  10. package/dist/application-spec/core/expressions/index.js +1 -0
  11. package/dist/application-spec/core/expressions/relation-expression-params.d.ts +11 -0
  12. package/dist/application-spec/core/expressions/relation-expression-params.js +1 -0
  13. package/dist/application-spec/core/expressions/sdk-expression-implementation.d.ts +24 -0
  14. package/dist/application-spec/core/expressions/sdk-expression-implementation.js +1 -0
  15. package/dist/application-spec/core/index.d.ts +2 -0
  16. package/dist/application-spec/core/index.js +1 -1
  17. package/dist/application-spec/core/json-value.d.ts +1 -1
  18. package/dist/application-spec/{core → enhanced-json}/eval-to-constant.d.ts +1 -1
  19. package/dist/application-spec/enhanced-json/index.d.ts +4 -0
  20. package/dist/application-spec/enhanced-json/index.js +1 -0
  21. package/dist/application-spec/enhanced-json/is-enhanced-json-array.d.ts +2 -0
  22. package/dist/application-spec/enhanced-json/is-enhanced-json-array.js +1 -0
  23. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.d.ts +18 -0
  24. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.js +1 -0
  25. package/dist/application-spec/enhanced-json/schema-from-value.d.ts +24 -0
  26. package/dist/application-spec/enhanced-json/schema-from-value.js +1 -0
  27. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.d.ts +14 -0
  28. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.js +1 -0
  29. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.d.ts +12 -0
  30. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.js +1 -0
  31. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.d.ts +13 -0
  32. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.js +1 -0
  33. package/dist/application-spec/errors/diagnostic-codes.d.ts +5 -0
  34. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  35. package/dist/application-spec/errors/diagnostic-messages.d.ts +8 -0
  36. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  37. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  38. package/dist/application-spec/generate-application/code/standalone-app-files.d.ts +2 -2
  39. package/dist/application-spec/generate-application/code/standalone-app-files.js +1 -1
  40. package/dist/application-spec/generate-application/code/templates/configurator-config.js +6 -4
  41. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +4 -4
  42. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.d.ts +4 -2
  43. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.js +1 -1
  44. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +42 -44
  45. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-phx-globals.js +3 -0
  46. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.d.ts +6 -8
  47. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +11 -11
  48. package/dist/application-spec/generate-application/code/templates/domain-spec/index.d.ts +1 -1
  49. package/dist/application-spec/generate-application/code/templates/domain-spec/index.js +1 -1
  50. package/dist/application-spec/generate-application/code/templates/domain-spec.js +12 -12
  51. package/dist/application-spec/generate-application/code/templates/globals.js +5 -4
  52. package/dist/application-spec/generate-application/code/templates/index.d.ts +0 -1
  53. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  54. package/dist/application-spec/generate-application/code/templates/package-json.js +1 -1
  55. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +8 -2
  56. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  57. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +10 -3
  58. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  59. package/dist/application-spec/generate-application/code/templates/webhook-index.d.ts +6 -1
  60. package/dist/application-spec/generate-application/code/templates/webhook-index.js +10 -1
  61. package/dist/application-spec/generate-application/index.d.ts +2 -0
  62. package/dist/application-spec/generate-application/index.js +1 -1
  63. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +6 -2
  64. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  65. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +8 -3
  66. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  67. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +5 -3
  68. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  69. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.d.ts +43 -0
  70. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.js +1 -0
  71. package/dist/application-spec/generate-application/runtime/factory-data/index.d.ts +3 -0
  72. package/dist/application-spec/generate-application/runtime/factory-data/index.js +1 -0
  73. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.d.ts +13 -0
  74. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -0
  75. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +16 -0
  76. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -0
  77. package/dist/application-spec/generate-application/runtime/migrations/index.d.ts +1 -0
  78. package/dist/application-spec/generate-application/runtime/migrations/index.js +1 -0
  79. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +53 -0
  80. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.js +1 -0
  81. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +1 -1
  82. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  83. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +2 -1
  84. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  85. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +2 -4
  86. package/dist/application-spec/index.d.ts +1 -0
  87. package/dist/application-spec/index.js +1 -1
  88. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +6 -0
  89. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  90. package/dist/application-spec/parse-application-files/categorize/module-analysis.d.ts +1 -1
  91. package/dist/application-spec/parse-application-files/categorize/module-analysis.js +1 -1
  92. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +16 -3
  93. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  94. package/dist/application-spec/parse-application-files/raw-spec/raw-spec-file.js +1 -1
  95. package/dist/application-spec/parse-application-files/spec/components/component-entry.d.ts +1 -9
  96. package/dist/application-spec/parse-application-files/spec/components/component-entry.js +1 -1
  97. package/dist/application-spec/parse-application-files/spec/components/component-filter.d.ts +1 -54
  98. package/dist/application-spec/parse-application-files/spec/components/component-filter.js +1 -1
  99. package/dist/application-spec/parse-application-files/spec/components/index.d.ts +1 -1
  100. package/dist/application-spec/parse-application-files/spec/components/index.js +1 -1
  101. package/dist/application-spec/parse-application-files/spec/expressions/expression.d.ts +1 -28
  102. package/dist/application-spec/parse-application-files/spec/expressions/expression.js +1 -1
  103. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +1 -1
  104. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  105. package/dist/application-spec/parse-application-files/spec/expressions/index.d.ts +0 -1
  106. package/dist/application-spec/parse-application-files/spec/expressions/index.js +1 -1
  107. package/dist/application-spec/parse-application-files/spec/expressions/memo-eval-plan.js +1 -1
  108. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  109. package/dist/application-spec/parse-application-files/spec/model/defaults.d.ts +3 -3
  110. package/dist/application-spec/parse-application-files/spec/model/defaults.js +1 -1
  111. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  112. package/dist/application-spec/parse-application-files/spec/sections/infra.d.ts +2 -0
  113. package/dist/application-spec/parse-application-files/spec/sections/infra.js +1 -1
  114. package/dist/client/phoenix-api.d.ts +96 -0
  115. package/dist/configurator/application-runtime/extensions/create-configurator-extensions.js +1 -1
  116. package/dist/configurator/application-runtime/extensions/selectors.d.ts +3 -1
  117. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  118. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +32 -1
  119. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  120. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +7 -1
  121. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  122. package/dist/configurator/application-runtime/extensions/systems/drag-and-drop-system/drag-and-drop-system.d.ts +3 -3
  123. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +20 -4
  124. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  125. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.d.ts +11 -0
  126. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.js +1 -0
  127. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -2
  128. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  129. package/dist/configurator/common/configurator-interface.d.ts +26 -1
  130. package/dist/configurator/common/configurator-interface.js +1 -1
  131. package/dist/configurator/common/frontend-analytics.d.ts +2 -0
  132. package/dist/configurator/common/frontend-analytics.js +1 -1
  133. package/dist/configurator/common/index.d.ts +2 -0
  134. package/dist/configurator/common/index.js +1 -1
  135. package/dist/configurator/common/use-finalize-action.d.ts +31 -0
  136. package/dist/configurator/common/use-finalize-action.js +1 -0
  137. package/dist/configurator/common/use-reset-camera.d.ts +6 -0
  138. package/dist/configurator/common/use-reset-camera.js +1 -0
  139. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +1 -1
  140. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +2 -2
  141. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  142. package/dist/configurator/pages/configurator-layout-name.d.ts +2 -0
  143. package/dist/configurator/pages/configurator-layout-name.js +1 -0
  144. package/dist/configurator/pages/default-configurator-elements.d.ts +7 -0
  145. package/dist/configurator/pages/default-configurator-elements.js +1 -0
  146. package/dist/configurator/pages/index.d.ts +1 -0
  147. package/dist/configurator/pages/index.js +1 -1
  148. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragHandle.d.ts +1 -1
  149. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragSceneHandle.d.ts +1 -1
  150. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicator.d.ts +1 -1
  151. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicatorInternal.d.ts +1 -1
  152. package/dist/configurator/scene/scene-entity/drag-and-drop/shared.d.ts +2 -2
  153. package/dist/configurator/scene/scene-entity/drag-and-drop/use-drag-object.d.ts +1 -1
  154. package/dist/configurator/scene/scene-entity/materials/RemoteReplacedMaterial.js +1 -1
  155. package/dist/configurator/scene/scene-entity/objects/SceneEntityObjectTextDecal.d.ts +1 -1
  156. package/dist/configurator/ui/assistant/AssistantChips.d.ts +8 -2
  157. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  158. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +1 -1
  159. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  160. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  161. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +13 -0
  162. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -0
  163. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.d.ts +22 -0
  164. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.js +1 -0
  165. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +27 -0
  166. package/dist/configurator/ui/assistant/entity-link/entity-link-state.js +1 -0
  167. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +5 -0
  168. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +1 -0
  169. package/dist/configurator/ui/assistant/entity-link/index.d.ts +3 -0
  170. package/dist/configurator/ui/assistant/entity-link/index.js +1 -0
  171. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.d.ts +1 -0
  172. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.js +1 -0
  173. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.d.ts +11 -0
  174. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.js +1 -0
  175. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.d.ts +101 -0
  176. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.js +16 -0
  177. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.d.ts +1 -0
  178. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.js +1 -0
  179. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.d.ts +4 -4
  180. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  181. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.d.ts +3 -6
  182. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.js +1 -1
  183. package/dist/configurator/ui/configurator-layout/slots/slots.d.ts +1 -0
  184. package/dist/configurator/ui/configurator-layout/slots/slots.js +1 -1
  185. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.d.ts +0 -74
  186. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -20
  187. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.d.ts +2 -2
  188. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.d.ts +2 -2
  189. package/dist/docs/dimensions/3d-scene-integration/dimension-indicators.mdx +2 -2
  190. package/dist/docs/dimensions/3d-scene-integration/editable-angle-indicator.mdx +1 -1
  191. package/dist/docs/dimensions/3d-scene-integration/editable-distance-dimension-indicator.mdx +1 -1
  192. package/dist/docs/dimensions/3d-scene-integration/list-selector-dimension-indicator.mdx +1 -1
  193. package/dist/docs/drag-and-drop/drag-handle.mdx +1 -1
  194. package/dist/docs/drag-and-drop/hotspot-handle.mdx +1 -1
  195. package/dist/docs/drag-and-drop/planes.mdx +1 -1
  196. package/dist/docs/drag-and-drop/rotatable.mdx +2 -2
  197. package/dist/docs/index.json +42 -1
  198. package/dist/docs/layouts/custom-layout.mdx +2125 -0
  199. package/dist/docs/layouts/header/fixed.mdx +2 -2
  200. package/dist/docs/layouts/header/floating.mdx +2 -2
  201. package/dist/docs/layouts/sidebar/in-a-custom-layout.mdx +380 -0
  202. package/dist/docs/layouts/sidebar-footer/basic.mdx +32 -77
  203. package/dist/docs/other-features/client-side-rendering/declarative.mdx +1 -1
  204. package/dist/docs/other-features/transformers.mdx +4 -0
  205. package/dist/docs/phoenix/application-states.mdx +9 -7
  206. package/dist/docs/phoenix/configurator-interface.mdx +140 -18
  207. package/dist/docs/phoenix/finalization.mdx +1 -1
  208. package/dist/docs/phoenix/layout-slots.mdx +116 -0
  209. package/dist/docs/phoenix/phoenix-cli.mdx +25 -7
  210. package/dist/docs/phoenix/project-structure.mdx +10 -4
  211. package/dist/docs/phoenix/sdk-builder-workflow.mdx +1 -1
  212. package/dist/docs/phoenix/testing.mdx +140 -0
  213. package/dist/docs/phoenix/webhook-membership.mdx +10 -9
  214. package/dist/docs/phoenix/webhooks.mdx +18 -1
  215. package/dist/domain/admin-domain/implementation/common-admin-publish.d.ts +1 -2
  216. package/dist/domain/admin-domain/index.js +1 -1
  217. package/dist/domain/application/GetApplicationWrapperHandler.d.ts +1 -1
  218. package/dist/domain/application/application-config.d.ts +7 -3
  219. package/dist/domain/application/assistant/assistant-fields.d.ts +12 -0
  220. package/dist/domain/application/assistant/assistant-fields.js +1 -0
  221. package/dist/domain/application/assistant/assistant-manifest.d.ts +9 -1
  222. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +38 -2
  223. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -1
  224. package/dist/domain/application/assistant/build-assistant-lenses.d.ts +14 -0
  225. package/dist/domain/application/assistant/build-assistant-lenses.js +5 -0
  226. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  227. package/dist/domain/application/assistant/create-assistant-execution-schema.d.ts +32 -0
  228. package/dist/domain/application/assistant/create-assistant-execution-schema.js +1 -0
  229. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  230. package/dist/domain/application/assistant/index.d.ts +6 -1
  231. package/dist/domain/application/assistant/index.js +1 -1
  232. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +20 -0
  233. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.js +1 -0
  234. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +10 -0
  235. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -0
  236. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +48 -0
  237. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -0
  238. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +15 -0
  239. package/dist/domain/application/assistant/session-setup/create-session-assistant.js +1 -0
  240. package/dist/domain/application/assistant/session-setup/index.d.ts +4 -0
  241. package/dist/domain/application/assistant/session-setup/index.js +1 -0
  242. package/dist/domain/application/configurator-builder.d.ts +5 -2
  243. package/dist/domain/application/configurator-builder.js +1 -1
  244. package/dist/domain/application/create-initial-published-data.d.ts +5 -5
  245. package/dist/domain/application/index.d.ts +0 -1
  246. package/dist/domain/application/index.js +1 -1
  247. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +1 -1
  248. package/dist/domain/application/published-data/map-published-data.d.ts +7 -3
  249. package/dist/domain/core/component/domain-component-optic.d.ts +1 -2
  250. package/dist/domain/core/component/system-component-filter.d.ts +15 -2
  251. package/dist/domain/core/expression/constant-expressions.d.ts +16 -8
  252. package/dist/domain/core/invariant/violation.d.ts +50 -2
  253. package/dist/domain/core/invariant/violation.js +1 -1
  254. package/dist/domain/core/model/model.d.ts +1 -1
  255. package/dist/domain/core/recipe/recipes.d.ts +18 -50
  256. package/dist/domain/core/recipe/recipes.js +1 -1
  257. package/dist/domain/core/relation/relation-factory.js +1 -1
  258. package/dist/domain/core/state/state.d.ts +1 -1
  259. package/dist/domain/domain-context/index.d.ts +1 -1
  260. package/dist/domain/domain-context/undo-system.d.ts +28 -1
  261. package/dist/domain/domain-context/undo-system.js +1 -1
  262. package/dist/domain/domain-runtime/access/selectors.d.ts +9 -0
  263. package/dist/domain/domain-runtime/access/selectors.js +1 -1
  264. package/dist/domain/domain-runtime/access/types.d.ts +2 -0
  265. package/dist/domain/domain-runtime/access/types.js +1 -1
  266. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +14 -13
  267. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  268. package/dist/domain/domain-runtime/domain-context/types.d.ts +4 -1
  269. package/dist/domain/domain-runtime/domain-runtime.d.ts +32 -16
  270. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +19 -0
  271. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -0
  272. package/dist/domain/domain-runtime/errors/implementation-error.d.ts +46 -0
  273. package/dist/domain/domain-runtime/errors/implementation-error.js +1 -0
  274. package/dist/domain/domain-runtime/errors/implementation-errors.d.ts +13 -0
  275. package/dist/domain/domain-runtime/errors/implementation-errors.js +1 -0
  276. package/dist/domain/domain-runtime/errors/index.d.ts +4 -0
  277. package/dist/domain/domain-runtime/errors/index.js +1 -0
  278. package/dist/domain/domain-runtime/errors/to-implementation-errors.d.ts +10 -0
  279. package/dist/domain/domain-runtime/errors/to-implementation-errors.js +1 -0
  280. package/dist/domain/domain-runtime/index.d.ts +1 -0
  281. package/dist/domain/domain-runtime/index.js +1 -1
  282. package/dist/domain/domain-runtime/spec/initialize.d.ts +11 -0
  283. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  284. package/dist/domain/domain-runtime/spec/module-checks/project-modules.d.ts +8 -1
  285. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +1 -1
  286. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.js +1 -1
  287. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -1
  288. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.d.ts +7 -7
  289. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +1 -1
  290. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.js +1 -1
  291. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  292. package/dist/domain/domain-runtime/spec/types.d.ts +2 -0
  293. package/dist/domain/extensions/attribute-switch.d.ts +1 -1
  294. package/dist/domain/extensions/attribute-switch.js +1 -1
  295. package/dist/domain/extensions/canvas-config.d.ts +1 -1
  296. package/dist/domain/extensions/client-side-image.d.ts +2 -2
  297. package/dist/domain/extensions/client-side-image.js +1 -1
  298. package/dist/domain/extensions/common/angle-indicator-schema.d.ts +2 -2
  299. package/dist/domain/extensions/common/dimension-indicator-schema.d.ts +2 -2
  300. package/dist/domain/extensions/editable-angle-indicator.d.ts +1 -1
  301. package/dist/domain/extensions/editable-distance-dimension-indicator.d.ts +1 -1
  302. package/dist/domain/extensions/editable-offset-indicator.d.ts +1 -1
  303. package/dist/domain/extensions/editable-offset-indicator.js +1 -1
  304. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -1
  305. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -1
  306. package/dist/domain/extensions/horizontal-tabs.d.ts +2 -2
  307. package/dist/domain/extensions/list-selector-dimension-indicator.d.ts +1 -1
  308. package/dist/domain/extensions/navigation-steps.d.ts +2 -2
  309. package/dist/domain/extensions/offset-indicator.js +1 -1
  310. package/dist/domain/extensions/rotation-handle.d.ts +2 -2
  311. package/dist/domain/extensions/save-template-thumbnail.d.ts +2 -2
  312. package/dist/domain/extensions/save-template-thumbnail.js +1 -1
  313. package/dist/domain/extensions/scene-entity-animation.js +1 -1
  314. package/dist/domain/mocks/create-mock-domain-context.d.ts +1 -1
  315. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +18 -9
  316. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  317. package/dist/domain/mocks/create-mock-domain.d.ts +1 -1
  318. package/dist/domain/mocks/create-mock-domain.js +1 -1
  319. package/dist/domain/mocks/create-mock-state.d.ts +2 -2
  320. package/dist/domain/mocks/create-test-application-config.d.ts +59 -0
  321. package/dist/domain/mocks/create-test-application-config.js +1 -0
  322. package/dist/domain/mocks/index.d.ts +1 -0
  323. package/dist/domain/mocks/index.js +1 -1
  324. package/dist/domain/projections/blender-projections/camera.d.ts +1 -1
  325. package/dist/domain/system-components/application-config.d.ts +2 -2
  326. package/dist/domain/system-components/child-entity-selection.js +1 -1
  327. package/dist/domain/system-components/collision-box-geometry.d.ts +4 -2
  328. package/dist/domain/system-components/collision-geometry.d.ts +4 -2
  329. package/dist/domain/system-components/collision-point-geometry.d.ts +4 -2
  330. package/dist/domain/system-components/common/material-override-schema.d.ts +2 -2
  331. package/dist/domain/system-components/common/recipes.d.ts +21 -3
  332. package/dist/domain/system-components/common/recipes.js +1 -1
  333. package/dist/domain/system-components/constraint.d.ts +10 -23
  334. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  335. package/dist/domain/system-components/drag-handle.js +1 -1
  336. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  337. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  338. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  339. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  340. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -1
  341. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  342. package/dist/domain/system-components/material-swatch.js +1 -1
  343. package/dist/domain/system-components/scene-entity-material-override.d.ts +1 -1
  344. package/dist/domain/system-components/scene-entity-object-material-override.d.ts +1 -1
  345. package/dist/domain/system-components/scene-entity-object-text-decal.d.ts +1 -1
  346. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.d.ts +1 -1
  347. package/dist/domain/system-components/scene-entity-transimissive-material-override.d.ts +1 -1
  348. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  349. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  350. package/dist/domain/utils/eval-cache.d.ts +1 -1
  351. package/dist/domain/utils/map-nested-object.d.ts +1 -1
  352. package/dist/editor/domain-editors/use-implementation-files.d.ts +1 -2
  353. package/dist/editor/mocks/EditorMockContext.js +1 -1
  354. package/dist/i18n/locales/cs/messages.js +1 -1
  355. package/dist/i18n/locales/da/messages.js +1 -1
  356. package/dist/i18n/locales/de/messages.js +1 -1
  357. package/dist/i18n/locales/de-AT/messages.js +1 -1
  358. package/dist/i18n/locales/en/messages.js +1 -1
  359. package/dist/i18n/locales/en-AU/messages.js +1 -1
  360. package/dist/i18n/locales/en-GB/messages.js +1 -1
  361. package/dist/i18n/locales/es/messages.js +1 -1
  362. package/dist/i18n/locales/fr/messages.js +1 -1
  363. package/dist/i18n/locales/hu/messages.js +1 -1
  364. package/dist/i18n/locales/it/messages.js +1 -1
  365. package/dist/i18n/locales/nl/messages.js +1 -1
  366. package/dist/i18n/locales/pl/messages.js +1 -1
  367. package/dist/i18n/locales/pt/messages.js +1 -1
  368. package/dist/i18n/locales/ro/messages.js +1 -1
  369. package/dist/i18n/locales/sk/messages.js +1 -1
  370. package/dist/i18n/locales/tr/messages.js +1 -1
  371. package/dist/legacy/domain-cli/gen/configurator-builder.js +13 -12
  372. package/dist/legacy/domain-cli/gen/constant-expressions.js +1 -1
  373. package/dist/legacy/domain-cli/gen/defaults.js +1 -7
  374. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  375. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  376. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +81 -68
  377. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  378. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  379. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  380. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +7 -1
  381. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -16
  382. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +14 -12
  383. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +13 -11
  384. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +13 -11
  385. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  386. package/dist/phoenix/commands/check.js +1 -1
  387. package/dist/phoenix/commands/deploy.js +1 -1
  388. package/dist/phoenix/commands/dev.js +5 -5
  389. package/dist/phoenix/commands/fix.js +1 -1
  390. package/dist/phoenix/services/application-spec-project-watcher.d.ts +2 -0
  391. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  392. package/dist/phoenix/services/source-archive.d.ts +1 -0
  393. package/dist/phoenix/services/source-archive.js +1 -1
  394. package/dist/phoenix/services/swc.js +1 -1
  395. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +2 -0
  396. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  397. package/dist/react-sdk/application-runtime/routing/access-service.d.ts +1 -0
  398. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +33 -16
  399. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  400. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +30 -0
  401. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -0
  402. package/dist/react-sdk/domain-context/common-hooks/use-domain-context.d.ts +4 -4
  403. package/dist/react-sdk/domain-context/index.d.ts +2 -1
  404. package/dist/react-sdk/domain-context/index.js +1 -1
  405. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +11 -0
  406. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  407. package/dist/react-sdk/domain-controls/hooks/use-angle-dimension.d.ts +1 -1
  408. package/dist/ui-sdk/theme/types.d.ts +1 -1
  409. package/dist/webhook/builders/webhook-builder.js +1 -1
  410. package/package.json +33 -29
  411. package/schema/domain-spec.json +1115 -209
  412. package/dist/application-spec/generate-application/code/templates/webhook-implementation.d.ts +0 -1
  413. package/dist/application-spec/generate-application/code/templates/webhook-implementation.js +0 -7
  414. package/dist/domain/application/resource-builder.d.ts +0 -13
  415. package/dist/domain/application/resource-builder.js +0 -1
  416. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.d.ts +0 -0
  417. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.js +0 -0
  418. /package/dist/application-spec/{core → enhanced-json}/eval-to-constant.js +0 -0
@@ -1,8 +1,8 @@
1
- import{fileHeader as e}from"./file-header.js";import{defaultEnvsCode as n,generateImports as i,generateModuleEntries as t,generateModuleList as o,generateThemeCode as a,generateTransformerMap as m,generateTransformerRegistration as r,generateTransformerTypeImports as s}from"./generator-shared.js";export const generateFrontendAdminFile=(p=[],d=[],c=[],l=[],$=[],f=[],g=[],h,u,A)=>{let F=i(p,"components"),S=o(t(p,"components")),C=i(d,"adminComponents"),j=o(t(d,"adminComponents")),w=i($,"handlers"),P=o(t($,"handlers")),I=i(f,"elements"),b=i(g,"adminElements"),x=o([...t(f,"elements"),...t(g,"adminElements")]),E=m(c,l),k=r(l),y=a(h,u),B=s(l.length>0),O=A?`
1
+ import{fileHeader as e}from"./file-header.js";import{defaultEnvsCode as n,generateImports as i,generateModuleEntries as t,generateModuleList as o,generateThemeCode as a,generateTransformerMap as r,generateTransformerRegistration as m,generateTransformerTypeImports as s}from"./generator-shared.js";export const generateFrontendAdminFile=(p=[],d=[],c=[],l=[],f=[],$=[],g=[],u,h,A)=>{let C=i(p,"components"),F=o(t(p,"components")),S=i(d,"adminComponents"),w=o(t(d,"adminComponents")),j=i(f,"handlers"),E=o(t(f,"handlers")),P=i($,"elements"),I=i(g,"adminElements"),b=o([...t($,"elements"),...t(g,"adminElements")]),k=r(c,l),x=m(l),y=a(u,h),B=s(l.length>0),O=A?`
2
2
  import { createAdminPagesFromSpec } from '@salsita-ai/sdk/admin'
3
- import { $adminPagesSpec, $dataSpec } from './domain/application-types.js'`:"",H=A?`
3
+ import { $adminPagesSpec, $dataSpec } from './domain/application-types.js'`:"",D=A?`
4
4
  const { components: specAdminComponents, pages: specAdminPages } = createAdminPagesFromSpec($adminPagesSpec, $dataSpec)
5
- `:"",q=A?`[{ origin: '.phoenix/domain/application-types.ts', exports: specAdminComponents }, ...${j}]`:j;return`// prettier-ignore-file
5
+ `:"",H=A?`[{ origin: '.phoenix/domain/application-types.ts', exports: specAdminComponents }, ...${w}]`:w;return`// prettier-ignore-file
6
6
 
7
7
  ${e}
8
8
  ${B?`${B}
@@ -11,27 +11,29 @@ import * as interfaceFile from './configurator-interface.js'
11
11
  import * as adminInterfaceFile from './admin-interface.js'
12
12
 
13
13
  import { mountStandaloneAdminApplication } from '@salsita-ai/sdk/application'
14
+ import { defaultConfiguratorElements } from '@salsita-ai/sdk/configurator'
14
15
 
15
16
  import { configuratorBuilder } from './domain.js'${O}
16
- ${F?`
17
- ${F}`:""}${C?`
18
- ${C}`:""}${w?`
19
- ${w}`:""}${I?`
20
- ${I}`:""}${b?`
21
- ${b}`:""}${y.imports?`
22
- ${y.imports}`:""}${E}
23
- ${H}
17
+ ${C?`
18
+ ${C}`:""}${S?`
19
+ ${S}`:""}${j?`
20
+ ${j}`:""}${P?`
21
+ ${P}`:""}${I?`
22
+ ${I}`:""}${y.imports?`
23
+ ${y.imports}`:""}${k}
24
+ ${D}
24
25
  let builder = configuratorBuilder
25
26
  .withInterface(interfaceFile)
26
27
  .withInterface(adminInterfaceFile)
27
- .withComponentOptics(${S})
28
- .withAdminComponentOptics(${q})
29
- .withHandlers(${P})
30
- .withElements(${x})
28
+ .withComponentOptics(${F})
29
+ .withAdminComponentOptics(${H})
30
+ .withHandlers(${E})
31
+ .withDefaultElements(defaultConfiguratorElements)
32
+ .withElements(${b})
31
33
  ${n}${y.code?`
32
34
  ${y.code}`:""}
33
35
 
34
- ${k}
36
+ ${x}
35
37
 
36
38
  const config = builder.buildConfig()
37
39
 
@@ -1,23 +1,25 @@
1
- import{fileHeader as o}from"./file-header.js";import{defaultEnvsCode as e,generateImports as r,generateModuleEntries as t,generateModuleList as i,generateThemeCode as n,generateTransformerMap as a,generateTransformerRegistration as s,generateTransformerTypeImports as c}from"./generator-shared.js";export const generateFrontendConfiguratorFile=(l=[],$=[],f=[],m=[],p=[],d,g,u=!0,h=!1)=>{let C=r(l,"components"),j=i(t(l,"components")),w=r(m,"handlers"),F=i(t(m,"handlers")),b=r(p,"elements"),x=i(t(p,"elements")),A=a($,f),B=s(f),k=n(d,g),E=c(f.length>0);return`// prettier-ignore-file
2
- ${o}
3
- ${h?"":"import { mountConfiguratorApplication } from '@salsita-ai/sdk/application'\n"}${E?`${E}
1
+ import{fileHeader as t}from"./file-header.js";import{defaultEnvsCode as e,generateImports as o,generateModuleEntries as r,generateModuleList as i,generateThemeCode as n,generateTransformerMap as a,generateTransformerRegistration as s,generateTransformerTypeImports as l}from"./generator-shared.js";export const generateFrontendConfiguratorFile=(f=[],m=[],c=[],$=[],p=[],u,d,g=!0,h=!1)=>{let C=o(f,"components"),w=i(r(f,"components")),j=o($,"handlers"),E=i(r($,"handlers")),F=o(p,"elements"),b=i(r(p,"elements")),k=a(m,c),x=s(c),A=n(u,d),B=l(c.length>0);return`// prettier-ignore-file
2
+ ${t}
3
+ ${h?"":"import { mountConfiguratorApplication } from '@salsita-ai/sdk/application'\n"}import { defaultConfiguratorElements } from '@salsita-ai/sdk/configurator'
4
+ ${B?`${B}
4
5
  `:""}
5
6
  import * as interfaceFile from './configurator-interface.js'
6
7
 
7
8
  import { configuratorBuilder } from './domain.js'
8
9
  ${C?`
9
- ${C}`:""}${w?`
10
- ${w}`:""}${b?`
11
- ${b}`:""}${k.imports?`
12
- ${k.imports}`:""}${A}
10
+ ${C}`:""}${j?`
11
+ ${j}`:""}${F?`
12
+ ${F}`:""}${A.imports?`
13
+ ${A.imports}`:""}${k}
13
14
 
14
15
  const builder = configuratorBuilder
15
16
  .withInterface(interfaceFile)
16
- .withComponentOptics(${j})
17
- .withHandlers(${F})
18
- .withElements(${x})
19
- ${u?e:""}${k.code?`
20
- ${k.code}`:""}${B}
17
+ .withComponentOptics(${w})
18
+ .withHandlers(${E})
19
+ .withDefaultElements(defaultConfiguratorElements)
20
+ .withElements(${b})
21
+ ${g?e:""}${A.code?`
22
+ ${A.code}`:""}${x}
21
23
 
22
24
 
23
25
  ${h?"export const config = ":"const config = "}builder.buildConfig()
@@ -1,32 +1,34 @@
1
- import{fileHeader as e}from"./file-header.js";import{defaultEnvsCode as i,generateImports as n,generateModuleEntries as t,generateModuleList as o,generateThemeCode as m,generateTransformerMap as a,generateTransformerRegistration as r,generateTransformerTypeImports as s}from"./generator-shared.js";export const getFrontendEmbeddedAdminFile=(d,p,c=[],$=[],l=[],f=[],g=[],u=[],h=[],A,F,C)=>{let b=n(c,"components"),j=o(t(c,"components")),w=n($,"adminComponents"),E=o(t($,"adminComponents")),S=n(g,"handlers"),P=o(t(g,"handlers")),x=n(u,"elements"),I=n(h,"adminElements"),k=o([...t(u,"elements"),...t(h,"adminElements")]),y=a(l,f),B=r(f),O=m(A,F),H=s(f.length>0),q=C?`
1
+ import{fileHeader as e}from"./file-header.js";import{defaultEnvsCode as i,generateImports as n,generateModuleEntries as t,generateModuleList as o,generateThemeCode as a,generateTransformerMap as m,generateTransformerRegistration as r,generateTransformerTypeImports as s}from"./generator-shared.js";export const getFrontendEmbeddedAdminFile=(d,p,c=[],l=[],$=[],f=[],g=[],u=[],h=[],A,C,E)=>{let F=n(c,"components"),w=o(t(c,"components")),b=n(l,"adminComponents"),j=o(t(l,"adminComponents")),S=n(g,"handlers"),P=o(t(g,"handlers")),x=n(u,"elements"),I=n(h,"adminElements"),k=o([...t(u,"elements"),...t(h,"adminElements")]),y=m($,f),B=r(f),O=a(A,C),D=s(f.length>0),H=E?`
2
2
  import { createAdminPagesFromSpec } from '@salsita-ai/sdk/admin'
3
- import { $adminPagesSpec, $dataSpec } from './domain/application-types.js'`:"",v=C?`
3
+ import { $adminPagesSpec, $dataSpec } from './domain/application-types.js'`:"",q=E?`
4
4
  const { components: specAdminComponents, pages: specAdminPages } = createAdminPagesFromSpec($adminPagesSpec, $dataSpec)
5
- `:"",z=C?`[{ origin: '.phoenix/domain/application-types.ts', exports: specAdminComponents }, ...${E}]`:E;return`// prettier-ignore-file
5
+ `:"",v=E?`[{ origin: '.phoenix/domain/application-types.ts', exports: specAdminComponents }, ...${j}]`:j;return`// prettier-ignore-file
6
6
 
7
7
  ${e}
8
- ${H?`${H}
8
+ ${D?`${D}
9
9
  `:""}
10
10
  import * as interfaceFile from './configurator-interface.js'
11
11
  import * as adminInterfaceFile from './admin-interface.js'
12
12
 
13
13
  import { mountEmbeddedAdminApplication } from '@salsita-ai/sdk/application'
14
+ import { defaultConfiguratorElements } from '@salsita-ai/sdk/configurator'
14
15
 
15
- import { configuratorBuilder } from './domain.js'${q}
16
- ${b?`
17
- ${b}`:""}${w?`
18
- ${w}`:""}${S?`
16
+ import { configuratorBuilder } from './domain.js'${H}
17
+ ${F?`
18
+ ${F}`:""}${b?`
19
+ ${b}`:""}${S?`
19
20
  ${S}`:""}${x?`
20
21
  ${x}`:""}${I?`
21
22
  ${I}`:""}${O.imports?`
22
23
  ${O.imports}`:""}${y}
23
- ${v}
24
+ ${q}
24
25
  let builder = configuratorBuilder
25
26
  .withInterface(interfaceFile)
26
27
  .withInterface(adminInterfaceFile)
27
- .withComponentOptics(${j})
28
- .withAdminComponentOptics(${z})
28
+ .withComponentOptics(${w})
29
+ .withAdminComponentOptics(${v})
29
30
  .withHandlers(${P})
31
+ .withDefaultElements(defaultConfiguratorElements)
30
32
  .withElements(${k})
31
33
  ${i}${O.code?`
32
34
  ${O.code}`:""}
@@ -1,34 +1,36 @@
1
- import{fileHeader as e}from"./file-header.js";import{defaultEnvsCode as o,generateImports as t,generateModuleEntries as r,generateModuleList as i,generateThemeCode as n,generateTransformerMap as a,generateTransformerRegistration as d,generateTransformerTypeImports as m}from"./generator-shared.js";export const getFrontendEmbeddedConfiguratorFile=(s,l,f=[],$=[],c=[],p=[],u=[],g,h)=>{let b=t(f,"components"),C=i(r(f,"components")),j=t(p,"handlers"),w=i(r(p,"handlers")),E=t(u,"elements"),F=i(r(u,"elements")),x=a($,c),A=d(c),B=n(g,h),k=m(c.length>0);return`// prettier-ignore-file
1
+ import{fileHeader as e}from"./file-header.js";import{defaultEnvsCode as t,generateImports as o,generateModuleEntries as r,generateModuleList as i,generateThemeCode as n,generateTransformerMap as a,generateTransformerRegistration as l,generateTransformerTypeImports as s}from"./generator-shared.js";export const getFrontendEmbeddedConfiguratorFile=(f,m,d=[],u=[],c=[],$=[],p=[],g,h)=>{let C=o(d,"components"),E=i(r(d,"components")),b=o($,"handlers"),w=i(r($,"handlers")),j=o(p,"elements"),F=i(r(p,"elements")),k=a(u,c),x=l(c),A=n(g,h),B=s(c.length>0);return`// prettier-ignore-file
2
2
 
3
3
  ${e}
4
- ${k?`${k}
4
+ ${B?`${B}
5
5
  `:""}
6
6
  import * as interfaceFile from './configurator-interface.js'
7
7
 
8
8
  import { mountEmbeddedConfiguratorApplication } from '@salsita-ai/sdk/application'
9
+ import { defaultConfiguratorElements } from '@salsita-ai/sdk/configurator'
9
10
 
10
11
  import { configuratorBuilder } from './domain.js'
11
- ${b?`
12
+ ${C?`
13
+ ${C}`:""}${b?`
12
14
  ${b}`:""}${j?`
13
- ${j}`:""}${E?`
14
- ${E}`:""}${B.imports?`
15
- ${B.imports}`:""}${x}
15
+ ${j}`:""}${A.imports?`
16
+ ${A.imports}`:""}${k}
16
17
 
17
18
  const builder = configuratorBuilder
18
19
  .withInterface(interfaceFile)
19
- .withComponentOptics(${C})
20
+ .withComponentOptics(${E})
20
21
  .withHandlers(${w})
22
+ .withDefaultElements(defaultConfiguratorElements)
21
23
  .withElements(${F})
22
- ${o}${B.code?`
23
- ${B.code}`:""}${A}
24
+ ${t}${A.code?`
25
+ ${A.code}`:""}${x}
24
26
 
25
27
 
26
28
  const config = builder.buildConfig()
27
29
 
28
30
  export default {
29
31
  mount: () => {
30
- mountEmbeddedConfiguratorApplication(config, '${s}', '${l}')
31
- return 'salsita-configurator-${s}-${l}'
32
+ mountEmbeddedConfiguratorApplication(config, '${f}', '${m}')
33
+ return 'salsita-configurator-${f}-${m}'
32
34
  },
33
35
  config,
34
36
  }
@@ -1 +1 @@
1
- import{existsSync as e,lstatSync as i,readFileSync as t,readdirSync as r,rmSync as o,unlinkSync as s}from"fs";import{join as n}from"path";import{format as a}from"prettier";import{prettierrc as l}from"@salsita-ai/common/prettier";import{GeneratedApplication as c,GeneratedApplicationFile as p,RuntimeReferenceStore as g,buildPhoenixDefinitions as f,createContentDiffTracker as h,generateApplicationCode as d,parseApplicationFiles as m}from"#package/application-spec";import{getAllPhxDefinitions as u}from"#package/domain";import{compileWithSwc as w}from"../services/swc.js";import{isInsideGitRepository as b,syncChangedFiles as S}from"../utils/index.js";import{readApplicationFiles as j}from"./application-spec-file-reader.js";import{cleanStaleAgentSkills as v,removeProjectFiles as D}from"./clean-project-files.js";import{swcEvalExpressionParser as F,swcModuleAnalyzer as x}from"./swc-module-analyzer.js";let y=".phoenix",P=`${y}/`,k=async e=>{if(e.binary||!1===e.format)return e;try{let i=await a(e.content,{...l,filepath:e.path});return p(e.path,i,{binary:e.binary,format:e.format})}catch{return e}},C=async e=>{let[i,t,r]=await Promise.all([Promise.all(e.generatedProjectFiles.map(k)),Promise.all(e.initialProjectFiles.map(k)),Promise.all(e.prettierFiles.map(k))]);return c({files:e.files,generatedProjectFiles:i,initialProjectFiles:t,prettierFiles:r,removedProjectFiles:e.removedProjectFiles})};export class ApplicationSpecBuilder{contentDiff;referenceStore;config;logger;phxDefinitions;constructor(e){this.config=e,this.logger=e.logger,this.referenceStore=new g,this.contentDiff=h({readDiskContent:this.readDiskContent}),this.phxDefinitions=f(u())}async build(e){let i=e?.parsingContext,t=e?.compile??!0;e?.force&&this.referenceStore.clear();let r=i?.startSpan("readFiles","build","application-spec-builder.ts"),o=e?.rawProjectFiles??await j({envs:{}});r?.();let s=m({rawProjectFiles:o,phxDefinitions:this.phxDefinitions},{analyzer:x,evalExpressionParser:F,referenceStore:this.referenceStore,logger:this.logger,parsingContext:i});if(!s.ok)return{ok:!1,rawProjectFiles:o,errors:s.errors,diagnostics:s.diagnostics,metrics:s.metrics,counts:s.counts};let{applicationSpec:n,categorizedFiles:a,rawMockTemplates:l}=s.value,c=i?.startSpan("generateCode","build","application-spec-builder.ts"),p=b(process.cwd());p||this.logger.debug(" Not inside a git repository, .gitignore is not written");let g=d({applicationSpec:n,categorizedFiles:a,phxDefinitions:this.phxDefinitions,sdkVersion:this.config.sdkVersion,projectInGitRepository:p,cliUseWorkspace:this.config.cliUseWorkspace,name:this.config.name,description:this.config.description,projectSlug:this.config.projectSlug,environmentSlug:this.config.environmentSlug,enableEditor:this.config.enableEditor,inlineTemplates:this.config.inlineTemplates,rawMockTemplates:l});c?.();let f=i?.startSpan("cleanStaleFiles","build","application-spec-builder.ts"),h=new Set(g.files.map(e=>e.path));this.cleanStaleGeneratedFiles(h),D(g.removedProjectFiles,{logger:this.logger}),v(new Set(g.generatedProjectFiles.map(e=>e.path)),{logger:this.logger}),f?.();let u=i?.startSpan("contentDiff","build","application-spec-builder.ts"),w=await C(g),y=this.contentDiff.getChangedApplicationFiles(w,{generatedFilesPathPrefix:P,force:e?.force}),k=y.changedGeneratedFiles;u?.(),k.length>0?this.logger.info(` ${k.length}/${g.files.length} generated files changed`):this.logger.info(" No generated files changed");let $=y.filesToWrite.length-k.length;$>0&&this.logger.info(` ${$} project files changed`);let T=i?.startSpan("writeFiles","build","application-spec-builder.ts");return await S(y.filesToWrite,{logger:this.logger,skipChecksum:!0}),T?.(),t&&await this.compile(i),{ok:!0,application:s.value,changedFiles:k,diagnostics:s.diagnostics,metrics:s.metrics,counts:s.counts}}async compile(e){let i=e?.startSpan("swcCompile(src)","build","application-spec-builder.ts");await w({sourceDir:"src",outDir:`./${y}/.swc/src`},{logger:this.logger}),i?.();let t=e?.startSpan("swcCompile(.phoenix)","build","application-spec-builder.ts");await w({sourceDir:y,outDir:`./${y}/.swc/${y}`},{logger:this.logger}),t?.()}readDiskContent=i=>{try{if(e(i))return t(i,"utf-8")}catch{}};cleanStaleGeneratedFiles(t){let a=new Set(["public",".swc","dist","phoenix-dev.log","phoenix-dev.log.1","phoenix-dev.log.2","variants","variant-recovery.json"]);try{if(!e(y))return;for(let e of r(y)){if(a.has(e)||t.has(e))continue;let r=n(y,e);try{let e=i(r);if(e.isSymbolicLink())continue;e.isDirectory()?o(r,{recursive:!0}):s(r),this.logger.debug(` Removed stale: ${r}`)}catch{}}}catch{}}}
1
+ import{existsSync as e,lstatSync as i,readFileSync as t,readdirSync as r,rmSync as o,unlinkSync as s}from"fs";import{join as n}from"path";import{format as a}from"prettier";import{prettierrc as l}from"@salsita-ai/common/prettier";import{GeneratedApplication as c,GeneratedApplicationFile as p,RuntimeReferenceStore as g,buildPhoenixDefinitions as f,createContentDiffTracker as h,generateApplicationCode as d,parseApplicationFiles as m}from"#package/application-spec";import{getAllPhxDefinitions as u}from"#package/domain";import{compileWithSwc as w}from"../services/swc.js";import{isInsideGitRepository as b,syncChangedFiles as S}from"../utils/index.js";import{readApplicationFiles as j}from"./application-spec-file-reader.js";import{cleanStaleAgentSkills as v,removeProjectFiles as D}from"./clean-project-files.js";import{swcEvalExpressionParser as F,swcModuleAnalyzer as x}from"./swc-module-analyzer.js";let y=".phoenix",P=`${y}/`,k=async e=>{if(e.binary||!1===e.format)return e;try{let i=await a(e.content,{...l,filepath:e.path});return p(e.path,i,{binary:e.binary,format:e.format})}catch{return e}},C=async e=>{let[i,t,r]=await Promise.all([Promise.all(e.generatedProjectFiles.map(k)),Promise.all(e.initialProjectFiles.map(k)),Promise.all(e.prettierFiles.map(k))]);return c({files:e.files,generatedProjectFiles:i,initialProjectFiles:t,prettierFiles:r,removedProjectFiles:e.removedProjectFiles})};export class ApplicationSpecBuilder{contentDiff;referenceStore;config;logger;phxDefinitions;constructor(e){this.config=e,this.logger=e.logger,this.referenceStore=new g,this.contentDiff=h({readDiskContent:this.readDiskContent}),this.phxDefinitions=f(u())}async build(e){let i=e?.parsingContext,t=e?.compile??!0;e?.force&&this.referenceStore.clear();let r=i?.startSpan("readFiles","build","application-spec-builder.ts"),o=e?.rawProjectFiles??await j({envs:{}});r?.();let s=m({rawProjectFiles:o,phxDefinitions:this.phxDefinitions},{analyzer:x,evalExpressionParser:F,referenceStore:this.referenceStore,logger:this.logger,parsingContext:i});if(!s.ok)return{ok:!1,rawProjectFiles:o,errors:s.errors,diagnostics:s.diagnostics,metrics:s.metrics,counts:s.counts};let{applicationSpec:n,categorizedFiles:a,rawMockTemplates:l}=s.value,c=i?.startSpan("generateCode","build","application-spec-builder.ts"),p=b(process.cwd());p||this.logger.debug(" Not inside a git repository, .gitignore is not written");let g=d({applicationSpec:n,categorizedFiles:a,phxDefinitions:this.phxDefinitions,sdkVersion:this.config.sdkVersion,projectInGitRepository:p,cliUseWorkspace:this.config.cliUseWorkspace,name:this.config.name,description:this.config.description,projectSlug:this.config.projectSlug,environmentSlug:this.config.environmentSlug,enableEditor:this.config.enableEditor,inlineTemplates:this.config.inlineTemplates,rawMockTemplates:l});c?.();let f=i?.startSpan("cleanStaleFiles","build","application-spec-builder.ts"),h=new Set(g.files.map(e=>e.path));this.cleanStaleGeneratedFiles(h),D(g.removedProjectFiles,{logger:this.logger}),v(new Set(g.generatedProjectFiles.map(e=>e.path)),{logger:this.logger}),f?.();let u=i?.startSpan("contentDiff","build","application-spec-builder.ts"),w=await C(g),y=this.contentDiff.getChangedApplicationFiles(w,{generatedFilesPathPrefix:P,force:e?.force}),k=y.changedGeneratedFiles;u?.(),k.length>0?this.logger.info(` ${k.length}/${g.files.length} generated files changed`):this.logger.info(" No generated files changed");let $=y.filesToWrite.length-k.length;$>0&&this.logger.info(` ${$} project files changed`);let T=i?.startSpan("writeFiles","build","application-spec-builder.ts");return await S(y.filesToWrite,{logger:this.logger,skipChecksum:!0}),T?.(),t&&await this.compile(i),{ok:!0,application:s.value,changedFiles:k,diagnostics:s.diagnostics,metrics:s.metrics,counts:s.counts}}async compile(e){let i=e?.startSpan("swcCompile(src)","build","application-spec-builder.ts");await w({sourceDir:"src",outDir:`./${y}/.swc/src`},{logger:this.logger}),i?.();let t=e?.startSpan("swcCompile(.phoenix)","build","application-spec-builder.ts");await w({sourceDir:y,outDir:`./${y}/.swc/${y}`},{logger:this.logger}),t?.()}readDiskContent=i=>{try{if(e(i))return t(i,"utf-8")}catch{}};cleanStaleGeneratedFiles(t){let a=new Set(["public",".swc","dist","phoenix-dev.log","phoenix-dev.log.1","phoenix-dev.log.2","variants","variant-recovery.json",".env.generated"]);try{if(!e(y))return;for(let e of r(y)){if(a.has(e)||t.has(e))continue;let r=n(y,e);try{let e=i(r);if(e.isSymbolicLink())continue;e.isDirectory()?o(r,{recursive:!0}):s(r),this.logger.debug(` Removed stale: ${r}`)}catch{}}}catch{}}}
@@ -1 +1 @@
1
- import{runCommand as e}from"../utils/index.js";import{checkFiles as t}from"./prettier.js";export const runCheckCommand=async(r,c)=>{let{logger:s}=c,i=!0===r.types||!0===r.lint||!0===r.format,o=!i||!0===r.types,n=!i||!0===r.lint,a=!i||!0===r.format;try{if(s.step("Running checks"),o&&await e({command:"tsc",args:["--project","tsconfig.json","--noEmit","--checkers","1"],description:"TypeScript check",quiet:!0},{logger:s}),n&&await e({command:"eslint",args:["src"],description:"ESLint check",quiet:!0},{logger:s}),a){if(s.step("Prettier check"),!await t(".",{logger:s}))throw Error("Prettier check failed");s.success("Prettier check passed")}s.success("All checks passed!")}catch(e){s.error(`Check failed: ${e instanceof Error?e.message:String(e)}`,e),process.exit(1)}};
1
+ import{runCommand as e}from"../utils/index.js";import{checkFiles as t}from"./prettier.js";export const runCheckCommand=async(r,c)=>{let{logger:s}=c,i=!0===r.types||!0===r.lint||!0===r.format,o=!i||!0===r.types,n=!i||!0===r.lint,a=!i||!0===r.format;try{if(s.step("Running checks"),o&&await e({command:"tsc",args:["--project","tsconfig.json","--noEmit","--checkers","1"],description:"TypeScript check",quiet:!0},{logger:s}),n&&await e({command:"eslint",args:["src","--no-error-on-unmatched-pattern"],description:"ESLint check",quiet:!0},{logger:s}),a){if(s.step("Prettier check"),!await t(".",{logger:s}))throw Error("Prettier check failed");s.success("Prettier check passed")}s.success("All checks passed!")}catch(e){s.error(`Check failed: ${e instanceof Error?e.message:String(e)}`,e),process.exit(1)}};
@@ -1,4 +1,4 @@
1
- import{openAsBlob as e}from"node:fs";import{createApiBaseClient as t}from"#package/client";import{resolveApplicationSpecDeploymentData as i}from"../application-spec/index.js";import{createSourceArchive as o,getServerCredentials as r}from"../services/index.js";import{ensureWorkspaceInstallSettings as a}from"../utils/index.js";let s={queued:"Waiting for a build runner",preparing:"Preparing the deployment",building:"Building the project",deploying:"Deploying the frontend, webhooks and assets",live:"Live",failed:"Failed",cancelled:"Cancelled"},n=e=>new Promise(t=>setTimeout(t,e)),l=async(t,i)=>{let o=new FormData;for(let[e,i]of Object.entries(t.fields))o.append(e,i);o.append("file",await e(i,{type:"application/gzip"}),"sources.tgz");let r=await fetch(t.url,{method:"POST",body:o});if(!r.ok)throw Error(`Uploading the sources failed with HTTP ${r.status}: ${await r.text()}`)};export const runDeployCommand=async(e,{logger:d})=>{let u=await r(e.serverUrl),{pollIntervalMs:c}=e;if(!u)throw Error(`You are not signed in to ${e.serverUrl}. Run \`phoenix login <workspace>\` first.`);let p=t(e.serverUrl),h={authorization:`Bearer ${u.token}`};d.step("Validating the application spec");let m=await i({skipUpload:!0,logger:d});d.success(`The spec is valid (application version ${m.applicationVersion})`),d.step(`Packing the project for ${u.customerName}`),a(e.projectDir);let f=await o(e.projectDir);try{let t;d.info(` ${f.fileCount} files, ${(t=f.size)<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}`);let i=await p.POST("/deployments/builds",{body:{sdkVersion:e.sdkVersion,sizeBytes:f.size,configurationSchema:{version:m.schemaVersion,schema:m.schema},adminConfigurationSchema:m.adminSchema?{version:m.adminSchemaVersion,schema:m.adminSchema}:void 0},headers:h});if(i.error||!i.data)throw Error(`The server did not create a build: ${i.error?.message??"no response"}`);let{buildId:o,upload:r}=i.data;d.step("Uploading the sources"),await l(r,f.path);let a=await p.POST("/deployments/builds/{buildId}/start",{params:{path:{buildId:o}},headers:{...h,"content-type":null}});if(a.error)throw Error(`The server did not start the build: ${a.error.message}`);if(a.data?.status==="failed")throw Error(`Build ${o} could not be started: ${a.data.error??"the server gave no reason"}`);if(d.success(`Build ${o} started`),u.studioUrl){let e=new URL(`/builder/deployments/${o}`,u.studioUrl);e.searchParams.set("customer",u.customerSlug),d.info(`Follow the build in Studio: ${e.toString()}`)}if(!e.wait)return;let g=null,w=0;for(;;){let{data:e,error:t}=await p.GET("/deployments/builds/{buildId}",{params:{path:{buildId:o}},headers:h}).catch(e=>({data:void 0,error:{message:String(e)}}));if(t||!e){if((w+=1)>=5)throw Error(`Following build ${o} failed: ${t?.message??"no response"}. The build may still finish; check Deployments in Studio.`);await n(c);continue}if(w=0,e.status!==g&&(g=e.status,d.step(s[e.status])),"live"===e.status){d.success(`Your configurator is live at ${e.configuratorUrl}`),d.info("Coding agents: when the user has nothing more to build, offer the run evaluation from the phoenix-feedback skill, once per conversation.");return}if("failed"===e.status||"cancelled"===e.status||e.timedOut){let t=await p.GET("/deployments/builds/{buildId}/log",{params:{path:{buildId:o}},headers:h}).catch(()=>({data:void 0})),i=(t.data?.log??"").trim().split("\n").slice(-40).join("\n");i&&d.info(`
1
+ import{openAsBlob as e}from"node:fs";import{createApiBaseClient as t}from"#package/client";import{resolveApplicationSpecDeploymentData as i}from"../application-spec/index.js";import{createSourceArchive as o,getServerCredentials as r}from"../services/index.js";import{ensureWorkspaceInstallSettings as a}from"../utils/index.js";let s={queued:"Waiting for a build runner",preparing:"Preparing the deployment",building:"Building the project",deploying:"Deploying the frontend, webhooks and assets",live:"Live",failed:"Failed",cancelled:"Cancelled"},n=e=>new Promise(t=>setTimeout(t,e)),l=async(t,i)=>{let o=new FormData;for(let[e,i]of Object.entries(t.fields))o.append(e,i);o.append("file",await e(i,{type:"application/gzip"}),"sources.tgz");let r=await fetch(t.url,{method:"POST",body:o});if(!r.ok)throw Error(`Uploading the sources failed with HTTP ${r.status}: ${await r.text()}`)};export const runDeployCommand=async(e,{logger:d})=>{let u=await r(e.serverUrl),{pollIntervalMs:c}=e;if(!u)throw Error(`You are not signed in to ${e.serverUrl}. Run \`phoenix login <workspace>\` first.`);let p=t(e.serverUrl),h={authorization:`Bearer ${u.token}`};d.step("Validating the application spec");let m=await i({skipUpload:!0,logger:d});d.success(`The spec is valid (application version ${m.applicationVersion})`),d.step(`Packing the project for ${u.customerName}`),a(e.projectDir);let f=await o(e.projectDir);try{let t;f.hasConversationLog?d.info("Including conversation.log in the private sources archive. It is not published with the application."):d.warn("No conversation.log found in the project root. Deploying without a conversation transcript."),d.info(` ${f.fileCount} files, ${(t=f.size)<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}`);let i=await p.POST("/deployments/builds",{body:{sdkVersion:e.sdkVersion,sizeBytes:f.size,configurationSchema:{version:m.schemaVersion,schema:m.schema},adminConfigurationSchema:m.adminSchema?{version:m.adminSchemaVersion,schema:m.adminSchema}:void 0},headers:h});if(i.error||!i.data)throw Error(`The server did not create a build: ${i.error?.message??"no response"}`);let{buildId:o,upload:r}=i.data;d.step("Uploading the sources"),await l(r,f.path);let a=await p.POST("/deployments/builds/{buildId}/start",{params:{path:{buildId:o}},headers:{...h,"content-type":null}});if(a.error)throw Error(`The server did not start the build: ${a.error.message}`);if(a.data?.status==="failed")throw Error(`Build ${o} could not be started: ${a.data.error??"the server gave no reason"}`);if(d.success(`Build ${o} started`),u.studioUrl){let e=new URL(`/builder/deployments/${o}`,u.studioUrl);e.searchParams.set("customer",u.customerSlug),d.info(`Follow the build in Studio: ${e.toString()}`)}if(!e.wait)return;let g=null,w=0;for(;;){let{data:e,error:t}=await p.GET("/deployments/builds/{buildId}",{params:{path:{buildId:o}},headers:h}).catch(e=>({data:void 0,error:{message:String(e)}}));if(t||!e){if((w+=1)>=5)throw Error(`Following build ${o} failed: ${t?.message??"no response"}. The build may still finish; check Deployments in Studio.`);await n(c);continue}if(w=0,e.status!==g&&(g=e.status,d.step(s[e.status])),"live"===e.status){d.success(`Your configurator is live at ${e.configuratorUrl}`),d.info("Coding agents: when the user has nothing more to build, offer the run evaluation from the phoenix-feedback skill, once per conversation.");return}if("failed"===e.status||"cancelled"===e.status||e.timedOut){let t=await p.GET("/deployments/builds/{buildId}/log",{params:{path:{buildId:o}},headers:h}).catch(()=>({data:void 0})),i=(t.data?.log??"").trim().split("\n").slice(-40).join("\n");i&&d.info(`
2
2
  Last lines of the build log:
3
3
  ${i}
4
4
  `);let r=e.timedOut?"it took too long":e.error??"see the build log";throw Error(`Build ${o} did not go live: ${r}`)}await n(c)}}finally{await f.cleanup()}};
@@ -1,5 +1,5 @@
1
- import{format as e}from"node:util";import{createServer as r}from"vite";import{startEditorServer as t}from"../editor-server/index.js";import{getDevelopmentCredentialHint as o}from"../services/development-credential.js";import{ApplicationSpecProjectWatcher as n,LinguiWatcher as s,LogBus as i,MockTemplateWatcher as a,PhoenixApplication as l,PhoenixPubSub as c,PhoenixStore as p,VariantPreviewService as d,WebhookTunnelMonitor as u,createBusLogger as m,getViteDevConfig as w,patchConsole as g,setViteLogSink as v}from"../services/index.js";import{prepareDevelopmentEnvironment as h}from"../services/prepare-development-environment.js";import{createWebhookTunnelTransport as f,readOrCreateTunnelSessionId as E,startWebhookService as b}from"../services/webhook-service/index.js";import{startTui as S}from"../tui/index.js";import{FileLogger as I,createLogger as k,exists as $}from"../utils/index.js";import{buildWebhooks as j,setLogger as x,webhookLogContext as P}from"../webhooks/index.js";import{generateProjectFilesAndInstallDependencies as R}from"./generate-project-files.js";import{readGeneratedEnvMarkers as T}from"./generated-env-markers.js";export const runDevCommand=async(N,D)=>{let{logger:y}=D,{sdkVersion:_,projectSlug:O,environmentSlug:L,cliUseWorkspace:U,enableEditor:V,editorWsPort:M,debug:W=!1,withLingui:G=!1,persistenceMode:Y,force:C=!1,tui:H=!1,serverUrl:B,credential:X,skipUpload:q}=N,F=null,J=null,Q=null,z=null,A=null,K=null,Z=null,ee=new I,er=new c,et=new i,eo=H&&!!process.stdout.isTTY&&!!process.stdin.isTTY,en=!eo,es=null;H&&!eo&&y.warn("TUI requested but stdin/stdout is not an interactive terminal — falling back to plain log output. Run phoenix dev --tui directly in a terminal to use the TUI.");let ei=null,ea=y,el=null,ec=()=>{es&&(es(),es=null),ei&&(ei.unmount(),ei=null,ea=k({debug:W,fileLogger:ee}))},ep=(e=0)=>el||(el=(async()=>{process.off("SIGINT",ed),process.off("SIGTERM",ed),process.off("uncaughtException",eu),ec(),ea.debug("Shutting down...");let r=[];for(let e of[{name:"lingui watcher",close:()=>z?.close()},{name:"project watcher",close:()=>K?.close()},{name:"mock template watcher",close:()=>A?.close()},{name:"editor server",close:()=>Q?.close()},{name:"variant previews",close:()=>Z?.close()},{name:"vite server",close:()=>F?.close()},{name:"webhook tunnel",close:()=>J?.stop()}])try{ea.debug(`Shutting down ${e.name}`),await e.close()}catch(t){r.push(`${e.name}: ${t instanceof Error?t.message:String(t)}`)}r.length>0&&ea.warn(`Cleanup warnings:
2
- ${r.join("\n ")}`),ea.debug("Shutdown complete"),await ee.close(),process.exit(e)})()),ed=()=>{ep(0)},eu=e=>{ec(),ea.error(`Uncaught exception: ${e.message}`),ep(1)};process.once("SIGINT",ed),process.once("SIGTERM",ed),process.once("uncaughtException",eu);try{await ee.init(".phoenix"),ea=m({bus:et,stream:"spec",debug:W,fileLogger:ee,echo:!0}),v((e,r)=>et.push("vite",e,r),{echo:en}),x({transports:[],log:(r,...t)=>{et.push("webhook","warn"===r||"error"===r?r:"info",e(...t)),en&&process.stdout.write(`${e(r,...t)}
3
- `)}}),er.browserConsole$.subscribe(e=>{et.push("browser",e.level,e.source?`[${e.source}] ${e.message}`:e.message);let r=`[${e.source?`browser:${e.source}`:"browser"}] ${e.message}`;ee.write("warn",r),en&&process.stderr.write(`⚠️ ${r}
4
- `)}),en&&(es=g(et,{echo:!0})),process.env.NODE_ENV="development",Y&&(process.env.PERSISTENCE_MODE=Y);let i=!Y||"server"===Y;i&&B&&(process.env.SERVER_URL=B);let c=i&&B?new u(B):void 0;if(ea.step("Starting development mode"),!await $("spec")){ea.error('Spec folder not found. Run "phoenix init" first.'),await ep(1);return}if(i){if(!B||!X)throw Error("Server persistence needs a server and a credential. Run `phoenix login <workspace>`, or create a development environment in Studio and paste its .env block into .env.");let e=await T(".env.generated");e?.PHOENIX_PROJECT_SLUG!==O||e.PHOENIX_ENVIRONMENT_SLUG!==L||e.PHOENIX_SERVER_URL!==B?(ea.step("Preparing development deployment"),await h({serverUrl:B,projectSlug:O,environmentSlug:L,credential:X,outFile:".env.generated",skipUpload:q,overrideSchema:!0,debug:W,projectVersion:_},{logger:ea})):ea.debug(".env.generated matches the current development environment, skipping prepare")}ea.step("Building project files");let{templateFiles:I}=await R({sdkVersion:_,projectSlug:O,environmentSlug:L,cliUseWorkspace:U,enableEditor:V,withLingui:G,force:C},{logger:ea});if(ea.success("Project files built successfully"),eo&&(ea=m({bus:et,stream:"spec",debug:W,fileLogger:ee}),es=g(et),ei=S(et,{onQuit:()=>void ep(0)})),G?(z=new s({logger:ea})).start():ea.warn("Lingui is disabled: i18n messages are not extracted or compiled during dev. Pass --withLingui or set WITH_LINGUI=true to enable."),i&&(ea.step("Building webhooks"),await P.run("webhook",async()=>{await j({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js"})})),i&&B&&X){let e=await T(".env.generated");if(!e?.DEPLOYMENT_ID)throw Error("Webhook tunnel cannot start because .env.generated has no DEPLOYMENT_ID. Rerun phoenix dev to prepare the development deployment.");let r=await E();J=await b({experimental:!0,transport:f({serverUrl:B,credential:X,projectSlug:O,environmentSlug:L}),rejectionHint:o(X,O),environmentSlug:L,deploymentId:e.DEPLOYMENT_ID,sessionId:r,onStatus:(t,o)=>{c?.setStatus(t,{deploymentId:e.DEPLOYMENT_ID,sessionId:r,message:o??null})},onRequest:e=>c?.record(e)}),c?.setStatus("waiting",{deploymentId:e.DEPLOYMENT_ID,sessionId:r}),J.stopped.catch(e=>{ec(),ea.error(`Webhook tunnel failed: ${e instanceof Error?e.message:String(e)}`),ep(1)}),ea.success("Webhook tunnel started")}K=new n({pubsub:er,logger:ea,onRebuilt:()=>z?.trigger(),onViteServerChange:e=>{F=e},sdkVersion:_,projectSlug:O,environmentSlug:L,cliUseWorkspace:U,enableEditor:V??!0,inlineTemplates:!1,useServer:i});let k=new p;if(Z=new l({store:k,pubsub:er,variantPreviews:new d({projectRoot:process.cwd()},{store:k,logger:ea,projectWatcher:K})}),V&&M){ea.step("Starting editor WebSocket server");let e=parseInt(M,10);Q=t({port:e,projectRoot:process.cwd(),application:Z,logger:ea,logBus:et,tunnelMonitor:c,debug:W,prepareDeployment:i&&B&&X?()=>h({serverUrl:B,projectSlug:O,environmentSlug:L,credential:X,outFile:".env.generated",skipUpload:!0,overrideSchema:!0,debug:!1,projectVersion:_},{logger:ea}):void 0}),await Q.ready,ea.debug(`Editor WebSocket server started on port ${e}`),(A=new a({projectRoot:process.cwd(),pubsub:er,logger:ea})).start()}let N=await w({templateFiles:I});F=await r(N),await F.listen(),ea.step("Starting Vite dev server"),K.start(F);let D=F.resolvedUrls?.local[0];if(eo)ea.success("Vite dev server started — watching for changes"),D&&ea.info(`Preview: ${D}`),V&&M&&ea.info(`Editor WebSocket: ws://localhost:${M}`);else if(W)ea.success("Vite dev server started"),D&&ea.info(`Preview: ${D}`);else{let e=e=>{et.push("spec","info",e),process.stdout.write(`${e}
5
- `)};e("\n\uD83D\uDE80 Phoenix Dev Server\n"),D&&(e(`Preview: ${D}`),ee.write("info",`Preview: ${D}`)),V&&M&&e(`Editor WebSocket: ws://localhost:${M}`),e("\n\uD83D\uDC40 Watching for changes...\n")}}catch(e){ec(),ea.error(`Dev mode failed: ${e instanceof Error?e.message:String(e)}`,e),await ep(1)}};
1
+ import{mkdir as e}from"node:fs/promises";import{dirname as r}from"node:path";import{format as t}from"node:util";import{createServer as o}from"vite";import{resolveGeneratedEnvFile as s}from"@salsita-ai/common/env";import{startEditorServer as n}from"../editor-server/index.js";import{getDevelopmentCredentialHint as i}from"../services/development-credential.js";import{ApplicationSpecProjectWatcher as a,LinguiWatcher as l,LogBus as c,MockTemplateWatcher as p,PhoenixApplication as d,PhoenixPubSub as u,PhoenixStore as m,VariantPreviewService as w,WebhookTunnelMonitor as v,createBusLogger as g,getViteDevConfig as h,patchConsole as f,setViteLogSink as E}from"../services/index.js";import{prepareDevelopmentEnvironment as b}from"../services/prepare-development-environment.js";import{createWebhookTunnelTransport as S,readOrCreateTunnelSessionId as k,startWebhookService as I}from"../services/webhook-service/index.js";import{startTui as $}from"../tui/index.js";import{FileLogger as x,createLogger as j,exists as P}from"../utils/index.js";import{buildWebhooks as R,setLogger as T,webhookLogContext as N}from"../webhooks/index.js";import{generateProjectFilesAndInstallDependencies as y}from"./generate-project-files.js";import{readGeneratedEnvMarkers as D}from"./generated-env-markers.js";export const runDevCommand=async(_,U)=>{let{logger:O}=U,{sdkVersion:L,projectSlug:M,environmentSlug:V,cliUseWorkspace:W,enableEditor:G,editorWsPort:Y,debug:C=!1,withLingui:H=!1,persistenceMode:B,force:X=!1,tui:q=!1,serverUrl:J,credential:Q,skipUpload:z}=_,A=null,F=null,K=null,Z=null,ee=null,er=null,et=null,eo=new x,es=new u,en=new c,ei=q&&!!process.stdout.isTTY&&!!process.stdin.isTTY,ea=!ei,el=null;q&&!ei&&O.warn("TUI requested but stdin/stdout is not an interactive terminal — falling back to plain log output. Run phoenix dev --tui directly in a terminal to use the TUI.");let ec=null,ep=O,ed=null,eu=async(t,o)=>{let n=s(".");await e(r(n),{recursive:!0}),await b({serverUrl:t.serverUrl,projectSlug:M,environmentSlug:V,credential:t.credential,outFile:n,skipUpload:o.skipUpload,overrideSchema:!0,debug:o.debug,projectVersion:L},{logger:ep})},em=()=>{el&&(el(),el=null),ec&&(ec.unmount(),ec=null,ep=j({debug:C,fileLogger:eo}))},ew=(e=0)=>ed||(ed=(async()=>{process.off("SIGINT",ev),process.off("SIGTERM",ev),process.off("uncaughtException",eg),em(),ep.debug("Shutting down...");let r=[];for(let e of[{name:"lingui watcher",close:()=>Z?.close()},{name:"project watcher",close:()=>er?.close()},{name:"mock template watcher",close:()=>ee?.close()},{name:"editor server",close:()=>K?.close()},{name:"variant previews",close:()=>et?.close()},{name:"vite server",close:()=>A?.close()},{name:"webhook tunnel",close:()=>F?.stop()}])try{ep.debug(`Shutting down ${e.name}`),await e.close()}catch(t){r.push(`${e.name}: ${t instanceof Error?t.message:String(t)}`)}r.length>0&&ep.warn(`Cleanup warnings:
2
+ ${r.join("\n ")}`),ep.debug("Shutdown complete"),await eo.close(),process.exit(e)})()),ev=()=>{ew(0)},eg=e=>{em(),ep.error(`Uncaught exception: ${e.message}`),ew(1)};process.once("SIGINT",ev),process.once("SIGTERM",ev),process.once("uncaughtException",eg);try{await eo.init(".phoenix"),ep=g({bus:en,stream:"spec",debug:C,fileLogger:eo,echo:!0}),E((e,r)=>en.push("vite",e,r),{echo:ea}),T({transports:[],log:(e,...r)=>{en.push("webhook","warn"===e||"error"===e?e:"info",t(...r)),ea&&process.stdout.write(`${t(e,...r)}
3
+ `)}}),es.browserConsole$.subscribe(e=>{en.push("browser",e.level,e.source?`[${e.source}] ${e.message}`:e.message);let r=`[${e.source?`browser:${e.source}`:"browser"}] ${e.message}`;eo.write("warn",r),ea&&process.stderr.write(`⚠️ ${r}
4
+ `)}),ea&&(el=f(en,{echo:!0})),process.env.NODE_ENV="development",B&&(process.env.PERSISTENCE_MODE=B);let e=!B||"server"===B;e&&J&&(process.env.SERVER_URL=J);let r=e&&J?new v(J):void 0;if(ep.step("Starting development mode"),!await P("spec")){ep.error('Spec folder not found. Run "phoenix init" first.'),await ew(1);return}if(e){if(!J||!Q)throw Error("Server persistence needs a server and a credential. Run `phoenix login <workspace>`, or create a development environment in Studio and paste its .env block into .env.");let e=s("."),r=await D(e);r?.PHOENIX_PROJECT_SLUG!==M||r.PHOENIX_ENVIRONMENT_SLUG!==V||r.PHOENIX_SERVER_URL!==J?(ep.step("Preparing development deployment"),await eu({serverUrl:J,credential:Q},{skipUpload:z,debug:C})):ep.debug(`${e} matches the current development environment, skipping prepare`)}ep.step("Building project files");let{templateFiles:c}=await y({sdkVersion:L,projectSlug:M,environmentSlug:V,cliUseWorkspace:W,enableEditor:G,withLingui:H,force:X},{logger:ep});if(ep.success("Project files built successfully"),ei&&(ep=g({bus:en,stream:"spec",debug:C,fileLogger:eo}),el=f(en),ec=$(en,{onQuit:()=>void ew(0)})),H?(Z=new l({logger:ep})).start():ep.warn("Lingui is disabled: i18n messages are not extracted or compiled during dev. Pass --withLingui or set WITH_LINGUI=true to enable."),e&&(ep.step("Building webhooks"),await N.run("webhook",async()=>{await R({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js"})})),e&&J&&Q){let e=s("."),t=await D(e);if(!t?.DEPLOYMENT_ID)throw Error(`Webhook tunnel cannot start because ${e} has no DEPLOYMENT_ID. Rerun phoenix dev to prepare the development deployment.`);let o=await k();F=await I({experimental:!0,transport:S({serverUrl:J,credential:Q,projectSlug:M,environmentSlug:V}),rejectionHint:i(Q,M),environmentSlug:V,deploymentId:t.DEPLOYMENT_ID,sessionId:o,onStatus:(e,s)=>{r?.setStatus(e,{deploymentId:t.DEPLOYMENT_ID,sessionId:o,message:s??null})},onRequest:e=>r?.record(e)}),r?.setStatus("waiting",{deploymentId:t.DEPLOYMENT_ID,sessionId:o}),F.stopped.catch(e=>{em(),ep.error(`Webhook tunnel failed: ${e instanceof Error?e.message:String(e)}`),ew(1)}),ep.success("Webhook tunnel started")}er=new a({pubsub:es,logger:ep,onRebuilt:()=>Z?.trigger(),onViteServerChange:e=>{A=e},sdkVersion:L,projectSlug:M,environmentSlug:V,cliUseWorkspace:W,enableEditor:G??!0,inlineTemplates:!1,useServer:e});let u=new m;if(et=new d({store:u,pubsub:es,variantPreviews:new w({projectRoot:process.cwd()},{store:u,logger:ep,projectWatcher:er})}),G&&Y){ep.step("Starting editor WebSocket server");let t=parseInt(Y,10);K=n({port:t,projectRoot:process.cwd(),application:et,logger:ep,logBus:en,tunnelMonitor:r,debug:C,prepareDeployment:e&&J&&Q?()=>eu({serverUrl:J,credential:Q},{skipUpload:!0,debug:!1}):void 0}),await K.ready,ep.debug(`Editor WebSocket server started on port ${t}`),(ee=new p({projectRoot:process.cwd(),pubsub:es,logger:ep})).start()}let b=await h({templateFiles:c});A=await o(b),await A.listen(),ep.step("Starting Vite dev server"),er.start(A);let x=A.resolvedUrls?.local[0];if(ei)ep.success("Vite dev server started — watching for changes"),x&&ep.info(`Preview: ${x}`),G&&Y&&ep.info(`Editor WebSocket: ws://localhost:${Y}`);else if(C)ep.success("Vite dev server started"),x&&ep.info(`Preview: ${x}`);else{let e=e=>{en.push("spec","info",e),process.stdout.write(`${e}
5
+ `)};e("\n\uD83D\uDE80 Phoenix Dev Server\n"),x&&(e(`Preview: ${x}`),eo.write("info",`Preview: ${x}`)),G&&Y&&e(`Editor WebSocket: ws://localhost:${Y}`),e("\n\uD83D\uDC40 Watching for changes...\n")}}catch(e){em(),ep.error(`Dev mode failed: ${e instanceof Error?e.message:String(e)}`,e),await ew(1)}};
@@ -1 +1 @@
1
- import{runCommand as t}from"../utils/index.js";import{formatFiles as e}from"./prettier.js";export const runFixCommand=async(i,r)=>{let{logger:s}=r,o=!0===i.lint||!0===i.format,n=!o||!0===i.lint,c=!o||!0===i.format;try{s.step("Running fixes"),n&&await t({command:"eslint",args:["src","--fix"],description:"ESLint fix",quiet:!0},{logger:s}),c&&(s.step("Prettier fix"),await e(".",{logger:s}),s.success("Prettier fix completed")),s.success("Fixes completed!")}catch(t){s.error(`Fix failed: ${t instanceof Error?t.message:String(t)}`,t),process.exit(1)}};
1
+ import{runCommand as t}from"../utils/index.js";import{formatFiles as e}from"./prettier.js";export const runFixCommand=async(r,i)=>{let{logger:s}=i,n=!0===r.lint||!0===r.format,o=!n||!0===r.lint,a=!n||!0===r.format;try{s.step("Running fixes"),o&&await t({command:"eslint",args:["src","--fix","--no-error-on-unmatched-pattern"],description:"ESLint fix",quiet:!0},{logger:s}),a&&(s.step("Prettier fix"),await e(".",{logger:s}),s.success("Prettier fix completed")),s.success("Fixes completed!")}catch(t){s.error(`Fix failed: ${t instanceof Error?t.message:String(t)}`,t),process.exit(1)}};
@@ -2,6 +2,8 @@ import { type ViteDevServer } from 'vite';
2
2
  import type { Logger } from '../utils/index.js';
3
3
  import type { PhoenixPubSub } from './phoenix-pubsub.js';
4
4
  import type { VariantFileEdit } from './variant-file-session.js';
5
+ export declare const WATCH_PATTERNS: string[];
6
+ export declare const IGNORED_PATTERNS: string[];
5
7
  /** Configuration for {@link ApplicationSpecProjectWatcher}. */
6
8
  export interface ApplicationSpecProjectWatcherConfig {
7
9
  readonly pubsub: PhoenixPubSub;
@@ -1,4 +1,4 @@
1
- import{resolve as e}from"path";import t from"promise-queue";import{Subject as i,buffer as s,debounceTime as r}from"rxjs";import{createServer as o,normalizePath as n}from"vite";import{watch as l}from"#package/watch";import{ApplicationSpecBuilder as h}from"../application-spec/application-spec-builder.js";import{logDiagnostics as a}from"../application-spec/metrics/index.js";import{syncTemplateFiles as c}from"../application-spec/template-files.js";import{buildWebhooks as u}from"../webhooks/index.js";import{getViteDevConfig as p}from"./vite-config.js";let g=["spec/**/*.{yaml,yml}","src/**/*.{ts,tsx,yaml,yml,json,html,css}","templates/*.html",".env",".env.generated"],d=["src/locales/**/*.{ts,tsx}",".phoenix/**"];export class ApplicationSpecProjectWatcher{watcher=null;subscription=null;rebuildQueue=new t(1,1/0);changeSubject$=new i;viteServer=null;pubsub;logger;onRebuilt;onViteServerChange;builder;useServer;isShuttingDown=!1;suspended=!1;heldChanges=new Set;constructor(e){this.pubsub=e.pubsub,this.logger=e.logger,this.onRebuilt=e.onRebuilt,this.onViteServerChange=e.onViteServerChange,this.builder=new h({logger:e.logger,sdkVersion:e.sdkVersion,projectSlug:e.projectSlug,environmentSlug:e.environmentSlug,cliUseWorkspace:e.cliUseWorkspace,name:e.name,description:e.description,enableEditor:e.enableEditor,inlineTemplates:e.inlineTemplates}),this.useServer=e.useServer}start(e){this.viteServer=e,this.setupFileWatcher(),this.setupRebuildSubscription()}applyVariantFiles(e){this.rebuildQueue.add(async()=>{this.isShuttingDown||await this.rebuild(new Set(e.map(e=>e.fileName)),!1,!0)})}suspend(){this.suspended=!0}resume(){for(let e of(this.suspended=!1,this.heldChanges))this.changeSubject$.next(e);this.heldChanges.clear()}async close(){this.isShuttingDown=!0,this.watcher&&(await this.watcher.close(),this.watcher=null),this.subscription?.unsubscribe(),this.changeSubject$.complete()}setupFileWatcher(){this.watcher=l(g,{ignored:d,cwd:process.cwd(),persistent:!0,ignoreInitial:!1}),this.watcher.on("all",(e,t)=>{if("change"===e||"add"===e||"unlink"===e){if(this.suspended)return void this.heldChanges.add(t);this.logger.info(`
2
- 📝 Detected ${e}: ${t}`),this.changeSubject$.next(t)}})}setupRebuildSubscription(){let e=this.changeSubject$.pipe(r(10));this.subscription=this.changeSubject$.pipe(s(e)).subscribe(e=>{let t=new Set(e),i=t.has(".env");this.rebuildQueue.add(async()=>{this.isShuttingDown||(this.logger.info(`
1
+ import{mkdirSync as e}from"fs";import{resolve as t}from"path";import i from"promise-queue";import{Subject as s,buffer as r,debounceTime as o}from"rxjs";import{createServer as n,normalizePath as l}from"vite";import{watch as a}from"#package/watch";import{ApplicationSpecBuilder as h}from"../application-spec/application-spec-builder.js";import{logDiagnostics as c}from"../application-spec/metrics/index.js";import{syncTemplateFiles as u}from"../application-spec/template-files.js";import{buildWebhooks as p}from"../webhooks/index.js";import{getViteDevConfig as g}from"./vite-config.js";export const WATCH_PATTERNS=["spec/**/*.{yaml,yml}","src/**/*.{ts,tsx,yaml,yml,json,html,css}","templates/*.html",".env",".env.generated",".phoenix/.env.generated"];export const IGNORED_PATTERNS=["src/locales/**/*.{ts,tsx}",".phoenix/!(.env.generated)/**"];export class ApplicationSpecProjectWatcher{watcher=null;subscription=null;rebuildQueue=new i(1,1/0);changeSubject$=new s;viteServer=null;pubsub;logger;onRebuilt;onViteServerChange;builder;useServer;isShuttingDown=!1;suspended=!1;heldChanges=new Set;constructor(e){this.pubsub=e.pubsub,this.logger=e.logger,this.onRebuilt=e.onRebuilt,this.onViteServerChange=e.onViteServerChange,this.builder=new h({logger:e.logger,sdkVersion:e.sdkVersion,projectSlug:e.projectSlug,environmentSlug:e.environmentSlug,cliUseWorkspace:e.cliUseWorkspace,name:e.name,description:e.description,enableEditor:e.enableEditor,inlineTemplates:e.inlineTemplates}),this.useServer=e.useServer}start(e){this.viteServer=e,this.setupFileWatcher(),this.setupRebuildSubscription()}applyVariantFiles(e){this.rebuildQueue.add(async()=>{this.isShuttingDown||await this.rebuild(new Set(e.map(e=>e.fileName)),!1,!0)})}suspend(){this.suspended=!0}resume(){for(let e of(this.suspended=!1,this.heldChanges))this.changeSubject$.next(e);this.heldChanges.clear()}async close(){this.isShuttingDown=!0,this.watcher&&(await this.watcher.close(),this.watcher=null),this.subscription?.unsubscribe(),this.changeSubject$.complete()}setupFileWatcher(){e(t(process.cwd(),"src"),{recursive:!0}),this.watcher=a(WATCH_PATTERNS,{ignored:IGNORED_PATTERNS,cwd:process.cwd(),persistent:!0,ignoreInitial:!1}),this.watcher.on("all",(e,t)=>{if("change"===e||"add"===e||"unlink"===e){if(this.suspended)return void this.heldChanges.add(t);this.logger.info(`
2
+ 📝 Detected ${e}: ${t}`),this.changeSubject$.next(t)}})}setupRebuildSubscription(){let e=this.changeSubject$.pipe(o(10));this.subscription=this.changeSubject$.pipe(r(e)).subscribe(e=>{let t=new Set(e),i=t.has(".env");this.rebuildQueue.add(async()=>{this.isShuttingDown||(this.logger.info(`
3
3
  🔨 Rebuilding spec files...
4
- `),await this.rebuild(t,i,!1))})})}async rebuild(t,i,s){try{let r=this.viteServer;if(!r)throw Error("Cannot rebuild the project: the watcher has no Vite server yet, because it was not started. Start the watcher before applying files");let l=await c();if(this.isShuttingDown)return;let h=await this.builder.build({compile:!s});if(this.isShuttingDown)return;if(a(h.diagnostics,this.logger),!h.ok){for(let e of h.errors)this.logger.error(`[${e.code}] ${e.message}${e.file?` (${e.file})`:""}`);this.pubsub.specFile$.next({rawProjectFiles:h.rawProjectFiles,projectRoot:process.cwd()});return}this.onRebuilt?.();let{application:g,changedFiles:d}=h,w=r.moduleGraph,b=Date.now(),f=new Set,m=process.cwd(),S=e=>{let t=w.getModulesByFile(n(e));if(t)for(let e of t)w.invalidateModule(e,f,b,!0)};for(let i of t)S(e(m,i));for(let t of d)S(e(m,`.phoenix/${t.path}`));if(this.pubsub.specFile$.next({rawProjectFiles:g.rawProjectFiles,projectRoot:process.cwd(),configurationSchemaHash:g.applicationSpec.configurator.configurationSchema.hash}),this.isShuttingDown)return;if(i){if(await r.close(),this.isShuttingDown)return;let e=await p({templateFiles:l});if(this.isShuttingDown)return;let t=await o(e);if(this.isShuttingDown||(await t.listen(),this.isShuttingDown))return void await t.close();this.viteServer=t,this.onViteServerChange?.(t),this.logger.success("Vite server restarted (env changed)")}if(this.useServer&&!s){if(this.logger.step("Building webhooks"),await u({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js",preserveExistingOutput:!0}),this.isShuttingDown)return;this.logger.success("Webhooks rebuilt successfully")}this.logger.success("Project files rebuilt successfully")}catch(e){this.logger.error(`Build failed: ${e instanceof Error?e.message:String(e)}`,e)}}}
4
+ `),await this.rebuild(t,i,!1))})})}async rebuild(e,i,s){try{let r=this.viteServer;if(!r)throw Error("Cannot rebuild the project: the watcher has no Vite server yet, because it was not started. Start the watcher before applying files");let o=await u();if(this.isShuttingDown)return;let a=await this.builder.build({compile:!s});if(this.isShuttingDown)return;if(c(a.diagnostics,this.logger),!a.ok){for(let e of a.errors)this.logger.error(`[${e.code}] ${e.message}${e.file?` (${e.file})`:""}`);this.pubsub.specFile$.next({rawProjectFiles:a.rawProjectFiles,projectRoot:process.cwd()});return}this.onRebuilt?.();let{application:h,changedFiles:d}=a,w=r.moduleGraph,b=Date.now(),f=new Set,S=process.cwd(),m=e=>{let t=w.getModulesByFile(l(e));if(t)for(let e of t)w.invalidateModule(e,f,b,!0)};for(let i of e)m(t(S,i));for(let e of d)m(t(S,`.phoenix/${e.path}`));if(this.pubsub.specFile$.next({rawProjectFiles:h.rawProjectFiles,projectRoot:process.cwd(),configurationSchemaHash:h.applicationSpec.configurator.configurationSchema.hash}),this.isShuttingDown)return;if(i){if(await r.close(),this.isShuttingDown)return;let e=await g({templateFiles:o});if(this.isShuttingDown)return;let t=await n(e);if(this.isShuttingDown||(await t.listen(),this.isShuttingDown))return void await t.close();this.viteServer=t,this.onViteServerChange?.(t),this.logger.success("Vite server restarted (env changed)")}if(this.useServer&&!s){if(this.logger.step("Building webhooks"),await p({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js",preserveExistingOutput:!0}),this.isShuttingDown)return;this.logger.success("Webhooks rebuilt successfully")}this.logger.success("Project files rebuilt successfully")}catch(e){this.logger.error(`Build failed: ${e instanceof Error?e.message:String(e)}`,e)}}}
@@ -3,6 +3,7 @@ export interface SourceArchive {
3
3
  readonly path: string;
4
4
  readonly fileCount: number;
5
5
  readonly size: number;
6
+ readonly hasConversationLog: boolean;
6
7
  readonly cleanup: () => Promise<void>;
7
8
  }
8
9
  /** What `extractSourceArchive` wrote and what it left out. */
@@ -1 +1 @@
1
- import{execFile as e}from"node:child_process";import{createReadStream as r,createWriteStream as t}from"node:fs";import{lstat as o,mkdir as i,mkdtemp as a,readdir as n,rm as s,stat as c,writeFile as l}from"node:fs/promises";import{tmpdir as h}from"node:os";import{dirname as p,join as f}from"node:path";import{Transform as d}from"node:stream";import{pipeline as w}from"node:stream/promises";import{promisify as m}from"node:util";import{createGunzip as u}from"node:zlib";import{extract as g}from"tar-stream";import{isProjectFile as y,listProjectEntries as v}from"../application-spec/project-files.js";let x=m(e);export const createSourceArchive=async e=>{let r=await Promise.all((await v(e)).map(async r=>({name:r,entry:await o(f(e,r))}))),t=r.filter(({entry:e})=>!e.isDirectory()&&(!e.isFile()||e.nlink>1)),i=r.filter(({entry:e})=>e.isFile()).map(({name:e})=>e);if(t.length>0)throw Error(`These project files are links or special files, which builds do not accept: ${t.map(({name:e})=>e).join(", ")}. Replace them with regular files and deploy again.`);if(0===i.length)throw Error(`No project files were found in ${e}, so there is nothing to deploy. Run phoenix deploy in the folder of an application-spec project.`);let n=await a(f(h(),"phoenix-deploy-")),p="sources.tgz",d=f(n,p),w=f(n,"files");try{await l(w,i.join("\0")),await x("tar",["-czf",p,"-C",e,"--null","-T",w],{cwd:n,env:{...process.env,COPYFILE_DISABLE:"1"}})}catch(r){await s(n,{recursive:!0,force:!0});let e=r instanceof Error?r.message:String(r);throw Error(`Packing the project with tar failed: ${e}. Check that tar is installed and on the PATH.`)}return{path:d,fileCount:i.length,size:(await c(d)).size,cleanup:()=>s(n,{recursive:!0,force:!0})}};let E=(e,...r)=>e instanceof Error&&"code"in e&&"string"==typeof e.code&&r.includes(e.code),j=async e=>{try{return 0===(await n(e)).length}catch(e){if(E(e,"ENOENT"))return!0;throw e}},T=class ArchiveRefusal extends Error{},b=e=>e.length>0&&!e.startsWith("/")&&!e.includes("\\")&&!/^[A-Za-z]:/.test(e)&&!/[\x00-\x1f\x7f]/.test(e)&&!e.split("/").includes("..");export const extractSourceArchive=async e=>{let o,a,{archivePath:n,targetDir:l}=e,h=(await c(n)).size;if(h>0xc800000)throw Error(`The source archive is ${h} bytes, over the 209715200 byte limit. Remove large files from the project and deploy again.`);if(!await j(l))throw Error(`The folder ${l} is not empty, and extracted sources must not mix with existing files. Extract into a new or empty folder.`);let m=g(),v=new AbortController,x=w(r(n),u(),(a=0,new d({transform(e,r,t){(a+=e.length)>0x40000000?t(new T("The source archive extracts to more than 1073741824 bytes. Remove large files from the project and deploy again.")):t(null,e)}})),m).catch(e=>{o??=e,v.abort()}),$=[],z=0,R=0;try{for await(let e of m){let{type:r}=e.header,o=e.header.name.replace(/^(\.\/)+/,""),a=JSON.stringify(o);if("directory"===r){e.resume();continue}if((R+=1)>1e5)throw new T("The source archive has more than 100000 files. Remove generated or unused files from the project and deploy again.");if(!b(o))throw new T(`The source archive contains ${a}, which is not a plain relative path inside the project. Pack the project with phoenix deploy.`);if("file"!==r)throw new T(`The source archive contains ${a}, which is a ${r??"special file"}. Builds accept only regular files; replace it with a regular file and deploy again.`);if(!y(o)){$.push(o),e.resume();continue}let n=f(l,...o.split("/"));try{await i(p(n),{recursive:!0}),await w(e,t(n,{flags:"wx"}),{signal:v.signal})}catch(e){if(E(e,"EEXIST","ENOTDIR","EISDIR"))throw new T(`The source archive contains ${a}, which repeats or collides with an earlier entry, so its content is ambiguous. Pack the project with phoenix deploy.`);throw e}z+=1}if(await x,void 0!==o)throw o}catch(t){let e=t instanceof T?t:o??t;if(m.destroy(),await x,await s(l,{recursive:!0,force:!0}),e instanceof T)throw e;let r=e instanceof Error?e.message:String(e);throw Error(`The source archive could not be read: ${r}. It is truncated or not a gzip tarball; pack the project with phoenix deploy.`)}return{fileCount:z,skipped:$}};
1
+ import{execFile as e}from"node:child_process";import{createReadStream as r,createWriteStream as t}from"node:fs";import{lstat as o,mkdir as i,mkdtemp as a,readdir as n,rm as s,stat as c,writeFile as l}from"node:fs/promises";import{tmpdir as h}from"node:os";import{dirname as p,join as f}from"node:path";import{Transform as d}from"node:stream";import{pipeline as w}from"node:stream/promises";import{promisify as m}from"node:util";import{createGunzip as u}from"node:zlib";import{extract as g}from"tar-stream";import{isProjectFile as y,listProjectEntries as v}from"../application-spec/project-files.js";let x=m(e);export const createSourceArchive=async e=>{let r=(await n(e)).includes("conversation.log"),t=[...await v(e),...r?["conversation.log"]:[]],i=await Promise.all(t.map(async r=>({name:r,entry:await o(f(e,r))})));if(i.some(({name:e,entry:r})=>"conversation.log"===e&&r.isDirectory()))throw Error("conversation.log is a directory. Replace it with a regular transcript file and deploy again.");let p=i.filter(({entry:e})=>!e.isDirectory()&&(!e.isFile()||e.nlink>1)),d=i.filter(({entry:e})=>e.isFile()).map(({name:e})=>e);if(p.length>0)throw Error(`These project files are links or special files, which builds do not accept: ${p.map(({name:e})=>e).join(", ")}. Replace them with regular files and deploy again.`);if(0===d.length)throw Error(`No project files were found in ${e}, so there is nothing to deploy. Run phoenix deploy in the folder of an application-spec project.`);let w=await a(f(h(),"phoenix-deploy-")),m="sources.tgz",u=f(w,m),g=f(w,"files");try{await l(g,d.join("\0")),await x("tar",["-czf",m,"-C",e,"--null","-T",g],{cwd:w,env:{...process.env,COPYFILE_DISABLE:"1"}})}catch(r){await s(w,{recursive:!0,force:!0});let e=r instanceof Error?r.message:String(r);throw Error(`Packing the project with tar failed: ${e}. Check that tar is installed and on the PATH.`)}return{path:u,fileCount:d.length,size:(await c(u)).size,hasConversationLog:r,cleanup:()=>s(w,{recursive:!0,force:!0})}};let E=(e,...r)=>e instanceof Error&&"code"in e&&"string"==typeof e.code&&r.includes(e.code),j=async e=>{try{return 0===(await n(e)).length}catch(e){if(E(e,"ENOENT"))return!0;throw e}},T=class ArchiveRefusal extends Error{},b=e=>e.length>0&&!e.startsWith("/")&&!e.includes("\\")&&!/^[A-Za-z]:/.test(e)&&!/[\x00-\x1f\x7f]/.test(e)&&!e.split("/").includes("..");export const extractSourceArchive=async e=>{let o,a,{archivePath:n,targetDir:l}=e,h=(await c(n)).size;if(h>0xc800000)throw Error(`The source archive is ${h} bytes, over the 209715200 byte limit. Remove large files from the project and deploy again.`);if(!await j(l))throw Error(`The folder ${l} is not empty, and extracted sources must not mix with existing files. Extract into a new or empty folder.`);let m=g(),v=new AbortController,x=w(r(n),u(),(a=0,new d({transform(e,r,t){(a+=e.length)>0x40000000?t(new T("The source archive extracts to more than 1073741824 bytes. Remove large files from the project and deploy again.")):t(null,e)}})),m).catch(e=>{o??=e,v.abort()}),$=[],R=0,z=0;try{for await(let e of m){let{type:r}=e.header,o=e.header.name.replace(/^(\.\/)+/,""),a=JSON.stringify(o);if("directory"===r){e.resume();continue}if((z+=1)>1e5)throw new T("The source archive has more than 100000 files. Remove generated or unused files from the project and deploy again.");if(!b(o))throw new T(`The source archive contains ${a}, which is not a plain relative path inside the project. Pack the project with phoenix deploy.`);if("file"!==r)throw new T(`The source archive contains ${a}, which is a ${r??"special file"}. Builds accept only regular files; replace it with a regular file and deploy again.`);if(!y(o)){$.push(o),e.resume();continue}let n=f(l,...o.split("/"));try{await i(p(n),{recursive:!0}),await w(e,t(n,{flags:"wx"}),{signal:v.signal})}catch(e){if(E(e,"EEXIST","ENOTDIR","EISDIR"))throw new T(`The source archive contains ${a}, which repeats or collides with an earlier entry, so its content is ambiguous. Pack the project with phoenix deploy.`);throw e}R+=1}if(await x,void 0!==o)throw o}catch(t){let e=t instanceof T?t:o??t;if(m.destroy(),await x,await s(l,{recursive:!0,force:!0}),e instanceof T)throw e;let r=e instanceof Error?e.message:String(e);throw Error(`The source archive could not be read: ${r}. It is truncated or not a gzip tarball; pack the project with phoenix deploy.`)}return{fileCount:R,skipped:$}};
@@ -1,3 +1,3 @@
1
- import{transform as e}from"@swc/core";import{remove as t}from"fs-extra";import{copyFile as s,mkdir as o,readFile as a,writeFile as i}from"fs/promises";import{globby as r}from"globby";import{dirname as c,relative as l,resolve as n}from"path";import{Subject as p}from"rxjs";import{watch as m}from"#package/watch";import{createLogger as w}from"../utils/index.js";let u=()=>({sourceMaps:!0,module:{type:"es6"},jsc:{target:"es2022",parser:{syntax:"typescript",tsx:!0},transform:{react:{runtime:"automatic"}},keepClassNames:!0,experimental:{plugins:[["@lingui/swc-plugin",{}]]}}}),d=async(e,t,a)=>{let i=process.cwd(),p=n(i,e),m=n(i,t),w=await r(["**/*.{html,css,json,txt,md}","**/.env*"],{cwd:p,ignore:["**/*.{spec,test}.{html,css,json,txt,md}","**/__tests__/**","**/__mocks__/**","**/tsconfig.json"],absolute:!1}),u=0,d=0;for(let e of w)try{let t=n(p,e),a=n(m,e);await o(c(a),{recursive:!0}),await s(t,a),u++}catch(t){d++,console.error(`Failed to copy ${l(i,n(p,e))}:`,t)}if(d>0)throw Error(`Failed to copy ${d} file(s)`);u>0&&a.debug(`Copied ${u} non-compilable file(s)`)};export const compileWithSwc=async(s,p)=>{let{sourceDir:m="src",outDir:f="./node_modules/.phoenix"}=s??{},g=p?.logger??w(),h=process.cwd(),x=n(h,m),_=n(h,f);await t(_);let y=await r(["**/*.{ts,tsx}"],{cwd:x,ignore:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/__mocks__/**"],absolute:!1}),b=u(),$=0,j=0;for(let t of y)try{let s=n(x,t),r=n(_,t.replace(/\.tsx?$/,".js")),l=await a(s,"utf-8"),p=await e(l,{...b,filename:s,sourceMaps:!0,outputPath:r});await o(c(r),{recursive:!0}),await i(r,p.code,"utf-8"),p.map&&await i(`${r}.map`,p.map,"utf-8"),$++}catch(e){j++,console.error(`Failed to compile ${l(h,n(x,t))}:`,e)}if(j>0)throw Error(`Failed to compile ${j} file(s)`);g.isDebug&&g.debug(`Compiled ${$} file(s) with swc`),await d(m,f,g)};let f=async(t,s,r)=>{let l=process.cwd(),p=n(l,s),m=n(l,r),w=u(),d=n(p,t),f=n(m,t.replace(/\.tsx?$/,".js")),g=await a(d,"utf-8"),h=await e(g,{...w,filename:d,sourceMaps:!0,outputPath:f});await o(c(f),{recursive:!0}),await i(f,h.code,"utf-8"),h.map&&await i(`${f}.map`,h.map,"utf-8")},g=async(e,t,a)=>{let i=process.cwd(),r=n(i,t),l=n(i,a),p=n(r,e),m=n(l,e);await o(c(m),{recursive:!0}),await s(p,m)};export const watchWithSwc=async(e,t)=>{let{sourceDir:s="src",outDir:o="./node_modules/.phoenix"}=e??{},a=t?.logger??w(),i=n(process.cwd(),s);a.isDebug&&a.step("Running initial SWC compilation"),await compileWithSwc({sourceDir:s,outDir:o},t),a.isDebug&&a.success("Initial compilation complete");let r=new p,c=m(["**/*.{ts,tsx,html,css,json,txt,md}","../.env*"],{cwd:i,ignored:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/cache.json"],persistent:!0,ignoreInitial:!0});return c.on("all",(e,t)=>{("change"===e||"add"===e)&&r.next({file:t,type:e})}),r.subscribe(async({file:e})=>{let t=l(i,n(i,e));try{e.match(/\.tsx?$/)?(await f(t,s,o),a.fileChanged(t)):(e.match(/\.(html|css|json|txt|md)$/)||e.match(/\.env/))&&(await g(t,s,o),a.fileChanged(t))}catch(e){a.error(`Failed to process ${t}`),a.isDebug&&console.error(e)}}),a.isDebug&&console.log(`
1
+ import{transform as e}from"@swc/core";import{remove as t}from"fs-extra";import{copyFile as s,mkdir as o,readFile as a,writeFile as i}from"fs/promises";import{globby as r}from"globby";import{dirname as c,relative as l,resolve as n}from"path";import{Subject as p}from"rxjs";import{watch as m}from"#package/watch";import{createLogger as w}from"../utils/index.js";let d=()=>({sourceMaps:!0,module:{type:"es6"},jsc:{target:"es2022",parser:{syntax:"typescript",tsx:!0},transform:{react:{runtime:"automatic"}},keepClassNames:!0,experimental:{plugins:[["@lingui/swc-plugin",{}]]}}}),u=async(e,t,a)=>{let i=process.cwd(),p=n(i,e),m=n(i,t),w=await r(["**/*.{html,css,json,txt,md}","**/.env*"],{cwd:p,ignore:["**/*.{spec,test}.{html,css,json,txt,md}","**/__tests__/**","**/__mocks__/**","**/tsconfig.json",".env.generated"],absolute:!1}),d=0,u=0;for(let e of w)try{let t=n(p,e),a=n(m,e);await o(c(a),{recursive:!0}),await s(t,a),d++}catch(t){u++,console.error(`Failed to copy ${l(i,n(p,e))}:`,t)}if(u>0)throw Error(`Failed to copy ${u} file(s)`);d>0&&a.debug(`Copied ${d} non-compilable file(s)`)};export const compileWithSwc=async(s,p)=>{let{sourceDir:m="src",outDir:f="./node_modules/.phoenix"}=s??{},g=p?.logger??w(),h=process.cwd(),x=n(h,m),_=n(h,f);await t(_);let y=await r(["**/*.{ts,tsx}"],{cwd:x,ignore:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/__mocks__/**"],absolute:!1}),b=d(),$=0,j=0;for(let t of y)try{let s=n(x,t),r=n(_,t.replace(/\.tsx?$/,".js")),l=await a(s,"utf-8"),p=await e(l,{...b,filename:s,sourceMaps:!0,outputPath:r});await o(c(r),{recursive:!0}),await i(r,p.code,"utf-8"),p.map&&await i(`${r}.map`,p.map,"utf-8"),$++}catch(e){j++,console.error(`Failed to compile ${l(h,n(x,t))}:`,e)}if(j>0)throw Error(`Failed to compile ${j} file(s)`);g.isDebug&&g.debug(`Compiled ${$} file(s) with swc`),await u(m,f,g)};let f=async(t,s,r)=>{let l=process.cwd(),p=n(l,s),m=n(l,r),w=d(),u=n(p,t),f=n(m,t.replace(/\.tsx?$/,".js")),g=await a(u,"utf-8"),h=await e(g,{...w,filename:u,sourceMaps:!0,outputPath:f});await o(c(f),{recursive:!0}),await i(f,h.code,"utf-8"),h.map&&await i(`${f}.map`,h.map,"utf-8")},g=async(e,t,a)=>{let i=process.cwd(),r=n(i,t),l=n(i,a),p=n(r,e),m=n(l,e);await o(c(m),{recursive:!0}),await s(p,m)};export const watchWithSwc=async(e,t)=>{let{sourceDir:s="src",outDir:o="./node_modules/.phoenix"}=e??{},a=t?.logger??w(),i=n(process.cwd(),s);a.isDebug&&a.step("Running initial SWC compilation"),await compileWithSwc({sourceDir:s,outDir:o},t),a.isDebug&&a.success("Initial compilation complete");let r=new p,c=m(["**/*.{ts,tsx,html,css,json,txt,md}","../.env*"],{cwd:i,ignored:["**/*.{spec,test}.{ts,tsx}","**/__tests__/**","**/cache.json"],persistent:!0,ignoreInitial:!0});return c.on("all",(e,t)=>{("change"===e||"add"===e)&&r.next({file:t,type:e})}),r.subscribe(async({file:e})=>{let t=l(i,n(i,e));try{e.match(/\.tsx?$/)?(await f(t,s,o),a.fileChanged(t)):(e.match(/\.(html|css|json|txt|md)$/)||e.match(/\.env/))&&(await g(t,s,o),a.fileChanged(t))}catch(e){a.error(`Failed to process ${t}`),a.isDebug&&console.error(e)}}),a.isDebug&&console.log(`
2
2
  👀 Watching ${s} for changes...
3
3
  `),{stop:async()=>{await c.close(),a.isDebug&&a.info("SWC watcher stopped")}}};
@@ -12,12 +12,14 @@ export declare const useConfiguratorRawAccessService: () => AccessService | null
12
12
  export declare const useAdminRawAccessService: () => AccessService | null;
13
13
  export declare const useConfiguratorRawAccessInfo: () => {
14
14
  raw: string;
15
+ access: import("@salsita-ai/contracts/api").AccessLevel;
15
16
  viewMode: boolean;
16
17
  revisionId: string | undefined;
17
18
  configurationId: string;
18
19
  } | null;
19
20
  export declare const useAdminRawAccessInfo: () => {
20
21
  raw: string;
22
+ access: import("@salsita-ai/contracts/api").AccessLevel;
21
23
  viewMode: boolean;
22
24
  revisionId: string | undefined;
23
25
  configurationId: string;
@@ -1 +1 @@
1
- import{memoOnce as e}from"@salsita-ai/common/utils";import{createDomainRuntime as t,createMockDomainRuntimeServices as o,createMockSessionContext as n}from"#package/domain";import{createCommonServicesSelectors as s}from"../common-services/index.js";import{createDomainApplicationContextSelectors as i}from"../domain-application-context/index.js";import{createIntegrationActions as a,createIntegrationSelectors as r,initializeIntegration as c}from"../integration/index.js";import{createRoutingActions as m,createRoutingSelectors as d,initializeRouting as p}from"../routing/index.js";import{SessionService as l,createSessionRuntimeActions as S,createSessionRuntimeSelectors as g,initializeSessionRuntime as v}from"../session/index.js";import{createMockWebComponentApi as u}from"../web-component/index.js";export const createMockApplicationRuntime=(f,C)=>{var x;let b,y,w,A,D,k,E,I,h,j,R,T,O,L,F,{sessionData:M,mode:U,role:V}=C,z=o(),q=(x={webComponentOptions:C.webComponentOptions??f.mount.options,webComponentApi:C.webComponentApi??u()},w=v(),A=t({config:f,services:z,getExtensionSystems:e=>F[e].getInitializableSystems()}),D=new Set,k=()=>{D.forEach(e=>{e()})},b=c({actions:E=a({setIntegration:e=>{b=e(b),k()}})}),I=r({getState:()=>({integration:b})}),h=m({setRouting:e=>{y=e(y),k()}}),y=p(),j=d({getState:()=>({...A.getState(),routing:y}),actions:h,accessActions:A.actions.access,loadedDataActions:A.actions.loadedData,domainServicesSelectors:A.selectors.domainServices,overridesSelectors:A.selectors.overrides}),R=s({getState:()=>({...A.getState(),session:w}),environmentSelectors:A.selectors.environment,specSelectors:A.selectors.spec,accessSelectors:A.selectors.access,domainServicesSelectors:A.selectors.domainServices,webComponentOptions:x.webComponentOptions,webComponentApi:x.webComponentApi,getSessionService:()=>L(),routingSelectors:j}),T=S({setSessionRuntime:e=>{w=e(w),k()}}),O=g({getState:()=>({...A.getState(),session:w}),sessionContextSelectors:A.selectors.sessionContext}),L=e(()=>new l({getLogger:()=>A.selectors.domainServices.getLogger(),getAnalyticsService:()=>A.selectors.domainServices.getAnalyticsService(),getUnauthenticatedClient:R.getUnauthenticatedClient,environmentSelectors:A.selectors.environment,sessionActions:T,setSessionContext:A.actions.sessionContext.setSessionContext,sessionSelectors:O,specSelectors:A.selectors.spec})),F={configurator:i({applicationType:"configurator",commonServicesSelectors:R,domainServicesSelectors:A.selectors.domainServices,domainContextSelectors:A.selectors.domainContext.configurator,getApplicationRuntimeExtensions:()=>[]}),admin:i({applicationType:"admin",commonServicesSelectors:R,domainServicesSelectors:A.selectors.domainServices,domainContextSelectors:A.selectors.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})},{subscribe:e=>{D.add(e);let t=A.subscribe(e);return()=>{D.delete(e),t()}},getState:()=>({...A.getState(),integration:b,routing:y,session:w}),selectors:{...A.selectors,commonServices:R,integration:I,routing:j,session:O,domainApplicationContext:F},actions:{...A.actions,integration:E,routing:h,session:T}}),B=q.getState().spec;return q.actions.spec.updateSpec({...B,configurator:{...B.configurator,createTransformers:e=>C.transformers.map(t=>t.transformer.register(e,t.priority??1/0))}}),q.actions.sessionContext.setSessionContext(n(V,M)),q.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",viewMode:"read"===U,revisionId:void 0,configurationId:"mock"}),q.actions.domainData.setDomainData({publishedData:C.publishedData,frontendData:C.frontendData,backendData:C.backendData}),q.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:C.entities,modelVersion:f.domain.domainFactory.modelVersion,rootEntityType:C.rootEntityType,schemaIdentity:f.domain.domainFactory}),q};
1
+ import{memoOnce as e}from"@salsita-ai/common/utils";import{AccessLevel as t}from"@salsita-ai/contracts/api";import{createDomainRuntime as o,createMockDomainRuntimeServices as n,createMockSessionContext as s}from"#package/domain";import{createCommonServicesSelectors as i}from"../common-services/index.js";import{createDomainApplicationContextSelectors as a}from"../domain-application-context/index.js";import{createIntegrationActions as r,createIntegrationSelectors as c,initializeIntegration as m}from"../integration/index.js";import{createRoutingActions as d,createRoutingSelectors as p,initializeRouting as l}from"../routing/index.js";import{SessionService as S,createSessionRuntimeActions as g,createSessionRuntimeSelectors as v,initializeSessionRuntime as u}from"../session/index.js";import{createMockWebComponentApi as f}from"../web-component/index.js";export const createMockApplicationRuntime=(C,x)=>{var b;let w,y,A,D,k,E,I,R,h,j,O,T,L,F,M,{sessionData:U,mode:V,role:z}=x,q=n(),B=(b={webComponentOptions:x.webComponentOptions??C.mount.options,webComponentApi:x.webComponentApi??f()},A=u(),D=o({config:C,services:q,getExtensionSystems:e=>M[e].getInitializableSystems()}),k=new Set,E=()=>{k.forEach(e=>{e()})},w=m({actions:I=r({setIntegration:e=>{w=e(w),E()}})}),R=c({getState:()=>({integration:w})}),h=d({setRouting:e=>{y=e(y),E()}}),y=l(),j=p({getState:()=>({...D.getState(),routing:y}),actions:h,accessActions:D.actions.access,loadedDataActions:D.actions.loadedData,domainServicesSelectors:D.selectors.domainServices,overridesSelectors:D.selectors.overrides}),O=i({getState:()=>({...D.getState(),session:A}),environmentSelectors:D.selectors.environment,specSelectors:D.selectors.spec,accessSelectors:D.selectors.access,domainServicesSelectors:D.selectors.domainServices,webComponentOptions:b.webComponentOptions,webComponentApi:b.webComponentApi,getSessionService:()=>F(),routingSelectors:j}),T=g({setSessionRuntime:e=>{A=e(A),E()}}),L=v({getState:()=>({...D.getState(),session:A}),sessionContextSelectors:D.selectors.sessionContext}),F=e(()=>new S({getLogger:()=>D.selectors.domainServices.getLogger(),getAnalyticsService:()=>D.selectors.domainServices.getAnalyticsService(),getUnauthenticatedClient:O.getUnauthenticatedClient,environmentSelectors:D.selectors.environment,sessionActions:T,setSessionContext:D.actions.sessionContext.setSessionContext,sessionSelectors:L,specSelectors:D.selectors.spec})),M={configurator:a({applicationType:"configurator",commonServicesSelectors:O,domainServicesSelectors:D.selectors.domainServices,domainContextSelectors:D.selectors.domainContext.configurator,getApplicationRuntimeExtensions:()=>[]}),admin:a({applicationType:"admin",commonServicesSelectors:O,domainServicesSelectors:D.selectors.domainServices,domainContextSelectors:D.selectors.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})},{subscribe:e=>{k.add(e);let t=D.subscribe(e);return()=>{k.delete(e),t()}},getState:()=>({...D.getState(),integration:w,routing:y,session:A}),selectors:{...D.selectors,commonServices:O,integration:R,routing:j,session:L,domainApplicationContext:M},actions:{...D.actions,integration:I,routing:h,session:T}}),G=B.getState().spec;return B.actions.spec.updateSpec({...G,configurator:{...G.configurator,createTransformers:e=>x.transformers.map(t=>t.transformer.register(e,t.priority??1/0))}}),B.actions.sessionContext.setSessionContext(s(z,U)),B.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",access:"read"===V?t.Read:t.Owner,viewMode:"read"===V,revisionId:void 0,configurationId:"mock"}),B.actions.domainData.setDomainData({publishedData:x.publishedData,frontendData:x.frontendData,backendData:x.backendData}),B.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:x.entities,modelVersion:C.domain.domainFactory.modelVersion,rootEntityType:x.rootEntityType,schemaIdentity:C.domain.domainFactory}),B};
@@ -3,6 +3,7 @@ export declare const getAccessTokenFromLocalStorage: (configurationId: string) =
3
3
  export declare const removeAccessTokenFromLocalStorage: (configurationId: string) => void;
4
4
  export declare const getAccessInfo: (configurationId: string, accessToken?: string) => {
5
5
  raw: string;
6
+ access: import("@salsita-ai/contracts/api").AccessLevel;
6
7
  viewMode: boolean;
7
8
  revisionId: string | undefined;
8
9
  configurationId: string;