@salsita-ai/sdk 0.50.0-develop.d37f5db8ff → 0.50.0-develop.d7ce7f7857

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 (429) hide show
  1. package/dist/application-spec/core/components/component-filter.d.ts +53 -0
  2. package/dist/application-spec/core/components/component-filter.js +1 -0
  3. package/dist/application-spec/core/components/index.d.ts +2 -0
  4. package/dist/application-spec/core/components/index.js +1 -0
  5. package/dist/application-spec/core/components/sdk-code-ref.d.ts +9 -0
  6. package/dist/application-spec/core/components/sdk-code-ref.js +1 -0
  7. package/dist/application-spec/core/enhanced-json-value.d.ts +0 -68
  8. package/dist/application-spec/core/enhanced-json-value.js +1 -1
  9. package/dist/application-spec/core/expressions/index.d.ts +2 -0
  10. package/dist/application-spec/core/expressions/index.js +1 -0
  11. package/dist/application-spec/core/expressions/relation-expression-params.d.ts +11 -0
  12. package/dist/application-spec/core/expressions/sdk-expression-implementation.d.ts +24 -0
  13. package/dist/application-spec/core/expressions/sdk-expression-implementation.js +1 -0
  14. package/dist/application-spec/core/index.d.ts +2 -0
  15. package/dist/application-spec/core/index.js +1 -1
  16. package/dist/application-spec/core/json-value.d.ts +1 -1
  17. package/dist/application-spec/{core → enhanced-json}/eval-to-constant.d.ts +1 -1
  18. package/dist/application-spec/enhanced-json/index.d.ts +4 -0
  19. package/dist/application-spec/enhanced-json/index.js +1 -0
  20. package/dist/application-spec/enhanced-json/is-enhanced-json-array.d.ts +2 -0
  21. package/dist/application-spec/enhanced-json/is-enhanced-json-array.js +1 -0
  22. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.d.ts +18 -0
  23. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.js +1 -0
  24. package/dist/application-spec/enhanced-json/schema-from-value.d.ts +24 -0
  25. package/dist/application-spec/enhanced-json/schema-from-value.js +1 -0
  26. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.d.ts +14 -0
  27. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.js +1 -0
  28. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.d.ts +12 -0
  29. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.js +1 -0
  30. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.d.ts +13 -0
  31. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.js +1 -0
  32. package/dist/application-spec/errors/diagnostic-codes.d.ts +5 -0
  33. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  34. package/dist/application-spec/errors/diagnostic-messages.d.ts +8 -0
  35. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  36. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  37. package/dist/application-spec/generate-application/code/standalone-app-files.d.ts +2 -2
  38. package/dist/application-spec/generate-application/code/standalone-app-files.js +1 -1
  39. package/dist/application-spec/generate-application/code/templates/configurator-config.js +6 -4
  40. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +4 -4
  41. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.d.ts +4 -2
  42. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.js +1 -1
  43. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +43 -45
  44. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-phx-globals.js +3 -0
  45. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-relation-expressions.js +1 -1
  46. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.d.ts +6 -8
  47. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +11 -11
  48. package/dist/application-spec/generate-application/code/templates/domain-spec/index.d.ts +1 -1
  49. package/dist/application-spec/generate-application/code/templates/domain-spec/index.js +1 -1
  50. package/dist/application-spec/generate-application/code/templates/domain-spec.js +12 -12
  51. package/dist/application-spec/generate-application/code/templates/globals.js +5 -4
  52. package/dist/application-spec/generate-application/code/templates/index.d.ts +0 -1
  53. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  54. package/dist/application-spec/generate-application/code/templates/package-json.js +1 -1
  55. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +8 -2
  56. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  57. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +10 -3
  58. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  59. package/dist/application-spec/generate-application/code/templates/webhook-index.d.ts +6 -1
  60. package/dist/application-spec/generate-application/code/templates/webhook-index.js +10 -1
  61. package/dist/application-spec/generate-application/index.d.ts +2 -0
  62. package/dist/application-spec/generate-application/index.js +1 -1
  63. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +6 -2
  64. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  65. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +8 -3
  66. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  67. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +5 -3
  68. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  69. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.d.ts +43 -0
  70. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.js +1 -0
  71. package/dist/application-spec/generate-application/runtime/factory-data/index.d.ts +3 -0
  72. package/dist/application-spec/generate-application/runtime/factory-data/index.js +1 -0
  73. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.d.ts +13 -0
  74. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -0
  75. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +16 -0
  76. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -0
  77. package/dist/application-spec/generate-application/runtime/migrations/index.d.ts +1 -0
  78. package/dist/application-spec/generate-application/runtime/migrations/index.js +1 -0
  79. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +53 -0
  80. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.js +1 -0
  81. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +1 -1
  82. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  83. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +2 -1
  84. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  85. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +2 -4
  86. package/dist/application-spec/index.d.ts +1 -0
  87. package/dist/application-spec/index.js +1 -1
  88. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +6 -0
  89. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  90. package/dist/application-spec/parse-application-files/categorize/module-analysis.d.ts +1 -1
  91. package/dist/application-spec/parse-application-files/categorize/module-analysis.js +1 -1
  92. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +16 -3
  93. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  94. package/dist/application-spec/parse-application-files/raw-spec/raw-spec-file.js +1 -1
  95. package/dist/application-spec/parse-application-files/spec/components/component-entry.d.ts +1 -9
  96. package/dist/application-spec/parse-application-files/spec/components/component-entry.js +1 -1
  97. package/dist/application-spec/parse-application-files/spec/components/component-filter.d.ts +1 -54
  98. package/dist/application-spec/parse-application-files/spec/components/component-filter.js +1 -1
  99. package/dist/application-spec/parse-application-files/spec/components/index.d.ts +1 -1
  100. package/dist/application-spec/parse-application-files/spec/components/index.js +1 -1
  101. package/dist/application-spec/parse-application-files/spec/expressions/expression.d.ts +1 -28
  102. package/dist/application-spec/parse-application-files/spec/expressions/expression.js +1 -1
  103. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +1 -1
  104. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  105. package/dist/application-spec/parse-application-files/spec/expressions/index.d.ts +0 -1
  106. package/dist/application-spec/parse-application-files/spec/expressions/index.js +1 -1
  107. package/dist/application-spec/parse-application-files/spec/expressions/memo-eval-plan.js +1 -1
  108. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  109. package/dist/application-spec/parse-application-files/spec/model/defaults.d.ts +3 -3
  110. package/dist/application-spec/parse-application-files/spec/model/defaults.js +1 -1
  111. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  112. package/dist/application-spec/parse-application-files/spec/sections/infra.d.ts +2 -0
  113. package/dist/application-spec/parse-application-files/spec/sections/infra.js +1 -1
  114. package/dist/client/phoenix-api.d.ts +96 -0
  115. package/dist/configurator/application-runtime/extensions/create-configurator-extensions.js +1 -1
  116. package/dist/configurator/application-runtime/extensions/selectors.d.ts +3 -1
  117. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  118. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +32 -1
  119. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  120. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +7 -1
  121. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  122. package/dist/configurator/application-runtime/extensions/systems/drag-and-drop-system/drag-and-drop-system.d.ts +3 -3
  123. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +20 -4
  124. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  125. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.d.ts +11 -0
  126. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.js +1 -0
  127. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -2
  128. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  129. package/dist/configurator/common/configurator-interface.d.ts +26 -1
  130. package/dist/configurator/common/configurator-interface.js +1 -1
  131. package/dist/configurator/common/frontend-analytics.d.ts +2 -0
  132. package/dist/configurator/common/frontend-analytics.js +1 -1
  133. package/dist/configurator/common/index.d.ts +2 -0
  134. package/dist/configurator/common/index.js +1 -1
  135. package/dist/configurator/common/use-finalize-action.d.ts +31 -0
  136. package/dist/configurator/common/use-finalize-action.js +1 -0
  137. package/dist/configurator/common/use-reset-camera.d.ts +6 -0
  138. package/dist/configurator/common/use-reset-camera.js +1 -0
  139. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +1 -1
  140. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +2 -2
  141. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  142. package/dist/configurator/pages/configurator-layout-name.d.ts +2 -0
  143. package/dist/configurator/pages/configurator-layout-name.js +1 -0
  144. package/dist/configurator/pages/default-configurator-elements.d.ts +7 -0
  145. package/dist/configurator/pages/default-configurator-elements.js +1 -0
  146. package/dist/configurator/pages/index.d.ts +1 -0
  147. package/dist/configurator/pages/index.js +1 -1
  148. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragHandle.d.ts +1 -1
  149. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragSceneHandle.d.ts +1 -1
  150. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicator.d.ts +1 -1
  151. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicatorInternal.d.ts +1 -1
  152. package/dist/configurator/scene/scene-entity/drag-and-drop/shared.d.ts +2 -2
  153. package/dist/configurator/scene/scene-entity/drag-and-drop/use-drag-object.d.ts +1 -1
  154. package/dist/configurator/scene/scene-entity/materials/RemoteReplacedMaterial.js +1 -1
  155. package/dist/configurator/scene/scene-entity/objects/SceneEntityObjectTextDecal.d.ts +1 -1
  156. package/dist/configurator/ui/assistant/AssistantChips.d.ts +8 -2
  157. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  158. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +1 -1
  159. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  160. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  161. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +13 -0
  162. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -0
  163. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.d.ts +22 -0
  164. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.js +1 -0
  165. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +27 -0
  166. package/dist/configurator/ui/assistant/entity-link/entity-link-state.js +1 -0
  167. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +5 -0
  168. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +1 -0
  169. package/dist/configurator/ui/assistant/entity-link/index.d.ts +3 -0
  170. package/dist/configurator/ui/assistant/entity-link/index.js +1 -0
  171. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.d.ts +1 -0
  172. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.js +1 -0
  173. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.d.ts +11 -0
  174. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.js +1 -0
  175. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.d.ts +101 -0
  176. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.js +16 -0
  177. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.d.ts +1 -0
  178. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.js +1 -0
  179. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.d.ts +4 -4
  180. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  181. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.d.ts +3 -6
  182. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.js +1 -1
  183. package/dist/configurator/ui/configurator-layout/slots/slots.d.ts +1 -0
  184. package/dist/configurator/ui/configurator-layout/slots/slots.js +1 -1
  185. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.d.ts +0 -74
  186. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -20
  187. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.d.ts +2 -2
  188. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.d.ts +2 -2
  189. package/dist/docs/dimensions/3d-scene-integration/dimension-indicators.mdx +2 -2
  190. package/dist/docs/dimensions/3d-scene-integration/editable-angle-indicator.mdx +1 -1
  191. package/dist/docs/dimensions/3d-scene-integration/editable-distance-dimension-indicator.mdx +1 -1
  192. package/dist/docs/dimensions/3d-scene-integration/list-selector-dimension-indicator.mdx +1 -1
  193. package/dist/docs/drag-and-drop/drag-handle.mdx +1 -1
  194. package/dist/docs/drag-and-drop/hotspot-handle.mdx +1 -1
  195. package/dist/docs/drag-and-drop/planes.mdx +1 -1
  196. package/dist/docs/drag-and-drop/rotatable.mdx +2 -2
  197. package/dist/docs/index.json +42 -1
  198. package/dist/docs/layouts/custom-layout.mdx +2125 -0
  199. package/dist/docs/layouts/header/fixed.mdx +2 -2
  200. package/dist/docs/layouts/header/floating.mdx +2 -2
  201. package/dist/docs/layouts/sidebar/in-a-custom-layout.mdx +380 -0
  202. package/dist/docs/layouts/sidebar-footer/basic.mdx +32 -77
  203. package/dist/docs/other-features/client-side-rendering/declarative.mdx +1 -1
  204. package/dist/docs/other-features/transformers.mdx +4 -0
  205. package/dist/docs/phoenix/application-states.mdx +9 -7
  206. package/dist/docs/phoenix/configurator-interface.mdx +140 -18
  207. package/dist/docs/phoenix/domain-model.mdx +1 -1
  208. package/dist/docs/phoenix/finalization.mdx +1 -1
  209. package/dist/docs/phoenix/layout-slots.mdx +116 -0
  210. package/dist/docs/phoenix/phoenix-cli.mdx +25 -7
  211. package/dist/docs/phoenix/project-structure.mdx +10 -4
  212. package/dist/docs/phoenix/sdk-builder-workflow.mdx +1 -1
  213. package/dist/docs/phoenix/testing.mdx +140 -0
  214. package/dist/docs/phoenix/webhook-membership.mdx +10 -9
  215. package/dist/docs/phoenix/webhooks.mdx +18 -1
  216. package/dist/domain/admin-domain/implementation/common-admin-publish.d.ts +1 -2
  217. package/dist/domain/admin-domain/index.js +1 -1
  218. package/dist/domain/application/GetApplicationWrapperHandler.d.ts +1 -1
  219. package/dist/domain/application/application-config.d.ts +7 -3
  220. package/dist/domain/application/assistant/assistant-fields.d.ts +12 -0
  221. package/dist/domain/application/assistant/assistant-fields.js +1 -0
  222. package/dist/domain/application/assistant/assistant-manifest.d.ts +9 -1
  223. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +38 -2
  224. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -1
  225. package/dist/domain/application/assistant/build-assistant-lenses.d.ts +14 -0
  226. package/dist/domain/application/assistant/build-assistant-lenses.js +5 -0
  227. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  228. package/dist/domain/application/assistant/create-assistant-execution-schema.d.ts +32 -0
  229. package/dist/domain/application/assistant/create-assistant-execution-schema.js +1 -0
  230. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  231. package/dist/domain/application/assistant/index.d.ts +6 -1
  232. package/dist/domain/application/assistant/index.js +1 -1
  233. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +20 -0
  234. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.js +1 -0
  235. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +10 -0
  236. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -0
  237. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +48 -0
  238. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -0
  239. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +15 -0
  240. package/dist/domain/application/assistant/session-setup/create-session-assistant.js +1 -0
  241. package/dist/domain/application/assistant/session-setup/index.d.ts +4 -0
  242. package/dist/domain/application/assistant/session-setup/index.js +1 -0
  243. package/dist/domain/application/configurator-builder.d.ts +5 -2
  244. package/dist/domain/application/configurator-builder.js +1 -1
  245. package/dist/domain/application/create-initial-published-data.d.ts +5 -5
  246. package/dist/domain/application/index.d.ts +0 -1
  247. package/dist/domain/application/index.js +1 -1
  248. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +1 -1
  249. package/dist/domain/application/published-data/map-published-data.d.ts +7 -3
  250. package/dist/domain/core/component/domain-component-optic.d.ts +1 -2
  251. package/dist/domain/core/component/system-component-filter.d.ts +15 -2
  252. package/dist/domain/core/expression/constant-expressions.d.ts +16 -8
  253. package/dist/domain/core/invariant/violation.d.ts +50 -2
  254. package/dist/domain/core/invariant/violation.js +1 -1
  255. package/dist/domain/core/model/model.d.ts +1 -1
  256. package/dist/domain/core/recipe/recipes.d.ts +18 -50
  257. package/dist/domain/core/recipe/recipes.js +1 -1
  258. package/dist/domain/core/relation/all-of-type-relation.d.ts +8 -21
  259. package/dist/domain/core/relation/all-of-type-relation.js +1 -1
  260. package/dist/domain/core/relation/direct-relation.d.ts +13 -24
  261. package/dist/domain/core/relation/index.d.ts +0 -1
  262. package/dist/domain/core/relation/indirect-relation.d.ts +12 -67
  263. package/dist/domain/core/relation/indirect-relation.js +1 -1
  264. package/dist/domain/core/relation/relation-factory.d.ts +19 -15
  265. package/dist/domain/core/relation/relation-factory.js +1 -1
  266. package/dist/domain/core/state/state.d.ts +1 -1
  267. package/dist/domain/domain-context/index.d.ts +1 -1
  268. package/dist/domain/domain-context/undo-system.d.ts +28 -1
  269. package/dist/domain/domain-context/undo-system.js +1 -1
  270. package/dist/domain/domain-runtime/access/selectors.d.ts +9 -0
  271. package/dist/domain/domain-runtime/access/selectors.js +1 -1
  272. package/dist/domain/domain-runtime/access/types.d.ts +2 -0
  273. package/dist/domain/domain-runtime/access/types.js +1 -1
  274. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +14 -13
  275. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  276. package/dist/domain/domain-runtime/domain-context/types.d.ts +4 -1
  277. package/dist/domain/domain-runtime/domain-runtime.d.ts +32 -16
  278. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +19 -0
  279. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -0
  280. package/dist/domain/domain-runtime/errors/implementation-error.d.ts +46 -0
  281. package/dist/domain/domain-runtime/errors/implementation-error.js +1 -0
  282. package/dist/domain/domain-runtime/errors/implementation-errors.d.ts +13 -0
  283. package/dist/domain/domain-runtime/errors/implementation-errors.js +1 -0
  284. package/dist/domain/domain-runtime/errors/index.d.ts +4 -0
  285. package/dist/domain/domain-runtime/errors/index.js +1 -0
  286. package/dist/domain/domain-runtime/errors/to-implementation-errors.d.ts +10 -0
  287. package/dist/domain/domain-runtime/errors/to-implementation-errors.js +1 -0
  288. package/dist/domain/domain-runtime/index.d.ts +1 -0
  289. package/dist/domain/domain-runtime/index.js +1 -1
  290. package/dist/domain/domain-runtime/spec/initialize.d.ts +11 -0
  291. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  292. package/dist/domain/domain-runtime/spec/module-checks/project-modules.d.ts +8 -1
  293. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +1 -1
  294. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.js +1 -1
  295. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -1
  296. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.d.ts +7 -7
  297. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +1 -1
  298. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.js +1 -1
  299. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  300. package/dist/domain/domain-runtime/spec/types.d.ts +2 -0
  301. package/dist/domain/extensions/attribute-switch.d.ts +1 -1
  302. package/dist/domain/extensions/attribute-switch.js +1 -1
  303. package/dist/domain/extensions/canvas-config.d.ts +1 -1
  304. package/dist/domain/extensions/client-side-image.d.ts +2 -2
  305. package/dist/domain/extensions/client-side-image.js +1 -1
  306. package/dist/domain/extensions/common/angle-indicator-schema.d.ts +2 -2
  307. package/dist/domain/extensions/common/dimension-indicator-schema.d.ts +2 -2
  308. package/dist/domain/extensions/editable-angle-indicator.d.ts +1 -1
  309. package/dist/domain/extensions/editable-distance-dimension-indicator.d.ts +1 -1
  310. package/dist/domain/extensions/editable-offset-indicator.d.ts +1 -1
  311. package/dist/domain/extensions/editable-offset-indicator.js +1 -1
  312. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -1
  313. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -1
  314. package/dist/domain/extensions/horizontal-tabs.d.ts +2 -2
  315. package/dist/domain/extensions/list-selector-dimension-indicator.d.ts +1 -1
  316. package/dist/domain/extensions/navigation-steps.d.ts +2 -2
  317. package/dist/domain/extensions/offset-indicator.js +1 -1
  318. package/dist/domain/extensions/rotation-handle.d.ts +2 -2
  319. package/dist/domain/extensions/save-template-thumbnail.d.ts +2 -2
  320. package/dist/domain/extensions/save-template-thumbnail.js +1 -1
  321. package/dist/domain/extensions/scene-entity-animation.js +1 -1
  322. package/dist/domain/mocks/create-mock-domain-context.d.ts +1 -1
  323. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +18 -9
  324. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  325. package/dist/domain/mocks/create-mock-domain.d.ts +1 -1
  326. package/dist/domain/mocks/create-mock-domain.js +1 -1
  327. package/dist/domain/mocks/create-mock-state.d.ts +2 -2
  328. package/dist/domain/mocks/create-test-application-config.d.ts +59 -0
  329. package/dist/domain/mocks/create-test-application-config.js +1 -0
  330. package/dist/domain/mocks/index.d.ts +1 -0
  331. package/dist/domain/mocks/index.js +1 -1
  332. package/dist/domain/projections/blender-projections/camera.d.ts +1 -1
  333. package/dist/domain/system-components/application-config.d.ts +2 -2
  334. package/dist/domain/system-components/child-entity-selection.js +1 -1
  335. package/dist/domain/system-components/collision-box-geometry.d.ts +4 -2
  336. package/dist/domain/system-components/collision-geometry.d.ts +4 -2
  337. package/dist/domain/system-components/collision-point-geometry.d.ts +4 -2
  338. package/dist/domain/system-components/common/material-override-schema.d.ts +2 -2
  339. package/dist/domain/system-components/common/recipes.d.ts +21 -3
  340. package/dist/domain/system-components/common/recipes.js +1 -1
  341. package/dist/domain/system-components/constraint.d.ts +10 -23
  342. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  343. package/dist/domain/system-components/drag-handle.js +1 -1
  344. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  345. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  346. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  347. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  348. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -1
  349. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  350. package/dist/domain/system-components/material-swatch.js +1 -1
  351. package/dist/domain/system-components/scene-entity-material-override.d.ts +1 -1
  352. package/dist/domain/system-components/scene-entity-object-material-override.d.ts +1 -1
  353. package/dist/domain/system-components/scene-entity-object-text-decal.d.ts +1 -1
  354. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.d.ts +1 -1
  355. package/dist/domain/system-components/scene-entity-transimissive-material-override.d.ts +1 -1
  356. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  357. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  358. package/dist/domain/utils/eval-cache.d.ts +1 -1
  359. package/dist/domain/utils/map-nested-object.d.ts +1 -1
  360. package/dist/editor/domain-editors/use-implementation-files.d.ts +1 -2
  361. package/dist/editor/mocks/EditorMockContext.js +1 -1
  362. package/dist/i18n/locales/cs/messages.js +1 -1
  363. package/dist/i18n/locales/da/messages.js +1 -1
  364. package/dist/i18n/locales/de/messages.js +1 -1
  365. package/dist/i18n/locales/de-AT/messages.js +1 -1
  366. package/dist/i18n/locales/en/messages.js +1 -1
  367. package/dist/i18n/locales/en-AU/messages.js +1 -1
  368. package/dist/i18n/locales/en-GB/messages.js +1 -1
  369. package/dist/i18n/locales/es/messages.js +1 -1
  370. package/dist/i18n/locales/fr/messages.js +1 -1
  371. package/dist/i18n/locales/hu/messages.js +1 -1
  372. package/dist/i18n/locales/it/messages.js +1 -1
  373. package/dist/i18n/locales/nl/messages.js +1 -1
  374. package/dist/i18n/locales/pl/messages.js +1 -1
  375. package/dist/i18n/locales/pt/messages.js +1 -1
  376. package/dist/i18n/locales/ro/messages.js +1 -1
  377. package/dist/i18n/locales/sk/messages.js +1 -1
  378. package/dist/i18n/locales/tr/messages.js +1 -1
  379. package/dist/legacy/domain-cli/gen/configurator-builder.js +13 -12
  380. package/dist/legacy/domain-cli/gen/constant-expressions.js +1 -1
  381. package/dist/legacy/domain-cli/gen/defaults.js +1 -7
  382. package/dist/legacy/domain-cli/gen/relations.js +1 -1
  383. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  384. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  385. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +81 -68
  386. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  387. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  388. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  389. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +7 -1
  390. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -16
  391. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +14 -12
  392. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +13 -11
  393. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +13 -11
  394. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  395. package/dist/phoenix/commands/check.js +1 -1
  396. package/dist/phoenix/commands/deploy.js +1 -1
  397. package/dist/phoenix/commands/dev.js +5 -5
  398. package/dist/phoenix/commands/fix.js +1 -1
  399. package/dist/phoenix/services/application-spec-project-watcher.d.ts +2 -0
  400. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  401. package/dist/phoenix/services/source-archive.d.ts +1 -0
  402. package/dist/phoenix/services/source-archive.js +1 -1
  403. package/dist/phoenix/services/swc.js +1 -1
  404. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +2 -0
  405. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  406. package/dist/react-sdk/application-runtime/routing/access-service.d.ts +1 -0
  407. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +33 -16
  408. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  409. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +30 -0
  410. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -0
  411. package/dist/react-sdk/domain-context/common-hooks/use-domain-context.d.ts +4 -4
  412. package/dist/react-sdk/domain-context/index.d.ts +2 -1
  413. package/dist/react-sdk/domain-context/index.js +1 -1
  414. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +11 -0
  415. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  416. package/dist/react-sdk/domain-controls/hooks/use-angle-dimension.d.ts +1 -1
  417. package/dist/ui-sdk/theme/types.d.ts +1 -1
  418. package/dist/webhook/builders/webhook-builder.js +1 -1
  419. package/package.json +33 -26
  420. package/schema/domain-spec.json +1115 -209
  421. package/dist/application-spec/generate-application/code/templates/webhook-implementation.d.ts +0 -1
  422. package/dist/application-spec/generate-application/code/templates/webhook-implementation.js +0 -7
  423. package/dist/domain/application/resource-builder.d.ts +0 -13
  424. package/dist/domain/application/resource-builder.js +0 -1
  425. package/dist/domain/core/relation/relation-implementation.d.ts +0 -7
  426. /package/dist/{domain/core/relation/relation-implementation.js → application-spec/core/expressions/relation-expression-params.js} +0 -0
  427. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.d.ts +0 -0
  428. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.js +0 -0
  429. /package/dist/application-spec/{core → enhanced-json}/eval-to-constant.js +0 -0
@@ -0,0 +1,43 @@
1
+ import { Branded } from '@salsita-ai/common/utils';
2
+ import type { AnyEntityReflections, DomainEntity, DomainEntityReflection } from '#package/domain';
3
+ import type { RuntimeReferenceStore } from '../../../caching/index.js';
4
+ import type { Defaults, Invariants } from '../../../parse-application-files/index.js';
5
+ import { type RecipeDefaults } from './recipe-defaults.js';
6
+ import { type StaticViolations } from './static-violations.js';
7
+ interface FactoryDataRuntimeFields {
8
+ /**
9
+ * The member types of each alias: what `phx.domain.attachComponent` expands an alias with, and
10
+ * what `phx.domain.createRecipe` expands alias defaults with.
11
+ */
12
+ readonly aliases: Readonly<Record<string, readonly string[]>>;
13
+ /** The entity reflections `phx.domain.createRecipe` validates the defaults with. */
14
+ readonly entityReflections: ReadonlyArray<DomainEntityReflection<DomainEntity<string>>>;
15
+ /** The violations `phx.domain.implementCustomInvariants` reports for a static invariant that fails. */
16
+ readonly staticViolations: StaticViolations;
17
+ /** The defaults `phx.domain.createRecipe` puts into a new recipe. */
18
+ readonly defaults: RecipeDefaults;
19
+ readonly changed: boolean;
20
+ }
21
+ /**
22
+ * The data the `phx.domain` factories of one domain carry, built from the parsed spec: the static
23
+ * violations of `implementCustomInvariants`, the aliases of `attachComponent`, and the aliases,
24
+ * entity reflections and defaults of `createRecipe`. Generated `domain-spec.ts` passes the same
25
+ * values to those factories as literals; with this section the factories can be built from the
26
+ * spec instead. The configurator and the admin domain each have one.
27
+ */
28
+ export type FactoryDataRuntime = Branded<'FactoryDataRuntime', FactoryDataRuntimeFields>;
29
+ interface FactoryDataRuntimeInput {
30
+ readonly invariants: Invariants;
31
+ readonly defaults: Defaults;
32
+ readonly aliases: Readonly<Record<string, readonly string[]>>;
33
+ readonly entities: AnyEntityReflections;
34
+ }
35
+ interface FactoryDataRuntimeProps extends FactoryDataRuntimeInput {
36
+ readonly referenceScope: string;
37
+ }
38
+ /**
39
+ * Builds the factory data of one domain. The result keeps its reference while the invariants and
40
+ * defaults are equal and the model runtime's aliases and entity reflections are the same objects.
41
+ */
42
+ export declare const FactoryDataRuntime: (referenceStore: RuntimeReferenceStore, props: FactoryDataRuntimeProps) => FactoryDataRuntime;
43
+ export {};
@@ -0,0 +1 @@
1
+ import e from"lodash-es/isEqual.js";import{Branded as t}from"@salsita-ai/common/utils";import{createRecipeDefaults as i}from"./recipe-defaults.js";import{createStaticViolations as s}from"./static-violations.js";let a=e=>({aliases:e.aliases,entityReflections:Object.values(e.entities),staticViolations:s(e.invariants),defaults:i(e.defaults)});export const FactoryDataRuntime=(i,s)=>{let n=i.createBuilder(s.referenceScope,{build:a,getKey:()=>"singleton",compare:(t,i)=>t.aliases===i.aliases&&t.entities===i.entities&&e(t.invariants.entries,i.invariants.entries)&&e(t.defaults.entries,i.defaults.entries)}).build({invariants:s.invariants,defaults:s.defaults,aliases:s.aliases,entities:s.entities});return t({...n.output,changed:n.changed})};
@@ -0,0 +1,3 @@
1
+ export { FactoryDataRuntime } from './factory-data-runtime.js';
2
+ export type { RecipeDefaults } from './recipe-defaults.js';
3
+ export type { StaticViolations } from './static-violations.js';
@@ -0,0 +1 @@
1
+ export{FactoryDataRuntime}from"./factory-data-runtime.js";
@@ -0,0 +1,13 @@
1
+ import type { Defaults } from '../../../parse-application-files/index.js';
2
+ /**
3
+ * The default property values of each entity type, keyed by entity type: what
4
+ * `phx.domain.createRecipe` puts into a new recipe before the caller's overrides. Alias entries are
5
+ * already expanded to their member types by the parser.
6
+ */
7
+ export type RecipeDefaults = Readonly<Record<string, Readonly<Record<string, unknown>>>>;
8
+ /**
9
+ * The runtime counterpart of the `defaults` literal the generated `domain-spec.ts` passes to
10
+ * `createRecipeFactory`: the parsed per-entity defaults with every `$msg` lowered to the descriptor
11
+ * the `msg` macro produces.
12
+ */
13
+ export declare const createRecipeDefaults: (defaults: Defaults) => RecipeDefaults;
@@ -0,0 +1 @@
1
+ import{createMessageDescriptor as e,isEvalMarker as t,isMsgMarker as r}from"../../../core/index.js";let s=(a,i)=>{if(null===a||"object"!=typeof a)return a;if(r(a))return e(a);if(t(a))throw Error(`The default at ${i} is an $eval expression. Defaults are static values; the parser rejects $eval in them, so the spec given to the runtime was not produced by it. Parse the spec again and pass the result.`);return Array.isArray(a)?a.map((e,t)=>s(e,`${i}[${t}]`)):Object.fromEntries(Object.entries(a).map(([e,t])=>[e,s(t,`${i}.${e}`)]))};export const createRecipeDefaults=e=>Object.fromEntries(Object.entries(e.entries).map(([e,t])=>[e,Object.fromEntries(Object.entries(t).map(([t,r])=>[t,s(r,`${e}.${t}`)]))]));
@@ -0,0 +1,16 @@
1
+ import type { Violation } from '#package/domain';
2
+ import type { Invariants } from '../../../parse-application-files/index.js';
3
+ /**
4
+ * The violation each static invariant of a domain reports when its implementation returns `false`,
5
+ * by entity type or alias and by invariant name. `phx.domain.implementCustomInvariants` closes over
6
+ * it: a project implements a static invariant as a boolean and the factory turns `false` into this
7
+ * violation.
8
+ */
9
+ export type StaticViolations = Readonly<Record<string, Readonly<Record<string, Violation<string>>>>>;
10
+ /**
11
+ * The runtime counterpart of the `staticViolations` literal the generated `domain-spec.ts` passes
12
+ * to `createCustomInvariantFactory`: one entry per static invariant, keyed as the spec declares it,
13
+ * with a `$msg` message lowered to the descriptor the `msg` macro produces. Types and aliases
14
+ * without a static invariant have no entry.
15
+ */
16
+ export declare const createStaticViolations: (invariants: Invariants) => StaticViolations;
@@ -0,0 +1 @@
1
+ import{createMessageDescriptor as t}from"../../../core/index.js";export const createStaticViolations=e=>{let i={};for(let[o,r]of Object.entries(e.entries))for(let e of Object.values(r)){if("static"!==e.kind)continue;let r={type:String(e.violationType),severity:e.severity,message:"string"==typeof e.message?e.message:t(e.message),...void 0===e.controlViolationPriority?{}:{controlViolationPriority:e.controlViolationPriority}};i[o]={...i[o],[String(e.name)]:r}}return i};
@@ -0,0 +1 @@
1
+ export { MigrationRuntime, type MigrationModules } from './migration-runtime.js';
@@ -0,0 +1 @@
1
+ export{MigrationRuntime}from"./migration-runtime.js";
@@ -0,0 +1,53 @@
1
+ import { Branded } from '@salsita-ai/common/utils';
2
+ import { type AnyEntityReflections, type DomainEntity, type MigrateFunction, type Migration } from '#package/domain';
3
+ import type { RuntimeReferenceStore } from '../../../caching/index.js';
4
+ import type { ResolvedVersions } from '../../../parse-application-files/index.js';
5
+ type AnyEntity = DomainEntity<string>;
6
+ type AnyMigration = Migration<AnyEntity, AnyEntity>;
7
+ /**
8
+ * The project's migration modules, keyed by the project path the parser records for each model
9
+ * version (`src/migrations/v2.ts`, `src/admin/migrations/v2.ts`), each holding the module's exports.
10
+ * The module of version `N` exports the migration to that version as `migrateToV<N>`, the name the
11
+ * generated `domain.ts` imports.
12
+ */
13
+ export type MigrationModules = Readonly<Record<string, Readonly<Record<string, unknown>>>>;
14
+ interface MigrationRuntimeFields {
15
+ /** The entity reflections of each model version, keyed by version; the latest is the domain's own. */
16
+ readonly modelVersions: Readonly<Record<number, AnyEntityReflections>>;
17
+ /** The migration to each version, keyed by the version it yields. */
18
+ readonly migrations: Readonly<Record<number, AnyMigration>>;
19
+ readonly migrate: MigrateFunction<AnyEntity>;
20
+ /**
21
+ * The migrations the spec declares but the migration modules do not provide, as
22
+ * `<migration file>#migrateToV<N>`. A state that needs one fails to load with a
23
+ * `StateMigrationError` naming the missing step.
24
+ */
25
+ readonly missingMigrations: readonly string[];
26
+ readonly changed: boolean;
27
+ }
28
+ /**
29
+ * How a domain migrates a stored state of any of its model versions to the latest one: the entity
30
+ * reflections of every version, the project's migration to each version above the first, and the
31
+ * migrate function built from both, which `DomainBuilder.withMigrate` takes.
32
+ *
33
+ * The configurator and the admin domain each have one. The admin domain's factory first applies the
34
+ * SDK's own migration of the common admin entities (`migrateCommonAdminDomain`) and then this one.
35
+ */
36
+ export type MigrationRuntime = Branded<'MigrationRuntime', MigrationRuntimeFields>;
37
+ interface MigrationRuntimeInput {
38
+ readonly resolvedVersions: ResolvedVersions;
39
+ readonly latestEntities: AnyEntityReflections;
40
+ readonly migrationModules: MigrationModules;
41
+ }
42
+ interface MigrationRuntimeProps extends MigrationRuntimeInput {
43
+ readonly referenceScope: string;
44
+ }
45
+ /**
46
+ * Builds a domain's migrations from its resolved model versions and the project's migration
47
+ * modules: the runtime counterpart of the `modelVersions` literal of the generated `domain-spec.ts`
48
+ * and the `createMigrateFunction(...)` call of the generated `domain.ts`. The latest version uses the
49
+ * domain's own entity reflections, as generated code does. The result keeps its reference while
50
+ * the versions, the latest reflections and the migration modules stay the same.
51
+ */
52
+ export declare const MigrationRuntime: (referenceStore: RuntimeReferenceStore, props: MigrationRuntimeProps) => MigrationRuntime;
53
+ export {};
@@ -0,0 +1 @@
1
+ import e from"lodash-es/isEqual.js";import{Branded as i}from"@salsita-ai/common/utils";import{DomainEntityReflection as t,createMigrateFunction as s}from"#package/domain";let o=e=>"function"==typeof e,r=e=>`migrateToV${e}`,n=e=>{let{resolvedVersions:i,latestEntities:n,migrationModules:a}=e,l={},m={},d=[];for(let e of i.versionedModels){if(e.isLatest)l[e.version]=n;else{let i={};for(let s of e.modelVersion.entitySchemas)i[String(s.entityType)]=new t(String(s.entityType),[s.shapeSchema]);l[e.version]=i}if(void 0===e.migrationFile)continue;let i=r(e.version),s=a[e.migrationFile]?.[i];o(s)?m[e.version]=s:d.push(`${e.migrationFile}#${i}`)}return{modelVersions:l,migrations:m,migrate:s(l,i.latestVersion,m),missingMigrations:d}},a=e=>e.versionedModels.map(e=>({version:e.version,isLatest:e.isLatest,migrationFile:e.migrationFile,schemas:e.isLatest?[]:e.modelVersion.entitySchemas.map(e=>e.shapeSchema)})),l=(i,t)=>i.latestEntities===t.latestEntities&&i.resolvedVersions.latestVersion===t.resolvedVersions.latestVersion&&e(a(i.resolvedVersions),a(t.resolvedVersions))&&i.resolvedVersions.versionedModels.every(e=>void 0===e.migrationFile||i.migrationModules[e.migrationFile]===t.migrationModules[e.migrationFile]);export const MigrationRuntime=(e,t)=>{let s=e.createBuilder(t.referenceScope,{build:n,getKey:()=>"singleton",compare:l}).build({resolvedVersions:t.resolvedVersions,latestEntities:t.latestEntities,migrationModules:t.migrationModules});return i({...s.output,changed:s.changed})};
@@ -1,4 +1,4 @@
1
- import { type ComponentEntry, type ComponentImplementation } from '../../../parse-application-files/spec/index.js';
1
+ import type { ComponentEntry, ComponentImplementation } from '../../../parse-application-files/spec/index.js';
2
2
  import type { AdminModelRuntime } from '../admin-runtime/admin-model-runtime.js';
3
3
  import type { ConfiguratorModelRuntime } from '../configurator-runtime/configurator-model-runtime.js';
4
4
  import type { ComponentOptic } from './component-optic.js';
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{DomainComponentOpticBuilder as t,adminSidebarComponent as a,attributeSelectionComponent as i,componentsByName as r,composedOfComponent as n,navigationPageComponent as o,navigationPanelListComponent as d,referenceComponent as c}from"#package/domain";import*as m from"#package/domain";import{FILTER_CRITERION_KEYS as s,isSdkCodeRef as l}from"../../../parse-application-files/spec/index.js";let g=new Map([["reference",c],["composedOf",n],["adminSidebar",a],["attributeSelection",i],["navigationPage",o],["navigationPanelList",d]]),p={createAdminCustomPageRead:m.createAdminCustomPageRead,createAdminCustomSidebarRead:m.createAdminCustomSidebarRead,createAdminDataPageRead:m.createAdminDataPageRead,createAdminDataTableSidebarRead:m.createAdminDataTableSidebarRead,createAdminNavigationPanelRead:m.createAdminNavigationPanelRead,createAdminPresetCategoryPageRead:m.createAdminPresetCategoryPageRead,createAdminPresetCategorySelectionRead:m.createAdminPresetCategorySelectionRead,createAdminPresetCategorySelectionWrite:m.createAdminPresetCategorySelectionWrite,createAdminPresetCategorySidebarRead:m.createAdminPresetCategorySidebarRead,createAdminPresetListPageRead:m.createAdminPresetListPageRead,createAdminPresetSidebarRead:m.createAdminPresetSidebarRead,createAdminRecipeCollectionPageRead:m.createAdminRecipeCollectionPageRead,createAdminRecipeSidebarRead:m.createAdminRecipeSidebarRead},R=(e,t)=>{let a=p[e.sdkFunction]??m[e.sdkFunction];if("function"!=typeof a)throw Error(`SDK factory function "${e.sdkFunction}" not found. Make sure it is exported from the package.`);return a(...e.params.map(e=>{if(l(e)){let a=t.entities[e.$codeRef]??t.aliasReflections[e.$codeRef];if(!a)throw Error(`Reflection "${e.$codeRef}" not found in ModelRuntime. This is a bug — the target was validated at parse time.`);return a}return e}))};export const buildSdkOptic=(a,i,n,o)=>{let d=t.from(n),c=r.get(a.componentName)??g.get(a.componentName);if(!c)throw Error(`SDK component "${a.componentName}" not found. This is a bug — the component was validated at parse time.`);let m=d.withComponent(c,a.instanceName,!0),l=a.isAlias?m.withAlias(String(a.typeOrAlias)):m.withEntity(String(a.typeOrAlias));for(let e of i.filters.items){if("root"===e.kind){let t=e.target,a=e=>e[t];l=l.withFilter(a);continue}let t={};for(let a of s){let i=e[a];void 0!==i&&("dynamic"===i.kind?t[a]=e=>e[i.target]:"eval"===i.kind?t[a]=Function("self",`return (${i.code})`):t[a]=i.value)}l=l.withGradualFilter(t)}let p=R(i.readFactory,o),f=R(i.writeFactory,o),A=l.attach(p,f);return e({typeOrAlias:String(a.typeOrAlias),componentName:a.componentName,instanceName:String(a.instanceName),optic:A})};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{DomainComponentOpticBuilder as t,adminSidebarComponent as a,attributeSelectionComponent as i,componentsByName as r,composedOfComponent as n,navigationPageComponent as o,navigationPanelListComponent as d,referenceComponent as c}from"#package/domain";import*as m from"#package/domain";import{FILTER_CRITERION_KEYS as s,isSdkCodeRef as l}from"../../../core/index.js";let g=new Map([["reference",c],["composedOf",n],["adminSidebar",a],["attributeSelection",i],["navigationPage",o],["navigationPanelList",d]]),R={createAdminCustomPageRead:m.createAdminCustomPageRead,createAdminCustomSidebarRead:m.createAdminCustomSidebarRead,createAdminDataPageRead:m.createAdminDataPageRead,createAdminDataTableSidebarRead:m.createAdminDataTableSidebarRead,createAdminNavigationPanelRead:m.createAdminNavigationPanelRead,createAdminPresetCategoryPageRead:m.createAdminPresetCategoryPageRead,createAdminPresetCategorySelectionRead:m.createAdminPresetCategorySelectionRead,createAdminPresetCategorySelectionWrite:m.createAdminPresetCategorySelectionWrite,createAdminPresetCategorySidebarRead:m.createAdminPresetCategorySidebarRead,createAdminPresetListPageRead:m.createAdminPresetListPageRead,createAdminPresetSidebarRead:m.createAdminPresetSidebarRead,createAdminRecipeCollectionPageRead:m.createAdminRecipeCollectionPageRead,createAdminRecipeSidebarRead:m.createAdminRecipeSidebarRead},p=(e,t)=>{let a=R[e.sdkFunction]??m[e.sdkFunction];if("function"!=typeof a)throw Error(`SDK factory function "${e.sdkFunction}" not found. Make sure it is exported from the package.`);return a(...e.params.map(e=>{if(l(e)){let a=t.entities[e.$codeRef]??t.aliasReflections[e.$codeRef];if(!a)throw Error(`Reflection "${e.$codeRef}" not found in ModelRuntime. This is a bug — the target was validated at parse time.`);return a}return e}))};export const buildSdkOptic=(a,i,n,o)=>{let d=t.from(n),c=r.get(a.componentName)??g.get(a.componentName);if(!c)throw Error(`SDK component "${a.componentName}" not found. This is a bug — the component was validated at parse time.`);let m=d.withComponent(c,a.instanceName,!0),l=a.isAlias?m.withAlias(String(a.typeOrAlias)):m.withEntity(String(a.typeOrAlias));for(let e of i.filters.items){if("root"===e.kind){let t=e.target,a=e=>e[t];l=l.withFilter(a);continue}let t={};for(let a of s){let i=e[a];void 0!==i&&("dynamic"===i.kind?t[a]=e=>e[i.target]:"eval"===i.kind?t[a]=Function("self",`return (${i.code})`):t[a]=i.value)}l=l.withGradualFilter(t)}let R=p(i.readFactory,o),A=p(i.writeFactory,o),f=l.attach(R,A);return e({typeOrAlias:String(a.typeOrAlias),componentName:a.componentName,instanceName:String(a.instanceName),optic:f})};
@@ -4,7 +4,8 @@ import type { RuntimeReferenceStore } from '../../../caching/index.js';
4
4
  import type { ComponentEntry } from '../../../parse-application-files/spec/index.js';
5
5
  import type { AdminModelRuntime } from '../admin-runtime/admin-model-runtime.js';
6
6
  import type { ConfiguratorModelRuntime } from '../configurator-runtime/configurator-model-runtime.js';
7
- type AnyComponentOptic = DomainComponentOptic<any, any, any, any, any, any, SystemComponentTypeConstraint>;
7
+ /** A component optic of any project, for any component type. */
8
+ export type AnyComponentOptic = DomainComponentOptic<any, any, any, any, any, any, SystemComponentTypeConstraint>;
8
9
  /** A single built component optic with its identifying metadata. */
9
10
  export type ComponentOptic = Branded<'ComponentOptic', {
10
11
  readonly typeOrAlias: string;
@@ -1 +1 @@
1
- import e from"lodash-es/isEqual.js";import{Branded as t}from"@salsita-ai/common/utils";import{createRelationFactory as i}from"#package/domain";import{canonicalEnhancedJsonValueKey as a}from"../../../core/index.js";import{isSdkExpressionImplementation as n}from"../../../parse-application-files/spec/index.js";import{generateMemoEvalPlanRuntime as r}from"./generate-memo-eval-plan-runtime.js";let l={},o={relation:(e,t)=>i(e.aliasMap)(t[0]),violations:(e,t)=>{let i=t[0];if("object"!=typeof i||null===i||!("entityType"in i)||"string"!=typeof i.entityType)throw Error("Cannot create the violations expression because its entityType parameter is missing. The application spec is inconsistent; rebuild it from a valid invariants declaration.");let a=i.entityType,n=Object.entries(e.invariantImplementations).flatMap(([t,i])=>{let n=e.aliasMap[t];return t===a||n?.includes(a)?i:[]});return{origin:{name:"$violations",typeOrAlias:a},evaluate:(e,t,i)=>n.flatMap(a=>a.evaluate(e,t,i)),meta:{}}}},s=e=>{let t=r(e.plan);return{origin:{name:e.name,typeOrAlias:e.entityOrAlias},evaluate:(e,i,a)=>t(a.domain.get$Entity(e,i),i,a),meta:{}}},p=e=>({...(0,o[e.kind])({aliasMap:e.aliasMap,invariantImplementations:e.invariantImplementations},e.params),origin:{name:e.name,typeOrAlias:e.entityOrAlias}});export const ExpressionRuntime=(i,r,o,m,u=l)=>{let d={};for(let[e,t]of i.latestModel.aliases)d[String(e)]=t.map(String);let f=r.createBuilder(`${m}/sdk`,{build:p,getKey:e=>`sdk::${e.entityOrAlias}::${e.name}`,compare:(t,i)=>t.kind===i.kind&&e(t.params,i.params)&&e(t.aliasMap,i.aliasMap)&&("violations"!==i.kind||t.invariantImplementations===i.invariantImplementations)}),y=r.createBuilder(`${m}/user`,{build:e=>e.impl,getKey:e=>`user::${e.entityType}::${e.name}`,compare:(e,t)=>e.impl===t.impl}),g=r.createBuilder(`${m}/value`,{build:s,getKey:e=>`value::${e.entityOrAlias}::${e.name}`,compare:(e,t)=>e.valueKey===t.valueKey}),c={},v=!1,S=new Set,b=new Set,k=new Set;for(let[e,t]of i.expressions.expressions)for(let[,i]of t){let t=d[String(e)]??[String(e)];if(n(i.implementation)){let a={entityOrAlias:String(e),name:String(i.name),kind:i.implementation.kind,params:i.implementation.params,aliasMap:d,invariantImplementations:u},n=f.build(a);for(let e of(n.changed&&(v=!0),S.add(f.getKey(a)),t))c[e]||(c[e]={}),c[e][String(i.name)]=n.output;continue}if("value"===i.implementation.kind){let n=i.implementation.value,r={entityOrAlias:String(e),name:String(i.name),valueKey:a(n),plan:i.implementation.plan},l=g.build(r);for(let e of(l.changed&&(v=!0),k.add(g.getKey(r)),t))c[e]||(c[e]={}),c[e][String(i.name)]=l.output;continue}}for(let[e,t]of Object.entries(o))for(let[i,a]of Object.entries(t)){let t={entityType:e,name:i,impl:a},n=y.build(t);n.changed&&(v=!0),b.add(y.getKey(t)),c[e]||(c[e]={}),c[e][i]=n.output}f.cleanup(S)&&(v=!0),y.cleanup(b)&&(v=!0),g.cleanup(k)&&(v=!0);let x=[];for(let[e,t]of i.expressions.entityExpressions)for(let a of t.shapeGroups){let t=i.expressions.expressions.get(a);if(t)for(let[i]of t)c[String(e)]?.[String(i)]||x.push({entityType:String(e),exprName:String(i)})}return x.length>0?{ok:!1,missing:x}:{ok:!0,runtime:t({merged:c,changed:v})}};
1
+ import e from"lodash-es/isEqual.js";import{Branded as t}from"@salsita-ai/common/utils";import{createRelationFactory as i}from"#package/domain";import{canonicalEnhancedJsonValueKey as n,isSdkExpressionImplementation as a}from"../../../core/index.js";import{generateMemoEvalPlanRuntime as r}from"./generate-memo-eval-plan-runtime.js";let l={},o=["0-1","1-1","0-N","1-N"],s={relation:(e,t)=>{let n=t[0];if(!("object"==typeof n&&null!==n&&"kind"in n&&"target"in n&&"string"==typeof n.target&&"cardinality"in n&&o.includes(n.cardinality)&&("allOfType"===n.kind||("direct"===n.kind||"indirect"===n.kind)&&"field"in n&&"string"==typeof n.field)))throw Error("Cannot create the relation expression because its parameter is not a relation declaration. The application spec is inconsistent; rebuild it from a valid relations declaration.");return i(e.aliasMap)(n)},violations:(e,t)=>{let i=t[0];if("object"!=typeof i||null===i||!("entityType"in i)||"string"!=typeof i.entityType)throw Error("Cannot create the violations expression because its entityType parameter is missing. The application spec is inconsistent; rebuild it from a valid invariants declaration.");let n=i.entityType,a=Object.entries(e.invariantImplementations).flatMap(([t,i])=>{let a=e.aliasMap[t];return t===n||a?.includes(n)?i:[]});return{origin:{name:"$violations",typeOrAlias:n},evaluate:(e,t,i)=>a.flatMap(n=>n.evaluate(e,t,i)),meta:{}}}},p=e=>{let t=r(e.plan);return{origin:{name:e.name,typeOrAlias:e.entityOrAlias},evaluate:(e,i,n)=>t(n.domain.get$Entity(e,i),i,n),meta:{}}},m=e=>({...(0,s[e.kind])({aliasMap:e.aliasMap,invariantImplementations:e.invariantImplementations},e.params),origin:{name:e.name,typeOrAlias:e.entityOrAlias}});export const ExpressionRuntime=(i,r,o,s,u=l)=>{let d={};for(let[e,t]of i.latestModel.aliases)d[String(e)]=t.map(String);let c=r.createBuilder(`${s}/sdk`,{build:m,getKey:e=>`sdk::${e.entityOrAlias}::${e.name}`,compare:(t,i)=>t.kind===i.kind&&e(t.params,i.params)&&e(t.aliasMap,i.aliasMap)&&("violations"!==i.kind||t.invariantImplementations===i.invariantImplementations)}),f=r.createBuilder(`${s}/user`,{build:e=>e.impl,getKey:e=>`user::${e.entityType}::${e.name}`,compare:(e,t)=>e.impl===t.impl}),y=r.createBuilder(`${s}/value`,{build:p,getKey:e=>`value::${e.entityOrAlias}::${e.name}`,compare:(e,t)=>e.valueKey===t.valueKey}),g={},v=!1,S=new Set,k=new Set,b=new Set;for(let[e,t]of i.expressions.expressions)for(let[,i]of t){let t=d[String(e)]??[String(e)];if(a(i.implementation)){let n={entityOrAlias:String(e),name:String(i.name),kind:i.implementation.kind,params:i.implementation.params,aliasMap:d,invariantImplementations:u},a=c.build(n);for(let e of(a.changed&&(v=!0),S.add(c.getKey(n)),t))g[e]||(g[e]={}),g[e][String(i.name)]=a.output;continue}if("value"===i.implementation.kind){let a=i.implementation.value,r={entityOrAlias:String(e),name:String(i.name),valueKey:n(a),plan:i.implementation.plan},l=y.build(r);for(let e of(l.changed&&(v=!0),b.add(y.getKey(r)),t))g[e]||(g[e]={}),g[e][String(i.name)]=l.output;continue}}for(let[e,t]of Object.entries(o))for(let[i,n]of Object.entries(t)){let t={entityType:e,name:i,impl:n},a=f.build(t);a.changed&&(v=!0),k.add(f.getKey(t)),g[e]||(g[e]={}),g[e][i]=a.output}c.cleanup(S)&&(v=!0),f.cleanup(k)&&(v=!0),y.cleanup(b)&&(v=!0);let h=[];for(let[e,t]of i.expressions.entityExpressions)for(let n of t.shapeGroups){let t=i.expressions.expressions.get(n);if(t)for(let[i]of t)g[String(e)]?.[String(i)]||h.push({entityType:String(e),exprName:String(i)})}return h.length>0?{ok:!1,missing:h}:{ok:!0,runtime:t({merged:g,changed:v})}};
@@ -2,7 +2,6 @@ import { Branded } from '@salsita-ai/common/utils';
2
2
  import type { ImportedTransformer } from '#package/domain';
3
3
  import type { RuntimeReferenceStore } from '../../../caching/index.js';
4
4
  import type { ApplicationSpec } from '../../../parse-application-files/index.js';
5
- type AnyImportedTransformer = ImportedTransformer<any, any, any, any, any, any, any>;
6
5
  /**
7
6
  * Runtime section for transformers. Combines two sources of truth:
8
7
  * - `importedTransformers` — factory functions from src/transformers/*.ts
@@ -13,9 +12,8 @@ type AnyImportedTransformer = ImportedTransformer<any, any, any, any, any, any,
13
12
  * decide whether to push a fresh `createTransformers` factory into the registry.
14
13
  */
15
14
  export type TransformersRuntime = Branded<'TransformersRuntime', {
16
- readonly importedTransformers: readonly AnyImportedTransformer[];
15
+ readonly importedTransformers: readonly ImportedTransformer[];
17
16
  readonly specTransformers: ApplicationSpec['configurator']['transformers'];
18
17
  readonly changed: boolean;
19
18
  }>;
20
- export declare const TransformersRuntime: (spec: ApplicationSpec, referenceStore: RuntimeReferenceStore, importedTransformers: readonly AnyImportedTransformer[]) => TransformersRuntime;
21
- export {};
19
+ export declare const TransformersRuntime: (spec: ApplicationSpec, referenceStore: RuntimeReferenceStore, importedTransformers: readonly ImportedTransformer[]) => TransformersRuntime;
@@ -1,4 +1,5 @@
1
1
  export * from './core/index.js';
2
+ export * from './enhanced-json/index.js';
2
3
  export * from './caching/index.js';
3
4
  export * from './errors/index.js';
4
5
  export * from './generate-application/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";
1
+ export*from"./core/index.js";export*from"./enhanced-json/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";
@@ -58,6 +58,12 @@ export type CategorizedFiles = Branded<'CategorizedFiles', {
58
58
  readonly adminElementsChanged: boolean;
59
59
  readonly webhooks: readonly CategorizedFile[];
60
60
  readonly webhooksChanged: boolean;
61
+ /**
62
+ * Whether the project has its webhook entry, `src/webhooks/index.ts`, whose default export is the
63
+ * project's webhook. Generation reads it to decide the generated webhook entry: without it the
64
+ * entry holds the built-in inert webhook.
65
+ */
66
+ readonly hasWebhookEntry: boolean;
61
67
  readonly locales: readonly CategorizedFile[];
62
68
  readonly localesChanged: boolean;
63
69
  readonly mockTemplates: readonly CategorizedFile[];
@@ -1 +1 @@
1
- import e from"lodash-es/isEqual.js";import{Branded as n}from"@salsita-ai/common/utils";import{computeFileDepHashes as s}from"../../caching/index.js";import{DiagnosticCode as o,diagnosticMessages as a}from"../../errors/index.js";import{findWebhookHandlerRegistration as i}from"./module-analysis.js";import{findWebhookSafetyViolation as t}from"./webhook-safety.js";export const buildProjectFileIndex=e=>new Map([...e.spec,...e.expressions,...e.actions,...e.handlers,...e.elements,...e.transformers,...e.components,...e.invariants,...e.migrations,...e.adminMigrations,...e.adminExpressions,...e.adminInvariants,...e.adminComponents,...e.adminElements,...e.webhooks,...e.locales,...e.mockTemplates,...e.projectFiles,...e.customCode].map(e=>[e.file.name,e]));let r=e=>/\/_[^/]+\//.test(e),m=[{path:"spec/",key:"spec"},{path:"src/admin/expressions/",key:"adminExpressions"},{path:"src/admin/invariants/",key:"adminInvariants"},{path:"src/admin/components/",key:"adminComponents"},{path:"src/admin/elements/",key:"adminElements"},{path:"src/admin/migrations/",key:"adminMigrations"},{path:"src/expressions/",key:"expressions"},{path:"src/actions/",key:"actions"},{path:"src/handlers/",key:"handlers"},{path:"src/elements/",key:"elements"},{path:"src/transformers/",key:"transformers"},{path:"src/components/",key:"components"},{path:"src/invariants/",key:"invariants"},{path:"src/migrations/",key:"migrations"},{path:"src/webhooks/",key:"webhooks"},{path:"src/locales/",key:"locales"},{path:"mocks/",key:"mockTemplates"}],l=new Set(["package.json",".gitignore","CLAUDE.md",".cursor/rules/phoenix.mdc"]),d=new Set(["migrations","adminMigrations"]),c=m.filter(({path:e,key:n})=>e.startsWith("src/")&&d.has(n)),p=(e,n)=>{let s=e.slice(n.length).split("/");return!(s.length<=1)&&s.slice(0,-1).some(e=>!e.startsWith("_"))},h=/\.(ts|tsx|js|jsx)$/,f=(e,n)=>{if("components"===e||"adminComponents"===e)return n.hasUseWebhookDirective?{membership:"pinned",logSuffix:"webhook ('use webhook' directive)"}:{membership:"frontend",logSuffix:"frontend only (no 'use webhook' directive)"};if("handlers"===e){let e=i(n);return void 0!==e?{membership:"named-handler",logSuffix:`webhook (the ${e} registration)`}:n.hasUseWebhookDirective?{membership:"pinned",logSuffix:"webhook ('use webhook' directive)"}:{membership:"frontend",logSuffix:"frontend only (not a named handler or pin)"}}};export const CategorizedFiles=(i,d,g,u)=>{let k={spec:[],expressions:[],actions:[],handlers:[],elements:[],transformers:[],components:[],invariants:[],migrations:[],adminMigrations:[],adminExpressions:[],adminInvariants:[],adminComponents:[],adminElements:[],webhooks:[],locales:[],mockTemplates:[],projectFiles:[],customCode:[]},b=[];for(let e of i.files){if("text"!==e.kind)continue;if(r(e.name)){k.customCode.push({file:e,category:"customCode"});continue}if(l.has(e.name)){k.projectFiles.push({file:e,category:"projectFiles"});continue}let n=!1;for(let{path:s,key:o}of m)if(e.name.startsWith(s)){k[o].push({file:e,category:o}),n=!0;break}n||b.push(e.name)}for(let e of b)e.startsWith("src/")&&g.error(o.UNKNOWN_SRC_PATH,a.UNKNOWN_SRC_PATH(e));for(let{path:e,key:n}of c)for(let s of k[n])p(s.file.name,e)&&g.error(o.INVALID_SUBDIRECTORY,a.INVALID_SUBDIRECTORY(s.file.name,e));if(k.webhooks.length>0&&!k.webhooks.some(e=>"src/webhooks/index.ts"===e.file.name)&&g.error(o.MISSING_WEBHOOK_INDEX,a.MISSING_WEBHOOK_INDEX()),g.hasErrors)return;let C=[];for(let e of Object.values(k))for(let n of e)C.push(n.file.name);let v=s(i,C),{analyzer:x,logger:y}=u,E=d.createBuilder("categorizedFiles/moduleAnalysis",{build:e=>{try{return{analysis:x(e.name,e.content)}}catch(e){return{error:e instanceof Error?e.message:String(e)}}},getKey:e=>e.name,compare:(e,n)=>e.content===n.content}),I=new Set,w=e=>{if(!h.test(e.name))return;I.add(e.name);let n=E.build({name:e.name,content:e.content}).output;return void 0!==n.error?void g.error(o.MODULE_ANALYSIS_FAILED,a[o.MODULE_ANALYSIS_FAILED](e.name,n.error)):n.analysis},S={},j={};for(let[e,s]of Object.entries(k)){let o=d.createBuilder(`categorizedFiles/${e}`,{build:e=>e,getKey:e=>e.name,compare:(e,n)=>e.depHash===n.depHash}),a=new Set;S[e]=s.map(e=>{let s=v[e.file.name]??{deps:[],hash:""},{changed:i}=o.build({name:e.file.name,depHash:s.hash});a.add(e.file.name);let t=w(e.file),r=void 0===t?void 0:f(e.category,t);return void 0!==r&&y.debug(`Webhook membership: ${e.file.name} -> ${r.logSuffix}`),n({file:e.file,category:e.category,deps:s.deps,depHash:s.hash,changed:i,analysis:t,webhookMembership:r?.membership})}),j[e]=o.cleanup(a)}E.cleanup(I);let _=(e,n)=>n.some(e=>e.changed)||!0===j[e],F=d.createBuilder("categorizedFiles/envs",{build:e=>e.envs,getKey:()=>"singleton",compare:(n,s)=>e(n.envs,s.envs)}).build({envs:i.envs}),M=n({spec:S.spec,specChanged:_("spec",S.spec),expressions:S.expressions,expressionsChanged:_("expressions",S.expressions),actions:S.actions,actionsChanged:_("actions",S.actions),handlers:S.handlers,handlersChanged:_("handlers",S.handlers),elements:S.elements,elementsChanged:_("elements",S.elements),transformers:S.transformers,transformersChanged:_("transformers",S.transformers),components:S.components,componentsChanged:_("components",S.components),invariants:S.invariants,invariantsChanged:_("invariants",S.invariants),migrations:S.migrations,migrationsChanged:_("migrations",S.migrations),adminMigrations:S.adminMigrations,adminMigrationsChanged:_("adminMigrations",S.adminMigrations),adminExpressions:S.adminExpressions,adminExpressionsChanged:_("adminExpressions",S.adminExpressions),adminInvariants:S.adminInvariants,adminInvariantsChanged:_("adminInvariants",S.adminInvariants),adminComponents:S.adminComponents,adminComponentsChanged:_("adminComponents",S.adminComponents),adminElements:S.adminElements,adminElementsChanged:_("adminElements",S.adminElements),webhooks:S.webhooks,webhooksChanged:_("webhooks",S.webhooks),locales:S.locales,localesChanged:_("locales",S.locales),mockTemplates:S.mockTemplates,mockTemplatesChanged:_("mockTemplates",S.mockTemplates),projectFiles:S.projectFiles,projectFilesChanged:_("projectFiles",S.projectFiles),customCode:S.customCode,customCodeChanged:_("customCode",S.customCode),envs:F.output,envsChanged:F.changed}),O=buildProjectFileIndex(M);for(let e of O.values()){if("pinned"!==e.webhookMembership&&"named-handler"!==e.webhookMembership)continue;let n=t(e,O);void 0!==n&&g.error(o.WEBHOOK_UNSAFE_IMPORT,a[o.WEBHOOK_UNSAFE_IMPORT](n.fileName,n.inclusionReason,n.importer,n.specifier))}return M};
1
+ import e from"lodash-es/isEqual.js";import{Branded as n}from"@salsita-ai/common/utils";import{computeFileDepHashes as s}from"../../caching/index.js";import{DiagnosticCode as o,diagnosticMessages as a}from"../../errors/index.js";import{findWebhookHandlerRegistration as i}from"./module-analysis.js";import{findWebhookSafetyViolation as t}from"./webhook-safety.js";export const buildProjectFileIndex=e=>new Map([...e.spec,...e.expressions,...e.actions,...e.handlers,...e.elements,...e.transformers,...e.components,...e.invariants,...e.migrations,...e.adminMigrations,...e.adminExpressions,...e.adminInvariants,...e.adminComponents,...e.adminElements,...e.webhooks,...e.locales,...e.mockTemplates,...e.projectFiles,...e.customCode].map(e=>[e.file.name,e]));let r=e=>/\/_[^/]+\//.test(e),m=[{path:"spec/",key:"spec"},{path:"src/admin/expressions/",key:"adminExpressions"},{path:"src/admin/invariants/",key:"adminInvariants"},{path:"src/admin/components/",key:"adminComponents"},{path:"src/admin/elements/",key:"adminElements"},{path:"src/admin/migrations/",key:"adminMigrations"},{path:"src/expressions/",key:"expressions"},{path:"src/actions/",key:"actions"},{path:"src/handlers/",key:"handlers"},{path:"src/elements/",key:"elements"},{path:"src/transformers/",key:"transformers"},{path:"src/components/",key:"components"},{path:"src/invariants/",key:"invariants"},{path:"src/migrations/",key:"migrations"},{path:"src/webhooks/",key:"webhooks"},{path:"src/locales/",key:"locales"},{path:"mocks/",key:"mockTemplates"}],l=new Set(["package.json",".gitignore","CLAUDE.md",".cursor/rules/phoenix.mdc"]),d=new Set(["migrations","adminMigrations"]),c=m.filter(({path:e,key:n})=>e.startsWith("src/")&&d.has(n)),p=(e,n)=>{let s=e.slice(n.length).split("/");return!(s.length<=1)&&s.slice(0,-1).some(e=>!e.startsWith("_"))},h=/\.(ts|tsx|js|jsx)$/,f=(e,n)=>{if("components"===e||"adminComponents"===e)return n.hasUseWebhookDirective?{membership:"pinned",logSuffix:"webhook ('use webhook' directive)"}:{membership:"frontend",logSuffix:"frontend only (no 'use webhook' directive)"};if("handlers"===e){let e=i(n);return void 0!==e?{membership:"named-handler",logSuffix:`webhook (the ${e} registration)`}:n.hasUseWebhookDirective?{membership:"pinned",logSuffix:"webhook ('use webhook' directive)"}:{membership:"frontend",logSuffix:"frontend only (not a named handler or pin)"}}};export const CategorizedFiles=(i,d,g,u)=>{let k={spec:[],expressions:[],actions:[],handlers:[],elements:[],transformers:[],components:[],invariants:[],migrations:[],adminMigrations:[],adminExpressions:[],adminInvariants:[],adminComponents:[],adminElements:[],webhooks:[],locales:[],mockTemplates:[],projectFiles:[],customCode:[]},b=[];for(let e of i.files){if("text"!==e.kind)continue;if(r(e.name)){k.customCode.push({file:e,category:"customCode"});continue}if(l.has(e.name)){k.projectFiles.push({file:e,category:"projectFiles"});continue}let n=!1;for(let{path:s,key:o}of m)if(e.name.startsWith(s)){k[o].push({file:e,category:o}),n=!0;break}n||b.push(e.name)}for(let e of b)e.startsWith("src/")&&g.error(o.UNKNOWN_SRC_PATH,a.UNKNOWN_SRC_PATH(e));for(let{path:e,key:n}of c)for(let s of k[n])p(s.file.name,e)&&g.error(o.INVALID_SUBDIRECTORY,a.INVALID_SUBDIRECTORY(s.file.name,e));let C=k.webhooks.some(e=>"src/webhooks/index.ts"===e.file.name);if(k.webhooks.length>0&&!C&&g.error(o.MISSING_WEBHOOK_INDEX,a.MISSING_WEBHOOK_INDEX()),g.hasErrors)return;let v=[];for(let e of Object.values(k))for(let n of e)v.push(n.file.name);let x=s(i,v),{analyzer:y,logger:E}=u,I=d.createBuilder("categorizedFiles/moduleAnalysis",{build:e=>{try{return{analysis:y(e.name,e.content)}}catch(e){return{error:e instanceof Error?e.message:String(e)}}},getKey:e=>e.name,compare:(e,n)=>e.content===n.content}),w=new Set,S=e=>{if(!h.test(e.name))return;w.add(e.name);let n=I.build({name:e.name,content:e.content}).output;return void 0!==n.error?void g.error(o.MODULE_ANALYSIS_FAILED,a[o.MODULE_ANALYSIS_FAILED](e.name,n.error)):n.analysis},j={},_={};for(let[e,s]of Object.entries(k)){let o=d.createBuilder(`categorizedFiles/${e}`,{build:e=>e,getKey:e=>e.name,compare:(e,n)=>e.depHash===n.depHash}),a=new Set;j[e]=s.map(e=>{let s=x[e.file.name]??{deps:[],hash:""},{changed:i}=o.build({name:e.file.name,depHash:s.hash});a.add(e.file.name);let t=S(e.file),r=void 0===t?void 0:f(e.category,t);return void 0!==r&&E.debug(`Webhook membership: ${e.file.name} -> ${r.logSuffix}`),n({file:e.file,category:e.category,deps:s.deps,depHash:s.hash,changed:i,analysis:t,webhookMembership:r?.membership})}),_[e]=o.cleanup(a)}I.cleanup(w);let F=(e,n)=>n.some(e=>e.changed)||!0===_[e],M=d.createBuilder("categorizedFiles/envs",{build:e=>e.envs,getKey:()=>"singleton",compare:(n,s)=>e(n.envs,s.envs)}).build({envs:i.envs}),O=n({spec:j.spec,specChanged:F("spec",j.spec),expressions:j.expressions,expressionsChanged:F("expressions",j.expressions),actions:j.actions,actionsChanged:F("actions",j.actions),handlers:j.handlers,handlersChanged:F("handlers",j.handlers),elements:j.elements,elementsChanged:F("elements",j.elements),transformers:j.transformers,transformersChanged:F("transformers",j.transformers),components:j.components,componentsChanged:F("components",j.components),invariants:j.invariants,invariantsChanged:F("invariants",j.invariants),migrations:j.migrations,migrationsChanged:F("migrations",j.migrations),adminMigrations:j.adminMigrations,adminMigrationsChanged:F("adminMigrations",j.adminMigrations),adminExpressions:j.adminExpressions,adminExpressionsChanged:F("adminExpressions",j.adminExpressions),adminInvariants:j.adminInvariants,adminInvariantsChanged:F("adminInvariants",j.adminInvariants),adminComponents:j.adminComponents,adminComponentsChanged:F("adminComponents",j.adminComponents),adminElements:j.adminElements,adminElementsChanged:F("adminElements",j.adminElements),webhooks:j.webhooks,webhooksChanged:F("webhooks",j.webhooks),hasWebhookEntry:C,locales:j.locales,localesChanged:F("locales",j.locales),mockTemplates:j.mockTemplates,mockTemplatesChanged:F("mockTemplates",j.mockTemplates),projectFiles:j.projectFiles,projectFilesChanged:F("projectFiles",j.projectFiles),customCode:j.customCode,customCodeChanged:F("customCode",j.customCode),envs:M.output,envsChanged:M.changed}),N=buildProjectFileIndex(O);for(let e of N.values()){if("pinned"!==e.webhookMembership&&"named-handler"!==e.webhookMembership)continue;let n=t(e,N);void 0!==n&&g.error(o.WEBHOOK_UNSAFE_IMPORT,a[o.WEBHOOK_UNSAFE_IMPORT](n.fileName,n.inclusionReason,n.importer,n.specifier))}return O};
@@ -43,6 +43,6 @@ export declare const analyzeParsedModule: (module: Module) => ModuleAnalysis;
43
43
  /** The explicit webhook classification of one authored file. */
44
44
  export type WebhookMembership = 'pinned' | 'named-handler' | 'frontend';
45
45
  /** Handler registrations that keep implicit webhook membership for legacy-CLI parity. */
46
- export declare const WEBHOOK_HANDLER_REGISTRATIONS: readonly ['createMapPublishedRevisionDataHandler', 'createMapPublishedChunkedDataHandler', 'createDataRowValidatorHandler', 'createSheetValidatorHandler'];
46
+ export declare const WEBHOOK_HANDLER_REGISTRATIONS: readonly ['phx.domain.createAssistantSetupHandler', 'phx.domain.admin.createMapPublishedRevisionDataHandler', 'phx.domain.admin.createMapPublishedChunkedDataHandler', 'phx.domain.admin.createDataRowValidatorHandler', 'phx.domain.admin.createSheetValidatorHandler'];
47
47
  /** Returns the named webhook handler registration a handler module calls, if any. */
48
48
  export declare const findWebhookHandlerRegistration: (analysis: ModuleAnalysis) => string | undefined;
@@ -1 +1 @@
1
- import{Visitor as e}from"@swc/core/Visitor.js";export const getModuleParseOptions=()=>({syntax:"typescript",tsx:!0,target:"es2022"});let t=e=>{if("Identifier"===e.type)return e.value;if("ParenthesisExpression"===e.type)return t(e.expression);if("MemberExpression"!==e.type||"Identifier"!==e.property.type)return;let r=t(e.object);return void 0===r?void 0:`${r}.${e.property.value}`},r=e=>e.length>0&&e.every(e=>"isTypeOnly"in e&&!0===e.isTypeOnly),i=class ProjectSourceVisitor extends e{imports=[];calledMemberPaths=new Set;visitTsType(e){return e}visitImportDeclaration(e){return this.imports.push({specifier:e.source.value,typeOnly:e.typeOnly||r(e.specifiers)}),e}visitExportNamedDeclaration(e){return null!=e.source&&this.imports.push({specifier:e.source.value,typeOnly:e.typeOnly||r(e.specifiers)}),super.visitExportNamedDeclaration(e)}visitExportAllDeclaration(e){return this.imports.push({specifier:e.source.value,typeOnly:"typeOnly"in e&&!0===e.typeOnly}),e}visitCallExpression(e){var r;let i=(r=e.arguments[0]?.expression,r?.type==="StringLiteral"?r.value:r?.type==="TemplateLiteral"&&0===r.expressions.length?r.quasis[0]?.cooked??r.quasis[0]?.raw:void 0);if("Import"===e.callee.type&&void 0!==i)this.imports.push({specifier:i,typeOnly:!1});else if("Super"!==e.callee.type&&"Import"!==e.callee.type){let r=t(e.callee);void 0!==r&&this.calledMemberPaths.add(r),"require"===r&&void 0!==i&&this.imports.push({specifier:i,typeOnly:!1})}return super.visitCallExpression(e)}};export const analyzeParsedModule=e=>{let t=new i;t.visitModule(e);let r=e.body[0];return{imports:t.imports,calledMemberPaths:[...t.calledMemberPaths].sort(),hasUseWebhookDirective:r?.type==="ExpressionStatement"&&"StringLiteral"===r.expression.type&&"use webhook"===r.expression.value}};export const WEBHOOK_HANDLER_REGISTRATIONS=["createMapPublishedRevisionDataHandler","createMapPublishedChunkedDataHandler","createDataRowValidatorHandler","createSheetValidatorHandler"];export const findWebhookHandlerRegistration=e=>WEBHOOK_HANDLER_REGISTRATIONS.find(t=>e.calledMemberPaths.includes(`phx.domain.admin.${t}`));
1
+ import{Visitor as e}from"@swc/core/Visitor.js";export const getModuleParseOptions=()=>({syntax:"typescript",tsx:!0,target:"es2022"});let t=e=>{if("Identifier"===e.type)return e.value;if("ParenthesisExpression"===e.type)return t(e.expression);if("MemberExpression"!==e.type||"Identifier"!==e.property.type)return;let r=t(e.object);return void 0===r?void 0:`${r}.${e.property.value}`},r=e=>e.length>0&&e.every(e=>"isTypeOnly"in e&&!0===e.isTypeOnly),i=class ProjectSourceVisitor extends e{imports=[];calledMemberPaths=new Set;visitTsType(e){return e}visitImportDeclaration(e){return this.imports.push({specifier:e.source.value,typeOnly:e.typeOnly||r(e.specifiers)}),e}visitExportNamedDeclaration(e){return null!=e.source&&this.imports.push({specifier:e.source.value,typeOnly:e.typeOnly||r(e.specifiers)}),super.visitExportNamedDeclaration(e)}visitExportAllDeclaration(e){return this.imports.push({specifier:e.source.value,typeOnly:"typeOnly"in e&&!0===e.typeOnly}),e}visitCallExpression(e){var r;let i=(r=e.arguments[0]?.expression,r?.type==="StringLiteral"?r.value:r?.type==="TemplateLiteral"&&0===r.expressions.length?r.quasis[0]?.cooked??r.quasis[0]?.raw:void 0);if("Import"===e.callee.type&&void 0!==i)this.imports.push({specifier:i,typeOnly:!1});else if("Super"!==e.callee.type&&"Import"!==e.callee.type){let r=t(e.callee);void 0!==r&&this.calledMemberPaths.add(r),"require"===r&&void 0!==i&&this.imports.push({specifier:i,typeOnly:!1})}return super.visitCallExpression(e)}};export const analyzeParsedModule=e=>{let t=new i;t.visitModule(e);let r=e.body[0];return{imports:t.imports,calledMemberPaths:[...t.calledMemberPaths].sort(),hasUseWebhookDirective:r?.type==="ExpressionStatement"&&"StringLiteral"===r.expression.type&&"use webhook"===r.expression.value}};export const WEBHOOK_HANDLER_REGISTRATIONS=["phx.domain.createAssistantSetupHandler","phx.domain.admin.createMapPublishedRevisionDataHandler","phx.domain.admin.createMapPublishedChunkedDataHandler","phx.domain.admin.createDataRowValidatorHandler","phx.domain.admin.createSheetValidatorHandler"];export const findWebhookHandlerRegistration=e=>WEBHOOK_HANDLER_REGISTRATIONS.find(t=>e.calledMemberPaths.includes(t));
@@ -1,13 +1,26 @@
1
1
  import { z } from 'zod';
2
2
  import { type AssistantAiSettings } from '@salsita-ai/contracts/assistant';
3
+ import { ASSISTANT_HINTS } from '#package/domain';
3
4
  /**
4
5
  * One whitelisted field in the assistant manifest. `description` overrides the JSON Schema
5
- * description of the shape property; `as` exposes the field under a different GraphQL name. An empty
6
+ * description of the shape property; `as` exposes the field under a different GraphQL name; `lenses`
7
+ * names the lenses declared under `assistant.lenses` whose selection includes the field. An empty
6
8
  * entry (`length:` in YAML) whitelists the field with its defaults.
7
9
  */
8
10
  export interface RawAssistantField {
9
11
  readonly description?: string;
10
12
  readonly as?: string;
13
+ readonly lenses?: readonly string[];
14
+ }
15
+ /**
16
+ * One lens of the assistant `lenses` map, keyed by the name the agent spreads it by: a named
17
+ * selection made of the `entities` entries tagged with that name. `description` tells the agent when
18
+ * to use the lens; `maxDepth` is how many levels of tagged relations carry the same selection before
19
+ * they reduce to `id`, 1 by default.
20
+ */
21
+ export interface RawAssistantLens {
22
+ readonly description: string;
23
+ readonly maxDepth?: number;
11
24
  }
12
25
  /**
13
26
  * One entry of the assistant `deletable` map. It takes no options yet; an empty entry (`Cabinet:` in
@@ -23,7 +36,6 @@ export type AssistantOptionComponentType = (typeof ASSISTANT_OPTION_COMPONENT_TY
23
36
  * does not change during a session. A hint only adds a sentence to a generated description; nothing
24
37
  * verifies it.
25
38
  */
26
- export declare const ASSISTANT_HINTS: readonly ['sameForAllInstances', 'constantDuringSession'];
27
39
  export type AssistantHint = (typeof ASSISTANT_HINTS)[number];
28
40
  /**
29
41
  * The component that holds the choices of a writable field: the instance `instanceName` of the
@@ -89,7 +101,7 @@ export interface RawAssistantAction {
89
101
  * with `addChild`. `replaceRecipes` names, per entity type or alias, the `replaceEntityRecipes`
90
102
  * groups whose recipes the agent may list and replace the entity by with `replaceEntity`. `actions`
91
103
  * names the declared actions the agent may run as custom mutations. Nothing is exposed without an
92
- * entry.
104
+ * entry. `lenses` declares the named selections that `entities` entries are tagged with.
93
105
  *
94
106
  * `ai` and `instructions` are for the server only: the provider, model tier and reasoning level the
95
107
  * deployment's assistant runs with, and the integrator's own guidance for it, appended to the system
@@ -102,6 +114,7 @@ export interface RawAssistant {
102
114
  readonly childRecipes?: Readonly<Record<string, RawAssistantRecipes>>;
103
115
  readonly replaceRecipes?: Readonly<Record<string, RawAssistantRecipes>>;
104
116
  readonly actions?: Readonly<Record<string, RawAssistantAction | null>>;
117
+ readonly lenses?: Readonly<Record<string, RawAssistantLens>>;
105
118
  readonly instructions?: string;
106
119
  readonly ai: AssistantAiSettings;
107
120
  }
@@ -1 +1 @@
1
- import{z as t}from"zod";import{ASSISTANT_AI_PROVIDERS as e,ASSISTANT_MODEL_TIERS as o,ASSISTANT_REASONING_LEVELS as i}from"@salsita-ai/contracts/assistant";export const ASSISTANT_OPTION_COMPONENT_TYPES=["materialSwatch","attributeSelection","distanceDimensionSelect"];export const ASSISTANT_HINTS=["sameForAllInstances","constantDuringSession"];let n=t.string().regex(/^(?!__)[_A-Za-z][_0-9A-Za-z]*$/,'must be a GraphQL name: letters, digits and "_", not starting with a digit or "__"'),r=e=>t.enum(e,{errorMap:()=>({message:`must be one of: ${e.join(", ")}`})}),s=t.object({description:t.string().optional(),as:n.optional()}).strict(),a=t.array(r(ASSISTANT_HINTS)),l=t.object({options:t.object({componentType:r(ASSISTANT_OPTION_COMPONENT_TYPES),instanceName:t.string().min(1,"must not be empty; name the component instance that holds the choices"),as:n.optional(),validate:t.boolean().optional(),allowDryRuns:t.boolean().optional(),hints:a.optional()}).strict().optional()}).strict(),c=t.object({as:t.string().trim().min(1,"must not be empty; remove the key to use the instance name").optional(),description:t.string().optional(),allowDryRuns:t.boolean().optional()}).strict(),p=e=>t.object({hints:a.optional(),groups:t.record(t.string(),c.nullable(),{required_error:`is required: the recipe groups of the type go under "groups", keyed by the instance name of a "${e}" component`})}).strict(),m=t.object({description:t.string().optional(),as:n.optional()}).strict(),d=`is required: declare provider (${e.join(", ")}), model (${o.join(", ")}) and reasoning (${i.join(", ")})`,u="must be a positive whole number of input tokens; remove the key to use the default of the server",b=t.object({provider:r(e),model:r(o),reasoning:r(i),maxThreadSize:t.number({invalid_type_error:u}).int(u).positive(u).optional()},{required_error:d,invalid_type_error:d}).strict();export const rawAssistantSchema=t.object({entities:t.record(t.string(),t.record(t.string(),s.nullable())).optional(),deletable:t.record(t.string(),t.object({}).strict().nullable()).optional(),writable:t.record(t.string(),t.record(t.string(),l.nullable())).optional(),childRecipes:t.record(t.string(),p("childEntityRecipes")).optional(),replaceRecipes:t.record(t.string(),p("replaceEntityRecipes")).optional(),actions:t.record(t.string(),m.nullable()).optional(),instructions:t.string().trim().min(1,"must not be empty; remove the key when there are no instructions").optional(),ai:b}).strict();
1
+ import{z as e}from"zod";import{ASSISTANT_AI_PROVIDERS as t,ASSISTANT_MODEL_TIERS as o,ASSISTANT_REASONING_LEVELS as i}from"@salsita-ai/contracts/assistant";import{ASSISTANT_HINTS as n}from"#package/domain";export const ASSISTANT_OPTION_COMPONENT_TYPES=["materialSwatch","attributeSelection","distanceDimensionSelect"];let r=e.string().regex(/^(?!__)[_A-Za-z][_0-9A-Za-z]*$/,'must be a GraphQL name: letters, digits and "_", not starting with a digit or "__"'),s=t=>e.enum(t,{errorMap:()=>({message:`must be one of: ${t.join(", ")}`})}),a=e.object({description:e.string().optional(),as:r.optional(),lenses:e.array(e.string()).optional()}).strict(),l="must be a whole number of at least 1; remove the key to nest tagged relations one level",c=e.object({description:e.string().trim().min(1,"must not be empty; say when the agent should use the lens"),maxDepth:e.number({invalid_type_error:l}).int(l).min(1,l).optional()}).strict(),p=r.refine(e=>!e.includes("__"),'must not contain "__", which names the generated copies of a lens'),m=e.array(s(n)),d=e.object({options:e.object({componentType:s(ASSISTANT_OPTION_COMPONENT_TYPES),instanceName:e.string().min(1,"must not be empty; name the component instance that holds the choices"),as:r.optional(),validate:e.boolean().optional(),allowDryRuns:e.boolean().optional(),hints:m.optional()}).strict().optional()}).strict(),u=e.object({as:e.string().trim().min(1,"must not be empty; remove the key to use the instance name").optional(),description:e.string().optional(),allowDryRuns:e.boolean().optional()}).strict(),h=t=>e.object({hints:m.optional(),groups:e.record(e.string(),u.nullable(),{required_error:`is required: the recipe groups of the type go under "groups", keyed by the instance name of a "${t}" component`})}).strict(),b=e.object({description:e.string().optional(),as:r.optional()}).strict(),g=`is required: declare provider (${t.join(", ")}), model (${o.join(", ")}) and reasoning (${i.join(", ")})`,_="must be a positive whole number of input tokens; remove the key to use the default of the server",y=e.object({provider:s(t),model:s(o),reasoning:s(i),maxThreadSize:e.number({invalid_type_error:_}).int(_).positive(_).optional()},{required_error:g,invalid_type_error:g}).strict();export const rawAssistantSchema=e.object({entities:e.record(e.string(),e.record(e.string(),a.nullable())).optional(),deletable:e.record(e.string(),e.object({}).strict().nullable()).optional(),writable:e.record(e.string(),e.record(e.string(),d.nullable())).optional(),childRecipes:e.record(e.string(),h("childEntityRecipes")).optional(),replaceRecipes:e.record(e.string(),h("replaceEntityRecipes")).optional(),actions:e.record(e.string(),b.nullable()).optional(),lenses:e.record(p,c).optional(),instructions:e.string().trim().min(1,"must not be empty; remove the key when there are no instructions").optional(),ai:y}).strict();
@@ -1 +1 @@
1
- import{z as o}from"zod";import{Branded as a}from"@salsita-ai/common/utils";import{enhancedJsonObjectSchema as t,validateNoLegacyCodeRef as e}from"../../core/index.js";import{DiagnosticCode as n,diagnosticMessages as i}from"../../errors/index.js";import{rawAclSchema as r}from"./raw-acl.js";import{rawActionsSchema as s}from"./raw-actions.js";import{rawAdminPagesSchema as l}from"./raw-admin-pages.js";import{rawAssistantSchema as p}from"./raw-assistant.js";import{rawBudgetsSchema as m}from"./raw-budgets.js";import{rawChunksSchema as c}from"./raw-chunks.js";import{rawComponentsSchema as f}from"./raw-components.js";import{rawConstantsSchema as d}from"./raw-constants.js";import{rawDataSpecSchema as u}from"./raw-data.js";import{rawDefaultsSchema as j}from"./raw-defaults.js";import{rawEnvSchema as w}from"./raw-env.js";import{rawExpressionsSchema as b}from"./raw-expressions.js";import{rawInvariantsSchema as g}from"./raw-invariants.js";import{rawModelSchema as S}from"./raw-model.js";import{rawPresetsSchema as D}from"./raw-presets.js";import{rawRelationsSchema as h}from"./raw-relations.js";import{rawResourcesConfigSchema as v,rawResourcesSchema as O}from"./raw-resources.js";import{rawStateValuesSchema as E}from"./raw-states.js";import{rawTransformersSchema as R}from"./raw-transformers.js";export const DATA_SCHEMA_KEYS=["publishedData","sessionData","frontendData","backendData","finalizeData","prefetchedFinalizeData","finalizeResult","callbackData"];let k=o.object({$admin:o.boolean().optional(),model:S.optional(),components:f.optional(),presets:D.optional(),$data:u.optional(),expressions:b.optional(),actions:s.optional(),invariants:g.optional(),constants:d.optional(),relations:h.optional(),defaults:j.optional(),publishedData:t.optional(),sessionData:t.optional(),frontendData:t.optional(),backendData:t.optional(),finalizeData:t.optional(),prefetchedFinalizeData:t.optional(),finalizeResult:t.optional(),callbackData:t.optional(),navigationStates:E.optional(),viewStates:E.optional(),toolStates:E.optional(),exportStates:E.optional(),themePreset:o.string().optional(),themeOptions:o.record(o.unknown()).optional(),preview:o.enum(["always","never","auto","hide"]).optional(),alwaysExpand:o.boolean().optional(),availableLocales:o.array(o.string()).optional(),textLanguages:o.array(o.string()).optional(),transformers:R.optional(),project:o.string().regex(/^[a-z0-9-]{3,}$/,"must be a project slug (lowercase letters, digits and dashes, at least 3) or `default`").optional(),applicationVersion:o.string().optional(),workspace:o.boolean().optional(),webComponentTag:o.string().optional(),pageTitle:o.string().optional(),useAuthHook:o.boolean().optional(),useClerk:o.boolean().optional(),enableAdminRelease:o.boolean().optional(),jsonSchemaValidator:o.enum(["ajv","csp-compatible"]).optional(),gltfDecoder:o.enum(["js","wasm"]).optional(),appLoader:o.enum(["legacy","universal"]).optional(),collectFinalizeData:o.boolean().optional(),env:w.optional(),acl:r.optional(),resources:O.optional(),resourcesConfig:v.optional(),budgets:m.optional(),chunks:c.optional(),assistant:p.optional(),$adminPages:l.optional()}).strict();export const parseRawSpecFile=(o,t)=>{e(o.content,t);let r=k.safeParse(o.content);if(!r.success){for(let o of r.error.issues)t.error(n.SCHEMA_PARSE_ERROR,i.SCHEMA_PARSE_ERROR(o.path.join("."),o.message));return}let{constants:s,...l}=r.data,p=((o,a)=>{let t=Object.fromEntries(Object.entries(o.expressions??{}).map(([o,a])=>[o,{...a}]));if(void 0===o.constants)return Object.keys(t).length>0?t:void 0;for(let[e,r]of Object.entries(o.constants))for(let[o,s]of(t[e]||(t[e]={}),Object.entries(r))){if(void 0!==t[e][o]){a.at("constants",e,o).error(n.CONSTANTS_EXPRESSION_CONFLICT,i[n.CONSTANTS_EXPRESSION_CONFLICT](e,o));continue}t[e][o]={kind:"value",constant:!0,value:s,schema:{}}}return Object.keys(t).length>0?t:void 0})(r.data,t);return a({name:o.name,content:{...l,expressions:p}})};
1
+ import{z as o}from"zod";import{Branded as a}from"@salsita-ai/common/utils";import{enhancedJsonObjectSchema as t}from"../../core/index.js";import{validateNoLegacyCodeRef as e}from"../../enhanced-json/index.js";import{DiagnosticCode as n,diagnosticMessages as i}from"../../errors/index.js";import{rawAclSchema as r}from"./raw-acl.js";import{rawActionsSchema as s}from"./raw-actions.js";import{rawAdminPagesSchema as l}from"./raw-admin-pages.js";import{rawAssistantSchema as p}from"./raw-assistant.js";import{rawBudgetsSchema as m}from"./raw-budgets.js";import{rawChunksSchema as c}from"./raw-chunks.js";import{rawComponentsSchema as f}from"./raw-components.js";import{rawConstantsSchema as d}from"./raw-constants.js";import{rawDataSpecSchema as j}from"./raw-data.js";import{rawDefaultsSchema as u}from"./raw-defaults.js";import{rawEnvSchema as w}from"./raw-env.js";import{rawExpressionsSchema as b}from"./raw-expressions.js";import{rawInvariantsSchema as g}from"./raw-invariants.js";import{rawModelSchema as S}from"./raw-model.js";import{rawPresetsSchema as h}from"./raw-presets.js";import{rawRelationsSchema as D}from"./raw-relations.js";import{rawResourcesConfigSchema as v,rawResourcesSchema as O}from"./raw-resources.js";import{rawStateValuesSchema as E}from"./raw-states.js";import{rawTransformersSchema as R}from"./raw-transformers.js";export const DATA_SCHEMA_KEYS=["publishedData","sessionData","frontendData","backendData","finalizeData","prefetchedFinalizeData","finalizeResult","callbackData"];let k=o.object({$admin:o.boolean().optional(),model:S.optional(),components:f.optional(),presets:h.optional(),$data:j.optional(),expressions:b.optional(),actions:s.optional(),invariants:g.optional(),constants:d.optional(),relations:D.optional(),defaults:u.optional(),publishedData:t.optional(),sessionData:t.optional(),frontendData:t.optional(),backendData:t.optional(),finalizeData:t.optional(),prefetchedFinalizeData:t.optional(),finalizeResult:t.optional(),callbackData:t.optional(),navigationStates:E.optional(),viewStates:E.optional(),toolStates:E.optional(),exportStates:E.optional(),themePreset:o.string().optional(),themeOptions:o.record(o.unknown()).optional(),preview:o.enum(["always","never","auto","hide"]).optional(),alwaysExpand:o.boolean().optional(),availableLocales:o.array(o.string()).optional(),textLanguages:o.array(o.string()).optional(),transformers:R.optional(),project:o.string().regex(/^[a-z0-9-]{3,}$/,"must be a project slug (lowercase letters, digits and dashes, at least 3) or `default`").optional(),applicationVersion:o.string().optional(),workspace:o.boolean().optional(),webComponentTag:o.string().optional(),pageTitle:o.string().optional(),useAuthHook:o.boolean().optional(),useClerk:o.boolean().optional(),enableAdminRelease:o.boolean().optional(),jsonSchemaValidator:o.enum(["ajv","csp-compatible"]).optional(),gltfDecoder:o.enum(["js","wasm"]).optional(),appLoader:o.enum(["legacy","universal"]).optional(),collectFinalizeData:o.boolean().optional(),env:w.optional(),acl:r.optional(),resources:O.optional(),resourcesConfig:v.optional(),budgets:m.optional(),chunks:c.optional(),assistant:p.optional(),$adminPages:l.optional()}).strict();export const parseRawSpecFile=(o,t)=>{e(o.content,t);let r=k.safeParse(o.content);if(!r.success){for(let o of r.error.issues)t.error(n.SCHEMA_PARSE_ERROR,i.SCHEMA_PARSE_ERROR(o.path.join("."),o.message));return}let{constants:s,...l}=r.data,p=((o,a)=>{let t=Object.fromEntries(Object.entries(o.expressions??{}).map(([o,a])=>[o,{...a}]));if(void 0===o.constants)return Object.keys(t).length>0?t:void 0;for(let[e,r]of Object.entries(o.constants))for(let[o,s]of(t[e]||(t[e]={}),Object.entries(r))){if(void 0!==t[e][o]){a.at("constants",e,o).error(n.CONSTANTS_EXPRESSION_CONFLICT,i[n.CONSTANTS_EXPRESSION_CONFLICT](e,o));continue}t[e][o]={kind:"value",constant:!0,value:s,schema:{}}}return Object.keys(t).length>0?t:void 0})(r.data,t);return a({name:o.name,content:{...l,expressions:p}})};
@@ -1,4 +1,5 @@
1
1
  import type { Branded } from '@salsita-ai/common/utils';
2
+ import type { SdkCodeRef } from '../../../core/index.js';
2
3
  import type { MemoEvalPlan, MemoEvalPlanInput } from '../expressions/memo-eval-plan.js';
3
4
  import type { EntityOrAliasName, InstanceName } from '../model/index.js';
4
5
  import type { ComponentReadBinding, ComponentWriteBinding } from './bindings/index.js';
@@ -46,15 +47,6 @@ interface UserBoundImplementation {
46
47
  readonly plan: MemoEvalPlan;
47
48
  readonly implementation: RootReadImplementation | CompositeImplementation;
48
49
  }
49
- /**
50
- * A parameter that should be emitted as an unquoted code reference in codegen
51
- * (e.g. an entity reflection variable like `Top`).
52
- * At runtime, the string value is resolved to the actual object (e.g. entity reflection).
53
- */
54
- export interface SdkCodeRef {
55
- readonly $codeRef: string;
56
- }
57
- export declare const isSdkCodeRef: (value: unknown) => value is SdkCodeRef;
58
50
  export type SdkFactoryParam = SdkCodeRef | string | number | boolean | null | readonly SdkFactoryParam[] | {
59
51
  readonly [key: string]: SdkFactoryParam;
60
52
  };
@@ -1 +1 @@
1
- export const isSdkCodeRef=e=>"object"==typeof e&&null!==e&&"$codeRef"in e&&"string"==typeof e.$codeRef;
1
+ export{};
@@ -1,58 +1,5 @@
1
1
  import { Branded } from '@salsita-ai/common/utils';
2
- import { type EnhancedJsonSchemaType, type EnhancedJsonValue } from '../../../core/index.js';
3
- /**
4
- * A single filter criterion — static value, dynamic `$read` reference, or
5
- * inline `$eval` expression evaluated against `self` at runtime.
6
- *
7
- * The `target` field on the `'dynamic'` variant is a bare name (matches the
8
- * same pattern as prop-level reads); codegen emits `self.target`, runtime
9
- * reads `self[target]`.
10
- */
11
- export type FilterCriterion<T> = {
12
- readonly kind: 'static';
13
- readonly value: T;
14
- } | {
15
- readonly kind: 'dynamic';
16
- readonly target: string;
17
- } | {
18
- readonly kind: 'eval';
19
- readonly code: string;
20
- };
21
- /**
22
- * Parsed component filter controlling when the component is active. Two
23
- * mutually-exclusive shapes:
24
- *
25
- * - `'gradual'` — zero or more per-criterion fields; compiles to one entry per
26
- * set key inside `.withGradualFilter({…})`. The preferred form.
27
- * - `'root'` — the entire filter is a single `$read` at the root (legacy
28
- * form `$filter: { $read: '$x' }`); compiles to `.withFilter(self => (self.target))`.
29
- * Distinct codegen because the SDK's `withFilter` and `withGradualFilter`
30
- * methods have different evaluation semantics (whole-closure vs per-key).
31
- *
32
- * See `components.md §"Simple expression filter"` / `§"Declarative filter"`.
33
- */
34
- export type ComponentFilter = {
35
- readonly kind: 'gradual';
36
- readonly navigationStates?: FilterCriterion<readonly string[]>;
37
- readonly viewStates?: FilterCriterion<readonly string[]>;
38
- readonly toolStates?: FilterCriterion<readonly string[]>;
39
- readonly exportStates?: FilterCriterion<readonly string[]>;
40
- readonly modes?: FilterCriterion<readonly string[]>;
41
- readonly roles?: FilterCriterion<readonly string[]>;
42
- readonly selectedEntityIds?: FilterCriterion<unknown>;
43
- readonly hoveredEntityIds?: FilterCriterion<unknown>;
44
- readonly draggedEntityIds?: FilterCriterion<unknown>;
45
- readonly exportedEntityIds?: FilterCriterion<unknown>;
46
- readonly active?: FilterCriterion<boolean>;
47
- readonly fullscreen?: FilterCriterion<boolean>;
48
- readonly debug?: FilterCriterion<boolean>;
49
- readonly viewports?: FilterCriterion<unknown>;
50
- } | {
51
- readonly kind: 'root';
52
- readonly target: string;
53
- };
54
- /** Criterion field names on the gradual variant — used for parse and iteration. */
55
- export declare const FILTER_CRITERION_KEYS: readonly ["navigationStates", "viewStates", "toolStates", "exportStates", "modes", "roles", "selectedEntityIds", "hoveredEntityIds", "draggedEntityIds", "exportedEntityIds", "active", "fullscreen", "debug", "viewports"];
2
+ import { type ComponentFilter, type EnhancedJsonSchemaType, type EnhancedJsonValue } from '../../../core/index.js';
56
3
  /**
57
4
  * Schema types for each filter criterion, used for expression inference.
58
5
  * When `$read: '$expr'` appears in a filter criterion, the expression is
@@ -1 +1 @@
1
- import{Branded as t}from"@salsita-ai/common/utils";import{FILTER_OR_KEY as e,READ_MARKER_KEY as r,isEnhancedJsonObject as i,isEvalMarker as s,isRawReadMarker as a}from"../../../core/index.js";export const FILTER_CRITERION_KEYS=["navigationStates","viewStates","toolStates","exportStates","modes","roles","selectedEntityIds","hoveredEntityIds","draggedEntityIds","exportedEntityIds","active","fullscreen","debug","viewports"];let o={tsType:"IdOrWithId | readonly IdOrWithId[]",import:[{module:"@salsita-ai/sdk/domain",member:"IdOrWithId"}]};export const FILTER_CRITERION_SCHEMAS={navigationStates:{type:"array",items:{type:"string"}},viewStates:{type:"array",items:{type:"string"}},toolStates:{type:"array",items:{type:"string"}},exportStates:{type:"array",items:{type:"string"}},modes:{type:"array",items:{type:"string"}},roles:{type:"array",items:{type:"string"}},selectedEntityIds:o,hoveredEntityIds:o,draggedEntityIds:o,exportedEntityIds:o,active:{type:"boolean"},fullscreen:{type:"boolean"},debug:{type:"boolean"},viewports:{type:"array",items:{type:"string"},tsType:"readonly Viewport[]",import:[{module:"@salsita-ai/sdk/domain",member:"Viewport"}]}};let n=new Set(FILTER_CRITERION_KEYS),d=t=>a(t)?{kind:"dynamic",target:t[r]}:s(t)?{kind:"eval",code:t.$eval}:{kind:"static",value:t},y=t=>{let e=t[r];if("string"==typeof e&&!Object.keys(t).some(t=>n.has(t)))return{kind:"root",target:e};let i={};for(let[e,r]of Object.entries(t))n.has(e)&&void 0!==r&&(i[e]=d(r));return{kind:"gradual",...i}};export const ComponentFilters=r=>{if(void 0===r||!i(r))return t({items:[]});let s=r[e];return Array.isArray(s)?t({items:s.filter(i).map(y)}):t({items:[y(r)]})};
1
+ import{Branded as t}from"@salsita-ai/common/utils";import{FILTER_CRITERION_KEYS as e,FILTER_OR_KEY as r,READ_MARKER_KEY as i,isEnhancedJsonObject as s,isEvalMarker as a,isRawReadMarker as o}from"../../../core/index.js";let n={tsType:"IdOrWithId | readonly IdOrWithId[]",import:[{module:"@salsita-ai/sdk/domain",member:"IdOrWithId"}]};export const FILTER_CRITERION_SCHEMAS={navigationStates:{type:"array",items:{type:"string"}},viewStates:{type:"array",items:{type:"string"}},toolStates:{type:"array",items:{type:"string"}},exportStates:{type:"array",items:{type:"string"}},modes:{type:"array",items:{type:"string"}},roles:{type:"array",items:{type:"string"}},selectedEntityIds:n,hoveredEntityIds:n,draggedEntityIds:n,exportedEntityIds:n,active:{type:"boolean"},fullscreen:{type:"boolean"},debug:{type:"boolean"},viewports:{type:"array",items:{type:"string"},tsType:"readonly Viewport[]",import:[{module:"@salsita-ai/sdk/domain",member:"Viewport"}]}};let y=new Set(e),d=t=>o(t)?{kind:"dynamic",target:t[i]}:a(t)?{kind:"eval",code:t.$eval}:{kind:"static",value:t},p=t=>{let e=t[i];if("string"==typeof e&&!Object.keys(t).some(t=>y.has(t)))return{kind:"root",target:e};let r={};for(let[e,i]of Object.entries(t))y.has(e)&&void 0!==i&&(r[e]=d(i));return{kind:"gradual",...r}};export const ComponentFilters=e=>{if(void 0===e||!s(e))return t({items:[]});let i=e[r];return Array.isArray(i)?t({items:i.filter(s).map(p)}):t({items:[p(e)]})};
@@ -1,5 +1,5 @@
1
1
  export * from './bindings/index.js';
2
- export * from './component-entry.js';
2
+ export type * from './component-entry.js';
3
3
  export * from './component-filter.js';
4
4
  export * from './component-prop-target.js';
5
5
  export * from './components.js';
@@ -1 +1 @@
1
- export*from"./bindings/index.js";export*from"./component-entry.js";export*from"./component-filter.js";export*from"./component-prop-target.js";export*from"./components.js";export*from"./sdk-component-entry.js";export*from"./user-component-entry.js";export*from"./user-components.js";
1
+ export*from"./bindings/index.js";export*from"./component-filter.js";export*from"./component-prop-target.js";export*from"./components.js";export*from"./sdk-component-entry.js";export*from"./user-component-entry.js";export*from"./user-components.js";
@@ -1,32 +1,7 @@
1
1
  import type { Branded } from '@salsita-ai/common/utils';
2
- import type { EnhancedJsonSchemaType, EnhancedJsonValue } from '../../../core/index.js';
2
+ import type { EnhancedJsonSchemaType, EnhancedJsonValue, SdkExpressionImplementation } from '../../../core/index.js';
3
3
  import type { EntityOrAliasName, ExpressionName } from '../model/index.js';
4
4
  import type { MemoEvalPlan } from './memo-eval-plan.js';
5
- /**
6
- * The relation factory's single positional param: the relation's kind, the entity type or alias it
7
- * points to and its cardinality, plus the id field for `direct` and `indirect` relations. The
8
- * assistant schema reads `target` and `cardinality` to type a relation edge.
9
- */
10
- export interface RelationExpressionParams {
11
- readonly kind: 'direct' | 'indirect' | 'allOfType';
12
- readonly target: string;
13
- readonly cardinality: '0-1' | '1-1' | '0-N' | '1-N';
14
- readonly field?: string;
15
- }
16
- /**
17
- * An expression implementation built by an SDK factory at runtime. The kind is the
18
- * semantic source of the expression, declared by the section that generated it —
19
- * codegen and runtime dispatch on it instead of inspecting factory-function names.
20
- * - `relation`: generated from a `relations:` declaration
21
- * - `violations`: generated from `invariants:` declarations (the `$violations` expression)
22
- */
23
- export type SdkExpressionImplementation = {
24
- readonly kind: 'relation';
25
- readonly params: readonly [RelationExpressionParams];
26
- } | {
27
- readonly kind: 'violations';
28
- readonly params: readonly unknown[];
29
- };
30
5
  /**
31
6
  * How an expression's runtime implementation is provided.
32
7
  * - `user`: implementation from `src/expressions/*.ts` (dynamic import)
@@ -47,8 +22,6 @@ export type ExpressionImplementation = {
47
22
  readonly value: EnhancedJsonValue;
48
23
  readonly plan: MemoEvalPlan;
49
24
  };
50
- /** Narrows to implementations that are built by an SDK expression factory at runtime. */
51
- export declare const isSdkExpressionImplementation: (implementation: ExpressionImplementation) => implementation is SdkExpressionImplementation;
52
25
  /** A single parsed expression declaration. */
53
26
  export type Expression = Branded<'Expression', {
54
27
  readonly entityKey: EntityOrAliasName;
@@ -1 +1 @@
1
- export const isSdkExpressionImplementation=i=>"relation"===i.kind||"violations"===i.kind;
1
+ export{};