@salsita-ai/sdk 0.50.0-develop.8f92f00b12 → 0.50.0-develop.9239ced550

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 (564) hide show
  1. package/README.md +1 -1
  2. package/dist/application/index.d.ts +1 -0
  3. package/dist/application/index.js +1 -1
  4. package/dist/application/mount-application.d.ts +1 -1
  5. package/dist/application/mount-application.js +1 -1
  6. package/dist/application/mount-configurator.d.ts +19 -0
  7. package/dist/application/mount-configurator.js +1 -0
  8. package/dist/application/mounted-application-runtime.d.ts +4 -0
  9. package/dist/application/mounted-application-runtime.js +1 -0
  10. package/dist/application/register-web-component.d.ts +2 -0
  11. package/dist/application/register-web-component.js +1 -0
  12. package/dist/application-spec/core/enhanced-json-value.d.ts +2 -31
  13. package/dist/application-spec/core/enhanced-json-value.js +1 -1
  14. package/dist/application-spec/core/index.d.ts +1 -3
  15. package/dist/application-spec/core/index.js +1 -1
  16. package/dist/application-spec/core/markers/index.d.ts +1 -1
  17. package/dist/application-spec/core/markers/index.js +1 -1
  18. package/dist/application-spec/core/markers/msg-marker.d.ts +2 -28
  19. package/dist/application-spec/core/markers/msg-marker.js +1 -1
  20. package/dist/application-spec/core/markers/raw-eval-write-marker.d.ts +1 -1
  21. package/dist/application-spec/core/markers/raw-eval-write-marker.js +1 -1
  22. package/dist/application-spec/core/markers/raw-read-write-marker.js +1 -1
  23. package/dist/application-spec/errors/diagnostic-codes.d.ts +9 -0
  24. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  25. package/dist/application-spec/errors/diagnostic-messages.d.ts +10 -1
  26. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  27. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  28. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  29. package/dist/application-spec/generate-application/code/templates/application-types.js +6 -6
  30. package/dist/application-spec/generate-application/code/templates/common/doc-comment.d.ts +2 -0
  31. package/dist/application-spec/generate-application/code/templates/common/doc-comment.js +1 -0
  32. package/dist/application-spec/generate-application/code/templates/configurator-globals.d.ts +2 -1
  33. package/dist/application-spec/generate-application/code/templates/configurator-globals.js +19 -6
  34. package/dist/application-spec/generate-application/code/templates/global-definition/generate-action-types.js +7 -7
  35. package/dist/application-spec/generate-application/code/templates/global-definition/generate-assistant-form-element-types.d.ts +12 -0
  36. package/dist/application-spec/generate-application/code/templates/global-definition/generate-assistant-form-element-types.js +7 -0
  37. package/dist/application-spec/generate-application/code/templates/global-definition/generate-phx-types.js +24 -22
  38. package/dist/application-spec/generate-application/code/templates/global-definition/index.d.ts +1 -0
  39. package/dist/application-spec/generate-application/code/templates/global-definition/index.js +1 -1
  40. package/dist/application-spec/generate-application/code/templates/index.d.ts +2 -6
  41. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  42. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill-bundle.d.ts +10 -0
  43. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill-bundle.js +7 -0
  44. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  45. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +13 -6
  46. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  47. package/dist/application-spec/generate-application/implementations/phx-application-types.d.ts +25 -0
  48. package/dist/application-spec/generate-application/implementations/phx-application-types.js +1 -0
  49. package/dist/application-spec/generate-application/implementations/phx-domain.d.ts +36 -0
  50. package/dist/application-spec/generate-application/implementations/phx-domain.js +1 -0
  51. package/dist/application-spec/generate-application/implementations/phx-model.d.ts +24 -0
  52. package/dist/application-spec/generate-application/implementations/phx-model.js +1 -0
  53. package/dist/application-spec/generate-application/implementations/phx.d.ts +22 -0
  54. package/dist/application-spec/generate-application/implementations/phx.js +1 -0
  55. package/dist/application-spec/generate-application/index.d.ts +2 -0
  56. package/dist/application-spec/generate-application/index.js +1 -1
  57. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.d.ts +3 -3
  58. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +7 -4
  59. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  60. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-spec-runtime.d.ts +16 -0
  61. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-spec-runtime.js +1 -0
  62. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +17 -4
  63. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  64. package/dist/application-spec/generate-application/runtime/application-spec-slice.d.ts +71 -0
  65. package/dist/application-spec/generate-application/runtime/application-spec-slice.js +1 -0
  66. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.d.ts +3 -3
  67. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +7 -5
  68. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  69. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-spec-runtime.d.ts +16 -0
  70. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-spec-runtime.js +1 -0
  71. package/dist/application-spec/generate-application/runtime/create-application.d.ts +57 -0
  72. package/dist/application-spec/generate-application/runtime/create-application.js +1 -0
  73. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -1
  74. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +1 -1
  75. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -1
  76. package/dist/application-spec/generate-application/runtime/generate-runtime-instance.d.ts +1 -1
  77. package/dist/application-spec/generate-application/runtime/generate-runtime-instance.js +1 -1
  78. package/dist/application-spec/generate-application/runtime/index.d.ts +8 -0
  79. package/dist/application-spec/generate-application/runtime/index.js +1 -0
  80. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  81. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.d.ts +9 -3
  82. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  83. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.d.ts +1 -1
  84. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.js +1 -1
  85. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.d.ts +1 -1
  86. package/dist/application-spec/generate-application/runtime/spec-runtime.d.ts +21 -0
  87. package/dist/application-spec/generate-application/runtime/spec-runtime.js +1 -0
  88. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.d.ts +3 -2
  89. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.d.ts +44 -9
  90. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.js +1 -1
  91. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +33 -3
  92. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  93. package/dist/application-spec/parse-application-files/raw-spec/raw-expressions.d.ts +1 -1
  94. package/dist/application-spec/parse-application-files/raw-spec/raw-expressions.js +1 -1
  95. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-form-elements.d.ts +9 -0
  96. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-form-elements.js +1 -0
  97. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.d.ts +4 -1
  98. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  99. package/dist/client/authorized-client.d.ts +3 -1
  100. package/dist/client/authorized-client.js +1 -1
  101. package/dist/client/contract.d.ts +17 -0
  102. package/dist/client/index.d.ts +1 -1
  103. package/dist/client/local-authorized-client.d.ts +3 -1
  104. package/dist/client/local-authorized-client.js +1 -1
  105. package/dist/client/memory-authorized-client.d.ts +4 -1
  106. package/dist/client/memory-authorized-client.js +1 -1
  107. package/dist/client/phoenix-api.d.ts +228 -0
  108. package/dist/configurator/ConfiguratorApp.js +1 -1
  109. package/dist/configurator/app-loader-content/index.d.ts +0 -1
  110. package/dist/configurator/app-loader-content/index.js +1 -1
  111. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  112. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +17 -3
  113. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  114. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +34 -7
  115. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  116. package/dist/configurator/application-runtime/extensions/systems/canvas-system.d.ts +8 -0
  117. package/dist/configurator/application-runtime/extensions/systems/canvas-system.js +1 -1
  118. package/dist/configurator/application-runtime/extensions/systems/export-system/export-busy-error.d.ts +8 -0
  119. package/dist/configurator/application-runtime/extensions/systems/export-system/export-busy-error.js +1 -0
  120. package/dist/configurator/application-runtime/extensions/systems/export-system/export-system.d.ts +23 -1
  121. package/dist/configurator/application-runtime/extensions/systems/export-system/export-system.js +1 -1
  122. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +14 -1
  123. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  124. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +51 -4
  125. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  126. package/dist/configurator/application-runtime/extensions/systems/image-rendering-system/image-rendering-system.d.ts +14 -5
  127. package/dist/configurator/application-runtime/extensions/systems/image-rendering-system/image-rendering-system.js +1 -1
  128. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  129. package/dist/configurator/common/configurator-interface.d.ts +14 -6
  130. package/dist/configurator/common/configurator-interface.js +1 -1
  131. package/dist/configurator/configuration-not-found-page/BuiltInConfigurationNotFoundPage.d.ts +5 -0
  132. package/dist/configurator/configuration-not-found-page/BuiltInConfigurationNotFoundPage.js +1 -0
  133. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.d.ts +0 -6
  134. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.js +1 -1
  135. package/dist/configurator/configuration-not-found-page/index.d.ts +2 -2
  136. package/dist/configurator/configuration-not-found-page/index.js +1 -1
  137. package/dist/configurator/configurator-context/ConfiguratorResponsiveProvider.d.ts +3 -3
  138. package/dist/configurator/configurator-context/ConfiguratorResponsiveProvider.js +1 -1
  139. package/dist/configurator/configurator-context/PreviewContextProvider.js +1 -1
  140. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +4 -0
  141. package/dist/configurator/configurator-context/configurator-routing/ConfiguratorRoutingProvider.js +1 -1
  142. package/dist/configurator/configurator-error-page/BuiltInConfiguratorErrorPage.d.ts +3 -3
  143. package/dist/configurator/configurator-error-page/BuiltInConfiguratorErrorPage.js +1 -1
  144. package/dist/configurator/configurator-error-page/ConfiguratorErrorPageElement.d.ts +0 -5
  145. package/dist/configurator/configurator-error-page/ConfiguratorErrorPageElement.js +1 -1
  146. package/dist/configurator/configurator-error-page/index.d.ts +1 -2
  147. package/dist/configurator/configurator-error-page/index.js +1 -1
  148. package/dist/configurator/index.d.ts +9 -2
  149. package/dist/configurator/index.js +1 -1
  150. package/dist/configurator/pages/default-configurator-elements.js +1 -1
  151. package/dist/configurator/pages/error-boundaries/LoadingErrorBoundary.js +1 -1
  152. package/dist/configurator/toolbar-actions/index.d.ts +1 -0
  153. package/dist/configurator/toolbar-actions/index.js +1 -1
  154. package/dist/configurator/toolbar-actions/use-toolbar-actions.d.ts +100 -0
  155. package/dist/configurator/toolbar-actions/use-toolbar-actions.js +1 -0
  156. package/dist/configurator/toolbar-actions/use-toolbar-help.d.ts +7 -0
  157. package/dist/configurator/toolbar-actions/use-toolbar-help.js +1 -0
  158. package/dist/configurator/ui/assistant/AssistantChips.d.ts +3 -2
  159. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  160. package/dist/configurator/ui/assistant/form/AssistantForm.js +1 -1
  161. package/dist/configurator/ui/assistant/form/compose-answer.d.ts +1 -1
  162. package/dist/configurator/ui/assistant/form/compose-answer.js +1 -1
  163. package/dist/configurator/ui/assistant/form/form-model.d.ts +1 -3
  164. package/dist/configurator/ui/assistant/form/form-state.d.ts +1 -1
  165. package/dist/configurator/ui/assistant/form/index.d.ts +2 -0
  166. package/dist/configurator/ui/assistant/form/index.js +1 -1
  167. package/dist/configurator/ui/assistant/form/parse-form-block.d.ts +3 -3
  168. package/dist/configurator/ui/assistant/form/parse-form-block.js +1 -1
  169. package/dist/configurator/ui/assistant/form/read-form-attributes.d.ts +1 -1
  170. package/dist/configurator/ui/assistant/form/read-form-attributes.js +1 -1
  171. package/dist/configurator/ui/assistant/form/registry/built-in-form-elements.d.ts +3 -0
  172. package/dist/configurator/ui/assistant/form/registry/built-in-form-elements.js +1 -0
  173. package/dist/configurator/ui/assistant/form/registry/create-assistant-form-element.d.ts +31 -0
  174. package/dist/configurator/ui/assistant/form/registry/create-assistant-form-element.js +1 -0
  175. package/dist/configurator/ui/assistant/form/{form-element-definition.d.ts → registry/form-element-definition.d.ts} +3 -1
  176. package/dist/configurator/ui/assistant/form/registry/form-element-definition.js +1 -0
  177. package/dist/configurator/ui/assistant/form/{form-registry.d.ts → registry/form-registry.d.ts} +1 -1
  178. package/dist/configurator/ui/assistant/form/registry/form-registry.js +1 -0
  179. package/dist/configurator/ui/assistant/form/registry/index.d.ts +6 -0
  180. package/dist/configurator/ui/assistant/form/registry/index.js +1 -0
  181. package/dist/configurator/ui/assistant/form/registry/use-form-registry.d.ts +8 -0
  182. package/dist/configurator/ui/assistant/form/registry/use-form-registry.js +1 -0
  183. package/dist/configurator/ui/assistant/form-elements/FormCard.d.ts +9 -0
  184. package/dist/configurator/ui/assistant/form-elements/FormCard.js +1 -0
  185. package/dist/configurator/ui/assistant/form-elements/FormReply.d.ts +1 -1
  186. package/dist/configurator/ui/assistant/form-elements/FormReply.js +1 -1
  187. package/dist/configurator/ui/assistant/form-elements/FormSwatch.d.ts +10 -0
  188. package/dist/configurator/ui/assistant/form-elements/FormSwatch.js +1 -0
  189. package/dist/configurator/ui/assistant/form-elements/form-element-props.d.ts +5 -3
  190. package/dist/configurator/ui/assistant/form-elements/index.d.ts +2 -0
  191. package/dist/configurator/ui/assistant/form-elements/index.js +1 -1
  192. package/dist/configurator/ui/assistant/index.d.ts +3 -0
  193. package/dist/configurator/ui/assistant/index.js +1 -1
  194. package/dist/configurator/ui/assistant/resource-image/index.d.ts +1 -1
  195. package/dist/configurator/ui/assistant/resource-image/index.js +1 -1
  196. package/dist/configurator/ui/assistant/resource-image/resource-path.d.ts +0 -9
  197. package/dist/configurator/ui/assistant/resource-image/resource-path.js +1 -1
  198. package/dist/configurator/ui/assistant/screenshots/ScreenshotThumbnails.d.ts +9 -0
  199. package/dist/configurator/ui/assistant/screenshots/ScreenshotThumbnails.js +1 -0
  200. package/dist/configurator/ui/assistant/screenshots/index.d.ts +2 -0
  201. package/dist/configurator/ui/assistant/screenshots/index.js +1 -0
  202. package/dist/configurator/ui/assistant/screenshots/tool-screenshots.d.ts +22 -0
  203. package/dist/configurator/ui/assistant/screenshots/tool-screenshots.js +1 -0
  204. package/dist/configurator/ui/assistant/screenshots/use-screenshot-src.d.ts +8 -0
  205. package/dist/configurator/ui/assistant/screenshots/use-screenshot-src.js +1 -0
  206. package/dist/configurator/ui/assistant/tool-chip.js +1 -1
  207. package/dist/configurator/ui/configurator-layout/slots/canvas/LayoutCanvas.js +1 -1
  208. package/dist/configurator/ui/configurator-layout/slots/canvas/SharedCanvas.js +1 -1
  209. package/dist/configurator/ui/configurator-layout/universal/ExportingOverlay.d.ts +5 -0
  210. package/dist/configurator/ui/configurator-layout/universal/ExportingOverlay.js +1 -0
  211. package/dist/configurator/ui/configurator-layout/universal/Layout.js +1 -1
  212. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.js +1 -1
  213. package/dist/configurator/ui/index.d.ts +1 -0
  214. package/dist/configurator/ui/index.js +1 -1
  215. package/dist/configurator/ui/legacy/layout/common/ReactiveInterfaceLayout.js +1 -1
  216. package/dist/configurator/ui/phoenix-layout-elements/AppLoader.d.ts +0 -7
  217. package/dist/configurator/ui/phoenix-layout-elements/AppLoader.js +2 -2
  218. package/dist/configurator/ui/phoenix-layout-elements/index.d.ts +8 -1
  219. package/dist/configurator/ui/phoenix-layout-elements/index.js +1 -1
  220. package/dist/configurator/ui/preset-layout/PresetUi.d.ts +0 -2
  221. package/dist/configurator/ui/preset-layout/PresetUi.js +1 -1
  222. package/dist/configurator/ui/preset-layout/index.d.ts +6 -1
  223. package/dist/configurator/ui/preset-layout/index.js +1 -1
  224. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.js +1 -1
  225. package/dist/docs/index.json +95 -1
  226. package/dist/docs/integrations/webcomponent-api/basics.mdx +2 -0
  227. package/dist/docs/layouts/custom-layout.mdx +318 -158
  228. package/dist/docs/layouts/gallery/ardent-compressor.mdx +3516 -0
  229. package/dist/docs/layouts/gallery/corvid-drone.mdx +3428 -0
  230. package/dist/docs/layouts/gallery/fenwick-window.mdx +2803 -0
  231. package/dist/docs/layouts/gallery/ferrule-bar-station.mdx +6567 -0
  232. package/dist/docs/layouts/gallery/kestrel-kettle.mdx +1858 -0
  233. package/dist/docs/layouts/gallery/nightjar-guitar.mdx +3698 -0
  234. package/dist/docs/layouts/gallery/sunfold-solar.mdx +2683 -0
  235. package/dist/docs/layouts/gallery/tidepool-aquascape.mdx +5203 -0
  236. package/dist/docs/other-features/client-side-rendering/declarative.mdx +1 -1
  237. package/dist/docs/phoenix/configurator-interface.mdx +16 -13
  238. package/dist/docs/phoenix/domain-model.mdx +4 -1
  239. package/dist/docs/phoenix/phoenix-cli.mdx +14 -6
  240. package/dist/docs/phoenix/project-structure.mdx +21 -17
  241. package/dist/docs/phoenix/sdk-builder-workflow.mdx +7 -5
  242. package/dist/docs/phoenix/sessions-and-access.mdx +2 -0
  243. package/dist/domain/application/assistant/assistant-manifest.d.ts +16 -1
  244. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +8 -1
  245. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  246. package/dist/domain/application/assistant/form/assistant-form-element-name.d.ts +11 -0
  247. package/dist/domain/application/assistant/form/assistant-form-element-name.js +8 -0
  248. package/dist/domain/application/assistant/{assistant-form-elements.d.ts → form/assistant-form-elements.d.ts} +71 -23
  249. package/dist/domain/application/assistant/form/assistant-form-elements.js +1 -0
  250. package/dist/domain/application/assistant/form/assistant-resource-path.d.ts +10 -0
  251. package/dist/domain/application/assistant/form/assistant-resource-path.js +1 -0
  252. package/dist/domain/application/assistant/form/index.d.ts +4 -0
  253. package/dist/domain/application/assistant/form/index.js +1 -0
  254. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +2 -2
  255. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  256. package/dist/domain/application/assistant/index.d.ts +2 -4
  257. package/dist/domain/application/assistant/index.js +1 -1
  258. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -1
  259. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +2 -0
  260. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -1
  261. package/dist/domain/application/configurator-builder.d.ts +7 -1
  262. package/dist/domain/application/configurator-builder.js +1 -1
  263. package/dist/domain/application/index.d.ts +1 -1
  264. package/dist/domain/application/index.js +1 -1
  265. package/dist/domain/application/standard-properties.js +1 -1
  266. package/dist/domain/application/web-component-property.d.ts +3 -1
  267. package/dist/domain/application/web-component-property.js +1 -1
  268. package/dist/domain/available-system-components.d.ts +1 -1
  269. package/dist/domain/available-system-components.js +1 -1
  270. package/dist/domain/domain-builder.d.ts +9 -3
  271. package/dist/domain/domain-builder.js +1 -1
  272. package/dist/domain/domain-context/store-system/store-system.d.ts +5 -0
  273. package/dist/domain/domain-context/store-system/store-system.js +1 -1
  274. package/dist/domain/domain-runtime/application.d.ts +39 -0
  275. package/dist/domain/domain-runtime/application.js +1 -0
  276. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +1 -0
  277. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  278. package/dist/domain/domain-runtime/domain-runtime.d.ts +44 -4
  279. package/dist/domain/domain-runtime/domain-runtime.js +1 -1
  280. package/dist/domain/domain-runtime/environment/initialize.d.ts +1 -1
  281. package/dist/domain/domain-runtime/environment/types.d.ts +1 -1
  282. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +2 -0
  283. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -1
  284. package/dist/domain/domain-runtime/index.d.ts +2 -1
  285. package/dist/domain/domain-runtime/index.js +1 -1
  286. package/dist/domain/domain-runtime/spec/index.d.ts +1 -1
  287. package/dist/domain/domain-runtime/spec/index.js +1 -1
  288. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  289. package/dist/domain/domain-runtime/spec/module-checks/element-registration.d.ts +15 -1
  290. package/dist/domain/domain-runtime/spec/module-checks/element-registration.js +1 -1
  291. package/dist/domain/domain-runtime/spec/module-checks/find-assistant-form-element-errors.d.ts +12 -0
  292. package/dist/domain/domain-runtime/spec/module-checks/find-assistant-form-element-errors.js +1 -0
  293. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +3 -1
  294. package/dist/domain/domain-runtime/spec/module-checks/index.js +1 -1
  295. package/dist/domain/domain-runtime/spec/module-checks/merge-expression-modules.d.ts +23 -0
  296. package/dist/domain/domain-runtime/spec/module-checks/merge-expression-modules.js +1 -0
  297. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.d.ts +3 -4
  298. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -1
  299. package/dist/domain/domain-runtime/spec/selectors.d.ts +3 -1
  300. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  301. package/dist/domain/domain-runtime/web-component/actions.d.ts +3 -0
  302. package/dist/domain/domain-runtime/web-component/actions.js +1 -1
  303. package/dist/domain/domain-runtime/web-component/initialize.d.ts +1 -0
  304. package/dist/domain/domain-runtime/web-component/initialize.js +1 -1
  305. package/dist/domain/domain-runtime/web-component/selectors.d.ts +2 -0
  306. package/dist/domain/domain-runtime/web-component/selectors.js +1 -1
  307. package/dist/domain/domain-runtime/web-component/types.d.ts +6 -3
  308. package/dist/domain/extensions/export-images/agent-screenshot.d.ts +24 -0
  309. package/dist/domain/extensions/export-images/agent-screenshot.js +1 -0
  310. package/dist/domain/extensions/{client-side-image.d.ts → export-images/client-side-image.d.ts} +2 -2
  311. package/dist/domain/extensions/export-images/client-side-image.js +1 -0
  312. package/dist/domain/extensions/export-images/index.d.ts +3 -0
  313. package/dist/domain/extensions/export-images/index.js +1 -0
  314. package/dist/domain/extensions/{save-template-thumbnail.d.ts → export-images/save-template-thumbnail.d.ts} +2 -2
  315. package/dist/domain/extensions/export-images/save-template-thumbnail.js +1 -0
  316. package/dist/domain/extensions/index.d.ts +1 -2
  317. package/dist/domain/extensions/index.js +1 -1
  318. package/dist/domain/index.d.ts +1 -0
  319. package/dist/domain/index.js +1 -1
  320. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +9 -0
  321. package/dist/domain/spec/application/index.d.ts +1 -0
  322. package/dist/domain/spec/application/index.js +1 -0
  323. package/dist/{application-spec/core → domain/spec}/components/component-filter.d.ts +3 -2
  324. package/dist/domain/spec/enhanced-json-value.d.ts +30 -0
  325. package/dist/domain/spec/enhanced-json-value.js +1 -0
  326. package/dist/domain/spec/index.d.ts +5 -0
  327. package/dist/domain/spec/index.js +1 -0
  328. package/dist/domain/spec/markers/index.d.ts +2 -0
  329. package/dist/domain/spec/markers/index.js +1 -0
  330. package/dist/domain/spec/markers/msg-marker.d.ts +28 -0
  331. package/dist/domain/spec/markers/msg-marker.js +1 -0
  332. package/dist/editor/domain-editors/DomainSpecContext.js +1 -1
  333. package/dist/editor/domain-editors/apply-spec-update.d.ts +10 -2
  334. package/dist/editor/domain-editors/apply-spec-update.js +1 -1
  335. package/dist/editor/domain-editors/use-implementation-files.d.ts +6 -14
  336. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  337. package/dist/editor/screenshot/ScreenshotHandler.js +1 -1
  338. package/dist/i18n/locales/cs/messages.js +1 -1
  339. package/dist/i18n/locales/da/messages.js +1 -1
  340. package/dist/i18n/locales/de/messages.js +1 -1
  341. package/dist/i18n/locales/de-AT/messages.js +1 -1
  342. package/dist/i18n/locales/en/messages.js +1 -1
  343. package/dist/i18n/locales/en-AU/messages.js +1 -1
  344. package/dist/i18n/locales/en-GB/messages.js +1 -1
  345. package/dist/i18n/locales/es/messages.js +1 -1
  346. package/dist/i18n/locales/fr/messages.js +1 -1
  347. package/dist/i18n/locales/hu/messages.js +1 -1
  348. package/dist/i18n/locales/it/messages.js +1 -1
  349. package/dist/i18n/locales/nl/messages.js +1 -1
  350. package/dist/i18n/locales/pl/messages.js +1 -1
  351. package/dist/i18n/locales/pt/messages.js +1 -1
  352. package/dist/i18n/locales/ro/messages.js +1 -1
  353. package/dist/i18n/locales/sk/messages.js +1 -1
  354. package/dist/i18n/locales/tr/messages.js +1 -1
  355. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  356. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  357. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +16 -0
  358. package/dist/legacy/domain-spec/spec/domain-spec.js +1 -1
  359. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  360. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  361. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  362. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +11 -5
  363. package/dist/phoenix/application-spec/generate-application-spec-project.js +2 -2
  364. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +11 -0
  365. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  366. package/dist/phoenix/bin.js +1 -1
  367. package/dist/phoenix/cli.js +1 -1
  368. package/dist/phoenix/commands/deploy.js +1 -1
  369. package/dist/phoenix/commands/dev.js +5 -5
  370. package/dist/phoenix/commands/generated-env-markers.d.ts +1 -0
  371. package/dist/phoenix/commands/generated-env-markers.js +1 -1
  372. package/dist/phoenix/commands/index.d.ts +1 -1
  373. package/dist/phoenix/commands/index.js +1 -1
  374. package/dist/phoenix/lingui/index.d.ts +1 -0
  375. package/dist/phoenix/lingui/index.js +1 -0
  376. package/dist/phoenix/{services → lingui}/lingui.d.ts +5 -2
  377. package/dist/phoenix/lingui/lingui.js +1 -0
  378. package/dist/phoenix/services/application-spec-project-watcher.d.ts +3 -1
  379. package/dist/phoenix/services/application-spec-project-watcher.js +2 -2
  380. package/dist/phoenix/services/index.d.ts +1 -0
  381. package/dist/phoenix/services/index.js +1 -1
  382. package/dist/phoenix/services/lingui-watcher.js +1 -1
  383. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  384. package/dist/phoenix/services/vite-config.js +1 -1
  385. package/dist/react-sdk/application-runtime/common-services/analytics/analytics-service.d.ts +1 -1
  386. package/dist/react-sdk/application-runtime/common-services/initialize.d.ts +2 -2
  387. package/dist/react-sdk/application-runtime/hooks/index.d.ts +2 -0
  388. package/dist/react-sdk/application-runtime/hooks/index.js +1 -1
  389. package/dist/react-sdk/application-runtime/hooks/loading/index.d.ts +5 -0
  390. package/dist/react-sdk/application-runtime/hooks/loading/index.js +1 -0
  391. package/dist/react-sdk/application-runtime/hooks/loading/loader-host-context.d.ts +11 -0
  392. package/dist/react-sdk/application-runtime/hooks/loading/loader-host-context.js +1 -0
  393. package/dist/react-sdk/application-runtime/hooks/loading/use-is-awaiting-loading-phase.d.ts +8 -0
  394. package/dist/react-sdk/application-runtime/hooks/loading/use-is-awaiting-loading-phase.js +1 -0
  395. package/dist/react-sdk/application-runtime/hooks/loading/use-is-loader-hosted.d.ts +7 -0
  396. package/dist/react-sdk/application-runtime/hooks/loading/use-is-loader-hosted.js +1 -0
  397. package/dist/react-sdk/application-runtime/hooks/loading/use-loading-actions.d.ts +9 -0
  398. package/dist/react-sdk/application-runtime/hooks/loading/use-loading-actions.js +1 -0
  399. package/dist/react-sdk/application-runtime/hooks/loading/use-loading-application.d.ts +24 -0
  400. package/dist/react-sdk/application-runtime/hooks/loading/use-loading-application.js +1 -0
  401. package/dist/react-sdk/application-runtime/hooks/responsive/index.d.ts +3 -0
  402. package/dist/react-sdk/application-runtime/hooks/responsive/index.js +1 -0
  403. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-actions.d.ts +9 -0
  404. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-actions.js +1 -0
  405. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-application.d.ts +26 -0
  406. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-application.js +1 -0
  407. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-state.d.ts +10 -0
  408. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-state.js +1 -0
  409. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-store.d.ts +24 -0
  410. package/dist/react-sdk/application-runtime/hooks/responsive/use-responsive-store.js +1 -0
  411. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +5 -0
  412. package/dist/react-sdk/application-runtime/hooks/use-access-service.js +1 -1
  413. package/dist/react-sdk/application-runtime/hooks/use-phoenix-element-slots.d.ts +2 -1
  414. package/dist/react-sdk/application-runtime/hooks/use-web-component-readonly-sync.d.ts +4 -11
  415. package/dist/react-sdk/application-runtime/hooks/use-web-component-readonly-sync.js +1 -1
  416. package/dist/react-sdk/application-runtime/hooks/use-web-component.d.ts +5 -0
  417. package/dist/react-sdk/application-runtime/hooks/use-web-component.js +1 -1
  418. package/dist/react-sdk/application-runtime/host-properties/actions.d.ts +15 -0
  419. package/dist/react-sdk/application-runtime/host-properties/actions.js +1 -0
  420. package/dist/react-sdk/application-runtime/host-properties/connect-host-properties.d.ts +30 -0
  421. package/dist/react-sdk/application-runtime/host-properties/connect-host-properties.js +1 -0
  422. package/dist/react-sdk/application-runtime/host-properties/domain-host-properties.d.ts +7 -0
  423. package/dist/react-sdk/application-runtime/host-properties/domain-host-properties.js +1 -0
  424. package/dist/react-sdk/application-runtime/host-properties/host-property-descriptors.d.ts +21 -0
  425. package/dist/react-sdk/application-runtime/host-properties/host-property-descriptors.js +1 -0
  426. package/dist/react-sdk/application-runtime/host-properties/host-property-scopes.d.ts +42 -0
  427. package/dist/react-sdk/application-runtime/host-properties/host-property-scopes.js +1 -0
  428. package/dist/react-sdk/application-runtime/host-properties/index.d.ts +8 -0
  429. package/dist/react-sdk/application-runtime/host-properties/index.js +1 -0
  430. package/dist/react-sdk/application-runtime/host-properties/initialize.d.ts +7 -0
  431. package/dist/react-sdk/application-runtime/host-properties/initialize.js +1 -0
  432. package/dist/react-sdk/application-runtime/host-properties/selectors.d.ts +54 -0
  433. package/dist/react-sdk/application-runtime/host-properties/selectors.js +1 -0
  434. package/dist/react-sdk/application-runtime/host-properties/types.d.ts +18 -0
  435. package/dist/react-sdk/application-runtime/index.d.ts +3 -0
  436. package/dist/react-sdk/application-runtime/integration/initialize.d.ts +7 -6
  437. package/dist/react-sdk/application-runtime/integration/initialize.js +1 -1
  438. package/dist/react-sdk/application-runtime/integration/selectors.d.ts +11 -2
  439. package/dist/react-sdk/application-runtime/integration/selectors.js +1 -1
  440. package/dist/react-sdk/application-runtime/integration/types.d.ts +5 -2
  441. package/dist/react-sdk/application-runtime/loading/actions.d.ts +45 -0
  442. package/dist/react-sdk/application-runtime/loading/actions.js +1 -0
  443. package/dist/react-sdk/application-runtime/loading/index.d.ts +4 -0
  444. package/dist/react-sdk/application-runtime/loading/index.js +1 -0
  445. package/dist/react-sdk/application-runtime/loading/initialize.d.ts +3 -0
  446. package/dist/react-sdk/application-runtime/loading/initialize.js +1 -0
  447. package/dist/react-sdk/application-runtime/loading/selectors.d.ts +18 -0
  448. package/dist/react-sdk/application-runtime/loading/selectors.js +1 -0
  449. package/dist/react-sdk/application-runtime/loading/types.d.ts +59 -0
  450. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  451. package/dist/react-sdk/application-runtime/provider/ApplicationRuntime.d.ts +6 -0
  452. package/dist/react-sdk/application-runtime/provider/ApplicationRuntime.js +1 -1
  453. package/dist/react-sdk/application-runtime/provider/ApplicationType.d.ts +7 -0
  454. package/dist/react-sdk/application-runtime/provider/ApplicationType.js +1 -1
  455. package/dist/react-sdk/application-runtime/responsive/actions.d.ts +47 -0
  456. package/dist/react-sdk/application-runtime/responsive/actions.js +1 -0
  457. package/dist/react-sdk/application-runtime/responsive/index.d.ts +4 -0
  458. package/dist/react-sdk/application-runtime/responsive/index.js +1 -0
  459. package/dist/react-sdk/application-runtime/responsive/initialize.d.ts +3 -0
  460. package/dist/react-sdk/application-runtime/responsive/initialize.js +1 -0
  461. package/dist/react-sdk/application-runtime/responsive/selectors.d.ts +20 -0
  462. package/dist/react-sdk/application-runtime/responsive/selectors.js +1 -0
  463. package/dist/react-sdk/application-runtime/responsive/types.d.ts +104 -0
  464. package/dist/react-sdk/application-runtime/routing/routing-service.d.ts +34 -2
  465. package/dist/react-sdk/application-runtime/routing/routing-service.js +1 -1
  466. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +313 -10
  467. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  468. package/dist/react-sdk/domain-application-context/BackendDataProvider.js +1 -1
  469. package/dist/react-sdk/domain-application-context/FrontendDataProvider.js +1 -1
  470. package/dist/react-sdk/domain-application-context/PublishedDataProvider.js +1 -1
  471. package/dist/react-sdk/domain-context/common-hooks/index.d.ts +1 -0
  472. package/dist/react-sdk/domain-context/common-hooks/index.js +1 -1
  473. package/dist/react-sdk/domain-context/common-hooks/use-configuration-save-state.d.ts +23 -0
  474. package/dist/react-sdk/domain-context/common-hooks/use-configuration-save-state.js +1 -0
  475. package/dist/react-sdk/domain-context/common-hooks/use-domain-context.d.ts +1 -0
  476. package/dist/react-sdk/domain-context/index.d.ts +1 -0
  477. package/dist/react-sdk/domain-context/index.js +1 -1
  478. package/dist/react-sdk/domain-context/system-hooks/undo-redo-hooks.js +1 -1
  479. package/dist/react-sdk/elements/index.d.ts +0 -1
  480. package/dist/react-sdk/index.d.ts +1 -1
  481. package/dist/react-sdk/index.js +1 -1
  482. package/dist/react-sdk/loading-state/LoaderHost.d.ts +20 -0
  483. package/dist/react-sdk/loading-state/LoaderHost.js +1 -0
  484. package/dist/react-sdk/loading-state/built-in-loading-phase.d.ts +9 -0
  485. package/dist/react-sdk/loading-state/built-in-loading-phase.js +1 -0
  486. package/dist/react-sdk/loading-state/create-app-loader.d.ts +18 -0
  487. package/dist/react-sdk/loading-state/create-app-loader.js +1 -0
  488. package/dist/react-sdk/loading-state/index.d.ts +4 -2
  489. package/dist/react-sdk/loading-state/index.js +1 -1
  490. package/dist/react-sdk/loading-state/{LoadingStateProvider.d.ts → loading-state-hooks.d.ts} +3 -12
  491. package/dist/react-sdk/loading-state/loading-state-hooks.js +1 -0
  492. package/dist/react-sdk/page-elements/ConfigurationNotFoundPagePropsProvider.d.ts +17 -0
  493. package/dist/react-sdk/page-elements/ConfigurationNotFoundPagePropsProvider.js +1 -0
  494. package/dist/react-sdk/page-elements/ConfiguratorErrorPagePropsProvider.d.ts +17 -0
  495. package/dist/react-sdk/page-elements/ConfiguratorErrorPagePropsProvider.js +1 -0
  496. package/dist/react-sdk/page-elements/configurator-error-page-props.js +1 -0
  497. package/dist/{configurator/configuration-not-found-page → react-sdk/page-elements}/create-configuration-not-found-page.d.ts +7 -1
  498. package/dist/react-sdk/page-elements/create-configuration-not-found-page.js +1 -0
  499. package/dist/{configurator/configurator-error-page → react-sdk/page-elements}/create-configurator-error-page.d.ts +6 -1
  500. package/dist/react-sdk/page-elements/create-configurator-error-page.js +1 -0
  501. package/dist/react-sdk/page-elements/create-preset-ui.d.ts +9 -0
  502. package/dist/react-sdk/page-elements/create-preset-ui.js +1 -0
  503. package/dist/react-sdk/page-elements/index.d.ts +6 -0
  504. package/dist/react-sdk/page-elements/index.js +1 -0
  505. package/dist/react-sdk/session/SessionServiceProvider.js +1 -1
  506. package/dist/react-sdk/web-component/create-web-component.js +1 -1
  507. package/dist/react-sdk/web-component/god-mode/god-mode-registry.d.ts +30 -0
  508. package/dist/react-sdk/web-component/god-mode/god-mode-registry.js +1 -0
  509. package/dist/react-sdk/web-component/god-mode/index.d.ts +1 -0
  510. package/dist/react-sdk/web-component/god-mode/index.js +1 -0
  511. package/dist/ui-sdk/responsive-application/ResponsiveApplicationProvider.d.ts +2 -2
  512. package/dist/ui-sdk/responsive-application/responsive-state-store.d.ts +11 -9
  513. package/dist/ui-sdk/responsive-application/use-store-responsive-info.js +1 -1
  514. package/dist/ui-sdk/theme/types.d.ts +5 -1
  515. package/package.json +13 -3
  516. package/schema/domain-spec.json +140 -0
  517. package/dist/configurator/app-loader-content/app-loader-content-name.d.ts +0 -5
  518. package/dist/configurator/app-loader-content/app-loader-content-name.js +0 -1
  519. package/dist/configurator/configuration-not-found-page/create-configuration-not-found-page.js +0 -1
  520. package/dist/configurator/configurator-error-page/create-configurator-error-page.js +0 -1
  521. package/dist/configurator/ui/assistant/form/built-in-form-registry.d.ts +0 -10
  522. package/dist/configurator/ui/assistant/form/built-in-form-registry.js +0 -1
  523. package/dist/configurator/ui/assistant/form/form-registry.js +0 -8
  524. package/dist/domain/application/assistant/assistant-form-elements.js +0 -1
  525. package/dist/domain/application/assistant/get-assistant-form-value-attribute.d.ts +0 -6
  526. package/dist/domain/application/assistant/get-assistant-form-value-attribute.js +0 -1
  527. package/dist/domain/extensions/client-side-image.js +0 -1
  528. package/dist/domain/extensions/save-template-thumbnail.js +0 -1
  529. package/dist/phoenix/services/lingui.js +0 -1
  530. package/dist/react-sdk/application-runtime/runtime/god-mode.d.ts +0 -19
  531. package/dist/react-sdk/application-runtime/runtime/god-mode.js +0 -1
  532. package/dist/react-sdk/loading-state/LoadingStateProvider.js +0 -1
  533. package/dist/react-sdk/loading-state/loading-state-manager.d.ts +0 -37
  534. package/dist/react-sdk/loading-state/loading-state-manager.js +0 -1
  535. package/dist/react-sdk/responsive-state/ResponsiveStateProvider.d.ts +0 -25
  536. package/dist/react-sdk/responsive-state/ResponsiveStateProvider.js +0 -1
  537. package/dist/react-sdk/responsive-state/canvas-padding.d.ts +0 -14
  538. package/dist/react-sdk/responsive-state/index.d.ts +0 -5
  539. package/dist/react-sdk/responsive-state/index.js +0 -1
  540. package/dist/react-sdk/responsive-state/responsive-state-manager.d.ts +0 -111
  541. package/dist/react-sdk/responsive-state/responsive-state-manager.js +0 -1
  542. package/dist/react-sdk/responsive-state/use-responsive-state-manager.d.ts +0 -10
  543. package/dist/react-sdk/responsive-state/use-responsive-state-manager.js +0 -1
  544. package/dist/react-sdk/responsive-state/use-responsive-state.d.ts +0 -11
  545. package/dist/react-sdk/responsive-state/use-responsive-state.js +0 -1
  546. /package/dist/{application-spec/core → domain/spec/application}/application-instance.d.ts +0 -0
  547. /package/dist/{application-spec/core → domain/spec/application}/application-instance.js +0 -0
  548. /package/dist/{application-spec/core → domain/spec}/components/component-filter.js +0 -0
  549. /package/dist/{application-spec/core → domain/spec}/components/index.d.ts +0 -0
  550. /package/dist/{application-spec/core → domain/spec}/components/index.js +0 -0
  551. /package/dist/{application-spec/core → domain/spec}/components/sdk-code-ref.d.ts +0 -0
  552. /package/dist/{application-spec/core → domain/spec}/components/sdk-code-ref.js +0 -0
  553. /package/dist/{application-spec/core → domain/spec}/expressions/index.d.ts +0 -0
  554. /package/dist/{application-spec/core → domain/spec}/expressions/index.js +0 -0
  555. /package/dist/{application-spec/core → domain/spec}/expressions/relation-expression-params.d.ts +0 -0
  556. /package/dist/{application-spec/core → domain/spec}/expressions/relation-expression-params.js +0 -0
  557. /package/dist/{application-spec/core → domain/spec}/expressions/sdk-expression-implementation.d.ts +0 -0
  558. /package/dist/{application-spec/core → domain/spec}/expressions/sdk-expression-implementation.js +0 -0
  559. /package/dist/{application-spec/core → domain/spec}/markers/eval-marker.d.ts +0 -0
  560. /package/dist/{application-spec/core → domain/spec}/markers/eval-marker.js +0 -0
  561. /package/dist/{configurator/ui/assistant/form/form-element-definition.js → react-sdk/application-runtime/host-properties/types.js} +0 -0
  562. /package/dist/react-sdk/{elements/configurator-error-page-props.js → application-runtime/loading/types.js} +0 -0
  563. /package/dist/react-sdk/{responsive-state/canvas-padding.js → application-runtime/responsive/types.js} +0 -0
  564. /package/dist/react-sdk/{elements → page-elements}/configurator-error-page-props.d.ts +0 -0
@@ -1 +1 @@
1
- import{memoEval as e}from"#package/domain";import{createMessageDescriptor as t}from"../../../core/index.js";import{specCodeEvalIds as r}from"../../runtime-spec/index.js";import{resolveSpecCode as a}from"../spec-code/index.js";let n=(e,r)=>{if("literal"===e.kind)return e.value;if("slot"===e.kind)return r[e.depIndex];if("msg"===e.kind)return t(e.marker);if("array"===e.kind)return e.items.map(e=>n(e,r));let a={};for(let[t,l]of e.entries)a[t]=n(l,r);return a};export const generateMemoEvalPlanRuntime=(t,l,i)=>{if(0===t.deps.length){let e=n(t.template,[]);return()=>e}let o=r(t,l),s=t.deps.map((e,t)=>{let r=o[t];return"eval"===e.kind&&void 0!==r?a(i,r,e.code):void 0});return e(e=>t.deps.map((t,r)=>"eval"===t.kind?s[r](e):Reflect.get(e,t.target)),(...e)=>n(t.template,e))};export const evaluateStaticMemoEvalPlan=(e,t,l)=>{if(e.usesSelf)throw Error("Cannot evaluate a plan that uses self as a static value. Filter self-dependent plans before evaluating constants.");let i=r(e,t),o=e.deps.map((e,t)=>{if("read"===e.kind)throw Error(`Cannot evaluate the self-dependent read "${e.target}" as a static value. Filter self-dependent plans before evaluating constants.`);return a(l,i[t],e.code)()});return n(e.template,o)};
1
+ import{createMessageDescriptor as e,memoEval as t}from"#package/domain";import{specCodeEvalIds as a}from"../../runtime-spec/index.js";import{resolveSpecCode as r}from"../spec-code/index.js";let n=(t,a)=>{if("literal"===t.kind)return t.value;if("slot"===t.kind)return a[t.depIndex];if("msg"===t.kind)return e(t.marker);if("array"===t.kind)return t.items.map(e=>n(e,a));let r={};for(let[e,l]of t.entries)r[e]=n(l,a);return r};export const generateMemoEvalPlanRuntime=(e,l,i)=>{if(0===e.deps.length){let t=n(e.template,[]);return()=>t}let s=a(e,l),o=e.deps.map((e,t)=>{let a=s[t];return"eval"===e.kind&&void 0!==a?r(i,a,e.code):void 0});return t(t=>e.deps.map((e,a)=>"eval"===e.kind?o[a](t):Reflect.get(t,e.target)),(...t)=>n(e.template,t))};export const evaluateStaticMemoEvalPlan=(e,t,l)=>{if(e.usesSelf)throw Error("Cannot evaluate a plan that uses self as a static value. Filter self-dependent plans before evaluating constants.");let i=a(e,t),s=e.deps.map((e,t)=>{if("read"===e.kind)throw Error(`Cannot evaluate the self-dependent read "${e.target}" as a static value. Filter self-dependent plans before evaluating constants.`);return r(l,i[t],e.code)()});return n(e.template,s)};
@@ -1,4 +1,4 @@
1
- import type { SelfAccessor } from '../../../core/index.js';
1
+ import type { SelfAccessor } from '#package/domain';
2
2
  import type { SpecCodeId } from '../../runtime-spec/index.js';
3
3
  import type { SpecCodeMap } from './spec-code-module.js';
4
4
  /**
@@ -0,0 +1,21 @@
1
+ import { Branded } from '@salsita-ai/common/utils';
2
+ import type { RuntimeReferenceStore } from '../../caching/index.js';
3
+ import type { RuntimeSpec } from '../runtime-spec/index.js';
4
+ import { AdminSpecRuntime } from './admin-runtime/admin-spec-runtime.js';
5
+ import { ConfiguratorSpecRuntime } from './configurator-runtime/configurator-spec-runtime.js';
6
+ import type { SpecCodeModule } from './spec-code/index.js';
7
+ /**
8
+ * The sections of both domains that the spec alone determines, without a project module: each
9
+ * domain's model and the data of its `phx.domain` factories.
10
+ *
11
+ * An application is built in two steps in one reference store. This is the first: it runs before
12
+ * the project's modules load, because they call the `phx.domain` factories while they are evaluated.
13
+ * The second, `ApplicationRuntime` with the loaded modules, builds the same sections through the
14
+ * same functions, so it returns the same objects: `phx.domain.model.X` is the reflection the
15
+ * application's domain validates with.
16
+ */
17
+ export type SpecRuntime = Branded<'SpecRuntime', {
18
+ readonly configurator: ConfiguratorSpecRuntime;
19
+ readonly admin: AdminSpecRuntime;
20
+ }>;
21
+ export declare const SpecRuntime: (spec: RuntimeSpec, referenceStore: RuntimeReferenceStore, specCode: SpecCodeModule | undefined) => SpecRuntime;
@@ -0,0 +1 @@
1
+ import{Branded as i}from"@salsita-ai/common/utils";import{AdminSpecRuntime as r}from"./admin-runtime/admin-spec-runtime.js";import{ConfiguratorSpecRuntime as o}from"./configurator-runtime/configurator-spec-runtime.js";export const SpecRuntime=(m,t,n)=>i({configurator:o(m,t,n?.configurator),admin:r(m,t,n?.admin)});
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * The version of the JSON format `encodeRuntimeSpec` writes. Raise it with every change to the
3
- * format or to the shape of `RuntimeSpec`, so that `decodeRuntimeSpec` refuses an artifact an older
4
- * or newer SDK wrote instead of building a runtime from data it does not understand.
3
+ * format or to the shape of `RuntimeSpec` once a released SDK has written the current version, so
4
+ * that `decodeRuntimeSpec` refuses an artifact an older or newer SDK wrote instead of building a
5
+ * runtime from data it does not understand.
5
6
  */
6
7
  export declare const RUNTIME_SPEC_FORMAT_VERSION = 1;
7
8
  /** One step from a value into a part of it: an object key or an array index. */
@@ -1,4 +1,4 @@
1
- import type { AdminSpec, ApplicationSpec, ConfiguratorSpec, EntitySchema, Infra, ModelVersion, ResolvedModelVersion, ResolvedVersions } from '../../parse-application-files/index.js';
1
+ import type { AdminSpec, ApplicationSpec, AssistantSpec, ConfiguratorSpec, DataSchemaEntry, DataSchemas, DataSpec, EntitySchema, Infra, ModelVersion, ResolvedModelVersion, ResolvedVersions, Shape } from '../../parse-application-files/index.js';
2
2
  /**
3
3
  * The part of a parsed entity schema the runtime reads: the entity type and the schema of its
4
4
  * shape, from which it builds the entity's reflection. The full schema with `id` and `type` is
@@ -8,12 +8,22 @@ import type { AdminSpec, ApplicationSpec, ConfiguratorSpec, EntitySchema, Infra,
8
8
  export type RuntimeEntitySchema = Pick<EntitySchema, 'entityType' | 'shapeSchema'>;
9
9
  /**
10
10
  * The part of a parsed model version the runtime reads: the entity types, the aliases, the common
11
- * types and the schema of every entity's shape. The raw shapes and resolved shapes only serve the
12
- * parser and the type generator.
11
+ * types and the schema of every entity's shape. The shapes and the resolved shapes only serve the
12
+ * parser and the type generator, except the runtime schemas of the latest version's shapes (see
13
+ * `RuntimeLatestModelVersion`).
13
14
  */
14
15
  export type RuntimeModelVersion = Pick<ModelVersion, 'versionKey' | 'entityTypes' | 'rootEntityTypes' | 'aliases' | 'commonTypes'> & {
15
16
  readonly entitySchemas: readonly RuntimeEntitySchema[];
16
17
  };
18
+ /**
19
+ * The latest model version of a domain as the runtime reads it: a model version plus the runtime
20
+ * schema of every shape, which `phx.domain.model` reflects as `<Name>Shape`.
21
+ */
22
+ export type RuntimeLatestModelVersion = RuntimeModelVersion & {
23
+ readonly shapes: ReadonlyMap<Shape['name'], RuntimeShapeSchema>;
24
+ };
25
+ /** The part of a parsed shape the runtime reads: its name and its runtime JSON schema. */
26
+ export type RuntimeShapeSchema = Pick<Shape, 'name' | 'runtimeSchema'>;
17
27
  /** One model version of a domain as the runtime reads it, with the migration file that leads to it. */
18
28
  export type RuntimeResolvedModelVersion = Omit<ResolvedModelVersion, 'modelVersion'> & {
19
29
  readonly modelVersion: RuntimeModelVersion;
@@ -24,15 +34,39 @@ export type RuntimeResolvedVersions = Pick<ResolvedVersions, 'latestVersion'> &
24
34
  };
25
35
  /** The model of a domain as the runtime reads it: the latest version and every earlier one. */
26
36
  interface RuntimeDomainModel {
27
- readonly latestModel: RuntimeModelVersion;
37
+ readonly latestModel: RuntimeLatestModelVersion;
28
38
  readonly resolvedVersions: RuntimeResolvedVersions;
29
39
  }
40
+ /** The part of a parsed data schema the runtime reads: the JSON schema it validates the data with. */
41
+ export type RuntimeDataSchemaEntry = Pick<DataSchemaEntry, 'runtimeSchema'>;
42
+ /**
43
+ * The data schemas as the runtime reads them: the JSON schema of each kind of data and the hash of
44
+ * the published data. The enhanced schemas, with Phoenix references, only serve the type generator.
45
+ */
46
+ export type RuntimeDataSchemas = Pick<DataSchemas, 'publishedDataHash'> & {
47
+ readonly [KIND in Exclude<keyof DataSchemas, 'publishedDataHash' | 'backendData'>]: RuntimeDataSchemaEntry;
48
+ } & {
49
+ readonly backendData: RuntimeDataSchemaEntry | undefined;
50
+ };
51
+ /**
52
+ * The assistant as the runtime reads it: its resolved manifest. The parsed assistant schema the
53
+ * manifest is resolved from only serves the parser.
54
+ */
55
+ export type RuntimeAssistantSpec = Pick<NonNullable<AssistantSpec>, 'resolved'> | null;
56
+ /**
57
+ * The data spec as the runtime reads it: the data entries and their chunks. The data entries and
58
+ * admin data pages the parser derives from them only serve the admin spec and the type generator.
59
+ */
60
+ export type RuntimeDataSpec = Pick<DataSpec, 'entries' | 'chunks'>;
30
61
  /**
31
62
  * The configurator part of the runtime spec. It leaves out the configuration schema and its
32
63
  * version, which only a deployment registers, and the assistant's server settings (instructions
33
64
  * and AI settings), which must never reach the browser of a customer.
34
65
  */
35
- export type RuntimeConfiguratorSpec = Pick<ConfiguratorSpec, 'components' | 'presets' | 'expressions' | 'actions' | 'invariants' | 'dataSchemas' | 'defaults' | 'states' | 'theme' | 'ui' | 'transformers' | 'assistant'> & RuntimeDomainModel;
66
+ export type RuntimeConfiguratorSpec = Pick<ConfiguratorSpec, 'components' | 'presets' | 'expressions' | 'actions' | 'invariants' | 'defaults' | 'states' | 'theme' | 'ui' | 'transformers'> & RuntimeDomainModel & {
67
+ readonly dataSchemas: RuntimeDataSchemas;
68
+ readonly assistant: RuntimeAssistantSpec;
69
+ };
36
70
  /**
37
71
  * The admin part of the runtime spec. It leaves out the configuration schema and its version, which
38
72
  * only a deployment registers.
@@ -54,15 +88,16 @@ export type RuntimeInfra = Pick<Infra, 'acl' | 'resources' | 'resourcesConfig'>;
54
88
  * leaves out what only the parser, the type generator or a deployment use, and holds plain data,
55
89
  * Maps and Sets only, so it can be encoded as JSON.
56
90
  */
57
- export interface RuntimeSpec extends Pick<ApplicationSpec, 'appMetadata' | 'dataSpec'> {
91
+ export interface RuntimeSpec extends Pick<ApplicationSpec, 'appMetadata'> {
92
+ readonly dataSpec: RuntimeDataSpec;
58
93
  readonly configurator: RuntimeConfiguratorSpec;
59
94
  readonly admin: RuntimeAdminSpec;
60
95
  readonly infra: RuntimeInfra;
61
96
  }
62
97
  /**
63
- * Takes from a parsed application spec the part the runtime reads. The sections it keeps are the
64
- * parsed values themselves, not copies; only the model versions are rebuilt without what the
65
- * runtime does not read.
98
+ * Takes from a parsed application spec the part the runtime reads. It reuses the sections it keeps
99
+ * whole, and builds trimmed copies of the model versions, data schemas, assistant and data spec
100
+ * without what the runtime does not read.
66
101
  */
67
102
  export declare const toRuntimeSpec: (spec: ApplicationSpec) => RuntimeSpec;
68
103
  export {};
@@ -1 +1 @@
1
- let e=e=>({versionKey:e.versionKey,entityTypes:e.entityTypes,rootEntityTypes:e.rootEntityTypes,aliases:e.aliases,commonTypes:e.commonTypes,entitySchemas:e.entitySchemas.map(e=>({entityType:e.entityType,shapeSchema:e.shapeSchema}))}),s=s=>({latestModel:e(s.latestModel),resolvedVersions:{latestVersion:s.resolvedVersions.latestVersion,versionedModels:s.resolvedVersions.versionedModels.map(s=>({version:s.version,key:s.key,isLatest:s.isLatest,migrationFile:s.migrationFile,modelVersion:e(s.modelVersion)}))}});export const toRuntimeSpec=e=>{let{configurator:t,admin:a,infra:n}=e;return{configurator:{components:t.components,presets:t.presets,expressions:t.expressions,actions:t.actions,invariants:t.invariants,dataSchemas:t.dataSchemas,defaults:t.defaults,states:t.states,theme:t.theme,ui:t.ui,transformers:t.transformers,assistant:t.assistant,...s(t)},admin:{components:a.components,presets:a.presets,expressions:a.expressions,invariants:a.invariants,defaults:a.defaults,states:a.states,adminPages:a.adminPages,...s(a)},appMetadata:e.appMetadata,infra:{acl:n.acl,resources:n.resources,resourcesConfig:n.resourcesConfig},dataSpec:e.dataSpec}};
1
+ let e=e=>({versionKey:e.versionKey,entityTypes:e.entityTypes,rootEntityTypes:e.rootEntityTypes,aliases:e.aliases,commonTypes:e.commonTypes,entitySchemas:e.entitySchemas.map(e=>({entityType:e.entityType,shapeSchema:e.shapeSchema}))}),s=e=>({runtimeSchema:e.runtimeSchema}),a=s=>{let a;return{latestModel:{...e(a=s.latestModel),shapes:new Map([...a.shapes].map(([e,s])=>[e,{name:s.name,runtimeSchema:s.runtimeSchema}]))},resolvedVersions:{latestVersion:s.resolvedVersions.latestVersion,versionedModels:s.resolvedVersions.versionedModels.map(s=>({version:s.version,key:s.key,isLatest:s.isLatest,migrationFile:s.migrationFile,modelVersion:e(s.modelVersion)}))}}};export const toRuntimeSpec=e=>{let t,{configurator:n,admin:i,infra:r}=e;return{configurator:{components:n.components,presets:n.presets,expressions:n.expressions,actions:n.actions,invariants:n.invariants,dataSchemas:{publishedDataHash:(t=n.dataSchemas).publishedDataHash,publishedData:s(t.publishedData),sessionData:s(t.sessionData),frontendData:s(t.frontendData),backendData:t.backendData&&s(t.backendData),finalizeData:s(t.finalizeData),prefetchedFinalizeData:s(t.prefetchedFinalizeData),finalizeResult:s(t.finalizeResult),callbackData:s(t.callbackData)},defaults:n.defaults,states:n.states,theme:n.theme,ui:n.ui,transformers:n.transformers,assistant:n.assistant&&{resolved:n.assistant.resolved},...a(n)},admin:{components:i.components,presets:i.presets,expressions:i.expressions,invariants:i.invariants,defaults:i.defaults,states:i.states,adminPages:i.adminPages,...a(i)},appMetadata:e.appMetadata,infra:{acl:r.acl,resources:r.resources,resourcesConfig:r.resourcesConfig},dataSpec:{entries:e.dataSpec.entries,chunks:e.dataSpec.chunks}}};
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { type AssistantAiSettings } from '@salsita-ai/contracts/assistant';
3
- import { ASSISTANT_HINTS } from '#package/domain';
3
+ import { ASSISTANT_HINTS, type AssistantFormAttribute, type AssistantFormRole } from '#package/domain';
4
4
  /**
5
5
  * One whitelisted field in the assistant manifest. `description` overrides the JSON Schema
6
6
  * description of the shape property; `as` exposes the field under a different GraphQL name; `lenses`
@@ -12,6 +12,21 @@ export interface RawAssistantField {
12
12
  readonly as?: string;
13
13
  readonly lenses?: readonly string[];
14
14
  }
15
+ /**
16
+ * One of the project's own elements of an assistant form, keyed under `assistant.formElements` by
17
+ * its tag, and implemented by the component a file in `src/elements/` registers under the same name
18
+ * with `phx.frontend.createAssistantFormElement`. `role` decides the props the component gets, how
19
+ * the form collects it into the answer and where the prompt lists it, with `description` after its
20
+ * signature. `attributes` are flat scalars beside the built-in `label`, each a JSON Schema of the
21
+ * keywords `AssistantFormAttribute` allows, and `required` names those the model must write. An
22
+ * option or an input that takes a `value` declares it like any other attribute.
23
+ */
24
+ export interface RawAssistantFormElement {
25
+ readonly description: string;
26
+ readonly role: AssistantFormRole;
27
+ readonly attributes?: Readonly<Record<string, AssistantFormAttribute>>;
28
+ readonly required?: readonly string[];
29
+ }
15
30
  /**
16
31
  * One lens of the assistant `lenses` map, keyed by the name the agent spreads it by: a named
17
32
  * selection made of the `entities` entries tagged with that name. `description` tells the agent when
@@ -90,6 +105,16 @@ export interface RawAssistantAction {
90
105
  readonly description?: string;
91
106
  readonly as?: string;
92
107
  }
108
+ /**
109
+ * One view of the assistant `screenshots` map, keyed by the instance name of an `agentScreenshot`
110
+ * component: it lets the agent take a screenshot of the entity from that view under `meta`.
111
+ * `description` tells the agent what the view shows; `as` is the name the agent asks for the view
112
+ * by, the instance name by default.
113
+ */
114
+ export interface RawAssistantScreenshot {
115
+ readonly description: string;
116
+ readonly as?: string;
117
+ }
93
118
  /**
94
119
  * Experimental assistant manifest authored under the `assistant` root key. `entities` whitelists the
95
120
  * stored fields the generated GraphQL schema exposes, keyed by entity type or alias name and then by
@@ -100,8 +125,11 @@ export interface RawAssistantAction {
100
125
  * entity type or alias, the `childEntityRecipes` groups whose recipes the agent may list and add
101
126
  * with `addChild`. `replaceRecipes` names, per entity type or alias, the `replaceEntityRecipes`
102
127
  * groups whose recipes the agent may list and replace the entity by with `replaceEntity`. `actions`
103
- * names the declared actions the agent may run as custom mutations. Nothing is exposed without an
104
- * entry. `lenses` declares the named selections that `entities` entries are tagged with.
128
+ * names the declared actions the agent may run as custom mutations. `screenshots` names, per entity
129
+ * type or alias, the `agentScreenshot` views the agent may take a screenshot of the entity from.
130
+ * Nothing is exposed without an entry. `lenses` declares the named selections that `entities`
131
+ * entries are tagged with, and `formElements` the project's own elements of the forms the agent
132
+ * asks the user with.
105
133
  *
106
134
  * `ai` and `instructions` are for the server only: the provider, model tier and reasoning level the
107
135
  * deployment's assistant runs with, and the integrator's own guidance for it, appended to the system
@@ -114,7 +142,9 @@ export interface RawAssistant {
114
142
  readonly childRecipes?: Readonly<Record<string, RawAssistantRecipes>>;
115
143
  readonly replaceRecipes?: Readonly<Record<string, RawAssistantRecipes>>;
116
144
  readonly actions?: Readonly<Record<string, RawAssistantAction | null>>;
145
+ readonly screenshots?: Readonly<Record<string, Readonly<Record<string, RawAssistantScreenshot>>>>;
117
146
  readonly lenses?: Readonly<Record<string, RawAssistantLens>>;
147
+ readonly formElements?: Readonly<Record<string, RawAssistantFormElement>>;
118
148
  readonly instructions?: string;
119
149
  readonly ai: AssistantAiSettings;
120
150
  }
@@ -1 +1 @@
1
- import{z as e}from"zod";import{ASSISTANT_AI_PROVIDERS as t,ASSISTANT_MODEL_TIERS as o,ASSISTANT_REASONING_LEVELS as i}from"@salsita-ai/contracts/assistant";import{ASSISTANT_HINTS as n}from"#package/domain";export const ASSISTANT_OPTION_COMPONENT_TYPES=["materialSwatch","attributeSelection","distanceDimensionSelect"];let r=e.string().regex(/^(?!__)[_A-Za-z][_0-9A-Za-z]*$/,'must be a GraphQL name: letters, digits and "_", not starting with a digit or "__"'),s=t=>e.enum(t,{errorMap:()=>({message:`must be one of: ${t.join(", ")}`})}),a=e.object({description:e.string().optional(),as:r.optional(),lenses:e.array(e.string()).optional()}).strict(),l="must be a whole number of at least 1; remove the key to nest tagged relations one level",c=e.object({description:e.string().trim().min(1,"must not be empty; say when the agent should use the lens"),maxDepth:e.number({invalid_type_error:l}).int(l).min(1,l).optional()}).strict(),p=r.refine(e=>!e.includes("__"),'must not contain "__", which names the generated copies of a lens'),m=e.array(s(n)),d=e.object({options:e.object({componentType:s(ASSISTANT_OPTION_COMPONENT_TYPES),instanceName:e.string().min(1,"must not be empty; name the component instance that holds the choices"),as:r.optional(),validate:e.boolean().optional(),allowDryRuns:e.boolean().optional(),hints:m.optional()}).strict().optional()}).strict(),u=e.object({as:e.string().trim().min(1,"must not be empty; remove the key to use the instance name").optional(),description:e.string().optional(),allowDryRuns:e.boolean().optional()}).strict(),h=t=>e.object({hints:m.optional(),groups:e.record(e.string(),u.nullable(),{required_error:`is required: the recipe groups of the type go under "groups", keyed by the instance name of a "${t}" component`})}).strict(),b=e.object({description:e.string().optional(),as:r.optional()}).strict(),g=`is required: declare provider (${t.join(", ")}), model (${o.join(", ")}) and reasoning (${i.join(", ")})`,_="must be a positive whole number of input tokens; remove the key to use the default of the server",y=e.object({provider:s(t),model:s(o),reasoning:s(i),maxThreadSize:e.number({invalid_type_error:_}).int(_).positive(_).optional()},{required_error:g,invalid_type_error:g}).strict();export const rawAssistantSchema=e.object({entities:e.record(e.string(),e.record(e.string(),a.nullable())).optional(),deletable:e.record(e.string(),e.object({}).strict().nullable()).optional(),writable:e.record(e.string(),e.record(e.string(),d.nullable())).optional(),childRecipes:e.record(e.string(),h("childEntityRecipes")).optional(),replaceRecipes:e.record(e.string(),h("replaceEntityRecipes")).optional(),actions:e.record(e.string(),b.nullable()).optional(),lenses:e.record(p,c).optional(),instructions:e.string().trim().min(1,"must not be empty; remove the key when there are no instructions").optional(),ai:y}).strict();
1
+ import{z as e}from"zod";import{ASSISTANT_AI_PROVIDERS as t,ASSISTANT_MODEL_TIERS as n,ASSISTANT_REASONING_LEVELS as o}from"@salsita-ai/contracts/assistant";import{ASSISTANT_FORM_NAME_PATTERN as i,ASSISTANT_HINTS as r}from"#package/domain";export const ASSISTANT_OPTION_COMPONENT_TYPES=["materialSwatch","attributeSelection","distanceDimensionSelect"];let s=e.string().regex(/^(?!__)[_A-Za-z][_0-9A-Za-z]*$/,'must be a GraphQL name: letters, digits and "_", not starting with a digit or "__"'),a=t=>e.enum(t,{errorMap:()=>({message:`must be one of: ${t.join(", ")}`})}),m=e.object({description:e.string().optional(),as:s.optional(),lenses:e.array(e.string()).optional()}).strict(),l="must be a whole number of at least 1; remove the key to nest tagged relations one level",p=e.object({description:e.string().trim().min(1,"must not be empty; say when the agent should use the lens"),maxDepth:e.number({invalid_type_error:l}).int(l).min(1,l).optional()}).strict(),c=s.refine(e=>!e.includes("__"),'must not contain "__", which names the generated copies of a lens'),u=e.array(a(r)),d=e.object({options:e.object({componentType:a(ASSISTANT_OPTION_COMPONENT_TYPES),instanceName:e.string().min(1,"must not be empty; name the component instance that holds the choices"),as:s.optional(),validate:e.boolean().optional(),allowDryRuns:e.boolean().optional(),hints:u.optional()}).strict().optional()}).strict(),g=e.object({as:e.string().trim().min(1,"must not be empty; remove the key to use the instance name").optional(),description:e.string().optional(),allowDryRuns:e.boolean().optional()}).strict(),h=t=>e.object({hints:u.optional(),groups:e.record(e.string(),g.nullable(),{required_error:`is required: the recipe groups of the type go under "groups", keyed by the instance name of a "${t}" component`})}).strict(),b=e.object({description:e.string().optional(),as:s.optional()}).strict(),y=["enum","pattern","minimum","maximum","minLength","maxLength"],f=["enum","pattern","minLength","maxLength"],_=["enum","minimum","maximum"],v=e.object({type:a(["string","number","integer","boolean"]),enum:e.array(e.union([e.string(),e.number()])).min(1,"must list at least one value").optional(),pattern:e.string().refine(e=>{try{return RegExp(e,"u"),!0}catch{return!1}},"must be a regular expression, as in JSON Schema").optional(),minimum:e.number().optional(),maximum:e.number().optional(),minLength:e.number().int().nonnegative().optional(),maxLength:e.number().int().nonnegative().optional()}).strict().superRefine((t,n)=>{let o="string"===t.type?f:"boolean"===t.type?[]:_;for(let i of y)void 0===t[i]||o.includes(i)||n.addIssue({code:e.ZodIssueCode.custom,path:[i],message:`does not apply to an attribute of type "${t.type}"; remove it or change the type`});let i="string"===t.type?"string":"number";for(let[o,r]of("boolean"!==t.type&&t.enum?.some(e=>typeof e!==i||"integer"===t.type&&!Number.isInteger(e))&&n.addIssue({code:e.ZodIssueCode.custom,path:["enum"],message:`must list only ${"integer"===t.type?"whole number":i}s, since the attribute is of type "${t.type}"`}),[["minimum","maximum"],["minLength","maxLength"]])){let[i,s]=[t[o],t[r]];void 0!==i&&void 0!==s&&i>s&&n.addIssue({code:e.ZodIssueCode.custom,path:[o],message:`must not be greater than "${r}", or no value could satisfy the attribute`})}}),w=e.string().regex(i,'must start with a lowercase letter and hold only lowercase letters, digits and "-", since the panel reads form markup in lowercase'),j=e.object({description:e.string().trim().min(1,"must not be empty; say what the element is for and where the agent may use it"),role:a(["group","choice","choices","option","input"]),attributes:e.record(w,v).optional(),required:e.array(e.string()).optional()}).strict(),x=e.object({description:e.string().trim().min(1,"must not be empty; say what the view shows"),as:s.optional()}).strict(),S=`is required: declare provider (${t.join(", ")}), model (${n.join(", ")}) and reasoning (${o.join(", ")})`,T="must be a positive whole number of input tokens; remove the key to use the default of the server",I=e.object({provider:a(t),model:a(n),reasoning:a(o),maxThreadSize:e.number({invalid_type_error:T}).int(T).positive(T).optional()},{required_error:S,invalid_type_error:S}).strict();export const rawAssistantSchema=e.object({entities:e.record(e.string(),e.record(e.string(),m.nullable())).optional(),deletable:e.record(e.string(),e.object({}).strict().nullable()).optional(),writable:e.record(e.string(),e.record(e.string(),d.nullable())).optional(),childRecipes:e.record(e.string(),h("childEntityRecipes")).optional(),replaceRecipes:e.record(e.string(),h("replaceEntityRecipes")).optional(),actions:e.record(e.string(),b.nullable()).optional(),screenshots:e.record(e.string(),e.record(e.string(),x)).optional(),lenses:e.record(c,p).optional(),formElements:e.record(w,j).optional(),instructions:e.string().trim().min(1,"must not be empty; remove the key when there are no instructions").optional(),ai:I}).strict();
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
+ import { type EnhancedJsonValue } from '#package/domain';
2
3
  import { type EnhancedJsonSchemaType } from '../../core/enhanced-json-schema.js';
3
- import { type EnhancedJsonValue } from '../../core/enhanced-json-value.js';
4
4
  /**
5
5
  * Discriminator tag for a single parsed expression entry.
6
6
  *
@@ -1 +1 @@
1
- import{z as r}from"zod";import{enhancedJsonSchema as e,extendEnhancedJsonSchema as s}from"../../core/enhanced-json-schema.js";import{EVAL_MARKER_KEY as n,evalMarkerSchema as o}from"../../core/markers/eval-marker.js";import{MSG_ID_MARKER_KEY as a,MSG_MARKER_KEY as t,msgMarkerSchema as i}from"../../core/markers/msg-marker.js";export const RawExpressionKind={User:"user",Value:"value"};let m=s(o),c=s(i),d=[n,t,a],l=r=>{let e={};for(let[s,n]of Object.entries(r))d.includes(s)||(e[s]=n);return e};export const rawExpressionEntrySchema=r.union([m,c,e]).transform(r=>{if(n in r)return{kind:RawExpressionKind.Value,constant:!1,value:{[n]:r.$eval},schema:l(r)};if(t in r){let e=void 0!==r.$msgId?{[t]:r.$msg,[a]:r.$msgId}:{[t]:r.$msg};return{kind:RawExpressionKind.Value,constant:!1,value:e,schema:l(r)}}return{kind:RawExpressionKind.User,schema:r}});export const rawExpressionsSchema=r.record(r.string(),r.record(r.string(),rawExpressionEntrySchema).readonly()).readonly();
1
+ import{z as e}from"zod";import{EVAL_MARKER_KEY as r,MSG_ID_MARKER_KEY as n,MSG_MARKER_KEY as s,evalMarkerSchema as o,msgMarkerSchema as a}from"#package/domain";import{enhancedJsonSchema as i,extendEnhancedJsonSchema as t}from"../../core/enhanced-json-schema.js";export const RawExpressionKind={User:"user",Value:"value"};let c=t(o),m=t(a),d=[r,s,n],p=e=>{let r={};for(let[n,s]of Object.entries(e))d.includes(n)||(r[n]=s);return r};export const rawExpressionEntrySchema=e.union([c,m,i]).transform(e=>{if(r in e)return{kind:RawExpressionKind.Value,constant:!1,value:{[r]:e.$eval},schema:p(e)};if(s in e){let r=void 0!==e.$msgId?{[s]:e.$msg,[n]:e.$msgId}:{[s]:e.$msg};return{kind:RawExpressionKind.Value,constant:!1,value:r,schema:p(e)}}return{kind:RawExpressionKind.User,schema:e}});export const rawExpressionsSchema=e.record(e.string(),e.record(e.string(),rawExpressionEntrySchema).readonly()).readonly();
@@ -0,0 +1,9 @@
1
+ import { type AssistantFormElementDescriptor } from '#package/domain';
2
+ import type { ParseContext } from '../../../../core/index.js';
3
+ import type { RawAssistantFormElement } from '../../../raw-spec/index.js';
4
+ /**
5
+ * Checks the project's own form elements and turns them into the descriptors the built-ins use, in
6
+ * YAML order. Whether each has an implementation is not known here, since module analysis does not
7
+ * see the name a file registers; the application checks that pairing when it starts.
8
+ */
9
+ export declare const resolveFormElements: (formElements: Readonly<Record<string, RawAssistantFormElement>>, ctx: ParseContext) => readonly AssistantFormElementDescriptor[];
@@ -0,0 +1 @@
1
+ import{ASSISTANT_BUILT_IN_FORM_ELEMENTS as e,isHtmlElementName as r}from"#package/domain";import{DiagnosticCode as E,diagnosticMessages as _}from"../../../../errors/index.js";let T=e.map(({name:e})=>e),t=new Set(["label"]);export const resolveFormElements=(e,N)=>Object.entries(e).map(([e,S])=>{let A=N.at(e);return T.includes(e)?A.error(E.ASSISTANT_FORM_ELEMENT_BUILT_IN_NAME,_.ASSISTANT_FORM_ELEMENT_BUILT_IN_NAME(e,T)):r(e)&&A.error(E.ASSISTANT_FORM_ELEMENT_HTML_NAME,_.ASSISTANT_FORM_ELEMENT_HTML_NAME(e)),((e,{attributes:r={},required:T=[]},N)=>{let S=Object.keys(r);for(let r of S)t.has(r)&&N.at("attributes",r).error(E.ASSISTANT_FORM_ATTRIBUTE_RESERVED_NAME,_.ASSISTANT_FORM_ATTRIBUTE_RESERVED_NAME(e,r));for(let t of T)Object.hasOwn(r,t)||N.at("required").error(E.ASSISTANT_FORM_ELEMENT_UNKNOWN_REQUIRED,_.ASSISTANT_FORM_ELEMENT_UNKNOWN_REQUIRED(e,t,S))})(e,S,A),{name:e,role:S.role,description:S.description,attributes:S.attributes??{},...void 0===S.required?{}:{required:S.required}}});
@@ -29,7 +29,10 @@ export type AssistantSchema = Required<AssistantManifest> & {
29
29
  /** What the assistant schema is built from, besides the manifest. */
30
30
  export interface AssistantSchemaInput {
31
31
  readonly model: ModelVersion;
32
- readonly states: AssistantStates;
32
+ /** The declared UI states; the export states only check the screenshot views, the schema never shows them. */
33
+ readonly states: AssistantStates & {
34
+ readonly exportStates: readonly string[];
35
+ };
33
36
  /** Resolves `phx:` refs, so a field's nullability is read through phoenix definitions. */
34
37
  readonly phxDefinitions: PhoenixDefinitions;
35
38
  /** The parsed expressions, which `$` manifest entries whitelist by their declared schema. */
@@ -1 +1 @@
1
- import{isArray as e}from"@salsita-ai/common/utils";import{ASSISTANT_HINTS as t,AssistantFieldClashError as i,buildAssistantManifest as r,describeAssistantValues as n,mergeAssistantFields as s,resolveAssistantField as o}from"#package/domain";import{DiagnosticCode as a,diagnosticMessages as l}from"../../../../errors/index.js";import{createSchemaRefResolver as S,isNullableSchema as p,phxDefinitionRefName as N}from"../../common/index.js";import{resolveAssistantFieldType as T}from"./assistant-field-type.js";let c="AnyDomainEntity",d="RecipeGroup",f="Recipe",A="DryRun",E="FieldOption",m={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},_={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},u=new Set(["id","type","meta"]),O=new Set(["Query","Mutation","Navigation",d,f,A,"DryRunError",E,"JSON","String","Int","Float","Boolean","ID"]),I=new Set([d,f,E,A]),y=new Set(["id","type"]),b="A string, a message descriptor or a multilingual object; passed without translation.",h=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],g=(e,{property:t,writableKey:i},r,{resolveRef:s,exposed:o,sources:S},p)=>{let N=Object.entries(h(S,e)??{}),c=o.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===c?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void p.at(i,t).error(a.ASSISTANT_FIELD_NAME_CONFLICT,l.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${i}.${t}`));let{type:f,enumValues:A,localized:E,description:m}=T(r,s),_={...f,nonNull:!1},u=c??t,O=void 0===c?n(m,A):void 0;return E?{name:u,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:O?`${O} ${b}`:b}:{name:u,property:t,type:_,...void 0===O?{}:{description:O}}},v=(e,t,{model:i,components:r})=>{let n=new Set([e,...[...i.aliases].filter(([,t])=>t.includes(e)).map(([e])=>e)]);return r.filter(({componentName:e,typeOrAlias:i})=>e===t&&n.has(i)).map(({instanceName:e})=>String(e))},R=(...e)=>t.filter(t=>e.some(e=>e?.includes(t))),j=(e,t,i,r)=>{let{model:n}=i,s=new Map,o=new Map;for(let[S,{groups:p,hints:N}]of Object.entries(e)){let e=n.entityTypes.find(e=>e===S),T=e?[e]:[...n.aliases].find(([e])=>e===S)?.[1];if(!T){r.at(S).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE(t.section,S));continue}for(let[e,n]of(T.forEach(e=>o.set(e,R(o.get(e),N))),Object.entries(p))){let o=r.at(S,"groups",e),p=`${S}.groups.${e}`,N={groupId:n?.as??e,instanceName:e,...n?.description===void 0?{}:{description:n.description},dryRuns:n?.allowDryRuns??!0};for(let r of T){let n=v(r,t.component,i),T=s.get(r)??[],c=T.find(e=>e.group.groupId===N.groupId);n.includes(e)?c?o.error(a.ASSISTANT_DUPLICATE_RECIPE_GROUP,l.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,r,N.groupId,[c.entry,p])):s.set(r,[...T,{group:N,entry:p,entryCtx:o}]):o.error(a.ASSISTANT_UNKNOWN_RECIPE_GROUP,l.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,S,e,r,n))}}}let S=n.entityTypes.flatMap(e=>{let t=s.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(S.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:o,metaEntries:new Map(S.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},M=e=>`${e}Meta`,D=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,C=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},P=(e,t)=>{let{type:i,enumValues:r,localized:s,description:o}=T(e,t),a={...i,nonNull:!1},l=s?`${n(o,r)??""} ${b}`.trim():n(o,r);return{type:{...s?{kind:"scalar",name:"JSON",nonNull:!1}:a,nonNull:i.nonNull},...void 0===l?{}:{description:l}}},L=(t,i)=>{let r=(t=>{let i=C(t),r=i?.type==="array"&&i.items&&!e(i.items)?C(i.items):void 0,n=r??i;if(n?.$ref!==void 0&&"$DomainEntity"===N(n.$ref))return{target:n.references??c,list:void 0!==r}})(t);if(r)return{kind:"edge",...r,nullable:p(t,i),...void 0===t.description?{}:{description:t.description}};let{type:s,enumValues:o,localized:a,description:l}=T(t,i),S=n(l,o);return a?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:s.nonNull},description:`${l??""} ${b}`.trim()}:{kind:"value",type:s,...void 0===S?{}:{description:S}}},U=(e,t)=>{let{type:i,enumValues:r,localized:n,description:s}=T(e,t);return{type:{kind:"value",type:i},localized:!0===n,description:s,enumValues:r}},w=(e,t,i,r,s)=>{let o=t.startsWith("$")?((e,t,i,r)=>{let n=((e,t,{expressions:i,entityTypes:r})=>{let n=r.find(t=>t===e);for(let r of void 0===n?[e]:i.entityExpressions.get(n)?.shapeGroups??[]){let e=[...i.expressions.get(r)?.values()??[]].find(e=>e.name===t);if(e?.declaredSchema)return{implementation:e.implementation,declaredSchema:e.declaredSchema}}})(e.name,t,i);if(!n)return void r.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:s}=n;if("violations"===s.kind)return void r.error(a.ASSISTANT_UNSUPPORTED_EXPRESSION,l.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===s.kind){let[{target:e,cardinality:t}]=s.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return U(n.declaredSchema,i.resolveRef)})(e,t,r,s):((e,t,{resolveRef:i},r)=>{let n=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return n?U(n,i):void r.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,r,s);if(!o)return;let S=i?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return u.has(S)?void s.error(a.ASSISTANT_RESERVED_FIELD_NAME,l.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,S)):{name:S,source:t,type:o.type,localized:o.localized,description:n(i?.description??o.description,o.enumValues),describedByManifest:i?.description!==void 0,enumValues:o.enumValues,valueDescription:i?.description??o.description,...i?.lenses?.length?{lenses:[...new Set(i.lenses)]}:{}}},$=(e,t,i,r,n)=>s(t,i,r,(t,i,r)=>{n.error(a.ASSISTANT_FIELD_NAME_CONFLICT,l.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[i,r]))});export const resolveAssistantManifest=(e,{model:t,states:i,phxDefinitions:r,expressions:n,components:s,actions:p},N)=>{let d=N.errors.length,f=N.at("entities"),A=S(t.commonTypes,r);for(let e of t.resolvedShapes.keys())O.has(e)&&N.error(a.ASSISTANT_RESERVED_TYPE_NAME,l.ASSISTANT_RESERVED_TYPE_NAME(e,[...O]));let E=((e,t,i)=>{let r=new Map;for(let n of e){let e=[];for(let[r,s]of Object.entries(n.entries)){let o=w(n,r,s,t,i.at(n.name,r));o&&e.push(o)}r.set(n.name,e)}return r})(((e,t,i)=>{let r=[];for(let[i,n]of t.resolvedShapes){let t=e[i];t&&r.push({name:i,shape:n,entries:t})}let n=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))n.has(t)||i.at(t).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("entities",t));return r})(e.entities??{},t,f),{resolveRef:A,expressions:n,entityTypes:t.entityTypes},f),u=$(c,[],E.get(c)??[],()=>void 0,N),C=new Map([[c,u]]);for(let e of t.aliases.keys())e!==c&&C.set(e,$(e,[u],E.get(e)??[],()=>void 0,N));for(let e of t.entityTypes){let i=[c,...[...t.aliases].filter(([t,i])=>t!==c&&i.includes(e)).map(([e])=>e)],r=[...t.resolvedShapes].find(([t])=>t===e)?.[1];C.set(e,$(e,i.map(e=>C.get(e)??[]),E.get(e)??[],e=>{let t=Object.entries(r?.properties??{}).find(([t])=>t===e)?.[1];return t&&T(t,A).enumValues},N))}let U=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((C.get(e)??[]).map(({name:e,source:t,localized:i})=>[e,i?{source:t,localized:!0}:{source:t}]))])),F=j(e.childRecipes??{},m,{model:t,components:s},N.at("childRecipes")),W=j(e.replaceRecipes??{},_,{model:t,components:s},N.at("replaceRecipes")),k=((e,t,i)=>{let r=new Set;for(let n of Object.keys(e)){let e=t.entityTypes.find(e=>e===n),s=e?[e]:[...t.aliases].find(([e])=>e===n)?.[1];s?s.forEach(e=>r.add(e)):i.at(n).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("deletable",n))}return t.entityTypes.filter(e=>r.has(e))})(e.deletable??{},t,N.at("deletable")),K=((e,t,i)=>{let{model:r}=t,n=((e,t,i)=>{let r=new Map;for(let[n,s]of Object.entries(e)){let e=t.entityTypes.find(e=>e===n),o=e?[e]:[...t.aliases].find(([e])=>e===n)?.[1],S=[...t.resolvedShapes].find(([e])=>e===n)?.[1];if(!o||!S){i.at(n).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("writable",n));continue}for(let e of Object.keys(s)){let t=i.at(n,e);e.startsWith("$")||y.has(e)?t.error(a.ASSISTANT_NOT_WRITABLE,l.ASSISTANT_NOT_WRITABLE(n,e)):h(S.properties,e)?o.forEach(t=>{let i=r.get(t)??new Map;r.set(t,i.has(e)?i:i.set(e,n))}):t.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("writable",n,e))}}return r})(e,r,i);return r.entityTypes.flatMap(e=>{let s=[...r.resolvedShapes].find(([t])=>t===e)?.[1],o=[...n.get(e)??[]].flatMap(([r,n])=>{let o=s&&h(s.properties,r);return(o&&g(e,{property:r,writableKey:n},o,t,i))??[]});return o.length>0?[{entityType:e,fields:o}]:[]})})(e.writable??{},{model:t,resolveRef:A,exposed:E,sources:U},N.at("writable")),V=((e,t,i,r)=>{let{model:n}=i,s=new Map;for(let[o,S]of Object.entries(e)){let e=n.entityTypes.find(e=>e===o),p=e?[e]:[...n.aliases].find(([e])=>e===o)?.[1]??[];for(let[e,n]of Object.entries(S)){let S=n?.options;if(!S)continue;let N=r.at(o,e,"options"),T=`${o}.${e}`;for(let r of p){let n=t.find(e=>e.entityType===r)?.fields.find(t=>t.property===e);if(!n)continue;let o=S.as??`${n.name}Options`,p=v(r,S.componentType,i),c=s.get(r)??[],d=c.find(e=>e.options.edgeName===o||e.options.field===n.name);if(p.includes(S.instanceName))if(o===m.section||o===_.section)N.error(a.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,l.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(T,o,n.name));else if(d)N.error(a.ASSISTANT_DUPLICATE_OPTIONS_EDGE,l.ASSISTANT_DUPLICATE_OPTIONS_EDGE(r,d.options.edgeName===o?{edgeName:o}:{field:n.name},[d.entry,T]));else{let e={field:n.name,edgeName:o,componentType:S.componentType,instanceName:S.instanceName,validate:S.validate??!0,dryRuns:S.allowDryRuns??!0};s.set(r,[...c,{options:e,hints:R(S.hints),entry:T,entryCtx:N}])}else N.error(a.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,l.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(T,S,r,p))}}}return s})(e.writable??{},K,{model:t,components:s},N.at("writable"));var Y=[F.metaEntries,W.metaEntries,new Map([...V].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[]))];for(let e of t.entityTypes){let i=Y.flatMap(t=>t.get(e)??[])[0],r=M(e);i&&[...t.resolvedShapes.keys()].some(e=>e===r)&&i.error(a.ASSISTANT_META_TYPE_NAME_CONFLICT,l.ASSISTANT_META_TYPE_NAME_CONFLICT(e,r))}let x=t.entityTypes.filter(e=>(F.groups[e]?.length??0)>0||(W.groups[e]?.length??0)>0||(V.get(e)?.length??0)>0).map(M),G=((e,{actions:t,resolveRef:i,builtInMutations:r,typeNames:n},s)=>{let o=[],S=[...t.values()].map(e=>String(e.name));for(let[p,N]of Object.entries(e)){let e=s.at(p),T=[...t.values()].find(e=>e.name===p);if(!T){e.error(a.ASSISTANT_UNKNOWN_ACTION,l.ASSISTANT_UNKNOWN_ACTION(p,S));continue}let c=N?.as??p,d=o.find(e=>e.fieldName===c),f=D(c);if(r.has(c)||d){e.error(a.ASSISTANT_MUTATION_NAME_CONFLICT,l.ASSISTANT_MUTATION_NAME_CONFLICT(p,c,d?`"assistant.actions.${d.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(n.has(f)||o.some(e=>D(e.fieldName)===f)){e.error(a.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,l.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(p,c,f));continue}let A=N?.description??T.description;o.push({fieldName:c,actionName:p,...void 0===A?{}:{description:A},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,P(t,i)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,L(t,i)]))})}return o})(e.actions??{},{actions:p,resolveRef:A,builtInMutations:new Set(["deleteEntity",m.mutation,_.mutation,...K.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...O,...t.resolvedShapes.keys(),...x])},N.at("actions")),z=((e,t)=>{let i=e.lenses??{},r=new Set;for(let[n,s]of Object.entries(e.entities??{}))for(let[e,o]of Object.entries(s))for(let s of o?.lenses??[])Object.hasOwn(i,s)?r.add(s):t.at("entities",n,e,"lenses").error(a.ASSISTANT_UNKNOWN_LENS,l.ASSISTANT_UNKNOWN_LENS(`${n}.${e}`,s,Object.keys(i)));for(let e of Object.keys(i))I.has(e)?t.at("lenses",e).error(a.ASSISTANT_RESERVED_LENS_NAME,l.ASSISTANT_RESERVED_LENS_NAME(e,[...I])):r.has(e)||t.at("lenses",e).error(a.ASSISTANT_EMPTY_LENS,l.ASSISTANT_EMPTY_LENS(e));return Object.fromEntries(Object.entries(i).map(([e,{description:t,maxDepth:i}])=>[e,{description:t,maxDepth:i??1}]))})(e,N);if(N.errors.length>d)return;let B=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,{hints:R(t.hints),groups:Object.entries(t.groups).map(([e,t])=>({instanceName:e,groupId:t?.as??e,...t?.description===void 0?{}:{description:t.description},dryRuns:t?.allowDryRuns??!0}))}]));return{declarations:{entities:Object.fromEntries(Object.keys(e.entities??{}).map(e=>[e,(E.get(e)??[]).map(e=>({name:e.name,source:e.source,type:e.type,localized:e.localized,describedByManifest:e.describedByManifest,...void 0===e.description?{}:{description:e.description},...void 0===e.valueDescription?{}:{valueDescription:e.valueDescription},...void 0===e.enumValues?{}:{enumValues:e.enumValues},...void 0===e.lenses?{}:{lenses:e.lenses}}))])),enumValues:Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries(Object.entries(t.resolvedShapes.get(e)?.properties??{}).flatMap(([e,t])=>{let i=T(t,A).enumValues;return i?[[e,i]]:[]}))])),deletable:Object.keys(e.deletable??{}),writable:Object.fromEntries(Object.entries(e.writable??{}).map(([e,i])=>[e,Object.fromEntries(Object.entries(i).map(([i,r])=>[i,{defaultOptionsName:r?.options?.as===void 0,members:Object.fromEntries(t.entityTypes.filter(i=>i===e||[...t.aliases].find(([t])=>t===e)?.[1].includes(i)).flatMap(r=>{let n=h(t.resolvedShapes.get(r)?.properties??{},i),s=n&&g(r,{property:i,writableKey:e},n,{model:t,resolveRef:A,exposed:new Map,sources:{}},N.at("writable")),o=V.get(r)?.find(t=>t.entry===`${e}.${i}`);return s?[[r,{field:s,...T(n,A).localized?{exposedDescription:b}:{},...o?{options:{options:o.options,hints:o.hints}}:{}}]]:[]}))}]))])),childRecipes:B(e.childRecipes??{}),replaceRecipes:B(e.replaceRecipes??{})},entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:i.navigationStates,viewStates:i.viewStates,toolStates:i.toolStates},deletableTypes:k,writableTypes:K,actionFields:G,childRecipes:Object.fromEntries(Object.entries(F.groups).map(([e,t])=>[e,{groups:t,hints:F.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(W.groups).map(([e,t])=>[e,{groups:t,hints:W.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...V].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),fields:Object.fromEntries([...C].map(([e,t])=>[e,t.map(t=>o(t,E.get(e)??[]))])),lenses:z}};export const createAssistantSchema=(e,t,n)=>{let s=resolveAssistantManifest(e,t,n);if(s)try{return{...r(s),resolved:s}}catch(e){if(e instanceof i)return void n.at("entities").error(a.ASSISTANT_FIELD_SHAPE_CONFLICT,l.ASSISTANT_FIELD_SHAPE_CONFLICT(e.fieldName,e.exposures));n.error(a.ASSISTANT_INVALID_SCHEMA,l.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
1
+ import{isArray as e}from"@salsita-ai/common/utils";import{ASSISTANT_HINTS as t,AssistantFieldClashError as r,buildAssistantManifest as i,describeAssistantValues as n,mergeAssistantFields as s,resolveAssistantField as o}from"#package/domain";import{DiagnosticCode as a,diagnosticMessages as l}from"../../../../errors/index.js";import{createSchemaRefResolver as S,isNullableSchema as p,phxDefinitionRefName as N}from"../../common/index.js";import{resolveAssistantFieldType as T}from"./assistant-field-type.js";import{resolveFormElements as c}from"./assistant-form-elements.js";let d="AnyDomainEntity",E="RecipeGroup",f="Recipe",A="DryRun",_="FieldOption",m="agentScreenshot",u=/^(?!(true|false|null)$)[_A-Za-z][_0-9A-Za-z]*$/,O={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},I={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},y=new Set(["id","type","meta"]),h=new Set(["Query","Mutation","Navigation",E,f,A,"DryRunError",_,"Screenshot","JSON","String","Int","Float","Boolean","ID"]),v=new Set([E,f,_,A]),b=new Set(["id","type"]),g="A string, a message descriptor or a multilingual object; passed without translation.",R=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],M=(e,{property:t,writableKey:r},i,{resolveRef:s,exposed:o,sources:S},p)=>{let N=Object.entries(R(S,e)??{}),c=o.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===c?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void p.at(r,t).error(a.ASSISTANT_FIELD_NAME_CONFLICT,l.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${r}.${t}`));let{type:E,enumValues:f,localized:A,description:_}=T(i,s),m={...E,nonNull:!1},u=c??t,O=void 0===c?n(_,f):void 0;return A?{name:u,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:O?`${O} ${g}`:g}:{name:u,property:t,type:m,...void 0===O?{}:{description:O}}},C=(e,t,{model:r,components:i})=>{let n=new Set([e,...[...r.aliases].filter(([,t])=>t.includes(e)).map(([e])=>e)]);return i.filter(({componentName:e,typeOrAlias:r})=>e===t&&n.has(r)).map(({instanceName:e})=>String(e))},j=(...e)=>t.filter(t=>e.some(e=>e?.includes(t))),w=(e,t,r,i)=>{let{model:n}=r,s=new Map,o=new Map;for(let[S,{groups:p,hints:N}]of Object.entries(e)){let e=n.entityTypes.find(e=>e===S),T=e?[e]:[...n.aliases].find(([e])=>e===S)?.[1];if(!T){i.at(S).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE(t.section,S));continue}for(let[e,n]of(T.forEach(e=>o.set(e,j(o.get(e),N))),Object.entries(p))){let o=i.at(S,"groups",e),p=`${S}.groups.${e}`,N={groupId:n?.as??e,instanceName:e,...n?.description===void 0?{}:{description:n.description},dryRuns:n?.allowDryRuns??!0};for(let i of T){let n=C(i,t.component,r),T=s.get(i)??[],c=T.find(e=>e.group.groupId===N.groupId);n.includes(e)?c?o.error(a.ASSISTANT_DUPLICATE_RECIPE_GROUP,l.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,i,N.groupId,[c.entry,p])):s.set(i,[...T,{group:N,entry:p,entryCtx:o}]):o.error(a.ASSISTANT_UNKNOWN_RECIPE_GROUP,l.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,S,e,i,n))}}}let S=n.entityTypes.flatMap(e=>{let t=s.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(S.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:o,metaEntries:new Map(S.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},P=(e,t,{model:r,components:i})=>{let n=new Set([e,...[...r.aliases].filter(([,t])=>t.includes(e)).map(([e])=>e)]),s=i.find(e=>e.componentName===m&&String(e.instanceName)===t&&n.has(e.typeOrAlias));if(s?.implementation.kind!=="userBound"||"composite"!==s.implementation.implementation.kind)return;let o=s.implementation.implementation.resolvedProps.exportState;return"string"==typeof o?o:void 0},D=e=>`${e}Meta`,L=e=>`${e}ScreenshotView`,U=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,W=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},$=(e,t)=>{let{type:r,enumValues:i,localized:s,description:o}=T(e,t),a={...r,nonNull:!1},l=s?`${n(o,i)??""} ${g}`.trim():n(o,i);return{type:{...s?{kind:"scalar",name:"JSON",nonNull:!1}:a,nonNull:r.nonNull},...void 0===l?{}:{description:l}}},F=(t,r)=>{let i=(t=>{let r=W(t),i=r?.type==="array"&&r.items&&!e(r.items)?W(r.items):void 0,n=i??r;if(n?.$ref!==void 0&&"$DomainEntity"===N(n.$ref))return{target:n.references??d,list:void 0!==i}})(t);if(i)return{kind:"edge",...i,nullable:p(t,r),...void 0===t.description?{}:{description:t.description}};let{type:s,enumValues:o,localized:a,description:l}=T(t,r),S=n(l,o);return a?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:s.nonNull},description:`${l??""} ${g}`.trim()}:{kind:"value",type:s,...void 0===S?{}:{description:S}}},V=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=T(e,t);return{type:{kind:"value",type:r},localized:!0===n,description:s,enumValues:i}},K=(e,t,r,i,s)=>{let o=t.startsWith("$")?((e,t,r,i)=>{let n=((e,t,{expressions:r,entityTypes:i})=>{let n=i.find(t=>t===e);for(let i of void 0===n?[e]:r.entityExpressions.get(n)?.shapeGroups??[]){let e=[...r.expressions.get(i)?.values()??[]].find(e=>e.name===t);if(e?.declaredSchema)return{implementation:e.implementation,declaredSchema:e.declaredSchema}}})(e.name,t,r);if(!n)return void i.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:s}=n;if("violations"===s.kind)return void i.error(a.ASSISTANT_UNSUPPORTED_EXPRESSION,l.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===s.kind){let[{target:e,cardinality:t}]=s.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return V(n.declaredSchema,r.resolveRef)})(e,t,i,s):((e,t,{resolveRef:r},i)=>{let n=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return n?V(n,r):void i.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,i,s);if(!o)return;let S=r?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return y.has(S)?void s.error(a.ASSISTANT_RESERVED_FIELD_NAME,l.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,S)):{name:S,source:t,type:o.type,localized:o.localized,description:n(r?.description??o.description,o.enumValues),describedByManifest:r?.description!==void 0,enumValues:o.enumValues,valueDescription:r?.description??o.description,...r?.lenses?.length?{lenses:[...new Set(r.lenses)]}:{}}},k=(e,t,r,i,n)=>s(t,r,i,(t,r,i)=>{n.error(a.ASSISTANT_FIELD_NAME_CONFLICT,l.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[r,i]))});export const resolveAssistantManifest=(e,{model:t,states:r,phxDefinitions:i,expressions:n,components:s,actions:p},N)=>{let E=N.errors.length,f=N.at("entities"),A=S(t.commonTypes,i);for(let e of t.resolvedShapes.keys())h.has(e)&&N.error(a.ASSISTANT_RESERVED_TYPE_NAME,l.ASSISTANT_RESERVED_TYPE_NAME(e,[...h]));let _=((e,t,r)=>{let i=new Map;for(let n of e){let e=[];for(let[i,s]of Object.entries(n.entries)){let o=K(n,i,s,t,r.at(n.name,i));o&&e.push(o)}i.set(n.name,e)}return i})(((e,t,r)=>{let i=[];for(let[r,n]of t.resolvedShapes){let t=e[r];t&&i.push({name:r,shape:n,entries:t})}let n=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))n.has(t)||r.at(t).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("entities",t));return i})(e.entities??{},t,f),{resolveRef:A,expressions:n,entityTypes:t.entityTypes},f),y=k(d,[],_.get(d)??[],()=>void 0,N),W=new Map([[d,y]]);for(let e of t.aliases.keys())e!==d&&W.set(e,k(e,[y],_.get(e)??[],()=>void 0,N));for(let e of t.entityTypes){let r=[d,...[...t.aliases].filter(([t,r])=>t!==d&&r.includes(e)).map(([e])=>e)],i=[...t.resolvedShapes].find(([t])=>t===e)?.[1];W.set(e,k(e,r.map(e=>W.get(e)??[]),_.get(e)??[],e=>{let t=Object.entries(i?.properties??{}).find(([t])=>t===e)?.[1];return t&&T(t,A).enumValues},N))}let V=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((W.get(e)??[]).map(({name:e,source:t,localized:r})=>[e,r?{source:t,localized:!0}:{source:t}]))])),Y=w(e.childRecipes??{},O,{model:t,components:s},N.at("childRecipes")),x=w(e.replaceRecipes??{},I,{model:t,components:s},N.at("replaceRecipes")),H=((e,t,r)=>{let i=new Set;for(let n of Object.keys(e)){let e=t.entityTypes.find(e=>e===n),s=e?[e]:[...t.aliases].find(([e])=>e===n)?.[1];s?s.forEach(e=>i.add(e)):r.at(n).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("deletable",n))}return t.entityTypes.filter(e=>i.has(e))})(e.deletable??{},t,N.at("deletable")),z=((e,t,r)=>{let{model:i}=t,n=((e,t,r)=>{let i=new Map;for(let[n,s]of Object.entries(e)){let e=t.entityTypes.find(e=>e===n),o=e?[e]:[...t.aliases].find(([e])=>e===n)?.[1],S=[...t.resolvedShapes].find(([e])=>e===n)?.[1];if(!o||!S){r.at(n).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("writable",n));continue}for(let e of Object.keys(s)){let t=r.at(n,e);e.startsWith("$")||b.has(e)?t.error(a.ASSISTANT_NOT_WRITABLE,l.ASSISTANT_NOT_WRITABLE(n,e)):R(S.properties,e)?o.forEach(t=>{let r=i.get(t)??new Map;i.set(t,r.has(e)?r:r.set(e,n))}):t.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("writable",n,e))}}return i})(e,i,r);return i.entityTypes.flatMap(e=>{let s=[...i.resolvedShapes].find(([t])=>t===e)?.[1],o=[...n.get(e)??[]].flatMap(([i,n])=>{let o=s&&R(s.properties,i);return(o&&M(e,{property:i,writableKey:n},o,t,r))??[]});return o.length>0?[{entityType:e,fields:o}]:[]})})(e.writable??{},{model:t,resolveRef:A,exposed:_,sources:V},N.at("writable")),G=((e,t,r,i)=>{let{model:n}=r,s=new Map;for(let[o,S]of Object.entries(e)){let e=n.entityTypes.find(e=>e===o),p=e?[e]:[...n.aliases].find(([e])=>e===o)?.[1]??[];for(let[e,n]of Object.entries(S)){let S=n?.options;if(!S)continue;let N=i.at(o,e,"options"),T=`${o}.${e}`;for(let i of p){let n=t.find(e=>e.entityType===i)?.fields.find(t=>t.property===e);if(!n)continue;let o=S.as??`${n.name}Options`,p=C(i,S.componentType,r),c=s.get(i)??[],d=c.find(e=>e.options.edgeName===o||e.options.field===n.name);if(p.includes(S.instanceName))if(o===O.section||o===I.section||"screenshot"===o)N.error(a.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,l.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(T,o,n.name));else if(d)N.error(a.ASSISTANT_DUPLICATE_OPTIONS_EDGE,l.ASSISTANT_DUPLICATE_OPTIONS_EDGE(i,d.options.edgeName===o?{edgeName:o}:{field:n.name},[d.entry,T]));else{let e={field:n.name,edgeName:o,componentType:S.componentType,instanceName:S.instanceName,validate:S.validate??!0,dryRuns:S.allowDryRuns??!0};s.set(i,[...c,{options:e,hints:j(S.hints),entry:T,entryCtx:N}])}else N.error(a.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,l.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(T,S,i,p))}}}return s})(e.writable??{},z,{model:t,components:s},N.at("writable")),B=((e,t,r)=>{let{model:i,states:n}=t,s=new Map;for(let[o,S]of Object.entries(e)){let e=i.entityTypes.find(e=>e===o),p=e?[e]:[...i.aliases].find(([e])=>e===o)?.[1];if(!p){r.at(o).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("screenshots",o));continue}for(let[e,{description:i,as:N}]of Object.entries(S)){let S=r.at(o,e),T=`${o}.${e}`,c={view:N??e,instanceName:e,description:i};if(!u.test(c.view)){S.error(a.ASSISTANT_INVALID_SCREENSHOT_VIEW_NAME,l.ASSISTANT_INVALID_SCREENSHOT_VIEW_NAME(o,e,c.view));continue}for(let r of p){let i=C(r,m,t),p=P(r,e,t),N=s.get(r)??[],d=N.find(e=>e.view.view===c.view);i.includes(e)?void 0===p||n.exportStates.includes(p)?d?S.error(a.ASSISTANT_DUPLICATE_SCREENSHOT_VIEW,l.ASSISTANT_DUPLICATE_SCREENSHOT_VIEW(r,c.view,[d.entry,T])):s.set(r,[...N,{view:c,entry:T,entryCtx:S}]):S.error(a.ASSISTANT_UNKNOWN_SCREENSHOT_EXPORT_STATE,l.ASSISTANT_UNKNOWN_SCREENSHOT_EXPORT_STATE(o,e,p,n.exportStates)):S.error(a.ASSISTANT_UNKNOWN_SCREENSHOT_VIEW,l.ASSISTANT_UNKNOWN_SCREENSHOT_VIEW(o,e,r,i))}}}let o=i.entityTypes.flatMap(e=>{let t=s.get(e);return t?[{entityType:e,views:t}]:[]});return{views:new Map(o.map(({entityType:e,views:t})=>[e,t.map(({view:e})=>e)])),metaEntries:new Map(o.flatMap(({entityType:e,views:[t]})=>t?[[e,t.entryCtx]]:[]))}})(e.screenshots??{},{model:t,components:s,states:r},N.at("screenshots"));var J=[Y.metaEntries,x.metaEntries,new Map([...G].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[])),B.metaEntries];for(let e of t.entityTypes){let r=J.flatMap(t=>t.get(e)??[])[0],i=D(e);r&&[...t.resolvedShapes.keys()].some(e=>e===i)&&r.error(a.ASSISTANT_META_TYPE_NAME_CONFLICT,l.ASSISTANT_META_TYPE_NAME_CONFLICT(e,i))}for(let[e,r]of B.metaEntries){let i=L(e);[...t.resolvedShapes.keys()].some(e=>e===i)&&r.error(a.ASSISTANT_SCREENSHOT_VIEW_TYPE_NAME_CONFLICT,l.ASSISTANT_SCREENSHOT_VIEW_TYPE_NAME_CONFLICT(e,i))}let X=t.entityTypes.filter(e=>(Y.groups[e]?.length??0)>0||(x.groups[e]?.length??0)>0||(G.get(e)?.length??0)>0||B.views.has(e)).flatMap(e=>[D(e),...B.views.has(e)?[L(e)]:[]]),Z=((e,{actions:t,resolveRef:r,builtInMutations:i,typeNames:n},s)=>{let o=[],S=[...t.values()].map(e=>String(e.name));for(let[p,N]of Object.entries(e)){let e=s.at(p),T=[...t.values()].find(e=>e.name===p);if(!T){e.error(a.ASSISTANT_UNKNOWN_ACTION,l.ASSISTANT_UNKNOWN_ACTION(p,S));continue}let c=N?.as??p,d=o.find(e=>e.fieldName===c),E=U(c);if(i.has(c)||d){e.error(a.ASSISTANT_MUTATION_NAME_CONFLICT,l.ASSISTANT_MUTATION_NAME_CONFLICT(p,c,d?`"assistant.actions.${d.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(n.has(E)||o.some(e=>U(e.fieldName)===E)){e.error(a.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,l.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(p,c,E));continue}let f=N?.description??T.description;o.push({fieldName:c,actionName:p,...void 0===f?{}:{description:f},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,$(t,r)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,F(t,r)]))})}return o})(e.actions??{},{actions:p,resolveRef:A,builtInMutations:new Set(["deleteEntity",O.mutation,I.mutation,...z.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...h,...t.resolvedShapes.keys(),...X])},N.at("actions")),Q=((e,t)=>{let r=e.lenses??{},i=new Set;for(let[n,s]of Object.entries(e.entities??{}))for(let[e,o]of Object.entries(s))for(let s of o?.lenses??[])Object.hasOwn(r,s)?i.add(s):t.at("entities",n,e,"lenses").error(a.ASSISTANT_UNKNOWN_LENS,l.ASSISTANT_UNKNOWN_LENS(`${n}.${e}`,s,Object.keys(r)));for(let e of Object.keys(r))v.has(e)?t.at("lenses",e).error(a.ASSISTANT_RESERVED_LENS_NAME,l.ASSISTANT_RESERVED_LENS_NAME(e,[...v])):i.has(e)||t.at("lenses",e).error(a.ASSISTANT_EMPTY_LENS,l.ASSISTANT_EMPTY_LENS(e));return Object.fromEntries(Object.entries(r).map(([e,{description:t,maxDepth:r}])=>[e,{description:t,maxDepth:r??1}]))})(e,N),q=c(e.formElements??{},N.at("formElements"));if(N.errors.length>E)return;let ee=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,{hints:j(t.hints),groups:Object.entries(t.groups).map(([e,t])=>({instanceName:e,groupId:t?.as??e,...t?.description===void 0?{}:{description:t.description},dryRuns:t?.allowDryRuns??!0}))}]));return{declarations:{entities:Object.fromEntries(Object.keys(e.entities??{}).map(e=>[e,(_.get(e)??[]).map(e=>({name:e.name,source:e.source,type:e.type,localized:e.localized,describedByManifest:e.describedByManifest,...void 0===e.description?{}:{description:e.description},...void 0===e.valueDescription?{}:{valueDescription:e.valueDescription},...void 0===e.enumValues?{}:{enumValues:e.enumValues},...void 0===e.lenses?{}:{lenses:e.lenses}}))])),enumValues:Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries(Object.entries(t.resolvedShapes.get(e)?.properties??{}).flatMap(([e,t])=>{let r=T(t,A).enumValues;return r?[[e,r]]:[]}))])),deletable:Object.keys(e.deletable??{}),writable:Object.fromEntries(Object.entries(e.writable??{}).map(([e,r])=>[e,Object.fromEntries(Object.entries(r).map(([r,i])=>[r,{defaultOptionsName:i?.options?.as===void 0,members:Object.fromEntries(t.entityTypes.filter(r=>r===e||[...t.aliases].find(([t])=>t===e)?.[1].includes(r)).flatMap(i=>{let n=R(t.resolvedShapes.get(i)?.properties??{},r),s=n&&M(i,{property:r,writableKey:e},n,{model:t,resolveRef:A,exposed:new Map,sources:{}},N.at("writable")),o=G.get(i)?.find(t=>t.entry===`${e}.${r}`);return s?[[i,{field:s,...T(n,A).localized?{exposedDescription:g}:{},...o?{options:{options:o.options,hints:o.hints}}:{}}]]:[]}))}]))])),childRecipes:ee(e.childRecipes??{}),replaceRecipes:ee(e.replaceRecipes??{}),screenshots:Object.fromEntries(Object.entries(e.screenshots??{}).map(([e,t])=>[e,Object.entries(t).map(([e,{description:t,as:r}])=>({view:r??e,instanceName:e,description:t}))]))},entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:r.navigationStates,viewStates:r.viewStates,toolStates:r.toolStates},deletableTypes:H,writableTypes:z,actionFields:Z,childRecipes:Object.fromEntries(Object.entries(Y.groups).map(([e,t])=>[e,{groups:t,hints:Y.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(x.groups).map(([e,t])=>[e,{groups:t,hints:x.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...G].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),screenshots:Object.fromEntries(B.views),fields:Object.fromEntries([...W].map(([e,t])=>[e,t.map(t=>o(t,_.get(e)??[]))])),lenses:Q,formElements:q}};export const createAssistantSchema=(e,t,n)=>{let s=resolveAssistantManifest(e,t,n);if(s)try{return{...i(s),resolved:s}}catch(e){if(e instanceof r)return void n.at("entities").error(a.ASSISTANT_FIELD_SHAPE_CONFLICT,l.ASSISTANT_FIELD_SHAPE_CONFLICT(e.fieldName,e.exposures));n.error(a.ASSISTANT_INVALID_SCHEMA,l.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
@@ -1,6 +1,6 @@
1
1
  import type { AccessLevel } from '@salsita-ai/contracts/api';
2
2
  import { type ChatStreamChunk } from '@salsita-ai/contracts/chat';
3
- import { type AssistantChatConnection, type AssistantEarlierThread, type AssistantThreadCompaction, type AuthorizedPhoenixApiClient, type ChatToolCall, type ChatToolCallResult, type ConfigurationPayload, type ConfigurationSchema, type waitForFinalizationResultSettings } from './contract.js';
3
+ import { type AssistantChatConnection, type AssistantEarlierThread, type AssistantImageUpload, type AssistantThreadCompaction, type AuthorizedPhoenixApiClient, type ChatToolCall, type ChatToolCallResult, type ConfigurationPayload, type ConfigurationSchema, type waitForFinalizationResultSettings } from './contract.js';
4
4
  import type { components } from './phoenix-api.js';
5
5
  export declare class AuthorizedClient<FINALIZE_DATA extends Record<string, unknown>, FINALIZE_RESULT extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>> implements AuthorizedPhoenixApiClient<FINALIZE_DATA, FINALIZE_RESULT, FRONTEND_DATA> {
6
6
  private readonly _baseUrl;
@@ -28,6 +28,8 @@ export declare class AuthorizedClient<FINALIZE_DATA extends Record<string, unkno
28
28
  getAssistantChatConnection: (configurationId: string) => AssistantChatConnection;
29
29
  compactAssistantThread: (configurationId: string) => Promise<AssistantThreadCompaction>;
30
30
  getAssistantEarlierThread: (configurationId: string, threadId: string, limit: number) => Promise<AssistantEarlierThread>;
31
+ uploadAssistantImage: (configurationId: string, image: Blob) => Promise<AssistantImageUpload>;
32
+ getAssistantImage: (configurationId: string, imageId: string) => Promise<Blob>;
31
33
  sendMessage: (configurationId: string, content: string, context?: Record<string, string>) => Promise<ReadableStream<ChatStreamChunk>>;
32
34
  sendToolCallResults: (configurationId: string, calls: ChatToolCall[], results: ChatToolCallResult[], agent?: string) => Promise<ReadableStream<ChatStreamChunk>>;
33
35
  generateShareLink: (configurationId: string, revisionId: string, expiration: number, access: AccessLevel, baseUrl: string | undefined) => Promise<{
@@ -1 +1 @@
1
- import{match as t}from"ts-pattern";import{InfoError as a}from"@salsita-ai/common/utils";import{isChatError as e}from"@salsita-ai/contracts/chat";import{createApiBaseClient as r}from"./base-client.js";import{AssistantRequestError as i,InvalidAccessKeyError as o}from"./contract.js";let n=()=>new TransformStream({transform(t,a){a.enqueue(t)}}),s=async(t,a)=>{for(;;){let{done:r,value:i}=await t.read();if(r){await a.close();break}for(let t of i.split("\n").filter(t=>""!==t.trim()).map(t=>JSON.parse(t))){if(e(t))return void await a.abort(Error(t.error));await a.write(t)}}},h=(e,r)=>{let i=`${r} API request failed: ${JSON.stringify(e)}`;return t(e).with({statusCode:403,invalidAccessKey:!0},()=>new o).with({statusCode:403},()=>new a(i)).otherwise(()=>Error(i))};export class AuthorizedClient{_baseUrl;_getAccessToken;_getSessionToken;_client;constructor(t,a,e){this._baseUrl=t,this._getAccessToken=a,this._getSessionToken=e,this._client=r(this._baseUrl)}_authHeaders=async()=>{let t=this._getAccessToken(),a=await this._getSessionToken();return{"X-Access-Key":t,Authorization:`Bearer ${a}`}};getConfiguration=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}",{params:{path:{configurationId:t}},headers:a});if(e.error)throw h(e.error,"getConfiguration");return e.data};updateConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.PUT("/configurations/{configurationId}",{params:{path:{configurationId:t}},body:a,headers:e});if(r.error)throw h(r.error,"updateConfiguration");return r.data};finalize=async(t,a,e,r,i)=>{let o=await this._authHeaders(),n=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/finalize",{params:{path:{configurationId:t,finalizationUuid:a},query:{locale:r}},body:{finalizeData:e,frontendData:i},headers:o});if(n.error)throw h(n.error,"finalize")};waitForFinalizationToComplete=async(t,a,e)=>{let r=e?.pollingFrequency??500,i=Math.ceil((e?.pollingTimeout??3e4)/r);for(let e=0;e<i;e++){let e=await this._authHeaders(),i=await this._client.GET("/configurations/{configurationId}/{finalizationUuid}/state",{params:{path:{configurationId:t,finalizationUuid:a}},headers:e});if(i.error)throw h(i.error,"getFinalizeJobState");let o=i.data;if("completed"===o.state)return o.result[0];if("failed"===o.state)throw Error("finalization failed");if("unknown"===o.state)throw Error("finalization state is unknown");await new Promise(t=>setTimeout(t,r))}throw Error("finalization did not complete within the specified timeout")};getConfigurationRevision=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/revisions/{revisionId}",{params:{path:{configurationId:t,revisionId:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationRevision");return r.data};getChatConversation=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}/chat",{params:{path:{configurationId:t}},headers:a});if(e.error)throw h(e.error,"getChatConversation");return e.data};getSpeechToText=async(t,a)=>{let e=await this._authHeaders(),r=new FormData;r.append("voiceFile",a,"voice.wav");let i=await this._client.POST("/configurations/{configurationId}/chat/stt",{params:{path:{configurationId:t}},headers:e,body:r,bodySerializer:()=>r});if(i.error)throw h(i.error,"getSpeechToText");return i.data.text};getTextToSpeech=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/chat/tts",{params:{path:{configurationId:t}},body:{content:a},headers:e,parseAs:"arrayBuffer"});if(r.error)throw h(r.error,"getTextToSpeech");return new Blob([r.data],{type:"audio/mp3"})};getAssistantChatConnection=t=>({url:new URL(`configurations/${encodeURIComponent(t)}/assistant/chat`,`${this._baseUrl}/`).toString(),headers:this._authHeaders});compactAssistantThread=async t=>{let a=await this._authHeaders(),e=await this._client.POST("/configurations/{configurationId}/assistant/chat/compact",{params:{path:{configurationId:t}},headers:{...a,"Content-Type":null}});if(e.error)throw new i(`compactAssistantThread API request failed: ${JSON.stringify(e.error)}`,e.response.status);return e.data};getAssistantEarlierThread=async(t,a,e)=>{let r=await this._authHeaders(),o=await this._client.GET("/configurations/{configurationId}/assistant/chat/threads/{threadId}",{params:{path:{configurationId:t,threadId:a},query:{limit:e}},headers:r});if(o.error)throw new i(`getAssistantEarlierThread API request failed: ${JSON.stringify(o.error)}`,o.response.status);let{messages:n}=o.data;return{threadId:a,messages:Array.isArray(n)?n:[],previousThreadId:o.response.headers.get("x-assistant-previous-thread")}};sendMessage=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/chat/message",{params:{path:{configurationId:t}},body:{content:a,context:e},headers:r,parseAs:"stream"});if(i.error)throw h(i.error,"sendMessage");let o=i.data?.pipeThrough(new TextDecoderStream).getReader();if(!o)throw Error("sendMessage API response did not contain a readable stream");let c=n();return s(o,c.writable.getWriter()),c.readable};sendToolCallResults=async(t,a,e,r)=>{let i=await this._authHeaders(),o=await this._client.POST("/configurations/{configurationId}/chat/tool-calls",{params:{path:{configurationId:t}},body:{agent:r,calls:a,results:e},headers:i,parseAs:"stream"});if(o.error)throw h(o.error,"sendToolCallResults");let c=o.data?.pipeThrough(new TextDecoderStream).getReader();if(!c)throw Error("sendMessage API response did not contain a readable stream");let u=n();return s(c,u.writable.getWriter()),u.readable};generateShareLink=async(t,a,e,r,i)=>{let o=await this._authHeaders(),n=await this._client.POST("/configurations/{configurationId}/share-link",{params:{path:{configurationId:t}},body:{revisionId:a,expiration:e,access:r,baseUrl:i},headers:o});if(n.error)throw h(n.error,"generateShareLink");return n.data};generateUploadLinks=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/image-upload-links",{params:{path:{configurationId:t,finalizationUuid:a}},body:{names:e},headers:r});if(i.error)throw h(i.error,"generateUploadLinks");return i.data.links};getConfigurationPublicUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/public/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPublicUploadLink");return r.data};getConfigurationPrivateUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPrivateUploadLink");return r.data};getConfigurationPrivateResourceLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPrivateUploadLink");return r.data};cloneConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/revisions/{revisionId}/clone",{params:{path:{configurationId:t,revisionId:a}},headers:{...e,"Content-Type":null}});if(r.error)throw h(r.error,"cloneConfiguration");return r.data}}
1
+ import{match as t}from"ts-pattern";import{InfoError as a}from"@salsita-ai/common/utils";import{isChatError as e}from"@salsita-ai/contracts/chat";import{createApiBaseClient as r}from"./base-client.js";import{AssistantRequestError as i,InvalidAccessKeyError as s}from"./contract.js";let o=()=>new TransformStream({transform(t,a){a.enqueue(t)}}),n=async(t,a)=>{for(;;){let{done:r,value:i}=await t.read();if(r){await a.close();break}for(let t of i.split("\n").filter(t=>""!==t.trim()).map(t=>JSON.parse(t))){if(e(t))return void await a.abort(Error(t.error));await a.write(t)}}},h=(e,r)=>{let i=`${r} API request failed: ${JSON.stringify(e)}`;return t(e).with({statusCode:403,invalidAccessKey:!0},()=>new s).with({statusCode:403},()=>new a(i)).otherwise(()=>Error(i))};export class AuthorizedClient{_baseUrl;_getAccessToken;_getSessionToken;_client;constructor(t,a,e){this._baseUrl=t,this._getAccessToken=a,this._getSessionToken=e,this._client=r(this._baseUrl)}_authHeaders=async()=>{let t=this._getAccessToken(),a=await this._getSessionToken();return{"X-Access-Key":t,Authorization:`Bearer ${a}`}};getConfiguration=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}",{params:{path:{configurationId:t}},headers:a});if(e.error)throw h(e.error,"getConfiguration");return e.data};updateConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.PUT("/configurations/{configurationId}",{params:{path:{configurationId:t}},body:a,headers:e});if(r.error)throw h(r.error,"updateConfiguration");return r.data};finalize=async(t,a,e,r,i)=>{let s=await this._authHeaders(),o=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/finalize",{params:{path:{configurationId:t,finalizationUuid:a},query:{locale:r}},body:{finalizeData:e,frontendData:i},headers:s});if(o.error)throw h(o.error,"finalize")};waitForFinalizationToComplete=async(t,a,e)=>{let r=e?.pollingFrequency??500,i=Math.ceil((e?.pollingTimeout??3e4)/r);for(let e=0;e<i;e++){let e=await this._authHeaders(),i=await this._client.GET("/configurations/{configurationId}/{finalizationUuid}/state",{params:{path:{configurationId:t,finalizationUuid:a}},headers:e});if(i.error)throw h(i.error,"getFinalizeJobState");let s=i.data;if("completed"===s.state)return s.result[0];if("failed"===s.state)throw Error("finalization failed");if("unknown"===s.state)throw Error("finalization state is unknown");await new Promise(t=>setTimeout(t,r))}throw Error("finalization did not complete within the specified timeout")};getConfigurationRevision=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/revisions/{revisionId}",{params:{path:{configurationId:t,revisionId:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationRevision");return r.data};getChatConversation=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}/chat",{params:{path:{configurationId:t}},headers:a});if(e.error)throw h(e.error,"getChatConversation");return e.data};getSpeechToText=async(t,a)=>{let e=await this._authHeaders(),r=new FormData;r.append("voiceFile",a,"voice.wav");let i=await this._client.POST("/configurations/{configurationId}/chat/stt",{params:{path:{configurationId:t}},headers:e,body:r,bodySerializer:()=>r});if(i.error)throw h(i.error,"getSpeechToText");return i.data.text};getTextToSpeech=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/chat/tts",{params:{path:{configurationId:t}},body:{content:a},headers:e,parseAs:"arrayBuffer"});if(r.error)throw h(r.error,"getTextToSpeech");return new Blob([r.data],{type:"audio/mp3"})};getAssistantChatConnection=t=>({url:new URL(`configurations/${encodeURIComponent(t)}/assistant/chat`,`${this._baseUrl}/`).toString(),headers:this._authHeaders});compactAssistantThread=async t=>{let a=await this._authHeaders(),e=await this._client.POST("/configurations/{configurationId}/assistant/chat/compact",{params:{path:{configurationId:t}},headers:{...a,"Content-Type":null}});if(e.error)throw new i(`compactAssistantThread API request failed: ${JSON.stringify(e.error)}`,e.response.status);return e.data};getAssistantEarlierThread=async(t,a,e)=>{let r=await this._authHeaders(),s=await this._client.GET("/configurations/{configurationId}/assistant/chat/threads/{threadId}",{params:{path:{configurationId:t,threadId:a},query:{limit:e}},headers:r});if(s.error)throw new i(`getAssistantEarlierThread API request failed: ${JSON.stringify(s.error)}`,s.response.status);let{messages:o}=s.data;return{threadId:a,messages:Array.isArray(o)?o:[],previousThreadId:s.response.headers.get("x-assistant-previous-thread")}};uploadAssistantImage=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/assistant/images",{params:{path:{configurationId:t}},headers:{...e,"Content-Type":a.type},body:a.type,bodySerializer:()=>a});if(r.error)throw new i(`uploadAssistantImage API request failed: ${JSON.stringify(r.error)}`,r.response.status);return{imageId:r.data.imageId}};getAssistantImage=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/assistant/images/{imageId}",{params:{path:{configurationId:t,imageId:a}},headers:e,parseAs:"blob"});if(r.error)throw new i(`getAssistantImage API request failed: ${JSON.stringify(r.error)}`,r.response.status);return r.data};sendMessage=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/chat/message",{params:{path:{configurationId:t}},body:{content:a,context:e},headers:r,parseAs:"stream"});if(i.error)throw h(i.error,"sendMessage");let s=i.data?.pipeThrough(new TextDecoderStream).getReader();if(!s)throw Error("sendMessage API response did not contain a readable stream");let u=o();return n(s,u.writable.getWriter()),u.readable};sendToolCallResults=async(t,a,e,r)=>{let i=await this._authHeaders(),s=await this._client.POST("/configurations/{configurationId}/chat/tool-calls",{params:{path:{configurationId:t}},body:{agent:r,calls:a,results:e},headers:i,parseAs:"stream"});if(s.error)throw h(s.error,"sendToolCallResults");let u=s.data?.pipeThrough(new TextDecoderStream).getReader();if(!u)throw Error("sendMessage API response did not contain a readable stream");let c=o();return n(u,c.writable.getWriter()),c.readable};generateShareLink=async(t,a,e,r,i)=>{let s=await this._authHeaders(),o=await this._client.POST("/configurations/{configurationId}/share-link",{params:{path:{configurationId:t}},body:{revisionId:a,expiration:e,access:r,baseUrl:i},headers:s});if(o.error)throw h(o.error,"generateShareLink");return o.data};generateUploadLinks=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/image-upload-links",{params:{path:{configurationId:t,finalizationUuid:a}},body:{names:e},headers:r});if(i.error)throw h(i.error,"generateUploadLinks");return i.data.links};getConfigurationPublicUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/public/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPublicUploadLink");return r.data};getConfigurationPrivateUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPrivateUploadLink");return r.data};getConfigurationPrivateResourceLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPrivateUploadLink");return r.data};cloneConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/revisions/{revisionId}/clone",{params:{path:{configurationId:t,revisionId:a}},headers:{...e,"Content-Type":null}});if(r.error)throw h(r.error,"cloneConfiguration");return r.data}}
@@ -100,6 +100,18 @@ export interface AuthorizedPhoenixApiClient<FINALIZE_DATA extends Record<string,
100
100
  * `limit` of its newest messages. Rejects with an {@link AssistantRequestError} when the server refuses.
101
101
  */
102
102
  getAssistantEarlierThread: (configurationId: string, threadId: string, limit: number) => Promise<AssistantEarlierThread>;
103
+ /**
104
+ * Stores a screenshot the assistant took in the open assistant thread of the configuration, while a
105
+ * reply runs there, and resolves with the id its tool result references it by. The image is the
106
+ * rendered JPEG or PNG blob, sent with its own type. Rejects with an {@link AssistantRequestError}
107
+ * when the server refuses.
108
+ */
109
+ uploadAssistantImage: (configurationId: string, image: Blob) => Promise<AssistantImageUpload>;
110
+ /**
111
+ * Reads a screenshot of an assistant thread of the configuration by the id its tool result
112
+ * references it by. Rejects with an {@link AssistantRequestError} when the server refuses.
113
+ */
114
+ getAssistantImage: (configurationId: string, imageId: string) => Promise<Blob>;
103
115
  getSpeechToText: (configurationId: string, blob: Blob) => Promise<string>;
104
116
  getTextToSpeech: (configurationId: string, text: string) => Promise<Blob>;
105
117
  sendMessage: (configurationId: string, message: string, state?: Record<string, string>) => Promise<ReadableStream<ChatStreamChunk>>;
@@ -137,6 +149,11 @@ export interface AssistantThreadCompaction {
137
149
  /** The closed thread the new one continues. */
138
150
  readonly previousThreadId: string;
139
151
  }
152
+ /** A screenshot stored in an assistant thread. */
153
+ export interface AssistantImageUpload {
154
+ /** The id a tool result references the image by, as `assistant-image:<imageId>`. */
155
+ readonly imageId: string;
156
+ }
140
157
  /** A closed assistant thread, as the panel paints it above the thread that continues it. */
141
158
  export interface AssistantEarlierThread {
142
159
  readonly threadId: string;
@@ -9,5 +9,5 @@ export { MemoryAuthorizedPhoenixApiClient } from './memory-authorized-client.js'
9
9
  export { MemoryAuthenticatedClientPhoenixApiClient, memoryStorage } from './memory-authenticated-client.js';
10
10
  export { createUnsignedJWT } from './unsigned-jwt.js';
11
11
  export type { components as ApiTypes } from './phoenix-api.js';
12
- export type { ConfigurationPayload, ConfigurationSchema, ChatConfiguration, ChatConversation, ChatEmbedding, ChatMessageParam, ChatToolCallResult, Entity, UnauthenticatedPhoenixApiClient, AuthenticatedClientPhoenixApiClient, AuthorizedPhoenixApiClient, AssistantChatConnection, AssistantEarlierThread, AssistantThreadCompaction, OAuthProvider, OAuthAccessTokenResult, GoogleOAuthConfig, ReleaseToProductionResult, SharePointSiteConfig, } from './contract.js';
12
+ export type { ConfigurationPayload, ConfigurationSchema, ChatConfiguration, ChatConversation, ChatEmbedding, ChatMessageParam, ChatToolCallResult, Entity, UnauthenticatedPhoenixApiClient, AuthenticatedClientPhoenixApiClient, AuthorizedPhoenixApiClient, AssistantChatConnection, AssistantEarlierThread, AssistantImageUpload, AssistantThreadCompaction, OAuthProvider, OAuthAccessTokenResult, GoogleOAuthConfig, ReleaseToProductionResult, SharePointSiteConfig, } from './contract.js';
13
13
  export { AssistantRequestError, InvalidAccessKeyError, InvalidDeploymentError, ChunkNotFoundError, OAuthStaleConnectionError, ConfigurationSchemaMismatchError, isConfigurationSchemaMismatchError, } from './contract.js';
@@ -1,5 +1,5 @@
1
1
  import type { ChatMessageContentChunk, ChatToolCalls } from '@salsita-ai/contracts/chat';
2
- import type { AssistantChatConnection, AssistantEarlierThread, AssistantThreadCompaction, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
2
+ import type { AssistantChatConnection, AssistantEarlierThread, AssistantImageUpload, AssistantThreadCompaction, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
3
3
  import { LocalStorageAuthenticatedClientPhoenixApiClient } from './local-authenticated-client.js';
4
4
  /**
5
5
  * Local storage implementation for local dev, it does not check for schema changes, so you may need to create new configuration if the schema changes and
@@ -17,6 +17,8 @@ export declare class LocalStorageAuthorizedPhoenixApiClient<FINALIZE_DATA extend
17
17
  getAssistantChatConnection: () => AssistantChatConnection;
18
18
  compactAssistantThread: () => Promise<AssistantThreadCompaction>;
19
19
  getAssistantEarlierThread: () => Promise<AssistantEarlierThread>;
20
+ uploadAssistantImage: () => Promise<AssistantImageUpload>;
21
+ getAssistantImage: () => Promise<Blob>;
20
22
  getChatConversation: (configurationId: string) => Promise<readonly {
21
23
  readonly augmentation?: import("./phoenix-api.js").components['schemas']['ChatMessageAugmentation'];
22
24
  readonly content?: string;
@@ -1 +1 @@
1
- import*as t from"uuid";import{ChunkType as e}from"@salsita-ai/contracts/chat";import{LocalStorageAuthenticatedClientPhoenixApiClient as o}from"./local-authenticated-client.js";let r=(t,o)=>{let r={role:"assistant",content:["I see","Yes","Definitely"][Math.round(2*Math.random())]};return localStorage.setItem(`${o}-chat`,JSON.stringify([...t,r])),Promise.resolve(new ReadableStream({start(t){t.enqueue({type:e.content,content:r.content??""}),t.close()}}))};export class LocalStorageAuthorizedPhoenixApiClient extends o{getConfigurationData=t=>{let e=JSON.parse(localStorage.getItem(t)??"[]");if(!e||0===e.length)throw Error("Configuration not found!");return e};getConfiguration=t=>{let e=this.getConfigurationData(t);return Promise.resolve(e[e.length-1])};updateConfiguration=(e,o)=>{let r=this.getConfigurationData(e),n=t.v4(),a={...o,configurationId:e,revisionId:n,modelVersion:this._modelVersion};return localStorage.setItem(e,JSON.stringify([...r,a])),Promise.resolve({revisionId:n})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(t,e)=>{let o=this.getConfigurationData(t).find(t=>t.revisionId===e);if(!o)throw Error("Revision not found!");return Promise.resolve(o)};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};compactAssistantThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getAssistantEarlierThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getChatConversation=async t=>JSON.parse(localStorage.getItem(`${t}-chat`)??"[]");sendMessage=async(t,e)=>{let o=await this.getChatConversation(t);return localStorage.setItem(`${t}-chat`,JSON.stringify([...o,e])),r(o,t)};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async t=>r(await this.getChatConversation(t),t);generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(t,e)=>{let o=localStorage.getItem(t);if(!o)throw Error("Configuration not found");let r=JSON.parse(o).find(t=>t.revisionId===e);if(!r)throw Error("Revision not found");return this.createConfiguration(r)}}
1
+ import*as t from"uuid";import{ChunkType as e}from"@salsita-ai/contracts/chat";import{LocalStorageAuthenticatedClientPhoenixApiClient as r}from"./local-authenticated-client.js";let o=(t,r)=>{let o={role:"assistant",content:["I see","Yes","Definitely"][Math.round(2*Math.random())]};return localStorage.setItem(`${r}-chat`,JSON.stringify([...t,o])),Promise.resolve(new ReadableStream({start(t){t.enqueue({type:e.content,content:o.content??""}),t.close()}}))};export class LocalStorageAuthorizedPhoenixApiClient extends r{getConfigurationData=t=>{let e=JSON.parse(localStorage.getItem(t)??"[]");if(!e||0===e.length)throw Error("Configuration not found!");return e};getConfiguration=t=>{let e=this.getConfigurationData(t);return Promise.resolve(e[e.length-1])};updateConfiguration=(e,r)=>{let o=this.getConfigurationData(e),n=t.v4(),a={...r,configurationId:e,revisionId:n,modelVersion:this._modelVersion};return localStorage.setItem(e,JSON.stringify([...o,a])),Promise.resolve({revisionId:n})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(t,e)=>{let r=this.getConfigurationData(t).find(t=>t.revisionId===e);if(!r)throw Error("Revision not found!");return Promise.resolve(r)};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};compactAssistantThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getAssistantEarlierThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};uploadAssistantImage=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getAssistantImage=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getChatConversation=async t=>JSON.parse(localStorage.getItem(`${t}-chat`)??"[]");sendMessage=async(t,e)=>{let r=await this.getChatConversation(t);return localStorage.setItem(`${t}-chat`,JSON.stringify([...r,e])),o(r,t)};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async t=>o(await this.getChatConversation(t),t);generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(t,e)=>{let r=localStorage.getItem(t);if(!r)throw Error("Configuration not found");let o=JSON.parse(r).find(t=>t.revisionId===e);if(!o)throw Error("Revision not found");return this.createConfiguration(o)}}
@@ -1,4 +1,4 @@
1
- import type { AssistantChatConnection, AssistantEarlierThread, AssistantThreadCompaction, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
1
+ import type { AssistantChatConnection, AssistantEarlierThread, AssistantImageUpload, AssistantThreadCompaction, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
2
2
  import { MemoryAuthenticatedClientPhoenixApiClient } from './memory-authenticated-client.js';
3
3
  /**
4
4
  * Memory implementation for local dev, it does not check for schema changes, so you may need to create new configuration if the schema changes and
@@ -17,6 +17,9 @@ export declare class MemoryAuthorizedPhoenixApiClient<FINALIZE_DATA extends Reco
17
17
  getAssistantChatConnection: () => AssistantChatConnection;
18
18
  compactAssistantThread: () => Promise<AssistantThreadCompaction>;
19
19
  getAssistantEarlierThread: () => Promise<AssistantEarlierThread>;
20
+ private readonly _assistantImages;
21
+ uploadAssistantImage: (configurationId: string, image: Blob) => Promise<AssistantImageUpload>;
22
+ getAssistantImage: (configurationId: string, imageId: string) => Promise<Blob>;
20
23
  sendMessage: () => Promise<never>;
21
24
  getSpeechToText: () => Promise<never>;
22
25
  getTextToSpeech: () => Promise<never>;
@@ -1 +1 @@
1
- import*as e from"uuid";import{MemoryAuthenticatedClientPhoenixApiClient as t,memoryStorage as r}from"./memory-authenticated-client.js";export class MemoryAuthorizedPhoenixApiClient extends t{getConfigurationData=e=>{let t=r.get(e);if(!t||!t||0===t.length)throw Error("Configuration not found!");return t};getConfiguration=e=>{let t=this.getConfigurationData(e);return Promise.resolve(t[t.length-1])};updateConfiguration=(t,o)=>{let n=this.getConfigurationData(t),i=e.v4(),a={...o,configurationId:t,revisionId:i,modelVersion:this._modelVersion};return r.set(t,[...n,a]),Promise.resolve({revisionId:i})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(e,t)=>{let r=this.getConfigurationData(e).find(e=>e.revisionId===t);if(!r)throw Error("Revision not found!");return Promise.resolve(r)};getChatConversation=async()=>{throw Error("Not implemented!")};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};compactAssistantThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getAssistantEarlierThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};sendMessage=async()=>{throw Error("Not implemented!")};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async()=>{throw Error("Not implemented!")};generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(e,t)=>{let o=r.get(e);if(!o)throw Error("Configuration not found");let n=o.find(e=>e.revisionId===t);if(!n)throw Error("Revision not found");return this.createConfiguration(n)}}
1
+ import*as t from"uuid";import{MemoryAuthenticatedClientPhoenixApiClient as e,memoryStorage as r}from"./memory-authenticated-client.js";export class MemoryAuthorizedPhoenixApiClient extends e{getConfigurationData=t=>{let e=r.get(t);if(!e||!e||0===e.length)throw Error("Configuration not found!");return e};getConfiguration=t=>{let e=this.getConfigurationData(t);return Promise.resolve(e[e.length-1])};updateConfiguration=(e,o)=>{let n=this.getConfigurationData(e),i=t.v4(),a={...o,configurationId:e,revisionId:i,modelVersion:this._modelVersion};return r.set(e,[...n,a]),Promise.resolve({revisionId:i})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(t,e)=>{let r=this.getConfigurationData(t).find(t=>t.revisionId===e);if(!r)throw Error("Revision not found!");return Promise.resolve(r)};getChatConversation=async()=>{throw Error("Not implemented!")};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};compactAssistantThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getAssistantEarlierThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};_assistantImages=new Map;uploadAssistantImage=async(e,r)=>{let o=t.v4();return this._assistantImages.set(`${e}/${o}`,r),{imageId:o}};getAssistantImage=async(t,e)=>{let r=this._assistantImages.get(`${t}/${e}`);if(!r)throw Error(`Assistant image ${e} was not uploaded for configuration ${t} through this client. Upload it before reading it.`);return r};sendMessage=async()=>{throw Error("Not implemented!")};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async()=>{throw Error("Not implemented!")};generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(t,e)=>{let o=r.get(t);if(!o)throw Error("Configuration not found");let n=o.find(t=>t.revisionId===e);if(!n)throw Error("Revision not found");return this.createConfiguration(n)}}