@salsita-ai/sdk 0.50.0-develop.dbf0122072 → 0.50.0-develop.dede205ab0

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 (714) hide show
  1. package/README.md +1 -1
  2. package/dist/admin/create-admin-pages-from-spec.d.ts +1 -1
  3. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  4. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  5. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  6. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  7. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  8. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  9. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  10. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  11. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  12. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  13. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  14. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  15. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  16. package/dist/application-spec/generate-application/code/templates/domain.js +3 -3
  17. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +1 -1
  18. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +2 -1
  19. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +1 -2
  20. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +8 -4
  21. package/dist/application-spec/index.d.ts +0 -1
  22. package/dist/application-spec/index.js +1 -1
  23. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  24. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +1 -1
  25. package/dist/client/authorized-client.d.ts +3 -1
  26. package/dist/client/authorized-client.js +1 -1
  27. package/dist/client/contract.d.ts +34 -0
  28. package/dist/client/contract.js +1 -1
  29. package/dist/client/index.d.ts +2 -2
  30. package/dist/client/index.js +1 -1
  31. package/dist/client/local-authorized-client.d.ts +3 -1
  32. package/dist/client/local-authorized-client.js +1 -1
  33. package/dist/client/memory-authorized-client.d.ts +3 -1
  34. package/dist/client/memory-authorized-client.js +1 -1
  35. package/dist/client/phoenix-api.d.ts +269 -30
  36. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +56 -2
  37. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  38. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  39. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  40. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  41. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +2 -1
  42. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -1
  43. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -2
  44. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  45. package/dist/configurator/ui/assistant/thread-items.d.ts +13 -2
  46. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  47. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +84 -98
  48. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  49. package/dist/docs/index.json +1 -1
  50. package/dist/docs/layouts/custom-price.mdx +14 -16
  51. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  52. package/dist/docs/other-features/domain-actions.mdx +1 -1
  53. package/dist/docs/other-features/side-effects.mdx +42 -34
  54. package/dist/docs/other-features/transformers.mdx +1 -1
  55. package/dist/docs/phoenix/admin.mdx +9 -24
  56. package/dist/docs/phoenix/deployments.mdx +1 -1
  57. package/dist/docs/phoenix/localization.mdx +3 -22
  58. package/dist/docs/phoenix/phoenix-cli.mdx +21 -21
  59. package/dist/docs/phoenix/project-structure.mdx +6 -0
  60. package/dist/docs/phoenix/sdk-builder-workflow.mdx +6 -6
  61. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  62. package/dist/docs/relations/hierarchy.mdx +13 -2
  63. package/dist/domain/admin-domain/__generated/enhanced-model.d.ts +1 -2
  64. package/dist/domain/admin-domain/__generated/model/versions/v1.d.ts +1 -1
  65. package/dist/domain/admin-domain/__generated/model/versions/v2.d.ts +1 -1
  66. package/dist/domain/admin-domain/__generated/model/versions/v3.d.ts +1 -1
  67. package/dist/domain/admin-domain/__generated/model/versions/v4.d.ts +1 -1
  68. package/dist/domain/admin-domain/__generated/model/versions/v5.d.ts +1 -1
  69. package/dist/domain/admin-domain/__generated/model/versions/v6.d.ts +2 -2
  70. package/dist/domain/admin-domain/__generated/model/versions/v6.js +1 -1
  71. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +1 -4
  72. package/dist/domain/admin-domain/implementation/common-admin-migrations.d.ts +1 -1
  73. package/dist/domain/admin-domain/index.d.ts +3 -4
  74. package/dist/domain/admin-domain/index.js +1 -1
  75. package/dist/domain/application/admin-page-factories.d.ts +1 -1
  76. package/dist/domain/application/application-config.d.ts +23 -13
  77. package/dist/domain/application/assistant/assistant-manifest.d.ts +2 -0
  78. package/dist/domain/application/assistant/assistant-value-type.js +1 -1
  79. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  80. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +3 -0
  81. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  82. package/dist/domain/application/assistant/index.d.ts +1 -0
  83. package/dist/domain/application/assistant/index.js +1 -1
  84. package/dist/domain/application/assistant-field-options.d.ts +1 -2
  85. package/dist/domain/application/assistant-mutations.d.ts +1 -4
  86. package/dist/domain/application/assistant-mutations.js +1 -1
  87. package/dist/domain/application/assistant-recipe-groups.d.ts +1 -5
  88. package/dist/domain/application/configurator-builder.d.ts +30 -16
  89. package/dist/domain/application/configurator-builder.js +1 -1
  90. package/dist/domain/application/element-registration.d.ts +5 -0
  91. package/dist/domain/application/element-registration.js +1 -1
  92. package/dist/domain/application/handler-registration.d.ts +5 -0
  93. package/dist/domain/application/handler-registration.js +1 -1
  94. package/dist/domain/application/index.d.ts +5 -5
  95. package/dist/domain/application/index.js +1 -1
  96. package/dist/domain/application/published-data/create-finalize-admin-domain.d.ts +1 -2
  97. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +1 -1
  98. package/dist/domain/application/published-data/map-published-data.d.ts +1 -2
  99. package/dist/domain/application/resolve-imported-transformers.d.ts +12 -2
  100. package/dist/domain/application/resolve-imported-transformers.js +1 -1
  101. package/dist/domain/available-system-components.js +1 -1
  102. package/dist/domain/{actions → core/action}/action-factory.d.ts +5 -4
  103. package/dist/domain/core/{action.d.ts → action/action.d.ts} +6 -7
  104. package/dist/domain/core/action/index.d.ts +2 -0
  105. package/dist/domain/core/action/index.js +1 -0
  106. package/dist/domain/{components → core/component}/component-reader-types.d.ts +1 -2
  107. package/dist/domain/{components → core/component}/debug-state-component.d.ts +1 -1
  108. package/dist/domain/core/component/debug-state-component.js +1 -0
  109. package/dist/domain/{components → core/component}/domain-component-optic.d.ts +6 -6
  110. package/dist/domain/core/component/domain-component-optic.js +16 -0
  111. package/dist/domain/{components → core/component}/drag-state-component.d.ts +1 -1
  112. package/dist/domain/core/component/drag-state-component.js +1 -0
  113. package/dist/domain/{components → core/component}/export-state-component.d.ts +1 -1
  114. package/dist/domain/core/component/export-state-component.js +1 -0
  115. package/dist/domain/{components → core/component}/fullscreen-state-component.d.ts +1 -1
  116. package/dist/domain/core/component/fullscreen-state-component.js +1 -0
  117. package/dist/domain/{components → core/component}/group-components-by-entity-id-and-name.d.ts +1 -2
  118. package/dist/domain/core/component/group-components-by-entity-id-and-name.js +1 -0
  119. package/dist/domain/{components → core/component}/hover-state-component.d.ts +1 -1
  120. package/dist/domain/core/component/hover-state-component.js +1 -0
  121. package/dist/domain/core/component/index.d.ts +18 -0
  122. package/dist/domain/core/component/index.js +1 -0
  123. package/dist/domain/{components → core/component}/legacy-filter.d.ts +2 -2
  124. package/dist/domain/{components → core/component}/navigation-state-component.d.ts +1 -1
  125. package/dist/domain/core/component/navigation-state-component.js +1 -0
  126. package/dist/domain/{components → core/component}/selection-state-component.d.ts +1 -1
  127. package/dist/domain/core/component/selection-state-component.js +1 -0
  128. package/dist/domain/{components → core/component}/system-component-builder.d.ts +1 -2
  129. package/dist/domain/core/component/system-component-builder.js +1 -0
  130. package/dist/domain/{components → core/component}/system-component-filter.d.ts +3 -3
  131. package/dist/domain/core/component/system-virtual-entity.js +1 -0
  132. package/dist/domain/{components → core/component}/tool-state-component.d.ts +1 -1
  133. package/dist/domain/core/component/tool-state-component.js +1 -0
  134. package/dist/domain/{components → core/component}/updates.d.ts +1 -2
  135. package/dist/domain/{components → core/component}/view-state-component.d.ts +1 -1
  136. package/dist/domain/core/component/view-state-component.js +1 -0
  137. package/dist/domain/{components → core/component}/viewport-state-component.d.ts +1 -1
  138. package/dist/domain/core/component/viewport-state-component.js +1 -0
  139. package/dist/domain/core/decoder/create-decoder.d.ts +6 -0
  140. package/dist/domain/core/decoder/create-decoder.js +1 -0
  141. package/dist/domain/core/decoder/decoder.d.ts +6 -0
  142. package/dist/domain/core/decoder/index.d.ts +2 -0
  143. package/dist/domain/core/decoder/index.js +1 -0
  144. package/dist/domain/core/domain-factory.d.ts +4 -5
  145. package/dist/domain/core/domain-factory.js +1 -1
  146. package/dist/domain/core/domain.d.ts +3 -4
  147. package/dist/domain/core/domain.js +1 -1
  148. package/dist/domain/core/expression/aliased-expressions.d.ts +10 -0
  149. package/dist/domain/{expressions → core/expression}/constant-expressions.d.ts +2 -3
  150. package/dist/domain/core/expression/constant-expressions.js +1 -0
  151. package/dist/domain/{expressions → core/expression}/custom-expression.d.ts +4 -5
  152. package/dist/domain/core/expression/custom-expression.js +1 -0
  153. package/dist/domain/core/{expression.d.ts → expression/expression.d.ts} +6 -8
  154. package/dist/domain/core/expression/index.d.ts +4 -0
  155. package/dist/domain/core/expression/index.js +1 -0
  156. package/dist/domain/core/index.d.ts +11 -17
  157. package/dist/domain/core/index.js +1 -1
  158. package/dist/domain/{invariants → core/invariant}/builtin-invariant.d.ts +2 -2
  159. package/dist/domain/{invariants → core/invariant}/custom-invariants.d.ts +2 -3
  160. package/dist/domain/core/invariant/custom-invariants.js +1 -0
  161. package/dist/domain/core/invariant/index.d.ts +5 -0
  162. package/dist/domain/core/invariant/index.js +1 -0
  163. package/dist/domain/{invariants → core/invariant}/invariants.d.ts +12 -4
  164. package/dist/domain/core/invariant/invariants.js +1 -0
  165. package/dist/domain/core/invariant/violation-component.js +1 -0
  166. package/dist/domain/{invariants → core/invariant}/violation.d.ts +2 -2
  167. package/dist/domain/core/{component.d.ts → model/component.d.ts} +1 -1
  168. package/dist/domain/core/model/index.d.ts +6 -0
  169. package/dist/domain/core/model/index.js +1 -0
  170. package/dist/domain/core/{reflection.d.ts → model/reflection.d.ts} +1 -1
  171. package/dist/domain/core/model/reflection.js +1 -0
  172. package/dist/domain/core/recipe/index.d.ts +1 -0
  173. package/dist/domain/core/recipe/index.js +1 -0
  174. package/dist/domain/{domain-context/recipe-system → core/recipe}/recipes.d.ts +1 -3
  175. package/dist/domain/core/recipe/recipes.js +1 -0
  176. package/dist/domain/{relations → core/relation}/all-of-type-relation.d.ts +3 -4
  177. package/dist/domain/core/relation/all-of-type-relation.js +1 -0
  178. package/dist/domain/{relations → core/relation}/component-factories.d.ts +1 -2
  179. package/dist/domain/core/relation/component-factories.js +1 -0
  180. package/dist/domain/{relations → core/relation}/composed-of.d.ts +1 -1
  181. package/dist/domain/core/relation/composed-of.js +1 -0
  182. package/dist/domain/{relations → core/relation}/direct-relation.d.ts +2 -3
  183. package/dist/domain/core/relation/index.d.ts +9 -0
  184. package/dist/domain/core/relation/index.js +1 -0
  185. package/dist/domain/{relations → core/relation}/indirect-relation.d.ts +3 -4
  186. package/dist/domain/core/relation/indirect-relation.js +1 -0
  187. package/dist/domain/{relations → core/relation}/reference-component.d.ts +4 -5
  188. package/dist/domain/core/relation/reference-component.js +1 -0
  189. package/dist/domain/{relations → core/relation}/reference-field.d.ts +1 -1
  190. package/dist/domain/{relations → core/relation}/relation-factory.d.ts +2 -3
  191. package/dist/domain/{relations → core/relation}/relation-implementation.d.ts +3 -4
  192. package/dist/domain/core/schema/enhanced-json-schema.js +1 -0
  193. package/dist/domain/core/schema/extended-schema-validator.js +1 -0
  194. package/dist/domain/core/schema/index.d.ts +3 -0
  195. package/dist/domain/core/schema/index.js +1 -0
  196. package/dist/domain/core/schema/schema-validator.js +1 -0
  197. package/dist/domain/core/state/id-sequence.d.ts +15 -0
  198. package/dist/domain/core/state/id-sequence.js +1 -0
  199. package/dist/domain/core/state/index.d.ts +3 -0
  200. package/dist/domain/core/state/index.js +1 -0
  201. package/dist/domain/core/{migrations.d.ts → state/migrations.d.ts} +1 -2
  202. package/dist/domain/core/{state.d.ts → state/state.d.ts} +1 -2
  203. package/dist/domain/domain-builder.d.ts +11 -11
  204. package/dist/domain/domain-builder.js +1 -1
  205. package/dist/domain/domain-context/action-system/action-system.d.ts +1 -3
  206. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  207. package/dist/domain/domain-context/create-transformer.d.ts +1 -1
  208. package/dist/domain/domain-context/dimension-system/dimension-state.js +1 -1
  209. package/dist/domain/domain-context/dimension-system/dimension-system.d.ts +1 -2
  210. package/dist/domain/domain-context/domain-context-systems.d.ts +1 -3
  211. package/dist/domain/domain-context/index.d.ts +1 -2
  212. package/dist/domain/domain-context/index.js +1 -1
  213. package/dist/domain/domain-context/navigation-system/navigation-system.d.ts +3 -5
  214. package/dist/domain/domain-context/navigation-system/navigation-system.js +1 -1
  215. package/dist/domain/domain-context/navigation-system/navigation-updates.d.ts +1 -12
  216. package/dist/domain/domain-context/navigation-system/navigation-updates.js +1 -1
  217. package/dist/domain/domain-context/navigation-system/selection-transformers.d.ts +1 -1
  218. package/dist/domain/domain-context/navigation-system/selection-transformers.js +1 -1
  219. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.d.ts +1 -3
  220. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.js +1 -1
  221. package/dist/domain/domain-context/relation-transformers/cascade-deletes.d.ts +1 -1
  222. package/dist/domain/domain-context/relation-transformers/cascade-deletes.js +1 -1
  223. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.d.ts +1 -1
  224. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.js +1 -1
  225. package/dist/domain/domain-context/relation-transformers/create-entity-refs.d.ts +1 -1
  226. package/dist/domain/domain-context/relation-transformers/create-entity-refs.js +2 -2
  227. package/dist/domain/domain-context/relation-transformers/replace-refs.d.ts +1 -1
  228. package/dist/domain/domain-context/relation-transformers/replace-refs.js +1 -1
  229. package/dist/domain/domain-context/store-system/apply-updates.d.ts +1 -3
  230. package/dist/domain/domain-context/store-system/apply-updates.js +1 -1
  231. package/dist/domain/domain-context/store-system/next-domain-entity-id.d.ts +1 -13
  232. package/dist/domain/domain-context/store-system/next-domain-entity-id.js +1 -1
  233. package/dist/domain/domain-context/store-system/reconcile-projected-entities.d.ts +1 -2
  234. package/dist/domain/domain-context/store-system/reconcile-projected-entities.js +1 -1
  235. package/dist/domain/domain-context/store-system/store-system.d.ts +1 -5
  236. package/dist/domain/domain-context/store-system/store-system.js +2 -2
  237. package/dist/domain/domain-context/store-system/system-state.d.ts +1 -3
  238. package/dist/domain/domain-context/store-system/system-state.js +1 -1
  239. package/dist/domain/domain-context/transformers/actions-builder.d.ts +1 -2
  240. package/dist/domain/domain-context/transformers/actions-builder.js +1 -1
  241. package/dist/domain/domain-context/transformers/auto-snap-transformer.d.ts +1 -3
  242. package/dist/domain/domain-context/transformers/chain-builder.d.ts +2 -2
  243. package/dist/domain/domain-context/transformers/context.d.ts +1 -5
  244. package/dist/domain/domain-context/transformers/entity-builder.d.ts +1 -5
  245. package/dist/domain/domain-context/transformers/entity-builder.js +1 -1
  246. package/dist/domain/domain-context/transformers/then-builder.d.ts +1 -2
  247. package/dist/domain/domain-context/transformers/then-builder.js +1 -1
  248. package/dist/domain/domain-context/transformers/when-builder.d.ts +1 -6
  249. package/dist/domain/domain-context/transformers/when-builder.js +1 -1
  250. package/dist/domain/domain-context/undo-system.d.ts +1 -1
  251. package/dist/domain/domain-runtime/domain-context/component-reader.d.ts +1 -4
  252. package/dist/domain/domain-runtime/domain-context/component-reader.js +1 -1
  253. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +2 -4
  254. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  255. package/dist/domain/domain-runtime/spec/index.d.ts +3 -0
  256. package/dist/domain/domain-runtime/spec/index.js +1 -1
  257. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  258. package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.d.ts +1 -2
  259. package/dist/domain/{actions → domain-runtime/spec}/prepare-action-implementations.d.ts +1 -1
  260. package/dist/domain/domain-runtime/spec/prepare-action-implementations.js +5 -0
  261. package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.d.ts +1 -1
  262. package/dist/domain/domain-runtime/spec/types.d.ts +1 -2
  263. package/dist/domain/{system-components → extensions}/angle-indicator.d.ts +1 -1
  264. package/dist/domain/extensions/angle-indicator.js +1 -0
  265. package/dist/domain/extensions/attribute-switch.js +1 -0
  266. package/dist/domain/{system-components → extensions}/autorotate-camera-component.d.ts +1 -1
  267. package/dist/domain/extensions/autorotate-camera-component.js +1 -0
  268. package/dist/domain/{system-components → extensions}/basic-sidebar-footer.d.ts +1 -1
  269. package/dist/domain/extensions/basic-sidebar-footer.js +1 -0
  270. package/dist/domain/extensions/camera-based-hidden-entity-object.js +1 -0
  271. package/dist/domain/extensions/camera-based-hidden-entity.js +1 -0
  272. package/dist/domain/{system-components → extensions}/canvas-config.d.ts +1 -1
  273. package/dist/domain/extensions/canvas-config.js +1 -0
  274. package/dist/domain/extensions/canvas-custom-environment.js +1 -0
  275. package/dist/domain/{system-components → extensions}/canvas-padding.d.ts +1 -1
  276. package/dist/domain/extensions/canvas-padding.js +1 -0
  277. package/dist/domain/{system-components → extensions}/canvas-preset-environment.d.ts +1 -1
  278. package/dist/domain/extensions/canvas-preset-environment.js +1 -0
  279. package/dist/domain/{system-components → extensions}/child-entity-recipe-hierarchy.d.ts +2 -2
  280. package/dist/domain/extensions/child-entity-recipe-hierarchy.js +1 -0
  281. package/dist/domain/extensions/client-side-image.js +1 -0
  282. package/dist/domain/extensions/color-value.js +1 -0
  283. package/dist/domain/{system-components → extensions}/common/angle-indicator-schema.d.ts +1 -1
  284. package/dist/domain/extensions/common/angle-indicator-schema.js +1 -0
  285. package/dist/domain/{system-components → extensions}/common/dimension-indicator-schema.d.ts +1 -1
  286. package/dist/domain/extensions/common/dimension-indicator-schema.js +1 -0
  287. package/dist/domain/extensions/common/index.d.ts +4 -0
  288. package/dist/domain/extensions/common/index.js +1 -0
  289. package/dist/domain/{system-components → extensions}/custom-header.d.ts +2 -2
  290. package/dist/domain/{system-components → extensions}/custom-header.js +1 -1
  291. package/dist/domain/extensions/custom-price-footer.js +1 -0
  292. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.d.ts +2 -2
  293. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.js +1 -1
  294. package/dist/domain/{system-components → extensions}/dimension-indicator.d.ts +1 -1
  295. package/dist/domain/extensions/dimension-indicator.js +1 -0
  296. package/dist/domain/{system-components → extensions}/editable-angle-indicator.d.ts +3 -2
  297. package/dist/domain/extensions/editable-angle-indicator.js +1 -0
  298. package/dist/domain/{system-components → extensions}/editable-distance-dimension-indicator.d.ts +3 -2
  299. package/dist/domain/extensions/editable-distance-dimension-indicator.js +1 -0
  300. package/dist/domain/{system-components → extensions}/editable-offset-indicator.d.ts +3 -2
  301. package/dist/domain/extensions/editable-offset-indicator.js +1 -0
  302. package/dist/domain/{system-components → extensions}/editable-size-indicator.d.ts +3 -2
  303. package/dist/domain/extensions/editable-size-indicator.js +1 -0
  304. package/dist/domain/{system-components → extensions}/entity-header.d.ts +1 -1
  305. package/dist/domain/extensions/entity-header.js +1 -0
  306. package/dist/domain/{system-components → extensions}/exit-tool-mode-fab.d.ts +1 -1
  307. package/dist/domain/extensions/exit-tool-mode-fab.js +1 -0
  308. package/dist/domain/{system-components → extensions}/finalize-action.d.ts +1 -1
  309. package/dist/domain/extensions/finalize-action.js +1 -0
  310. package/dist/domain/extensions/finalize-component.js +1 -0
  311. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -0
  312. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -0
  313. package/dist/domain/{system-components → extensions}/fixed-header.d.ts +1 -1
  314. package/dist/domain/extensions/fixed-header.js +1 -0
  315. package/dist/domain/{system-components → extensions}/floating-header.d.ts +1 -1
  316. package/dist/domain/extensions/floating-header.js +1 -0
  317. package/dist/domain/{system-components → extensions}/hidden-header.d.ts +1 -1
  318. package/dist/domain/extensions/hidden-header.js +1 -0
  319. package/dist/domain/{system-components → extensions}/hidden-sidebar-footer.d.ts +1 -1
  320. package/dist/domain/extensions/hidden-sidebar-footer.js +1 -0
  321. package/dist/domain/{system-components → extensions}/horizontal-tabs.d.ts +1 -1
  322. package/dist/domain/extensions/horizontal-tabs.js +1 -0
  323. package/dist/domain/extensions/index.d.ts +69 -0
  324. package/dist/domain/extensions/index.js +1 -0
  325. package/dist/domain/{system-components → extensions}/list-selector-dimension-indicator.d.ts +3 -2
  326. package/dist/domain/extensions/list-selector-dimension-indicator.js +1 -0
  327. package/dist/domain/extensions/multilingual-text-value.js +1 -0
  328. package/dist/domain/extensions/navigation-steps.js +1 -0
  329. package/dist/domain/{system-components → extensions}/offset-anchors.d.ts +1 -1
  330. package/dist/domain/extensions/offset-anchors.js +1 -0
  331. package/dist/domain/{system-components → extensions}/offset-indicator.d.ts +1 -2
  332. package/dist/domain/extensions/offset-indicator.js +1 -0
  333. package/dist/domain/{system-components → extensions}/offset.d.ts +1 -1
  334. package/dist/domain/extensions/offset.js +1 -0
  335. package/dist/domain/{system-components → extensions}/other-action.d.ts +1 -1
  336. package/dist/domain/extensions/other-action.js +1 -0
  337. package/dist/domain/{system-components → extensions}/property-page.d.ts +2 -2
  338. package/dist/domain/extensions/property-page.js +1 -0
  339. package/dist/domain/{system-components → extensions}/read-sidebar-footer.d.ts +1 -1
  340. package/dist/domain/extensions/read-sidebar-footer.js +1 -0
  341. package/dist/domain/{system-components → extensions}/replace-entity-recipe-hierarchy.d.ts +2 -2
  342. package/dist/domain/extensions/replace-entity-recipe-hierarchy.js +1 -0
  343. package/dist/domain/extensions/rotatable.js +1 -0
  344. package/dist/domain/extensions/rotation-handle.js +1 -0
  345. package/dist/domain/extensions/save-template-thumbnail.js +1 -0
  346. package/dist/domain/{system-components → extensions}/scene-entity-add-fab.d.ts +1 -1
  347. package/dist/domain/extensions/scene-entity-add-fab.js +1 -0
  348. package/dist/domain/extensions/scene-entity-animation.js +1 -0
  349. package/dist/domain/extensions/scene-entity-control.js +1 -0
  350. package/dist/domain/{system-components → extensions}/scene-entity-delete-fab.d.ts +1 -1
  351. package/dist/domain/extensions/scene-entity-delete-fab.js +1 -0
  352. package/dist/domain/extensions/scene-entity-floor-object.js +1 -0
  353. package/dist/domain/{system-components → extensions}/scene-entity-html-hotspot.d.ts +1 -1
  354. package/dist/domain/extensions/scene-entity-html-hotspot.js +1 -0
  355. package/dist/domain/{system-components → extensions}/scene-entity-navigation-hotspot.d.ts +1 -1
  356. package/dist/domain/extensions/scene-entity-navigation-hotspot.js +1 -0
  357. package/dist/domain/{system-components → extensions}/scene-entity-object-html-hotspot.d.ts +1 -1
  358. package/dist/domain/extensions/scene-entity-object-html-hotspot.js +1 -0
  359. package/dist/domain/{system-components → extensions}/scene-entity-select-hotspot.d.ts +1 -1
  360. package/dist/domain/extensions/scene-entity-select-hotspot.js +1 -0
  361. package/dist/domain/extensions/scene-entity-wall-object.js +1 -0
  362. package/dist/domain/extensions/selectable-component.js +1 -0
  363. package/dist/domain/{system-components → extensions}/sidebar-tabs.d.ts +1 -1
  364. package/dist/domain/extensions/sidebar-tabs.js +1 -0
  365. package/dist/domain/extensions/simple-summary.js +1 -0
  366. package/dist/domain/{system-components → extensions}/size.d.ts +1 -1
  367. package/dist/domain/extensions/size.js +1 -0
  368. package/dist/domain/{system-components → extensions}/sketching-draw.d.ts +1 -1
  369. package/dist/domain/extensions/sketching-draw.js +1 -0
  370. package/dist/domain/{system-components → extensions}/sketching-edit.d.ts +2 -2
  371. package/dist/domain/extensions/sketching-edit.js +1 -0
  372. package/dist/domain/extensions/summary-component.js +1 -0
  373. package/dist/domain/extensions/text-value.js +1 -0
  374. package/dist/domain/extensions/tool-controls.js +1 -0
  375. package/dist/domain/{system-components → extensions}/tool-menu-fab.d.ts +2 -2
  376. package/dist/domain/extensions/tool-menu-fab.js +1 -0
  377. package/dist/domain/{system-components → extensions}/toolbar.d.ts +2 -2
  378. package/dist/domain/{system-components → extensions}/toolbar.js +1 -1
  379. package/dist/domain/{system-components → extensions}/universal-sidebar-footer.d.ts +1 -1
  380. package/dist/domain/extensions/universal-sidebar-footer.js +1 -0
  381. package/dist/domain/extensions/view-controls.js +1 -0
  382. package/dist/domain/index.d.ts +3 -32
  383. package/dist/domain/index.js +1 -1
  384. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +1 -1
  385. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  386. package/dist/domain/project-modules/index.d.ts +1 -0
  387. package/dist/domain/project-modules/index.js +1 -0
  388. package/dist/domain/project-modules/project-modules.d.ts +41 -0
  389. package/dist/domain/project-modules/project-modules.js +1 -0
  390. package/dist/domain/projections/blender-projections/blender-projections.d.ts +1 -1
  391. package/dist/domain/projections/blender-projections/blender-projections.js +1 -1
  392. package/dist/domain/projections/composition-projections.js +1 -1
  393. package/dist/domain/projections/projected-entities-projections.d.ts +1 -2
  394. package/dist/domain/projections/snap-matching.d.ts +1 -2
  395. package/dist/domain/projections/snap-utils.d.ts +1 -2
  396. package/dist/domain/projections/validation-projections.d.ts +1 -2
  397. package/dist/domain/projections/validation-projections.js +1 -1
  398. package/dist/domain/system-components/admin-sidebar.d.ts +1 -1
  399. package/dist/domain/system-components/admin-sidebar.js +1 -1
  400. package/dist/domain/system-components/angle-dimension.js +1 -1
  401. package/dist/domain/system-components/application-config.d.ts +1 -1
  402. package/dist/domain/system-components/application-config.js +1 -1
  403. package/dist/domain/system-components/attribute-selection.js +1 -1
  404. package/dist/domain/system-components/bounding-box-component.d.ts +1 -1
  405. package/dist/domain/system-components/bounding-box-component.js +1 -1
  406. package/dist/domain/system-components/bounding-sphere-component.d.ts +1 -1
  407. package/dist/domain/system-components/bounding-sphere-component.js +1 -1
  408. package/dist/domain/system-components/child-entity-recipes.d.ts +1 -1
  409. package/dist/domain/system-components/child-entity-recipes.js +1 -1
  410. package/dist/domain/system-components/child-entity-selection.d.ts +1 -2
  411. package/dist/domain/system-components/child-entity-selection.js +1 -1
  412. package/dist/domain/system-components/collision-box-geometry.d.ts +1 -1
  413. package/dist/domain/system-components/collision-box-geometry.js +1 -1
  414. package/dist/domain/system-components/collision-geometries.d.ts +1 -1
  415. package/dist/domain/system-components/collision-geometry.d.ts +1 -1
  416. package/dist/domain/system-components/collision-geometry.js +1 -1
  417. package/dist/domain/system-components/collision-point-geometry.d.ts +1 -1
  418. package/dist/domain/system-components/collision-point-geometry.js +1 -1
  419. package/dist/domain/system-components/common/index.d.ts +0 -4
  420. package/dist/domain/system-components/common/index.js +1 -1
  421. package/dist/domain/system-components/common/recipes.d.ts +1 -2
  422. package/dist/domain/system-components/constraint.d.ts +1 -1
  423. package/dist/domain/system-components/constraint.js +1 -1
  424. package/dist/domain/system-components/create-blueprint.d.ts +1 -1
  425. package/dist/domain/system-components/custom-scene-entity.d.ts +1 -1
  426. package/dist/domain/system-components/custom-scene-entity.js +1 -1
  427. package/dist/domain/system-components/detail.js +1 -1
  428. package/dist/domain/system-components/distance-dimension-select.d.ts +1 -1
  429. package/dist/domain/system-components/distance-dimension-select.js +1 -1
  430. package/dist/domain/system-components/distance-dimension.d.ts +1 -1
  431. package/dist/domain/system-components/distance-dimension.js +1 -1
  432. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  433. package/dist/domain/system-components/drag-handle.js +1 -1
  434. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  435. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  436. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  437. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  438. package/dist/domain/system-components/generic-dimension.d.ts +1 -1
  439. package/dist/domain/system-components/generic-dimension.js +1 -1
  440. package/dist/domain/system-components/hidden-entity.js +1 -1
  441. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -2
  442. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  443. package/dist/domain/system-components/index.d.ts +0 -68
  444. package/dist/domain/system-components/index.js +1 -1
  445. package/dist/domain/system-components/material-override-property-transition.js +1 -1
  446. package/dist/domain/system-components/material-override-transformer.js +1 -1
  447. package/dist/domain/system-components/material-swatch.js +1 -1
  448. package/dist/domain/system-components/navigation-page.js +1 -1
  449. package/dist/domain/system-components/navigation-panel-list.js +1 -1
  450. package/dist/domain/system-components/pivot-point.d.ts +1 -1
  451. package/dist/domain/system-components/pivot-point.js +1 -1
  452. package/dist/domain/system-components/price.js +1 -1
  453. package/dist/domain/system-components/projected-entities.d.ts +1 -1
  454. package/dist/domain/system-components/projected-entities.js +1 -1
  455. package/dist/domain/system-components/replace-entity-recipes.d.ts +1 -1
  456. package/dist/domain/system-components/replace-entity-recipes.js +1 -1
  457. package/dist/domain/system-components/scene-entity-ambient-light.js +1 -1
  458. package/dist/domain/system-components/scene-entity-box-object.js +1 -1
  459. package/dist/domain/system-components/scene-entity-directional-light.js +1 -1
  460. package/dist/domain/system-components/scene-entity-local-material-override.js +1 -1
  461. package/dist/domain/system-components/scene-entity-material-override.js +1 -1
  462. package/dist/domain/system-components/scene-entity-object-clip.js +1 -1
  463. package/dist/domain/system-components/scene-entity-object-decal.js +1 -1
  464. package/dist/domain/system-components/scene-entity-object-group.js +1 -1
  465. package/dist/domain/system-components/scene-entity-object-local-material-override.js +1 -1
  466. package/dist/domain/system-components/scene-entity-object-material-override.js +1 -1
  467. package/dist/domain/system-components/scene-entity-object-properties.js +1 -1
  468. package/dist/domain/system-components/scene-entity-object-remote-material-override.js +1 -1
  469. package/dist/domain/system-components/scene-entity-object-text-decal.js +1 -1
  470. package/dist/domain/system-components/scene-entity-object-transformer.js +1 -1
  471. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.js +1 -1
  472. package/dist/domain/system-components/scene-entity-object.js +1 -1
  473. package/dist/domain/system-components/scene-entity-point-light.js +1 -1
  474. package/dist/domain/system-components/scene-entity-properties.js +1 -1
  475. package/dist/domain/system-components/scene-entity-rect-area-light.js +1 -1
  476. package/dist/domain/system-components/scene-entity-remote-material-override.js +1 -1
  477. package/dist/domain/system-components/scene-entity-remote-object.js +1 -1
  478. package/dist/domain/system-components/scene-entity-spot-light.js +1 -1
  479. package/dist/domain/system-components/scene-entity-transimissive-material-override.js +1 -1
  480. package/dist/domain/system-components/sketching-line.d.ts +1 -1
  481. package/dist/domain/system-components/sketching-line.js +1 -1
  482. package/dist/domain/system-components/sketching-rectangle.d.ts +1 -1
  483. package/dist/domain/system-components/sketching-rectangle.js +1 -1
  484. package/dist/domain/system-components/sketching.d.ts +1 -1
  485. package/dist/domain/system-components/sketching.js +1 -1
  486. package/dist/domain/system-components/snap-axis.d.ts +1 -1
  487. package/dist/domain/system-components/snap-axis.js +1 -1
  488. package/dist/domain/system-components/snap-edge.d.ts +1 -1
  489. package/dist/domain/system-components/snap-edge.js +1 -1
  490. package/dist/domain/system-components/snap-plane.d.ts +1 -1
  491. package/dist/domain/system-components/snap-plane.js +1 -1
  492. package/dist/domain/system-components/snap-point.d.ts +1 -1
  493. package/dist/domain/system-components/snap-point.js +1 -1
  494. package/dist/domain/system-components/static-orthographic-camera-component.d.ts +1 -1
  495. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  496. package/dist/domain/system-components/static-perspective-camera-component.d.ts +1 -1
  497. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  498. package/dist/domain/utils/eval-cache.d.ts +1 -2
  499. package/dist/domain/utils/memo-eval.d.ts +1 -3
  500. package/dist/editor/domain-editors/use-implementation-files.d.ts +7 -6
  501. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  502. package/dist/i18n/locales/cs/messages.js +1 -1
  503. package/dist/i18n/locales/da/messages.js +1 -1
  504. package/dist/i18n/locales/de/messages.js +1 -1
  505. package/dist/i18n/locales/de-AT/messages.js +1 -1
  506. package/dist/i18n/locales/en/messages.js +1 -1
  507. package/dist/i18n/locales/en-AU/messages.js +1 -1
  508. package/dist/i18n/locales/en-GB/messages.js +1 -1
  509. package/dist/i18n/locales/es/messages.js +1 -1
  510. package/dist/i18n/locales/fr/messages.js +1 -1
  511. package/dist/i18n/locales/hu/messages.js +1 -1
  512. package/dist/i18n/locales/it/messages.js +1 -1
  513. package/dist/i18n/locales/nl/messages.js +1 -1
  514. package/dist/i18n/locales/pl/messages.js +1 -1
  515. package/dist/i18n/locales/pt/messages.js +1 -1
  516. package/dist/i18n/locales/ro/messages.js +1 -1
  517. package/dist/i18n/locales/sk/messages.js +1 -1
  518. package/dist/i18n/locales/tr/messages.js +1 -1
  519. package/dist/legacy/domain-cli/gen/configurator-builder.js +21 -8
  520. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  521. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  522. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  523. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  524. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  525. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  526. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  527. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  528. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  529. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  530. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  531. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  532. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  533. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  534. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  535. package/dist/phoenix/scripts/build-admin.js +1 -1
  536. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  537. package/dist/phoenix/services/variant-file-session.js +1 -1
  538. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  539. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  540. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  541. package/dist/ui-sdk/theme/types.d.ts +1 -1
  542. package/dist/webhook/builders/common.d.ts +3 -0
  543. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  544. package/dist/webhook/builders/webhook-builder.js +1 -1
  545. package/package.json +3 -3
  546. package/dist/application-spec/assistant/generate-assistant-prompt.d.ts +0 -13
  547. package/dist/application-spec/assistant/generate-assistant-prompt.js +0 -1
  548. package/dist/application-spec/assistant/index.d.ts +0 -1
  549. package/dist/application-spec/assistant/index.js +0 -1
  550. package/dist/domain/actions/prepare-action-implementations.js +0 -5
  551. package/dist/domain/components/debug-state-component.js +0 -1
  552. package/dist/domain/components/domain-component-optic.js +0 -16
  553. package/dist/domain/components/drag-state-component.js +0 -1
  554. package/dist/domain/components/export-state-component.js +0 -1
  555. package/dist/domain/components/fullscreen-state-component.js +0 -1
  556. package/dist/domain/components/group-components-by-entity-id-and-name.js +0 -1
  557. package/dist/domain/components/hover-state-component.js +0 -1
  558. package/dist/domain/components/index.d.ts +0 -2
  559. package/dist/domain/components/index.js +0 -1
  560. package/dist/domain/components/navigation-state-component.js +0 -1
  561. package/dist/domain/components/selection-state-component.js +0 -1
  562. package/dist/domain/components/system-component-builder.js +0 -1
  563. package/dist/domain/components/system-virtual-entity.js +0 -1
  564. package/dist/domain/components/tool-state-component.js +0 -1
  565. package/dist/domain/components/view-state-component.js +0 -1
  566. package/dist/domain/components/viewport-state-component.js +0 -1
  567. package/dist/domain/core/json-schema.js +0 -1
  568. package/dist/domain/core/reflection.js +0 -1
  569. package/dist/domain/domain-context/recipe-system/recipes.js +0 -1
  570. package/dist/domain/expressions/constant-expressions.js +0 -1
  571. package/dist/domain/expressions/custom-expression.js +0 -1
  572. package/dist/domain/expressions/index.d.ts +0 -1
  573. package/dist/domain/expressions/index.js +0 -1
  574. package/dist/domain/invariants/custom-invariants.js +0 -1
  575. package/dist/domain/invariants/invariants.js +0 -1
  576. package/dist/domain/invariants/violation-component.js +0 -1
  577. package/dist/domain/relations/all-of-type-relation.js +0 -1
  578. package/dist/domain/relations/component-factories.js +0 -1
  579. package/dist/domain/relations/composed-of.js +0 -1
  580. package/dist/domain/relations/indirect-relation.js +0 -1
  581. package/dist/domain/relations/reference-component.js +0 -1
  582. package/dist/domain/system-components/angle-indicator.js +0 -1
  583. package/dist/domain/system-components/attribute-switch.js +0 -1
  584. package/dist/domain/system-components/autorotate-camera-component.js +0 -1
  585. package/dist/domain/system-components/basic-sidebar-footer.js +0 -1
  586. package/dist/domain/system-components/camera-based-hidden-entity-object.js +0 -1
  587. package/dist/domain/system-components/camera-based-hidden-entity.js +0 -1
  588. package/dist/domain/system-components/canvas-config.js +0 -1
  589. package/dist/domain/system-components/canvas-custom-environment.js +0 -1
  590. package/dist/domain/system-components/canvas-padding.js +0 -1
  591. package/dist/domain/system-components/canvas-preset-environment.js +0 -1
  592. package/dist/domain/system-components/child-entity-recipe-hierarchy.js +0 -1
  593. package/dist/domain/system-components/client-side-image.js +0 -1
  594. package/dist/domain/system-components/color-value.js +0 -1
  595. package/dist/domain/system-components/common/angle-indicator-schema.js +0 -1
  596. package/dist/domain/system-components/common/dimension-indicator-schema.js +0 -1
  597. package/dist/domain/system-components/custom-price-footer.js +0 -1
  598. package/dist/domain/system-components/dimension-indicator.js +0 -1
  599. package/dist/domain/system-components/editable-angle-indicator.js +0 -1
  600. package/dist/domain/system-components/editable-distance-dimension-indicator.js +0 -1
  601. package/dist/domain/system-components/editable-offset-indicator.js +0 -1
  602. package/dist/domain/system-components/editable-size-indicator.js +0 -1
  603. package/dist/domain/system-components/entity-header.js +0 -1
  604. package/dist/domain/system-components/exit-tool-mode-fab.js +0 -1
  605. package/dist/domain/system-components/finalize-action.js +0 -1
  606. package/dist/domain/system-components/finalize-component.js +0 -1
  607. package/dist/domain/system-components/fit-selection-orthographic-camera-component.js +0 -1
  608. package/dist/domain/system-components/fit-selection-perspective-camera-component.js +0 -1
  609. package/dist/domain/system-components/fixed-header.js +0 -1
  610. package/dist/domain/system-components/floating-header.js +0 -1
  611. package/dist/domain/system-components/hidden-header.js +0 -1
  612. package/dist/domain/system-components/hidden-sidebar-footer.js +0 -1
  613. package/dist/domain/system-components/horizontal-tabs.js +0 -1
  614. package/dist/domain/system-components/list-selector-dimension-indicator.js +0 -1
  615. package/dist/domain/system-components/multilingual-text-value.js +0 -1
  616. package/dist/domain/system-components/navigation-steps.js +0 -1
  617. package/dist/domain/system-components/offset-anchors.js +0 -1
  618. package/dist/domain/system-components/offset-indicator.js +0 -1
  619. package/dist/domain/system-components/offset.js +0 -1
  620. package/dist/domain/system-components/other-action.js +0 -1
  621. package/dist/domain/system-components/property-page.js +0 -1
  622. package/dist/domain/system-components/read-sidebar-footer.js +0 -1
  623. package/dist/domain/system-components/replace-entity-recipe-hierarchy.js +0 -1
  624. package/dist/domain/system-components/rotatable.js +0 -1
  625. package/dist/domain/system-components/rotation-handle.js +0 -1
  626. package/dist/domain/system-components/save-template-thumbnail.js +0 -1
  627. package/dist/domain/system-components/scene-entity-add-fab.js +0 -1
  628. package/dist/domain/system-components/scene-entity-animation.js +0 -1
  629. package/dist/domain/system-components/scene-entity-control.js +0 -1
  630. package/dist/domain/system-components/scene-entity-delete-fab.js +0 -1
  631. package/dist/domain/system-components/scene-entity-floor-object.js +0 -1
  632. package/dist/domain/system-components/scene-entity-html-hotspot.js +0 -1
  633. package/dist/domain/system-components/scene-entity-navigation-hotspot.js +0 -1
  634. package/dist/domain/system-components/scene-entity-object-html-hotspot.js +0 -1
  635. package/dist/domain/system-components/scene-entity-select-hotspot.js +0 -1
  636. package/dist/domain/system-components/scene-entity-wall-object.js +0 -1
  637. package/dist/domain/system-components/selectable-component.js +0 -1
  638. package/dist/domain/system-components/sidebar-tabs.js +0 -1
  639. package/dist/domain/system-components/simple-summary.js +0 -1
  640. package/dist/domain/system-components/size.js +0 -1
  641. package/dist/domain/system-components/sketching-draw.js +0 -1
  642. package/dist/domain/system-components/sketching-edit.js +0 -1
  643. package/dist/domain/system-components/summary-component.js +0 -1
  644. package/dist/domain/system-components/text-value.js +0 -1
  645. package/dist/domain/system-components/tool-controls.js +0 -1
  646. package/dist/domain/system-components/tool-menu-fab.js +0 -1
  647. package/dist/domain/system-components/universal-sidebar-footer.js +0 -1
  648. package/dist/domain/system-components/view-controls.js +0 -1
  649. /package/dist/domain/{actions → core/action}/action-factory.js +0 -0
  650. /package/dist/domain/core/{action.js → action/action.js} +0 -0
  651. /package/dist/domain/{components → core/component}/component-reader-types.js +0 -0
  652. /package/dist/domain/{components → core/component}/legacy-filter.js +0 -0
  653. /package/dist/domain/{components → core/component}/system-component-filter.js +0 -0
  654. /package/dist/domain/{components → core/component}/system-virtual-entity.d.ts +0 -0
  655. /package/dist/domain/{components → core/component}/updates.js +0 -0
  656. /package/dist/domain/core/{enhanced-json-schema.js → decoder/decoder.js} +0 -0
  657. /package/dist/domain/core/{expression.js → expression/aliased-expressions.js} +0 -0
  658. /package/dist/domain/core/{schema-validator.js → expression/expression.js} +0 -0
  659. /package/dist/domain/{invariants → core/invariant}/builtin-invariant.js +0 -0
  660. /package/dist/domain/{invariants → core/invariant}/violation-component.d.ts +0 -0
  661. /package/dist/domain/{invariants → core/invariant}/violation.js +0 -0
  662. /package/dist/domain/core/{alias.d.ts → model/alias.d.ts} +0 -0
  663. /package/dist/domain/core/{alias.js → model/alias.js} +0 -0
  664. /package/dist/domain/core/{common-definitions.d.ts → model/common-definitions.d.ts} +0 -0
  665. /package/dist/domain/core/{common-definitions.js → model/common-definitions.js} +0 -0
  666. /package/dist/domain/core/{component.js → model/component.js} +0 -0
  667. /package/dist/domain/core/{model.d.ts → model/model.d.ts} +0 -0
  668. /package/dist/domain/core/{model.js → model/model.js} +0 -0
  669. /package/dist/domain/core/{preset.d.ts → model/preset.d.ts} +0 -0
  670. /package/dist/domain/core/{preset.js → model/preset.js} +0 -0
  671. /package/dist/domain/{relations → core/relation}/direct-relation.js +0 -0
  672. /package/dist/domain/{relations → core/relation}/reference-field.js +0 -0
  673. /package/dist/domain/{relations → core/relation}/relation-factory.js +0 -0
  674. /package/dist/domain/{relations → core/relation}/relation-implementation.js +0 -0
  675. /package/dist/domain/core/{schema-validator-ajv.d.ts → schema/create-ajv-schema-validator.d.ts} +0 -0
  676. /package/dist/domain/core/{schema-validator-ajv.js → schema/create-ajv-schema-validator.js} +0 -0
  677. /package/dist/domain/core/{schema-validator-csp.d.ts → schema/create-csp-schema-validator.d.ts} +0 -0
  678. /package/dist/domain/core/{schema-validator-csp.js → schema/create-csp-schema-validator.js} +0 -0
  679. /package/dist/domain/core/{enhanced-json-schema.d.ts → schema/enhanced-json-schema.d.ts} +0 -0
  680. /package/dist/domain/core/{json-schema.d.ts → schema/extended-schema-validator.d.ts} +0 -0
  681. /package/dist/domain/core/{schema-validator.d.ts → schema/schema-validator.d.ts} +0 -0
  682. /package/dist/domain/core/{migrations.js → state/migrations.js} +0 -0
  683. /package/dist/domain/core/{state.js → state/state.js} +0 -0
  684. /package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.js +0 -0
  685. /package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.js +0 -0
  686. /package/dist/domain/{system-components → extensions}/attribute-switch.d.ts +0 -0
  687. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity-object.d.ts +0 -0
  688. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity.d.ts +0 -0
  689. /package/dist/domain/{system-components → extensions}/canvas-custom-environment.d.ts +0 -0
  690. /package/dist/domain/{system-components → extensions}/client-side-image.d.ts +0 -0
  691. /package/dist/domain/{system-components → extensions}/color-value.d.ts +0 -0
  692. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.d.ts +0 -0
  693. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.js +0 -0
  694. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.d.ts +0 -0
  695. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.js +0 -0
  696. /package/dist/domain/{system-components → extensions}/custom-price-footer.d.ts +0 -0
  697. /package/dist/domain/{system-components → extensions}/finalize-component.d.ts +0 -0
  698. /package/dist/domain/{system-components → extensions}/fit-selection-orthographic-camera-component.d.ts +0 -0
  699. /package/dist/domain/{system-components → extensions}/fit-selection-perspective-camera-component.d.ts +0 -0
  700. /package/dist/domain/{system-components → extensions}/multilingual-text-value.d.ts +0 -0
  701. /package/dist/domain/{system-components → extensions}/navigation-steps.d.ts +0 -0
  702. /package/dist/domain/{system-components → extensions}/rotatable.d.ts +0 -0
  703. /package/dist/domain/{system-components → extensions}/rotation-handle.d.ts +0 -0
  704. /package/dist/domain/{system-components → extensions}/save-template-thumbnail.d.ts +0 -0
  705. /package/dist/domain/{system-components → extensions}/scene-entity-animation.d.ts +0 -0
  706. /package/dist/domain/{system-components → extensions}/scene-entity-control.d.ts +0 -0
  707. /package/dist/domain/{system-components → extensions}/scene-entity-floor-object.d.ts +0 -0
  708. /package/dist/domain/{system-components → extensions}/scene-entity-wall-object.d.ts +0 -0
  709. /package/dist/domain/{system-components → extensions}/selectable-component.d.ts +0 -0
  710. /package/dist/domain/{system-components → extensions}/simple-summary.d.ts +0 -0
  711. /package/dist/domain/{system-components → extensions}/summary-component.d.ts +0 -0
  712. /package/dist/domain/{system-components → extensions}/text-value.d.ts +0 -0
  713. /package/dist/domain/{system-components → extensions}/tool-controls.d.ts +0 -0
  714. /package/dist/domain/{system-components → extensions}/view-controls.d.ts +0 -0
package/README.md CHANGED
@@ -99,7 +99,7 @@ The `package.json` `exports` map is the machine-readable list, and the TypeScrip
99
99
 
100
100
  - `pnpm phoenix docs -s "<topic>"` searches the bundled documentation; `phoenix docs -r <path>` reads a page.
101
101
  - `phoenix sync` generates agent skills into `.claude/skills/` and `.agents/skills/`, so coding agents know the project conventions and the CLI.
102
- - Studio, where you sign in and manage projects, has builder guides for getting started, the CLI and deployments.
102
+ - The builder docs at [docs.salsita.ai](https://docs.salsita.ai) have the guides for getting started and the CLI reference; Studio is where you sign in and manage projects.
103
103
  - `pnpm phoenix feedback "<message>"` reaches the team directly.
104
104
 
105
105
  Existing projects may still call the legacy `domain-cli`, `webhook-cli`, `deployment-cli` and `embedding-cli` binaries, which remain installed for compatibility. New automation uses `phoenix`.
@@ -2,7 +2,7 @@ import type { AdminPagesSpec, DataSpec, DomainComponentOptic, NavigationListItem
2
2
  type AdminPageComponent = DomainComponentOptic<any, any, any, any, any, any, SystemComponentTypeConstraint>;
3
3
  type AdminPageNavigationItem = NavigationListItem | NestedNavigationListItem;
4
4
  export declare const createAdminPagesFromSpec: (spec: AdminPagesSpec, dataSpec?: DataSpec) => {
5
- components: (import("../domain/components/domain-component-optic.js").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Admin, import("#package/domain").SystemComponentType<"navigationPanelList", import("#package/domain").NavigationPanelListComponentState, never>> | import("../domain/components/domain-component-optic.js").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Preset, import("#package/domain").SystemComponentType<"attributeSelection", import("#package/domain").AttributeSelectionComponentState, "value">> | AdminPageComponent)[];
5
+ components: (import("#package/domain").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Admin, import("#package/domain").SystemComponentType<"navigationPanelList", import("#package/domain").NavigationPanelListComponentState, never>> | import("#package/domain").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Preset, import("#package/domain").SystemComponentType<"attributeSelection", import("#package/domain").AttributeSelectionComponentState, "value">> | AdminPageComponent)[];
6
6
  pages: AdminPageNavigationItem[];
7
7
  };
8
8
  export {};
@@ -3,3 +3,4 @@ export * from './code-imports.js';
3
3
  export * from './exported-type-declarations.js';
4
4
  export * from './env-reader.js';
5
5
  export * from './file-headers.js';
6
+ export * from './project-module-list.js';
@@ -1 +1 @@
1
- export*from"./application-type-imports.js";export*from"./code-imports.js";export*from"./exported-type-declarations.js";export*from"./env-reader.js";export*from"./file-headers.js";
1
+ export*from"./application-type-imports.js";export*from"./code-imports.js";export*from"./exported-type-declarations.js";export*from"./env-reader.js";export*from"./file-headers.js";export*from"./project-module-list.js";
@@ -0,0 +1,8 @@
1
+ /** The default imports of one convention folder's files, as a generated barrel lists them. */
2
+ export declare const generateProjectModuleImports: (files: readonly string[], prefix: string) => readonly string[];
3
+ /**
4
+ * The origin-tagged module list a generated barrel exports for one convention folder. The barrel only
5
+ * pairs each default export with its project path; the SDK validates and merges the exports, so that an
6
+ * invalid file is reported by name and the built app and the editor's hot reload share one implementation.
7
+ */
8
+ export declare const generateProjectModuleList: (files: readonly string[], prefix: string) => string;
@@ -0,0 +1,3 @@
1
+ export const generateProjectModuleImports=(e,t)=>e.map((e,r)=>`import ${t}${r} from '../${e.replace(/\.tsx?$/,".js")}'`);export const generateProjectModuleList=(e,t)=>{if(0===e.length)return"[]";let r=e.map((e,r)=>` { origin: '${e}', exports: ${t}${r} },`);return`[
2
+ ${r.join("\n")}
3
+ ]`};
@@ -1 +1 @@
1
- import{GeneratedApplicationFile as n}from"../../core/index.js";import{createApplicationTypeImportRegistrar as e}from"./common/index.js";import{generateAdminGlobalBindingBlock as i,generateApplicationSpecAdminCode as o,generateApplicationSpecAdminFrontendCode as t,generateApplicationSpecAdminGlobals as a,generateApplicationSpecConfiguratorCode as r,generateApplicationSpecConfiguratorConfig as s,generateApplicationSpecConfiguratorFrontendCode as d,generateApplicationSpecConfiguratorGlobals as c,generateApplicationSpecDomainFile as g,generateApplicationSpecDomainSpecFile as m,generateApplicationSpecGlobals as p,generateApplicationSpecTypesModule as l,generateConfiguratorGlobalBindingBlock as f,generateImportedStateConstants as B,generatePhxExportsBlock as u,generatePhxGlobalsBlock as x,generateStateConstants as h}from"./templates/index.js";import{splitWebhookMembership as k}from"./webhook-safe-files.js";let y=()=>"";export const globalPhxBindingStrategy={generateApplicationTypesFile:(e,i)=>n("globals.d.ts",p(e,i)),generateDomainBindingBlock:x,generateStateConstants:h,generateConfiguratorBindingBlock:f,configuratorBindingDescription:"Creates the configurator interface and sets phx.frontend — must run before any user code imports.",generateAdminBindingBlock:i,adminBindingDescription:"Creates the admin interface and sets phx.frontend.admin — must run before admin user code imports."};export const modulePhxBindingStrategy={applicationTypeImportSource:"./application-types.js",generateApplicationTypesFile:(e,i)=>n("application-types.ts",l(e,i)),generateDomainBindingBlock:u,generateStateConstants:B,generateConfiguratorBindingBlock:y,configuratorBindingDescription:"Creates and exports the configurator interface for a module-scoped phx binding.",generateAdminBindingBlock:y,adminBindingDescription:"Creates and exports the admin interface for a module-scoped phx binding."};let C=n=>n.map(n=>n.file.name);export const generateDomainRuntimeFiles=(i,p)=>{let{applicationSpec:l,categorizedFiles:f,phxDefinitions:B,includeDefaultEnvs:u}=i,x=e(p.applicationTypeImportSource),h=C(f.expressions),y=C(f.actions),b=C(f.handlers),D=C(f.elements),S=C(f.transformers),A=C(f.invariants),F=C(f.adminInvariants),j=C(f.adminExpressions),I=C(f.adminElements),T=k(f.components),w=C(T.webhookIncluded),v=C(T.frontendOnly),E=k(f.adminComponents),O=C(E.webhookIncluded),P=C(E.frontendOnly);return[n("domain-spec.ts",m(l,{generateBindingBlock:p.generateDomainBindingBlock,generateStateConstants:p.generateStateConstants,registerApplicationTypeImports:x})),n("configurator-globals.ts",c(p.generateConfiguratorBindingBlock,p.configuratorBindingDescription)),n("configurator-domain-code.ts",r({expressionFiles:h,actionFiles:y,invariantFiles:A,componentFiles:w},x)),n("configurator-frontend-code.ts",d({transformerFiles:S,handlerFiles:b,elementFiles:D,componentFiles:v},x)),n("admin-domain-code.ts",o({adminExpressionFiles:j,adminInvariantFiles:F,adminComponentFiles:O},x)),n("admin-frontend-code.ts",t({adminElementFiles:I,adminComponentFiles:P},x)),n("domain.ts",g(l)),n("configurator-config.ts",s(l,{includeDefaultEnvs:u})),p.generateApplicationTypesFile(l,B),n("admin-globals.ts",a(p.generateAdminBindingBlock,p.adminBindingDescription))]};
1
+ import{GeneratedApplicationFile as n}from"../../core/index.js";import{createApplicationTypeImportRegistrar as e}from"./common/index.js";import{generateAdminGlobalBindingBlock as i,generateApplicationSpecAdminCode as o,generateApplicationSpecAdminFrontendCode as t,generateApplicationSpecAdminGlobals as a,generateApplicationSpecConfiguratorCode as r,generateApplicationSpecConfiguratorConfig as s,generateApplicationSpecConfiguratorFrontendCode as d,generateApplicationSpecConfiguratorGlobals as c,generateApplicationSpecDomainFile as g,generateApplicationSpecDomainSpecFile as m,generateApplicationSpecGlobals as p,generateApplicationSpecTypesModule as l,generateConfiguratorGlobalBindingBlock as f,generateImportedStateConstants as B,generatePhxExportsBlock as u,generatePhxGlobalsBlock as x,generateStateConstants as h}from"./templates/index.js";import{splitWebhookMembership as k}from"./webhook-safe-files.js";let y=()=>"";export const globalPhxBindingStrategy={generateApplicationTypesFile:(e,i)=>n("globals.d.ts",p(e,i)),generateDomainBindingBlock:x,generateStateConstants:h,generateConfiguratorBindingBlock:f,configuratorBindingDescription:"Creates the configurator interface and sets phx.frontend — must run before any user code imports.",generateAdminBindingBlock:i,adminBindingDescription:"Creates the admin interface and sets phx.frontend.admin — must run before admin user code imports."};export const modulePhxBindingStrategy={applicationTypeImportSource:"./application-types.js",generateApplicationTypesFile:(e,i)=>n("application-types.ts",l(e,i)),generateDomainBindingBlock:u,generateStateConstants:B,generateConfiguratorBindingBlock:y,configuratorBindingDescription:"Creates and exports the configurator interface for a module-scoped phx binding.",generateAdminBindingBlock:y,adminBindingDescription:"Creates and exports the admin interface for a module-scoped phx binding."};let C=n=>n.map(n=>n.file.name);export const generateDomainRuntimeFiles=(i,p)=>{let{applicationSpec:l,categorizedFiles:f,phxDefinitions:B,includeDefaultEnvs:u}=i,x=e(p.applicationTypeImportSource),h=C(f.expressions),y=C(f.actions),b=C(f.handlers),D=C(f.elements),S=C(f.transformers),A=C(f.invariants),F=C(f.adminInvariants),j=C(f.adminExpressions),I=C(f.adminElements),T=k(f.components),w=C(T.webhookIncluded),v=C(T.frontendOnly),E=k(f.adminComponents),O=C(E.webhookIncluded),P=C(E.frontendOnly);return[n("domain-spec.ts",m(l,{generateBindingBlock:p.generateDomainBindingBlock,generateStateConstants:p.generateStateConstants,registerApplicationTypeImports:x})),n("configurator-globals.ts",c(p.generateConfiguratorBindingBlock,p.configuratorBindingDescription)),n("configurator-domain-code.ts",r({expressionFiles:h,actionFiles:y,invariantFiles:A,componentFiles:w})),n("configurator-frontend-code.ts",d({transformerFiles:S,handlerFiles:b,elementFiles:D,componentFiles:v})),n("admin-domain-code.ts",o({adminExpressionFiles:j,adminInvariantFiles:F,adminComponentFiles:O})),n("admin-frontend-code.ts",t({adminElementFiles:I,adminComponentFiles:P})),n("domain.ts",g(l)),n("configurator-config.ts",s(l,{includeDefaultEnvs:u})),p.generateApplicationTypesFile(l,B),n("admin-globals.ts",a(p.generateAdminBindingBlock,p.adminBindingDescription))]};
@@ -1,8 +1,7 @@
1
- import { type ApplicationTypeImportRegistrar } from '../common/index.js';
2
1
  interface GenerateAdminCodeOptions {
3
2
  readonly adminExpressionFiles: readonly string[];
4
3
  readonly adminInvariantFiles: readonly string[];
5
4
  readonly adminComponentFiles: readonly string[];
6
5
  }
7
- export declare const generateApplicationSpecAdminCode: (options: GenerateAdminCodeOptions, registerApplicationTypeImports?: ApplicationTypeImportRegistrar) => string;
6
+ export declare const generateApplicationSpecAdminCode: (options: GenerateAdminCodeOptions) => string;
8
7
  export {};
@@ -1,17 +1,9 @@
1
- import{autoHeader as n}from"../common/file-headers.js";import{CodeImports as t,skipApplicationTypeImports as e}from"../common/index.js";let s=(n,t)=>n.map((n,e)=>{let s=`../${n.replace(/\.tsx?$/,".js")}`;return`import ${t}${e} from '${s}'`}),i=(n,t="\n")=>n.length>0?"\n"+n.join(t)+"\n":"";export const generateApplicationSpecAdminCode=(o,a=e)=>{let{adminExpressionFiles:r,adminInvariantFiles:m,adminComponentFiles:d}=o,p=new t;for(let n of["AliasedExpressions","AliasedInvariants","DomainComponentOptic","SystemComponentTypeConstraint"])p.addTypeImport("@salsita-ai/sdk/domain",n);a(p,["Admin","FrontendData","PublishedData","SessionData"]);let c=[...s(r,"adminExpressions"),...s(m,"adminInvariants"),...s(d,"adminComponents")],A=r.map((n,t)=>`for (const [type, exprs] of Object.entries(adminExpressions${t})) {
2
- mergedExpressions[type] = { ...mergedExpressions[type], ...exprs }
3
- }`),y=m.map((n,t)=>`for (const [type, invs] of Object.entries(adminInvariants${t})) {
4
- mergedInvariants[type] = [...(mergedInvariants[type] ?? []), ...invs]
5
- }`),l=d.map((n,t)=>`adminComponents${t}`);return`${n("admin-domain-code.ts","Barrel file for user-authored admin domain code — expressions, invariants and components.")}
6
- ${p.toString()}
7
- ${i(c)}
8
- const mergedExpressions: Record<string, Record<string, unknown>> = {}
9
- ${i(A,"\n\n")}
10
- export const customAdminExpressions = mergedExpressions as AliasedExpressions<Admin.AnyDomainEntity, Admin.RootEntity, PublishedData, SessionData, FrontendData, Admin.Aliases>
1
+ import{autoHeader as n}from"../common/file-headers.js";import{CodeImports as o,generateProjectModuleImports as e,generateProjectModuleList as t}from"../common/index.js";export const generateApplicationSpecAdminCode=i=>{let{adminExpressionFiles:s,adminInvariantFiles:r,adminComponentFiles:a}=i,d=new o;d.addTypeImport("@salsita-ai/sdk/domain","ProjectModule");let m=[...e(s,"adminExpressions"),...e(r,"adminInvariants"),...e(a,"adminComponents")];return`${n("admin-domain-code.ts","Barrel file for user-authored admin domain code — expressions, invariants and components.")}
2
+ ${d.toString()}
3
+ ${m.length>0?"\n"+m.join("\n")+"\n":""}
4
+ export const customAdminExpressions: readonly ProjectModule[] = ${t(s,"adminExpressions")}
11
5
 
12
- const mergedInvariants: Record<string, ReadonlyArray<unknown>> = {}
13
- ${i(y,"\n\n")}
14
- export const customAdminInvariants = mergedInvariants as AliasedInvariants<Admin.AnyDomainEntity, Admin.RootEntity, PublishedData, SessionData, FrontendData, Admin.Aliases, string>
6
+ export const customAdminInvariants: readonly ProjectModule[] = ${t(r,"adminInvariants")}
15
7
 
16
- export const customAdminComponentOptics: ReadonlyArray<DomainComponentOptic<Admin.AnyDomainEntity, Admin.RootEntity, PublishedData, SessionData, FrontendData, Admin.AnyDomainEntity, SystemComponentTypeConstraint>> = [${l.join(", ")}].flat()
8
+ export const customAdminComponentOptics: readonly ProjectModule[] = ${t(a,"adminComponents")}
17
9
  `};
@@ -1,7 +1,6 @@
1
- import { type ApplicationTypeImportRegistrar } from '../common/index.js';
2
1
  interface GenerateAdminFrontendCodeOptions {
3
2
  readonly adminElementFiles: readonly string[];
4
3
  readonly adminComponentFiles: readonly string[];
5
4
  }
6
- export declare const generateApplicationSpecAdminFrontendCode: (options: GenerateAdminFrontendCodeOptions, registerApplicationTypeImports?: ApplicationTypeImportRegistrar) => string;
5
+ export declare const generateApplicationSpecAdminFrontendCode: (options: GenerateAdminFrontendCodeOptions) => string;
7
6
  export {};
@@ -1,9 +1,9 @@
1
- import{autoHeader as n}from"../common/file-headers.js";import{CodeImports as t,skipApplicationTypeImports as e}from"../common/index.js";let o=(n,t)=>n.map((n,e)=>{let o=`../${n.replace(/\.tsx?$/,".js")}`;return`import ${t}${e} from '${o}'`});export const generateApplicationSpecAdminFrontendCode=(m,i=e)=>{let{adminElementFiles:a,adminComponentFiles:r}=m,d=new t;for(let n of["DomainComponentOptic","ElementRegistration","SystemComponentTypeConstraint"])d.addTypeImport("@salsita-ai/sdk/domain",n);i(d,["Admin","FrontendData","PublishedData","SessionData"]);let s=[...o(a,"adminElements"),...o(r,"frontendAdminComponents")],p=a.map((n,t)=>`adminElements${t}`),l=r.map((n,t)=>`frontendAdminComponents${t}`);return`${n("admin-frontend-code.ts","Barrel file for user-authored admin frontend code — elements and frontend-only components. Needs phx.frontend.admin.")}
2
- ${d.toString()}
1
+ import{autoHeader as n}from"../common/file-headers.js";import{CodeImports as e,generateProjectModuleImports as o,generateProjectModuleList as t}from"../common/index.js";export const generateApplicationSpecAdminFrontendCode=d=>{let{adminElementFiles:m,adminComponentFiles:r}=d,i=new e;i.addTypeImport("@salsita-ai/sdk/domain","ProjectModule");let s=[...o(m,"adminElements"),...o(r,"frontendAdminComponents")];return`${n("admin-frontend-code.ts","Barrel file for user-authored admin frontend code — elements and frontend-only components. Needs phx.frontend.admin.")}
2
+ ${i.toString()}
3
3
 
4
4
  import './admin-globals.js'
5
5
  ${s.length>0?"\n"+s.join("\n")+"\n":""}
6
- export const customAdminElements: readonly ElementRegistration[] = [${p.join(", ")}].flat()
6
+ export const customAdminElements: readonly ProjectModule[] = ${t(m,"adminElements")}
7
7
 
8
- export const customFrontendAdminComponentOptics: ReadonlyArray<DomainComponentOptic<Admin.AnyDomainEntity, Admin.RootEntity, PublishedData, SessionData, FrontendData, Admin.AnyDomainEntity, SystemComponentTypeConstraint>> = [${l.join(", ")}].flat()
8
+ export const customFrontendAdminComponentOptics: readonly ProjectModule[] = ${t(r,"frontendAdminComponents")}
9
9
  `};
@@ -1,9 +1,8 @@
1
- import { type ApplicationTypeImportRegistrar } from '../common/index.js';
2
1
  interface GenerateConfiguratorCodeOptions {
3
2
  readonly expressionFiles: readonly string[];
4
3
  readonly actionFiles: readonly string[];
5
4
  readonly invariantFiles: readonly string[];
6
5
  readonly componentFiles: readonly string[];
7
6
  }
8
- export declare const generateApplicationSpecConfiguratorCode: (options: GenerateConfiguratorCodeOptions, registerApplicationTypeImports?: ApplicationTypeImportRegistrar) => string;
7
+ export declare const generateApplicationSpecConfiguratorCode: (options: GenerateConfiguratorCodeOptions) => string;
9
8
  export {};
@@ -1,20 +1,11 @@
1
- import{autoHeader as t}from"../common/file-headers.js";import{CodeImports as n,skipApplicationTypeImports as e}from"../common/index.js";let o=(t,n)=>t.map((t,e)=>{let o=`../${t.replace(/\.tsx?$/,".js")}`;return`import ${n}${e} from '${o}'`}),a=(t,n="\n")=>t.length>0?"\n"+t.join(n)+"\n":"";export const generateApplicationSpecConfiguratorCode=(i,s=e)=>{let{expressionFiles:r,actionFiles:p,invariantFiles:m,componentFiles:d}=i,c=new n;for(let t of["ActionImplementations","AliasedExpressions","AliasedInvariants","DomainComponentOptic","SystemComponentTypeConstraint"])c.addTypeImport("@salsita-ai/sdk/domain",t);s(c,["$Map","ActionTypes","Aliases","AnyDomainEntity","ExportState","FrontendData","NavigationState","PublishedData","RootEntity","SessionData","ToolState","ViewState"]);let l=[...o(r,"expressions"),...o(p,"actions"),...o(m,"invariants"),...o(d,"components")],y=p.map((t,n)=>`...actions${n}`),D=r.map((t,n)=>`for (const [type, exprs] of Object.entries(expressions${n})) {
2
- mergedExpressions[type] = { ...mergedExpressions[type], ...exprs }
3
- }`),x=m.map((t,n)=>`for (const [type, invs] of Object.entries(invariants${n})) {
4
- mergedInvariants[type] = [...(mergedInvariants[type] ?? []), ...invs]
5
- }`),A=d.map((t,n)=>`components${n}`);return`${t("configurator-domain-code.ts","Barrel file for user-authored domain code — expressions, actions, invariants and components. Needs only phx.domain.")}
6
- ${c.toString()}
7
- ${a(l)}
8
- const mergedExpressions: Record<string, Record<string, unknown>> = {}
9
- ${a(D,"\n\n")}
10
- export const customExpressions = mergedExpressions as AliasedExpressions<AnyDomainEntity, RootEntity, PublishedData, SessionData, FrontendData, Aliases>
1
+ import{autoHeader as o}from"../common/file-headers.js";import{CodeImports as n,generateProjectModuleImports as e,generateProjectModuleList as t}from"../common/index.js";export const generateApplicationSpecConfiguratorCode=s=>{let{expressionFiles:r,actionFiles:i,invariantFiles:a,componentFiles:c}=s,d=new n;d.addTypeImport("@salsita-ai/sdk/domain","ProjectModule");let p=[...e(r,"expressions"),...e(i,"actions"),...e(a,"invariants"),...e(c,"components")];return`${o("configurator-domain-code.ts","Barrel file for user-authored domain code — expressions, actions, invariants and components. Needs only phx.domain.")}
2
+ ${d.toString()}
3
+ ${p.length>0?"\n"+p.join("\n")+"\n":""}
4
+ export const customExpressions: readonly ProjectModule[] = ${t(r,"expressions")}
11
5
 
12
- // A declared action without an implementation fails here; an implementation of an undeclared action fails in its own file.
13
- export const customActions: ActionImplementations<AnyDomainEntity, RootEntity, $Map, PublishedData, SessionData, FrontendData, NavigationState, ViewState, ToolState, ExportState, ActionTypes> = { ${y.join(", ")} }
6
+ export const customActions: readonly ProjectModule[] = ${t(i,"actions")}
14
7
 
15
- const mergedInvariants: Record<string, ReadonlyArray<unknown>> = {}
16
- ${a(x,"\n\n")}
17
- export const customInvariants = mergedInvariants as AliasedInvariants<AnyDomainEntity, RootEntity, PublishedData, SessionData, FrontendData, Aliases, string>
8
+ export const customInvariants: readonly ProjectModule[] = ${t(a,"invariants")}
18
9
 
19
- export const customComponentOptics: ReadonlyArray<DomainComponentOptic<AnyDomainEntity, RootEntity, PublishedData, SessionData, FrontendData, AnyDomainEntity, SystemComponentTypeConstraint>> = [${A.join(", ")}].flat()
10
+ export const customComponentOptics: readonly ProjectModule[] = ${t(c,"components")}
20
11
  `};
@@ -1,9 +1,8 @@
1
- import { type ApplicationTypeImportRegistrar } from '../common/index.js';
2
1
  interface GenerateConfiguratorFrontendCodeOptions {
3
2
  readonly transformerFiles: readonly string[];
4
3
  readonly handlerFiles: readonly string[];
5
4
  readonly elementFiles: readonly string[];
6
5
  readonly componentFiles: readonly string[];
7
6
  }
8
- export declare const generateApplicationSpecConfiguratorFrontendCode: (options: GenerateConfiguratorFrontendCodeOptions, registerApplicationTypeImports?: ApplicationTypeImportRegistrar) => string;
7
+ export declare const generateApplicationSpecConfiguratorFrontendCode: (options: GenerateConfiguratorFrontendCodeOptions) => string;
9
8
  export {};
@@ -1,15 +1,13 @@
1
- import{autoHeader as t}from"../common/file-headers.js";import{CodeImports as n,skipApplicationTypeImports as o}from"../common/index.js";let e=(t,n)=>t.map((t,o)=>{let e=`../${t.replace(/\.tsx?$/,".js")}`;return`import ${n}${o} from '${e}'`});export const generateApplicationSpecConfiguratorFrontendCode=(r,a=o)=>{let{transformerFiles:s,handlerFiles:i,elementFiles:m,componentFiles:p}=r,l=new n;for(let t of["DomainComponentOptic","ElementRegistration","HandlerRegistration","ImportedTransformer","SystemComponentTypeConstraint"])l.addTypeImport("@salsita-ai/sdk/domain",t);a(l,["$Map","AnyDomainEntity","ExportState","FrontendData","NavigationState","PublishedData","RootEntity","SessionData","ToolState","ViewState"]);let d=[...e(s,"transformers"),...e(i,"handlers"),...e(m,"elements"),...e(p,"frontendComponents")],f=s.map((t,n)=>{let o=t.replace(/^.*\//,"").replace(/\.tsx?$/,"");return` { name: '${o}', transformer: transformers${n} }`}),y=i.map((t,n)=>`handlers${n}`),c=m.map((t,n)=>`elements${n}`),$=p.map((t,n)=>`frontendComponents${n}`);return`${t("configurator-frontend-code.ts","Barrel file for user-authored frontend code — transformers, handlers, elements and frontend-only components. Needs phx.frontend.")}
2
- ${l.toString()}
1
+ import{autoHeader as o}from"../common/file-headers.js";import{CodeImports as e,generateProjectModuleImports as n,generateProjectModuleList as r}from"../common/index.js";export const generateApplicationSpecConfiguratorFrontendCode=t=>{let{transformerFiles:s,handlerFiles:d,elementFiles:l,componentFiles:a}=t,m=new e;m.addTypeImport("@salsita-ai/sdk/domain","ProjectModule");let c=[...n(s,"transformers"),...n(d,"handlers"),...n(l,"elements"),...n(a,"frontendComponents")];return`${o("configurator-frontend-code.ts","Barrel file for user-authored frontend code — transformers, handlers, elements and frontend-only components. Needs phx.frontend.")}
2
+ ${m.toString()}
3
3
 
4
4
  import './configurator-globals.js'
5
- ${d.length>0?"\n"+d.join("\n")+"\n":""}
6
- export const customTransformers: ReadonlyArray<ImportedTransformer<AnyDomainEntity, RootEntity, $Map, NavigationState, ViewState, ToolState, ExportState>> = [
7
- ${f.join(",\n")}
8
- ]
5
+ ${c.length>0?"\n"+c.join("\n")+"\n":""}
6
+ export const customTransformers: readonly ProjectModule[] = ${r(s,"transformers")}
9
7
 
10
- export const customHandlers: ReadonlyArray<HandlerRegistration<any, any>> = [${y.join(", ")}].flat()
8
+ export const customHandlers: readonly ProjectModule[] = ${r(d,"handlers")}
11
9
 
12
- export const customElements: readonly ElementRegistration[] = [${c.join(", ")}].flat()
10
+ export const customElements: readonly ProjectModule[] = ${r(l,"elements")}
13
11
 
14
- export const customFrontendComponentOptics: ReadonlyArray<DomainComponentOptic<AnyDomainEntity, RootEntity, PublishedData, SessionData, FrontendData, AnyDomainEntity, SystemComponentTypeConstraint>> = [${$.join(", ")}].flat()
12
+ export const customFrontendComponentOptics: readonly ProjectModule[] = ${r(a,"frontendComponents")}
15
13
  `};
@@ -1,4 +1,4 @@
1
- import{CodeImports as i}from"../common/code-imports.js";import{autoHeader as n}from"../common/file-headers.js";let o=/v(\d+)\.ts$/,t=(i,n)=>i.versionedModels.filter(i=>void 0!==i.migrationFile).map(i=>({version:i.version,file:i.migrationFile,importName:n?`${n}MigrateToV${i.version}`:`migrateToV${i.version}`})),s=i=>i.map(i=>{let n=i.file.replace(o,`v${i.version}.js`),t=`migrateToV${i.version}`,s=i.importName!==t?` as ${i.importName}`:"";return`import { ${t}${s} } from '../${n}'`}).join("\n"),e=(i,n,o,t)=>[`const ${t}Migrations = {`,...i.map(i=>` ${i.version}: ${i.importName},`),"}","",`const ${t} = MigrateFunctionBuilder`,` .fromVersions(${n})`,` .to(${o})`,` .using(${t}Migrations)`," .build()"].join("\n");export const generateApplicationSpecDomainFile=o=>{let r=new i,a="./domain-spec.js",m="./configurator-domain-code.js",d="./admin-domain-code.js",p=i=>[...i.expressions.values()].some(i=>[...i.values()].some(i=>"relation"===i.implementation.kind)),l=p(o.configurator.expressions),c=p(o.admin.expressions),u=t(o.configurator.resolvedVersions,""),I=t(o.admin.resolvedVersions,"admin"),g=u.length>0,h=I.length>0;r.addImport(a,"baseConfiguratorBuilder"),r.addImport(a,"domainBuilder"),r.addImport(a,"adminDomainBuilder"),r.addImport(a,"attachComponent"),r.addImport(a,"attachAdminComponent"),r.addImport(a,"implementCustomExpressions"),r.addImport(a,"implementAdminCustomExpressions"),r.addImport(a,"createI18n"),r.addImport(a,"componentOptics"),r.addImport(a,"adminComponentOptics"),r.addImport(a,"invariantBuilder"),r.addImport(a,"adminInvariantBuilder"),r.addImport(m,"customExpressions"),r.addImport(m,"customInvariants"),r.addImport(m,"customActions"),r.addImport(d,"customAdminExpressions"),r.addImport(d,"customAdminInvariants"),l&&r.addImport(a,"relationExpressions"),c&&r.addImport(a,"adminRelationExpressions"),(g||h)&&r.addImport("@salsita-ai/sdk/domain","MigrateFunctionBuilder"),g&&r.addImport(a,"modelVersions"),h&&r.addImport(a,"adminModelVersions");let x=[];g&&x.push(s(u)),h&&x.push(s(I));let v=x.length>0?"\n"+x.join("\n")+"\n":"",$=[];g&&$.push(e(u,"modelVersions",o.configurator.schemaVersion,"migrate")),h&&$.push(e(I,"adminModelVersions",o.admin.schemaVersion,"migrateAdmin"));let E=$.length>0?"\n"+$.join("\n\n")+"\n":"",f=["const domainFactory = domainBuilder",l?" .withExpressions(relationExpressions)":null," .withExpressions(invariantBuilder.withInvariants(customInvariants).buildViolationExpressions())"," .withExpressions(customExpressions)"," .withActionImplementations(customActions)",g?" .withMigrate(migrate)":null," .build()"].filter(Boolean).join("\n"),A=["const adminDomainFactory = adminDomainBuilder",c?" .withExpressions(adminRelationExpressions)":null," .withExpressions(adminInvariantBuilder.withInvariants(customAdminInvariants).buildViolationExpressions())"," .withExpressions(customAdminExpressions)",h?" .withMigrate(migrateAdmin)":null," .build()"].filter(Boolean).join("\n");return`${n("domain.ts","Assembles domain and admin domain factories from builders, migrations, expressions and invariants.")}
1
+ import{CodeImports as i}from"../common/code-imports.js";import{autoHeader as o}from"../common/file-headers.js";let n=/v(\d+)\.ts$/,t=(i,o)=>i.versionedModels.filter(i=>void 0!==i.migrationFile).map(i=>({version:i.version,file:i.migrationFile,importName:o?`${o}MigrateToV${i.version}`:`migrateToV${i.version}`})),s=i=>i.map(i=>{let o=i.file.replace(n,`v${i.version}.js`),t=`migrateToV${i.version}`,s=i.importName!==t?` as ${i.importName}`:"";return`import { ${t}${s} } from '../${o}'`}).join("\n"),e=(i,o,n,t)=>[`const ${t}Migrations = {`,...i.map(i=>` ${i.version}: ${i.importName},`),"}","",`const ${t} = MigrateFunctionBuilder`,` .fromVersions(${o})`,` .to(${n})`,` .using(${t}Migrations)`," .build()"].join("\n");export const generateApplicationSpecDomainFile=n=>{let r=new i,a="./domain-spec.js",m="./configurator-domain-code.js",d="./admin-domain-code.js",p=i=>[...i.expressions.values()].some(i=>[...i.values()].some(i=>"relation"===i.implementation.kind)),l=p(n.configurator.expressions),c=p(n.admin.expressions),u=t(n.configurator.resolvedVersions,""),g=t(n.admin.resolvedVersions,"admin"),h=u.length>0,I=g.length>0;r.addImport(a,"baseConfiguratorBuilder"),r.addImport(a,"domainBuilder"),r.addImport(a,"adminDomainBuilder"),r.addImport(a,"attachComponent"),r.addImport(a,"attachAdminComponent"),r.addImport(a,"implementCustomExpressions"),r.addImport(a,"implementAdminCustomExpressions"),r.addImport(a,"createI18n"),r.addImport(a,"componentOptics"),r.addImport(a,"adminComponentOptics"),r.addImport(a,"invariantBuilder"),r.addImport(a,"adminInvariantBuilder"),r.addImport(m,"customExpressions"),r.addImport(m,"customInvariants"),r.addImport(m,"customActions"),r.addImport(d,"customAdminExpressions"),r.addImport(d,"customAdminInvariants"),l&&r.addImport(a,"relationExpressions"),c&&r.addImport(a,"adminRelationExpressions"),(h||I)&&r.addImport("@salsita-ai/sdk/domain","MigrateFunctionBuilder"),h&&r.addImport(a,"modelVersions"),I&&r.addImport(a,"adminModelVersions");let x=[];h&&x.push(s(u)),I&&x.push(s(g));let v=x.length>0?"\n"+x.join("\n")+"\n":"",$=[];h&&$.push(e(u,"modelVersions",n.configurator.schemaVersion,"migrate")),I&&$.push(e(g,"adminModelVersions",n.admin.schemaVersion,"migrateAdmin"));let E=$.length>0?"\n"+$.join("\n\n")+"\n":"",f=["const domainFactory = domainBuilder",l?" .withExpressions(relationExpressions)":null," .withExpressions(invariantBuilder.withInvariantModules(customInvariants).buildViolationExpressions())"," .withExpressionModules(customExpressions)"," .withActionModules(customActions)",h?" .withMigrate(migrate)":null," .build()"].filter(Boolean).join("\n"),A=["const adminDomainFactory = adminDomainBuilder",c?" .withExpressions(adminRelationExpressions)":null," .withExpressions(adminInvariantBuilder.withInvariantModules(customAdminInvariants).buildViolationExpressions())"," .withExpressionModules(customAdminExpressions)",I?" .withMigrate(migrateAdmin)":null," .build()"].filter(Boolean).join("\n");return`${o("domain.ts","Assembles domain and admin domain factories from builders, migrations, expressions and invariants.")}
2
2
  ${r.toString()}
3
3
  ${v}export { attachComponent, attachAdminComponent, implementCustomExpressions, implementAdminCustomExpressions, createI18n }
4
4
  ${E}
@@ -8,6 +8,6 @@ ${A}
8
8
  export const configuratorBuilder = baseConfiguratorBuilder
9
9
  .withDomainFactory(domainFactory)
10
10
  .withAdminDomainFactory(adminDomainFactory)
11
- .withComponentOptics(componentOptics)
12
- .withAdminComponentOptics(adminComponentOptics)
11
+ .withComponentOptics([{ origin: '.phoenix/domain-spec.ts', exports: componentOptics }])
12
+ .withAdminComponentOptics([{ origin: '.phoenix/domain-spec.ts', exports: adminComponentOptics }])
13
13
  `};
@@ -7,7 +7,7 @@ import{renderAgentSkill as e}from"./agent-skill.js";let i=`Review all current gi
7
7
  - [ ] Relations properly define parent-child ownership (1-N, 0-1)
8
8
  - [ ] Expressions have matching implementations in src/expressions/
9
9
  - [ ] Invariants have matching implementations in src/invariants/
10
- - [ ] Actions declared under actions: have matching implementations in src/actions/ (a missing one fails the type check of the generated barrel)
10
+ - [ ] Actions declared under actions: have matching implementations in src/actions/ (a missing one stops the application at start; it is not a type error)
11
11
  - [ ] Component bindings use correct entity types or aliases
12
12
  - [ ] $read/$write/$bind reference valid properties or expressions
13
13
  - [ ] A model that has been deployed is unchanged under its version: the change is in \`model.latest\`, the deployed model is kept as \`model.v<N>\`, and \`src/migrations/v<N+1>.ts\` migrates saved configurations
@@ -65,7 +65,8 @@ Declarative 3D product configurator built with Phoenix SDK. Domain model defined
65
65
  - Underscore folders (_shared/, _utils/) are NOT auto-imported`;
66
66
  /** The default-export rule of the SDK auto-import system. */
67
67
  readonly exportRules: `## Export Rules
68
- All files in src/expressions/, src/actions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.`;
68
+ All files in src/expressions/, src/actions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/elements/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.
69
+ The default export must be what the folder's phx factory returns (for example \`phx.frontend.createCustomPhoenixLayoutElement()\` in src/elements/). Any other value, such as a plain React component, stops the application at start with an "Invalid default export in <file>" error. Put plain components and helpers in an underscore folder.`;
69
70
  /** Which components and handlers are bundled into the webhook. */
70
71
  readonly webhookMembership: `## Webhook Membership
71
72
  - User-authored components, admin components, and handlers are frontend-only by default.
@@ -6,8 +6,7 @@ Declarative 3D product configurator built with Phoenix SDK. Domain model defined
6
6
  - Expressions: entity-name.ts
7
7
  - Migrations: v*.ts (sequential)
8
8
  - Specs: kebab-case.yaml
9
- - Underscore folders (_shared/, _utils/) are NOT auto-imported`,exportRules:`## Export Rules
10
- All files in src/expressions/, src/actions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.`,webhookMembership:"## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.",doNotEdit:"## Do Not Edit\n- `.phoenix/` directory — completely regenerated on each build. The one exception is `.phoenix/variants/`, where the `phoenix-variants` skill has you write option files; a rebuild keeps it\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files — compiled from .po files",modelVersioning:"## Version the Domain Model Once It Is Deployed\nA deployed model version cannot change, because saved configurations depend on it. `pnpm phoenix deploy` is refused, before anything is uploaded, when the model differs from the one already deployed under the same version. The version is not written anywhere: `model.latest` is always the highest numbered version plus one, so a spec with only `latest` is v1, and `applicationVersion` plays no part. `pnpm phoenix dev` accepts every model change, so a working preview does not show that the deploy will pass.\n\nTo change a model that has been deployed as v<N>:\n1. Keep the deployed model, unchanged, as `model.v<N>` in the spec. A file of its own, such as `spec/model-v<N>.yaml`, keeps `latest` readable.\n2. Make the change in `model.latest`, which is now v<N+1>.\n3. Add `src/migrations/v<N+1>.ts` exporting `migrateToV<N+1>`. It receives the saved entities of v<N> and returns entities that are valid in v<N+1>; `ModelV<N>` and `ModelV<N+1>` are generated global namespaces.\n\nThe admin model is versioned on its own, under `src/admin/migrations/`, with its types in `AdminV<N>`.\n\n**Replacing the starter.** When the first deployment of the workspace was the starter, its `Box` model is v1 in production. When the real model replaces it, keep the starter's model as `model.v1` and define the real model in `latest`. Configurations saved from the starter are not worth converting, so the migration returns the starting state of the new model, the `initialDomainEntities` of its preset, and drops the boxes:\n```typescript\n// src/migrations/v2.ts\nimport type { Migration } from '@salsita-ai/sdk/domain'\n\nexport const migrateToV2: Migration<ModelV1.AnyDomainEntity, ModelV2.AnyDomainEntity> = () => [\n // the entities of the new model's preset\n]\n```\nAn entity of a type the new version no longer has must not stay in the returned state. An entity id starts with its type (`Box-1`), so an entity that keeps its data under a new type name needs a new id and every relation pointing at it rewritten. Read `docs/phoenix/migrations.mdx` before writing any other migration.",sdkDocumentation:'## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` — Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` — Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` — Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` — Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` — List docs in a category\n- `pnpm phoenix docs -l` — List all doc paths with titles\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` — Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` — End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` — Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` — ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` — Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` — YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` — Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` — Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` — Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` — Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` — Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \'camera\'`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep "example"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep "camera"`\n5. Search generated files directly when needed: `grep -rn "camera" "$(pnpm phoenix docs --dir)"`\n6. Browse a topic area: `pnpm phoenix docs -c "Layouts"`',assetInspection:"## 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`",screenshotCli:"## Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` — Output file path (default: `./screenshot.png`)\n- `--width, -w` — Width in pixels (default: 1920)\n- `--height` — Height in pixels (default: 1080)\n- `--format, -f` — Image format: PNG or JPEG (default: PNG)\n- `--port` — WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders",inspectState:"## Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` — Output file path (prints to stdout if omitted)\n- `--sections, -s` — Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` — Pretty-print JSON (default: true)\n- `--port` — WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` — domain data loaded\n- `domainContextReady` — domain context initialized (entities available)\n- `configuratorReady` — 3D configurator initialized\n- `sessionAuthenticated` — session service active\n- `editorMode` — editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation",inspectData:`## Inspect: Data
9
+ - Underscore folders (_shared/, _utils/) are NOT auto-imported`,exportRules:'## Export Rules\nAll files in src/expressions/, src/actions/, src/invariants/, src/transformers/, src/components/, src/handlers/, src/elements/, src/webhooks/ MUST use default exports. Can be a single item or an array. Named exports are ignored by the SDK auto-import system.\nThe default export must be what the folder\'s phx factory returns (for example `phx.frontend.createCustomPhoenixLayoutElement()` in src/elements/). Any other value, such as a plain React component, stops the application at start with an "Invalid default export in <file>" error. Put plain components and helpers in an underscore folder.',webhookMembership:"## Webhook Membership\n- User-authored components, admin components, and handlers are frontend-only by default.\n- A handler that registers `createMapPublishedRevisionDataHandler`, `createMapPublishedChunkedDataHandler`, `createDataRowValidatorHandler`, or `createSheetValidatorHandler` is included in the webhook automatically.\n- To include another component or handler in the webhook, put `'use webhook'` as its first statement (leading comments are allowed).\n- A webhook-included file and its runtime local-import closure must not import browser SDK entrypoints (`application`, `admin`, `configurator`, `editor`, `react`, `ui`) or style/font/image assets. Spec parsing reports the unsafe import and inclusion reason as a diagnostic.\n- Keep browser rendering in an unpinned file. Move shared server-safe logic into a separate module when both frontend and webhook code need it.",doNotEdit:"## Do Not Edit\n- `.phoenix/` directory — completely regenerated on each build. The one exception is `.phoenix/variants/`, where the `phoenix-variants` skill has you write option files; a rebuild keeps it\n- `tsconfig.json`, `eslint.config.js`, `prettier.config.js`, `.prettierignore`, `.linguirc`, `.nvmrc`\n- `src/locales/` .ts files — compiled from .po files",modelVersioning:"## Version the Domain Model Once It Is Deployed\nA deployed model version cannot change, because saved configurations depend on it. `pnpm phoenix deploy` is refused, before anything is uploaded, when the model differs from the one already deployed under the same version. The version is not written anywhere: `model.latest` is always the highest numbered version plus one, so a spec with only `latest` is v1, and `applicationVersion` plays no part. `pnpm phoenix dev` accepts every model change, so a working preview does not show that the deploy will pass.\n\nTo change a model that has been deployed as v<N>:\n1. Keep the deployed model, unchanged, as `model.v<N>` in the spec. A file of its own, such as `spec/model-v<N>.yaml`, keeps `latest` readable.\n2. Make the change in `model.latest`, which is now v<N+1>.\n3. Add `src/migrations/v<N+1>.ts` exporting `migrateToV<N+1>`. It receives the saved entities of v<N> and returns entities that are valid in v<N+1>; `ModelV<N>` and `ModelV<N+1>` are generated global namespaces.\n\nThe admin model is versioned on its own, under `src/admin/migrations/`, with its types in `AdminV<N>`.\n\n**Replacing the starter.** When the first deployment of the workspace was the starter, its `Box` model is v1 in production. When the real model replaces it, keep the starter's model as `model.v1` and define the real model in `latest`. Configurations saved from the starter are not worth converting, so the migration returns the starting state of the new model, the `initialDomainEntities` of its preset, and drops the boxes:\n```typescript\n// src/migrations/v2.ts\nimport type { Migration } from '@salsita-ai/sdk/domain'\n\nexport const migrateToV2: Migration<ModelV1.AnyDomainEntity, ModelV2.AnyDomainEntity> = () => [\n // the entities of the new model's preset\n]\n```\nAn entity of a type the new version no longer has must not stay in the returned state. An entity id starts with its type (`Box-1`), so an entity that keeps its data under a new type name needs a new id and every relation pointing at it rewritten. Read `docs/phoenix/migrations.mdx` before writing any other migration.",sdkDocumentation:'## SDK Documentation\n\nAlways search SDK docs for relevant examples before implementing Phoenix features.\n\n### Commands\n- `pnpm phoenix docs` — Full documentation index with descriptions\n- `pnpm phoenix docs -s <term>` — Search all doc content and metadata (case-insensitive)\n- `pnpm phoenix docs --dir` — Print the absolute docs directory for grep or ripgrep\n- `pnpm phoenix docs -r <path>` — Read specific doc (raw text to stdout)\n- `pnpm phoenix docs -c <category>` — List docs in a category\n- `pnpm phoenix docs -l` — List all doc paths with titles\n\n### Key Docs\n- `docs/phoenix/getting-started.mdx` — Setup, prerequisites, first project\n- `docs/phoenix/quickstart.mdx` — End-to-end tutorial building a configurator\n- `docs/phoenix/domain-model.mdx` — Entities, attributes, relations, specs\n- `docs/phoenix/components.mdx` — ECS pattern, YAML components, custom components\n- `docs/phoenix/project-structure.mdx` — Files, folders, conventions\n- `docs/phoenix/best-practices.mdx` — YAML-first, code patterns, common pitfalls\n- `docs/phoenix/state-management.mdx` — Reactive state, RxJS pipelines, data flow\n- `docs/phoenix/expression-context.mdx` — Expression API, context object, helpers\n- `docs/phoenix/webhooks.mdx` — Server-side finalization workflows\n- `docs/phoenix/finalization.mdx` — Finalization system, PDF/email/CSV generation\n- `docs/phoenix/migrations.mdx` — Schema versioning, migration files\n\n### Agent Workflow\n1. Find relevant docs by content: `pnpm phoenix docs -s \'camera\'`\n2. Read matching doc: `pnpm phoenix docs -r docs/3d-scene/cameras/transitions.mdx`\n3. Search within a doc: `pnpm phoenix docs -r <path> | grep "example"`\n4. Search titles only as a fallback: `pnpm phoenix docs -l | grep "camera"`\n5. Search generated files directly when needed: `grep -rn "camera" "$(pnpm phoenix docs --dir)"`\n6. Browse a topic area: `pnpm phoenix docs -c "Layouts"`',assetInspection:"## 3D Asset Inspection\n\nRun `pnpm phoenix inspect:assets` to discover all glTF/GLB files in `public/` and get a summary table. Use `--file <path>` for detailed single-file inspection.\n\n**When to use:** before writing YAML/code that references objectName, materialsToOverride, morphTargetInfluences, or object positioning.\n\n**What it shows per node:**\n- Name, type (Mesh/Light/Camera/Empty), children\n- Transform: `pos=`, `rot=`, `scale=` (only non-default values shown)\n- Per-node morph targets: `morphs=Width,Height`\n- Bounding box: `bounds=WxHxD` (width x height x depth in meters)\n- Origin placement: `origin=center`, `bottom-center`, `top-center`, `bottom-corner`, etc. with numerical offset\n\n**Use cases:**\n- Find exact node names for `objectName` in scene entity components\n- Find material names for `materialsToOverride`\n- Find morph target names for `morphTargetInfluences`\n- Check model dimensions (bounds) for positioning, dimension indicators, or invariants\n- Check origin placement to understand how models anchor (center vs bottom-center)\n- Use `--json` for programmatic access to all data\n\n**Flags:** `--objects`, `--materials`, `--morphs`, `--animations`, `--json`",screenshotCli:"## Screenshot CLI\n\nCapture 3D canvas screenshots from a running dev server via `pnpm phoenix screenshot`.\n\n**Prerequisites:**\n1. `phoenix dev` must be running (starts the WebSocket server on port 3020)\n2. Configurator must be open in a browser (the browser does the actual rendering)\n\n**Options:**\n- `--output, -o` — Output file path (default: `./screenshot.png`)\n- `--width, -w` — Width in pixels (default: 1920)\n- `--height` — Height in pixels (default: 1080)\n- `--format, -f` — Image format: PNG or JPEG (default: PNG)\n- `--port` — WebSocket server port (default: 3020)\n\n**Example workflow:**\n1. Start dev server: `pnpm phoenix dev`\n2. Open configurator in browser (or via Playwright MCP)\n3. Take screenshot: `pnpm phoenix screenshot -o ./render.png -w 2560 --height 1440`\n\n**Use cases:** visual regression testing, generating product images, debugging 3D renders",inspectState:"## Inspect: State\n\nGet the current editor runtime state as JSON via `pnpm phoenix inspect:state`.\n\n**Prerequisites:** same as screenshot (dev server running + browser open)\n\n**Options:**\n- `--output, -o` — Output file path (prints to stdout if omitted)\n- `--sections, -s` — Comma-separated: entities, navigation, validation (default: all)\n- `--pretty` — Pretty-print JSON (default: true)\n- `--port` — WebSocket server port (default: 3020)\n\n**Example:** `pnpm phoenix inspect:state -o ./state.json -s entities,navigation`\n\n**Lifecycle status:** Always included in response. Shows which systems are ready:\n- `domainLoaded` — domain data loaded\n- `domainContextReady` — domain context initialized (entities available)\n- `configuratorReady` — 3D configurator initialized\n- `sessionAuthenticated` — session service active\n- `editorMode` — editor mode enabled\n\n**Tips:** Use `--sections` to limit payload size. Pipe through `head`/`tail` for partial output (e.g., `pnpm phoenix inspect:state | head -50`).\n\n**Use cases:** AI agent context, debugging entity state, inspecting navigation/validation",inspectData:`## Inspect: Data
11
10
 
12
11
  Get the current editor context data as JSON via \`pnpm phoenix inspect:data\`.
13
12
 
@@ -1,13 +1,14 @@
1
- let e=e=>`webhookHandlers${e}`;export const generateApplicationSpecWebhookBuilders=(o,t)=>{let i=o.appMetadata.useClerk?` clerk: {
1
+ let e=e=>`webhookHandlers${e}`;export const generateApplicationSpecWebhookBuilders=(t,o)=>{let i=t.appMetadata.useClerk?` clerk: {
2
2
  apiKey: phx.webhooksEnv.CLERK_API_KEY,
3
3
  authorizedParties: [phx.webhooksEnv.FRONTEND_URL, phx.webhooksEnv.RESOURCES_URL],
4
4
  jwtSecret: phx.webhooksEnv.JWT_SECRET_BASE64,
5
5
  oauthClientId: phx.webhooksEnv.OAUTH_PROVIDER_CLIENT_ID,
6
6
  oauthClientSecret: phx.webhooksEnv.OAUTH_PROVIDER_CLIENT_SECRET,
7
7
  oauthProviderBaseUrl: phx.webhooksEnv.OAUTH_PROVIDER_BASE_URL,
8
- },`:"",r=t.map((o,t)=>{let i=e(t),r=o.replace(/\.tsx?$/,".js");return`import ${i} from '../${r}'`}).join("\n"),a=t.length>0,n=t.map((o,t)=>e(t)),l=a?`[${n.join(", ")}].flat()`:"[]",s=a?`
9
- .withHandlers(${l})`:"";return`// Auto-generated by application-spec pipeline. Do not edit.
8
+ },`:"",r=o.map((t,o)=>{let i=e(o),r=t.replace(/\.tsx?$/,".js");return`import ${i} from '../${r}'`}).join("\n"),n=o.length>0,s=o.map((t,o)=>`{ origin: '${t}', exports: ${e(o)} }`),a=`[${s.join(", ")}]`,l=n?`
9
+ .withHandlers(${a})`:"";return`// Auto-generated by application-spec pipeline. Do not edit.
10
10
  import { createDomainWebhook } from '@salsita-ai/sdk/webhook'
11
+ import type { DeploymentAssistant } from '@salsita-ai/sdk/contracts/assistant'
11
12
 
12
13
  import { configuratorBuilder, createI18n } from './domain.js'
13
14
  import { customComponentOptics } from './configurator-domain-code.js'
@@ -15,12 +16,14 @@ import { customAdminComponentOptics } from './admin-domain-code.js'
15
16
  ${r?`
16
17
  ${r}
17
18
  `:""}
19
+ const $assistantServerSettings: Pick<DeploymentAssistant, 'instructions' | 'ai'> | null = ${JSON.stringify(t.configurator.assistantServerSettings?{instructions:t.configurator.assistantServerSettings.instructions??void 0,ai:t.configurator.assistantServerSettings.ai}:null)}
20
+
18
21
  const webhookConfiguratorBuilder = configuratorBuilder
19
22
  .withComponentOptics(customComponentOptics)
20
23
  .withAdminComponentOptics(customAdminComponentOptics)
21
24
  .withDefaultEnvs({
22
25
  isDev: phx.webhooksEnv.IS_DEV,
23
- })${s}
26
+ })${l}
24
27
 
25
28
  export const {
26
29
  authHandlerBuilder,
@@ -33,6 +36,7 @@ export const {
33
36
  } = createDomainWebhook({
34
37
  configuratorBuilder: webhookConfiguratorBuilder,
35
38
  createI18n,
39
+ assistantServerSettings: $assistantServerSettings,
36
40
  ${i}
37
41
  })
38
42
 
@@ -5,4 +5,3 @@ export * from './generate-application/index.js';
5
5
  export * from './parse-application-files/index.js';
6
6
  export * from './webhook-boundary.js';
7
7
  export type * from './mock-template-definition.js';
8
- export * from './assistant/index.js';
@@ -1 +1 @@
1
- export*from"./core/index.js";export*from"./caching/index.js";export*from"./errors/index.js";export*from"./generate-application/index.js";export*from"./parse-application-files/index.js";export*from"./webhook-boundary.js";export*from"./assistant/index.js";
1
+ export*from"./core/index.js";export*from"./caching/index.js";export*from"./errors/index.js";export*from"./generate-application/index.js";export*from"./parse-application-files/index.js";export*from"./webhook-boundary.js";
@@ -1 +1 @@
1
- import{isArray as e}from"@salsita-ai/common/utils";import{buildAssistantManifest as t}from"#package/domain";import{DiagnosticCode as r,diagnosticMessages as i}from"../../../../errors/index.js";import{ASSISTANT_HINTS as n}from"../../../raw-spec/index.js";import{createSchemaRefResolver as s,isNullableSchema as o,phxDefinitionRefName as a}from"../../common/index.js";import{resolveAssistantFieldType as l}from"./assistant-field-type.js";let p="AnyDomainEntity",S={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},N={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},T=new Set(["id","type","meta"]),d=new Set(["Query","Mutation","Navigation","RecipeGroup","Recipe","DryRun","DryRunError","FieldOption","JSON","String","Int","Float","Boolean","ID"]),c=(e,t)=>{if(!t||0===t.length)return e;let r=`One of: ${t.map(e=>`"${e}"`).join(", ")}.`;return e?/[.!?]$/.test(e)?`${e} ${r}`:`${e}. ${r}`:r},f=new Set(["id","type"]),m="The raw stored value: a string, a message descriptor or a multilingual object.",A=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],u=(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))},_=(...e)=>n.filter(t=>e.some(e=>e?.includes(t))),E=(e,t,n,s)=>{let{model:o}=n,a=new Map,l=new Map;for(let[p,{groups:S,hints:N}]of Object.entries(e)){let e=o.entityTypes.find(e=>e===p),T=e?[e]:[...o.aliases].find(([e])=>e===p)?.[1];if(!T){s.at(p).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE(t.section,p));continue}for(let[e,o]of(T.forEach(e=>l.set(e,_(l.get(e),N))),Object.entries(S))){let l=s.at(p,"groups",e),S=`${p}.groups.${e}`,N={groupId:o?.as??e,instanceName:e,...o?.description===void 0?{}:{description:o.description},dryRuns:o?.allowDryRuns??!0};for(let s of T){let o=u(s,t.component,n),T=a.get(s)??[],d=T.find(e=>e.group.groupId===N.groupId);o.includes(e)?d?l.error(r.ASSISTANT_DUPLICATE_RECIPE_GROUP,i.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,s,N.groupId,[d.entry,S])):a.set(s,[...T,{group:N,entry:S,entryCtx:l}]):l.error(r.ASSISTANT_UNKNOWN_RECIPE_GROUP,i.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,p,e,s,o))}}}let p=o.entityTypes.flatMap(e=>{let t=a.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(p.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:l,metaEntries:new Map(p.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},I=e=>`${e}Meta`,O=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,y=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},h=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t),o={...r,nonNull:!1},a=n?`${c(s,i)??""} ${m}`.trim():c(s,i);return{type:{...n?{kind:"scalar",name:"JSON",nonNull:!1}:o,nonNull:r.nonNull},...void 0===a?{}:{description:a}}},g=(t,r)=>{let i=(t=>{let r=y(t),i=r?.type==="array"&&r.items&&!e(r.items)?y(r.items):void 0,n=i??r;if(n?.$ref!==void 0&&"$DomainEntity"===a(n.$ref))return{target:n.references??p,list:void 0!==i}})(t);if(i)return{kind:"edge",...i,nullable:o(t,r),...void 0===t.description?{}:{description:t.description}};let{type:n,enumValues:s,localized:S,description:N}=l(t,r),T=c(N,s);return S?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:n.nonNull},description:`${N??""} ${m}`.trim()}:{kind:"value",type:n,...void 0===T?{}:{description:T}}},v=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t);return{type:{kind:"value",type:r},localized:!0===n,description:s,enumValues:i}},R=(e,t,n,s,o)=>{let a=t.startsWith("$")?((e,t,n,s)=>{let o=((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,n);if(!o)return void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:a}=o;if("violations"===a.kind)return void s.error(r.ASSISTANT_UNSUPPORTED_EXPRESSION,i.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===a.kind){let[{target:e,cardinality:t}]=a.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return v(o.declaredSchema,n.resolveRef)})(e,t,s,o):((e,t,{resolveRef:n},s)=>{let o=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return o?v(o,n):void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,s,o);if(!a)return;let l=n?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return T.has(l)?void o.error(r.ASSISTANT_RESERVED_FIELD_NAME,i.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,l)):{name:l,source:t,type:a.type,localized:a.localized,description:c(n?.description??a.description,a.enumValues),describedByManifest:n?.description!==void 0,enumValues:a.enumValues,valueDescription:n?.description??a.description}},M=(e,t,n,s,o)=>{let a=new Map,l=new Set(n);for(let s of[...t.flat(),...n]){let t=a.get(s.name);t?t.source!==s.source?o.error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,s.name,[t.source,s.source])):l.has(s)&&s.describedByManifest&&a.set(s.name,{...t,description:s.description,describedByManifest:!0,valueDescription:s.valueDescription}):a.set(s.name,s)}return[...a.values()].map(e=>{let t=e.enumValues&&s(e.source);return t?{...e,enumValues:t,description:c(e.valueDescription,t)}:e})};export const resolveAssistantManifest=(e,{model:t,states:n,phxDefinitions:o,expressions:a,components:T,actions:y},v)=>{let b=v.errors.length,D=v.at("entities"),C=s(t.commonTypes,o);for(let e of t.resolvedShapes.keys())d.has(e)&&v.error(r.ASSISTANT_RESERVED_TYPE_NAME,i.ASSISTANT_RESERVED_TYPE_NAME(e,[...d]));let P=((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=R(n,i,s,t,r.at(n.name,i));o&&e.push(o)}i.set(n.name,e)}return i})(((e,t,n)=>{let s=[];for(let[r,i]of t.resolvedShapes){let t=e[r];t&&s.push({name:r,shape:i,entries:t})}let o=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))o.has(t)||n.at(t).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("entities",t));return s})(e.entities??{},t,D),{resolveRef:C,expressions:a,entityTypes:t.entityTypes},D),U=M(p,[],P.get(p)??[],()=>void 0,v),j=new Map([[p,U]]);for(let e of t.aliases.keys())e!==p&&j.set(e,M(e,[U],P.get(e)??[],()=>void 0,v));for(let e of t.entityTypes){let r=[p,...[...t.aliases].filter(([t,r])=>t!==p&&r.includes(e)).map(([e])=>e)],i=[...t.resolvedShapes].find(([t])=>t===e)?.[1];j.set(e,M(e,r.map(e=>j.get(e)??[]),P.get(e)??[],e=>{let t=Object.entries(i?.properties??{}).find(([t])=>t===e)?.[1];return t&&l(t,C).enumValues},v))}let L=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((j.get(e)??[]).map(({name:e,source:t,localized:r})=>[e,r?{source:t,localized:!0}:{source:t}]))])),$=E(e.childRecipes??{},S,{model:t,components:T},v.at("childRecipes")),w=E(e.replaceRecipes??{},N,{model:t,components:T},v.at("replaceRecipes")),W=((e,t,n)=>{let s=new Set;for(let o of Object.keys(e)){let e=t.entityTypes.find(e=>e===o),a=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1];a?a.forEach(e=>s.add(e)):n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("deletable",o))}return t.entityTypes.filter(e=>s.has(e))})(e.deletable??{},t,v.at("deletable")),F=((e,t,n)=>{let{model:s}=t,o=((e,t,n)=>{let s=new Map;for(let[o,a]of Object.entries(e)){let e=t.entityTypes.find(e=>e===o),l=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1],p=[...t.resolvedShapes].find(([e])=>e===o)?.[1];if(!l||!p){n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("writable",o));continue}for(let e of Object.keys(a)){let t=n.at(o,e);e.startsWith("$")||f.has(e)?t.error(r.ASSISTANT_NOT_WRITABLE,i.ASSISTANT_NOT_WRITABLE(o,e)):A(p.properties,e)?l.forEach(t=>{let r=s.get(t)??new Map;s.set(t,r.has(e)?r:r.set(e,o))}):t.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("writable",o,e))}}return s})(e,s,n);return s.entityTypes.flatMap(e=>{let a=[...s.resolvedShapes].find(([t])=>t===e)?.[1],p=[...o.get(e)??[]].flatMap(([s,o])=>{let p=a&&A(a.properties,s);return(p&&((e,{property:t,writableKey:n},s,{resolveRef:o,exposed:a,sources:p},S)=>{let N=Object.entries(A(p,e)??{}),T=a.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===T?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void S.at(n,t).error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${n}.${t}`));let{type:f,enumValues:u,localized:_,description:E}=l(s,o),I={...f,nonNull:!1},O=T??t,y=void 0===T?c(E,u):void 0;return _?{name:O,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:y?`${y} ${m}`:m}:{name:O,property:t,type:I,...void 0===y?{}:{description:y}}})(e,{property:s,writableKey:o},p,t,n))??[]});return p.length>0?[{entityType:e,fields:p}]:[]})})(e.writable??{},{model:t,resolveRef:C,exposed:P,sources:L},v.at("writable")),k=((e,t,n,s)=>{let{model:o}=n,a=new Map;for(let[l,p]of Object.entries(e)){let e=o.entityTypes.find(e=>e===l),T=e?[e]:[...o.aliases].find(([e])=>e===l)?.[1]??[];for(let[e,o]of Object.entries(p)){let p=o?.options;if(!p)continue;let d=s.at(l,e,"options"),c=`${l}.${e}`;for(let s of T){let o=t.find(e=>e.entityType===s)?.fields.find(t=>t.property===e);if(!o)continue;let l=p.as??`${o.name}Options`,T=u(s,p.componentType,n),f=a.get(s)??[],m=f.find(e=>e.options.edgeName===l||e.options.field===o.name);if(T.includes(p.instanceName))if(l===S.section||l===N.section)d.error(r.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,i.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(c,l,o.name));else if(m)d.error(r.ASSISTANT_DUPLICATE_OPTIONS_EDGE,i.ASSISTANT_DUPLICATE_OPTIONS_EDGE(s,m.options.edgeName===l?{edgeName:l}:{field:o.name},[m.entry,c]));else{let e={field:o.name,edgeName:l,componentType:p.componentType,instanceName:p.instanceName,validate:p.validate??!0,dryRuns:p.allowDryRuns??!0};a.set(s,[...f,{options:e,hints:_(p.hints),entry:c,entryCtx:d}])}else d.error(r.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,i.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(c,p,s,T))}}}return a})(e.writable??{},F,{model:t,components:T},v.at("writable"));var K=[$.metaEntries,w.metaEntries,new Map([...k].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[]))];for(let e of t.entityTypes){let n=K.flatMap(t=>t.get(e)??[])[0],s=I(e);n&&[...t.resolvedShapes.keys()].some(e=>e===s)&&n.error(r.ASSISTANT_META_TYPE_NAME_CONFLICT,i.ASSISTANT_META_TYPE_NAME_CONFLICT(e,s))}let Y=t.entityTypes.filter(e=>($.groups[e]?.length??0)>0||(w.groups[e]?.length??0)>0||(k.get(e)?.length??0)>0).map(I),V=((e,{actions:t,resolveRef:n,builtInMutations:s,typeNames:o},a)=>{let l=[],p=[...t.values()].map(e=>String(e.name));for(let[S,N]of Object.entries(e)){let e=a.at(S),T=[...t.values()].find(e=>e.name===S);if(!T){e.error(r.ASSISTANT_UNKNOWN_ACTION,i.ASSISTANT_UNKNOWN_ACTION(S,p));continue}let d=N?.as??S,c=l.find(e=>e.fieldName===d),f=O(d);if(s.has(d)||c){e.error(r.ASSISTANT_MUTATION_NAME_CONFLICT,i.ASSISTANT_MUTATION_NAME_CONFLICT(S,d,c?`"assistant.actions.${c.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(o.has(f)||l.some(e=>O(e.fieldName)===f)){e.error(r.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,i.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(S,d,f));continue}let m=N?.description??T.description;l.push({fieldName:d,actionName:S,...void 0===m?{}:{description:m},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,h(t,n)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,g(t,n)]))})}return l})(e.actions??{},{actions:y,resolveRef:C,builtInMutations:new Set(["deleteEntity",S.mutation,N.mutation,...F.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...d,...t.resolvedShapes.keys(),...Y])},v.at("actions"));if(!(v.errors.length>b))return{entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:n.navigationStates,viewStates:n.viewStates,toolStates:n.toolStates},deletableTypes:W,writableTypes:F,actionFields:V,childRecipes:Object.fromEntries(Object.entries($.groups).map(([e,t])=>[e,{groups:t,hints:$.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(w.groups).map(([e,t])=>[e,{groups:t,hints:w.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...k].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),fields:Object.fromEntries([...j].map(([e,t])=>[e,t.map(e=>({name:e.name,source:e.source,localized:e.localized,type:e.type,...void 0===e.description?{}:{description:e.description}}))]))}};export const createAssistantSchema=(e,n,s)=>{let o=resolveAssistantManifest(e,n,s);if(o)try{return{...t(o),resolved:o}}catch(e){s.error(r.ASSISTANT_INVALID_SCHEMA,i.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
1
+ import{isArray as e}from"@salsita-ai/common/utils";import{buildAssistantManifest as t}from"#package/domain";import{DiagnosticCode as r,diagnosticMessages as i}from"../../../../errors/index.js";import{ASSISTANT_HINTS as n}from"../../../raw-spec/index.js";import{createSchemaRefResolver as s,isNullableSchema as o,phxDefinitionRefName as a}from"../../common/index.js";import{resolveAssistantFieldType as l}from"./assistant-field-type.js";let p="AnyDomainEntity",S={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},N={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},T=new Set(["id","type","meta"]),d=new Set(["Query","Mutation","Navigation","RecipeGroup","Recipe","DryRun","DryRunError","FieldOption","JSON","String","Int","Float","Boolean","ID"]),c=(e,t)=>{if(!t||0===t.length)return e;let r=`One of: ${t.map(e=>`"${e}"`).join(", ")}.`;return e?/[.!?]$/.test(e)?`${e} ${r}`:`${e}. ${r}`:r},f=new Set(["id","type"]),m="A string, a message descriptor or a multilingual object; passed without translation.",A=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],u=(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))},_=(...e)=>n.filter(t=>e.some(e=>e?.includes(t))),E=(e,t,n,s)=>{let{model:o}=n,a=new Map,l=new Map;for(let[p,{groups:S,hints:N}]of Object.entries(e)){let e=o.entityTypes.find(e=>e===p),T=e?[e]:[...o.aliases].find(([e])=>e===p)?.[1];if(!T){s.at(p).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE(t.section,p));continue}for(let[e,o]of(T.forEach(e=>l.set(e,_(l.get(e),N))),Object.entries(S))){let l=s.at(p,"groups",e),S=`${p}.groups.${e}`,N={groupId:o?.as??e,instanceName:e,...o?.description===void 0?{}:{description:o.description},dryRuns:o?.allowDryRuns??!0};for(let s of T){let o=u(s,t.component,n),T=a.get(s)??[],d=T.find(e=>e.group.groupId===N.groupId);o.includes(e)?d?l.error(r.ASSISTANT_DUPLICATE_RECIPE_GROUP,i.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,s,N.groupId,[d.entry,S])):a.set(s,[...T,{group:N,entry:S,entryCtx:l}]):l.error(r.ASSISTANT_UNKNOWN_RECIPE_GROUP,i.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,p,e,s,o))}}}let p=o.entityTypes.flatMap(e=>{let t=a.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(p.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:l,metaEntries:new Map(p.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},I=e=>`${e}Meta`,O=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,y=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},h=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t),o={...r,nonNull:!1},a=n?`${c(s,i)??""} ${m}`.trim():c(s,i);return{type:{...n?{kind:"scalar",name:"JSON",nonNull:!1}:o,nonNull:r.nonNull},...void 0===a?{}:{description:a}}},g=(t,r)=>{let i=(t=>{let r=y(t),i=r?.type==="array"&&r.items&&!e(r.items)?y(r.items):void 0,n=i??r;if(n?.$ref!==void 0&&"$DomainEntity"===a(n.$ref))return{target:n.references??p,list:void 0!==i}})(t);if(i)return{kind:"edge",...i,nullable:o(t,r),...void 0===t.description?{}:{description:t.description}};let{type:n,enumValues:s,localized:S,description:N}=l(t,r),T=c(N,s);return S?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:n.nonNull},description:`${N??""} ${m}`.trim()}:{kind:"value",type:n,...void 0===T?{}:{description:T}}},v=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t);return{type:{kind:"value",type:r},localized:!0===n,description:s,enumValues:i}},R=(e,t,n,s,o)=>{let a=t.startsWith("$")?((e,t,n,s)=>{let o=((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,n);if(!o)return void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:a}=o;if("violations"===a.kind)return void s.error(r.ASSISTANT_UNSUPPORTED_EXPRESSION,i.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===a.kind){let[{target:e,cardinality:t}]=a.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return v(o.declaredSchema,n.resolveRef)})(e,t,s,o):((e,t,{resolveRef:n},s)=>{let o=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return o?v(o,n):void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,s,o);if(!a)return;let l=n?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return T.has(l)?void o.error(r.ASSISTANT_RESERVED_FIELD_NAME,i.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,l)):{name:l,source:t,type:a.type,localized:a.localized,description:c(n?.description??a.description,a.enumValues),describedByManifest:n?.description!==void 0,enumValues:a.enumValues,valueDescription:n?.description??a.description}},M=(e,t,n,s,o)=>{let a=new Map,l=new Set(n);for(let s of[...t.flat(),...n]){let t=a.get(s.name);t?t.source!==s.source?o.error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,s.name,[t.source,s.source])):l.has(s)&&s.describedByManifest&&a.set(s.name,{...t,description:s.description,describedByManifest:!0,valueDescription:s.valueDescription}):a.set(s.name,s)}return[...a.values()].map(e=>{let t=e.enumValues&&s(e.source);return t?{...e,enumValues:t,description:c(e.valueDescription,t)}:e})};export const resolveAssistantManifest=(e,{model:t,states:n,phxDefinitions:o,expressions:a,components:T,actions:y},v)=>{let b=v.errors.length,D=v.at("entities"),C=s(t.commonTypes,o);for(let e of t.resolvedShapes.keys())d.has(e)&&v.error(r.ASSISTANT_RESERVED_TYPE_NAME,i.ASSISTANT_RESERVED_TYPE_NAME(e,[...d]));let P=((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=R(n,i,s,t,r.at(n.name,i));o&&e.push(o)}i.set(n.name,e)}return i})(((e,t,n)=>{let s=[];for(let[r,i]of t.resolvedShapes){let t=e[r];t&&s.push({name:r,shape:i,entries:t})}let o=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))o.has(t)||n.at(t).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("entities",t));return s})(e.entities??{},t,D),{resolveRef:C,expressions:a,entityTypes:t.entityTypes},D),U=M(p,[],P.get(p)??[],()=>void 0,v),j=new Map([[p,U]]);for(let e of t.aliases.keys())e!==p&&j.set(e,M(e,[U],P.get(e)??[],()=>void 0,v));for(let e of t.entityTypes){let r=[p,...[...t.aliases].filter(([t,r])=>t!==p&&r.includes(e)).map(([e])=>e)],i=[...t.resolvedShapes].find(([t])=>t===e)?.[1];j.set(e,M(e,r.map(e=>j.get(e)??[]),P.get(e)??[],e=>{let t=Object.entries(i?.properties??{}).find(([t])=>t===e)?.[1];return t&&l(t,C).enumValues},v))}let L=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((j.get(e)??[]).map(({name:e,source:t,localized:r})=>[e,r?{source:t,localized:!0}:{source:t}]))])),$=E(e.childRecipes??{},S,{model:t,components:T},v.at("childRecipes")),w=E(e.replaceRecipes??{},N,{model:t,components:T},v.at("replaceRecipes")),W=((e,t,n)=>{let s=new Set;for(let o of Object.keys(e)){let e=t.entityTypes.find(e=>e===o),a=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1];a?a.forEach(e=>s.add(e)):n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("deletable",o))}return t.entityTypes.filter(e=>s.has(e))})(e.deletable??{},t,v.at("deletable")),F=((e,t,n)=>{let{model:s}=t,o=((e,t,n)=>{let s=new Map;for(let[o,a]of Object.entries(e)){let e=t.entityTypes.find(e=>e===o),l=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1],p=[...t.resolvedShapes].find(([e])=>e===o)?.[1];if(!l||!p){n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("writable",o));continue}for(let e of Object.keys(a)){let t=n.at(o,e);e.startsWith("$")||f.has(e)?t.error(r.ASSISTANT_NOT_WRITABLE,i.ASSISTANT_NOT_WRITABLE(o,e)):A(p.properties,e)?l.forEach(t=>{let r=s.get(t)??new Map;s.set(t,r.has(e)?r:r.set(e,o))}):t.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("writable",o,e))}}return s})(e,s,n);return s.entityTypes.flatMap(e=>{let a=[...s.resolvedShapes].find(([t])=>t===e)?.[1],p=[...o.get(e)??[]].flatMap(([s,o])=>{let p=a&&A(a.properties,s);return(p&&((e,{property:t,writableKey:n},s,{resolveRef:o,exposed:a,sources:p},S)=>{let N=Object.entries(A(p,e)??{}),T=a.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===T?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void S.at(n,t).error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${n}.${t}`));let{type:f,enumValues:u,localized:_,description:E}=l(s,o),I={...f,nonNull:!1},O=T??t,y=void 0===T?c(E,u):void 0;return _?{name:O,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:y?`${y} ${m}`:m}:{name:O,property:t,type:I,...void 0===y?{}:{description:y}}})(e,{property:s,writableKey:o},p,t,n))??[]});return p.length>0?[{entityType:e,fields:p}]:[]})})(e.writable??{},{model:t,resolveRef:C,exposed:P,sources:L},v.at("writable")),k=((e,t,n,s)=>{let{model:o}=n,a=new Map;for(let[l,p]of Object.entries(e)){let e=o.entityTypes.find(e=>e===l),T=e?[e]:[...o.aliases].find(([e])=>e===l)?.[1]??[];for(let[e,o]of Object.entries(p)){let p=o?.options;if(!p)continue;let d=s.at(l,e,"options"),c=`${l}.${e}`;for(let s of T){let o=t.find(e=>e.entityType===s)?.fields.find(t=>t.property===e);if(!o)continue;let l=p.as??`${o.name}Options`,T=u(s,p.componentType,n),f=a.get(s)??[],m=f.find(e=>e.options.edgeName===l||e.options.field===o.name);if(T.includes(p.instanceName))if(l===S.section||l===N.section)d.error(r.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,i.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(c,l,o.name));else if(m)d.error(r.ASSISTANT_DUPLICATE_OPTIONS_EDGE,i.ASSISTANT_DUPLICATE_OPTIONS_EDGE(s,m.options.edgeName===l?{edgeName:l}:{field:o.name},[m.entry,c]));else{let e={field:o.name,edgeName:l,componentType:p.componentType,instanceName:p.instanceName,validate:p.validate??!0,dryRuns:p.allowDryRuns??!0};a.set(s,[...f,{options:e,hints:_(p.hints),entry:c,entryCtx:d}])}else d.error(r.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,i.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(c,p,s,T))}}}return a})(e.writable??{},F,{model:t,components:T},v.at("writable"));var K=[$.metaEntries,w.metaEntries,new Map([...k].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[]))];for(let e of t.entityTypes){let n=K.flatMap(t=>t.get(e)??[])[0],s=I(e);n&&[...t.resolvedShapes.keys()].some(e=>e===s)&&n.error(r.ASSISTANT_META_TYPE_NAME_CONFLICT,i.ASSISTANT_META_TYPE_NAME_CONFLICT(e,s))}let Y=t.entityTypes.filter(e=>($.groups[e]?.length??0)>0||(w.groups[e]?.length??0)>0||(k.get(e)?.length??0)>0).map(I),V=((e,{actions:t,resolveRef:n,builtInMutations:s,typeNames:o},a)=>{let l=[],p=[...t.values()].map(e=>String(e.name));for(let[S,N]of Object.entries(e)){let e=a.at(S),T=[...t.values()].find(e=>e.name===S);if(!T){e.error(r.ASSISTANT_UNKNOWN_ACTION,i.ASSISTANT_UNKNOWN_ACTION(S,p));continue}let d=N?.as??S,c=l.find(e=>e.fieldName===d),f=O(d);if(s.has(d)||c){e.error(r.ASSISTANT_MUTATION_NAME_CONFLICT,i.ASSISTANT_MUTATION_NAME_CONFLICT(S,d,c?`"assistant.actions.${c.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(o.has(f)||l.some(e=>O(e.fieldName)===f)){e.error(r.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,i.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(S,d,f));continue}let m=N?.description??T.description;l.push({fieldName:d,actionName:S,...void 0===m?{}:{description:m},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,h(t,n)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,g(t,n)]))})}return l})(e.actions??{},{actions:y,resolveRef:C,builtInMutations:new Set(["deleteEntity",S.mutation,N.mutation,...F.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...d,...t.resolvedShapes.keys(),...Y])},v.at("actions"));if(!(v.errors.length>b))return{entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:n.navigationStates,viewStates:n.viewStates,toolStates:n.toolStates},deletableTypes:W,writableTypes:F,actionFields:V,childRecipes:Object.fromEntries(Object.entries($.groups).map(([e,t])=>[e,{groups:t,hints:$.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(w.groups).map(([e,t])=>[e,{groups:t,hints:w.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...k].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),fields:Object.fromEntries([...j].map(([e,t])=>[e,t.map(e=>({name:e.name,source:e.source,localized:e.localized,type:e.type,...void 0===e.description?{}:{description:e.description}}))]))}};export const createAssistantSchema=(e,n,s)=>{let o=resolveAssistantManifest(e,n,s);if(o)try{return{...t(o),resolved:o}}catch(e){s.error(r.ASSISTANT_INVALID_SCHEMA,i.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
@@ -5,7 +5,7 @@ import type { MergedAssistant } from '../../../merge/index.js';
5
5
  * The part of the assistant manifest only the server reads: the integrator's instructions for the
6
6
  * assistant and the AI settings it runs with. It is kept beside `AssistantSpec`, never inside it,
7
7
  * because its resolved manifest is serialized into the application bundle and into hot reload, and these
8
- * must not reach the browser of a customer. Deployment registration uploads them. `null` when the
8
+ * must not reach the browser of a customer. The generated webhook bundle carries them for server-side setup resolution. `null` when the
9
9
  * application declares no `assistant` section.
10
10
  */
11
11
  export type AssistantServerSettings = Branded<'AssistantServerSettings', {
@@ -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 AuthorizedPhoenixApiClient, type ChatToolCall, type ChatToolCallResult, type ConfigurationPayload, type ConfigurationSchema, type waitForFinalizationResultSettings } from './contract.js';
3
+ import { type AssistantChatConnection, type AssistantEarlierThread, 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;
@@ -26,6 +26,8 @@ export declare class AuthorizedClient<FINALIZE_DATA extends Record<string, unkno
26
26
  getSpeechToText: (configurationId: string, blob: Blob) => Promise<string>;
27
27
  getTextToSpeech: (configurationId: string, content: string) => Promise<Blob>;
28
28
  getAssistantChatConnection: (configurationId: string) => AssistantChatConnection;
29
+ compactAssistantThread: (configurationId: string) => Promise<AssistantThreadCompaction>;
30
+ getAssistantEarlierThread: (configurationId: string, threadId: string, limit: number) => Promise<AssistantEarlierThread>;
29
31
  sendMessage: (configurationId: string, content: string, context?: Record<string, string>) => Promise<ReadableStream<ChatStreamChunk>>;
30
32
  sendToolCallResults: (configurationId: string, calls: ChatToolCall[], results: ChatToolCallResult[], agent?: string) => Promise<ReadableStream<ChatStreamChunk>>;
31
33
  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{InvalidAccessKeyError as i}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)}}},s=(e,r)=>{let o=`${r} API request failed: ${JSON.stringify(e)}`;return t(e).with({statusCode:403,invalidAccessKey:!0},()=>new i).with({statusCode:403},()=>new a(o)).otherwise(()=>Error(o))};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 s(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 s(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 s(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 s(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 s(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 s(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 s(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 s(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});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 s(i.error,"sendMessage");let h=i.data?.pipeThrough(new TextDecoderStream).getReader();if(!h)throw Error("sendMessage API response did not contain a readable stream");let l=o();return n(h,l.writable.getWriter()),l.readable};sendToolCallResults=async(t,a,e,r)=>{let i=await this._authHeaders(),h=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(h.error)throw s(h.error,"sendToolCallResults");let l=h.data?.pipeThrough(new TextDecoderStream).getReader();if(!l)throw Error("sendMessage API response did not contain a readable stream");let c=o();return n(l,c.writable.getWriter()),c.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 s(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 s(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 s(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 s(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 s(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 s(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 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,3 +1,4 @@
1
+ import type { UIMessage } from '@tanstack/ai-client';
1
2
  import type { AccessLevel } from '@salsita-ai/contracts/api';
2
3
  import type { ChatStreamChunk } from '@salsita-ai/contracts/chat';
3
4
  import type { DomainEntity } from '#package/domain';
@@ -88,6 +89,17 @@ export interface AuthorizedPhoenixApiClient<FINALIZE_DATA extends Record<string,
88
89
  getChatConversation: (configurationId: string) => Promise<ChatConversation>;
89
90
  /** Where and how to reach the experimental assistant chat of the configuration. */
90
91
  getAssistantChatConnection: (configurationId: string) => AssistantChatConnection;
92
+ /**
93
+ * Continues the assistant thread of the configuration, which the server no longer lets this session
94
+ * continue, in a new thread that starts from a summary of it. Rejects with an
95
+ * {@link AssistantRequestError} when the server refuses.
96
+ */
97
+ compactAssistantThread: (configurationId: string) => Promise<AssistantThreadCompaction>;
98
+ /**
99
+ * Reads a closed assistant thread of the configuration that a later thread continues, at most
100
+ * `limit` of its newest messages. Rejects with an {@link AssistantRequestError} when the server refuses.
101
+ */
102
+ getAssistantEarlierThread: (configurationId: string, threadId: string, limit: number) => Promise<AssistantEarlierThread>;
91
103
  getSpeechToText: (configurationId: string, blob: Blob) => Promise<string>;
92
104
  getTextToSpeech: (configurationId: string, text: string) => Promise<Blob>;
93
105
  sendMessage: (configurationId: string, message: string, state?: Record<string, string>) => Promise<ReadableStream<ChatStreamChunk>>;
@@ -118,6 +130,28 @@ export interface AssistantChatConnection {
118
130
  */
119
131
  readonly headers: () => Promise<Record<string, string>>;
120
132
  }
133
+ /** An assistant thread that was closed, and the thread that continues it. */
134
+ export interface AssistantThreadCompaction {
135
+ /** The new thread, which the chat of the configuration now runs on. */
136
+ readonly threadId: string;
137
+ /** The closed thread the new one continues. */
138
+ readonly previousThreadId: string;
139
+ }
140
+ /** A closed assistant thread, as the panel paints it above the thread that continues it. */
141
+ export interface AssistantEarlierThread {
142
+ readonly threadId: string;
143
+ readonly messages: ReadonlyArray<UIMessage>;
144
+ /** The thread this one continues in turn; `null` when it is the first of the conversation. */
145
+ readonly previousThreadId: string | null;
146
+ }
147
+ /** A request about an assistant thread that the server answered with a failure. */
148
+ export declare class AssistantRequestError extends Error {
149
+ /** The HTTP status of the answer, which tells a refusal from an outage. */
150
+ readonly status: number;
151
+ constructor(message: string,
152
+ /** The HTTP status of the answer, which tells a refusal from an outage. */
153
+ status: number);
154
+ }
121
155
  export declare class InvalidDeploymentError extends Error {
122
156
  constructor();
123
157
  }