@salsita-ai/sdk 0.50.0-develop.801a817d3f → 0.50.0-develop.8c8c362f86

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 (1070) hide show
  1. package/README.md +3 -3
  2. package/dist/admin/create-admin-pages-from-spec.d.ts +1 -1
  3. package/dist/application-spec/errors/diagnostic-codes.d.ts +9 -0
  4. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  5. package/dist/application-spec/errors/diagnostic-messages.d.ts +12 -0
  6. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  7. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  8. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  9. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  10. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  11. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  12. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +8 -1
  13. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  14. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  15. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  16. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  17. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  18. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  19. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  20. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  21. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  22. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.d.ts +2 -2
  23. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.js +1 -1
  24. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.d.ts +4 -2
  25. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +56 -56
  26. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.d.ts +1 -1
  27. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.js +1 -1
  28. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-phx-globals.js +3 -0
  29. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-relation-expressions.js +1 -1
  30. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.d.ts +6 -8
  31. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +11 -11
  32. package/dist/application-spec/generate-application/code/templates/domain-spec/index.d.ts +1 -1
  33. package/dist/application-spec/generate-application/code/templates/domain-spec/index.js +1 -1
  34. package/dist/application-spec/generate-application/code/templates/domain-spec.js +12 -12
  35. package/dist/application-spec/generate-application/code/templates/domain.js +5 -5
  36. package/dist/application-spec/generate-application/code/templates/globals.js +5 -4
  37. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -7
  38. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  39. package/dist/application-spec/generate-application/code/templates/package-json.js +1 -1
  40. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  41. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +93 -41
  42. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +10 -4
  43. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  44. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.d.ts +1 -0
  45. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +6 -0
  46. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +39 -13
  47. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +19 -7
  48. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +9 -4
  49. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -2
  50. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +1 -3
  51. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +1 -3
  52. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +4 -3
  53. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.js +1 -1
  54. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +2 -1
  55. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  56. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +2 -4
  57. package/dist/application-spec/parse-application-files/categorize/module-analysis.d.ts +1 -1
  58. package/dist/application-spec/parse-application-files/categorize/module-analysis.js +1 -1
  59. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +16 -3
  60. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  61. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-spec.js +1 -1
  62. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/configurator-spec.js +1 -1
  63. package/dist/application-spec/parse-application-files/spec/model/defaults.d.ts +7 -2
  64. package/dist/application-spec/parse-application-files/spec/model/defaults.js +1 -1
  65. package/dist/application-spec/parse-application-files/spec/relations/reference-field-type.d.ts +25 -0
  66. package/dist/application-spec/parse-application-files/spec/relations/reference-field-type.js +1 -0
  67. package/dist/application-spec/parse-application-files/spec/relations/relation-field-mismatch.d.ts +46 -0
  68. package/dist/application-spec/parse-application-files/spec/relations/relation-field-mismatch.js +1 -0
  69. package/dist/application-spec/parse-application-files/spec/relations/relations.d.ts +4 -3
  70. package/dist/application-spec/parse-application-files/spec/relations/relations.js +1 -1
  71. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.d.ts +3 -8
  72. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.js +1 -1
  73. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.d.ts +9 -43
  74. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  75. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +2 -2
  76. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant.d.ts +5 -21
  77. package/dist/application-spec/parse-application-files/spec/sections/infra.d.ts +2 -0
  78. package/dist/application-spec/parse-application-files/spec/sections/infra.js +1 -1
  79. package/dist/client/authorized-client.d.ts +3 -1
  80. package/dist/client/authorized-client.js +1 -1
  81. package/dist/client/contract.d.ts +34 -0
  82. package/dist/client/contract.js +1 -1
  83. package/dist/client/index.d.ts +2 -2
  84. package/dist/client/index.js +1 -1
  85. package/dist/client/local-authorized-client.d.ts +3 -1
  86. package/dist/client/local-authorized-client.js +1 -1
  87. package/dist/client/memory-authorized-client.d.ts +3 -1
  88. package/dist/client/memory-authorized-client.js +1 -1
  89. package/dist/client/phoenix-api.d.ts +367 -30
  90. package/dist/configurator/application-runtime/extensions/create-configurator-extensions.js +1 -1
  91. package/dist/configurator/application-runtime/extensions/selectors.d.ts +3 -1
  92. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  93. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +123 -8
  94. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  95. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.d.ts +85 -0
  96. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.js +1 -0
  97. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +5 -1
  98. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  99. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  100. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +20 -4
  101. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  102. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.d.ts +11 -0
  103. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.js +1 -0
  104. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  105. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  106. package/dist/configurator/common/configurator-interface.d.ts +5 -1
  107. package/dist/configurator/common/configurator-interface.js +1 -1
  108. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +6 -0
  109. package/dist/configurator/pages/DefaultConfiguratorLayout.js +1 -0
  110. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  111. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  112. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +2 -1
  113. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -1
  114. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -2
  115. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  116. package/dist/configurator/ui/assistant/thread-items.d.ts +13 -2
  117. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  118. package/dist/configurator/ui/assistant/tool-chip.d.ts +8 -1
  119. package/dist/configurator/ui/assistant/tool-chip.js +1 -1
  120. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.d.ts +1 -0
  121. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.js +1 -0
  122. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.d.ts +11 -0
  123. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.js +1 -0
  124. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.d.ts +101 -0
  125. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.js +16 -0
  126. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.d.ts +1 -0
  127. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.js +1 -0
  128. package/dist/configurator/ui/configurator-layout/slots/slots.d.ts +1 -0
  129. package/dist/configurator/ui/configurator-layout/slots/slots.js +1 -1
  130. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.d.ts +0 -74
  131. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -20
  132. package/dist/configurator/ui/configurator-layout/universal/DesktopPreview.js +1 -1
  133. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  134. package/dist/configurator/ui/configurator-layout/universal/MobilePreview.js +1 -1
  135. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.d.ts +47 -0
  136. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.js +1 -0
  137. package/dist/configurator/ui/configurator-layout/universal/use-scene-safe-area.d.ts +11 -26
  138. package/dist/configurator/ui/configurator-layout/universal/use-scene-safe-area.js +1 -1
  139. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +100 -117
  140. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  141. package/dist/docs/complex-use-cases/sketching.mdx +0 -38
  142. package/dist/docs/controls/select-attribute/cardselect.mdx +9 -13
  143. package/dist/docs/index.json +32 -1
  144. package/dist/docs/integrations/woocommerce/local-development.mdx +1 -1
  145. package/dist/docs/layouts/custom-layout.mdx +981 -0
  146. package/dist/docs/layouts/custom-price.mdx +14 -16
  147. package/dist/docs/layouts/sidebar/in-a-custom-layout.mdx +380 -0
  148. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  149. package/dist/docs/other-features/domain-actions.mdx +1 -1
  150. package/dist/docs/other-features/side-effects.mdx +58 -48
  151. package/dist/docs/other-features/transformers.mdx +5 -1
  152. package/dist/docs/other-features/violation-messages.mdx +52 -56
  153. package/dist/docs/phoenix/admin.mdx +9 -24
  154. package/dist/docs/phoenix/configurator-interface.mdx +106 -65
  155. package/dist/docs/phoenix/deployments.mdx +1 -1
  156. package/dist/docs/phoenix/domain-model.mdx +4 -0
  157. package/dist/docs/phoenix/expression-context.mdx +11 -3
  158. package/dist/docs/phoenix/getting-started.mdx +1 -1
  159. package/dist/docs/phoenix/localization.mdx +3 -22
  160. package/dist/docs/phoenix/phoenix-cli.mdx +123 -48
  161. package/dist/docs/phoenix/project-structure.mdx +25 -11
  162. package/dist/docs/phoenix/quickstart.mdx +2 -2
  163. package/dist/docs/phoenix/sdk-builder-workflow.mdx +12 -11
  164. package/dist/docs/phoenix/testing.mdx +140 -0
  165. package/dist/docs/phoenix/webhook-membership.mdx +10 -9
  166. package/dist/docs/phoenix/webhooks.mdx +2 -2
  167. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  168. package/dist/docs/relations/hierarchy.mdx +13 -2
  169. package/dist/docs/ux-guidelines/choosing-a-control.mdx +11 -0
  170. package/dist/domain/admin-domain/__generated/enhanced-model.d.ts +1 -2
  171. package/dist/domain/admin-domain/__generated/model/versions/v1.d.ts +1 -1
  172. package/dist/domain/admin-domain/__generated/model/versions/v2.d.ts +1 -1
  173. package/dist/domain/admin-domain/__generated/model/versions/v3.d.ts +1 -1
  174. package/dist/domain/admin-domain/__generated/model/versions/v4.d.ts +1 -1
  175. package/dist/domain/admin-domain/__generated/model/versions/v5.d.ts +1 -1
  176. package/dist/domain/admin-domain/__generated/model/versions/v6.d.ts +2 -2
  177. package/dist/domain/admin-domain/__generated/model/versions/v6.js +1 -1
  178. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +26 -14
  179. package/dist/domain/admin-domain/implementation/common-admin-migrations.d.ts +1 -1
  180. package/dist/domain/admin-domain/implementation/common-admin-publish.d.ts +1 -2
  181. package/dist/domain/admin-domain/index.d.ts +9 -5
  182. package/dist/domain/admin-domain/index.js +1 -1
  183. package/dist/domain/application/GetApplicationWrapperHandler.d.ts +2 -2
  184. package/dist/domain/application/GetThemeHandler.d.ts +1 -1
  185. package/dist/domain/application/GetWebComponentOptions.d.ts +1 -1
  186. package/dist/domain/application/admin-page-factories.d.ts +1 -2
  187. package/dist/domain/application/application-config.d.ts +28 -97
  188. package/dist/domain/application/assistant/assistant-fields.d.ts +12 -0
  189. package/dist/domain/application/assistant/assistant-fields.js +1 -0
  190. package/dist/domain/application/assistant/assistant-manifest.d.ts +71 -0
  191. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +131 -0
  192. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -0
  193. package/dist/domain/application/assistant/assistant-value-type.d.ts +9 -0
  194. package/dist/domain/application/assistant/assistant-value-type.js +1 -0
  195. package/dist/domain/application/assistant/build-assistant-lenses.d.ts +14 -0
  196. package/dist/domain/application/assistant/build-assistant-lenses.js +5 -0
  197. package/dist/domain/application/assistant/build-assistant-manifest.d.ts +4 -0
  198. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -0
  199. package/dist/domain/application/assistant/create-assistant-execution-schema.d.ts +32 -0
  200. package/dist/domain/application/assistant/create-assistant-execution-schema.js +1 -0
  201. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +3 -0
  202. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  203. package/dist/domain/application/assistant/index.d.ts +9 -0
  204. package/dist/domain/application/assistant/index.js +1 -0
  205. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +20 -0
  206. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.js +1 -0
  207. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +10 -0
  208. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -0
  209. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +48 -0
  210. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -0
  211. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +15 -0
  212. package/dist/domain/application/assistant/session-setup/create-session-assistant.js +1 -0
  213. package/dist/domain/application/assistant/session-setup/index.d.ts +4 -0
  214. package/dist/domain/application/assistant/session-setup/index.js +1 -0
  215. package/dist/domain/application/assistant-field-options.d.ts +2 -3
  216. package/dist/domain/application/assistant-mutations.d.ts +3 -5
  217. package/dist/domain/application/assistant-mutations.js +1 -1
  218. package/dist/domain/application/assistant-recipe-groups.d.ts +3 -7
  219. package/dist/domain/application/configurator-builder.d.ts +33 -18
  220. package/dist/domain/application/configurator-builder.js +1 -1
  221. package/dist/domain/application/create-initial-published-data.d.ts +6 -7
  222. package/dist/domain/application/index.d.ts +3 -6
  223. package/dist/domain/application/index.js +1 -1
  224. package/dist/domain/application/published-data/DataRowValidatorHandler.d.ts +1 -1
  225. package/dist/domain/application/published-data/FilterPublishedChunksHandler.d.ts +1 -1
  226. package/dist/domain/application/published-data/MapPublishedChunkedDataHandler.d.ts +1 -1
  227. package/dist/domain/application/published-data/MapPublishedRevisionDataHandler.d.ts +1 -1
  228. package/dist/domain/application/published-data/SheetValidatorHandler.d.ts +1 -1
  229. package/dist/domain/application/published-data/build-legend-data.d.ts +1 -1
  230. package/dist/domain/application/published-data/create-finalize-admin-domain.d.ts +1 -2
  231. package/dist/domain/application/published-data/format-field-type.d.ts +1 -1
  232. package/dist/domain/application/published-data/map-data-to-sheet.d.ts +1 -1
  233. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +3 -3
  234. package/dist/domain/application/published-data/map-published-data.d.ts +7 -4
  235. package/dist/domain/application/published-data/validate-sheet-data.d.ts +1 -1
  236. package/dist/domain/available-system-components.js +1 -1
  237. package/dist/domain/core/action/action-factory.d.ts +11 -0
  238. package/dist/domain/core/{action.d.ts → action/action.d.ts} +22 -18
  239. package/dist/domain/core/action/index.d.ts +2 -0
  240. package/dist/domain/core/action/index.js +1 -0
  241. package/dist/domain/{components → core/component}/component-reader-types.d.ts +1 -2
  242. package/dist/domain/{components → core/component}/debug-state-component.d.ts +1 -1
  243. package/dist/domain/core/component/debug-state-component.js +1 -0
  244. package/dist/domain/core/component/domain-component-optic.d.ts +65 -0
  245. package/dist/domain/core/component/domain-component-optic.js +16 -0
  246. package/dist/domain/{components → core/component}/drag-state-component.d.ts +1 -1
  247. package/dist/domain/core/component/drag-state-component.js +1 -0
  248. package/dist/domain/{components → core/component}/export-state-component.d.ts +1 -1
  249. package/dist/domain/core/component/export-state-component.js +1 -0
  250. package/dist/domain/{components → core/component}/fullscreen-state-component.d.ts +1 -1
  251. package/dist/domain/core/component/fullscreen-state-component.js +1 -0
  252. package/dist/domain/{components → core/component}/group-components-by-entity-id-and-name.d.ts +1 -2
  253. package/dist/domain/core/component/group-components-by-entity-id-and-name.js +1 -0
  254. package/dist/domain/{components → core/component}/hover-state-component.d.ts +1 -1
  255. package/dist/domain/core/component/hover-state-component.js +1 -0
  256. package/dist/domain/core/component/index.d.ts +18 -0
  257. package/dist/domain/core/component/index.js +1 -0
  258. package/dist/domain/{components → core/component}/legacy-filter.d.ts +4 -19
  259. package/dist/domain/{components → core/component}/navigation-state-component.d.ts +1 -1
  260. package/dist/domain/core/component/navigation-state-component.js +1 -0
  261. package/dist/domain/{components → core/component}/selection-state-component.d.ts +1 -1
  262. package/dist/domain/core/component/selection-state-component.js +1 -0
  263. package/dist/domain/{components → core/component}/system-component-builder.d.ts +1 -2
  264. package/dist/domain/core/component/system-component-builder.js +1 -0
  265. package/dist/domain/{components → core/component}/system-component-filter.d.ts +38 -20
  266. package/dist/domain/core/component/system-virtual-entity.js +1 -0
  267. package/dist/domain/{components → core/component}/tool-state-component.d.ts +1 -1
  268. package/dist/domain/core/component/tool-state-component.js +1 -0
  269. package/dist/domain/{components → core/component}/updates.d.ts +9 -10
  270. package/dist/domain/{components → core/component}/view-state-component.d.ts +1 -1
  271. package/dist/domain/core/component/view-state-component.js +1 -0
  272. package/dist/domain/{components → core/component}/viewport-state-component.d.ts +1 -1
  273. package/dist/domain/core/component/viewport-state-component.js +1 -0
  274. package/dist/domain/core/data-schema/data-cell-value.d.ts +4 -0
  275. package/dist/domain/core/data-schema/data-schema-array-field.d.ts +5 -0
  276. package/dist/domain/core/data-schema/data-schema-field-object.d.ts +4 -0
  277. package/dist/domain/core/data-schema/data-schema-field.d.ts +2 -0
  278. package/dist/domain/core/data-schema/data-schema-localized-field.d.ts +4 -0
  279. package/dist/domain/core/data-schema/data-schema-localized-field.js +1 -0
  280. package/dist/domain/core/data-schema/data-schema-primitive-field.d.ts +5 -0
  281. package/dist/domain/core/data-schema/data-schema-primitive-field.js +1 -0
  282. package/dist/domain/core/data-schema/data-schema.d.ts +2 -0
  283. package/dist/domain/core/data-schema/data-schema.js +1 -0
  284. package/dist/domain/core/data-schema/index.d.ts +7 -0
  285. package/dist/domain/core/data-schema/index.js +1 -0
  286. package/dist/domain/core/decoder/create-decoder.d.ts +6 -0
  287. package/dist/domain/core/decoder/create-decoder.js +1 -0
  288. package/dist/domain/core/decoder/decoder.d.ts +6 -0
  289. package/dist/domain/core/decoder/decoder.js +1 -0
  290. package/dist/domain/core/decoder/index.d.ts +2 -0
  291. package/dist/domain/core/decoder/index.js +1 -0
  292. package/dist/domain/core/domain-factory.d.ts +4 -5
  293. package/dist/domain/core/domain-factory.js +1 -1
  294. package/dist/domain/core/domain.d.ts +4 -5
  295. package/dist/domain/core/domain.js +1 -1
  296. package/dist/domain/core/emission/index.d.ts +8 -0
  297. package/dist/domain/core/emission/index.js +1 -0
  298. package/dist/domain/core/emission/reset-state-emission.d.ts +12 -0
  299. package/dist/domain/core/emission/reset-state-emission.js +1 -0
  300. package/dist/domain/core/emission/state-emission.d.ts +4 -0
  301. package/dist/domain/core/emission/state-emission.js +1 -0
  302. package/dist/domain/core/emission/state-update-emission.d.ts +14 -0
  303. package/dist/domain/core/emission/state-update-emission.js +1 -0
  304. package/dist/domain/core/emission/state-validation-result.d.ts +18 -0
  305. package/dist/domain/core/emission/state-validation-result.js +1 -0
  306. package/dist/domain/core/emission/transformation-log.d.ts +2 -0
  307. package/dist/domain/core/emission/transformation-log.js +1 -0
  308. package/dist/domain/core/emission/transformer-log-entry.d.ts +6 -0
  309. package/dist/domain/core/emission/transformer-log-entry.js +1 -0
  310. package/dist/domain/core/emission/transformer-log.d.ts +11 -0
  311. package/dist/domain/core/emission/transformer-log.js +1 -0
  312. package/dist/domain/core/emission/transformer-phase.d.ts +1 -0
  313. package/dist/domain/core/emission/transformer-phase.js +1 -0
  314. package/dist/domain/core/expression/aliased-expressions.d.ts +10 -0
  315. package/dist/domain/core/expression/aliased-expressions.js +1 -0
  316. package/dist/domain/core/expression/constant-expressions.d.ts +16 -0
  317. package/dist/domain/core/expression/constant-expressions.js +1 -0
  318. package/dist/domain/core/expression/custom-expression.d.ts +25 -0
  319. package/dist/domain/core/expression/custom-expression.js +1 -0
  320. package/dist/domain/core/expression/expression.d.ts +46 -0
  321. package/dist/domain/core/expression/expression.js +1 -0
  322. package/dist/domain/core/expression/index.d.ts +4 -0
  323. package/dist/domain/core/expression/index.js +1 -0
  324. package/dist/domain/core/index.d.ts +13 -17
  325. package/dist/domain/core/index.js +1 -1
  326. package/dist/domain/{invariants → core/invariant}/builtin-invariant.d.ts +2 -2
  327. package/dist/domain/core/invariant/custom-invariants.d.ts +13 -0
  328. package/dist/domain/core/invariant/custom-invariants.js +1 -0
  329. package/dist/domain/core/invariant/index.d.ts +5 -0
  330. package/dist/domain/core/invariant/index.js +1 -0
  331. package/dist/domain/core/invariant/invariants.d.ts +10 -0
  332. package/dist/domain/core/invariant/invariants.js +1 -0
  333. package/dist/domain/core/invariant/violation-component.js +1 -0
  334. package/dist/domain/{invariants → core/invariant}/violation.d.ts +2 -2
  335. package/dist/domain/core/{component.d.ts → model/component.d.ts} +1 -1
  336. package/dist/domain/core/model/index.d.ts +6 -0
  337. package/dist/domain/core/model/index.js +1 -0
  338. package/dist/domain/core/{reflection.d.ts → model/reflection.d.ts} +1 -1
  339. package/dist/domain/core/model/reflection.js +1 -0
  340. package/dist/domain/core/recipe/index.d.ts +1 -0
  341. package/dist/domain/core/recipe/index.js +1 -0
  342. package/dist/domain/core/recipe/recipes.d.ts +23 -0
  343. package/dist/domain/core/recipe/recipes.js +1 -0
  344. package/dist/domain/core/relation/all-of-type-relation.d.ts +19 -0
  345. package/dist/domain/core/relation/all-of-type-relation.js +1 -0
  346. package/dist/domain/{relations → core/relation}/component-factories.d.ts +1 -2
  347. package/dist/domain/core/relation/component-factories.js +1 -0
  348. package/dist/domain/{relations → core/relation}/composed-of.d.ts +1 -1
  349. package/dist/domain/core/relation/composed-of.js +1 -0
  350. package/dist/domain/core/relation/direct-relation.d.ts +17 -0
  351. package/dist/domain/core/relation/index.d.ts +8 -0
  352. package/dist/domain/core/relation/index.js +1 -0
  353. package/dist/domain/core/relation/indirect-relation.d.ts +25 -0
  354. package/dist/domain/core/relation/indirect-relation.js +1 -0
  355. package/dist/domain/{relations → core/relation}/reference-component.d.ts +4 -5
  356. package/dist/domain/core/relation/reference-component.js +1 -0
  357. package/dist/domain/{relations → core/relation}/reference-field.d.ts +1 -1
  358. package/dist/domain/core/relation/reference-field.js +1 -0
  359. package/dist/domain/core/relation/relation-factory.d.ts +22 -0
  360. package/dist/domain/core/relation/relation-factory.js +1 -0
  361. package/dist/domain/core/schema/enhanced-json-schema.js +1 -0
  362. package/dist/domain/core/schema/extended-schema-validator.js +1 -0
  363. package/dist/domain/core/schema/index.d.ts +3 -0
  364. package/dist/domain/core/schema/index.js +1 -0
  365. package/dist/domain/core/schema/schema-validator.js +1 -0
  366. package/dist/domain/core/state/id-sequence.d.ts +15 -0
  367. package/dist/domain/core/state/id-sequence.js +1 -0
  368. package/dist/domain/core/state/index.d.ts +3 -0
  369. package/dist/domain/core/state/index.js +1 -0
  370. package/dist/domain/core/{migrations.d.ts → state/migrations.d.ts} +15 -47
  371. package/dist/domain/core/state/migrations.js +1 -0
  372. package/dist/domain/core/{state.d.ts → state/state.d.ts} +2 -3
  373. package/dist/domain/domain-builder.d.ts +11 -11
  374. package/dist/domain/domain-builder.js +1 -1
  375. package/dist/domain/domain-context/action-system/action-system.d.ts +2 -4
  376. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  377. package/dist/domain/domain-context/action-system/index.d.ts +1 -0
  378. package/dist/domain/domain-context/action-system/index.js +1 -0
  379. package/dist/domain/domain-context/analytics-system/index.d.ts +2 -0
  380. package/dist/domain/domain-context/analytics-system/index.js +1 -0
  381. package/dist/domain/domain-context/create-transformer.d.ts +2 -2
  382. package/dist/domain/domain-context/dimension-system/dimension-state.js +1 -1
  383. package/dist/domain/domain-context/dimension-system/dimension-system.d.ts +3 -4
  384. package/dist/domain/domain-context/dimension-system/dimension-system.js +1 -1
  385. package/dist/domain/domain-context/dimension-system/index.d.ts +1 -0
  386. package/dist/domain/domain-context/dimension-system/index.js +1 -0
  387. package/dist/domain/domain-context/domain-context-systems.d.ts +8 -10
  388. package/dist/domain/domain-context/index.d.ts +8 -18
  389. package/dist/domain/domain-context/index.js +1 -1
  390. package/dist/domain/domain-context/navigation-system/index.d.ts +3 -0
  391. package/dist/domain/domain-context/navigation-system/index.js +1 -0
  392. package/dist/domain/domain-context/navigation-system/navigation-system.d.ts +5 -8
  393. package/dist/domain/domain-context/navigation-system/navigation-system.js +1 -1
  394. package/dist/domain/domain-context/navigation-system/navigation-updates.d.ts +1 -12
  395. package/dist/domain/domain-context/navigation-system/navigation-updates.js +1 -1
  396. package/dist/domain/domain-context/navigation-system/selection-transformers.d.ts +2 -2
  397. package/dist/domain/domain-context/navigation-system/selection-transformers.js +1 -1
  398. package/dist/domain/domain-context/recipe-system/index.d.ts +1 -0
  399. package/dist/domain/domain-context/recipe-system/index.js +1 -0
  400. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.d.ts +2 -4
  401. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.js +1 -1
  402. package/dist/domain/domain-context/relation-transformers/cascade-deletes.d.ts +3 -3
  403. package/dist/domain/domain-context/relation-transformers/cascade-deletes.js +1 -1
  404. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.d.ts +3 -3
  405. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.js +1 -1
  406. package/dist/domain/domain-context/relation-transformers/create-entity-refs.d.ts +3 -3
  407. package/dist/domain/domain-context/relation-transformers/create-entity-refs.js +2 -2
  408. package/dist/domain/domain-context/relation-transformers/index.d.ts +4 -0
  409. package/dist/domain/domain-context/relation-transformers/index.js +1 -0
  410. package/dist/domain/domain-context/relation-transformers/replace-refs.d.ts +3 -3
  411. package/dist/domain/domain-context/relation-transformers/replace-refs.js +1 -1
  412. package/dist/domain/domain-context/store-system/apply-updates.d.ts +1 -3
  413. package/dist/domain/domain-context/store-system/apply-updates.js +1 -1
  414. package/dist/domain/domain-context/store-system/index.d.ts +4 -0
  415. package/dist/domain/domain-context/store-system/index.js +1 -0
  416. package/dist/domain/domain-context/store-system/next-domain-entity-id.d.ts +1 -13
  417. package/dist/domain/domain-context/store-system/next-domain-entity-id.js +1 -1
  418. package/dist/domain/domain-context/store-system/reconcile-projected-entities.d.ts +1 -2
  419. package/dist/domain/domain-context/store-system/reconcile-projected-entities.js +1 -1
  420. package/dist/domain/domain-context/store-system/store-system.d.ts +2 -39
  421. package/dist/domain/domain-context/store-system/store-system.js +2 -2
  422. package/dist/domain/domain-context/store-system/system-state.d.ts +2 -4
  423. package/dist/domain/domain-context/store-system/system-state.js +1 -1
  424. package/dist/domain/domain-context/transformers/actions-builder.d.ts +1 -2
  425. package/dist/domain/domain-context/transformers/actions-builder.js +1 -1
  426. package/dist/domain/domain-context/transformers/auto-snap-transformer.d.ts +6 -10
  427. package/dist/domain/domain-context/transformers/auto-snap-transformer.js +1 -1
  428. package/dist/domain/domain-context/transformers/chain-builder.d.ts +3 -3
  429. package/dist/domain/domain-context/transformers/context.d.ts +2 -7
  430. package/dist/domain/domain-context/transformers/context.js +1 -1
  431. package/dist/domain/domain-context/transformers/entity-builder.d.ts +1 -5
  432. package/dist/domain/domain-context/transformers/entity-builder.js +1 -1
  433. package/dist/domain/domain-context/transformers/index.d.ts +1 -1
  434. package/dist/domain/domain-context/transformers/index.js +1 -1
  435. package/dist/domain/domain-context/transformers/then-builder.d.ts +1 -2
  436. package/dist/domain/domain-context/transformers/then-builder.js +1 -1
  437. package/dist/domain/domain-context/transformers/when-builder.d.ts +3 -9
  438. package/dist/domain/domain-context/transformers/when-builder.js +1 -1
  439. package/dist/domain/domain-context/undo-system.d.ts +2 -3
  440. package/dist/domain/domain-runtime/access/selectors.d.ts +9 -0
  441. package/dist/domain/domain-runtime/access/selectors.js +1 -1
  442. package/dist/domain/domain-runtime/access/types.d.ts +2 -0
  443. package/dist/domain/domain-runtime/access/types.js +1 -1
  444. package/dist/domain/domain-runtime/domain-context/action-context.d.ts +11 -0
  445. package/dist/domain/domain-runtime/domain-context/action-context.js +1 -0
  446. package/dist/domain/domain-runtime/domain-context/component-reader.d.ts +1 -4
  447. package/dist/domain/domain-runtime/domain-context/component-reader.js +1 -1
  448. package/dist/domain/domain-runtime/domain-context/domain-context.js +1 -1
  449. package/dist/domain/domain-runtime/domain-context/expression-context.d.ts +8 -0
  450. package/dist/domain/domain-runtime/domain-context/expression-context.js +1 -0
  451. package/dist/domain/domain-runtime/domain-context/index.d.ts +3 -0
  452. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.d.ts +18 -0
  453. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.js +1 -0
  454. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +19 -25
  455. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  456. package/dist/domain/domain-runtime/domain-context/types.d.ts +4 -1
  457. package/dist/domain/domain-runtime/domain-runtime.d.ts +88 -72
  458. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +19 -0
  459. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -0
  460. package/dist/domain/domain-runtime/errors/implementation-error.d.ts +46 -0
  461. package/dist/domain/domain-runtime/errors/implementation-error.js +1 -0
  462. package/dist/domain/domain-runtime/errors/implementation-errors.d.ts +13 -0
  463. package/dist/domain/domain-runtime/errors/implementation-errors.js +1 -0
  464. package/dist/domain/domain-runtime/errors/index.d.ts +4 -0
  465. package/dist/domain/domain-runtime/errors/index.js +1 -0
  466. package/dist/domain/domain-runtime/errors/to-implementation-errors.d.ts +10 -0
  467. package/dist/domain/domain-runtime/errors/to-implementation-errors.js +1 -0
  468. package/dist/domain/domain-runtime/index.d.ts +1 -0
  469. package/dist/domain/domain-runtime/index.js +1 -1
  470. package/dist/domain/domain-runtime/spec/create-violation-expressions.d.ts +24 -0
  471. package/dist/domain/domain-runtime/spec/create-violation-expressions.js +1 -0
  472. package/dist/domain/domain-runtime/spec/index.d.ts +5 -0
  473. package/dist/domain/domain-runtime/spec/index.js +1 -1
  474. package/dist/domain/domain-runtime/spec/initialize.d.ts +11 -0
  475. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  476. package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.d.ts +1 -2
  477. package/dist/domain/{application → domain-runtime/spec/module-checks}/element-registration.d.ts +6 -1
  478. package/dist/domain/domain-runtime/spec/module-checks/element-registration.js +1 -0
  479. package/dist/domain/{application → domain-runtime/spec/module-checks}/handler-registration.d.ts +5 -0
  480. package/dist/domain/domain-runtime/spec/module-checks/handler-registration.js +1 -0
  481. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +8 -0
  482. package/dist/domain/domain-runtime/spec/module-checks/index.js +1 -0
  483. package/dist/domain/domain-runtime/spec/module-checks/project-modules.d.ts +32 -0
  484. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +1 -0
  485. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.d.ts +4 -0
  486. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.js +1 -0
  487. package/dist/domain/domain-runtime/spec/module-checks/resolve-component-optic-modules.d.ts +4 -0
  488. package/dist/domain/domain-runtime/spec/module-checks/resolve-component-optic-modules.js +1 -0
  489. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.d.ts +15 -0
  490. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -0
  491. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.d.ts +22 -0
  492. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +1 -0
  493. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.d.ts +6 -0
  494. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.js +1 -0
  495. package/dist/domain/{actions → domain-runtime/spec}/prepare-action-implementations.d.ts +1 -1
  496. package/dist/domain/domain-runtime/spec/prepare-action-implementations.js +5 -0
  497. package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.d.ts +1 -1
  498. package/dist/domain/domain-runtime/spec/selectors.d.ts +7 -8
  499. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  500. package/dist/domain/domain-runtime/spec/types.d.ts +6 -6
  501. package/dist/domain/{system-components → extensions}/angle-indicator.d.ts +1 -1
  502. package/dist/domain/extensions/angle-indicator.js +1 -0
  503. package/dist/domain/extensions/attribute-switch.js +1 -0
  504. package/dist/domain/{system-components → extensions}/autorotate-camera-component.d.ts +1 -1
  505. package/dist/domain/extensions/autorotate-camera-component.js +1 -0
  506. package/dist/domain/{system-components → extensions}/basic-sidebar-footer.d.ts +1 -1
  507. package/dist/domain/extensions/basic-sidebar-footer.js +1 -0
  508. package/dist/domain/extensions/camera-based-hidden-entity-object.js +1 -0
  509. package/dist/domain/extensions/camera-based-hidden-entity.js +1 -0
  510. package/dist/domain/{system-components → extensions}/canvas-config.d.ts +1 -1
  511. package/dist/domain/extensions/canvas-config.js +1 -0
  512. package/dist/domain/extensions/canvas-custom-environment.js +1 -0
  513. package/dist/domain/{system-components → extensions}/canvas-padding.d.ts +1 -1
  514. package/dist/domain/extensions/canvas-padding.js +1 -0
  515. package/dist/domain/{system-components → extensions}/canvas-preset-environment.d.ts +1 -1
  516. package/dist/domain/extensions/canvas-preset-environment.js +1 -0
  517. package/dist/domain/{system-components → extensions}/child-entity-recipe-hierarchy.d.ts +2 -2
  518. package/dist/domain/extensions/child-entity-recipe-hierarchy.js +1 -0
  519. package/dist/domain/extensions/client-side-image.js +1 -0
  520. package/dist/domain/extensions/color-value.js +1 -0
  521. package/dist/domain/{system-components → extensions}/common/angle-indicator-schema.d.ts +1 -1
  522. package/dist/domain/extensions/common/angle-indicator-schema.js +1 -0
  523. package/dist/domain/{system-components → extensions}/common/dimension-indicator-schema.d.ts +1 -1
  524. package/dist/domain/extensions/common/dimension-indicator-schema.js +1 -0
  525. package/dist/domain/extensions/common/index.d.ts +4 -0
  526. package/dist/domain/extensions/common/index.js +1 -0
  527. package/dist/domain/{system-components → extensions}/custom-header.d.ts +2 -2
  528. package/dist/domain/{system-components → extensions}/custom-header.js +1 -1
  529. package/dist/domain/extensions/custom-price-footer.js +1 -0
  530. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.d.ts +2 -2
  531. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.js +1 -1
  532. package/dist/domain/{system-components → extensions}/dimension-indicator.d.ts +1 -1
  533. package/dist/domain/extensions/dimension-indicator.js +1 -0
  534. package/dist/domain/{system-components → extensions}/editable-angle-indicator.d.ts +3 -2
  535. package/dist/domain/extensions/editable-angle-indicator.js +1 -0
  536. package/dist/domain/{system-components → extensions}/editable-distance-dimension-indicator.d.ts +3 -2
  537. package/dist/domain/extensions/editable-distance-dimension-indicator.js +1 -0
  538. package/dist/domain/{system-components → extensions}/editable-offset-indicator.d.ts +3 -2
  539. package/dist/domain/extensions/editable-offset-indicator.js +1 -0
  540. package/dist/domain/{system-components → extensions}/editable-size-indicator.d.ts +3 -2
  541. package/dist/domain/extensions/editable-size-indicator.js +1 -0
  542. package/dist/domain/{system-components → extensions}/entity-header.d.ts +1 -1
  543. package/dist/domain/extensions/entity-header.js +1 -0
  544. package/dist/domain/{system-components → extensions}/exit-tool-mode-fab.d.ts +1 -1
  545. package/dist/domain/extensions/exit-tool-mode-fab.js +1 -0
  546. package/dist/domain/{system-components → extensions}/finalize-action.d.ts +1 -1
  547. package/dist/domain/extensions/finalize-action.js +1 -0
  548. package/dist/domain/extensions/finalize-component.js +1 -0
  549. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -0
  550. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -0
  551. package/dist/domain/{system-components → extensions}/fixed-header.d.ts +1 -1
  552. package/dist/domain/extensions/fixed-header.js +1 -0
  553. package/dist/domain/{system-components → extensions}/floating-header.d.ts +1 -1
  554. package/dist/domain/extensions/floating-header.js +1 -0
  555. package/dist/domain/{system-components → extensions}/hidden-header.d.ts +1 -1
  556. package/dist/domain/extensions/hidden-header.js +1 -0
  557. package/dist/domain/{system-components → extensions}/hidden-sidebar-footer.d.ts +1 -1
  558. package/dist/domain/extensions/hidden-sidebar-footer.js +1 -0
  559. package/dist/domain/{system-components → extensions}/horizontal-tabs.d.ts +1 -1
  560. package/dist/domain/extensions/horizontal-tabs.js +1 -0
  561. package/dist/domain/extensions/index.d.ts +69 -0
  562. package/dist/domain/extensions/index.js +1 -0
  563. package/dist/domain/{system-components → extensions}/list-selector-dimension-indicator.d.ts +3 -2
  564. package/dist/domain/extensions/list-selector-dimension-indicator.js +1 -0
  565. package/dist/domain/extensions/multilingual-text-value.js +1 -0
  566. package/dist/domain/extensions/navigation-steps.js +1 -0
  567. package/dist/domain/{system-components → extensions}/offset-anchors.d.ts +1 -1
  568. package/dist/domain/extensions/offset-anchors.js +1 -0
  569. package/dist/domain/{system-components → extensions}/offset-indicator.d.ts +1 -2
  570. package/dist/domain/extensions/offset-indicator.js +1 -0
  571. package/dist/domain/{system-components → extensions}/offset.d.ts +1 -1
  572. package/dist/domain/extensions/offset.js +1 -0
  573. package/dist/domain/{system-components → extensions}/other-action.d.ts +1 -1
  574. package/dist/domain/extensions/other-action.js +1 -0
  575. package/dist/domain/{system-components → extensions}/property-page.d.ts +2 -2
  576. package/dist/domain/extensions/property-page.js +1 -0
  577. package/dist/domain/{system-components → extensions}/read-sidebar-footer.d.ts +1 -1
  578. package/dist/domain/extensions/read-sidebar-footer.js +1 -0
  579. package/dist/domain/{system-components → extensions}/replace-entity-recipe-hierarchy.d.ts +2 -2
  580. package/dist/domain/extensions/replace-entity-recipe-hierarchy.js +1 -0
  581. package/dist/domain/extensions/rotatable.js +1 -0
  582. package/dist/domain/extensions/rotation-handle.js +1 -0
  583. package/dist/domain/extensions/save-template-thumbnail.js +1 -0
  584. package/dist/domain/{system-components → extensions}/scene-entity-add-fab.d.ts +1 -1
  585. package/dist/domain/extensions/scene-entity-add-fab.js +1 -0
  586. package/dist/domain/extensions/scene-entity-animation.js +1 -0
  587. package/dist/domain/extensions/scene-entity-control.js +1 -0
  588. package/dist/domain/{system-components → extensions}/scene-entity-delete-fab.d.ts +1 -1
  589. package/dist/domain/extensions/scene-entity-delete-fab.js +1 -0
  590. package/dist/domain/extensions/scene-entity-floor-object.js +1 -0
  591. package/dist/domain/{system-components → extensions}/scene-entity-html-hotspot.d.ts +1 -1
  592. package/dist/domain/extensions/scene-entity-html-hotspot.js +1 -0
  593. package/dist/domain/{system-components → extensions}/scene-entity-navigation-hotspot.d.ts +1 -1
  594. package/dist/domain/extensions/scene-entity-navigation-hotspot.js +1 -0
  595. package/dist/domain/{system-components → extensions}/scene-entity-object-html-hotspot.d.ts +1 -1
  596. package/dist/domain/extensions/scene-entity-object-html-hotspot.js +1 -0
  597. package/dist/domain/{system-components → extensions}/scene-entity-select-hotspot.d.ts +1 -1
  598. package/dist/domain/extensions/scene-entity-select-hotspot.js +1 -0
  599. package/dist/domain/extensions/scene-entity-wall-object.js +1 -0
  600. package/dist/domain/extensions/selectable-component.js +1 -0
  601. package/dist/domain/{system-components → extensions}/sidebar-tabs.d.ts +1 -1
  602. package/dist/domain/extensions/sidebar-tabs.js +1 -0
  603. package/dist/domain/extensions/simple-summary.js +1 -0
  604. package/dist/domain/{system-components → extensions}/size.d.ts +1 -1
  605. package/dist/domain/extensions/size.js +1 -0
  606. package/dist/domain/{system-components → extensions}/sketching-draw.d.ts +1 -1
  607. package/dist/domain/extensions/sketching-draw.js +1 -0
  608. package/dist/domain/{system-components → extensions}/sketching-edit.d.ts +2 -2
  609. package/dist/domain/extensions/sketching-edit.js +1 -0
  610. package/dist/domain/extensions/summary-component.js +1 -0
  611. package/dist/domain/extensions/text-value.js +1 -0
  612. package/dist/domain/extensions/tool-controls.js +1 -0
  613. package/dist/domain/{system-components → extensions}/tool-menu-fab.d.ts +2 -2
  614. package/dist/domain/extensions/tool-menu-fab.js +1 -0
  615. package/dist/domain/{system-components → extensions}/toolbar.d.ts +2 -2
  616. package/dist/domain/{system-components → extensions}/toolbar.js +1 -1
  617. package/dist/domain/{system-components → extensions}/universal-sidebar-footer.d.ts +1 -1
  618. package/dist/domain/extensions/universal-sidebar-footer.js +1 -0
  619. package/dist/domain/extensions/view-controls.js +1 -0
  620. package/dist/domain/index.d.ts +2 -32
  621. package/dist/domain/index.js +1 -1
  622. package/dist/domain/mocks/create-mock-domain-context.d.ts +1 -1
  623. package/dist/domain/mocks/create-mock-domain-runtime-services.d.ts +1 -1
  624. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +30 -21
  625. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  626. package/dist/domain/mocks/create-mock-domain.d.ts +1 -1
  627. package/dist/domain/mocks/create-mock-domain.js +1 -1
  628. package/dist/domain/mocks/create-mock-state.d.ts +2 -2
  629. package/dist/domain/mocks/create-test-application-config.d.ts +59 -0
  630. package/dist/domain/mocks/create-test-application-config.js +1 -0
  631. package/dist/domain/mocks/index.d.ts +1 -0
  632. package/dist/domain/mocks/index.js +1 -1
  633. package/dist/domain/projections/blender-projections/blender-projections.d.ts +2 -3
  634. package/dist/domain/projections/blender-projections/blender-projections.js +1 -1
  635. package/dist/domain/projections/blender-projections/camera.d.ts +2 -2
  636. package/dist/domain/projections/collision-projections.d.ts +1 -1
  637. package/dist/domain/projections/composition-projections.d.ts +1 -1
  638. package/dist/domain/projections/composition-projections.js +1 -1
  639. package/dist/domain/projections/constraint-projections.d.ts +1 -1
  640. package/dist/domain/projections/index.d.ts +1 -1
  641. package/dist/domain/projections/position-projections.d.ts +1 -1
  642. package/dist/domain/projections/projected-entities-projections.d.ts +2 -3
  643. package/dist/domain/projections/snap-matching.d.ts +1 -2
  644. package/dist/domain/projections/snap-utils.d.ts +1 -2
  645. package/dist/domain/projections/snapping-projections.d.ts +1 -1
  646. package/dist/domain/projections/validation-projections.d.ts +3 -20
  647. package/dist/domain/projections/validation-projections.js +1 -1
  648. package/dist/domain/sketching/sketching-projections.d.ts +1 -1
  649. package/dist/domain/system-components/admin-sidebar.d.ts +1 -1
  650. package/dist/domain/system-components/admin-sidebar.js +1 -1
  651. package/dist/domain/system-components/angle-dimension.js +1 -1
  652. package/dist/domain/system-components/application-config.d.ts +1 -1
  653. package/dist/domain/system-components/application-config.js +1 -1
  654. package/dist/domain/system-components/attribute-selection.js +1 -1
  655. package/dist/domain/system-components/bounding-box-component.d.ts +1 -1
  656. package/dist/domain/system-components/bounding-box-component.js +1 -1
  657. package/dist/domain/system-components/bounding-sphere-component.d.ts +1 -1
  658. package/dist/domain/system-components/bounding-sphere-component.js +1 -1
  659. package/dist/domain/system-components/child-entity-recipes.d.ts +1 -1
  660. package/dist/domain/system-components/child-entity-recipes.js +1 -1
  661. package/dist/domain/system-components/child-entity-selection.d.ts +1 -2
  662. package/dist/domain/system-components/child-entity-selection.js +1 -1
  663. package/dist/domain/system-components/collision-box-geometry.d.ts +1 -1
  664. package/dist/domain/system-components/collision-box-geometry.js +1 -1
  665. package/dist/domain/system-components/collision-geometries.d.ts +1 -1
  666. package/dist/domain/system-components/collision-geometry.d.ts +1 -1
  667. package/dist/domain/system-components/collision-geometry.js +1 -1
  668. package/dist/domain/system-components/collision-point-geometry.d.ts +1 -1
  669. package/dist/domain/system-components/collision-point-geometry.js +1 -1
  670. package/dist/domain/system-components/common/index.d.ts +0 -4
  671. package/dist/domain/system-components/common/index.js +1 -1
  672. package/dist/domain/system-components/common/recipes.d.ts +1 -2
  673. package/dist/domain/system-components/constraint.d.ts +1 -1
  674. package/dist/domain/system-components/constraint.js +1 -1
  675. package/dist/domain/system-components/create-blueprint.d.ts +1 -1
  676. package/dist/domain/system-components/custom-scene-entity.d.ts +1 -1
  677. package/dist/domain/system-components/custom-scene-entity.js +1 -1
  678. package/dist/domain/system-components/detail.js +1 -1
  679. package/dist/domain/system-components/distance-dimension-select.d.ts +1 -1
  680. package/dist/domain/system-components/distance-dimension-select.js +1 -1
  681. package/dist/domain/system-components/distance-dimension.d.ts +1 -1
  682. package/dist/domain/system-components/distance-dimension.js +1 -1
  683. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  684. package/dist/domain/system-components/drag-handle.js +1 -1
  685. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  686. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  687. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  688. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  689. package/dist/domain/system-components/generic-dimension.d.ts +1 -1
  690. package/dist/domain/system-components/generic-dimension.js +1 -1
  691. package/dist/domain/system-components/hidden-entity.js +1 -1
  692. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -2
  693. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  694. package/dist/domain/system-components/index.d.ts +0 -68
  695. package/dist/domain/system-components/index.js +1 -1
  696. package/dist/domain/system-components/material-override-property-transition.js +1 -1
  697. package/dist/domain/system-components/material-override-transformer.js +1 -1
  698. package/dist/domain/system-components/material-swatch.js +1 -1
  699. package/dist/domain/system-components/navigation-page.js +1 -1
  700. package/dist/domain/system-components/navigation-panel-list.js +1 -1
  701. package/dist/domain/system-components/phoenix-entity-elements/admin-data-table-sidebar.d.ts +1 -1
  702. package/dist/domain/system-components/phoenix-layout-elements/admin-connected-resource-page.d.ts +1 -1
  703. package/dist/domain/system-components/phoenix-layout-elements/admin-data-table-actions.d.ts +1 -1
  704. package/dist/domain/system-components/phoenix-layout-elements/admin-data-table-page.d.ts +1 -1
  705. package/dist/domain/system-components/pivot-point.d.ts +1 -1
  706. package/dist/domain/system-components/pivot-point.js +1 -1
  707. package/dist/domain/system-components/price.js +1 -1
  708. package/dist/domain/system-components/projected-entities.d.ts +1 -1
  709. package/dist/domain/system-components/projected-entities.js +1 -1
  710. package/dist/domain/system-components/replace-entity-recipes.d.ts +1 -1
  711. package/dist/domain/system-components/replace-entity-recipes.js +1 -1
  712. package/dist/domain/system-components/scene-entity-ambient-light.js +1 -1
  713. package/dist/domain/system-components/scene-entity-box-object.js +1 -1
  714. package/dist/domain/system-components/scene-entity-directional-light.js +1 -1
  715. package/dist/domain/system-components/scene-entity-local-material-override.js +1 -1
  716. package/dist/domain/system-components/scene-entity-material-override.js +1 -1
  717. package/dist/domain/system-components/scene-entity-object-clip.js +1 -1
  718. package/dist/domain/system-components/scene-entity-object-decal.js +1 -1
  719. package/dist/domain/system-components/scene-entity-object-group.js +1 -1
  720. package/dist/domain/system-components/scene-entity-object-local-material-override.js +1 -1
  721. package/dist/domain/system-components/scene-entity-object-material-override.js +1 -1
  722. package/dist/domain/system-components/scene-entity-object-properties.js +1 -1
  723. package/dist/domain/system-components/scene-entity-object-remote-material-override.js +1 -1
  724. package/dist/domain/system-components/scene-entity-object-text-decal.js +1 -1
  725. package/dist/domain/system-components/scene-entity-object-transformer.js +1 -1
  726. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.js +1 -1
  727. package/dist/domain/system-components/scene-entity-object.js +1 -1
  728. package/dist/domain/system-components/scene-entity-point-light.js +1 -1
  729. package/dist/domain/system-components/scene-entity-properties.js +1 -1
  730. package/dist/domain/system-components/scene-entity-rect-area-light.js +1 -1
  731. package/dist/domain/system-components/scene-entity-remote-material-override.js +1 -1
  732. package/dist/domain/system-components/scene-entity-remote-object.js +1 -1
  733. package/dist/domain/system-components/scene-entity-spot-light.js +1 -1
  734. package/dist/domain/system-components/scene-entity-transimissive-material-override.js +1 -1
  735. package/dist/domain/system-components/sketching-line.d.ts +1 -1
  736. package/dist/domain/system-components/sketching-line.js +1 -1
  737. package/dist/domain/system-components/sketching-rectangle.d.ts +1 -1
  738. package/dist/domain/system-components/sketching-rectangle.js +1 -1
  739. package/dist/domain/system-components/sketching.d.ts +1 -1
  740. package/dist/domain/system-components/sketching.js +1 -1
  741. package/dist/domain/system-components/snap-axis.d.ts +1 -1
  742. package/dist/domain/system-components/snap-axis.js +1 -1
  743. package/dist/domain/system-components/snap-edge.d.ts +1 -1
  744. package/dist/domain/system-components/snap-edge.js +1 -1
  745. package/dist/domain/system-components/snap-plane.d.ts +1 -1
  746. package/dist/domain/system-components/snap-plane.js +1 -1
  747. package/dist/domain/system-components/snap-point.d.ts +1 -1
  748. package/dist/domain/system-components/snap-point.js +1 -1
  749. package/dist/domain/system-components/static-orthographic-camera-component.d.ts +1 -1
  750. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  751. package/dist/domain/system-components/static-perspective-camera-component.d.ts +1 -1
  752. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  753. package/dist/domain/utils/eval-cache.d.ts +2 -3
  754. package/dist/domain/utils/map-nested-object.d.ts +1 -1
  755. package/dist/domain/utils/memo-eval.d.ts +2 -4
  756. package/dist/editor/Editor.js +1 -1
  757. package/dist/editor/domain-editors/use-implementation-files.d.ts +8 -8
  758. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  759. package/dist/editor/mocks/EditorMockContext.js +1 -1
  760. package/dist/editor/variants/VariantAnswerFooter.d.ts +17 -0
  761. package/dist/editor/variants/VariantAnswerFooter.js +1 -0
  762. package/dist/editor/variants/VariantPreviewHandler.d.ts +6 -0
  763. package/dist/editor/variants/VariantPreviewHandler.js +1 -0
  764. package/dist/editor/variants/variant-preview-styles.d.ts +49 -0
  765. package/dist/editor/variants/variant-preview-styles.js +1 -0
  766. package/dist/i18n/locales/cs/messages.js +1 -1
  767. package/dist/i18n/locales/da/messages.js +1 -1
  768. package/dist/i18n/locales/de/messages.js +1 -1
  769. package/dist/i18n/locales/de-AT/messages.js +1 -1
  770. package/dist/i18n/locales/en/messages.js +1 -1
  771. package/dist/i18n/locales/en-AU/messages.js +1 -1
  772. package/dist/i18n/locales/en-GB/messages.js +1 -1
  773. package/dist/i18n/locales/es/messages.js +1 -1
  774. package/dist/i18n/locales/fr/messages.js +1 -1
  775. package/dist/i18n/locales/hu/messages.js +1 -1
  776. package/dist/i18n/locales/it/messages.js +1 -1
  777. package/dist/i18n/locales/nl/messages.js +1 -1
  778. package/dist/i18n/locales/pl/messages.js +1 -1
  779. package/dist/i18n/locales/pt/messages.js +1 -1
  780. package/dist/i18n/locales/ro/messages.js +1 -1
  781. package/dist/i18n/locales/sk/messages.js +1 -1
  782. package/dist/i18n/locales/tr/messages.js +1 -1
  783. package/dist/legacy/domain-cli/gen/configurator-builder.js +30 -16
  784. package/dist/legacy/domain-cli/gen/constant-expressions.js +1 -3
  785. package/dist/legacy/domain-cli/gen/defaults.js +1 -7
  786. package/dist/legacy/domain-cli/gen/implementation.js +7 -11
  787. package/dist/legacy/domain-cli/gen/invariants.js +7 -6
  788. package/dist/legacy/domain-cli/gen/relations.js +1 -1
  789. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  790. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  791. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  792. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  793. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  794. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +1 -0
  795. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/domain-index.js +17 -15
  796. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.d.ts +1 -1
  797. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.js +4 -0
  798. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  799. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  800. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  801. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  802. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  803. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  804. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  805. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  806. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  807. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  808. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  809. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  810. package/dist/phoenix/cli.js +1 -1
  811. package/dist/phoenix/commands/dev.js +5 -5
  812. package/dist/phoenix/commands/index.d.ts +1 -0
  813. package/dist/phoenix/commands/index.js +1 -1
  814. package/dist/phoenix/commands/init.d.ts +4 -4
  815. package/dist/phoenix/commands/init.js +1 -1
  816. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  817. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  818. package/dist/phoenix/commands/prettier.js +1 -1
  819. package/dist/phoenix/commands/story-dev.js +2 -2
  820. package/dist/phoenix/commands/variants.d.ts +35 -0
  821. package/dist/phoenix/commands/variants.js +1 -0
  822. package/dist/phoenix/editor-server/commands-router.d.ts +68 -1
  823. package/dist/phoenix/editor-server/commands-router.js +1 -1
  824. package/dist/phoenix/editor-server/editor-router.d.ts +65 -0
  825. package/dist/phoenix/editor-server/editor-server.d.ts +3 -3
  826. package/dist/phoenix/editor-server/editor-server.js +1 -1
  827. package/dist/phoenix/editor-server/protocol.d.ts +1 -0
  828. package/dist/phoenix/editor-server/spec-router.js +1 -1
  829. package/dist/phoenix/editor-server/trpc.d.ts +3 -0
  830. package/dist/phoenix/scripts/build-admin.js +1 -1
  831. package/dist/phoenix/services/application-spec-project-watcher.d.ts +13 -2
  832. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  833. package/dist/phoenix/services/index.d.ts +4 -0
  834. package/dist/phoenix/services/index.js +1 -1
  835. package/dist/phoenix/services/phoenix-application.d.ts +21 -0
  836. package/dist/phoenix/services/phoenix-application.js +1 -0
  837. package/dist/phoenix/services/phoenix-store.d.ts +48 -0
  838. package/dist/phoenix/services/phoenix-store.js +1 -0
  839. package/dist/phoenix/services/phx-variant-previews-plugin.d.ts +9 -0
  840. package/dist/phoenix/services/phx-variant-previews-plugin.js +1 -0
  841. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  842. package/dist/phoenix/services/variant-file-session.d.ts +36 -0
  843. package/dist/phoenix/services/variant-file-session.js +1 -0
  844. package/dist/phoenix/services/variant-preview-service.d.ts +80 -0
  845. package/dist/phoenix/services/variant-preview-service.js +1 -0
  846. package/dist/phoenix/services/vite-config.js +1 -1
  847. package/dist/phoenix/utils/git/index.d.ts +1 -0
  848. package/dist/phoenix/utils/git/index.js +1 -0
  849. package/dist/phoenix/utils/git/is-inside-git-repository.d.ts +6 -0
  850. package/dist/phoenix/utils/git/is-inside-git-repository.js +1 -0
  851. package/dist/phoenix/utils/index.d.ts +1 -0
  852. package/dist/phoenix/utils/index.js +1 -1
  853. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +2 -0
  854. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  855. package/dist/react-sdk/application-runtime/hooks/use-spec.d.ts +1 -1
  856. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  857. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  858. package/dist/react-sdk/application-runtime/routing/access-service.d.ts +1 -0
  859. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +57 -40
  860. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  861. package/dist/react-sdk/domain-context/common-hooks/use-domain-context.d.ts +9 -9
  862. package/dist/react-sdk/domain-context/index.d.ts +1 -1
  863. package/dist/react-sdk/domain-context/index.js +1 -1
  864. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +6 -0
  865. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  866. package/dist/ui-sdk/theme/types.d.ts +1 -1
  867. package/dist/webhook/builders/common.d.ts +8 -0
  868. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  869. package/dist/webhook/builders/webhook-builder.js +1 -1
  870. package/package.json +3 -3
  871. package/dist/application-spec/generate-application/code/templates/env-ci.d.ts +0 -1
  872. package/dist/application-spec/generate-application/code/templates/env-ci.js +0 -25
  873. package/dist/application-spec/generate-application/code/templates/env-example.d.ts +0 -1
  874. package/dist/application-spec/generate-application/code/templates/env-example.js +0 -90
  875. package/dist/application-spec/generate-application/code/templates/prettier-ignore.d.ts +0 -1
  876. package/dist/application-spec/generate-application/code/templates/prettier-ignore.js +0 -6
  877. package/dist/application-spec/generate-application/code/templates/private-assets-readme.d.ts +0 -1
  878. package/dist/application-spec/generate-application/code/templates/private-assets-readme.js +0 -24
  879. package/dist/application-spec/generate-application/code/templates/public-assets-readme.d.ts +0 -1
  880. package/dist/application-spec/generate-application/code/templates/public-assets-readme.js +0 -24
  881. package/dist/application-spec/generate-application/code/templates/readme.d.ts +0 -1
  882. package/dist/application-spec/generate-application/code/templates/readme.js +0 -23
  883. package/dist/application-spec/generate-application/code/templates/skills/agents-md.d.ts +0 -1
  884. package/dist/application-spec/generate-application/code/templates/skills/agents-md.js +0 -2
  885. package/dist/domain/actions/action-factory.d.ts +0 -10
  886. package/dist/domain/actions/prepare-action-implementations.js +0 -5
  887. package/dist/domain/application/element-registration.js +0 -1
  888. package/dist/domain/application/handler-registration.js +0 -1
  889. package/dist/domain/application/resolve-imported-transformers.d.ts +0 -13
  890. package/dist/domain/application/resolve-imported-transformers.js +0 -1
  891. package/dist/domain/application/resource-builder.d.ts +0 -13
  892. package/dist/domain/application/resource-builder.js +0 -1
  893. package/dist/domain/components/debug-state-component.js +0 -1
  894. package/dist/domain/components/domain-component-optic.d.ts +0 -76
  895. package/dist/domain/components/domain-component-optic.js +0 -16
  896. package/dist/domain/components/drag-state-component.js +0 -1
  897. package/dist/domain/components/export-state-component.js +0 -1
  898. package/dist/domain/components/fullscreen-state-component.js +0 -1
  899. package/dist/domain/components/group-components-by-entity-id-and-name.js +0 -1
  900. package/dist/domain/components/hover-state-component.js +0 -1
  901. package/dist/domain/components/index.d.ts +0 -2
  902. package/dist/domain/components/index.js +0 -1
  903. package/dist/domain/components/navigation-state-component.js +0 -1
  904. package/dist/domain/components/selection-state-component.js +0 -1
  905. package/dist/domain/components/system-component-builder.js +0 -1
  906. package/dist/domain/components/system-virtual-entity.js +0 -1
  907. package/dist/domain/components/tool-state-component.js +0 -1
  908. package/dist/domain/components/view-state-component.js +0 -1
  909. package/dist/domain/components/viewport-state-component.js +0 -1
  910. package/dist/domain/core/expression.d.ts +0 -50
  911. package/dist/domain/core/json-schema.js +0 -1
  912. package/dist/domain/core/migrations.js +0 -1
  913. package/dist/domain/core/reflection.js +0 -1
  914. package/dist/domain/domain-context/recipe-system/recipes.d.ts +0 -57
  915. package/dist/domain/domain-context/recipe-system/recipes.js +0 -1
  916. package/dist/domain/expressions/constant-expressions.d.ts +0 -9
  917. package/dist/domain/expressions/constant-expressions.js +0 -1
  918. package/dist/domain/expressions/custom-expression.d.ts +0 -13
  919. package/dist/domain/expressions/custom-expression.js +0 -1
  920. package/dist/domain/expressions/index.d.ts +0 -1
  921. package/dist/domain/expressions/index.js +0 -1
  922. package/dist/domain/invariants/custom-invariants.d.ts +0 -22
  923. package/dist/domain/invariants/custom-invariants.js +0 -1
  924. package/dist/domain/invariants/invariants.d.ts +0 -68
  925. package/dist/domain/invariants/invariants.js +0 -1
  926. package/dist/domain/invariants/violation-component.js +0 -1
  927. package/dist/domain/relations/all-of-type-relation.d.ts +0 -33
  928. package/dist/domain/relations/all-of-type-relation.js +0 -1
  929. package/dist/domain/relations/component-factories.js +0 -1
  930. package/dist/domain/relations/composed-of.js +0 -1
  931. package/dist/domain/relations/direct-relation.d.ts +0 -29
  932. package/dist/domain/relations/indirect-relation.d.ts +0 -81
  933. package/dist/domain/relations/indirect-relation.js +0 -1
  934. package/dist/domain/relations/reference-component.js +0 -1
  935. package/dist/domain/relations/relation-factory.d.ts +0 -19
  936. package/dist/domain/relations/relation-factory.js +0 -1
  937. package/dist/domain/relations/relation-implementation.d.ts +0 -8
  938. package/dist/domain/system-components/angle-indicator.js +0 -1
  939. package/dist/domain/system-components/attribute-switch.js +0 -1
  940. package/dist/domain/system-components/autorotate-camera-component.js +0 -1
  941. package/dist/domain/system-components/basic-sidebar-footer.js +0 -1
  942. package/dist/domain/system-components/camera-based-hidden-entity-object.js +0 -1
  943. package/dist/domain/system-components/camera-based-hidden-entity.js +0 -1
  944. package/dist/domain/system-components/canvas-config.js +0 -1
  945. package/dist/domain/system-components/canvas-custom-environment.js +0 -1
  946. package/dist/domain/system-components/canvas-padding.js +0 -1
  947. package/dist/domain/system-components/canvas-preset-environment.js +0 -1
  948. package/dist/domain/system-components/child-entity-recipe-hierarchy.js +0 -1
  949. package/dist/domain/system-components/client-side-image.js +0 -1
  950. package/dist/domain/system-components/color-value.js +0 -1
  951. package/dist/domain/system-components/common/angle-indicator-schema.js +0 -1
  952. package/dist/domain/system-components/common/dimension-indicator-schema.js +0 -1
  953. package/dist/domain/system-components/custom-price-footer.js +0 -1
  954. package/dist/domain/system-components/dimension-indicator.js +0 -1
  955. package/dist/domain/system-components/editable-angle-indicator.js +0 -1
  956. package/dist/domain/system-components/editable-distance-dimension-indicator.js +0 -1
  957. package/dist/domain/system-components/editable-offset-indicator.js +0 -1
  958. package/dist/domain/system-components/editable-size-indicator.js +0 -1
  959. package/dist/domain/system-components/entity-header.js +0 -1
  960. package/dist/domain/system-components/exit-tool-mode-fab.js +0 -1
  961. package/dist/domain/system-components/finalize-action.js +0 -1
  962. package/dist/domain/system-components/finalize-component.js +0 -1
  963. package/dist/domain/system-components/fit-selection-orthographic-camera-component.js +0 -1
  964. package/dist/domain/system-components/fit-selection-perspective-camera-component.js +0 -1
  965. package/dist/domain/system-components/fixed-header.js +0 -1
  966. package/dist/domain/system-components/floating-header.js +0 -1
  967. package/dist/domain/system-components/hidden-header.js +0 -1
  968. package/dist/domain/system-components/hidden-sidebar-footer.js +0 -1
  969. package/dist/domain/system-components/horizontal-tabs.js +0 -1
  970. package/dist/domain/system-components/list-selector-dimension-indicator.js +0 -1
  971. package/dist/domain/system-components/multilingual-text-value.js +0 -1
  972. package/dist/domain/system-components/navigation-steps.js +0 -1
  973. package/dist/domain/system-components/offset-anchors.js +0 -1
  974. package/dist/domain/system-components/offset-indicator.js +0 -1
  975. package/dist/domain/system-components/offset.js +0 -1
  976. package/dist/domain/system-components/other-action.js +0 -1
  977. package/dist/domain/system-components/property-page.js +0 -1
  978. package/dist/domain/system-components/read-sidebar-footer.js +0 -1
  979. package/dist/domain/system-components/replace-entity-recipe-hierarchy.js +0 -1
  980. package/dist/domain/system-components/rotatable.js +0 -1
  981. package/dist/domain/system-components/rotation-handle.js +0 -1
  982. package/dist/domain/system-components/save-template-thumbnail.js +0 -1
  983. package/dist/domain/system-components/scene-entity-add-fab.js +0 -1
  984. package/dist/domain/system-components/scene-entity-animation.js +0 -1
  985. package/dist/domain/system-components/scene-entity-control.js +0 -1
  986. package/dist/domain/system-components/scene-entity-delete-fab.js +0 -1
  987. package/dist/domain/system-components/scene-entity-floor-object.js +0 -1
  988. package/dist/domain/system-components/scene-entity-html-hotspot.js +0 -1
  989. package/dist/domain/system-components/scene-entity-navigation-hotspot.js +0 -1
  990. package/dist/domain/system-components/scene-entity-object-html-hotspot.js +0 -1
  991. package/dist/domain/system-components/scene-entity-select-hotspot.js +0 -1
  992. package/dist/domain/system-components/scene-entity-wall-object.js +0 -1
  993. package/dist/domain/system-components/selectable-component.js +0 -1
  994. package/dist/domain/system-components/sidebar-tabs.js +0 -1
  995. package/dist/domain/system-components/simple-summary.js +0 -1
  996. package/dist/domain/system-components/size.js +0 -1
  997. package/dist/domain/system-components/sketching-draw.js +0 -1
  998. package/dist/domain/system-components/sketching-edit.js +0 -1
  999. package/dist/domain/system-components/summary-component.js +0 -1
  1000. package/dist/domain/system-components/text-value.js +0 -1
  1001. package/dist/domain/system-components/tool-controls.js +0 -1
  1002. package/dist/domain/system-components/tool-menu-fab.js +0 -1
  1003. package/dist/domain/system-components/universal-sidebar-footer.js +0 -1
  1004. package/dist/domain/system-components/view-controls.js +0 -1
  1005. package/dist/phoenix/application-spec/generate-assistant-prompt.d.ts +0 -12
  1006. package/dist/phoenix/application-spec/generate-assistant-prompt.js +0 -1
  1007. /package/dist/domain/{components/component-reader-types.js → application/assistant/assistant-manifest.js} +0 -0
  1008. /package/dist/domain/{actions → core/action}/action-factory.js +0 -0
  1009. /package/dist/domain/core/{action.js → action/action.js} +0 -0
  1010. /package/dist/domain/core/{enhanced-json-schema.js → component/component-reader-types.js} +0 -0
  1011. /package/dist/domain/{components → core/component}/legacy-filter.js +0 -0
  1012. /package/dist/domain/{components → core/component}/system-component-filter.js +0 -0
  1013. /package/dist/domain/{components → core/component}/system-virtual-entity.d.ts +0 -0
  1014. /package/dist/domain/{components → core/component}/updates.js +0 -0
  1015. /package/dist/domain/core/{expression.js → data-schema/data-cell-value.js} +0 -0
  1016. /package/dist/domain/core/{schema-validator.js → data-schema/data-schema-array-field.js} +0 -0
  1017. /package/dist/domain/{relations/reference-field.js → core/data-schema/data-schema-field-object.js} +0 -0
  1018. /package/dist/domain/{relations/relation-implementation.js → core/data-schema/data-schema-field.js} +0 -0
  1019. /package/dist/domain/{invariants → core/invariant}/builtin-invariant.js +0 -0
  1020. /package/dist/domain/{invariants → core/invariant}/violation-component.d.ts +0 -0
  1021. /package/dist/domain/{invariants → core/invariant}/violation.js +0 -0
  1022. /package/dist/domain/core/{alias.d.ts → model/alias.d.ts} +0 -0
  1023. /package/dist/domain/core/{alias.js → model/alias.js} +0 -0
  1024. /package/dist/domain/core/{common-definitions.d.ts → model/common-definitions.d.ts} +0 -0
  1025. /package/dist/domain/core/{common-definitions.js → model/common-definitions.js} +0 -0
  1026. /package/dist/domain/core/{component.js → model/component.js} +0 -0
  1027. /package/dist/domain/core/{model.d.ts → model/model.d.ts} +0 -0
  1028. /package/dist/domain/core/{model.js → model/model.js} +0 -0
  1029. /package/dist/domain/core/{preset.d.ts → model/preset.d.ts} +0 -0
  1030. /package/dist/domain/core/{preset.js → model/preset.js} +0 -0
  1031. /package/dist/domain/{relations → core/relation}/direct-relation.js +0 -0
  1032. /package/dist/domain/core/{schema-validator-ajv.d.ts → schema/create-ajv-schema-validator.d.ts} +0 -0
  1033. /package/dist/domain/core/{schema-validator-ajv.js → schema/create-ajv-schema-validator.js} +0 -0
  1034. /package/dist/domain/core/{schema-validator-csp.d.ts → schema/create-csp-schema-validator.d.ts} +0 -0
  1035. /package/dist/domain/core/{schema-validator-csp.js → schema/create-csp-schema-validator.js} +0 -0
  1036. /package/dist/domain/core/{enhanced-json-schema.d.ts → schema/enhanced-json-schema.d.ts} +0 -0
  1037. /package/dist/domain/core/{json-schema.d.ts → schema/extended-schema-validator.d.ts} +0 -0
  1038. /package/dist/domain/core/{schema-validator.d.ts → schema/schema-validator.d.ts} +0 -0
  1039. /package/dist/domain/core/{state.js → state/state.js} +0 -0
  1040. /package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.js +0 -0
  1041. /package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.js +0 -0
  1042. /package/dist/domain/{system-components → extensions}/attribute-switch.d.ts +0 -0
  1043. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity-object.d.ts +0 -0
  1044. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity.d.ts +0 -0
  1045. /package/dist/domain/{system-components → extensions}/canvas-custom-environment.d.ts +0 -0
  1046. /package/dist/domain/{system-components → extensions}/client-side-image.d.ts +0 -0
  1047. /package/dist/domain/{system-components → extensions}/color-value.d.ts +0 -0
  1048. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.d.ts +0 -0
  1049. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.js +0 -0
  1050. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.d.ts +0 -0
  1051. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.js +0 -0
  1052. /package/dist/domain/{system-components → extensions}/custom-price-footer.d.ts +0 -0
  1053. /package/dist/domain/{system-components → extensions}/finalize-component.d.ts +0 -0
  1054. /package/dist/domain/{system-components → extensions}/fit-selection-orthographic-camera-component.d.ts +0 -0
  1055. /package/dist/domain/{system-components → extensions}/fit-selection-perspective-camera-component.d.ts +0 -0
  1056. /package/dist/domain/{system-components → extensions}/multilingual-text-value.d.ts +0 -0
  1057. /package/dist/domain/{system-components → extensions}/navigation-steps.d.ts +0 -0
  1058. /package/dist/domain/{system-components → extensions}/rotatable.d.ts +0 -0
  1059. /package/dist/domain/{system-components → extensions}/rotation-handle.d.ts +0 -0
  1060. /package/dist/domain/{system-components → extensions}/save-template-thumbnail.d.ts +0 -0
  1061. /package/dist/domain/{system-components → extensions}/scene-entity-animation.d.ts +0 -0
  1062. /package/dist/domain/{system-components → extensions}/scene-entity-control.d.ts +0 -0
  1063. /package/dist/domain/{system-components → extensions}/scene-entity-floor-object.d.ts +0 -0
  1064. /package/dist/domain/{system-components → extensions}/scene-entity-wall-object.d.ts +0 -0
  1065. /package/dist/domain/{system-components → extensions}/selectable-component.d.ts +0 -0
  1066. /package/dist/domain/{system-components → extensions}/simple-summary.d.ts +0 -0
  1067. /package/dist/domain/{system-components → extensions}/summary-component.d.ts +0 -0
  1068. /package/dist/domain/{system-components → extensions}/text-value.d.ts +0 -0
  1069. /package/dist/domain/{system-components → extensions}/tool-controls.d.ts +0 -0
  1070. /package/dist/domain/{system-components → extensions}/view-controls.d.ts +0 -0
@@ -1,8 +1,8 @@
1
1
  import type { AnyClientTool } from '@tanstack/ai';
2
2
  import { type UIMessage } from '@tanstack/ai-client';
3
3
  import { type ObservableWithLastValue } from '@salsita-ai/common/utils';
4
- import type { AuthorizedPhoenixApiClient } from '#package/client';
5
- import type { DomainContextSelectors, DomainServicesSelectors, InitializableSystem } from '#package/domain';
4
+ import { type AuthorizedPhoenixApiClient } from '#package/client';
5
+ import type { DomainContextSelectors, DomainServicesSelectors, InitializableSystem, SessionAssistantSetup, SpecSelectors } from '#package/domain';
6
6
  import type { ConfiguratorExtensionSelectors } from '../../selectors.js';
7
7
  /** A tool of the assistant that the model calls and the browser runs, as the chat client accepts it. */
8
8
  export type AssistantClientTool = AnyClientTool;
@@ -15,8 +15,11 @@ export interface AssistantSystemContext {
15
15
  readonly configuratorExtensionSelectors: ConfiguratorExtensionSelectors;
16
16
  readonly domainContextSelectors: DomainContextSelectors;
17
17
  readonly domainServicesSelectors: DomainServicesSelectors;
18
+ readonly specSelectors: SpecSelectors;
18
19
  readonly getConfigurationId: () => string;
19
20
  readonly getAuthorizedClient: () => AuthorizedPhoenixApiClient<any, any, any>;
21
+ /** The assistant the initialized session runs: its tools, its exposed fields and whether chat runs at all. */
22
+ readonly getAssistantSetup: () => SessionAssistantSetup;
20
23
  }
21
24
  /**
22
25
  * The conversation with the assistant as the panel paints it. One value is published per change, so
@@ -38,6 +41,25 @@ export interface AssistantChatSnapshot {
38
41
  readonly isContinuable: boolean;
39
42
  /** False until the first request of the chat, the thread read, was answered or failed. */
40
43
  readonly isLoaded: boolean;
44
+ /**
45
+ * True while a thread this session may not continue is being continued in a new one, which the
46
+ * user's next message starts; see {@link AssistantSystem.resume}.
47
+ */
48
+ readonly isResuming: boolean;
49
+ /**
50
+ * The closed threads the painted thread continues, oldest first: the ones that were resumed while
51
+ * the chat was open, and the ones loaded with {@link AssistantSystem.loadEarlierThread}.
52
+ */
53
+ readonly earlierThreads: ReadonlyArray<AssistantEarlierThreadSnapshot>;
54
+ /** True when the server holds a thread older than the oldest painted one. */
55
+ readonly hasEarlierThread: boolean;
56
+ /** True while that older thread is being loaded. */
57
+ readonly isLoadingEarlierThread: boolean;
58
+ }
59
+ /** A closed thread of the conversation as the panel paints it above the thread that continues it. */
60
+ export interface AssistantEarlierThreadSnapshot {
61
+ readonly threadId: string;
62
+ readonly messages: ReadonlyArray<UIMessage>;
41
63
  }
42
64
  /**
43
65
  * The built-in assistant panel as a layout and the toolbar button see it: whether it is open, and
@@ -52,7 +74,8 @@ export interface AssistantPanelSnapshot {
52
74
  }
53
75
  /**
54
76
  * Owns the conversational assistant of a configurator: its client tools (`getBrowserDetails`,
55
- * `query` and `apply`), the chat with the server, and the state of the built-in panel.
77
+ * `query` and `apply`), the chat with the server, the state of the built-in panel, and the record
78
+ * of what changed in the configuration since the agent last acted, which every user message carries.
56
79
  *
57
80
  * The server owns the thread, so the chat keeps nothing in browser storage: its client hydrates
58
81
  * from the server and rejoins a reply that is still streaming.
@@ -75,6 +98,35 @@ export declare class AssistantSystem implements InitializableSystem {
75
98
  * background. Each leaves the set when its reply ends or when a new chat takes its thread over.
76
99
  */
77
100
  private readonly _finishing;
101
+ /**
102
+ * The thread before the oldest painted one, as the server named it; nothing when the painted
103
+ * threads start the conversation. `hasEarlierThread` of the chat says whether it is set.
104
+ */
105
+ private _olderThreadId;
106
+ /** The resume that is running, so two sends that find the thread locked share one. */
107
+ private _resuming;
108
+ /**
109
+ * The message the server refused on a chat because its thread cannot be continued, by where it
110
+ * starts in the chat's messages: it is painted, but it is not part of the thread, so a resume
111
+ * leaves it out of the closed thread it paints above the new one.
112
+ */
113
+ private _refused;
114
+ /**
115
+ * The chat a message is being sent on for the first time. When the server refuses that message
116
+ * because the thread cannot be continued, the refusal is not a failure of the chat: the thread is
117
+ * resumed and the message is sent again; see `send`.
118
+ */
119
+ private _firstAttempt;
120
+ /**
121
+ * Identity of the chain of threads that is painted. A resumed chat keeps it, because its new
122
+ * thread continues the same chain; any other new chat starts another one.
123
+ */
124
+ private _chain;
125
+ /** The earlier thread that is being loaded, so a second press loads nothing twice. */
126
+ private _loadingThreadId;
127
+ private readonly _recorder;
128
+ /** The recorder's subscription to the committed emissions of the store; made by the first `initialize()`. */
129
+ private _recording;
78
130
  constructor(_context: AssistantSystemContext);
79
131
  /** The conversation. It never completes, and holds the empty chat whenever no chat is active. */
80
132
  readonly chat$: ObservableWithLastValue<AssistantChatSnapshot>;
@@ -89,6 +141,10 @@ export declare class AssistantSystem implements InitializableSystem {
89
141
  * Accepted cost: on such a re-entry the thread is read twice. The page's `activate()` has already
90
142
  * created a client and started its read when this runs, and that client is replaced here, because
91
143
  * the system cannot tell that it was created for the load that is only now being initialized.
144
+ *
145
+ * The change recorder starts over from the loaded state, so the first message after a load says
146
+ * that the changes are unavailable. The store is retained across loads and has already emitted the
147
+ * loaded state when this runs, so one subscription serves every load.
92
148
  */
93
149
  initialize: () => void;
94
150
  /**
@@ -109,12 +165,57 @@ export declare class AssistantSystem implements InitializableSystem {
109
165
  * not interrupted, so an `apply` that has started may still commit. The background reply keeps
110
166
  * the configuration and the authorized client it started with.
111
167
  *
112
- * The background reply ends early when a new chat starts for the same configuration, which is
168
+ * The background reply is disconnected when a new chat starts for the same configuration, which is
113
169
  * what opening the configuration again does: see `_takeOverThread`.
114
170
  */
115
171
  activate: () => (() => void);
116
- /** Sends a user message stamped with its send time, which the model is told. */
172
+ /**
173
+ * Sends a user message with the record of what changed in the configuration since the agent last
174
+ * acted, which the server puts in front of the message for the model. The record is taken only
175
+ * when there is a chat to send it on, because taking it moves its baseline.
176
+ *
177
+ * A thread can end in a tool call that nothing will answer: its reply parked while no page was
178
+ * open, or the page that ran the tool was left before the result was sent. The client refuses to
179
+ * send while it waits on such a call, so the wait is given up first, and the server records for
180
+ * the model that the call got no result.
181
+ *
182
+ * A thread this session may not continue is resumed first, in a new thread; see `resume`. When
183
+ * that fails the message is not sent.
184
+ *
185
+ * The chat can be out of date about that: the thread reached its size limit with the reply before
186
+ * this message, or the assistant's setup changed while the configurator stayed open. The server
187
+ * then refuses the message and says that the thread cannot be continued. The message stays
188
+ * painted while the thread is resumed, and is then sent again on the new thread, with the change
189
+ * record it was first sent with. This happens once: a refusal of the second attempt is the
190
+ * failure it is. When resuming fails, the message is left as any message that failed to send:
191
+ * painted, with the failure as the error of the chat.
192
+ *
193
+ * Accepted: when the server refuses the compaction itself with a conflict, because another tab
194
+ * compacted the thread or a run is still running, the thread is read again (see `resume`) and
195
+ * the refused message is gone without a notice. It takes two tabs or a run racing the send, and
196
+ * the user writes the message again, as after any reload of a thread that failed.
197
+ *
198
+ * It never rejects: a message the client could not send is reported as the error of the chat.
199
+ */
117
200
  send: (content: string) => Promise<void>;
201
+ /**
202
+ * Makes the chat ready for the next message. A thread the server no longer lets this session
203
+ * continue, because the assistant's setup changed since it was started or the thread reached
204
+ * its size limit, is compacted there: the
205
+ * server closes it and opens a thread that starts from its summary. The messages painted so far
206
+ * move to `earlierThreads`, and a new client takes the new thread over.
207
+ *
208
+ * Resolves to whether a message can be sent now: at once for a thread that can continue, and
209
+ * `false` when there is no chat or the compaction failed, which is reported as the error of the
210
+ * chat. It never rejects. Calling it again runs the compaction again. A compaction the server
211
+ * refuses with a conflict is not a failure: the thread is read again and `false` is returned.
212
+ */
213
+ resume: () => Promise<boolean>;
214
+ /**
215
+ * Loads the thread before the oldest painted one and paints it above. Does nothing when there is
216
+ * none or one is being loaded. A load that fails is logged and can be asked for again.
217
+ */
218
+ loadEarlierThread: () => Promise<void>;
118
219
  /**
119
220
  * Stops the reply on both sides. Closing the stream alone keeps the server run going, because a
120
221
  * closed connection is also how a reload looks and a reload must be able to rejoin the run.
@@ -128,6 +229,15 @@ export declare class AssistantSystem implements InitializableSystem {
128
229
  reloadThread: () => void;
129
230
  setOpen: (open: boolean) => void;
130
231
  setInputFocused: (isInputFocused: boolean) => void;
232
+ /**
233
+ * Where the message starts that is being sent on the chat for the first time and that the server
234
+ * refused because its thread cannot be continued, so it never reached the thread; `-1` when there
235
+ * is no such message. A refused continuation of a reply is not one: its message is stored.
236
+ */
237
+ private _findRefusedMessageIndex;
238
+ private _sendOn;
239
+ private _resume;
240
+ private _committedState;
131
241
  private _patchPanel;
132
242
  /**
133
243
  * Disconnects every chat that is still finishing a reply on the thread of the given configuration,
@@ -138,9 +248,14 @@ export declare class AssistantSystem implements InitializableSystem {
138
248
  * and the new one for real, and both would send the result back, of which the server accepts one.
139
249
  * The model could be told that nothing was run about a change that was made.
140
250
  *
141
- * Stopping a client only closes its stream in the browser. Nothing is cancelled on the server, so
142
- * the run goes on there and the new chat rejoins it. A chat that finishes a reply for another
143
- * configuration is on another thread and is left alone.
251
+ * Stopping a client closes its stream in the browser and cancels nothing on the server: a run that
252
+ * is still producing goes on there and the new chat rejoins it. The stopped client also drops the
253
+ * result of a tool call that is still running in it, and any continuation it has not sent yet. Such
254
+ * a call still finishes, so an `apply` may commit, but the server never gets its result: the run is
255
+ * parked on the call with nothing running for the new chat to rejoin, and the thread waits on it
256
+ * until the user's next message gives the wait up; see `send`.
257
+ *
258
+ * A chat that finishes a reply for another configuration is on another thread and is left alone.
144
259
  */
145
260
  private _takeOverThread;
146
261
  private _startClient;
@@ -1 +1 @@
1
- import{ChatClient as t,fetchServerSentEvents as e}from"@tanstack/ai-client";import{BehaviorSubject as i}from"rxjs";import{isShallowEqual as s}from"@salsita-ai/common/utils";import{createBrowserDetailsClientTool as a}from"./browser-details.js";import{createApplyClientTool as n,createQueryClientTool as r}from"./graphql-tools.js";let o=Object.freeze({messages:Object.freeze([]),isLoading:!1,error:void 0,failedStatus:void 0,isContinuable:!0,isLoaded:!1}),h=Object.freeze({open:!1,hasUnreadReply:!1,isInputFocused:!1}),l=Object.freeze({results:Object.freeze([]),committed:!1,sideEffects:Object.freeze([]),message:"Nothing was run, because the user closed the configurator while this reply was being written. Do not call any more tools in this reply and end it now. The tools work again as soon as the user writes the next message."}),c=t=>{if(t.getError())return!0;let e=t.getMessages().at(-1)?.parts.at(-1);return e?.type!=="tool-call"&&e?.type!=="tool-result"};export class AssistantSystem{_context;_tools;_chat=new i(o);_panel=new i(h);_activation=null;_current=null;_finishing=new Set;constructor(t){this._context=t;let{configuratorExtensionSelectors:e,domainContextSelectors:i}=t,s={getGraphQLSystem:()=>e.getGraphQLSystem(),getStoreSystem:()=>i.getStoreSystem(),getActiveMode:()=>i.getActiveMode()};this._tools=[a(),r(s),n(s)]}chat$=this._chat;panel$=this._panel;initialize=()=>{this._endChat(),this._patchPanel(h),this._activation&&this._startClient()};activate=()=>{this._endChat();let t={};return this._activation=t,this._startClient(),()=>{this._activation===t&&(this._activation=null,this._endChat())}};send=async t=>{let e={sentAt:new Date().toISOString()};await this._current?.client.sendMessage({content:t,metadata:e})};stop=async()=>{let t=this._current;if(!t)return;let e=t.client.getCurrentRunId();if(t.client.stop(),null!=e)try{let i=t.getConnection();await fetch(`${i.url}/runs/${encodeURIComponent(e)}/cancel`,{method:"POST",headers:await i.headers()})}catch(t){this._context.domainServicesSelectors.getLogger().warn("Could not cancel the assistant run on the server",{error:t})}};reloadThread=()=>{if(!this._activation)return;let t=this._retireChat();t?.client.stop(),t?.dispose(),this._startClient()};setOpen=t=>{this._patchPanel(t?{open:t,hasUnreadReply:!1}:{open:t,isInputFocused:!1})};setInputFocused=t=>{this._patchPanel({isInputFocused:t})};_patchPanel=t=>{let e={...this._panel.value,...t};s(e,this._panel.value)||this._panel.next(e)};_takeOverThread=t=>{for(let e of this._finishing)e.configurationId===t&&(e.client.stop(),e.dispose())};_startClient=()=>{let i={active:!0},a=this._context.getConfigurationId();this._takeOverThread(a);let n=this._context.getAuthorizedClient(),r=()=>n.getAssistantChatConnection(a),o=t=>{if(!i.active)return;let e={...this._chat.value,...t};s(e,this._chat.value)||this._chat.next(e)},h=async(t,e)=>{let i=await fetch(t,e).finally(()=>o({isLoaded:!0})),s=i.headers.get("x-assistant-thread-continuable");return o({failedStatus:i.ok?void 0:i.status,...null!=s&&{isContinuable:"false"!==s}}),i},u=async()=>({headers:await r().headers(),fetchClient:h}),d=e(()=>r().url,u),_=e(()=>`${r().url}/runs`,u),g=this._tools.map(t=>({...t,execute:(e,s)=>i.active?t.execute?.(e,s):l})),p=new t({threadId:`assistant:${a}`,connection:{...d,joinRun:_.joinRun},persistence:!0,history:{pageSize:50},tools:g,onMessagesChange:t=>o({messages:t}),onLoadingChange:t=>{let e=i.active&&this._chat.value.isLoading;o({isLoading:t}),!t&&c(p)&&(i.active?e&&!this._panel.value.open&&this._patchPanel({hasUnreadReply:!0}):v())},onErrorChange:t=>{i.active&&t!==this._chat.value.error&&(o({error:t}),t&&this._context.domainServicesSelectors.getLogger().error("The assistant request failed",{status:this._chat.value.failedStatus},t))}}),f=!1,v=()=>{f||(f=!0,this._finishing.delete(m),p.dispose())},m={client:p,configurationId:a,generation:i,getConnection:r,dispose:v};this._current=m,p.attach()};_retireChat=()=>{let t=this._current;return this._current=null,t&&(t.generation.active=!1),this._chat.value!==o&&this._chat.next(o),t};_endChat=()=>{let t=this._retireChat();if(t){if(!t.client.getIsLoading()&&c(t.client))return void t.dispose();this._finishing.add(t)}}}
1
+ import{ChatClient as e,fetchServerSentEvents as t}from"@tanstack/ai-client";import{BehaviorSubject as i}from"rxjs";import{skip as s}from"rxjs/operators";import{isShallowEqual as a}from"@salsita-ai/common/utils";import{AssistantRequestError as r}from"#package/client";import{createBrowserDetailsClientTool as n}from"./browser-details.js";import{ChangeRecorder as h}from"./change-recorder.js";import{createApplyClientTool as o,createQueryClientTool as l}from"./graphql-tools.js";let c=Object.freeze({messages:Object.freeze([]),isLoading:!1,error:void 0,failedStatus:void 0,isContinuable:!0,isLoaded:!1,isResuming:!1,earlierThreads:Object.freeze([]),hasEarlierThread:!1,isLoadingEarlierThread:!1}),d=Object.freeze({open:!1,hasUnreadReply:!1,isInputFocused:!1}),u=Object.freeze({}),_=Object.freeze({results:Object.freeze([]),committed:!1,sideEffects:Object.freeze([]),message:"Nothing was run, because the user closed the configurator while this reply was being written. Do not call any more tools in this reply and end it now. The tools work again as soon as the user writes the next message."}),g=e=>{if(e.getError())return!0;let t=e.getMessages().at(-1)?.parts.at(-1);return t?.type!=="tool-call"&&t?.type!=="tool-result"};export class AssistantSystem{_context;_tools;_chat=new i(c);_panel=new i(d);_activation=null;_current=null;_finishing=new Set;_olderThreadId=null;_resuming=null;_refused=null;_firstAttempt=null;_chain={};_loadingThreadId=null;_recorder;_recording=null;constructor(e){this._context=e;let{configuratorExtensionSelectors:t,domainContextSelectors:i,domainServicesSelectors:s,getAssistantSetup:a}=e;this._recorder=new h({maxEntities:30},{readers:{selectedEntityId:e=>i.getNavigationSystem().getActiveSelectionState(e),navigationState:e=>i.getNavigationSystem().getActiveNavigationState(e),viewState:e=>i.getNavigationSystem().getActiveViewState(e),toolState:e=>i.getNavigationSystem().getActiveToolState(e)},getExposedFields:()=>a().manifest?.fields??u,resolveLocalizable:e=>s.getResolveLocalizable()(e)});let r={getGraphQLSystem:()=>t.getGraphQLSystem(),getStoreSystem:()=>i.getStoreSystem(),getActiveMode:()=>i.getActiveMode(),clearChanges:()=>this._recorder.clear(this._committedState())};this._tools=[n(),l(r),o(r)]}chat$=this._chat;panel$=this._panel;initialize=()=>{let{committed:e}=this._context.domainContextSelectors.getStoreSystem().stateSlices;this._recording??=e.pipe(s(1)).subscribe(this._recorder.record),this._recorder.reset(e.value.state),this._endChat(),this._patchPanel(d),this._activation&&this._startClient()};activate=()=>{this._endChat();let e={};return this._activation=e,this._startClient(),()=>{this._activation===e&&(this._activation=null,this._endChat())}};send=async e=>{if(!this._chat.value.isContinuable&&!await this.resume())return;let t=this._current;if(!t)return;let i={changes:this._recorder.take(this._committedState())};this._firstAttempt=t;try{await this._sendOn(t,e,i);let s=this._findRefusedMessageIndex(t);if(-1===s)return;this._refused={chat:t,index:s}}finally{this._firstAttempt===t&&(this._firstAttempt=null)}if(!await this.resume())return;let s=this._current;s&&await this._sendOn(s,e,i)};resume=async()=>{let e=this._current;if(!e)return!1;if(this._chat.value.isContinuable)return!0;if(this._resuming)return this._resuming;let t=this._resume(e).finally(()=>{this._resuming===t&&(this._resuming=null)});return this._resuming=t,t};loadEarlierThread=async()=>{let e=this._current,t=this._olderThreadId;if(!e||null===t||this._loadingThreadId===t)return;let i=this._chain;this._loadingThreadId=t,this._chat.next({...this._chat.value,isLoadingEarlierThread:!0});try{let s=await e.authorizedClient.getAssistantEarlierThread(e.configurationId,t,50);if(this._chain!==i||this._olderThreadId!==t)return;this._olderThreadId=s.previousThreadId,this._chat.next({...this._chat.value,earlierThreads:[{threadId:t,messages:s.messages},...this._chat.value.earlierThreads],hasEarlierThread:null!==s.previousThreadId})}catch(e){this._context.domainServicesSelectors.getLogger().warn("Could not load the earlier assistant conversation",{error:e})}finally{this._chain===i&&this._loadingThreadId===t&&(this._loadingThreadId=null,this._chat.next({...this._chat.value,isLoadingEarlierThread:!1}))}};stop=async()=>{let e=this._current;if(!e)return;let t=e.client.getCurrentRunId();if(e.client.stop(),null!=t)try{let i=e.getConnection();await fetch(`${i.url}/runs/${encodeURIComponent(t)}/cancel`,{method:"POST",headers:await i.headers()})}catch(e){this._context.domainServicesSelectors.getLogger().warn("Could not cancel the assistant run on the server",{error:e})}};reloadThread=()=>{if(!this._activation)return;let e=this._retireChat();e?.client.stop(),e?.dispose(),this._recorder.reset(this._committedState()),this._startClient()};setOpen=e=>{this._patchPanel(e?{open:e,hasUnreadReply:!1}:{open:e,isInputFocused:!1})};setInputFocused=e=>{this._patchPanel({isInputFocused:e})};_findRefusedMessageIndex=e=>{var t;let i,{failedStatus:s,isContinuable:a}=this._chat.value;return this._firstAttempt===e&&e.generation.active&&409===s&&!a?(i=(t=e.client.getMessages()).map(e=>e.role).lastIndexOf("user"),t.slice(i+1).every(e=>0===e.parts.length)?i:-1):-1};_sendOn=async(e,t,i)=>{let{client:s}=e;s.getIsLoading()||null===s.getResumeState()||s.stop();try{await s.sendMessage({content:t,metadata:i})}catch(i){let t=i instanceof Error?i:Error(String(i));e.generation.active&&this._chat.next({...this._chat.value,error:t}),this._context.domainServicesSelectors.getLogger().error("The assistant message could not be sent",{},t)}};_resume=async e=>{this._chat.next({...this._chat.value,isResuming:!0,error:void 0,failedStatus:void 0});try{let{previousThreadId:t}=await e.authorizedClient.compactAssistantThread(e.configurationId);if(!e.generation.active)return!1;let{messages:i,earlierThreads:s,hasEarlierThread:a}=this._chat.value,r=this._refused?.chat===e?i.slice(0,this._refused.index):i;return e.generation.active=!1,this._current=null,e.client.stop(),e.dispose(),this._chat.next({...c,earlierThreads:[...s,{threadId:t,messages:r}],hasEarlierThread:a,isLoadingEarlierThread:null!==this._loadingThreadId}),this._startClient(),!0}catch(i){let t=i instanceof Error?i:Error(String(i));if(t instanceof r&&409===t.status)return e.generation.active&&this.reloadThread(),!1;return e.generation.active&&this._chat.next({...this._chat.value,isResuming:!1,error:t,failedStatus:t instanceof r?t.status:void 0}),this._context.domainServicesSelectors.getLogger().error("The assistant thread could not be resumed",{},t),!1}};_committedState=()=>this._context.domainContextSelectors.getStoreSystem().stateSlices.committed.value.state;_patchPanel=e=>{let t={...this._panel.value,...e};a(t,this._panel.value)||this._panel.next(t)};_takeOverThread=e=>{for(let t of this._finishing)t.configurationId===e&&(t.client.stop(),t.dispose())};_startClient=()=>{let i={active:!0},s=this._context.getConfigurationId();this._takeOverThread(s);let r=this._context.getAuthorizedClient(),n=()=>{if(i.active){let{manifest:e,error:t}=this._context.getAssistantSetup();if(t)throw t;if(!e)throw Error("The assistant is disabled for this session.")}return r.getAssistantChatConnection(s)},h=e=>{if(!i.active)return;let t={...this._chat.value,...e};a(t,this._chat.value)||this._chat.next(t)},o=async(e,t)=>{let s=await fetch(e,t).finally(()=>h({isLoaded:!0})),a=s.headers.get("x-assistant-thread-continuable");return null!=a&&s.ok&&i.active&&0===this._chat.value.earlierThreads.length&&(this._olderThreadId=s.headers.get("x-assistant-previous-thread")),h({failedStatus:s.ok?void 0:s.status,...null!=a&&{isContinuable:"false"!==a,hasEarlierThread:null!==this._olderThreadId}}),s},l=async()=>({headers:await n().headers(),fetchClient:o}),c=t(()=>n().url,l),d=t(()=>`${n().url}/runs`,l),u=this._tools.map(e=>({...e,execute:(t,s)=>{if(!i.active)return _;let{manifest:a,error:r}=this._context.getAssistantSetup();return r||!a?{error:r?.message??"The assistant is disabled for this session."}:e.execute?.(t,s)}})),f=new e({threadId:`assistant:${s}`,connection:{...c,joinRun:d.joinRun},persistence:!0,history:{pageSize:50},tools:u,onMessagesChange:e=>h({messages:e}),onLoadingChange:e=>{let t=i.active&&this._chat.value.isLoading;h({isLoading:e}),!e&&g(f)&&(i.active?t&&!this._panel.value.open&&this._patchPanel({hasUnreadReply:!0}):v())},onErrorChange:e=>{i.active&&e!==this._chat.value.error&&(!e||-1===this._findRefusedMessageIndex(p))&&(h({error:e}),e&&this._context.domainServicesSelectors.getLogger().error("The assistant request failed",{status:this._chat.value.failedStatus},e))}}),m=!1,v=()=>{m||(m=!0,this._finishing.delete(p),f.dispose())},p={client:f,configurationId:s,generation:i,authorizedClient:r,getConnection:n,dispose:v};this._current=p,f.attach()};_retireChat=()=>{let e=this._current;return this._current=null,e&&(e.generation.active=!1),this._chain={},this._olderThreadId=null,this._resuming=null,this._refused=null,this._loadingThreadId=null,this._chat.value!==c&&this._chat.next(c),e};_endChat=()=>{let e=this._retireChat();if(e){if(!e.client.getIsLoading()&&g(e.client))return void e.dispose();this._finishing.add(e)}}}
@@ -0,0 +1,85 @@
1
+ import type { Localizable } from '@salsita-ai/common/utils';
2
+ import { type $DomainEntity, type AssistantManifest, type DomainEntity, type DomainState, type StateEmission } from '#package/domain';
3
+ type AnyDomainEntity = DomainEntity<string>;
4
+ type AnyDomainState = DomainState<AnyDomainEntity>;
5
+ type AnyStateEmission = StateEmission<AnyDomainEntity, Record<string, $DomainEntity<AnyDomainEntity>>>;
6
+ /**
7
+ * What the change record compares besides the entities: the values the `Query` root of the
8
+ * assistant's schema exposes as `selectedEntity` and `navigation`, read off a state.
9
+ */
10
+ export interface ChangeRecorderStateReaders {
11
+ readonly selectedEntityId: (state: AnyDomainState) => string | undefined;
12
+ readonly navigationState: (state: AnyDomainState) => string | undefined;
13
+ readonly viewState: (state: AnyDomainState) => string | undefined;
14
+ readonly toolState: (state: AnyDomainState) => string | undefined;
15
+ }
16
+ /** What a {@link ChangeRecorder} reads from the running configurator. */
17
+ export interface ChangeRecorderContext {
18
+ readonly readers: ChangeRecorderStateReaders;
19
+ /**
20
+ * The field table of the assistant manifest: per entity type of the schema, each exposed field
21
+ * name with the stored field or expression it reads. The record lists nothing the table does not
22
+ * hold, so the agent is shown only what it could also query. Read at every take, because editor
23
+ * hot reload replaces the manifest.
24
+ */
25
+ readonly getExposedFields: () => AssistantManifest['fields'];
26
+ readonly resolveLocalizable: (message: Localizable) => string;
27
+ }
28
+ export interface ChangeRecorderProps {
29
+ /** More differing entities than this are counted and not listed. */
30
+ readonly maxEntities: number;
31
+ }
32
+ /**
33
+ * Records what changed in the committed configuration since the assistant agent last acted, and
34
+ * prints it as the change record a user message carries to the agent.
35
+ *
36
+ * The record is a net diff: the committed state at the last take or clear is kept as the baseline
37
+ * and compared with the current one, so a value that was changed and changed back is not listed.
38
+ * Of the emissions in between, only the last update that touched each entity and each entity field
39
+ * is kept, to say why a line is there. Selection and navigation are read off the two states and
40
+ * never from their updates.
41
+ *
42
+ * Only what the assistant manifest exposes is listed: entities of the types its schema has, and of
43
+ * their stored fields the exposed ones, under their exposed names and localized like the schema
44
+ * returns them. A change of anything else is not in the record.
45
+ */
46
+ export declare class ChangeRecorder {
47
+ private readonly _props;
48
+ private readonly _context;
49
+ private _baseline;
50
+ /** True from a reset until the first take: what happened before the baseline is not known. */
51
+ private _isUnavailable;
52
+ private readonly _touches;
53
+ private _lastReset;
54
+ private _wasUndoneOrRedone;
55
+ constructor(_props: ChangeRecorderProps, _context: ChangeRecorderContext);
56
+ /** Starts over from this committed state; the next take reports `unavailable`. */
57
+ reset: (state: AnyDomainState) => void;
58
+ /** Records one committed emission: the last update that touched each entity and field, or the reset. */
59
+ record: (emission: AnyStateEmission) => void;
60
+ /** The change record since the last take or clear, as the prompt describes it; moves the baseline. */
61
+ take: (state: AnyDomainState) => string;
62
+ /** Forgets what was recorded and makes this committed state the baseline. */
63
+ clear: (state: AnyDomainState) => void;
64
+ private _touchesOf;
65
+ private _touchFields;
66
+ private _print;
67
+ private _diffStates;
68
+ /** Added and modified entities in the order of the current state, then the deleted ones in the order they had. */
69
+ private _diffEntities;
70
+ /**
71
+ * The lines of the exposed stored fields that differ, in manifest order. A field no update
72
+ * touched since its entity was created or replaced under an id that existed before is explained
73
+ * by that creation.
74
+ */
75
+ private _diffFields;
76
+ /** Why a line is in the record; a line no recorded update explains was left by a reset. */
77
+ private _comment;
78
+ /**
79
+ * What the agent is told about an update, else what the user was told, else the update tag. As
80
+ * for `sideEffects`, an `agentHint` replaces the `hint` whatever it holds: `null` or empty text
81
+ * hides the wording from the agent, not the change, so the tag stands in.
82
+ */
83
+ private _explain;
84
+ }
85
+ export {};
@@ -0,0 +1 @@
1
+ import{match as e}from"ts-pattern";import{isUndoRedoReset as t}from"#package/domain";import{localize as i}from"../graphql-system/graphql-system.js";let s=[["selected","selectedEntityId"],["navigationState","navigationState"],["viewState","viewState"],["toolState","toolState"]],n=e=>e.length>80?`${e.slice(0,80)}…`:e,a=e=>void 0===e||""===e?"none":e,r=e=>new Map(Object.entries(e)),l=["id","type"];export class ChangeRecorder{_props;_context;_baseline;_isUnavailable=!0;_touches=new Map;_lastReset;_wasUndoneOrRedone=!1;constructor(e,t){this._props=e,this._context=t}reset=e=>{this.clear(e),this._isUnavailable=!0};record=i=>{if("reset"===i.kind){this._touches.clear(),this._lastReset=t(i)?"undo/redo":"reset",this._wasUndoneOrRedone||="undo/redo"===this._lastReset;return}for(let t of i.updates)e(t).with({kind:"createDomainEntity"},e=>{this._touchesOf(e.entityId).created=e}).with({kind:"deleteEntity"},e=>{let t=this._touchesOf(e.entityId);t.fields.clear(),t.deleted=e}).with({kind:"modifyDomainEntity"},e=>{this._touchFields(e.entityId,Object.keys(e.stateDelta),e)}).with({kind:"replaceDomainEntity"},e=>{let{replacementEntity:t}=e;this._touchesOf(e.entityId).fields.clear(),this._touchesOf(e.entityId).deleted=e,this._touchesOf(t.id).created=e}).with({kind:"createEphemeralRecord"},{kind:"modifyEphemeralRecord"},{kind:"deleteEphemeralRecord"},()=>{}).exhaustive()};take=e=>{let t=this._print(e);return this.clear(e),this._isUnavailable=!1,t};clear=e=>{this._baseline=e,this._touches.clear(),this._lastReset=void 0,this._wasUndoneOrRedone=!1};_touchesOf=e=>{let t=this._touches.get(e);if(t)return t;let i={created:void 0,deleted:void 0,fields:new Map};return this._touches.set(e,i),i};_touchFields=(e,t,i)=>{let s=this._touchesOf(e);for(let e of t)s.fields.set(e,i)};_print=e=>{let t=this._baseline;if(this._isUnavailable||!t)return"[changes: unavailable]";let{lines:i,count:s}=this._diffEntities(t,e);if(s>this._props.maxEntities)return`[changes: too many (${s})]`;let n=[...this._diffStates(t,e),...i];return 0===n.length?"[changes: none]":["[changes]",...this._wasUndoneOrRedone?["reset: undo/redo"]:[],...n].join("\n")};_diffStates=(e,t)=>s.flatMap(([i,s])=>{let n=a(this._context.readers[s](e)),r=a(this._context.readers[s](t));return n===r?[]:[`${i}: ${n} -> ${r}`]});_diffEntities=(e,t)=>{let i=this._context.getExposedFields(),s=new Map(e.entities.map(e=>[e.id,e])),n=new Set(t.entities.map(e=>e.id)),a=t.entities.flatMap(e=>{let t=i[e.type],n=s.get(e.id);if(!t)return[];if(!n)return[[`A ${e.id}${this._comment(this._touches.get(e.id)?.created)}`]];let a=n===e?[]:this._diffFields(n,e,t);return a.length>0?[[`M ${e.id}`,...a]]:[]}),r=e.entities.filter(e=>i[e.type]&&!n.has(e.id)).map(e=>[`D ${e.id}${this._comment(this._touches.get(e.id)?.deleted)}`]);return{lines:[...a,...r].flat(),count:a.length+r.length}};_diffFields=(e,t,s)=>{let a=r(e),d=r(t),o=this._touches.get(t.id);return Object.entries(s).flatMap(([e,{source:t,localized:s}])=>{if(!(!t.startsWith("$")&&!l.includes(t)))return[];let r=e=>{let t;return void 0===(t=s?i(e,this._context.resolveLocalizable):e)?"undefined":JSON.stringify(t)},h=r(a.get(t)),c=r(d.get(t));return h===c?[]:[` ${e}: ${n(h)} -> ${n(c)}${this._comment(o?.fields.get(t)??o?.created)}`]})};_comment=e=>e?` # ${this._explain(e).replace(/\s*\n\s*/g," ")}`:this._lastReset?` # ${this._lastReset}`:"";_explain=({agentHint:e,hint:t,updateTag:i})=>void 0!==e?null===e||""===e?i:e:t?this._context.resolveLocalizable(t):i}
@@ -18,6 +18,8 @@ export interface AssistantToolDependencies {
18
18
  };
19
19
  };
20
20
  readonly getActiveMode: () => DomainMode;
21
+ /** Forgets the changes recorded for the next change record, so it never lists what the agent itself changed. */
22
+ readonly clearChanges: () => void;
21
23
  }
22
24
  /**
23
25
  * Browser implementation of the assistant's `query` tool: prepares the operations from the
@@ -89,7 +91,9 @@ export declare const createQueryClientTool: (dependencies: AssistantToolDependen
89
91
  /**
90
92
  * Browser implementation of the assistant's `apply` tool: hands the operations to
91
93
  * `GraphQLSystem.execute`, which commits their changes as one undo step, and returns its result,
92
- * including why nothing was committed when a commit was held or lost to a conflict. Only an owner
94
+ * including why nothing was committed when a commit was held or lost to a conflict. A commit clears
95
+ * the recorded changes; a held one does not, so it shows in the next change record once the user
96
+ * approves it. Only an owner
93
97
  * session may change the configuration; the check lives here and not in the `GraphQLSystem`, whose
94
98
  * other caller, the editor panel, has its own rules.
95
99
  */
@@ -1 +1 @@
1
- import{AssistantGraphQLToolInput as e,applyTool as t,queryTool as o}from"@salsita-ai/contracts/assistant";let a=e=>({results:[],committed:!1,message:e,sideEffects:[]}),i=e=>JSON.parse(JSON.stringify(e)),s=t=>{let o=e.safeParse(t);if(!o.success){let e=o.error.issues.map(e=>`${e.path.join(".")}: ${e.message}`).join("; ");return{ok:!1,refusal:a(`Nothing was run, because the tool input is not a list of operations (${e}). Send { "operations": [{ "query": "<one GraphQL operation>" }] } with at least one item.`)}}return{ok:!0,operations:o.data.operations.map(({query:e,variables:t,operationName:o})=>({document:e,variables:t??void 0,operationName:o??void 0}))}};export const createQueryClientTool=e=>o.client(async t=>{let o=s(t);if(!o.ok)return o.refusal;let n=e.getStoreSystem();if(!n.isInitialized)return a("Nothing was run, because the configuration is not loaded yet, so there is no state to query. Call the tool again once the configurator has finished loading.");let r=e.getGraphQLSystem(),l=await r.prepare(n.stateSlices.committed.value.state,o.operations);return i({results:l.map(({result:e})=>e),committed:!1,sideEffects:r.readSideEffects(l)})});export const createApplyClientTool=e=>t.client(async t=>{if("owner"!==e.getActiveMode())return a("Nothing was run, because changes cannot be applied in this session: the user may view this configuration but not change it. The query tool still works here, including mutations, to show what a change would do without keeping it.");let o=s(t);return o.ok?i(await e.getGraphQLSystem().execute(o.operations)):o.refusal});
1
+ import{AssistantGraphQLToolInput as e,applyTool as t,queryTool as o}from"@salsita-ai/contracts/assistant";let a=e=>({results:[],committed:!1,message:e,sideEffects:[]}),i=e=>JSON.parse(JSON.stringify(e)),s=t=>{let o=e.safeParse(t);if(!o.success){let e=o.error.issues.map(e=>`${e.path.join(".")}: ${e.message}`).join("; ");return{ok:!1,refusal:a(`Nothing was run, because the tool input is not a list of operations (${e}). Send { "operations": [{ "query": "<one GraphQL operation>" }] } with at least one item.`)}}return{ok:!0,operations:o.data.operations.map(({query:e,variables:t,operationName:o})=>({document:e,variables:t??void 0,operationName:o??void 0}))}};export const createQueryClientTool=e=>o.client(async t=>{let o=s(t);if(!o.ok)return o.refusal;let n=e.getStoreSystem();if(!n.isInitialized)return a("Nothing was run, because the configuration is not loaded yet, so there is no state to query. Call the tool again once the configurator has finished loading.");let r=e.getGraphQLSystem(),l=await r.prepare(n.stateSlices.committed.value.state,o.operations);return i({results:l.map(({result:e})=>e),committed:!1,sideEffects:r.readSideEffects(l)})});export const createApplyClientTool=e=>t.client(async t=>{if("owner"!==e.getActiveMode())return a("Nothing was run, because changes cannot be applied in this session: the user may view this configuration but not change it. The query tool still works here, including mutations, to show what a change would do without keeping it.");let o=s(t);if(!o.ok)return o.refusal;let n=await e.getGraphQLSystem().execute(o.operations);return n.committed&&e.clearChanges(),i(n)});
@@ -1 +1 @@
1
- import{findAssistantFieldOptions as e,findAssistantRecipeGroups as t,modifyEntityUpdateTag as i,prepareAssistantRecipeUpdates as r,readAssistantFieldOptions as n,readAssistantRecipeGroup as s,systemUpdateFactory as a}from"#package/domain";import{readSideEffects as o}from"./side-effects.js";let d=e=>({ok:!1,root:null,changedEntities:[],deletedEntityIds:[],sideEffects:[],errors:e}),l=(e,{state:t},{recipes:i,prepareStateEmission:r,find$Entity:n})=>{let{validity:s,state:a,updates:l}=r(e,t,"committed");if(s.valid){let e=new Map(t.entities.map(e=>[e.id,e])),r=new Set(a.entities.map(e=>e.id));return{ok:!0,root:n(a.rootEntityId,a),changedEntities:a.entities.filter(t=>e.get(t.id)!==t).flatMap(e=>n(e.id,a)??[]),deletedEntityIds:t.entities.map(e=>e.id).filter(e=>!r.has(e)),sideEffects:o(l,i.resolveLocalizable),errors:[]}}return d("uncaught"===s.severity?[{type:"uncaught",entityId:null,message:s.error.message}]:s.entityViolations.filter(({violation:e})=>e.severity===s.severity).map(({entityId:e,violation:t})=>({type:t.type,entityId:e,message:void 0===t.message?null:i.resolveLocalizable(t.message)})))};export const createEntityMeta=(o,c)=>{let p=e=>()=>t(c.manifest,e,o.entity.type).flatMap(t=>{let i=s(e,t,o.entity.id,o.state,c.recipes);return i?[((e,t,i)=>{let{group:n,label:s,description:a,recipes:o}=e,{resolveLocalizable:c}=i.recipes;return{groupId:n.groupId,name:void 0===s?n.instanceName:c(s),description:n.description??(void 0===a?null:c(a)),recipes:o.map(n=>((e,t,i,n)=>{let{key:s,item:a}=e,{resolveLocalizable:o}=n.recipes;return{key:s,name:o(a.title),description:void 0===a.description?null:o(a.description),imageUrl:void 0===a.thumbnailUrl?null:o(a.thumbnailUrl),dryRun:()=>t.group.dryRuns?((e,t,i,n)=>{let{updates:s,error:a}=((e,t,{entity:i,state:n},{recipes:s})=>{try{return{updates:r(e,t,i.id,n,s),error:void 0}}catch(e){if("child"===t.target.kind)throw e;return{updates:void 0,error:e instanceof Error?e.message:String(e)}}})(e,t,i,n);return void 0===s?d([{type:"uncaught",entityId:null,message:a}]):l(s,i,n)})(e,t,i,n):null}})(n,e,t,i))}})(i,o,c)]:[]});return{...Object.fromEntries(e(c.manifest,o.entity.type).map(e=>[e.edgeName,()=>n(e,o.entity.id,o.state,c.recipes)?.map(t=>({...t,dryRun:()=>e.dryRuns?(({field:e},{value:t},r,n)=>{let{entity:s}=r,o=Object.entries(Object.entries(n.manifest.writableFields??{}).find(([e])=>e===s.type)?.[1]??{}).find(([t])=>t===e)?.[1];if(void 0===o)throw Error(`The options of "${e}" on "${s.id}" cannot be dry-run: the schema lists them, but the configurator has no writable field "${e}" on ${s.type}. Regenerate the application so the schema matches the configurator.`);let c=r.state.entities.find(e=>e.id===s.id),p={[o]:t},u=c?n.validateEntity({...c,...p}):{success:!0};return u.success?l([a.DomainEntityModification({entityId:s.id,stateDelta:p,updateTag:i})],r,n):d([{type:"uncaught",entityId:s.id,message:`Writing ${JSON.stringify(t)} to "${e}" would make "${s.id}" an invalid ${s.type}: ${u.errors.join("; ")}.${e===o?"":` The message names the stored property: ${e} is stored as ${o}.`} The option comes from the configurator and cannot be corrected from here, so do not write it.`}])})(e,t,o,c):null}))??null])),childRecipes:p("child"),replaceRecipes:p("replace")}};
1
+ import{findAssistantFieldOptions as e,findAssistantRecipeGroups as t,modifyEntityUpdateTag as i,prepareAssistantRecipeUpdates as r,readAssistantFieldOptions as n,readAssistantRecipeGroup as o,systemUpdateFactory as s}from"#package/domain";import{readSideEffects as a}from"./side-effects.js";let d=e=>({ok:!1,root:null,changedEntities:[],deletedEntityIds:[],sideEffects:[],errors:e}),l=(e,{state:t},{recipes:i,prepareStateEmission:r,find$Entity:n})=>{let{validity:o,state:s,updates:l}=r(e,t,"committed");if(o.valid){let e=new Map(t.entities.map(e=>[e.id,e])),r=new Set(s.entities.map(e=>e.id));return{ok:!0,root:n(s.rootEntityId,s),changedEntities:s.entities.filter(t=>e.get(t.id)!==t).flatMap(e=>n(e.id,s)??[]),deletedEntityIds:t.entities.map(e=>e.id).filter(e=>!r.has(e)),sideEffects:a(l,i.resolveLocalizable),errors:[]}}return d("uncaught"===o.severity?[{type:"uncaught",entityId:null,message:o.error.message}]:o.entityViolations.filter(({violation:e})=>e.severity===o.severity).map(({entityId:e,violation:t})=>({type:t.type,entityId:e,message:void 0===t.message?null:i.resolveLocalizable(t.message)})))};export const createEntityMeta=(a,u)=>{let c=e=>()=>t(u.manifest,e,a.entity.type).flatMap(t=>{let i=o(e,t,a.entity.id,a.state,u.recipes);return i?[((e,t,i)=>{let{group:n,label:o,description:s,recipes:a}=e,{resolveLocalizable:u}=i.recipes;return{groupId:n.groupId,name:void 0===o?n.instanceName:u(o),description:n.description??(void 0===s?null:u(s)),recipes:a.map(n=>((e,t,i,n)=>{let{key:o,item:s}=e,{resolveLocalizable:a}=n.recipes;return{key:o,name:a(s.title),description:void 0===s.description?null:a(s.description),imageUrl:void 0===s.thumbnailUrl?null:a(s.thumbnailUrl),dryRun:()=>t.group.dryRuns?((e,t,i,n)=>{let{updates:o,error:s}=((e,t,{entity:i,state:n},{recipes:o})=>{try{return{updates:r(e,t,i.id,n,o),error:void 0}}catch(e){if("child"===t.target.kind)throw e;return{updates:void 0,error:e instanceof Error?e.message:String(e)}}})(e,t,i,n);return void 0===o?d([{type:"uncaught",entityId:null,message:s}]):l(o,i,n)})(e,t,i,n):null}})(n,e,t,i))}})(i,a,u)]:[]});return{...Object.fromEntries(e(u.manifest,a.entity.type).map(e=>[e.edgeName,()=>n(e,a.entity.id,a.state,u.recipes)?.map(t=>({...t,dryRun:()=>e.dryRuns?(({field:e},{value:t},r,n)=>{let{entity:o}=r,a=Object.entries(Object.entries(n.manifest.writableFields??{}).find(([e])=>e===o.type)?.[1]??{}).find(([t])=>t===e)?.[1];if(void 0===a)throw Error(`The options of "${e}" on "${o.id}" cannot be dry-run: the schema lists them, but the configurator has no writable field "${e}" on ${o.type}. This is a fault in the configurator, not in your request. Tell the user this is not available.`);let u=r.state.entities.find(e=>e.id===o.id);if(!u)throw Error(`The options of "${e}" on "${o.id}" cannot be dry-run: entity "${o.id}" does not exist. It may have been deleted by an earlier operation or field. Query the current entities and use an id they return.`);let c={[a]:t},p=n.validateEntity({...u,...c});return p.success?l([s.DomainEntityModification({entityId:o.id,stateDelta:c,updateTag:i})],r,n):d([{type:"uncaught",entityId:o.id,message:`Writing ${JSON.stringify(t)} to "${e}" would make "${o.id}" an invalid ${o.type}: ${p.errors.join("; ")}. The option comes from the configurator and cannot be corrected from here, so do not write it.`}])})(e,t,a,u):null}))??null])),childRecipes:c("child"),replaceRecipes:c("replace")}};
@@ -1,5 +1,6 @@
1
1
  import { type ExecutionResult } from 'graphql';
2
- import { type $DomainEntity, type DomainContextSelectors, type DomainEntity, type DomainServicesSelectors, type DomainState, type SpecSelectors, type StateUpdateEmission } from '#package/domain';
2
+ import { type Localizable } from '@salsita-ai/common/utils';
3
+ import { type $DomainEntity, type DomainContextSelectors, type DomainEntity, type DomainServicesSelectors, type DomainState, type SessionAssistantSetup, type SpecSelectors, type StateUpdateEmission } from '#package/domain';
3
4
  /** One single-operation GraphQL document with its own variables, as executed by {@link GraphQLSystem}. */
4
5
  export interface GraphQLOperation {
5
6
  readonly document: string;
@@ -7,6 +8,8 @@ export interface GraphQLOperation {
7
8
  readonly operationName?: string;
8
9
  }
9
10
  export interface GraphQLSystemContext {
11
+ /** The assistant the initialized session runs: the operations are validated and executed against its schema. */
12
+ readonly getAssistantSetup: () => SessionAssistantSetup;
10
13
  readonly specSelectors: SpecSelectors;
11
14
  readonly domainContextSelectors: DomainContextSelectors;
12
15
  readonly domainServicesSelectors: DomainServicesSelectors;
@@ -37,6 +40,11 @@ export interface GraphQLExecution {
37
40
  /** What the configurator did, or would do, beyond what the operations asked for, in applied order. */
38
41
  readonly sideEffects: readonly string[];
39
42
  }
43
+ /**
44
+ * Resolves a localizable value, or each item of a list of them, to a string in the current locale.
45
+ * `null` and values that are not localizable pass through, so the schema's nullability decides.
46
+ */
47
+ export declare const localize: (value: unknown, resolveLocalizable: (message: Localizable) => string) => unknown;
40
48
  /**
41
49
  * Executes GraphQL operations against the schema generated from the application spec `assistant`
42
50
  * manifest, resolving it against the committed domain state. Agent-independent: the assistant's
@@ -45,10 +53,12 @@ export interface GraphQLExecution {
45
53
  export declare class GraphQLSystem {
46
54
  private readonly _context;
47
55
  /**
48
- * Compiles the manifest's SDL and checks the schema's semantic rules, once per SDL text, so a schema
49
- * that parses but is not valid GraphQL fails every operation with an error result.
56
+ * Compiles the execution schema of the manifest's SDL and checks its semantic rules, once per SDL
57
+ * text, so a schema that parses but is not valid GraphQL fails every operation with an error result.
50
58
  */
51
59
  private readonly _selectSchema;
60
+ /** Parses the manifest's lens definitions, which the builder has validated, once per text. */
61
+ private readonly _selectLenses;
52
62
  /**
53
63
  * Query fields call the root resolvers; entity fields read the stored field or expression their
54
64
  * GraphQL name maps to. Rebuilt only when the manifest's field sources change.
@@ -72,10 +82,16 @@ export declare class GraphQLSystem {
72
82
  private readonly _resolveMutation;
73
83
  private readonly _runMutation;
74
84
  private readonly _setup;
85
+ /**
86
+ * Parses, validates and executes one operation document. Validation adds the rule against
87
+ * introspection to the standard ones: the agent reads the schema from its prompt, and the schema
88
+ * operations run against is the widened execution schema, which is not the one to describe.
89
+ */
90
+ private readonly _run;
75
91
  /**
76
92
  * Runs the operations in order through one working state that starts at `originalState`: a query
77
93
  * reads the current working state, and each mutation field advances it with its own emission.
78
- * Nothing is committed. The first operation that fails stops the list; every later one gets a
94
+ * The lenses an operation spreads are injected into its document first. Nothing is committed. The first operation that fails stops the list; every later one gets a
79
95
  * "not run" error instead.
80
96
  */
81
97
  prepare: (originalState: AnyDomainState, operations: readonly GraphQLOperation[]) => Promise<readonly PreparedOperation[]>;
@@ -1 +1 @@
1
- import{GraphQLError as e,buildSchema as t,defaultFieldResolver as i,getNamedType as o,graphql as a,validateSchema as n}from"graphql";import{assertExistence as r,createSelector as s,isMessageDescriptor as l,isMultilingualString as c}from"@salsita-ai/common/utils";import{DomainEntityIdSchema as h,findAssistantMutation as d}from"#package/domain";import{createEntityMeta as m}from"./entity-meta.js";import{readSideEffects as p}from"./side-effects.js";let f={errors:[new e('No assistant manifest in the application spec. The GraphQL schema is generated from the "assistant" section. Add an "assistant" section to a spec file to expose a schema.')]},u={errors:[new e("The configuration is not loaded yet, so there is no state to query. Run the query again once the configurator has finished loading.")]},y=new RegExp(h.pattern),g=e=>"object"==typeof e&&null!==e&&"type"in e&&"string"==typeof e.type&&"id"in e&&"string"==typeof e.id,v=(e,t)=>"object"==typeof e&&null!==e?Reflect.get(e,t):void 0,S=e=>e instanceof Error?e.message:String(e),_=e=>/[.!?]$/.test(e)?e:`${e}.`,x=e=>"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===Object.prototype,w=(e,t)=>{let i=x(e)?e._raw:void 0;if(g(i))return i;if(!Array.isArray(e)&&!x(e))return e;if(t.has(e))throw Error("The value contains itself. Return ids or copies of the values instead of objects that reference each other.");let o=new Set([...t,e]);return Array.isArray(e)?e.map(e=>w(e,o)):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,w(t,o)]))},E=(e,t)=>Array.isArray(e)?e.map(e=>E(e,t)):"string"==typeof e||l(e)||c(e)?t(e):e,$=t=>new e(`The GraphQL schema generated from the "assistant" manifest is invalid: ${_(t)} Regenerate the application so the schema is rebuilt from the current spec.`),b=e=>(e.errors?.length??0)>0,C=t=>({errors:[new e(`Not run: operation ${t+1} failed, so the operations after it were skipped and no change of the list takes effect. Fix the failing operation and send the whole list again.`)]});export class GraphQLSystem{_context;_selectSchema=s([s.leaf(e=>e)],e=>{try{let i=t(e),o=n(i);return o.length>0?$(o.map(e=>e.message).join(" ")):i}catch(e){return $(S(e))}});_selectFieldResolver=s([s.leaf(e=>e)],t=>(a,n,r,s)=>{if(s.parentType===s.schema.getQueryType())return i(a,n,r,s);if(s.parentType===s.schema.getMutationType())return this._resolveMutation(s.fieldName,String(s.path.key),n,r);if(!g(a))return i(a,n,r,s);if("meta"===s.fieldName){let e;return m({entity:a,state:("object"==typeof(e=v(a,"_state"))&&null!==e&&"entities"in e&&"rootEntityId"in e?e:void 0)??r.state},{manifest:r.manifest,recipes:this._recipeContext(),prepareStateEmission:(e,t,i)=>this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(e,t,i),find$Entity:(e,t)=>this._find$Entity(e,t),validateEntity:e=>this._context.domainContextSelectors.getDomain().validateEntity(e)})}let{source:l,localized:c}=t[s.parentType.name]?.[s.fieldName]??{source:s.fieldName},h=((t,i)=>{try{return v(t,i)}catch(o){throw new e(`Expression "${i}" failed on ${g(t)?t.id:"an entity"}: ${_(S(o))} The expression threw while the query read it; fix the expression or the configuration state it reads.`,{originalError:o instanceof Error?o:void 0})}})(a,l);return c?E(h,this._context.domainServicesSelectors.getResolveLocalizable()):l.startsWith("$")&&"JSON"===o(s.returnType).name?((t,i,o)=>{try{return w(o,new Set)}catch(o){throw new e(`Expression "${i}" returned a value that is not plain serializable data on ${g(t)?t.id:"an entity"}: ${_(S(o))} A JSON field can only return data that serializes to JSON.`,{originalError:o instanceof Error?o:void 0})}})(a,l,h):h});constructor(e){this._context=e}_get$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().get$Entity(e,t);_find$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().getEntity(e,t)?this._get$Entity(e,t):null;_recipeContext=()=>({componentReader:this._context.domainContextSelectors.getComponentReader(),recipeCooker:this._context.domainContextSelectors.getRecipeCookerSystem(),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});_rootValue={root:(e,{state:t})=>this._get$Entity(t.rootEntityId,t),entities:({ids:t},{state:i})=>{if(null==t)return i.entities.map(e=>this._get$Entity(e.id,i));var o=i.rootEntityId;let a=t.filter(e=>!y.test(e));if(a.length>0)throw new e(`${a.map(e=>`"${e}"`).join(", ")} ${1===a.length?"is not an entity id":"are not entity ids"}. Entity ids have the form "<Type>-<number>", e.g. "${o}". Use ids as returned by the "id" field.`);return t.map(e=>y.test(e)?this._find$Entity(e,i):null)},selectedEntity:(e,{state:t})=>this._find$Entity(this._context.domainContextSelectors.getNavigationSystem().getActiveSelectionState(t),t),navigation:(e,{state:t})=>{let i=this._context.domainContextSelectors.getNavigationSystem();return{navigationState:i.getActiveNavigationState(t),viewState:i.getActiveViewState(t),toolState:i.getActiveToolState(t)}}};_resolveType=e=>g(e)?e.type:void 0;initialize=()=>{};_resolveMutation=(t,i,o,a)=>{if(void 0!==a.failedMutationField)throw new e(`Not run: the earlier field "${a.failedMutationField}" of this operation failed, so "${i}" was skipped and no change of the operation takes effect. Fix the failing field and send the operation again.`);try{return this._runMutation(t,o,a)}catch(e){throw a.failedMutationField=i,e}};_runMutation=(t,i,o)=>{let a=d(t,o.manifest);if(!a)throw new e(`The schema declares the mutation "${t}", but the configurator has no implementation for it. Regenerate the application so the schema matches the configurator.`);let n=o.state,r=a.implementation(i,n,{manifest:o.manifest,action:this._context.domainContextSelectors.getActionSystem().createContext(n),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});if(r.updates.length>0){let i=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(r.updates,n,"committed");if(!i.validity.valid)throw new e(`The changes of "${t}" were not applied, because the resulting configuration is invalid: ${(e=>{if("uncaught"===e.severity)return`validating it threw: ${_(S(e.error))}`;let t=[...new Set(e.entityViolations.filter(({violation:t})=>t.severity===e.severity).map(({entityId:e})=>e))];return`it has ${e.severity} violations on ${t.join(", ")}.`})(i.validity)} Change the request so the configuration stays valid.`);o.emissions.push(i),o.state=i.state}return r.readResult({previousState:n,state:o.state})};_setup=()=>{let t=this._context.specSelectors.getAssistant();if(!t)return{ready:!1,result:f};let i=this._selectSchema(t.sdl);return i instanceof e?{ready:!1,result:{errors:[i]}}:{ready:!0,assistant:t,schema:i,fieldResolver:this._selectFieldResolver(t.fields)}};prepare=async(e,t)=>{let i,o=this._setup();if(!o.ready)return t.map(()=>({result:o.result,emissions:[]}));let n={manifest:o.assistant,state:e,emissions:[],failedMutationField:void 0},r=[];for(let[e,s]of t.entries())if(void 0===i){let t=n.emissions.length;n.failedMutationField=void 0;let l=await a({schema:o.schema,source:s.document,rootValue:this._rootValue,contextValue:n,variableValues:s.variables,operationName:s.operationName,fieldResolver:o.fieldResolver,typeResolver:this._resolveType});r.push({result:l,emissions:n.emissions.slice(t)}),b(l)&&(i=e)}else r.push({result:C(i),emissions:[]});return r};readSideEffects=e=>{let t=this._context.domainServicesSelectors.getResolveLocalizable();return e.flatMap(({emissions:e})=>e.flatMap(e=>p(e.updates,t)))};_prepareAndCommit=async e=>{let t,i,o,a=this._context.domainContextSelectors.getStoreSystem(),n=await this.prepare(a.stateSlices.committed.value.state,e),s=n.map(({result:e})=>e),l=this.readSideEffects(n),c=n.flatMap(e=>e.emissions);return s.some(b)||0===c.length?{results:s,sideEffects:l,outcome:"none"}:{results:s,sideEffects:l,outcome:a.commitPrepared((t=r(c[0]),i=r(c[c.length-1]),o=c.some(e=>void 0!==e.transformationLog),{kind:"committed",previousState:t.previousState,state:i.state,updates:c.flatMap(e=>e.updates),validity:i.validity,transformationLog:o?c.flatMap(e=>e.transformationLog??[]):void 0}))}};execute=async e=>{if(!this._context.domainContextSelectors.getStoreSystem().isInitialized)return{results:e.map(()=>u),committed:!1,sideEffects:[]};let t=await this._prepareAndCommit(e),{results:i,sideEffects:o,outcome:a}="conflict"===t.outcome?await this._prepareAndCommit(e):t;return"committed"===a?{results:i,committed:!0,sideEffects:o}:"held"===a?{results:i,committed:!1,message:"The changes were not committed yet: the application held them, usually to ask the user for approval. They may still be applied once the user approves, and the next turn shows whether they were. Do not send the operations again.",sideEffects:o}:"conflict"===a?{results:i,committed:!1,message:"The changes were not committed, because the configuration changed while they were being applied. The results describe a state that was discarded. Query the current configuration and send the operations again if they still make sense.",sideEffects:o}:{results:i,committed:!1,sideEffects:o}}}
1
+ import{GraphQLError as e,NoSchemaIntrospectionCustomRule as t,defaultFieldResolver as i,execute as o,getNamedType as n,parse as r,specifiedRules as a,validate as s,validateSchema as l}from"graphql";import{assertExistence as c,createSelector as d,isMessageDescriptor as h,isMultilingualString as u}from"@salsita-ai/common/utils";import{DomainEntityIdSchema as m,createAssistantExecutionSchema as f,findAssistantMutation as p}from"#package/domain";import{createEntityMeta as g}from"./entity-meta.js";import{injectAssistantLenses as y}from"./inject-assistant-lenses.js";import{readSideEffects as v}from"./side-effects.js";let S={errors:[new e("The configurator does not provide this request. This is a fault in the configurator, not in your request. Tell the user this is not available.")]},_={errors:[new e("The configuration is not loaded yet, so there is no state to query. Run the query again once the configurator has finished loading.")]},x=new RegExp(m.pattern),w=[...a,t],E=e=>"object"==typeof e&&null!==e&&"type"in e&&"string"==typeof e.type&&"id"in e&&"string"==typeof e.id,$=(e,t)=>"object"==typeof e&&null!==e?Reflect.get(e,t):void 0,b=e=>e instanceof Error?e.message:String(e),T=e=>/[.!?]$/.test(e)?e:`${e}.`,C=e=>"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===Object.prototype,R=(e,t)=>{let i=C(e)?e._raw:void 0;if(E(i))return i;if(!Array.isArray(e)&&!C(e))return e;if(t.has(e))throw Error("The value contains itself.");let o=new Set([...t,e]);return Array.isArray(e)?e.map(e=>R(e,o)):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,R(t,o)]))};export const localize=(e,t)=>Array.isArray(e)?e.map(e=>localize(e,t)):"string"==typeof e||h(e)||u(e)?t(e):e;let j=t=>new e(`The configurator cannot handle this request: ${T(t)} This is a fault in the configurator, not in your request. Tell the user this is not available.`),A=e=>(e.errors?.length??0)>0,M=t=>({errors:[new e(`Not run: operation ${t+1} failed, so the operations after it were skipped and no change of the list takes effect. Fix the failing operation and send the whole list again.`)]});export class GraphQLSystem{_context;_selectSchema=d([d.leaf(e=>e)],e=>{try{let t=f(e),i=l(t);return i.length>0?j(i.map(e=>e.message).join(" ")):t}catch(e){return j(b(e))}});_selectLenses=d([d.leaf(e=>e)],e=>r(e));_selectFieldResolver=d([d.leaf(e=>e)],t=>(o,r,a,s)=>{if(s.parentType===s.schema.getQueryType())return i(o,r,a,s);if(s.parentType===s.schema.getMutationType())return this._resolveMutation(s.fieldName,String(s.path.key),r,a);if(!E(o))return i(o,r,a,s);if("meta"===s.fieldName){let e;return g({entity:o,state:("object"==typeof(e=$(o,"_state"))&&null!==e&&"entities"in e&&"rootEntityId"in e?e:void 0)??a.state},{manifest:a.manifest,recipes:this._recipeContext(),prepareStateEmission:(e,t,i)=>this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(e,t,i),find$Entity:(e,t)=>this._find$Entity(e,t),validateEntity:e=>this._context.domainContextSelectors.getDomain().validateEntity(e)})}let{source:l,localized:c}=t[s.parentType.name]?.[s.fieldName]??{source:s.fieldName},d=((t,i)=>{try{return $(t,i)}catch(o){throw new e(`Expression "${i}" failed on ${E(t)?t.id:"an entity"}: ${T(b(o))} This is a fault in the configurator, not in your request. Tell the user this is not available.`,{originalError:o instanceof Error?o:void 0})}})(o,l);return c?localize(d,this._context.domainServicesSelectors.getResolveLocalizable()):l.startsWith("$")&&"JSON"===n(s.returnType).name?((t,i,o)=>{try{return R(o,new Set)}catch(o){throw new e(`Expression "${i}" returned a value that is not plain serializable data on ${E(t)?t.id:"an entity"}: ${T(b(o))} This is a fault in the configurator, not in your request. Tell the user this is not available.`,{originalError:o instanceof Error?o:void 0})}})(o,l,d):d});constructor(e){this._context=e}_get$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().get$Entity(e,t);_find$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().getEntity(e,t)?this._get$Entity(e,t):null;_recipeContext=()=>({componentReader:this._context.domainContextSelectors.getComponentReader(),recipeCooker:this._context.domainContextSelectors.getRecipeCookerSystem(),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});_rootValue={root:(e,{state:t})=>this._get$Entity(t.rootEntityId,t),entities:({ids:t},{state:i})=>{if(null==t)return i.entities.map(e=>this._get$Entity(e.id,i));var o=i.rootEntityId;let n=t.filter(e=>!x.test(e));if(n.length>0)throw new e(`${n.map(e=>`"${e}"`).join(", ")} ${1===n.length?"is not an entity id":"are not entity ids"}. Entity ids have the form "<Type>-<number>", e.g. "${o}". Use ids as returned by the "id" field.`);return t.map(e=>x.test(e)?this._find$Entity(e,i):null)},selectedEntity:(e,{state:t})=>this._find$Entity(this._context.domainContextSelectors.getNavigationSystem().getActiveSelectionState(t),t),navigation:(e,{state:t})=>{let i=this._context.domainContextSelectors.getNavigationSystem();return{navigationState:i.getActiveNavigationState(t),viewState:i.getActiveViewState(t),toolState:i.getActiveToolState(t)}}};_resolveType=e=>E(e)?e.type:void 0;initialize=()=>{};_resolveMutation=(t,i,o,n)=>{if(void 0!==n.failedMutationField)throw new e(`Not run: the earlier field "${n.failedMutationField}" of this operation failed, so "${i}" was skipped and no change of the operation takes effect. Fix the failing field and send the operation again.`);try{return this._runMutation(t,o,n)}catch(e){throw n.failedMutationField=i,e}};_runMutation=(t,i,o)=>{let n=p(t,o.manifest);if(!n)throw new e(`The schema declares the mutation "${t}", but the configurator has no implementation for it. This is a fault in the configurator, not in your request. Tell the user this is not available.`);let r=o.state,a=n.implementation(i,r,{manifest:o.manifest,action:this._context.domainContextSelectors.getActionSystem().createContext(r),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});if(a.updates.length>0){let i=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(a.updates,r,"committed");if(!i.validity.valid)throw new e(`The changes of "${t}" were not applied, because the resulting configuration is invalid: ${(e=>{if("uncaught"===e.severity)return`validating it threw: ${T(b(e.error))}`;let t=[...new Set(e.entityViolations.filter(({violation:t})=>t.severity===e.severity).map(({entityId:e})=>e))];return`it has ${e.severity} violations on ${t.join(", ")}.`})(i.validity)} Change the request so the configuration stays valid.`);o.emissions.push(i),o.state=i.state}return a.readResult({previousState:r,state:o.state})};_setup=()=>{let{manifest:t,error:i}=this._context.getAssistantSetup();if(i)return{ready:!1,result:{errors:[new e(i.message,{originalError:i})]}};if(!t)return{ready:!1,result:S};let o=this._selectSchema(t.sdl);return o instanceof e?{ready:!1,result:{errors:[o]}}:{ready:!0,assistant:t,schema:o,lenses:t.lenses?.definitions?this._selectLenses(t.lenses.definitions):void 0,fieldResolver:this._selectFieldResolver(t.fields)}};_run=(t,i,n,a)=>{let l;try{l=r(t)}catch(t){return{errors:[t instanceof e?t:new e(b(t))]}}let c=s(n.schema,l,w);return c.length>0?{errors:c}:o({schema:n.schema,document:l,rootValue:this._rootValue,contextValue:a,variableValues:i.variables,operationName:i.operationName,fieldResolver:n.fieldResolver,typeResolver:this._resolveType})};prepare=async(t,i)=>{let o,n=this._setup();if(!n.ready)return i.map(()=>({result:n.result,emissions:[]}));let r={manifest:n.assistant,state:t,emissions:[],failedMutationField:void 0},a=[];for(let[t,s]of i.entries())if(void 0===o){let i=r.emissions.length;r.failedMutationField=void 0;let l=n.lenses?y(s.document,n.lenses):s.document,c=l instanceof e?{errors:[l]}:await this._run(l,s,n,r);a.push({result:c,emissions:r.emissions.slice(i)}),A(c)&&(o=t)}else a.push({result:M(o),emissions:[]});return a};readSideEffects=e=>{let t=this._context.domainServicesSelectors.getResolveLocalizable();return e.flatMap(({emissions:e})=>e.flatMap(e=>v(e.updates,t)))};_prepareAndCommit=async e=>{let t,i,o,n=this._context.domainContextSelectors.getStoreSystem(),r=await this.prepare(n.stateSlices.committed.value.state,e),a=r.map(({result:e})=>e),s=this.readSideEffects(r),l=r.flatMap(e=>e.emissions);return a.some(A)||0===l.length?{results:a,sideEffects:s,outcome:"none"}:{results:a,sideEffects:s,outcome:n.commitPrepared((t=c(l[0]),i=c(l[l.length-1]),o=l.some(e=>void 0!==e.transformationLog),{kind:"committed",previousState:t.previousState,state:i.state,updates:l.flatMap(e=>e.updates),validity:i.validity,transformationLog:o?l.flatMap(e=>e.transformationLog??[]):void 0}))}};execute=async e=>{if(!this._context.domainContextSelectors.getStoreSystem().isInitialized)return{results:e.map(()=>_),committed:!1,sideEffects:[]};let t=await this._prepareAndCommit(e),{results:i,sideEffects:o,outcome:n}="conflict"===t.outcome?await this._prepareAndCommit(e):t;return"committed"===n?{results:i,committed:!0,sideEffects:o}:"held"===n?{results:i,committed:!1,message:"The changes wait for the user's approval and are not applied yet. Do not send them again; the next `[changes]` block lists them once approved.",sideEffects:o}:"conflict"===n?{results:i,committed:!1,message:"The changes were not committed, because the configuration changed while they were being applied. The results describe a state that was discarded. Query the current configuration and send the operations again if they still make sense.",sideEffects:o}:{results:i,committed:!1,sideEffects:o}}}
@@ -0,0 +1,11 @@
1
+ import { type DocumentNode, GraphQLError } from 'graphql';
2
+ /**
3
+ * Makes the lenses an operation document spreads available to it: appends the definition of every
4
+ * lens the document spreads, with the copies that definition spreads in turn, taken from the
5
+ * manifest's lens `definitions`. Appending keeps the positions GraphQL reports for the caller's own
6
+ * text. A document that defines a fragment under the name of a lens, or of a copy of one, is
7
+ * rejected, since the caller would silently read its own selection instead of the lens. A document
8
+ * that does not parse is returned as it is, so GraphQL reports the syntax error; a spread that names
9
+ * no lens is left for GraphQL to report as an unknown fragment.
10
+ */
11
+ export declare const injectAssistantLenses: (document: string, definitions: DocumentNode) => string | GraphQLError;
@@ -0,0 +1 @@
1
+ import{GraphQLError as e,Kind as n,parse as t,print as a,visit as i}from"graphql";let r=e=>{let n=[];return i(e,{FragmentSpread:e=>{n.push(e.name.value)}}),n};export const injectAssistantLenses=(i,o)=>{let l,s=new Map;for(let e of o.definitions)e.kind===n.FRAGMENT_DEFINITION&&s.set(e.name.value,e);try{l=t(i)}catch{return i}for(let t of l.definitions)if(t.kind===n.FRAGMENT_DEFINITION&&s.has(t.name.value)){let n=t.name.value.split("__")[0];return new e(`A built-in fragment named "${n}" already exists, so "${t.name.value}" cannot be defined. Remove the definition and spread "...${n}", or give your fragment another name.`)}let m=new Map,u=[...r(l)];for(;u.length>0;){let e=u.pop(),n=void 0===e?void 0:s.get(e);n&&!m.has(n.name.value)&&(m.set(n.name.value,n),u.push(...r(n)))}return 0===m.size?i:[i,...[...m.values()].map(a)].join("\n\n")};
@@ -1,5 +1,5 @@
1
1
  export { AnimationSystem, type AnimationSystemContext } from './animation-system.js';
2
- export { type AssistantChatSnapshot, type AssistantClientTool, type AssistantPanelSnapshot, AssistantSystem, type AssistantSystemContext, } from './assistant-system/assistant-system.js';
2
+ export { type AssistantChatSnapshot, type AssistantEarlierThreadSnapshot, type AssistantClientTool, type AssistantPanelSnapshot, AssistantSystem, type AssistantSystemContext, } from './assistant-system/assistant-system.js';
3
3
  export { CameraControlSystem, CameraControlType } from './camera-control-system/camera-control-system.js';
4
4
  export { type AnyCameraSystem, CameraSystem, type CameraSystemContext } from './camera-control-system/camera-system.js';
5
5
  export { createCameraControls } from './camera-control-system/create-camera-controls.js';
@@ -1 +1 @@
1
- import{P as t,match as e}from"ts-pattern";import{SystemState as o,applicationConfigComponent as n,customSummaryPageComponent as a,entityHeaderComponent as i,navigationStepsComponent as r,propertyPageComponent as s,sidebarTabsComponent as l,simpleSummaryComponent as d,toolbarComponent as c}from"#package/domain";import{layoutStateComponent as g}from"./layout-state.js";import{toolbarHelpElementName as u}from"./toolbar-help-element.js";export class LayoutSystem{_context;_toolbarCache=new WeakMap;state;constructor(t){this._context=t,this.state=new o({...this._context,selectors:this._context.domainContextSelectors,componentType:g,getInitialState:()=>({propertyPageStates:{}})})}get _toolbarHelpExists(){return void 0!==this._context.specSelectors.getElementSlots().layoutElements[u]}get _hasAssistant(){return void 0!==this._context.specSelectors.getAssistant()}initialize=()=>{this.state.initialize()};getCleanUpPropertyPageStateUpdates=(t,e)=>this.state.getUpdates(e=>{if(!e.propertyPageStates[t])return null;let o={...e.propertyPageStates};return delete o[t],{...e,propertyPageStates:o}},e);getLayoutConfig=t=>{let e=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[n]},t),o=e?.state.shareDisabled??!1,a=o||(e?.state.shareOwnerLinkDisabled??!1),i=o||(e?.state.shareReadRevisionLinkDisabled??!1);return{layout:e?.state.layout??"universal",ignoreSelectionInSidebar:e?.state.ignoreSelectionInSidebar??!1,miniSidebar:e?.state.miniSidebar??!1,splitSidebar:e?.state.splitSidebar??!1,showSelectionBackButton:e?.state.showSelectionBackButton??!0,shareDisabled:a&&i,availableLocales:e?.state.availableLocales??["en"],indicatorSwitch:e?.state.indicatorSwitch??!0}};getSidebarSummaryPage=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getActiveNavigationState(t),o=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[a,d]},t),n=e===o?.state.summaryNavigationState,i=o?.state.summaryNavigationState;return{page:o,isSummaryActive:n,summaryNavigationState:i}};getEnterSidebarSummaryUpdates=t=>{let{summaryNavigationState:e}=this.getSidebarSummaryPage(t);return e?[this._context.domainContextSelectors.getNavigationSystem().getPushNavigationUpdate(e,t)]:[]};getLeaveSidebarSummaryUpdates=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getPopNavigationUpdate(t);if(e)return[e];let o=this._context.domainContextSelectors.getNavigationStates().at(0);return o?(this._context.domainServicesSelectors.getLogger().error("There is no navigation state to pop, falling back to the initial navigation state. Check whether the history stack is not broken by some custom navigation logic."),[this._context.domainContextSelectors.getNavigationSystem().getNavigationUpdate(o)]):(this._context.domainServicesSelectors.getLogger().error("There is no navigation state to pop and no initial navigation state to fallback to, this should not happen"),[])};getPushSidebarStackPageUpdates=(t,e,o,n)=>this.state.getUpdates(n=>{let a=n.propertyPageStates[t]??{customState:{},stackPages:[]};return{...n,propertyPageStates:{...n.propertyPageStates,[t]:{...a,stackPages:[...a.stackPages,{props:o,component:e}]}}}},n);getPopSidebarStackPageUpdates=(t,e)=>this.state.getUpdates(e=>{let o=e.propertyPageStates[t]??{customState:{},stackPages:[]};return{...e,propertyPageStates:{...e.propertyPageStates,[t]:{...o,stackPages:o.stackPages.slice(0,-1)}}}},e);getSidebarBackUpdates=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getHasStackToPop(t),o=this._context.domainContextSelectors.getNavigationSystem().getIsRootSelected(t),{renderedStackedPage:n,summaryPage:a,activePropertyPageId:i}=this.getSidebarContent(t);if(a)return this.getLeaveSidebarSummaryUpdates(t);if(n&&i)return this.getPopSidebarStackPageUpdates(i,t);if(e){let e=this._context.domainContextSelectors.getNavigationSystem().getPopNavigationUpdate(t);return e?[e]:[]}return o?[]:[this._context.domainContextSelectors.getNavigationSystem().getDeselectUpdate()]};getSidebarContent=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getActiveSelectionState(t),o=this.state.get(t),n=this.getLayoutConfig(t),a=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[l],entityIds:[e]},t).some(t=>t.state.tabs.length>0),r=n.miniSidebar&&!a;r&&a&&this._context.domainServicesSelectors.getLogger().warn("Mini sidebar is not active because the layout contains tabs. Only layouts without tabs can have mini sidebar.");let d=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[s]},t),{isSummaryActive:c,page:g}=this.getSidebarSummaryPage(t),u=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[i]},t),p=this._context.domainContextSelectors.getCompositionProjections().getTree(t).map.get(e);if(!p)throw Error(`Selected entity ${e} not found in composition tree`);let m=this._context.domainContextSelectors.getCompositionProjections().getTree(t).map.get(t.rootEntityId);if(!m)throw Error(`Root entity ${t.rootEntityId} not found in composition tree`);let h=(n.ignoreSelectionInSidebar?[m]:[p,...p.ancestors()]).map(t=>{let e=n.ignoreSelectionInSidebar?d:d.filter(e=>e.componentInstance.entityId===t.id),o=u.filter(e=>e.componentInstance.entityId===t.id);return{id:t.id,propertyPages:e,header:o[0]??null}}),S=h[0]?.id,b=(S?o.propertyPageStates[S]?.stackPages??[]:[]).at(-1)??null,k=this._context.domainContextSelectors.getNavigationSystem().getHasStackToPop(t),x=this._context.domainContextSelectors.getNavigationSystem().getIsRootSelected(t),y=c&&k||k||!!b||!x&&n.showSelectionBackButton&&!n.ignoreSelectionInSidebar;return c?{summaryPage:g,propertyPages:[],isBackAvailable:y,hasMiniSidebar:r,hasSplitSidebar:n.splitSidebar}:{summaryPage:null,propertyPages:h,renderedStackedPage:b,activePropertyPageId:S,isBackAvailable:y,hasMiniSidebar:r,hasSplitSidebar:n.splitSidebar}};getToolbarState=o=>{let n=this._toolbarHelpExists,a=this._hasAssistant,i=this._toolbarCache.get(o);if(i&&i.toolbarHelpExists===n&&i.hasAssistant===a)return i.result;let r=this._context.domainContextSelectors.getExpressionContext(),s=this._context.domainContextSelectors.getNavigationSystem().getActiveFullscreenState(o),l="read"===r.mode,d=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[c]},o),g=this._context.domainContextSelectors.getDimensionSystem().getDimensionConfig(o),u=this.getLayoutConfig(o),p="read"===this._context.domainContextSelectors.getExpressionContext().mode,m=u.availableLocales.length>1,h=!p&&!u.shareDisabled,S=u.indicatorSwitch,b=g.availableDimensions.length>1||S,k=a?[{kind:"toolbarButtonGroup",children:[{kind:"assistantToolbarButton"}]}]:[],x=e(d).returnType().with(t.nonNullable,t=>t.state).with(t.nullish,()=>e([s,l]).returnType().with([!1,!1],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},...m?[{kind:"toolbarButtonGroup",children:[{kind:"languageToolbarButton"}]}]:[],...h||b?[{kind:"toolbarButtonGroup",children:[...h?[{kind:"shareToolbarButton"}]:[],...b?[{kind:"measurementsToolbarButton"}]:[],...n?[{kind:"helpToolbarButton"}]:[]]}]:[],{kind:"toolbarButtonGroup",children:[{kind:"undoToolbarButton"},{kind:"redoToolbarButton"}]},...k],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"undoToolbarButton"},{kind:"redoToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},...k],mobileMenu:[...h?[{kind:"shareMenuAction"}]:[],...b?[{kind:"measurementsMenuAction"}]:[],...m?[{kind:"languageMenuAction"}]:[],...n?[{kind:"helpMenuAction"}]:[]]})).with([!0,!1],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobileMenu:[]})).with([!1,!0],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},...m?[{kind:"toolbarButtonGroup",children:[{kind:"languageToolbarButton"}]}]:[],...b?[{kind:"toolbarButtonGroup",children:[...b?[{kind:"measurementsToolbarButton"}]:[]]}]:[],...n?[{kind:"helpToolbarButton"}]:[],...k],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},...k],mobileMenu:[...b?[{kind:"measurementsMenuAction"}]:[],...m?[{kind:"languageMenuAction"}]:[],...n?[{kind:"helpMenuAction"}]:[]]})).with([!0,!0],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobileMenu:[]})).exhaustive()).exhaustive();return this._toolbarCache.set(o,{toolbarHelpExists:n,hasAssistant:a,result:x}),x};getNavigationSteps=t=>{let e=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[r]},t);return e?.state.steps??[]}}
1
+ import{P as t,match as e}from"ts-pattern";import{SystemState as o,applicationConfigComponent as n,customSummaryPageComponent as a,entityHeaderComponent as i,navigationStepsComponent as r,propertyPageComponent as s,sidebarTabsComponent as l,simpleSummaryComponent as d,toolbarComponent as c}from"#package/domain";import{layoutStateComponent as g}from"./layout-state.js";import{toolbarHelpElementName as u}from"./toolbar-help-element.js";export class LayoutSystem{_context;_toolbarCache=new WeakMap;state;constructor(t){this._context=t,this.state=new o({...this._context,selectors:this._context.domainContextSelectors,componentType:g,getInitialState:()=>({propertyPageStates:{}})})}get _toolbarHelpExists(){return void 0!==this._context.specSelectors.getElementSlots().layoutElements[u]}get _hasAssistant(){return null!=this._context.specSelectors.getAssistant()}initialize=()=>{this.state.initialize()};getCleanUpPropertyPageStateUpdates=(t,e)=>this.state.getUpdates(e=>{if(!e.propertyPageStates[t])return null;let o={...e.propertyPageStates};return delete o[t],{...e,propertyPageStates:o}},e);getLayoutConfig=t=>{let e=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[n]},t),o=e?.state.shareDisabled??!1,a=o||(e?.state.shareOwnerLinkDisabled??!1),i=o||(e?.state.shareReadRevisionLinkDisabled??!1);return{layout:e?.state.layout??"universal",ignoreSelectionInSidebar:e?.state.ignoreSelectionInSidebar??!1,miniSidebar:e?.state.miniSidebar??!1,splitSidebar:e?.state.splitSidebar??!1,showSelectionBackButton:e?.state.showSelectionBackButton??!0,shareDisabled:a&&i,availableLocales:e?.state.availableLocales??["en"],indicatorSwitch:e?.state.indicatorSwitch??!0}};getSidebarSummaryPage=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getActiveNavigationState(t),o=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[a,d]},t),n=e===o?.state.summaryNavigationState,i=o?.state.summaryNavigationState;return{page:o,isSummaryActive:n,summaryNavigationState:i}};getEnterSidebarSummaryUpdates=t=>{let{summaryNavigationState:e}=this.getSidebarSummaryPage(t);return e?[this._context.domainContextSelectors.getNavigationSystem().getPushNavigationUpdate(e,t)]:[]};getLeaveSidebarSummaryUpdates=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getPopNavigationUpdate(t);if(e)return[e];let o=this._context.domainContextSelectors.getNavigationStates().at(0);return o?(this._context.domainServicesSelectors.getLogger().error("There is no navigation state to pop, falling back to the initial navigation state. Check whether the history stack is not broken by some custom navigation logic."),[this._context.domainContextSelectors.getNavigationSystem().getNavigationUpdate(o)]):(this._context.domainServicesSelectors.getLogger().error("There is no navigation state to pop and no initial navigation state to fallback to, this should not happen"),[])};getPushSidebarStackPageUpdates=(t,e,o,n)=>this.state.getUpdates(n=>{let a=n.propertyPageStates[t]??{customState:{},stackPages:[]};return{...n,propertyPageStates:{...n.propertyPageStates,[t]:{...a,stackPages:[...a.stackPages,{props:o,component:e}]}}}},n);getPopSidebarStackPageUpdates=(t,e)=>this.state.getUpdates(e=>{let o=e.propertyPageStates[t]??{customState:{},stackPages:[]};return{...e,propertyPageStates:{...e.propertyPageStates,[t]:{...o,stackPages:o.stackPages.slice(0,-1)}}}},e);getSidebarBackUpdates=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getHasStackToPop(t),o=this._context.domainContextSelectors.getNavigationSystem().getIsRootSelected(t),{renderedStackedPage:n,summaryPage:a,activePropertyPageId:i}=this.getSidebarContent(t);if(a)return this.getLeaveSidebarSummaryUpdates(t);if(n&&i)return this.getPopSidebarStackPageUpdates(i,t);if(e){let e=this._context.domainContextSelectors.getNavigationSystem().getPopNavigationUpdate(t);return e?[e]:[]}return o?[]:[this._context.domainContextSelectors.getNavigationSystem().getDeselectUpdate()]};getSidebarContent=t=>{let e=this._context.domainContextSelectors.getNavigationSystem().getActiveSelectionState(t),o=this.state.get(t),n=this.getLayoutConfig(t),a=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[l],entityIds:[e]},t).some(t=>t.state.tabs.length>0),r=n.miniSidebar&&!a;r&&a&&this._context.domainServicesSelectors.getLogger().warn("Mini sidebar is not active because the layout contains tabs. Only layouts without tabs can have mini sidebar.");let d=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[s]},t),{isSummaryActive:c,page:g}=this.getSidebarSummaryPage(t),u=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[i]},t),p=this._context.domainContextSelectors.getCompositionProjections().getTree(t).map.get(e);if(!p)throw Error(`Selected entity ${e} not found in composition tree`);let m=this._context.domainContextSelectors.getCompositionProjections().getTree(t).map.get(t.rootEntityId);if(!m)throw Error(`Root entity ${t.rootEntityId} not found in composition tree`);let h=(n.ignoreSelectionInSidebar?[m]:[p,...p.ancestors()]).map(t=>{let e=n.ignoreSelectionInSidebar?d:d.filter(e=>e.componentInstance.entityId===t.id),o=u.filter(e=>e.componentInstance.entityId===t.id);return{id:t.id,propertyPages:e,header:o[0]??null}}),S=h[0]?.id,b=(S?o.propertyPageStates[S]?.stackPages??[]:[]).at(-1)??null,k=this._context.domainContextSelectors.getNavigationSystem().getHasStackToPop(t),x=this._context.domainContextSelectors.getNavigationSystem().getIsRootSelected(t),y=c&&k||k||!!b||!x&&n.showSelectionBackButton&&!n.ignoreSelectionInSidebar;return c?{summaryPage:g,propertyPages:[],isBackAvailable:y,hasMiniSidebar:r,hasSplitSidebar:n.splitSidebar}:{summaryPage:null,propertyPages:h,renderedStackedPage:b,activePropertyPageId:S,isBackAvailable:y,hasMiniSidebar:r,hasSplitSidebar:n.splitSidebar}};getToolbarState=o=>{let n=this._toolbarHelpExists,a=this._hasAssistant,i=this._toolbarCache.get(o);if(i&&i.toolbarHelpExists===n&&i.hasAssistant===a)return i.result;let r=this._context.domainContextSelectors.getExpressionContext(),s=this._context.domainContextSelectors.getNavigationSystem().getActiveFullscreenState(o),l="read"===r.mode,d=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[c]},o),g=this._context.domainContextSelectors.getDimensionSystem().getDimensionConfig(o),u=this.getLayoutConfig(o),p="read"===this._context.domainContextSelectors.getExpressionContext().mode,m=u.availableLocales.length>1,h=!p&&!u.shareDisabled,S=u.indicatorSwitch,b=g.availableDimensions.length>1||S,k=a?[{kind:"toolbarButtonGroup",children:[{kind:"assistantToolbarButton"}]}]:[],x=e(d).returnType().with(t.nonNullable,t=>t.state).with(t.nullish,()=>e([s,l]).returnType().with([!1,!1],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},...m?[{kind:"toolbarButtonGroup",children:[{kind:"languageToolbarButton"}]}]:[],...h||b?[{kind:"toolbarButtonGroup",children:[...h?[{kind:"shareToolbarButton"}]:[],...b?[{kind:"measurementsToolbarButton"}]:[],...n?[{kind:"helpToolbarButton"}]:[]]}]:[],{kind:"toolbarButtonGroup",children:[{kind:"undoToolbarButton"},{kind:"redoToolbarButton"}]},...k],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"undoToolbarButton"},{kind:"redoToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},...k],mobileMenu:[...h?[{kind:"shareMenuAction"}]:[],...b?[{kind:"measurementsMenuAction"}]:[],...m?[{kind:"languageMenuAction"}]:[],...n?[{kind:"helpMenuAction"}]:[]]})).with([!0,!1],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobileMenu:[]})).with([!1,!0],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},...m?[{kind:"toolbarButtonGroup",children:[{kind:"languageToolbarButton"}]}]:[],...b?[{kind:"toolbarButtonGroup",children:[...b?[{kind:"measurementsToolbarButton"}]:[]]}]:[],...n?[{kind:"helpToolbarButton"}]:[],...k],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},...k],mobileMenu:[...b?[{kind:"measurementsMenuAction"}]:[],...m?[{kind:"languageMenuAction"}]:[],...n?[{kind:"helpMenuAction"}]:[]]})).with([!0,!0],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"exitFullscreenToolbarButton"}]}],mobileMenu:[]})).exhaustive()).exhaustive();return this._toolbarCache.set(o,{toolbarHelpExists:n,hasAssistant:a,result:x}),x};getNavigationSteps=t=>{let e=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[r]},t);return e?.state.steps??[]}}