@salsita-ai/sdk 0.50.0-develop.c28cfb7ded → 0.50.0-develop.d0eaeed131

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 (378) hide show
  1. package/README.md +19 -14
  2. package/dist/admin/default-admin-elements.d.ts +9 -0
  3. package/dist/admin/default-admin-elements.js +1 -0
  4. package/dist/admin/default-elements/built-in-entity-element.d.ts +10 -0
  5. package/dist/admin/default-elements/built-in-entity-element.js +1 -0
  6. package/dist/admin/default-elements/built-in-layout-element.d.ts +10 -0
  7. package/dist/admin/default-elements/built-in-layout-element.js +1 -0
  8. package/dist/admin/default-elements/index.d.ts +2 -0
  9. package/dist/admin/default-elements/index.js +1 -0
  10. package/dist/admin/index.d.ts +1 -0
  11. package/dist/admin/index.js +1 -1
  12. package/dist/application-spec/caching/content-diff.js +1 -1
  13. package/dist/application-spec/core/application-file.d.ts +0 -2
  14. package/dist/application-spec/core/application-file.js +1 -1
  15. package/dist/application-spec/errors/diagnostic-codes.d.ts +5 -0
  16. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  17. package/dist/application-spec/errors/diagnostic-messages.d.ts +5 -0
  18. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  19. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  20. package/dist/application-spec/generate-application/code/generate-application-code.d.ts +3 -2
  21. package/dist/application-spec/generate-application/code/generate-application-code.js +1 -1
  22. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +15 -14
  23. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  24. package/dist/application-spec/generate-application/code/templates/admin-config.js +3 -0
  25. package/dist/application-spec/generate-application/code/templates/common/format-property-key.d.ts +7 -0
  26. package/dist/application-spec/generate-application/code/templates/common/format-property-key.js +1 -0
  27. package/dist/application-spec/generate-application/code/templates/common/schema-to-type-string.js +3 -3
  28. package/dist/application-spec/generate-application/code/templates/eslint-config.d.ts +5 -0
  29. package/dist/application-spec/generate-application/code/templates/eslint-config.js +4 -5
  30. package/dist/application-spec/generate-application/code/templates/frontend-config.js +3 -5
  31. package/dist/application-spec/generate-application/code/templates/gitignore.js +0 -3
  32. package/dist/application-spec/generate-application/code/templates/globals.js +7 -5
  33. package/dist/application-spec/generate-application/code/templates/index.d.ts +3 -2
  34. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  35. package/dist/application-spec/generate-application/code/templates/lingui-rc.d.ts +5 -0
  36. package/dist/application-spec/generate-application/code/templates/lingui-rc.js +4 -4
  37. package/dist/application-spec/generate-application/code/templates/prettier-config.d.ts +5 -0
  38. package/dist/application-spec/generate-application/code/templates/prettier-config.js +4 -5
  39. package/dist/application-spec/generate-application/code/templates/root-tsconfig.d.ts +6 -0
  40. package/dist/application-spec/generate-application/code/templates/root-tsconfig.js +2 -0
  41. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  42. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +1 -1
  43. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +5 -5
  44. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +3 -3
  45. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  46. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +2 -2
  47. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +16 -4
  48. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  49. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.d.ts +58 -0
  50. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.js +1 -0
  51. package/dist/application-spec/generate-application/code/templates/spec-code/index.d.ts +2 -0
  52. package/dist/application-spec/generate-application/code/templates/spec-code/index.js +1 -0
  53. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.d.ts +18 -0
  54. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.js +41 -0
  55. package/dist/application-spec/generate-application/code/templates/spec-messages/index.d.ts +1 -0
  56. package/dist/application-spec/generate-application/code/templates/spec-messages/index.js +1 -0
  57. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.d.ts +20 -0
  58. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.js +6 -0
  59. package/dist/application-spec/generate-application/code/templates/tsconfig.d.ts +5 -0
  60. package/dist/application-spec/generate-application/code/templates/tsconfig.js +1 -1
  61. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -3
  62. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.d.ts +4 -3
  63. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +2 -2
  64. package/dist/application-spec/generate-application/runtime/admin-runtime/states-runtime.d.ts +2 -2
  65. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +6 -5
  66. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.d.ts +4 -3
  67. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +2 -2
  68. package/dist/application-spec/generate-application/runtime/configurator-runtime/states-runtime.d.ts +2 -2
  69. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +2 -2
  70. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +2 -2
  71. package/dist/application-spec/generate-application/runtime/sections/data-runtime.d.ts +4 -4
  72. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.d.ts +3 -2
  73. package/dist/application-spec/generate-application/runtime/sections/theme-runtime.d.ts +2 -2
  74. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +3 -3
  75. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.d.ts +9 -0
  76. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.js +1 -0
  77. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.d.ts +8 -0
  78. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.js +1 -0
  79. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.d.ts +27 -0
  80. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.js +1 -0
  81. package/dist/application-spec/generate-application/runtime-spec/index.d.ts +5 -0
  82. package/dist/application-spec/generate-application/runtime-spec/index.js +1 -0
  83. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.d.ts +68 -0
  84. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.js +1 -0
  85. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.d.ts +40 -0
  86. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.js +1 -0
  87. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +28 -0
  88. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  89. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.d.ts +16 -0
  90. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.js +9 -0
  91. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.d.ts +9 -0
  92. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.js +1 -0
  93. package/dist/application-spec/parse-application-files/raw-spec/parse-yaml-spec-file.js +1 -1
  94. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-spec.js +1 -1
  95. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/configurator-spec.js +1 -1
  96. package/dist/application-spec/parse-application-files/spec/common/index.d.ts +1 -0
  97. package/dist/application-spec/parse-application-files/spec/common/index.js +1 -1
  98. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.d.ts +3 -0
  99. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.js +1 -0
  100. package/dist/application-spec/parse-application-files/spec/common/value-type/index.d.ts +5 -0
  101. package/dist/application-spec/parse-application-files/spec/common/value-type/index.js +1 -0
  102. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.d.ts +6 -0
  103. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.js +1 -0
  104. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.d.ts +8 -0
  105. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.js +1 -0
  106. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.d.ts +10 -0
  107. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.js +1 -0
  108. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.d.ts +98 -0
  109. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.js +1 -0
  110. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.d.ts +13 -0
  111. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.js +1 -0
  112. package/dist/application-spec/parse-application-files/spec/components/bindings/index.d.ts +2 -0
  113. package/dist/application-spec/parse-application-files/spec/components/bindings/index.js +1 -1
  114. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.d.ts +24 -0
  115. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.js +1 -0
  116. package/dist/application-spec/parse-application-files/spec/components/component-state-type.d.ts +8 -0
  117. package/dist/application-spec/parse-application-files/spec/components/component-state-type.js +1 -0
  118. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.d.ts +13 -0
  119. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.js +1 -0
  120. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.d.ts +14 -0
  121. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.js +1 -0
  122. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.d.ts +6 -0
  123. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.js +1 -1
  124. package/dist/application-spec/parse-application-files/spec/components/user-components.d.ts +7 -4
  125. package/dist/application-spec/parse-application-files/spec/components/user-components.js +1 -1
  126. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.d.ts +24 -0
  127. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.js +1 -0
  128. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.d.ts +13 -0
  129. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.js +1 -0
  130. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.d.ts +9 -0
  131. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.js +1 -0
  132. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +6 -2
  133. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  134. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.d.ts +3 -1
  135. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  136. package/dist/application-spec/parse-application-files/spec/invariants/invariants.d.ts +2 -2
  137. package/dist/application-spec/parse-application-files/spec/invariants/invariants.js +1 -1
  138. package/dist/application-spec/parse-application-files/spec/model/index.d.ts +1 -0
  139. package/dist/application-spec/parse-application-files/spec/model/index.js +1 -1
  140. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.d.ts +10 -0
  141. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.js +1 -0
  142. package/dist/client/phoenix-api.d.ts +367 -0
  143. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +7 -1
  144. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  145. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +3 -2
  146. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  147. package/dist/configurator/pages/default-configurator-elements.d.ts +2 -1
  148. package/dist/configurator/pages/default-configurator-elements.js +1 -1
  149. package/dist/configurator/pages/default-elements/built-in-entity-element.d.ts +10 -0
  150. package/dist/configurator/pages/default-elements/built-in-entity-element.js +1 -0
  151. package/dist/configurator/pages/default-elements/built-in-layout-element.d.ts +10 -0
  152. package/dist/configurator/pages/default-elements/built-in-layout-element.js +1 -0
  153. package/dist/configurator/pages/default-elements/domain-control-elements.d.ts +6 -0
  154. package/dist/configurator/pages/default-elements/domain-control-elements.js +1 -0
  155. package/dist/configurator/pages/default-elements/index.d.ts +4 -0
  156. package/dist/configurator/pages/default-elements/index.js +1 -0
  157. package/dist/configurator/pages/default-elements/recipe-panel-elements.d.ts +3 -0
  158. package/dist/configurator/pages/default-elements/recipe-panel-elements.js +1 -0
  159. package/dist/configurator/pages/default-elements/sidebar-footer-elements.d.ts +7 -0
  160. package/dist/configurator/pages/default-elements/sidebar-footer-elements.js +1 -0
  161. package/dist/configurator/pages/default-elements/toolbar-elements.d.ts +7 -0
  162. package/dist/configurator/pages/default-elements/toolbar-elements.js +1 -0
  163. package/dist/configurator/ui/SaveMessageSnackbars.d.ts +10 -0
  164. package/dist/configurator/ui/SaveMessageSnackbars.js +1 -0
  165. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -2
  166. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  167. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -1
  168. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  169. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +1 -1
  170. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -1
  171. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +1 -1
  172. package/dist/configurator/ui/assistant/entity-link/index.d.ts +0 -1
  173. package/dist/configurator/ui/assistant/entity-link/index.js +1 -1
  174. package/dist/configurator/ui/assistant/form/AssistantForm.d.ts +19 -0
  175. package/dist/configurator/ui/assistant/form/AssistantForm.js +1 -0
  176. package/dist/configurator/ui/assistant/form/built-in-form-registry.d.ts +10 -0
  177. package/dist/configurator/ui/assistant/form/built-in-form-registry.js +1 -0
  178. package/dist/configurator/ui/assistant/form/compose-answer.d.ts +11 -0
  179. package/dist/configurator/ui/assistant/form/compose-answer.js +1 -0
  180. package/dist/configurator/ui/assistant/form/describe-build-errors.d.ts +6 -0
  181. package/dist/configurator/ui/assistant/form/describe-build-errors.js +1 -0
  182. package/dist/configurator/ui/assistant/form/form-element-definition.d.ts +14 -0
  183. package/dist/configurator/ui/assistant/form/form-element-definition.js +1 -0
  184. package/dist/configurator/ui/assistant/form/form-model.d.ts +38 -0
  185. package/dist/configurator/ui/assistant/form/form-model.js +1 -0
  186. package/dist/configurator/ui/assistant/form/form-registry.d.ts +31 -0
  187. package/dist/configurator/ui/assistant/form/form-registry.js +8 -0
  188. package/dist/configurator/ui/assistant/form/form-state.d.ts +4 -0
  189. package/dist/configurator/ui/assistant/form/form-state.js +1 -0
  190. package/dist/configurator/ui/assistant/form/index.d.ts +2 -0
  191. package/dist/configurator/ui/assistant/form/index.js +1 -0
  192. package/dist/configurator/ui/assistant/form/parse-form-block.d.ts +9 -0
  193. package/dist/configurator/ui/assistant/form/parse-form-block.js +1 -0
  194. package/dist/configurator/ui/assistant/form/read-form-attributes.d.ts +13 -0
  195. package/dist/configurator/ui/assistant/form/read-form-attributes.js +1 -0
  196. package/dist/configurator/ui/assistant/form-elements/FormGroup.d.ts +3 -0
  197. package/dist/configurator/ui/assistant/form-elements/FormGroup.js +1 -0
  198. package/dist/configurator/ui/assistant/form-elements/FormOptions.d.ts +3 -0
  199. package/dist/configurator/ui/assistant/form-elements/FormOptions.js +1 -0
  200. package/dist/configurator/ui/assistant/form-elements/FormReply.d.ts +3 -0
  201. package/dist/configurator/ui/assistant/form-elements/FormReply.js +1 -0
  202. package/dist/configurator/ui/assistant/form-elements/FormText.d.ts +3 -0
  203. package/dist/configurator/ui/assistant/form-elements/FormText.js +1 -0
  204. package/dist/configurator/ui/assistant/form-elements/form-element-props.d.ts +34 -0
  205. package/dist/configurator/ui/assistant/form-elements/form-element-props.js +1 -0
  206. package/dist/configurator/ui/assistant/form-elements/index.d.ts +5 -0
  207. package/dist/configurator/ui/assistant/form-elements/index.js +1 -0
  208. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.d.ts +16 -0
  209. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.js +1 -0
  210. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.d.ts +34 -0
  211. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.js +1 -0
  212. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.d.ts +25 -0
  213. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.js +1 -0
  214. package/dist/configurator/ui/assistant/reference-link/index.d.ts +3 -0
  215. package/dist/configurator/ui/assistant/reference-link/index.js +1 -0
  216. package/dist/configurator/ui/assistant/reference-link/reference-styles.d.ts +12 -0
  217. package/dist/configurator/ui/assistant/reference-link/reference-styles.js +1 -0
  218. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.d.ts +8 -0
  219. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.js +1 -0
  220. package/dist/configurator/ui/assistant/resource-image/AssistantImage.d.ts +9 -0
  221. package/dist/configurator/ui/assistant/resource-image/AssistantImage.js +1 -0
  222. package/dist/configurator/ui/assistant/resource-image/index.d.ts +3 -0
  223. package/dist/configurator/ui/assistant/resource-image/index.js +1 -0
  224. package/dist/configurator/ui/assistant/resource-image/resource-path.d.ts +11 -0
  225. package/dist/configurator/ui/assistant/resource-image/resource-path.js +1 -0
  226. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.d.ts +5 -0
  227. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.js +1 -0
  228. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +2 -0
  229. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -2
  230. package/dist/configurator/ui/assistant/thread-items.d.ts +8 -1
  231. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  232. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -1
  233. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  234. package/dist/configurator/ui/configurator-layout/slots/services/Services.js +1 -1
  235. package/dist/configurator/ui/legacy/layout/common/SummaryReadLayout.js +1 -1
  236. package/dist/configurator/ui/legacy/layout/simple/SimpleOwnerLayout.js +1 -1
  237. package/dist/configurator/ui/legacy/layout/steps/StepsOwnerLayout.js +1 -1
  238. package/dist/configurator/ui/legacy/layout/tabs/TabsOwnerLayout.js +1 -1
  239. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.d.ts +1 -0
  240. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.js +1 -1
  241. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.d.ts +1 -0
  242. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.js +1 -1
  243. package/dist/docs/controls/select-child-entity/cardselect.mdx +1 -0
  244. package/dist/docs/fabs/basic.mdx +2 -2
  245. package/dist/docs/index.json +1 -1
  246. package/dist/docs/layouts/custom-layout.mdx +324 -15
  247. package/dist/docs/phoenix/clerk-sign-in.mdx +1 -1
  248. package/dist/docs/phoenix/components.mdx +6 -0
  249. package/dist/docs/phoenix/configurator-interface.mdx +10 -10
  250. package/dist/docs/phoenix/deployments.mdx +2 -6
  251. package/dist/docs/phoenix/domain-model.mdx +2 -0
  252. package/dist/docs/phoenix/getting-started.mdx +6 -3
  253. package/dist/docs/phoenix/layout-slots.mdx +9 -9
  254. package/dist/docs/phoenix/localization.mdx +10 -6
  255. package/dist/docs/phoenix/migration-guide.mdx +24 -11
  256. package/dist/docs/phoenix/phoenix-cli.mdx +65 -20
  257. package/dist/docs/phoenix/project-structure.mdx +66 -32
  258. package/dist/docs/phoenix/quickstart.mdx +7 -7
  259. package/dist/docs/phoenix/sdk-builder-workflow.mdx +7 -7
  260. package/dist/docs/phoenix/testing.mdx +8 -0
  261. package/dist/docs/phoenix/webhooks.mdx +4 -4
  262. package/dist/domain/application/assistant/assistant-form-elements.d.ts +28 -0
  263. package/dist/domain/application/assistant/assistant-form-elements.js +1 -0
  264. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  265. package/dist/domain/application/assistant/index.d.ts +2 -0
  266. package/dist/domain/application/assistant/index.js +1 -1
  267. package/dist/domain/application/assistant-recipe-groups.d.ts +3 -1
  268. package/dist/domain/core/schema/extended-schema-validator.js +1 -1
  269. package/dist/domain/domain-runtime/spec/module-checks/element-registration.d.ts +12 -11
  270. package/dist/domain/domain-runtime/spec/module-checks/element-registration.js +1 -1
  271. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +1 -1
  272. package/dist/domain/domain-runtime/spec/module-checks/index.js +1 -1
  273. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  274. package/dist/domain/system-components/child-entity-selection.js +1 -1
  275. package/dist/domain/system-components/common/scene-entity-control-schema.d.ts +3 -0
  276. package/dist/domain/system-components/common/scene-entity-control-schema.js +1 -1
  277. package/dist/globals/index.d.ts +2 -0
  278. package/dist/i18n/locales/cs/messages.js +1 -1
  279. package/dist/i18n/locales/da/messages.js +1 -1
  280. package/dist/i18n/locales/de/messages.js +1 -1
  281. package/dist/i18n/locales/de-AT/messages.js +1 -1
  282. package/dist/i18n/locales/en/messages.js +1 -1
  283. package/dist/i18n/locales/en-AU/messages.js +1 -1
  284. package/dist/i18n/locales/en-GB/messages.js +1 -1
  285. package/dist/i18n/locales/es/messages.js +1 -1
  286. package/dist/i18n/locales/fr/messages.js +1 -1
  287. package/dist/i18n/locales/hu/messages.js +1 -1
  288. package/dist/i18n/locales/it/messages.js +1 -1
  289. package/dist/i18n/locales/nl/messages.js +1 -1
  290. package/dist/i18n/locales/pl/messages.js +1 -1
  291. package/dist/i18n/locales/pt/messages.js +1 -1
  292. package/dist/i18n/locales/ro/messages.js +1 -1
  293. package/dist/i18n/locales/sk/messages.js +1 -1
  294. package/dist/i18n/locales/tr/messages.js +1 -1
  295. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  296. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  297. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +79 -80
  298. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +10 -11
  299. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +9 -10
  300. package/dist/phoenix/application-spec/application-spec-builder.d.ts +0 -2
  301. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  302. package/dist/phoenix/application-spec/generate-application-spec-project.d.ts +0 -2
  303. package/dist/phoenix/application-spec/generate-application-spec-project.js +2 -2
  304. package/dist/phoenix/application-spec/generate-application-spec-story.js +2 -2
  305. package/dist/phoenix/application-spec/generate-project-files.d.ts +0 -2
  306. package/dist/phoenix/application-spec/project-files.js +1 -1
  307. package/dist/phoenix/bin.d.ts +2 -0
  308. package/dist/phoenix/bin.js +2 -0
  309. package/dist/phoenix/check-configs/built-in-eslint-config.d.ts +9 -0
  310. package/dist/phoenix/check-configs/built-in-eslint-config.js +1 -0
  311. package/dist/phoenix/check-configs/eslint-config.d.ts +10 -0
  312. package/dist/phoenix/check-configs/eslint-config.js +1 -0
  313. package/dist/phoenix/check-configs/index.d.ts +8 -0
  314. package/dist/phoenix/check-configs/index.js +1 -0
  315. package/dist/phoenix/check-configs/typescript-project.d.ts +5 -0
  316. package/dist/phoenix/check-configs/typescript-project.js +1 -0
  317. package/dist/phoenix/cli.d.ts +0 -1
  318. package/dist/phoenix/cli.js +1 -2
  319. package/dist/phoenix/commands/build.js +1 -1
  320. package/dist/phoenix/commands/check.js +1 -1
  321. package/dist/phoenix/commands/clean.js +1 -1
  322. package/dist/phoenix/commands/deploy.js +2 -2
  323. package/dist/phoenix/commands/deps/deps.d.ts +73 -0
  324. package/dist/phoenix/commands/deps/deps.js +3 -0
  325. package/dist/phoenix/commands/deps/index.d.ts +1 -0
  326. package/dist/phoenix/commands/deps/index.js +1 -0
  327. package/dist/phoenix/commands/deps/sdk-manifest.d.ts +12 -0
  328. package/dist/phoenix/commands/deps/sdk-manifest.js +1 -0
  329. package/dist/phoenix/commands/dev.js +5 -5
  330. package/dist/phoenix/commands/fix.js +1 -1
  331. package/dist/phoenix/commands/index.d.ts +1 -0
  332. package/dist/phoenix/commands/index.js +1 -1
  333. package/dist/phoenix/commands/init.d.ts +17 -5
  334. package/dist/phoenix/commands/init.js +1 -1
  335. package/dist/phoenix/commands/link.js +1 -1
  336. package/dist/phoenix/commands/prettier.js +1 -1
  337. package/dist/phoenix/commands/sync.js +1 -1
  338. package/dist/phoenix/commands/unlink.js +1 -1
  339. package/dist/phoenix/services/application-spec-project-watcher.d.ts +2 -2
  340. package/dist/phoenix/services/application-spec-project-watcher.js +2 -2
  341. package/dist/phoenix/services/lingui.d.ts +8 -0
  342. package/dist/phoenix/services/lingui.js +1 -1
  343. package/dist/phoenix/services/swc.js +1 -1
  344. package/dist/phoenix/services/vite-config.js +1 -1
  345. package/dist/phoenix/utils/index.d.ts +4 -2
  346. package/dist/phoenix/utils/index.js +1 -1
  347. package/dist/phoenix/utils/node-version/index.d.ts +1 -0
  348. package/dist/phoenix/utils/node-version/index.js +1 -0
  349. package/dist/phoenix/utils/node-version/supported-node-version.d.ts +12 -0
  350. package/dist/phoenix/utils/node-version/supported-node-version.js +4 -0
  351. package/dist/phoenix/utils/package-info.d.ts +0 -9
  352. package/dist/phoenix/utils/package-info.js +1 -1
  353. package/dist/phoenix/utils/package-manager/index.d.ts +2 -0
  354. package/dist/phoenix/utils/package-manager/index.js +1 -0
  355. package/dist/phoenix/utils/package-manager/package-manager-commands.d.ts +19 -0
  356. package/dist/phoenix/utils/package-manager/package-manager-commands.js +1 -0
  357. package/dist/phoenix/utils/package-manager/pnpm-project.d.ts +9 -0
  358. package/dist/phoenix/utils/package-manager/pnpm-project.js +1 -0
  359. package/dist/phoenix/utils/run-command.d.ts +11 -0
  360. package/dist/phoenix/utils/run-command.js +1 -1
  361. package/dist/phoenix/utils/sdk-tool/index.d.ts +1 -0
  362. package/dist/phoenix/utils/sdk-tool/index.js +1 -0
  363. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.d.ts +15 -0
  364. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.js +1 -0
  365. package/dist/react-sdk/domain-application-context/DomainLifecycleBoundary.js +1 -1
  366. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +15 -4
  367. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -1
  368. package/dist/ui-sdk/theme/types.d.ts +1 -1
  369. package/package.json +16 -12
  370. package/schema/domain-spec.json +86 -8
  371. package/dist/application-spec/generate-application/code/templates/nvmrc.d.ts +0 -1
  372. package/dist/application-spec/generate-application/code/templates/nvmrc.js +0 -2
  373. package/dist/application-spec/generate-application/code/templates/package-json.d.ts +0 -10
  374. package/dist/application-spec/generate-application/code/templates/package-json.js +0 -1
  375. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +0 -5
  376. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +0 -1
  377. package/dist/phoenix/commands/generate-project-files.d.ts +0 -6
  378. package/dist/phoenix/commands/generate-project-files.js +0 -1
@@ -0,0 +1,13 @@
1
+ import type { EnhancedJsonSchemaType, FILTER_CRITERION_KEYS } from '../../../core/index.js';
2
+ /**
3
+ * The type each filter criterion takes, as an SDK schema that states exactly the TypeScript type of
4
+ * `ComponentSystemFilterProps`: the modes, roles and viewports are their literal unions and the
5
+ * entity ids are `DomainEntityId`s. `FILTER_CRITERION_SCHEMAS`, which infers the type of an
6
+ * expression read in a criterion, is wider where the JSON schema of the filter is.
7
+ */
8
+ export declare const FILTER_CRITERION_TYPE_SCHEMAS: Readonly<Record<(typeof FILTER_CRITERION_KEYS)[number], EnhancedJsonSchemaType>>;
9
+ /**
10
+ * The type a root filter (`$filter: { $read: x }`) takes, `ComponentSystemFilter`: a boolean, or an
11
+ * object of the criteria other than the export ones.
12
+ */
13
+ export declare const ROOT_FILTER_TYPE_SCHEMA: EnhancedJsonSchemaType;
@@ -0,0 +1 @@
1
+ import{SessionRole as e}from"@salsita-ai/contracts/api";import{VIEWPORTS as t}from"#package/domain";let r={type:"string",tsType:"DomainEntityId"},a={anyOf:[r,{type:"object",properties:{id:r},required:["id"]}]},i={anyOf:[{type:"array",items:a},a]},s={type:"array",items:{type:"string"}},o={type:"boolean"};export const FILTER_CRITERION_TYPE_SCHEMAS={navigationStates:s,viewStates:s,toolStates:s,exportStates:s,modes:{type:"array",items:{enum:["owner","read","finalize"]}},roles:{type:"array",items:{enum:Object.values(e)}},selectedEntityIds:i,hoveredEntityIds:i,draggedEntityIds:i,exportedEntityIds:i,active:o,fullscreen:o,debug:o,viewports:{type:"array",items:{enum:[...t]}}};let n=new Set(["exportedEntityIds","exportStates"]),p=Object.fromEntries(Object.entries(FILTER_CRITERION_TYPE_SCHEMAS).filter(([e])=>!n.has(e)));export const ROOT_FILTER_TYPE_SCHEMA={anyOf:[o,{type:"object",properties:p}]};
@@ -0,0 +1,14 @@
1
+ import type { SchemaPathSegment } from '../../../core/index.js';
2
+ import { type ValueType } from '../common/index.js';
3
+ import { type ComponentReadBindingContext } from './bindings/index.js';
4
+ /**
5
+ * Reports a value written in a component prop or filter where the component expects an entity id
6
+ * (`DomainEntityId`). The schema checks the id's form, but the id's type is branded, so the type
7
+ * check of generated code rejects any string written in YAML: the id has to be read from the
8
+ * domain state with `$read` or `$bind`.
9
+ *
10
+ * @param value - A primitive value written in the spec
11
+ * @param path - The prop path or filter criterion the value is written at
12
+ * @param expected - The type the component expects there
13
+ */
14
+ export declare const checkStaticEntityId: (value: string | number | boolean | null, path: readonly SchemaPathSegment[], expected: ValueType, context: Omit<ComponentReadBindingContext, 'resolvedShape'>) => void;
@@ -0,0 +1 @@
1
+ import{DiagnosticCode as i,diagnosticMessages as r}from"../../../errors/index.js";import{formatValueType as o,isAssignableValueType as n,literalValueType as t}from"../common/index.js";import{componentParseContext as e,componentPath as m}from"./bindings/index.js";export const checkStaticEntityId=(s,d,T,c)=>{!T.some(i=>"string"===i.kind&&void 0!==i.named&&void 0===i.named.acceptsLiteral)||n(t(s),T)||e(c.parsingContext,c,d).error(i.COMPONENT_STATIC_ENTITY_ID,r.COMPONENT_STATIC_ENTITY_ID(m(c,d),JSON.stringify(s),o(T)))};
@@ -1,4 +1,6 @@
1
1
  import { type EnhancedJsonObject, type ParseContext } from '../../../core/index.js';
2
+ import { type ValueTypeResolution } from '../common/index.js';
3
+ import type { ExpressionRead } from '../expressions/expression-read.js';
2
4
  import type { Expression } from '../expressions/expression.js';
3
5
  import type { EntityOrAliasName, InstanceName, ResolvedShape } from '../model/index.js';
4
6
  import type { ComponentEntry } from './component-entry.js';
@@ -11,10 +13,14 @@ interface UserComponentProps {
11
13
  interface UserComponentContext {
12
14
  readonly resolvedShape: ResolvedShape;
13
15
  readonly parsingContext: ParseContext;
16
+ /** Resolves the refs of field schemas and the entity types of a name, for the type checks. */
17
+ readonly typeResolution: Omit<ValueTypeResolution, 'author' | 'definitions'>;
14
18
  }
15
19
  export interface UserComponentResult {
16
20
  readonly entry: ComponentEntry;
17
21
  readonly inferredExpressions: readonly Expression[];
22
+ /** Every `$read` of an expression in the instance, with the type expected where it is read. */
23
+ readonly expressionReads: readonly ExpressionRead[];
18
24
  }
19
25
  /**
20
26
  * Creates a user-declared ComponentEntry from raw YAML props.
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{componentsByName as t}from"#package/domain";import{FILTER_KEY as n,READ_MARKER_KEY as r,isEvalMarker as i,isImportRefShaped as a,isRawBindMarker as o,isRawDataRefMarker as m,isRawEvalWriteMarker as p,isRawReadMarker as s,isRawReadWriteMarker as l,navigateSchema as d}from"../../../core/index.js";import{DiagnosticCode as f,diagnosticMessages as c}from"../../../errors/index.js";import{MemoEvalPlan as y}from"../expressions/memo-eval-plan.js";import{ComponentReadBinding as g,ComponentWriteBinding as u,isExpressionReadTarget as N}from"./bindings/index.js";import{ComponentFilters as $,FILTER_CRITERION_SCHEMAS as O}from"./component-filter.js";let S=e=>e.reduce((e,t)=>"number"==typeof t?`${e}[${t}]`:0===e.length?t:`${e}.${t}`,""),T=(e,t,n,r)=>{if(null==e||"object"!=typeof e)return e;if(s(e))return n.addReadBinding(e.$read,t),{$target:e.$read};if(m(e))return void r.parsingContext.at(String(r.entityKey),r.componentName,String(r.instanceName),...t.map(String)).error(f.COMPONENT_DATA_REF_UNSUPPORTED,c.COMPONENT_DATA_REF_UNSUPPORTED(String(r.entityKey),r.componentName,String(r.instanceName),S(t),e.$read,e.$data));if(o(e))return n.addReadBinding(e.$bind,t),{$target:e.$bind};if(i(e))return e;if(a(e))return void r.parsingContext.at(String(r.entityKey),r.componentName,String(r.instanceName),...t.map(String)).error(f.COMPONENT_IMPORT_REF_UNSUPPORTED,c.COMPONENT_IMPORT_REF_UNSUPPORTED(String(r.entityKey),r.componentName,String(r.instanceName),S(t),e.$importRef.module,e.$importRef.member));if(Array.isArray(e))return e.map((e,i)=>T(e,[...t,i],n,r)).filter(e=>void 0!==e);let p={};for(let[i,a]of Object.entries(e)){let e=T(a,[...t,i],n,r);void 0!==e&&(p[i]=e)}return p},A=(t,n,r)=>{for(let i of t.items)if("gradual"===i.kind){for(let[t,a]of Object.entries(i))if("kind"!==t&&a?.kind==="dynamic"&&a.target&&N(a.target)){let i=O[t];i&&r.push(e({entityKey:n,name:a.target,schema:i,implementation:{kind:"user"}}))}}};export const UserComponentEntry=(i,a)=>{let{implementation:m,inferredExpressions:s}=((i,a)=>{let m=t.get(i.componentName),s=m?.schema,O=new Set,S=[],P=[],E=[],R={entityKey:i.typeOrAlias,componentName:i.componentName,instanceName:i.instanceName,resolvedShape:a.resolvedShape,parsingContext:a.parsingContext},_={entityKey:i.typeOrAlias,componentName:i.componentName,instanceName:i.instanceName,resolvedShape:a.resolvedShape,parsingContext:a.parsingContext},h=(t,n)=>{if(!O.has(t)&&(O.add(t),S.push(g(t,R)),N(t)&&s)){let r=((t,n,r,i)=>{let{schema:a,lastDeclaredType:o,pathSinceDeclaredType:m}=d(r,n),p=n=>e({entityKey:i,name:t,schema:n,implementation:{kind:"user"}});if(void 0!==o){let e=m.map(e=>"number"==typeof e?"[number]":`['${e}']`).join("");return p({...a,tsType:`${o.tsType}${e}`,import:o.import})}if(Object.keys(a).length>0)return p(a)})(t,n,s,i.typeOrAlias);r&&E.push(r)}},b={addReadBinding:h},v=$(i.rawProps[n]),C=`${String(i.typeOrAlias)}.${String(i.instanceName)}`;if((e=>{if(!(r in e)||"string"!=typeof e[r])return!1;for(let t of Object.keys(e))if(t!==r&&t!==n)return!1;return!0})(i.rawProps)){let e=i.rawProps[r];return h(e,[]),A(v,i.typeOrAlias,E),{implementation:{kind:"userBound",filters:v,plan:y({$target:e},C),implementation:{kind:"rootRead",readBinding:S[0]}},inferredExpressions:E}}let k={};for(let[e,t]of Object.entries(i.rawProps)){if(e===n)continue;if(o(t)){P.push(u(e,t.$bind,_)),h(t.$bind,[e]),k[e]={$target:t.$bind};continue}if(l(t)){h(t.$read,[e]),P.push(u(e,t.$write,_)),k[e]={$target:t.$read};continue}if(p(t)){P.push(u(e,t.$write,_)),k[e]={$eval:t.$eval};continue}let r=T(t,[e],b,R);void 0!==r&&(k[e]=r)}let j=new Map;for(let e of P){let t=j.get(e.entityField);t?a.parsingContext.error(f.WRITE_BINDING_DUPLICATE_TARGET,c.WRITE_BINDING_DUPLICATE_TARGET(String(i.typeOrAlias),i.componentName,String(i.instanceName),e.entityField,t,e.propKey)):j.set(e.entityField,e.propKey)}return A(v,i.typeOrAlias,E),{implementation:{kind:"userBound",filters:v,plan:y(k,C),implementation:{kind:"composite",resolvedProps:k,readBindings:S,writeBindings:P}},inferredExpressions:E}})(i,a);return{entry:e({typeOrAlias:i.typeOrAlias,instanceName:i.instanceName,isAlias:"alias"===a.resolvedShape.kind,componentName:i.componentName,implementation:m}),inferredExpressions:s}};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{componentsByName as t}from"#package/domain";import{FILTER_CRITERION_KEYS as n,FILTER_KEY as r,FILTER_OR_KEY as i,READ_MARKER_KEY as o,isEnhancedJsonObject as a,isEvalMarker as m,isImportRefShaped as p,isRawBindMarker as s,isRawDataRefMarker as l,isRawEvalWriteMarker as d,isRawReadMarker as c,isRawReadWriteMarker as f,navigateSchema as y}from"../../../core/index.js";import{DiagnosticCode as u,diagnosticMessages as g}from"../../../errors/index.js";import{ValueType as N,valueTypeAt as $}from"../common/index.js";import{MemoEvalPlan as O}from"../expressions/memo-eval-plan.js";import{ComponentReadBinding as S,ComponentWriteBinding as A,checkReadBindingType as k,componentPath as R,formatComponentPropPath as T,isExpressionReadTarget as b}from"./bindings/index.js";import{ComponentFilters as h,FILTER_CRITERION_SCHEMAS as P}from"./component-filter.js";import{componentStateType as E}from"./component-state-type.js";import{FILTER_CRITERION_TYPE_SCHEMAS as j,ROOT_FILTER_TYPE_SCHEMA as v}from"./filter-criterion-types.js";import{checkStaticEntityId as _}from"./static-entity-id.js";let x=(e,t,n,r)=>{if(null==e||"object"!=typeof e)return void 0!==e&&n.checkStaticValue(e,t),e;if(c(e))return n.addReadBinding(e.$read,t,"$read"),{$target:e.$read};if(l(e))return void r.parsingContext.at(String(r.entityKey),r.componentName,String(r.instanceName),...t.map(String)).error(u.COMPONENT_DATA_REF_UNSUPPORTED,g.COMPONENT_DATA_REF_UNSUPPORTED(String(r.entityKey),r.componentName,String(r.instanceName),T(t),e.$read,e.$data));if(s(e))return n.addReadBinding(e.$bind,t,"$bind"),{$target:e.$bind};if(m(e))return e;if(p(e))return void r.parsingContext.at(String(r.entityKey),r.componentName,String(r.instanceName),...t.map(String)).error(u.COMPONENT_IMPORT_REF_UNSUPPORTED,g.COMPONENT_IMPORT_REF_UNSUPPORTED(String(r.entityKey),r.componentName,String(r.instanceName),T(t),e.$importRef.module,e.$importRef.member));if(Array.isArray(e))return e.map((e,i)=>x(e,[...t,i],n,r)).filter(e=>void 0!==e);let i={};for(let[o,a]of Object.entries(e)){let e=x(a,[...t,o],n,r);void 0!==e&&(i[o]=e)}return i},C=(t,n,r)=>{for(let i of t.items)if("gradual"===i.kind){for(let[t,o]of Object.entries(i))if("kind"!==t&&o?.kind==="dynamic"&&o.target&&b(o.target)){let i=P[t];i&&r.push(e({entityKey:n,name:o.target,schema:i,implementation:{kind:"user"}}))}}},U=(e,t,n,r)=>{if("string"==typeof e||"number"==typeof e||"boolean"==typeof e||null===e)return void _(e,t,n,r);if("object"==typeof e)for(let[i,o]of Object.entries(e)){let a=Array.isArray(e)?Number(i):i;U(o,[...t,a],$(n,[a]),r)}};export const UserComponentEntry=(m,p)=>{let{implementation:l,inferredExpressions:c,expressionReads:T}=((m,p)=>{let l,c=t.get(m.componentName),T=c?.schema,P=new Set,w=[],D=[],I=[],K={entityKey:m.typeOrAlias,componentName:m.componentName,instanceName:m.instanceName,resolvedShape:p.resolvedShape,parsingContext:p.parsingContext},B={entityKey:m.typeOrAlias,componentName:m.componentName,instanceName:m.instanceName,resolvedShape:p.resolvedShape,parsingContext:p.parsingContext},F={...K,typeResolution:p.typeResolution},M=e=>T?$(l??=E(T,p.typeResolution),e):[{kind:"unknown"}],G=[],V=e=>{b(e.target)?G.push({entityKey:m.typeOrAlias,name:e.target,expected:e.expected,location:R(K,e.path)}):k(e,F)},L=(t,n,r)=>{if(V({marker:r,target:t,path:n,expected:M(n)}),!P.has(t)&&(P.add(t),w.push(S(t,K)),b(t)&&T)){let r=((t,n,r,i)=>{let{schema:o,lastDeclaredType:a,pathSinceDeclaredType:m}=y(r,n),p=n=>e({entityKey:i,name:t,schema:n,implementation:{kind:"user"}});if(void 0!==a){let e=m.map(e=>"number"==typeof e?"[number]":`['${e}']`).join("");return p({...o,tsType:`${a.tsType}${e}`,import:a.import})}if(Object.keys(o).length>0)return p(o)})(t,n,T,m.typeOrAlias);r&&I.push(r)}},W={addReadBinding:L,checkStaticValue:(e,t)=>_(e,t,M(t),K)},q=h(m.rawProps[r]);((e,t,o,m)=>{let p=e=>N(e,{...o.typeResolution,author:"sdk"}),s=void 0!==e&&a(e)&&Array.isArray(e[i]);for(let[e,a]of t.items.entries()){let t=s?[r,i,e]:[r];if("root"===a.kind){m({marker:"$read",target:a.target,path:t,expected:p(v)});continue}for(let e of n){let n=a[e],r=[...t,e],i=p(j[e]);n?.kind==="dynamic"?m({marker:"$read",target:n.target,path:r,expected:i}):n?.kind==="static"&&U(n.value,r,i,o)}}})(m.rawProps[r],q,F,V);let z=`${String(m.typeOrAlias)}.${String(m.instanceName)}`;if((e=>{if(!(o in e)||"string"!=typeof e[o])return!1;for(let t of Object.keys(e))if(t!==o&&t!==r)return!1;return!0})(m.rawProps)){let e=m.rawProps[o];return L(e,[],"$read"),C(q,m.typeOrAlias,I),{implementation:{kind:"userBound",filters:q,plan:O({$target:e},z),implementation:{kind:"rootRead",readBinding:w[0]}},inferredExpressions:I,expressionReads:G}}let H={};for(let[e,t]of Object.entries(m.rawProps)){if(e===r)continue;if(s(t)){D.push(A(e,t.$bind,B)),L(t.$bind,[e],"$bind"),H[e]={$target:t.$bind};continue}if(f(t)){L(t.$read,[e],"$read"),D.push(A(e,t.$write,B)),H[e]={$target:t.$read};continue}if(d(t)){D.push(A(e,t.$write,B)),H[e]={$eval:t.$eval};continue}let n=x(t,[e],W,K);void 0!==n&&(H[e]=n)}let J=new Map;for(let e of D){let t=J.get(e.entityField);t?p.parsingContext.error(u.WRITE_BINDING_DUPLICATE_TARGET,g.WRITE_BINDING_DUPLICATE_TARGET(String(m.typeOrAlias),m.componentName,String(m.instanceName),e.entityField,t,e.propKey)):J.set(e.entityField,e.propKey)}return C(q,m.typeOrAlias,I),{implementation:{kind:"userBound",filters:q,plan:O(H,z),implementation:{kind:"composite",resolvedProps:H,readBindings:w,writeBindings:D}},inferredExpressions:I,expressionReads:G}})(m,p);return{entry:e({typeOrAlias:m.typeOrAlias,instanceName:m.instanceName,isAlias:"alias"===p.resolvedShape.kind,componentName:m.componentName,implementation:l}),inferredExpressions:c,expressionReads:T}};
@@ -1,19 +1,22 @@
1
1
  import { Branded } from '@salsita-ai/common/utils';
2
- import type { ParseContext } from '../../../core/index.js';
2
+ import type { ParseContext, PhoenixDefinitions } from '../../../core/index.js';
3
3
  import type { MergedComponents } from '../../merge/index.js';
4
+ import type { ExpressionRead } from '../expressions/expression-read.js';
4
5
  import type { Expression } from '../expressions/expression.js';
5
- import type { ResolvedShapes } from '../model/index.js';
6
+ import type { ModelVersion } from '../model/index.js';
6
7
  import type { ComponentEntry } from './component-entry.js';
7
8
  /** User-declared component entries, flattened from the nested merge map. */
8
9
  export type UserComponents = Branded<'UserComponents', readonly ComponentEntry[]>;
9
10
  interface UserComponentsContext {
10
- readonly allNames: ReadonlySet<string>;
11
- readonly resolvedShapes: ResolvedShapes;
11
+ readonly latestModel: ModelVersion;
12
+ readonly phxDefinitions: PhoenixDefinitions;
12
13
  readonly parsingContext: ParseContext;
13
14
  }
14
15
  interface UserComponentsResult {
15
16
  readonly components: UserComponents;
16
17
  readonly expressions: readonly Expression[];
18
+ /** Every `$read` of an expression in a component, with the type expected where it is read. */
19
+ readonly expressionReads: readonly ExpressionRead[];
17
20
  }
18
21
  /**
19
22
  * Flattens the nested merge map into a flat list of ComponentEntry objects.
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{DiagnosticCode as r,diagnosticMessages as t}from"../../../errors/index.js";import{InstanceName as o,getResolvedShape as n}from"../model/index.js";import{UserComponentEntry as s}from"./user-component-entry.js";export const UserComponents=(i,p)=>{let{allNames:m,parsingContext:f}=p,l=[],N=[],O=[...m];for(let[e,c]of Object.entries(i)){if(!m.has(e)){f.error(r.COMPONENT_UNKNOWN_ENTITY_KEY,t.COMPONENT_UNKNOWN_ENTITY_KEY(e,O));continue}let i=n(p.resolvedShapes,e);for(let[r,t]of Object.entries(c))for(let[n,p]of Object.entries(t)){let t=o(n,e,r,f);if(!t)continue;let m=s({typeOrAlias:e,instanceName:t,componentName:r,rawProps:p},{resolvedShape:i,parsingContext:f});l.push(m.entry),N.push(...m.inferredExpressions)}}return{components:e(l),expressions:N}};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{DiagnosticCode as o,diagnosticMessages as r}from"../../../errors/index.js";import{InstanceName as t,ModelTypeResolution as s,getResolvedShape as n}from"../model/index.js";import{UserComponentEntry as i}from"./user-component-entry.js";export const UserComponents=(p,m)=>{let{latestModel:f,parsingContext:l}=m,N=f.allNames,a=s(f,m.phxDefinitions),O=[],c=[],u=[],x=[...N];for(let[e,s]of Object.entries(p)){if(!N.has(e)){l.error(o.COMPONENT_UNKNOWN_ENTITY_KEY,r.COMPONENT_UNKNOWN_ENTITY_KEY(e,x));continue}let p=n(f.resolvedShapes,e);for(let[o,r]of Object.entries(s))for(let[s,n]of Object.entries(r)){let r=t(s,e,o,l);if(!r)continue;let m=i({typeOrAlias:e,instanceName:r,componentName:o,rawProps:n},{resolvedShape:p,parsingContext:l,typeResolution:a});O.push(m.entry),c.push(...m.inferredExpressions),u.push(...m.expressionReads)}}return{components:e(O),expressions:c,expressionReads:u}};
@@ -0,0 +1,24 @@
1
+ import type { ParseContext } from '../../../core/index.js';
2
+ import type { EntityOrAliasName, ExpressionName, ModelTypeResolution } from '../model/index.js';
3
+ import type { ExpressionRead } from './expression-read.js';
4
+ import type { Expression } from './expression.js';
5
+ /** Where an expression is declared: the spec section and the entity or alias under it. */
6
+ export interface ExpressionLocation {
7
+ readonly section: string;
8
+ readonly entityKey: EntityOrAliasName;
9
+ }
10
+ interface ExpressionReadTypesInput {
11
+ readonly userExpressions: readonly Expression[];
12
+ readonly expressionReads: readonly ExpressionRead[];
13
+ /** Finds where a read expression is declared, which is where a conflict is reported. */
14
+ readonly locateDeclaration: (entityKey: EntityOrAliasName, name: ExpressionName) => ExpressionLocation;
15
+ }
16
+ /**
17
+ * Reports an expression whose declared type and the types its `$read`s expect have no value in
18
+ * common, or whose `$read`s expect types that have none: generated code types the expression by
19
+ * the intersection of them all, which no value can be, so the implementation cannot type-check.
20
+ * A type given as `tsType` text is not read, and never reported. Relation and invariant
21
+ * expressions state their types only as `tsType`, so only a conflict among their reads is reported.
22
+ */
23
+ export declare const checkExpressionReadTypes: ({ userExpressions, expressionReads, locateDeclaration }: ExpressionReadTypesInput, typeResolution: ModelTypeResolution, ctx: ParseContext) => void;
24
+ export {};
@@ -0,0 +1 @@
1
+ import{DiagnosticCode as e,diagnosticMessages as t}from"../../../errors/index.js";import{ValueType as r,formatValueType as n,intersectValueTypes as o}from"../common/index.js";export const checkExpressionReadTypes=({userExpressions:i,expressionReads:a,locateDeclaration:c},d,l)=>{let s=new Map,m=(e,t)=>{let r=`${String(e)}\0${String(t)}`,n=s.get(r);return n||(n={entityKey:e,name:t,reads:[]},s.set(r,n)),n};for(let e of i)e.declaredSchema&&(m(e.entityKey,e.name).declared=r(e.declaredSchema,{...d,author:"project"}));for(let e of a)m(e.entityKey,e.name).reads.push(e);for(let{entityKey:r,name:i,declared:a,reads:d}of s.values()){let[s,...m]=[...a?[a]:[],...d.map(e=>e.expected)];if(!s||m.reduce(o,s).length>0)continue;let p=c(r,i);l.at(p.section,String(p.entityKey),String(i)).error(e.EXPRESSION_READ_TYPE_CONFLICT,t.EXPRESSION_READ_TYPE_CONFLICT(String(p.entityKey),String(i),a&&n(a),d.map(e=>`${n(e.expected)} at "${e.location}"`)))}};
@@ -0,0 +1,13 @@
1
+ import type { ValueType } from '../common/index.js';
2
+ import type { EntityOrAliasName, ExpressionName } from '../model/index.js';
3
+ /**
4
+ * A `$read` of an expression in a component, with the type the component expects where the value
5
+ * goes: a prop, the whole state, a filter criterion or the whole filter.
6
+ */
7
+ export interface ExpressionRead {
8
+ readonly entityKey: EntityOrAliasName;
9
+ readonly name: ExpressionName;
10
+ readonly expected: ValueType;
11
+ /** The place of the read, such as `Hole.detail.main.title`. */
12
+ readonly location: string;
13
+ }
@@ -0,0 +1,9 @@
1
+ import { type EnhancedJsonValue } from '../../../core/index.js';
2
+ import { ValueType } from '../common/index.js';
3
+ import type { ModelTypeResolution } from '../model/index.js';
4
+ /**
5
+ * The type generated code gives the inline value of an expression that declares a schema: a `$msg`
6
+ * compiles to a lingui `MessageDescriptor`. The only other such value is an `$eval`, which is code
7
+ * whose type is not read; constants never declare a schema.
8
+ */
9
+ export declare const expressionValueType: (value: EnhancedJsonValue, resolution: ModelTypeResolution) => ValueType;
@@ -0,0 +1 @@
1
+ import{isMsgMarker as e}from"../../../core/index.js";import{ValueType as o}from"../common/index.js";let r=[{kind:"unknown"}];export const expressionValueType=(n,s)=>e(n)?o({$ref:"phx:MessageDescriptor"},{...s,author:"sdk"}):r;
@@ -1,7 +1,8 @@
1
1
  import { Branded } from '@salsita-ai/common/utils';
2
- import { type EvalExpressionParser, type ParseContext } from '../../../core/index.js';
2
+ import { type EvalExpressionParser, type ParseContext, type PhoenixDefinitions } from '../../../core/index.js';
3
3
  import type { MergedExpressions } from '../../merge/index.js';
4
- import type { Aliases, EntityOrAliasName, EntityTypeName, ExpressionName, ModelVersion } from '../model/index.js';
4
+ import { type Aliases, type EntityOrAliasName, type EntityTypeName, type ExpressionName, type ModelVersion } from '../model/index.js';
5
+ import type { ExpressionRead } from './expression-read.js';
5
6
  import type { Expression } from './expression.js';
6
7
  import type { MemoEvalPlan } from './memo-eval-plan.js';
7
8
  export type { Expression, ExpressionImplementation } from './expression.js';
@@ -31,12 +32,15 @@ export type Expressions = Branded<'Expressions', {
31
32
  interface ExpressionsProps {
32
33
  readonly rawExpressions: MergedExpressions;
33
34
  readonly inferredExpressions: readonly Expression[];
35
+ /** The `$read`s of expressions in components, whose expected types the expressions must share. */
36
+ readonly expressionReads: readonly ExpressionRead[];
34
37
  }
35
38
  interface ExpressionsContext {
36
39
  readonly latestModel: ModelVersion;
37
40
  readonly aliases: Aliases;
38
41
  readonly entityTypes: readonly EntityTypeName[];
39
42
  readonly evalExpressionParser: EvalExpressionParser;
43
+ readonly phxDefinitions: PhoenixDefinitions;
40
44
  readonly parsingContext: ParseContext;
41
45
  }
42
46
  /**
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{intersectSchemas as t,isSdkExpressionImplementation as n}from"../../../core/index.js";import{DiagnosticCode as i,diagnosticMessages as o}from"../../../errors/index.js";import{UserExpressions as r}from"./user-expressions.js";let s=(e,t)=>{let n=e.get(t.entityKey);n||(n=new Map,e.set(t.entityKey,n)),n.set(t.name,t)},a=(n,i)=>{let o=n.get(i.entityKey);o||(o=new Map,n.set(i.entityKey,o));let r=o.get(i.name);r?o.set(i.name,e({...r,schema:t(r.schema,i.schema),...r.declaredSchema||!i.declaredSchema?{}:{declaredSchema:i.declaredSchema}})):o.set(i.name,i)},l=e=>"relation"===e.implementation.kind?"relations":"violations"===e.implementation.kind?"invariants":"expressions";export const Expressions=(t,m)=>{let{rawExpressions:f,inferredExpressions:p}=t,{latestModel:c,aliases:d,entityTypes:y,evalExpressionParser:u,parsingContext:g}=m,S=r(f,{latestModel:c,evalExpressionParser:u,parsingContext:g});if(void 0===S)return;let h=new Map;for(let e of S)s(h,e);for(let e of p)a(h,e);let w=((e,t)=>{let i=new Map,o=e=>{let t=i.get(e.entityKey);t||(t=new Set,i.set(e.entityKey,t)),t.add(e.name)};for(let t of e)o(t);for(let e of t)n(e.implementation)&&o(e);return i})(S,p),x=new Map;for(let e of S){let{implementation:t}=e;if("value"!==t.kind||!t.constant||t.plan.usesSelf)continue;let n=x.get(e.entityKey);n||(n=new Map,x.set(e.entityKey,n)),n.set(e.name,t.plan)}let K=new Map;for(let t of y){let n=[],r=new Map,s=e=>{let s=h.get(e);if(!s||0===s.size)return;n.push(e);let a=w.get(e);for(let[n,m]of s){if(!a?.has(n))continue;let s=r.get(n);if(s){g.at(l(m),e,n).error(i.DUPLICATE_EXPRESSION,o.DUPLICATE_EXPRESSION(t,n,s,e));continue}r.set(n,e)}};for(let[e,n]of d)n.includes(t)&&s(e);s(t),K.set(t,e({shapeGroups:n}))}return e({expressions:h,entityExpressions:K,constants:x})};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{intersectSchemas as t,isSdkExpressionImplementation as n}from"../../../core/index.js";import{DiagnosticCode as o,diagnosticMessages as i}from"../../../errors/index.js";import{ModelTypeResolution as r}from"../model/index.js";import{checkExpressionReadTypes as s}from"./expression-read-types.js";import{UserExpressions as a}from"./user-expressions.js";let l=(e,t)=>{let n=e.get(t.entityKey);n||(n=new Map,e.set(t.entityKey,n)),n.set(t.name,t)},m=(n,o)=>{let i=n.get(o.entityKey);i||(i=new Map,n.set(o.entityKey,i));let r=i.get(o.name);r?i.set(o.name,e({...r,schema:t(r.schema,o.schema),...r.declaredSchema||!o.declaredSchema?{}:{declaredSchema:o.declaredSchema}})):i.set(o.name,o)},f=e=>"relation"===e.implementation.kind?"relations":"violations"===e.implementation.kind?"invariants":"expressions";export const Expressions=(t,p)=>{let{rawExpressions:c,inferredExpressions:d,expressionReads:y}=t,{latestModel:u,aliases:g,entityTypes:x,evalExpressionParser:h,parsingContext:S}=p,w=r(u,p.phxDefinitions),K=a(c,{latestModel:u,evalExpressionParser:h,typeResolution:w,parsingContext:S});if(void 0===K)return;let M=new Map;for(let e of K)l(M,e);for(let e of d)m(M,e);let E=((e,t)=>{let o=new Map,i=e=>{let t=o.get(e.entityKey);t||(t=new Set,o.set(e.entityKey,t)),t.add(e.name)};for(let t of e)i(t);for(let e of t)n(e.implementation)&&i(e);return o})(K,d);s({userExpressions:K,expressionReads:y,locateDeclaration:(e,t)=>{for(let n of[e,...[...g].filter(([,t])=>t.some(t=>t===e)).map(([e])=>e)]){let e=E.get(n)?.has(t)?M.get(n)?.get(t):void 0;if(e)return{section:f(e),entityKey:n}}return{section:"expressions",entityKey:e}}},w,S);let j=new Map;for(let e of K){let{implementation:t}=e;if("value"!==t.kind||!t.constant||t.plan.usesSelf)continue;let n=j.get(e.entityKey);n||(n=new Map,j.set(e.entityKey,n)),n.set(e.name,t.plan)}let v=new Map;for(let t of x){let n=[],r=new Map,s=e=>{let s=M.get(e);if(!s||0===s.size)return;n.push(e);let a=E.get(e);for(let[n,l]of s){if(!a?.has(n))continue;let s=r.get(n);if(s){S.at(f(l),e,n).error(o.DUPLICATE_EXPRESSION,i.DUPLICATE_EXPRESSION(t,n,s,e));continue}r.set(n,e)}};for(let[e,n]of g)n.includes(t)&&s(e);s(t),v.set(t,e({shapeGroups:n}))}return e({expressions:M,entityExpressions:v,constants:j})};
@@ -1,6 +1,6 @@
1
1
  import { type EvalExpressionParser, type ParseContext } from '../../../core/index.js';
2
2
  import type { MergedExpressions } from '../../merge/index.js';
3
- import type { ModelVersion } from '../model/index.js';
3
+ import type { ModelTypeResolution, ModelVersion } from '../model/index.js';
4
4
  import type { Expression } from './expression.js';
5
5
  /**
6
6
  * Validates user-declared expressions from merged YAML.
@@ -15,6 +15,8 @@ import type { Expression } from './expression.js';
15
15
  interface UserExpressionsContext {
16
16
  readonly latestModel: ModelVersion;
17
17
  readonly evalExpressionParser: EvalExpressionParser;
18
+ /** Resolves the refs of the declared schemas, for checking an inline value against its schema. */
19
+ readonly typeResolution: ModelTypeResolution;
18
20
  readonly parsingContext: ParseContext;
19
21
  }
20
22
  export declare const UserExpressions: (rawExpressions: MergedExpressions, context: UserExpressionsContext) => readonly Expression[] | undefined;
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{schemaFromValue as t}from"../../../enhanced-json/index.js";import{DiagnosticCode as r,diagnosticMessages as n}from"../../../errors/index.js";import{ExpressionName as s}from"../model/index.js";import{MemoEvalPlan as a}from"./memo-eval-plan.js";let o=(e,r,n,s)=>{if("user"===e.kind)return{schema:e.schema,implementation:{kind:"user"}};let o=a(e.value,r),i={kind:"value",constant:e.constant,value:e.value,plan:o};if(Object.keys(e.schema).length>0)return{schema:e.schema,implementation:i};let m=t(e.value,n,s);if(void 0!==m)return{schema:m,implementation:i}};export const UserExpressions=(t,a)=>{let{latestModel:i,evalExpressionParser:m,parsingContext:l}=a,{allNames:c}=i,h=[...c].map(String),f=[];for(let[a,i]of Object.entries(t)){c.has(a)||l.error(r.EXPRESSION_UNKNOWN_ENTITY_KEY,n.EXPRESSION_UNKNOWN_ENTITY_KEY(a,h));let t=e(a);for(let[r,n]of Object.entries(i)){let i=l.at(a),c=s(r,i);if(!c)continue;let h=o(n,`${a}.${r}`,i.at(r),m);h&&f.push(e({entityKey:t,name:c,schema:h.schema,declaredSchema:h.schema,implementation:h.implementation}))}}if(!l.hasErrors)return f};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{schemaFromValue as r}from"../../../enhanced-json/index.js";import{DiagnosticCode as t,diagnosticMessages as o}from"../../../errors/index.js";import{ValueType as s,formatValueType as m,isAssignableValueType as a}from"../common/index.js";import{ExpressionName as n}from"../model/index.js";import{expressionValueType as i}from"./expression-value-type.js";import{MemoEvalPlan as l}from"./memo-eval-plan.js";let c=(e,n,c,p,E)=>{if("user"===e.kind)return{schema:e.schema,implementation:{kind:"user"}};let h=l(e.value,n),u={kind:"value",constant:e.constant,value:e.value,plan:h};if(Object.keys(e.schema).length>0){var f,d;let r,l;return f=e.value,d=e.schema,r=i(f,E),a(r,l=s(d,{...E,author:"project"}))||c.error(t.EXPRESSION_VALUE_TYPE_MISMATCH,o.EXPRESSION_VALUE_TYPE_MISMATCH(n,m(r),m(l))),{schema:e.schema,implementation:u}}let N=r(e.value,c,p);if(void 0!==N)return{schema:N,implementation:u}};export const UserExpressions=(r,s)=>{let{latestModel:m,evalExpressionParser:a,typeResolution:i,parsingContext:l}=s,{allNames:p}=m,E=[...p].map(String),h=[];for(let[s,m]of Object.entries(r)){p.has(s)||l.error(t.EXPRESSION_UNKNOWN_ENTITY_KEY,o.EXPRESSION_UNKNOWN_ENTITY_KEY(s,E));let r=e(s);for(let[t,o]of Object.entries(m)){let m=l.at(s),p=n(t,m);if(!p)continue;let E=c(o,`${s}.${t}`,m.at(t),a,i);E&&h.push(e({entityKey:r,name:p,schema:E.schema,declaredSchema:E.schema,implementation:E.implementation}))}}if(!l.hasErrors)return h};
@@ -1,5 +1,5 @@
1
1
  import { Branded } from '@salsita-ai/common/utils';
2
- import type { ParseContext } from '../../../core/index.js';
2
+ import type { ParseContext, PhoenixDefinitions } from '../../../core/index.js';
3
3
  import type { MergedComponents, MergedExpressions, MergedInvariants, MergedRelations } from '../../merge/index.js';
4
4
  import type { ComponentEntry } from '../components/index.js';
5
5
  import type { Expression } from '../expressions/index.js';
@@ -22,5 +22,5 @@ interface InvariantsProps {
22
22
  }
23
23
  /** Explicit empty invariants aggregate for consumers that do not declare invariants. */
24
24
  export declare const EmptyInvariants: () => Invariants;
25
- export declare const Invariants: (props: InvariantsProps, latestModel: ModelVersion, ctx: ParseContext) => Invariants;
25
+ export declare const Invariants: (props: InvariantsProps, latestModel: ModelVersion, phxDefinitions: PhoenixDefinitions, ctx: ParseContext) => Invariants;
26
26
  export {};
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{DiagnosticCode as t,diagnosticMessages as o}from"../../../errors/index.js";import{UserComponentEntry as r}from"../components/index.js";import{ExpressionName as n,InstanceName as i,getResolvedShape as a}from"../model/index.js";import{Invariant as s}from"./invariant.js";let l="violations",p="$violations",N=(e,t)=>t.get(e)??[e],m=e=>"dynamic"===e.kind?e.violationTypes:[e.violationType],O=(t,o,r)=>{if(!r)return;let n=[...o.violationTypes].map(e=>`'${String(e)}'`).join(" | "),i={tsType:`ReadonlyArray<Violation<${n}>>`,import:[{module:"@salsita-ai/sdk/domain",member:"Violation"}]};return e({entityKey:t,name:r,schema:i,declaredSchema:i,implementation:{kind:"violations",params:[{entityType:String(t),invariants:o.declaredGroups}]}})},I=(e,t,o)=>{let n=i("default",String(e),l,o);if(n)return r({typeOrAlias:e,instanceName:n,componentName:l,rawProps:{violations:{$read:p}}},{resolvedShape:a(t.resolvedShapes,e),parsingContext:o}).entry};export const EmptyInvariants=()=>e({entries:{},expressions:[],components:[]});export const Invariants=(r,i,a)=>{let{rawInvariants:f,rawExpressions:T,rawRelations:d,rawComponents:A}=r,{allNames:c,aliases:S}=i,y=[...c].map(String),_={},v=new Map;for(let[e,r]of Object.entries(f)){let n=a.at(e);if(!c.has(e)){n.error(t.INVARIANT_UNKNOWN_ENTITY_KEY,o.INVARIANT_UNKNOWN_ENTITY_KEY(e,y));continue}let i={};for(let[e,t]of Object.entries(r)){let o=s(e,t,n.at(e));o&&(i[String(o.name)]=o)}_[String(e)]=i;let l=Object.values(i);if(0!==l.length)for(let t of N(e,S)){let o=v.get(t);for(let r of(o||(o={violationTypes:new Set,declaredGroups:[]},v.set(t,o)),o.declaredGroups.push({typeOrAlias:e,invariants:l}),l))for(let e of m(r))o.violationTypes.add(e)}}let u=[],g=[],h=n(p,a);for(let[e,t]of v){let o=O(e,t,h),r=I(e,i,a);o&&u.push(o),r&&g.push(r)}for(let[e,r]of Object.entries(A))Object.hasOwn(r,l)&&a.at("components",e,l).error(t.INVARIANT_MANUAL_VIOLATIONS_COMPONENT,o.INVARIANT_MANUAL_VIOLATIONS_COMPONENT(e));return((e,r)=>{let{invariantEntityTypes:n,rawExpressions:i,rawRelations:a,aliases:s}=e,l=e=>{let t=s.get(e);return t?t.some(e=>n.has(String(e))):n.has(e)},N=(e,n)=>{for(let[i,a]of Object.entries(e))Object.hasOwn(a,p)&&l(i)&&r.at(n,i,p).error(t.INVARIANT_VIOLATIONS_EXPRESSION_CONFLICT,o.INVARIANT_VIOLATIONS_EXPRESSION_CONFLICT(i,n))};N(i,"expressions"),N(a,"relations")})({invariantEntityTypes:new Set([...v.keys()].map(String)),rawExpressions:T,rawRelations:d,aliases:S},a),e({entries:_,expressions:u,components:g})};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{DiagnosticCode as t,diagnosticMessages as o}from"../../../errors/index.js";import{UserComponentEntry as r}from"../components/index.js";import{ExpressionName as n,InstanceName as i,ModelTypeResolution as a,getResolvedShape as s}from"../model/index.js";import{Invariant as l}from"./invariant.js";let p="violations",N="$violations",m=(e,t)=>t.get(e)??[e],O=e=>"dynamic"===e.kind?e.violationTypes:[e.violationType],I=(t,o,r)=>{if(!r)return;let n=[...o.violationTypes].map(e=>`'${String(e)}'`).join(" | "),i={tsType:`ReadonlyArray<Violation<${n}>>`,import:[{module:"@salsita-ai/sdk/domain",member:"Violation"}]};return e({entityKey:t,name:r,schema:i,declaredSchema:i,implementation:{kind:"violations",params:[{entityType:String(t),invariants:o.declaredGroups}]}})},f=(e,t,o,n)=>{let l=i("default",String(e),p,n);if(l)return r({typeOrAlias:e,instanceName:l,componentName:p,rawProps:{violations:{$read:N}}},{resolvedShape:s(t.resolvedShapes,e),parsingContext:n,typeResolution:a(t,o)}).entry};export const EmptyInvariants=()=>e({entries:{},expressions:[],components:[]});export const Invariants=(r,i,a,s)=>{let{rawInvariants:T,rawExpressions:d,rawRelations:A,rawComponents:c}=r,{allNames:y,aliases:S}=i,_=[...y].map(String),u={},v=new Map;for(let[e,r]of Object.entries(T)){let n=s.at(e);if(!y.has(e)){n.error(t.INVARIANT_UNKNOWN_ENTITY_KEY,o.INVARIANT_UNKNOWN_ENTITY_KEY(e,_));continue}let i={};for(let[e,t]of Object.entries(r)){let o=l(e,t,n.at(e));o&&(i[String(o.name)]=o)}u[String(e)]=i;let a=Object.values(i);if(0!==a.length)for(let t of m(e,S)){let o=v.get(t);for(let r of(o||(o={violationTypes:new Set,declaredGroups:[]},v.set(t,o)),o.declaredGroups.push({typeOrAlias:e,invariants:a}),a))for(let e of O(r))o.violationTypes.add(e)}}let g=[],h=[],j=n(N,s);for(let[e,t]of v){let o=I(e,t,j),r=f(e,i,a,s);o&&g.push(o),r&&h.push(r)}for(let[e,r]of Object.entries(c))Object.hasOwn(r,p)&&s.at("components",e,p).error(t.INVARIANT_MANUAL_VIOLATIONS_COMPONENT,o.INVARIANT_MANUAL_VIOLATIONS_COMPONENT(e));return((e,r)=>{let{invariantEntityTypes:n,rawExpressions:i,rawRelations:a,aliases:s}=e,l=e=>{let t=s.get(e);return t?t.some(e=>n.has(String(e))):n.has(e)},p=(e,n)=>{for(let[i,a]of Object.entries(e))Object.hasOwn(a,N)&&l(i)&&r.at(n,i,N).error(t.INVARIANT_VIOLATIONS_EXPRESSION_CONFLICT,o.INVARIANT_VIOLATIONS_EXPRESSION_CONFLICT(i,n))};p(i,"expressions"),p(a,"relations")})({invariantEntityTypes:new Set([...v.keys()].map(String)),rawExpressions:d,rawRelations:A,aliases:S},s),e({entries:u,expressions:g,components:h})};
@@ -8,6 +8,7 @@ export * from './entity-schema.js';
8
8
  export * from './entity-types.js';
9
9
  export * from './model-version.js';
10
10
  export * from './model-version-key.js';
11
+ export * from './model-type-resolution.js';
11
12
  export * from './names/index.js';
12
13
  export * from './presets.js';
13
14
  export * from './resolved-shapes.js';
@@ -1 +1 @@
1
- export*from"./aliases.js";export*from"./all-names.js";export*from"./common-types.js";export*from"./configuration-schema.js";export*from"./data-schemas.js";export*from"./defaults.js";export*from"./entity-schema.js";export*from"./entity-types.js";export*from"./model-version.js";export*from"./model-version-key.js";export*from"./names/index.js";export*from"./presets.js";export*from"./resolved-shapes.js";export*from"./session-data-schema.js";export*from"./shapes/index.js";
1
+ export*from"./aliases.js";export*from"./all-names.js";export*from"./common-types.js";export*from"./configuration-schema.js";export*from"./data-schemas.js";export*from"./defaults.js";export*from"./entity-schema.js";export*from"./entity-types.js";export*from"./model-version.js";export*from"./model-version-key.js";export*from"./model-type-resolution.js";export*from"./names/index.js";export*from"./presets.js";export*from"./resolved-shapes.js";export*from"./session-data-schema.js";export*from"./shapes/index.js";
@@ -0,0 +1,10 @@
1
+ import type { PhoenixDefinitions } from '../../../core/index.js';
2
+ import { type ValueTypeResolution } from '../common/index.js';
3
+ import type { ModelVersion } from './model-version.js';
4
+ /** What reading the type of a schema of the model needs: its refs and its entity names. */
5
+ export type ModelTypeResolution = Omit<ValueTypeResolution, 'author' | 'definitions'>;
6
+ /**
7
+ * Resolves the refs of a model's schemas (its common types and the phoenix definitions) and the
8
+ * entity types an entity type or alias name stands for.
9
+ */
10
+ export declare const ModelTypeResolution: (model: ModelVersion, phxDefinitions: PhoenixDefinitions) => ModelTypeResolution;
@@ -0,0 +1 @@
1
+ import{createSchemaRefResolver as e}from"../common/index.js";export const ModelTypeResolution=(o,r)=>({resolveRef:e(o.commonTypes,r),entityTypes:e=>{for(let[r,t]of o.aliases)if(String(r)===e)return t.map(String);return[e]}});