@salsita-ai/sdk 0.50.0-develop.ea458ea381 → 0.50.0-develop.f03b563886

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 (933) hide show
  1. package/README.md +20 -12
  2. package/dist/admin/create-admin-pages-from-spec.d.ts +1 -1
  3. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  4. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  5. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  6. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  7. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  8. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  9. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  10. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  11. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  12. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  13. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  14. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  15. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  16. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  17. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.d.ts +2 -2
  18. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.js +1 -1
  19. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +36 -36
  20. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.d.ts +1 -1
  21. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.js +1 -1
  22. package/dist/application-spec/generate-application/code/templates/domain-spec.js +4 -4
  23. package/dist/application-spec/generate-application/code/templates/domain.js +3 -3
  24. package/dist/application-spec/generate-application/code/templates/env-example.js +4 -0
  25. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -0
  26. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  27. package/dist/application-spec/generate-application/code/templates/skills/agents-md.js +1 -1
  28. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  29. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +95 -41
  30. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +39 -16
  31. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +2 -2
  32. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  33. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.d.ts +1 -0
  34. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +6 -0
  35. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +30 -3
  36. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +19 -5
  37. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +9 -4
  38. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -2
  39. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +4 -3
  40. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.js +1 -1
  41. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  42. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.d.ts +3 -8
  43. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.js +1 -1
  44. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.d.ts +9 -43
  45. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  46. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +2 -2
  47. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant.d.ts +5 -21
  48. package/dist/client/authorized-client.d.ts +3 -1
  49. package/dist/client/authorized-client.js +1 -1
  50. package/dist/client/contract.d.ts +34 -0
  51. package/dist/client/contract.js +1 -1
  52. package/dist/client/index.d.ts +2 -2
  53. package/dist/client/index.js +1 -1
  54. package/dist/client/local-authorized-client.d.ts +3 -1
  55. package/dist/client/local-authorized-client.js +1 -1
  56. package/dist/client/memory-authorized-client.d.ts +3 -1
  57. package/dist/client/memory-authorized-client.js +1 -1
  58. package/dist/client/phoenix-api.d.ts +271 -30
  59. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  60. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +245 -13
  61. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  62. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.d.ts +85 -0
  63. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.js +1 -0
  64. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +8 -3
  65. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  66. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +4 -0
  67. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  68. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +16 -1
  69. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  70. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.d.ts +9 -0
  71. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.js +1 -0
  72. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  73. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -0
  74. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  75. package/dist/configurator/common/frontend-analytics.d.ts +21 -21
  76. package/dist/configurator/index.d.ts +0 -1
  77. package/dist/configurator/index.js +1 -1
  78. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  79. package/dist/configurator/scene/scene-analytics/scene-analytics.d.ts +2 -2
  80. package/dist/configurator/ui/assistant/AssistantChips.d.ts +11 -0
  81. package/dist/configurator/ui/assistant/AssistantChips.js +1 -0
  82. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +7 -0
  83. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -0
  84. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -0
  85. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -0
  86. package/dist/configurator/ui/assistant/AssistantPanel.d.ts +11 -0
  87. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -0
  88. package/dist/configurator/ui/assistant/AssistantThread.d.ts +10 -0
  89. package/dist/configurator/ui/assistant/AssistantThread.js +1 -0
  90. package/dist/configurator/ui/assistant/assistant-failure.d.ts +18 -0
  91. package/dist/configurator/ui/assistant/assistant-failure.js +1 -0
  92. package/dist/configurator/ui/assistant/index.d.ts +2 -0
  93. package/dist/configurator/ui/assistant/index.js +1 -0
  94. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +6 -0
  95. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -0
  96. package/dist/configurator/ui/assistant/theme.d.ts +2 -0
  97. package/dist/configurator/ui/assistant/theme.js +1 -0
  98. package/dist/configurator/ui/assistant/thread-items.d.ts +48 -0
  99. package/dist/configurator/ui/assistant/thread-items.js +1 -0
  100. package/dist/configurator/ui/assistant/tool-chip.d.ts +44 -0
  101. package/dist/configurator/ui/assistant/tool-chip.js +1 -0
  102. package/dist/configurator/ui/assistant/use-follow-stream.d.ts +17 -0
  103. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -0
  104. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.d.ts +5 -0
  105. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.js +1 -0
  106. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -5
  107. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.d.ts +2 -0
  108. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  109. package/dist/configurator/ui/legacy/mobile-controls/MobileControls.d.ts +1 -1
  110. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.d.ts +10 -0
  111. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -0
  112. package/dist/configurator/ui/phoenix-layout-elements/index.d.ts +1 -0
  113. package/dist/configurator/ui/phoenix-layout-elements/index.js +1 -1
  114. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +84 -98
  115. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  116. package/dist/docs/index.json +1 -1
  117. package/dist/docs/layouts/custom-price.mdx +14 -16
  118. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  119. package/dist/docs/layouts/toolbar.mdx +6 -0
  120. package/dist/docs/other-features/domain-actions.mdx +1 -1
  121. package/dist/docs/other-features/side-effects.mdx +68 -34
  122. package/dist/docs/other-features/transformers.mdx +1 -1
  123. package/dist/docs/phoenix/admin.mdx +11 -26
  124. package/dist/docs/phoenix/deployments.mdx +1 -1
  125. package/dist/docs/phoenix/expression-context.mdx +11 -3
  126. package/dist/docs/phoenix/finalization.mdx +1 -1
  127. package/dist/docs/phoenix/integration/headless-mode-external.mdx +5 -5
  128. package/dist/docs/phoenix/integration/widget-mode-external.mdx +5 -5
  129. package/dist/docs/phoenix/localization.mdx +3 -22
  130. package/dist/docs/phoenix/phoenix-cli.mdx +159 -39
  131. package/dist/docs/phoenix/project-structure.mdx +10 -3
  132. package/dist/docs/phoenix/sdk-builder-workflow.mdx +13 -11
  133. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  134. package/dist/docs/relations/hierarchy.mdx +13 -2
  135. package/dist/docs/ux-guidelines/choosing-a-control.mdx +11 -0
  136. package/dist/domain/admin-domain/__generated/enhanced-model.d.ts +1 -2
  137. package/dist/domain/admin-domain/__generated/model/versions/v1.d.ts +1 -1
  138. package/dist/domain/admin-domain/__generated/model/versions/v2.d.ts +1 -1
  139. package/dist/domain/admin-domain/__generated/model/versions/v3.d.ts +1 -1
  140. package/dist/domain/admin-domain/__generated/model/versions/v4.d.ts +1 -1
  141. package/dist/domain/admin-domain/__generated/model/versions/v5.d.ts +1 -1
  142. package/dist/domain/admin-domain/__generated/model/versions/v6.d.ts +2 -2
  143. package/dist/domain/admin-domain/__generated/model/versions/v6.js +1 -1
  144. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +10 -13
  145. package/dist/domain/admin-domain/implementation/common-admin-migrations.d.ts +1 -1
  146. package/dist/domain/admin-domain/index.d.ts +9 -5
  147. package/dist/domain/admin-domain/index.js +1 -1
  148. package/dist/domain/application/admin-page-factories.d.ts +1 -2
  149. package/dist/domain/application/application-config.d.ts +24 -94
  150. package/dist/domain/application/assistant/assistant-manifest.d.ts +63 -0
  151. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +95 -0
  152. package/dist/domain/application/assistant/assistant-value-type.d.ts +9 -0
  153. package/dist/domain/application/assistant/assistant-value-type.js +1 -0
  154. package/dist/domain/application/assistant/build-assistant-manifest.d.ts +4 -0
  155. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -0
  156. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +3 -0
  157. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  158. package/dist/domain/application/assistant/index.d.ts +4 -0
  159. package/dist/domain/application/assistant/index.js +1 -0
  160. package/dist/domain/application/assistant-field-options.d.ts +2 -3
  161. package/dist/domain/application/assistant-mutations.d.ts +3 -5
  162. package/dist/domain/application/assistant-mutations.js +1 -1
  163. package/dist/domain/application/assistant-recipe-groups.d.ts +2 -6
  164. package/dist/domain/application/configurator-builder.d.ts +33 -18
  165. package/dist/domain/application/configurator-builder.js +1 -1
  166. package/dist/domain/application/element-registration.d.ts +5 -0
  167. package/dist/domain/application/element-registration.js +1 -1
  168. package/dist/domain/application/handler-registration.d.ts +5 -0
  169. package/dist/domain/application/handler-registration.js +1 -1
  170. package/dist/domain/application/index.d.ts +6 -5
  171. package/dist/domain/application/index.js +1 -1
  172. package/dist/domain/application/published-data/build-legend-data.d.ts +1 -1
  173. package/dist/domain/application/published-data/create-finalize-admin-domain.d.ts +1 -2
  174. package/dist/domain/application/published-data/format-field-type.d.ts +1 -1
  175. package/dist/domain/application/published-data/map-data-to-sheet.d.ts +1 -1
  176. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +2 -2
  177. package/dist/domain/application/published-data/map-published-data.d.ts +1 -2
  178. package/dist/domain/application/published-data/validate-sheet-data.d.ts +1 -1
  179. package/dist/domain/application/resolve-imported-transformers.d.ts +12 -2
  180. package/dist/domain/application/resolve-imported-transformers.js +1 -1
  181. package/dist/domain/available-system-components.js +1 -1
  182. package/dist/domain/core/action/action-factory.d.ts +11 -0
  183. package/dist/domain/core/{action.d.ts → action/action.d.ts} +22 -18
  184. package/dist/domain/core/action/index.d.ts +2 -0
  185. package/dist/domain/core/action/index.js +1 -0
  186. package/dist/domain/{components → core/component}/component-reader-types.d.ts +1 -2
  187. package/dist/domain/{components → core/component}/debug-state-component.d.ts +1 -1
  188. package/dist/domain/core/component/debug-state-component.js +1 -0
  189. package/dist/domain/{components → core/component}/domain-component-optic.d.ts +36 -39
  190. package/dist/domain/{components → core/component}/domain-component-optic.js +2 -2
  191. package/dist/domain/{components → core/component}/drag-state-component.d.ts +1 -1
  192. package/dist/domain/core/component/drag-state-component.js +1 -0
  193. package/dist/domain/{components → core/component}/export-state-component.d.ts +1 -1
  194. package/dist/domain/core/component/export-state-component.js +1 -0
  195. package/dist/domain/{components → core/component}/fullscreen-state-component.d.ts +1 -1
  196. package/dist/domain/core/component/fullscreen-state-component.js +1 -0
  197. package/dist/domain/{components → core/component}/group-components-by-entity-id-and-name.d.ts +1 -2
  198. package/dist/domain/core/component/group-components-by-entity-id-and-name.js +1 -0
  199. package/dist/domain/{components → core/component}/hover-state-component.d.ts +1 -1
  200. package/dist/domain/core/component/hover-state-component.js +1 -0
  201. package/dist/domain/core/component/index.d.ts +18 -0
  202. package/dist/domain/core/component/index.js +1 -0
  203. package/dist/domain/{components → core/component}/legacy-filter.d.ts +2 -2
  204. package/dist/domain/{components → core/component}/navigation-state-component.d.ts +1 -1
  205. package/dist/domain/core/component/navigation-state-component.js +1 -0
  206. package/dist/domain/{components → core/component}/selection-state-component.d.ts +1 -1
  207. package/dist/domain/core/component/selection-state-component.js +1 -0
  208. package/dist/domain/{components → core/component}/system-component-builder.d.ts +1 -2
  209. package/dist/domain/core/component/system-component-builder.js +1 -0
  210. package/dist/domain/{components → core/component}/system-component-filter.d.ts +19 -19
  211. package/dist/domain/core/component/system-virtual-entity.js +1 -0
  212. package/dist/domain/{components → core/component}/tool-state-component.d.ts +1 -1
  213. package/dist/domain/core/component/tool-state-component.js +1 -0
  214. package/dist/domain/{components → core/component}/updates.d.ts +17 -2
  215. package/dist/domain/{components → core/component}/view-state-component.d.ts +1 -1
  216. package/dist/domain/core/component/view-state-component.js +1 -0
  217. package/dist/domain/{components → core/component}/viewport-state-component.d.ts +1 -1
  218. package/dist/domain/core/component/viewport-state-component.js +1 -0
  219. package/dist/domain/core/data-schema/data-cell-value.d.ts +4 -0
  220. package/dist/domain/core/data-schema/data-schema-array-field.d.ts +5 -0
  221. package/dist/domain/core/data-schema/data-schema-field-object.d.ts +4 -0
  222. package/dist/domain/core/data-schema/data-schema-field.d.ts +2 -0
  223. package/dist/domain/core/data-schema/data-schema-field.js +1 -0
  224. package/dist/domain/core/data-schema/data-schema-localized-field.d.ts +4 -0
  225. package/dist/domain/core/data-schema/data-schema-localized-field.js +1 -0
  226. package/dist/domain/core/data-schema/data-schema-primitive-field.d.ts +5 -0
  227. package/dist/domain/core/data-schema/data-schema-primitive-field.js +1 -0
  228. package/dist/domain/core/data-schema/data-schema.d.ts +2 -0
  229. package/dist/domain/core/data-schema/data-schema.js +1 -0
  230. package/dist/domain/core/data-schema/index.d.ts +7 -0
  231. package/dist/domain/core/data-schema/index.js +1 -0
  232. package/dist/domain/core/decoder/create-decoder.d.ts +6 -0
  233. package/dist/domain/core/decoder/create-decoder.js +1 -0
  234. package/dist/domain/core/decoder/decoder.d.ts +6 -0
  235. package/dist/domain/core/decoder/decoder.js +1 -0
  236. package/dist/domain/core/decoder/index.d.ts +2 -0
  237. package/dist/domain/core/decoder/index.js +1 -0
  238. package/dist/domain/core/domain-factory.d.ts +4 -5
  239. package/dist/domain/core/domain-factory.js +1 -1
  240. package/dist/domain/core/domain.d.ts +4 -5
  241. package/dist/domain/core/domain.js +1 -1
  242. package/dist/domain/core/emission/index.d.ts +8 -0
  243. package/dist/domain/core/emission/index.js +1 -0
  244. package/dist/domain/core/emission/reset-state-emission.d.ts +12 -0
  245. package/dist/domain/core/emission/reset-state-emission.js +1 -0
  246. package/dist/domain/core/emission/state-emission.d.ts +4 -0
  247. package/dist/domain/core/emission/state-emission.js +1 -0
  248. package/dist/domain/core/emission/state-update-emission.d.ts +14 -0
  249. package/dist/domain/core/emission/state-update-emission.js +1 -0
  250. package/dist/domain/core/emission/state-validation-result.d.ts +18 -0
  251. package/dist/domain/core/emission/state-validation-result.js +1 -0
  252. package/dist/domain/core/emission/transformation-log.d.ts +2 -0
  253. package/dist/domain/core/emission/transformation-log.js +1 -0
  254. package/dist/domain/core/emission/transformer-log-entry.d.ts +6 -0
  255. package/dist/domain/core/emission/transformer-log-entry.js +1 -0
  256. package/dist/domain/core/emission/transformer-log.d.ts +11 -0
  257. package/dist/domain/core/emission/transformer-log.js +1 -0
  258. package/dist/domain/core/emission/transformer-phase.d.ts +1 -0
  259. package/dist/domain/core/emission/transformer-phase.js +1 -0
  260. package/dist/domain/core/expression/aliased-expressions.d.ts +10 -0
  261. package/dist/domain/core/expression/aliased-expressions.js +1 -0
  262. package/dist/domain/{expressions → core/expression}/constant-expressions.d.ts +2 -3
  263. package/dist/domain/core/expression/constant-expressions.js +1 -0
  264. package/dist/domain/{expressions → core/expression}/custom-expression.d.ts +9 -10
  265. package/dist/domain/core/expression/custom-expression.js +1 -0
  266. package/dist/domain/core/{expression.d.ts → expression/expression.d.ts} +17 -20
  267. package/dist/domain/core/expression/expression.js +1 -0
  268. package/dist/domain/core/expression/index.d.ts +4 -0
  269. package/dist/domain/core/expression/index.js +1 -0
  270. package/dist/domain/core/index.d.ts +13 -17
  271. package/dist/domain/core/index.js +1 -1
  272. package/dist/domain/{invariants → core/invariant}/builtin-invariant.d.ts +2 -2
  273. package/dist/domain/{invariants → core/invariant}/custom-invariants.d.ts +7 -8
  274. package/dist/domain/core/invariant/custom-invariants.js +1 -0
  275. package/dist/domain/core/invariant/index.d.ts +5 -0
  276. package/dist/domain/core/invariant/index.js +1 -0
  277. package/dist/domain/core/invariant/invariants.d.ts +13 -0
  278. package/dist/domain/core/invariant/invariants.js +1 -0
  279. package/dist/domain/core/invariant/violation-component.js +1 -0
  280. package/dist/domain/{invariants → core/invariant}/violation.d.ts +2 -2
  281. package/dist/domain/core/{component.d.ts → model/component.d.ts} +1 -1
  282. package/dist/domain/core/model/index.d.ts +6 -0
  283. package/dist/domain/core/model/index.js +1 -0
  284. package/dist/domain/core/{reflection.d.ts → model/reflection.d.ts} +1 -1
  285. package/dist/domain/core/model/reflection.js +1 -0
  286. package/dist/domain/core/recipe/index.d.ts +1 -0
  287. package/dist/domain/core/recipe/index.js +1 -0
  288. package/dist/domain/{domain-context/recipe-system → core/recipe}/recipes.d.ts +1 -3
  289. package/dist/domain/core/recipe/recipes.js +1 -0
  290. package/dist/domain/{relations → core/relation}/all-of-type-relation.d.ts +3 -4
  291. package/dist/domain/core/relation/all-of-type-relation.js +1 -0
  292. package/dist/domain/{relations → core/relation}/component-factories.d.ts +1 -2
  293. package/dist/domain/core/relation/component-factories.js +1 -0
  294. package/dist/domain/{relations → core/relation}/composed-of.d.ts +1 -1
  295. package/dist/domain/core/relation/composed-of.js +1 -0
  296. package/dist/domain/{relations → core/relation}/direct-relation.d.ts +2 -3
  297. package/dist/domain/core/relation/index.d.ts +9 -0
  298. package/dist/domain/core/relation/index.js +1 -0
  299. package/dist/domain/{relations → core/relation}/indirect-relation.d.ts +3 -4
  300. package/dist/domain/core/relation/indirect-relation.js +1 -0
  301. package/dist/domain/{relations → core/relation}/reference-component.d.ts +4 -5
  302. package/dist/domain/core/relation/reference-component.js +1 -0
  303. package/dist/domain/{relations → core/relation}/reference-field.d.ts +1 -1
  304. package/dist/domain/core/relation/reference-field.js +1 -0
  305. package/dist/domain/{relations → core/relation}/relation-factory.d.ts +2 -3
  306. package/dist/domain/{relations → core/relation}/relation-implementation.d.ts +3 -4
  307. package/dist/domain/core/relation/relation-implementation.js +1 -0
  308. package/dist/domain/core/schema/enhanced-json-schema.js +1 -0
  309. package/dist/domain/core/schema/extended-schema-validator.js +1 -0
  310. package/dist/domain/core/schema/index.d.ts +3 -0
  311. package/dist/domain/core/schema/index.js +1 -0
  312. package/dist/domain/core/schema/schema-validator.js +1 -0
  313. package/dist/domain/core/state/id-sequence.d.ts +15 -0
  314. package/dist/domain/core/state/id-sequence.js +1 -0
  315. package/dist/domain/core/state/index.d.ts +3 -0
  316. package/dist/domain/core/state/index.js +1 -0
  317. package/dist/domain/core/{migrations.d.ts → state/migrations.d.ts} +1 -2
  318. package/dist/domain/core/{state.d.ts → state/state.d.ts} +1 -2
  319. package/dist/domain/domain-builder.d.ts +11 -11
  320. package/dist/domain/domain-builder.js +1 -1
  321. package/dist/domain/domain-context/action-system/action-system.d.ts +2 -4
  322. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  323. package/dist/domain/domain-context/create-transformer.d.ts +1 -1
  324. package/dist/domain/domain-context/dimension-system/dimension-state.js +1 -1
  325. package/dist/domain/domain-context/dimension-system/dimension-system.d.ts +1 -2
  326. package/dist/domain/domain-context/domain-context-systems.d.ts +1 -3
  327. package/dist/domain/domain-context/index.d.ts +3 -4
  328. package/dist/domain/domain-context/index.js +1 -1
  329. package/dist/domain/domain-context/navigation-system/navigation-system.d.ts +3 -5
  330. package/dist/domain/domain-context/navigation-system/navigation-system.js +1 -1
  331. package/dist/domain/domain-context/navigation-system/navigation-updates.d.ts +1 -12
  332. package/dist/domain/domain-context/navigation-system/navigation-updates.js +1 -1
  333. package/dist/domain/domain-context/navigation-system/selection-transformers.d.ts +1 -1
  334. package/dist/domain/domain-context/navigation-system/selection-transformers.js +1 -1
  335. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.d.ts +1 -3
  336. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.js +1 -1
  337. package/dist/domain/domain-context/relation-transformers/cascade-deletes.d.ts +1 -1
  338. package/dist/domain/domain-context/relation-transformers/cascade-deletes.js +1 -1
  339. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.d.ts +1 -1
  340. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.js +1 -1
  341. package/dist/domain/domain-context/relation-transformers/create-entity-refs.d.ts +1 -1
  342. package/dist/domain/domain-context/relation-transformers/create-entity-refs.js +2 -2
  343. package/dist/domain/domain-context/relation-transformers/replace-refs.d.ts +1 -1
  344. package/dist/domain/domain-context/relation-transformers/replace-refs.js +1 -1
  345. package/dist/domain/domain-context/store-system/apply-updates.d.ts +1 -3
  346. package/dist/domain/domain-context/store-system/apply-updates.js +1 -1
  347. package/dist/domain/domain-context/store-system/next-domain-entity-id.d.ts +1 -13
  348. package/dist/domain/domain-context/store-system/next-domain-entity-id.js +1 -1
  349. package/dist/domain/domain-context/store-system/reconcile-projected-entities.d.ts +1 -2
  350. package/dist/domain/domain-context/store-system/reconcile-projected-entities.js +1 -1
  351. package/dist/domain/domain-context/store-system/store-system.d.ts +1 -36
  352. package/dist/domain/domain-context/store-system/store-system.js +2 -2
  353. package/dist/domain/domain-context/store-system/system-state.d.ts +1 -3
  354. package/dist/domain/domain-context/store-system/system-state.js +1 -1
  355. package/dist/domain/domain-context/transformers/actions-builder.d.ts +1 -2
  356. package/dist/domain/domain-context/transformers/actions-builder.js +1 -1
  357. package/dist/domain/domain-context/transformers/auto-snap-transformer.d.ts +1 -3
  358. package/dist/domain/domain-context/transformers/chain-builder.d.ts +2 -2
  359. package/dist/domain/domain-context/transformers/context.d.ts +1 -6
  360. package/dist/domain/domain-context/transformers/entity-builder.d.ts +1 -5
  361. package/dist/domain/domain-context/transformers/entity-builder.js +1 -1
  362. package/dist/domain/domain-context/transformers/then-builder.d.ts +1 -2
  363. package/dist/domain/domain-context/transformers/then-builder.js +1 -1
  364. package/dist/domain/domain-context/transformers/when-builder.d.ts +1 -6
  365. package/dist/domain/domain-context/transformers/when-builder.js +1 -1
  366. package/dist/domain/domain-context/undo-system.d.ts +1 -2
  367. package/dist/domain/domain-runtime/domain-context/action-context.d.ts +11 -0
  368. package/dist/domain/domain-runtime/domain-context/action-context.js +1 -0
  369. package/dist/domain/domain-runtime/domain-context/component-reader.d.ts +1 -4
  370. package/dist/domain/domain-runtime/domain-context/component-reader.js +1 -1
  371. package/dist/domain/domain-runtime/domain-context/expression-context.d.ts +8 -0
  372. package/dist/domain/domain-runtime/domain-context/expression-context.js +1 -0
  373. package/dist/domain/domain-runtime/domain-context/index.d.ts +3 -0
  374. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.d.ts +18 -0
  375. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.js +1 -0
  376. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +3 -4
  377. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  378. package/dist/domain/domain-runtime/domain-runtime.d.ts +12 -12
  379. package/dist/domain/domain-runtime/spec/index.d.ts +8 -0
  380. package/dist/domain/domain-runtime/spec/index.js +1 -1
  381. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  382. package/dist/domain/{invariants/invariants.d.ts → domain-runtime/spec/invariant-builder.d.ts} +7 -14
  383. package/dist/domain/domain-runtime/spec/invariant-builder.js +1 -0
  384. package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.d.ts +1 -2
  385. package/dist/domain/{actions → domain-runtime/spec}/prepare-action-implementations.d.ts +1 -1
  386. package/dist/domain/domain-runtime/spec/prepare-action-implementations.js +5 -0
  387. package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.d.ts +1 -1
  388. package/dist/domain/domain-runtime/spec/resolve-action-modules.d.ts +4 -0
  389. package/dist/domain/domain-runtime/spec/resolve-action-modules.js +1 -0
  390. package/dist/domain/domain-runtime/spec/resolve-component-optic-modules.d.ts +4 -0
  391. package/dist/domain/domain-runtime/spec/resolve-component-optic-modules.js +1 -0
  392. package/dist/domain/domain-runtime/spec/resolve-expression-modules.d.ts +15 -0
  393. package/dist/domain/domain-runtime/spec/resolve-expression-modules.js +1 -0
  394. package/dist/domain/domain-runtime/spec/resolve-invariant-modules.d.ts +6 -0
  395. package/dist/domain/domain-runtime/spec/resolve-invariant-modules.js +1 -0
  396. package/dist/domain/domain-runtime/spec/selectors.d.ts +2 -2
  397. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  398. package/dist/domain/domain-runtime/spec/types.d.ts +4 -5
  399. package/dist/domain/{system-components → extensions}/angle-indicator.d.ts +1 -1
  400. package/dist/domain/extensions/angle-indicator.js +1 -0
  401. package/dist/domain/extensions/attribute-switch.js +1 -0
  402. package/dist/domain/{system-components → extensions}/autorotate-camera-component.d.ts +1 -1
  403. package/dist/domain/extensions/autorotate-camera-component.js +1 -0
  404. package/dist/domain/{system-components → extensions}/basic-sidebar-footer.d.ts +1 -1
  405. package/dist/domain/extensions/basic-sidebar-footer.js +1 -0
  406. package/dist/domain/extensions/camera-based-hidden-entity-object.js +1 -0
  407. package/dist/domain/extensions/camera-based-hidden-entity.js +1 -0
  408. package/dist/domain/{system-components → extensions}/canvas-config.d.ts +1 -1
  409. package/dist/domain/extensions/canvas-config.js +1 -0
  410. package/dist/domain/extensions/canvas-custom-environment.js +1 -0
  411. package/dist/domain/{system-components → extensions}/canvas-padding.d.ts +1 -1
  412. package/dist/domain/extensions/canvas-padding.js +1 -0
  413. package/dist/domain/{system-components → extensions}/canvas-preset-environment.d.ts +1 -1
  414. package/dist/domain/extensions/canvas-preset-environment.js +1 -0
  415. package/dist/domain/{system-components → extensions}/child-entity-recipe-hierarchy.d.ts +2 -2
  416. package/dist/domain/extensions/child-entity-recipe-hierarchy.js +1 -0
  417. package/dist/domain/extensions/client-side-image.js +1 -0
  418. package/dist/domain/extensions/color-value.js +1 -0
  419. package/dist/domain/{system-components → extensions}/common/angle-indicator-schema.d.ts +1 -1
  420. package/dist/domain/extensions/common/angle-indicator-schema.js +1 -0
  421. package/dist/domain/{system-components → extensions}/common/dimension-indicator-schema.d.ts +1 -1
  422. package/dist/domain/extensions/common/dimension-indicator-schema.js +1 -0
  423. package/dist/domain/extensions/common/index.d.ts +4 -0
  424. package/dist/domain/extensions/common/index.js +1 -0
  425. package/dist/domain/{system-components → extensions}/custom-header.d.ts +2 -2
  426. package/dist/domain/{system-components → extensions}/custom-header.js +1 -1
  427. package/dist/domain/extensions/custom-price-footer.js +1 -0
  428. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.d.ts +2 -2
  429. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.js +1 -1
  430. package/dist/domain/{system-components → extensions}/dimension-indicator.d.ts +1 -1
  431. package/dist/domain/extensions/dimension-indicator.js +1 -0
  432. package/dist/domain/{system-components → extensions}/editable-angle-indicator.d.ts +3 -2
  433. package/dist/domain/extensions/editable-angle-indicator.js +1 -0
  434. package/dist/domain/{system-components → extensions}/editable-distance-dimension-indicator.d.ts +3 -2
  435. package/dist/domain/extensions/editable-distance-dimension-indicator.js +1 -0
  436. package/dist/domain/{system-components → extensions}/editable-offset-indicator.d.ts +3 -2
  437. package/dist/domain/extensions/editable-offset-indicator.js +1 -0
  438. package/dist/domain/{system-components → extensions}/editable-size-indicator.d.ts +3 -2
  439. package/dist/domain/extensions/editable-size-indicator.js +1 -0
  440. package/dist/domain/{system-components → extensions}/entity-header.d.ts +1 -1
  441. package/dist/domain/extensions/entity-header.js +1 -0
  442. package/dist/domain/{system-components → extensions}/exit-tool-mode-fab.d.ts +1 -1
  443. package/dist/domain/extensions/exit-tool-mode-fab.js +1 -0
  444. package/dist/domain/{system-components → extensions}/finalize-action.d.ts +1 -1
  445. package/dist/domain/extensions/finalize-action.js +1 -0
  446. package/dist/domain/extensions/finalize-component.js +1 -0
  447. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -0
  448. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -0
  449. package/dist/domain/{system-components → extensions}/fixed-header.d.ts +1 -1
  450. package/dist/domain/extensions/fixed-header.js +1 -0
  451. package/dist/domain/{system-components → extensions}/floating-header.d.ts +1 -1
  452. package/dist/domain/extensions/floating-header.js +1 -0
  453. package/dist/domain/{system-components → extensions}/hidden-header.d.ts +1 -1
  454. package/dist/domain/extensions/hidden-header.js +1 -0
  455. package/dist/domain/{system-components → extensions}/hidden-sidebar-footer.d.ts +1 -1
  456. package/dist/domain/extensions/hidden-sidebar-footer.js +1 -0
  457. package/dist/domain/{system-components → extensions}/horizontal-tabs.d.ts +1 -1
  458. package/dist/domain/extensions/horizontal-tabs.js +1 -0
  459. package/dist/domain/extensions/index.d.ts +69 -0
  460. package/dist/domain/extensions/index.js +1 -0
  461. package/dist/domain/{system-components → extensions}/list-selector-dimension-indicator.d.ts +3 -2
  462. package/dist/domain/extensions/list-selector-dimension-indicator.js +1 -0
  463. package/dist/domain/extensions/multilingual-text-value.js +1 -0
  464. package/dist/domain/extensions/navigation-steps.js +1 -0
  465. package/dist/domain/{system-components → extensions}/offset-anchors.d.ts +1 -1
  466. package/dist/domain/extensions/offset-anchors.js +1 -0
  467. package/dist/domain/{system-components → extensions}/offset-indicator.d.ts +1 -2
  468. package/dist/domain/extensions/offset-indicator.js +1 -0
  469. package/dist/domain/{system-components → extensions}/offset.d.ts +1 -1
  470. package/dist/domain/extensions/offset.js +1 -0
  471. package/dist/domain/{system-components → extensions}/other-action.d.ts +1 -1
  472. package/dist/domain/extensions/other-action.js +1 -0
  473. package/dist/domain/{system-components → extensions}/property-page.d.ts +2 -2
  474. package/dist/domain/extensions/property-page.js +1 -0
  475. package/dist/domain/{system-components → extensions}/read-sidebar-footer.d.ts +1 -1
  476. package/dist/domain/extensions/read-sidebar-footer.js +1 -0
  477. package/dist/domain/{system-components → extensions}/replace-entity-recipe-hierarchy.d.ts +2 -2
  478. package/dist/domain/extensions/replace-entity-recipe-hierarchy.js +1 -0
  479. package/dist/domain/extensions/rotatable.js +1 -0
  480. package/dist/domain/extensions/rotation-handle.js +1 -0
  481. package/dist/domain/extensions/save-template-thumbnail.js +1 -0
  482. package/dist/domain/{system-components → extensions}/scene-entity-add-fab.d.ts +1 -1
  483. package/dist/domain/extensions/scene-entity-add-fab.js +1 -0
  484. package/dist/domain/extensions/scene-entity-animation.js +1 -0
  485. package/dist/domain/extensions/scene-entity-control.js +1 -0
  486. package/dist/domain/{system-components → extensions}/scene-entity-delete-fab.d.ts +1 -1
  487. package/dist/domain/extensions/scene-entity-delete-fab.js +1 -0
  488. package/dist/domain/extensions/scene-entity-floor-object.js +1 -0
  489. package/dist/domain/{system-components → extensions}/scene-entity-html-hotspot.d.ts +1 -1
  490. package/dist/domain/extensions/scene-entity-html-hotspot.js +1 -0
  491. package/dist/domain/{system-components → extensions}/scene-entity-navigation-hotspot.d.ts +1 -1
  492. package/dist/domain/extensions/scene-entity-navigation-hotspot.js +1 -0
  493. package/dist/domain/{system-components → extensions}/scene-entity-object-html-hotspot.d.ts +1 -1
  494. package/dist/domain/extensions/scene-entity-object-html-hotspot.js +1 -0
  495. package/dist/domain/{system-components → extensions}/scene-entity-select-hotspot.d.ts +1 -1
  496. package/dist/domain/extensions/scene-entity-select-hotspot.js +1 -0
  497. package/dist/domain/extensions/scene-entity-wall-object.js +1 -0
  498. package/dist/domain/extensions/selectable-component.js +1 -0
  499. package/dist/domain/{system-components → extensions}/sidebar-tabs.d.ts +1 -1
  500. package/dist/domain/extensions/sidebar-tabs.js +1 -0
  501. package/dist/domain/extensions/simple-summary.js +1 -0
  502. package/dist/domain/{system-components → extensions}/size.d.ts +1 -1
  503. package/dist/domain/extensions/size.js +1 -0
  504. package/dist/domain/{system-components → extensions}/sketching-draw.d.ts +1 -1
  505. package/dist/domain/extensions/sketching-draw.js +1 -0
  506. package/dist/domain/{system-components → extensions}/sketching-edit.d.ts +2 -2
  507. package/dist/domain/extensions/sketching-edit.js +1 -0
  508. package/dist/domain/extensions/summary-component.js +1 -0
  509. package/dist/domain/extensions/text-value.js +1 -0
  510. package/dist/domain/extensions/tool-controls.js +1 -0
  511. package/dist/domain/{system-components → extensions}/tool-menu-fab.d.ts +2 -2
  512. package/dist/domain/extensions/tool-menu-fab.js +1 -0
  513. package/dist/domain/{system-components → extensions}/toolbar.d.ts +2 -2
  514. package/dist/domain/{system-components → extensions}/toolbar.js +1 -1
  515. package/dist/domain/{system-components → extensions}/universal-sidebar-footer.d.ts +1 -1
  516. package/dist/domain/extensions/universal-sidebar-footer.js +1 -0
  517. package/dist/domain/extensions/view-controls.js +1 -0
  518. package/dist/domain/index.d.ts +3 -32
  519. package/dist/domain/index.js +1 -1
  520. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +3 -3
  521. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  522. package/dist/domain/project-modules/index.d.ts +1 -0
  523. package/dist/domain/project-modules/index.js +1 -0
  524. package/dist/domain/project-modules/project-modules.d.ts +25 -0
  525. package/dist/domain/project-modules/project-modules.js +1 -0
  526. package/dist/domain/projections/blender-projections/blender-projections.d.ts +1 -1
  527. package/dist/domain/projections/blender-projections/blender-projections.js +1 -1
  528. package/dist/domain/projections/composition-projections.js +1 -1
  529. package/dist/domain/projections/index.d.ts +1 -1
  530. package/dist/domain/projections/projected-entities-projections.d.ts +1 -2
  531. package/dist/domain/projections/snap-matching.d.ts +1 -2
  532. package/dist/domain/projections/snap-utils.d.ts +1 -2
  533. package/dist/domain/projections/validation-projections.d.ts +1 -18
  534. package/dist/domain/projections/validation-projections.js +1 -1
  535. package/dist/domain/system-components/admin-sidebar.d.ts +1 -1
  536. package/dist/domain/system-components/admin-sidebar.js +1 -1
  537. package/dist/domain/system-components/angle-dimension.js +1 -1
  538. package/dist/domain/system-components/application-config.d.ts +1 -1
  539. package/dist/domain/system-components/application-config.js +1 -1
  540. package/dist/domain/system-components/attribute-selection.js +1 -1
  541. package/dist/domain/system-components/bounding-box-component.d.ts +1 -1
  542. package/dist/domain/system-components/bounding-box-component.js +1 -1
  543. package/dist/domain/system-components/bounding-sphere-component.d.ts +1 -1
  544. package/dist/domain/system-components/bounding-sphere-component.js +1 -1
  545. package/dist/domain/system-components/child-entity-recipes.d.ts +1 -1
  546. package/dist/domain/system-components/child-entity-recipes.js +1 -1
  547. package/dist/domain/system-components/child-entity-selection.d.ts +1 -2
  548. package/dist/domain/system-components/child-entity-selection.js +1 -1
  549. package/dist/domain/system-components/collision-box-geometry.d.ts +1 -1
  550. package/dist/domain/system-components/collision-box-geometry.js +1 -1
  551. package/dist/domain/system-components/collision-geometries.d.ts +1 -1
  552. package/dist/domain/system-components/collision-geometry.d.ts +1 -1
  553. package/dist/domain/system-components/collision-geometry.js +1 -1
  554. package/dist/domain/system-components/collision-point-geometry.d.ts +1 -1
  555. package/dist/domain/system-components/collision-point-geometry.js +1 -1
  556. package/dist/domain/system-components/common/index.d.ts +0 -4
  557. package/dist/domain/system-components/common/index.js +1 -1
  558. package/dist/domain/system-components/common/recipes.d.ts +1 -2
  559. package/dist/domain/system-components/constraint.d.ts +1 -1
  560. package/dist/domain/system-components/constraint.js +1 -1
  561. package/dist/domain/system-components/create-blueprint.d.ts +1 -1
  562. package/dist/domain/system-components/custom-scene-entity.d.ts +1 -1
  563. package/dist/domain/system-components/custom-scene-entity.js +1 -1
  564. package/dist/domain/system-components/detail.js +1 -1
  565. package/dist/domain/system-components/distance-dimension-select.d.ts +1 -1
  566. package/dist/domain/system-components/distance-dimension-select.js +1 -1
  567. package/dist/domain/system-components/distance-dimension.d.ts +1 -1
  568. package/dist/domain/system-components/distance-dimension.js +1 -1
  569. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  570. package/dist/domain/system-components/drag-handle.js +1 -1
  571. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  572. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  573. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  574. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  575. package/dist/domain/system-components/generic-dimension.d.ts +1 -1
  576. package/dist/domain/system-components/generic-dimension.js +1 -1
  577. package/dist/domain/system-components/hidden-entity.js +1 -1
  578. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -2
  579. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  580. package/dist/domain/system-components/index.d.ts +0 -68
  581. package/dist/domain/system-components/index.js +1 -1
  582. package/dist/domain/system-components/material-override-property-transition.js +1 -1
  583. package/dist/domain/system-components/material-override-transformer.js +1 -1
  584. package/dist/domain/system-components/material-swatch.js +1 -1
  585. package/dist/domain/system-components/navigation-page.js +1 -1
  586. package/dist/domain/system-components/navigation-panel-list.js +1 -1
  587. package/dist/domain/system-components/phoenix-entity-elements/admin-data-table-sidebar.d.ts +1 -1
  588. package/dist/domain/system-components/phoenix-layout-elements/admin-connected-resource-page.d.ts +1 -1
  589. package/dist/domain/system-components/phoenix-layout-elements/admin-data-table-actions.d.ts +1 -1
  590. package/dist/domain/system-components/phoenix-layout-elements/admin-data-table-page.d.ts +1 -1
  591. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.d.ts +44 -0
  592. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.js +1 -0
  593. package/dist/domain/system-components/phoenix-layout-elements/index.d.ts +1 -0
  594. package/dist/domain/system-components/phoenix-layout-elements/index.js +1 -1
  595. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.d.ts +2 -1
  596. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.js +1 -1
  597. package/dist/domain/system-components/pivot-point.d.ts +1 -1
  598. package/dist/domain/system-components/pivot-point.js +1 -1
  599. package/dist/domain/system-components/price.js +1 -1
  600. package/dist/domain/system-components/projected-entities.d.ts +1 -1
  601. package/dist/domain/system-components/projected-entities.js +1 -1
  602. package/dist/domain/system-components/replace-entity-recipes.d.ts +1 -1
  603. package/dist/domain/system-components/replace-entity-recipes.js +1 -1
  604. package/dist/domain/system-components/scene-entity-ambient-light.js +1 -1
  605. package/dist/domain/system-components/scene-entity-box-object.js +1 -1
  606. package/dist/domain/system-components/scene-entity-directional-light.js +1 -1
  607. package/dist/domain/system-components/scene-entity-local-material-override.js +1 -1
  608. package/dist/domain/system-components/scene-entity-material-override.js +1 -1
  609. package/dist/domain/system-components/scene-entity-object-clip.js +1 -1
  610. package/dist/domain/system-components/scene-entity-object-decal.js +1 -1
  611. package/dist/domain/system-components/scene-entity-object-group.js +1 -1
  612. package/dist/domain/system-components/scene-entity-object-local-material-override.js +1 -1
  613. package/dist/domain/system-components/scene-entity-object-material-override.js +1 -1
  614. package/dist/domain/system-components/scene-entity-object-properties.js +1 -1
  615. package/dist/domain/system-components/scene-entity-object-remote-material-override.js +1 -1
  616. package/dist/domain/system-components/scene-entity-object-text-decal.js +1 -1
  617. package/dist/domain/system-components/scene-entity-object-transformer.js +1 -1
  618. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.js +1 -1
  619. package/dist/domain/system-components/scene-entity-object.js +1 -1
  620. package/dist/domain/system-components/scene-entity-point-light.js +1 -1
  621. package/dist/domain/system-components/scene-entity-properties.js +1 -1
  622. package/dist/domain/system-components/scene-entity-rect-area-light.js +1 -1
  623. package/dist/domain/system-components/scene-entity-remote-material-override.js +1 -1
  624. package/dist/domain/system-components/scene-entity-remote-object.js +1 -1
  625. package/dist/domain/system-components/scene-entity-spot-light.js +1 -1
  626. package/dist/domain/system-components/scene-entity-transimissive-material-override.js +1 -1
  627. package/dist/domain/system-components/sketching-line.d.ts +1 -1
  628. package/dist/domain/system-components/sketching-line.js +1 -1
  629. package/dist/domain/system-components/sketching-rectangle.d.ts +1 -1
  630. package/dist/domain/system-components/sketching-rectangle.js +1 -1
  631. package/dist/domain/system-components/sketching.d.ts +1 -1
  632. package/dist/domain/system-components/sketching.js +1 -1
  633. package/dist/domain/system-components/snap-axis.d.ts +1 -1
  634. package/dist/domain/system-components/snap-axis.js +1 -1
  635. package/dist/domain/system-components/snap-edge.d.ts +1 -1
  636. package/dist/domain/system-components/snap-edge.js +1 -1
  637. package/dist/domain/system-components/snap-plane.d.ts +1 -1
  638. package/dist/domain/system-components/snap-plane.js +1 -1
  639. package/dist/domain/system-components/snap-point.d.ts +1 -1
  640. package/dist/domain/system-components/snap-point.js +1 -1
  641. package/dist/domain/system-components/static-orthographic-camera-component.d.ts +1 -1
  642. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  643. package/dist/domain/system-components/static-perspective-camera-component.d.ts +1 -1
  644. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  645. package/dist/domain/utils/eval-cache.d.ts +1 -2
  646. package/dist/domain/utils/memo-eval.d.ts +2 -4
  647. package/dist/editor/Editor.js +1 -1
  648. package/dist/editor/domain-editors/use-implementation-files.d.ts +7 -6
  649. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  650. package/dist/editor/graphql/GraphQLPanel.js +1 -1
  651. package/dist/editor/variants/VariantAnswerFooter.d.ts +17 -0
  652. package/dist/editor/variants/VariantAnswerFooter.js +1 -0
  653. package/dist/editor/variants/VariantPreviewHandler.d.ts +6 -0
  654. package/dist/editor/variants/VariantPreviewHandler.js +1 -0
  655. package/dist/editor/variants/variant-preview-styles.d.ts +49 -0
  656. package/dist/editor/variants/variant-preview-styles.js +1 -0
  657. package/dist/i18n/locales/cs/messages.js +1 -1
  658. package/dist/i18n/locales/da/messages.js +1 -1
  659. package/dist/i18n/locales/de/messages.js +1 -1
  660. package/dist/i18n/locales/de-AT/messages.js +1 -1
  661. package/dist/i18n/locales/en/messages.js +1 -1
  662. package/dist/i18n/locales/en-AU/messages.js +1 -1
  663. package/dist/i18n/locales/en-GB/messages.js +1 -1
  664. package/dist/i18n/locales/es/messages.js +1 -1
  665. package/dist/i18n/locales/fr/messages.js +1 -1
  666. package/dist/i18n/locales/hu/messages.js +1 -1
  667. package/dist/i18n/locales/it/messages.js +1 -1
  668. package/dist/i18n/locales/nl/messages.js +1 -1
  669. package/dist/i18n/locales/pl/messages.js +1 -1
  670. package/dist/i18n/locales/pt/messages.js +1 -1
  671. package/dist/i18n/locales/ro/messages.js +1 -1
  672. package/dist/i18n/locales/sk/messages.js +1 -1
  673. package/dist/i18n/locales/tr/messages.js +1 -1
  674. package/dist/legacy/domain-cli/gen/configurator-builder.js +21 -8
  675. package/dist/legacy/domain-cli/gen/implementation.js +5 -5
  676. package/dist/legacy/domain-cli/gen/invariants.js +5 -3
  677. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  678. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  679. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +6 -0
  680. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.d.ts +1 -1
  681. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.js +4 -0
  682. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  683. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  684. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  685. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  686. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  687. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  688. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  689. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  690. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  691. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  692. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  693. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  694. package/dist/phoenix/cli.js +1 -1
  695. package/dist/phoenix/commands/build.d.ts +5 -0
  696. package/dist/phoenix/commands/build.js +1 -1
  697. package/dist/phoenix/commands/deploy.js +2 -2
  698. package/dist/phoenix/commands/dev.js +5 -5
  699. package/dist/phoenix/commands/feedback.d.ts +2 -1
  700. package/dist/phoenix/commands/feedback.js +1 -1
  701. package/dist/phoenix/commands/index.d.ts +1 -0
  702. package/dist/phoenix/commands/index.js +1 -1
  703. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  704. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  705. package/dist/phoenix/commands/story-dev.js +2 -2
  706. package/dist/phoenix/commands/variants.d.ts +35 -0
  707. package/dist/phoenix/commands/variants.js +1 -0
  708. package/dist/phoenix/editor-server/commands-router.d.ts +68 -1
  709. package/dist/phoenix/editor-server/commands-router.js +1 -1
  710. package/dist/phoenix/editor-server/editor-router.d.ts +65 -0
  711. package/dist/phoenix/editor-server/editor-server.d.ts +3 -3
  712. package/dist/phoenix/editor-server/editor-server.js +1 -1
  713. package/dist/phoenix/editor-server/protocol.d.ts +1 -0
  714. package/dist/phoenix/editor-server/spec-router.js +1 -1
  715. package/dist/phoenix/editor-server/trpc.d.ts +3 -0
  716. package/dist/phoenix/scripts/build-admin.js +1 -1
  717. package/dist/phoenix/services/application-spec-project-watcher.d.ts +13 -2
  718. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  719. package/dist/phoenix/services/index.d.ts +5 -0
  720. package/dist/phoenix/services/index.js +1 -1
  721. package/dist/phoenix/services/phoenix-application.d.ts +21 -0
  722. package/dist/phoenix/services/phoenix-application.js +1 -0
  723. package/dist/phoenix/services/phoenix-store.d.ts +48 -0
  724. package/dist/phoenix/services/phoenix-store.js +1 -0
  725. package/dist/phoenix/services/phx-banner-plugin.d.ts +32 -0
  726. package/dist/phoenix/services/phx-banner-plugin.js +1 -0
  727. package/dist/phoenix/services/phx-licenses-plugin.d.ts +55 -0
  728. package/dist/phoenix/services/phx-licenses-plugin.js +8 -0
  729. package/dist/phoenix/services/phx-variant-previews-plugin.d.ts +9 -0
  730. package/dist/phoenix/services/phx-variant-previews-plugin.js +1 -0
  731. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  732. package/dist/phoenix/services/variant-file-session.d.ts +36 -0
  733. package/dist/phoenix/services/variant-file-session.js +1 -0
  734. package/dist/phoenix/services/variant-preview-service.d.ts +80 -0
  735. package/dist/phoenix/services/variant-preview-service.js +1 -0
  736. package/dist/phoenix/services/vite-config.d.ts +2 -0
  737. package/dist/phoenix/services/vite-config.js +1 -1
  738. package/dist/phoenix/utils/index.d.ts +1 -0
  739. package/dist/phoenix/utils/index.js +1 -1
  740. package/dist/phoenix/utils/read-git-commit.d.ts +14 -0
  741. package/dist/phoenix/utils/read-git-commit.js +1 -0
  742. package/dist/react-sdk/application-runtime/common-services/analytics/analytics-service.d.ts +2 -2
  743. package/dist/react-sdk/application-runtime/common-services/analytics/domain-controls-analytics.d.ts +21 -21
  744. package/dist/react-sdk/application-runtime/hooks/data/use-published-data.d.ts +1 -1
  745. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  746. package/dist/react-sdk/application-runtime/hooks/use-spec.d.ts +1 -1
  747. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  748. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  749. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +4 -4
  750. package/dist/ui-sdk/common/use-viewport-size.d.ts +4 -1
  751. package/dist/ui-sdk/common/use-viewport-size.js +1 -1
  752. package/dist/ui-sdk/components/mobile-controls/index.d.ts +1 -1
  753. package/dist/ui-sdk/theme/types.d.ts +4 -0
  754. package/dist/webhook/builders/common.d.ts +8 -0
  755. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  756. package/dist/webhook/builders/webhook-builder.js +1 -1
  757. package/package.json +5 -8
  758. package/schema/domain-spec.json +24 -0
  759. package/dist/configurator/assistant/index.d.ts +0 -1
  760. package/dist/configurator/assistant/index.js +0 -1
  761. package/dist/configurator/assistant/use-assistant-chat.d.ts +0 -20
  762. package/dist/configurator/assistant/use-assistant-chat.js +0 -1
  763. package/dist/domain/actions/action-factory.d.ts +0 -10
  764. package/dist/domain/actions/prepare-action-implementations.js +0 -5
  765. package/dist/domain/components/debug-state-component.js +0 -1
  766. package/dist/domain/components/drag-state-component.js +0 -1
  767. package/dist/domain/components/export-state-component.js +0 -1
  768. package/dist/domain/components/fullscreen-state-component.js +0 -1
  769. package/dist/domain/components/group-components-by-entity-id-and-name.js +0 -1
  770. package/dist/domain/components/hover-state-component.js +0 -1
  771. package/dist/domain/components/index.d.ts +0 -2
  772. package/dist/domain/components/index.js +0 -1
  773. package/dist/domain/components/navigation-state-component.js +0 -1
  774. package/dist/domain/components/selection-state-component.js +0 -1
  775. package/dist/domain/components/system-component-builder.js +0 -1
  776. package/dist/domain/components/system-virtual-entity.js +0 -1
  777. package/dist/domain/components/tool-state-component.js +0 -1
  778. package/dist/domain/components/view-state-component.js +0 -1
  779. package/dist/domain/components/viewport-state-component.js +0 -1
  780. package/dist/domain/core/json-schema.js +0 -1
  781. package/dist/domain/core/reflection.js +0 -1
  782. package/dist/domain/domain-context/recipe-system/recipes.js +0 -1
  783. package/dist/domain/expressions/constant-expressions.js +0 -1
  784. package/dist/domain/expressions/custom-expression.js +0 -1
  785. package/dist/domain/expressions/index.d.ts +0 -1
  786. package/dist/domain/expressions/index.js +0 -1
  787. package/dist/domain/invariants/custom-invariants.js +0 -1
  788. package/dist/domain/invariants/invariants.js +0 -1
  789. package/dist/domain/invariants/violation-component.js +0 -1
  790. package/dist/domain/relations/all-of-type-relation.js +0 -1
  791. package/dist/domain/relations/component-factories.js +0 -1
  792. package/dist/domain/relations/composed-of.js +0 -1
  793. package/dist/domain/relations/indirect-relation.js +0 -1
  794. package/dist/domain/relations/reference-component.js +0 -1
  795. package/dist/domain/system-components/angle-indicator.js +0 -1
  796. package/dist/domain/system-components/attribute-switch.js +0 -1
  797. package/dist/domain/system-components/autorotate-camera-component.js +0 -1
  798. package/dist/domain/system-components/basic-sidebar-footer.js +0 -1
  799. package/dist/domain/system-components/camera-based-hidden-entity-object.js +0 -1
  800. package/dist/domain/system-components/camera-based-hidden-entity.js +0 -1
  801. package/dist/domain/system-components/canvas-config.js +0 -1
  802. package/dist/domain/system-components/canvas-custom-environment.js +0 -1
  803. package/dist/domain/system-components/canvas-padding.js +0 -1
  804. package/dist/domain/system-components/canvas-preset-environment.js +0 -1
  805. package/dist/domain/system-components/child-entity-recipe-hierarchy.js +0 -1
  806. package/dist/domain/system-components/client-side-image.js +0 -1
  807. package/dist/domain/system-components/color-value.js +0 -1
  808. package/dist/domain/system-components/common/angle-indicator-schema.js +0 -1
  809. package/dist/domain/system-components/common/dimension-indicator-schema.js +0 -1
  810. package/dist/domain/system-components/custom-price-footer.js +0 -1
  811. package/dist/domain/system-components/dimension-indicator.js +0 -1
  812. package/dist/domain/system-components/editable-angle-indicator.js +0 -1
  813. package/dist/domain/system-components/editable-distance-dimension-indicator.js +0 -1
  814. package/dist/domain/system-components/editable-offset-indicator.js +0 -1
  815. package/dist/domain/system-components/editable-size-indicator.js +0 -1
  816. package/dist/domain/system-components/entity-header.js +0 -1
  817. package/dist/domain/system-components/exit-tool-mode-fab.js +0 -1
  818. package/dist/domain/system-components/finalize-action.js +0 -1
  819. package/dist/domain/system-components/finalize-component.js +0 -1
  820. package/dist/domain/system-components/fit-selection-orthographic-camera-component.js +0 -1
  821. package/dist/domain/system-components/fit-selection-perspective-camera-component.js +0 -1
  822. package/dist/domain/system-components/fixed-header.js +0 -1
  823. package/dist/domain/system-components/floating-header.js +0 -1
  824. package/dist/domain/system-components/hidden-header.js +0 -1
  825. package/dist/domain/system-components/hidden-sidebar-footer.js +0 -1
  826. package/dist/domain/system-components/horizontal-tabs.js +0 -1
  827. package/dist/domain/system-components/list-selector-dimension-indicator.js +0 -1
  828. package/dist/domain/system-components/multilingual-text-value.js +0 -1
  829. package/dist/domain/system-components/navigation-steps.js +0 -1
  830. package/dist/domain/system-components/offset-anchors.js +0 -1
  831. package/dist/domain/system-components/offset-indicator.js +0 -1
  832. package/dist/domain/system-components/offset.js +0 -1
  833. package/dist/domain/system-components/other-action.js +0 -1
  834. package/dist/domain/system-components/property-page.js +0 -1
  835. package/dist/domain/system-components/read-sidebar-footer.js +0 -1
  836. package/dist/domain/system-components/replace-entity-recipe-hierarchy.js +0 -1
  837. package/dist/domain/system-components/rotatable.js +0 -1
  838. package/dist/domain/system-components/rotation-handle.js +0 -1
  839. package/dist/domain/system-components/save-template-thumbnail.js +0 -1
  840. package/dist/domain/system-components/scene-entity-add-fab.js +0 -1
  841. package/dist/domain/system-components/scene-entity-animation.js +0 -1
  842. package/dist/domain/system-components/scene-entity-control.js +0 -1
  843. package/dist/domain/system-components/scene-entity-delete-fab.js +0 -1
  844. package/dist/domain/system-components/scene-entity-floor-object.js +0 -1
  845. package/dist/domain/system-components/scene-entity-html-hotspot.js +0 -1
  846. package/dist/domain/system-components/scene-entity-navigation-hotspot.js +0 -1
  847. package/dist/domain/system-components/scene-entity-object-html-hotspot.js +0 -1
  848. package/dist/domain/system-components/scene-entity-select-hotspot.js +0 -1
  849. package/dist/domain/system-components/scene-entity-wall-object.js +0 -1
  850. package/dist/domain/system-components/selectable-component.js +0 -1
  851. package/dist/domain/system-components/sidebar-tabs.js +0 -1
  852. package/dist/domain/system-components/simple-summary.js +0 -1
  853. package/dist/domain/system-components/size.js +0 -1
  854. package/dist/domain/system-components/sketching-draw.js +0 -1
  855. package/dist/domain/system-components/sketching-edit.js +0 -1
  856. package/dist/domain/system-components/summary-component.js +0 -1
  857. package/dist/domain/system-components/text-value.js +0 -1
  858. package/dist/domain/system-components/tool-controls.js +0 -1
  859. package/dist/domain/system-components/tool-menu-fab.js +0 -1
  860. package/dist/domain/system-components/universal-sidebar-footer.js +0 -1
  861. package/dist/domain/system-components/view-controls.js +0 -1
  862. package/dist/extras/assistant/AssistantChat.d.ts +0 -6
  863. package/dist/extras/assistant/AssistantChat.js +0 -1
  864. package/dist/extras/assistant/index.d.ts +0 -1
  865. package/dist/extras/assistant/index.js +0 -1
  866. package/dist/phoenix/application-spec/generate-assistant-prompt.d.ts +0 -12
  867. package/dist/phoenix/application-spec/generate-assistant-prompt.js +0 -1
  868. /package/dist/domain/{components/component-reader-types.js → application/assistant/assistant-manifest.js} +0 -0
  869. /package/dist/domain/{core/action.js → application/assistant/assistant-resolved-manifest.js} +0 -0
  870. /package/dist/domain/{actions → core/action}/action-factory.js +0 -0
  871. /package/dist/domain/core/{enhanced-json-schema.js → action/action.js} +0 -0
  872. /package/dist/domain/core/{expression.js → component/component-reader-types.js} +0 -0
  873. /package/dist/domain/{components → core/component}/legacy-filter.js +0 -0
  874. /package/dist/domain/{components → core/component}/system-component-filter.js +0 -0
  875. /package/dist/domain/{components → core/component}/system-virtual-entity.d.ts +0 -0
  876. /package/dist/domain/{components → core/component}/updates.js +0 -0
  877. /package/dist/domain/core/{schema-validator.js → data-schema/data-cell-value.js} +0 -0
  878. /package/dist/domain/{relations/reference-field.js → core/data-schema/data-schema-array-field.js} +0 -0
  879. /package/dist/domain/{relations/relation-implementation.js → core/data-schema/data-schema-field-object.js} +0 -0
  880. /package/dist/domain/{invariants → core/invariant}/builtin-invariant.js +0 -0
  881. /package/dist/domain/{invariants → core/invariant}/violation-component.d.ts +0 -0
  882. /package/dist/domain/{invariants → core/invariant}/violation.js +0 -0
  883. /package/dist/domain/core/{alias.d.ts → model/alias.d.ts} +0 -0
  884. /package/dist/domain/core/{alias.js → model/alias.js} +0 -0
  885. /package/dist/domain/core/{common-definitions.d.ts → model/common-definitions.d.ts} +0 -0
  886. /package/dist/domain/core/{common-definitions.js → model/common-definitions.js} +0 -0
  887. /package/dist/domain/core/{component.js → model/component.js} +0 -0
  888. /package/dist/domain/core/{model.d.ts → model/model.d.ts} +0 -0
  889. /package/dist/domain/core/{model.js → model/model.js} +0 -0
  890. /package/dist/domain/core/{preset.d.ts → model/preset.d.ts} +0 -0
  891. /package/dist/domain/core/{preset.js → model/preset.js} +0 -0
  892. /package/dist/domain/{relations → core/relation}/direct-relation.js +0 -0
  893. /package/dist/domain/{relations → core/relation}/relation-factory.js +0 -0
  894. /package/dist/domain/core/{schema-validator-ajv.d.ts → schema/create-ajv-schema-validator.d.ts} +0 -0
  895. /package/dist/domain/core/{schema-validator-ajv.js → schema/create-ajv-schema-validator.js} +0 -0
  896. /package/dist/domain/core/{schema-validator-csp.d.ts → schema/create-csp-schema-validator.d.ts} +0 -0
  897. /package/dist/domain/core/{schema-validator-csp.js → schema/create-csp-schema-validator.js} +0 -0
  898. /package/dist/domain/core/{enhanced-json-schema.d.ts → schema/enhanced-json-schema.d.ts} +0 -0
  899. /package/dist/domain/core/{json-schema.d.ts → schema/extended-schema-validator.d.ts} +0 -0
  900. /package/dist/domain/core/{schema-validator.d.ts → schema/schema-validator.d.ts} +0 -0
  901. /package/dist/domain/core/{migrations.js → state/migrations.js} +0 -0
  902. /package/dist/domain/core/{state.js → state/state.js} +0 -0
  903. /package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.js +0 -0
  904. /package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.js +0 -0
  905. /package/dist/domain/{system-components → extensions}/attribute-switch.d.ts +0 -0
  906. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity-object.d.ts +0 -0
  907. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity.d.ts +0 -0
  908. /package/dist/domain/{system-components → extensions}/canvas-custom-environment.d.ts +0 -0
  909. /package/dist/domain/{system-components → extensions}/client-side-image.d.ts +0 -0
  910. /package/dist/domain/{system-components → extensions}/color-value.d.ts +0 -0
  911. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.d.ts +0 -0
  912. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.js +0 -0
  913. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.d.ts +0 -0
  914. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.js +0 -0
  915. /package/dist/domain/{system-components → extensions}/custom-price-footer.d.ts +0 -0
  916. /package/dist/domain/{system-components → extensions}/finalize-component.d.ts +0 -0
  917. /package/dist/domain/{system-components → extensions}/fit-selection-orthographic-camera-component.d.ts +0 -0
  918. /package/dist/domain/{system-components → extensions}/fit-selection-perspective-camera-component.d.ts +0 -0
  919. /package/dist/domain/{system-components → extensions}/multilingual-text-value.d.ts +0 -0
  920. /package/dist/domain/{system-components → extensions}/navigation-steps.d.ts +0 -0
  921. /package/dist/domain/{system-components → extensions}/rotatable.d.ts +0 -0
  922. /package/dist/domain/{system-components → extensions}/rotation-handle.d.ts +0 -0
  923. /package/dist/domain/{system-components → extensions}/save-template-thumbnail.d.ts +0 -0
  924. /package/dist/domain/{system-components → extensions}/scene-entity-animation.d.ts +0 -0
  925. /package/dist/domain/{system-components → extensions}/scene-entity-control.d.ts +0 -0
  926. /package/dist/domain/{system-components → extensions}/scene-entity-floor-object.d.ts +0 -0
  927. /package/dist/domain/{system-components → extensions}/scene-entity-wall-object.d.ts +0 -0
  928. /package/dist/domain/{system-components → extensions}/selectable-component.d.ts +0 -0
  929. /package/dist/domain/{system-components → extensions}/simple-summary.d.ts +0 -0
  930. /package/dist/domain/{system-components → extensions}/summary-component.d.ts +0 -0
  931. /package/dist/domain/{system-components → extensions}/text-value.d.ts +0 -0
  932. /package/dist/domain/{system-components → extensions}/tool-controls.d.ts +0 -0
  933. /package/dist/domain/{system-components → extensions}/view-controls.d.ts +0 -0
@@ -1 +1 @@
1
- import{createBrowserDetailsClientTool as t}from"./browser-details.js";import{createApplyClientTool as e,createQueryClientTool as s}from"./graphql-tools.js";let i=[];export class AssistantSystem{_context;_tools;_isInitialized=!1;constructor(i){this._context=i;let{configuratorExtensionSelectors:o,domainContextSelectors:l}=i,r={getGraphQLSystem:()=>o.getGraphQLSystem(),getStoreSystem:()=>l.getStoreSystem(),getActiveMode:()=>l.getActiveMode()};this._tools=[t(),s(r),e(r)]}initialize=()=>{this._isInitialized=!0};getTools=()=>this._isInitialized&&this._context.specSelectors.getAssistant()?this._tools:i}
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,specSelectors: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.getAssistant()?.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=()=>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)=>i.active?e.execute?.(t,s):_})),m=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(m)&&(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))}}),f=!1,v=()=>{f||(f=!0,this._finishing.delete(p),m.dispose())},p={client:m,configurationId:s,generation:i,authorizedClient:r,getConnection:n,dispose:v};this._current=p,m.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}
@@ -6,7 +6,7 @@ import type { GraphQLSystem } from '../graphql-system/graphql-system.js';
6
6
  * that moment, never against ones captured when its reply began streaming.
7
7
  */
8
8
  export interface AssistantToolDependencies {
9
- readonly getGraphQLSystem: () => Pick<GraphQLSystem, 'prepare' | 'execute'>;
9
+ readonly getGraphQLSystem: () => Pick<GraphQLSystem, 'prepare' | 'execute' | 'readSideEffects'>;
10
10
  readonly getStoreSystem: () => {
11
11
  readonly isInitialized: boolean;
12
12
  readonly stateSlices: {
@@ -18,11 +18,14 @@ 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
24
26
  * committed state and drops their emissions, so mutations in the list show a hypothetical state and
25
- * the configuration, the undo stack and the saved revision stay as they were.
27
+ * the configuration, the undo stack and the saved revision stay as they were. The side effects of
28
+ * the dropped emissions are still reported, as what the changes would do.
26
29
  */
27
30
  export declare const createQueryClientTool: (dependencies: AssistantToolDependencies) => import("@tanstack/ai").ClientTool<{
28
31
  type: string;
@@ -88,7 +91,9 @@ export declare const createQueryClientTool: (dependencies: AssistantToolDependen
88
91
  /**
89
92
  * Browser implementation of the assistant's `apply` tool: hands the operations to
90
93
  * `GraphQLSystem.execute`, which commits their changes as one undo step, and returns its result,
91
- * 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
92
97
  * session may change the configuration; the check lives here and not in the `GraphQLSystem`, whose
93
98
  * other caller, the editor panel, has its own rules.
94
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}),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();return n.isInitialized?i({results:(await e.getGraphQLSystem().prepare(n.stateSlices.committed.value.state,o.operations)).map(({result:e})=>e),committed:!1}):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.")});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)});
@@ -47,12 +47,14 @@ export declare const createEntityMeta: (source: EntityMetaSource, context: Entit
47
47
  root: null;
48
48
  changedEntities: never[];
49
49
  deletedEntityIds: never[];
50
+ sideEffects: never[];
50
51
  errors: readonly DryRunError[];
51
52
  } | {
52
53
  ok: boolean;
53
54
  root: unknown;
54
55
  changedEntities: {}[];
55
56
  deletedEntityIds: DomainEntityId<string>[];
57
+ sideEffects: readonly string[];
56
58
  errors: never[];
57
59
  } | null;
58
60
  }[];
@@ -71,12 +73,14 @@ export declare const createEntityMeta: (source: EntityMetaSource, context: Entit
71
73
  root: null;
72
74
  changedEntities: never[];
73
75
  deletedEntityIds: never[];
76
+ sideEffects: never[];
74
77
  errors: readonly DryRunError[];
75
78
  } | {
76
79
  ok: boolean;
77
80
  root: unknown;
78
81
  changedEntities: {}[];
79
82
  deletedEntityIds: DomainEntityId<string>[];
83
+ sideEffects: readonly string[];
80
84
  errors: never[];
81
85
  } | null;
82
86
  }[];
@@ -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";let o=e=>({ok:!1,root:null,changedEntities:[],deletedEntityIds:[],errors:e}),d=(e,{state:t},{recipes:i,prepareStateEmission:r,find$Entity:n})=>{let{validity:s,state:a}=r(e,t,"committed");if(s.valid){let e=new Map(t.entities.map(e=>[e.id,e])),i=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=>!i.has(e)),errors:[]}}return o("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=(l,c)=>{let p=e=>()=>t(c.manifest,e,l.entity.type).flatMap(t=>{let i=s(e,t,l.entity.id,l.state,c.recipes);return i?[((e,t,i)=>{let{group:n,label:s,description:a,recipes:l}=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:l.map(n=>((e,t,i,n)=>{let{key:s,item:a}=e,{resolveLocalizable:l}=n.recipes;return{key:s,name:l(a.title),description:void 0===a.description?null:l(a.description),imageUrl:void 0===a.thumbnailUrl?null:l(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?o([{type:"uncaught",entityId:null,message:a}]):d(s,i,n)})(e,t,i,n):null}})(n,e,t,i))}})(i,l,c)]:[]});return{...Object.fromEntries(e(c.manifest,l.entity.type).map(e=>[e.edgeName,()=>n(e,l.entity.id,l.state,c.recipes)?.map(t=>({...t,dryRun:()=>e.dryRuns?(({field:e},{value:t},r,n)=>{let{entity:s}=r,l=Object.entries(Object.entries(n.manifest.writableFields??{}).find(([e])=>e===s.type)?.[1]??{}).find(([t])=>t===e)?.[1];if(void 0===l)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={[l]:t},u=c?n.validateEntity({...c,...p}):{success:!0};return u.success?d([a.DomainEntityModification({entityId:s.id,stateDelta:p,updateTag:i})],r,n):o([{type:"uncaught",entityId:s.id,message:`Writing ${JSON.stringify(t)} to "${e}" would make "${s.id}" an invalid ${s.type}: ${u.errors.join("; ")}.${e===l?"":` The message names the stored property: ${e} is stored as ${l}.`} The option comes from the configurator and cannot be corrected from here, so do not write it.`}])})(e,t,l,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,4 +1,5 @@
1
1
  import { type ExecutionResult } from 'graphql';
2
+ import { type Localizable } from '@salsita-ai/common/utils';
2
3
  import { type $DomainEntity, type DomainContextSelectors, type DomainEntity, type DomainServicesSelectors, type DomainState, 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 {
@@ -26,13 +27,22 @@ export interface PreparedOperation {
26
27
  /**
27
28
  * What {@link GraphQLSystem.execute} returns: the results of the operations as prepared from the
28
29
  * committed state, whether their changes were committed as one undo step, and, when the operations
29
- * succeeded but their changes were not committed, the reason addressed to the caller.
30
+ * succeeded but their changes were not committed, the reason addressed to the caller. `sideEffects`
31
+ * describes the prepared changes whether or not they were committed, so a caller can weigh a held
32
+ * commit before the user approves it.
30
33
  */
31
34
  export interface GraphQLExecution {
32
35
  readonly results: readonly ExecutionResult[];
33
36
  readonly committed: boolean;
34
37
  readonly message?: string;
38
+ /** What the configurator did, or would do, beyond what the operations asked for, in applied order. */
39
+ readonly sideEffects: readonly string[];
35
40
  }
41
+ /**
42
+ * Resolves a localizable value, or each item of a list of them, to a string in the current locale.
43
+ * `null` and values that are not localizable pass through, so the schema's nullability decides.
44
+ */
45
+ export declare const localize: (value: unknown, resolveLocalizable: (message: Localizable) => string) => unknown;
36
46
  /**
37
47
  * Executes GraphQL operations against the schema generated from the application spec `assistant`
38
48
  * manifest, resolving it against the committed domain state. Agent-independent: the assistant's
@@ -75,6 +85,11 @@ export declare class GraphQLSystem {
75
85
  * "not run" error instead.
76
86
  */
77
87
  prepare: (originalState: AnyDomainState, operations: readonly GraphQLOperation[]) => Promise<readonly PreparedOperation[]>;
88
+ /**
89
+ * The side effects of prepared operations: the hints of every update of their emissions, as the
90
+ * agent is told them, in applied order.
91
+ */
92
+ readSideEffects: (prepared: readonly PreparedOperation[]) => readonly string[];
78
93
  private readonly _prepareAndCommit;
79
94
  /**
80
95
  * Prepares the operations from the committed state and commits their changes as one emission,
@@ -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";let p={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.")]},f=new RegExp(h.pattern),y=e=>"object"==typeof e&&null!==e&&"type"in e&&"string"==typeof e.type&&"id"in e&&"string"==typeof e.id,g=(e,t)=>"object"==typeof e&&null!==e?Reflect.get(e,t):void 0,v=e=>e instanceof Error?e.message:String(e),S=e=>/[.!?]$/.test(e)?e:`${e}.`,_=e=>"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===Object.prototype,x=(e,t)=>{let i=_(e)?e._raw:void 0;if(y(i))return i;if(!Array.isArray(e)&&!_(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=>x(e,o)):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,x(t,o)]))},w=(e,t)=>Array.isArray(e)?e.map(e=>w(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: ${S(t)} Regenerate the application so the schema is rebuilt from the current spec.`),E=e=>(e.errors?.length??0)>0,b=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 $(v(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(!y(a))return i(a,n,r,s);if("meta"===s.fieldName){let e;return m({entity:a,state:("object"==typeof(e=g(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 g(t,i)}catch(o){throw new e(`Expression "${i}" failed on ${y(t)?t.id:"an entity"}: ${S(v(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?w(h,this._context.domainServicesSelectors.getResolveLocalizable()):l.startsWith("$")&&"JSON"===o(s.returnType).name?((t,i,o)=>{try{return x(o,new Set)}catch(o){throw new e(`Expression "${i}" returned a value that is not plain serializable data on ${y(t)?t.id:"an entity"}: ${S(v(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=>!f.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=>f.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=>y(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(v(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:p};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)}),E(l)&&(i=e)}else r.push({result:b(i),emissions:[]});return r};_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=n.flatMap(e=>e.emissions);return s.some(E)||0===l.length?{results:s,outcome:"none"}:{results:s,outcome:a.commitPrepared((t=r(l[0]),i=r(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(()=>u),committed:!1};let t=await this._prepareAndCommit(e),{results:i,outcome:o}="conflict"===t.outcome?await this._prepareAndCommit(e):t;return"committed"===o?{results:i,committed:!0}:"held"===o?{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."}:"conflict"===o?{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."}:{results:i,committed:!1}}}
1
+ import{GraphQLError as e,buildSchema as t,defaultFieldResolver as i,getNamedType as o,graphql as n,validateSchema as a}from"graphql";import{assertExistence as r,createSelector as s,isMessageDescriptor as l,isMultilingualString as c}from"@salsita-ai/common/utils";import{DomainEntityIdSchema as d,findAssistantMutation as h}from"#package/domain";import{createEntityMeta as u}from"./entity-meta.js";import{readSideEffects as m}from"./side-effects.js";let f={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.")]},p={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(d.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.");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)]))};export const localize=(e,t)=>Array.isArray(e)?e.map(e=>localize(e,t)):"string"==typeof e||l(e)||c(e)?t(e):e;let E=t=>new e(`The configurator cannot handle this request: ${_(t)} This is a fault in the configurator, not in your request. Tell the user this is not available.`),$=e=>(e.errors?.length??0)>0,b=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=a(i);return o.length>0?E(o.map(e=>e.message).join(" ")):i}catch(e){return E(S(e))}});_selectFieldResolver=s([s.leaf(e=>e)],t=>(n,a,r,s)=>{if(s.parentType===s.schema.getQueryType())return i(n,a,r,s);if(s.parentType===s.schema.getMutationType())return this._resolveMutation(s.fieldName,String(s.path.key),a,r);if(!g(n))return i(n,a,r,s);if("meta"===s.fieldName){let e;return u({entity:n,state:("object"==typeof(e=v(n,"_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},d=((t,i)=>{try{return v(t,i)}catch(o){throw new e(`Expression "${i}" failed on ${g(t)?t.id:"an entity"}: ${_(S(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})}})(n,l);return c?localize(d,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))} 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})}})(n,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=>!y.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=>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,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=h(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 a=o.state,r=n.implementation(i,a,{manifest:o.manifest,action:this._context.domainContextSelectors.getActionSystem().createContext(a),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});if(r.updates.length>0){let i=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(r.updates,a,"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:a,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 a={manifest:o.assistant,state:e,emissions:[],failedMutationField:void 0},r=[];for(let[e,s]of t.entries())if(void 0===i){let t=a.emissions.length;a.failedMutationField=void 0;let l=await n({schema:o.schema,source:s.document,rootValue:this._rootValue,contextValue:a,variableValues:s.variables,operationName:s.operationName,fieldResolver:o.fieldResolver,typeResolver:this._resolveType});r.push({result:l,emissions:a.emissions.slice(t)}),$(l)&&(i=e)}else r.push({result:b(i),emissions:[]});return r};readSideEffects=e=>{let t=this._context.domainServicesSelectors.getResolveLocalizable();return e.flatMap(({emissions:e})=>e.flatMap(e=>m(e.updates,t)))};_prepareAndCommit=async e=>{let t,i,o,n=this._context.domainContextSelectors.getStoreSystem(),a=await this.prepare(n.stateSlices.committed.value.state,e),s=a.map(({result:e})=>e),l=this.readSideEffects(a),c=a.flatMap(e=>e.emissions);return s.some($)||0===c.length?{results:s,sideEffects:l,outcome:"none"}:{results:s,sideEffects:l,outcome:n.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(()=>p),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,9 @@
1
+ import type { Localizable } from '@salsita-ai/common/utils';
2
+ import type { DataUpdate, DomainEntity } from '#package/domain';
3
+ /**
4
+ * What the updates of an emission tell the assistant agent the configurator did beyond what was
5
+ * asked, in applied order with duplicates kept, the way the user gets them as snackbars. An update's
6
+ * `agentHint` replaces its user-facing `hint` for the agent, `null` keeps the update from the agent,
7
+ * and an update with neither says nothing. Empty text counts as none, as it does for the snackbar.
8
+ */
9
+ export declare const readSideEffects: (updates: ReadonlyArray<DataUpdate<DomainEntity<string>, DomainEntity<string>>>, resolveLocalizable: (message: Localizable) => string) => readonly string[];
@@ -0,0 +1 @@
1
+ export const readSideEffects=(e,t)=>e.flatMap(({hint:e,agentHint:a})=>null===a?[]:void 0!==a?a?[a]:[]:e?[t(e)]:[]);
@@ -1,5 +1,5 @@
1
1
  export { AnimationSystem, type AnimationSystemContext } from './animation-system.js';
2
- export { type AssistantClientTool, 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';
@@ -25,6 +25,8 @@ export declare class LayoutSystem<ENTITIES extends DomainEntity<string>> {
25
25
  * whatever was true when it was created.
26
26
  */
27
27
  private get _toolbarHelpExists();
28
+ /** Whether the application spec has an `assistant` section; read on demand for the same reason. */
29
+ private get _hasAssistant();
28
30
  initialize: () => void;
29
31
  getCleanUpPropertyPageStateUpdates: (entityId: DomainEntityId<string>, state: DomainState<ENTITIES>) => import("#package/domain").ComponentModification<import("#package/domain").SystemComponentType<"layoutStateComponent", import("./layout-state.js").LayoutStateComponentState, "propertyPageStates">>[];
30
32
  getLayoutConfig: (state: DomainState<ENTITIES>) => {
@@ -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]}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 S=(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}}),h=S[0]?.id,b=(h?o.propertyPageStates[h]?.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:S,renderedStackedPage:b,activePropertyPageId:h,isBackAvailable:y,hasMiniSidebar:r,hasSplitSidebar:n.splitSidebar}};getToolbarState=o=>{let n=this._toolbarHelpExists,a=this._toolbarCache.get(o);if(a&&a.toolbarHelpExists===n)return a.result;let i=this._context.domainContextSelectors.getExpressionContext(),r=this._context.domainContextSelectors.getNavigationSystem().getActiveFullscreenState(o),s="read"===i.mode,l=this._context.domainContextSelectors.getComponentReader().readFirstRootComponent({componentTypes:[c]},o),d=this._context.domainContextSelectors.getDimensionSystem().getDimensionConfig(o),g=this.getLayoutConfig(o),u="read"===this._context.domainContextSelectors.getExpressionContext().mode,p=g.availableLocales.length>1,m=!u&&!g.shareDisabled,S=g.indicatorSwitch,h=d.availableDimensions.length>1||S,b=e(l).returnType().with(t.nonNullable,t=>t.state).with(t.nullish,()=>e([r,s]).returnType().with([!1,!1],()=>({desktop:[{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},...p?[{kind:"toolbarButtonGroup",children:[{kind:"languageToolbarButton"}]}]:[],...m||h?[{kind:"toolbarButtonGroup",children:[...m?[{kind:"shareToolbarButton"}]:[],...h?[{kind:"measurementsToolbarButton"}]:[],...n?[{kind:"helpToolbarButton"}]:[]]}]:[],{kind:"toolbarButtonGroup",children:[{kind:"undoToolbarButton"},{kind:"redoToolbarButton"}]}],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"undoToolbarButton"},{kind:"redoToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]}],mobileMenu:[...m?[{kind:"shareMenuAction"}]:[],...h?[{kind:"measurementsMenuAction"}]:[],...p?[{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"}]},...p?[{kind:"toolbarButtonGroup",children:[{kind:"languageToolbarButton"}]}]:[],...h?[{kind:"toolbarButtonGroup",children:[...h?[{kind:"measurementsToolbarButton"}]:[]]}]:[],...n?[{kind:"helpToolbarButton"}]:[]],mobile:[{kind:"toolbarButtonGroup",children:[{kind:"resetCameraToolbarButton"}]},{kind:"toolbarButtonGroup",children:[{kind:"enterFullscreenToolbarButton"}]}],mobileMenu:[...h?[{kind:"measurementsMenuAction"}]:[],...p?[{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,result:b}),b};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 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,25 +1,25 @@
1
1
  import { type EntityId } from '#package/domain';
2
- declare const CloseConfiguratorClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
3
- declare const PreviousStepButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
4
- declare const NextStepButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
5
- declare const FinalizeButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
6
- declare const SummaryButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
7
- declare const TopNavigationStepClicked: (step: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
8
- declare const HorizontalTabClicked: (tab: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
9
- declare const GoToProductsClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
10
- declare const ExpandedViewClosed: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
11
- declare const ProductSelected: (productType: string, productName: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
12
- declare const SelectionHotspotClicked: (id: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
13
- declare const RedoButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
14
- declare const UndoButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
15
- declare const GlobalDimensionsButtonClicked: (dimensionUnit: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
16
- declare const MeasurementsMenuToggled: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
17
- declare const MeasurementsMenuClosed: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
18
- declare const DimensionIndicatorsToggled: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
19
- declare const FullScreenModeToggled: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
20
- declare const HelpDialogOpened: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
21
- declare const HelpDialogClosed: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
22
- declare const EntityDeleteHotspotClicked: (id: EntityId) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
2
+ declare const CloseConfiguratorClicked: () => import("#package/domain").UserActionEvent;
3
+ declare const PreviousStepButtonClicked: () => import("#package/domain").UserActionEvent;
4
+ declare const NextStepButtonClicked: () => import("#package/domain").UserActionEvent;
5
+ declare const FinalizeButtonClicked: () => import("#package/domain").UserActionEvent;
6
+ declare const SummaryButtonClicked: () => import("#package/domain").UserActionEvent;
7
+ declare const TopNavigationStepClicked: (step: string) => import("#package/domain").UserActionEvent;
8
+ declare const HorizontalTabClicked: (tab: string) => import("#package/domain").UserActionEvent;
9
+ declare const GoToProductsClicked: () => import("#package/domain").UserActionEvent;
10
+ declare const ExpandedViewClosed: () => import("#package/domain").UserActionEvent;
11
+ declare const ProductSelected: (productType: string, productName: string) => import("#package/domain").UserActionEvent;
12
+ declare const SelectionHotspotClicked: (id: string) => import("#package/domain").UserActionEvent;
13
+ declare const RedoButtonClicked: () => import("#package/domain").UserActionEvent;
14
+ declare const UndoButtonClicked: () => import("#package/domain").UserActionEvent;
15
+ declare const GlobalDimensionsButtonClicked: (dimensionUnit: string) => import("#package/domain").UserActionEvent;
16
+ declare const MeasurementsMenuToggled: () => import("#package/domain").UserActionEvent;
17
+ declare const MeasurementsMenuClosed: () => import("#package/domain").UserActionEvent;
18
+ declare const DimensionIndicatorsToggled: () => import("#package/domain").UserActionEvent;
19
+ declare const FullScreenModeToggled: () => import("#package/domain").UserActionEvent;
20
+ declare const HelpDialogOpened: () => import("#package/domain").UserActionEvent;
21
+ declare const HelpDialogClosed: () => import("#package/domain").UserActionEvent;
22
+ declare const EntityDeleteHotspotClicked: (id: EntityId) => import("#package/domain").UserActionEvent;
23
23
  export declare const FrontendAnalyticsFactory: {
24
24
  CloseConfiguratorClicked: typeof CloseConfiguratorClicked;
25
25
  PreviousStepButtonClicked: typeof PreviousStepButtonClicked;
@@ -1,6 +1,5 @@
1
1
  export { ConfiguratorApp } from './ConfiguratorApp.js';
2
2
  export * from './application-runtime/index.js';
3
- export * from './assistant/index.js';
4
3
  export * from './common/index.js';
5
4
  export * from './configurator-context/index.js';
6
5
  export * from './pages/index.js';
@@ -1 +1 @@
1
- export{ConfiguratorApp}from"./ConfiguratorApp.js";export*from"./application-runtime/index.js";export*from"./assistant/index.js";export*from"./common/index.js";export*from"./configurator-context/index.js";export*from"./pages/index.js";export*from"./scene/index.js";export*from"./ui/index.js";export*from"./integration/index.js";
1
+ export{ConfiguratorApp}from"./ConfiguratorApp.js";export*from"./application-runtime/index.js";export*from"./common/index.js";export*from"./configurator-context/index.js";export*from"./pages/index.js";export*from"./scene/index.js";export*from"./ui/index.js";export*from"./integration/index.js";
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e,Fragment as i}from"react/jsx-runtime";import r from"mui-modal-provider";import{memo as n,useCallback as t,useMemo as a}from"react";import{match as d}from"ts-pattern";import{InvalidAccessKeyError as s}from"#package/client";import{BuiltInLoadingPhase as u,CommonAnalyticsFactory as l,DomainLifecycleBoundary as m,LoadedDataProvider as c,useAccessService as f,useAnalyticsService as p,useAuthorizedClient as g,useConfiguratorDomainFactory as v,useConfiguratorLoadStatus as w,useConfiguratorRawLoadedData as y,useExpectPhase as h,useLoadedDataActions as I,useLoadingError as C,useLoadingPhase as b,useLogger as j,useRoutingService as x}from"#package/react-sdk";import{IntegrationSubscription as k,OnConfiguratorReadyProvider as L,ViewportStateSync as U,useLayoutSystemConfig as M}from"../configurator-context/index.js";import{Layout as S,Legacy as E}from"../ui/index.js";import{LayoutCustomOwnerUi as F,LayoutCustomReadUi as R,LayoutDialog as D}from"../ui/phoenix-layout-elements/index.js";import{ConfiguratorNotFoundPage as T}from"./ConfiguratorNotFoundPage.js";import{DevContextFallback as P}from"./error-boundaries/DevContextFallback.js";import{DevLoadingFallback as A}from"./error-boundaries/DevLoadingFallback.js";import{LoadingErrorBoundary as O}from"./error-boundaries/LoadingErrorBoundary.js";import{useLoad as V}from"./use-load.js";let q=n(n=>{let{viewMode:t}=n,s=M(),{ownerUi:u,readUi:l}=a(()=>d(s.layout).with("simple",()=>({ownerUi:o(E.SimpleOwnerLayout,{}),readUi:o(E.SummaryReadLayout,{})})).with("tabs",()=>({ownerUi:o(E.TabsOwnerLayout,{}),readUi:o(E.SummaryReadLayout,{})})).with("steps",()=>({ownerUi:o(E.StepsOwnerLayout,{}),readUi:o(E.SummaryReadLayout,{})})).with("universal",()=>({ownerUi:o(S,{}),readUi:o(S,{})})).with("custom",()=>({ownerUi:o(F,{}),readUi:o(R,{})})).exhaustive(),[s.layout]);return o(r,{children:e(L,{children:[t?l:u,"universal"===s.layout&&e(i,{children:[o(E.CommonFinalizePage,{}),o(D,{})]})]})})});export const LoadedConfiguratorDetailPage=()=>{h(u.SceneAssets);let{configurationId:i,accessInfo:r}=f(),n=g(),a=x(),d=j(),L=p(),{startConfiguratorLoad:M,completeConfiguratorLoad:S,failConfiguratorLoad:E,resetConfiguratorLoad:F}=I(),{isLoading:R,isError:D}=w(),z=y(),B=v(),G=t(()=>r.viewMode&&void 0!==r.revisionId?n.getConfigurationRevision(i,r.revisionId):n.getConfiguration(i),[r.revisionId,r.viewMode,n,i]),N=t(()=>{M()},[M]),H=t(o=>{S({initialRevisionId:o.revisionId,initialEntities:o.data,modelVersion:o.modelVersion,rootEntityType:o.rootEntityType,schemaIdentity:B}),L.push(l.ConfigurationLoaded(o.configurationId,o.revisionId,r.viewMode?"read":"owner")),d.appendToGlobalContext({configurationId:o.configurationId,revisionId:o.revisionId,mode:r.viewMode}),d.info("Configuration loaded.")},[r.viewMode,L,S,B,d]),J=t(o=>{if(E(o),o instanceof s)return void a.rejectAccessToken(i,r.raw);let e=o instanceof Error?o:Error("Configuration loading failed with an unknown error.",{cause:o});d.error("Configuration loading failed because the API request did not succeed. Verify the configuration ID and access token.",{configurationId:i},e)},[r.raw,i,E,d,a]),K=t(()=>{F()},[F]);return(V({key:[n,i,r.revisionId,r.viewMode],load:G,onStart:N,onSuccess:H,onError:J,onCleanup:K}),b({id:u.DataFetch,label:"Loading configuration…"},R),C(D),D)?o(T,{}):null===z?null:o(c,{value:z,children:o(O,{fallbackRender:e=>o(A,{...e}),children:o(m,{type:"configurator",children:o(O,{FallbackComponent:P,children:e(k,{children:[o(U,{}),o(q,{viewMode:r.viewMode})]})})})})})};
1
+ import{jsx as e,jsxs as o,Fragment as i}from"react/jsx-runtime";import r from"mui-modal-provider";import{memo as n,useCallback as t,useEffect as a,useMemo as d}from"react";import{match as s}from"ts-pattern";import{InvalidAccessKeyError as l}from"#package/client";import{BuiltInLoadingPhase as u,CommonAnalyticsFactory as m,DomainLifecycleBoundary as c,LoadedDataProvider as f,useAccessService as p,useAnalyticsService as g,useAuthorizedClient as v,useConfiguratorDomainFactory as w,useConfiguratorLoadStatus as y,useConfiguratorRawLoadedData as h,useExpectPhase as I,useLoadedDataActions as j,useLoadingError as x,useLoadingPhase as C,useLogger as b,useRoutingService as k,useSpecAssistant as L}from"#package/react-sdk";import{useConfigurator as U}from"../application-runtime/index.js";import{IntegrationSubscription as M,OnConfiguratorReadyProvider as S,ViewportStateSync as E,useLayoutSystemConfig as F}from"../configurator-context/index.js";import{Layout as R,Legacy as D}from"../ui/index.js";import{LayoutCustomOwnerUi as T,LayoutCustomReadUi as P,LayoutDialog as A}from"../ui/phoenix-layout-elements/index.js";import{ConfiguratorNotFoundPage as O}from"./ConfiguratorNotFoundPage.js";import{DevContextFallback as V}from"./error-boundaries/DevContextFallback.js";import{DevLoadingFallback as q}from"./error-boundaries/DevLoadingFallback.js";import{LoadingErrorBoundary as z}from"./error-boundaries/LoadingErrorBoundary.js";import{useLoad as B}from"./use-load.js";let G=n(n=>{let{viewMode:t}=n,l=F();(()=>{let{assistantSystem:e}=U(),o=null!=L();a(()=>{if(o)return e.activate()},[e,o])})();let{ownerUi:u,readUi:m}=d(()=>s(l.layout).with("simple",()=>({ownerUi:e(D.SimpleOwnerLayout,{}),readUi:e(D.SummaryReadLayout,{})})).with("tabs",()=>({ownerUi:e(D.TabsOwnerLayout,{}),readUi:e(D.SummaryReadLayout,{})})).with("steps",()=>({ownerUi:e(D.StepsOwnerLayout,{}),readUi:e(D.SummaryReadLayout,{})})).with("universal",()=>({ownerUi:e(R,{}),readUi:e(R,{})})).with("custom",()=>({ownerUi:e(T,{}),readUi:e(P,{})})).exhaustive(),[l.layout]);return e(r,{children:o(S,{children:[t?m:u,"universal"===l.layout&&o(i,{children:[e(D.CommonFinalizePage,{}),e(A,{})]})]})})});export const LoadedConfiguratorDetailPage=()=>{I(u.SceneAssets);let{configurationId:i,accessInfo:r}=p(),n=v(),a=k(),d=b(),s=g(),{startConfiguratorLoad:L,completeConfiguratorLoad:U,failConfiguratorLoad:S,resetConfiguratorLoad:F}=j(),{isLoading:R,isError:D}=y(),T=h(),P=w(),A=t(()=>r.viewMode&&void 0!==r.revisionId?n.getConfigurationRevision(i,r.revisionId):n.getConfiguration(i),[r.revisionId,r.viewMode,n,i]),N=t(()=>{L()},[L]),H=t(e=>{U({initialRevisionId:e.revisionId,initialEntities:e.data,modelVersion:e.modelVersion,rootEntityType:e.rootEntityType,schemaIdentity:P}),s.push(m.ConfigurationLoaded(e.configurationId,e.revisionId,r.viewMode?"read":"owner")),d.appendToGlobalContext({configurationId:e.configurationId,revisionId:e.revisionId,mode:r.viewMode}),d.info("Configuration loaded.")},[r.viewMode,s,U,P,d]),J=t(e=>{if(S(e),e instanceof l)return void a.rejectAccessToken(i,r.raw);let o=e instanceof Error?e:Error("Configuration loading failed with an unknown error.",{cause:e});d.error("Configuration loading failed because the API request did not succeed. Verify the configuration ID and access token.",{configurationId:i},o)},[r.raw,i,S,d,a]),K=t(()=>{F()},[F]);return(B({key:[n,i,r.revisionId,r.viewMode],load:A,onStart:N,onSuccess:H,onError:J,onCleanup:K}),C({id:u.DataFetch,label:"Loading configuration…"},R),x(D),D)?e(O,{}):null===T?null:e(f,{value:T,children:e(z,{fallbackRender:o=>e(q,{...o}),children:e(c,{type:"configurator",children:e(z,{FallbackComponent:V,children:o(M,{children:[e(E,{}),e(G,{viewMode:r.viewMode})]})})})})})};
@@ -1,5 +1,5 @@
1
- declare const PerspectiveCameraDragEvent: () => import("../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
2
- declare const OrthographicCameraDragEvent: () => import("../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
1
+ declare const PerspectiveCameraDragEvent: () => import("#package/domain").UserActionEvent;
2
+ declare const OrthographicCameraDragEvent: () => import("#package/domain").UserActionEvent;
3
3
  export declare const SceneAnalyticsFactory: {
4
4
  PerspectiveCameraDragEvent: typeof PerspectiveCameraDragEvent;
5
5
  OrthographicCameraDragEvent: typeof OrthographicCameraDragEvent;
@@ -0,0 +1,11 @@
1
+ import type { AssistantToolItem } from './thread-items.js';
2
+ export interface AssistantToolChipsProps {
3
+ readonly tools: readonly AssistantToolItem[];
4
+ /** True while the reply runs and this row is its newest block: the assistant is at work on it. */
5
+ readonly isActive: boolean;
6
+ }
7
+ /**
8
+ * A row of notes on what the assistant did in a reply, one per tool call. A click on a note logs
9
+ * the input and the result of its call to the console.
10
+ */
11
+ export declare const AssistantToolChips: import("react").MemoExoticComponent<({ tools, isActive }: AssistantToolChipsProps) => import("react/jsx-runtime").JSX.Element>;
@@ -0,0 +1 @@
1
+ import{jsx as t,jsxs as e}from"react/jsx-runtime";import{Tooltip as a,styled as i}from"@mui/material";import{memo as s,useCallback as o}from"react";import{match as n}from"ts-pattern";import{useLocalizable as r}from"#package/react-sdk";import{PhxIcon as l}from"#package/ui-sdk";import{AssistantPanelName as d}from"./theme.js";let m={id:"sdk.assistant.tool.updateDesign.label",message:"Update design"},c={id:"sdk.assistant.tool.readDesign.label",message:"Read design"},p={id:"sdk.assistant.tool.mistake.hint",message:"The assistant made a mistake."},h={id:"sdk.assistant.tool.cancelled.hint",message:"Stopped before it finished."},g={id:"sdk.assistant.tool.noResult.hint",message:"The result of this step was lost. It may or may not have been done."},f={id:"sdk.assistant.tool.toolBudget.hint",message:"Not done: the assistant reached its limit of steps for one message."},u=i("div",{name:d,slot:"chips"})(({theme:{palette:t,spacing:e,typography:a}})=>({...a.caption,alignItems:"start",color:t.text.secondary,display:"grid",gap:e(.75),gridTemplateColumns:"min-content minmax(0, 1fr)"})),k=i("span",{name:d,slot:"activity"})(({theme:{typography:t}})=>({blockSize:`calc(${t.caption.lineHeight} * 1em)`,display:"grid",placeItems:"center"})),x=i(l,{name:d,slot:"activityIcon"})({fontSize:14,'[data-chips="active"] &':{animation:"phx-assistant-turn 2.4s linear infinite","@media (prefers-reduced-motion: reduce)":{animation:"none"}},"@keyframes phx-assistant-turn":{to:{rotate:"360deg"}}}),w=i("span",{name:d,slot:"chip"})(({theme:{palette:t,spacing:e}})=>({cursor:"default",display:"inline-block",whiteSpace:"nowrap","&:not(:last-child)::after":{color:t.text.secondary,content:'"\xb7"',display:"inline-block",marginInline:e(.75),textDecoration:"none"},'&[data-chip="failed"]':{color:t.error.main},'&[data-chip="flawed"]':{textDecoration:"line-through",textDecorationColor:t.error.main}})),y=s(({tool:e})=>{let{chip:i,input:s,result:l}=e,d=r(m),u=r(c),k=r(p),x=r(h),y=r(g),b=r(f),v=n(i.label).with({kind:"text"},({text:t})=>t).with({kind:"updateDesign"},()=>d).with({kind:"readDesign"},()=>u).exhaustive(),C=o(()=>{console.info(`Assistant tool call "${v}"`,{input:s,result:l})},[s,v,l]);return t(a,{title:n(i).with({errorCode:"cancelled"},()=>x).with({errorCode:"no_result"},()=>y).with({errorCode:"tool_budget"},()=>b).with({state:"failed"},{state:"flawed"},()=>k).otherwise(()=>""),placement:"top-start",children:t(w,{onClick:C,"data-chip":i.state,children:v})})});export const AssistantToolChips=s(({tools:a,isActive:i})=>e(u,{"data-chips":i?"active":"done","aria-busy":i,children:[t(k,{children:t(x,{name:"Gear"})}),t("div",{children:a.map(e=>t(y,{tool:e},e.id))})]}));
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The message input of the panel. Enter sends and Shift+Enter adds a line. While a reply runs the
3
+ * send control is a Stop control and the input stays editable, so the next message can be written.
4
+ * A thread this session may not continue takes a message like any other: it is resumed first, with
5
+ * the input read-only meanwhile, and the message stays in the input when that fails.
6
+ */
7
+ export declare const AssistantComposer: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as a}from"react/jsx-runtime";import{Trans as r}from"@lingui/react";import{IconButton as i,InputBase as o,Tooltip as t,styled as n}from"@mui/material";import{useCallback as s,useRef as l,useState as d}from"react";import{useEagerObservableSelector as m,useLocalizable as p}from"#package/react-sdk";import{PhxIcon as c,useResponsive as u}from"#package/ui-sdk";import{useConfigurator as g}from"../../application-runtime/index.js";import{AssistantPanelName as h}from"./theme.js";let b={id:"sdk.assistant.composer.placeholder",message:"Ask or tell me what to change…"},k={id:"sdk.assistant.composer.send.label",message:"Send"},f={id:"sdk.assistant.composer.stop.label",message:"Stop"},y=n("form",{name:h,slot:"composer"})(({theme:{palette:e,spacing:a}})=>({borderBlockStart:`1px solid ${e.divider}`,display:"grid",gap:a(.75),paddingBlock:a(1.25),paddingInline:`var(--phx-sidebar-padding, ${a(2)})`})),x=n("div",{name:h,slot:"inputFrame"})(({theme:{palette:e,spacing:a}})=>({alignItems:"flex-end",border:`1px solid ${e.divider}`,borderRadius:12,display:"flex",gap:a(1),paddingBlock:a(.5),paddingInline:`${a(1.5)} ${a(.5)}`,"&:focus-within":{borderColor:e.primary.main}})),v=n(o,{name:h,slot:"input"})(({theme:{spacing:e,typography:a}})=>({...a.body2,flex:1,paddingBlock:e(.75)})),R=n(i,{name:h,slot:"sendButton"})(({theme:{palette:e}})=>({background:e.primary.main,borderRadius:8,color:e.primary.contrastText,"&:hover":{background:e.primary.dark},"&.Mui-disabled":{background:e.action.disabledBackground,color:e.action.disabled}})),B=n(i,{name:h,slot:"stopButton"})(({theme:{palette:e}})=>({background:e.text.primary,borderRadius:8,color:e.background.paper,"&:hover":{background:e.text.secondary}})),C=n("span")({background:"currentColor",blockSize:10,borderRadius:2,inlineSize:10,margin:5}),S=n("div",{name:h,slot:"hint"})(({theme:{palette:e,typography:a}})=>({...a.caption,color:e.text.secondary}));export const AssistantComposer=()=>{let{assistantSystem:i}=g(),[o,n]=d(""),h=l(null),{isDesktop:w}=u(),I=p(b),$=p(k),j=p(f),{isReplying:z,isResuming:F}=m(i.chat$,e=>({isReplying:e.isLoading,isResuming:e.isResuming}),[]),A=o.trim(),D=!z&&!F&&A.length>0,P=s(async()=>{!D||(w||h.current?.blur(),await i.resume()&&(n(""),i.send(A)))},[i,D,A,w]),E=s(e=>{e.preventDefault(),P()},[P]),K=s(e=>{"Enter"!==e.key||e.shiftKey||e.nativeEvent.isComposing||(e.preventDefault(),P())},[P]),T=s(()=>{i.stop()},[i]);return a(y,{onSubmit:E,children:[a(x,{children:[e(v,{multiline:!0,maxRows:6,placeholder:I,value:o,readOnly:F,inputRef:h,onChange:e=>n(e.target.value),onKeyDown:K,onFocus:()=>i.setInputFocused(!0),onBlur:()=>i.setInputFocused(!1),inputProps:{"aria-label":I}}),z?e(t,{title:j,placement:"top",children:e(B,{size:"small","aria-label":j,onClick:T,children:e(C,{})})}):e(t,{title:$,placement:"top",children:e("span",{children:e(R,{type:"submit",size:"small","aria-label":$,disabled:!D,children:e(c,{name:"PaperPlaneRightBold",fontSize:"small"})})})})]}),e(S,{children:e(r,{id:"sdk.assistant.composer.disclaimer",message:"AI can be wrong. Check the result."})})]})};
@@ -0,0 +1,7 @@
1
+ export interface AssistantMarkdownProps {
2
+ readonly markdown: string;
3
+ /** True while the text is still arriving, so markup the model has not finished is completed. */
4
+ readonly isStreaming: boolean;
5
+ }
6
+ /** Assistant text of the thread: Markdown with lists, tables, links and code, without a bubble. */
7
+ export declare const AssistantMarkdown: import("react").MemoExoticComponent<({ markdown, isStreaming }: AssistantMarkdownProps) => import("react/jsx-runtime").JSX.Element>;
@@ -0,0 +1 @@
1
+ import{jsx as r}from"react/jsx-runtime";import{styled as e}from"@mui/material";import{memo as o}from"react";import a from"react-markdown";import i from"remark-gfm";import{completeStreamedMarkdown as n}from"./streamed-markdown.js";import{AssistantPanelName as t}from"./theme.js";let l=e("div",{name:t,slot:"assistantMessage"})(({theme:{palette:r,shape:e,spacing:o,typography:a}})=>({overflowWrap:"anywhere","& > :first-child":{marginBlockStart:0},"& > :last-child":{marginBlockEnd:0},"p, ul, ol, pre, blockquote":{marginBlock:o(1)},"h1, h2, h3, h4, h5, h6":{...a.subtitle2,marginBlock:o(1.5,.5)},"ul, ol":{paddingInlineStart:o(2.5)},a:{color:r.primary.main},code:{background:r.action.hover,borderRadius:e.borderRadius/2,fontFamily:"ui-monospace, Menlo, monospace",fontSize:"0.9em",paddingInline:o(.5)},pre:{background:r.action.hover,borderRadius:e.borderRadius,overflowX:"auto",padding:o(1),code:{background:"none",padding:0}},blockquote:{borderInlineStart:`2px solid ${r.divider}`,color:r.text.secondary,marginInline:0,paddingInlineStart:o(1.5)},"th, td":{borderBlockEnd:`1px solid ${r.divider}`,padding:o(.5,1),textAlign:"start",verticalAlign:"top"}})),d=e("div")({overflowX:"auto",table:{borderCollapse:"collapse",inlineSize:"100%"}}),m={a:({node:e,children:o,...a})=>r("a",{...a,target:"_blank",rel:"noopener noreferrer",children:o}),table:({node:e,children:o,...a})=>r(d,{children:r("table",{...a,children:o})})},s=[i],c=["img"];export const AssistantMarkdown=o(({markdown:e,isStreaming:o})=>r(l,{children:r(a,{components:m,remarkPlugins:s,disallowedElements:c,children:o?n(e):e})}));
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The attribute the panel carries on its root. The layouts key their styles on it: what the panel
3
+ * covers is hidden, and a sidebar shorter than its slot is stretched to the height the panel needs.
4
+ */
5
+ export declare const ASSISTANT_PANEL_SLOT = "slot[assistant]";
6
+ /**
7
+ * The built-in assistant panel: a header with the title and a close control, the thread and the
8
+ * composer. It covers the sidebar it is rendered in, and renders nothing while it is closed or when
9
+ * the application spec has no `assistant` section.
10
+ */
11
+ export declare const AssistantPanel: () => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{IconButton as s,Tooltip as a,Typography as i,styled as n}from"@mui/material";import{useCallback as r}from"react";import{useLocalizable as o}from"#package/react-sdk";import{PhxIcon as l}from"#package/ui-sdk";import{useConfigurator as m}from"../../application-runtime/index.js";import{AssistantComposer as d}from"./AssistantComposer.js";import{AssistantThread as p}from"./AssistantThread.js";import{AssistantPanelName as c}from"./theme.js";import{useIsAssistantPanelOpen as u}from"./use-is-assistant-panel-open.js";let b={id:"sdk.assistant.panel.title",message:"Assistant"},f={id:"sdk.assistant.panel.close.label",message:"Close assistant"};export const ASSISTANT_PANEL_SLOT="slot[assistant]";let g=n("section",{name:c,slot:"root"})(({theme:{palette:e}})=>({background:`var(--phx-sidebar-background, ${e.background.paper})`,border:"var(--phx-sidebar-border, 0)",borderRadius:"inherit",display:"grid",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",inset:0,overflow:"hidden",position:"absolute",zIndex:1})),h=n("header",{name:c,slot:"header"})(({theme:{palette:e,spacing:t}})=>({alignItems:"center",borderBlockEnd:`1px solid ${e.divider}`,display:"flex",gap:t(1),justifyContent:"space-between",paddingBlock:t(1),paddingInline:`var(--phx-sidebar-padding, ${t(2)}) ${t(1)}`})),x=n(i,{name:c,slot:"title"})({fontWeight:600}),k=n(s,{name:c,slot:"closeButton"})({}),j=e=>{e.target instanceof Element&&e.target.closest("button")&&e.preventDefault()};export const AssistantPanel=()=>{let{assistantSystem:s}=m(),i=u(),n=o(b),c=o(f),v=r(()=>{s.setOpen(!1)},[s]);return i?t(g,{"data-sidebar":"slot[assistant]","aria-label":n,onMouseDown:j,children:[t(h,{children:[e(x,{variant:"subtitle1",component:"h2",children:n}),e(a,{title:c,placement:"top",children:e(k,{size:"small","aria-label":c,onClick:v,children:e(l,{name:"X"})})})]}),e(p,{}),e(d,{})]}):null};