@salsita-ai/sdk 0.50.0-develop.dbf0122072 → 0.50.0-develop.dede205ab0

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 (714) hide show
  1. package/README.md +1 -1
  2. package/dist/admin/create-admin-pages-from-spec.d.ts +1 -1
  3. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  4. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  5. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  6. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  7. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  8. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  9. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  10. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  11. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  12. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  13. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  14. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  15. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  16. package/dist/application-spec/generate-application/code/templates/domain.js +3 -3
  17. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +1 -1
  18. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +2 -1
  19. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +1 -2
  20. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +8 -4
  21. package/dist/application-spec/index.d.ts +0 -1
  22. package/dist/application-spec/index.js +1 -1
  23. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  24. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +1 -1
  25. package/dist/client/authorized-client.d.ts +3 -1
  26. package/dist/client/authorized-client.js +1 -1
  27. package/dist/client/contract.d.ts +34 -0
  28. package/dist/client/contract.js +1 -1
  29. package/dist/client/index.d.ts +2 -2
  30. package/dist/client/index.js +1 -1
  31. package/dist/client/local-authorized-client.d.ts +3 -1
  32. package/dist/client/local-authorized-client.js +1 -1
  33. package/dist/client/memory-authorized-client.d.ts +3 -1
  34. package/dist/client/memory-authorized-client.js +1 -1
  35. package/dist/client/phoenix-api.d.ts +269 -30
  36. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +56 -2
  37. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  38. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  39. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  40. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  41. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +2 -1
  42. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -1
  43. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -2
  44. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  45. package/dist/configurator/ui/assistant/thread-items.d.ts +13 -2
  46. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  47. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +84 -98
  48. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  49. package/dist/docs/index.json +1 -1
  50. package/dist/docs/layouts/custom-price.mdx +14 -16
  51. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  52. package/dist/docs/other-features/domain-actions.mdx +1 -1
  53. package/dist/docs/other-features/side-effects.mdx +42 -34
  54. package/dist/docs/other-features/transformers.mdx +1 -1
  55. package/dist/docs/phoenix/admin.mdx +9 -24
  56. package/dist/docs/phoenix/deployments.mdx +1 -1
  57. package/dist/docs/phoenix/localization.mdx +3 -22
  58. package/dist/docs/phoenix/phoenix-cli.mdx +21 -21
  59. package/dist/docs/phoenix/project-structure.mdx +6 -0
  60. package/dist/docs/phoenix/sdk-builder-workflow.mdx +6 -6
  61. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  62. package/dist/docs/relations/hierarchy.mdx +13 -2
  63. package/dist/domain/admin-domain/__generated/enhanced-model.d.ts +1 -2
  64. package/dist/domain/admin-domain/__generated/model/versions/v1.d.ts +1 -1
  65. package/dist/domain/admin-domain/__generated/model/versions/v2.d.ts +1 -1
  66. package/dist/domain/admin-domain/__generated/model/versions/v3.d.ts +1 -1
  67. package/dist/domain/admin-domain/__generated/model/versions/v4.d.ts +1 -1
  68. package/dist/domain/admin-domain/__generated/model/versions/v5.d.ts +1 -1
  69. package/dist/domain/admin-domain/__generated/model/versions/v6.d.ts +2 -2
  70. package/dist/domain/admin-domain/__generated/model/versions/v6.js +1 -1
  71. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +1 -4
  72. package/dist/domain/admin-domain/implementation/common-admin-migrations.d.ts +1 -1
  73. package/dist/domain/admin-domain/index.d.ts +3 -4
  74. package/dist/domain/admin-domain/index.js +1 -1
  75. package/dist/domain/application/admin-page-factories.d.ts +1 -1
  76. package/dist/domain/application/application-config.d.ts +23 -13
  77. package/dist/domain/application/assistant/assistant-manifest.d.ts +2 -0
  78. package/dist/domain/application/assistant/assistant-value-type.js +1 -1
  79. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  80. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +3 -0
  81. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  82. package/dist/domain/application/assistant/index.d.ts +1 -0
  83. package/dist/domain/application/assistant/index.js +1 -1
  84. package/dist/domain/application/assistant-field-options.d.ts +1 -2
  85. package/dist/domain/application/assistant-mutations.d.ts +1 -4
  86. package/dist/domain/application/assistant-mutations.js +1 -1
  87. package/dist/domain/application/assistant-recipe-groups.d.ts +1 -5
  88. package/dist/domain/application/configurator-builder.d.ts +30 -16
  89. package/dist/domain/application/configurator-builder.js +1 -1
  90. package/dist/domain/application/element-registration.d.ts +5 -0
  91. package/dist/domain/application/element-registration.js +1 -1
  92. package/dist/domain/application/handler-registration.d.ts +5 -0
  93. package/dist/domain/application/handler-registration.js +1 -1
  94. package/dist/domain/application/index.d.ts +5 -5
  95. package/dist/domain/application/index.js +1 -1
  96. package/dist/domain/application/published-data/create-finalize-admin-domain.d.ts +1 -2
  97. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +1 -1
  98. package/dist/domain/application/published-data/map-published-data.d.ts +1 -2
  99. package/dist/domain/application/resolve-imported-transformers.d.ts +12 -2
  100. package/dist/domain/application/resolve-imported-transformers.js +1 -1
  101. package/dist/domain/available-system-components.js +1 -1
  102. package/dist/domain/{actions → core/action}/action-factory.d.ts +5 -4
  103. package/dist/domain/core/{action.d.ts → action/action.d.ts} +6 -7
  104. package/dist/domain/core/action/index.d.ts +2 -0
  105. package/dist/domain/core/action/index.js +1 -0
  106. package/dist/domain/{components → core/component}/component-reader-types.d.ts +1 -2
  107. package/dist/domain/{components → core/component}/debug-state-component.d.ts +1 -1
  108. package/dist/domain/core/component/debug-state-component.js +1 -0
  109. package/dist/domain/{components → core/component}/domain-component-optic.d.ts +6 -6
  110. package/dist/domain/core/component/domain-component-optic.js +16 -0
  111. package/dist/domain/{components → core/component}/drag-state-component.d.ts +1 -1
  112. package/dist/domain/core/component/drag-state-component.js +1 -0
  113. package/dist/domain/{components → core/component}/export-state-component.d.ts +1 -1
  114. package/dist/domain/core/component/export-state-component.js +1 -0
  115. package/dist/domain/{components → core/component}/fullscreen-state-component.d.ts +1 -1
  116. package/dist/domain/core/component/fullscreen-state-component.js +1 -0
  117. package/dist/domain/{components → core/component}/group-components-by-entity-id-and-name.d.ts +1 -2
  118. package/dist/domain/core/component/group-components-by-entity-id-and-name.js +1 -0
  119. package/dist/domain/{components → core/component}/hover-state-component.d.ts +1 -1
  120. package/dist/domain/core/component/hover-state-component.js +1 -0
  121. package/dist/domain/core/component/index.d.ts +18 -0
  122. package/dist/domain/core/component/index.js +1 -0
  123. package/dist/domain/{components → core/component}/legacy-filter.d.ts +2 -2
  124. package/dist/domain/{components → core/component}/navigation-state-component.d.ts +1 -1
  125. package/dist/domain/core/component/navigation-state-component.js +1 -0
  126. package/dist/domain/{components → core/component}/selection-state-component.d.ts +1 -1
  127. package/dist/domain/core/component/selection-state-component.js +1 -0
  128. package/dist/domain/{components → core/component}/system-component-builder.d.ts +1 -2
  129. package/dist/domain/core/component/system-component-builder.js +1 -0
  130. package/dist/domain/{components → core/component}/system-component-filter.d.ts +3 -3
  131. package/dist/domain/core/component/system-virtual-entity.js +1 -0
  132. package/dist/domain/{components → core/component}/tool-state-component.d.ts +1 -1
  133. package/dist/domain/core/component/tool-state-component.js +1 -0
  134. package/dist/domain/{components → core/component}/updates.d.ts +1 -2
  135. package/dist/domain/{components → core/component}/view-state-component.d.ts +1 -1
  136. package/dist/domain/core/component/view-state-component.js +1 -0
  137. package/dist/domain/{components → core/component}/viewport-state-component.d.ts +1 -1
  138. package/dist/domain/core/component/viewport-state-component.js +1 -0
  139. package/dist/domain/core/decoder/create-decoder.d.ts +6 -0
  140. package/dist/domain/core/decoder/create-decoder.js +1 -0
  141. package/dist/domain/core/decoder/decoder.d.ts +6 -0
  142. package/dist/domain/core/decoder/index.d.ts +2 -0
  143. package/dist/domain/core/decoder/index.js +1 -0
  144. package/dist/domain/core/domain-factory.d.ts +4 -5
  145. package/dist/domain/core/domain-factory.js +1 -1
  146. package/dist/domain/core/domain.d.ts +3 -4
  147. package/dist/domain/core/domain.js +1 -1
  148. package/dist/domain/core/expression/aliased-expressions.d.ts +10 -0
  149. package/dist/domain/{expressions → core/expression}/constant-expressions.d.ts +2 -3
  150. package/dist/domain/core/expression/constant-expressions.js +1 -0
  151. package/dist/domain/{expressions → core/expression}/custom-expression.d.ts +4 -5
  152. package/dist/domain/core/expression/custom-expression.js +1 -0
  153. package/dist/domain/core/{expression.d.ts → expression/expression.d.ts} +6 -8
  154. package/dist/domain/core/expression/index.d.ts +4 -0
  155. package/dist/domain/core/expression/index.js +1 -0
  156. package/dist/domain/core/index.d.ts +11 -17
  157. package/dist/domain/core/index.js +1 -1
  158. package/dist/domain/{invariants → core/invariant}/builtin-invariant.d.ts +2 -2
  159. package/dist/domain/{invariants → core/invariant}/custom-invariants.d.ts +2 -3
  160. package/dist/domain/core/invariant/custom-invariants.js +1 -0
  161. package/dist/domain/core/invariant/index.d.ts +5 -0
  162. package/dist/domain/core/invariant/index.js +1 -0
  163. package/dist/domain/{invariants → core/invariant}/invariants.d.ts +12 -4
  164. package/dist/domain/core/invariant/invariants.js +1 -0
  165. package/dist/domain/core/invariant/violation-component.js +1 -0
  166. package/dist/domain/{invariants → core/invariant}/violation.d.ts +2 -2
  167. package/dist/domain/core/{component.d.ts → model/component.d.ts} +1 -1
  168. package/dist/domain/core/model/index.d.ts +6 -0
  169. package/dist/domain/core/model/index.js +1 -0
  170. package/dist/domain/core/{reflection.d.ts → model/reflection.d.ts} +1 -1
  171. package/dist/domain/core/model/reflection.js +1 -0
  172. package/dist/domain/core/recipe/index.d.ts +1 -0
  173. package/dist/domain/core/recipe/index.js +1 -0
  174. package/dist/domain/{domain-context/recipe-system → core/recipe}/recipes.d.ts +1 -3
  175. package/dist/domain/core/recipe/recipes.js +1 -0
  176. package/dist/domain/{relations → core/relation}/all-of-type-relation.d.ts +3 -4
  177. package/dist/domain/core/relation/all-of-type-relation.js +1 -0
  178. package/dist/domain/{relations → core/relation}/component-factories.d.ts +1 -2
  179. package/dist/domain/core/relation/component-factories.js +1 -0
  180. package/dist/domain/{relations → core/relation}/composed-of.d.ts +1 -1
  181. package/dist/domain/core/relation/composed-of.js +1 -0
  182. package/dist/domain/{relations → core/relation}/direct-relation.d.ts +2 -3
  183. package/dist/domain/core/relation/index.d.ts +9 -0
  184. package/dist/domain/core/relation/index.js +1 -0
  185. package/dist/domain/{relations → core/relation}/indirect-relation.d.ts +3 -4
  186. package/dist/domain/core/relation/indirect-relation.js +1 -0
  187. package/dist/domain/{relations → core/relation}/reference-component.d.ts +4 -5
  188. package/dist/domain/core/relation/reference-component.js +1 -0
  189. package/dist/domain/{relations → core/relation}/reference-field.d.ts +1 -1
  190. package/dist/domain/{relations → core/relation}/relation-factory.d.ts +2 -3
  191. package/dist/domain/{relations → core/relation}/relation-implementation.d.ts +3 -4
  192. package/dist/domain/core/schema/enhanced-json-schema.js +1 -0
  193. package/dist/domain/core/schema/extended-schema-validator.js +1 -0
  194. package/dist/domain/core/schema/index.d.ts +3 -0
  195. package/dist/domain/core/schema/index.js +1 -0
  196. package/dist/domain/core/schema/schema-validator.js +1 -0
  197. package/dist/domain/core/state/id-sequence.d.ts +15 -0
  198. package/dist/domain/core/state/id-sequence.js +1 -0
  199. package/dist/domain/core/state/index.d.ts +3 -0
  200. package/dist/domain/core/state/index.js +1 -0
  201. package/dist/domain/core/{migrations.d.ts → state/migrations.d.ts} +1 -2
  202. package/dist/domain/core/{state.d.ts → state/state.d.ts} +1 -2
  203. package/dist/domain/domain-builder.d.ts +11 -11
  204. package/dist/domain/domain-builder.js +1 -1
  205. package/dist/domain/domain-context/action-system/action-system.d.ts +1 -3
  206. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  207. package/dist/domain/domain-context/create-transformer.d.ts +1 -1
  208. package/dist/domain/domain-context/dimension-system/dimension-state.js +1 -1
  209. package/dist/domain/domain-context/dimension-system/dimension-system.d.ts +1 -2
  210. package/dist/domain/domain-context/domain-context-systems.d.ts +1 -3
  211. package/dist/domain/domain-context/index.d.ts +1 -2
  212. package/dist/domain/domain-context/index.js +1 -1
  213. package/dist/domain/domain-context/navigation-system/navigation-system.d.ts +3 -5
  214. package/dist/domain/domain-context/navigation-system/navigation-system.js +1 -1
  215. package/dist/domain/domain-context/navigation-system/navigation-updates.d.ts +1 -12
  216. package/dist/domain/domain-context/navigation-system/navigation-updates.js +1 -1
  217. package/dist/domain/domain-context/navigation-system/selection-transformers.d.ts +1 -1
  218. package/dist/domain/domain-context/navigation-system/selection-transformers.js +1 -1
  219. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.d.ts +1 -3
  220. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.js +1 -1
  221. package/dist/domain/domain-context/relation-transformers/cascade-deletes.d.ts +1 -1
  222. package/dist/domain/domain-context/relation-transformers/cascade-deletes.js +1 -1
  223. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.d.ts +1 -1
  224. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.js +1 -1
  225. package/dist/domain/domain-context/relation-transformers/create-entity-refs.d.ts +1 -1
  226. package/dist/domain/domain-context/relation-transformers/create-entity-refs.js +2 -2
  227. package/dist/domain/domain-context/relation-transformers/replace-refs.d.ts +1 -1
  228. package/dist/domain/domain-context/relation-transformers/replace-refs.js +1 -1
  229. package/dist/domain/domain-context/store-system/apply-updates.d.ts +1 -3
  230. package/dist/domain/domain-context/store-system/apply-updates.js +1 -1
  231. package/dist/domain/domain-context/store-system/next-domain-entity-id.d.ts +1 -13
  232. package/dist/domain/domain-context/store-system/next-domain-entity-id.js +1 -1
  233. package/dist/domain/domain-context/store-system/reconcile-projected-entities.d.ts +1 -2
  234. package/dist/domain/domain-context/store-system/reconcile-projected-entities.js +1 -1
  235. package/dist/domain/domain-context/store-system/store-system.d.ts +1 -5
  236. package/dist/domain/domain-context/store-system/store-system.js +2 -2
  237. package/dist/domain/domain-context/store-system/system-state.d.ts +1 -3
  238. package/dist/domain/domain-context/store-system/system-state.js +1 -1
  239. package/dist/domain/domain-context/transformers/actions-builder.d.ts +1 -2
  240. package/dist/domain/domain-context/transformers/actions-builder.js +1 -1
  241. package/dist/domain/domain-context/transformers/auto-snap-transformer.d.ts +1 -3
  242. package/dist/domain/domain-context/transformers/chain-builder.d.ts +2 -2
  243. package/dist/domain/domain-context/transformers/context.d.ts +1 -5
  244. package/dist/domain/domain-context/transformers/entity-builder.d.ts +1 -5
  245. package/dist/domain/domain-context/transformers/entity-builder.js +1 -1
  246. package/dist/domain/domain-context/transformers/then-builder.d.ts +1 -2
  247. package/dist/domain/domain-context/transformers/then-builder.js +1 -1
  248. package/dist/domain/domain-context/transformers/when-builder.d.ts +1 -6
  249. package/dist/domain/domain-context/transformers/when-builder.js +1 -1
  250. package/dist/domain/domain-context/undo-system.d.ts +1 -1
  251. package/dist/domain/domain-runtime/domain-context/component-reader.d.ts +1 -4
  252. package/dist/domain/domain-runtime/domain-context/component-reader.js +1 -1
  253. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +2 -4
  254. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  255. package/dist/domain/domain-runtime/spec/index.d.ts +3 -0
  256. package/dist/domain/domain-runtime/spec/index.js +1 -1
  257. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  258. package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.d.ts +1 -2
  259. package/dist/domain/{actions → domain-runtime/spec}/prepare-action-implementations.d.ts +1 -1
  260. package/dist/domain/domain-runtime/spec/prepare-action-implementations.js +5 -0
  261. package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.d.ts +1 -1
  262. package/dist/domain/domain-runtime/spec/types.d.ts +1 -2
  263. package/dist/domain/{system-components → extensions}/angle-indicator.d.ts +1 -1
  264. package/dist/domain/extensions/angle-indicator.js +1 -0
  265. package/dist/domain/extensions/attribute-switch.js +1 -0
  266. package/dist/domain/{system-components → extensions}/autorotate-camera-component.d.ts +1 -1
  267. package/dist/domain/extensions/autorotate-camera-component.js +1 -0
  268. package/dist/domain/{system-components → extensions}/basic-sidebar-footer.d.ts +1 -1
  269. package/dist/domain/extensions/basic-sidebar-footer.js +1 -0
  270. package/dist/domain/extensions/camera-based-hidden-entity-object.js +1 -0
  271. package/dist/domain/extensions/camera-based-hidden-entity.js +1 -0
  272. package/dist/domain/{system-components → extensions}/canvas-config.d.ts +1 -1
  273. package/dist/domain/extensions/canvas-config.js +1 -0
  274. package/dist/domain/extensions/canvas-custom-environment.js +1 -0
  275. package/dist/domain/{system-components → extensions}/canvas-padding.d.ts +1 -1
  276. package/dist/domain/extensions/canvas-padding.js +1 -0
  277. package/dist/domain/{system-components → extensions}/canvas-preset-environment.d.ts +1 -1
  278. package/dist/domain/extensions/canvas-preset-environment.js +1 -0
  279. package/dist/domain/{system-components → extensions}/child-entity-recipe-hierarchy.d.ts +2 -2
  280. package/dist/domain/extensions/child-entity-recipe-hierarchy.js +1 -0
  281. package/dist/domain/extensions/client-side-image.js +1 -0
  282. package/dist/domain/extensions/color-value.js +1 -0
  283. package/dist/domain/{system-components → extensions}/common/angle-indicator-schema.d.ts +1 -1
  284. package/dist/domain/extensions/common/angle-indicator-schema.js +1 -0
  285. package/dist/domain/{system-components → extensions}/common/dimension-indicator-schema.d.ts +1 -1
  286. package/dist/domain/extensions/common/dimension-indicator-schema.js +1 -0
  287. package/dist/domain/extensions/common/index.d.ts +4 -0
  288. package/dist/domain/extensions/common/index.js +1 -0
  289. package/dist/domain/{system-components → extensions}/custom-header.d.ts +2 -2
  290. package/dist/domain/{system-components → extensions}/custom-header.js +1 -1
  291. package/dist/domain/extensions/custom-price-footer.js +1 -0
  292. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.d.ts +2 -2
  293. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.js +1 -1
  294. package/dist/domain/{system-components → extensions}/dimension-indicator.d.ts +1 -1
  295. package/dist/domain/extensions/dimension-indicator.js +1 -0
  296. package/dist/domain/{system-components → extensions}/editable-angle-indicator.d.ts +3 -2
  297. package/dist/domain/extensions/editable-angle-indicator.js +1 -0
  298. package/dist/domain/{system-components → extensions}/editable-distance-dimension-indicator.d.ts +3 -2
  299. package/dist/domain/extensions/editable-distance-dimension-indicator.js +1 -0
  300. package/dist/domain/{system-components → extensions}/editable-offset-indicator.d.ts +3 -2
  301. package/dist/domain/extensions/editable-offset-indicator.js +1 -0
  302. package/dist/domain/{system-components → extensions}/editable-size-indicator.d.ts +3 -2
  303. package/dist/domain/extensions/editable-size-indicator.js +1 -0
  304. package/dist/domain/{system-components → extensions}/entity-header.d.ts +1 -1
  305. package/dist/domain/extensions/entity-header.js +1 -0
  306. package/dist/domain/{system-components → extensions}/exit-tool-mode-fab.d.ts +1 -1
  307. package/dist/domain/extensions/exit-tool-mode-fab.js +1 -0
  308. package/dist/domain/{system-components → extensions}/finalize-action.d.ts +1 -1
  309. package/dist/domain/extensions/finalize-action.js +1 -0
  310. package/dist/domain/extensions/finalize-component.js +1 -0
  311. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -0
  312. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -0
  313. package/dist/domain/{system-components → extensions}/fixed-header.d.ts +1 -1
  314. package/dist/domain/extensions/fixed-header.js +1 -0
  315. package/dist/domain/{system-components → extensions}/floating-header.d.ts +1 -1
  316. package/dist/domain/extensions/floating-header.js +1 -0
  317. package/dist/domain/{system-components → extensions}/hidden-header.d.ts +1 -1
  318. package/dist/domain/extensions/hidden-header.js +1 -0
  319. package/dist/domain/{system-components → extensions}/hidden-sidebar-footer.d.ts +1 -1
  320. package/dist/domain/extensions/hidden-sidebar-footer.js +1 -0
  321. package/dist/domain/{system-components → extensions}/horizontal-tabs.d.ts +1 -1
  322. package/dist/domain/extensions/horizontal-tabs.js +1 -0
  323. package/dist/domain/extensions/index.d.ts +69 -0
  324. package/dist/domain/extensions/index.js +1 -0
  325. package/dist/domain/{system-components → extensions}/list-selector-dimension-indicator.d.ts +3 -2
  326. package/dist/domain/extensions/list-selector-dimension-indicator.js +1 -0
  327. package/dist/domain/extensions/multilingual-text-value.js +1 -0
  328. package/dist/domain/extensions/navigation-steps.js +1 -0
  329. package/dist/domain/{system-components → extensions}/offset-anchors.d.ts +1 -1
  330. package/dist/domain/extensions/offset-anchors.js +1 -0
  331. package/dist/domain/{system-components → extensions}/offset-indicator.d.ts +1 -2
  332. package/dist/domain/extensions/offset-indicator.js +1 -0
  333. package/dist/domain/{system-components → extensions}/offset.d.ts +1 -1
  334. package/dist/domain/extensions/offset.js +1 -0
  335. package/dist/domain/{system-components → extensions}/other-action.d.ts +1 -1
  336. package/dist/domain/extensions/other-action.js +1 -0
  337. package/dist/domain/{system-components → extensions}/property-page.d.ts +2 -2
  338. package/dist/domain/extensions/property-page.js +1 -0
  339. package/dist/domain/{system-components → extensions}/read-sidebar-footer.d.ts +1 -1
  340. package/dist/domain/extensions/read-sidebar-footer.js +1 -0
  341. package/dist/domain/{system-components → extensions}/replace-entity-recipe-hierarchy.d.ts +2 -2
  342. package/dist/domain/extensions/replace-entity-recipe-hierarchy.js +1 -0
  343. package/dist/domain/extensions/rotatable.js +1 -0
  344. package/dist/domain/extensions/rotation-handle.js +1 -0
  345. package/dist/domain/extensions/save-template-thumbnail.js +1 -0
  346. package/dist/domain/{system-components → extensions}/scene-entity-add-fab.d.ts +1 -1
  347. package/dist/domain/extensions/scene-entity-add-fab.js +1 -0
  348. package/dist/domain/extensions/scene-entity-animation.js +1 -0
  349. package/dist/domain/extensions/scene-entity-control.js +1 -0
  350. package/dist/domain/{system-components → extensions}/scene-entity-delete-fab.d.ts +1 -1
  351. package/dist/domain/extensions/scene-entity-delete-fab.js +1 -0
  352. package/dist/domain/extensions/scene-entity-floor-object.js +1 -0
  353. package/dist/domain/{system-components → extensions}/scene-entity-html-hotspot.d.ts +1 -1
  354. package/dist/domain/extensions/scene-entity-html-hotspot.js +1 -0
  355. package/dist/domain/{system-components → extensions}/scene-entity-navigation-hotspot.d.ts +1 -1
  356. package/dist/domain/extensions/scene-entity-navigation-hotspot.js +1 -0
  357. package/dist/domain/{system-components → extensions}/scene-entity-object-html-hotspot.d.ts +1 -1
  358. package/dist/domain/extensions/scene-entity-object-html-hotspot.js +1 -0
  359. package/dist/domain/{system-components → extensions}/scene-entity-select-hotspot.d.ts +1 -1
  360. package/dist/domain/extensions/scene-entity-select-hotspot.js +1 -0
  361. package/dist/domain/extensions/scene-entity-wall-object.js +1 -0
  362. package/dist/domain/extensions/selectable-component.js +1 -0
  363. package/dist/domain/{system-components → extensions}/sidebar-tabs.d.ts +1 -1
  364. package/dist/domain/extensions/sidebar-tabs.js +1 -0
  365. package/dist/domain/extensions/simple-summary.js +1 -0
  366. package/dist/domain/{system-components → extensions}/size.d.ts +1 -1
  367. package/dist/domain/extensions/size.js +1 -0
  368. package/dist/domain/{system-components → extensions}/sketching-draw.d.ts +1 -1
  369. package/dist/domain/extensions/sketching-draw.js +1 -0
  370. package/dist/domain/{system-components → extensions}/sketching-edit.d.ts +2 -2
  371. package/dist/domain/extensions/sketching-edit.js +1 -0
  372. package/dist/domain/extensions/summary-component.js +1 -0
  373. package/dist/domain/extensions/text-value.js +1 -0
  374. package/dist/domain/extensions/tool-controls.js +1 -0
  375. package/dist/domain/{system-components → extensions}/tool-menu-fab.d.ts +2 -2
  376. package/dist/domain/extensions/tool-menu-fab.js +1 -0
  377. package/dist/domain/{system-components → extensions}/toolbar.d.ts +2 -2
  378. package/dist/domain/{system-components → extensions}/toolbar.js +1 -1
  379. package/dist/domain/{system-components → extensions}/universal-sidebar-footer.d.ts +1 -1
  380. package/dist/domain/extensions/universal-sidebar-footer.js +1 -0
  381. package/dist/domain/extensions/view-controls.js +1 -0
  382. package/dist/domain/index.d.ts +3 -32
  383. package/dist/domain/index.js +1 -1
  384. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +1 -1
  385. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  386. package/dist/domain/project-modules/index.d.ts +1 -0
  387. package/dist/domain/project-modules/index.js +1 -0
  388. package/dist/domain/project-modules/project-modules.d.ts +41 -0
  389. package/dist/domain/project-modules/project-modules.js +1 -0
  390. package/dist/domain/projections/blender-projections/blender-projections.d.ts +1 -1
  391. package/dist/domain/projections/blender-projections/blender-projections.js +1 -1
  392. package/dist/domain/projections/composition-projections.js +1 -1
  393. package/dist/domain/projections/projected-entities-projections.d.ts +1 -2
  394. package/dist/domain/projections/snap-matching.d.ts +1 -2
  395. package/dist/domain/projections/snap-utils.d.ts +1 -2
  396. package/dist/domain/projections/validation-projections.d.ts +1 -2
  397. package/dist/domain/projections/validation-projections.js +1 -1
  398. package/dist/domain/system-components/admin-sidebar.d.ts +1 -1
  399. package/dist/domain/system-components/admin-sidebar.js +1 -1
  400. package/dist/domain/system-components/angle-dimension.js +1 -1
  401. package/dist/domain/system-components/application-config.d.ts +1 -1
  402. package/dist/domain/system-components/application-config.js +1 -1
  403. package/dist/domain/system-components/attribute-selection.js +1 -1
  404. package/dist/domain/system-components/bounding-box-component.d.ts +1 -1
  405. package/dist/domain/system-components/bounding-box-component.js +1 -1
  406. package/dist/domain/system-components/bounding-sphere-component.d.ts +1 -1
  407. package/dist/domain/system-components/bounding-sphere-component.js +1 -1
  408. package/dist/domain/system-components/child-entity-recipes.d.ts +1 -1
  409. package/dist/domain/system-components/child-entity-recipes.js +1 -1
  410. package/dist/domain/system-components/child-entity-selection.d.ts +1 -2
  411. package/dist/domain/system-components/child-entity-selection.js +1 -1
  412. package/dist/domain/system-components/collision-box-geometry.d.ts +1 -1
  413. package/dist/domain/system-components/collision-box-geometry.js +1 -1
  414. package/dist/domain/system-components/collision-geometries.d.ts +1 -1
  415. package/dist/domain/system-components/collision-geometry.d.ts +1 -1
  416. package/dist/domain/system-components/collision-geometry.js +1 -1
  417. package/dist/domain/system-components/collision-point-geometry.d.ts +1 -1
  418. package/dist/domain/system-components/collision-point-geometry.js +1 -1
  419. package/dist/domain/system-components/common/index.d.ts +0 -4
  420. package/dist/domain/system-components/common/index.js +1 -1
  421. package/dist/domain/system-components/common/recipes.d.ts +1 -2
  422. package/dist/domain/system-components/constraint.d.ts +1 -1
  423. package/dist/domain/system-components/constraint.js +1 -1
  424. package/dist/domain/system-components/create-blueprint.d.ts +1 -1
  425. package/dist/domain/system-components/custom-scene-entity.d.ts +1 -1
  426. package/dist/domain/system-components/custom-scene-entity.js +1 -1
  427. package/dist/domain/system-components/detail.js +1 -1
  428. package/dist/domain/system-components/distance-dimension-select.d.ts +1 -1
  429. package/dist/domain/system-components/distance-dimension-select.js +1 -1
  430. package/dist/domain/system-components/distance-dimension.d.ts +1 -1
  431. package/dist/domain/system-components/distance-dimension.js +1 -1
  432. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  433. package/dist/domain/system-components/drag-handle.js +1 -1
  434. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  435. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  436. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  437. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  438. package/dist/domain/system-components/generic-dimension.d.ts +1 -1
  439. package/dist/domain/system-components/generic-dimension.js +1 -1
  440. package/dist/domain/system-components/hidden-entity.js +1 -1
  441. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -2
  442. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  443. package/dist/domain/system-components/index.d.ts +0 -68
  444. package/dist/domain/system-components/index.js +1 -1
  445. package/dist/domain/system-components/material-override-property-transition.js +1 -1
  446. package/dist/domain/system-components/material-override-transformer.js +1 -1
  447. package/dist/domain/system-components/material-swatch.js +1 -1
  448. package/dist/domain/system-components/navigation-page.js +1 -1
  449. package/dist/domain/system-components/navigation-panel-list.js +1 -1
  450. package/dist/domain/system-components/pivot-point.d.ts +1 -1
  451. package/dist/domain/system-components/pivot-point.js +1 -1
  452. package/dist/domain/system-components/price.js +1 -1
  453. package/dist/domain/system-components/projected-entities.d.ts +1 -1
  454. package/dist/domain/system-components/projected-entities.js +1 -1
  455. package/dist/domain/system-components/replace-entity-recipes.d.ts +1 -1
  456. package/dist/domain/system-components/replace-entity-recipes.js +1 -1
  457. package/dist/domain/system-components/scene-entity-ambient-light.js +1 -1
  458. package/dist/domain/system-components/scene-entity-box-object.js +1 -1
  459. package/dist/domain/system-components/scene-entity-directional-light.js +1 -1
  460. package/dist/domain/system-components/scene-entity-local-material-override.js +1 -1
  461. package/dist/domain/system-components/scene-entity-material-override.js +1 -1
  462. package/dist/domain/system-components/scene-entity-object-clip.js +1 -1
  463. package/dist/domain/system-components/scene-entity-object-decal.js +1 -1
  464. package/dist/domain/system-components/scene-entity-object-group.js +1 -1
  465. package/dist/domain/system-components/scene-entity-object-local-material-override.js +1 -1
  466. package/dist/domain/system-components/scene-entity-object-material-override.js +1 -1
  467. package/dist/domain/system-components/scene-entity-object-properties.js +1 -1
  468. package/dist/domain/system-components/scene-entity-object-remote-material-override.js +1 -1
  469. package/dist/domain/system-components/scene-entity-object-text-decal.js +1 -1
  470. package/dist/domain/system-components/scene-entity-object-transformer.js +1 -1
  471. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.js +1 -1
  472. package/dist/domain/system-components/scene-entity-object.js +1 -1
  473. package/dist/domain/system-components/scene-entity-point-light.js +1 -1
  474. package/dist/domain/system-components/scene-entity-properties.js +1 -1
  475. package/dist/domain/system-components/scene-entity-rect-area-light.js +1 -1
  476. package/dist/domain/system-components/scene-entity-remote-material-override.js +1 -1
  477. package/dist/domain/system-components/scene-entity-remote-object.js +1 -1
  478. package/dist/domain/system-components/scene-entity-spot-light.js +1 -1
  479. package/dist/domain/system-components/scene-entity-transimissive-material-override.js +1 -1
  480. package/dist/domain/system-components/sketching-line.d.ts +1 -1
  481. package/dist/domain/system-components/sketching-line.js +1 -1
  482. package/dist/domain/system-components/sketching-rectangle.d.ts +1 -1
  483. package/dist/domain/system-components/sketching-rectangle.js +1 -1
  484. package/dist/domain/system-components/sketching.d.ts +1 -1
  485. package/dist/domain/system-components/sketching.js +1 -1
  486. package/dist/domain/system-components/snap-axis.d.ts +1 -1
  487. package/dist/domain/system-components/snap-axis.js +1 -1
  488. package/dist/domain/system-components/snap-edge.d.ts +1 -1
  489. package/dist/domain/system-components/snap-edge.js +1 -1
  490. package/dist/domain/system-components/snap-plane.d.ts +1 -1
  491. package/dist/domain/system-components/snap-plane.js +1 -1
  492. package/dist/domain/system-components/snap-point.d.ts +1 -1
  493. package/dist/domain/system-components/snap-point.js +1 -1
  494. package/dist/domain/system-components/static-orthographic-camera-component.d.ts +1 -1
  495. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  496. package/dist/domain/system-components/static-perspective-camera-component.d.ts +1 -1
  497. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  498. package/dist/domain/utils/eval-cache.d.ts +1 -2
  499. package/dist/domain/utils/memo-eval.d.ts +1 -3
  500. package/dist/editor/domain-editors/use-implementation-files.d.ts +7 -6
  501. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  502. package/dist/i18n/locales/cs/messages.js +1 -1
  503. package/dist/i18n/locales/da/messages.js +1 -1
  504. package/dist/i18n/locales/de/messages.js +1 -1
  505. package/dist/i18n/locales/de-AT/messages.js +1 -1
  506. package/dist/i18n/locales/en/messages.js +1 -1
  507. package/dist/i18n/locales/en-AU/messages.js +1 -1
  508. package/dist/i18n/locales/en-GB/messages.js +1 -1
  509. package/dist/i18n/locales/es/messages.js +1 -1
  510. package/dist/i18n/locales/fr/messages.js +1 -1
  511. package/dist/i18n/locales/hu/messages.js +1 -1
  512. package/dist/i18n/locales/it/messages.js +1 -1
  513. package/dist/i18n/locales/nl/messages.js +1 -1
  514. package/dist/i18n/locales/pl/messages.js +1 -1
  515. package/dist/i18n/locales/pt/messages.js +1 -1
  516. package/dist/i18n/locales/ro/messages.js +1 -1
  517. package/dist/i18n/locales/sk/messages.js +1 -1
  518. package/dist/i18n/locales/tr/messages.js +1 -1
  519. package/dist/legacy/domain-cli/gen/configurator-builder.js +21 -8
  520. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  521. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  522. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  523. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  524. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  525. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  526. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  527. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  528. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  529. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  530. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  531. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  532. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  533. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  534. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  535. package/dist/phoenix/scripts/build-admin.js +1 -1
  536. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  537. package/dist/phoenix/services/variant-file-session.js +1 -1
  538. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  539. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  540. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  541. package/dist/ui-sdk/theme/types.d.ts +1 -1
  542. package/dist/webhook/builders/common.d.ts +3 -0
  543. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  544. package/dist/webhook/builders/webhook-builder.js +1 -1
  545. package/package.json +3 -3
  546. package/dist/application-spec/assistant/generate-assistant-prompt.d.ts +0 -13
  547. package/dist/application-spec/assistant/generate-assistant-prompt.js +0 -1
  548. package/dist/application-spec/assistant/index.d.ts +0 -1
  549. package/dist/application-spec/assistant/index.js +0 -1
  550. package/dist/domain/actions/prepare-action-implementations.js +0 -5
  551. package/dist/domain/components/debug-state-component.js +0 -1
  552. package/dist/domain/components/domain-component-optic.js +0 -16
  553. package/dist/domain/components/drag-state-component.js +0 -1
  554. package/dist/domain/components/export-state-component.js +0 -1
  555. package/dist/domain/components/fullscreen-state-component.js +0 -1
  556. package/dist/domain/components/group-components-by-entity-id-and-name.js +0 -1
  557. package/dist/domain/components/hover-state-component.js +0 -1
  558. package/dist/domain/components/index.d.ts +0 -2
  559. package/dist/domain/components/index.js +0 -1
  560. package/dist/domain/components/navigation-state-component.js +0 -1
  561. package/dist/domain/components/selection-state-component.js +0 -1
  562. package/dist/domain/components/system-component-builder.js +0 -1
  563. package/dist/domain/components/system-virtual-entity.js +0 -1
  564. package/dist/domain/components/tool-state-component.js +0 -1
  565. package/dist/domain/components/view-state-component.js +0 -1
  566. package/dist/domain/components/viewport-state-component.js +0 -1
  567. package/dist/domain/core/json-schema.js +0 -1
  568. package/dist/domain/core/reflection.js +0 -1
  569. package/dist/domain/domain-context/recipe-system/recipes.js +0 -1
  570. package/dist/domain/expressions/constant-expressions.js +0 -1
  571. package/dist/domain/expressions/custom-expression.js +0 -1
  572. package/dist/domain/expressions/index.d.ts +0 -1
  573. package/dist/domain/expressions/index.js +0 -1
  574. package/dist/domain/invariants/custom-invariants.js +0 -1
  575. package/dist/domain/invariants/invariants.js +0 -1
  576. package/dist/domain/invariants/violation-component.js +0 -1
  577. package/dist/domain/relations/all-of-type-relation.js +0 -1
  578. package/dist/domain/relations/component-factories.js +0 -1
  579. package/dist/domain/relations/composed-of.js +0 -1
  580. package/dist/domain/relations/indirect-relation.js +0 -1
  581. package/dist/domain/relations/reference-component.js +0 -1
  582. package/dist/domain/system-components/angle-indicator.js +0 -1
  583. package/dist/domain/system-components/attribute-switch.js +0 -1
  584. package/dist/domain/system-components/autorotate-camera-component.js +0 -1
  585. package/dist/domain/system-components/basic-sidebar-footer.js +0 -1
  586. package/dist/domain/system-components/camera-based-hidden-entity-object.js +0 -1
  587. package/dist/domain/system-components/camera-based-hidden-entity.js +0 -1
  588. package/dist/domain/system-components/canvas-config.js +0 -1
  589. package/dist/domain/system-components/canvas-custom-environment.js +0 -1
  590. package/dist/domain/system-components/canvas-padding.js +0 -1
  591. package/dist/domain/system-components/canvas-preset-environment.js +0 -1
  592. package/dist/domain/system-components/child-entity-recipe-hierarchy.js +0 -1
  593. package/dist/domain/system-components/client-side-image.js +0 -1
  594. package/dist/domain/system-components/color-value.js +0 -1
  595. package/dist/domain/system-components/common/angle-indicator-schema.js +0 -1
  596. package/dist/domain/system-components/common/dimension-indicator-schema.js +0 -1
  597. package/dist/domain/system-components/custom-price-footer.js +0 -1
  598. package/dist/domain/system-components/dimension-indicator.js +0 -1
  599. package/dist/domain/system-components/editable-angle-indicator.js +0 -1
  600. package/dist/domain/system-components/editable-distance-dimension-indicator.js +0 -1
  601. package/dist/domain/system-components/editable-offset-indicator.js +0 -1
  602. package/dist/domain/system-components/editable-size-indicator.js +0 -1
  603. package/dist/domain/system-components/entity-header.js +0 -1
  604. package/dist/domain/system-components/exit-tool-mode-fab.js +0 -1
  605. package/dist/domain/system-components/finalize-action.js +0 -1
  606. package/dist/domain/system-components/finalize-component.js +0 -1
  607. package/dist/domain/system-components/fit-selection-orthographic-camera-component.js +0 -1
  608. package/dist/domain/system-components/fit-selection-perspective-camera-component.js +0 -1
  609. package/dist/domain/system-components/fixed-header.js +0 -1
  610. package/dist/domain/system-components/floating-header.js +0 -1
  611. package/dist/domain/system-components/hidden-header.js +0 -1
  612. package/dist/domain/system-components/hidden-sidebar-footer.js +0 -1
  613. package/dist/domain/system-components/horizontal-tabs.js +0 -1
  614. package/dist/domain/system-components/list-selector-dimension-indicator.js +0 -1
  615. package/dist/domain/system-components/multilingual-text-value.js +0 -1
  616. package/dist/domain/system-components/navigation-steps.js +0 -1
  617. package/dist/domain/system-components/offset-anchors.js +0 -1
  618. package/dist/domain/system-components/offset-indicator.js +0 -1
  619. package/dist/domain/system-components/offset.js +0 -1
  620. package/dist/domain/system-components/other-action.js +0 -1
  621. package/dist/domain/system-components/property-page.js +0 -1
  622. package/dist/domain/system-components/read-sidebar-footer.js +0 -1
  623. package/dist/domain/system-components/replace-entity-recipe-hierarchy.js +0 -1
  624. package/dist/domain/system-components/rotatable.js +0 -1
  625. package/dist/domain/system-components/rotation-handle.js +0 -1
  626. package/dist/domain/system-components/save-template-thumbnail.js +0 -1
  627. package/dist/domain/system-components/scene-entity-add-fab.js +0 -1
  628. package/dist/domain/system-components/scene-entity-animation.js +0 -1
  629. package/dist/domain/system-components/scene-entity-control.js +0 -1
  630. package/dist/domain/system-components/scene-entity-delete-fab.js +0 -1
  631. package/dist/domain/system-components/scene-entity-floor-object.js +0 -1
  632. package/dist/domain/system-components/scene-entity-html-hotspot.js +0 -1
  633. package/dist/domain/system-components/scene-entity-navigation-hotspot.js +0 -1
  634. package/dist/domain/system-components/scene-entity-object-html-hotspot.js +0 -1
  635. package/dist/domain/system-components/scene-entity-select-hotspot.js +0 -1
  636. package/dist/domain/system-components/scene-entity-wall-object.js +0 -1
  637. package/dist/domain/system-components/selectable-component.js +0 -1
  638. package/dist/domain/system-components/sidebar-tabs.js +0 -1
  639. package/dist/domain/system-components/simple-summary.js +0 -1
  640. package/dist/domain/system-components/size.js +0 -1
  641. package/dist/domain/system-components/sketching-draw.js +0 -1
  642. package/dist/domain/system-components/sketching-edit.js +0 -1
  643. package/dist/domain/system-components/summary-component.js +0 -1
  644. package/dist/domain/system-components/text-value.js +0 -1
  645. package/dist/domain/system-components/tool-controls.js +0 -1
  646. package/dist/domain/system-components/tool-menu-fab.js +0 -1
  647. package/dist/domain/system-components/universal-sidebar-footer.js +0 -1
  648. package/dist/domain/system-components/view-controls.js +0 -1
  649. /package/dist/domain/{actions → core/action}/action-factory.js +0 -0
  650. /package/dist/domain/core/{action.js → action/action.js} +0 -0
  651. /package/dist/domain/{components → core/component}/component-reader-types.js +0 -0
  652. /package/dist/domain/{components → core/component}/legacy-filter.js +0 -0
  653. /package/dist/domain/{components → core/component}/system-component-filter.js +0 -0
  654. /package/dist/domain/{components → core/component}/system-virtual-entity.d.ts +0 -0
  655. /package/dist/domain/{components → core/component}/updates.js +0 -0
  656. /package/dist/domain/core/{enhanced-json-schema.js → decoder/decoder.js} +0 -0
  657. /package/dist/domain/core/{expression.js → expression/aliased-expressions.js} +0 -0
  658. /package/dist/domain/core/{schema-validator.js → expression/expression.js} +0 -0
  659. /package/dist/domain/{invariants → core/invariant}/builtin-invariant.js +0 -0
  660. /package/dist/domain/{invariants → core/invariant}/violation-component.d.ts +0 -0
  661. /package/dist/domain/{invariants → core/invariant}/violation.js +0 -0
  662. /package/dist/domain/core/{alias.d.ts → model/alias.d.ts} +0 -0
  663. /package/dist/domain/core/{alias.js → model/alias.js} +0 -0
  664. /package/dist/domain/core/{common-definitions.d.ts → model/common-definitions.d.ts} +0 -0
  665. /package/dist/domain/core/{common-definitions.js → model/common-definitions.js} +0 -0
  666. /package/dist/domain/core/{component.js → model/component.js} +0 -0
  667. /package/dist/domain/core/{model.d.ts → model/model.d.ts} +0 -0
  668. /package/dist/domain/core/{model.js → model/model.js} +0 -0
  669. /package/dist/domain/core/{preset.d.ts → model/preset.d.ts} +0 -0
  670. /package/dist/domain/core/{preset.js → model/preset.js} +0 -0
  671. /package/dist/domain/{relations → core/relation}/direct-relation.js +0 -0
  672. /package/dist/domain/{relations → core/relation}/reference-field.js +0 -0
  673. /package/dist/domain/{relations → core/relation}/relation-factory.js +0 -0
  674. /package/dist/domain/{relations → core/relation}/relation-implementation.js +0 -0
  675. /package/dist/domain/core/{schema-validator-ajv.d.ts → schema/create-ajv-schema-validator.d.ts} +0 -0
  676. /package/dist/domain/core/{schema-validator-ajv.js → schema/create-ajv-schema-validator.js} +0 -0
  677. /package/dist/domain/core/{schema-validator-csp.d.ts → schema/create-csp-schema-validator.d.ts} +0 -0
  678. /package/dist/domain/core/{schema-validator-csp.js → schema/create-csp-schema-validator.js} +0 -0
  679. /package/dist/domain/core/{enhanced-json-schema.d.ts → schema/enhanced-json-schema.d.ts} +0 -0
  680. /package/dist/domain/core/{json-schema.d.ts → schema/extended-schema-validator.d.ts} +0 -0
  681. /package/dist/domain/core/{schema-validator.d.ts → schema/schema-validator.d.ts} +0 -0
  682. /package/dist/domain/core/{migrations.js → state/migrations.js} +0 -0
  683. /package/dist/domain/core/{state.js → state/state.js} +0 -0
  684. /package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.js +0 -0
  685. /package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.js +0 -0
  686. /package/dist/domain/{system-components → extensions}/attribute-switch.d.ts +0 -0
  687. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity-object.d.ts +0 -0
  688. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity.d.ts +0 -0
  689. /package/dist/domain/{system-components → extensions}/canvas-custom-environment.d.ts +0 -0
  690. /package/dist/domain/{system-components → extensions}/client-side-image.d.ts +0 -0
  691. /package/dist/domain/{system-components → extensions}/color-value.d.ts +0 -0
  692. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.d.ts +0 -0
  693. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.js +0 -0
  694. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.d.ts +0 -0
  695. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.js +0 -0
  696. /package/dist/domain/{system-components → extensions}/custom-price-footer.d.ts +0 -0
  697. /package/dist/domain/{system-components → extensions}/finalize-component.d.ts +0 -0
  698. /package/dist/domain/{system-components → extensions}/fit-selection-orthographic-camera-component.d.ts +0 -0
  699. /package/dist/domain/{system-components → extensions}/fit-selection-perspective-camera-component.d.ts +0 -0
  700. /package/dist/domain/{system-components → extensions}/multilingual-text-value.d.ts +0 -0
  701. /package/dist/domain/{system-components → extensions}/navigation-steps.d.ts +0 -0
  702. /package/dist/domain/{system-components → extensions}/rotatable.d.ts +0 -0
  703. /package/dist/domain/{system-components → extensions}/rotation-handle.d.ts +0 -0
  704. /package/dist/domain/{system-components → extensions}/save-template-thumbnail.d.ts +0 -0
  705. /package/dist/domain/{system-components → extensions}/scene-entity-animation.d.ts +0 -0
  706. /package/dist/domain/{system-components → extensions}/scene-entity-control.d.ts +0 -0
  707. /package/dist/domain/{system-components → extensions}/scene-entity-floor-object.d.ts +0 -0
  708. /package/dist/domain/{system-components → extensions}/scene-entity-wall-object.d.ts +0 -0
  709. /package/dist/domain/{system-components → extensions}/selectable-component.d.ts +0 -0
  710. /package/dist/domain/{system-components → extensions}/simple-summary.d.ts +0 -0
  711. /package/dist/domain/{system-components → extensions}/summary-component.d.ts +0 -0
  712. /package/dist/domain/{system-components → extensions}/text-value.d.ts +0 -0
  713. /package/dist/domain/{system-components → extensions}/tool-controls.d.ts +0 -0
  714. /package/dist/domain/{system-components → extensions}/view-controls.d.ts +0 -0
@@ -1,7 +1,5 @@
1
- import { type DomainEntityCreation, type DomainEntityReplacement, type StateUpdate } from '../../components/updates.js';
2
- import { type DomainEntity, type DomainEntityId, type DomainState } from '../../core/index.js';
1
+ import { type DomainEntity, type DomainEntityCreation, type DomainEntityId, type DomainEntityReplacement, type DomainState, type EntityRecipe, type StateUpdate } from '../../core/index.js';
3
2
  import type { DomainContextSelectors } from '../../domain-runtime/domain-context/index.js';
4
- import type { EntityRecipe } from './recipes.js';
5
3
  export declare const CreateRecipeUpdateTag = "createRecipe";
6
4
  export type IsCreateRecipeUpdate<ENTITIES extends DomainEntity<string>> = <TYPE extends ENTITIES['type']>(update: StateUpdate<ENTITIES, ENTITIES>, types: readonly TYPE[]) => update is DomainEntityCreation<Extract<ENTITIES, {
7
5
  type: TYPE;
@@ -1 +1 @@
1
- import{systemUpdateFactory as e}from"../../components/updates.js";import{domainEntityTypeFromId as t,isDomainEntityId as n}from"../../core/index.js";import{composedOfComponent as i}from"../../relations/composed-of.js";import{referenceComponent as o}from"../../relations/reference-component.js";import{getIdSequence as a}from"../store-system/next-domain-entity-id.js";export const CreateRecipeUpdateTag="createRecipe";export const isCreateEntityUpdate=(e,n)=>"createDomainEntity"===e.kind&&e.updateTag===CreateRecipeUpdateTag&&n.includes(t(e.entityId));export const ReplaceRecipeUpdateTag="replaceRecipe";export const isReplaceEntityUpdate=(e,i)=>"replaceDomainEntity"===e.kind&&e.updateTag===ReplaceRecipeUpdateTag&&n(e.entityId)&&i.includes(t(e.entityId));export class RecipeCookerSystem{_context;constructor(e){this._context=e}_getFragmentComponents=(e,t)=>this._context.selectors.getComponentReader().readManyComponents({componentTypes:[t]},{rootEntityId:"Root-1",rootEntityType:"Root",entities:e,ephemeralRecords:[]});cookRecipes=(e,n)=>{let p=new Map,r=a(n.entities,[]);for(let t of e){let e=r.nextId(t.type);p.set(t.id,e)}let c=this._getFragmentComponents(e,o),s=e.map(e=>{let n={...e,id:p.get(e.id)};return c.filter(t=>t.componentInstance.entityId===e.id).reduce((n,i)=>{let o=this._context.selectors.getComponentReaderIndexes().opticMap.get(t(e.id))?.get(i.componentInstance.componentType)?.get(i.componentInstance.instanceName);if(o?.kind!=="simple")throw Error("References can only be simple optics!");return{...n,...o?.write({referencedEntityIds:i.state.referencedEntityIds.map(t=>t===e.id?t:p.get(t)??t)})}},n)}),d=this._getFragmentComponents(s,i);return s.map(e=>{let t=d.find(t=>t.state.childEntityIds.includes(e.id));return{entity:e,parentId:t?.componentInstance.entityId}})};prepareCreateUpdates=(t,n,i,o)=>this.cookRecipes(t,n).map(t=>t.parentId?e.DomainEntityCreation({entity:t.entity,collection:void 0,updateTag:CreateRecipeUpdateTag,parentId:t.parentId}):e.DomainEntityCreation({entity:t.entity,collection:o,updateTag:CreateRecipeUpdateTag,parentId:i}));prepareReplaceUpdates=(t,n,i,o)=>{let a=this.cookRecipes(t,n),p=a.filter(e=>!e.parentId);if(!p[0]||p.length>1)throw Error("Can not prepare ReplaceEntityRecipes, root entity not found in the cooked recipes. Please, make sure that defined recipes have always a single root entity.");return a.map(t=>t.parentId?e.DomainEntityCreation({entity:t.entity,collection:void 0,updateTag:ReplaceRecipeUpdateTag,parentId:t.parentId}):e.DomainEntityReplacement({entityId:i,replacementEntity:t.entity,updateTag:ReplaceRecipeUpdateTag,keepChildren:o??!1}))}}
1
+ import{composedOfComponent as e,domainEntityTypeFromId as t,isDomainEntityId as n,referenceComponent as i,systemUpdateFactory as a}from"../../core/index.js";import{getIdSequence as o}from"../store-system/next-domain-entity-id.js";export const CreateRecipeUpdateTag="createRecipe";export const isCreateEntityUpdate=(e,n)=>"createDomainEntity"===e.kind&&e.updateTag===CreateRecipeUpdateTag&&n.includes(t(e.entityId));export const ReplaceRecipeUpdateTag="replaceRecipe";export const isReplaceEntityUpdate=(e,i)=>"replaceDomainEntity"===e.kind&&e.updateTag===ReplaceRecipeUpdateTag&&n(e.entityId)&&i.includes(t(e.entityId));export class RecipeCookerSystem{_context;constructor(e){this._context=e}_getFragmentComponents=(e,t)=>this._context.selectors.getComponentReader().readManyComponents({componentTypes:[t]},{rootEntityId:"Root-1",rootEntityType:"Root",entities:e,ephemeralRecords:[]});cookRecipes=(n,a)=>{let p=new Map,r=o(a.entities,[]);for(let e of n){let t=r.nextId(e.type);p.set(e.id,t)}let c=this._getFragmentComponents(n,i),d=n.map(e=>{let n={...e,id:p.get(e.id)};return c.filter(t=>t.componentInstance.entityId===e.id).reduce((n,i)=>{let a=this._context.selectors.getComponentReaderIndexes().opticMap.get(t(e.id))?.get(i.componentInstance.componentType)?.get(i.componentInstance.instanceName);if(a?.kind!=="simple")throw Error("References can only be simple optics!");return{...n,...a?.write({referencedEntityIds:i.state.referencedEntityIds.map(t=>t===e.id?t:p.get(t)??t)})}},n)}),s=this._getFragmentComponents(d,e);return d.map(e=>{let t=s.find(t=>t.state.childEntityIds.includes(e.id));return{entity:e,parentId:t?.componentInstance.entityId}})};prepareCreateUpdates=(e,t,n,i)=>this.cookRecipes(e,t).map(e=>e.parentId?a.DomainEntityCreation({entity:e.entity,collection:void 0,updateTag:CreateRecipeUpdateTag,parentId:e.parentId}):a.DomainEntityCreation({entity:e.entity,collection:i,updateTag:CreateRecipeUpdateTag,parentId:n}));prepareReplaceUpdates=(e,t,n,i)=>{let o=this.cookRecipes(e,t),p=o.filter(e=>!e.parentId);if(!p[0]||p.length>1)throw Error("Can not prepare ReplaceEntityRecipes, root entity not found in the cooked recipes. Please, make sure that defined recipes have always a single root entity.");return o.map(e=>e.parentId?a.DomainEntityCreation({entity:e.entity,collection:void 0,updateTag:ReplaceRecipeUpdateTag,parentId:e.parentId}):a.DomainEntityReplacement({entityId:n,replacementEntity:e.entity,updateTag:ReplaceRecipeUpdateTag,keepChildren:i??!1}))}}
@@ -1,4 +1,4 @@
1
- import { type DomainEntity } from '../../core/model.js';
1
+ import { type DomainEntity } from '../../core/index.js';
2
2
  import type { CompositionProjections } from '../../projections/composition-projections.js';
3
3
  import type { IncrementalUpdateTransformer } from '../store-system/store-system.js';
4
4
  /**
@@ -1 +1 @@
1
- import{systemUpdateFactory as e}from"../../components/updates.js";import{isVirtualEntityId as t}from"../../core/model.js";let n=e=>"deleteEntity"===e.kind||"replaceDomainEntity"===e.kind&&!e.keepChildren;export const createCascadeDeletesTransformer=i=>(o,r,d,l,a=[])=>{let s=o.filter(n);if(0===s.length)return o;let{map:f}=i.getTree(r),p=[],c=new Set([...s,...a.filter(n)].map(e=>e.entityId));for(let n of s){if(t(n.entityId))continue;let i=f.get(n.entityId);if(i)for(let t of i.descendants())c.has(t.id)||(p.push(e.EntityDeletion({entityId:t.id,updateTag:"composition.cascadeDelete"})),c.add(t.id))}return p.length>0?[...o,...p]:o};
1
+ import{isVirtualEntityId as e,systemUpdateFactory as t}from"../../core/index.js";let i=e=>"deleteEntity"===e.kind||"replaceDomainEntity"===e.kind&&!e.keepChildren;export const createCascadeDeletesTransformer=n=>(d,r,l,o,a=[])=>{let f=d.filter(i);if(0===f.length)return d;let{map:s}=n.getTree(r),c=[],p=new Set([...f,...a.filter(i)].map(e=>e.entityId));for(let i of f){if(e(i.entityId))continue;let n=s.get(i.entityId);if(n)for(let e of n.descendants())p.has(e.id)||(c.push(t.EntityDeletion({entityId:e.id,updateTag:"composition.cascadeDelete"})),p.add(e.id))}return c.length>0?[...d,...c]:d};
@@ -1,4 +1,4 @@
1
- import type { DomainEntity } from '../../core/model.js';
1
+ import { type DomainEntity } from '../../core/index.js';
2
2
  import type { ComponentReader } from '../../domain-runtime/domain-context/index.js';
3
3
  import type { IncrementalUpdateTransformer } from '../store-system/store-system.js';
4
4
  /**
@@ -1 +1 @@
1
- import{isNonNullish as e}from"@salsita-ai/common/utils";import{systemUpdateFactory as t}from"../../components/updates.js";import{referenceComponent as n}from"../../relations/reference-component.js";export const createCascadeRefPruningTransformer=r=>(i,o,a,s,c=[])=>{let m=new Set([...i,...c].filter(e=>"deleteEntity"===e.kind).map(e=>e.entityId));if(0===m.size)return i;let d=new Set([...i,...c].filter(e=>"deleteEntity"===e.kind||"replaceDomainEntity"===e.kind).map(e=>e.entityId)),p=r.readManyComponents({componentTypes:[n]},o).map(e=>{if(d.has(e.componentInstance.entityId))return;let n=e.state.referencedEntityIds.filter(e=>!m.has(e));if(n.length<e.state.referencedEntityIds.length)return t.ComponentModification({componentInstance:e.componentInstance,updateTag:"refs.cascadePruning",writableState:{referencedEntityIds:n}})}).filter(e);return p.length>0?[...i,...p]:i};
1
+ import{isNonNullish as e}from"@salsita-ai/common/utils";import{referenceComponent as t,systemUpdateFactory as n}from"../../core/index.js";export const createCascadeRefPruningTransformer=r=>(i,a,o,s,d=[])=>{let c=new Set([...i,...d].filter(e=>"deleteEntity"===e.kind).map(e=>e.entityId));if(0===c.size)return i;let m=new Set([...i,...d].filter(e=>"deleteEntity"===e.kind||"replaceDomainEntity"===e.kind).map(e=>e.entityId)),f=r.readManyComponents({componentTypes:[t]},a).map(e=>{if(m.has(e.componentInstance.entityId))return;let t=e.state.referencedEntityIds.filter(e=>!c.has(e));if(t.length<e.state.referencedEntityIds.length)return n.ComponentModification({componentInstance:e.componentInstance,updateTag:"refs.cascadePruning",writableState:{referencedEntityIds:t}})}).filter(e);return f.length>0?[...i,...f]:i};
@@ -1,4 +1,4 @@
1
- import type { DomainEntity } from '../../core/model.js';
1
+ import { type DomainEntity } from '../../core/index.js';
2
2
  import type { ComponentReader } from '../../domain-runtime/domain-context/index.js';
3
3
  import type { IncrementalUpdateTransformer } from '../store-system/store-system.js';
4
4
  /**
@@ -1,2 +1,2 @@
1
- import{systemUpdateFactory as e}from"../../components/updates.js";import{referenceComponent as t}from"../../relations/reference-component.js";export const createCreateEntityRefsTransformer=n=>(o,r)=>{let i=o.filter(e=>"createDomainEntity"===e.kind);if(0===i.length)return o;let a=i.flatMap(o=>{if(void 0===o.collection)return[];let i=n.readManyComponents({componentTypes:[t],entityIds:[o.parentId],instanceNames:[o.collection]},r);if(0===i.length)throw Error(`Newly created entity ${o.entityId} should be added to collection ${o.collection} on parent entity ${o.parentId}, but no such collection can be found.
2
- Check whether the collection name is correctly specified in the createDomainEntity update.`);return i.map(t=>e.ComponentModification({componentInstance:t.componentInstance,updateTag:"refs.update",writableState:{referencedEntityIds:t.state.referencedEntityIds.concat(o.entityId)}}))}).reduce((t,n)=>{let o=t[n.entityId.toString()];if(o){let r=e.ComponentModification({componentInstance:o.componentInstance,updateTag:o.updateTag,writableState:{referencedEntityIds:Array.from(new Set([...o.writableState.referencedEntityIds,...n.writableState.referencedEntityIds]))}});t[n.entityId.toString()]=r}else t[n.entityId.toString()]=n;return t},{});return o.concat(Object.values(a))};
1
+ import{referenceComponent as e,systemUpdateFactory as t}from"../../core/index.js";export const createCreateEntityRefsTransformer=n=>(r,o)=>{let i=r.filter(e=>"createDomainEntity"===e.kind);if(0===i.length)return r;let a=i.flatMap(r=>{if(void 0===r.collection)return[];let i=n.readManyComponents({componentTypes:[e],entityIds:[r.parentId],instanceNames:[r.collection]},o);if(0===i.length)throw Error(`Newly created entity ${r.entityId} should be added to collection ${r.collection} on parent entity ${r.parentId}, but no such collection can be found.
2
+ Check whether the collection name is correctly specified in the createDomainEntity update.`);return i.map(e=>t.ComponentModification({componentInstance:e.componentInstance,updateTag:"refs.update",writableState:{referencedEntityIds:e.state.referencedEntityIds.concat(r.entityId)}}))}).reduce((e,n)=>{let r=e[n.entityId.toString()];if(r){let o=t.ComponentModification({componentInstance:r.componentInstance,updateTag:r.updateTag,writableState:{referencedEntityIds:Array.from(new Set([...r.writableState.referencedEntityIds,...n.writableState.referencedEntityIds]))}});e[n.entityId.toString()]=o}else e[n.entityId.toString()]=n;return e},{});return r.concat(Object.values(a))};
@@ -1,4 +1,4 @@
1
- import type { DomainEntity } from '../../core/model.js';
1
+ import { type DomainEntity } from '../../core/index.js';
2
2
  import type { ComponentReader } from '../../domain-runtime/domain-context/index.js';
3
3
  import type { IncrementalUpdateTransformer } from '../store-system/store-system.js';
4
4
  /**
@@ -1 +1 @@
1
- import{isNonNullish as e}from"@salsita-ai/common/utils";import{systemUpdateFactory as t}from"../../components/updates.js";import{referenceComponent as n}from"../../relations/reference-component.js";export const createRefReplaceTransformer=o=>(i,r,a,p,c=[])=>{let m=new Map(i.filter(e=>"replaceDomainEntity"===e.kind).map(e=>[e.entityId,e.replacementEntity.id]));if(0===m.size)return i;let s=new Set([...i,...c].filter(e=>"deleteEntity"===e.kind||"replaceDomainEntity"===e.kind).map(e=>e.entityId)),d=o.readManyComponents({componentTypes:[n]},r).map(e=>{if(s.has(e.componentInstance.entityId)&&!m.has(e.componentInstance.entityId))return;let n=!1,o=e.state.referencedEntityIds.map(e=>{let t=m.get(e);return void 0!==t?(n=!0,t):e});if(n)return t.ComponentModification({componentInstance:{...e.componentInstance,entityId:m.get(e.componentInstance.entityId)??e.componentInstance.entityId},updateTag:"refs.replace",writableState:{referencedEntityIds:o}})}).filter(e);return d.length>0?[...i,...d]:i};
1
+ import{isNonNullish as e}from"@salsita-ai/common/utils";import{referenceComponent as t,systemUpdateFactory as n}from"../../core/index.js";export const createRefReplaceTransformer=i=>(r,a,o,c,p=[])=>{let m=new Map(r.filter(e=>"replaceDomainEntity"===e.kind).map(e=>[e.entityId,e.replacementEntity.id]));if(0===m.size)return r;let d=new Set([...r,...p].filter(e=>"deleteEntity"===e.kind||"replaceDomainEntity"===e.kind).map(e=>e.entityId)),s=i.readManyComponents({componentTypes:[t]},a).map(e=>{if(d.has(e.componentInstance.entityId)&&!m.has(e.componentInstance.entityId))return;let t=!1,i=e.state.referencedEntityIds.map(e=>{let n=m.get(e);return void 0!==n?(t=!0,n):e});if(t)return n.ComponentModification({componentInstance:{...e.componentInstance,entityId:m.get(e.componentInstance.entityId)??e.componentInstance.entityId},updateTag:"refs.replace",writableState:{referencedEntityIds:i}})}).filter(e);return s.length>0?[...r,...s]:r};
@@ -1,4 +1,2 @@
1
- import type { DataUpdate } from '../../components/updates.js';
2
- import type { DomainEntity } from '../../core/model.js';
3
- import type { DomainState } from '../../core/state.js';
1
+ import { type DataUpdate, type DomainEntity, type DomainState } from '../../core/index.js';
4
2
  export declare const applyUpdates: <ENTITIES extends DomainEntity<string>>(updates: ReadonlyArray<DataUpdate<ENTITIES, ENTITIES>>, state: DomainState<ENTITIES>) => DomainState<ENTITIES>;
@@ -1 +1 @@
1
- import{match as e}from"ts-pattern";import{isEqualComponentInstance as t}from"../../core/component.js";import{isVirtualEntityId as n}from"../../core/model.js";export const applyUpdates=(o,i)=>o.reduce((o,r)=>e(r).with({kind:"createDomainEntity"},e=>({...o,entities:[...o.entities,e.entity]})).with({kind:"deleteEntity"},e=>{let t=o.entities;if(!n(e.entityId)&&(t=o.entities.filter(t=>t.id!==e.entityId)).length===o.entities.length)throw Error(`No-op: Cannot remove domain entity #${String(e.entityId)}, because it does not exist`);let i=o.ephemeralRecords.filter(t=>t.componentInstance.entityId!==e.entityId);if(n(e.entityId)&&i.length===o.ephemeralRecords.length)throw Error(`No-op: Cannot remove virtual entity #${e.entityId}, because it does not exist`);return{...o,entities:t,ephemeralRecords:i}}).with({kind:"modifyDomainEntity"},e=>{let t=!1,n=o.entities.map(n=>n.id===e.entityId?(t=!0,{...n,...e.stateDelta}):n);if(!t)throw Error(`No-op: Cannot modify domain entity #${String(e.entityId)}, because it does not exist`);return{...o,entities:n}}).with({kind:"replaceDomainEntity"},e=>{let t=!1,n=o.entities.map(n=>n.id===e.entityId?(t=!0,e.replacementEntity):n);if(!t)throw Error(`No-op: Cannot replace entity #${String(e.entityId)} as it was not found in the domain state`);let r=o.ephemeralRecords.filter(t=>t.componentInstance.entityId!==e.entityId),a=e.entityId===i.rootEntityId?{rootEntityId:e.replacementEntity.id,rootEntityType:e.replacementEntity.type}:void 0;return{...o,...a,ephemeralRecords:r,entities:n}}).with({kind:"modifyEphemeralRecord"},e=>{let n=!1,i=o.ephemeralRecords.map(o=>t(o.componentInstance,e.componentInstance)?(n=!0,{...o,state:{...o.state,...e.writableState}}):o);if(!n)throw Error(`No-op: Cannot modify ephemeral record #${e.entityId} for component ${e.componentInstance.componentType.name}#${e.componentInstance.instanceName}, because it does not exist`);return{...o,ephemeralRecords:i}}).with({kind:"createEphemeralRecord"},e=>{if(o.ephemeralRecords.find(n=>t(n.componentInstance,e.componentInstance)))throw Error(`No-op: Cannot create ephemeral record #${e.entityId} for component ${e.componentInstance.componentType.name}#${e.componentInstance.instanceName}, because it already exists`);let n=[...o.ephemeralRecords,{entityId:e.entityId,updateTag:e.updateTag,state:e.initialState,componentInstance:e.componentInstance}];return{...o,ephemeralRecords:n}}).with({kind:"deleteEphemeralRecord"},e=>{let n=o.ephemeralRecords.filter(n=>!t(n.componentInstance,e.componentInstance));if(n.length===o.ephemeralRecords.length)throw Error(`No-op: Cannot delete ephemeral record #${e.entityId} for component ${e.componentInstance.componentType.name}#${e.componentInstance.instanceName}, because it does not exist`);return{...o,ephemeralRecords:n}}).exhaustive(),i);
1
+ import{match as e}from"ts-pattern";import{isEqualComponentInstance as t,isVirtualEntityId as n}from"../../core/index.js";export const applyUpdates=(o,i)=>o.reduce((o,r)=>e(r).with({kind:"createDomainEntity"},e=>({...o,entities:[...o.entities,e.entity]})).with({kind:"deleteEntity"},e=>{let t=o.entities;if(!n(e.entityId)&&(t=o.entities.filter(t=>t.id!==e.entityId)).length===o.entities.length)throw Error(`No-op: Cannot remove domain entity #${String(e.entityId)}, because it does not exist`);let i=o.ephemeralRecords.filter(t=>t.componentInstance.entityId!==e.entityId);if(n(e.entityId)&&i.length===o.ephemeralRecords.length)throw Error(`No-op: Cannot remove virtual entity #${e.entityId}, because it does not exist`);return{...o,entities:t,ephemeralRecords:i}}).with({kind:"modifyDomainEntity"},e=>{let t=!1,n=o.entities.map(n=>n.id===e.entityId?(t=!0,{...n,...e.stateDelta}):n);if(!t)throw Error(`No-op: Cannot modify domain entity #${String(e.entityId)}, because it does not exist`);return{...o,entities:n}}).with({kind:"replaceDomainEntity"},e=>{let t=!1,n=o.entities.map(n=>n.id===e.entityId?(t=!0,e.replacementEntity):n);if(!t)throw Error(`No-op: Cannot replace entity #${String(e.entityId)} as it was not found in the domain state`);let r=o.ephemeralRecords.filter(t=>t.componentInstance.entityId!==e.entityId),a=e.entityId===i.rootEntityId?{rootEntityId:e.replacementEntity.id,rootEntityType:e.replacementEntity.type}:void 0;return{...o,...a,ephemeralRecords:r,entities:n}}).with({kind:"modifyEphemeralRecord"},e=>{let n=!1,i=o.ephemeralRecords.map(o=>t(o.componentInstance,e.componentInstance)?(n=!0,{...o,state:{...o.state,...e.writableState}}):o);if(!n)throw Error(`No-op: Cannot modify ephemeral record #${e.entityId} for component ${e.componentInstance.componentType.name}#${e.componentInstance.instanceName}, because it does not exist`);return{...o,ephemeralRecords:i}}).with({kind:"createEphemeralRecord"},e=>{if(o.ephemeralRecords.find(n=>t(n.componentInstance,e.componentInstance)))throw Error(`No-op: Cannot create ephemeral record #${e.entityId} for component ${e.componentInstance.componentType.name}#${e.componentInstance.instanceName}, because it already exists`);let n=[...o.ephemeralRecords,{entityId:e.entityId,updateTag:e.updateTag,state:e.initialState,componentInstance:e.componentInstance}];return{...o,ephemeralRecords:n}}).with({kind:"deleteEphemeralRecord"},e=>{let n=o.ephemeralRecords.filter(n=>!t(n.componentInstance,e.componentInstance));if(n.length===o.ephemeralRecords.length)throw Error(`No-op: Cannot delete ephemeral record #${e.entityId} for component ${e.componentInstance.componentType.name}#${e.componentInstance.instanceName}, because it does not exist`);return{...o,ephemeralRecords:n}}).exhaustive(),i);
@@ -1,6 +1,4 @@
1
- import type { StateUpdate } from '../../components/updates.js';
2
- import { type DomainEntity, type DomainEntityId } from '../../core/model.js';
3
- import type { DomainState } from '../../core/state.js';
1
+ import { type DomainEntity, type DomainEntityId, type DomainState, type IdSequence, type StateUpdate } from '../../core/index.js';
4
2
  /**
5
3
  * Returns the next available entity id for the given entity type.
6
4
  *
@@ -15,16 +13,6 @@ import type { DomainState } from '../../core/state.js';
15
13
  * @deprecated Use `getIdSequence` instead
16
14
  */
17
15
  export declare const nextDomainEntityId: <ENTITIES extends DomainEntity<string>, TYPE extends ENTITIES['type']>(domainState: DomainState<ENTITIES>, type: TYPE, pendingUpdates: ReadonlyArray<StateUpdate<ENTITIES, ENTITIES>>) => DomainEntityId<TYPE>;
18
- export type IdSequence<ENTITIES extends DomainEntity<string>> = {
19
- /**
20
- * Returns the next available entity ID for the given type.
21
- * This automatically increments the sequence number for the given type, so that the next call will return a new ID.
22
- *
23
- * @param type the entity type
24
- * @returns a new domain entity ID for the given type
25
- */
26
- nextId: <TYPE extends ENTITIES['type']>(type: TYPE) => DomainEntityId<TYPE>;
27
- };
28
16
  /**
29
17
  * Returns an object that manages ID sequences for each entity type.
30
18
  *
@@ -1 +1 @@
1
- import{_unsafeBuildDomainEntityId as e,parseDomainEntityId as t}from"../../core/model.js";export const nextDomainEntityId=(n,i,r)=>{let o=0;for(let e of n.entities){let n=t(e.id);n.type===i&&n.sequenceNumber>o&&(o=n.sequenceNumber)}for(let e of r){let n;if("createDomainEntity"===e.kind&&e.entity.type===i?n=e.entity.id:"replaceDomainEntity"===e.kind&&e.replacementEntity.type===i&&(n=e.replacementEntity.id),void 0!==n){let e=t(n);e.sequenceNumber>o&&(o=e.sequenceNumber)}}return e(i,o+1)};export function getIdSequence(n,i){let r=new Map;return n.forEach(e=>{let n=t(e.id),i=r.get(n.type)??0;r.set(e.type,Math.max(i,n.sequenceNumber))}),i.forEach(e=>{let n;if("createDomainEntity"===e.kind?n=e.entity.id:"replaceDomainEntity"===e.kind&&(n=e.replacementEntity.id),void 0!==n){let e=t(n),i=r.get(e.type)??0;r.set(e.type,Math.max(i,e.sequenceNumber))}}),{nextId:t=>{let n=(r.get(t)??0)+1;return r.set(t,n),e(t,n)}}}
1
+ import{_unsafeBuildDomainEntityId as e,parseDomainEntityId as t}from"../../core/index.js";export const nextDomainEntityId=(n,i,r)=>{let o=0;for(let e of n.entities){let n=t(e.id);n.type===i&&n.sequenceNumber>o&&(o=n.sequenceNumber)}for(let e of r){let n;if("createDomainEntity"===e.kind&&e.entity.type===i?n=e.entity.id:"replaceDomainEntity"===e.kind&&e.replacementEntity.type===i&&(n=e.replacementEntity.id),void 0!==n){let e=t(n);e.sequenceNumber>o&&(o=e.sequenceNumber)}}return e(i,o+1)};export function getIdSequence(n,i){let r=new Map;return n.forEach(e=>{let n=t(e.id),i=r.get(n.type)??0;r.set(e.type,Math.max(i,n.sequenceNumber))}),i.forEach(e=>{let n;if("createDomainEntity"===e.kind?n=e.entity.id:"replaceDomainEntity"===e.kind&&(n=e.replacementEntity.id),void 0!==n){let e=t(n),i=r.get(e.type)??0;r.set(e.type,Math.max(i,e.sequenceNumber))}}),{nextId:t=>{let n=(r.get(t)??0)+1;return r.set(t,n),e(t,n)}}}
@@ -1,5 +1,4 @@
1
- import { type DomainEntityCreation, type EntityDeletion, type StateUpdate } from '../../components/updates.js';
2
- import type { DomainEntity } from '../../core/model.js';
1
+ import { type DomainEntity, type DomainEntityCreation, type EntityDeletion, type StateUpdate } from '../../core/index.js';
3
2
  import { type ProjectedEntitiesComponentSnapshot } from '../../system-components/index.js';
4
3
  export interface ReconciliationUpdate<ENTITY extends DomainEntity<string>, PARENT extends DomainEntity<string>> {
5
4
  readonly dataUpdate: DomainEntityCreation<ENTITY, PARENT> | EntityDeletion<ENTITY>;
@@ -1 +1 @@
1
- import{systemUpdateFactory as e}from"../../components/updates.js";import{getIdSequence as t}from"../store-system/next-domain-entity-id.js";let n=e=>"string"==typeof e.parentId&&"string"==typeof e.instanceName&&"string"==typeof e.key,o=(e,t,n,o)=>`${e}|${t}|${n}|${o}`;export const reconcileProjectedEntities=(a,p,i)=>{let s=new Map;for(let e of p){let t=String(e.componentInstance.entityId),n=e.componentInstance.instanceName;for(let a of e.state.blueprints){let e=o(t,n,a.key,a.type);s.set(e,{type:a.type,defaults:a.defaults,parentId:t,instanceName:n,key:a.key})}}let d=new Map;for(let e of a)if(n(e)){let t=o(e.parentId,e.instanceName,e.key,e.type);d.set(t,e)}let r=[],l=t(a,i);for(let[t,n]of s)if(!d.has(t)){let o=l.nextId(n.type),a={...n.defaults,id:o,type:n.type,parentId:n.parentId,instanceName:n.instanceName,key:n.key};r.push({dataUpdate:e.DomainEntityCreation({entity:a,parentId:n.parentId,updateTag:"projectedEntities.reconcile"}),compoundKey:t})}for(let[t,n]of d)s.has(t)||r.push({dataUpdate:e.EntityDeletion({entityId:n.id,updateTag:"projectedEntities.reconcile"}),compoundKey:t});return r};export const mergeReconciliationsUpdates=(e,t)=>{let n=new Map;for(let t of e)n.set(t.compoundKey,t);for(let e of t){let t=n.get(e.compoundKey);t&&t.dataUpdate.kind!==e.dataUpdate.kind?n.delete(e.compoundKey):n.set(e.compoundKey,e)}return[...n.values()]};
1
+ import{systemUpdateFactory as e}from"../../core/index.js";import{getIdSequence as t}from"../store-system/next-domain-entity-id.js";let n=e=>"string"==typeof e.parentId&&"string"==typeof e.instanceName&&"string"==typeof e.key,o=(e,t,n,o)=>`${e}|${t}|${n}|${o}`;export const reconcileProjectedEntities=(a,p,i)=>{let r=new Map;for(let e of p){let t=String(e.componentInstance.entityId),n=e.componentInstance.instanceName;for(let a of e.state.blueprints){let e=o(t,n,a.key,a.type);r.set(e,{type:a.type,defaults:a.defaults,parentId:t,instanceName:n,key:a.key})}}let d=new Map;for(let e of a)if(n(e)){let t=o(e.parentId,e.instanceName,e.key,e.type);d.set(t,e)}let s=[],l=t(a,i);for(let[t,n]of r)if(!d.has(t)){let o=l.nextId(n.type),a={...n.defaults,id:o,type:n.type,parentId:n.parentId,instanceName:n.instanceName,key:n.key};s.push({dataUpdate:e.DomainEntityCreation({entity:a,parentId:n.parentId,updateTag:"projectedEntities.reconcile"}),compoundKey:t})}for(let[t,n]of d)r.has(t)||s.push({dataUpdate:e.EntityDeletion({entityId:n.id,updateTag:"projectedEntities.reconcile"}),compoundKey:t});return s};export const mergeReconciliationsUpdates=(e,t)=>{let n=new Map;for(let t of e)n.set(t.compoundKey,t);for(let e of t){let t=n.get(e.compoundKey);t&&t.dataUpdate.kind!==e.dataUpdate.kind?n.delete(e.compoundKey):n.set(e.compoundKey,e)}return[...n.values()]};
@@ -1,12 +1,8 @@
1
1
  import { type ObservableWithLastValue } from '@salsita-ai/common/utils';
2
- import { type ComponentModification, type DataUpdate, type DomainEntityModification, type EphemeralRecordModification, type StateUpdate } from '../../components/updates.js';
3
- import { type SystemComponentTypeConstraint } from '../../core/component.js';
4
- import { type $DomainEntity, type DomainEntity } from '../../core/model.js';
5
- import type { DomainState } from '../../core/state.js';
2
+ import { type $DomainEntity, type ComponentModification, type DataUpdate, type DomainEntity, type DomainEntityModification, type DomainState, type EphemeralRecordModification, type StateUpdate, type SystemComponentTypeConstraint, type ViolationTypesOf$Entity } from '../../core/index.js';
6
3
  import type { DomainContextSelectors } from '../../domain-runtime/domain-context/index.js';
7
4
  import type { DomainServicesSelectors } from '../../domain-runtime/domain-services/index.js';
8
5
  import type { EnvironmentSelectors } from '../../domain-runtime/environment/index.js';
9
- import type { ViolationTypesOf$Entity } from '../../invariants/violation.js';
10
6
  import type { StateValidationResult } from '../../projections/validation-projections.js';
11
7
  import type { DomainContextSystems } from '../domain-context-systems.js';
12
8
  export type Unregister = () => void;
@@ -1,2 +1,2 @@
1
- import{CompositeKeyMap as e,assertExistence as t,isEqualArray as i}from"@salsita-ai/common/utils";import{dragStateComponent as o}from"../../components/drag-state-component.js";import{hoverStateComponent as r}from"../../components/hover-state-component.js";import{selectionStateComponent as s}from"../../components/selection-state-component.js";import{getComponentSystemFilterState as n}from"../../components/system-component-filter.js";import{systemVirtualEntityId as a}from"../../components/system-virtual-entity.js";import{systemUpdateFactory as d}from"../../components/updates.js";import{isSystemViewportStateComponentSnapshot as m}from"../../components/viewport-state-component.js";import{isEqualComponentInstance as l}from"../../core/component.js";import{domainEntityTypeFromId as c,isVirtualEntityId as p}from"../../core/model.js";import{projectedEntitiesComponent as h}from"../../system-components/index.js";import{cloneEvalCache as f,createEvalCacheToken as v,getEvalCache as g,setEvalCache as u}from"../../utils/eval-cache.js";import{createCascadeDeletesTransformer as y}from"../relation-transformers/cascade-deletes.js";import{createCascadeRefPruningTransformer as S}from"../relation-transformers/cascade-ref-pruning.js";import{applyUpdates as I}from"./apply-updates.js";import{LifecycleStateSlice as _}from"./lifecycle-state-slice.js";import{mergeReconciliationsUpdates as x,reconcileProjectedEntities as T}from"./reconcile-projected-entities.js";let E={uninitializedError:"StoreSystem is not initialized."},k=v({clone:e=>e}),w=class InvalidInitialStateError extends Error{emission;childError;constructor(e,t,i){let o="";"uncaught"===e.validity.severity&&(o=`: ${e.validity.error.message}`),("fatal"===e.validity.severity||"fixable"===e.validity.severity)&&(o=`: ${e.validity.entityViolations.map(e=>{let i=e.violation.message;return null!=i?t(i):e.violation.type}).join(", ")}`),super(`Initial state is not valid! Severity: ${e.validity.severity}, Cause: ${o}`),this.emission=e,this.childError=i,this.name="InvalidInitialStateError"}},b=(e,t)=>{try{return e()}catch(e){throw t(e),e}};export class StoreSystem{_context;stateSlices;get isInitialized(){return this.committed.isInitialized}_onBeforeCommitHooks=[];committed=new _(E);potentiallyInvalid=new _(E);rendered=new _(E);stagedUpdates=void 0;transformToDataUpdates=(e,t)=>{let i=!1,o=e.map(e=>"modifyComponent"===e.kind?(i=!0,this.componentModificationToDataUpdate(e,t)):e);return i?o:e};createInitialTransformPipe=()=>[{transformer:this.transformToDataUpdates,priority:1/0,registrationToken:{},name:"TransformToDataUpdates"}];transformPipe=this.createInitialTransformPipe();_cascadeDeletesTransformer=(...e)=>(this._cascadeDeletesTransformerMemo??=y(this._context.selectors.getCompositionProjections()))(...e);_cascadeDeletesTransformerMemo;_refPruningTransformer=(...e)=>(this._refPruningTransformerMemo??=S(this._context.selectors.getComponentReader()))(...e);_refPruningTransformerMemo;_deselectOnDeleteTransformer=(e,t)=>{let i=new Set(e.filter(e=>"deleteEntity"===e.kind).map(e=>e.entityId));if(0===i.size)return e;let o=n(t).selectedEntityId;return o&&i.has(o)?[...e,d.EphemeralRecordModification({componentInstance:{entityId:a,componentType:s},updateTag:"AutoDeselectRemovedProjectedEntity",writableState:{selectedEntityId:t.rootEntityId}})]:e};constructor(e){this._context=e,this.stateSlices={committed:this.committed.observable,rendered:this.rendered.observable,potentiallyInvalid:this.potentiallyInvalid.observable}}_validateState=e=>this._context.selectors.getValidationProjections().validateState(e);initialize=()=>{let e=this._context.selectors.getInitialDomainState();this.stagedUpdates=void 0;let t=this._validateState(e),i={kind:"reset",state:e,validity:t,tag:void 0,transformationLog:void 0},o=i;if(!o.validity.valid&&"fatal"===o.validity.severity||"fixable"===o.validity.severity){this._context.domainServicesSelectors.getLogger().debug("Trying to fix initial emission:",o);let e=o.state,{transformedUpdates:t,transformationLog:i}=this.applyTransformers([],e,"committed"),r=I(this.transformToDataUpdates(t,e),e);f(e,r),o={kind:"reset",state:r,validity:this._validateState(r),tag:"fixed",transformationLog:i}}if(!o.validity.valid){if(this._context.domainServicesSelectors.getLogger().error("Invalid initial emission:",{initialEmission:i,fixedEmission:o}),"uncaught"===o.validity.severity)throw new w(o,this._context.domainServicesSelectors.getResolveLocalizable(),o.validity.error??void 0);throw new w(o,this._context.domainServicesSelectors.getResolveLocalizable())}this.committed.next(o),this.rendered.next(o),this.potentiallyInvalid.next(o)};registerTransformer(e,i,o){let r={};return((e,i,o)=>{let r=0;for(;r<e.length&&0>=o(t(e[r]),i);)r++;e.splice(r,0,i)})(this.transformPipe,{registrationToken:r,transformer:i,priority:e,name:o},(e,t)=>e.priority===t.priority?0:e.priority<t.priority?-1:1),()=>{let e=this.transformPipe.findIndex(e=>e.registrationToken===r);-1!==e&&this.transformPipe.splice(e,1)}}onBeforeCommit(e){return this._onBeforeCommitHooks.push(e),()=>{this._onBeforeCommitHooks=this._onBeforeCommitHooks.filter(t=>t!==e)}}componentModificationToDataUpdate=(e,t)=>{let i=e.entityId;if(!p(i)){let t=this._context.selectors.getComponentReaderIndexes().opticMap.get(c(i))?.get(e.componentInstance.componentType)?.get(e.componentInstance.instanceName);if(t?.kind==="simple"){let o=t.write(e.writableState);return{kind:"modifyDomainEntity",entityId:i,updateTag:e.updateTag,stateDelta:o,hint:e.hint,agentHint:e.agentHint,origin:e}}}let o=t.ephemeralRecords.find(t=>l(t.componentInstance,e.componentInstance));if(o)return{kind:"modifyEphemeralRecord",entityId:e.entityId,updateTag:e.updateTag,componentInstance:o.componentInstance,writableState:e.writableState,hint:e.hint,agentHint:e.agentHint};throw Error(`Component ${e.componentInstance.componentType.name} is not attached on entity #${e.entityId}`)};getNewState=(e,t)=>{let i=I(this.transformToDataUpdates(e,t),t);return f(this.rendered.isInitialized?this.rendered.value.state:t,i),i};applyTransformers(e,t,i){let o=this._context.environmentSelectors.getEnvironmentIsDev()?[]:void 0;return{transformedUpdates:this.transformPipe.reduce((e,{transformer:r,name:s})=>{let n,a=o?[]:void 0,d=a?(e,t,i)=>{n=e,a.push({phase:e,message:t,data:i})}:void 0,m=b(()=>r(e,t,i,d),r=>{this._context.domainServicesSelectors.getLogger().error("Error while applying transformer!",{name:s,updates:e,previousState:t,kind:i,transformationLog:o},r instanceof Error?r:Error(String(r)))});return a&&o&&o.push({name:s,status:n??(m===e?"no-event":"apply"),entries:a,updatesIn:e,updatesOut:m}),m},e),transformationLog:o}}_updateProjectedEntities(e,t,o){if(!e.validity.valid)return e;let r=this._context.selectors.getComponentReader().readManyComponents({componentTypes:[h]},e.state),s=g(e.previousState,k);if(s&&i(s,r))return e;let n=0,a=e,d=[];for(;a.validity.valid;){n++;let i=T(a.state.entities,r,t);if(0===i.length)break;if(n>10)throw Error(`Maximum number of reconciliation rounds reached: 10. Projected entities seem to be recursively depending on themselves.
2
- If expressions populating 'projectedEntities' components rely on other projected entities, make sure that the dependencies do not have cycles.`);let s=(d=x(d,i)).map(e=>e.dataUpdate),m=this._cascadeDeletesTransformer(s,e.previousState,o,void 0,t),l=this._refPruningTransformer(m,e.previousState,o,void 0,t),c=this._deselectOnDeleteTransformer(l,e.previousState,o,void 0,t);if(!(a=this.prepareStateEmissionWithoutTransformation([...t,...c],e.previousState,o)).validity.valid)return this._context.domainServicesSelectors.getLogger().error("Reconciliation of projected entities led to an invalid state! Reconciliation skipped.",{emission:a}),e;r=this._context.selectors.getComponentReader().readManyComponents({componentTypes:[h]},a.state)}return u(a.state,k,r),a}prepareStateEmission(e,t,i){let{transformedUpdates:o,transformationLog:r}=this.applyTransformers(e,t,i),s=this.prepareStateEmissionWithoutTransformation(o,t,i);return{...this._updateProjectedEntities(s,o,i),transformationLog:r}}emissionCache=new e([Map,WeakMap,WeakMap,WeakMap,WeakMap]);getEmissionCacheKey=(e,t,i)=>[e,t,i,this._context.selectors.getStoreRuntimeDependencies(),this._context.selectors.getExpressionContext()];prepareStateEmissionWithoutTransformation=(e,t,i)=>{let o=this.getEmissionCacheKey(i,t,e),r=this.emissionCache.get(o);if(r)return r;let s=b(()=>this.transformToDataUpdates(e,t),o=>{this._context.domainServicesSelectors.getLogger().error("Error while transforming updates to data updates!",{updates:e,previousState:t,kind:i},o instanceof Error?o:Error(String(o)))}),n=b(()=>I(s,t),o=>{this._context.domainServicesSelectors.getLogger().error("Error while applying updates!",{updates:e,previousState:t,kind:i,dataUpdates:s},o instanceof Error?o:Error(String(o)))});f(this.rendered.isInitialized?this.rendered.value.state:t,n);let a=this._validateState(n);"uncaught"===a.severity&&this._context.domainServicesSelectors.getLogger().error("There was an uncaught validation error:",{updates:e,dataUpdates:s,previousState:t,newState:n,kind:i},a.error);let d={kind:i,previousState:t,state:n,updates:s,validity:a,transformationLog:void 0};return this.emissionCache.set(o,d),d};stage(e,t=!0){this.stagedUpdates=e;let i=this.prepareStateEmission(e,this.committed.value.state,"staged");return t&&this.emit(i),i}emit(e){"staged"===e.kind?e.validity.valid&&this.rendered.nextIfDifferent(e):(e.validity.valid?(this.committed.nextIfDifferent(e),this.rendered.nextIfDifferent(e)):this.rendered.nextIfDifferent(this.committed.value),this.potentiallyInvalid.nextIfDifferent(e))}commit=()=>{if(void 0===this.stagedUpdates)return;let e=this.prepareStateEmission(this.stagedUpdates,this.committed.value.state,"committed"),t=()=>{if(this._onBeforeCommitHooks.some(i=>!1===i(e,t))){this._context.domainServicesSelectors.getLogger().debug("Commit was canceled by one of the onBeforeCommit hooks! Resetting rendered state.",e),this.rollback();return}this.stagedUpdates=void 0,this._context.domainServicesSelectors.getLogger().debug("commit",e),this.emit(e)};t()};commitPrepared=e=>{if("committed"!==e.kind||!e.validity.valid)throw Error(`commitPrepared received a ${e.validity.valid?e.kind:"invalid"} emission, but only a valid committed emission can become the committed state. Prepare the emission with kind "committed" and check its validity before committing it.`);let t=()=>e.previousState===this.committed.value.state;if(!t())return"conflict";let i=()=>{t()?o():this._context.domainServicesSelectors.getLogger().warn("A held commit was dropped, because the committed state changed since it was prepared.",e)},o=()=>this._onBeforeCommitHooks.some(t=>!1===t(e,i))?(this._context.domainServicesSelectors.getLogger().debug("A prepared commit was held by one of the onBeforeCommit hooks.",e),!1):(this._context.domainServicesSelectors.getLogger().debug("commitPrepared",e),this.stagedUpdates=void 0,this.emit(e),!0);return o()?"committed":"held"};rollback=()=>{void 0!==this.stagedUpdates&&(this.stagedUpdates=void 0,this.emit(this.committed.value))};_resetInteractionState(e){return e.ephemeralRecords.some(e=>{let t;return(t=e.componentInstance.componentType)===r||t===o})?{...e,ephemeralRecords:e.ephemeralRecords.map(e=>e.componentInstance.componentType===r?{...e,state:{hoveredEntityId:null}}:e.componentInstance.componentType===o?{...e,state:{draggedEntityId:null}}:e)}:e}_preserveViewportState(e,t){let i=t.ephemeralRecords.find(m),o=e.ephemeralRecords.filter(e=>!m(e));return{...e,ephemeralRecords:i?[...o,i]:o}}reset(e,t){let i=this.committed.value.state,o=this._preserveViewportState(e,i),r=this._resetInteractionState(o),s=this._validateState(r);if(!s.valid)throw Error("Cannot reset to an invalid state");this.stagedUpdates=void 0,this.emit({kind:"reset",state:r,validity:s,tag:t,transformationLog:void 0})}stageAndCommit(e){if(0!==e.length){this.stagedUpdates=e;try{this.commit()}finally{this.stagedUpdates=void 0}}}}
1
+ import{CompositeKeyMap as e,assertExistence as t,isEqualArray as i}from"@salsita-ai/common/utils";import{domainEntityTypeFromId as r,dragStateComponent as o,getComponentSystemFilterState as s,hoverStateComponent as n,isEqualComponentInstance as a,isSystemViewportStateComponentSnapshot as d,isVirtualEntityId as m,selectionStateComponent as l,systemUpdateFactory as c,systemVirtualEntityId as p}from"../../core/index.js";import{projectedEntitiesComponent as h}from"../../system-components/index.js";import{cloneEvalCache as f,createEvalCacheToken as v,getEvalCache as g,setEvalCache as u}from"../../utils/eval-cache.js";import{createCascadeDeletesTransformer as y}from"../relation-transformers/cascade-deletes.js";import{createCascadeRefPruningTransformer as S}from"../relation-transformers/cascade-ref-pruning.js";import{applyUpdates as I}from"./apply-updates.js";import{LifecycleStateSlice as _}from"./lifecycle-state-slice.js";import{mergeReconciliationsUpdates as x,reconcileProjectedEntities as T}from"./reconcile-projected-entities.js";let E={uninitializedError:"StoreSystem is not initialized."},k=v({clone:e=>e}),w=class InvalidInitialStateError extends Error{emission;childError;constructor(e,t,i){let r="";"uncaught"===e.validity.severity&&(r=`: ${e.validity.error.message}`),("fatal"===e.validity.severity||"fixable"===e.validity.severity)&&(r=`: ${e.validity.entityViolations.map(e=>{let i=e.violation.message;return null!=i?t(i):e.violation.type}).join(", ")}`),super(`Initial state is not valid! Severity: ${e.validity.severity}, Cause: ${r}`),this.emission=e,this.childError=i,this.name="InvalidInitialStateError"}},b=(e,t)=>{try{return e()}catch(e){throw t(e),e}};export class StoreSystem{_context;stateSlices;get isInitialized(){return this.committed.isInitialized}_onBeforeCommitHooks=[];committed=new _(E);potentiallyInvalid=new _(E);rendered=new _(E);stagedUpdates=void 0;transformToDataUpdates=(e,t)=>{let i=!1,r=e.map(e=>"modifyComponent"===e.kind?(i=!0,this.componentModificationToDataUpdate(e,t)):e);return i?r:e};createInitialTransformPipe=()=>[{transformer:this.transformToDataUpdates,priority:1/0,registrationToken:{},name:"TransformToDataUpdates"}];transformPipe=this.createInitialTransformPipe();_cascadeDeletesTransformer=(...e)=>(this._cascadeDeletesTransformerMemo??=y(this._context.selectors.getCompositionProjections()))(...e);_cascadeDeletesTransformerMemo;_refPruningTransformer=(...e)=>(this._refPruningTransformerMemo??=S(this._context.selectors.getComponentReader()))(...e);_refPruningTransformerMemo;_deselectOnDeleteTransformer=(e,t)=>{let i=new Set(e.filter(e=>"deleteEntity"===e.kind).map(e=>e.entityId));if(0===i.size)return e;let r=s(t).selectedEntityId;return r&&i.has(r)?[...e,c.EphemeralRecordModification({componentInstance:{entityId:p,componentType:l},updateTag:"AutoDeselectRemovedProjectedEntity",writableState:{selectedEntityId:t.rootEntityId}})]:e};constructor(e){this._context=e,this.stateSlices={committed:this.committed.observable,rendered:this.rendered.observable,potentiallyInvalid:this.potentiallyInvalid.observable}}_validateState=e=>this._context.selectors.getValidationProjections().validateState(e);initialize=()=>{let e=this._context.selectors.getInitialDomainState();this.stagedUpdates=void 0;let t=this._validateState(e),i={kind:"reset",state:e,validity:t,tag:void 0,transformationLog:void 0},r=i;if(!r.validity.valid&&"fatal"===r.validity.severity||"fixable"===r.validity.severity){this._context.domainServicesSelectors.getLogger().debug("Trying to fix initial emission:",r);let e=r.state,{transformedUpdates:t,transformationLog:i}=this.applyTransformers([],e,"committed"),o=I(this.transformToDataUpdates(t,e),e);f(e,o),r={kind:"reset",state:o,validity:this._validateState(o),tag:"fixed",transformationLog:i}}if(!r.validity.valid){if(this._context.domainServicesSelectors.getLogger().error("Invalid initial emission:",{initialEmission:i,fixedEmission:r}),"uncaught"===r.validity.severity)throw new w(r,this._context.domainServicesSelectors.getResolveLocalizable(),r.validity.error??void 0);throw new w(r,this._context.domainServicesSelectors.getResolveLocalizable())}this.committed.next(r),this.rendered.next(r),this.potentiallyInvalid.next(r)};registerTransformer(e,i,r){let o={};return((e,i,r)=>{let o=0;for(;o<e.length&&0>=r(t(e[o]),i);)o++;e.splice(o,0,i)})(this.transformPipe,{registrationToken:o,transformer:i,priority:e,name:r},(e,t)=>e.priority===t.priority?0:e.priority<t.priority?-1:1),()=>{let e=this.transformPipe.findIndex(e=>e.registrationToken===o);-1!==e&&this.transformPipe.splice(e,1)}}onBeforeCommit(e){return this._onBeforeCommitHooks.push(e),()=>{this._onBeforeCommitHooks=this._onBeforeCommitHooks.filter(t=>t!==e)}}componentModificationToDataUpdate=(e,t)=>{let i=e.entityId;if(!m(i)){let t=this._context.selectors.getComponentReaderIndexes().opticMap.get(r(i))?.get(e.componentInstance.componentType)?.get(e.componentInstance.instanceName);if(t?.kind==="simple"){let r=t.write(e.writableState);return{kind:"modifyDomainEntity",entityId:i,updateTag:e.updateTag,stateDelta:r,hint:e.hint,agentHint:e.agentHint,origin:e}}}let o=t.ephemeralRecords.find(t=>a(t.componentInstance,e.componentInstance));if(o)return{kind:"modifyEphemeralRecord",entityId:e.entityId,updateTag:e.updateTag,componentInstance:o.componentInstance,writableState:e.writableState,hint:e.hint,agentHint:e.agentHint};throw Error(`Component ${e.componentInstance.componentType.name} is not attached on entity #${e.entityId}`)};getNewState=(e,t)=>{let i=I(this.transformToDataUpdates(e,t),t);return f(this.rendered.isInitialized?this.rendered.value.state:t,i),i};applyTransformers(e,t,i){let r=this._context.environmentSelectors.getEnvironmentIsDev()?[]:void 0;return{transformedUpdates:this.transformPipe.reduce((e,{transformer:o,name:s})=>{let n,a=r?[]:void 0,d=a?(e,t,i)=>{n=e,a.push({phase:e,message:t,data:i})}:void 0,m=b(()=>o(e,t,i,d),o=>{this._context.domainServicesSelectors.getLogger().error("Error while applying transformer!",{name:s,updates:e,previousState:t,kind:i,transformationLog:r},o instanceof Error?o:Error(String(o)))});return a&&r&&r.push({name:s,status:n??(m===e?"no-event":"apply"),entries:a,updatesIn:e,updatesOut:m}),m},e),transformationLog:r}}_updateProjectedEntities(e,t,r){if(!e.validity.valid)return e;let o=this._context.selectors.getComponentReader().readManyComponents({componentTypes:[h]},e.state),s=g(e.previousState,k);if(s&&i(s,o))return e;let n=0,a=e,d=[];for(;a.validity.valid;){n++;let i=T(a.state.entities,o,t);if(0===i.length)break;if(n>10)throw Error(`Maximum number of reconciliation rounds reached: 10. Projected entities seem to be recursively depending on themselves.
2
+ If expressions populating 'projectedEntities' components rely on other projected entities, make sure that the dependencies do not have cycles.`);let s=(d=x(d,i)).map(e=>e.dataUpdate),m=this._cascadeDeletesTransformer(s,e.previousState,r,void 0,t),l=this._refPruningTransformer(m,e.previousState,r,void 0,t),c=this._deselectOnDeleteTransformer(l,e.previousState,r,void 0,t);if(!(a=this.prepareStateEmissionWithoutTransformation([...t,...c],e.previousState,r)).validity.valid)return this._context.domainServicesSelectors.getLogger().error("Reconciliation of projected entities led to an invalid state! Reconciliation skipped.",{emission:a}),e;o=this._context.selectors.getComponentReader().readManyComponents({componentTypes:[h]},a.state)}return u(a.state,k,o),a}prepareStateEmission(e,t,i){let{transformedUpdates:r,transformationLog:o}=this.applyTransformers(e,t,i),s=this.prepareStateEmissionWithoutTransformation(r,t,i);return{...this._updateProjectedEntities(s,r,i),transformationLog:o}}emissionCache=new e([Map,WeakMap,WeakMap,WeakMap,WeakMap]);getEmissionCacheKey=(e,t,i)=>[e,t,i,this._context.selectors.getStoreRuntimeDependencies(),this._context.selectors.getExpressionContext()];prepareStateEmissionWithoutTransformation=(e,t,i)=>{let r=this.getEmissionCacheKey(i,t,e),o=this.emissionCache.get(r);if(o)return o;let s=b(()=>this.transformToDataUpdates(e,t),r=>{this._context.domainServicesSelectors.getLogger().error("Error while transforming updates to data updates!",{updates:e,previousState:t,kind:i},r instanceof Error?r:Error(String(r)))}),n=b(()=>I(s,t),r=>{this._context.domainServicesSelectors.getLogger().error("Error while applying updates!",{updates:e,previousState:t,kind:i,dataUpdates:s},r instanceof Error?r:Error(String(r)))});f(this.rendered.isInitialized?this.rendered.value.state:t,n);let a=this._validateState(n);"uncaught"===a.severity&&this._context.domainServicesSelectors.getLogger().error("There was an uncaught validation error:",{updates:e,dataUpdates:s,previousState:t,newState:n,kind:i},a.error);let d={kind:i,previousState:t,state:n,updates:s,validity:a,transformationLog:void 0};return this.emissionCache.set(r,d),d};stage(e,t=!0){this.stagedUpdates=e;let i=this.prepareStateEmission(e,this.committed.value.state,"staged");return t&&this.emit(i),i}emit(e){"staged"===e.kind?e.validity.valid&&this.rendered.nextIfDifferent(e):(e.validity.valid?(this.committed.nextIfDifferent(e),this.rendered.nextIfDifferent(e)):this.rendered.nextIfDifferent(this.committed.value),this.potentiallyInvalid.nextIfDifferent(e))}commit=()=>{if(void 0===this.stagedUpdates)return;let e=this.prepareStateEmission(this.stagedUpdates,this.committed.value.state,"committed"),t=()=>{if(this._onBeforeCommitHooks.some(i=>!1===i(e,t))){this._context.domainServicesSelectors.getLogger().debug("Commit was canceled by one of the onBeforeCommit hooks! Resetting rendered state.",e),this.rollback();return}this.stagedUpdates=void 0,this._context.domainServicesSelectors.getLogger().debug("commit",e),this.emit(e)};t()};commitPrepared=e=>{if("committed"!==e.kind||!e.validity.valid)throw Error(`commitPrepared received a ${e.validity.valid?e.kind:"invalid"} emission, but only a valid committed emission can become the committed state. Prepare the emission with kind "committed" and check its validity before committing it.`);let t=()=>e.previousState===this.committed.value.state;if(!t())return"conflict";let i=()=>{t()?r():this._context.domainServicesSelectors.getLogger().warn("A held commit was dropped, because the committed state changed since it was prepared.",e)},r=()=>this._onBeforeCommitHooks.some(t=>!1===t(e,i))?(this._context.domainServicesSelectors.getLogger().debug("A prepared commit was held by one of the onBeforeCommit hooks.",e),!1):(this._context.domainServicesSelectors.getLogger().debug("commitPrepared",e),this.stagedUpdates=void 0,this.emit(e),!0);return r()?"committed":"held"};rollback=()=>{void 0!==this.stagedUpdates&&(this.stagedUpdates=void 0,this.emit(this.committed.value))};_resetInteractionState(e){return e.ephemeralRecords.some(e=>{let t;return(t=e.componentInstance.componentType)===n||t===o})?{...e,ephemeralRecords:e.ephemeralRecords.map(e=>e.componentInstance.componentType===n?{...e,state:{hoveredEntityId:null}}:e.componentInstance.componentType===o?{...e,state:{draggedEntityId:null}}:e)}:e}_preserveViewportState(e,t){let i=t.ephemeralRecords.find(d),r=e.ephemeralRecords.filter(e=>!d(e));return{...e,ephemeralRecords:i?[...r,i]:r}}reset(e,t){let i=this.committed.value.state,r=this._preserveViewportState(e,i),o=this._resetInteractionState(r),s=this._validateState(o);if(!s.valid)throw Error("Cannot reset to an invalid state");this.stagedUpdates=void 0,this.emit({kind:"reset",state:o,validity:s,tag:t,transformationLog:void 0})}stageAndCommit(e){if(0!==e.length){this.stagedUpdates=e;try{this.commit()}finally{this.stagedUpdates=void 0}}}}
@@ -1,6 +1,4 @@
1
- import type { StateOfComponent, SystemComponentTypeConstraint, WritableStateOfComponent } from '../../core/component.js';
2
- import type { DomainEntity } from '../../core/model.js';
3
- import type { DomainState } from '../../core/state.js';
1
+ import { type DomainEntity, type DomainState, type StateOfComponent, type SystemComponentTypeConstraint, type WritableStateOfComponent } from '../../core/index.js';
4
2
  import type { DomainContextSelectors } from '../../domain-runtime/domain-context/index.js';
5
3
  export declare const SystemStateInitialUpdateTag = "system.state.initial";
6
4
  export declare const SystemStateUpdateTag = "system.state";
@@ -1 +1 @@
1
- import{systemVirtualEntityId as t}from"../../components/system-virtual-entity.js";import{systemUpdateFactory as e}from"../../components/updates.js";export const SystemStateInitialUpdateTag="system.state.initial";export const SystemStateUpdateTag="system.state";export class SystemState{_context;constructor(t){this._context=t}initialize=()=>{let t=this._context.selectors.getStoreSystem(),e=t.stateSlices.committed.value.state;t.stageAndCommit(this.getInitialUpdates(e))};getInitialUpdates=n=>{let o=this._context.getInitialState(n);return[e.EphemeralRecordCreation({componentInstance:{entityId:t,componentType:this._context.componentType,instanceName:"singleton"},updateTag:"system.state.initial",initialState:o})]};get=e=>{let n=this._context.selectors.getComponentReader().readOneComponent({entityId:t,componentType:this._context.componentType,instanceName:"singleton"},e);return n?n.state:this._context.getInitialState(e)};getUpdates=(n,o)=>{let s=this.get(o),i="function"==typeof n?n(s):n;return i?[e.ComponentModification({componentInstance:{entityId:t,componentType:this._context.componentType,instanceName:"singleton"},updateTag:"system.state",writableState:i})]:[]}}
1
+ import{systemUpdateFactory as t,systemVirtualEntityId as e}from"../../core/index.js";export const SystemStateInitialUpdateTag="system.state.initial";export const SystemStateUpdateTag="system.state";export class SystemState{_context;constructor(t){this._context=t}initialize=()=>{let t=this._context.selectors.getStoreSystem(),e=t.stateSlices.committed.value.state;t.stageAndCommit(this.getInitialUpdates(e))};getInitialUpdates=n=>{let o=this._context.getInitialState(n);return[t.EphemeralRecordCreation({componentInstance:{entityId:e,componentType:this._context.componentType,instanceName:"singleton"},updateTag:"system.state.initial",initialState:o})]};get=t=>{let n=this._context.selectors.getComponentReader().readOneComponent({entityId:e,componentType:this._context.componentType,instanceName:"singleton"},t);return n?n.state:this._context.getInitialState(t)};getUpdates=(n,o)=>{let s=this.get(o),i="function"==typeof n?n(s):n;return i?[t.ComponentModification({componentInstance:{entityId:e,componentType:this._context.componentType,instanceName:"singleton"},updateTag:"system.state",writableState:i})]:[]}}
@@ -1,5 +1,4 @@
1
- import type { StateUpdate } from '../../components/updates.js';
2
- import { type $DomainEntity, type DomainEntity } from '../../core/model.js';
1
+ import { type $DomainEntity, type DomainEntity, type StateUpdate } from '../../core/index.js';
3
2
  import type { ChainBuilder } from './chain-builder.js';
4
3
  import type { BaseTransformerBuilderContext, ContextFactory, ContextWithEntityId } from './context.js';
5
4
  export type SelectAction<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, NAVIGATION_STATES extends string, VIEW_STATES extends string, TOOL_STATES extends string, EXPORT_STATES extends string, CTX> = CTX extends ContextWithEntityId<ENTITIES, $MAP, ALLOWED_ROOT_ENTITIES, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES> ? {
@@ -1 +1 @@
1
- import{match as e}from"ts-pattern";import{isEqualArray as t,isNonNullish as r}from"@salsita-ai/common/utils";import{domainEntityTypeFromId as i}from"../../core/model.js";import{isDeselectUpdate as n,isNavigationUpdate as o,isSelectUpdate as a,isViewUpdate as l}from"../navigation-system/navigation-updates.js";import{createCascadeDeletesTransformer as s}from"../relation-transformers/cascade-deletes.js";import{createCascadeRefPruningTransformer as p}from"../relation-transformers/cascade-ref-pruning.js";import{createCreateEntityRefsTransformer as d}from"../relation-transformers/create-entity-refs.js";import{createRefReplaceTransformer as f}from"../relation-transformers/replace-refs.js";import{getIdSequence as g}from"../store-system/next-domain-entity-id.js";import{chainBuilder as u}from"./chain-builder.js";import{isContextWithEntityId as c,isContextWithUpdate as h}from"./context.js";let m=(e,t)=>{let i=[d(e.componentReader),f(e.componentReader),s(e.compositionProjections),p(e.componentReader),t?e.storeSystem.transformToDataUpdates:void 0].filter(r);return(e,t,r,n,o)=>i.reduce((e,i)=>i(e,t,r,n,o),e)};export const updateActions=s=>p=>{let d,f=t=>r=>u(i=>{let n=m(i,s);return(o,a,l,s)=>{let d=p(o,a,l,i,s);return d.length?d.reduce((i,o)=>{let p=r({...o,getIdSequence:()=>g(a.entities,i)});return e(t).with("applySideEffect",()=>0===p.length?(s?.("no-apply","No side effects applied"),i):(s?.("apply","Applying side effects",{added:p}),[...i,...n(p,a,l,s,i)])).with("overrideMatchingUpdate",()=>{let e=h(o)?o.update:null;if(1===p.length&&p[0]===e)return s?.("no-apply","Update replaced with itself, no-op"),i;s?.("apply","Overriding matched updates",{removed:[e],added:p});let t=i.filter(t=>t!==e);return[...t,...n(p,a,l,s,t)]}).exhaustive()},o):o}});return{applySideEffect:f("applySideEffect"),overrideMatchingUpdate:f("overrideMatchingUpdate"),overrideAllUpdates:e=>u(r=>{let i=m(r,s);return(n,o,a,l)=>{let s=p(n,o,a,r,l);if(!s.length)return n;s.length>1&&l?.("apply",'Multiple contexts matched for "overrideAllUpdates", picking the first one only');let d=e(s[0]);if(t(d,n))return l?.("no-apply",'Updates returned from "overrideAllUpdates" are the same as the original updates, skipping transformer'),n;let{processedUpdates:f,trulyNewUpdates:g}=d.reduce((e,t)=>(n.includes(t)?e.processedUpdates.push(t):e.trulyNewUpdates.push(t),e),{processedUpdates:[],trulyNewUpdates:[]});return l?.("apply","Overriding all updates",{removed:n,added:d,keptUnchanged:f,trulyNew:g}),[...f,...i(g,o,a,l,f)]}}),...(d=(e,t,r,i)=>{if(0===r.length)return t;r.length>1&&i?.("apply","Multiple entities supposed to be selected, picking the first one",{entityIds:r});let o=t.filter(e=>!(a(e)||n(e))),l=r[0],s=e.navigationSystem.getSelectUpdate(l);return o.length<t.length?i?.("apply",`Overriding previous selection updates with selection of entity ${l}`,{removed:t.filter(e=>a(e)||n(e)),added:s}):i?.("apply",`Selecting entity ${l}`,{added:s}),[...o,s]},{select:{entity:e=>u(t=>(i,n,o,a)=>{t.storeSystem.prepareStateEmissionWithoutTransformation(i,n,o);let l=p(i,n,o,t,a);if(0===l.length)return i;let s=l.map(e).filter(r);return 0===s.length?(a?.("no-resolve","Custom selector did not return any entity id, skipping selection"),i):d(t,i,s,a)}),self:()=>u(e=>(t,r,i,n)=>{let o=p(t,r,i,e,n);return 0===o.length?t:d(e,t,o.map(e=>{if(!c(e))throw Error("Context does not have entity id");return e.entityId}),n)}),ancestorOfType:e=>u(t=>(n,o,a,l)=>{let s=p(n,o,a,t,l);if(0===s.length)return n;let f=s.map(e=>{if(!c(e))throw Error("Context does not have entity id");return e.entityId}),g=s.map(r=>{if(!c(r))throw Error("Context does not have entity id");let n=t.compositionProjections.getTree(o).map.get(r.entityId);if(!n)throw Error(`Entity with id ${r.entityId} not found in the composition tree. The state is invalid!`);for(let t of n.ancestors())if(e.includes(i(t.id)))return t.id}),u=g.filter(r);return(u.length<f.length&&l?.("no-apply",0===u.length?"No entities have ancestor of the specified type, skipping selection":"Some entities do not have ancestor of the specified type",{entityIds:f.filter((e,t)=>void 0===g[t])}),0===u.length)?n:d(t,n,u,l)})},deselect:()=>u(e=>(t,r,i,o)=>0===p(t,r,i,e,o).length?t:[...t.filter(e=>!(a(e)||n(e))),e.navigationSystem.getDeselectUpdate()]),navigateTo:e=>u(t=>(i,n,a,l)=>{let s=p(i,n,a,t,l);if(0===s.length)return i;let d=s.map(t=>"function"==typeof e?e(t):e).filter(r);if(0===d.length)return l?.("no-resolve","Custom selector did not return any navigation state, skipping navigation"),i;d.length>1&&l?.("apply","Multiple navigation states selected, picking the first one",{navigationStates:d});let f=d[0],g=t.navigationSystem.getNavigationUpdate(f),u=i.filter(e=>!o(e));return u.length<i.length?l?.("apply",`Overriding previous navigation updates with ${f}`,{removed:i.filter(e=>o(e)),added:g}):l?.("apply",`Navigating to ${f}`,{added:g}),[...u,g]}),changeView:e=>u(t=>(i,o,s,d)=>{let f=p(i,o,s,t,d);if(0===f.length)return i;let g=f.map(t=>"function"==typeof e?e(t):e).filter(r);if(0===g.length)return d?.("no-resolve","Custom selector did not return any view state, skipping view change"),i;g.length>1&&d?.("apply","Multiple view states selected, picking the first one",{viewStates:g});let u=g[0],c=t.navigationSystem.getViewUpdate(u),h=i.filter(e=>!l(e));return h.length<i.length?d?.("apply",`Overriding previous view state updates with ${u}`,{removed:i.filter(e=>a(e)||n(e)),added:c}):d?.("apply",`Changing view to ${u}`,{added:c}),[...h,c]})})}};
1
+ import{match as e}from"ts-pattern";import{isEqualArray as t,isNonNullish as i}from"@salsita-ai/common/utils";import{domainEntityTypeFromId as r}from"../../core/index.js";import{isDeselectUpdate as n,isNavigationUpdate as o,isSelectUpdate as a,isViewUpdate as l}from"../navigation-system/navigation-updates.js";import{createCascadeDeletesTransformer as s}from"../relation-transformers/cascade-deletes.js";import{createCascadeRefPruningTransformer as p}from"../relation-transformers/cascade-ref-pruning.js";import{createCreateEntityRefsTransformer as d}from"../relation-transformers/create-entity-refs.js";import{createRefReplaceTransformer as f}from"../relation-transformers/replace-refs.js";import{getIdSequence as g}from"../store-system/next-domain-entity-id.js";import{chainBuilder as u}from"./chain-builder.js";import{isContextWithEntityId as c,isContextWithUpdate as h}from"./context.js";let m=(e,t)=>{let r=[d(e.componentReader),f(e.componentReader),s(e.compositionProjections),p(e.componentReader),t?e.storeSystem.transformToDataUpdates:void 0].filter(i);return(e,t,i,n,o)=>r.reduce((e,r)=>r(e,t,i,n,o),e)};export const updateActions=s=>p=>{let d,f=t=>i=>u(r=>{let n=m(r,s);return(o,a,l,s)=>{let d=p(o,a,l,r,s);return d.length?d.reduce((r,o)=>{let p=i({...o,getIdSequence:()=>g(a.entities,r)});return e(t).with("applySideEffect",()=>0===p.length?(s?.("no-apply","No side effects applied"),r):(s?.("apply","Applying side effects",{added:p}),[...r,...n(p,a,l,s,r)])).with("overrideMatchingUpdate",()=>{let e=h(o)?o.update:null;if(1===p.length&&p[0]===e)return s?.("no-apply","Update replaced with itself, no-op"),r;s?.("apply","Overriding matched updates",{removed:[e],added:p});let t=r.filter(t=>t!==e);return[...t,...n(p,a,l,s,t)]}).exhaustive()},o):o}});return{applySideEffect:f("applySideEffect"),overrideMatchingUpdate:f("overrideMatchingUpdate"),overrideAllUpdates:e=>u(i=>{let r=m(i,s);return(n,o,a,l)=>{let s=p(n,o,a,i,l);if(!s.length)return n;s.length>1&&l?.("apply",'Multiple contexts matched for "overrideAllUpdates", picking the first one only');let d=e(s[0]);if(t(d,n))return l?.("no-apply",'Updates returned from "overrideAllUpdates" are the same as the original updates, skipping transformer'),n;let{processedUpdates:f,trulyNewUpdates:g}=d.reduce((e,t)=>(n.includes(t)?e.processedUpdates.push(t):e.trulyNewUpdates.push(t),e),{processedUpdates:[],trulyNewUpdates:[]});return l?.("apply","Overriding all updates",{removed:n,added:d,keptUnchanged:f,trulyNew:g}),[...f,...r(g,o,a,l,f)]}}),...(d=(e,t,i,r)=>{if(0===i.length)return t;i.length>1&&r?.("apply","Multiple entities supposed to be selected, picking the first one",{entityIds:i});let o=t.filter(e=>!(a(e)||n(e))),l=i[0],s=e.navigationSystem.getSelectUpdate(l);return o.length<t.length?r?.("apply",`Overriding previous selection updates with selection of entity ${l}`,{removed:t.filter(e=>a(e)||n(e)),added:s}):r?.("apply",`Selecting entity ${l}`,{added:s}),[...o,s]},{select:{entity:e=>u(t=>(r,n,o,a)=>{t.storeSystem.prepareStateEmissionWithoutTransformation(r,n,o);let l=p(r,n,o,t,a);if(0===l.length)return r;let s=l.map(e).filter(i);return 0===s.length?(a?.("no-resolve","Custom selector did not return any entity id, skipping selection"),r):d(t,r,s,a)}),self:()=>u(e=>(t,i,r,n)=>{let o=p(t,i,r,e,n);return 0===o.length?t:d(e,t,o.map(e=>{if(!c(e))throw Error("Context does not have entity id");return e.entityId}),n)}),ancestorOfType:e=>u(t=>(n,o,a,l)=>{let s=p(n,o,a,t,l);if(0===s.length)return n;let f=s.map(e=>{if(!c(e))throw Error("Context does not have entity id");return e.entityId}),g=s.map(i=>{if(!c(i))throw Error("Context does not have entity id");let n=t.compositionProjections.getTree(o).map.get(i.entityId);if(!n)throw Error(`Entity with id ${i.entityId} not found in the composition tree. The state is invalid!`);for(let t of n.ancestors())if(e.includes(r(t.id)))return t.id}),u=g.filter(i);return(u.length<f.length&&l?.("no-apply",0===u.length?"No entities have ancestor of the specified type, skipping selection":"Some entities do not have ancestor of the specified type",{entityIds:f.filter((e,t)=>void 0===g[t])}),0===u.length)?n:d(t,n,u,l)})},deselect:()=>u(e=>(t,i,r,o)=>0===p(t,i,r,e,o).length?t:[...t.filter(e=>!(a(e)||n(e))),e.navigationSystem.getDeselectUpdate()]),navigateTo:e=>u(t=>(r,n,a,l)=>{let s=p(r,n,a,t,l);if(0===s.length)return r;let d=s.map(t=>"function"==typeof e?e(t):e).filter(i);if(0===d.length)return l?.("no-resolve","Custom selector did not return any navigation state, skipping navigation"),r;d.length>1&&l?.("apply","Multiple navigation states selected, picking the first one",{navigationStates:d});let f=d[0],g=t.navigationSystem.getNavigationUpdate(f),u=r.filter(e=>!o(e));return u.length<r.length?l?.("apply",`Overriding previous navigation updates with ${f}`,{removed:r.filter(e=>o(e)),added:g}):l?.("apply",`Navigating to ${f}`,{added:g}),[...u,g]}),changeView:e=>u(t=>(r,o,s,d)=>{let f=p(r,o,s,t,d);if(0===f.length)return r;let g=f.map(t=>"function"==typeof e?e(t):e).filter(i);if(0===g.length)return d?.("no-resolve","Custom selector did not return any view state, skipping view change"),r;g.length>1&&d?.("apply","Multiple view states selected, picking the first one",{viewStates:g});let u=g[0],c=t.navigationSystem.getViewUpdate(u),h=r.filter(e=>!l(e));return h.length<r.length?d?.("apply",`Overriding previous view state updates with ${u}`,{removed:r.filter(e=>a(e)||n(e)),added:c}):d?.("apply",`Changing view to ${u}`,{added:c}),[...h,c]})})}};
@@ -1,7 +1,5 @@
1
1
  import { Euler, Vector3 } from 'three';
2
- import type { ComponentModification, StateUpdate } from '../../components/updates.js';
3
- import type { ComponentSnapshot } from '../../core/component.js';
4
- import { type $DomainEntity, type DomainEntity, type DomainEntityId } from '../../core/index.js';
2
+ import { type $DomainEntity, type ComponentModification, type ComponentSnapshot, type DomainEntity, type DomainEntityId, type StateUpdate } from '../../core/index.js';
5
3
  import { type DimensionUnit } from '../../dimensions/dimensions.js';
6
4
  import type { ComponentReader } from '../../domain-runtime/domain-context/index.js';
7
5
  import type { PositionProjections } from '../../projections/position-projections.js';
@@ -1,10 +1,10 @@
1
- import type { $DomainEntity, DomainEntity } from '../../core/model.js';
1
+ import type { $DomainEntity, DomainEntity } from '../../core/index.js';
2
2
  import type { DomainContextSystems } from '../domain-context-systems.js';
3
3
  import type { TransformerRegistration, UpdateTransformer } from '../store-system/store-system.js';
4
4
  export type RegisterFunction<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, NAVIGATION_STATES extends string, VIEW_STATES extends string, TOOL_STATES extends string, EXPORT_STATES extends string> = (domainContext: DomainContextSystems<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES>, priority?: number) => TransformerRegistration<ENTITIES>;
5
5
  export type RegistrableTransformer<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, NAVIGATION_STATES extends string, VIEW_STATES extends string, TOOL_STATES extends string, EXPORT_STATES extends string> = {
6
6
  /**
7
- * Creates a registration object consumed in `createTransformers` callback of the app config.
7
+ * Creates a registration object consumed by the runtime spec's `createTransformers` factory.
8
8
  */
9
9
  register: RegisterFunction<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES>;
10
10
  };
@@ -1,10 +1,6 @@
1
- import type { DomainEntityModification, DomainEntityStateDelta, StateUpdate } from '../../components/updates.js';
2
- import type { $DomainEntity, DomainEntity, DomainEntityId } from '../../core/model.js';
3
- import type { DomainState } from '../../core/state.js';
4
- import type { ViolationTypesOf$Entity } from '../../invariants/violation.js';
1
+ import type { $DomainEntity, DomainEntity, DomainEntityId, DomainEntityModification, DomainEntityStateDelta, DomainState, IdSequence, StateUpdate, ViolationTypesOf$Entity } from '../../core/index.js';
5
2
  import type { StateValidationResult } from '../../projections/validation-projections.js';
6
3
  import type { DomainContextSystems } from '../domain-context-systems.js';
7
- import type { IdSequence } from '../store-system/next-domain-entity-id.js';
8
4
  import type { StateEmissionKind, TransformerLogFunction } from '../store-system/store-system.js';
9
5
  export type BaseTransformerBuilderContext<ENTITIES extends DomainEntity<string>, $MAP extends Record<string, $DomainEntity<ENTITIES>>, ALLOWED_ROOT_ENTITIES extends ENTITIES, NAVIGATION_STATES extends string, VIEW_STATES extends string, TOOL_STATES extends string, EXPORT_STATES extends string> = {
10
6
  /**
@@ -1,8 +1,4 @@
1
- import type { exportStateComponent } from '../../components/export-state-component.js';
2
- import type { selectionStateComponent } from '../../components/selection-state-component.js';
3
- import type { DomainEntityCreation, DomainEntityModification, DomainEntityReplacement, EntityDeletion, EphemeralRecordModification } from '../../components/updates.js';
4
- import { type $DomainEntity, type DomainEntity, type DomainEntityId, type EntityByType } from '../../core/model.js';
5
- import type { ViolationTypesOf$Entity } from '../../invariants/violation.js';
1
+ import { type $DomainEntity, type DomainEntity, type DomainEntityCreation, type DomainEntityId, type DomainEntityModification, type DomainEntityReplacement, type EntityByType, type EntityDeletion, type EphemeralRecordModification, type ViolationTypesOf$Entity, type exportStateComponent, type selectionStateComponent } from '../../core/index.js';
6
2
  import type { AllActions } from './actions-builder.js';
7
3
  import type { BaseTransformerBuilderContext, ContextFactoryFilter, DomainEntityModificationUpdateAtField } from './context.js';
8
4
  import type { ThenAndEntityAwareCausesBuilder, ThenBuilder } from './then-builder.js';
@@ -1 +1 @@
1
- import{domainEntityTypeFromId as t,isDomainEntityId as e}from"../../core/model.js";import{isDeselectUpdate as n,isExportUpdate as i,isSelectUpdate as r}from"../navigation-system/navigation-updates.js";import{updateActions as o}from"./actions-builder.js";import{createBaseContext as a}from"./context.js";import{thenAndEntityAwareCausesBuilder as l,thenBuilder as s}from"./then-builder.js";export const entityBuilder=(d,f)=>{let p=(n,i,r,o)=>{let a=r.filter(t=>"replaceDomainEntity"===t.kind);if(0===a.length)return o?.("no-event","No replacement updates found, skipping transformer",{updates:r}),[];let l=a.filter(r=>e(r.entityId)&&(void 0===n||n.includes(t(r.entityId)))&&(void 0===i||i.includes(r.replacementEntity.type)));return 0===l.length?(o?.("no-match",`No replacement from ${n?.join(", ")??"any"} to ${i?.join(", ")??"any"} found, skipping transformer`,{updates:r}),[]):l};return{modified:e=>l(d,o(!0),f()((n,i,r,o,l)=>{let s=n.filter(t=>"modifyDomainEntity"===t.kind);if(0===s.length)return l?.("no-event","No modification updates found, skipping transformer",{updates:n}),[];let f=s.filter(e=>d.includes(t(e.entityId)));if(0===f.length)return l?.("no-match",`No modification updates for entity ${d.join(", ")}, skipping transformer`,{updates:n}),[];let p=f;if(e?.atFields!==void 0){if(0===(p=f.filter(t=>e.atFields.every(e=>Object.hasOwn(t.stateDelta,e)))).length)return l?.("no-match",`Entity ${d.join(", ")} modified, but not at field ${e.atFields.join(", ")}, skipping transformer`,{updates:n}),[];l?.("match",`Entity ${d.join(", ")} modified at field ${e.atFields.join(", ")}, processing transformer`,{updates:n})}else l?.("match",`Entity ${d.join(", ")} modified, processing transformer`,{updates:n});let c=a(o,i,r,n,l);return p.map(t=>{let e=t.entityId;return{...c,getOld$Entity:()=>o.domain.get$Entity(e,i),getNew$Entity:()=>o.domain.get$Entity(e,c.getNewState()),entityId:e,update:t}})})),created:()=>l(d,o(!0),f()((t,e,n,i,r)=>{let o=t.filter(t=>"createDomainEntity"===t.kind);if(0===o.length)return r?.("no-event","No entity creation updates found, skipping transformer",{updates:t}),[];let l=o.filter(t=>d.includes(t.entity.type));if(0===l.length)return r?.("no-match",`No creation updates for entity ${d.join(", ")}, skipping transformer`,{updates:t}),[];r?.("match",`Entity ${d.join(", ")} created, processing transformer`,{updates:t});let s=a(i,e,n,t,r);return l.map(t=>{let e=t.entityId;return{...s,getNew$Entity:()=>i.domain.get$Entity(e,s.getNewState()),entityId:e,update:t}})})),deleted:()=>l(d,o(!0),f()((n,i,r,o,l)=>{let s=n.filter(t=>"deleteEntity"===t.kind);if(0===s.length)return l?.("no-event","No entity deletion updates found, skipping transformer",{updates:n}),[];let f=s.filter(n=>e(n.entityId)&&d.includes(t(n.entityId)));if(0===f.length)return l?.("no-match",`No deletion updates for entity ${d.join(", ")}, skipping transformer`,{updates:n}),[];l?.("match",`Entity ${d.join(", ")} deleted, processing transformer`,{updates:n});let p=a(o,i,r,n,l);return f.map(t=>{let e=t.entityId;return{...p,getOld$Entity:()=>o.domain.get$Entity(e,i),entityId:e,update:t}})})),replaces:t=>l(d,o(!0),f()((e,n,i,r,o)=>{let l=p(t,d,e,o);if(0===l.length)return[];o?.("match",`Entity ${d.join(", ")} replaces ${t.join(", ")??"any"}, processing transformer`,{updates:e});let s=a(r,n,i,e,o);return l.map(t=>{let e=t.entityId,i=t.replacementEntity.id;return{...s,getReplacing$Entity:()=>r.domain.get$Entity(i,s.getNewState()),getReplaced$Entity:()=>r.domain.get$Entity(e,n),entityId:i,update:t}})})),replacedWith:t=>l(d,o(!0),f()((e,n,i,r,o)=>{let l=p(d,t,e,o);if(0===l.length)return[];o?.("match",`Entity ${d.join(", ")} replaced with ${t.join(", ")??"any"}, processing transformer`,{updates:e});let s=a(r,n,i,e,o);return l.map(t=>{let e=t.entityId,i=t.replacementEntity.id;return{...s,getReplacing$Entity:()=>r.domain.get$Entity(i,s.getNewState()),getReplaced$Entity:()=>r.domain.get$Entity(e,n),entityId:e,update:t}})})),selected:n=>l(d,o(!0),f()((i,o,l,s,f)=>{let p=i.filter(r);if(0===p.length)return f?.("no-event","No selection updates found, skipping transformer",{updates:i}),[];let c=p.filter(n=>e(n.writableState.selectedEntityId)&&d.includes(t(n.writableState.selectedEntityId)));if(0===c.length)return f?.("no-match",`No selection updates for entity ${d.join(", ")}, skipping transformer`,{updates:i}),[];let m=s.navigationSystem.getActiveSelectionState(o),y=t(m);if(n?.insteadOf!==void 0&&!n?.insteadOf?.includes(y))return f?.("no-match",`Entity ${d.join(", ")} selected, but not instead of ${d.join(", ")}, skipping transformer`,{updates:i}),[];let g=n?.occurrence??"initial",u="any"===g?c:c.filter(t=>"repeated"===g==(t.writableState.selectedEntityId===m));if(0===u.length)return"initial"===g?f?.("no-match",`Targeting initial selection, but the entity ${d.join(", ")} was res-selected, skipping transformer`,{updates:i}):f?.("no-match",`Targeting repeated selection, but the entity ${d.join(", ")} was selected initially, skipping transformer`,{updates:i}),[];f?.("match",`Entity ${d.join(", ")} selected, processing transformer`,{updates:i});let $=a(s,o,l,i,f);return u.map(t=>{let e=t.writableState.selectedEntityId;return{...$,getSelected$Entity:()=>s.domain.get$Entity(e,$.getNewState()),getDeselected$Entity:()=>s.domain.get$Entity(m,o),entityId:e,update:t}})})),deselected:e=>{if((e?.occurrence==="repeated"||e?.occurrence==="any")&&e?.inFavorOf!==void 0)throw Error("inFavorOf is not supported when occurrence is repeated or any");return l(d,o(!0),f()((i,o,l,s,f)=>{let p=i.filter(t=>r(t)||n(t));if(0===p.length)return f?.("no-event","No selection/deselection updates found, skipping transformer",{updates:i}),[];let c=s.navigationSystem.getActiveSelectionState(o),m=t(c);if(!d.includes(m))return f?.("no-match",`Deselected entity is of type ${m} and not ${d.join(", ")}, skipping transformer`,{updates:i}),[];let y=p.filter(t=>t.writableState.selectedEntityId!==c),g=e?.occurrence??"initial";if(0===y.length&&"initial"===g)return f?.("no-match","Entity has not truly been deselected, skipping transformer",{updates:i}),[];if(y.length>0&&"repeated"===g)return f?.("no-match","Entity has been deselected initially, but target occurrence is repeated, skipping transformer",{updates:i}),[];let u=y.length>0?y:p,$=e?.inFavorOf?u.filter(n=>e.inFavorOf?.includes(t(n.writableState.selectedEntityId))):u;if(0===$.length)return f?.("no-match",`Entity ${c} deselected but not in favor of ${e?.inFavorOf?.join(",")}, skipping transformer`,{updates:i}),[];f?.("match",`Entity ${d.join(", ")} deselected in favor of ${e?.inFavorOf?.join(",")??"any"}, processing transformer`,{updates:i});let h=a(s,o,l,i,f);return $.map(t=>{let e=t.writableState.selectedEntityId;return{...h,getSelected$Entity:()=>s.domain.get$Entity(e,h.getNewState()),getDeselected$Entity:()=>s.domain.get$Entity(c,o),entityId:c,update:t}})}))},violated:n=>s(o(!0),f()((i,r,o,l,s)=>{let{validity:f,state:p}=l.storeSystem.prepareStateEmissionWithoutTransformation(i,r,o);if(f.valid||"uncaught"===f.severity)return s?.("no-event","State is valid, skipping transformer",{validity:f}),[];let c=Array.from(new Set(f.entityViolations.filter(t=>n.includes(t.violation.type)).map(t=>t.entityId)));if(!c)return s?.("no-event",`No violations of type ${n.join(", ")} found, skipping transformer`,{validity:f}),[];let m=c.filter(n=>e(n)&&d.includes(t(n)));if(0===m.length)return s?.("no-match",`No violations of type ${n.join(", ")} found for entity ${d.join(", ")}, skipping transformer`,{validity:f}),[];s?.("no-match",`Violations of type ${n.join(", ")} found for entity ${d.join(", ")}, processing transformer`,{validity:f});let y=a(l,r,o,i,s);return m.map(t=>({...y,getViolated$Entity:()=>l.domain.get$Entity(t,p)}))})),exported:n=>l(d,o(!0),f()((r,o,l,s,f)=>{let p=r.filter(i);if(0===p.length)return f?.("no-event","No export updates found, skipping transformer",{updates:r}),[];let c=p.filter(t=>n.includes(t.writableState.activeState));if(0===c.length)return f?.("no-match",`No export updates matching states ${n.join(", ")}, skipping transformer`,{updates:r}),[];let m=c.filter(n=>e(n.writableState.exportedEntityId)&&d.includes(t(n.writableState.exportedEntityId)));if(0===m.length)return f?.("no-match",`No export updates for entity ${d.join(", ")} with states ${n.join(", ")}, skipping transformer`,{updates:r}),[];f?.("match",`Entity ${d.join(", ")} exported with state ${n.join(", ")}, processing transformer`,{updates:r});let y=a(s,o,l,r,f);return m.map(t=>{let e=t.writableState.exportedEntityId;return{...y,getExported$Entity:()=>s.domain.get$Entity(e,y.getNewState()),entityId:e,update:t,getExportState:()=>t.writableState.activeState}})}))}};
1
+ import{domainEntityTypeFromId as t,isDomainEntityId as e}from"../../core/index.js";import{isDeselectUpdate as n,isExportUpdate as i,isSelectUpdate as r}from"../navigation-system/navigation-updates.js";import{updateActions as o}from"./actions-builder.js";import{createBaseContext as a}from"./context.js";import{thenAndEntityAwareCausesBuilder as l,thenBuilder as s}from"./then-builder.js";export const entityBuilder=(d,f)=>{let p=(n,i,r,o)=>{let a=r.filter(t=>"replaceDomainEntity"===t.kind);if(0===a.length)return o?.("no-event","No replacement updates found, skipping transformer",{updates:r}),[];let l=a.filter(r=>e(r.entityId)&&(void 0===n||n.includes(t(r.entityId)))&&(void 0===i||i.includes(r.replacementEntity.type)));return 0===l.length?(o?.("no-match",`No replacement from ${n?.join(", ")??"any"} to ${i?.join(", ")??"any"} found, skipping transformer`,{updates:r}),[]):l};return{modified:e=>l(d,o(!0),f()((n,i,r,o,l)=>{let s=n.filter(t=>"modifyDomainEntity"===t.kind);if(0===s.length)return l?.("no-event","No modification updates found, skipping transformer",{updates:n}),[];let f=s.filter(e=>d.includes(t(e.entityId)));if(0===f.length)return l?.("no-match",`No modification updates for entity ${d.join(", ")}, skipping transformer`,{updates:n}),[];let p=f;if(e?.atFields!==void 0){if(0===(p=f.filter(t=>e.atFields.every(e=>Object.hasOwn(t.stateDelta,e)))).length)return l?.("no-match",`Entity ${d.join(", ")} modified, but not at field ${e.atFields.join(", ")}, skipping transformer`,{updates:n}),[];l?.("match",`Entity ${d.join(", ")} modified at field ${e.atFields.join(", ")}, processing transformer`,{updates:n})}else l?.("match",`Entity ${d.join(", ")} modified, processing transformer`,{updates:n});let c=a(o,i,r,n,l);return p.map(t=>{let e=t.entityId;return{...c,getOld$Entity:()=>o.domain.get$Entity(e,i),getNew$Entity:()=>o.domain.get$Entity(e,c.getNewState()),entityId:e,update:t}})})),created:()=>l(d,o(!0),f()((t,e,n,i,r)=>{let o=t.filter(t=>"createDomainEntity"===t.kind);if(0===o.length)return r?.("no-event","No entity creation updates found, skipping transformer",{updates:t}),[];let l=o.filter(t=>d.includes(t.entity.type));if(0===l.length)return r?.("no-match",`No creation updates for entity ${d.join(", ")}, skipping transformer`,{updates:t}),[];r?.("match",`Entity ${d.join(", ")} created, processing transformer`,{updates:t});let s=a(i,e,n,t,r);return l.map(t=>{let e=t.entityId;return{...s,getNew$Entity:()=>i.domain.get$Entity(e,s.getNewState()),entityId:e,update:t}})})),deleted:()=>l(d,o(!0),f()((n,i,r,o,l)=>{let s=n.filter(t=>"deleteEntity"===t.kind);if(0===s.length)return l?.("no-event","No entity deletion updates found, skipping transformer",{updates:n}),[];let f=s.filter(n=>e(n.entityId)&&d.includes(t(n.entityId)));if(0===f.length)return l?.("no-match",`No deletion updates for entity ${d.join(", ")}, skipping transformer`,{updates:n}),[];l?.("match",`Entity ${d.join(", ")} deleted, processing transformer`,{updates:n});let p=a(o,i,r,n,l);return f.map(t=>{let e=t.entityId;return{...p,getOld$Entity:()=>o.domain.get$Entity(e,i),entityId:e,update:t}})})),replaces:t=>l(d,o(!0),f()((e,n,i,r,o)=>{let l=p(t,d,e,o);if(0===l.length)return[];o?.("match",`Entity ${d.join(", ")} replaces ${t.join(", ")??"any"}, processing transformer`,{updates:e});let s=a(r,n,i,e,o);return l.map(t=>{let e=t.entityId,i=t.replacementEntity.id;return{...s,getReplacing$Entity:()=>r.domain.get$Entity(i,s.getNewState()),getReplaced$Entity:()=>r.domain.get$Entity(e,n),entityId:i,update:t}})})),replacedWith:t=>l(d,o(!0),f()((e,n,i,r,o)=>{let l=p(d,t,e,o);if(0===l.length)return[];o?.("match",`Entity ${d.join(", ")} replaced with ${t.join(", ")??"any"}, processing transformer`,{updates:e});let s=a(r,n,i,e,o);return l.map(t=>{let e=t.entityId,i=t.replacementEntity.id;return{...s,getReplacing$Entity:()=>r.domain.get$Entity(i,s.getNewState()),getReplaced$Entity:()=>r.domain.get$Entity(e,n),entityId:e,update:t}})})),selected:n=>l(d,o(!0),f()((i,o,l,s,f)=>{let p=i.filter(r);if(0===p.length)return f?.("no-event","No selection updates found, skipping transformer",{updates:i}),[];let c=p.filter(n=>e(n.writableState.selectedEntityId)&&d.includes(t(n.writableState.selectedEntityId)));if(0===c.length)return f?.("no-match",`No selection updates for entity ${d.join(", ")}, skipping transformer`,{updates:i}),[];let m=s.navigationSystem.getActiveSelectionState(o),y=t(m);if(n?.insteadOf!==void 0&&!n?.insteadOf?.includes(y))return f?.("no-match",`Entity ${d.join(", ")} selected, but not instead of ${d.join(", ")}, skipping transformer`,{updates:i}),[];let g=n?.occurrence??"initial",u="any"===g?c:c.filter(t=>"repeated"===g==(t.writableState.selectedEntityId===m));if(0===u.length)return"initial"===g?f?.("no-match",`Targeting initial selection, but the entity ${d.join(", ")} was res-selected, skipping transformer`,{updates:i}):f?.("no-match",`Targeting repeated selection, but the entity ${d.join(", ")} was selected initially, skipping transformer`,{updates:i}),[];f?.("match",`Entity ${d.join(", ")} selected, processing transformer`,{updates:i});let $=a(s,o,l,i,f);return u.map(t=>{let e=t.writableState.selectedEntityId;return{...$,getSelected$Entity:()=>s.domain.get$Entity(e,$.getNewState()),getDeselected$Entity:()=>s.domain.get$Entity(m,o),entityId:e,update:t}})})),deselected:e=>{if((e?.occurrence==="repeated"||e?.occurrence==="any")&&e?.inFavorOf!==void 0)throw Error("inFavorOf is not supported when occurrence is repeated or any");return l(d,o(!0),f()((i,o,l,s,f)=>{let p=i.filter(t=>r(t)||n(t));if(0===p.length)return f?.("no-event","No selection/deselection updates found, skipping transformer",{updates:i}),[];let c=s.navigationSystem.getActiveSelectionState(o),m=t(c);if(!d.includes(m))return f?.("no-match",`Deselected entity is of type ${m} and not ${d.join(", ")}, skipping transformer`,{updates:i}),[];let y=p.filter(t=>t.writableState.selectedEntityId!==c),g=e?.occurrence??"initial";if(0===y.length&&"initial"===g)return f?.("no-match","Entity has not truly been deselected, skipping transformer",{updates:i}),[];if(y.length>0&&"repeated"===g)return f?.("no-match","Entity has been deselected initially, but target occurrence is repeated, skipping transformer",{updates:i}),[];let u=y.length>0?y:p,$=e?.inFavorOf?u.filter(n=>e.inFavorOf?.includes(t(n.writableState.selectedEntityId))):u;if(0===$.length)return f?.("no-match",`Entity ${c} deselected but not in favor of ${e?.inFavorOf?.join(",")}, skipping transformer`,{updates:i}),[];f?.("match",`Entity ${d.join(", ")} deselected in favor of ${e?.inFavorOf?.join(",")??"any"}, processing transformer`,{updates:i});let h=a(s,o,l,i,f);return $.map(t=>{let e=t.writableState.selectedEntityId;return{...h,getSelected$Entity:()=>s.domain.get$Entity(e,h.getNewState()),getDeselected$Entity:()=>s.domain.get$Entity(c,o),entityId:c,update:t}})}))},violated:n=>s(o(!0),f()((i,r,o,l,s)=>{let{validity:f,state:p}=l.storeSystem.prepareStateEmissionWithoutTransformation(i,r,o);if(f.valid||"uncaught"===f.severity)return s?.("no-event","State is valid, skipping transformer",{validity:f}),[];let c=Array.from(new Set(f.entityViolations.filter(t=>n.includes(t.violation.type)).map(t=>t.entityId)));if(!c)return s?.("no-event",`No violations of type ${n.join(", ")} found, skipping transformer`,{validity:f}),[];let m=c.filter(n=>e(n)&&d.includes(t(n)));if(0===m.length)return s?.("no-match",`No violations of type ${n.join(", ")} found for entity ${d.join(", ")}, skipping transformer`,{validity:f}),[];s?.("no-match",`Violations of type ${n.join(", ")} found for entity ${d.join(", ")}, processing transformer`,{validity:f});let y=a(l,r,o,i,s);return m.map(t=>({...y,getViolated$Entity:()=>l.domain.get$Entity(t,p)}))})),exported:n=>l(d,o(!0),f()((r,o,l,s,f)=>{let p=r.filter(i);if(0===p.length)return f?.("no-event","No export updates found, skipping transformer",{updates:r}),[];let c=p.filter(t=>n.includes(t.writableState.activeState));if(0===c.length)return f?.("no-match",`No export updates matching states ${n.join(", ")}, skipping transformer`,{updates:r}),[];let m=c.filter(n=>e(n.writableState.exportedEntityId)&&d.includes(t(n.writableState.exportedEntityId)));if(0===m.length)return f?.("no-match",`No export updates for entity ${d.join(", ")} with states ${n.join(", ")}, skipping transformer`,{updates:r}),[];f?.("match",`Entity ${d.join(", ")} exported with state ${n.join(", ")}, processing transformer`,{updates:r});let y=a(s,o,l,r,f);return m.map(t=>{let e=t.writableState.exportedEntityId;return{...y,getExported$Entity:()=>s.domain.get$Entity(e,y.getNewState()),entityId:e,update:t,getExportState:()=>t.writableState.activeState}})}))}};
@@ -1,5 +1,4 @@
1
- import { type $DomainEntity, type DomainEntity, type DomainEntityId } from '../../core/model.js';
2
- import type { ViolationTypesOf$Entity } from '../../invariants/violation.js';
1
+ import { type $DomainEntity, type DomainEntity, type DomainEntityId, type ViolationTypesOf$Entity } from '../../core/index.js';
3
2
  import type { Actions, ActionsBuilder, AllActions } from './actions-builder.js';
4
3
  import type { BaseTransformerBuilderContext, ContextFactory, ContextWithEntityId, ContextWithUpdate, ContextWithUpdateAndEntityId } from './context.js';
5
4
  export type ThenBuilder<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, NAVIGATION_STATES extends string, VIEW_STATES extends string, TOOL_STATES extends string, EXPORT_STATES extends string, ACTIONS extends AllActions, CTX> = {
@@ -1 +1 @@
1
- import{isNonNullish as t}from"@salsita-ai/common/utils";import{domainEntityTypeFromId as e,isDomainEntityId as i}from"../../core/model.js";import{updateActions as n}from"./actions-builder.js";export const thenBuilder=(t,e)=>({then:t(e),and:i=>({then:t((t,n,r,o,a)=>{let s=e(t,n,r,o,a);if(!s.length)return[];let l=s.filter(i);return l.length||a?.("no-match","Custom `and` predicate did not match any update, skipping transformer"),l})})});export const tagBuilder=(t,e)=>({...thenBuilder(t,e),withTag:i=>thenBuilder(t,(t,n,r,o,a)=>{let s=e(t,n,r,o,a);if(!s.length)return[];let l=s.filter(t=>i.includes(t.update.updateTag));return l.length||a?.("no-match",`No matching update with tag ${i.join(", ")} found, skipping transformer`,{updates:t}),l})});export const causesBuilder=r=>({entity:o=>({withId:e=>({violation:i=>thenBuilder(n(!0),(n,o,a,s,l)=>{let u=r(n,o,a,s,l);if(!u.length)return[];let{validity:d,state:p}=s.storeSystem.prepareStateEmissionWithoutTransformation(n,o,a);if(d.valid||"uncaught"===d.severity)return l?.("no-event","No violations found, skipping transformer"),[];let f=d.entityViolations.filter(t=>i.includes(t.violation.type)).map(t=>t.entityId);if(0===f.length)return l?.("no-match",`No violations of type ${i.join(", ")} found, skipping transformer`),[];let m=u.map(t=>{let i=e(t);return i?{context:t,candidateEntityIds:Array.isArray(i)?i:[i]}:null}).filter(t);if(0===m.length)return l?.("no-resolve","No entities returned by the selector, skipping transformer"),[];let h=m.map(t=>({...t,violatedEntityIds:t.candidateEntityIds.filter(t=>f.includes(t))})).filter(t=>t.violatedEntityIds.length>0);return 0===h.length?(l?.("no-match",`No violations of type ${i.join(", ")} found for entities returned by the selector, skipping transformer`,{violatedEntityIds:f}),[]):h.map(t=>({...t.context,getViolated$Entities:()=>t.violatedEntityIds.map(t=>s.domain.get$Entity(t,p))}))})}),violation:a=>thenBuilder(n(!0),(n,s,l,u,d)=>{let{validity:p,state:f}=u.storeSystem.prepareStateEmissionWithoutTransformation(n,s,l);if(p.valid||"uncaught"===p.severity)return[];let m=p.entityViolations.map(t=>a.includes(t.violation.type)&&i(t.entityId)&&o.includes(e(t.entityId))?t.entityId:null).filter(t),h=r(n,s,l,u,d);return 0===m.length?[]:h.map(t=>({...t,getViolated$Entities:()=>m.map(t=>u.domain.get$Entity(t,f))}))})})});export const entityAwareCausesBuilder=(t,e)=>({...causesBuilder(e),self:{violation:i=>thenBuilder(n(!0),(n,r,o,a,s)=>{let{validity:l}=a.storeSystem.prepareStateEmissionWithoutTransformation(n,r,o);if(l.valid)return s?.("no-event","No violations found, skipping transformer",{validity:l}),[];if("uncaught"===l.severity)return s?.("no-event","Uncaught exception encountered while calculating new state, skipping transformer",{updates:n}),[];let u=new Set(l.entityViolations.filter(t=>i.includes(t.violation.type)).map(t=>t.entityId));if(0===u.size)return s?.("no-match",`No violations of type ${i.join(", ")} found for the ${t.join(", ")} entities, skipping transformer`,{entityIds:Array.from(u)}),[];let d=e(n,r,o,a,s),p=d.filter(t=>u.has(t.entityId));return 0===p.length&&s?.("no-match",`No violations of type ${i.join(", ")} found for entity ${d.map(t=>t.entityId).join(", ")}, skipping transformer`,{updates:n}),p})}});export const thenAndEntityAwareCausesBuilder=(t,e,i)=>({...tagBuilder(e,i),causes:entityAwareCausesBuilder(t,i)});export const thenAndCausesBuilder=(t,e)=>({...tagBuilder(t,e),causes:causesBuilder(e)});
1
+ import{isNonNullish as t}from"@salsita-ai/common/utils";import{domainEntityTypeFromId as e,isDomainEntityId as i}from"../../core/index.js";import{updateActions as n}from"./actions-builder.js";export const thenBuilder=(t,e)=>({then:t(e),and:i=>({then:t((t,n,r,o,a)=>{let s=e(t,n,r,o,a);if(!s.length)return[];let l=s.filter(i);return l.length||a?.("no-match","Custom `and` predicate did not match any update, skipping transformer"),l})})});export const tagBuilder=(t,e)=>({...thenBuilder(t,e),withTag:i=>thenBuilder(t,(t,n,r,o,a)=>{let s=e(t,n,r,o,a);if(!s.length)return[];let l=s.filter(t=>i.includes(t.update.updateTag));return l.length||a?.("no-match",`No matching update with tag ${i.join(", ")} found, skipping transformer`,{updates:t}),l})});export const causesBuilder=r=>({entity:o=>({withId:e=>({violation:i=>thenBuilder(n(!0),(n,o,a,s,l)=>{let u=r(n,o,a,s,l);if(!u.length)return[];let{validity:d,state:p}=s.storeSystem.prepareStateEmissionWithoutTransformation(n,o,a);if(d.valid||"uncaught"===d.severity)return l?.("no-event","No violations found, skipping transformer"),[];let f=d.entityViolations.filter(t=>i.includes(t.violation.type)).map(t=>t.entityId);if(0===f.length)return l?.("no-match",`No violations of type ${i.join(", ")} found, skipping transformer`),[];let m=u.map(t=>{let i=e(t);return i?{context:t,candidateEntityIds:Array.isArray(i)?i:[i]}:null}).filter(t);if(0===m.length)return l?.("no-resolve","No entities returned by the selector, skipping transformer"),[];let h=m.map(t=>({...t,violatedEntityIds:t.candidateEntityIds.filter(t=>f.includes(t))})).filter(t=>t.violatedEntityIds.length>0);return 0===h.length?(l?.("no-match",`No violations of type ${i.join(", ")} found for entities returned by the selector, skipping transformer`,{violatedEntityIds:f}),[]):h.map(t=>({...t.context,getViolated$Entities:()=>t.violatedEntityIds.map(t=>s.domain.get$Entity(t,p))}))})}),violation:a=>thenBuilder(n(!0),(n,s,l,u,d)=>{let{validity:p,state:f}=u.storeSystem.prepareStateEmissionWithoutTransformation(n,s,l);if(p.valid||"uncaught"===p.severity)return[];let m=p.entityViolations.map(t=>a.includes(t.violation.type)&&i(t.entityId)&&o.includes(e(t.entityId))?t.entityId:null).filter(t),h=r(n,s,l,u,d);return 0===m.length?[]:h.map(t=>({...t,getViolated$Entities:()=>m.map(t=>u.domain.get$Entity(t,f))}))})})});export const entityAwareCausesBuilder=(t,e)=>({...causesBuilder(e),self:{violation:i=>thenBuilder(n(!0),(n,r,o,a,s)=>{let{validity:l}=a.storeSystem.prepareStateEmissionWithoutTransformation(n,r,o);if(l.valid)return s?.("no-event","No violations found, skipping transformer",{validity:l}),[];if("uncaught"===l.severity)return s?.("no-event","Uncaught exception encountered while calculating new state, skipping transformer",{updates:n}),[];let u=new Set(l.entityViolations.filter(t=>i.includes(t.violation.type)).map(t=>t.entityId));if(0===u.size)return s?.("no-match",`No violations of type ${i.join(", ")} found for the ${t.join(", ")} entities, skipping transformer`,{entityIds:Array.from(u)}),[];let d=e(n,r,o,a,s),p=d.filter(t=>u.has(t.entityId));return 0===p.length&&s?.("no-match",`No violations of type ${i.join(", ")} found for entity ${d.map(t=>t.entityId).join(", ")}, skipping transformer`,{updates:n}),p})}});export const thenAndEntityAwareCausesBuilder=(t,e,i)=>({...tagBuilder(e,i),causes:entityAwareCausesBuilder(t,i)});export const thenAndCausesBuilder=(t,e)=>({...tagBuilder(t,e),causes:causesBuilder(e)});
@@ -1,9 +1,4 @@
1
- import type { navigationStateComponent } from '../../components/navigation-state-component.js';
2
- import type { toolStateComponent } from '../../components/tool-state-component.js';
3
- import type { ComponentModification, EphemeralRecordModification, StateUpdate } from '../../components/updates.js';
4
- import type { viewStateComponent } from '../../components/view-state-component.js';
5
- import type { SystemComponentTypeConstraint } from '../../core/component.js';
6
- import { type $DomainEntity, type DomainEntity, type DomainEntityId } from '../../core/model.js';
1
+ import { type $DomainEntity, type ComponentModification, type DomainEntity, type DomainEntityId, type EphemeralRecordModification, type StateUpdate, type SystemComponentTypeConstraint, type navigationStateComponent, type toolStateComponent, type viewStateComponent } from '../../core/index.js';
7
2
  import type { DragHandleComponent } from '../../system-components/drag-handle.js';
8
3
  import type { HotspotDragHandleComponent } from '../../system-components/hotspot-drag-handle.js';
9
4
  import type { StateEmissionKind } from '../store-system/store-system.js';
@@ -1 +1 @@
1
- import{domainEntityTypeFromId as t,isDomainEntityId as e}from"../../core/model.js";import{isNavigationUpdate as n,isToolUpdate as o,isViewUpdate as i}from"../navigation-system/navigation-updates.js";import{updateActions as r}from"./actions-builder.js";import{isAutoSnapUpdate as a}from"./auto-snap-transformer.js";import{createBaseContext as s}from"./context.js";import{entityBuilder as m}from"./entity-builder.js";import{tagBuilder as l,thenAndCausesBuilder as f,thenBuilder as d}from"./then-builder.js";let p=n=>({...l(r(!1),n),onEntity:o=>l(r(!1),(i,r,a,s,m)=>{let l=n(i,r,a,s,m);if(!l.length)return[];let f=l.filter(n=>e(n.update.entityId)&&o.includes(t(n.update.entityId)));return f.length||m?.("no-match",`No matching update for entity ${o.join(", ")} found, skipping transformer`,{updates:i}),f.map(t=>{let e=t.update.entityId;return{...t,getOld$Entity:()=>s.domain.get$Entity(e,r),getNew$Entity:()=>s.domain.get$Entity(e,t.getNewState()),entityId:e}})})}),g=(t,e,n)=>p(t()((t,o,i,r,a)=>{let m=t.filter(t=>"modifyComponent"===t.kind);if(0===m.length)return a?.("no-event","No component modification updates found, skipping transformer",{updates:t}),[];let l=m.filter(t=>e.includes(t.componentInstance.componentType));return 0===l.length?(a?.("no-match",`No modification updates for component ${e.join(", ")}, skipping transformer`,{updates:t}),[]):(void 0===n?l:l.filter(t=>n.includes(t.componentInstance.instanceName))).map(e=>({...s(r,o,i,t,a),update:e}))}));export const whenBuilder=t=>({component:e=>({modified:g(t,e),instance:n=>({modified:g(t,e,n)})}),update:e=>({fired:p(t()((t,n,o,i,r)=>{let a=t.filter(t=>e.includes(t.kind));return 0===a.length?(r?.("no-event",`No updates of kind ${e.join(", ")} found, skipping transformer`,{updates:t}),[]):a.map(e=>({...s(i,n,o,t,r),update:e}))}))}),entity:e=>m(e,t),snapped:()=>f(r(!0),t()((t,e,n,o,i)=>{let r=t.filter(a);if(0===r.length)return i?.("no-event","No auto-snap updates found, skipping transformer",{updates:t}),[];i?.("match",`Found ${r.length} auto-snap update(s), processing transformer`);let m=s(o,e,n,t,i);return r.map(t=>({...m,update:t,entityId:t.componentInstance.entityId,snapMatch:t.metadata.snapMatch,snapType:t.metadata.snapType}))})),navigated:e=>f(r(!0),t()((t,o,i,r,a)=>{let m=t.filter(n);if(0===m.length)return a?.("no-event","No navigation updates found, skipping transformer",{updates:t}),[];let l=m.filter(t=>{let n=t.writableState.activeState,i=r.navigationSystem.getActiveNavigationState(o);return(e?.to===void 0||e.to.includes(n))&&(e?.from===void 0||e.from.includes(i))});if(0===l.length)return a?.("no-match",`No navigation updates matching filter from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, skipping transformer`,{updates:t}),[];a?.("match",`Navigation state changed from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, processing transformer`,{updates:t});let f=s(r,o,i,t,a);return l.map(t=>{let e=t.writableState.activeState,n=r.navigationSystem.getActiveNavigationState(o);return{...f,update:t,getFrom:()=>n,getTo:()=>e}})})),viewChanged:e=>f(r(!0),t()((t,n,o,r,a)=>{let m=t.filter(i);if(0===m.length)return a?.("no-event","No view updates found, skipping transformer",{updates:t}),[];let l=m.filter(t=>{let o=t.writableState.activeState,i=r.navigationSystem.getActiveViewState(n);return(e?.to===void 0||e.to.includes(o))&&(e?.from===void 0||e.from.includes(i))});if(0===l.length)return a?.("no-match",`No view updates matching filter from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, skipping transformer`,{updates:t}),[];a?.("match",`View state changed from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, processing transformer`,{updates:t});let f=s(r,n,o,t,a);return l.map(t=>{let e=t.writableState.activeState,o=r.navigationSystem.getActiveViewState(n);return{...f,update:t,getFrom:()=>o,getTo:()=>e}})})),toolChanged:e=>f(r(!0),t()((t,n,i,r,a)=>{let m=t.filter(o);if(0===m.length)return a?.("no-event","No tool updates found, skipping transformer",{updates:t}),[];let l=m.filter(t=>{let o=t.writableState.activeState,i=r.navigationSystem.getActiveToolState(n);return(e?.to===void 0||e.to.includes(o))&&(e?.from===void 0||e.from.includes(i))});if(0===l.length)return a?.("no-match",`No tool updates matching filter from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, skipping transformer`,{updates:t}),[];a?.("match",`Tool state changed from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, processing transformer`,{updates:t});let f=s(r,n,i,t,a);return l.map(t=>{let e=t.writableState.activeState,o=r.navigationSystem.getActiveToolState(n);return{...f,update:t,getFrom:()=>o,getTo:()=>e}})}))});export const createTransformerBuilder=()=>({when:whenBuilder(()=>t=>t),onEmissionsOfKind:t=>({when:whenBuilder(()=>e=>(n,o,i,r,a)=>t.includes(i)?e(n,o,i,r,a):(a?.("no-event",`Emission kind ${i} is not supposed to trigger this transformer, only ${t.join(", ")} is, skipping transformer`,{updates:n}),[]))}),always:d(r(!1),(t,e,n,o,i)=>[s(o,e,n,t,i)])});
1
+ import{domainEntityTypeFromId as t,isDomainEntityId as e}from"../../core/index.js";import{isNavigationUpdate as n,isToolUpdate as o,isViewUpdate as i}from"../navigation-system/navigation-updates.js";import{updateActions as r}from"./actions-builder.js";import{isAutoSnapUpdate as a}from"./auto-snap-transformer.js";import{createBaseContext as s}from"./context.js";import{entityBuilder as m}from"./entity-builder.js";import{tagBuilder as f,thenAndCausesBuilder as l,thenBuilder as d}from"./then-builder.js";let p=n=>({...f(r(!1),n),onEntity:o=>f(r(!1),(i,r,a,s,m)=>{let f=n(i,r,a,s,m);if(!f.length)return[];let l=f.filter(n=>e(n.update.entityId)&&o.includes(t(n.update.entityId)));return l.length||m?.("no-match",`No matching update for entity ${o.join(", ")} found, skipping transformer`,{updates:i}),l.map(t=>{let e=t.update.entityId;return{...t,getOld$Entity:()=>s.domain.get$Entity(e,r),getNew$Entity:()=>s.domain.get$Entity(e,t.getNewState()),entityId:e}})})}),g=(t,e,n)=>p(t()((t,o,i,r,a)=>{let m=t.filter(t=>"modifyComponent"===t.kind);if(0===m.length)return a?.("no-event","No component modification updates found, skipping transformer",{updates:t}),[];let f=m.filter(t=>e.includes(t.componentInstance.componentType));return 0===f.length?(a?.("no-match",`No modification updates for component ${e.join(", ")}, skipping transformer`,{updates:t}),[]):(void 0===n?f:f.filter(t=>n.includes(t.componentInstance.instanceName))).map(e=>({...s(r,o,i,t,a),update:e}))}));export const whenBuilder=t=>({component:e=>({modified:g(t,e),instance:n=>({modified:g(t,e,n)})}),update:e=>({fired:p(t()((t,n,o,i,r)=>{let a=t.filter(t=>e.includes(t.kind));return 0===a.length?(r?.("no-event",`No updates of kind ${e.join(", ")} found, skipping transformer`,{updates:t}),[]):a.map(e=>({...s(i,n,o,t,r),update:e}))}))}),entity:e=>m(e,t),snapped:()=>l(r(!0),t()((t,e,n,o,i)=>{let r=t.filter(a);if(0===r.length)return i?.("no-event","No auto-snap updates found, skipping transformer",{updates:t}),[];i?.("match",`Found ${r.length} auto-snap update(s), processing transformer`);let m=s(o,e,n,t,i);return r.map(t=>({...m,update:t,entityId:t.componentInstance.entityId,snapMatch:t.metadata.snapMatch,snapType:t.metadata.snapType}))})),navigated:e=>l(r(!0),t()((t,o,i,r,a)=>{let m=t.filter(n);if(0===m.length)return a?.("no-event","No navigation updates found, skipping transformer",{updates:t}),[];let f=m.filter(t=>{let n=t.writableState.activeState,i=r.navigationSystem.getActiveNavigationState(o);return(e?.to===void 0||e.to.includes(n))&&(e?.from===void 0||e.from.includes(i))});if(0===f.length)return a?.("no-match",`No navigation updates matching filter from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, skipping transformer`,{updates:t}),[];a?.("match",`Navigation state changed from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, processing transformer`,{updates:t});let l=s(r,o,i,t,a);return f.map(t=>{let e=t.writableState.activeState,n=r.navigationSystem.getActiveNavigationState(o);return{...l,update:t,getFrom:()=>n,getTo:()=>e}})})),viewChanged:e=>l(r(!0),t()((t,n,o,r,a)=>{let m=t.filter(i);if(0===m.length)return a?.("no-event","No view updates found, skipping transformer",{updates:t}),[];let f=m.filter(t=>{let o=t.writableState.activeState,i=r.navigationSystem.getActiveViewState(n);return(e?.to===void 0||e.to.includes(o))&&(e?.from===void 0||e.from.includes(i))});if(0===f.length)return a?.("no-match",`No view updates matching filter from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, skipping transformer`,{updates:t}),[];a?.("match",`View state changed from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, processing transformer`,{updates:t});let l=s(r,n,o,t,a);return f.map(t=>{let e=t.writableState.activeState,o=r.navigationSystem.getActiveViewState(n);return{...l,update:t,getFrom:()=>o,getTo:()=>e}})})),toolChanged:e=>l(r(!0),t()((t,n,i,r,a)=>{let m=t.filter(o);if(0===m.length)return a?.("no-event","No tool updates found, skipping transformer",{updates:t}),[];let f=m.filter(t=>{let o=t.writableState.activeState,i=r.navigationSystem.getActiveToolState(n);return(e?.to===void 0||e.to.includes(o))&&(e?.from===void 0||e.from.includes(i))});if(0===f.length)return a?.("no-match",`No tool updates matching filter from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, skipping transformer`,{updates:t}),[];a?.("match",`Tool state changed from ${e?.from?.join(", ")??"any"} to ${e?.to?.join(", ")??"any"}, processing transformer`,{updates:t});let l=s(r,n,i,t,a);return f.map(t=>{let e=t.writableState.activeState,o=r.navigationSystem.getActiveToolState(n);return{...l,update:t,getFrom:()=>o,getTo:()=>e}})}))});export const createTransformerBuilder=()=>({when:whenBuilder(()=>t=>t),onEmissionsOfKind:t=>({when:whenBuilder(()=>e=>(n,o,i,r,a)=>t.includes(i)?e(n,o,i,r,a):(a?.("no-event",`Emission kind ${i} is not supposed to trigger this transformer, only ${t.join(", ")} is, skipping transformer`,{updates:n}),[]))}),always:d(r(!1),(t,e,n,o,i)=>[s(o,e,n,t,i)])});
@@ -1,5 +1,5 @@
1
1
  import type { ObservableWithLastValue } from '@salsita-ai/common/utils';
2
- import type { $DomainEntity, DomainEntity } from '../core/model.js';
2
+ import type { $DomainEntity, DomainEntity } from '../core/index.js';
3
3
  import type { DomainContextSelectors } from '../domain-runtime/domain-context/index.js';
4
4
  import type { ResetStateEmission, StateEmission } from './store-system/store-system.js';
5
5
  export interface UndoCapabilities {
@@ -1,7 +1,4 @@
1
- import type { FilteredOutComponentSnapshot, ManyComponentFilter, OneComponentFilter } from '../../components/component-reader-types.js';
2
- import { type ComponentSnapshot, type SystemComponentTypeConstraint } from '../../core/component.js';
3
- import type { DomainEntity, EntityId } from '../../core/model.js';
4
- import type { DomainState } from '../../core/state.js';
1
+ import { type ComponentSnapshot, type DomainEntity, type DomainState, type EntityId, type FilteredOutComponentSnapshot, type ManyComponentFilter, type OneComponentFilter, type SystemComponentTypeConstraint } from '../../core/index.js';
5
2
  import type { DomainContextSelectors } from './selectors.js';
6
3
  export interface ComponentReaderContext {
7
4
  readonly selectors: DomainContextSelectors;
@@ -1 +1 @@
1
- import{getComponentSystemFilterState as e,isComponentActive as n}from"../../components/system-component-filter.js";import{domainEntityTypeFromId as t,isDomainEntityId as o}from"../../core/model.js";let i=class InternalFilter{componentTypes;entityIds;instanceNames;constructor(e){"entityId"in e&&void 0!==e.entityId&&(this.entityIds=new Set([e.entityId])),"entityIds"in e&&void 0!==e.entityIds&&(this.entityIds=new Set(e.entityIds)),"instanceName"in e&&void 0!==e.instanceName&&(this.instanceNames=new Set([e.instanceName])),"instanceNames"in e&&void 0!==e.instanceNames&&(this.instanceNames=new Set(e.instanceNames)),"componentType"in e&&void 0!==e.componentType&&(this.componentTypes=new Set([e.componentType])),"componentTypes"in e&&void 0!==e.componentTypes&&(this.componentTypes=new Set(e.componentTypes))}toString(){let e=this.instanceNames&&Array.from(this.instanceNames).join(", "),n=this.componentTypes&&Array.from(this.componentTypes).map(e=>e.name).join(", "),t=this.entityIds&&Array.from(this.entityIds).map(e=>`#${String(e)}`).join(", ");return[e?`instance ${e} of`:void 0,n?`component ${n}`:void 0,t?`on entity ${t}`:void 0].filter(Boolean).join(" ")}},s=new WeakMap;export class ComponentReader{_context;constructor(e){this._context=e}_resolveDynamicInstanceName=(e,n,t,o)=>{let i=o.dynamicInstanceNames.get(e)?.get(n);if(!i)return null;for(let e of i)if(t.startsWith(`${e}_`))return e;return null};_readComponents(i,a,c,m=!1){let p=e(a),r=this._context.selectors.getExpressionContext(),l=this._context.selectors.getComponentReaderIndexes(),d=[],y=void 0!==i.entityIds?[]:void 0;if(void 0!==i.entityIds)for(let e of i.entityIds)o(e)&&y?.push(e);if(void 0===y||y.length>0){let e=y??a.entities,o=void 0!==y?new Map:void 0;for(let y of e){let e="string"==typeof y?y:y.id;if(void 0!==o){if(o.has(e))continue;o.set(e,!0)}let f="string"==typeof y?t(e):y.type;for(let t of i.componentTypes??l.allComponentTypes.get(f)??[])for(let o of i.instanceNames??l.allComponentInstanceNames.get(f)?.get(t)??[]){let i=l.opticMap.get(f)?.get(t)?.get(o),y=i?null:this._resolveDynamicInstanceName(f,t,o,l),h=y?l.opticMap.get(f)?.get(t)?.get(y):void 0,I=i??h;if(!I)continue;let u=0===I.navigationFilters.length||n(p,I.navigationFilters,e,a,r,m);if(!0!==u){m&&d.push({componentInstance:{componentType:t,entityId:e,instanceName:o},filteredOut:!0,filterState:p,filterContext:{mode:r.mode,role:r.role},mismatchReasons:u});continue}if("simple"===I.kind){let n=I.read(e,a,r),t=s.get(n);if(!t||t.componentInstance.entityId!==e||t.componentInstance.componentType!==I.componentType||t.componentInstance.instanceName!==I.instanceName){let o={state:n,componentInstance:{componentType:I.componentType,entityId:e,instanceName:I.instanceName}};s.set(n,o),t=o}if(d.push(t),c)return d}else{let n=I.read(e,a,r),t=new Set;for(let i of n){let n=I.instanceName+`_${i.key}`;if(null!==y&&o!==n)continue;if(t.has(n))throw Error(`Cannot read dynamic component instance ${I.instanceName} for component ${I.componentType.name} on entity ${e} because it emitted duplicate compound instance ${n}. Make emitted keys unique for this component instance.`);t.add(n);let a=s.get(i);if(!a||a.componentInstance.entityId!==e||a.componentInstance.componentType!==I.componentType||a.componentInstance.instanceName!==n){let t={state:function(e){let n={};for(let t in e)"key"!==t&&(n[t]=e[t]);return n}(i),componentInstance:{componentType:I.componentType,entityId:e,instanceName:n}};s.set(i,t),a=t}if(d.push(a),c)return d}}}}}for(let e of a.ephemeralRecords)if((void 0===i.entityIds||i.entityIds.has(e.componentInstance.entityId))&&(void 0===i.componentTypes||i.componentTypes.has(e.componentInstance.componentType))&&(void 0===i.instanceNames||i.instanceNames.has(e.componentInstance.instanceName))&&(d.push(e),c))break;return d}readOneComponent(e,n){let t=new i(e),o=this._readComponents(t,n,!1);if(o.length>1)throw Error(`Expected component ${e.componentType.name} to be attached only once to entity #${String(e.entityId)}, but found ${o.length} instances`);return o.length>0?o[0]:null}readManyComponents(e,n){let t=new i(e);return this._readComponents(t,n,!1)}readFirstComponent(e,n){let t=new i(e),o=this._readComponents(t,n,!0);return o.length>0?o[0]:null}readFirstRootComponent(e,n){let t=new i({...e,entityIds:[n.rootEntityId]}),o=this._readComponents(t,n,!0);return o.length>0?o[0]:null}readOneComponentOrThrow(e,n){let t=this.readOneComponent(e,n);if(null===t){let n=new i(e);throw Error(`Cannot read ${n.toString()} because such component is not attached`)}return t}isComponentTypeAttached=e=>{let n,i,s,{componentTypes:a,instanceNames:c,entityTypes:m}=("componentTypes"in e&&(n=e.componentTypes),"componentType"in e&&e.componentType&&(n=[e.componentType]),"instanceNames"in e&&(i=e.instanceNames),"instanceName"in e&&e.instanceName&&(i=[e.instanceName]),"entityIds"in e&&e.entityIds&&(s=e.entityIds.filter(o).map(e=>t(e))),"entityId"in e&&e.entityId&&(s=o(e.entityId)?[t(e.entityId)]:[]),{componentTypes:n,instanceNames:i,entityTypes:s}),p=this._context.selectors.getComponentReaderIndexes();for(let e of m??Array.from(p.allComponentTypes.keys()))for(let n of a??p.allComponentTypes.get(e)??[])for(let t of c??p.allComponentInstanceNames.get(e)?.get(n)??[])if(p.opticMap.get(e)?.get(n)?.get(t)||this._resolveDynamicInstanceName(e,n,t,p))return!0;return!1};peekManyComponents(e,n){let t=new i(e);return this._readComponents(t,n,!1,!0)}}
1
+ import{domainEntityTypeFromId as e,getComponentSystemFilterState as n,isComponentActive as t,isDomainEntityId as o}from"../../core/index.js";let i=class InternalFilter{componentTypes;entityIds;instanceNames;constructor(e){"entityId"in e&&void 0!==e.entityId&&(this.entityIds=new Set([e.entityId])),"entityIds"in e&&void 0!==e.entityIds&&(this.entityIds=new Set(e.entityIds)),"instanceName"in e&&void 0!==e.instanceName&&(this.instanceNames=new Set([e.instanceName])),"instanceNames"in e&&void 0!==e.instanceNames&&(this.instanceNames=new Set(e.instanceNames)),"componentType"in e&&void 0!==e.componentType&&(this.componentTypes=new Set([e.componentType])),"componentTypes"in e&&void 0!==e.componentTypes&&(this.componentTypes=new Set(e.componentTypes))}toString(){let e=this.instanceNames&&Array.from(this.instanceNames).join(", "),n=this.componentTypes&&Array.from(this.componentTypes).map(e=>e.name).join(", "),t=this.entityIds&&Array.from(this.entityIds).map(e=>`#${String(e)}`).join(", ");return[e?`instance ${e} of`:void 0,n?`component ${n}`:void 0,t?`on entity ${t}`:void 0].filter(Boolean).join(" ")}},s=new WeakMap;export class ComponentReader{_context;constructor(e){this._context=e}_resolveDynamicInstanceName=(e,n,t,o)=>{let i=o.dynamicInstanceNames.get(e)?.get(n);if(!i)return null;for(let e of i)if(t.startsWith(`${e}_`))return e;return null};_readComponents(i,a,c,p=!1){let m=n(a),r=this._context.selectors.getExpressionContext(),l=this._context.selectors.getComponentReaderIndexes(),d=[],y=void 0!==i.entityIds?[]:void 0;if(void 0!==i.entityIds)for(let e of i.entityIds)o(e)&&y?.push(e);if(void 0===y||y.length>0){let n=y??a.entities,o=void 0!==y?new Map:void 0;for(let y of n){let n="string"==typeof y?y:y.id;if(void 0!==o){if(o.has(n))continue;o.set(n,!0)}let f="string"==typeof y?e(n):y.type;for(let e of i.componentTypes??l.allComponentTypes.get(f)??[])for(let o of i.instanceNames??l.allComponentInstanceNames.get(f)?.get(e)??[]){let i=l.opticMap.get(f)?.get(e)?.get(o),y=i?null:this._resolveDynamicInstanceName(f,e,o,l),h=y?l.opticMap.get(f)?.get(e)?.get(y):void 0,I=i??h;if(!I)continue;let u=0===I.navigationFilters.length||t(m,I.navigationFilters,n,a,r,p);if(!0!==u){p&&d.push({componentInstance:{componentType:e,entityId:n,instanceName:o},filteredOut:!0,filterState:m,filterContext:{mode:r.mode,role:r.role},mismatchReasons:u});continue}if("simple"===I.kind){let e=I.read(n,a,r),t=s.get(e);if(!t||t.componentInstance.entityId!==n||t.componentInstance.componentType!==I.componentType||t.componentInstance.instanceName!==I.instanceName){let o={state:e,componentInstance:{componentType:I.componentType,entityId:n,instanceName:I.instanceName}};s.set(e,o),t=o}if(d.push(t),c)return d}else{let e=I.read(n,a,r),t=new Set;for(let i of e){let e=I.instanceName+`_${i.key}`;if(null!==y&&o!==e)continue;if(t.has(e))throw Error(`Cannot read dynamic component instance ${I.instanceName} for component ${I.componentType.name} on entity ${n} because it emitted duplicate compound instance ${e}. Make emitted keys unique for this component instance.`);t.add(e);let a=s.get(i);if(!a||a.componentInstance.entityId!==n||a.componentInstance.componentType!==I.componentType||a.componentInstance.instanceName!==e){let t={state:function(e){let n={};for(let t in e)"key"!==t&&(n[t]=e[t]);return n}(i),componentInstance:{componentType:I.componentType,entityId:n,instanceName:e}};s.set(i,t),a=t}if(d.push(a),c)return d}}}}}for(let e of a.ephemeralRecords)if((void 0===i.entityIds||i.entityIds.has(e.componentInstance.entityId))&&(void 0===i.componentTypes||i.componentTypes.has(e.componentInstance.componentType))&&(void 0===i.instanceNames||i.instanceNames.has(e.componentInstance.instanceName))&&(d.push(e),c))break;return d}readOneComponent(e,n){let t=new i(e),o=this._readComponents(t,n,!1);if(o.length>1)throw Error(`Expected component ${e.componentType.name} to be attached only once to entity #${String(e.entityId)}, but found ${o.length} instances`);return o.length>0?o[0]:null}readManyComponents(e,n){let t=new i(e);return this._readComponents(t,n,!1)}readFirstComponent(e,n){let t=new i(e),o=this._readComponents(t,n,!0);return o.length>0?o[0]:null}readFirstRootComponent(e,n){let t=new i({...e,entityIds:[n.rootEntityId]}),o=this._readComponents(t,n,!0);return o.length>0?o[0]:null}readOneComponentOrThrow(e,n){let t=this.readOneComponent(e,n);if(null===t){let n=new i(e);throw Error(`Cannot read ${n.toString()} because such component is not attached`)}return t}isComponentTypeAttached=n=>{let t,i,s,{componentTypes:a,instanceNames:c,entityTypes:p}=("componentTypes"in n&&(t=n.componentTypes),"componentType"in n&&n.componentType&&(t=[n.componentType]),"instanceNames"in n&&(i=n.instanceNames),"instanceName"in n&&n.instanceName&&(i=[n.instanceName]),"entityIds"in n&&n.entityIds&&(s=n.entityIds.filter(o).map(n=>e(n))),"entityId"in n&&n.entityId&&(s=o(n.entityId)?[e(n.entityId)]:[]),{componentTypes:t,instanceNames:i,entityTypes:s}),m=this._context.selectors.getComponentReaderIndexes();for(let e of p??Array.from(m.allComponentTypes.keys()))for(let n of a??m.allComponentTypes.get(e)??[])for(let t of c??m.allComponentInstanceNames.get(e)?.get(n)??[])if(m.opticMap.get(e)?.get(n)?.get(t)||this._resolveDynamicInstanceName(e,n,t,m))return!0;return!1};peekManyComponents(e,n){let t=new i(e);return this._readComponents(t,n,!1,!0)}}
@@ -1,6 +1,4 @@
1
- import type { DomainComponentOptic } from '../../components/index.js';
2
- import { type AnyDomain } from '../../core/domain.js';
3
- import type { AnyDomainFactory, AnyExpressionContext, DomainEntity, DomainMode, SystemComponentTypeConstraint } from '../../core/index.js';
1
+ import { type AnyDomain, type AnyDomainFactory, type AnyExpressionContext, type DomainComponentOptic, type DomainEntity, type DomainMode, type SystemComponentTypeConstraint } from '../../core/index.js';
4
2
  import { type AnyActionSystem } from '../../domain-context/action-system/action-system.js';
5
3
  import { type AnyDimensionSystem } from '../../domain-context/dimension-system/dimension-system.js';
6
4
  import type { AnyDomainContextSystems } from '../../domain-context/domain-context-systems.js';
@@ -16,7 +14,7 @@ import type { DomainServicesSelectors } from '../domain-services/index.js';
16
14
  import type { EnvironmentSelectors } from '../environment/index.js';
17
15
  import type { ApplicationLoadedData } from '../loaded-data/index.js';
18
16
  import type { DomainSessionContext, SessionContextSelectorState, SessionContextSelectors } from '../session-context/index.js';
19
- import type { SpecSelectorState, SpecSelectors } from '../spec/index.js';
17
+ import { type SpecSelectorState, type SpecSelectors } from '../spec/index.js';
20
18
  import type { WebComponentSelectorState, WebComponentSelectors } from '../web-component/index.js';
21
19
  import type { DomainContextApplicationActions } from './actions.js';
22
20
  import { type AnyComponentReader } from './component-reader.js';