@salsita-ai/sdk 0.50.0-develop.f16492b14e → 0.50.0-develop.f354d3576d

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 (884) hide show
  1. package/README.md +4 -2
  2. package/dist/admin/AdminShell.js +1 -1
  3. package/dist/admin/common/admin-interface.d.ts +1 -1
  4. package/dist/admin/legacy-admin/Application.js +1 -1
  5. package/dist/application-spec/caching/index.d.ts +6 -1
  6. package/dist/application-spec/caching/index.js +1 -1
  7. package/dist/application-spec/errors/diagnostic-codes.d.ts +1 -0
  8. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  9. package/dist/application-spec/errors/diagnostic-messages.d.ts +1 -0
  10. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  11. package/dist/application-spec/generate-application/code/domain-runtime-files.d.ts +0 -19
  12. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  13. package/dist/application-spec/generate-application/code/templates/gitignore.js +2 -1
  14. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -1
  15. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  16. package/dist/application-spec/generate-application/code/templates/lingui-rc.js +5 -4
  17. package/dist/application-spec/generate-application/code/templates/skills/core/cli.d.ts +2 -0
  18. package/dist/application-spec/generate-application/code/templates/skills/core/cli.js +1 -0
  19. package/dist/application-spec/generate-application/code/templates/skills/core/index.d.ts +3 -0
  20. package/dist/application-spec/generate-application/code/templates/skills/core/index.js +1 -0
  21. package/dist/application-spec/generate-application/code/templates/skills/core/sdk.d.ts +2 -0
  22. package/dist/application-spec/generate-application/code/templates/skills/core/sdk.js +118 -0
  23. package/dist/application-spec/generate-application/code/templates/skills/core/workflow.d.ts +2 -0
  24. package/dist/application-spec/generate-application/code/templates/skills/core/workflow.js +44 -0
  25. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/application-states.d.ts +3 -0
  26. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/application-states.js +3 -0
  27. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/index.d.ts +1 -0
  28. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/index.js +1 -0
  29. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/navigation.d.ts +3 -0
  30. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/navigation.js +48 -0
  31. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/presets.d.ts +3 -0
  32. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/presets.js +38 -0
  33. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/selection.d.ts +3 -0
  34. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/selection.js +35 -0
  35. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/views-and-tools.d.ts +3 -0
  36. package/dist/application-spec/generate-application/code/templates/skills/features/application-states/views-and-tools.js +61 -0
  37. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/custom-layout.d.ts +3 -0
  38. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/custom-layout.js +7 -0
  39. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/finalization-actions.d.ts +3 -0
  40. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/finalization-actions.js +79 -0
  41. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/index.d.ts +1 -0
  42. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/index.js +1 -0
  43. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/messages.d.ts +3 -0
  44. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/messages.js +52 -0
  45. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/pages.d.ts +3 -0
  46. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/pages.js +49 -0
  47. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/scene-and-safe-area.d.ts +3 -0
  48. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/scene-and-safe-area.js +62 -0
  49. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/slots.d.ts +3 -0
  50. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/slots.js +40 -0
  51. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/tabs-and-steps.d.ts +3 -0
  52. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/tabs-and-steps.js +65 -0
  53. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/toolbar-actions.d.ts +3 -0
  54. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/toolbar-actions.js +58 -0
  55. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/view-mode.d.ts +3 -0
  56. package/dist/application-spec/generate-application/code/templates/skills/features/custom-layout/view-mode.js +41 -0
  57. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/control-components.d.ts +3 -0
  58. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/control-components.js +24 -0
  59. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/control-hooks.d.ts +3 -0
  60. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/control-hooks.js +44 -0
  61. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/custom-controls.d.ts +3 -0
  62. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/custom-controls.js +74 -0
  63. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/domain-controls.d.ts +3 -0
  64. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/domain-controls.js +8 -0
  65. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/index.d.ts +1 -0
  66. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/index.js +1 -0
  67. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/scene-controls.d.ts +3 -0
  68. package/dist/application-spec/generate-application/code/templates/skills/features/domain-controls/scene-controls.js +48 -0
  69. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/actions.d.ts +3 -0
  70. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/actions.js +64 -0
  71. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/components.d.ts +3 -0
  72. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/components.js +62 -0
  73. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/domain-model.d.ts +3 -0
  74. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/domain-model.js +1 -0
  75. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/entities-and-relations.d.ts +3 -0
  76. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/entities-and-relations.js +59 -0
  77. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/expressions.d.ts +3 -0
  78. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/expressions.js +46 -0
  79. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/index.d.ts +1 -0
  80. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/index.js +1 -0
  81. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/transformers.d.ts +3 -0
  82. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/transformers.js +43 -0
  83. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/validation-and-repair.d.ts +3 -0
  84. package/dist/application-spec/generate-application/code/templates/skills/features/domain-model/validation-and-repair.js +30 -0
  85. package/dist/application-spec/generate-application/code/templates/skills/features/features.d.ts +3 -0
  86. package/dist/application-spec/generate-application/code/templates/skills/features/features.js +1 -0
  87. package/dist/application-spec/generate-application/code/templates/skills/features/index.d.ts +1 -0
  88. package/dist/application-spec/generate-application/code/templates/skills/features/index.js +1 -0
  89. package/dist/application-spec/generate-application/code/templates/skills/features/inspection.d.ts +2 -0
  90. package/dist/application-spec/generate-application/code/templates/skills/features/inspection.js +1 -0
  91. package/dist/application-spec/generate-application/code/templates/skills/features/localization.d.ts +3 -0
  92. package/dist/application-spec/generate-application/code/templates/skills/features/localization.js +87 -0
  93. package/dist/application-spec/generate-application/code/templates/skills/features/scene-objects.d.ts +3 -0
  94. package/dist/application-spec/generate-application/code/templates/skills/features/scene-objects.js +43 -0
  95. package/dist/application-spec/generate-application/code/templates/skills/features/state/index.d.ts +1 -0
  96. package/dist/application-spec/generate-application/code/templates/skills/features/state/index.js +1 -0
  97. package/dist/application-spec/generate-application/code/templates/skills/features/state/slices.d.ts +3 -0
  98. package/dist/application-spec/generate-application/code/templates/skills/features/state/slices.js +48 -0
  99. package/dist/application-spec/generate-application/code/templates/skills/features/state/state.d.ts +3 -0
  100. package/dist/application-spec/generate-application/code/templates/skills/features/state/state.js +1 -0
  101. package/dist/application-spec/generate-application/code/templates/skills/features/state/updates.d.ts +3 -0
  102. package/dist/application-spec/generate-application/code/templates/skills/features/state/updates.js +39 -0
  103. package/dist/application-spec/generate-application/code/templates/skills/features/state/violations.d.ts +3 -0
  104. package/dist/application-spec/generate-application/code/templates/skills/features/state/violations.js +36 -0
  105. package/dist/application-spec/generate-application/code/templates/skills/features/variants.d.ts +2 -0
  106. package/dist/application-spec/generate-application/code/templates/skills/features/variants.js +1 -0
  107. package/dist/application-spec/generate-application/code/templates/skills/features/webhooks.d.ts +2 -0
  108. package/dist/application-spec/generate-application/code/templates/skills/features/webhooks.js +1 -0
  109. package/dist/application-spec/generate-application/code/templates/skills/guide.d.ts +68 -0
  110. package/dist/application-spec/generate-application/code/templates/skills/guide.js +18 -0
  111. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill-bundle.d.ts +2 -2
  112. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill-bundle.js +12 -5
  113. package/dist/application-spec/generate-application/code/templates/skills/phx-members-without-guide.d.ts +9 -0
  114. package/dist/application-spec/generate-application/code/templates/skills/phx-members-without-guide.js +1 -0
  115. package/dist/application-spec/generate-application/code/templates/skills/processes/asset-conversion.d.ts +2 -0
  116. package/dist/application-spec/generate-application/code/templates/skills/processes/asset-conversion.js +23 -0
  117. package/dist/application-spec/generate-application/code/templates/skills/{phoenix-skill.d.ts → processes/beta.d.ts} +2 -1
  118. package/dist/application-spec/generate-application/code/templates/skills/processes/beta.js +4 -0
  119. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/evaluate.d.ts +2 -0
  120. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/evaluate.js +38 -0
  121. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/feedback.d.ts +3 -0
  122. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/feedback.js +1 -0
  123. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/index.d.ts +1 -0
  124. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/index.js +1 -0
  125. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/report.d.ts +2 -0
  126. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/report.js +7 -0
  127. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/send.d.ts +2 -0
  128. package/dist/application-spec/generate-application/code/templates/skills/processes/feedback/send.js +2 -0
  129. package/dist/application-spec/generate-application/code/templates/skills/processes/finalization.d.ts +2 -0
  130. package/dist/application-spec/generate-application/code/templates/skills/processes/finalization.js +2 -0
  131. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/build.d.ts +2 -0
  132. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/build.js +25 -0
  133. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/direction.d.ts +2 -0
  134. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/direction.js +35 -0
  135. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/first-draft.d.ts +3 -0
  136. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/first-draft.js +3 -0
  137. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/handoff.d.ts +2 -0
  138. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/handoff.js +9 -0
  139. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/index.d.ts +1 -0
  140. package/dist/application-spec/generate-application/code/templates/skills/processes/first-draft/index.js +1 -0
  141. package/dist/application-spec/generate-application/code/templates/skills/processes/index.d.ts +8 -0
  142. package/dist/application-spec/generate-application/code/templates/skills/processes/index.js +1 -0
  143. package/dist/application-spec/generate-application/code/templates/skills/processes/model-migration.d.ts +2 -0
  144. package/dist/application-spec/generate-application/code/templates/skills/processes/model-migration.js +1 -0
  145. package/dist/application-spec/generate-application/code/templates/skills/processes/review/appearance.d.ts +2 -0
  146. package/dist/application-spec/generate-application/code/templates/skills/processes/review/appearance.js +46 -0
  147. package/dist/application-spec/generate-application/code/templates/skills/processes/review/code.d.ts +2 -0
  148. package/dist/application-spec/generate-application/code/templates/skills/processes/review/code.js +2 -0
  149. package/dist/application-spec/generate-application/code/templates/skills/processes/review/hand-over.d.ts +2 -0
  150. package/dist/application-spec/generate-application/code/templates/skills/processes/review/hand-over.js +6 -0
  151. package/dist/application-spec/generate-application/code/templates/skills/processes/review/index.d.ts +1 -0
  152. package/dist/application-spec/generate-application/code/templates/skills/processes/review/index.js +1 -0
  153. package/dist/application-spec/generate-application/code/templates/skills/processes/review/review.d.ts +3 -0
  154. package/dist/application-spec/generate-application/code/templates/skills/processes/review/review.js +1 -0
  155. package/dist/application-spec/generate-application/code/templates/skills/processes/review/visual-inspection.d.ts +2 -0
  156. package/dist/application-spec/generate-application/code/templates/skills/processes/review/visual-inspection.js +13 -0
  157. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/branding.d.ts +2 -0
  158. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/branding.js +20 -0
  159. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/catalog.d.ts +2 -0
  160. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/catalog.js +1 -0
  161. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/index.d.ts +1 -0
  162. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/index.js +1 -0
  163. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/product-definition.d.ts +2 -0
  164. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/product-definition.js +22 -0
  165. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/specification.d.ts +3 -0
  166. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/specification.js +1 -0
  167. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/ux-guidelines.d.ts +2 -0
  168. package/dist/application-spec/generate-application/code/templates/skills/processes/specification/ux-guidelines.js +25 -0
  169. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +51 -258
  170. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +3 -58
  171. package/dist/application-spec/generate-application/code/templates/skills/sdk-subpath-imports.d.ts +9 -0
  172. package/dist/application-spec/generate-application/code/templates/skills/sdk-subpath-imports.js +1 -0
  173. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.d.ts +1 -1
  174. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.js +1 -1
  175. package/dist/application-spec/generate-application/code/templates/story/wrapper.js +2 -4
  176. package/dist/application-spec/generate-application/code/templates/tsconfig.js +2 -1
  177. package/dist/application-spec/generate-application/index.d.ts +1 -8
  178. package/dist/application-spec/generate-application/index.js +1 -1
  179. package/dist/application-spec/parse-application-files/merge/merged-assistant.d.ts +1 -1
  180. package/dist/application-spec/parse-application-files/merge/merged-assistant.js +1 -1
  181. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  182. package/dist/client/authorized-client.d.ts +1 -1
  183. package/dist/client/authorized-client.js +1 -1
  184. package/dist/client/contract.d.ts +21 -8
  185. package/dist/client/contract.js +1 -1
  186. package/dist/client/phoenix-api.d.ts +43 -5
  187. package/dist/configurator/ConfiguratorApp.js +1 -1
  188. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  189. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-annotation.d.ts +31 -0
  190. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +123 -24
  191. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  192. package/dist/configurator/application-runtime/extensions/systems/camera-control-system/camera-control-system.d.ts +43 -0
  193. package/dist/configurator/application-runtime/extensions/systems/camera-control-system/camera-control-system.js +1 -1
  194. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +8 -2
  195. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  196. package/dist/configurator/application-runtime/extensions/systems/image-rendering-system/capture-next-frame.d.ts +10 -0
  197. package/dist/configurator/application-runtime/extensions/systems/image-rendering-system/capture-next-frame.js +1 -0
  198. package/dist/configurator/application-runtime/extensions/systems/image-rendering-system/image-rendering-system.d.ts +8 -0
  199. package/dist/configurator/application-runtime/extensions/systems/image-rendering-system/image-rendering-system.js +1 -1
  200. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +3 -2
  201. package/dist/configurator/application-runtime/extensions/systems/index.js +1 -1
  202. package/dist/configurator/common/configurator-interface.d.ts +1 -1
  203. package/dist/configurator/pages/default-configurator-elements.d.ts +6 -2
  204. package/dist/configurator/pages/default-configurator-elements.js +1 -1
  205. package/dist/configurator/pages/error-boundaries/BuiltInGeneralErrorFallback.d.ts +5 -0
  206. package/dist/configurator/pages/error-boundaries/BuiltInGeneralErrorFallback.js +1 -0
  207. package/dist/configurator/pages/error-boundaries/index.d.ts +1 -0
  208. package/dist/configurator/pages/error-boundaries/index.js +1 -1
  209. package/dist/configurator/pages/provider-slots/ContainerSlotProvider.d.ts +3 -0
  210. package/dist/configurator/pages/provider-slots/ContainerSlotProvider.js +1 -0
  211. package/dist/configurator/pages/provider-slots/LoaderSlotProvider.d.ts +3 -0
  212. package/dist/configurator/pages/provider-slots/LoaderSlotProvider.js +1 -0
  213. package/dist/configurator/pages/provider-slots/MessageHostSlotProvider.d.ts +3 -0
  214. package/dist/configurator/pages/provider-slots/MessageHostSlotProvider.js +1 -0
  215. package/dist/configurator/pages/provider-slots/SceneResourcesSlotProvider.d.ts +3 -0
  216. package/dist/configurator/pages/provider-slots/SceneResourcesSlotProvider.js +1 -0
  217. package/dist/configurator/pages/provider-slots/ThemeSlotProvider.d.ts +3 -0
  218. package/dist/configurator/pages/provider-slots/ThemeSlotProvider.js +1 -0
  219. package/dist/configurator/pages/provider-slots/configurator-provider-slot-elements.d.ts +3 -0
  220. package/dist/configurator/pages/provider-slots/configurator-provider-slot-elements.js +1 -0
  221. package/dist/configurator/pages/provider-slots/index.d.ts +6 -0
  222. package/dist/configurator/pages/provider-slots/index.js +1 -0
  223. package/dist/configurator/pages/ui-elements/BuiltInInvalidDeploymentReload.d.ts +2 -0
  224. package/dist/configurator/pages/ui-elements/BuiltInInvalidDeploymentReload.js +1 -0
  225. package/dist/configurator/pages/ui-elements/configurator-ui-elements.d.ts +3 -0
  226. package/dist/configurator/pages/ui-elements/configurator-ui-elements.js +1 -0
  227. package/dist/configurator/pages/ui-elements/index.d.ts +2 -0
  228. package/dist/configurator/pages/ui-elements/index.js +1 -0
  229. package/dist/configurator/scene/cameras/CameraPadding.js +1 -1
  230. package/dist/configurator/ui/assistant/AssistantChips.d.ts +10 -0
  231. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  232. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +6 -0
  233. package/dist/configurator/ui/assistant/AssistantComposer.js +2 -1
  234. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  235. package/dist/configurator/ui/assistant/AssistantThread.d.ts +4 -3
  236. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  237. package/dist/configurator/ui/assistant/alert/AssistantAlert.d.ts +4 -1
  238. package/dist/configurator/ui/assistant/alert/AssistantAlert.js +1 -1
  239. package/dist/configurator/ui/assistant/annotation/AnnotationBadge.d.ts +9 -0
  240. package/dist/configurator/ui/assistant/annotation/AnnotationBadge.js +1 -0
  241. package/dist/configurator/ui/assistant/annotation/AnnotationOverlay.d.ts +6 -0
  242. package/dist/configurator/ui/assistant/annotation/AnnotationOverlay.js +1 -0
  243. package/dist/configurator/ui/assistant/annotation/AnnotationPin.d.ts +14 -0
  244. package/dist/configurator/ui/assistant/annotation/AnnotationPin.js +1 -0
  245. package/dist/configurator/ui/assistant/annotation/AnnotationViewer.d.ts +12 -0
  246. package/dist/configurator/ui/assistant/annotation/AnnotationViewer.js +1 -0
  247. package/dist/configurator/ui/assistant/annotation/MessageAnnotations.d.ts +11 -0
  248. package/dist/configurator/ui/assistant/annotation/MessageAnnotations.js +1 -0
  249. package/dist/configurator/ui/assistant/annotation/annotation-host-context.d.ts +5 -0
  250. package/dist/configurator/ui/assistant/annotation/annotation-host-context.js +1 -0
  251. package/dist/configurator/ui/assistant/annotation/annotation-layout.d.ts +26 -0
  252. package/dist/configurator/ui/assistant/annotation/annotation-layout.js +1 -0
  253. package/dist/configurator/ui/assistant/annotation/editor/AnnotationComment.d.ts +15 -0
  254. package/dist/configurator/ui/assistant/annotation/editor/AnnotationComment.js +1 -0
  255. package/dist/configurator/ui/assistant/annotation/editor/AnnotationEditor.d.ts +18 -0
  256. package/dist/configurator/ui/assistant/annotation/editor/AnnotationEditor.js +1 -0
  257. package/dist/configurator/ui/assistant/annotation/editor/annotation-drawing.d.ts +22 -0
  258. package/dist/configurator/ui/assistant/annotation/editor/annotation-drawing.js +1 -0
  259. package/dist/configurator/ui/assistant/annotation/editor/annotation-pins.d.ts +22 -0
  260. package/dist/configurator/ui/assistant/annotation/editor/annotation-pins.js +1 -0
  261. package/dist/configurator/ui/assistant/annotation/editor/flatten-annotation.d.ts +17 -0
  262. package/dist/configurator/ui/assistant/annotation/editor/flatten-annotation.js +1 -0
  263. package/dist/configurator/ui/assistant/annotation/editor/index.d.ts +1 -0
  264. package/dist/configurator/ui/assistant/annotation/editor/index.js +1 -0
  265. package/dist/configurator/ui/assistant/annotation/index.d.ts +4 -0
  266. package/dist/configurator/ui/assistant/annotation/index.js +1 -0
  267. package/dist/configurator/ui/assistant/annotation/prefers-reduced-motion.d.ts +2 -0
  268. package/dist/configurator/ui/assistant/annotation/prefers-reduced-motion.js +1 -0
  269. package/dist/configurator/ui/assistant/annotation/use-end-on-unmount.d.ts +6 -0
  270. package/dist/configurator/ui/assistant/annotation/use-end-on-unmount.js +1 -0
  271. package/dist/configurator/ui/assistant/assistant-failure.d.ts +15 -7
  272. package/dist/configurator/ui/assistant/assistant-failure.js +1 -1
  273. package/dist/configurator/ui/assistant/attachments/MessageImages.d.ts +19 -0
  274. package/dist/configurator/ui/assistant/attachments/MessageImages.js +1 -0
  275. package/dist/configurator/ui/assistant/attachments/index.d.ts +2 -0
  276. package/dist/configurator/ui/assistant/attachments/index.js +1 -0
  277. package/dist/configurator/ui/assistant/attachments/prepare-image.d.ts +24 -0
  278. package/dist/configurator/ui/assistant/attachments/prepare-image.js +1 -0
  279. package/dist/configurator/ui/assistant/composer/composer-frame.d.ts +15 -0
  280. package/dist/configurator/ui/assistant/composer/composer-frame.js +1 -0
  281. package/dist/configurator/ui/assistant/composer/index.d.ts +1 -0
  282. package/dist/configurator/ui/assistant/composer/index.js +1 -0
  283. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -1
  284. package/dist/configurator/ui/assistant/form/AssistantForm.js +1 -1
  285. package/dist/configurator/ui/assistant/form/registry/built-in-form-elements.d.ts +26 -0
  286. package/dist/configurator/ui/assistant/form-elements/FormNumber.js +1 -1
  287. package/dist/configurator/ui/assistant/index.d.ts +1 -0
  288. package/dist/configurator/ui/assistant/index.js +1 -1
  289. package/dist/configurator/ui/assistant/popover/AssistantPopover.d.ts +24 -0
  290. package/dist/configurator/ui/assistant/popover/AssistantPopover.js +1 -0
  291. package/dist/configurator/ui/assistant/popover/index.d.ts +1 -0
  292. package/dist/configurator/ui/assistant/popover/index.js +1 -0
  293. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.js +1 -1
  294. package/dist/configurator/ui/assistant/reference-link/reference-styles.js +1 -1
  295. package/dist/configurator/ui/assistant/screenshots/index.d.ts +1 -0
  296. package/dist/configurator/ui/assistant/screenshots/index.js +1 -1
  297. package/dist/configurator/ui/assistant/screenshots/tool-screenshots.d.ts +3 -9
  298. package/dist/configurator/ui/assistant/screenshots/tool-screenshots.js +1 -1
  299. package/dist/configurator/ui/assistant/screenshots/use-screenshot-src.d.ts +4 -4
  300. package/dist/configurator/ui/assistant/screenshots/use-screenshot-src.js +1 -1
  301. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +11 -0
  302. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -2
  303. package/dist/configurator/ui/assistant/thread-items.d.ts +5 -0
  304. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  305. package/dist/configurator/ui/assistant/tool-chip.js +1 -1
  306. package/dist/configurator/ui/assistant/use-load-older-on-top.d.ts +22 -0
  307. package/dist/configurator/ui/assistant/use-load-older-on-top.js +1 -0
  308. package/dist/configurator/ui/configurator-layout/universal/Layout.js +1 -1
  309. package/dist/docs/3d-scene/animations-basic.mdx +0 -4
  310. package/dist/docs/3d-scene/camera-based-hiding.mdx +0 -2
  311. package/dist/docs/3d-scene/cameras/custom.mdx +0 -2
  312. package/dist/docs/3d-scene/cameras/fit-during-drag.mdx +0 -4
  313. package/dist/docs/3d-scene/cameras/locks.mdx +0 -4
  314. package/dist/docs/3d-scene/cameras/transitions.mdx +0 -2
  315. package/dist/docs/3d-scene/engraving.mdx +0 -4
  316. package/dist/docs/3d-scene/materials/custom.mdx +1 -2
  317. package/dist/docs/3d-scene/materials/inherit.mdx +0 -4
  318. package/dist/docs/3d-scene/materials/multilevel.mdx +0 -47
  319. package/dist/docs/3d-scene/materials/override.mdx +0 -4
  320. package/dist/docs/3d-scene/materials/simple.mdx +0 -4
  321. package/dist/docs/3d-scene/materials/transformer.mdx +0 -4
  322. package/dist/docs/3d-scene/materials/transition.mdx +0 -4
  323. package/dist/docs/3d-scene/materials/transmissive.mdx +0 -4
  324. package/dist/docs/3d-scene/postprocessing.mdx +0 -2
  325. package/dist/docs/3d-scene/rendering/basic.mdx +5 -9
  326. package/dist/docs/3d-scene/rendering/custom-entity.mdx +0 -6
  327. package/dist/docs/3d-scene/rendering/lights/ambient-light.mdx +0 -2
  328. package/dist/docs/3d-scene/rendering/lights/directional-light.mdx +0 -2
  329. package/dist/docs/3d-scene/rendering/lights/point-light.mdx +0 -2
  330. package/dist/docs/3d-scene/rendering/lights/rect-area-light.mdx +0 -2
  331. package/dist/docs/3d-scene/rendering/lights/spot-light.mdx +0 -2
  332. package/dist/docs/3d-scene/rendering/object-groups.mdx +0 -2
  333. package/dist/docs/3d-scene/rendering/objects.mdx +0 -4
  334. package/dist/docs/3d-scene/rendering/scene-entity-object.mdx +0 -43
  335. package/dist/docs/3d-scene/rendering/smma.mdx +0 -2
  336. package/dist/docs/3d-scene/rendering/soft-shadows.mdx +0 -2
  337. package/dist/docs/3d-scene/rendering/transformer.mdx +1 -3
  338. package/dist/docs/complex-use-cases/custom-ui-on-root-level.mdx +0 -1
  339. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +19 -19
  340. package/dist/docs/complex-use-cases/navigation-guard.mdx +81 -19
  341. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +28 -65
  342. package/dist/docs/complex-use-cases/navigation-reset-undo.mdx +16 -20
  343. package/dist/docs/complex-use-cases/sketching.mdx +2 -10
  344. package/dist/docs/controls/custom.mdx +88 -87
  345. package/dist/docs/controls/manage-child-entities/entitychildrenlist.mdx +0 -4
  346. package/dist/docs/controls/nullable-attributes.mdx +0 -2
  347. package/dist/docs/controls/scene/custom-controls.mdx +7 -8
  348. package/dist/docs/controls/scene/html-hotspots.mdx +0 -4
  349. package/dist/docs/controls/scene/object-html-hotspots.mdx +0 -4
  350. package/dist/docs/controls/select-attribute/cardselect.mdx +0 -4
  351. package/dist/docs/controls/select-attribute/listselect.mdx +0 -4
  352. package/dist/docs/controls/select-attribute/select.mdx +0 -4
  353. package/dist/docs/controls/select-attribute/swatchselect.mdx +0 -4
  354. package/dist/docs/controls/select-attribute/switchselect.mdx +0 -4
  355. package/dist/docs/controls/select-attribute/toggleselect.mdx +0 -4
  356. package/dist/docs/controls/select-child-entity/cardselect.mdx +2 -6
  357. package/dist/docs/controls/select-child-entity/listselect.mdx +5 -11
  358. package/dist/docs/controls/select-child-entity/toggleselect.mdx +4 -10
  359. package/dist/docs/controls/text-input.mdx +90 -19
  360. package/dist/docs/demos/glass.mdx +0 -4
  361. package/dist/docs/demos/heater.mdx +0 -10
  362. package/dist/docs/demos/office-chair.mdx +0 -8
  363. package/dist/docs/demos/office-desk.mdx +0 -8
  364. package/dist/docs/demos/ring.mdx +0 -9
  365. package/dist/docs/dimensions/3d-scene-integration/angle-indicators.mdx +0 -2
  366. package/dist/docs/dimensions/3d-scene-integration/editable-angle-indicator.mdx +0 -2
  367. package/dist/docs/dimensions/3d-scene-integration/editable-distance-dimension-indicator.mdx +0 -2
  368. package/dist/docs/dimensions/3d-scene-integration/editable-offset-indicator.mdx +0 -6
  369. package/dist/docs/dimensions/3d-scene-integration/editable-size-indicator.mdx +0 -4
  370. package/dist/docs/dimensions/3d-scene-integration/list-selector-dimension-indicator.mdx +0 -4
  371. package/dist/docs/dimensions/3d-scene-integration/offset-indicator.mdx +0 -6
  372. package/dist/docs/dimensions/3d-scene-integration/overlap-offset-demo.mdx +0 -6
  373. package/dist/docs/dimensions/input-controls/distance-slider.mdx +6 -6
  374. package/dist/docs/dimensions/selection-controls/list-selector.mdx +0 -2
  375. package/dist/docs/dimensions/selection-controls/toggle-selector.mdx +0 -2
  376. package/dist/docs/drag-and-drop/drag-handle.mdx +0 -1
  377. package/dist/docs/drag-and-drop/hotspot-handle.mdx +0 -1
  378. package/dist/docs/drag-and-drop/no-selection.mdx +0 -1
  379. package/dist/docs/drag-and-drop/planes.mdx +0 -3
  380. package/dist/docs/drag-and-drop/room-planner.mdx +0 -6
  381. package/dist/docs/drag-and-drop/rotatable.mdx +0 -1
  382. package/dist/docs/drag-and-drop/snapping/auto-rotation-demo.mdx +0 -2
  383. package/dist/docs/drag-and-drop/snapping/label-matching-demo.mdx +0 -2
  384. package/dist/docs/drag-and-drop/snapping/multi-snap-composition-demo.mdx +0 -2
  385. package/dist/docs/drag-and-drop/snapping/nested-entity-demo.mdx +0 -2
  386. package/dist/docs/drag-and-drop/snapping/priority-demo.mdx +0 -2
  387. package/dist/docs/drag-and-drop/snapping/snap-axis-demo.mdx +0 -2
  388. package/dist/docs/drag-and-drop/snapping/snap-edge-demo.mdx +0 -2
  389. package/dist/docs/drag-and-drop/snapping/snap-plane-demo.mdx +0 -5
  390. package/dist/docs/drag-and-drop/snapping/snap-point-demo.mdx +0 -2
  391. package/dist/docs/drag-and-drop/spatial-constraints/collision-system.mdx +0 -2
  392. package/dist/docs/drag-and-drop/spatial-constraints/disjoint-and-within.mdx +0 -6
  393. package/dist/docs/drag-and-drop/spatial-constraints/geometry-override.mdx +0 -4
  394. package/dist/docs/drag-and-drop/spatial-constraints/multiple-collision-meshes.mdx +0 -4
  395. package/dist/docs/drag-and-drop/spatial-constraints/touches.mdx +0 -4
  396. package/dist/docs/drag-and-drop/swap.mdx +0 -4
  397. package/dist/docs/fabs/basic.mdx +8 -12
  398. package/dist/docs/fabs/layout.mdx +0 -7
  399. package/dist/docs/index.json +4 -4
  400. package/dist/docs/integrations/lifecycle-providers.mdx +0 -12
  401. package/dist/docs/integrations/onloadprovider.mdx +0 -3
  402. package/dist/docs/integrations/webcomponent-api/basics.mdx +2 -2
  403. package/dist/docs/integrations/webcomponent-api/preset-tags.mdx +0 -1
  404. package/dist/docs/layouts/custom-layout.mdx +1 -41
  405. package/dist/docs/layouts/custom-price.mdx +0 -2
  406. package/dist/docs/layouts/custom-theme-handler.mdx +0 -4
  407. package/dist/docs/layouts/gallery/ardent-compressor.mdx +3 -34
  408. package/dist/docs/layouts/gallery/corvid-drone.mdx +0 -29
  409. package/dist/docs/layouts/gallery/fenwick-window.mdx +0 -25
  410. package/dist/docs/layouts/gallery/ferrule-bar-station.mdx +0 -27
  411. package/dist/docs/layouts/gallery/kestrel-kettle.mdx +0 -29
  412. package/dist/docs/layouts/gallery/nightjar-guitar.mdx +2 -35
  413. package/dist/docs/layouts/gallery/sunfold-solar.mdx +0 -26
  414. package/dist/docs/layouts/gallery/tidepool-aquascape.mdx +0 -46
  415. package/dist/docs/layouts/header/custom.mdx +0 -2
  416. package/dist/docs/layouts/icon-sets.mdx +0 -6
  417. package/dist/docs/layouts/phoenix-elements.mdx +0 -4
  418. package/dist/docs/layouts/phoenix-handlers.mdx +19 -28
  419. package/dist/docs/layouts/presets/action-and-overlay.mdx +0 -8
  420. package/dist/docs/layouts/presets/custom.mdx +6 -13
  421. package/dist/docs/layouts/preview/always-expand.mdx +4 -14
  422. package/dist/docs/layouts/preview/always.mdx +4 -14
  423. package/dist/docs/layouts/preview/auto-presets.mdx +4 -14
  424. package/dist/docs/layouts/preview/auto.mdx +4 -14
  425. package/dist/docs/layouts/preview/never.mdx +4 -14
  426. package/dist/docs/layouts/sidebar/in-a-custom-layout.mdx +18 -13
  427. package/dist/docs/layouts/sidebar/property-page-stack.mdx +0 -2
  428. package/dist/docs/layouts/sidebar/property-page.mdx +0 -2
  429. package/dist/docs/layouts/sidebar/tabs.mdx +0 -4
  430. package/dist/docs/layouts/sidebar-footer/custom.mdx +0 -2
  431. package/dist/docs/layouts/sidebar-footer/universal.mdx +0 -10
  432. package/dist/docs/layouts/tool-controls.mdx +0 -1
  433. package/dist/docs/layouts/toolbar.mdx +0 -4
  434. package/dist/docs/layouts/universal.mdx +2 -10
  435. package/dist/docs/other-features/client-side-rendering/camera-padding.mdx +0 -2
  436. package/dist/docs/other-features/client-side-rendering/custom.mdx +0 -6
  437. package/dist/docs/other-features/client-side-rendering/declarative.mdx +0 -4
  438. package/dist/docs/other-features/client-side-rendering/postprocessing.mdx +0 -6
  439. package/dist/docs/other-features/component-filters.mdx +0 -7
  440. package/dist/docs/other-features/currency.mdx +5 -6
  441. package/dist/docs/other-features/domain-actions.mdx +0 -5
  442. package/dist/docs/other-features/dynamic-component-attachments.mdx +75 -46
  443. package/dist/docs/other-features/error-5xx.mdx +0 -2
  444. package/dist/docs/other-features/navigation-hotspot.mdx +0 -5
  445. package/dist/docs/other-features/not-found-404.mdx +0 -2
  446. package/dist/docs/other-features/projected-entities.mdx +0 -5
  447. package/dist/docs/other-features/side-effects.mdx +0 -7
  448. package/dist/docs/other-features/transformers.mdx +101 -96
  449. package/dist/docs/other-features/violation-messages.mdx +0 -4
  450. package/dist/docs/other-features/violation-severity.mdx +2 -3
  451. package/dist/docs/performance/clone-highlight.mdx +0 -7
  452. package/dist/docs/performance/dynamic-components.mdx +0 -6
  453. package/dist/docs/performance/editable-dimension-stress-test.mdx +0 -2
  454. package/dist/docs/performance/fast-highlight.mdx +0 -7
  455. package/dist/docs/performance/general.mdx +0 -7
  456. package/dist/docs/performance/render-isolation.mdx +0 -6
  457. package/dist/docs/phoenix/admin.mdx +75 -100
  458. package/dist/docs/phoenix/application-states.mdx +45 -27
  459. package/dist/docs/phoenix/components.mdx +53 -46
  460. package/dist/docs/phoenix/configurator-interface.mdx +196 -116
  461. package/dist/docs/phoenix/deployments.mdx +11 -1
  462. package/dist/docs/phoenix/domain-model.mdx +20 -15
  463. package/dist/docs/phoenix/expression-context.mdx +3 -29
  464. package/dist/docs/phoenix/getting-started.mdx +0 -2
  465. package/dist/docs/phoenix/localization.mdx +64 -54
  466. package/dist/docs/phoenix/migration-guide.mdx +10 -11
  467. package/dist/docs/phoenix/phoenix-cli.mdx +21 -12
  468. package/dist/docs/phoenix/project-structure.mdx +52 -59
  469. package/dist/docs/phoenix/quickstart.mdx +1 -3
  470. package/dist/docs/phoenix/sdk-builder-workflow.mdx +3 -9
  471. package/dist/docs/phoenix/state-management.mdx +18 -16
  472. package/dist/docs/phoenix/testing.mdx +6 -1
  473. package/dist/docs/phoenix/webhooks.mdx +4 -0
  474. package/dist/docs/recipes-and-delete/delete-entity.mdx +3 -6
  475. package/dist/docs/recipes-and-delete/dynamic-root-entity.mdx +0 -2
  476. package/dist/docs/recipes-and-delete/grouped-button.mdx +0 -3
  477. package/dist/docs/recipes-and-delete/grouped-panel.mdx +0 -3
  478. package/dist/docs/recipes-and-delete/horizontal.mdx +3 -6
  479. package/dist/docs/recipes-and-delete/recipe-hierarchy-lists.mdx +0 -3
  480. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +0 -5
  481. package/dist/docs/recipes-and-delete/replace-dropdown.mdx +3 -6
  482. package/dist/docs/recipes-and-delete/replace-panel.mdx +0 -7
  483. package/dist/docs/recipes-and-delete/simple.mdx +3 -6
  484. package/dist/docs/recipes-and-delete/vertical.mdx +3 -6
  485. package/dist/docs/relations/aliases.mdx +0 -2
  486. package/dist/docs/relations/all-of-type.mdx +0 -4
  487. package/dist/docs/relations/child-nullable.mdx +0 -4
  488. package/dist/docs/relations/child-required.mdx +0 -2
  489. package/dist/docs/relations/collection-direct.mdx +0 -4
  490. package/dist/docs/relations/collection-indirect.mdx +0 -4
  491. package/dist/docs/relations/collection-multiple.mdx +0 -2
  492. package/dist/docs/relations/cross-reference.mdx +0 -2
  493. package/dist/docs/relations/hierarchy.mdx +0 -2
  494. package/dist/docs/selection-and-highlight/canvas.mdx +0 -1
  495. package/dist/docs/selection-and-highlight/disable-highlight-per-object.mdx +0 -1
  496. package/dist/docs/selection-and-highlight/disable-highlight.mdx +0 -1
  497. package/dist/docs/selection-and-highlight/effects/outline.mdx +0 -3
  498. package/dist/docs/selection-and-highlight/effects/overlay.mdx +0 -3
  499. package/dist/docs/selection-and-highlight/fast-emissive-highlight.mdx +0 -3
  500. package/dist/docs/selection-and-highlight/group-highlighting.mdx +0 -1
  501. package/dist/docs/selection-and-highlight/hierarchy.mdx +100 -151
  502. package/dist/docs/selection-and-highlight/hotspots.mdx +0 -1
  503. package/dist/domain/application/GetApplicationWrapperHandler.d.ts +1 -1
  504. package/dist/domain/application/GetThemeHandler.d.ts +1 -1
  505. package/dist/domain/application/GetWebComponentOptions.d.ts +1 -1
  506. package/dist/domain/application/application-config.d.ts +1 -3
  507. package/dist/domain/application/assistant/assistant-fields.d.ts +1 -1
  508. package/dist/domain/application/assistant/assistant-value-type.d.ts +1 -1
  509. package/dist/domain/application/assistant/build-assistant-lenses.d.ts +1 -2
  510. package/dist/domain/application/assistant/build-assistant-manifest.d.ts +1 -2
  511. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +1 -2
  512. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  513. package/dist/domain/application/assistant/index.d.ts +0 -4
  514. package/dist/domain/application/assistant/index.js +1 -1
  515. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +1 -1
  516. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +1 -1
  517. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -1
  518. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +1 -1
  519. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +1 -2
  520. package/dist/domain/application/assistant-field-options.d.ts +1 -1
  521. package/dist/domain/application/assistant-mutations.d.ts +1 -1
  522. package/dist/domain/application/assistant-recipe-groups.d.ts +1 -1
  523. package/dist/domain/application/configurator-builder.d.ts +1 -2
  524. package/dist/domain/application/create-initial-published-data.d.ts +2 -1
  525. package/dist/domain/application/published-data/DataRowValidatorHandler.d.ts +1 -1
  526. package/dist/domain/application/published-data/FilterPublishedChunksHandler.d.ts +1 -1
  527. package/dist/domain/application/published-data/MapPublishedChunkedDataHandler.d.ts +1 -1
  528. package/dist/domain/application/published-data/MapPublishedRevisionDataHandler.d.ts +1 -1
  529. package/dist/domain/application/published-data/SheetValidatorHandler.d.ts +1 -1
  530. package/dist/domain/core/invariant/violation.d.ts +3 -2
  531. package/dist/domain/domain-builder/domain-builder.d.ts +1 -1
  532. package/dist/domain/domain-builder/domain-builder.js +1 -1
  533. package/dist/domain/domain-context/transformers/context.d.ts +4 -2
  534. package/dist/domain/domain-context/transformers/when-builder.d.ts +2 -1
  535. package/dist/domain/domain-runtime/domain-runtime.d.ts +24 -24
  536. package/dist/domain/domain-runtime/index.d.ts +0 -1
  537. package/dist/domain/domain-runtime/index.js +1 -1
  538. package/dist/domain/domain-runtime/spec/create-violation-expressions.d.ts +1 -1
  539. package/dist/domain/domain-runtime/spec/create-violation-expressions.js +1 -1
  540. package/dist/domain/domain-runtime/spec/index.d.ts +1 -1
  541. package/dist/domain/domain-runtime/spec/index.js +1 -1
  542. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  543. package/dist/domain/domain-runtime/spec/{module-checks/resolve-imported-transformers.d.ts → resolve-imported-transformers.d.ts} +3 -3
  544. package/dist/domain/domain-runtime/spec/resolve-imported-transformers.js +1 -0
  545. package/dist/domain/domain-runtime/spec/selectors.d.ts +5 -5
  546. package/dist/domain/domain-runtime/spec/types.d.ts +2 -2
  547. package/dist/domain/extensions/export-images/agent-screenshot.d.ts +6 -0
  548. package/dist/domain/extensions/export-images/agent-screenshot.js +1 -1
  549. package/dist/domain/extensions/export-images/index.d.ts +1 -1
  550. package/dist/domain/extensions/export-images/index.js +1 -1
  551. package/dist/domain/extensions/index.d.ts +1 -1
  552. package/dist/domain/extensions/index.js +1 -1
  553. package/dist/domain/index.d.ts +13 -1
  554. package/dist/domain/index.js +1 -1
  555. package/dist/domain/mocks/create-test-application-config.d.ts +1 -1
  556. package/dist/domain/spec/index.d.ts +3 -8
  557. package/dist/domain/spec/index.js +1 -1
  558. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/element-registration.d.ts +1 -1
  559. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/find-assistant-form-element-errors.d.ts +1 -1
  560. package/dist/domain/spec/modules/find-assistant-form-element-errors.js +1 -0
  561. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/index.d.ts +2 -3
  562. package/dist/domain/spec/modules/index.js +1 -0
  563. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/merge-expression-modules.d.ts +2 -2
  564. package/dist/domain/spec/modules/merge-expression-modules.js +1 -0
  565. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/project-modules.d.ts +1 -1
  566. package/dist/domain/spec/modules/project-modules.js +1 -0
  567. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-action-modules.d.ts +1 -1
  568. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-component-optic-modules.d.ts +1 -1
  569. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-expression-modules.d.ts +1 -1
  570. package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-invariant-modules.d.ts +1 -1
  571. package/dist/domain/spec/phx/index.d.ts +1 -0
  572. package/dist/domain/spec/phx/index.js +1 -0
  573. package/dist/{application-spec/generate-application/implementations → domain/spec/phx}/phx-application-types.d.ts +1 -1
  574. package/dist/domain/spec/phx/phx-application-types.js +1 -0
  575. package/dist/domain/spec/phx/phx-domain.js +1 -0
  576. package/dist/{application-spec/generate-application/implementations → domain/spec/phx}/phx-model.d.ts +2 -2
  577. package/dist/domain/spec/phx/phx-model.js +1 -0
  578. package/dist/{application-spec/generate-application/implementations → domain/spec/phx}/phx.d.ts +1 -2
  579. package/dist/{application-spec/generate-application → domain/spec}/runtime/admin-runtime/admin-runtime.d.ts +7 -6
  580. package/dist/domain/spec/runtime/admin-runtime/admin-runtime.js +1 -0
  581. package/dist/{application-spec/generate-application → domain/spec}/runtime/admin-runtime/admin-spec-runtime.d.ts +2 -2
  582. package/dist/domain/spec/runtime/admin-runtime/admin-spec-runtime.js +1 -0
  583. package/dist/domain/spec/runtime/admin-runtime/index.d.ts +2 -0
  584. package/dist/domain/spec/runtime/admin-runtime/index.js +1 -0
  585. package/dist/{application-spec/generate-application → domain/spec}/runtime/admin-runtime/states-runtime.d.ts +1 -1
  586. package/dist/{application-spec/generate-application → domain/spec}/runtime/application-runtime.d.ts +8 -6
  587. package/dist/domain/spec/runtime/application-runtime.js +1 -0
  588. package/dist/{application-spec/generate-application → domain/spec}/runtime/application-spec-slice.d.ts +3 -1
  589. package/dist/domain/spec/runtime/application-spec-slice.js +1 -0
  590. package/dist/{application-spec/generate-application → domain/spec}/runtime/configurator-runtime/configurator-runtime.d.ts +8 -10
  591. package/dist/domain/spec/runtime/configurator-runtime/configurator-runtime.js +1 -0
  592. package/dist/{application-spec/generate-application → domain/spec}/runtime/configurator-runtime/configurator-spec-runtime.d.ts +2 -2
  593. package/dist/domain/spec/runtime/configurator-runtime/configurator-spec-runtime.js +1 -0
  594. package/dist/domain/spec/runtime/configurator-runtime/index.d.ts +2 -0
  595. package/dist/domain/spec/runtime/configurator-runtime/index.js +1 -0
  596. package/dist/{application-spec/generate-application → domain/spec}/runtime/configurator-runtime/states-runtime.d.ts +1 -1
  597. package/dist/{application-spec/generate-application → domain/spec}/runtime/create-application.d.ts +3 -2
  598. package/dist/domain/spec/runtime/create-application.js +1 -0
  599. package/dist/{application-spec/generate-application/runtime/sections → domain/spec/runtime/expressions}/expression-runtime.d.ts +5 -2
  600. package/dist/domain/spec/runtime/expressions/expression-runtime.js +1 -0
  601. package/dist/{application-spec/generate-application/runtime/sections → domain/spec/runtime/expressions}/generate-memo-eval-plan-runtime.d.ts +2 -1
  602. package/dist/domain/spec/runtime/expressions/generate-memo-eval-plan-runtime.js +1 -0
  603. package/dist/domain/spec/runtime/expressions/index.d.ts +3 -0
  604. package/dist/domain/spec/runtime/expressions/index.js +1 -0
  605. package/dist/{application-spec/generate-application/runtime/sections → domain/spec/runtime/expressions}/reflection-constants-runtime.d.ts +2 -1
  606. package/dist/{application-spec/generate-application → domain/spec}/runtime/factory-data/factory-data-runtime.d.ts +4 -2
  607. package/dist/{application-spec/generate-application → domain/spec}/runtime/factory-data/recipe-defaults.d.ts +1 -1
  608. package/dist/domain/spec/runtime/factory-data/recipe-defaults.js +1 -0
  609. package/dist/{application-spec/generate-application → domain/spec}/runtime/factory-data/static-violations.d.ts +2 -1
  610. package/dist/domain/spec/runtime/factory-data/static-violations.js +1 -0
  611. package/dist/{application-spec/generate-application → domain/spec}/runtime/generate-runtime-instance.d.ts +1 -1
  612. package/dist/domain/spec/runtime/generate-runtime-instance.js +1 -0
  613. package/dist/domain/spec/runtime/index.d.ts +13 -0
  614. package/dist/domain/spec/runtime/index.js +1 -0
  615. package/dist/{application-spec/generate-application → domain/spec}/runtime/migrations/migration-runtime.d.ts +2 -2
  616. package/dist/domain/spec/runtime/migrations/migration-runtime.js +1 -0
  617. package/dist/{application-spec/generate-application/runtime/admin-runtime → domain/spec/runtime/model}/admin-model-runtime.d.ts +4 -2
  618. package/dist/domain/spec/runtime/model/admin-model-runtime.js +1 -0
  619. package/dist/{application-spec/generate-application/runtime/configurator-runtime → domain/spec/runtime/model}/configurator-model-runtime.d.ts +4 -2
  620. package/dist/domain/spec/runtime/model/configurator-model-runtime.js +1 -0
  621. package/dist/domain/spec/runtime/model/index.d.ts +2 -0
  622. package/dist/domain/spec/runtime/model/index.js +1 -0
  623. package/dist/{application-spec/generate-application/runtime/sections → domain/spec/runtime/optics}/build-sdk-optic.d.ts +3 -4
  624. package/dist/domain/spec/runtime/optics/build-sdk-optic.js +1 -0
  625. package/dist/domain/spec/runtime/optics/build-user-bound-optic.d.ts +7 -0
  626. package/dist/domain/spec/runtime/optics/build-user-bound-optic.js +1 -0
  627. package/dist/domain/spec/runtime/optics/built-component-optic.d.ts +11 -0
  628. package/dist/{application-spec/generate-application/runtime/sections → domain/spec/runtime/optics}/component-optic.d.ts +4 -13
  629. package/dist/domain/spec/runtime/optics/index.d.ts +2 -0
  630. package/dist/domain/spec/runtime/optics/index.js +1 -0
  631. package/dist/{application-spec/caching → domain/spec/runtime}/runtime-reference-store.d.ts +1 -5
  632. package/dist/domain/spec/runtime/runtime-reference-store.js +1 -0
  633. package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/actions-runtime.d.ts +3 -2
  634. package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/assistant-runtime.d.ts +2 -2
  635. package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/data-runtime.d.ts +1 -1
  636. package/dist/domain/spec/runtime/sections/index.d.ts +6 -0
  637. package/dist/domain/spec/runtime/sections/index.js +1 -0
  638. package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/preset-runtime.d.ts +3 -2
  639. package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/theme-runtime.d.ts +1 -1
  640. package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/transformers-runtime.d.ts +2 -2
  641. package/dist/{application-spec/generate-application → domain/spec}/runtime/spec-code/resolve-spec-code.d.ts +1 -1
  642. package/dist/domain/spec/runtime/spec-code/spec-code-module.js +1 -0
  643. package/dist/{application-spec/generate-application → domain/spec}/runtime/spec-runtime.d.ts +3 -3
  644. package/dist/domain/spec/runtime/spec-runtime.js +1 -0
  645. package/dist/domain/spec/runtime-spec/index.d.ts +4 -0
  646. package/dist/domain/spec/runtime-spec/index.js +1 -0
  647. package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/runtime-spec.d.ts +7 -1
  648. package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/spec-code-id.d.ts +1 -1
  649. package/dist/domain/spec/sections/assistant/assistant-resolved-manifest.js +1 -0
  650. package/dist/domain/spec/sections/assistant/index.d.ts +4 -0
  651. package/dist/domain/spec/sections/assistant/index.js +1 -0
  652. package/dist/domain/spec/sections/index.d.ts +1 -0
  653. package/dist/domain/spec/sections/index.js +1 -1
  654. package/dist/domain/system-components/phoenix-entity-elements/child-entity-card-selector.d.ts +2 -3
  655. package/dist/domain/system-components/phoenix-entity-elements/child-entity-list-selector.d.ts +2 -3
  656. package/dist/domain/system-components/phoenix-entity-elements/child-entity-toggle-selector.d.ts +2 -3
  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-spec/__generated/domain-schema.d.ts +2 -2
  675. package/dist/legacy/phoenix-cli/services/webhook-service/transport.js +1 -1
  676. package/dist/legacy/phoenix-cli/services/webhook-service/tunnel.d.ts +1 -0
  677. package/dist/legacy/phoenix-cli/services/webhook-service/tunnel.js +1 -1
  678. package/dist/legacy/webhook-cli/lambda-local/index.js +1 -1
  679. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  680. package/dist/phoenix/application-spec/generate-application-spec-project.js +2 -2
  681. package/dist/phoenix/application-spec/index.d.ts +1 -0
  682. package/dist/phoenix/application-spec/index.js +1 -1
  683. package/dist/phoenix/application-spec/project-files.d.ts +8 -2
  684. package/dist/phoenix/application-spec/project-files.js +1 -1
  685. package/dist/phoenix/commands/clean.js +1 -1
  686. package/dist/phoenix/commands/deploy.js +3 -3
  687. package/dist/phoenix/commands/dev.js +4 -5
  688. package/dist/phoenix/commands/story-dev.js +2 -2
  689. package/dist/phoenix/editor-server/commands-router.js +1 -1
  690. package/dist/phoenix/editor-server/editor-server.d.ts +2 -13
  691. package/dist/phoenix/editor-server/editor-server.js +1 -1
  692. package/dist/phoenix/editor-server/spec-router.js +1 -1
  693. package/dist/phoenix/editor-server/trpc.d.ts +2 -12
  694. package/dist/phoenix/lingui/lingui.d.ts +4 -4
  695. package/dist/phoenix/scripts/docs-utils.js +1 -1
  696. package/dist/phoenix/services/application-spec-project-watcher.d.ts +11 -8
  697. package/dist/phoenix/services/application-spec-project-watcher.js +2 -2
  698. package/dist/phoenix/services/deployment/deployment-preparation-service.d.ts +28 -0
  699. package/dist/phoenix/services/deployment/deployment-preparation-service.js +1 -0
  700. package/dist/phoenix/services/deployment/index.d.ts +2 -0
  701. package/dist/phoenix/services/deployment/index.js +1 -0
  702. package/dist/phoenix/services/index.d.ts +2 -1
  703. package/dist/phoenix/services/index.js +1 -1
  704. package/dist/phoenix/services/phoenix-store.d.ts +3 -0
  705. package/dist/phoenix/services/phoenix-store.js +1 -1
  706. package/dist/phoenix/services/session/editor-server-handle.d.ts +5 -0
  707. package/dist/phoenix/services/session/editor-server-handle.js +1 -0
  708. package/dist/phoenix/services/session/index.d.ts +2 -0
  709. package/dist/phoenix/services/session/index.js +1 -0
  710. package/dist/phoenix/services/session/phoenix-application.d.ts +82 -0
  711. package/dist/phoenix/services/session/phoenix-application.js +2 -0
  712. package/dist/phoenix/services/source-archive.d.ts +2 -0
  713. package/dist/phoenix/services/source-archive.js +1 -1
  714. package/dist/phoenix/services/swc.d.ts +5 -4
  715. package/dist/phoenix/services/swc.js +2 -2
  716. package/dist/phoenix/services/vite-config.js +1 -1
  717. package/dist/phoenix/services/webhook-service/transport.js +1 -1
  718. package/dist/phoenix/services/webhook-service/tunnel.d.ts +1 -0
  719. package/dist/phoenix/services/webhook-service/tunnel.js +1 -1
  720. package/dist/react-sdk/configurator-ui-elements/ConfiguratorUiElementHost.d.ts +7 -0
  721. package/dist/react-sdk/configurator-ui-elements/ConfiguratorUiElementHost.js +1 -0
  722. package/dist/react-sdk/configurator-ui-elements/ErrorFallbackElement.d.ts +14 -0
  723. package/dist/react-sdk/configurator-ui-elements/ErrorFallbackElement.js +1 -0
  724. package/dist/react-sdk/configurator-ui-elements/ErrorFallbackPropsProvider.d.ts +18 -0
  725. package/dist/react-sdk/configurator-ui-elements/ErrorFallbackPropsProvider.js +1 -0
  726. package/dist/react-sdk/configurator-ui-elements/PlainErrorFallback.d.ts +5 -0
  727. package/dist/react-sdk/configurator-ui-elements/PlainErrorFallback.js +1 -0
  728. package/dist/react-sdk/configurator-ui-elements/configurator-ui-element.d.ts +17 -0
  729. package/dist/react-sdk/configurator-ui-elements/configurator-ui-element.js +1 -0
  730. package/dist/react-sdk/configurator-ui-elements/create-configurator-ui-element.d.ts +5 -0
  731. package/dist/react-sdk/configurator-ui-elements/create-configurator-ui-element.js +1 -0
  732. package/dist/react-sdk/configurator-ui-elements/index.d.ts +6 -0
  733. package/dist/react-sdk/configurator-ui-elements/index.js +1 -0
  734. package/dist/react-sdk/domain-application-context/BackendDataProvider.js +1 -1
  735. package/dist/react-sdk/domain-application-context/FrontendDataProvider.js +1 -1
  736. package/dist/react-sdk/domain-application-context/PublishedDataProvider.js +1 -1
  737. package/dist/react-sdk/domain-context/common-hooks/use-state-validity.d.ts +7 -1
  738. package/dist/react-sdk/domain-controls/ChildEntityCardSelector.d.ts +2 -3
  739. package/dist/react-sdk/domain-controls/ChildEntityListSelector.d.ts +2 -3
  740. package/dist/react-sdk/domain-controls/ChildEntityToggleSelector.d.ts +2 -3
  741. package/dist/react-sdk/domain-controls/hooks/use-cook-replace-recipes.d.ts +2 -2
  742. package/dist/react-sdk/elements/PhoenixEntityElement.js +1 -1
  743. package/dist/react-sdk/elements/PhoenixLayoutElement.js +1 -1
  744. package/dist/react-sdk/index.d.ts +2 -0
  745. package/dist/react-sdk/index.js +1 -1
  746. package/dist/react-sdk/provider-slots/ConfiguratorProviderSlotHost.d.ts +11 -0
  747. package/dist/react-sdk/provider-slots/ConfiguratorProviderSlotHost.js +1 -0
  748. package/dist/react-sdk/provider-slots/configurator-provider-slot.d.ts +24 -0
  749. package/dist/react-sdk/provider-slots/configurator-provider-slot.js +1 -0
  750. package/dist/react-sdk/provider-slots/create-configurator-provider-slot.d.ts +5 -0
  751. package/dist/react-sdk/provider-slots/create-configurator-provider-slot.js +1 -0
  752. package/dist/react-sdk/provider-slots/index.d.ts +3 -0
  753. package/dist/react-sdk/provider-slots/index.js +1 -0
  754. package/dist/react-sdk/session/SessionServiceProvider.d.ts +5 -0
  755. package/dist/react-sdk/session/SessionServiceProvider.js +1 -1
  756. package/dist/ui-sdk/components/numerical-input/InputField.d.ts +2 -0
  757. package/dist/ui-sdk/components/numerical-input/InputField.js +1 -1
  758. package/dist/ui-sdk/components/numerical-input/NumericalInput.d.ts +2 -2
  759. package/dist/ui-sdk/components/numerical-input/Slider.d.ts +3 -1
  760. package/dist/ui-sdk/components/numerical-input/Slider.js +1 -1
  761. package/dist/ui-sdk/icons/__generated/ChatCircleText.d.ts +3 -0
  762. package/dist/ui-sdk/icons/__generated/ChatCircleText.js +1 -0
  763. package/dist/ui-sdk/icons/__generated/Paperclip.d.ts +3 -0
  764. package/dist/ui-sdk/icons/__generated/Paperclip.js +1 -0
  765. package/dist/ui-sdk/icons/__generated/PencilSimpleLine.d.ts +3 -0
  766. package/dist/ui-sdk/icons/__generated/PencilSimpleLine.js +1 -0
  767. package/dist/ui-sdk/icons/__generated/index.d.ts +6 -0
  768. package/dist/ui-sdk/icons/__generated/index.js +1 -1
  769. package/dist/ui-sdk/icons/icons-registry.js +1 -1
  770. package/dist/ui-sdk/theme/types.d.ts +1 -1
  771. package/package.json +3 -3
  772. package/schema/domain-spec.json +22 -4
  773. package/dist/application-spec/caching/runtime-reference-store.js +0 -1
  774. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.d.ts +0 -1
  775. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +0 -1
  776. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.d.ts +0 -3
  777. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +0 -166
  778. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.d.ts +0 -1
  779. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +0 -54
  780. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.d.ts +0 -1
  781. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +0 -115
  782. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +0 -1
  783. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.d.ts +0 -1
  784. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +0 -6
  785. package/dist/application-spec/generate-application/implementations/phx-application-types.js +0 -1
  786. package/dist/application-spec/generate-application/implementations/phx-domain.js +0 -1
  787. package/dist/application-spec/generate-application/implementations/phx-model.js +0 -1
  788. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.js +0 -1
  789. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +0 -1
  790. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-spec-runtime.js +0 -1
  791. package/dist/application-spec/generate-application/runtime/application-runtime.js +0 -1
  792. package/dist/application-spec/generate-application/runtime/application-spec-slice.js +0 -1
  793. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.js +0 -1
  794. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +0 -1
  795. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-spec-runtime.js +0 -1
  796. package/dist/application-spec/generate-application/runtime/create-application.js +0 -1
  797. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +0 -1
  798. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +0 -1
  799. package/dist/application-spec/generate-application/runtime/generate-runtime-instance.js +0 -1
  800. package/dist/application-spec/generate-application/runtime/index.d.ts +0 -8
  801. package/dist/application-spec/generate-application/runtime/index.js +0 -1
  802. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.js +0 -1
  803. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +0 -1
  804. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.d.ts +0 -8
  805. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.js +0 -1
  806. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +0 -1
  807. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.js +0 -1
  808. package/dist/application-spec/generate-application/runtime/sections/index.d.ts +0 -10
  809. package/dist/application-spec/generate-application/runtime/sections/index.js +0 -1
  810. package/dist/application-spec/generate-application/runtime/spec-runtime.js +0 -1
  811. package/dist/application-spec/generate-application/runtime-spec/index.d.ts +0 -5
  812. package/dist/application-spec/generate-application/runtime-spec/index.js +0 -1
  813. package/dist/configurator/application-runtime/extensions/systems/assistant-system/browser-details.d.ts +0 -17
  814. package/dist/configurator/application-runtime/extensions/systems/assistant-system/browser-details.js +0 -1
  815. package/dist/domain/domain-runtime/spec/module-checks/find-assistant-form-element-errors.js +0 -1
  816. package/dist/domain/domain-runtime/spec/module-checks/index.js +0 -1
  817. package/dist/domain/domain-runtime/spec/module-checks/merge-expression-modules.js +0 -1
  818. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +0 -1
  819. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +0 -1
  820. package/dist/phoenix/services/phoenix-application.d.ts +0 -21
  821. package/dist/phoenix/services/phoenix-application.js +0 -1
  822. /package/dist/{application-spec/generate-application/runtime/spec-code/spec-code-module.js → configurator/application-runtime/extensions/systems/assistant-system/assistant-annotation.js} +0 -0
  823. /package/dist/configurator/{configurator-context → pages/provider-slots}/ConfiguratorResponsiveProvider.d.ts +0 -0
  824. /package/dist/configurator/{configurator-context → pages/provider-slots}/ConfiguratorResponsiveProvider.js +0 -0
  825. /package/dist/domain/{domain-runtime → spec}/errors/implementation-error-collector.d.ts +0 -0
  826. /package/dist/domain/{domain-runtime → spec}/errors/implementation-error-collector.js +0 -0
  827. /package/dist/domain/{domain-runtime → spec}/errors/implementation-error.d.ts +0 -0
  828. /package/dist/domain/{domain-runtime → spec}/errors/implementation-error.js +0 -0
  829. /package/dist/domain/{domain-runtime → spec}/errors/implementation-errors.d.ts +0 -0
  830. /package/dist/domain/{domain-runtime → spec}/errors/implementation-errors.js +0 -0
  831. /package/dist/domain/{domain-runtime → spec}/errors/index.d.ts +0 -0
  832. /package/dist/domain/{domain-runtime → spec}/errors/index.js +0 -0
  833. /package/dist/domain/{domain-runtime → spec}/errors/to-implementation-errors.d.ts +0 -0
  834. /package/dist/domain/{domain-runtime → spec}/errors/to-implementation-errors.js +0 -0
  835. /package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/element-registration.js +0 -0
  836. /package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/handler-registration.d.ts +0 -0
  837. /package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/handler-registration.js +0 -0
  838. /package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-action-modules.js +0 -0
  839. /package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-component-optic-modules.js +0 -0
  840. /package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-expression-modules.js +0 -0
  841. /package/dist/domain/{domain-runtime/spec/module-checks → spec/modules}/resolve-invariant-modules.js +0 -0
  842. /package/dist/{application-spec/generate-application/implementations → domain/spec/phx}/phx-domain.d.ts +0 -0
  843. /package/dist/{application-spec/generate-application/implementations → domain/spec/phx}/phx.js +0 -0
  844. /package/dist/{application-spec/generate-application → domain/spec}/runtime/admin-runtime/states-runtime.js +0 -0
  845. /package/dist/{application-spec/generate-application → domain/spec}/runtime/configurator-runtime/states-runtime.js +0 -0
  846. /package/dist/{application-spec/generate-application/runtime/sections → domain/spec/runtime/expressions}/reflection-constants-runtime.js +0 -0
  847. /package/dist/{application-spec/generate-application → domain/spec}/runtime/factory-data/factory-data-runtime.js +0 -0
  848. /package/dist/{application-spec/generate-application → domain/spec}/runtime/factory-data/index.d.ts +0 -0
  849. /package/dist/{application-spec/generate-application → domain/spec}/runtime/factory-data/index.js +0 -0
  850. /package/dist/{application-spec/generate-application → domain/spec}/runtime/migrations/index.d.ts +0 -0
  851. /package/dist/{application-spec/generate-application → domain/spec}/runtime/migrations/index.js +0 -0
  852. /package/dist/domain/{application/assistant/assistant-resolved-manifest.js → spec/runtime/optics/built-component-optic.js} +0 -0
  853. /package/dist/{application-spec/generate-application/runtime/sections → domain/spec/runtime/optics}/component-optic.js +0 -0
  854. /package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/actions-runtime.js +0 -0
  855. /package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/assistant-runtime.js +0 -0
  856. /package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/data-runtime.js +0 -0
  857. /package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/preset-runtime.js +0 -0
  858. /package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/theme-runtime.js +0 -0
  859. /package/dist/{application-spec/generate-application → domain/spec}/runtime/sections/transformers-runtime.js +0 -0
  860. /package/dist/{application-spec/generate-application → domain/spec}/runtime/spec-code/index.d.ts +0 -0
  861. /package/dist/{application-spec/generate-application → domain/spec}/runtime/spec-code/index.js +0 -0
  862. /package/dist/{application-spec/generate-application → domain/spec}/runtime/spec-code/resolve-spec-code.js +0 -0
  863. /package/dist/{application-spec/generate-application → domain/spec}/runtime/spec-code/spec-code-module.d.ts +0 -0
  864. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/decode-runtime-spec.d.ts +0 -0
  865. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/decode-runtime-spec.js +0 -0
  866. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/encode-runtime-spec.d.ts +0 -0
  867. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/encode-runtime-spec.js +0 -0
  868. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/encoded-runtime-spec.d.ts +0 -0
  869. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/encoded-runtime-spec.js +0 -0
  870. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/runtime-spec.js +0 -0
  871. /package/dist/{application-spec/generate-application → domain/spec}/runtime-spec/spec-code-id.js +0 -0
  872. /package/dist/domain/{application → spec/sections}/assistant/assistant-manifest.d.ts +0 -0
  873. /package/dist/domain/{application → spec/sections}/assistant/assistant-manifest.js +0 -0
  874. /package/dist/domain/{application → spec/sections}/assistant/assistant-resolved-manifest.d.ts +0 -0
  875. /package/dist/domain/{application → spec/sections}/assistant/form/assistant-form-element-name.d.ts +0 -0
  876. /package/dist/domain/{application → spec/sections}/assistant/form/assistant-form-element-name.js +0 -0
  877. /package/dist/domain/{application → spec/sections}/assistant/form/assistant-form-elements.d.ts +0 -0
  878. /package/dist/domain/{application → spec/sections}/assistant/form/assistant-form-elements.js +0 -0
  879. /package/dist/domain/{application → spec/sections}/assistant/form/assistant-resource-path.d.ts +0 -0
  880. /package/dist/domain/{application → spec/sections}/assistant/form/assistant-resource-path.js +0 -0
  881. /package/dist/domain/{application → spec/sections}/assistant/form/index.d.ts +0 -0
  882. /package/dist/domain/{application → spec/sections}/assistant/form/index.js +0 -0
  883. /package/dist/phoenix/{commands → services/deployment}/generated-env-markers.d.ts +0 -0
  884. /package/dist/phoenix/{commands → services/deployment}/generated-env-markers.js +0 -0
@@ -1,9 +1,11 @@
1
1
  import type { AnyClientTool } from '@tanstack/ai';
2
2
  import { type UIMessage } from '@tanstack/ai-client';
3
3
  import { type ObservableWithLastValue } from '@salsita-ai/common/utils';
4
+ import { type AssistantMessageAnnotation } from '@salsita-ai/contracts/assistant';
4
5
  import { type AuthorizedPhoenixApiClient } from '#package/client';
5
- import type { AssistantManifest, DomainContextSelectors, DomainServicesSelectors, InitializableSystem, SessionAssistantSetup, SpecSelectors } from '#package/domain';
6
+ import type { AssistantManifest, DomainContextSelectors, DomainServicesSelectors, InitializableSystem, SessionAssistantSetup } from '#package/domain';
6
7
  import type { ConfiguratorExtensionSelectors } from '../../selectors.js';
8
+ import type { AssistantAnnotation, AssistantAnnotationOverlay } from './assistant-annotation.js';
7
9
  /** A tool of the assistant that the model calls and the browser runs, as the chat client accepts it. */
8
10
  export type AssistantClientTool = AnyClientTool;
9
11
  /**
@@ -15,12 +17,19 @@ export interface AssistantSystemContext {
15
17
  readonly configuratorExtensionSelectors: ConfiguratorExtensionSelectors;
16
18
  readonly domainContextSelectors: DomainContextSelectors;
17
19
  readonly domainServicesSelectors: DomainServicesSelectors;
18
- readonly specSelectors: SpecSelectors;
19
20
  readonly getConfigurationId: () => string;
20
21
  readonly getAuthorizedClient: () => AuthorizedPhoenixApiClient<any, any, any>;
21
22
  /** The assistant the initialized session runs: its tools, its exposed fields and whether chat runs at all. */
22
23
  readonly getAssistantSetup: () => SessionAssistantSetup;
24
+ /**
25
+ * Copies the configurator view as the next frame draws it, for the user to annotate; see
26
+ * {@link AssistantSystem.annotate}. The only browser-bound step of an annotation the system takes,
27
+ * so a test can provide one that takes none.
28
+ */
29
+ readonly freezeView: () => Promise<HTMLCanvasElement>;
23
30
  }
31
+ /** What the user attaches to a message: an image, or an annotation of their configurator view. */
32
+ export type AssistantAttachment = Blob | AssistantAnnotation;
24
33
  /**
25
34
  * The conversation with the assistant as the panel paints it. One value is published per change, so
26
35
  * it changes with every chunk of a streaming reply.
@@ -37,6 +46,12 @@ export interface AssistantChatSnapshot {
37
46
  * the server was never reached.
38
47
  */
39
48
  readonly failedStatus: number | undefined;
49
+ /**
50
+ * The seconds the server asked to wait before sending again, from the `Retry-After` header of the
51
+ * latest chat request it answered with a failure: a message refused for the assistant's hourly
52
+ * limits. Nothing when that request carried none.
53
+ */
54
+ readonly retryAfterSeconds: number | undefined;
40
55
  /** False when the server said this session may read the thread but not add to it. */
41
56
  readonly isContinuable: boolean;
42
57
  /** False until the first request of the chat, the thread read, was answered or failed. */
@@ -51,10 +66,34 @@ export interface AssistantChatSnapshot {
51
66
  * the chat was open, and the ones loaded with {@link AssistantSystem.loadEarlierThread}.
52
67
  */
53
68
  readonly earlierThreads: ReadonlyArray<AssistantEarlierThreadSnapshot>;
54
- /** True when the server holds a thread older than the oldest painted one. */
55
- readonly hasEarlierThread: boolean;
56
- /** True while that older thread is being loaded. */
69
+ /**
70
+ * The closed thread that {@link AssistantSystem.loadEarlierThread} loads next; `null` when the
71
+ * painted threads start the conversation. Usually the thread before the oldest painted one, but
72
+ * the oldest painted one itself when it was closed while only its newest messages were painted:
73
+ * loading it then paints it whole.
74
+ */
75
+ readonly earlierThreadId: string | null;
76
+ /** True while that thread is being loaded. */
57
77
  readonly isLoadingEarlierThread: boolean;
78
+ /** True when the thread of the chat has older messages than the painted ones on the server; see {@link AssistantSystem.loadOlderMessages}. */
79
+ readonly hasOlderMessages: boolean;
80
+ /** True while those older messages are being loaded. */
81
+ readonly isLoadingOlderMessages: boolean;
82
+ }
83
+ /** What else the caller of {@link AssistantSystem.send} learns about the message. */
84
+ export interface AssistantSendOptions {
85
+ /**
86
+ * Called once the message is handed to the chat, which paints it: after its images were uploaded,
87
+ * and not at all when it is not sent because the thread could not be resumed or an upload failed.
88
+ * The composer keeps the message until then, so a message that is not sent can be sent again.
89
+ */
90
+ readonly onSent?: () => void;
91
+ /**
92
+ * Called when a message that was handed to the chat is gone from it after all: the server refused
93
+ * it because the thread could not continue, the thread was resumed without it, and its images
94
+ * could not be uploaded into the new thread. The caller gets it back, so it can be sent again.
95
+ */
96
+ readonly onUnsent?: () => void;
58
97
  }
59
98
  /** A closed thread of the conversation as the panel paints it above the thread that continues it. */
60
99
  export interface AssistantEarlierThreadSnapshot {
@@ -73,9 +112,9 @@ export interface AssistantPanelSnapshot {
73
112
  readonly isInputFocused: boolean;
74
113
  }
75
114
  /**
76
- * Owns the conversational assistant of a configurator: its client tools (`getBrowserDetails`,
77
- * `query` and `apply`), the chat with the server, the state of the built-in panel, and the record
78
- * of what changed in the configuration since the agent last acted, which every user message carries.
115
+ * Owns the conversational assistant of a configurator: its client tools (`query` and `apply`), the
116
+ * chat with the server, the state of the built-in panel, and the record of what changed in the
117
+ * configuration since the agent last acted, which every user message carries.
79
118
  *
80
119
  * The server owns the thread, so the chat keeps nothing in browser storage: its client hydrates
81
120
  * from the server and rejoins a reply that is still streaming.
@@ -89,6 +128,9 @@ export declare class AssistantSystem implements InitializableSystem {
89
128
  private readonly _tools;
90
129
  private readonly _chat;
91
130
  private readonly _panel;
131
+ private readonly _annotationOverlay;
132
+ /** Identity of the `annotate()` call that runs; a new configuration load forgets it, which cancels it. */
133
+ private _annotationRun;
92
134
  /** Identity of the current `activate()` call; nothing while the chat is not active. */
93
135
  private _activation;
94
136
  /** The chat of the current activation; nothing while no chat is active. */
@@ -98,11 +140,6 @@ export declare class AssistantSystem implements InitializableSystem {
98
140
  * background. Each leaves the set when its reply ends or when a new chat takes its thread over.
99
141
  */
100
142
  private readonly _finishing;
101
- /**
102
- * The thread before the oldest painted one, as the server named it; nothing when the painted
103
- * threads start the conversation. `hasEarlierThread` of the chat says whether it is set.
104
- */
105
- private _olderThreadId;
106
143
  /** The resume that is running, so two sends that find the thread locked share one. */
107
144
  private _resuming;
108
145
  /**
@@ -122,8 +159,6 @@ export declare class AssistantSystem implements InitializableSystem {
122
159
  * thread continues the same chain; any other new chat starts another one.
123
160
  */
124
161
  private _chain;
125
- /** The earlier thread that is being loaded, so a second press loads nothing twice. */
126
- private _loadingThreadId;
127
162
  private readonly _recorder;
128
163
  /** The recorder's subscription to the committed emissions of the store; made by the first `initialize()`. */
129
164
  private _recording;
@@ -146,6 +181,11 @@ export declare class AssistantSystem implements InitializableSystem {
146
181
  readonly chat$: ObservableWithLastValue<AssistantChatSnapshot>;
147
182
  /** The state of the built-in panel. It never completes. */
148
183
  readonly panel$: ObservableWithLastValue<AssistantPanelSnapshot>;
184
+ /**
185
+ * What covers the configurator for an annotation, as the layout renders it; nothing while no
186
+ * annotation is made or shown. See {@link AssistantSystem.annotate}. It never completes.
187
+ */
188
+ readonly annotationOverlay$: ObservableWithLastValue<AssistantAnnotationOverlay | null>;
149
189
  /**
150
190
  * The `apply` tool call whose committed state is the step of the undo history the configuration is
151
191
  * at; nothing when that step is not a change of the assistant. It never completes.
@@ -199,6 +239,14 @@ export declare class AssistantSystem implements InitializableSystem {
199
239
  * acted, which the server puts in front of the message for the model. The record is taken only
200
240
  * when there is a chat to send it on, because taking it moves its baseline.
201
241
  *
242
+ * The images the user attached go with the message: they are uploaded into the chat's thread
243
+ * first, and the message references them, one image part after its text each. The text part is
244
+ * left out of a message with images only. An annotation is attached like an image: its image is
245
+ * uploaded and referenced in its place among the images, and its pins go into the metadata of the
246
+ * message, by the id of its image, for the server to tell the model. Each attempt to send uploads them again, into the
247
+ * thread it sends on. An upload that fails leaves the message unsent, with the failure as the
248
+ * error of the chat; `onSent` is not called then.
249
+ *
202
250
  * A thread can end in a tool call that nothing will answer: its reply parked while no page was
203
251
  * open, or the page that ran the tool was left before the result was sent. The client refuses to
204
252
  * send while it waits on such a call, so the wait is given up first, and the server records for
@@ -209,20 +257,44 @@ export declare class AssistantSystem implements InitializableSystem {
209
257
  *
210
258
  * The chat can be out of date about that: the thread reached its size limit with the reply before
211
259
  * this message, or the assistant's setup changed while the configurator stayed open. The server
212
- * then refuses the message and says that the thread cannot be continued. The message stays
213
- * painted while the thread is resumed, and is then sent again on the new thread, with the change
214
- * record it was first sent with. This happens once: a refusal of the second attempt is the
215
- * failure it is. When resuming fails, the message is left as any message that failed to send:
216
- * painted, with the failure as the error of the chat.
260
+ * then refuses the message, or the upload of one of its images, and says that the thread cannot
261
+ * be continued. The thread is resumed, and the message is then sent again on the new thread, its
262
+ * images uploaded again, with the change record it was first sent with. This happens once: a
263
+ * refusal of the second attempt is the failure it is. When resuming fails, a refused message is
264
+ * left as any message that failed to send: painted, with the failure as the error of the chat; a
265
+ * refused upload leaves the message unsent. When the images of a refused message cannot be
266
+ * uploaded into the new thread, the message is given back through `onUnsent`.
267
+ *
268
+ * A chat that ends while the images upload, because another configuration was loaded or the
269
+ * thread is read again, sends nothing.
217
270
  *
218
271
  * Accepted: when the server refuses the compaction itself with a conflict, because another tab
219
272
  * compacted the thread or a run is still running, the thread is read again (see `resume`) and
220
273
  * the refused message is gone without a notice. It takes two tabs or a run racing the send, and
221
274
  * the user writes the message again, as after any reload of a thread that failed.
222
275
  *
276
+ * Accepted: images uploaded by an attempt that is not sent stay stored in that thread, which no
277
+ * message references.
278
+ *
223
279
  * It never rejects: a message the client could not send is reported as the error of the chat.
224
280
  */
225
- send: (content: string) => Promise<void>;
281
+ send: (content: string, attachments?: ReadonlyArray<AssistantAttachment>, { onSent, onUnsent }?: AssistantSendOptions) => Promise<void>;
282
+ /**
283
+ * Lets the user annotate their current view of the configurator, and resolves with what they made,
284
+ * or with `null` when they cancel, the view cannot be frozen or another configuration is loaded
285
+ * meanwhile. Nothing happens while another annotation is made or shown: it resolves with `null` at once.
286
+ *
287
+ * The layout is inert from the start, and `annotationOverlay$` says what covers it. Once the camera
288
+ * is still, the view glides from the canvas padding to none, so the product is centred on the whole
289
+ * configurator area, and the next frame is frozen for the editor. When the editor finishes, the
290
+ * view glides back to the padding and the layout is released.
291
+ */
292
+ annotate: () => Promise<AssistantAnnotation | null>;
293
+ /**
294
+ * Shows an annotation of a sent message over the configurator, read-only, until its overlay is
295
+ * closed. Nothing happens while another annotation is made or shown.
296
+ */
297
+ viewAnnotation: (annotation: AssistantMessageAnnotation) => void;
226
298
  /**
227
299
  * Makes the chat ready for the next message. A thread the server no longer lets this session
228
300
  * continue, because the assistant's setup changed since it was started or the thread reached
@@ -243,10 +315,19 @@ export declare class AssistantSystem implements InitializableSystem {
243
315
  */
244
316
  loadScreenshotUrl: (imageId: string) => Promise<string>;
245
317
  /**
246
- * Loads the thread before the oldest painted one and paints it above. Does nothing when there is
247
- * none or one is being loaded. A load that fails is logged and can be asked for again.
318
+ * Loads the closed thread named by `earlierThreadId` of the chat, whole, and paints it above the
319
+ * painted ones; when it is the oldest painted thread itself, closed while only its newest messages
320
+ * were painted, it replaces that partial copy. Does nothing when there is none, one is being
321
+ * loaded, or the chat's own thread still has older messages: the earlier threads come above them.
322
+ * A load that fails is logged and can be asked for again.
248
323
  */
249
324
  loadEarlierThread: () => Promise<void>;
325
+ /**
326
+ * Loads the page of messages before the oldest painted one of the chat's thread and paints it
327
+ * above. Does nothing when the thread has no older messages or a page is being loaded. A load that
328
+ * fails is logged and can be asked for again; one that ends after its chat did is dropped.
329
+ */
330
+ loadOlderMessages: () => Promise<void>;
250
331
  /**
251
332
  * Stops the reply on both sides. Closing the stream alone keeps the server run going, because a
252
333
  * closed connection is also how a reload looks and a reload must be able to rejoin the run.
@@ -270,14 +351,32 @@ export declare class AssistantSystem implements InitializableSystem {
270
351
  undoToolCalls: (toolCallIds: ReadonlySet<string>) => void;
271
352
  setOpen: (open: boolean) => void;
272
353
  setInputFocused: (isInputFocused: boolean) => void;
354
+ /** A new configuration load cancels an annotation that is made, and closes one that is shown. */
355
+ private _closeAnnotationOverlay;
273
356
  /**
274
357
  * Where the message starts that is being sent on the chat for the first time and that the server
275
358
  * refused because its thread cannot be continued, so it never reached the thread; `-1` when there
276
359
  * is no such message. A refused continuation of a reply is not one: its message is stored.
277
360
  */
278
361
  private _findRefusedMessageIndex;
362
+ /** The content of a user message: its text, when it has any, and a reference to each of its images. */
363
+ private _messageContent;
364
+ /**
365
+ * Uploads the images of a message into the chat's thread, in their order, and resolves with their
366
+ * ids. Resolves with `'refused'` when the server refused an upload because the thread cannot be
367
+ * continued, and marks the chat so; then with `null` for any other failure, which is reported as
368
+ * the error of the chat. It never rejects.
369
+ */
370
+ private _uploadImages;
371
+ /**
372
+ * Uploads the images of a message into the thread that was resumed for it. A message the chat
373
+ * refused shows nowhere meanwhile, so the chat stays resuming until the upload is over: nothing
374
+ * else is sent ahead of it.
375
+ */
376
+ private _uploadSuccessorImages;
377
+ private _reportUploadFailure;
279
378
  private _sendOn;
280
- private _resume;
379
+ private _compact;
281
380
  /**
282
381
  * The `apply` call whose committed state is the step the configuration is at. Nothing at the bottom
283
382
  * of the history, where nothing can be undone: that step was not made by a change it could take back.
@@ -1 +1 @@
1
- import{ChatClient as e,fetchServerSentEvents as t}from"@tanstack/ai-client";import{BehaviorSubject as s}from"rxjs";import{skip as i}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 o}from"./change-recorder.js";import{createApplyClientTool as l,createQueryClientTool as h,toToolResult as d}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}),u=Object.freeze({open:!1,hasUnreadReply:!1,isInputFocused:!1}),_=Object.freeze({}),g=d({results:[],committed:!1,sideEffects:[],warnings:[],screenshots:new Map,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."}),f=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 s(c);_panel=new s(u);_activation=null;_current=null;_finishing=new Set;_olderThreadId=null;_resuming=null;_refused=null;_firstAttempt=null;_chain={};_loadingThreadId=null;_recorder;_recording=null;_applyToolCallIds=new WeakMap;_undoTipToolCallId=new s(void 0);_screenshotUrls=new Map;constructor(e){this._context=e;let{configuratorExtensionSelectors:t,domainContextSelectors:s,domainServicesSelectors:i,getAssistantSetup:a}=e;this._recorder=new o({maxEntities:30},{readers:{selectedEntityId:e=>s.getNavigationSystem().getActiveSelectionState(e),navigationState:e=>s.getNavigationSystem().getActiveNavigationState(e),viewState:e=>s.getNavigationSystem().getActiveViewState(e),toolState:e=>s.getNavigationSystem().getActiveToolState(e)},getExposedFields:()=>a().manifest?.fields??_,resolveLocalizable:e=>i.getResolveLocalizable()(e)});let r={getGraphQLSystem:()=>t.getGraphQLSystem(),getStoreSystem:()=>s.getStoreSystem(),getActiveMode:()=>s.getActiveMode(),getIsViewMode:()=>s.getIsViewMode(),clearChanges:()=>this._recorder.clear(this._committedState()),rememberCommit:(e,t)=>{this._applyToolCallIds.set(t,e),this._refreshUndoTip()}};this._tools=[n(),h(r),l(r)],s.getUndoSystem().tip$.subscribe(this._refreshUndoTip)}chat$=this._chat;panel$=this._panel;undoTipToolCallId$=this._undoTipToolCallId;getSessionManifest=()=>this._context.getAssistantSetup().manifest;initialize=()=>{let{committed:e}=this._context.domainContextSelectors.getStoreSystem().stateSlices;this._recording??=e.pipe(i(1)).subscribe(this._recorder.record),this._recorder.reset(e.value.state),this._endChat(),this._patchPanel(u),this._releaseScreenshotUrls(),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 s={changes:this._recorder.take(this._committedState())};this._firstAttempt=t;try{await this._sendOn(t,e,s);let i=this._findRefusedMessageIndex(t);if(-1===i)return;this._refused={chat:t,index:i}}finally{this._firstAttempt===t&&(this._firstAttempt=null)}if(!await this.resume())return;let i=this._current;i&&await this._sendOn(i,e,s)};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};loadScreenshotUrl=e=>{let t=this._screenshotUrls.get(e);if(t)return t;let s=this._current;if(!s)return Promise.reject(Error(`The screenshot ${e} cannot be read, because the assistant chat is not active. Open the assistant panel of the configuration first.`));let i=this._screenshotUrls,a=s.authorizedClient.getAssistantImage(s.configurationId,e).then(e=>URL.createObjectURL(e));return i.set(e,a),a.catch(()=>{i.get(e)===a&&i.delete(e)}),a};loadEarlierThread=async()=>{let e=this._current,t=this._olderThreadId;if(!e||null===t||this._loadingThreadId===t)return;let s=this._chain;this._loadingThreadId=t,this._chat.next({...this._chat.value,isLoadingEarlierThread:!0});try{let i=await e.authorizedClient.getAssistantEarlierThread(e.configurationId,t,50);if(this._chain!==s||this._olderThreadId!==t)return;this._olderThreadId=i.previousThreadId,this._chat.next({...this._chat.value,earlierThreads:[{threadId:t,messages:i.messages},...this._chat.value.earlierThreads],hasEarlierThread:null!==i.previousThreadId})}catch(e){this._context.domainServicesSelectors.getLogger().warn("Could not load the earlier assistant conversation",{error:e})}finally{this._chain===s&&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 s=e.getConnection();await fetch(`${s.url}/runs/${encodeURIComponent(t)}/cancel`,{method:"POST",headers:await s.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()};undoToolCalls=e=>{let t=this._context.domainContextSelectors.getUndoSystem(),s=()=>{let t=this._findTipToolCallId();return void 0!==t&&e.has(t)};for(;s();)t.undo()};setOpen=e=>{this._patchPanel(e?{open:e,hasUnreadReply:!1}:{open:e,isInputFocused:!1})};setInputFocused=e=>{this._patchPanel({isInputFocused:e})};_findRefusedMessageIndex=e=>{var t;let s,{failedStatus:i,isContinuable:a}=this._chat.value;return this._firstAttempt===e&&e.generation.active&&409===i&&!a?(s=(t=e.client.getMessages()).map(e=>e.role).lastIndexOf("user"),t.slice(s+1).every(e=>0===e.parts.length)?s:-1):-1};_sendOn=async(e,t,s)=>{let{client:i}=e;i.getIsLoading()||null===i.getResumeState()||i.stop();try{await i.sendMessage({content:t,metadata:s})}catch(s){let t=s instanceof Error?s:Error(String(s));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:s,earlierThreads:i,hasEarlierThread:a}=this._chat.value,r=this._refused?.chat===e?s.slice(0,this._refused.index):s;return e.generation.active=!1,this._current=null,e.client.stop(),e.dispose(),this._chat.next({...c,earlierThreads:[...i,{threadId:t,messages:r}],hasEarlierThread:a,isLoadingEarlierThread:null!==this._loadingThreadId}),this._startClient(),!0}catch(s){let t=s instanceof Error?s:Error(String(s));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}};_findTipToolCallId=()=>{let e=this._context.domainContextSelectors.getUndoSystem(),t=e.tip$.value?.committedState;return void 0!==t&&e.canUndo()?this._applyToolCallIds.get(t):void 0};_refreshUndoTip=()=>{let e=this._findTipToolCallId();e!==this._undoTipToolCallId.value&&this._undoTipToolCallId.next(e)};_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 s={active:!0},i=this._context.getConfigurationId();this._takeOverThread(i);let r=this._context.getAuthorizedClient(),n=()=>{if(s.active){let{manifest:e,error:t}=this._context.getAssistantSetup();if(t)throw t;if(!e)throw Error("The assistant is disabled for this session.")}return r.getAssistantChatConnection(i)},o=e=>{if(!s.active)return;let t={...this._chat.value,...e};a(t,this._chat.value)||this._chat.next(t)},l=async(e,t)=>{let i=await fetch(e,t).finally(()=>o({isLoaded:!0})),a=i.headers.get("x-assistant-thread-continuable");return null!=a&&i.ok&&s.active&&0===this._chat.value.earlierThreads.length&&(this._olderThreadId=i.headers.get("x-assistant-previous-thread")),o({failedStatus:i.ok?void 0:i.status,...null!=a&&{isContinuable:"false"!==a,hasEarlierThread:null!==this._olderThreadId}}),i},h=async()=>({headers:await n().headers(),fetchClient:l}),d=t(()=>n().url,h),c=t(()=>`${n().url}/runs`,h),u=this._tools.map(e=>({...e,execute:(t,i)=>{if(!s.active)return g;let{manifest:a,error:r}=this._context.getAssistantSetup();return r||!a?{error:r?.message??"The assistant is disabled for this session."}:e.execute?.(t,i)}})),_=new e({threadId:`assistant:${i}`,connection:{...d,joinRun:c.joinRun},persistence:!0,history:{pageSize:50},tools:u,onMessagesChange:e=>o({messages:e}),onLoadingChange:e=>{let t=s.active&&this._chat.value.isLoading;o({isLoading:e}),!e&&f(_)&&(s.active?t&&!this._panel.value.open&&this._patchPanel({hasUnreadReply:!0}):p())},onErrorChange:e=>{s.active&&e!==this._chat.value.error&&(!e||-1===this._findRefusedMessageIndex(v))&&(o({error:e}),e&&this._context.domainServicesSelectors.getLogger().error("The assistant request failed",{status:this._chat.value.failedStatus},e))}}),m=!1,p=()=>{m||(m=!0,this._finishing.delete(v),_.dispose())},v={client:_,configurationId:i,generation:s,authorizedClient:r,getConnection:n,dispose:p};this._current=v,_.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};_releaseScreenshotUrls=()=>{for(let e of this._screenshotUrls.values())e.then(URL.revokeObjectURL,()=>void 0);this._screenshotUrls=new Map};_endChat=()=>{let e=this._retireChat();if(e){if(!e.client.getIsLoading()&&f(e.client))return void e.dispose();this._finishing.add(e)}}}
1
+ import{ChatClient as t,fetchServerSentEvents as e}from"@tanstack/ai-client";import{BehaviorSubject as a,firstValueFrom as i,race as s,timer as n}from"rxjs";import{filter as r,skip as o}from"rxjs/operators";import{isShallowEqual as l}from"@salsita-ai/common/utils";import{assistantImageReference as h}from"@salsita-ai/contracts/assistant";import{AssistantRequestError as c}from"#package/client";import{ChangeRecorder as d}from"./change-recorder.js";import{createApplyClientTool as u,createQueryClientTool as _,toToolResult as g}from"./graphql-tools.js";let f=Object.freeze({messages:Object.freeze([]),isLoading:!1,error:void 0,failedStatus:void 0,retryAfterSeconds:void 0,isContinuable:!0,isLoaded:!1,isResuming:!1,earlierThreads:Object.freeze([]),earlierThreadId:null,isLoadingEarlierThread:!1,hasOlderMessages:!1,isLoadingOlderMessages:!1}),v=Object.freeze({top:0,right:0,bottom:0,left:0}),m=Object.freeze({kind:"transition"}),p=Object.freeze({open:!1,hasUnreadReply:!1,isInputFocused:!1}),S=Object.freeze({}),y=g({results:[],committed:!1,sideEffects:[],warnings:[],screenshots:new Map,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."}),x=t=>{if(t.getError())return!0;let e=t.getMessages().at(-1)?.parts.at(-1);return e?.type!=="tool-call"&&e?.type!=="tool-result"},w=async t=>{try{let e=await t.clone().json(),a=e?.page;return a?.truncated===!0&&"string"==typeof a.cursor&&""!==a.cursor}catch{return!1}};export class AssistantSystem{_context;_tools;_chat=new a(f);_panel=new a(p);_annotationOverlay=new a(null);_annotationRun=null;_activation=null;_current=null;_finishing=new Set;_resuming=null;_refused=null;_firstAttempt=null;_chain={};_recorder;_recording=null;_applyToolCallIds=new WeakMap;_undoTipToolCallId=new a(void 0);_screenshotUrls=new Map;constructor(t){this._context=t;let{configuratorExtensionSelectors:e,domainContextSelectors:a,domainServicesSelectors:i,getAssistantSetup:s}=t;this._recorder=new d({maxEntities:30},{readers:{selectedEntityId:t=>a.getNavigationSystem().getActiveSelectionState(t),navigationState:t=>a.getNavigationSystem().getActiveNavigationState(t),viewState:t=>a.getNavigationSystem().getActiveViewState(t),toolState:t=>a.getNavigationSystem().getActiveToolState(t)},getExposedFields:()=>s().manifest?.fields??S,resolveLocalizable:t=>i.getResolveLocalizable()(t)});let n={getGraphQLSystem:()=>e.getGraphQLSystem(),getStoreSystem:()=>a.getStoreSystem(),getActiveMode:()=>a.getActiveMode(),getIsViewMode:()=>a.getIsViewMode(),clearChanges:()=>this._recorder.clear(this._committedState()),rememberCommit:(t,e)=>{this._applyToolCallIds.set(e,t),this._refreshUndoTip()}};this._tools=[_(n),u(n)],a.getUndoSystem().tip$.subscribe(this._refreshUndoTip)}chat$=this._chat;panel$=this._panel;annotationOverlay$=this._annotationOverlay;undoTipToolCallId$=this._undoTipToolCallId;getSessionManifest=()=>this._context.getAssistantSetup().manifest;initialize=()=>{let{committed:t}=this._context.domainContextSelectors.getStoreSystem().stateSlices;this._recording??=t.pipe(o(1)).subscribe(this._recorder.record),this._recorder.reset(t.value.state),this._endChat(),this._patchPanel(p),this._releaseScreenshotUrls(),this._closeAnnotationOverlay(),this._activation&&this._startClient()};activate=()=>{this._endChat();let t={};return this._activation=t,this._startClient(),()=>{this._activation===t&&(this._activation=null,this._endChat())}};send=async(t,e=[],{onSent:a,onUnsent:i}={})=>{if(!this._chat.value.isContinuable&&!await this.resume())return;let s=this._current;if(!s)return;let n={changes:this._recorder.take(this._committedState()),locale:this._context.domainServicesSelectors.getI18n().locale},r=()=>this._recorder.reset(this._committedState()),o=e.map(t=>t instanceof Blob?t:t.blob),l=!1,h=(i,s)=>{l||(l=!0,a?.());let r=e.flatMap((t,e)=>{let a=s[e];return t instanceof Blob||void 0===a?[]:[{imageId:a,pins:t.pins}]});return this._sendOn(i,this._messageContent(t,s),0===r.length?n:{...n,annotations:r})};this._firstAttempt=s;try{let t=0===o.length?[]:await this._uploadImages(s,o);if(null===t||!s.generation.active)return void r();if("refused"!==t){await h(s,t);let e=this._findRefusedMessageIndex(s);if(-1===e)return;this._refused={chat:s,index:e}}}finally{this._firstAttempt===s&&(this._firstAttempt=null)}if(!await this.resume()){l||r();return}let c=this._current,d=c?await this._uploadSuccessorImages(c,o):null;if(!c||null===d||"refused"===d||!c.generation.active){c&&"refused"===d&&this._reportUploadFailure(c,this._chat.value.error),l&&i?.(),r();return}await h(c,d)};annotate=async()=>{if(null!==this._annotationOverlay.value)return null;let{getCameraControlSystem:t,getCanvasSystem:e}=this._context.configuratorExtensionSelectors,a=t(),o=e().r3fHandle$.value?.get().frameloop==="demand",l={},h=()=>this._annotationRun===l;if(this._annotationRun=l,this._annotationOverlay.next(m),await i(s(a.transitionState$.pipe(r(t=>"still"===t||"sleep"===t&&!o)),n(2e3))),!h())return this._annotationOverlay.next(null),null;let c=a.holdCameraOffset(),d=null;try{await a.glideCameraOffset(v);let t=await this._context.freezeView();h()&&(d=await new Promise(e=>{this._annotationOverlay.next({kind:"editor",view:t,finish:e})}))}catch(e){let t=e instanceof Error?e:Error(String(e));this._context.domainServicesSelectors.getLogger().error("The configurator view could not be frozen for an annotation",{},t)}this._annotationOverlay.next(m);try{await a.glideCameraOffset(a.canvasPadding$.value)}finally{c(),this._annotationOverlay.next(null),h()&&(this._annotationRun=null)}return d};viewAnnotation=t=>{if(null!==this._annotationOverlay.value)return;let e={kind:"viewer",annotation:t,close:()=>{this._annotationOverlay.value===e&&this._annotationOverlay.next(null)}};this._annotationOverlay.next(e)};resume=async()=>{let t=this._current;if(!t)return!1;if(this._chat.value.isContinuable)return!0;if(this._resuming)return this._resuming;let e=this._compact(t).finally(()=>{this._resuming===e&&(this._resuming=null)});return this._resuming=e,e};loadScreenshotUrl=t=>{let e=this._screenshotUrls.get(t);if(e)return e;let a=this._current;if(!a)return Promise.reject(Error(`The screenshot ${t} cannot be read, because the assistant chat is not active. Open the assistant panel of the configuration first.`));let i=this._screenshotUrls,s=a.authorizedClient.getAssistantImage(a.configurationId,t).then(t=>URL.createObjectURL(t));return i.set(t,s),s.catch(()=>{i.get(t)===s&&i.delete(t)}),s};loadEarlierThread=async()=>{let t=this._current,{earlierThreadId:e,isLoadingEarlierThread:a,hasOlderMessages:i}=this._chat.value;if(!t||null===e||a||i)return;let s=this._chain;this._chat.next({...this._chat.value,isLoadingEarlierThread:!0});try{let a=await t.authorizedClient.getAssistantEarlierThread(t.configurationId,e);if(this._chain!==s||this._chat.value.earlierThreadId!==e)return;let[i,...n]=this._chat.value.earlierThreads,r={threadId:e,messages:a.messages};this._chat.next({...this._chat.value,earlierThreads:i?.threadId===e?[r,...n]:[r,...this._chat.value.earlierThreads],earlierThreadId:a.previousThreadId})}catch(t){this._context.domainServicesSelectors.getLogger().warn("Could not load the earlier assistant conversation",{error:t})}finally{this._chain===s&&this._chat.next({...this._chat.value,isLoadingEarlierThread:!1})}};loadOlderMessages=async()=>{let t=this._current,{hasOlderMessages:e,isLoadingOlderMessages:a}=this._chat.value;if(t&&e&&!a){this._chat.next({...this._chat.value,isLoadingOlderMessages:!0});try{await t.client.loadOlderMessages()}catch(t){this._context.domainServicesSelectors.getLogger().warn("Could not load older assistant messages",{error:t})}finally{t===this._current&&this._chat.next({...this._chat.value,hasOlderMessages:t.client.getHasOlderMessages(),isLoadingOlderMessages:!1})}}};stop=async()=>{let t=this._current;if(!t)return;let e=t.client.getCurrentRunId();if(t.client.stop(),null!=e)try{let a=t.getConnection();await fetch(`${a.url}/runs/${encodeURIComponent(e)}/cancel`,{method:"POST",headers:await a.headers()})}catch(t){this._context.domainServicesSelectors.getLogger().warn("Could not cancel the assistant run on the server",{error:t})}};reloadThread=()=>{if(!this._activation)return;let t=this._retireChat();t?.client.stop(),t?.dispose(),this._recorder.reset(this._committedState()),this._startClient()};undoToolCalls=t=>{let e=this._context.domainContextSelectors.getUndoSystem(),a=()=>{let e=this._findTipToolCallId();return void 0!==e&&t.has(e)};for(;a();)e.undo()};setOpen=t=>{this._patchPanel(t?{open:t,hasUnreadReply:!1}:{open:t,isInputFocused:!1})};setInputFocused=t=>{this._patchPanel({isInputFocused:t})};_closeAnnotationOverlay=()=>{let t=this._annotationOverlay.value;this._annotationRun=null,t?.kind==="editor"&&t.finish(null),t?.kind==="viewer"&&t.close()};_findRefusedMessageIndex=t=>{var e;let a,{failedStatus:i,isContinuable:s}=this._chat.value;return this._firstAttempt===t&&t.generation.active&&409===i&&!s?(a=(e=t.client.getMessages()).map(t=>t.role).lastIndexOf("user"),e.slice(a+1).every(t=>0===t.parts.length)?a:-1):-1};_messageContent=(t,e)=>0===e.length?t:[...t?[{type:"text",content:t}]:[],...e.map(t=>({type:"image",source:{type:"url",value:h(t)}}))];_uploadImages=async(t,e)=>{if(0===e.length)return[];t.generation.active&&this._chat.next({...this._chat.value,error:void 0,failedStatus:void 0});try{return(await Promise.all(e.map(e=>t.authorizedClient.uploadAssistantImage(t.configurationId,e)))).map(({imageId:t})=>t)}catch(a){let e=a instanceof Error?a:Error(String(a));if(e instanceof c&&e.threadNotContinuable)return t.generation.active&&this._chat.next({...this._chat.value,isContinuable:!1,error:e,failedStatus:e.status}),"refused";return this._reportUploadFailure(t,e),null}};_uploadSuccessorImages=async(t,e)=>{if(0===e.length)return[];this._chat.next({...this._chat.value,isResuming:!0});try{return await this._uploadImages(t,e)}finally{t.generation.active&&this._chat.next({...this._chat.value,isResuming:!1})}};_reportUploadFailure=(t,e)=>{t.generation.active&&this._chat.next({...this._chat.value,error:e,failedStatus:e instanceof c?e.status:void 0}),this._context.domainServicesSelectors.getLogger().error("The images of the assistant message could not be uploaded",{},e)};_sendOn=async(t,e,a)=>{let{client:i}=t;i.getIsLoading()||null===i.getResumeState()||i.stop();try{await i.sendMessage({content:e,metadata:a})}catch(a){let e=a instanceof Error?a:Error(String(a));t.generation.active&&this._chat.next({...this._chat.value,error:e}),this._context.domainServicesSelectors.getLogger().error("The assistant message could not be sent",{},e)}};_compact=async t=>{this._chat.next({...this._chat.value,isResuming:!0,error:void 0,failedStatus:void 0});try{let{previousThreadId:e}=await t.authorizedClient.compactAssistantThread(t.configurationId);if(!t.generation.active)return!1;let{messages:a,earlierThreads:i,earlierThreadId:s,isLoadingEarlierThread:n}=this._chat.value,r=this._refused?.chat===t?a.slice(0,this._refused.index):a,o=t.client.getHasOlderMessages()?e:s;return t.generation.active=!1,this._current=null,t.client.stop(),t.dispose(),this._chat.next({...f,earlierThreads:[...i,{threadId:e,messages:r}],earlierThreadId:o,isLoadingEarlierThread:n}),this._startClient(),!0}catch(a){let e=a instanceof Error?a:Error(String(a));if(e instanceof c&&409===e.status)return t.generation.active&&this.reloadThread(),!1;return t.generation.active&&this._chat.next({...this._chat.value,isResuming:!1,error:e,failedStatus:e instanceof c?e.status:void 0}),this._context.domainServicesSelectors.getLogger().error("The assistant thread could not be resumed",{},e),!1}};_findTipToolCallId=()=>{let t=this._context.domainContextSelectors.getUndoSystem(),e=t.tip$.value?.committedState;return void 0!==e&&t.canUndo()?this._applyToolCallIds.get(e):void 0};_refreshUndoTip=()=>{let t=this._findTipToolCallId();t!==this._undoTipToolCallId.value&&this._undoTipToolCallId.next(t)};_committedState=()=>this._context.domainContextSelectors.getStoreSystem().stateSlices.committed.value.state;_patchPanel=t=>{let e={...this._panel.value,...t};l(e,this._panel.value)||this._panel.next(e)};_takeOverThread=t=>{for(let e of this._finishing)e.configurationId===t&&(e.client.stop(),e.dispose())};_startClient=()=>{let a={active:!0},i=this._context.getConfigurationId();this._takeOverThread(i);let s=this._context.getAuthorizedClient(),n=()=>{if(a.active){let{manifest:t,error:e}=this._context.getAssistantSetup();if(e)throw e;if(!t)throw Error("The assistant is disabled for this session.")}return s.getAssistantChatConnection(i)},r=t=>{if(!a.active)return;let e={...this._chat.value,...t};l(e,this._chat.value)||this._chat.next(e)},o=async(t,e)=>{let a,i=await fetch(t,e).finally(()=>r({isLoaded:!0})),s=i.headers.get("x-assistant-thread-continuable"),n=null!=s&&i.ok&&0===this._chat.value.earlierThreads.length,o=n?i.headers.get("x-assistant-previous-thread"):null;return r({failedStatus:i.ok?void 0:i.status,retryAfterSeconds:i.ok?void 0:null!==(a=i.headers.get("retry-after"))&&/^\d+$/.test(a.trim())?Number(a):void 0,...null!=s&&{isContinuable:"false"!==s},...n&&{earlierThreadId:o,...null!==o&&{hasOlderMessages:await w(i)}}}),i},h=async()=>({headers:await n().headers(),fetchClient:o}),c=e(()=>n().url,h),d=e(()=>`${n().url}/runs`,h),u=this._tools.map(t=>({...t,execute:(e,i)=>{if(!a.active)return y;let{manifest:s,error:n}=this._context.getAssistantSetup();return n||!s?{error:n?.message??"The assistant is disabled for this session."}:t.execute?.(e,i)}})),_=new t({threadId:`assistant:${i}`,connection:{...c,joinRun:d.joinRun},persistence:!0,history:{pageSize:50},tools:u,onMessagesChange:t=>r({messages:t,hasOlderMessages:_.getHasOlderMessages()}),onLoadingChange:t=>{let e=a.active&&this._chat.value.isLoading;r({isLoading:t}),!t&&x(_)&&(a.active?e&&!this._panel.value.open&&this._patchPanel({hasUnreadReply:!0}):f())},onErrorChange:t=>{a.active&&t!==this._chat.value.error&&(!t||-1===this._findRefusedMessageIndex(v))&&(r({error:t}),t&&this._context.domainServicesSelectors.getLogger().error("The assistant request failed",{status:this._chat.value.failedStatus},t))}}),g=!1,f=()=>{g||(g=!0,this._finishing.delete(v),_.dispose())},v={client:_,configurationId:i,generation:a,authorizedClient:s,getConnection:n,dispose:f};this._current=v,_.attach()};_retireChat=()=>{let t=this._current;return this._current=null,t&&(t.generation.active=!1),this._chain={},this._resuming=null,this._refused=null,this._chat.value!==f&&this._chat.next(f),t};_releaseScreenshotUrls=()=>{for(let t of this._screenshotUrls.values())t.then(URL.revokeObjectURL,()=>void 0);this._screenshotUrls=new Map};_endChat=()=>{let t=this._retireChat();if(t){if(!t.client.getIsLoading()&&x(t.client))return void t.dispose();this._finishing.add(t)}}}
@@ -65,6 +65,10 @@ export declare class CameraControlSystem {
65
65
  */
66
66
  private readonly _canvasPadding$;
67
67
  readonly canvasPadding$: ObservableWithLastValue<CanvasPadding>;
68
+ /** The padding the interactive cameras were last offset by, through `applyCameraOffset`. */
69
+ private _appliedCameraOffset;
70
+ /** How many holders keep CameraPadding from writing the offset; see `holdCameraOffset`. */
71
+ private _cameraOffsetHolds;
68
72
  private _generation;
69
73
  private _pendingAbortController;
70
74
  private _lastTransition;
@@ -118,6 +122,45 @@ export declare class CameraControlSystem {
118
122
  readonly fitRootCamera: () => void;
119
123
  readonly fitEntity: (id: DomainEntityId<string>) => void;
120
124
  readonly setCameraOffset: (props: CameraOffsetProps) => void;
125
+ /**
126
+ * The padding the interactive cameras were last offset by; a glide starts from it.
127
+ *
128
+ * @internal
129
+ */
130
+ get appliedCameraOffset(): CanvasPadding;
131
+ /**
132
+ * True while someone else than CameraPadding owns the offset of the interactive cameras.
133
+ *
134
+ * @internal
135
+ */
136
+ get isCameraOffsetHeld(): boolean;
137
+ /**
138
+ * Takes the offset of the interactive cameras over from CameraPadding, which stops writing it until
139
+ * every hold is released, so the holder can move the view without a refit (see
140
+ * `glideCameraOffset`). Releasing wakes the frameloop, so CameraPadding glides on from wherever the
141
+ * holder left the offset. The returned release does nothing when called again.
142
+ *
143
+ * @internal
144
+ */
145
+ readonly holdCameraOffset: () => (() => void);
146
+ /**
147
+ * Offsets both interactive cameras by `padding` against the measured canvas viewport. Nothing
148
+ * happens while no canvas has been measured: there is no viewport to offset against.
149
+ *
150
+ * @internal
151
+ */
152
+ readonly applyCameraOffset: (padding: CanvasPadding) => void;
153
+ /**
154
+ * Moves the offset of the interactive cameras from the applied padding to `to` in a fixed time, a
155
+ * frame at a time, and resolves once it is there. The offset is a function of the elapsed time, so
156
+ * a slow device shows fewer frames but takes no longer. With reduced motion it is set at once.
157
+ * Meant for the holder of `holdCameraOffset`; CameraPadding would otherwise overwrite every step.
158
+ *
159
+ * @internal
160
+ */
161
+ readonly glideCameraOffset: (to: CanvasPadding) => Promise<void>;
162
+ /** Wakes the demand frameloop of the mounted canvas, so an offset written outside a frame is drawn. */
163
+ private readonly _invalidate;
121
164
  initialize: () => void;
122
165
  }
123
166
  export {};
@@ -1 +1 @@
1
- import t from"promise-queue";import{BehaviorSubject as e,Subject as r,debounceTime as a,map as i,of as o,shareReplay as s,startWith as n,switchMap as h}from"rxjs";import{OrthographicCamera as l,PerspectiveCamera as p}from"three";import{match as c}from"ts-pattern";import{DEFAULT_DIMENSION_UNIT as C,distanceUnitToDefault as m}from"#package/domain";import{createCameraControls as g}from"./create-camera-controls.js";export const CameraControlType={Perspective:"perspective",Orthographic:"orthographic"};let d=t=>Number.isFinite(t.width)&&Number.isFinite(t.height)&&t.width>0&&t.height>0;export class CameraControlSystem{_context;perspectiveCamera=Object.assign(new p,{manual:!0});orthographicCamera=Object.assign(new l,{manual:!0});perspectiveCameraControls=g(this.perspectiveCamera);orthographicCameraControls=g(this.orthographicCamera);_transitionState$=new e("still");_rendered$=new r;_transitionQueue=new t(1,1/0);_activeCameraControls$=new e(void 0);activeCameraControls$=this._activeCameraControls$;_canvasPadding$=new e({top:0,right:0,bottom:0,left:0});canvasPadding$=this._canvasPadding$;_generation=null;_pendingAbortController=void 0;_lastTransition=void 0;_cameraControlState$=new e("idle");cameraControlState$=this._cameraControlState$;transitionState$=this._transitionState$.pipe(h(t=>"sleep"===t?this._rendered$.pipe(a(200),i(()=>"still"),n("sleep")):o(t)),s(1));constructor(t){this._context=t,this.perspectiveCamera.fov=50,this.perspectiveCamera.near=m(500,C),this.perspectiveCamera.far=m(4e4,C),this.perspectiveCamera.position.set(0,1,0),this.orthographicCamera.left=m(-500,C),this.orthographicCamera.bottom=m(-500,C),this.orthographicCamera.right=m(500,C),this.orthographicCamera.top=m(500,C),this.orthographicCamera.far=m(4e4,C),this.orthographicCamera.near=m(500,C),this.orthographicCamera.position.set(0,1,0),this._context.configuratorExtensionSelectors.getCanvasSystem().interactiveViewport$.subscribe(t=>{null!==t&&this.handleCanvasResize(t)})}_seedCameraControls=()=>{this.perspectiveCameraControls.enabled=!0,this.orthographicCameraControls.enabled=!0,this.perspectiveCameraControls.rotateTo(0,1.2,!1),this.orthographicCameraControls.rotateTo(0,1.2,!1),this.orthographicCameraControls.dollyTo(m(1e4,C),!1)};resetCamera=()=>{this._lastTransition&&this.scheduleCameraTransition(this._lastTransition,{bypassViewLocks:!0})};setTransitionState=t=>{this._transitionState$.next(t)};reportRender=()=>{this._rendered$.next()};scheduleCameraTransition(t,e={}){this._pendingAbortController?.abort();let r=new AbortController;this._pendingAbortController=r;let a=this._generation;return{finished:this._transitionQueue.add(async()=>{let i=r.signal;if(i.aborted||!a?.active)return;let o=c(t.cameraType).with(CameraControlType.Perspective,()=>this.perspectiveCameraControls).with(CameraControlType.Orthographic,()=>this.orthographicCameraControls).exhaustive(),s=null==this._activeCameraControls$.value,n=this._activeCameraControls$.value!==o;n&&this._activeCameraControls$.next(o),this._lastTransition=t,await t.run({controls:o,camera:o.camera,abortSignal:i,firstLoad:s,typeChanged:n,bypassViewLocks:!0===e.bypassViewLocks})}),abort:()=>{r.abort()}}}setCameraControlState=t=>{this._cameraControlState$.next(t)};handleCanvasResize=t=>{if(!d(t))return;let e=t.width/t.height;this.perspectiveCamera.aspect=e,this.perspectiveCamera.updateProjectionMatrix();let r=this.orthographicCamera,a=(r.left+r.right)/2,i=(r.top-r.bottom)/2*e;r.left=a-i,r.right=a+i,r.updateProjectionMatrix()};setCanvasPadding=t=>{let e=this._canvasPadding$.value;(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)&&this._canvasPadding$.next(t)};enable=()=>{this.perspectiveCameraControls.enabled=!0,this.orthographicCameraControls.enabled=!0};disable=()=>{this.perspectiveCameraControls.enabled=!1,this.orthographicCameraControls.enabled=!1};fitRootCamera=()=>{let t=this._context.configuratorExtensionSelectors.getCanvasSystem().ready$.value?.scene;t&&this.perspectiveCameraControls.fitToSphere(t,!1)};fitEntity=t=>{let e=this._context.configuratorExtensionSelectors.getCanvasSystem().ready$.value?.scene;if(!e)return;let r=e.getObjectByName(t.toString());null!=r&&this.perspectiveCameraControls.fitToBox(r,!1)};setCameraOffset=t=>{let{padding:e,viewPort:r,camera:a}=t;if(!d(r))return;if(![e.top,e.right,e.bottom,e.left].every(Number.isFinite)||e.left+e.right>=r.width||e.top+e.bottom>=r.height)return void a.clearViewOffset();let i=(e.right-e.left)/2,o=(e.bottom-e.top)/2;a.setViewOffset(r.width,r.height,i,o,r.width,r.height)};initialize=()=>{null!==this._generation&&(this._generation.active=!1),this._pendingAbortController?.abort(),this._pendingAbortController=void 0,this._lastTransition=void 0,this._transitionState$.next("still"),this._cameraControlState$.next("idle"),this._activeCameraControls$.next(void 0),this._generation={active:!0},this._seedCameraControls()}}
1
+ import t from"promise-queue";import{BehaviorSubject as e,Subject as a,debounceTime as r,map as i,of as o,shareReplay as s,startWith as n,switchMap as h}from"rxjs";import{OrthographicCamera as l,PerspectiveCamera as m}from"three";import{match as p}from"ts-pattern";import{DEFAULT_DIMENSION_UNIT as c,distanceUnitToDefault as C}from"#package/domain";import{createCameraControls as d}from"./create-camera-controls.js";export const CameraControlType={Perspective:"perspective",Orthographic:"orthographic"};let f=Object.freeze({top:0,right:0,bottom:0,left:0}),g=t=>Number.isFinite(t.width)&&Number.isFinite(t.height)&&t.width>0&&t.height>0;export class CameraControlSystem{_context;perspectiveCamera=Object.assign(new m,{manual:!0});orthographicCamera=Object.assign(new l,{manual:!0});perspectiveCameraControls=d(this.perspectiveCamera);orthographicCameraControls=d(this.orthographicCamera);_transitionState$=new e("still");_rendered$=new a;_transitionQueue=new t(1,1/0);_activeCameraControls$=new e(void 0);activeCameraControls$=this._activeCameraControls$;_canvasPadding$=new e({top:0,right:0,bottom:0,left:0});canvasPadding$=this._canvasPadding$;_appliedCameraOffset=f;_cameraOffsetHolds=0;_generation=null;_pendingAbortController=void 0;_lastTransition=void 0;_cameraControlState$=new e("idle");cameraControlState$=this._cameraControlState$;transitionState$=this._transitionState$.pipe(h(t=>"sleep"===t?this._rendered$.pipe(r(200),i(()=>"still"),n("sleep")):o(t)),s(1));constructor(t){this._context=t,this.perspectiveCamera.fov=50,this.perspectiveCamera.near=C(500,c),this.perspectiveCamera.far=C(4e4,c),this.perspectiveCamera.position.set(0,1,0),this.orthographicCamera.left=C(-500,c),this.orthographicCamera.bottom=C(-500,c),this.orthographicCamera.right=C(500,c),this.orthographicCamera.top=C(500,c),this.orthographicCamera.far=C(4e4,c),this.orthographicCamera.near=C(500,c),this.orthographicCamera.position.set(0,1,0),this._context.configuratorExtensionSelectors.getCanvasSystem().interactiveViewport$.subscribe(t=>{null!==t&&this.handleCanvasResize(t)})}_seedCameraControls=()=>{this.perspectiveCameraControls.enabled=!0,this.orthographicCameraControls.enabled=!0,this.perspectiveCameraControls.rotateTo(0,1.2,!1),this.orthographicCameraControls.rotateTo(0,1.2,!1),this.orthographicCameraControls.dollyTo(C(1e4,c),!1)};resetCamera=()=>{this._lastTransition&&this.scheduleCameraTransition(this._lastTransition,{bypassViewLocks:!0})};setTransitionState=t=>{this._transitionState$.next(t)};reportRender=()=>{this._rendered$.next()};scheduleCameraTransition(t,e={}){this._pendingAbortController?.abort();let a=new AbortController;this._pendingAbortController=a;let r=this._generation;return{finished:this._transitionQueue.add(async()=>{let i=a.signal;if(i.aborted||!r?.active)return;let o=p(t.cameraType).with(CameraControlType.Perspective,()=>this.perspectiveCameraControls).with(CameraControlType.Orthographic,()=>this.orthographicCameraControls).exhaustive(),s=null==this._activeCameraControls$.value,n=this._activeCameraControls$.value!==o;n&&this._activeCameraControls$.next(o),this._lastTransition=t,await t.run({controls:o,camera:o.camera,abortSignal:i,firstLoad:s,typeChanged:n,bypassViewLocks:!0===e.bypassViewLocks})}),abort:()=>{a.abort()}}}setCameraControlState=t=>{this._cameraControlState$.next(t)};handleCanvasResize=t=>{if(!g(t))return;let e=t.width/t.height;this.perspectiveCamera.aspect=e,this.perspectiveCamera.updateProjectionMatrix();let a=this.orthographicCamera,r=(a.left+a.right)/2,i=(a.top-a.bottom)/2*e;a.left=r-i,a.right=r+i,a.updateProjectionMatrix()};setCanvasPadding=t=>{let e=this._canvasPadding$.value;(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)&&this._canvasPadding$.next(t)};enable=()=>{this.perspectiveCameraControls.enabled=!0,this.orthographicCameraControls.enabled=!0};disable=()=>{this.perspectiveCameraControls.enabled=!1,this.orthographicCameraControls.enabled=!1};fitRootCamera=()=>{let t=this._context.configuratorExtensionSelectors.getCanvasSystem().ready$.value?.scene;t&&this.perspectiveCameraControls.fitToSphere(t,!1)};fitEntity=t=>{let e=this._context.configuratorExtensionSelectors.getCanvasSystem().ready$.value?.scene;if(!e)return;let a=e.getObjectByName(t.toString());null!=a&&this.perspectiveCameraControls.fitToBox(a,!1)};setCameraOffset=t=>{let{padding:e,viewPort:a,camera:r}=t;if(!g(a))return;if(![e.top,e.right,e.bottom,e.left].every(Number.isFinite)||e.left+e.right>=a.width||e.top+e.bottom>=a.height)return void r.clearViewOffset();let i=(e.right-e.left)/2,o=(e.bottom-e.top)/2;r.setViewOffset(a.width,a.height,i,o,a.width,a.height)};get appliedCameraOffset(){return this._appliedCameraOffset}get isCameraOffsetHeld(){return this._cameraOffsetHolds>0}holdCameraOffset=()=>{this._cameraOffsetHolds+=1;let t=!1;return()=>{t||(t=!0,this._cameraOffsetHolds-=1,this._invalidate())}};applyCameraOffset=t=>{let e=this._context.configuratorExtensionSelectors.getCanvasSystem().interactiveViewport$.value;null!==e&&(this.setCameraOffset({padding:t,viewPort:e,camera:this.perspectiveCamera}),this.setCameraOffset({padding:t,viewPort:e,camera:this.orthographicCamera}),this._appliedCameraOffset=t)};glideCameraOffset=async t=>{let e=this._appliedCameraOffset;if(globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches===!0){this.applyCameraOffset(t),this._invalidate();return}let a=performance.now();await new Promise(r=>{let i=o=>{let s,n=Math.min(1,Math.max(0,(o-a)/300));this.applyCameraOffset((s=n<.5?4*n*n*n:1-(-2*n+2)**3/2,{top:e.top+(t.top-e.top)*s,right:e.right+(t.right-e.right)*s,bottom:e.bottom+(t.bottom-e.bottom)*s,left:e.left+(t.left-e.left)*s})),this._invalidate(),n<1?requestAnimationFrame(i):r()};requestAnimationFrame(i)})};_invalidate=()=>{this._context.configuratorExtensionSelectors.getCanvasSystem().r3fHandle$.value?.get().invalidate()};initialize=()=>{null!==this._generation&&(this._generation.active=!1),this._pendingAbortController?.abort(),this._pendingAbortController=void 0,this._lastTransition=void 0,this._transitionState$.next("still"),this._cameraControlState$.next("idle"),this._activeCameraControls$.next(void 0),this._generation={active:!0},this._seedCameraControls()}}
@@ -1,6 +1,6 @@
1
1
  import { type ExecutionResult } from 'graphql';
2
2
  import { type Localizable } from '@salsita-ai/common/utils';
3
- import { type $DomainEntity, type AgentScreenshotComponent, type ComponentSnapshot, type DomainContextSelectors, type DomainEntity, type DomainServicesSelectors, type DomainState, type InitializationGeneration, type SessionAssistantSetup, type SpecSelectors, type StateUpdateEmission } from '#package/domain';
3
+ import { type $DomainEntity, type AgentScreenshotComponent, type ComponentSnapshot, type DomainContextSelectors, type DomainEntity, type DomainServicesSelectors, type DomainState, type InitializationGeneration, type SessionAssistantSetup, type StateUpdateEmission } from '#package/domain';
4
4
  import { type AssistantWarning } from './violations.js';
5
5
  /** One single-operation GraphQL document with its own variables, as executed by {@link GraphQLSystem}. */
6
6
  export interface GraphQLOperation {
@@ -31,7 +31,6 @@ export interface GraphQLSystemContext {
31
31
  readonly uploadScreenshot: (image: Blob) => Promise<{
32
32
  readonly imageId: string;
33
33
  }>;
34
- readonly specSelectors: SpecSelectors;
35
34
  readonly domainContextSelectors: DomainContextSelectors;
36
35
  readonly domainServicesSelectors: DomainServicesSelectors;
37
36
  }
@@ -82,6 +81,13 @@ export interface GraphQLExecution {
82
81
  * `null` and values that are not localizable pass through, so the schema's nullability decides.
83
82
  */
84
83
  export declare const localize: (value: unknown, resolveLocalizable: (message: Localizable) => string) => unknown;
84
+ /**
85
+ * The code of the error a screenshot that was not taken fails its own field with. Such an error is
86
+ * no failure of its operation: the screenshot is only a look at the configuration, so it neither
87
+ * stops the operations after it nor keeps `apply` from committing, and the assistant panel shows a
88
+ * query that failed only on it as done.
89
+ */
90
+ export declare const SCREENSHOT_NOT_TAKEN = "SCREENSHOT_NOT_TAKEN";
85
91
  /**
86
92
  * Executes GraphQL operations against the schema generated from the application spec `assistant`
87
93
  * manifest, resolving it against the committed domain state. Agent-independent: the assistant's
@@ -1 +1 @@
1
- import{GraphQLError as e,NoSchemaIntrospectionCustomRule as t,defaultFieldResolver as i,execute as n,getNamedType as o,parse as r,specifiedRules as a,validate as s,validateSchema as l}from"graphql";import{assertExistence as c,createSelector as h,isMessageDescriptor as d,isMultilingualString as u}from"@salsita-ai/common/utils";import{DomainEntityIdSchema as m,agentScreenshotComponent as f,createAssistantExecutionSchema as p,findAssistantMutation as g}from"#package/domain";import{ExportBusyError as v}from"../export-system/export-busy-error.js";import{closeUnclosedBraces as y}from"./close-unclosed-braces.js";import{createEntityMeta as S}from"./entity-meta.js";import{injectAssistantLenses as _}from"./inject-assistant-lenses.js";import{readSideEffects as w}from"./side-effects.js";import{ViolationsError as x,readStateWarnings as b,readViolationEntries as E}from"./violations.js";let $={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.")]},T={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.")]},C="Not taken: another configuration was loaded while this request ran. Query the current configuration before asking for screenshots again.",M=new RegExp(m.pattern),R=[...a,t],j=e=>"object"==typeof e&&null!==e&&"type"in e&&"string"==typeof e.type&&"id"in e&&"string"==typeof e.id,k=(e,t)=>"object"==typeof e&&null!==e?Reflect.get(e,t):void 0,N=e=>e instanceof Error?e.message:String(e),A=e=>/[.!?]$/.test(e)?e:`${e}.`,z=e=>"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===Object.prototype,L=(e,t)=>{let i=z(e)?e._raw:void 0;if(j(i))return i;if(!Array.isArray(e)&&!z(e))return e;if(t.has(e))throw Error("The value contains itself.");let n=new Set([...t,e]);return Array.isArray(e)?e.map(e=>L(e,n)):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,L(t,n)]))};export const localize=(e,t)=>Array.isArray(e)?e.map(e=>localize(e,t)):"string"==typeof e||d(e)||u(e)?t(e):e;let q=t=>new e(`The configurator cannot handle this request: ${A(t)} This is a fault in the configurator, not in your request. Tell the user this is not available.`),O="SCREENSHOT_NOT_TAKEN",F=(t,i)=>new e(t,{originalError:i,extensions:{code:O}}),I=e=>(e.errors??[]).some(e=>e.extensions.code!==O),V=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=h([h.leaf(e=>e)],e=>{try{let t=p(e),i=l(t);return i.length>0?q(i.map(e=>e.message).join(" ")):t}catch(e){return q(N(e))}});_selectLenses=h([h.leaf(e=>e)],e=>r(e));_selectFieldResolver=h([h.leaf(e=>e)],t=>(n,r,a,s)=>{if(s.parentType===s.schema.getQueryType())return i(n,r,a,s);if(s.parentType===s.schema.getMutationType())return this._resolveMutation(s.fieldName,String(s.path.key),r,a);if(!j(n))return i(n,r,a,s);if("meta"===s.fieldName){let e;return S({entity:n,state:("object"==typeof(e=k(n,"_state"))&&null!==e&&"entities"in e&&"rootEntityId"in e?e:void 0)??a.state},{manifest:a.manifest,recipes:this._recipeContext(),prepareStateEmission:(e,t,i)=>{let n=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(e,t,i);return a.validities.set(n.state,n.validity),n},find$Entity:(e,t)=>this._find$Entity(e,t),validateEntity:e=>this._context.domainContextSelectors.getDomain().validateEntity(e),takeScreenshot:(e,t)=>this._takeScreenshot(e,t,a),validateState:e=>this._validateCached(e,a)})}let{source:l,localized:c}=t[s.parentType.name]?.[s.fieldName]??{source:s.fieldName},h=((t,i)=>{try{return k(t,i)}catch(n){throw new e(`Expression "${i}" failed on ${j(t)?t.id:"an entity"}: ${A(N(n))} This is a fault in the configurator, not in your request. Tell the user this is not available.`,{originalError:n instanceof Error?n:void 0})}})(n,l);return c?localize(h,this._context.domainServicesSelectors.getResolveLocalizable()):l.startsWith("$")&&"JSON"===o(s.returnType).name?((t,i,n)=>{try{return L(n,new Set)}catch(n){throw new e(`Expression "${i}" returned a value that is not plain serializable data on ${j(t)?t.id:"an entity"}: ${A(N(n))} This is a fault in the configurator, not in your request. Tell the user this is not available.`,{originalError:n instanceof Error?n:void 0})}})(n,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;_validateState=e=>this._context.domainContextSelectors.getValidationProjections().validateState(e);_validateCached=(e,{validities:t})=>{let i=t.get(e);if(i)return i;let n=this._validateState(e);return t.set(e,n),n};_recipeContext=()=>({componentReader:this._context.domainContextSelectors.getComponentReader(),recipeCooker:this._context.domainContextSelectors.getRecipeCookerSystem(),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});_rootValue={warnings:(e,t)=>b(this._validateCached(t.state,t),void 0,this._context.domainServicesSelectors.getResolveLocalizable()),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 n=i.rootEntityId;let o=t.filter(e=>!M.test(e));if(o.length>0)throw new e(`${o.map(e=>`"${e}"`).join(", ")} ${1===o.length?"is not an entity id":"are not entity ids"}. Entity ids have the form "<Type>-<number>", e.g. "${n}". Use ids as returned by the "id" field.`);return t.map(e=>M.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=>j(e)?e.type:void 0;_generation={active:!0};_renderScreenshot=async(e,t,i)=>{let n=this._context.domainContextSelectors.getComponentReader().readOneComponent({entityId:e,componentType:f,instanceName:t},i);if(!n)return null;let o=await this._context.renderScreenshot(n,i);return null===o?null:new Blob([o],{type:"JPEG"===n.state.fileFormat?"image/jpeg":"image/png"})};initialize=()=>{this._generation.active=!1,this._generation={active:!0}};_resolveMutation=(t,i,n,o)=>{if(void 0!==o.failedMutationField)throw new e(`Not run: the earlier field "${o.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,n,o)}catch(e){throw o.failedMutationField=i,e}};_runMutation=(t,i,n)=>{let o=g(t,n.manifest);if(!o)throw new e(`The schema declares the mutation "${t}", but the configurator has no implementation for it. This is a fault in the configurator, not in your request. Tell the user this is not available.`);let r=n.state,a=o.implementation(i,r,{manifest:n.manifest,action:this._context.domainContextSelectors.getActionSystem().createContext(r),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});if(a.updates.length>0){let i=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(a.updates,r,"committed"),{validity:o}=i;if("uncaught"===o.severity)throw new e(`The changes of "${t}" were not applied, because the resulting configuration is invalid: validating it threw: ${A(N(o.error))} Change the request so the configuration stays valid.`,{originalError:o.error});if(!o.valid)throw new x(`The changes of "${t}" were not applied, because the resulting configuration has ${o.severity} violations.`,E(o,this._context.domainServicesSelectors.getResolveLocalizable()));n.emissions.push(i),n.validities.set(i.state,o),n.state=i.state}return a.readResult({previousState:r,state:n.state})};_takeScreenshot=({entity:t,state:i},n,o)=>{let r=o.manifest.screenshots?.[t.type]?.find(e=>e.view===n);if(!r)return Promise.reject(new e(`The schema declares the screenshot view "${n}" on ${t.type}, but the configurator has no view of that name. This is a fault in the configurator, not in your request. Tell the user this is not available.`));let a=o.lastScreenshot.then(async()=>{if(!o.generation.active)throw F(C);let e=await this._renderScreenshot(t.id,r.instanceName,i).catch(e=>{throw F(e instanceof v?"User made concurrent actions that prevented the screenshot from being taken, try again":`The screenshot of ${t.id} from "${n}" could not be taken: ${A(N(e))} Try again; if it fails again, tell the user the screenshot is not available.`,e instanceof Error?e:void 0)});if(!o.generation.active)throw F(C);if(null===e)return null;let{imageId:a}=await this._context.uploadScreenshot(e).catch(e=>{throw F(`The screenshot of ${t.id} from "${n}" was taken but could not be stored: ${A(N(e))} Try again; if it fails again, tell the user the screenshot is not available.`,e instanceof Error?e:void 0)}),s=`${t.id}/${n}`,l=[...o.screenshots.values()].filter(e=>e.entityId===t.id&&e.view===n).length,c=0===l?s:`${s}#${l+1}`;return o.screenshots.set(c,{entityId:t.id,view:n,imageId:a}),{image:c}});return o.lastScreenshot=a.catch(()=>void 0),a};_setup=()=>{let{manifest:t,error:i}=this._context.getAssistantSetup();if(i)return{ready:!1,result:{errors:[new e(i.message,{originalError:i})]}};if(!t)return{ready:!1,result:$};let n=this._selectSchema(t.sdl);return n instanceof e?{ready:!1,result:{errors:[n]}}:{ready:!0,assistant:t,schema:n,lenses:t.lenses?.definitions?this._selectLenses(t.lenses.definitions):void 0,fieldResolver:this._selectFieldResolver(t.fields)}};_run=async(t,i,o,a)=>{var l;let c;try{c=r(t)}catch(t){return{errors:[t instanceof e?t:new e(N(t))]}}let h=s(o.schema,c,R);return h.length>0?{errors:h}:(l=await n({schema:o.schema,document:c,rootValue:this._rootValue,contextValue:a,variableValues:i.variables,operationName:i.operationName,fieldResolver:o.fieldResolver,typeResolver:this._resolveType}),l.errors?.some(e=>e.originalError instanceof x)?{...l,errors:l.errors.flatMap(t=>t.originalError instanceof x?t.originalError.entries.map(({type:i,entityId:n,message:o})=>new e(o??i,{nodes:t.nodes,source:t.source,positions:t.positions,path:t.path,extensions:{code:"VIOLATION",type:i,entityId:n}})):[t])}:l)};prepare=async(t,i,n=this._generation)=>{let o,r=this._setup();if(!r.ready)return i.map(()=>({result:r.result,emissions:[],screenshots:new Map}));let a={manifest:r.assistant,state:t,emissions:[],failedMutationField:void 0,screenshots:new Map,lastScreenshot:Promise.resolve(),generation:n,validities:new WeakMap},s=[];for(let[t,n]of i.entries())if(void 0===o){let i=a.emissions.length,l=a.screenshots.size;a.failedMutationField=void 0;let c=y(n.document),h=r.lenses?_(c,r.lenses):c,d=h instanceof e?{errors:[h]}:await this._run(h,n,r,a);await a.lastScreenshot,s.push({result:d,emissions:a.emissions.slice(i),screenshots:new Map([...a.screenshots].slice(l))}),I(d)&&(o=t)}else s.push({result:V(o),emissions:[],screenshots:new Map});return s};readSideEffects=e=>{let t=this._context.domainServicesSelectors.getResolveLocalizable();return e.flatMap(({emissions:e})=>e.flatMap(e=>w(e.updates,t)))};readScreenshots=e=>new Map(e.flatMap(({screenshots:e})=>[...e]));readWarnings=(e,t)=>{let i=t.flatMap(({emissions:e})=>e).at(-1);return void 0===i||t.some(({result:e})=>I(e))?[]:b(i.validity,this._validateState(e),this._context.domainServicesSelectors.getResolveLocalizable())};_prepareAndCommit=async(e,t)=>{let i,n,o,r=this._context.domainContextSelectors.getStoreSystem(),a=r.stateSlices.committed.value.state,s=await this.prepare(a,e,t),l=s.map(({result:e})=>e),h=this.readSideEffects(s),d=this.readScreenshots(s),u=s.flatMap(e=>e.emissions);if(!t.active)return{results:l,sideEffects:h,screenshots:d,warnings:[],outcome:"conflict"};if(l.some(I)||0===u.length)return{results:l,sideEffects:h,screenshots:d,warnings:[],outcome:"none"};let m=(i=c(u[0]),n=c(u[u.length-1]),o=u.some(e=>void 0!==e.transformationLog),{kind:"committed",previousState:i.previousState,state:n.state,updates:u.flatMap(e=>e.updates),validity:n.validity,transformationLog:o?u.flatMap(e=>e.transformationLog??[]):void 0});return{results:l,sideEffects:h,screenshots:d,warnings:this.readWarnings(a,s),outcome:r.commitPrepared(m),preparedState:m.state}};execute=async e=>{let t=this._generation;if(!this._context.domainContextSelectors.getStoreSystem().isInitialized)return{results:e.map(()=>T),committed:!1,sideEffects:[],warnings:[],screenshots:new Map};let i=await this._prepareAndCommit(e,t),{results:n,sideEffects:o,warnings:r,screenshots:a,outcome:s,preparedState:l}="conflict"===i.outcome&&t.active?await this._prepareAndCommit(e,t):i;return"committed"===s?{results:n,committed:!0,sideEffects:o,warnings:r,screenshots:a,preparedState:l}:"held"===s?{results:n,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,warnings:r,screenshots:a,preparedState:l}:"conflict"===s?{results:n,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,warnings:r,screenshots:a}:{results:n,committed:!1,sideEffects:o,warnings:r,screenshots:a}}}
1
+ import{GraphQLError as e,NoSchemaIntrospectionCustomRule as t,defaultFieldResolver as i,execute as n,getNamedType as o,parse as r,specifiedRules as s,validate as a,validateSchema as l}from"graphql";import{assertExistence as c,createSelector as h,isMessageDescriptor as d,isMultilingualString as u}from"@salsita-ai/common/utils";import{AGENT_SCREENSHOT_MAX_SIDE as m,DomainEntityIdSchema as f,agentScreenshotComponent as p,createAssistantExecutionSchema as g,findAssistantMutation as v}from"#package/domain";import{ExportBusyError as y}from"../export-system/export-busy-error.js";import{closeUnclosedBraces as S}from"./close-unclosed-braces.js";import{createEntityMeta as _}from"./entity-meta.js";import{injectAssistantLenses as w}from"./inject-assistant-lenses.js";import{readSideEffects as x}from"./side-effects.js";import{ViolationsError as E,readStateWarnings as T,readViolationEntries as $}from"./violations.js";let b={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.")]},C={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.")]},N="Not taken: another configuration was loaded while this request ran. Query the current configuration before asking for screenshots again.",M=class ScreenshotTooLargeError extends Error{constructor(e,t){super(`The view is configured at ${e} \xd7 ${t} px, more than the ${m} \xd7 ${m} px a screenshot may have.`),this.name="ScreenshotTooLargeError"}},R=new RegExp(f.pattern),k=[...s,t],j=e=>"object"==typeof e&&null!==e&&"type"in e&&"string"==typeof e.type&&"id"in e&&"string"==typeof e.id,A=(e,t)=>"object"==typeof e&&null!==e?Reflect.get(e,t):void 0,L=e=>e instanceof Error?e.message:String(e),O=e=>/[.!?]$/.test(e)?e:`${e}.`,z=e=>"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===Object.prototype,q=(e,t)=>{let i=z(e)?e._raw:void 0;if(j(i))return i;if(!Array.isArray(e)&&!z(e))return e;if(t.has(e))throw Error("The value contains itself.");let n=new Set([...t,e]);return Array.isArray(e)?e.map(e=>q(e,n)):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,q(t,n)]))};export const localize=(e,t)=>Array.isArray(e)?e.map(e=>localize(e,t)):"string"==typeof e||d(e)||u(e)?t(e):e;let F=t=>new e(`The configurator cannot handle this request: ${O(t)} This is a fault in the configurator, not in your request. Tell the user this is not available.`);export const SCREENSHOT_NOT_TAKEN="SCREENSHOT_NOT_TAKEN";let I=(t,i)=>new e(t,{originalError:i,extensions:{code:SCREENSHOT_NOT_TAKEN}}),V=e=>(e.errors??[]).some(e=>e.extensions.code!==SCREENSHOT_NOT_TAKEN),P=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=h([h.leaf(e=>e)],e=>{try{let t=g(e),i=l(t);return i.length>0?F(i.map(e=>e.message).join(" ")):t}catch(e){return F(L(e))}});_selectLenses=h([h.leaf(e=>e)],e=>r(e));_selectFieldResolver=h([h.leaf(e=>e)],t=>(n,r,s,a)=>{if(a.parentType===a.schema.getQueryType())return i(n,r,s,a);if(a.parentType===a.schema.getMutationType())return this._resolveMutation(a.fieldName,String(a.path.key),r,s);if(!j(n))return i(n,r,s,a);if("meta"===a.fieldName){let e;return _({entity:n,state:("object"==typeof(e=A(n,"_state"))&&null!==e&&"entities"in e&&"rootEntityId"in e?e:void 0)??s.state},{manifest:s.manifest,recipes:this._recipeContext(),prepareStateEmission:(e,t,i)=>{let n=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(e,t,i);return s.validities.set(n.state,n.validity),n},find$Entity:(e,t)=>this._find$Entity(e,t),validateEntity:e=>this._context.domainContextSelectors.getDomain().validateEntity(e),takeScreenshot:(e,t)=>this._takeScreenshot(e,t,s),validateState:e=>this._validateCached(e,s)})}let{source:l,localized:c}=t[a.parentType.name]?.[a.fieldName]??{source:a.fieldName},h=((t,i)=>{try{return A(t,i)}catch(n){throw new e(`Expression "${i}" failed on ${j(t)?t.id:"an entity"}: ${O(L(n))} This is a fault in the configurator, not in your request. Tell the user this is not available.`,{originalError:n instanceof Error?n:void 0})}})(n,l);return c?localize(h,this._context.domainServicesSelectors.getResolveLocalizable()):l.startsWith("$")&&"JSON"===o(a.returnType).name?((t,i,n)=>{try{return q(n,new Set)}catch(n){throw new e(`Expression "${i}" returned a value that is not plain serializable data on ${j(t)?t.id:"an entity"}: ${O(L(n))} This is a fault in the configurator, not in your request. Tell the user this is not available.`,{originalError:n instanceof Error?n:void 0})}})(n,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;_validateState=e=>this._context.domainContextSelectors.getValidationProjections().validateState(e);_validateCached=(e,{validities:t})=>{let i=t.get(e);if(i)return i;let n=this._validateState(e);return t.set(e,n),n};_recipeContext=()=>({componentReader:this._context.domainContextSelectors.getComponentReader(),recipeCooker:this._context.domainContextSelectors.getRecipeCookerSystem(),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});_rootValue={warnings:(e,t)=>T(this._validateCached(t.state,t),void 0,this._context.domainServicesSelectors.getResolveLocalizable()),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 n=i.rootEntityId;let o=t.filter(e=>!R.test(e));if(o.length>0)throw new e(`${o.map(e=>`"${e}"`).join(", ")} ${1===o.length?"is not an entity id":"are not entity ids"}. Entity ids have the form "<Type>-<number>", e.g. "${n}". Use ids as returned by the "id" field.`);return t.map(e=>R.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=>j(e)?e.type:void 0;_generation={active:!0};_renderScreenshot=async(e,t,i)=>{let n=this._context.domainContextSelectors.getComponentReader().readOneComponent({entityId:e,componentType:p,instanceName:t},i);if(!n)return null;let{width:o,height:r}=n.state;if(o>m||r>m)throw new M(o,r);let s=await this._context.renderScreenshot(n,i);return null===s?null:new Blob([s],{type:"JPEG"===n.state.fileFormat?"image/jpeg":"image/png"})};initialize=()=>{this._generation.active=!1,this._generation={active:!0}};_resolveMutation=(t,i,n,o)=>{if(void 0!==o.failedMutationField)throw new e(`Not run: the earlier field "${o.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,n,o)}catch(e){throw o.failedMutationField=i,e}};_runMutation=(t,i,n)=>{let o=v(t,n.manifest);if(!o)throw new e(`The schema declares the mutation "${t}", but the configurator has no implementation for it. This is a fault in the configurator, not in your request. Tell the user this is not available.`);let r=n.state,s=o.implementation(i,r,{manifest:n.manifest,action:this._context.domainContextSelectors.getActionSystem().createContext(r),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});if(s.updates.length>0){let i=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(s.updates,r,"committed"),{validity:o}=i;if("uncaught"===o.severity)throw new e(`The changes of "${t}" were not applied, because the resulting configuration is invalid: validating it threw: ${O(L(o.error))} Change the request so the configuration stays valid.`,{originalError:o.error});if(!o.valid)throw new E(`The changes of "${t}" were not applied, because the resulting configuration has ${o.severity} violations.`,$(o,this._context.domainServicesSelectors.getResolveLocalizable()));n.emissions.push(i),n.validities.set(i.state,o),n.state=i.state}return s.readResult({previousState:r,state:n.state})};_takeScreenshot=({entity:t,state:i},n,o)=>{let r=o.manifest.screenshots?.[t.type]?.find(e=>e.view===n);if(!r)return Promise.reject(new e(`The schema declares the screenshot view "${n}" on ${t.type}, but the configurator has no view of that name. This is a fault in the configurator, not in your request. Tell the user this is not available.`));let s=o.lastScreenshot.then(async()=>{if(!o.generation.active)throw I(N);let e=await this._renderScreenshot(t.id,r.instanceName,i).catch(e=>{throw I(e instanceof y?"User made concurrent actions that prevented the screenshot from being taken, try again":e instanceof M?`The screenshot of ${t.id} from "${n}" cannot be taken: ${e.message} Tell the user the screenshot is not available.`:`The screenshot of ${t.id} from "${n}" could not be taken: ${O(L(e))} Try again; if it fails again, tell the user the screenshot is not available.`,e instanceof Error?e:void 0)});if(!o.generation.active)throw I(N);if(null===e)return null;let{imageId:s}=await this._context.uploadScreenshot(e).catch(e=>{throw I(`The screenshot of ${t.id} from "${n}" was taken but could not be stored: ${O(L(e))} Try again; if it fails again, tell the user the screenshot is not available.`,e instanceof Error?e:void 0)}),a=`${t.id}/${n}`,l=[...o.screenshots.values()].filter(e=>e.entityId===t.id&&e.view===n).length,c=0===l?a:`${a}#${l+1}`;return o.screenshots.set(c,{entityId:t.id,view:n,imageId:s}),{image:c}});return o.lastScreenshot=s.catch(()=>void 0),s};_setup=()=>{let{manifest:t,error:i}=this._context.getAssistantSetup();if(i)return{ready:!1,result:{errors:[new e(i.message,{originalError:i})]}};if(!t)return{ready:!1,result:b};let n=this._selectSchema(t.sdl);return n instanceof e?{ready:!1,result:{errors:[n]}}:{ready:!0,assistant:t,schema:n,lenses:t.lenses?.definitions?this._selectLenses(t.lenses.definitions):void 0,fieldResolver:this._selectFieldResolver(t.fields)}};_run=async(t,i,o,s)=>{var l;let c;try{c=r(t)}catch(t){return{errors:[t instanceof e?t:new e(L(t))]}}let h=a(o.schema,c,k);return h.length>0?{errors:h}:(l=await n({schema:o.schema,document:c,rootValue:this._rootValue,contextValue:s,variableValues:i.variables,operationName:i.operationName,fieldResolver:o.fieldResolver,typeResolver:this._resolveType}),l.errors?.some(e=>e.originalError instanceof E)?{...l,errors:l.errors.flatMap(t=>t.originalError instanceof E?t.originalError.entries.map(({type:i,entityId:n,message:o})=>new e(o??i,{nodes:t.nodes,source:t.source,positions:t.positions,path:t.path,extensions:{code:"VIOLATION",type:i,entityId:n}})):[t])}:l)};prepare=async(t,i,n=this._generation)=>{let o,r=this._setup();if(!r.ready)return i.map(()=>({result:r.result,emissions:[],screenshots:new Map}));let s={manifest:r.assistant,state:t,emissions:[],failedMutationField:void 0,screenshots:new Map,lastScreenshot:Promise.resolve(),generation:n,validities:new WeakMap},a=[];for(let[t,n]of i.entries())if(void 0===o){let i=s.emissions.length,l=s.screenshots.size;s.failedMutationField=void 0;let c=S(n.document),h=r.lenses?w(c,r.lenses):c,d=h instanceof e?{errors:[h]}:await this._run(h,n,r,s);await s.lastScreenshot,a.push({result:d,emissions:s.emissions.slice(i),screenshots:new Map([...s.screenshots].slice(l))}),V(d)&&(o=t)}else a.push({result:P(o),emissions:[],screenshots:new Map});return a};readSideEffects=e=>{let t=this._context.domainServicesSelectors.getResolveLocalizable();return e.flatMap(({emissions:e})=>e.flatMap(e=>x(e.updates,t)))};readScreenshots=e=>new Map(e.flatMap(({screenshots:e})=>[...e]));readWarnings=(e,t)=>{let i=t.flatMap(({emissions:e})=>e).at(-1);return void 0===i||t.some(({result:e})=>V(e))?[]:T(i.validity,this._validateState(e),this._context.domainServicesSelectors.getResolveLocalizable())};_prepareAndCommit=async(e,t)=>{let i,n,o,r=this._context.domainContextSelectors.getStoreSystem(),s=r.stateSlices.committed.value.state,a=await this.prepare(s,e,t),l=a.map(({result:e})=>e),h=this.readSideEffects(a),d=this.readScreenshots(a),u=a.flatMap(e=>e.emissions);if(!t.active)return{results:l,sideEffects:h,screenshots:d,warnings:[],outcome:"conflict"};if(l.some(V)||0===u.length)return{results:l,sideEffects:h,screenshots:d,warnings:[],outcome:"none"};let m=(i=c(u[0]),n=c(u[u.length-1]),o=u.some(e=>void 0!==e.transformationLog),{kind:"committed",previousState:i.previousState,state:n.state,updates:u.flatMap(e=>e.updates),validity:n.validity,transformationLog:o?u.flatMap(e=>e.transformationLog??[]):void 0});return{results:l,sideEffects:h,screenshots:d,warnings:this.readWarnings(s,a),outcome:r.commitPrepared(m),preparedState:m.state}};execute=async e=>{let t=this._generation;if(!this._context.domainContextSelectors.getStoreSystem().isInitialized)return{results:e.map(()=>C),committed:!1,sideEffects:[],warnings:[],screenshots:new Map};let i=await this._prepareAndCommit(e,t),{results:n,sideEffects:o,warnings:r,screenshots:s,outcome:a,preparedState:l}="conflict"===i.outcome&&t.active?await this._prepareAndCommit(e,t):i;return"committed"===a?{results:n,committed:!0,sideEffects:o,warnings:r,screenshots:s,preparedState:l}:"held"===a?{results:n,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,warnings:r,screenshots:s,preparedState:l}:"conflict"===a?{results:n,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,warnings:r,screenshots:s}:{results:n,committed:!1,sideEffects:o,warnings:r,screenshots:s}}}
@@ -0,0 +1,10 @@
1
+ import type { R3FHandle } from '../canvas-system.js';
2
+ /**
3
+ * Copies the next regular frame the canvas draws into a 2D canvas of the same size, and resolves with
4
+ * it. `isRegularFrame` tells a frame drawn by the project's own render path (its postprocessing, its
5
+ * pixel ratio), which the copy shows as the user sees it, from one that is not, such as an export's,
6
+ * which is skipped. Without `preserveDrawingBuffer` the canvas can only be read in the task that drew
7
+ * it, so the copy is taken in an after-effect of that frame, which runs right after the render in the
8
+ * same animation frame. Rejects when no regular frame is drawn within a few seconds.
9
+ */
10
+ export declare const captureNextFrame: (r3fHandle: R3FHandle, isRegularFrame: (state: ReturnType<R3FHandle['get']>) => boolean) => Promise<HTMLCanvasElement>;
@@ -0,0 +1 @@
1
+ import{addAfterEffect as e}from"@react-three/fiber";export const captureNextFrame=(t,o)=>new Promise((r,a)=>{let i=setTimeout(()=>{n(),a(Error("The configurator view could not be copied, because the canvas drew no frame of it within 5000 ms. An export may hold the canvas; try again once it is over."))},5e3),n=e(()=>{let e=t.get();if(!o(e))return;n(),clearTimeout(i);let c=e.gl.domElement,h=document.createElement("canvas");h.width=c.width,h.height=c.height;let m=h.getContext("2d");null===m?a(Error("The browser gave no 2D canvas to copy the configurator view onto.")):(m.drawImage(c,0,0),r(h))});t.get().invalidate()});
@@ -39,6 +39,14 @@ export declare class ImageRenderingSystem<ENTITIES extends DomainEntity<string>>
39
39
  registerEffectComposer(effectComposer: EffectComposer): () => void;
40
40
  private readonly _openDebugImage;
41
41
  private readonly _getRenderer;
42
+ /**
43
+ * A copy of the configurator view as the interactive canvas draws its next regular frame, at the
44
+ * canvas's resolution; waits for a running export to end and for a canvas to mount when none is.
45
+ * Unlike an export, it renders nothing of its own and leaves the canvas and the frameloop as they are.
46
+ *
47
+ * @internal
48
+ */
49
+ readonly captureView: () => Promise<HTMLCanvasElement>;
42
50
  /**
43
51
  * Generates an image for the given configuration and uploads it to s3 as finalization data.
44
52
  * This method uses the original canvas and camera to render the image.
@@ -1 +1 @@
1
- import{Color as e,HalfFloatType as t,NoToneMapping as a,OrthographicCamera as r,PerspectiveCamera as n,WebGLRenderTarget as o}from"three";import{preloadFont as i}from"troika-three-text";import{match as s}from"ts-pattern";import{clientSideImageComponent as l,dimensionIndicatorComponent as c,domainEntityTypeFromId as m,editableDistanceDimensionIndicatorComponent as g,isDomainEntityId as d,isVirtualEntityId as h,sketchingEditComponent as u}from"#package/domain";import{createCameraControls as f}from"../camera-control-system/create-camera-controls.js";import{createCanvasFreezeFrame as p}from"./canvas-freeze-frame.js";import{ExportCapturePass as w,readTargetToBlob as C,resolveExportBackground as _}from"./export-image-capture.js";export class ImageRenderingSystem{_context;_renderer=null;_effectComposer=null;_generation=null;_debugObjectUrls=new Set;_canvasFreeze=null;constructor(e){this._context=e}_captureGenerationAssertion=()=>{let e=this._generation,t=()=>{if(!e?.active)throw Error("Image rendering generation ended while images were being rendered! The configurator context was reinitialized before the renderer finished, so the results belong to a configuration that is no longer active. Await the render before leaving the configuration, or discard the rejection.")};return t(),t};_captureGenerationGuard=()=>{let e=this._captureGenerationAssertion();return{assertActive:e,waitFor:async t=>{let a=await t;return e(),a},runEffect:t=>(e(),t())}};register(e){return this._renderer=e,()=>{this._renderer===e&&(this._renderer=null)}}registerEffectComposer(e){return this._effectComposer=e,()=>{this._effectComposer===e&&(this._effectComposer=null)}}_openDebugImage=e=>{let t=URL.createObjectURL(e);this._debugObjectUrls.add(t),window.open(t,"_blank")};_getRenderer=async()=>{let e=this._generation,t=Date.now(),a=()=>{if(!e?.active)throw Error("Image rendering generation ended while waiting for the renderer! The configurator context was reinitialized before the renderer arrived, so the render would target a scene that is gone. Await the render before leaving the configuration, or discard the rejection.")};a();let r=this._renderer;for(;null===r;){if(await new Promise(e=>setTimeout(e,50)),a(),Date.now()-t>1e4)throw Error("Renderer could not be retrieved! Reached timeout.");r=this._renderer}return r};generateImageUsingOriginalCanvas=async(e,t,a=!1)=>{let r=this._captureGenerationGuard(),n=await r.waitFor(this._getRenderer());if(a){let{blob:e}=await r.waitFor(r.runEffect(()=>n.renderUsingOriginalCanvas(t)));r.runEffect(()=>this._openDebugImage(e));return}let o=await Promise.all([t].map(async e=>{let{blob:t}=await r.waitFor(r.runEffect(()=>n.renderUsingOriginalCanvas(e)));return{blob:t,name:e.name}})),i=await r.waitFor(r.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),e,[t.name])));await Promise.all(i.map(async e=>{let t=o.find(t=>t.name===e.name);if(null==t)throw Error("Blob not found!");await Promise.all(i.map(async e=>{await r.waitFor(r.runEffect(()=>fetch(e.url,{method:"PUT",body:t.blob,headers:{"Content-Type":"image/png","Content-Length":t.blob.size.toString()}})))}))}))};async generateImagesUsingOriginalCanvas(e,t,a=!1){let r=this._captureGenerationGuard(),n=await r.waitFor(this._getRenderer()),o=Array.isArray(t)?t:[t],i=await o.reduce(async(e,t)=>[...await e,await r.waitFor(r.runEffect(()=>n.renderUsingOriginalCanvas(t)))],Promise.resolve([]));if(a){for(let e of i)r.runEffect(()=>this._openDebugImage(e.blob)),await r.waitFor(new Promise(e=>setTimeout(e,100)));return}let s=o.map(e=>e.name),l=await r.waitFor(r.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),e,s)));await Promise.all(l.map(async e=>{let t=i.find(t=>t.name===e.name);if(null==t)throw Error("Blob not found!");await Promise.all(l.map(async e=>{await r.waitFor(r.runEffect(()=>fetch(e.url,{method:"PUT",body:t.blob,headers:{"Content-Type":"image/png","Content-Length":t.blob.size.toString()}})))}))}))}async generateImages(e,t,a=!1){let r=this._captureGenerationGuard(),n=await r.waitFor(this._getRenderer()),o=t.map(e=>e.name);if(a)return void await Promise.all(t.map(async e=>{let t=await r.waitFor(r.runEffect(()=>n.renderImage(e)));r.runEffect(()=>this._openDebugImage(t))}));let i=await Promise.all(t.map(async e=>({blob:await r.waitFor(r.runEffect(()=>n.renderImage(e))),name:e.name}))),s=await r.waitFor(r.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),e,o)));await Promise.all(s.map(async e=>{let t=i.find(t=>t.name===e.name);if(null==t)throw Error("Blob not found!");await Promise.all(s.map(async e=>{await r.waitFor(r.runEffect(()=>fetch(e.url,{method:"PUT",body:t.blob,headers:{"Content-Type":"image/png","Content-Length":t.blob.size.toString()}})))}))}))}async getGeneratedImages(e,t=!1){let a=this._captureGenerationAssertion(),r=await this._getRenderer();return(a(),t)?(await Promise.all(e.map(async e=>{let t=await r.renderImage(e);a(),this._openDebugImage(t)})),[]):Promise.all(e.map(async e=>{let t=await r.renderImage(e);return a(),{blob:t,name:e.name}}))}_renderCurrentView=e=>{let{gl:t,scene:a,camera:r}=e.get();null!==this._effectComposer?this._effectComposer.render():t.render(a,r)};_freezeCanvas=e=>{this._canvasFreeze?.handle===e?this._canvasFreeze.holders+=1:(this._canvasFreeze?.remove(),this._canvasFreeze={handle:e,remove:p(e.get().gl.domElement,()=>this._renderCurrentView(e)),resumeFrameloop:this._context.configuratorExtensionSelectors.getExportSystem().pauseFrameloop(e),holders:1});let t=this._canvasFreeze,a=!1;return async()=>{if(!a&&(a=!0,t.holders-=1,!(t.holders>0)))try{let a=this._context.configuratorExtensionSelectors.getCanvasSystem();a.r3fHandle$.value===e&&await a.waitForFlush(),a.r3fHandle$.value===e&&0===t.holders&&this._renderCurrentView(e)}catch{}finally{0===t.holders&&(t.remove(),t.resumeFrameloop(),this._canvasFreeze===t&&(this._canvasFreeze=null))}}};async renderImage(r){let n=this._context.configuratorExtensionSelectors.getCanvasSystem(),i=n.r3fHandle$.value??await n.waitForCanvas(),{gl:s,scene:l,camera:c,size:m,advance:g}=i.get(),d=s.getRenderTarget(),h=s.getClearColor(new e),u=s.getClearAlpha(),f=s.autoClearColor,p=e=>new w(r.width,r.height,e,s.outputColorSpace),y={composer:null,pass:null},b=null,x=null,v=e=>{let t=y.pass??p(a);return y.pass=t,y.composer===e&&e.passes.at(-1)===t||(y.composer?.removePass(t),e.addPass(t),y.composer=e),t},E=async()=>{if(await this._context.configuratorExtensionSelectors.getCanvasSystem().waitForFlush(),this._context.configuratorExtensionSelectors.getCanvasSystem().r3fHandle$.value!==i)throw Error("Canvas was remounted while an image was being rendered! The export borrowed a canvas that is gone, so it cannot capture the image. Retry the export once the configurator has settled.")},S=this._freezeCanvas(i);try{i.set({size:{height:r.height,width:r.width,top:0,left:0,updateStyle:!1}}),i.set({camera:r.camera}),await E(),null!==this._effectComposer&&v(this._effectComposer),g(void 0),await E();let a="JPEG"===r.fileFormat?"image/jpeg":"image/png",n=_({sceneBackground:l.background,backgroundColor:r.backgroundColor,fileFormat:r.fileFormat,outputColorSpace:s.outputColorSpace});if(null!==this._effectComposer){s.setRenderTarget(null),"JPEG"===r.fileFormat?s.setClearColor(r.backgroundColor??0xffffff):r.backgroundColor?s.setClearColor(r.backgroundColor):s.setClearAlpha(0),s.autoClearColor=!0;let e=v(this._effectComposer);return this._effectComposer.render(),await C(s,e.renderTarget,n,a)}b=p(s.toneMapping),x=new o(r.width,r.height,{samples:4,type:t,stencilBuffer:s.getContextAttributes().stencil??!1});let c=l.background;c instanceof e&&(l.background=null);try{s.setClearColor(0,0),s.setRenderTarget(x),s.clear(),s.render(l,r.camera)}finally{l.background=c}return b.render(s,x),await C(s,b.renderTarget,n,a)}finally{null!==y.pass&&(y.composer?.removePass(y.pass),y.pass.dispose()),b?.dispose(),x?.dispose(),this._context.configuratorExtensionSelectors.getCanvasSystem().r3fHandle$.value===i&&(s.setClearColor(h,u),s.autoClearColor=f,s.setRenderTarget(d),i.set({camera:c,size:{...m,updateStyle:!1}})),await S()}}async generateAndUploadDeclaredClientSideImages(e,t,a={}){let r=this._captureGenerationGuard(),n=await r.waitFor(this.generateDeclaredClientSideImages(e,a));if(a.debug)return n;let o=new Map((await r.waitFor(r.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),t,n.map(e=>e.name))))).map(e=>[e.name,e.url]));return await Promise.all(n.map(async e=>{let t=o.get(e.name);if(!t)throw Error(`Presigned link for image ${e.name} not found!`);await r.waitFor(r.runEffect(()=>fetch(t,{method:"PUT",body:e.blob})))})),n}generateDeclaredClientSideImages(e,t={}){let a=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[l]},e);return this.generateImagesFromComponents(a,e,t)}generateImagesFromComponents(e,t,a={},r={}){return this._generateImagesFromComponents(e,t,a,r)}async _generateImagesFromComponents(t,a,o,l){let p=this._captureGenerationGuard(),w=!1,C=this._context.domainContextSelectors.getExportStates(),_=t.map(t=>{if(!C.includes(t.state.exportState)){let e=d(t.componentInstance.entityId)?m(t.componentInstance.entityId):"unknown entity",a=t.componentInstance.componentType.name,r=t.componentInstance.instanceName;throw Error(`Export state ${t.state.exportState} declared in component ${a}/${r} on ${e} is not a valid export state. Expected one of: ${C.join(", ")}`)}let l=t.componentInstance.entityId;if(h(l))throw Error("Virtual entities cannot be used for export");return this._context.configuratorExtensionSelectors.getExportSystem().createExportJob(a,{exportState:t.state.exportState,exportedEntityId:l,toolState:t.state.toolState,viewState:t.state.viewState,navigationState:t.state.navigationState,selectedEntityId:a.rootEntityId},async a=>{let m=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[c,g,u]},a.state);!w&&m.length>0&&(await new Promise(e=>{i({font:void 0,characters:void 0},e)}),w=!0,await this._context.configuratorExtensionSelectors.getCanvasSystem().waitForFlush());let d=this._context.configuratorExtensionSelectors.getCameraSystem().getActiveCameraConfig(a.state);if(null==d)throw Error(`No camera config is attached for export state ${t.state.exportState} and exported entity ${l}. Whenever using a client-side image component, you need to attach a camera configuration to the export state defined on that componentin the domain spec. This camera will be used to render the image.`);let h=s(d.typeSpecificConfig.cameraType).with("perspective",()=>new n(45,t.state.width/t.state.height,1,1e4)).with("orthographic",()=>new r(0,0,1e4,0,1,1e4)).exhaustive(),C=f(h);await this._context.configuratorExtensionSelectors.getCameraSystem().applyConfig(d,C,!1,{width:t.state.width,height:t.state.height,padding:{top:0,right:0,bottom:0,left:0}}),C.update(1e6),await new Promise(e=>setTimeout(e,100));let _=await p.waitFor(p.runEffect(()=>this.renderImage({width:t.state.width,height:t.state.height,fileFormat:t.state.fileFormat,backgroundColor:t.state.backgroundColor?new e(t.state.backgroundColor):void 0,camera:h})));return o.debug&&p.runEffect(()=>this._openDebugImage(_)),{blob:_,imageComponent:t,name:`${t.componentInstance.componentType.name}-${t.componentInstance.entityId}-${t.componentInstance.instanceName}`}})});if(0===_.length)return this._context.configuratorExtensionSelectors.getExportSystem().runExportJobs(_,l);let y=this._context.configuratorExtensionSelectors.getCanvasSystem(),b=y.r3fHandle$.value??await p.waitFor(y.waitForCanvas().catch(e=>{throw p.assertActive(),e})),x=this._freezeCanvas(b);try{return await this._context.configuratorExtensionSelectors.getExportSystem().runExportJobs(_,l)}finally{await x()}}initialize=()=>{for(let e of(null!==this._generation&&(this._generation.active=!1),this._debugObjectUrls))URL.revokeObjectURL(e);this._debugObjectUrls.clear(),this._generation={active:!0}}}
1
+ import{filter as e,firstValueFrom as t}from"rxjs";import{Color as r,HalfFloatType as a,NoToneMapping as n,OrthographicCamera as o,PerspectiveCamera as i,WebGLRenderTarget as s}from"three";import{preloadFont as l}from"troika-three-text";import{match as c}from"ts-pattern";import{clientSideImageComponent as m,dimensionIndicatorComponent as g,domainEntityTypeFromId as d,editableDistanceDimensionIndicatorComponent as h,isDomainEntityId as u,isVirtualEntityId as f,sketchingEditComponent as p}from"#package/domain";import{createCameraControls as w}from"../camera-control-system/create-camera-controls.js";import{createCanvasFreezeFrame as C}from"./canvas-freeze-frame.js";import{captureNextFrame as _}from"./capture-next-frame.js";import{ExportCapturePass as y,readTargetToBlob as x,resolveExportBackground as b}from"./export-image-capture.js";export class ImageRenderingSystem{_context;_renderer=null;_effectComposer=null;_generation=null;_debugObjectUrls=new Set;_canvasFreeze=null;constructor(e){this._context=e}_captureGenerationAssertion=()=>{let e=this._generation,t=()=>{if(!e?.active)throw Error("Image rendering generation ended while images were being rendered! The configurator context was reinitialized before the renderer finished, so the results belong to a configuration that is no longer active. Await the render before leaving the configuration, or discard the rejection.")};return t(),t};_captureGenerationGuard=()=>{let e=this._captureGenerationAssertion();return{assertActive:e,waitFor:async t=>{let r=await t;return e(),r},runEffect:t=>(e(),t())}};register(e){return this._renderer=e,()=>{this._renderer===e&&(this._renderer=null)}}registerEffectComposer(e){return this._effectComposer=e,()=>{this._effectComposer===e&&(this._effectComposer=null)}}_openDebugImage=e=>{let t=URL.createObjectURL(e);this._debugObjectUrls.add(t),window.open(t,"_blank")};_getRenderer=async()=>{let e=this._generation,t=Date.now(),r=()=>{if(!e?.active)throw Error("Image rendering generation ended while waiting for the renderer! The configurator context was reinitialized before the renderer arrived, so the render would target a scene that is gone. Await the render before leaving the configuration, or discard the rejection.")};r();let a=this._renderer;for(;null===a;){if(await new Promise(e=>setTimeout(e,50)),r(),Date.now()-t>1e4)throw Error("Renderer could not be retrieved! Reached timeout.");a=this._renderer}return a};captureView=async()=>{let{getCanvasSystem:r,getCameraControlSystem:a,getExportSystem:n}=this._context.configuratorExtensionSelectors,{perspectiveCamera:o,orthographicCamera:i}=a();return await t(n().exporting$.pipe(e(e=>!e))),_(await r().waitForCanvas(),({camera:e,frameloop:t})=>"never"!==t&&(e===o||e===i))};generateImageUsingOriginalCanvas=async(e,t,r=!1)=>{let a=this._captureGenerationGuard(),n=await a.waitFor(this._getRenderer());if(r){let{blob:e}=await a.waitFor(a.runEffect(()=>n.renderUsingOriginalCanvas(t)));a.runEffect(()=>this._openDebugImage(e));return}let o=await Promise.all([t].map(async e=>{let{blob:t}=await a.waitFor(a.runEffect(()=>n.renderUsingOriginalCanvas(e)));return{blob:t,name:e.name}})),i=await a.waitFor(a.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),e,[t.name])));await Promise.all(i.map(async e=>{let t=o.find(t=>t.name===e.name);if(null==t)throw Error("Blob not found!");await Promise.all(i.map(async e=>{await a.waitFor(a.runEffect(()=>fetch(e.url,{method:"PUT",body:t.blob,headers:{"Content-Type":"image/png","Content-Length":t.blob.size.toString()}})))}))}))};async generateImagesUsingOriginalCanvas(e,t,r=!1){let a=this._captureGenerationGuard(),n=await a.waitFor(this._getRenderer()),o=Array.isArray(t)?t:[t],i=await o.reduce(async(e,t)=>[...await e,await a.waitFor(a.runEffect(()=>n.renderUsingOriginalCanvas(t)))],Promise.resolve([]));if(r){for(let e of i)a.runEffect(()=>this._openDebugImage(e.blob)),await a.waitFor(new Promise(e=>setTimeout(e,100)));return}let s=o.map(e=>e.name),l=await a.waitFor(a.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),e,s)));await Promise.all(l.map(async e=>{let t=i.find(t=>t.name===e.name);if(null==t)throw Error("Blob not found!");await Promise.all(l.map(async e=>{await a.waitFor(a.runEffect(()=>fetch(e.url,{method:"PUT",body:t.blob,headers:{"Content-Type":"image/png","Content-Length":t.blob.size.toString()}})))}))}))}async generateImages(e,t,r=!1){let a=this._captureGenerationGuard(),n=await a.waitFor(this._getRenderer()),o=t.map(e=>e.name);if(r)return void await Promise.all(t.map(async e=>{let t=await a.waitFor(a.runEffect(()=>n.renderImage(e)));a.runEffect(()=>this._openDebugImage(t))}));let i=await Promise.all(t.map(async e=>({blob:await a.waitFor(a.runEffect(()=>n.renderImage(e))),name:e.name}))),s=await a.waitFor(a.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),e,o)));await Promise.all(s.map(async e=>{let t=i.find(t=>t.name===e.name);if(null==t)throw Error("Blob not found!");await Promise.all(s.map(async e=>{await a.waitFor(a.runEffect(()=>fetch(e.url,{method:"PUT",body:t.blob,headers:{"Content-Type":"image/png","Content-Length":t.blob.size.toString()}})))}))}))}async getGeneratedImages(e,t=!1){let r=this._captureGenerationAssertion(),a=await this._getRenderer();return(r(),t)?(await Promise.all(e.map(async e=>{let t=await a.renderImage(e);r(),this._openDebugImage(t)})),[]):Promise.all(e.map(async e=>{let t=await a.renderImage(e);return r(),{blob:t,name:e.name}}))}_renderCurrentView=e=>{let{gl:t,scene:r,camera:a}=e.get();null!==this._effectComposer?this._effectComposer.render():t.render(r,a)};_freezeCanvas=e=>{this._canvasFreeze?.handle===e?this._canvasFreeze.holders+=1:(this._canvasFreeze?.remove(),this._canvasFreeze={handle:e,remove:C(e.get().gl.domElement,()=>this._renderCurrentView(e)),resumeFrameloop:this._context.configuratorExtensionSelectors.getExportSystem().pauseFrameloop(e),holders:1});let t=this._canvasFreeze,r=!1;return async()=>{if(!r&&(r=!0,t.holders-=1,!(t.holders>0)))try{let r=this._context.configuratorExtensionSelectors.getCanvasSystem();r.r3fHandle$.value===e&&await r.waitForFlush(),r.r3fHandle$.value===e&&0===t.holders&&this._renderCurrentView(e)}catch{}finally{0===t.holders&&(t.remove(),t.resumeFrameloop(),this._canvasFreeze===t&&(this._canvasFreeze=null))}}};async renderImage(e){let t=this._context.configuratorExtensionSelectors.getCanvasSystem(),o=t.r3fHandle$.value??await t.waitForCanvas(),{gl:i,scene:l,camera:c,size:m,advance:g}=o.get(),d=i.getRenderTarget(),h=i.getClearColor(new r),u=i.getClearAlpha(),f=i.autoClearColor,p=t=>new y(e.width,e.height,t,i.outputColorSpace),w={composer:null,pass:null},C=null,_=null,v=e=>{let t=w.pass??p(n);return w.pass=t,w.composer===e&&e.passes.at(-1)===t||(w.composer?.removePass(t),e.addPass(t),w.composer=e),t},E=async()=>{if(await this._context.configuratorExtensionSelectors.getCanvasSystem().waitForFlush(),this._context.configuratorExtensionSelectors.getCanvasSystem().r3fHandle$.value!==o)throw Error("Canvas was remounted while an image was being rendered! The export borrowed a canvas that is gone, so it cannot capture the image. Retry the export once the configurator has settled.")},S=this._freezeCanvas(o);try{o.set({size:{height:e.height,width:e.width,top:0,left:0,updateStyle:!1}}),o.set({camera:e.camera}),await E(),null!==this._effectComposer&&v(this._effectComposer),g(void 0),await E();let t="JPEG"===e.fileFormat?"image/jpeg":"image/png",n=b({sceneBackground:l.background,backgroundColor:e.backgroundColor,fileFormat:e.fileFormat,outputColorSpace:i.outputColorSpace});if(null!==this._effectComposer){i.setRenderTarget(null),"JPEG"===e.fileFormat?i.setClearColor(e.backgroundColor??0xffffff):e.backgroundColor?i.setClearColor(e.backgroundColor):i.setClearAlpha(0),i.autoClearColor=!0;let r=v(this._effectComposer);return this._effectComposer.render(),await x(i,r.renderTarget,n,t)}C=p(i.toneMapping),_=new s(e.width,e.height,{samples:4,type:a,stencilBuffer:i.getContextAttributes().stencil??!1});let c=l.background;c instanceof r&&(l.background=null);try{i.setClearColor(0,0),i.setRenderTarget(_),i.clear(),i.render(l,e.camera)}finally{l.background=c}return C.render(i,_),await x(i,C.renderTarget,n,t)}finally{null!==w.pass&&(w.composer?.removePass(w.pass),w.pass.dispose()),C?.dispose(),_?.dispose(),this._context.configuratorExtensionSelectors.getCanvasSystem().r3fHandle$.value===o&&(i.setClearColor(h,u),i.autoClearColor=f,i.setRenderTarget(d),o.set({camera:c,size:{...m,updateStyle:!1}})),await S()}}async generateAndUploadDeclaredClientSideImages(e,t,r={}){let a=this._captureGenerationGuard(),n=await a.waitFor(this.generateDeclaredClientSideImages(e,r));if(r.debug)return n;let o=new Map((await a.waitFor(a.runEffect(()=>this._context.getAuthorizedClient().generateUploadLinks(this._context.getConfigurationId(),t,n.map(e=>e.name))))).map(e=>[e.name,e.url]));return await Promise.all(n.map(async e=>{let t=o.get(e.name);if(!t)throw Error(`Presigned link for image ${e.name} not found!`);await a.waitFor(a.runEffect(()=>fetch(t,{method:"PUT",body:e.blob})))})),n}generateDeclaredClientSideImages(e,t={}){let r=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[m]},e);return this.generateImagesFromComponents(r,e,t)}generateImagesFromComponents(e,t,r={},a={}){return this._generateImagesFromComponents(e,t,r,a)}async _generateImagesFromComponents(e,t,a,n){let s=this._captureGenerationGuard(),m=!1,C=this._context.domainContextSelectors.getExportStates(),_=e.map(e=>{if(!C.includes(e.state.exportState)){let t=u(e.componentInstance.entityId)?d(e.componentInstance.entityId):"unknown entity",r=e.componentInstance.componentType.name,a=e.componentInstance.instanceName;throw Error(`Export state ${e.state.exportState} declared in component ${r}/${a} on ${t} is not a valid export state. Expected one of: ${C.join(", ")}`)}let n=e.componentInstance.entityId;if(f(n))throw Error("Virtual entities cannot be used for export");return this._context.configuratorExtensionSelectors.getExportSystem().createExportJob(t,{exportState:e.state.exportState,exportedEntityId:n,toolState:e.state.toolState,viewState:e.state.viewState,navigationState:e.state.navigationState,selectedEntityId:t.rootEntityId},async t=>{let d=this._context.domainContextSelectors.getComponentReader().readManyComponents({componentTypes:[g,h,p]},t.state);!m&&d.length>0&&(await new Promise(e=>{l({font:void 0,characters:void 0},e)}),m=!0,await this._context.configuratorExtensionSelectors.getCanvasSystem().waitForFlush());let u=this._context.configuratorExtensionSelectors.getCameraSystem().getActiveCameraConfig(t.state);if(null==u)throw Error(`No camera config is attached for export state ${e.state.exportState} and exported entity ${n}. Whenever using a client-side image component, you need to attach a camera configuration to the export state defined on that componentin the domain spec. This camera will be used to render the image.`);let f=c(u.typeSpecificConfig.cameraType).with("perspective",()=>new i(45,e.state.width/e.state.height,1,1e4)).with("orthographic",()=>new o(0,0,1e4,0,1,1e4)).exhaustive(),C=w(f);await this._context.configuratorExtensionSelectors.getCameraSystem().applyConfig(u,C,!1,{width:e.state.width,height:e.state.height,padding:{top:0,right:0,bottom:0,left:0}}),C.update(1e6),await new Promise(e=>setTimeout(e,100));let _=await s.waitFor(s.runEffect(()=>this.renderImage({width:e.state.width,height:e.state.height,fileFormat:e.state.fileFormat,backgroundColor:e.state.backgroundColor?new r(e.state.backgroundColor):void 0,camera:f})));return a.debug&&s.runEffect(()=>this._openDebugImage(_)),{blob:_,imageComponent:e,name:`${e.componentInstance.componentType.name}-${e.componentInstance.entityId}-${e.componentInstance.instanceName}`}})});if(0===_.length)return this._context.configuratorExtensionSelectors.getExportSystem().runExportJobs(_,n);let y=this._context.configuratorExtensionSelectors.getCanvasSystem(),x=y.r3fHandle$.value??await s.waitFor(y.waitForCanvas().catch(e=>{throw s.assertActive(),e})),b=this._freezeCanvas(x);try{return await this._context.configuratorExtensionSelectors.getExportSystem().runExportJobs(_,n)}finally{await b()}}initialize=()=>{for(let e of(null!==this._generation&&(this._generation.active=!1),this._debugObjectUrls))URL.revokeObjectURL(e);this._debugObjectUrls.clear(),this._generation={active:!0}}}