@salsita-ai/sdk 0.50.0-develop.abef6d86a1 → 0.50.0-develop.ae9a830ef0

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 (410) hide show
  1. package/README.md +2 -2
  2. package/dist/application-spec/core/components/component-filter.d.ts +53 -0
  3. package/dist/application-spec/core/components/component-filter.js +1 -0
  4. package/dist/application-spec/core/components/index.d.ts +2 -0
  5. package/dist/application-spec/core/components/index.js +1 -0
  6. package/dist/application-spec/core/components/sdk-code-ref.d.ts +9 -0
  7. package/dist/application-spec/core/components/sdk-code-ref.js +1 -0
  8. package/dist/application-spec/core/enhanced-json-value.d.ts +0 -68
  9. package/dist/application-spec/core/enhanced-json-value.js +1 -1
  10. package/dist/application-spec/core/expressions/index.d.ts +2 -0
  11. package/dist/application-spec/core/expressions/index.js +1 -0
  12. package/dist/application-spec/core/expressions/relation-expression-params.d.ts +11 -0
  13. package/dist/application-spec/core/expressions/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 +9 -0
  34. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  35. package/dist/application-spec/errors/diagnostic-messages.d.ts +12 -0
  36. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  37. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +7 -0
  38. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  39. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +4 -4
  40. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.d.ts +4 -2
  41. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.js +1 -1
  42. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +48 -48
  43. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-phx-globals.js +3 -0
  44. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-relation-expressions.js +1 -1
  45. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.d.ts +6 -8
  46. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +11 -11
  47. package/dist/application-spec/generate-application/code/templates/domain-spec/index.d.ts +1 -1
  48. package/dist/application-spec/generate-application/code/templates/domain-spec/index.js +1 -1
  49. package/dist/application-spec/generate-application/code/templates/domain-spec.js +12 -12
  50. package/dist/application-spec/generate-application/code/templates/domain.js +3 -3
  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 +5 -2
  58. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  59. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +1 -3
  60. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +1 -3
  61. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +1 -1
  62. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  63. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +2 -1
  64. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  65. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +2 -4
  66. package/dist/application-spec/index.d.ts +1 -0
  67. package/dist/application-spec/index.js +1 -1
  68. package/dist/application-spec/parse-application-files/categorize/module-analysis.d.ts +1 -1
  69. package/dist/application-spec/parse-application-files/categorize/module-analysis.js +1 -1
  70. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +16 -3
  71. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  72. package/dist/application-spec/parse-application-files/raw-spec/raw-spec-file.js +1 -1
  73. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-spec.js +1 -1
  74. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/configurator-spec.js +1 -1
  75. package/dist/application-spec/parse-application-files/spec/components/component-entry.d.ts +1 -9
  76. package/dist/application-spec/parse-application-files/spec/components/component-entry.js +1 -1
  77. package/dist/application-spec/parse-application-files/spec/components/component-filter.d.ts +1 -54
  78. package/dist/application-spec/parse-application-files/spec/components/component-filter.js +1 -1
  79. package/dist/application-spec/parse-application-files/spec/components/index.d.ts +1 -1
  80. package/dist/application-spec/parse-application-files/spec/components/index.js +1 -1
  81. package/dist/application-spec/parse-application-files/spec/expressions/expression.d.ts +1 -28
  82. package/dist/application-spec/parse-application-files/spec/expressions/expression.js +1 -1
  83. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +1 -1
  84. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  85. package/dist/application-spec/parse-application-files/spec/expressions/index.d.ts +0 -1
  86. package/dist/application-spec/parse-application-files/spec/expressions/index.js +1 -1
  87. package/dist/application-spec/parse-application-files/spec/expressions/memo-eval-plan.js +1 -1
  88. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  89. package/dist/application-spec/parse-application-files/spec/model/defaults.d.ts +7 -2
  90. package/dist/application-spec/parse-application-files/spec/model/defaults.js +1 -1
  91. package/dist/application-spec/parse-application-files/spec/relations/reference-field-type.d.ts +25 -0
  92. package/dist/application-spec/parse-application-files/spec/relations/reference-field-type.js +1 -0
  93. package/dist/application-spec/parse-application-files/spec/relations/relation-field-mismatch.d.ts +46 -0
  94. package/dist/application-spec/parse-application-files/spec/relations/relation-field-mismatch.js +1 -0
  95. package/dist/application-spec/parse-application-files/spec/relations/relations.d.ts +4 -3
  96. package/dist/application-spec/parse-application-files/spec/relations/relations.js +1 -1
  97. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  98. package/dist/application-spec/parse-application-files/spec/sections/infra.d.ts +2 -0
  99. package/dist/application-spec/parse-application-files/spec/sections/infra.js +1 -1
  100. package/dist/client/phoenix-api.d.ts +96 -0
  101. package/dist/configurator/application-runtime/extensions/create-configurator-extensions.js +1 -1
  102. package/dist/configurator/application-runtime/extensions/selectors.d.ts +3 -1
  103. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  104. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +3 -1
  105. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  106. package/dist/configurator/application-runtime/extensions/systems/drag-and-drop-system/drag-and-drop-system.d.ts +3 -3
  107. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +14 -4
  108. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  109. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.d.ts +11 -0
  110. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.js +1 -0
  111. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -2
  112. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  113. package/dist/configurator/common/configurator-interface.d.ts +11 -1
  114. package/dist/configurator/common/configurator-interface.js +1 -1
  115. package/dist/configurator/common/frontend-analytics.d.ts +2 -0
  116. package/dist/configurator/common/frontend-analytics.js +1 -1
  117. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +1 -1
  118. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +6 -0
  119. package/dist/configurator/pages/DefaultConfiguratorLayout.js +1 -0
  120. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  121. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragHandle.d.ts +1 -1
  122. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragSceneHandle.d.ts +1 -1
  123. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicator.d.ts +1 -1
  124. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicatorInternal.d.ts +1 -1
  125. package/dist/configurator/scene/scene-entity/drag-and-drop/shared.d.ts +2 -2
  126. package/dist/configurator/scene/scene-entity/drag-and-drop/use-drag-object.d.ts +1 -1
  127. package/dist/configurator/scene/scene-entity/materials/RemoteReplacedMaterial.js +1 -1
  128. package/dist/configurator/scene/scene-entity/objects/SceneEntityObjectTextDecal.d.ts +1 -1
  129. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +1 -1
  130. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  131. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  132. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +13 -0
  133. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -0
  134. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.d.ts +22 -0
  135. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.js +1 -0
  136. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +27 -0
  137. package/dist/configurator/ui/assistant/entity-link/entity-link-state.js +1 -0
  138. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +5 -0
  139. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +1 -0
  140. package/dist/configurator/ui/assistant/entity-link/index.d.ts +3 -0
  141. package/dist/configurator/ui/assistant/entity-link/index.js +1 -0
  142. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.d.ts +1 -0
  143. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.js +1 -0
  144. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.d.ts +11 -0
  145. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.js +1 -0
  146. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.d.ts +101 -0
  147. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.js +16 -0
  148. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.d.ts +1 -0
  149. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.js +1 -0
  150. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.d.ts +4 -4
  151. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  152. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.d.ts +3 -6
  153. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.js +1 -1
  154. package/dist/configurator/ui/configurator-layout/slots/slots.d.ts +1 -0
  155. package/dist/configurator/ui/configurator-layout/slots/slots.js +1 -1
  156. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.d.ts +0 -74
  157. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -20
  158. package/dist/configurator/ui/configurator-layout/universal/DesktopPreview.js +1 -1
  159. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  160. package/dist/configurator/ui/configurator-layout/universal/MobilePreview.js +1 -1
  161. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.d.ts +47 -0
  162. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.js +1 -0
  163. package/dist/configurator/ui/configurator-layout/universal/use-scene-safe-area.d.ts +11 -26
  164. package/dist/configurator/ui/configurator-layout/universal/use-scene-safe-area.js +1 -1
  165. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.d.ts +2 -2
  166. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.d.ts +2 -2
  167. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +16 -19
  168. package/dist/docs/complex-use-cases/sketching.mdx +0 -38
  169. package/dist/docs/controls/select-attribute/cardselect.mdx +9 -13
  170. package/dist/docs/dimensions/3d-scene-integration/dimension-indicators.mdx +2 -2
  171. package/dist/docs/dimensions/3d-scene-integration/editable-angle-indicator.mdx +1 -1
  172. package/dist/docs/dimensions/3d-scene-integration/editable-distance-dimension-indicator.mdx +1 -1
  173. package/dist/docs/dimensions/3d-scene-integration/list-selector-dimension-indicator.mdx +1 -1
  174. package/dist/docs/drag-and-drop/drag-handle.mdx +1 -1
  175. package/dist/docs/drag-and-drop/hotspot-handle.mdx +1 -1
  176. package/dist/docs/drag-and-drop/planes.mdx +1 -1
  177. package/dist/docs/drag-and-drop/rotatable.mdx +2 -2
  178. package/dist/docs/index.json +42 -1
  179. package/dist/docs/integrations/woocommerce/local-development.mdx +1 -1
  180. package/dist/docs/layouts/custom-layout.mdx +1164 -0
  181. package/dist/docs/layouts/header/fixed.mdx +2 -2
  182. package/dist/docs/layouts/header/floating.mdx +2 -2
  183. package/dist/docs/layouts/sidebar/in-a-custom-layout.mdx +380 -0
  184. package/dist/docs/layouts/sidebar-footer/basic.mdx +32 -77
  185. package/dist/docs/other-features/client-side-rendering/declarative.mdx +1 -1
  186. package/dist/docs/other-features/side-effects.mdx +8 -11
  187. package/dist/docs/other-features/transformers.mdx +4 -0
  188. package/dist/docs/other-features/violation-messages.mdx +52 -56
  189. package/dist/docs/phoenix/application-states.mdx +9 -7
  190. package/dist/docs/phoenix/configurator-interface.mdx +184 -80
  191. package/dist/docs/phoenix/domain-model.mdx +4 -0
  192. package/dist/docs/phoenix/finalization.mdx +1 -1
  193. package/dist/docs/phoenix/layout-slots.mdx +114 -0
  194. package/dist/docs/phoenix/phoenix-cli.mdx +24 -27
  195. package/dist/docs/phoenix/project-structure.mdx +14 -9
  196. package/dist/docs/phoenix/quickstart.mdx +2 -2
  197. package/dist/docs/phoenix/sdk-builder-workflow.mdx +2 -2
  198. package/dist/docs/phoenix/testing.mdx +140 -0
  199. package/dist/docs/phoenix/webhook-membership.mdx +10 -9
  200. package/dist/docs/phoenix/webhooks.mdx +2 -2
  201. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +26 -11
  202. package/dist/domain/admin-domain/implementation/common-admin-publish.d.ts +1 -2
  203. package/dist/domain/admin-domain/index.js +1 -1
  204. package/dist/domain/application/GetApplicationWrapperHandler.d.ts +1 -1
  205. package/dist/domain/application/application-config.d.ts +4 -2
  206. package/dist/domain/application/assistant/assistant-fields.d.ts +12 -0
  207. package/dist/domain/application/assistant/assistant-fields.js +1 -0
  208. package/dist/domain/application/assistant/assistant-manifest.d.ts +9 -1
  209. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +38 -2
  210. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -1
  211. package/dist/domain/application/assistant/build-assistant-lenses.d.ts +14 -0
  212. package/dist/domain/application/assistant/build-assistant-lenses.js +5 -0
  213. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  214. package/dist/domain/application/assistant/create-assistant-execution-schema.d.ts +32 -0
  215. package/dist/domain/application/assistant/create-assistant-execution-schema.js +1 -0
  216. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  217. package/dist/domain/application/assistant/index.d.ts +6 -1
  218. package/dist/domain/application/assistant/index.js +1 -1
  219. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +20 -0
  220. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.js +1 -0
  221. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +10 -0
  222. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -0
  223. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +48 -0
  224. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -0
  225. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +15 -0
  226. package/dist/domain/application/assistant/session-setup/create-session-assistant.js +1 -0
  227. package/dist/domain/application/assistant/session-setup/index.d.ts +4 -0
  228. package/dist/domain/application/assistant/session-setup/index.js +1 -0
  229. package/dist/domain/application/configurator-builder.d.ts +1 -1
  230. package/dist/domain/application/configurator-builder.js +1 -1
  231. package/dist/domain/application/create-initial-published-data.d.ts +5 -5
  232. package/dist/domain/application/index.d.ts +0 -1
  233. package/dist/domain/application/index.js +1 -1
  234. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +1 -1
  235. package/dist/domain/application/published-data/map-published-data.d.ts +7 -3
  236. package/dist/domain/core/component/domain-component-optic.d.ts +11 -19
  237. package/dist/domain/core/component/domain-component-optic.js +2 -2
  238. package/dist/domain/core/component/legacy-filter.d.ts +2 -17
  239. package/dist/domain/core/component/system-component-filter.d.ts +36 -18
  240. package/dist/domain/core/expression/constant-expressions.d.ts +16 -8
  241. package/dist/domain/core/expression/custom-expression.d.ts +16 -3
  242. package/dist/domain/core/invariant/custom-invariants.d.ts +6 -14
  243. package/dist/domain/core/invariant/invariants.d.ts +1 -4
  244. package/dist/domain/core/invariant/violation.d.ts +50 -2
  245. package/dist/domain/core/invariant/violation.js +1 -1
  246. package/dist/domain/core/model/model.d.ts +1 -1
  247. package/dist/domain/core/recipe/recipes.d.ts +18 -50
  248. package/dist/domain/core/recipe/recipes.js +1 -1
  249. package/dist/domain/core/relation/all-of-type-relation.d.ts +8 -21
  250. package/dist/domain/core/relation/all-of-type-relation.js +1 -1
  251. package/dist/domain/core/relation/direct-relation.d.ts +13 -24
  252. package/dist/domain/core/relation/index.d.ts +0 -1
  253. package/dist/domain/core/relation/indirect-relation.d.ts +12 -67
  254. package/dist/domain/core/relation/indirect-relation.js +1 -1
  255. package/dist/domain/core/relation/relation-factory.d.ts +19 -15
  256. package/dist/domain/core/relation/relation-factory.js +1 -1
  257. package/dist/domain/core/state/migrations.d.ts +14 -45
  258. package/dist/domain/core/state/migrations.js +1 -1
  259. package/dist/domain/core/state/state.d.ts +1 -1
  260. package/dist/domain/domain-builder.js +1 -1
  261. package/dist/domain/domain-runtime/access/selectors.d.ts +9 -0
  262. package/dist/domain/domain-runtime/access/selectors.js +1 -1
  263. package/dist/domain/domain-runtime/access/types.d.ts +2 -0
  264. package/dist/domain/domain-runtime/access/types.js +1 -1
  265. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +14 -13
  266. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  267. package/dist/domain/domain-runtime/domain-context/types.d.ts +4 -1
  268. package/dist/domain/domain-runtime/domain-runtime.d.ts +32 -16
  269. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +19 -0
  270. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -0
  271. package/dist/domain/domain-runtime/errors/implementation-error.d.ts +46 -0
  272. package/dist/domain/domain-runtime/errors/implementation-error.js +1 -0
  273. package/dist/domain/domain-runtime/errors/implementation-errors.d.ts +13 -0
  274. package/dist/domain/domain-runtime/errors/implementation-errors.js +1 -0
  275. package/dist/domain/domain-runtime/errors/index.d.ts +4 -0
  276. package/dist/domain/domain-runtime/errors/index.js +1 -0
  277. package/dist/domain/domain-runtime/errors/to-implementation-errors.d.ts +10 -0
  278. package/dist/domain/domain-runtime/errors/to-implementation-errors.js +1 -0
  279. package/dist/domain/domain-runtime/index.d.ts +1 -0
  280. package/dist/domain/domain-runtime/index.js +1 -1
  281. package/dist/domain/domain-runtime/spec/create-violation-expressions.d.ts +24 -0
  282. package/dist/domain/domain-runtime/spec/create-violation-expressions.js +1 -0
  283. package/dist/domain/domain-runtime/spec/index.d.ts +1 -1
  284. package/dist/domain/domain-runtime/spec/index.js +1 -1
  285. package/dist/domain/domain-runtime/spec/initialize.d.ts +11 -0
  286. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  287. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +1 -1
  288. package/dist/domain/domain-runtime/spec/module-checks/project-modules.d.ts +8 -1
  289. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +1 -1
  290. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.js +1 -1
  291. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -1
  292. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.d.ts +7 -7
  293. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +1 -1
  294. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.d.ts +2 -2
  295. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.js +1 -1
  296. package/dist/domain/extensions/attribute-switch.d.ts +1 -1
  297. package/dist/domain/extensions/attribute-switch.js +1 -1
  298. package/dist/domain/extensions/canvas-config.d.ts +1 -1
  299. package/dist/domain/extensions/client-side-image.d.ts +2 -2
  300. package/dist/domain/extensions/client-side-image.js +1 -1
  301. package/dist/domain/extensions/common/angle-indicator-schema.d.ts +2 -2
  302. package/dist/domain/extensions/common/dimension-indicator-schema.d.ts +2 -2
  303. package/dist/domain/extensions/editable-angle-indicator.d.ts +1 -1
  304. package/dist/domain/extensions/editable-distance-dimension-indicator.d.ts +1 -1
  305. package/dist/domain/extensions/editable-offset-indicator.d.ts +1 -1
  306. package/dist/domain/extensions/editable-offset-indicator.js +1 -1
  307. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -1
  308. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -1
  309. package/dist/domain/extensions/horizontal-tabs.d.ts +2 -2
  310. package/dist/domain/extensions/list-selector-dimension-indicator.d.ts +1 -1
  311. package/dist/domain/extensions/navigation-steps.d.ts +2 -2
  312. package/dist/domain/extensions/offset-indicator.js +1 -1
  313. package/dist/domain/extensions/rotation-handle.d.ts +2 -2
  314. package/dist/domain/extensions/save-template-thumbnail.d.ts +2 -2
  315. package/dist/domain/extensions/save-template-thumbnail.js +1 -1
  316. package/dist/domain/extensions/scene-entity-animation.js +1 -1
  317. package/dist/domain/mocks/create-mock-domain-context.d.ts +1 -1
  318. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +18 -9
  319. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  320. package/dist/domain/mocks/create-mock-domain.d.ts +1 -1
  321. package/dist/domain/mocks/create-mock-domain.js +1 -1
  322. package/dist/domain/mocks/create-mock-state.d.ts +2 -2
  323. package/dist/domain/mocks/create-test-application-config.d.ts +59 -0
  324. package/dist/domain/mocks/create-test-application-config.js +1 -0
  325. package/dist/domain/mocks/index.d.ts +1 -0
  326. package/dist/domain/mocks/index.js +1 -1
  327. package/dist/domain/projections/blender-projections/camera.d.ts +1 -1
  328. package/dist/domain/system-components/application-config.d.ts +2 -2
  329. package/dist/domain/system-components/child-entity-selection.js +1 -1
  330. package/dist/domain/system-components/collision-box-geometry.d.ts +4 -2
  331. package/dist/domain/system-components/collision-geometry.d.ts +4 -2
  332. package/dist/domain/system-components/collision-point-geometry.d.ts +4 -2
  333. package/dist/domain/system-components/common/material-override-schema.d.ts +2 -2
  334. package/dist/domain/system-components/common/recipes.d.ts +21 -3
  335. package/dist/domain/system-components/common/recipes.js +1 -1
  336. package/dist/domain/system-components/constraint.d.ts +10 -23
  337. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  338. package/dist/domain/system-components/drag-handle.js +1 -1
  339. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  340. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  341. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  342. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  343. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -1
  344. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  345. package/dist/domain/system-components/material-swatch.js +1 -1
  346. package/dist/domain/system-components/scene-entity-material-override.d.ts +1 -1
  347. package/dist/domain/system-components/scene-entity-object-material-override.d.ts +1 -1
  348. package/dist/domain/system-components/scene-entity-object-text-decal.d.ts +1 -1
  349. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.d.ts +1 -1
  350. package/dist/domain/system-components/scene-entity-transimissive-material-override.d.ts +1 -1
  351. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  352. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  353. package/dist/domain/utils/eval-cache.d.ts +1 -1
  354. package/dist/domain/utils/map-nested-object.d.ts +1 -1
  355. package/dist/editor/domain-editors/use-implementation-files.d.ts +1 -2
  356. package/dist/editor/mocks/EditorMockContext.js +1 -1
  357. package/dist/legacy/domain-cli/gen/configurator-builder.js +13 -12
  358. package/dist/legacy/domain-cli/gen/constant-expressions.js +1 -1
  359. package/dist/legacy/domain-cli/gen/defaults.js +1 -7
  360. package/dist/legacy/domain-cli/gen/invariants.js +3 -4
  361. package/dist/legacy/domain-cli/gen/relations.js +1 -1
  362. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  363. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  364. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +81 -68
  365. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  366. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  367. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  368. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +2 -0
  369. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/domain-index.js +17 -15
  370. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  371. package/dist/phoenix/commands/deploy.js +1 -1
  372. package/dist/phoenix/commands/init.d.ts +4 -4
  373. package/dist/phoenix/commands/init.js +1 -1
  374. package/dist/phoenix/commands/prettier.js +1 -1
  375. package/dist/phoenix/services/source-archive.d.ts +1 -0
  376. package/dist/phoenix/services/source-archive.js +1 -1
  377. package/dist/phoenix/utils/git/index.d.ts +1 -0
  378. package/dist/phoenix/utils/git/index.js +1 -0
  379. package/dist/phoenix/utils/git/is-inside-git-repository.d.ts +6 -0
  380. package/dist/phoenix/utils/git/is-inside-git-repository.js +1 -0
  381. package/dist/phoenix/utils/index.d.ts +1 -0
  382. package/dist/phoenix/utils/index.js +1 -1
  383. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +2 -0
  384. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  385. package/dist/react-sdk/application-runtime/routing/access-service.d.ts +1 -0
  386. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +33 -16
  387. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  388. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +30 -0
  389. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -0
  390. package/dist/react-sdk/domain-context/common-hooks/use-domain-context.d.ts +4 -4
  391. package/dist/react-sdk/domain-context/index.d.ts +2 -1
  392. package/dist/react-sdk/domain-context/index.js +1 -1
  393. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +6 -0
  394. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  395. package/dist/react-sdk/domain-controls/hooks/use-angle-dimension.d.ts +1 -1
  396. package/dist/ui-sdk/theme/types.d.ts +1 -1
  397. package/dist/webhook/builders/webhook-builder.js +1 -1
  398. package/package.json +3 -3
  399. package/schema/domain-spec.json +1115 -209
  400. package/dist/application-spec/generate-application/code/templates/prettier-ignore.d.ts +0 -1
  401. package/dist/application-spec/generate-application/code/templates/prettier-ignore.js +0 -6
  402. package/dist/domain/application/resource-builder.d.ts +0 -13
  403. package/dist/domain/application/resource-builder.js +0 -1
  404. package/dist/domain/core/relation/relation-implementation.d.ts +0 -7
  405. package/dist/domain/domain-runtime/spec/invariant-builder.d.ts +0 -26
  406. package/dist/domain/domain-runtime/spec/invariant-builder.js +0 -1
  407. /package/dist/{domain/core/relation/relation-implementation.js → application-spec/core/expressions/relation-expression-params.js} +0 -0
  408. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.d.ts +0 -0
  409. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.js +0 -0
  410. /package/dist/application-spec/{core → enhanced-json}/eval-to-constant.js +0 -0
@@ -2,39 +2,39 @@ import{fileHeader as n}from"./file-header.js";import{generateImports as i,getImp
2
2
  ${n.join(",\n ")}
3
3
  )`,a=(n,i)=>{if(0===n.length)return"{}";let o=n.map((n,o)=>{let t=e(n);return null===t?null:` ${t}: ${i[o]}`}).filter(n=>null!==n);return 0===o.length?"{}":`{
4
4
  ${o.join(",\n")}
5
- }`};export const generateIndexDomainFile=(s={})=>{let{includeMigrations:r=!0,includeI18n:m=!0,expressionsFiles:d=[],invariantsFiles:l=[],adminExpressionsFiles:p=[],adminInvariantsFiles:c=[],migrationsFiles:u=[],adminMigrationsFiles:g=[]}=s,x=(n,i)=>`${i?"adminMigrateToV":"migrateToV"}${e(n)}`,$=u.map(n=>{let i=e(n),o=n.replace(/\.ts$/,""),t=`../src/${o}.js`;return`import { migrateToV${i} } from '${t}'`}).join("\n"),f=g.map(n=>{let i=e(n),o=n.replace(/\.ts$/,""),t=`../src/${o}.js`;return`import { migrateToV${i} as adminMigrateToV${i} } from '${t}'`}).join("\n"),h=u.map(n=>x(n,!1)),A=g.map(n=>x(n,!0)),E=u.length>0,j=g.length>0,y=i(d,"expressions"),D=i(l,"invariants"),V=i(p,"adminExpressions"),v=i(c,"adminInvariants"),M=o(d,"expressions"),B=o(l,"invariants"),I=o(p,"adminExpressions"),F=o(c,"adminInvariants"),w=t(B),b=t(M),R=t(F),T=t(I),C=[y,D,V,v].filter(Boolean).join("\n"),P=[$,f].filter(Boolean).join("\n"),S=d.length>1||l.length>1||p.length>1||c.length>1,k=a(u,h),q=a(g,A),z=E?`
5
+ }`};export const generateIndexDomainFile=(s={})=>{let{includeMigrations:r=!0,includeI18n:m=!0,expressionsFiles:d=[],invariantsFiles:l=[],adminExpressionsFiles:p=[],adminInvariantsFiles:c=[],migrationsFiles:x=[],adminMigrationsFiles:g=[]}=s,u=(n,i)=>`${i?"adminMigrateToV":"migrateToV"}${e(n)}`,$=x.map(n=>{let i=e(n),o=n.replace(/\.ts$/,""),t=`../src/${o}.js`;return`import { migrateToV${i} } from '${t}'`}).join("\n"),A=g.map(n=>{let i=e(n),o=n.replace(/\.ts$/,""),t=`../src/${o}.js`;return`import { migrateToV${i} as adminMigrateToV${i} } from '${t}'`}).join("\n"),h=x.map(n=>u(n,!1)),f=g.map(n=>u(n,!0)),E=x.length>0,j=g.length>0,y=i(d,"expressions"),D=i(l,"invariants"),V=i(p,"adminExpressions"),M=i(c,"adminInvariants"),F=o(d,"expressions"),I=o(l,"invariants"),v=o(p,"adminExpressions"),w=o(c,"adminInvariants"),B=t(I),R=t(F),b=t(w),T=t(v),C=[y,D,V,M].filter(Boolean).join("\n"),P=[$,A].filter(Boolean).join("\n"),S=d.length>1||l.length>1||p.length>1||c.length>1,k=a(x,h),q=a(g,f),z=E?`
6
6
  const migrations = ${k}
7
7
 
8
- const migrate = MigrateFunctionBuilder.fromVersions(modelVersions).to(modelVersion).using(migrations).build()`:"",G=j?`
8
+ const migrate = createMigrateFunction(modelVersions, modelVersion, migrations)`:"",G=j?`
9
9
  const adminMigrations = ${q}
10
10
 
11
- const migrateAdmin = MigrateFunctionBuilder.fromVersions(adminModelVersions).to(adminModelVersion).using(adminMigrations).build()`:"";return`${n}
11
+ const migrateAdmin = createMigrateFunction(adminModelVersions, adminModelVersion, adminMigrations)`:"";return`${n}
12
12
  ${S?"import merge from 'lodash-es/merge.js'\n":""}
13
- import { type AliasedExpressions${r&&(E||j)?", MigrateFunctionBuilder":""} } from '@salsita-ai/sdk/domain'
13
+ import { type AliasedExpressions${r&&(E||j)?", createMigrateFunction":""}, createViolationExpressions } from '@salsita-ai/sdk/domain'
14
14
 
15
15
  ${m?"import { createI18n } from './i18n.js'":""}
16
- import { adminDomainBuilder, adminInvariantBuilder } from './domain/admin-implementation.js'
16
+ import { adminDomainBuilder, commonAdminInvariants } from './domain/admin-implementation.js'
17
17
  import type {
18
18
  Aliases as AdminAliases,
19
19
  AnyDomainEntity as AdminAnyDomainEntity,
20
20
  RootEntity as AdminRootEntity,
21
21
  } from './domain/admin-model/index.js'
22
- ${j?"import { modelVersion as adminModelVersion, modelVersions as adminModelVersions } from './domain/admin-model/index.js'\n":""}
22
+ import { aliases as adminAliases${j?", modelVersion as adminModelVersion, modelVersions as adminModelVersions":""} } from './domain/admin-model/index.js'
23
23
  import type { FrontendData, PublishedData, SessionData } from './domain/application-types.js'
24
24
  import {
25
25
  generatedConfiguratorBuilder,
26
26
  } from './domain/configurator-builder.js'
27
- import { domainBuilder, invariantBuilder } from './domain/implementation.js'
27
+ import { domainBuilder } from './domain/implementation.js'
28
28
  import type { Aliases, AnyDomainEntity, RootEntity } from './domain/model/index.js'
29
- ${E?"import { modelVersion, modelVersions } from './domain/model/index.js'\n":""}
29
+ import { aliases${E?", modelVersion, modelVersions":""} } from './domain/model/index.js'
30
30
  ${C?`
31
31
  ${C}`:""}
32
32
  ${P?`
33
33
  ${P}`:""}${z}${G}
34
34
 
35
- const customInvariants = ${w}
35
+ const customInvariants = ${B}
36
36
 
37
- const violationExpressions = invariantBuilder.withInvariants(customInvariants).buildViolationExpressions()
37
+ const violationExpressions = createViolationExpressions(aliases, [{ origin: '.phoenix/domain.ts', exports: customInvariants }])
38
38
 
39
39
  const customExpressions: AliasedExpressions<
40
40
  AnyDomainEntity,
@@ -43,18 +43,20 @@ const customExpressions: AliasedExpressions<
43
43
  SessionData,
44
44
  FrontendData,
45
45
  Aliases
46
- > = ${b}
46
+ > = ${R}
47
47
 
48
48
  const domainFactory = domainBuilder
49
49
  .withExpressions(violationExpressions)
50
50
  .withExpressions(customExpressions)${r&&E?"\n .withMigrate(migrate)":""}
51
51
  .build()
52
52
 
53
- const customAdminInvariants = ${R}
53
+ const customAdminInvariants = ${b}
54
54
 
55
- const adminViolationExpressions = adminInvariantBuilder
56
- .withInvariants(customAdminInvariants)
57
- .buildViolationExpressions()
55
+ const adminViolationExpressions = createViolationExpressions(
56
+ adminAliases,
57
+ [{ origin: '.phoenix/domain.ts', exports: customAdminInvariants }],
58
+ commonAdminInvariants
59
+ )
58
60
 
59
61
  const customAdminExpressions: AliasedExpressions<
60
62
  AdminAnyDomainEntity,
@@ -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 m,parseApplicationFiles as d}from"#package/application-spec";import{getAllPhxDefinitions as u}from"#package/domain";import{compileWithSwc as S}from"../services/swc.js";import{syncChangedFiles as b}from"../utils/index.js";import{readApplicationFiles as w}from"./application-spec-file-reader.js";import{cleanStaleAgentSkills as j,removeProjectFiles as v}from"./clean-project-files.js";import{swcEvalExpressionParser as D,swcModuleAnalyzer as F}from"./swc-module-analyzer.js";let x=".phoenix",y=`${x}/`,P=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}},k=async e=>{let[i,t,r]=await Promise.all([Promise.all(e.generatedProjectFiles.map(P)),Promise.all(e.initialProjectFiles.map(P)),Promise.all(e.prettierFiles.map(P))]);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 w({envs:{}});r?.();let s=d({rawProjectFiles:o,phxDefinitions:this.phxDefinitions},{analyzer:F,evalExpressionParser:D,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=m({applicationSpec:n,categorizedFiles:a,phxDefinitions:this.phxDefinitions,sdkVersion:this.config.sdkVersion,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 g=i?.startSpan("cleanStaleFiles","build","application-spec-builder.ts"),f=new Set(p.files.map(e=>e.path));this.cleanStaleGeneratedFiles(f),v(p.removedProjectFiles,{logger:this.logger}),j(new Set(p.generatedProjectFiles.map(e=>e.path)),{logger:this.logger}),g?.();let h=i?.startSpan("contentDiff","build","application-spec-builder.ts"),u=await k(p),S=this.contentDiff.getChangedApplicationFiles(u,{generatedFilesPathPrefix:y,force:e?.force}),x=S.changedGeneratedFiles;h?.(),x.length>0?this.logger.info(` ${x.length}/${p.files.length} generated files changed`):this.logger.info(" No generated files changed");let P=S.filesToWrite.length-x.length;P>0&&this.logger.info(` ${P} project files changed`);let C=i?.startSpan("writeFiles","build","application-spec-builder.ts");return await b(S.filesToWrite,{logger:this.logger,skipChecksum:!0}),C?.(),t&&await this.compile(i),{ok:!0,application:s.value,changedFiles:x,diagnostics:s.diagnostics,metrics:s.metrics,counts:s.counts}}async compile(e){let i=e?.startSpan("swcCompile(src)","build","application-spec-builder.ts");await S({sourceDir:"src",outDir:`./${x}/.swc/src`},{logger:this.logger}),i?.();let t=e?.startSpan("swcCompile(.phoenix)","build","application-spec-builder.ts");await S({sourceDir:x,outDir:`./${x}/.swc/${x}`},{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(x))return;for(let e of r(x)){if(a.has(e)||t.has(e))continue;let r=n(x,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"]);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,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()}};
@@ -6,10 +6,10 @@ export interface InitCommandProps {
6
6
  }
7
7
  /**
8
8
  * Starts a Phoenix project: writes a `package.json` that depends on this CLI's SDK version when the folder has none,
9
- * the starter spec and the pnpm settings the first install needs, and switches the project to the application-spec
10
- * pipeline. It touches no server and asks
11
- * nothing: the starter spec names the default project of whichever workspace the developer signs in to, and
12
- * everything else is generated by sync or the build.
9
+ * the starter spec and the pnpm settings the first install needs, adds the `dev`, `build`, `deploy`, `check` and `fix`
10
+ * scripts the project does not have yet, and switches the project to the application-spec pipeline. It touches no
11
+ * server and asks nothing: the starter spec names the default project of whichever workspace the developer signs in
12
+ * to, and everything else is generated by sync or the build.
13
13
  *
14
14
  * Refuses when a `spec/` folder exists, and when an existing `package.json` does not depend on the SDK.
15
15
  */
@@ -1 +1 @@
1
- import{existsSync as e}from"fs";import{mkdir as n,readFile as t,writeFile as i}from"fs/promises";import{basename as o,dirname as r,join as p}from"path";import{ensureWorkspaceInstallSettings as a}from"../utils/index.js";import{starterSpecFiles as s}from"./init-starter-spec.js";let c="@salsita-ai/sdk",l=async e=>{let n=`Install the SDK first (\`pnpm add ${c}\`), then rerun \`pnpm phoenix init\`.`,i=JSON.parse(await t(e,"utf-8"));if("object"!=typeof i||null===i||Array.isArray(i))throw Error(`phoenix init could not read package.json because it is not a JSON object. ${n}`);if(!["dependencies","devDependencies"].some(e=>{let n=Reflect.get(i,e);return"object"==typeof n&&null!==n&&c in n}))throw Error(`phoenix init found no ${c} dependency in package.json. ${n}`);return{...i}},d=async e=>{for(let t of s){let o=p(e,t.path);await n(r(o),{recursive:!0}),await i(o,t.content)}},m=async(e,n)=>{let t=n.phoenix;await i(e,JSON.stringify({...n,phoenix:{..."object"==typeof t&&null!==t?t:{},applicationFlow:!0}},null,2)+"\n")};export const runInitCommand=async(t,{logger:i})=>{var r,s;let f,u=t.projectRoot??process.cwd(),h=p(u,"package.json");if(e(p(u,"spec")))throw Error("phoenix init found an existing spec/ folder. init only starts new projects, and writing a starter spec would overwrite or mix with the existing one. To update an existing project, run `pnpm phoenix sync`; to start over, run init in an empty project folder.");let w=e(h)?await l(h):(r=u,s=t.sdkVersion,{name:(f=o(r).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[._-]+|[-]+$/g,"")).length>0?f:"phoenix-configurator",private:!0,type:"module",dependencies:{[c]:s},devDependencies:{"@lingui/cli":"5.9.5","@lingui/swc-plugin":"5.11.0"}});i.step(`Writing the starter project to ${u}`),await n(u,{recursive:!0}),await d(u),await m(h,w),a(u),i.success(`Phoenix project created in ${u}.`),i.info("\nNext steps, in the project folder:\n pnpm install\n pnpm phoenix sync\n pnpm phoenix login <workspace>\n pnpm phoenix dev\n pnpm phoenix deploy\n\nDeveloping against a Studio development environment instead? Paste its .env block into .env before phoenix dev.")};
1
+ import{existsSync as e}from"fs";import{mkdir as n,readFile as t,writeFile as i}from"fs/promises";import{basename as o,dirname as r,join as p}from"path";import{ensureWorkspaceInstallSettings as s}from"../utils/index.js";import{starterSpecFiles as a}from"./init-starter-spec.js";let c="@salsita-ai/sdk",l={dev:"phoenix dev",build:"phoenix build",deploy:"phoenix deploy",check:"phoenix check",fix:"phoenix fix"},d=async e=>{let n=`Install the SDK first (\`pnpm add ${c}\`), then rerun \`pnpm phoenix init\`.`,i=JSON.parse(await t(e,"utf-8"));if("object"!=typeof i||null===i||Array.isArray(i))throw Error(`phoenix init could not read package.json because it is not a JSON object. ${n}`);if(!["dependencies","devDependencies"].some(e=>{let n=Reflect.get(i,e);return"object"==typeof n&&null!==n&&c in n}))throw Error(`phoenix init found no ${c} dependency in package.json. ${n}`);return{...i}},h=async e=>{for(let t of a){let o=p(e,t.path);await n(r(o),{recursive:!0}),await i(o,t.content)}},f=async(e,n)=>{let t=n.phoenix,o=n.scripts,r="object"==typeof o&&null!==o?o:{},p=Object.fromEntries(Object.entries(l).filter(([e])=>!(e in r)));await i(e,JSON.stringify({...n,scripts:{...r,...p},phoenix:{..."object"==typeof t&&null!==t?t:{},applicationFlow:!0}},null,2)+"\n")};export const runInitCommand=async(t,{logger:i})=>{var r,a;let u,m=t.projectRoot??process.cwd(),x=p(m,"package.json");if(e(p(m,"spec")))throw Error("phoenix init found an existing spec/ folder. init only starts new projects, and writing a starter spec would overwrite or mix with the existing one. To update an existing project, run `pnpm phoenix sync`; to start over, run init in an empty project folder.");let w=e(x)?await d(x):(r=m,a=t.sdkVersion,{name:(u=o(r).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[._-]+|[-]+$/g,"")).length>0?u:"phoenix-configurator",private:!0,type:"module",scripts:l,dependencies:{[c]:a},devDependencies:{"@lingui/cli":"5.9.5","@lingui/swc-plugin":"5.11.0"}});i.step(`Writing the starter project to ${m}`),await n(m,{recursive:!0}),await h(m),await f(x,w),s(m),i.success(`Phoenix project created in ${m}.`),i.info("\nNext steps, in the project folder:\n pnpm install\n pnpm phoenix sync\n pnpm phoenix login <workspace>\n pnpm phoenix dev\n pnpm phoenix deploy\n\nDeveloping against a Studio development environment instead? Paste its .env block into .env before phoenix dev.")};
@@ -1 +1 @@
1
- import{readFile as t,writeFile as e}from"fs/promises";import{globby as o}from"globby";import{resolve as r}from"path";import*as i from"prettier";let a=["**/node_modules/**","**/dist/**","**/.git/**","**/webhooks/index.ts`","**/frontend-configurator.ts`","**/frontend-admin.ts`","**/frontend-embedded-admin.ts`","pnpm-lock.yaml",".linguirc"];export const formatFiles=async(n,f)=>{let{logger:l}=f,s=await o("."===n?"**/*":n,{gitignore:!0,ignore:a}),c=0;for(let o of s)try{let a=r(o),n=await t(a,"utf-8"),f=await i.resolveConfig(a);if((await i.getFileInfo(a)).ignored)continue;let l=await i.format(n,{...f,filepath:a});l!==n&&(await e(a,l,"utf-8"),c++)}catch(t){}c>0&&l.info(`Formatted ${c} file${1!==c?"s":""}`)};export const checkFiles=async(e,n)=>{let{logger:f}=n,l=await o("."===e?"**/*":e,{gitignore:!0,ignore:a}),s=[];for(let e of l)try{let o=r(e),a=await t(o,"utf-8"),n=await i.resolveConfig(o);if((await i.getFileInfo(o)).ignored)continue;await i.check(a,{...n,filepath:o})||s.push(e)}catch(t){}return!(s.length>0)||(f.error(`Found ${s.length} unformatted file${1!==s.length?"s":""}:`),s.forEach(t=>{console.error(` - ${t}`)}),!1)};
1
+ import{readFile as t,writeFile as e}from"fs/promises";import{globby as o}from"globby";import{resolve as i}from"path";import*as r from"prettier";let a=["**/node_modules/**","**/dist/**","**/.git/**","**/.phoenix/**","**/locales/*/*.ts","pnpm-lock.yaml",".linguirc"];export const formatFiles=async(n,l)=>{let{logger:f}=l,s=await o("."===n?"**/*":n,{gitignore:!0,ignore:a}),c=0;for(let o of s)try{let a=i(o),n=await t(a,"utf-8"),l=await r.resolveConfig(a);if((await r.getFileInfo(a)).ignored)continue;let f=await r.format(n,{...l,filepath:a});f!==n&&(await e(a,f,"utf-8"),c++)}catch(t){}c>0&&f.info(`Formatted ${c} file${1!==c?"s":""}`)};export const checkFiles=async(e,n)=>{let{logger:l}=n,f=await o("."===e?"**/*":e,{gitignore:!0,ignore:a}),s=[];for(let e of f)try{let o=i(e),a=await t(o,"utf-8"),n=await r.resolveConfig(o);if((await r.getFileInfo(o)).ignored)continue;await r.check(a,{...n,filepath:o})||s.push(e)}catch(t){}return!(s.length>0)||(l.error(`Found ${s.length} unformatted file${1!==s.length?"s":""}:`),s.forEach(t=>{console.error(` - ${t}`)}),!1)};
@@ -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:$}};
@@ -0,0 +1 @@
1
+ export { isInsideGitRepository } from './is-inside-git-repository.js';
@@ -0,0 +1 @@
1
+ export{isInsideGitRepository}from"./is-inside-git-repository.js";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Whether a folder is inside a git work tree: the folder or one of its parents, up to the file-system root, holds a
3
+ * `.git` entry. The entry is a directory in a plain checkout and a file in a linked worktree or a submodule; both
4
+ * count. Only the file system is read, so the answer does not depend on git being installed.
5
+ */
6
+ export declare const isInsideGitRepository: (folder: string) => boolean;
@@ -0,0 +1 @@
1
+ import{existsSync as t,realpathSync as r}from"fs";import{dirname as e,join as i,resolve as o}from"path";export const isInsideGitRepository=f=>{let n=(t=>{let e=o(t);try{return r(e)}catch{return e}})(f);for(;;){if(t(i(n,".git")))return!0;let r=e(n);if(r===n)return!1;n=r}};
@@ -4,6 +4,7 @@ export { formatEnvContent, formatEnvLine } from './env-file.js';
4
4
  export { parseChangelog, getLatestVersion, getVersion, paginateVersions, getVersionNumbers, type ChangelogVersion, type PaginatedVersions, } from './changelog-parser.js';
5
5
  export { createDirectoryFromYaml, exists, scanFolderForFiles, syncChangedFiles, syncExistingFolders, validateFolders, writeFileIfNotExists, writeFilesIfNotExists, writeRawFiles, } from './file-system.js';
6
6
  export { FileLogger } from './file-logger.js';
7
+ export { isInsideGitRepository } from './git/index.js';
7
8
  export { type Logger, type CreateLoggerOptions, createLogger } from './logger.js';
8
9
  export { addWorkspaceOverrides, ensureWorkspaceInstallSettings, getLocalOverrides, getSdkPackages, getWorkspaceDir, hasLocalOverrides, readPackageJson, removeWorkspaceOverrides, } from './package-info.js';
9
10
  export { toPascalCase } from './pascal-case.js';
@@ -1 +1 @@
1
- export{askQuestion}from"./ask-question.js";export{checkBundleSizeBudgets}from"./check-bundle-size-budgets.js";export{formatEnvContent,formatEnvLine}from"./env-file.js";export{parseChangelog,getLatestVersion,getVersion,paginateVersions,getVersionNumbers}from"./changelog-parser.js";export{createDirectoryFromYaml,exists,scanFolderForFiles,syncChangedFiles,syncExistingFolders,validateFolders,writeFileIfNotExists,writeFilesIfNotExists,writeRawFiles}from"./file-system.js";export{FileLogger}from"./file-logger.js";export{createLogger}from"./logger.js";export{addWorkspaceOverrides,ensureWorkspaceInstallSettings,getLocalOverrides,getSdkPackages,getWorkspaceDir,hasLocalOverrides,readPackageJson,removeWorkspaceOverrides}from"./package-info.js";export{toPascalCase}from"./pascal-case.js";export{readGitCommit}from"./read-git-commit.js";export{runCommand}from"./run-command.js";export{uploadFilesWithPresignedUrls,readUploadLinks}from"./upload-utils.js";
1
+ export{askQuestion}from"./ask-question.js";export{checkBundleSizeBudgets}from"./check-bundle-size-budgets.js";export{formatEnvContent,formatEnvLine}from"./env-file.js";export{parseChangelog,getLatestVersion,getVersion,paginateVersions,getVersionNumbers}from"./changelog-parser.js";export{createDirectoryFromYaml,exists,scanFolderForFiles,syncChangedFiles,syncExistingFolders,validateFolders,writeFileIfNotExists,writeFilesIfNotExists,writeRawFiles}from"./file-system.js";export{FileLogger}from"./file-logger.js";export{isInsideGitRepository}from"./git/index.js";export{createLogger}from"./logger.js";export{addWorkspaceOverrides,ensureWorkspaceInstallSettings,getLocalOverrides,getSdkPackages,getWorkspaceDir,hasLocalOverrides,readPackageJson,removeWorkspaceOverrides}from"./package-info.js";export{toPascalCase}from"./pascal-case.js";export{readGitCommit}from"./read-git-commit.js";export{runCommand}from"./run-command.js";export{uploadFilesWithPresignedUrls,readUploadLinks}from"./upload-utils.js";
@@ -12,12 +12,14 @@ export declare const useConfiguratorRawAccessService: () => AccessService | null
12
12
  export declare const useAdminRawAccessService: () => AccessService | null;
13
13
  export declare const useConfiguratorRawAccessInfo: () => {
14
14
  raw: string;
15
+ access: import("@salsita-ai/contracts/api").AccessLevel;
15
16
  viewMode: boolean;
16
17
  revisionId: string | undefined;
17
18
  configurationId: string;
18
19
  } | null;
19
20
  export declare const useAdminRawAccessInfo: () => {
20
21
  raw: string;
22
+ access: import("@salsita-ai/contracts/api").AccessLevel;
21
23
  viewMode: boolean;
22
24
  revisionId: string | undefined;
23
25
  configurationId: string;
@@ -1 +1 @@
1
- import{memoOnce as e}from"@salsita-ai/common/utils";import{createDomainRuntime as t,createMockDomainRuntimeServices as o,createMockSessionContext as n}from"#package/domain";import{createCommonServicesSelectors as s}from"../common-services/index.js";import{createDomainApplicationContextSelectors as i}from"../domain-application-context/index.js";import{createIntegrationActions as a,createIntegrationSelectors as r,initializeIntegration as c}from"../integration/index.js";import{createRoutingActions as m,createRoutingSelectors as d,initializeRouting as p}from"../routing/index.js";import{SessionService as l,createSessionRuntimeActions as S,createSessionRuntimeSelectors as g,initializeSessionRuntime as v}from"../session/index.js";import{createMockWebComponentApi as u}from"../web-component/index.js";export const createMockApplicationRuntime=(f,C)=>{var x;let b,y,w,A,D,k,E,I,h,j,R,T,O,L,F,{sessionData:M,mode:U,role:V}=C,z=o(),q=(x={webComponentOptions:C.webComponentOptions??f.mount.options,webComponentApi:C.webComponentApi??u()},w=v(),A=t({config:f,services:z,getExtensionSystems:e=>F[e].getInitializableSystems()}),D=new Set,k=()=>{D.forEach(e=>{e()})},b=c({actions:E=a({setIntegration:e=>{b=e(b),k()}})}),I=r({getState:()=>({integration:b})}),h=m({setRouting:e=>{y=e(y),k()}}),y=p(),j=d({getState:()=>({...A.getState(),routing:y}),actions:h,accessActions:A.actions.access,loadedDataActions:A.actions.loadedData,domainServicesSelectors:A.selectors.domainServices,overridesSelectors:A.selectors.overrides}),R=s({getState:()=>({...A.getState(),session:w}),environmentSelectors:A.selectors.environment,specSelectors:A.selectors.spec,accessSelectors:A.selectors.access,domainServicesSelectors:A.selectors.domainServices,webComponentOptions:x.webComponentOptions,webComponentApi:x.webComponentApi,getSessionService:()=>L(),routingSelectors:j}),T=S({setSessionRuntime:e=>{w=e(w),k()}}),O=g({getState:()=>({...A.getState(),session:w}),sessionContextSelectors:A.selectors.sessionContext}),L=e(()=>new l({getLogger:()=>A.selectors.domainServices.getLogger(),getAnalyticsService:()=>A.selectors.domainServices.getAnalyticsService(),getUnauthenticatedClient:R.getUnauthenticatedClient,environmentSelectors:A.selectors.environment,sessionActions:T,setSessionContext:A.actions.sessionContext.setSessionContext,sessionSelectors:O,specSelectors:A.selectors.spec})),F={configurator:i({applicationType:"configurator",commonServicesSelectors:R,domainServicesSelectors:A.selectors.domainServices,domainContextSelectors:A.selectors.domainContext.configurator,getApplicationRuntimeExtensions:()=>[]}),admin:i({applicationType:"admin",commonServicesSelectors:R,domainServicesSelectors:A.selectors.domainServices,domainContextSelectors:A.selectors.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})},{subscribe:e=>{D.add(e);let t=A.subscribe(e);return()=>{D.delete(e),t()}},getState:()=>({...A.getState(),integration:b,routing:y,session:w}),selectors:{...A.selectors,commonServices:R,integration:I,routing:j,session:O,domainApplicationContext:F},actions:{...A.actions,integration:E,routing:h,session:T}}),B=q.getState().spec;return q.actions.spec.updateSpec({...B,configurator:{...B.configurator,createTransformers:e=>C.transformers.map(t=>t.transformer.register(e,t.priority??1/0))}}),q.actions.sessionContext.setSessionContext(n(V,M)),q.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",viewMode:"read"===U,revisionId:void 0,configurationId:"mock"}),q.actions.domainData.setDomainData({publishedData:C.publishedData,frontendData:C.frontendData,backendData:C.backendData}),q.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:C.entities,modelVersion:f.domain.domainFactory.modelVersion,rootEntityType:C.rootEntityType,schemaIdentity:f.domain.domainFactory}),q};
1
+ import{memoOnce as e}from"@salsita-ai/common/utils";import{AccessLevel as t}from"@salsita-ai/contracts/api";import{createDomainRuntime as o,createMockDomainRuntimeServices as n,createMockSessionContext as s}from"#package/domain";import{createCommonServicesSelectors as i}from"../common-services/index.js";import{createDomainApplicationContextSelectors as a}from"../domain-application-context/index.js";import{createIntegrationActions as r,createIntegrationSelectors as c,initializeIntegration as m}from"../integration/index.js";import{createRoutingActions as d,createRoutingSelectors as p,initializeRouting as l}from"../routing/index.js";import{SessionService as S,createSessionRuntimeActions as g,createSessionRuntimeSelectors as v,initializeSessionRuntime as u}from"../session/index.js";import{createMockWebComponentApi as f}from"../web-component/index.js";export const createMockApplicationRuntime=(C,x)=>{var b;let w,y,A,D,k,E,I,R,h,j,O,T,L,F,M,{sessionData:U,mode:V,role:z}=x,q=n(),B=(b={webComponentOptions:x.webComponentOptions??C.mount.options,webComponentApi:x.webComponentApi??f()},A=u(),D=o({config:C,services:q,getExtensionSystems:e=>M[e].getInitializableSystems()}),k=new Set,E=()=>{k.forEach(e=>{e()})},w=m({actions:I=r({setIntegration:e=>{w=e(w),E()}})}),R=c({getState:()=>({integration:w})}),h=d({setRouting:e=>{y=e(y),E()}}),y=l(),j=p({getState:()=>({...D.getState(),routing:y}),actions:h,accessActions:D.actions.access,loadedDataActions:D.actions.loadedData,domainServicesSelectors:D.selectors.domainServices,overridesSelectors:D.selectors.overrides}),O=i({getState:()=>({...D.getState(),session:A}),environmentSelectors:D.selectors.environment,specSelectors:D.selectors.spec,accessSelectors:D.selectors.access,domainServicesSelectors:D.selectors.domainServices,webComponentOptions:b.webComponentOptions,webComponentApi:b.webComponentApi,getSessionService:()=>F(),routingSelectors:j}),T=g({setSessionRuntime:e=>{A=e(A),E()}}),L=v({getState:()=>({...D.getState(),session:A}),sessionContextSelectors:D.selectors.sessionContext}),F=e(()=>new S({getLogger:()=>D.selectors.domainServices.getLogger(),getAnalyticsService:()=>D.selectors.domainServices.getAnalyticsService(),getUnauthenticatedClient:O.getUnauthenticatedClient,environmentSelectors:D.selectors.environment,sessionActions:T,setSessionContext:D.actions.sessionContext.setSessionContext,sessionSelectors:L,specSelectors:D.selectors.spec})),M={configurator:a({applicationType:"configurator",commonServicesSelectors:O,domainServicesSelectors:D.selectors.domainServices,domainContextSelectors:D.selectors.domainContext.configurator,getApplicationRuntimeExtensions:()=>[]}),admin:a({applicationType:"admin",commonServicesSelectors:O,domainServicesSelectors:D.selectors.domainServices,domainContextSelectors:D.selectors.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})},{subscribe:e=>{k.add(e);let t=D.subscribe(e);return()=>{k.delete(e),t()}},getState:()=>({...D.getState(),integration:w,routing:y,session:A}),selectors:{...D.selectors,commonServices:O,integration:R,routing:j,session:L,domainApplicationContext:M},actions:{...D.actions,integration:I,routing:h,session:T}}),G=B.getState().spec;return B.actions.spec.updateSpec({...G,configurator:{...G.configurator,createTransformers:e=>x.transformers.map(t=>t.transformer.register(e,t.priority??1/0))}}),B.actions.sessionContext.setSessionContext(s(z,U)),B.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",access:"read"===V?t.Read:t.Owner,viewMode:"read"===V,revisionId:void 0,configurationId:"mock"}),B.actions.domainData.setDomainData({publishedData:x.publishedData,frontendData:x.frontendData,backendData:x.backendData}),B.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:x.entities,modelVersion:C.domain.domainFactory.modelVersion,rootEntityType:x.rootEntityType,schemaIdentity:C.domain.domainFactory}),B};
@@ -3,6 +3,7 @@ export declare const getAccessTokenFromLocalStorage: (configurationId: string) =
3
3
  export declare const removeAccessTokenFromLocalStorage: (configurationId: string) => void;
4
4
  export declare const getAccessInfo: (configurationId: string, accessToken?: string) => {
5
5
  raw: string;
6
+ access: import("@salsita-ai/contracts/api").AccessLevel;
6
7
  viewMode: boolean;
7
8
  revisionId: string | undefined;
8
9
  configurationId: string;
@@ -36,6 +36,7 @@ interface Props<State extends ApplicationRuntimeState, CONFIGURATOR_EXTENSIONS e
36
36
  * `createDomainRuntimeSlices`, which this composes.
37
37
  */
38
38
  export declare function createApplicationRuntimeSlices<State extends ApplicationRuntimeState, CONFIGURATOR_EXTENSIONS extends readonly AnyApplicationRuntimeExtension[]>(props: Props<State, CONFIGURATOR_EXTENSIONS>): {
39
+ getState: () => State;
39
40
  initialize: () => {
40
41
  spec: import("#package/domain").ApplicationSpec;
41
42
  overrides: import("#package/domain").ApplicationOverrides;
@@ -278,24 +279,28 @@ export declare function createApplicationRuntimeSlices<State extends Application
278
279
  access: {
279
280
  selectConfiguratorRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
280
281
  raw: string;
282
+ access: import("@salsita-ai/contracts/api").AccessLevel;
281
283
  viewMode: boolean;
282
284
  revisionId: string | undefined;
283
285
  configurationId: string;
284
286
  } | null>;
285
287
  selectAdminRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
286
288
  raw: string;
289
+ access: import("@salsita-ai/contracts/api").AccessLevel;
287
290
  viewMode: boolean;
288
291
  revisionId: string | undefined;
289
292
  configurationId: string;
290
293
  } | null>;
291
294
  selectConfiguratorAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
292
295
  raw: string;
296
+ access: import("@salsita-ai/contracts/api").AccessLevel;
293
297
  viewMode: boolean;
294
298
  revisionId: string | undefined;
295
299
  configurationId: string;
296
300
  }>;
297
301
  selectAdminAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
298
302
  raw: string;
303
+ access: import("@salsita-ai/contracts/api").AccessLevel;
299
304
  viewMode: boolean;
300
305
  revisionId: string | undefined;
301
306
  configurationId: string;
@@ -308,24 +313,28 @@ export declare function createApplicationRuntimeSlices<State extends Application
308
313
  selectAdminConfigurationId: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, string>;
309
314
  getConfiguratorRawAccessInfo: () => {
310
315
  raw: string;
316
+ access: import("@salsita-ai/contracts/api").AccessLevel;
311
317
  viewMode: boolean;
312
318
  revisionId: string | undefined;
313
319
  configurationId: string;
314
320
  } | null;
315
321
  getAdminRawAccessInfo: () => {
316
322
  raw: string;
323
+ access: import("@salsita-ai/contracts/api").AccessLevel;
317
324
  viewMode: boolean;
318
325
  revisionId: string | undefined;
319
326
  configurationId: string;
320
327
  } | null;
321
328
  getConfiguratorAccessInfo: () => {
322
329
  raw: string;
330
+ access: import("@salsita-ai/contracts/api").AccessLevel;
323
331
  viewMode: boolean;
324
332
  revisionId: string | undefined;
325
333
  configurationId: string;
326
334
  };
327
335
  getAdminAccessInfo: () => {
328
336
  raw: string;
337
+ access: import("@salsita-ai/contracts/api").AccessLevel;
329
338
  viewMode: boolean;
330
339
  revisionId: string | undefined;
331
340
  configurationId: string;
@@ -371,9 +380,9 @@ export declare function createApplicationRuntimeSlices<State extends Application
371
380
  selectIsViewMode: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, boolean>;
372
381
  selectInitializationState: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").DomainContextInitializationState>;
373
382
  selectComponentOptics: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, readonly import("#package/domain").AnyDomainComponentOptic[]>;
374
- selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>>;
383
+ selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes>;
375
384
  selectStoreRuntimeDependencies: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, {
376
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
385
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
377
386
  domainExpressions: import("#package/domain").AnyExpressions;
378
387
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
379
388
  }>;
@@ -413,9 +422,9 @@ export declare function createApplicationRuntimeSlices<State extends Application
413
422
  getMigrate: () => import("#package/domain").MigrateFunction<import("#package/domain").DomainEntity<string>>;
414
423
  getActiveMode: () => import("#package/domain").DomainMode;
415
424
  getIsInitialized: () => boolean;
416
- getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
425
+ getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes;
417
426
  getStoreRuntimeDependencies: () => {
418
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
427
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
419
428
  domainExpressions: import("#package/domain").AnyExpressions;
420
429
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
421
430
  };
@@ -480,9 +489,9 @@ export declare function createApplicationRuntimeSlices<State extends Application
480
489
  selectIsViewMode: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, boolean>;
481
490
  selectInitializationState: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").DomainContextInitializationState>;
482
491
  selectComponentOptics: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, readonly import("#package/domain").AnyDomainComponentOptic[]>;
483
- selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>>;
492
+ selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes>;
484
493
  selectStoreRuntimeDependencies: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, {
485
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
494
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
486
495
  domainExpressions: import("#package/domain").AnyExpressions;
487
496
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
488
497
  }>;
@@ -522,9 +531,9 @@ export declare function createApplicationRuntimeSlices<State extends Application
522
531
  getMigrate: () => import("#package/domain").MigrateFunction<import("#package/domain").DomainEntity<string>>;
523
532
  getActiveMode: () => import("#package/domain").DomainMode;
524
533
  getIsInitialized: () => boolean;
525
- getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
534
+ getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes;
526
535
  getStoreRuntimeDependencies: () => {
527
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
536
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
528
537
  domainExpressions: import("#package/domain").AnyExpressions;
529
538
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
530
539
  };
@@ -938,24 +947,28 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
938
947
  access: {
939
948
  selectConfiguratorRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
940
949
  raw: string;
950
+ access: import("@salsita-ai/contracts/api").AccessLevel;
941
951
  viewMode: boolean;
942
952
  revisionId: string | undefined;
943
953
  configurationId: string;
944
954
  } | null>;
945
955
  selectAdminRawAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
946
956
  raw: string;
957
+ access: import("@salsita-ai/contracts/api").AccessLevel;
947
958
  viewMode: boolean;
948
959
  revisionId: string | undefined;
949
960
  configurationId: string;
950
961
  } | null>;
951
962
  selectConfiguratorAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
952
963
  raw: string;
964
+ access: import("@salsita-ai/contracts/api").AccessLevel;
953
965
  viewMode: boolean;
954
966
  revisionId: string | undefined;
955
967
  configurationId: string;
956
968
  }>;
957
969
  selectAdminAccessInfo: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, {
958
970
  raw: string;
971
+ access: import("@salsita-ai/contracts/api").AccessLevel;
959
972
  viewMode: boolean;
960
973
  revisionId: string | undefined;
961
974
  configurationId: string;
@@ -968,24 +981,28 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
968
981
  selectAdminConfigurationId: import("@salsita-ai/common/utils").Selector<import("#package/domain").AccessSelectorState, string>;
969
982
  getConfiguratorRawAccessInfo: () => {
970
983
  raw: string;
984
+ access: import("@salsita-ai/contracts/api").AccessLevel;
971
985
  viewMode: boolean;
972
986
  revisionId: string | undefined;
973
987
  configurationId: string;
974
988
  } | null;
975
989
  getAdminRawAccessInfo: () => {
976
990
  raw: string;
991
+ access: import("@salsita-ai/contracts/api").AccessLevel;
977
992
  viewMode: boolean;
978
993
  revisionId: string | undefined;
979
994
  configurationId: string;
980
995
  } | null;
981
996
  getConfiguratorAccessInfo: () => {
982
997
  raw: string;
998
+ access: import("@salsita-ai/contracts/api").AccessLevel;
983
999
  viewMode: boolean;
984
1000
  revisionId: string | undefined;
985
1001
  configurationId: string;
986
1002
  };
987
1003
  getAdminAccessInfo: () => {
988
1004
  raw: string;
1005
+ access: import("@salsita-ai/contracts/api").AccessLevel;
989
1006
  viewMode: boolean;
990
1007
  revisionId: string | undefined;
991
1008
  configurationId: string;
@@ -1031,9 +1048,9 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
1031
1048
  selectIsViewMode: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, boolean>;
1032
1049
  selectInitializationState: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").DomainContextInitializationState>;
1033
1050
  selectComponentOptics: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, readonly import("#package/domain").AnyDomainComponentOptic[]>;
1034
- selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>>;
1051
+ selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes>;
1035
1052
  selectStoreRuntimeDependencies: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, {
1036
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
1053
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
1037
1054
  domainExpressions: import("#package/domain").AnyExpressions;
1038
1055
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
1039
1056
  }>;
@@ -1073,9 +1090,9 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
1073
1090
  getMigrate: () => import("#package/domain").MigrateFunction<import("#package/domain").DomainEntity<string>>;
1074
1091
  getActiveMode: () => import("#package/domain").DomainMode;
1075
1092
  getIsInitialized: () => boolean;
1076
- getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
1093
+ getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes;
1077
1094
  getStoreRuntimeDependencies: () => {
1078
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
1095
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
1079
1096
  domainExpressions: import("#package/domain").AnyExpressions;
1080
1097
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
1081
1098
  };
@@ -1140,9 +1157,9 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
1140
1157
  selectIsViewMode: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, boolean>;
1141
1158
  selectInitializationState: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").DomainContextInitializationState>;
1142
1159
  selectComponentOptics: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, readonly import("#package/domain").AnyDomainComponentOptic[]>;
1143
- selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>>;
1160
+ selectComponentReaderIndexes: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, import("#package/domain").ComponentReaderIndexes>;
1144
1161
  selectStoreRuntimeDependencies: import("@salsita-ai/common/utils").Selector<import("#package/domain").DomainContextSelectorState, {
1145
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
1162
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
1146
1163
  domainExpressions: import("#package/domain").AnyExpressions;
1147
1164
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
1148
1165
  }>;
@@ -1182,9 +1199,9 @@ declare const createApplicationRuntimeImpl: <EXTENSIONS extends readonly AnyAppl
1182
1199
  getMigrate: () => import("#package/domain").MigrateFunction<import("#package/domain").DomainEntity<string>>;
1183
1200
  getActiveMode: () => import("#package/domain").DomainMode;
1184
1201
  getIsInitialized: () => boolean;
1185
- getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
1202
+ getComponentReaderIndexes: () => import("#package/domain").ComponentReaderIndexes;
1186
1203
  getStoreRuntimeDependencies: () => {
1187
- componentReaderIndexes: import("#package/domain").ComponentReaderIndexes<any, any, any, any, any>;
1204
+ componentReaderIndexes: import("#package/domain").ComponentReaderIndexes;
1188
1205
  domainExpressions: import("#package/domain").AnyExpressions;
1189
1206
  allowedRootEntityTypes: import("#package/domain").AnyAllowedRootEntityTypes;
1190
1207
  };
@@ -1 +1 @@
1
- import{BehaviorSubject as e}from"rxjs";import{memoOnce as t}from"@salsita-ai/common/utils";import{createDomainRuntimeSlices as i,resolveIsDev as n}from"#package/domain";import{initializeAnalyticsService as o}from"../common-services/analytics/analytics-service.js";import{initializeI18n as s,initializeLogger as r}from"../common-services/initialize.js";import{createCommonServicesSelectors as a}from"../common-services/selectors.js";import{createDomainApplicationContextSelectors as c}from"../domain-application-context/index.js";import{createIntegrationActions as m,createIntegrationSelectors as l,initializeIntegration as p}from"../integration/index.js";import{createRoutingActions as u,createRoutingSelectors as d,initializeRouting as g}from"../routing/index.js";import{SessionService as S,createSessionRuntimeActions as v,createSessionRuntimeSelectors as x,initializeSessionRuntime as f}from"../session/index.js";import{registerGodModeGlobal as C}from"./god-mode.js";export function createApplicationRuntimeSlices(e){let{config:y,bootConfig:A,getSubject:b,getConfiguratorExtensions:j}=e,w=n(y),R=r(y,w),I={analyticsService:o(y,R,w),i18n:s(y),logger:R},{initialize:E,selectors:h,actions:z}=i({config:y,services:I,getSubject:b,getExtensionSystems:e=>J[e].getInitializableSystems()}),D=E(),T=m({setIntegration:e=>{let t=b(),i=e(t.value.integration);t.next({...t.value,integration:i})}}),L=l({getState:()=>b().value}),O=p({actions:T}),U=u({setRouting:e=>{let t=b(),i=e(t.value.routing);t.next({...t.value,routing:i})}}),k=d({getState:()=>b().value,actions:U,accessActions:z.access,loadedDataActions:z.loadedData,domainServicesSelectors:h.domainServices,overridesSelectors:h.overrides}),G=g(),$=a({getState:()=>b().value,environmentSelectors:h.environment,specSelectors:h.spec,accessSelectors:h.access,domainServicesSelectors:h.domainServices,webComponentOptions:A.webComponentOptions,webComponentApi:A.webComponentApi,getSessionService:()=>H(),routingSelectors:k}),q=v({setSessionRuntime:e=>{let t=b(),i=e(t.value.session);t.next({...t.value,session:i})}}),B=x({getState:()=>b().value,sessionContextSelectors:h.sessionContext}),F=f(),H=t(()=>new S({getLogger:()=>h.domainServices.getLogger(),getAnalyticsService:()=>h.domainServices.getAnalyticsService(),getUnauthenticatedClient:$.getUnauthenticatedClient,environmentSelectors:h.environment,sessionActions:q,setSessionContext:z.sessionContext.setSessionContext,sessionSelectors:B,specSelectors:h.spec})),J={configurator:c({applicationType:"configurator",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.configurator,getApplicationRuntimeExtensions:j}),admin:c({applicationType:"admin",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})};return C({environmentActions:z.environment}),R.info(`Configurator Application loaded with deployment ID: ${y.deploymentId}!`),R.appendToGlobalContext({deploymentId:y.deploymentId}),{initialize:()=>({...D,integration:O,routing:G,session:F}),selectors:{...h,commonServices:$,integration:L,routing:k,session:B,domainApplicationContext:J},actions:{...z,integration:T,routing:U,session:q}}}export function createApplicationRuntime(t,i,n){return((t,i,n)=>{let o=null,s=null,r=()=>{if(!o)throw Error("Subject not yet initialized!");return o},{initialize:a,...c}=createApplicationRuntimeSlices({config:t,bootConfig:i,getSubject:r,getConfiguratorExtensions:()=>s});return s=n?n(c):[],c.selectors.domainApplicationContext.configurator.getSystems(),o=new e(a()),{...c,getState:()=>r().value,subscribe:e=>{let t=r().subscribe(()=>e());return()=>t.unsubscribe()}}})(t,i,n)}
1
+ import{BehaviorSubject as e}from"rxjs";import{memoOnce as t}from"@salsita-ai/common/utils";import{createDomainRuntimeSlices as i,resolveIsDev as n}from"#package/domain";import{initializeAnalyticsService as o}from"../common-services/analytics/analytics-service.js";import{initializeI18n as s,initializeLogger as r}from"../common-services/initialize.js";import{createCommonServicesSelectors as a}from"../common-services/selectors.js";import{createDomainApplicationContextSelectors as c}from"../domain-application-context/index.js";import{createIntegrationActions as m,createIntegrationSelectors as l,initializeIntegration as p}from"../integration/index.js";import{createRoutingActions as u,createRoutingSelectors as d,initializeRouting as g}from"../routing/index.js";import{SessionService as S,createSessionRuntimeActions as v,createSessionRuntimeSelectors as x,initializeSessionRuntime as f}from"../session/index.js";import{registerGodModeGlobal as C}from"./god-mode.js";export function createApplicationRuntimeSlices(e){let{config:y,bootConfig:A,getSubject:b,getConfiguratorExtensions:j}=e,w=n(y),R=r(y,w),I={analyticsService:o(y,R,w),i18n:s(y),logger:R},{initialize:E,selectors:h,actions:z}=i({config:y,services:I,getSubject:b,getExtensionSystems:e=>J[e].getInitializableSystems()}),D=E(),T=m({setIntegration:e=>{let t=b(),i=e(t.value.integration);t.next({...t.value,integration:i})}}),L=l({getState:()=>b().value}),O=p({actions:T}),U=u({setRouting:e=>{let t=b(),i=e(t.value.routing);t.next({...t.value,routing:i})}}),k=d({getState:()=>b().value,actions:U,accessActions:z.access,loadedDataActions:z.loadedData,domainServicesSelectors:h.domainServices,overridesSelectors:h.overrides}),G=g(),$=a({getState:()=>b().value,environmentSelectors:h.environment,specSelectors:h.spec,accessSelectors:h.access,domainServicesSelectors:h.domainServices,webComponentOptions:A.webComponentOptions,webComponentApi:A.webComponentApi,getSessionService:()=>H(),routingSelectors:k}),q=v({setSessionRuntime:e=>{let t=b(),i=e(t.value.session);t.next({...t.value,session:i})}}),B=x({getState:()=>b().value,sessionContextSelectors:h.sessionContext}),F=f(),H=t(()=>new S({getLogger:()=>h.domainServices.getLogger(),getAnalyticsService:()=>h.domainServices.getAnalyticsService(),getUnauthenticatedClient:$.getUnauthenticatedClient,environmentSelectors:h.environment,sessionActions:q,setSessionContext:z.sessionContext.setSessionContext,sessionSelectors:B,specSelectors:h.spec})),J={configurator:c({applicationType:"configurator",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.configurator,getApplicationRuntimeExtensions:j}),admin:c({applicationType:"admin",commonServicesSelectors:$,domainServicesSelectors:h.domainServices,domainContextSelectors:h.domainContext.admin,getApplicationRuntimeExtensions:()=>[]})};return C({environmentActions:z.environment}),R.info(`Configurator Application loaded with deployment ID: ${y.deploymentId}!`),R.appendToGlobalContext({deploymentId:y.deploymentId}),{getState:()=>b().value,initialize:()=>({...D,integration:O,routing:G,session:F}),selectors:{...h,commonServices:$,integration:L,routing:k,session:B,domainApplicationContext:J},actions:{...z,integration:T,routing:U,session:q}}}export function createApplicationRuntime(t,i,n){return((t,i,n)=>{let o=null,s=null,r=()=>{if(!o)throw Error("Subject not yet initialized!");return o},{initialize:a,...c}=createApplicationRuntimeSlices({config:t,bootConfig:i,getSubject:r,getConfiguratorExtensions:()=>s});return s=n?n(c):[],c.selectors.domainApplicationContext.configurator.getSystems(),o=new e(a()),{...c,getState:()=>r().value,subscribe:e=>{let t=r().subscribe(()=>e());return()=>t.unsubscribe()}}})(t,i,n)}
@@ -0,0 +1,30 @@
1
+ import type { $DomainEntity, DomainEntity, EntityViolation, ViolationTypesOf$Entity } from '#package/domain';
2
+ /**
3
+ * A message for the user about a change to the configuration, with its text resolved to the current language.
4
+ * Typed per project like `StateValidationResult`, so a layout can narrow on `violation.type`.
5
+ * - `violation`: a change was rejected because it breaks an invariant. There is one message per violation of the
6
+ * rejected state, including notices and warnings that were already present; `violation.severity` tells them
7
+ * apart. `text` is the violation's message, or its type when it has none; `entityId` names the entity.
8
+ * - `sideEffect`: a committed change carried a hint, for example from a transformer that adjusted another field.
9
+ * - `error`: an error was thrown while the changed state was validated; `text` is a generic message for the user.
10
+ */
11
+ export type ConfiguratorMessage<ENTITIES extends DomainEntity<string> = DomainEntity<string>, VIOLATION_TYPE extends string = string> = ({
12
+ readonly kind: 'violation';
13
+ readonly text: string;
14
+ } & EntityViolation<ENTITIES, VIOLATION_TYPE>) | {
15
+ readonly kind: 'sideEffect';
16
+ readonly text: string;
17
+ } | {
18
+ readonly kind: 'error';
19
+ readonly error: Error;
20
+ readonly text: string;
21
+ };
22
+ export type UseConfiguratorMessages<ENTITIES extends DomainEntity<string> = DomainEntity<string>, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>> = Record<ENTITIES['type'], $DomainEntity<ENTITIES>>> = (onMessage: (message: ConfiguratorMessage<ENTITIES, ViolationTypesOf$Entity<$MAP[ENTITIES['type']]>>) => void) => void;
23
+ /**
24
+ * Calls `onMessage` once for every violation, side-effect hint and validation error: the violations of a rejected
25
+ * change, the hints of a committed change and an error thrown while a change was validated. Hints committed before the
26
+ * component mounted are not delivered; when the most recent change was rejected or threw, its messages are
27
+ * delivered again on mount, because the store keeps that emission. `onMessage` may be a new function on every
28
+ * render; the latest one is called.
29
+ */
30
+ export declare const useConfiguratorMessages: (onMessage: (message: ConfiguratorMessage) => void) => void;
@@ -0,0 +1 @@
1
+ import{useSubscription as e}from"observable-hooks";import{useMemo as t}from"react";import{distinctUntilChanged as i,map as o,skip as r}from"rxjs";import{useResolveLocalizable as s}from"../../localizable/index.js";import{useDomain as a}from"./use-domain-context.js";let n={id:"sdk.messages.validation.uncaughtError.message",message:"Oops, something went wrong"};export const useConfiguratorMessages=m=>{let{storeSystem:l}=a(),d=s(),p=t(()=>l.stateSlices.potentiallyInvalid.pipe(o(e=>e.validity)),[l]),f=t(()=>l.stateSlices.committed.pipe(r(1),i(),o(e=>"updates"in e?e.updates.flatMap(e=>e.hint?[e.hint]:[]):[])),[l]);e(p,e=>{if(!e.valid){if("uncaught"===e.severity)return void m({kind:"error",error:e.error,text:d(n)});e.entityViolations.forEach(({entityId:e,violation:t})=>{m({kind:"violation",entityId:e,violation:t,text:d(t.message??t.type)})})}}),e(f,e=>{e.forEach(e=>{m({kind:"sideEffect",text:d(e)})})})};