@salsita-ai/sdk 0.50.0-develop.0ef5d49cfb → 0.50.0-develop.1162eef277

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 (273) hide show
  1. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  2. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  3. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  4. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  5. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  6. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  7. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  8. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  9. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  10. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  11. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  12. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  13. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  14. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  15. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.d.ts +2 -2
  16. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.js +1 -1
  17. package/dist/application-spec/generate-application/code/templates/domain-spec.js +4 -4
  18. package/dist/application-spec/generate-application/code/templates/domain.js +3 -3
  19. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -0
  20. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  21. package/dist/application-spec/generate-application/code/templates/skills/agents-md.js +1 -1
  22. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  23. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +41 -13
  24. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +1 -1
  25. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +2 -2
  26. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  27. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.d.ts +1 -0
  28. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +6 -0
  29. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +30 -3
  30. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +19 -5
  31. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +8 -4
  32. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +4 -3
  33. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.js +1 -1
  34. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.d.ts +3 -8
  35. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.js +1 -1
  36. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.d.ts +9 -43
  37. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  38. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +2 -2
  39. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant.d.ts +5 -21
  40. package/dist/client/phoenix-api.d.ts +58 -30
  41. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  42. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +158 -13
  43. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  44. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.d.ts +85 -0
  45. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.js +1 -0
  46. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +8 -3
  47. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  48. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +4 -0
  49. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  50. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +16 -1
  51. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  52. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.d.ts +9 -0
  53. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.js +1 -0
  54. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  55. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -0
  56. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  57. package/dist/configurator/common/frontend-analytics.d.ts +21 -21
  58. package/dist/configurator/index.d.ts +0 -1
  59. package/dist/configurator/index.js +1 -1
  60. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  61. package/dist/configurator/scene/scene-analytics/scene-analytics.d.ts +2 -2
  62. package/dist/configurator/ui/assistant/AssistantChips.d.ts +11 -0
  63. package/dist/configurator/ui/assistant/AssistantChips.js +1 -0
  64. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +6 -0
  65. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -0
  66. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -0
  67. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -0
  68. package/dist/configurator/ui/assistant/AssistantPanel.d.ts +11 -0
  69. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -0
  70. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -0
  71. package/dist/configurator/ui/assistant/AssistantThread.js +1 -0
  72. package/dist/configurator/ui/assistant/assistant-failure.d.ts +18 -0
  73. package/dist/configurator/ui/assistant/assistant-failure.js +1 -0
  74. package/dist/configurator/ui/assistant/index.d.ts +2 -0
  75. package/dist/configurator/ui/assistant/index.js +1 -0
  76. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +6 -0
  77. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -0
  78. package/dist/configurator/ui/assistant/theme.d.ts +2 -0
  79. package/dist/configurator/ui/assistant/theme.js +1 -0
  80. package/dist/configurator/ui/assistant/thread-items.d.ts +37 -0
  81. package/dist/configurator/ui/assistant/thread-items.js +1 -0
  82. package/dist/configurator/ui/assistant/tool-chip.d.ts +44 -0
  83. package/dist/configurator/ui/assistant/tool-chip.js +1 -0
  84. package/dist/configurator/ui/assistant/use-follow-stream.d.ts +17 -0
  85. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -0
  86. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.d.ts +5 -0
  87. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.js +1 -0
  88. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -5
  89. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.d.ts +2 -0
  90. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  91. package/dist/configurator/ui/legacy/mobile-controls/MobileControls.d.ts +1 -1
  92. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.d.ts +10 -0
  93. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -0
  94. package/dist/configurator/ui/phoenix-layout-elements/index.d.ts +1 -0
  95. package/dist/configurator/ui/phoenix-layout-elements/index.js +1 -1
  96. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +84 -98
  97. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  98. package/dist/docs/index.json +1 -1
  99. package/dist/docs/layouts/custom-price.mdx +14 -16
  100. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  101. package/dist/docs/layouts/toolbar.mdx +6 -0
  102. package/dist/docs/other-features/domain-actions.mdx +1 -1
  103. package/dist/docs/other-features/side-effects.mdx +68 -34
  104. package/dist/docs/other-features/transformers.mdx +1 -1
  105. package/dist/docs/phoenix/admin.mdx +9 -24
  106. package/dist/docs/phoenix/localization.mdx +3 -22
  107. package/dist/docs/phoenix/phoenix-cli.mdx +81 -2
  108. package/dist/docs/phoenix/project-structure.mdx +9 -2
  109. package/dist/docs/phoenix/sdk-builder-workflow.mdx +4 -3
  110. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  111. package/dist/docs/relations/hierarchy.mdx +13 -2
  112. package/dist/domain/actions/action-factory.d.ts +3 -2
  113. package/dist/domain/application/application-config.d.ts +25 -75
  114. package/dist/domain/application/assistant/assistant-manifest.d.ts +61 -0
  115. package/dist/domain/application/assistant/assistant-manifest.js +1 -0
  116. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +95 -0
  117. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -0
  118. package/dist/domain/application/assistant/assistant-value-type.d.ts +9 -0
  119. package/dist/domain/application/assistant/assistant-value-type.js +1 -0
  120. package/dist/domain/application/assistant/build-assistant-manifest.d.ts +4 -0
  121. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -0
  122. package/dist/{phoenix/application-spec → domain/application/assistant}/generate-assistant-prompt.d.ts +6 -5
  123. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  124. package/dist/domain/application/assistant/index.d.ts +4 -0
  125. package/dist/domain/application/assistant/index.js +1 -0
  126. package/dist/domain/application/assistant-field-options.d.ts +1 -1
  127. package/dist/domain/application/assistant-mutations.d.ts +1 -1
  128. package/dist/domain/application/assistant-recipe-groups.d.ts +1 -1
  129. package/dist/domain/application/configurator-builder.d.ts +33 -18
  130. package/dist/domain/application/configurator-builder.js +1 -1
  131. package/dist/domain/application/element-registration.d.ts +5 -0
  132. package/dist/domain/application/element-registration.js +1 -1
  133. package/dist/domain/application/handler-registration.d.ts +5 -0
  134. package/dist/domain/application/handler-registration.js +1 -1
  135. package/dist/domain/application/index.d.ts +5 -4
  136. package/dist/domain/application/index.js +1 -1
  137. package/dist/domain/application/resolve-imported-transformers.d.ts +11 -1
  138. package/dist/domain/application/resolve-imported-transformers.js +1 -1
  139. package/dist/domain/components/domain-component-optic.d.ts +3 -0
  140. package/dist/domain/components/domain-component-optic.js +2 -2
  141. package/dist/domain/components/updates.d.ts +16 -0
  142. package/dist/domain/core/action.d.ts +1 -1
  143. package/dist/domain/domain-builder.d.ts +10 -1
  144. package/dist/domain/domain-builder.js +1 -1
  145. package/dist/domain/domain-context/index.d.ts +1 -1
  146. package/dist/domain/domain-context/store-system/store-system.js +1 -1
  147. package/dist/domain/domain-context/transformers/chain-builder.d.ts +1 -1
  148. package/dist/domain/domain-runtime/domain-runtime.d.ts +4 -4
  149. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  150. package/dist/domain/domain-runtime/spec/selectors.d.ts +2 -2
  151. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  152. package/dist/domain/domain-runtime/spec/types.d.ts +3 -3
  153. package/dist/domain/index.d.ts +3 -2
  154. package/dist/domain/index.js +1 -1
  155. package/dist/domain/invariants/invariants.d.ts +9 -0
  156. package/dist/domain/invariants/invariants.js +1 -1
  157. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +3 -3
  158. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  159. package/dist/domain/project-modules/index.d.ts +1 -0
  160. package/dist/domain/project-modules/index.js +1 -0
  161. package/dist/domain/project-modules/project-modules.d.ts +41 -0
  162. package/dist/domain/project-modules/project-modules.js +1 -0
  163. package/dist/domain/system-components/common/dimension-indicator-schema.d.ts +1 -1
  164. package/dist/domain/system-components/common/dimension-indicator-schema.js +1 -1
  165. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.d.ts +44 -0
  166. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.js +1 -0
  167. package/dist/domain/system-components/phoenix-layout-elements/index.d.ts +1 -0
  168. package/dist/domain/system-components/phoenix-layout-elements/index.js +1 -1
  169. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.d.ts +2 -1
  170. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.js +1 -1
  171. package/dist/editor/Editor.js +1 -1
  172. package/dist/editor/domain-editors/use-implementation-files.d.ts +7 -6
  173. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  174. package/dist/editor/graphql/GraphQLPanel.js +1 -1
  175. package/dist/editor/variants/VariantAnswerFooter.d.ts +17 -0
  176. package/dist/editor/variants/VariantAnswerFooter.js +1 -0
  177. package/dist/editor/variants/VariantPreviewHandler.d.ts +6 -0
  178. package/dist/editor/variants/VariantPreviewHandler.js +1 -0
  179. package/dist/editor/variants/variant-preview-styles.d.ts +49 -0
  180. package/dist/editor/variants/variant-preview-styles.js +1 -0
  181. package/dist/i18n/locales/cs/messages.js +1 -1
  182. package/dist/i18n/locales/da/messages.js +1 -1
  183. package/dist/i18n/locales/de/messages.js +1 -1
  184. package/dist/i18n/locales/de-AT/messages.js +1 -1
  185. package/dist/i18n/locales/en/messages.js +1 -1
  186. package/dist/i18n/locales/en-AU/messages.js +1 -1
  187. package/dist/i18n/locales/en-GB/messages.js +1 -1
  188. package/dist/i18n/locales/es/messages.js +1 -1
  189. package/dist/i18n/locales/fr/messages.js +1 -1
  190. package/dist/i18n/locales/hu/messages.js +1 -1
  191. package/dist/i18n/locales/it/messages.js +1 -1
  192. package/dist/i18n/locales/nl/messages.js +1 -1
  193. package/dist/i18n/locales/pl/messages.js +1 -1
  194. package/dist/i18n/locales/pt/messages.js +1 -1
  195. package/dist/i18n/locales/ro/messages.js +1 -1
  196. package/dist/i18n/locales/sk/messages.js +1 -1
  197. package/dist/i18n/locales/tr/messages.js +1 -1
  198. package/dist/legacy/domain-cli/gen/configurator-builder.js +21 -8
  199. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  200. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  201. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +6 -0
  202. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  203. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  204. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  205. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  206. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  207. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  208. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  209. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  210. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  211. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  212. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  213. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  214. package/dist/phoenix/cli.js +1 -1
  215. package/dist/phoenix/commands/deploy.js +2 -2
  216. package/dist/phoenix/commands/dev.js +5 -5
  217. package/dist/phoenix/commands/index.d.ts +1 -0
  218. package/dist/phoenix/commands/index.js +1 -1
  219. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  220. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  221. package/dist/phoenix/commands/story-dev.js +2 -2
  222. package/dist/phoenix/commands/variants.d.ts +35 -0
  223. package/dist/phoenix/commands/variants.js +1 -0
  224. package/dist/phoenix/editor-server/commands-router.d.ts +68 -1
  225. package/dist/phoenix/editor-server/commands-router.js +1 -1
  226. package/dist/phoenix/editor-server/editor-router.d.ts +65 -0
  227. package/dist/phoenix/editor-server/editor-server.d.ts +3 -3
  228. package/dist/phoenix/editor-server/editor-server.js +1 -1
  229. package/dist/phoenix/editor-server/protocol.d.ts +1 -0
  230. package/dist/phoenix/editor-server/spec-router.js +1 -1
  231. package/dist/phoenix/editor-server/trpc.d.ts +3 -0
  232. package/dist/phoenix/services/application-spec-project-watcher.d.ts +13 -2
  233. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  234. package/dist/phoenix/services/index.d.ts +4 -0
  235. package/dist/phoenix/services/index.js +1 -1
  236. package/dist/phoenix/services/phoenix-application.d.ts +21 -0
  237. package/dist/phoenix/services/phoenix-application.js +1 -0
  238. package/dist/phoenix/services/phoenix-store.d.ts +48 -0
  239. package/dist/phoenix/services/phoenix-store.js +1 -0
  240. package/dist/phoenix/services/phx-variant-previews-plugin.d.ts +9 -0
  241. package/dist/phoenix/services/phx-variant-previews-plugin.js +1 -0
  242. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  243. package/dist/phoenix/services/variant-file-session.d.ts +36 -0
  244. package/dist/phoenix/services/variant-file-session.js +1 -0
  245. package/dist/phoenix/services/variant-preview-service.d.ts +80 -0
  246. package/dist/phoenix/services/variant-preview-service.js +1 -0
  247. package/dist/phoenix/services/vite-config.js +1 -1
  248. package/dist/react-sdk/application-runtime/common-services/analytics/analytics-service.d.ts +2 -2
  249. package/dist/react-sdk/application-runtime/common-services/analytics/domain-controls-analytics.d.ts +21 -21
  250. package/dist/react-sdk/application-runtime/hooks/data/use-published-data.d.ts +1 -1
  251. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  252. package/dist/react-sdk/application-runtime/hooks/use-spec.d.ts +1 -1
  253. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  254. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  255. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +4 -4
  256. package/dist/ui-sdk/common/use-viewport-size.d.ts +4 -1
  257. package/dist/ui-sdk/common/use-viewport-size.js +1 -1
  258. package/dist/ui-sdk/components/mobile-controls/index.d.ts +1 -1
  259. package/dist/ui-sdk/theme/types.d.ts +4 -0
  260. package/dist/webhook/builders/common.d.ts +3 -0
  261. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  262. package/dist/webhook/builders/webhook-builder.js +1 -1
  263. package/package.json +5 -8
  264. package/schema/domain-spec.json +24 -0
  265. package/dist/configurator/assistant/index.d.ts +0 -1
  266. package/dist/configurator/assistant/index.js +0 -1
  267. package/dist/configurator/assistant/use-assistant-chat.d.ts +0 -20
  268. package/dist/configurator/assistant/use-assistant-chat.js +0 -1
  269. package/dist/extras/assistant/AssistantChat.d.ts +0 -6
  270. package/dist/extras/assistant/AssistantChat.js +0 -1
  271. package/dist/extras/assistant/index.d.ts +0 -1
  272. package/dist/extras/assistant/index.js +0 -1
  273. package/dist/phoenix/application-spec/generate-assistant-prompt.js +0 -1
@@ -1,13 +1,23 @@
1
1
  import type { $DomainEntity, DomainEntity } from '../core/model.js';
2
2
  import type { DomainContextSystems } from '../domain-context/domain-context-systems.js';
3
3
  import type { Transformers } from '../domain-context/store-system/store-system.js';
4
+ import { type ProjectModule } from '../project-modules/index.js';
4
5
  import type { ImportedTransformer, SpecTransformer } from './application-config.js';
6
+ type AnyImportedTransformer = ImportedTransformer<any, any, any, any, any, any, any>;
7
+ /**
8
+ * The transformer of one `src/transformers/` file, named after the file. The spec's `transformers` section
9
+ * selects a plain-function export by that name; a transformer made with `build(name)` registers under its own.
10
+ */
11
+ export declare const resolveTransformerModule: (module: ProjectModule) => AnyImportedTransformer;
12
+ /** Validates the `src/transformers/` files of an application config and names each after its file. */
13
+ export declare const resolveTransformerModules: (modules: readonly ProjectModule[]) => readonly AnyImportedTransformer[];
5
14
  /**
6
15
  * Resolves imported transformer modules against spec transformer declarations.
7
16
  * Each imported transformer is registered/executed with the domain context,
8
17
  * then matched by name against spec entries to apply priority ordering.
9
18
  *
10
- * Used both at build time (via withTransformers) and at hot-reload time
19
+ * Used both when the runtime spec is initialized from the application config and at hot-reload time
11
20
  * (via domain-context subscription to registry changes).
12
21
  */
13
22
  export declare const resolveImportedTransformers: <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>(importedTransformers: ReadonlyArray<ImportedTransformer<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES>>, specTransformers: readonly SpecTransformer[], ctx: DomainContextSystems<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES>) => Transformers<ENTITIES>;
23
+ export {};
@@ -1 +1 @@
1
- export const resolveImportedTransformers=(r,e,t)=>{let o=r.flatMap(({name:r,transformer:e})=>{if(Array.isArray(e))return e.map((e,o)=>{if("register"in e)return e.register(t);if("function"==typeof e)return{priority:1/0,transformer:e(t),name:`${r}[${o}]`};throw Error(`Transformer '${r}[${o}]' must be either a RegistrableTransformer (with register method) or a TransformerFactory (function)`)});if("register"in e)return e.register(t);if("function"==typeof e)return{priority:1/0,transformer:e(t),name:r};throw Error(`Transformer '${r}' must be either a RegistrableTransformer (with register method) or a TransformerFactory (function)`)}),n=[];for(let r of e){let e=o.find(e=>e.name===r.name);if(!e){let e=o.map(r=>r.name).filter(Boolean).join(", ");throw Error(`Transformer '${r.name}' not found in imported transformer files. Available transformers: ${e||"none"}`)}n.push({priority:r.priority??1/0,transformer:e.transformer,name:r.name})}return n};
1
+ import{SHARED_FOLDER_HINT as r,createContractError as e,isRecord as t}from"../project-modules/index.js";let o={expected:"a transformer (a function of the domain context, or an object with a register method), or an array of them",fix:`Create it with phx.frontend.transformerBuilder, ${r}.`},n=r=>"function"==typeof r||t(r)&&"function"==typeof r.register;export const resolveTransformerModule=r=>{let t;if(!(Array.isArray(t=r.exports)?t.every(n):n(t)))throw e(r.origin,o,r.exports);return{name:r.origin.replace(/^.*\//,"").replace(/\.tsx?$/,""),transformer:r.exports}};export const resolveTransformerModules=r=>r.map(resolveTransformerModule);export const resolveImportedTransformers=(r,e,t)=>{let o=r.flatMap(({name:r,transformer:e})=>{if(Array.isArray(e))return e.map((e,o)=>{if("register"in e)return e.register(t);if("function"==typeof e)return{priority:1/0,transformer:e(t),name:`${r}[${o}]`};throw Error(`Transformer '${r}[${o}]' must be either a RegistrableTransformer (with register method) or a TransformerFactory (function)`)});if("register"in e)return e.register(t);if("function"==typeof e)return{priority:1/0,transformer:e(t),name:r};throw Error(`Transformer '${r}' must be either a RegistrableTransformer (with register method) or a TransformerFactory (function)`)}),n=[];for(let r of e){let e=o.find(e=>e.name===r.name);if(!e){let e=o.map(r=>r.name).filter(Boolean).join(", ");throw Error(`Transformer '${r.name}' not found in imported transformer files. Available transformers: ${e||"none"}`)}n.push({priority:r.priority??1/0,transformer:e.transformer,name:r.name})}return n};
@@ -5,6 +5,7 @@ import type { ExpressionContext } from '../core/expression.js';
5
5
  import type { $DomainEntity, DomainEntity, EntityByType } from '../core/model.js';
6
6
  import type { DomainState } from '../core/state.js';
7
7
  import type { CustomExpression } from '../expressions/custom-expression.js';
8
+ import { type ProjectModule } from '../project-modules/index.js';
8
9
  import { type ComponentSystemFilter, type NavigationFilterOptic } from './legacy-filter.js';
9
10
  import type { GradualComponentSystemFilter, IdOrWithId } from './system-component-filter.js';
10
11
  import type { Viewport } from './viewport-state-component.js';
@@ -33,6 +34,8 @@ export interface DomainComponentDynamicOptic<ENTITIES extends DomainEntity<strin
33
34
  }
34
35
  export type DomainComponentOptic<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ENTITY extends ENTITIES, COMPONENT_TYPE extends SystemComponentTypeConstraint> = DomainComponentSimpleOptic<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ENTITY, COMPONENT_TYPE> | DomainComponentDynamicOptic<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, COMPONENT_TYPE>;
35
36
  export type AnyDomainComponentOptic = DomainComponentOptic<any, any, any, any, any, any, any>;
37
+ /** Validates the `src/components/` files, or the optics a generated file lists, and flattens them. */
38
+ export declare const resolveComponentOpticModules: (modules: readonly ProjectModule[]) => readonly AnyDomainComponentOptic[];
36
39
  export declare class DomainComponentOpticBuilder<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ALIASES extends Record<string, ENTITIES>, ENTITY extends ENTITIES, $ENTITY extends $DomainEntity<ENTITIES>, COMPONENT_TYPE extends SystemComponentTypeConstraint> {
37
40
  private readonly aliasMap;
38
41
  private readonly entityTypes;
@@ -1,4 +1,4 @@
1
- import{createCacheToken as t,getStickyCache as e}from"@salsita-ai/common/utils";import{createCustomExpression as i}from"../expressions/custom-expression.js";import{withProfilerLabel as n}from"../utils/profiler-label.js";export class DomainComponentOpticBuilder{aliasMap;entityTypes;componentType;instanceName;navigationFilters;generated;entityTypeOrAliasNames;constructor(t,e,i,n,s=[],a=!1,o=[]){this.aliasMap=t,this.entityTypes=e,this.componentType=i,this.instanceName=n,this.navigationFilters=s,this.generated=a,this.entityTypeOrAliasNames=o}static from(t){return new DomainComponentOpticBuilder(t,[])}withEntity(t){return new DomainComponentOpticBuilder(this.aliasMap,[...this.entityTypes,t],this.componentType,this.instanceName,this.navigationFilters,this.generated,[...this.entityTypeOrAliasNames,t])}withAlias(t){return new DomainComponentOpticBuilder(this.aliasMap,[...this.entityTypes,...this.aliasMap[t]],this.componentType,this.instanceName,this.navigationFilters,this.generated,[...this.entityTypeOrAliasNames,String(t)])}withComponent(t,e,i=!1){return new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,t,e,this.navigationFilters,i,this.entityTypeOrAliasNames)}withFilter(i){if(console.warn(`Component ${this.componentType?.name}#${this.instanceName} on entity ${this.entityTypes.join(", ")} uses a legacy filter with full filter evaluation. This is a suboptimal variant and is deprecated in favor of per-criterion evaluation.
1
+ import{createCacheToken as t,getStickyCache as e}from"@salsita-ai/common/utils";import{createCustomExpression as i}from"../expressions/custom-expression.js";import{SHARED_FOLDER_HINT as n,isRecord as s,resolveListModule as a}from"../project-modules/index.js";import{withProfilerLabel as o}from"../utils/profiler-label.js";let r={expected:"an attached component, or an array of them",fix:`Create it with phx.domain.attachComponent(...) (phx.domain.admin.attachComponent(...) under src/admin/), ${n}.`},d=t=>s(t)&&("simple"===t.kind||"dynamic"===t.kind)&&"string"==typeof t.instanceName&&"function"==typeof t.read;export const resolveComponentOpticModules=t=>t.flatMap(t=>a(t,r,d));export class DomainComponentOpticBuilder{aliasMap;entityTypes;componentType;instanceName;navigationFilters;generated;entityTypeOrAliasNames;constructor(t,e,i,n,s=[],a=!1,o=[]){this.aliasMap=t,this.entityTypes=e,this.componentType=i,this.instanceName=n,this.navigationFilters=s,this.generated=a,this.entityTypeOrAliasNames=o}static from(t){return new DomainComponentOpticBuilder(t,[])}withEntity(t){return new DomainComponentOpticBuilder(this.aliasMap,[...this.entityTypes,t],this.componentType,this.instanceName,this.navigationFilters,this.generated,[...this.entityTypeOrAliasNames,t])}withAlias(t){return new DomainComponentOpticBuilder(this.aliasMap,[...this.entityTypes,...this.aliasMap[t]],this.componentType,this.instanceName,this.navigationFilters,this.generated,[...this.entityTypeOrAliasNames,String(t)])}withComponent(t,e,i=!1){return new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,t,e,this.navigationFilters,i,this.entityTypeOrAliasNames)}withFilter(i){if(console.warn(`Component ${this.componentType?.name}#${this.instanceName} on entity ${this.entityTypes.join(", ")} uses a legacy filter with full filter evaluation. This is a suboptimal variant and is deprecated in favor of per-criterion evaluation.
2
2
 
3
3
  In your TS files, replace
4
4
  withFilter()
@@ -13,4 +13,4 @@ import{createCacheToken as t,getStickyCache as e}from"@salsita-ai/common/utils";
13
13
  active:
14
14
  $read: $trueOrFalseExpression
15
15
  # ... other eventual criteria
16
- `),"function"==typeof i){let n=t(),s=t=>({evaluate:(s,a,o)=>{let r=e(a,n),d=r.get(s);if(!d){if(void 0===(d=i(o.domain.get$Entity(s,a),a)))throw Error(`Dynamic filter on component ${this.componentType?.name}.${this.instanceName} on entity ${s} returned 'undefined'. This is likely a bug in the component definition, check whether you are referencing a correct expression or field!`);r.put(s,d)}return"boolean"==typeof d?"active"===t?d:void 0:d[t]},meta:{}});return new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,{navigationStates:s("navigationStates"),selectedEntityIds:s("selectedEntityIds"),hoveredEntityIds:s("hoveredEntityIds"),draggedEntityIds:s("draggedEntityIds"),viewStates:s("viewStates"),toolStates:s("toolStates"),modes:s("modes"),roles:s("roles"),active:s("active"),fullscreen:s("fullscreen"),debug:s("debug"),viewports:s("viewports"),exportedEntityIds:void 0,exportStates:void 0}],this.generated,this.entityTypeOrAliasNames)}return"boolean"==typeof i?new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,{active:i,navigationStates:void 0,selectedEntityIds:void 0,hoveredEntityIds:void 0,draggedEntityIds:void 0,viewStates:void 0,toolStates:void 0,modes:void 0,roles:void 0,fullscreen:void 0,debug:void 0,viewports:void 0,exportedEntityIds:void 0,exportStates:void 0}],this.generated,this.entityTypeOrAliasNames):new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,{navigationStates:void 0,selectedEntityIds:void 0,hoveredEntityIds:void 0,draggedEntityIds:void 0,viewStates:void 0,toolStates:void 0,modes:void 0,roles:void 0,active:void 0,fullscreen:void 0,debug:void 0,viewports:void 0,exportedEntityIds:void 0,exportStates:void 0,...i}],this.generated,this.entityTypeOrAliasNames)}withGradualFilter(t){let e=t=>"function"==typeof t?i(t,{}):t,n={navigationStates:e(t.navigationStates),selectedEntityIds:e(t.selectedEntityIds),hoveredEntityIds:e(t.hoveredEntityIds),draggedEntityIds:e(t.draggedEntityIds),exportedEntityIds:e(t.exportedEntityIds),viewStates:e(t.viewStates),toolStates:e(t.toolStates),exportStates:e(t.exportStates),modes:e(t.modes),roles:e(t.roles),active:e(t.active),fullscreen:e(t.fullscreen),debug:e(t.debug),viewports:e(t.viewports)};return new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,n],this.generated,this.entityTypeOrAliasNames)}validate(){if(!this.componentType||!this.instanceName)throw Error("Use withComponent before attaching");if(!this.entityTypes.length)throw Error("Use withEntity and/or withAlias before attaching")}_getProfilerLabel(){return[...this.entityTypeOrAliasNames,this.componentType.name,this.instanceName].join("_")}attach=(i,s)=>{var a,o;let r,d;return this.validate(),a={kind:"simple",entityTypes:new Set(this.entityTypes),componentType:this.componentType,instanceName:this.instanceName,navigationFilters:this.navigationFilters,read:(t,e,n)=>i(n.domain.get$Entity(t,e),e,n),write:s??(()=>({})),generated:this.generated},o=this._getProfilerLabel(),r=t(),d=n(o,a.read),{...a,read:(t,i,n)=>{let s=e(i,r),a=s.get(t);if(a)return a;let o=d(t,i,n);return s.put(t,o),o}}};attachMany=i=>{var s,a;let o,r;return this.validate(),s={kind:"dynamic",entityTypes:new Set(this.entityTypes),componentType:this.componentType,instanceName:this.instanceName,navigationFilters:this.navigationFilters,read:(t,e,n)=>i(n.domain.get$Entity(t,e),e,n)},a=this._getProfilerLabel(),o=t(),r=n(a,s.read),{...s,read:(t,i,n)=>{let s=e(i,o),a=s.get(t);if(a)return a;let d=r(t,i,n);return s.put(t,d),d}}}}
16
+ `),"function"==typeof i){let n=t(),s=t=>({evaluate:(s,a,o)=>{let r=e(a,n),d=r.get(s);if(!d){if(void 0===(d=i(o.domain.get$Entity(s,a),a)))throw Error(`Dynamic filter on component ${this.componentType?.name}.${this.instanceName} on entity ${s} returned 'undefined'. This is likely a bug in the component definition, check whether you are referencing a correct expression or field!`);r.put(s,d)}return"boolean"==typeof d?"active"===t?d:void 0:d[t]},meta:{}});return new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,{navigationStates:s("navigationStates"),selectedEntityIds:s("selectedEntityIds"),hoveredEntityIds:s("hoveredEntityIds"),draggedEntityIds:s("draggedEntityIds"),viewStates:s("viewStates"),toolStates:s("toolStates"),modes:s("modes"),roles:s("roles"),active:s("active"),fullscreen:s("fullscreen"),debug:s("debug"),viewports:s("viewports"),exportedEntityIds:void 0,exportStates:void 0}],this.generated,this.entityTypeOrAliasNames)}return"boolean"==typeof i?new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,{active:i,navigationStates:void 0,selectedEntityIds:void 0,hoveredEntityIds:void 0,draggedEntityIds:void 0,viewStates:void 0,toolStates:void 0,modes:void 0,roles:void 0,fullscreen:void 0,debug:void 0,viewports:void 0,exportedEntityIds:void 0,exportStates:void 0}],this.generated,this.entityTypeOrAliasNames):new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,{navigationStates:void 0,selectedEntityIds:void 0,hoveredEntityIds:void 0,draggedEntityIds:void 0,viewStates:void 0,toolStates:void 0,modes:void 0,roles:void 0,active:void 0,fullscreen:void 0,debug:void 0,viewports:void 0,exportedEntityIds:void 0,exportStates:void 0,...i}],this.generated,this.entityTypeOrAliasNames)}withGradualFilter(t){let e=t=>"function"==typeof t?i(t,{}):t,n={navigationStates:e(t.navigationStates),selectedEntityIds:e(t.selectedEntityIds),hoveredEntityIds:e(t.hoveredEntityIds),draggedEntityIds:e(t.draggedEntityIds),exportedEntityIds:e(t.exportedEntityIds),viewStates:e(t.viewStates),toolStates:e(t.toolStates),exportStates:e(t.exportStates),modes:e(t.modes),roles:e(t.roles),active:e(t.active),fullscreen:e(t.fullscreen),debug:e(t.debug),viewports:e(t.viewports)};return new DomainComponentOpticBuilder(this.aliasMap,this.entityTypes,this.componentType,this.instanceName,[...this.navigationFilters,n],this.generated,this.entityTypeOrAliasNames)}validate(){if(!this.componentType||!this.instanceName)throw Error("Use withComponent before attaching");if(!this.entityTypes.length)throw Error("Use withEntity and/or withAlias before attaching")}_getProfilerLabel(){return[...this.entityTypeOrAliasNames,this.componentType.name,this.instanceName].join("_")}attach=(i,n)=>{var s,a;let r,d;return this.validate(),s={kind:"simple",entityTypes:new Set(this.entityTypes),componentType:this.componentType,instanceName:this.instanceName,navigationFilters:this.navigationFilters,read:(t,e,n)=>i(n.domain.get$Entity(t,e),e,n),write:n??(()=>({})),generated:this.generated},a=this._getProfilerLabel(),r=t(),d=o(a,s.read),{...s,read:(t,i,n)=>{let s=e(i,r),a=s.get(t);if(a)return a;let o=d(t,i,n);return s.put(t,o),o}}};attachMany=i=>{var n,s;let a,r;return this.validate(),n={kind:"dynamic",entityTypes:new Set(this.entityTypes),componentType:this.componentType,instanceName:this.instanceName,navigationFilters:this.navigationFilters,read:(t,e,n)=>i(n.domain.get$Entity(t,e),e,n)},s=this._getProfilerLabel(),a=t(),r=o(s,n.read),{...n,read:(t,i,n)=>{let s=e(i,a),o=s.get(t);if(o)return o;let d=r(t,i,n);return s.put(t,d),d}}}}
@@ -7,6 +7,8 @@ export interface ComponentModification<COMPONENT_TYPE extends SystemComponentTyp
7
7
  entityId: EntityId;
8
8
  updateTag: string;
9
9
  hint?: Localizable;
10
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
11
+ agentHint?: string | null;
10
12
  componentInstance: ComponentInstance<COMPONENT_TYPE>;
11
13
  writableState: WritableStateOfComponent<COMPONENT_TYPE>;
12
14
  metadata?: Record<string, unknown>;
@@ -17,6 +19,8 @@ export interface EphemeralRecordModification<COMPONENT_TYPE extends SystemCompon
17
19
  entityId: EntityId;
18
20
  updateTag: string;
19
21
  hint?: Localizable;
22
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
23
+ agentHint?: string | null;
20
24
  componentInstance: ComponentInstance<COMPONENT_TYPE>;
21
25
  writableState: WritableStateOfComponent<COMPONENT_TYPE>;
22
26
  }
@@ -25,6 +29,8 @@ export interface EphemeralRecordCreation<COMPONENT_TYPE extends SystemComponentT
25
29
  entityId: EntityId;
26
30
  updateTag: string;
27
31
  hint?: Localizable;
32
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
33
+ agentHint?: string | null;
28
34
  componentInstance: ComponentInstance<COMPONENT_TYPE>;
29
35
  initialState: StateOfComponent<COMPONENT_TYPE>;
30
36
  }
@@ -34,6 +40,8 @@ export interface EphemeralRecordDeletion<COMPONENT_TYPE extends SystemComponentT
34
40
  componentInstance: ComponentInstance<COMPONENT_TYPE>;
35
41
  updateTag: string;
36
42
  hint?: Localizable;
43
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
44
+ agentHint?: string | null;
37
45
  }
38
46
  export type DomainEntityStateDelta<ENTITY extends DomainEntity<string>> = Partial<Omit<ENTITY, 'id' | 'type'>>;
39
47
  export interface DomainEntityModification<ENTITY extends DomainEntity<string> = DomainEntity<string>> {
@@ -41,6 +49,8 @@ export interface DomainEntityModification<ENTITY extends DomainEntity<string> =
41
49
  entityId: ENTITY['id'];
42
50
  updateTag: string;
43
51
  hint?: Localizable;
52
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
53
+ agentHint?: string | null;
44
54
  stateDelta: DomainEntityStateDelta<ENTITY>;
45
55
  origin?: ComponentModification<SystemComponentTypeConstraint>;
46
56
  }
@@ -55,6 +65,8 @@ export interface DomainEntityCreation<ENTITY extends DomainEntity<string>, PAREN
55
65
  collection?: string;
56
66
  parentId: PARENT['id'];
57
67
  hint?: Localizable;
68
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
69
+ agentHint?: string | null;
58
70
  }
59
71
  export interface DomainEntityReplacement<ENTITY extends DomainEntity<string>> {
60
72
  kind: 'replaceDomainEntity';
@@ -63,12 +75,16 @@ export interface DomainEntityReplacement<ENTITY extends DomainEntity<string>> {
63
75
  updateTag: string;
64
76
  keepChildren: boolean;
65
77
  hint?: Localizable;
78
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
79
+ agentHint?: string | null;
66
80
  }
67
81
  export interface EntityDeletion<ENTITY extends DomainEntity<string>> {
68
82
  kind: 'deleteEntity';
69
83
  entityId: EntityId<ENTITY>;
70
84
  updateTag: string;
71
85
  hint?: Localizable;
86
+ /** What the assistant agent is told about this update instead of `hint`; `null` keeps the wording from it, and its change record then explains the change by `updateTag`. Never shown to the user. */
87
+ agentHint?: string | null;
72
88
  }
73
89
  export type DataUpdate<ENTITY extends DomainEntity<string>, PARENT extends DomainEntity<string>> = EphemeralRecordModification | EphemeralRecordCreation | EphemeralRecordDeletion | DomainEntityModification<ENTITY> | DomainEntityCreation<ENTITY, PARENT> | DomainEntityReplacement<ENTITY> | EntityDeletion<ENTITY>;
74
90
  export type StateUpdate<ENTITY extends DomainEntity<string>, PARENT extends DomainEntity<string>> = ComponentModification<SystemComponentTypeConstraint> | DataUpdate<ENTITY, PARENT>;
@@ -59,7 +59,7 @@ export type AnyActionContext = ActionContext<any, any, any, any, any, any, any,
59
59
  */
60
60
  export type ActionImplementation<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, NAVIGATION_STATES extends string, VIEW_STATES extends string, TOOL_STATES extends string, EXPORT_STATES extends string, PARAMS, RESULT> = (params: PARAMS, state: DomainState<ENTITIES>, context: ActionContext<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES>) => PreparedAction<ENTITIES, RESULT>;
61
61
  export type AnyActionImplementation = ActionImplementation<any, any, any, any, any, any, any, any, any, any, any, unknown>;
62
- /** The implementations of every declared action by name, as the generated barrel merges them from `src/actions/`. */
62
+ /** The implementations of every declared action by name, as `DomainBuilder.withActionModules` merges them from `src/actions/`. */
63
63
  export type ActionImplementations<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, NAVIGATION_STATES extends string, VIEW_STATES extends string, TOOL_STATES extends string, EXPORT_STATES extends string, ACTION_TYPES extends ActionTypes> = {
64
64
  readonly [NAME in keyof ACTION_TYPES]: ActionImplementation<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES, ACTION_TYPES[NAME]['params'], ACTION_TYPES[NAME]['result']>;
65
65
  };
@@ -6,6 +6,7 @@ import { DomainFactory } from './core/index.js';
6
6
  import { type MigrateFunction } from './core/migrations.js';
7
7
  import { type $DomainEntity, type DomainEntity, type EntityByType } from './core/model.js';
8
8
  import type { $DomainEntityReflection, EntityReflections, SchemaOfObject } from './core/reflection.js';
9
+ import { type ProjectModule } from './project-modules/index.js';
9
10
  export type AliasedExpressions<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ALIASES extends Record<string, ENTITIES>> = {
10
11
  [K in TypeOrAlias<ENTITIES, ALIASES>]?: Record<string, AnonymousExpression<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ExpandAlias<ENTITIES, ALIASES, K>, unknown>>;
11
12
  };
@@ -31,9 +32,17 @@ export declare class DomainBuilder<ENTITIES extends DomainEntity<string>, ALLOWE
31
32
  static from<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ALIASES extends Readonly<Record<string, ENTITIES>>>(entities: EntityReflections<ENTITIES>, aliasMap: AliasMap<ALIASES>, $entityReflections: $EntityReflections<ENTITIES>, allowedRootEntityTypes: ReadonlyArray<ALLOWED_ROOT_ENTITIES['type']>, modelVersion: number, publishedData: SchemaOfObject<PUBLISHED_DATA>, sessionData: SchemaOfObject<SESSION_DATA>, frontendData: SchemaOfObject<FRONTEND_DATA>, backendData: ExtendedJsonSchema | undefined, isAdminDomain: boolean): DomainBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, ALIASES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
32
33
  withMigrate(migration: MigrateFunction<ENTITIES>): DomainBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, ALIASES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
33
34
  withExpressions(implementation: AliasedExpressions<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ALIASES>): DomainBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, ALIASES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
35
+ /**
36
+ * Adds the expressions of the `src/expressions/` files, as the generated barrel lists them. Each file
37
+ * is checked against the folder's contract and added on its own, so an expression defined twice is
38
+ * reported with both files instead of being overwritten by file order.
39
+ */
40
+ withExpressionModules(modules: readonly ProjectModule[]): DomainBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, ALIASES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
34
41
  /** Declares the actions of the domain, as the generated `domain-spec.ts` reads them from the spec's `actions` section. */
35
42
  withActions(actions: readonly ActionDefinition[]): DomainBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, ALIASES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
36
- /** Adds the implementations of the declared actions, as the generated barrel merges them from `src/actions/`. */
43
+ /** Adds the action implementations of the `src/actions/` files, as the generated barrel lists them, after checking each file against the folder's contract. */
44
+ withActionModules(modules: readonly ProjectModule[]): DomainBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, ALIASES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
45
+ /** Adds the implementations of the declared actions, already merged by action name. */
37
46
  withActionImplementations(implementations: AnyActionImplementations): DomainBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, ALIASES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
38
47
  build: () => DomainFactory<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>;
39
48
  }
@@ -1 +1 @@
1
- import{expandAlias as t}from"./core/alias.js";import{DomainFactory as i}from"./core/index.js";import{MigrateFunctionBuilder as e}from"./core/migrations.js";import{withProfilerLabel as s}from"./utils/profiler-label.js";export class DomainBuilder{entities;aliasMap;$entityReflections;allowedRootEntityTypes;implemented;modelVersion;publishedData;sessionData;frontendData;backendData;migrate;isAdminDomain;actions;actionImplementations;constructor(t,i,e,s,a,n,o,h,l,m,r,d,p,c){this.entities=t,this.aliasMap=i,this.$entityReflections=e,this.allowedRootEntityTypes=s,this.implemented=a,this.modelVersion=n,this.publishedData=o,this.sessionData=h,this.frontendData=l,this.backendData=m,this.migrate=r,this.isAdminDomain=d,this.actions=p,this.actionImplementations=c}static from(t,i,s,a,n,o,h,l,m,r){let d=e.fromVersions({1:t}).to(1).using({}).build();return new DomainBuilder(t,i,s,a,{},n,o,h,l,m,d,r,{},{})}withMigrate(t){return new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,this.implemented,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,t,this.isAdminDomain,this.actions,this.actionImplementations)}withExpressions(i){let e={...this.implemented};return Object.entries(i).forEach(([i,a])=>{t(this.aliasMap,i).forEach(t=>{let n={...e[t]};e[t]=n,Object.entries(a).forEach(([e,a])=>{let o=n[e];if(o)throw Error(`Duplicate expression ${t}.${e}: The expression is defined on both ${i} and ${o.origin.typeOrAlias}, which would lead to ambiguous usage. Please ensure that expressions are only defined once.`);n[e]={...a,evaluate:s(`${t}_${e}`,a.evaluate),origin:{name:e,typeOrAlias:i}}})})}),new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,e,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,this.migrate,this.isAdminDomain,this.actions,this.actionImplementations)}withActions(t){return new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,this.implemented,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,this.migrate,this.isAdminDomain,Object.fromEntries(t.map(t=>[t.name,t])),this.actionImplementations)}withActionImplementations(t){return new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,this.implemented,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,this.migrate,this.isAdminDomain,this.actions,{...this.actionImplementations,...t})}build=()=>{let t=this.implemented,s=this.migrate??e.fromVersions({1:this.entities}).to(1).using({}).build();return new i({aliasMap:this.aliasMap,entityReflections:this.entities,$entityReflections:this.$entityReflections,expressions:t,allowedRootEntityTypes:this.allowedRootEntityTypes,modelVersion:this.modelVersion,migrate:s,publishedData:this.publishedData,sessionData:this.sessionData,frontendData:this.frontendData,backendData:this.backendData,isAdminDomain:this.isAdminDomain,actions:this.actions,actionImplementations:this.actionImplementations})}}
1
+ import{expandAlias as t}from"./core/alias.js";import{DomainFactory as i}from"./core/index.js";import{MigrateFunctionBuilder as s}from"./core/migrations.js";import{resolveActionModules as e,resolveExpressionModules as n}from"./project-modules/index.js";import{withProfilerLabel as a}from"./utils/profiler-label.js";export class DomainBuilder{entities;aliasMap;$entityReflections;allowedRootEntityTypes;implemented;modelVersion;publishedData;sessionData;frontendData;backendData;migrate;isAdminDomain;actions;actionImplementations;constructor(t,i,s,e,n,a,o,h,l,r,m,d,p,c){this.entities=t,this.aliasMap=i,this.$entityReflections=s,this.allowedRootEntityTypes=e,this.implemented=n,this.modelVersion=a,this.publishedData=o,this.sessionData=h,this.frontendData=l,this.backendData=r,this.migrate=m,this.isAdminDomain=d,this.actions=p,this.actionImplementations=c}static from(t,i,e,n,a,o,h,l,r,m){let d=s.fromVersions({1:t}).to(1).using({}).build();return new DomainBuilder(t,i,e,n,{},a,o,h,l,r,d,m,{},{})}withMigrate(t){return new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,this.implemented,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,t,this.isAdminDomain,this.actions,this.actionImplementations)}withExpressions(i){let s={...this.implemented};return Object.entries(i).forEach(([i,e])=>{t(this.aliasMap,i).forEach(t=>{let n={...s[t]};s[t]=n,Object.entries(e).forEach(([s,e])=>{let o=n[s];if(o)throw Error(`Duplicate expression ${t}.${s}: The expression is defined on both ${i} and ${o.origin.typeOrAlias}, which would lead to ambiguous usage. Please ensure that expressions are only defined once.`);n[s]={...e,evaluate:a(`${t}_${s}`,e.evaluate),origin:{name:s,typeOrAlias:i}}})})}),new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,s,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,this.migrate,this.isAdminDomain,this.actions,this.actionImplementations)}withExpressionModules(t){return n(t,this.aliasMap).reduce((t,i)=>t.withExpressions(i.expressions),this)}withActions(t){return new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,this.implemented,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,this.migrate,this.isAdminDomain,Object.fromEntries(t.map(t=>[t.name,t])),this.actionImplementations)}withActionModules(t){return this.withActionImplementations(e(t))}withActionImplementations(t){return new DomainBuilder(this.entities,this.aliasMap,this.$entityReflections,this.allowedRootEntityTypes,this.implemented,this.modelVersion,this.publishedData,this.sessionData,this.frontendData,this.backendData,this.migrate,this.isAdminDomain,this.actions,{...this.actionImplementations,...t})}build=()=>{let t=this.implemented,e=this.migrate??s.fromVersions({1:this.entities}).to(1).using({}).build();return new i({aliasMap:this.aliasMap,entityReflections:this.entities,$entityReflections:this.$entityReflections,expressions:t,allowedRootEntityTypes:this.allowedRootEntityTypes,modelVersion:this.modelVersion,migrate:e,publishedData:this.publishedData,sessionData:this.sessionData,frontendData:this.frontendData,backendData:this.backendData,isAdminDomain:this.isAdminDomain,actions:this.actions,actionImplementations:this.actionImplementations})}}
@@ -1,5 +1,5 @@
1
1
  export { type AnalyticsSystem, NoopAnalyticsSystem } from './analytics-system/analytics-system.js';
2
- export { type AnalyticsEvent, AnalyticsEventFactory, AnalyticsEventType, } from './analytics-system/analytics-contracts.js';
2
+ export { type AnalyticsEvent, AnalyticsEventFactory, AnalyticsEventType, type DataLoadedEvent, type InitEvent, type NavigationEvent, type SessionAuthenticatedEvent, type SystemEvent, type UserActionEvent, } from './analytics-system/analytics-contracts.js';
3
3
  export { NavigationUpdateTag, isInitialNavigationUpdate, isNavigationUpdate, isInitialViewUpdate, isViewUpdate, isInitialSelectionUpdate, isSelectUpdate, isDeselectUpdate, isInitialFullscreenUpdate, isToggleFullscreenUpdate, isInitialDebugUpdate, isInitialViewportUpdate, isSetViewportUpdate, isInitialDragUpdate, isDragStartUpdate, isDragEndUpdate, isInitialToolUpdate, isToolUpdate, isExportUpdate, } from './navigation-system/navigation-updates.js';
4
4
  export { createAutoSelectionTransformer, NavigationSystem, type NavigationSystemContext, } from './navigation-system/navigation-system.js';
5
5
  export { createResetSelectionOnNavigationTransformer, createNavigationOnSelectionTransformer, createNavigationOnDeselectTransformer, createSelectParentOnDeselectionTransformer, createNavigationOnSelectionChangeTransformer, } from './navigation-system/selection-transformers.js';
@@ -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,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};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.
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
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}}}}
@@ -4,7 +4,7 @@ import type { TransformerRegistration, UpdateTransformer } from '../store-system
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
  };
@@ -61,7 +61,7 @@ export declare function createDomainRuntimeSlices<State extends DomainRuntimeSta
61
61
  selectAdminPreset: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AnyProductPreset>;
62
62
  selectAdminModelVersion: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, number>;
63
63
  selectThemeOptions: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("@mui/material").ThemeOptions>;
64
- selectAssistant: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AssistantManifest | null>;
64
+ selectAssistant: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, Required<import("../index.js").AssistantManifest> | null>;
65
65
  selectConfiguratorFactory: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AnyDomainFactory>;
66
66
  selectAdminFactory: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AnyDomainFactory>;
67
67
  selectConfiguratorComponentOptics: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, readonly import("../index.js").AnyDomainComponentOptic[]>;
@@ -104,7 +104,7 @@ export declare function createDomainRuntimeSlices<State extends DomainRuntimeSta
104
104
  getAdminPreset: () => import("../index.js").AnyProductPreset;
105
105
  getAdminModelVersion: () => number;
106
106
  getThemeOptions: () => import("@mui/material").ThemeOptions;
107
- getAssistant: () => import("../index.js").AssistantManifest | null;
107
+ getAssistant: () => Required<import("../index.js").AssistantManifest> | null;
108
108
  getConfiguratorFactory: () => import("../index.js").AnyDomainFactory;
109
109
  getAdminFactory: () => import("../index.js").AnyDomainFactory;
110
110
  getConfiguratorComponentOptics: () => readonly import("../index.js").AnyDomainComponentOptic[];
@@ -651,7 +651,7 @@ export declare const createDomainRuntime: (props: Omit<Props<DomainRuntimeState>
651
651
  selectAdminPreset: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AnyProductPreset>;
652
652
  selectAdminModelVersion: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, number>;
653
653
  selectThemeOptions: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("@mui/material").ThemeOptions>;
654
- selectAssistant: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AssistantManifest | null>;
654
+ selectAssistant: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, Required<import("../index.js").AssistantManifest> | null>;
655
655
  selectConfiguratorFactory: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AnyDomainFactory>;
656
656
  selectAdminFactory: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, import("../index.js").AnyDomainFactory>;
657
657
  selectConfiguratorComponentOptics: import("@salsita-ai/common/utils").Selector<import("./index.js").SpecSelectorState, readonly import("../index.js").AnyDomainComponentOptic[]>;
@@ -694,7 +694,7 @@ export declare const createDomainRuntime: (props: Omit<Props<DomainRuntimeState>
694
694
  getAdminPreset: () => import("../index.js").AnyProductPreset;
695
695
  getAdminModelVersion: () => number;
696
696
  getThemeOptions: () => import("@mui/material").ThemeOptions;
697
- getAssistant: () => import("../index.js").AssistantManifest | null;
697
+ getAssistant: () => Required<import("../index.js").AssistantManifest> | null;
698
698
  getConfiguratorFactory: () => import("../index.js").AnyDomainFactory;
699
699
  getAdminFactory: () => import("../index.js").AnyDomainFactory;
700
700
  getConfiguratorComponentOptics: () => readonly import("../index.js").AnyDomainComponentOptic[];
@@ -1 +1 @@
1
- import{SessionRole as e}from"@salsita-ai/contracts/api";let a=(e,a)=>{let t={};for(let n of e)t[n.name]=a?.[n.name]??n.name;return t},t=(e,a)=>{let t={},n=0;for(let o of e)if("entity"===o.type||"layout"===o.type)t[o.name]=a?.[o.name]??o.name;else{let e=`icon:${n}`;t[e]=a?.[e]??`${e}:${o.elements.length}`,n+=1}return t};export const initializeSpec=n=>{let o=n.adminDomain.presets[0];if(!o)throw Error("Cannot register application spec because admin preset is required.");return{version:n.version,dataConfig:n.dataSpec??null,chunks:n.chunks,publishedDataHash:n.publishedDataHash,initialPublishedData:n.initialPublishedData,canCreate:n.features?.acl?.canCreate??Object.values(e),enableAdminRelease:n.features?.enableAdminRelease??!1,textLanguages:n.domain.textLanguages??n.adminDomain.textLanguages??["en"],baseResourcesUrl:n.resources?.baseResourcesUrl??n.defaultEnvs?.resourcesUrl??"",configurator:{factory:n.domain.domainFactory,presets:n.domain.presets,aliasMap:n.domain.domainFactory.context.aliasMap,entityReflections:n.domain.domainFactory.context.entityReflections,$entityReflections:n.domain.domainFactory.context.$entityReflections,expressions:n.domain.domainFactory.context.expressions,actions:n.domain.domainFactory.context.actions,actionImplementations:n.domain.domainFactory.context.actionImplementations,allowedRootEntityTypes:n.domain.domainFactory.context.allowedRootEntityTypes,migrate:n.domain.domainFactory.context.migrate,componentOptics:n.domain.componentOptics,createTransformers:n.createTransformers??(()=>[]),navigationStates:n.navigation?.navigationStates??[],viewStates:n.navigation?.viewStates??[],toolStates:n.navigation?.toolStates??[],exportStates:n.navigation?.exportStates??[],handlers:n.handlers,handlerHashes:a(n.handlers),elements:n.elements,elementHashes:t(n.elements),appLoader:n.ui?.appLoader??"universal",preview:n.ui?.preview??"auto",alwaysExpand:n.ui?.alwaysExpand??!1,theme:n.ui?.theme??{},assistant:n.assistant??null,deploymentQueryDisabled:n.resources?.deploymentQueryDisabled??!1,prefetchTextureUrls:n.resources?.prefetchTextureUrls??[],modelVersion:n.domain.domainFactory.modelVersion},admin:{factory:n.adminDomain.domainFactory,modelVersion:n.adminDomain.domainFactory.modelVersion,aliasMap:n.adminDomain.domainFactory.context.aliasMap,entityReflections:n.adminDomain.domainFactory.context.entityReflections,$entityReflections:n.adminDomain.domainFactory.context.$entityReflections,expressions:n.adminDomain.domainFactory.context.expressions,actions:n.adminDomain.domainFactory.context.actions,actionImplementations:n.adminDomain.domainFactory.context.actionImplementations,allowedRootEntityTypes:n.adminDomain.domainFactory.context.allowedRootEntityTypes,migrate:n.adminDomain.domainFactory.context.migrate,preset:o,componentOptics:n.adminDomain.componentOptics,navigationStates:n.adminNavigation?.navigationStates??[],viewStates:n.adminNavigation?.viewStates??[],handlers:n.handlers,handlerHashes:a(n.handlers),elements:n.elements,elementHashes:t(n.elements)}}};
1
+ import{SessionRole as t}from"@salsita-ai/contracts/api";import{resolveElementModules as e}from"../../application/element-registration.js";import{resolveHandlerModules as a}from"../../application/handler-registration.js";import{resolveImportedTransformers as n,resolveTransformerModules as o}from"../../application/resolve-imported-transformers.js";import{resolveComponentOpticModules as i}from"../../components/domain-component-optic.js";export const initializeSpec=s=>{let r=s.adminDomain.presets[0];if(!r)throw Error("Cannot register application spec because admin preset is required.");let m=a(s.handlers),c=e(s.elements),d=(t=>{let e={};for(let a of t)e[a.name]=(void 0)??a.name;return e})(m),l=(t=>{let e={},a=0;for(let n of t)if("entity"===n.type||"layout"===n.type)e[n.name]=(void 0)??n.name;else{let t=`icon:${a}`;e[t]=(void 0)??`${t}:${n.elements.length}`,a+=1}return e})(c),p=o(s.transformers?.importedTransformers??[]),y=s.transformers?.specTransformers??[];return{version:s.version,dataConfig:s.dataSpec??null,chunks:s.chunks,publishedDataHash:s.publishedDataHash,initialPublishedData:s.initialPublishedData,canCreate:s.features?.acl?.canCreate??Object.values(t),enableAdminRelease:s.features?.enableAdminRelease??!1,textLanguages:s.domain.textLanguages??s.adminDomain.textLanguages??["en"],baseResourcesUrl:s.resources?.baseResourcesUrl??s.defaultEnvs?.resourcesUrl??"",configurator:{factory:s.domain.domainFactory,presets:s.domain.presets,aliasMap:s.domain.domainFactory.context.aliasMap,entityReflections:s.domain.domainFactory.context.entityReflections,$entityReflections:s.domain.domainFactory.context.$entityReflections,expressions:s.domain.domainFactory.context.expressions,actions:s.domain.domainFactory.context.actions,actionImplementations:s.domain.domainFactory.context.actionImplementations,allowedRootEntityTypes:s.domain.domainFactory.context.allowedRootEntityTypes,migrate:s.domain.domainFactory.context.migrate,componentOptics:i(s.domain.componentOptics),createTransformers:t=>n(p,y,t),navigationStates:s.navigation?.navigationStates??[],viewStates:s.navigation?.viewStates??[],toolStates:s.navigation?.toolStates??[],exportStates:s.navigation?.exportStates??[],handlers:m,handlerHashes:d,elements:c,elementHashes:l,appLoader:s.ui?.appLoader??"universal",preview:s.ui?.preview??"auto",alwaysExpand:s.ui?.alwaysExpand??!1,theme:s.ui?.theme??{},assistant:s.assistant??null,deploymentQueryDisabled:s.resources?.deploymentQueryDisabled??!1,prefetchTextureUrls:s.resources?.prefetchTextureUrls??[],modelVersion:s.domain.domainFactory.modelVersion},admin:{factory:s.adminDomain.domainFactory,modelVersion:s.adminDomain.domainFactory.modelVersion,aliasMap:s.adminDomain.domainFactory.context.aliasMap,entityReflections:s.adminDomain.domainFactory.context.entityReflections,$entityReflections:s.adminDomain.domainFactory.context.$entityReflections,expressions:s.adminDomain.domainFactory.context.expressions,actions:s.adminDomain.domainFactory.context.actions,actionImplementations:s.adminDomain.domainFactory.context.actionImplementations,allowedRootEntityTypes:s.adminDomain.domainFactory.context.allowedRootEntityTypes,migrate:s.adminDomain.domainFactory.context.migrate,preset:r,componentOptics:i(s.adminDomain.componentOptics),navigationStates:s.adminNavigation?.navigationStates??[],viewStates:s.adminNavigation?.viewStates??[],handlers:m,handlerHashes:d,elements:c,elementHashes:l}}};
@@ -22,7 +22,7 @@ export declare const createSpecSelectors: (context: Context) => {
22
22
  selectAdminPreset: import("@salsita-ai/common/utils").Selector<SpecSelectorState, import("../../index.js").AnyProductPreset>;
23
23
  selectAdminModelVersion: import("@salsita-ai/common/utils").Selector<SpecSelectorState, number>;
24
24
  selectThemeOptions: import("@salsita-ai/common/utils").Selector<SpecSelectorState, import("@mui/material").ThemeOptions>;
25
- selectAssistant: import("@salsita-ai/common/utils").Selector<SpecSelectorState, import("../../index.js").AssistantManifest | null>;
25
+ selectAssistant: import("@salsita-ai/common/utils").Selector<SpecSelectorState, Required<import("../../index.js").AssistantManifest> | null>;
26
26
  selectConfiguratorFactory: import("@salsita-ai/common/utils").Selector<SpecSelectorState, import("../../index.js").AnyDomainFactory>;
27
27
  selectAdminFactory: import("@salsita-ai/common/utils").Selector<SpecSelectorState, import("../../index.js").AnyDomainFactory>;
28
28
  selectConfiguratorComponentOptics: import("@salsita-ai/common/utils").Selector<SpecSelectorState, readonly import("../../index.js").AnyDomainComponentOptic[]>;
@@ -65,7 +65,7 @@ export declare const createSpecSelectors: (context: Context) => {
65
65
  getAdminPreset: () => import("../../index.js").AnyProductPreset;
66
66
  getAdminModelVersion: () => number;
67
67
  getThemeOptions: () => import("@mui/material").ThemeOptions;
68
- getAssistant: () => import("../../index.js").AssistantManifest | null;
68
+ getAssistant: () => Required<import("../../index.js").AssistantManifest> | null;
69
69
  getConfiguratorFactory: () => import("../../index.js").AnyDomainFactory;
70
70
  getAdminFactory: () => import("../../index.js").AnyDomainFactory;
71
71
  getConfiguratorComponentOptics: () => readonly import("../../index.js").AnyDomainComponentOptic[];
@@ -1 +1 @@
1
- import{createSelector as e}from"@salsita-ai/common/utils";import{systemElementRegistry as t}from"../../application/element-registration.js";export const createSpecSelectors=n=>{let{getState:a}=n,s=e.withTypes(),r=s([s.leaf(e=>e.spec)],e=>e),o=s([r],e=>e.version),l=s([r],e=>e.baseResourcesUrl),i=s([r],e=>e.configurator),g=s([r],e=>e.dataConfig),m=s([r],e=>e.chunks),p=s([r],e=>e.publishedDataHash),d=s([r],e=>e.initialPublishedData),c=s([r],e=>e.canCreate),u=s([r],e=>e.enableAdminRelease),y=s([r],e=>e.textLanguages),h=s([i],e=>e.modelVersion),f=s([r],e=>e.admin),C=s([f],e=>e.preset),A=s([f],e=>e.modelVersion),E=s([i],e=>e.theme),b=s([i],e=>e.assistant),H=s([i],e=>e.factory),x=s([f],e=>e.factory),D=s([i],e=>e.componentOptics),P=s([f],e=>e.componentOptics),S=s([i],e=>e.appLoader),w=s([i],e=>e.preview),O=s([i],e=>e.alwaysExpand),T=s([i],e=>e.presets),V=s([i],e=>e.deploymentQueryDisabled),L=s([i],e=>e.prefetchTextureUrls),R=s([i],e=>e.handlerHashes),U=s([i],e=>e.handlers),v=s([U,R],(e,t)=>({...(e=>{let t={},n={},a={};for(let s of e)"phoenix"===s.type&&(t[s.name]=s.handler),"system"===s.type&&(n[s.name]=s.handler),"system-async"===s.type&&(a[s.name]=s.handler);return{handlers:t,systemHandlers:n,systemAsyncHandlers:a}})(e),hashes:t})),k=s([i],e=>e.elementHashes),F=s([i],e=>e.elements),M=s([F,k],(e,n)=>({...(e=>{let n={},a={};for(let t of e)"layout"===t.type&&(n[t.name]=t.element),"entity"===t.type&&(a[t.name]=t.element);return{entityElements:{...t.entityElements,...a},layoutElements:{...t.layoutElements,...n}}})(e),hashes:n}));return{selectSpec:r,selectVersion:o,selectBaseResourcesUrl:l,selectConfiguratorSpec:i,selectConfiguratorModelVersion:h,selectAdminSpec:f,selectAdminPreset:C,selectAdminModelVersion:A,selectThemeOptions:E,selectAssistant:b,selectConfiguratorFactory:H,selectAdminFactory:x,selectConfiguratorComponentOptics:D,selectAdminComponentOptics:P,selectAppLoader:S,selectPreview:w,selectAlwaysExpand:O,selectPresetSeed:T,selectDeploymentQueryDisabled:V,selectPrefetchTextureUrls:L,selectTextLanguages:y,selectHandlerHashes:R,selectHandlers:U,selectHandlerSlots:v,selectElementHashes:k,selectElements:F,selectElementSlots:M,selectDataConfig:g,selectChunks:m,selectPublishedDataHash:p,selectInitialPublishedData:d,selectCanCreate:c,selectEnableAdminRelease:u,getVersion:()=>o(a()),getBaseResourcesUrl:()=>l(a()),getConfiguratorSpec:()=>i(a()),getConfiguratorModelVersion:()=>h(a()),getAdminSpec:()=>f(a()),getAdminPreset:()=>C(a()),getAdminModelVersion:()=>A(a()),getThemeOptions:()=>E(a()),getAssistant:()=>b(a()),getConfiguratorFactory:()=>H(a()),getAdminFactory:()=>x(a()),getConfiguratorComponentOptics:()=>D(a()),getAdminComponentOptics:()=>P(a()),getAppLoader:()=>S(a()),getPreview:()=>w(a()),getAlwaysExpand:()=>O(a()),getPresetSeed:()=>T(a()),getDeploymentQueryDisabled:()=>V(a()),getPrefetchTextureUrls:()=>L(a()),getTextLanguages:()=>y(a()),getHandlerHashes:()=>R(a()),getHandlers:()=>U(a()),getHandlerSlots:()=>v(a()),getElementHashes:()=>k(a()),getElements:()=>F(a()),getElementSlots:()=>M(a()),getDataConfig:()=>g(a()),getChunks:()=>m(a()),getPublishedDataHash:()=>p(a()),getInitialPublishedData:()=>d(a()),getCanCreate:()=>c(a()),getEnableAdminRelease:()=>u(a())}};
1
+ import{createSelector as e}from"@salsita-ai/common/utils";import{buildAssistantManifest as t}from"../../application/assistant/index.js";import{systemElementRegistry as n}from"../../application/element-registration.js";export const createSpecSelectors=a=>{let{getState:s}=a,r=e.withTypes(),o=r([r.leaf(e=>e.spec)],e=>e),l=r([o],e=>e.version),i=r([o],e=>e.baseResourcesUrl),m=r([o],e=>e.configurator),g=r([o],e=>e.dataConfig),p=r([o],e=>e.chunks),d=r([o],e=>e.publishedDataHash),c=r([o],e=>e.initialPublishedData),u=r([o],e=>e.canCreate),y=r([o],e=>e.enableAdminRelease),h=r([o],e=>e.textLanguages),f=r([m],e=>e.modelVersion),C=r([o],e=>e.admin),A=r([C],e=>e.preset),E=r([C],e=>e.modelVersion),b=r([m],e=>e.theme),x=r([m],e=>e.assistant),H=r([x],e=>e?t(e):null),D=r([m],e=>e.factory),P=r([C],e=>e.factory),S=r([m],e=>e.componentOptics),w=r([C],e=>e.componentOptics),O=r([m],e=>e.appLoader),T=r([m],e=>e.preview),V=r([m],e=>e.alwaysExpand),L=r([m],e=>e.presets),R=r([m],e=>e.deploymentQueryDisabled),U=r([m],e=>e.prefetchTextureUrls),v=r([m],e=>e.handlerHashes),j=r([m],e=>e.handlers),k=r([j,v],(e,t)=>({...(e=>{let t={},n={},a={};for(let s of e)"phoenix"===s.type&&(t[s.name]=s.handler),"system"===s.type&&(n[s.name]=s.handler),"system-async"===s.type&&(a[s.name]=s.handler);return{handlers:t,systemHandlers:n,systemAsyncHandlers:a}})(e),hashes:t})),F=r([m],e=>e.elementHashes),M=r([m],e=>e.elements),Q=r([M,F],(e,t)=>({...(e=>{let t={},a={};for(let n of e)"layout"===n.type&&(t[n.name]=n.element),"entity"===n.type&&(a[n.name]=n.element);return{entityElements:{...n.entityElements,...a},layoutElements:{...n.layoutElements,...t}}})(e),hashes:t}));return{selectSpec:o,selectVersion:l,selectBaseResourcesUrl:i,selectConfiguratorSpec:m,selectConfiguratorModelVersion:f,selectAdminSpec:C,selectAdminPreset:A,selectAdminModelVersion:E,selectThemeOptions:b,selectAssistant:H,selectConfiguratorFactory:D,selectAdminFactory:P,selectConfiguratorComponentOptics:S,selectAdminComponentOptics:w,selectAppLoader:O,selectPreview:T,selectAlwaysExpand:V,selectPresetSeed:L,selectDeploymentQueryDisabled:R,selectPrefetchTextureUrls:U,selectTextLanguages:h,selectHandlerHashes:v,selectHandlers:j,selectHandlerSlots:k,selectElementHashes:F,selectElements:M,selectElementSlots:Q,selectDataConfig:g,selectChunks:p,selectPublishedDataHash:d,selectInitialPublishedData:c,selectCanCreate:u,selectEnableAdminRelease:y,getVersion:()=>l(s()),getBaseResourcesUrl:()=>i(s()),getConfiguratorSpec:()=>m(s()),getConfiguratorModelVersion:()=>f(s()),getAdminSpec:()=>C(s()),getAdminPreset:()=>A(s()),getAdminModelVersion:()=>E(s()),getThemeOptions:()=>b(s()),getAssistant:()=>H(s()),getConfiguratorFactory:()=>D(s()),getAdminFactory:()=>P(s()),getConfiguratorComponentOptics:()=>S(s()),getAdminComponentOptics:()=>w(s()),getAppLoader:()=>O(s()),getPreview:()=>T(s()),getAlwaysExpand:()=>V(s()),getPresetSeed:()=>L(s()),getDeploymentQueryDisabled:()=>R(s()),getPrefetchTextureUrls:()=>U(s()),getTextLanguages:()=>h(s()),getHandlerHashes:()=>v(s()),getHandlers:()=>j(s()),getHandlerSlots:()=>k(s()),getElementHashes:()=>F(s()),getElements:()=>M(s()),getElementSlots:()=>Q(s()),getDataConfig:()=>g(s()),getChunks:()=>p(s()),getPublishedDataHash:()=>d(s()),getInitialPublishedData:()=>c(s()),getCanCreate:()=>u(s()),getEnableAdminRelease:()=>y(s())}};
@@ -1,6 +1,6 @@
1
1
  import type { ThemeOptions } from '@mui/material';
2
2
  import type { SessionRole } from '@salsita-ai/contracts/api';
3
- import type { AssistantManifest, ChunksSpec, DataSpec, ElementRegistration, HandlerRegistration } from '../../application/index.js';
3
+ import type { AssistantResolvedManifest, ChunksSpec, DataSpec, ElementRegistration, HandlerRegistration } from '../../application/index.js';
4
4
  import type { AnyDomainComponentOptic } from '../../components/index.js';
5
5
  import type { ActionDefinitions, Any$EntityReflections, AnyActionImplementations, AnyAliasMap, AnyAllowedRootEntityTypes, AnyDomainFactory, AnyEntityReflections, AnyExpressions, AnyProductPreset, DomainEntity, MigrateFunction } from '../../core/index.js';
6
6
  import type { AnyCreateTransformersFactory } from '../../domain-context/store-system/store-system.js';
@@ -46,10 +46,10 @@ export interface ApplicationConfiguratorSpec {
46
46
  readonly alwaysExpand: boolean;
47
47
  readonly theme: ThemeOptions;
48
48
  /**
49
- * Experimental assistant manifest with its generated GraphQL SDL, or `null` when the application
49
+ * Resolved assistant manifest used to rebuild GraphQL SDL, or `null` when the application
50
50
  * spec declares no `assistant` section. Replaced by editor hot reload when the section changes.
51
51
  */
52
- readonly assistant: AssistantManifest | null;
52
+ readonly assistant: AssistantResolvedManifest | null;
53
53
  /**
54
54
  * When true, resource urls are not suffixed with the `?did=<deploymentId>` cache-busting
55
55
  * query — useful for demos serving local blob urls.
@@ -4,7 +4,7 @@ export { type ActionImplementationConflicts, findActionImplementationConflicts,
4
4
  export { createConstantExpressionFactory } from './expressions/constant-expressions.js';
5
5
  export { createCustomExpressionFactory } from './expressions/custom-expression.js';
6
6
  export { createCustomInvariantFactory, type StaticallyDefinedViolations } from './invariants/custom-invariants.js';
7
- export { InvariantBuilder } from './invariants/invariants.js';
7
+ export { InvariantBuilder, resolveInvariantModules } from './invariants/invariants.js';
8
8
  export type { AliasedInvariants, Invariant } from './invariants/invariants.js';
9
9
  export type { Violation, ViolationSeverity, ViolationTypesOf$Entity, EntityViolation } from './invariants/violation.js';
10
10
  export { compareSeverity } from './invariants/violation.js';
@@ -26,7 +26,7 @@ export { viewportStateComponent, isViewportStateComponentSnapshot, isSystemViewp
26
26
  export { type ComponentSystemFilterState, type ComponentSystemFilterProps, ComponentSystemFilterPropsSchema, getComponentSystemFilterState, CombinedComponentFilterSchema, type GradualComponentSystemFilter, type FilterMismatchReason, type IdOrWithId, } from './components/system-component-filter.js';
27
27
  export { ComponentSystemFilterSchema, type ComponentSystemFilter, type DeclarativeComponentSystemFilter, } from './components/legacy-filter.js';
28
28
  export type { OneComponentFilter, ManyComponentFilter, ComponentFilter, FilteredOutComponentSnapshot, FilteredOutFilterContext, } from './components/component-reader-types.js';
29
- export { DomainComponentOpticBuilder, type AnyDomainComponentOptic, type DomainComponentOptic, } from './components/domain-component-optic.js';
29
+ export { DomainComponentOpticBuilder, type AnyDomainComponentOptic, type DomainComponentOptic, resolveComponentOpticModules, } from './components/domain-component-optic.js';
30
30
  export { groupComponentsByEntityIdAndName, isEqualGroupedComponentSnapshots, type GroupedComponentSnapshots, } from './components/group-components-by-entity-id-and-name.js';
31
31
  export { SystemComponentBuilder } from './components/system-component-builder.js';
32
32
  export { type DataUpdate, type StateUpdate, type ComponentModification, isComponentModificationOfType, type DomainEntityCreation, type EntityDeletion, type DomainEntityReplacement, type DomainEntityModification, type EphemeralRecordCreation, type EphemeralRecordDeletion, type EphemeralRecordModification, type DomainEntityStateDelta, systemUpdateFactory, type UpdateFactory, createUpdateFactory, } from './components/updates.js';
@@ -41,6 +41,7 @@ export * from './sketching/index.js';
41
41
  export * from './projections/index.js';
42
42
  export * from './admin-domain/index.js';
43
43
  export * from './application/index.js';
44
+ export { type ProjectModule, resolveActionModules, resolveExpressionModules } from './project-modules/index.js';
44
45
  export * from './scene/index.js';
45
46
  export { getAllPhxDefinitions } from './system-definitions.js';
46
47
  export { availableSystemComponents, componentsByName } from './available-system-components.js';
@@ -1 +1 @@
1
- export*from"./core/index.js";export{createActionFactory}from"./actions/action-factory.js";export{findActionImplementationConflicts}from"./actions/prepare-action-implementations.js";export{createConstantExpressionFactory}from"./expressions/constant-expressions.js";export{createCustomExpressionFactory}from"./expressions/custom-expression.js";export{createCustomInvariantFactory}from"./invariants/custom-invariants.js";export{InvariantBuilder}from"./invariants/invariants.js";export{compareSeverity}from"./invariants/violation.js";export{violationsComponent}from"./invariants/violation-component.js";export{createRelationFactory}from"./relations/relation-factory.js";export{attachMultipleReferenceComponent,attachSingleReferenceComponent,referenceComponent}from"./relations/reference-component.js";export{composedOfComponent}from"./relations/composed-of.js";export{createSingleReferenceRead,createSingleReferenceWrite,createMultipleReferenceRead,createMultipleReferenceWrite,createSingleCompositionRead,createMultipleCompositionRead,createEmptyWrite}from"./relations/component-factories.js";export{systemVirtualEntityId}from"./components/system-virtual-entity.js";export{navigationStateComponent,isNavigationComponentSnapshot,isSystemNavigationComponentSnapshot}from"./components/navigation-state-component.js";export{hoverStateComponent,isHoverStateComponentSnapshot,isSystemHoverStateComponentSnapshot}from"./components/hover-state-component.js";export{selectionStateComponent,isSelectionComponentSnapshot,isSystemSelectionComponentSnapshot}from"./components/selection-state-component.js";export{viewStateComponent,isViewComponentSnapshot,isSystemViewComponentSnapshot}from"./components/view-state-component.js";export{toolStateComponent,isToolStateComponentSnapshot,isSystemToolStateComponentSnapshot}from"./components/tool-state-component.js";export{debugStateComponent,isDebugStateComponentSnapshot,isSystemDebugStateComponentSnapshot}from"./components/debug-state-component.js";export{fullscreenStateComponent,isFullscreenStateComponentSnapshot,isSystemFullscreenStateComponentSnapshot}from"./components/fullscreen-state-component.js";export{dragStateComponent,isDragStateComponentSnapshot,isSystemDragStateComponentSnapshot}from"./components/drag-state-component.js";export{viewportStateComponent,isViewportStateComponentSnapshot,isSystemViewportStateComponentSnapshot,VIEWPORTS}from"./components/viewport-state-component.js";export{ComponentSystemFilterPropsSchema,getComponentSystemFilterState,CombinedComponentFilterSchema}from"./components/system-component-filter.js";export{ComponentSystemFilterSchema}from"./components/legacy-filter.js";export{DomainComponentOpticBuilder}from"./components/domain-component-optic.js";export{groupComponentsByEntityIdAndName,isEqualGroupedComponentSnapshots}from"./components/group-components-by-entity-id-and-name.js";export{SystemComponentBuilder}from"./components/system-component-builder.js";export{isComponentModificationOfType,systemUpdateFactory,createUpdateFactory}from"./components/updates.js";export{DomainBuilder}from"./domain-builder.js";export{memoEval,isMemoizedArray,isMemoizedObject}from"./utils/memo-eval.js";export{cloneEvalCache,getEvalCache,setEvalCache,createEvalCacheToken}from"./utils/eval-cache.js";export{areProfilerLabelsEnabled,setProfilerLabelsEnabled}from"./utils/profiler-label.js";export*from"./dimensions/index.js";export*from"./domain-context/index.js";export*from"./system-components/index.js";export*from"./sketching/index.js";export*from"./projections/index.js";export*from"./admin-domain/index.js";export*from"./application/index.js";export*from"./scene/index.js";export{getAllPhxDefinitions}from"./system-definitions.js";export{availableSystemComponents,componentsByName}from"./available-system-components.js";export*from"./mocks/index.js";export*from"./domain-runtime/index.js";
1
+ export*from"./core/index.js";export{createActionFactory}from"./actions/action-factory.js";export{findActionImplementationConflicts}from"./actions/prepare-action-implementations.js";export{createConstantExpressionFactory}from"./expressions/constant-expressions.js";export{createCustomExpressionFactory}from"./expressions/custom-expression.js";export{createCustomInvariantFactory}from"./invariants/custom-invariants.js";export{InvariantBuilder,resolveInvariantModules}from"./invariants/invariants.js";export{compareSeverity}from"./invariants/violation.js";export{violationsComponent}from"./invariants/violation-component.js";export{createRelationFactory}from"./relations/relation-factory.js";export{attachMultipleReferenceComponent,attachSingleReferenceComponent,referenceComponent}from"./relations/reference-component.js";export{composedOfComponent}from"./relations/composed-of.js";export{createSingleReferenceRead,createSingleReferenceWrite,createMultipleReferenceRead,createMultipleReferenceWrite,createSingleCompositionRead,createMultipleCompositionRead,createEmptyWrite}from"./relations/component-factories.js";export{systemVirtualEntityId}from"./components/system-virtual-entity.js";export{navigationStateComponent,isNavigationComponentSnapshot,isSystemNavigationComponentSnapshot}from"./components/navigation-state-component.js";export{hoverStateComponent,isHoverStateComponentSnapshot,isSystemHoverStateComponentSnapshot}from"./components/hover-state-component.js";export{selectionStateComponent,isSelectionComponentSnapshot,isSystemSelectionComponentSnapshot}from"./components/selection-state-component.js";export{viewStateComponent,isViewComponentSnapshot,isSystemViewComponentSnapshot}from"./components/view-state-component.js";export{toolStateComponent,isToolStateComponentSnapshot,isSystemToolStateComponentSnapshot}from"./components/tool-state-component.js";export{debugStateComponent,isDebugStateComponentSnapshot,isSystemDebugStateComponentSnapshot}from"./components/debug-state-component.js";export{fullscreenStateComponent,isFullscreenStateComponentSnapshot,isSystemFullscreenStateComponentSnapshot}from"./components/fullscreen-state-component.js";export{dragStateComponent,isDragStateComponentSnapshot,isSystemDragStateComponentSnapshot}from"./components/drag-state-component.js";export{viewportStateComponent,isViewportStateComponentSnapshot,isSystemViewportStateComponentSnapshot,VIEWPORTS}from"./components/viewport-state-component.js";export{ComponentSystemFilterPropsSchema,getComponentSystemFilterState,CombinedComponentFilterSchema}from"./components/system-component-filter.js";export{ComponentSystemFilterSchema}from"./components/legacy-filter.js";export{DomainComponentOpticBuilder,resolveComponentOpticModules}from"./components/domain-component-optic.js";export{groupComponentsByEntityIdAndName,isEqualGroupedComponentSnapshots}from"./components/group-components-by-entity-id-and-name.js";export{SystemComponentBuilder}from"./components/system-component-builder.js";export{isComponentModificationOfType,systemUpdateFactory,createUpdateFactory}from"./components/updates.js";export{DomainBuilder}from"./domain-builder.js";export{memoEval,isMemoizedArray,isMemoizedObject}from"./utils/memo-eval.js";export{cloneEvalCache,getEvalCache,setEvalCache,createEvalCacheToken}from"./utils/eval-cache.js";export{areProfilerLabelsEnabled,setProfilerLabelsEnabled}from"./utils/profiler-label.js";export*from"./dimensions/index.js";export*from"./domain-context/index.js";export*from"./system-components/index.js";export*from"./sketching/index.js";export*from"./projections/index.js";export*from"./admin-domain/index.js";export*from"./application/index.js";export{resolveActionModules,resolveExpressionModules}from"./project-modules/index.js";export*from"./scene/index.js";export{getAllPhxDefinitions}from"./system-definitions.js";export{availableSystemComponents,componentsByName}from"./available-system-components.js";export*from"./mocks/index.js";export*from"./domain-runtime/index.js";
@@ -3,6 +3,7 @@ import { type AliasMap, type EventualAlias, type ExpandAlias, type ExtractFromAl
3
3
  import type { AnonymousExpression, ExpressionContext } from '../core/expression.js';
4
4
  import type { $DomainEntity, DomainEntity, EntityByType } from '../core/model.js';
5
5
  import type { DomainState } from '../core/state.js';
6
+ import { type ProjectModule } from '../project-modules/index.js';
6
7
  import { type Violation } from './violation.js';
7
8
  export interface Invariant<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ENTITY extends ENTITIES, VIOLATION_TYPE extends string> {
8
9
  evaluate(selfId: ENTITY['id'], state: DomainState<ENTITIES>, ctx: ExpressionContext<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>): ReadonlyArray<Violation<VIOLATION_TYPE>>;
@@ -38,10 +39,18 @@ type ExpressionsFromInvariants<ENTITIES extends DomainEntity<string>, ALLOWED_RO
38
39
  };
39
40
  };
40
41
  type BuildViolationExpressions<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, INVARIANTS extends Partial<Record<ENTITIES['type'], ReadonlyArray<Invariant<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ENTITIES, string>>>>> = Record<never, never> extends ConflictingInvariants<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, DeclaredInvariants<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA>, INVARIANTS> ? () => ExpressionsFromInvariants<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, INVARIANTS> : never;
42
+ type AnyInvariant = Invariant<any, any, any, any, any, any, string>;
43
+ /** Validates the `src/invariants/` files and concatenates their invariants per entity type or alias. */
44
+ export declare const resolveInvariantModules: (modules: readonly ProjectModule[]) => Readonly<Record<string, readonly AnyInvariant[]>>;
41
45
  export declare class InvariantBuilder<ENTITIES extends DomainEntity<string>, ALLOWED_ROOT_ENTITIES extends ENTITIES, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ALIASES extends Record<string, ENTITIES>, INVARIANTS extends Partial<Record<ENTITIES['type'], ReadonlyArray<Invariant<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ENTITIES, string>>>> = Record<never, never>> {
42
46
  private readonly aliasMap;
43
47
  private readonly invariants;
44
48
  constructor(aliasMap: AliasMap<ALIASES>, invariants?: INVARIANTS);
49
+ /**
50
+ * Adds the invariants of the `src/invariants/` files, as the generated barrel lists them, after
51
+ * checking each file against the folder's contract.
52
+ */
53
+ withInvariantModules(modules: readonly ProjectModule[]): InvariantBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ALIASES, ExpandAndMergeInvariants<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ALIASES, INVARIANTS, AliasedInvariants<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ALIASES, string>>>;
45
54
  withInvariants<ALIASED_INVARIANTS extends AliasedInvariants<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ALIASES, string>>(aliasedInvariants: ALIASED_INVARIANTS): InvariantBuilder<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ALIASES, ExpandAndMergeInvariants<ENTITIES, ALLOWED_ROOT_ENTITIES, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ALIASES, INVARIANTS, ALIASED_INVARIANTS>>;
46
55
  /**
47
56
  * DO NOT USE in runtime!
@@ -1 +1 @@
1
- import{expandAlias as a}from"../core/alias.js";export class InvariantBuilder{aliasMap;invariants;constructor(a,i={}){this.aliasMap=a,this.invariants=i}withInvariants(i){let t={...this.invariants};return Object.entries(i).forEach(([i,s])=>{a(this.aliasMap,i).forEach(a=>{t[a]=[...t[a]??[],...s]})}),new InvariantBuilder(this.aliasMap,t)}_conflicts={};buildViolationExpressions=()=>{let a={};return Object.entries(this.invariants).forEach(([i,t])=>{a[i]={$violations:{evaluate:(a,i,s)=>t.flatMap(t=>t.evaluate(a,i,s)),meta:{}}}}),a}}
1
+ import{expandAlias as t}from"../core/alias.js";import{SHARED_FOLDER_HINT as a,createContractError as e,isRecord as i}from"../project-modules/index.js";let r={expected:"an object of invariant lists keyed by entity type or alias",fix:`Create it with phx.domain.implementCustomInvariants({ ... }) (phx.domain.admin.implementCustomInvariants({ ... }) under src/admin/), ${a}.`},n=t=>i(t)&&"function"==typeof t.evaluate,s=t=>i(t)&&Object.values(t).every(t=>Array.isArray(t)&&t.every(n));export const resolveInvariantModules=t=>{let a={};for(let i of t){if(!s(i.exports))throw e(i.origin,r,i.exports);for(let[t,e]of Object.entries(i.exports))a[t]=[...a[t]??[],...e]}return a};export class InvariantBuilder{aliasMap;invariants;constructor(t,a={}){this.aliasMap=t,this.invariants=a}withInvariantModules(t){return this.withInvariants(resolveInvariantModules(t))}withInvariants(a){let e={...this.invariants};return Object.entries(a).forEach(([a,i])=>{t(this.aliasMap,a).forEach(t=>{e[t]=[...e[t]??[],...i]})}),new InvariantBuilder(this.aliasMap,e)}_conflicts={};buildViolationExpressions=()=>{let t={};return Object.entries(this.invariants).forEach(([a,e])=>{t[a]={$violations:{evaluate:(t,a,i)=>e.flatMap(e=>e.evaluate(t,a,i)),meta:{}}}}),t}}
@@ -15,7 +15,7 @@ import type { RegistrableTransformer } from '../domain-context/index.js';
15
15
  *
16
16
  * Contributing no extension systems is the same shape webhook and finalize hosts run in.
17
17
  */
18
- export declare const createMockDomainRuntime: <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, CHAT_CONTEXT extends Record<string, unknown>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ADMIN_ENTITIES extends DomainEntity<string>, ADMIN_ALLOWED_ROOT_ENTITIES extends ADMIN_ENTITIES, ADMIN_$MAP extends Record<ADMIN_ENTITIES['type'], $DomainEntity<ADMIN_ENTITIES>>, ADMIN_NAVIGATION_STATES extends string, ADMIN_VIEW_STATES extends string>(_cfg: ApplicationConfig<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES, CHAT_CONTEXT, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ADMIN_ENTITIES, ADMIN_ALLOWED_ROOT_ENTITIES, ADMIN_$MAP, ADMIN_NAVIGATION_STATES, ADMIN_VIEW_STATES>, mocks: {
18
+ export declare const createMockDomainRuntime: <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, CHAT_CONTEXT extends Record<string, unknown>, PUBLISHED_DATA extends Record<string, unknown>, SESSION_DATA extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>, ADMIN_ENTITIES extends DomainEntity<string>, ADMIN_ALLOWED_ROOT_ENTITIES extends ADMIN_ENTITIES, ADMIN_$MAP extends Record<ADMIN_ENTITIES['type'], $DomainEntity<ADMIN_ENTITIES>>, ADMIN_NAVIGATION_STATES extends string, ADMIN_VIEW_STATES extends string>(config: ApplicationConfig<ENTITIES, ALLOWED_ROOT_ENTITIES, $MAP, NAVIGATION_STATES, VIEW_STATES, TOOL_STATES, EXPORT_STATES, CHAT_CONTEXT, PUBLISHED_DATA, SESSION_DATA, FRONTEND_DATA, ADMIN_ENTITIES, ADMIN_ALLOWED_ROOT_ENTITIES, ADMIN_$MAP, ADMIN_NAVIGATION_STATES, ADMIN_VIEW_STATES>, mocks: {
19
19
  frontendData: FRONTEND_DATA;
20
20
  publishedData: PUBLISHED_DATA;
21
21
  sessionData: SESSION_DATA;
@@ -57,7 +57,7 @@ export declare const createMockDomainRuntime: <ENTITIES extends DomainEntity<str
57
57
  selectAdminPreset: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, import("../index.js").AnyProductPreset>;
58
58
  selectAdminModelVersion: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, number>;
59
59
  selectThemeOptions: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, import("@mui/material").ThemeOptions>;
60
- selectAssistant: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, import("../index.js").AssistantManifest | null>;
60
+ selectAssistant: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, Required<import("../index.js").AssistantManifest> | null>;
61
61
  selectConfiguratorFactory: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, import("../index.js").AnyDomainFactory>;
62
62
  selectAdminFactory: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, import("../index.js").AnyDomainFactory>;
63
63
  selectConfiguratorComponentOptics: import("@salsita-ai/common/utils").Selector<import("../index.js").SpecSelectorState, readonly import("../index.js").AnyDomainComponentOptic[]>;
@@ -100,7 +100,7 @@ export declare const createMockDomainRuntime: <ENTITIES extends DomainEntity<str
100
100
  getAdminPreset: () => import("../index.js").AnyProductPreset;
101
101
  getAdminModelVersion: () => number;
102
102
  getThemeOptions: () => import("@mui/material").ThemeOptions;
103
- getAssistant: () => import("../index.js").AssistantManifest | null;
103
+ getAssistant: () => Required<import("../index.js").AssistantManifest> | null;
104
104
  getConfiguratorFactory: () => import("../index.js").AnyDomainFactory;
105
105
  getAdminFactory: () => import("../index.js").AnyDomainFactory;
106
106
  getConfiguratorComponentOptics: () => readonly import("../index.js").AnyDomainComponentOptic[];
@@ -1 +1 @@
1
- import{createDomainRuntime as o}from"../domain-runtime/index.js";import{createMockDomainRuntimeServices as e}from"./create-mock-domain-runtime-services.js";import{createMockSessionContext as t}from"./create-mock-session-context.js";export const createMockDomainRuntime=(i,a)=>{let{sessionData:n,mode:r,role:s}=a,c={...i,createTransformers:o=>a.transformers.map(e=>e.transformer.register(o,e.priority??1/0))},m=o({config:c,services:e()});return m.actions.sessionContext.setSessionContext(t(s,n)),m.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",viewMode:"read"===r,revisionId:void 0,configurationId:"mock"}),m.actions.domainData.setDomainData({publishedData:a.publishedData,frontendData:a.frontendData,backendData:a.backendData}),m.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:a.entities,modelVersion:c.domain.domainFactory.modelVersion,rootEntityType:a.rootEntityType,schemaIdentity:c.domain.domainFactory}),m};
1
+ import{createDomainRuntime as o}from"../domain-runtime/index.js";import{createMockDomainRuntimeServices as t}from"./create-mock-domain-runtime-services.js";import{createMockSessionContext as e}from"./create-mock-session-context.js";export const createMockDomainRuntime=(a,i)=>{let{sessionData:n,mode:r,role:s}=i,c=o({config:a,services:t()}),m=c.getState().spec;return c.actions.spec.updateSpec({...m,configurator:{...m.configurator,createTransformers:o=>i.transformers.map(t=>t.transformer.register(o,t.priority??1/0))}}),c.actions.sessionContext.setSessionContext(e(s,n)),c.actions.access.setConfiguratorAccessInfo({raw:"mock-access-token",viewMode:"read"===r,revisionId:void 0,configurationId:"mock"}),c.actions.domainData.setDomainData({publishedData:i.publishedData,frontendData:i.frontendData,backendData:i.backendData}),c.actions.loadedData.completeConfiguratorLoad({initialRevisionId:"mock-revision",initialEntities:i.entities,modelVersion:a.domain.domainFactory.modelVersion,rootEntityType:i.rootEntityType,schemaIdentity:a.domain.domainFactory}),c};
@@ -0,0 +1 @@
1
+ export { type ExpressionModule, type ProjectModule, type ProjectModuleContract, SHARED_FOLDER_HINT, createContractError, isRecord, resolveActionModules, resolveExpressionModules, resolveListModule, } from './project-modules.js';
@@ -0,0 +1 @@
1
+ export{SHARED_FOLDER_HINT,createContractError,isRecord,resolveActionModules,resolveExpressionModules,resolveListModule}from"./project-modules.js";