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

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 (376) 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/relation-expression-params.js +1 -0
  13. package/dist/application-spec/core/expressions/sdk-expression-implementation.d.ts +24 -0
  14. package/dist/application-spec/core/expressions/sdk-expression-implementation.js +1 -0
  15. package/dist/application-spec/core/index.d.ts +2 -0
  16. package/dist/application-spec/core/index.js +1 -1
  17. package/dist/application-spec/core/json-value.d.ts +1 -1
  18. package/dist/application-spec/{core → enhanced-json}/eval-to-constant.d.ts +1 -1
  19. package/dist/application-spec/enhanced-json/index.d.ts +4 -0
  20. package/dist/application-spec/enhanced-json/index.js +1 -0
  21. package/dist/application-spec/enhanced-json/is-enhanced-json-array.d.ts +2 -0
  22. package/dist/application-spec/enhanced-json/is-enhanced-json-array.js +1 -0
  23. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.d.ts +18 -0
  24. package/dist/application-spec/enhanced-json/resolve-enhanced-json-value.js +1 -0
  25. package/dist/application-spec/enhanced-json/schema-from-value.d.ts +24 -0
  26. package/dist/application-spec/enhanced-json/schema-from-value.js +1 -0
  27. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.d.ts +14 -0
  28. package/dist/application-spec/enhanced-json/stringify-enhanced-json-value.js +1 -0
  29. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.d.ts +12 -0
  30. package/dist/application-spec/enhanced-json/validate-enhanced-json-value-caps.js +1 -0
  31. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.d.ts +13 -0
  32. package/dist/application-spec/enhanced-json/validate-no-legacy-code-ref.js +1 -0
  33. package/dist/application-spec/errors/diagnostic-codes.d.ts +4 -0
  34. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  35. package/dist/application-spec/errors/diagnostic-messages.d.ts +7 -0
  36. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  37. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  38. package/dist/application-spec/generate-application/code/standalone-app-files.d.ts +2 -2
  39. package/dist/application-spec/generate-application/code/standalone-app-files.js +1 -1
  40. package/dist/application-spec/generate-application/code/templates/configurator-config.js +6 -4
  41. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +4 -4
  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 +41 -40
  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/globals.js +5 -4
  46. package/dist/application-spec/generate-application/code/templates/index.d.ts +0 -1
  47. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  48. package/dist/application-spec/generate-application/code/templates/package-json.js +1 -1
  49. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +8 -2
  50. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  51. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +10 -3
  52. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  53. package/dist/application-spec/generate-application/code/templates/webhook-index.d.ts +6 -1
  54. package/dist/application-spec/generate-application/code/templates/webhook-index.js +10 -1
  55. package/dist/application-spec/generate-application/index.d.ts +2 -0
  56. package/dist/application-spec/generate-application/index.js +1 -1
  57. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +6 -2
  58. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  59. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +8 -1
  60. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  61. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +5 -1
  62. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  63. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.d.ts +43 -0
  64. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.js +1 -0
  65. package/dist/application-spec/generate-application/runtime/factory-data/index.d.ts +3 -0
  66. package/dist/application-spec/generate-application/runtime/factory-data/index.js +1 -0
  67. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.d.ts +13 -0
  68. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -0
  69. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +16 -0
  70. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -0
  71. package/dist/application-spec/generate-application/runtime/migrations/index.d.ts +1 -0
  72. package/dist/application-spec/generate-application/runtime/migrations/index.js +1 -0
  73. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +53 -0
  74. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.js +1 -0
  75. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +1 -1
  76. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  77. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  78. package/dist/application-spec/index.d.ts +1 -0
  79. package/dist/application-spec/index.js +1 -1
  80. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +6 -0
  81. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  82. package/dist/application-spec/parse-application-files/categorize/module-analysis.d.ts +1 -1
  83. package/dist/application-spec/parse-application-files/categorize/module-analysis.js +1 -1
  84. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +16 -3
  85. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  86. package/dist/application-spec/parse-application-files/raw-spec/raw-spec-file.js +1 -1
  87. package/dist/application-spec/parse-application-files/spec/components/component-entry.d.ts +1 -9
  88. package/dist/application-spec/parse-application-files/spec/components/component-entry.js +1 -1
  89. package/dist/application-spec/parse-application-files/spec/components/component-filter.d.ts +1 -54
  90. package/dist/application-spec/parse-application-files/spec/components/component-filter.js +1 -1
  91. package/dist/application-spec/parse-application-files/spec/components/index.d.ts +1 -1
  92. package/dist/application-spec/parse-application-files/spec/components/index.js +1 -1
  93. package/dist/application-spec/parse-application-files/spec/expressions/expression.d.ts +1 -28
  94. package/dist/application-spec/parse-application-files/spec/expressions/expression.js +1 -1
  95. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +1 -1
  96. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  97. package/dist/application-spec/parse-application-files/spec/expressions/index.d.ts +0 -1
  98. package/dist/application-spec/parse-application-files/spec/expressions/index.js +1 -1
  99. package/dist/application-spec/parse-application-files/spec/expressions/memo-eval-plan.js +1 -1
  100. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  101. package/dist/application-spec/parse-application-files/spec/model/defaults.js +1 -1
  102. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  103. package/dist/client/phoenix-api.d.ts +96 -0
  104. package/dist/configurator/application-runtime/extensions/create-configurator-extensions.js +1 -1
  105. package/dist/configurator/application-runtime/extensions/selectors.d.ts +3 -1
  106. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  107. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +32 -1
  108. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  109. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +7 -1
  110. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  111. package/dist/configurator/application-runtime/extensions/systems/drag-and-drop-system/drag-and-drop-system.d.ts +3 -3
  112. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +20 -4
  113. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  114. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.d.ts +11 -0
  115. package/dist/configurator/application-runtime/extensions/systems/graphql-system/inject-assistant-lenses.js +1 -0
  116. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -2
  117. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  118. package/dist/configurator/common/configurator-interface.d.ts +22 -1
  119. package/dist/configurator/common/configurator-interface.js +1 -1
  120. package/dist/configurator/common/frontend-analytics.d.ts +2 -0
  121. package/dist/configurator/common/frontend-analytics.js +1 -1
  122. package/dist/configurator/common/index.d.ts +2 -0
  123. package/dist/configurator/common/index.js +1 -1
  124. package/dist/configurator/common/use-finalize-action.d.ts +31 -0
  125. package/dist/configurator/common/use-finalize-action.js +1 -0
  126. package/dist/configurator/common/use-reset-camera.d.ts +6 -0
  127. package/dist/configurator/common/use-reset-camera.js +1 -0
  128. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +1 -1
  129. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +2 -2
  130. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  131. package/dist/configurator/pages/configurator-layout-name.d.ts +2 -0
  132. package/dist/configurator/pages/configurator-layout-name.js +1 -0
  133. package/dist/configurator/pages/default-configurator-elements.d.ts +7 -0
  134. package/dist/configurator/pages/default-configurator-elements.js +1 -0
  135. package/dist/configurator/pages/index.d.ts +1 -0
  136. package/dist/configurator/pages/index.js +1 -1
  137. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragHandle.d.ts +1 -1
  138. package/dist/configurator/scene/scene-controls/hotspot-drag-handle/HotspotDragSceneHandle.d.ts +1 -1
  139. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicator.d.ts +1 -1
  140. package/dist/configurator/scene/scene-entity/dimension-indicators/DimensionIndicatorInternal.d.ts +1 -1
  141. package/dist/configurator/scene/scene-entity/drag-and-drop/shared.d.ts +2 -2
  142. package/dist/configurator/scene/scene-entity/drag-and-drop/use-drag-object.d.ts +1 -1
  143. package/dist/configurator/scene/scene-entity/materials/RemoteReplacedMaterial.js +1 -1
  144. package/dist/configurator/scene/scene-entity/objects/SceneEntityObjectTextDecal.d.ts +1 -1
  145. package/dist/configurator/ui/assistant/AssistantChips.d.ts +8 -2
  146. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  147. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +1 -1
  148. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  149. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  150. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +13 -0
  151. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -0
  152. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.d.ts +22 -0
  153. package/dist/configurator/ui/assistant/entity-link/entity-link-selection.js +1 -0
  154. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +27 -0
  155. package/dist/configurator/ui/assistant/entity-link/entity-link-state.js +1 -0
  156. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +5 -0
  157. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +1 -0
  158. package/dist/configurator/ui/assistant/entity-link/index.d.ts +3 -0
  159. package/dist/configurator/ui/assistant/entity-link/index.js +1 -0
  160. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.d.ts +1 -0
  161. package/dist/configurator/ui/configurator-layout/sidebar-keys/index.js +1 -0
  162. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.d.ts +11 -0
  163. package/dist/configurator/ui/configurator-layout/sidebar-keys/sidebar-keys.js +1 -0
  164. package/dist/configurator/ui/configurator-layout/{universal → slots/desktop-sidebar}/DesktopSidebar.d.ts +23 -14
  165. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/DesktopSidebar.js +16 -0
  166. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.d.ts +1 -0
  167. package/dist/configurator/ui/configurator-layout/slots/desktop-sidebar/index.js +1 -0
  168. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.d.ts +4 -4
  169. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  170. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.d.ts +3 -6
  171. package/dist/configurator/ui/configurator-layout/slots/services/SideEffects.js +1 -1
  172. package/dist/configurator/ui/configurator-layout/slots/slots.d.ts +1 -0
  173. package/dist/configurator/ui/configurator-layout/slots/slots.js +1 -1
  174. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.d.ts +1 -1
  175. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +2 -2
  176. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.d.ts +2 -2
  177. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.d.ts +2 -2
  178. package/dist/docs/dimensions/3d-scene-integration/dimension-indicators.mdx +2 -2
  179. package/dist/docs/dimensions/3d-scene-integration/editable-angle-indicator.mdx +1 -1
  180. package/dist/docs/dimensions/3d-scene-integration/editable-distance-dimension-indicator.mdx +1 -1
  181. package/dist/docs/dimensions/3d-scene-integration/list-selector-dimension-indicator.mdx +1 -1
  182. package/dist/docs/drag-and-drop/drag-handle.mdx +1 -1
  183. package/dist/docs/drag-and-drop/hotspot-handle.mdx +1 -1
  184. package/dist/docs/drag-and-drop/planes.mdx +1 -1
  185. package/dist/docs/drag-and-drop/rotatable.mdx +2 -2
  186. package/dist/docs/index.json +42 -1
  187. package/dist/docs/layouts/custom-layout.mdx +2125 -0
  188. package/dist/docs/layouts/header/fixed.mdx +2 -2
  189. package/dist/docs/layouts/header/floating.mdx +2 -2
  190. package/dist/docs/layouts/sidebar/in-a-custom-layout.mdx +380 -0
  191. package/dist/docs/layouts/sidebar-footer/basic.mdx +32 -77
  192. package/dist/docs/other-features/client-side-rendering/declarative.mdx +1 -1
  193. package/dist/docs/other-features/transformers.mdx +4 -0
  194. package/dist/docs/phoenix/application-states.mdx +9 -7
  195. package/dist/docs/phoenix/configurator-interface.mdx +136 -18
  196. package/dist/docs/phoenix/finalization.mdx +1 -1
  197. package/dist/docs/phoenix/layout-slots.mdx +116 -0
  198. package/dist/docs/phoenix/phoenix-cli.mdx +8 -2
  199. package/dist/docs/phoenix/project-structure.mdx +6 -2
  200. package/dist/docs/phoenix/sdk-builder-workflow.mdx +1 -1
  201. package/dist/docs/phoenix/testing.mdx +140 -0
  202. package/dist/docs/phoenix/webhook-membership.mdx +10 -9
  203. package/dist/docs/phoenix/webhooks.mdx +17 -0
  204. package/dist/domain/application/application-config.d.ts +3 -1
  205. package/dist/domain/application/assistant/assistant-fields.d.ts +12 -0
  206. package/dist/domain/application/assistant/assistant-fields.js +1 -0
  207. package/dist/domain/application/assistant/assistant-manifest.d.ts +9 -1
  208. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +38 -2
  209. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -1
  210. package/dist/domain/application/assistant/build-assistant-lenses.d.ts +14 -0
  211. package/dist/domain/application/assistant/build-assistant-lenses.js +5 -0
  212. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  213. package/dist/domain/application/assistant/create-assistant-execution-schema.d.ts +32 -0
  214. package/dist/domain/application/assistant/create-assistant-execution-schema.js +1 -0
  215. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  216. package/dist/domain/application/assistant/index.d.ts +6 -1
  217. package/dist/domain/application/assistant/index.js +1 -1
  218. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +20 -0
  219. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.js +1 -0
  220. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +10 -0
  221. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -0
  222. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +48 -0
  223. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -0
  224. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +15 -0
  225. package/dist/domain/application/assistant/session-setup/create-session-assistant.js +1 -0
  226. package/dist/domain/application/assistant/session-setup/index.d.ts +4 -0
  227. package/dist/domain/application/assistant/session-setup/index.js +1 -0
  228. package/dist/domain/application/configurator-builder.d.ts +5 -2
  229. package/dist/domain/application/configurator-builder.js +1 -1
  230. package/dist/domain/core/expression/constant-expressions.d.ts +16 -8
  231. package/dist/domain/core/invariant/violation.d.ts +50 -2
  232. package/dist/domain/core/invariant/violation.js +1 -1
  233. package/dist/domain/core/model/model.d.ts +1 -1
  234. package/dist/domain/domain-context/index.d.ts +1 -1
  235. package/dist/domain/domain-context/undo-system.d.ts +28 -1
  236. package/dist/domain/domain-context/undo-system.js +1 -1
  237. package/dist/domain/domain-runtime/access/selectors.d.ts +9 -0
  238. package/dist/domain/domain-runtime/access/selectors.js +1 -1
  239. package/dist/domain/domain-runtime/access/types.d.ts +2 -0
  240. package/dist/domain/domain-runtime/access/types.js +1 -1
  241. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  242. package/dist/domain/domain-runtime/domain-context/types.d.ts +4 -1
  243. package/dist/domain/domain-runtime/domain-runtime.d.ts +16 -0
  244. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +19 -0
  245. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -0
  246. package/dist/domain/domain-runtime/errors/implementation-error.d.ts +46 -0
  247. package/dist/domain/domain-runtime/errors/implementation-error.js +1 -0
  248. package/dist/domain/domain-runtime/errors/implementation-errors.d.ts +13 -0
  249. package/dist/domain/domain-runtime/errors/implementation-errors.js +1 -0
  250. package/dist/domain/domain-runtime/errors/index.d.ts +4 -0
  251. package/dist/domain/domain-runtime/errors/index.js +1 -0
  252. package/dist/domain/domain-runtime/errors/to-implementation-errors.d.ts +10 -0
  253. package/dist/domain/domain-runtime/errors/to-implementation-errors.js +1 -0
  254. package/dist/domain/domain-runtime/index.d.ts +1 -0
  255. package/dist/domain/domain-runtime/index.js +1 -1
  256. package/dist/domain/domain-runtime/spec/initialize.d.ts +11 -0
  257. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  258. package/dist/domain/domain-runtime/spec/module-checks/project-modules.d.ts +8 -1
  259. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +1 -1
  260. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.js +1 -1
  261. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -1
  262. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +1 -1
  263. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.js +1 -1
  264. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  265. package/dist/domain/domain-runtime/spec/types.d.ts +2 -0
  266. package/dist/domain/extensions/attribute-switch.d.ts +1 -1
  267. package/dist/domain/extensions/attribute-switch.js +1 -1
  268. package/dist/domain/extensions/canvas-config.d.ts +1 -1
  269. package/dist/domain/extensions/client-side-image.d.ts +2 -2
  270. package/dist/domain/extensions/client-side-image.js +1 -1
  271. package/dist/domain/extensions/common/angle-indicator-schema.d.ts +2 -2
  272. package/dist/domain/extensions/common/dimension-indicator-schema.d.ts +2 -2
  273. package/dist/domain/extensions/editable-angle-indicator.d.ts +1 -1
  274. package/dist/domain/extensions/editable-distance-dimension-indicator.d.ts +1 -1
  275. package/dist/domain/extensions/editable-offset-indicator.d.ts +1 -1
  276. package/dist/domain/extensions/editable-offset-indicator.js +1 -1
  277. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -1
  278. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -1
  279. package/dist/domain/extensions/horizontal-tabs.d.ts +2 -2
  280. package/dist/domain/extensions/list-selector-dimension-indicator.d.ts +1 -1
  281. package/dist/domain/extensions/navigation-steps.d.ts +2 -2
  282. package/dist/domain/extensions/offset-indicator.js +1 -1
  283. package/dist/domain/extensions/rotation-handle.d.ts +2 -2
  284. package/dist/domain/extensions/save-template-thumbnail.d.ts +2 -2
  285. package/dist/domain/extensions/save-template-thumbnail.js +1 -1
  286. package/dist/domain/extensions/scene-entity-animation.js +1 -1
  287. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +9 -0
  288. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  289. package/dist/domain/mocks/create-mock-domain.js +1 -1
  290. package/dist/domain/mocks/create-test-application-config.d.ts +59 -0
  291. package/dist/domain/mocks/create-test-application-config.js +1 -0
  292. package/dist/domain/mocks/index.d.ts +1 -0
  293. package/dist/domain/mocks/index.js +1 -1
  294. package/dist/domain/system-components/application-config.d.ts +2 -2
  295. package/dist/domain/system-components/child-entity-selection.js +1 -1
  296. package/dist/domain/system-components/collision-box-geometry.d.ts +4 -2
  297. package/dist/domain/system-components/collision-geometry.d.ts +4 -2
  298. package/dist/domain/system-components/collision-point-geometry.d.ts +4 -2
  299. package/dist/domain/system-components/common/material-override-schema.d.ts +2 -2
  300. package/dist/domain/system-components/common/recipes.d.ts +21 -3
  301. package/dist/domain/system-components/common/recipes.js +1 -1
  302. package/dist/domain/system-components/constraint.d.ts +10 -23
  303. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  304. package/dist/domain/system-components/drag-handle.js +1 -1
  305. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  306. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  307. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  308. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  309. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -1
  310. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  311. package/dist/domain/system-components/material-swatch.js +1 -1
  312. package/dist/domain/system-components/scene-entity-material-override.d.ts +1 -1
  313. package/dist/domain/system-components/scene-entity-object-material-override.d.ts +1 -1
  314. package/dist/domain/system-components/scene-entity-object-text-decal.d.ts +1 -1
  315. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.d.ts +1 -1
  316. package/dist/domain/system-components/scene-entity-transimissive-material-override.d.ts +1 -1
  317. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  318. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  319. package/dist/editor/mocks/EditorMockContext.js +1 -1
  320. package/dist/i18n/locales/cs/messages.js +1 -1
  321. package/dist/i18n/locales/da/messages.js +1 -1
  322. package/dist/i18n/locales/de/messages.js +1 -1
  323. package/dist/i18n/locales/de-AT/messages.js +1 -1
  324. package/dist/i18n/locales/en/messages.js +1 -1
  325. package/dist/i18n/locales/en-AU/messages.js +1 -1
  326. package/dist/i18n/locales/en-GB/messages.js +1 -1
  327. package/dist/i18n/locales/es/messages.js +1 -1
  328. package/dist/i18n/locales/fr/messages.js +1 -1
  329. package/dist/i18n/locales/hu/messages.js +1 -1
  330. package/dist/i18n/locales/it/messages.js +1 -1
  331. package/dist/i18n/locales/nl/messages.js +1 -1
  332. package/dist/i18n/locales/pl/messages.js +1 -1
  333. package/dist/i18n/locales/pt/messages.js +1 -1
  334. package/dist/i18n/locales/ro/messages.js +1 -1
  335. package/dist/i18n/locales/sk/messages.js +1 -1
  336. package/dist/i18n/locales/tr/messages.js +1 -1
  337. package/dist/legacy/domain-cli/gen/constant-expressions.js +1 -1
  338. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  339. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  340. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +81 -68
  341. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  342. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  343. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  344. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +7 -1
  345. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -16
  346. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +14 -12
  347. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +13 -11
  348. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +13 -11
  349. package/dist/phoenix/commands/check.js +1 -1
  350. package/dist/phoenix/commands/deploy.js +1 -1
  351. package/dist/phoenix/commands/fix.js +1 -1
  352. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  353. package/dist/phoenix/services/source-archive.d.ts +1 -0
  354. package/dist/phoenix/services/source-archive.js +1 -1
  355. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +2 -0
  356. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  357. package/dist/react-sdk/application-runtime/routing/access-service.d.ts +1 -0
  358. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +17 -0
  359. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  360. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +30 -0
  361. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -0
  362. package/dist/react-sdk/domain-context/index.d.ts +2 -1
  363. package/dist/react-sdk/domain-context/index.js +1 -1
  364. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +5 -0
  365. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  366. package/dist/react-sdk/domain-controls/hooks/use-angle-dimension.d.ts +1 -1
  367. package/dist/ui-sdk/theme/types.d.ts +1 -1
  368. package/dist/webhook/builders/webhook-builder.js +1 -1
  369. package/package.json +33 -26
  370. package/schema/domain-spec.json +1115 -209
  371. package/dist/application-spec/generate-application/code/templates/webhook-implementation.d.ts +0 -1
  372. package/dist/application-spec/generate-application/code/templates/webhook-implementation.js +0 -7
  373. package/dist/configurator/ui/configurator-layout/universal/DesktopSidebar.js +0 -16
  374. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.d.ts +0 -0
  375. /package/dist/application-spec/{core → enhanced-json}/eval-code-uses-self.js +0 -0
  376. /package/dist/application-spec/{core → enhanced-json}/eval-to-constant.js +0 -0
@@ -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{};
@@ -2,7 +2,7 @@ import { Branded } from '@salsita-ai/common/utils';
2
2
  import { type EvalExpressionParser, type ParseContext } from '../../../core/index.js';
3
3
  import type { MergedExpressions } from '../../merge/index.js';
4
4
  import type { Aliases, EntityOrAliasName, EntityTypeName, ExpressionName, ModelVersion } from '../model/index.js';
5
- import { type Expression } from './expression.js';
5
+ import type { Expression } from './expression.js';
6
6
  import type { MemoEvalPlan } from './memo-eval-plan.js';
7
7
  export type { Expression, ExpressionImplementation } from './expression.js';
8
8
  /**
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{intersectSchemas as t}from"../../../core/index.js";import{DiagnosticCode as n,diagnosticMessages as o}from"../../../errors/index.js";import{isSdkExpressionImplementation as i}from"./expression.js";import{UserExpressions as r}from"./user-expressions.js";let s=(e,t)=>{let n=e.get(t.entityKey);n||(n=new Map,e.set(t.entityKey,n)),n.set(t.name,t)},a=(n,o)=>{let i=n.get(o.entityKey);i||(i=new Map,n.set(o.entityKey,i));let r=i.get(o.name);r?i.set(o.name,e({...r,schema:t(r.schema,o.schema),...r.declaredSchema||!o.declaredSchema?{}:{declaredSchema:o.declaredSchema}})):i.set(o.name,o)},l=e=>"relation"===e.implementation.kind?"relations":"violations"===e.implementation.kind?"invariants":"expressions";export const Expressions=(t,m)=>{let{rawExpressions:f,inferredExpressions:p}=t,{latestModel:c,aliases:d,entityTypes:y,evalExpressionParser:u,parsingContext:g}=m,x=r(f,{latestModel:c,evalExpressionParser:u,parsingContext:g});if(void 0===x)return;let S=new Map;for(let e of x)s(S,e);for(let e of p)a(S,e);let h=((e,t)=>{let n=new Map,o=e=>{let t=n.get(e.entityKey);t||(t=new Set,n.set(e.entityKey,t)),t.add(e.name)};for(let t of e)o(t);for(let e of t)i(e.implementation)&&o(e);return n})(x,p),w=new Map;for(let e of x){let{implementation:t}=e;if("value"!==t.kind||!t.constant||t.plan.usesSelf)continue;let n=w.get(e.entityKey);n||(n=new Map,w.set(e.entityKey,n)),n.set(e.name,t.plan)}let K=new Map;for(let t of y){let i=[],r=new Map,s=e=>{let s=S.get(e);if(!s||0===s.size)return;i.push(e);let a=h.get(e);for(let[i,m]of s){if(!a?.has(i))continue;let s=r.get(i);if(s){g.at(l(m),e,i).error(n.DUPLICATE_EXPRESSION,o.DUPLICATE_EXPRESSION(t,i,s,e));continue}r.set(i,e)}};for(let[e,n]of d)n.includes(t)&&s(e);s(t),K.set(t,e({shapeGroups:i}))}return e({expressions:S,entityExpressions:K,constants:w})};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{intersectSchemas as t,isSdkExpressionImplementation as n}from"../../../core/index.js";import{DiagnosticCode as i,diagnosticMessages as o}from"../../../errors/index.js";import{UserExpressions as r}from"./user-expressions.js";let s=(e,t)=>{let n=e.get(t.entityKey);n||(n=new Map,e.set(t.entityKey,n)),n.set(t.name,t)},a=(n,i)=>{let o=n.get(i.entityKey);o||(o=new Map,n.set(i.entityKey,o));let r=o.get(i.name);r?o.set(i.name,e({...r,schema:t(r.schema,i.schema),...r.declaredSchema||!i.declaredSchema?{}:{declaredSchema:i.declaredSchema}})):o.set(i.name,i)},l=e=>"relation"===e.implementation.kind?"relations":"violations"===e.implementation.kind?"invariants":"expressions";export const Expressions=(t,m)=>{let{rawExpressions:f,inferredExpressions:p}=t,{latestModel:c,aliases:d,entityTypes:y,evalExpressionParser:u,parsingContext:g}=m,S=r(f,{latestModel:c,evalExpressionParser:u,parsingContext:g});if(void 0===S)return;let h=new Map;for(let e of S)s(h,e);for(let e of p)a(h,e);let w=((e,t)=>{let i=new Map,o=e=>{let t=i.get(e.entityKey);t||(t=new Set,i.set(e.entityKey,t)),t.add(e.name)};for(let t of e)o(t);for(let e of t)n(e.implementation)&&o(e);return i})(S,p),x=new Map;for(let e of S){let{implementation:t}=e;if("value"!==t.kind||!t.constant||t.plan.usesSelf)continue;let n=x.get(e.entityKey);n||(n=new Map,x.set(e.entityKey,n)),n.set(e.name,t.plan)}let K=new Map;for(let t of y){let n=[],r=new Map,s=e=>{let s=h.get(e);if(!s||0===s.size)return;n.push(e);let a=w.get(e);for(let[n,m]of s){if(!a?.has(n))continue;let s=r.get(n);if(s){g.at(l(m),e,n).error(i.DUPLICATE_EXPRESSION,o.DUPLICATE_EXPRESSION(t,n,s,e));continue}r.set(n,e)}};for(let[e,n]of d)n.includes(t)&&s(e);s(t),K.set(t,e({shapeGroups:n}))}return e({expressions:h,entityExpressions:K,constants:x})};
@@ -1,5 +1,4 @@
1
1
  export type * from './expression.js';
2
- export { isSdkExpressionImplementation } from './expression.js';
3
2
  export * from './expressions.js';
4
3
  export * from './memo-eval-plan.js';
5
4
  export * from './user-expressions.js';
@@ -1 +1 @@
1
- export{isSdkExpressionImplementation}from"./expression.js";export*from"./expressions.js";export*from"./memo-eval-plan.js";export*from"./user-expressions.js";
1
+ export*from"./expressions.js";export*from"./memo-eval-plan.js";export*from"./user-expressions.js";
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{evalCodeUsesSelf as r}from"../../../core/eval-code-uses-self.js";import{isEvalMarker as t,isMsgMarker as n}from"../../../core/index.js";import{isComponentPropTarget as o}from"../components/component-prop-target.js";let l=(e,r)=>0===r.length?e:`${e}.${r.join(".")}`,i=(r,a,u,d)=>{if(void 0===r)throw Error(`MemoEvalPlan: found undefined at ${l(u,d)}, undefined cannot be generated, remove the property or use null.`);if(t(r)){let t=((r,t,n)=>{let o=t.trim();for(let e=0;e<r.length;e++){let t=r[e];if("eval"===t.kind&&t.code===o)return e}return r.push(e({kind:"eval",code:o,label:n})),r.length-1})(a,r.$eval,u);return e({kind:"slot",depIndex:t})}if(o(r)){let t=((r,t)=>{for(let e=0;e<r.length;e++){let n=r[e];if("read"===n.kind&&n.target===t)return e}return r.push(e({kind:"read",target:t})),r.length-1})(a,r.$target);return e({kind:"slot",depIndex:t})}if(n(r))return e({kind:"msg",marker:r});if(null===r||"object"!=typeof r)return e({kind:"literal",value:r});if(Array.isArray(r))return e({kind:"array",items:r.map((e,r)=>i(e,a,u,[...d,String(r)]))});if("object"!=typeof r||null===r)throw Error(`MemoEvalPlan: found unsupported value at ${l(u,d)}, remove it or use null.`);let f=[];for(let e in r){let t=r[e];f.push([e,i(t,a,u,[...d,e])])}return e({kind:"object",entries:f})};export const MemoEvalPlan=(t,n)=>{let o=[],l=i(t,o,n,[]),a=o.some(e=>"read"===e.kind||r(e.code));return e({deps:o,template:l,usesSelf:a})};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{isEvalMarker as r,isMsgMarker as t}from"../../../core/index.js";import{evalCodeUsesSelf as n}from"../../../enhanced-json/eval-code-uses-self.js";import{isComponentPropTarget as o}from"../components/component-prop-target.js";let l=(e,r)=>0===r.length?e:`${e}.${r.join(".")}`,i=(n,a,d,u)=>{if(void 0===n)throw Error(`MemoEvalPlan: found undefined at ${l(d,u)}, undefined cannot be generated, remove the property or use null.`);if(r(n)){let r=((r,t,n)=>{let o=t.trim();for(let e=0;e<r.length;e++){let t=r[e];if("eval"===t.kind&&t.code===o)return e}return r.push(e({kind:"eval",code:o,label:n})),r.length-1})(a,n.$eval,d);return e({kind:"slot",depIndex:r})}if(o(n)){let r=((r,t)=>{for(let e=0;e<r.length;e++){let n=r[e];if("read"===n.kind&&n.target===t)return e}return r.push(e({kind:"read",target:t})),r.length-1})(a,n.$target);return e({kind:"slot",depIndex:r})}if(t(n))return e({kind:"msg",marker:n});if(null===n||"object"!=typeof n)return e({kind:"literal",value:n});if(Array.isArray(n))return e({kind:"array",items:n.map((e,r)=>i(e,a,d,[...u,String(r)]))});if("object"!=typeof n||null===n)throw Error(`MemoEvalPlan: found unsupported value at ${l(d,u)}, remove it or use null.`);let s=[];for(let e in n){let r=n[e];s.push([e,i(r,a,d,[...u,e])])}return e({kind:"object",entries:s})};export const MemoEvalPlan=(r,t)=>{let o=[],l=i(r,o,t,[]),a=o.some(e=>"read"===e.kind||n(e.code));return e({deps:o,template:l,usesSelf:a})};
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{schemaFromValue as t}from"../../../core/index.js";import{DiagnosticCode as r,diagnosticMessages as s}from"../../../errors/index.js";import{ExpressionName as o}from"../model/index.js";import{MemoEvalPlan as a}from"./memo-eval-plan.js";let i=(e,r,s,o)=>{if("user"===e.kind)return{schema:e.schema,implementation:{kind:"user"}};let i=a(e.value,r),m={kind:"value",constant:e.constant,value:e.value,plan:i};if(Object.keys(e.schema).length>0)return{schema:e.schema,implementation:m};let n=t(e.value,s,o);if(void 0!==n)return{schema:n,implementation:m}};export const UserExpressions=(t,a)=>{let{latestModel:m,evalExpressionParser:n,parsingContext:l}=a,{allNames:c}=m,f=[...c].map(String),h=[];for(let[a,m]of Object.entries(t)){c.has(a)||l.error(r.EXPRESSION_UNKNOWN_ENTITY_KEY,s.EXPRESSION_UNKNOWN_ENTITY_KEY(a,f));let t=e(a);for(let[r,s]of Object.entries(m)){let m=l.at(a),c=o(r,m);if(!c)continue;let f=i(s,`${a}.${r}`,m.at(r),n);f&&h.push(e({entityKey:t,name:c,schema:f.schema,declaredSchema:f.schema,implementation:f.implementation}))}}if(!l.hasErrors)return h};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{schemaFromValue as t}from"../../../enhanced-json/index.js";import{DiagnosticCode as r,diagnosticMessages as n}from"../../../errors/index.js";import{ExpressionName as s}from"../model/index.js";import{MemoEvalPlan as a}from"./memo-eval-plan.js";let o=(e,r,n,s)=>{if("user"===e.kind)return{schema:e.schema,implementation:{kind:"user"}};let o=a(e.value,r),i={kind:"value",constant:e.constant,value:e.value,plan:o};if(Object.keys(e.schema).length>0)return{schema:e.schema,implementation:i};let m=t(e.value,n,s);if(void 0!==m)return{schema:m,implementation:i}};export const UserExpressions=(t,a)=>{let{latestModel:i,evalExpressionParser:m,parsingContext:l}=a,{allNames:c}=i,h=[...c].map(String),f=[];for(let[a,i]of Object.entries(t)){c.has(a)||l.error(r.EXPRESSION_UNKNOWN_ENTITY_KEY,n.EXPRESSION_UNKNOWN_ENTITY_KEY(a,h));let t=e(a);for(let[r,n]of Object.entries(i)){let i=l.at(a),c=s(r,i);if(!c)continue;let h=o(n,`${a}.${r}`,i.at(r),m);h&&f.push(e({entityKey:t,name:c,schema:h.schema,declaredSchema:h.schema,implementation:h.implementation}))}}if(!l.hasErrors)return f};
@@ -1 +1 @@
1
- import{Branded as e}from"@salsita-ai/common/utils";import{CONSTANT_CAPS as t,resolveEnhancedJsonValue as r}from"../../../core/index.js";import{DiagnosticCode as i,diagnosticMessages as o}from"../../../errors/index.js";import{ShapePropertyName as n}from"./names/shape-property-name.js";let l=(e,t,r,n,l)=>{for(let s of r.validatePartialShape(t).errors){let t=s.instancePath?s.instancePath:"(root)",r=s.instancePath.split("/").filter(Boolean)[0]??"";n.error(i.DEFAULTS_SCHEMA_VIOLATION,o[i.DEFAULTS_SCHEMA_VIOLATION](e,r,t,s.message,l))}};export const Defaults=(s,a,f)=>{let E=a.allNames,T=[...E].map(String),S=new Map,N=new Map;for(let e of a.entitySchemas)S.set(e.entityType,new Set(Object.keys(e.shapeProperties))),N.set(e.entityType,e);let g={},O=new Map;for(let[e,_]of Object.entries(s)){let s=f.at(e);if(!E.has(e)){f.error(i.DEFAULTS_UNKNOWN_ENTITY_KEY,o[i.DEFAULTS_UNKNOWN_ENTITY_KEY](e,T));continue}let c=a.aliases.get(e),p=void 0!==c,h={};for(let[t,r]of Object.entries(_)){let l=n(t,s);if(l){if(p){let t=[];for(let e of c){let r=S.get(e);r&&r.has(l)||t.push(String(e))}if(t.length>0){let r=c[0],n=r?[...S.get(r)??[]]:[];f.error(i.DEFAULTS_UNKNOWN_PROPERTY,o[i.DEFAULTS_UNKNOWN_PROPERTY](e,l,n,t));continue}}else{let t=S.get(e);if(!t||!t.has(l)){let r=t?[...t]:[];f.error(i.DEFAULTS_UNKNOWN_PROPERTY,o[i.DEFAULTS_UNKNOWN_PROPERTY](e,l,r));continue}}h[l]=r}}if(0===Object.keys(h).length)continue;let A=r(h,void 0,t,s);if(void 0!==A){if(p)for(let t of c){let r=N.get(t);r&&l(e,A,r,s,String(t))}else{let t=N.get(e);t&&l(e,A,t,s)}for(let t of c??[e])g[String(t)]={...g[String(t)],...h},O.set(t,[...O.get(t)??[],e])}}for(let[e,t]of O){let r=g[String(e)]??{},n=(N.get(e)?.shapeSchema.required??[]).filter(e=>!Object.hasOwn(r,e));if(0===n.length)continue;let l=t.includes(String(e))?String(e):t.at(-1);f.at(l).error(i.DEFAULTS_INCOMPLETE,o[i.DEFAULTS_INCOMPLETE](String(e),n,t))}if(Object.keys(s).length>0&&f.warning(i.DEFAULTS_DEPRECATED,o[i.DEFAULTS_DEPRECATED]()),!f.hasErrors)return e({entries:g})};
1
+ import{Branded as e}from"@salsita-ai/common/utils";import{CONSTANT_CAPS as t}from"../../../core/index.js";import{resolveEnhancedJsonValue as r}from"../../../enhanced-json/index.js";import{DiagnosticCode as i,diagnosticMessages as n}from"../../../errors/index.js";import{ShapePropertyName as o}from"./names/shape-property-name.js";let s=(e,t,r,o,s)=>{for(let l of r.validatePartialShape(t).errors){let t=l.instancePath?l.instancePath:"(root)",r=l.instancePath.split("/").filter(Boolean)[0]??"";o.error(i.DEFAULTS_SCHEMA_VIOLATION,n[i.DEFAULTS_SCHEMA_VIOLATION](e,r,t,l.message,s))}};export const Defaults=(l,a,f)=>{let E=a.allNames,T=[...E].map(String),S=new Map,N=new Map;for(let e of a.entitySchemas)S.set(e.entityType,new Set(Object.keys(e.shapeProperties))),N.set(e.entityType,e);let g={},O=new Map;for(let[e,_]of Object.entries(l)){let l=f.at(e);if(!E.has(e)){f.error(i.DEFAULTS_UNKNOWN_ENTITY_KEY,n[i.DEFAULTS_UNKNOWN_ENTITY_KEY](e,T));continue}let c=a.aliases.get(e),p=void 0!==c,h={};for(let[t,r]of Object.entries(_)){let s=o(t,l);if(s){if(p){let t=[];for(let e of c){let r=S.get(e);r&&r.has(s)||t.push(String(e))}if(t.length>0){let r=c[0],o=r?[...S.get(r)??[]]:[];f.error(i.DEFAULTS_UNKNOWN_PROPERTY,n[i.DEFAULTS_UNKNOWN_PROPERTY](e,s,o,t));continue}}else{let t=S.get(e);if(!t||!t.has(s)){let r=t?[...t]:[];f.error(i.DEFAULTS_UNKNOWN_PROPERTY,n[i.DEFAULTS_UNKNOWN_PROPERTY](e,s,r));continue}}h[s]=r}}if(0===Object.keys(h).length)continue;let m=r(h,void 0,t,l);if(void 0!==m){if(p)for(let t of c){let r=N.get(t);r&&s(e,m,r,l,String(t))}else{let t=N.get(e);t&&s(e,m,t,l)}for(let t of c??[e])g[String(t)]={...g[String(t)],...h},O.set(t,[...O.get(t)??[],e])}}for(let[e,t]of O){let r=g[String(e)]??{},o=(N.get(e)?.shapeSchema.required??[]).filter(e=>!Object.hasOwn(r,e));if(0===o.length)continue;let s=t.includes(String(e))?String(e):t.at(-1);f.at(s).error(i.DEFAULTS_INCOMPLETE,n[i.DEFAULTS_INCOMPLETE](String(e),o,t))}if(Object.keys(l).length>0&&f.warning(i.DEFAULTS_DEPRECATED,n[i.DEFAULTS_DEPRECATED]()),!f.hasErrors)return e({entries:g})};
@@ -1 +1 @@
1
- import{isArray as e}from"@salsita-ai/common/utils";import{buildAssistantManifest as t}from"#package/domain";import{DiagnosticCode as r,diagnosticMessages as i}from"../../../../errors/index.js";import{ASSISTANT_HINTS as n}from"../../../raw-spec/index.js";import{createSchemaRefResolver as s,isNullableSchema as o,phxDefinitionRefName as a}from"../../common/index.js";import{resolveAssistantFieldType as l}from"./assistant-field-type.js";let p="AnyDomainEntity",S={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},N={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},T=new Set(["id","type","meta"]),d=new Set(["Query","Mutation","Navigation","RecipeGroup","Recipe","DryRun","DryRunError","FieldOption","JSON","String","Int","Float","Boolean","ID"]),c=(e,t)=>{if(!t||0===t.length)return e;let r=`One of: ${t.map(e=>`"${e}"`).join(", ")}.`;return e?/[.!?]$/.test(e)?`${e} ${r}`:`${e}. ${r}`:r},f=new Set(["id","type"]),m="A string, a message descriptor or a multilingual object; passed without translation.",A=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],u=(e,t,{model:r,components:i})=>{let n=new Set([e,...[...r.aliases].filter(([,t])=>t.includes(e)).map(([e])=>e)]);return i.filter(({componentName:e,typeOrAlias:r})=>e===t&&n.has(r)).map(({instanceName:e})=>String(e))},_=(...e)=>n.filter(t=>e.some(e=>e?.includes(t))),E=(e,t,n,s)=>{let{model:o}=n,a=new Map,l=new Map;for(let[p,{groups:S,hints:N}]of Object.entries(e)){let e=o.entityTypes.find(e=>e===p),T=e?[e]:[...o.aliases].find(([e])=>e===p)?.[1];if(!T){s.at(p).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE(t.section,p));continue}for(let[e,o]of(T.forEach(e=>l.set(e,_(l.get(e),N))),Object.entries(S))){let l=s.at(p,"groups",e),S=`${p}.groups.${e}`,N={groupId:o?.as??e,instanceName:e,...o?.description===void 0?{}:{description:o.description},dryRuns:o?.allowDryRuns??!0};for(let s of T){let o=u(s,t.component,n),T=a.get(s)??[],d=T.find(e=>e.group.groupId===N.groupId);o.includes(e)?d?l.error(r.ASSISTANT_DUPLICATE_RECIPE_GROUP,i.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,s,N.groupId,[d.entry,S])):a.set(s,[...T,{group:N,entry:S,entryCtx:l}]):l.error(r.ASSISTANT_UNKNOWN_RECIPE_GROUP,i.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,p,e,s,o))}}}let p=o.entityTypes.flatMap(e=>{let t=a.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(p.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:l,metaEntries:new Map(p.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},I=e=>`${e}Meta`,O=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,y=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},h=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t),o={...r,nonNull:!1},a=n?`${c(s,i)??""} ${m}`.trim():c(s,i);return{type:{...n?{kind:"scalar",name:"JSON",nonNull:!1}:o,nonNull:r.nonNull},...void 0===a?{}:{description:a}}},g=(t,r)=>{let i=(t=>{let r=y(t),i=r?.type==="array"&&r.items&&!e(r.items)?y(r.items):void 0,n=i??r;if(n?.$ref!==void 0&&"$DomainEntity"===a(n.$ref))return{target:n.references??p,list:void 0!==i}})(t);if(i)return{kind:"edge",...i,nullable:o(t,r),...void 0===t.description?{}:{description:t.description}};let{type:n,enumValues:s,localized:S,description:N}=l(t,r),T=c(N,s);return S?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:n.nonNull},description:`${N??""} ${m}`.trim()}:{kind:"value",type:n,...void 0===T?{}:{description:T}}},v=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t);return{type:{kind:"value",type:r},localized:!0===n,description:s,enumValues:i}},R=(e,t,n,s,o)=>{let a=t.startsWith("$")?((e,t,n,s)=>{let o=((e,t,{expressions:r,entityTypes:i})=>{let n=i.find(t=>t===e);for(let i of void 0===n?[e]:r.entityExpressions.get(n)?.shapeGroups??[]){let e=[...r.expressions.get(i)?.values()??[]].find(e=>e.name===t);if(e?.declaredSchema)return{implementation:e.implementation,declaredSchema:e.declaredSchema}}})(e.name,t,n);if(!o)return void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:a}=o;if("violations"===a.kind)return void s.error(r.ASSISTANT_UNSUPPORTED_EXPRESSION,i.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===a.kind){let[{target:e,cardinality:t}]=a.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return v(o.declaredSchema,n.resolveRef)})(e,t,s,o):((e,t,{resolveRef:n},s)=>{let o=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return o?v(o,n):void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,s,o);if(!a)return;let l=n?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return T.has(l)?void o.error(r.ASSISTANT_RESERVED_FIELD_NAME,i.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,l)):{name:l,source:t,type:a.type,localized:a.localized,description:c(n?.description??a.description,a.enumValues),describedByManifest:n?.description!==void 0,enumValues:a.enumValues,valueDescription:n?.description??a.description}},M=(e,t,n,s,o)=>{let a=new Map,l=new Set(n);for(let s of[...t.flat(),...n]){let t=a.get(s.name);t?t.source!==s.source?o.error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,s.name,[t.source,s.source])):l.has(s)&&s.describedByManifest&&a.set(s.name,{...t,description:s.description,describedByManifest:!0,valueDescription:s.valueDescription}):a.set(s.name,s)}return[...a.values()].map(e=>{let t=e.enumValues&&s(e.source);return t?{...e,enumValues:t,description:c(e.valueDescription,t)}:e})};export const resolveAssistantManifest=(e,{model:t,states:n,phxDefinitions:o,expressions:a,components:T,actions:y},v)=>{let b=v.errors.length,D=v.at("entities"),C=s(t.commonTypes,o);for(let e of t.resolvedShapes.keys())d.has(e)&&v.error(r.ASSISTANT_RESERVED_TYPE_NAME,i.ASSISTANT_RESERVED_TYPE_NAME(e,[...d]));let P=((e,t,r)=>{let i=new Map;for(let n of e){let e=[];for(let[i,s]of Object.entries(n.entries)){let o=R(n,i,s,t,r.at(n.name,i));o&&e.push(o)}i.set(n.name,e)}return i})(((e,t,n)=>{let s=[];for(let[r,i]of t.resolvedShapes){let t=e[r];t&&s.push({name:r,shape:i,entries:t})}let o=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))o.has(t)||n.at(t).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("entities",t));return s})(e.entities??{},t,D),{resolveRef:C,expressions:a,entityTypes:t.entityTypes},D),U=M(p,[],P.get(p)??[],()=>void 0,v),j=new Map([[p,U]]);for(let e of t.aliases.keys())e!==p&&j.set(e,M(e,[U],P.get(e)??[],()=>void 0,v));for(let e of t.entityTypes){let r=[p,...[...t.aliases].filter(([t,r])=>t!==p&&r.includes(e)).map(([e])=>e)],i=[...t.resolvedShapes].find(([t])=>t===e)?.[1];j.set(e,M(e,r.map(e=>j.get(e)??[]),P.get(e)??[],e=>{let t=Object.entries(i?.properties??{}).find(([t])=>t===e)?.[1];return t&&l(t,C).enumValues},v))}let L=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((j.get(e)??[]).map(({name:e,source:t,localized:r})=>[e,r?{source:t,localized:!0}:{source:t}]))])),$=E(e.childRecipes??{},S,{model:t,components:T},v.at("childRecipes")),w=E(e.replaceRecipes??{},N,{model:t,components:T},v.at("replaceRecipes")),W=((e,t,n)=>{let s=new Set;for(let o of Object.keys(e)){let e=t.entityTypes.find(e=>e===o),a=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1];a?a.forEach(e=>s.add(e)):n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("deletable",o))}return t.entityTypes.filter(e=>s.has(e))})(e.deletable??{},t,v.at("deletable")),F=((e,t,n)=>{let{model:s}=t,o=((e,t,n)=>{let s=new Map;for(let[o,a]of Object.entries(e)){let e=t.entityTypes.find(e=>e===o),l=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1],p=[...t.resolvedShapes].find(([e])=>e===o)?.[1];if(!l||!p){n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("writable",o));continue}for(let e of Object.keys(a)){let t=n.at(o,e);e.startsWith("$")||f.has(e)?t.error(r.ASSISTANT_NOT_WRITABLE,i.ASSISTANT_NOT_WRITABLE(o,e)):A(p.properties,e)?l.forEach(t=>{let r=s.get(t)??new Map;s.set(t,r.has(e)?r:r.set(e,o))}):t.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("writable",o,e))}}return s})(e,s,n);return s.entityTypes.flatMap(e=>{let a=[...s.resolvedShapes].find(([t])=>t===e)?.[1],p=[...o.get(e)??[]].flatMap(([s,o])=>{let p=a&&A(a.properties,s);return(p&&((e,{property:t,writableKey:n},s,{resolveRef:o,exposed:a,sources:p},S)=>{let N=Object.entries(A(p,e)??{}),T=a.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===T?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void S.at(n,t).error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${n}.${t}`));let{type:f,enumValues:u,localized:_,description:E}=l(s,o),I={...f,nonNull:!1},O=T??t,y=void 0===T?c(E,u):void 0;return _?{name:O,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:y?`${y} ${m}`:m}:{name:O,property:t,type:I,...void 0===y?{}:{description:y}}})(e,{property:s,writableKey:o},p,t,n))??[]});return p.length>0?[{entityType:e,fields:p}]:[]})})(e.writable??{},{model:t,resolveRef:C,exposed:P,sources:L},v.at("writable")),k=((e,t,n,s)=>{let{model:o}=n,a=new Map;for(let[l,p]of Object.entries(e)){let e=o.entityTypes.find(e=>e===l),T=e?[e]:[...o.aliases].find(([e])=>e===l)?.[1]??[];for(let[e,o]of Object.entries(p)){let p=o?.options;if(!p)continue;let d=s.at(l,e,"options"),c=`${l}.${e}`;for(let s of T){let o=t.find(e=>e.entityType===s)?.fields.find(t=>t.property===e);if(!o)continue;let l=p.as??`${o.name}Options`,T=u(s,p.componentType,n),f=a.get(s)??[],m=f.find(e=>e.options.edgeName===l||e.options.field===o.name);if(T.includes(p.instanceName))if(l===S.section||l===N.section)d.error(r.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,i.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(c,l,o.name));else if(m)d.error(r.ASSISTANT_DUPLICATE_OPTIONS_EDGE,i.ASSISTANT_DUPLICATE_OPTIONS_EDGE(s,m.options.edgeName===l?{edgeName:l}:{field:o.name},[m.entry,c]));else{let e={field:o.name,edgeName:l,componentType:p.componentType,instanceName:p.instanceName,validate:p.validate??!0,dryRuns:p.allowDryRuns??!0};a.set(s,[...f,{options:e,hints:_(p.hints),entry:c,entryCtx:d}])}else d.error(r.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,i.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(c,p,s,T))}}}return a})(e.writable??{},F,{model:t,components:T},v.at("writable"));var K=[$.metaEntries,w.metaEntries,new Map([...k].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[]))];for(let e of t.entityTypes){let n=K.flatMap(t=>t.get(e)??[])[0],s=I(e);n&&[...t.resolvedShapes.keys()].some(e=>e===s)&&n.error(r.ASSISTANT_META_TYPE_NAME_CONFLICT,i.ASSISTANT_META_TYPE_NAME_CONFLICT(e,s))}let Y=t.entityTypes.filter(e=>($.groups[e]?.length??0)>0||(w.groups[e]?.length??0)>0||(k.get(e)?.length??0)>0).map(I),V=((e,{actions:t,resolveRef:n,builtInMutations:s,typeNames:o},a)=>{let l=[],p=[...t.values()].map(e=>String(e.name));for(let[S,N]of Object.entries(e)){let e=a.at(S),T=[...t.values()].find(e=>e.name===S);if(!T){e.error(r.ASSISTANT_UNKNOWN_ACTION,i.ASSISTANT_UNKNOWN_ACTION(S,p));continue}let d=N?.as??S,c=l.find(e=>e.fieldName===d),f=O(d);if(s.has(d)||c){e.error(r.ASSISTANT_MUTATION_NAME_CONFLICT,i.ASSISTANT_MUTATION_NAME_CONFLICT(S,d,c?`"assistant.actions.${c.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(o.has(f)||l.some(e=>O(e.fieldName)===f)){e.error(r.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,i.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(S,d,f));continue}let m=N?.description??T.description;l.push({fieldName:d,actionName:S,...void 0===m?{}:{description:m},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,h(t,n)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,g(t,n)]))})}return l})(e.actions??{},{actions:y,resolveRef:C,builtInMutations:new Set(["deleteEntity",S.mutation,N.mutation,...F.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...d,...t.resolvedShapes.keys(),...Y])},v.at("actions"));if(!(v.errors.length>b))return{entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:n.navigationStates,viewStates:n.viewStates,toolStates:n.toolStates},deletableTypes:W,writableTypes:F,actionFields:V,childRecipes:Object.fromEntries(Object.entries($.groups).map(([e,t])=>[e,{groups:t,hints:$.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(w.groups).map(([e,t])=>[e,{groups:t,hints:w.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...k].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),fields:Object.fromEntries([...j].map(([e,t])=>[e,t.map(e=>({name:e.name,source:e.source,localized:e.localized,type:e.type,...void 0===e.description?{}:{description:e.description}}))]))}};export const createAssistantSchema=(e,n,s)=>{let o=resolveAssistantManifest(e,n,s);if(o)try{return{...t(o),resolved:o}}catch(e){s.error(r.ASSISTANT_INVALID_SCHEMA,i.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
1
+ import{isArray as e}from"@salsita-ai/common/utils";import{ASSISTANT_HINTS as t,AssistantFieldClashError as i,buildAssistantManifest as r,describeAssistantValues as n,mergeAssistantFields as s,resolveAssistantField as o}from"#package/domain";import{DiagnosticCode as a,diagnosticMessages as l}from"../../../../errors/index.js";import{createSchemaRefResolver as S,isNullableSchema as p,phxDefinitionRefName as N}from"../../common/index.js";import{resolveAssistantFieldType as T}from"./assistant-field-type.js";let c="AnyDomainEntity",d="RecipeGroup",f="Recipe",A="DryRun",E="FieldOption",m={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},_={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},u=new Set(["id","type","meta"]),O=new Set(["Query","Mutation","Navigation",d,f,A,"DryRunError",E,"JSON","String","Int","Float","Boolean","ID"]),I=new Set([d,f,E,A]),y=new Set(["id","type"]),b="A string, a message descriptor or a multilingual object; passed without translation.",h=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],g=(e,{property:t,writableKey:i},r,{resolveRef:s,exposed:o,sources:S},p)=>{let N=Object.entries(h(S,e)??{}),c=o.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===c?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void p.at(i,t).error(a.ASSISTANT_FIELD_NAME_CONFLICT,l.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${i}.${t}`));let{type:f,enumValues:A,localized:E,description:m}=T(r,s),_={...f,nonNull:!1},u=c??t,O=void 0===c?n(m,A):void 0;return E?{name:u,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:O?`${O} ${b}`:b}:{name:u,property:t,type:_,...void 0===O?{}:{description:O}}},v=(e,t,{model:i,components:r})=>{let n=new Set([e,...[...i.aliases].filter(([,t])=>t.includes(e)).map(([e])=>e)]);return r.filter(({componentName:e,typeOrAlias:i})=>e===t&&n.has(i)).map(({instanceName:e})=>String(e))},R=(...e)=>t.filter(t=>e.some(e=>e?.includes(t))),j=(e,t,i,r)=>{let{model:n}=i,s=new Map,o=new Map;for(let[S,{groups:p,hints:N}]of Object.entries(e)){let e=n.entityTypes.find(e=>e===S),T=e?[e]:[...n.aliases].find(([e])=>e===S)?.[1];if(!T){r.at(S).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE(t.section,S));continue}for(let[e,n]of(T.forEach(e=>o.set(e,R(o.get(e),N))),Object.entries(p))){let o=r.at(S,"groups",e),p=`${S}.groups.${e}`,N={groupId:n?.as??e,instanceName:e,...n?.description===void 0?{}:{description:n.description},dryRuns:n?.allowDryRuns??!0};for(let r of T){let n=v(r,t.component,i),T=s.get(r)??[],c=T.find(e=>e.group.groupId===N.groupId);n.includes(e)?c?o.error(a.ASSISTANT_DUPLICATE_RECIPE_GROUP,l.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,r,N.groupId,[c.entry,p])):s.set(r,[...T,{group:N,entry:p,entryCtx:o}]):o.error(a.ASSISTANT_UNKNOWN_RECIPE_GROUP,l.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,S,e,r,n))}}}let S=n.entityTypes.flatMap(e=>{let t=s.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(S.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:o,metaEntries:new Map(S.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},M=e=>`${e}Meta`,D=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,C=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},P=(e,t)=>{let{type:i,enumValues:r,localized:s,description:o}=T(e,t),a={...i,nonNull:!1},l=s?`${n(o,r)??""} ${b}`.trim():n(o,r);return{type:{...s?{kind:"scalar",name:"JSON",nonNull:!1}:a,nonNull:i.nonNull},...void 0===l?{}:{description:l}}},L=(t,i)=>{let r=(t=>{let i=C(t),r=i?.type==="array"&&i.items&&!e(i.items)?C(i.items):void 0,n=r??i;if(n?.$ref!==void 0&&"$DomainEntity"===N(n.$ref))return{target:n.references??c,list:void 0!==r}})(t);if(r)return{kind:"edge",...r,nullable:p(t,i),...void 0===t.description?{}:{description:t.description}};let{type:s,enumValues:o,localized:a,description:l}=T(t,i),S=n(l,o);return a?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:s.nonNull},description:`${l??""} ${b}`.trim()}:{kind:"value",type:s,...void 0===S?{}:{description:S}}},U=(e,t)=>{let{type:i,enumValues:r,localized:n,description:s}=T(e,t);return{type:{kind:"value",type:i},localized:!0===n,description:s,enumValues:r}},w=(e,t,i,r,s)=>{let o=t.startsWith("$")?((e,t,i,r)=>{let n=((e,t,{expressions:i,entityTypes:r})=>{let n=r.find(t=>t===e);for(let r of void 0===n?[e]:i.entityExpressions.get(n)?.shapeGroups??[]){let e=[...i.expressions.get(r)?.values()??[]].find(e=>e.name===t);if(e?.declaredSchema)return{implementation:e.implementation,declaredSchema:e.declaredSchema}}})(e.name,t,i);if(!n)return void r.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:s}=n;if("violations"===s.kind)return void r.error(a.ASSISTANT_UNSUPPORTED_EXPRESSION,l.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===s.kind){let[{target:e,cardinality:t}]=s.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return U(n.declaredSchema,i.resolveRef)})(e,t,r,s):((e,t,{resolveRef:i},r)=>{let n=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return n?U(n,i):void r.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,r,s);if(!o)return;let S=i?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return u.has(S)?void s.error(a.ASSISTANT_RESERVED_FIELD_NAME,l.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,S)):{name:S,source:t,type:o.type,localized:o.localized,description:n(i?.description??o.description,o.enumValues),describedByManifest:i?.description!==void 0,enumValues:o.enumValues,valueDescription:i?.description??o.description,...i?.lenses?.length?{lenses:[...new Set(i.lenses)]}:{}}},$=(e,t,i,r,n)=>s(t,i,r,(t,i,r)=>{n.error(a.ASSISTANT_FIELD_NAME_CONFLICT,l.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[i,r]))});export const resolveAssistantManifest=(e,{model:t,states:i,phxDefinitions:r,expressions:n,components:s,actions:p},N)=>{let d=N.errors.length,f=N.at("entities"),A=S(t.commonTypes,r);for(let e of t.resolvedShapes.keys())O.has(e)&&N.error(a.ASSISTANT_RESERVED_TYPE_NAME,l.ASSISTANT_RESERVED_TYPE_NAME(e,[...O]));let E=((e,t,i)=>{let r=new Map;for(let n of e){let e=[];for(let[r,s]of Object.entries(n.entries)){let o=w(n,r,s,t,i.at(n.name,r));o&&e.push(o)}r.set(n.name,e)}return r})(((e,t,i)=>{let r=[];for(let[i,n]of t.resolvedShapes){let t=e[i];t&&r.push({name:i,shape:n,entries:t})}let n=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))n.has(t)||i.at(t).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("entities",t));return r})(e.entities??{},t,f),{resolveRef:A,expressions:n,entityTypes:t.entityTypes},f),u=$(c,[],E.get(c)??[],()=>void 0,N),C=new Map([[c,u]]);for(let e of t.aliases.keys())e!==c&&C.set(e,$(e,[u],E.get(e)??[],()=>void 0,N));for(let e of t.entityTypes){let i=[c,...[...t.aliases].filter(([t,i])=>t!==c&&i.includes(e)).map(([e])=>e)],r=[...t.resolvedShapes].find(([t])=>t===e)?.[1];C.set(e,$(e,i.map(e=>C.get(e)??[]),E.get(e)??[],e=>{let t=Object.entries(r?.properties??{}).find(([t])=>t===e)?.[1];return t&&T(t,A).enumValues},N))}let U=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((C.get(e)??[]).map(({name:e,source:t,localized:i})=>[e,i?{source:t,localized:!0}:{source:t}]))])),F=j(e.childRecipes??{},m,{model:t,components:s},N.at("childRecipes")),W=j(e.replaceRecipes??{},_,{model:t,components:s},N.at("replaceRecipes")),k=((e,t,i)=>{let r=new Set;for(let n of Object.keys(e)){let e=t.entityTypes.find(e=>e===n),s=e?[e]:[...t.aliases].find(([e])=>e===n)?.[1];s?s.forEach(e=>r.add(e)):i.at(n).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("deletable",n))}return t.entityTypes.filter(e=>r.has(e))})(e.deletable??{},t,N.at("deletable")),K=((e,t,i)=>{let{model:r}=t,n=((e,t,i)=>{let r=new Map;for(let[n,s]of Object.entries(e)){let e=t.entityTypes.find(e=>e===n),o=e?[e]:[...t.aliases].find(([e])=>e===n)?.[1],S=[...t.resolvedShapes].find(([e])=>e===n)?.[1];if(!o||!S){i.at(n).error(a.ASSISTANT_UNKNOWN_TYPE,l.ASSISTANT_UNKNOWN_TYPE("writable",n));continue}for(let e of Object.keys(s)){let t=i.at(n,e);e.startsWith("$")||y.has(e)?t.error(a.ASSISTANT_NOT_WRITABLE,l.ASSISTANT_NOT_WRITABLE(n,e)):h(S.properties,e)?o.forEach(t=>{let i=r.get(t)??new Map;r.set(t,i.has(e)?i:i.set(e,n))}):t.error(a.ASSISTANT_UNKNOWN_FIELD,l.ASSISTANT_UNKNOWN_FIELD("writable",n,e))}}return r})(e,r,i);return r.entityTypes.flatMap(e=>{let s=[...r.resolvedShapes].find(([t])=>t===e)?.[1],o=[...n.get(e)??[]].flatMap(([r,n])=>{let o=s&&h(s.properties,r);return(o&&g(e,{property:r,writableKey:n},o,t,i))??[]});return o.length>0?[{entityType:e,fields:o}]:[]})})(e.writable??{},{model:t,resolveRef:A,exposed:E,sources:U},N.at("writable")),V=((e,t,i,r)=>{let{model:n}=i,s=new Map;for(let[o,S]of Object.entries(e)){let e=n.entityTypes.find(e=>e===o),p=e?[e]:[...n.aliases].find(([e])=>e===o)?.[1]??[];for(let[e,n]of Object.entries(S)){let S=n?.options;if(!S)continue;let N=r.at(o,e,"options"),T=`${o}.${e}`;for(let r of p){let n=t.find(e=>e.entityType===r)?.fields.find(t=>t.property===e);if(!n)continue;let o=S.as??`${n.name}Options`,p=v(r,S.componentType,i),c=s.get(r)??[],d=c.find(e=>e.options.edgeName===o||e.options.field===n.name);if(p.includes(S.instanceName))if(o===m.section||o===_.section)N.error(a.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,l.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(T,o,n.name));else if(d)N.error(a.ASSISTANT_DUPLICATE_OPTIONS_EDGE,l.ASSISTANT_DUPLICATE_OPTIONS_EDGE(r,d.options.edgeName===o?{edgeName:o}:{field:n.name},[d.entry,T]));else{let e={field:n.name,edgeName:o,componentType:S.componentType,instanceName:S.instanceName,validate:S.validate??!0,dryRuns:S.allowDryRuns??!0};s.set(r,[...c,{options:e,hints:R(S.hints),entry:T,entryCtx:N}])}else N.error(a.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,l.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(T,S,r,p))}}}return s})(e.writable??{},K,{model:t,components:s},N.at("writable"));var Y=[F.metaEntries,W.metaEntries,new Map([...V].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[]))];for(let e of t.entityTypes){let i=Y.flatMap(t=>t.get(e)??[])[0],r=M(e);i&&[...t.resolvedShapes.keys()].some(e=>e===r)&&i.error(a.ASSISTANT_META_TYPE_NAME_CONFLICT,l.ASSISTANT_META_TYPE_NAME_CONFLICT(e,r))}let x=t.entityTypes.filter(e=>(F.groups[e]?.length??0)>0||(W.groups[e]?.length??0)>0||(V.get(e)?.length??0)>0).map(M),G=((e,{actions:t,resolveRef:i,builtInMutations:r,typeNames:n},s)=>{let o=[],S=[...t.values()].map(e=>String(e.name));for(let[p,N]of Object.entries(e)){let e=s.at(p),T=[...t.values()].find(e=>e.name===p);if(!T){e.error(a.ASSISTANT_UNKNOWN_ACTION,l.ASSISTANT_UNKNOWN_ACTION(p,S));continue}let c=N?.as??p,d=o.find(e=>e.fieldName===c),f=D(c);if(r.has(c)||d){e.error(a.ASSISTANT_MUTATION_NAME_CONFLICT,l.ASSISTANT_MUTATION_NAME_CONFLICT(p,c,d?`"assistant.actions.${d.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(n.has(f)||o.some(e=>D(e.fieldName)===f)){e.error(a.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,l.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(p,c,f));continue}let A=N?.description??T.description;o.push({fieldName:c,actionName:p,...void 0===A?{}:{description:A},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,P(t,i)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,L(t,i)]))})}return o})(e.actions??{},{actions:p,resolveRef:A,builtInMutations:new Set(["deleteEntity",m.mutation,_.mutation,...K.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...O,...t.resolvedShapes.keys(),...x])},N.at("actions")),z=((e,t)=>{let i=e.lenses??{},r=new Set;for(let[n,s]of Object.entries(e.entities??{}))for(let[e,o]of Object.entries(s))for(let s of o?.lenses??[])Object.hasOwn(i,s)?r.add(s):t.at("entities",n,e,"lenses").error(a.ASSISTANT_UNKNOWN_LENS,l.ASSISTANT_UNKNOWN_LENS(`${n}.${e}`,s,Object.keys(i)));for(let e of Object.keys(i))I.has(e)?t.at("lenses",e).error(a.ASSISTANT_RESERVED_LENS_NAME,l.ASSISTANT_RESERVED_LENS_NAME(e,[...I])):r.has(e)||t.at("lenses",e).error(a.ASSISTANT_EMPTY_LENS,l.ASSISTANT_EMPTY_LENS(e));return Object.fromEntries(Object.entries(i).map(([e,{description:t,maxDepth:i}])=>[e,{description:t,maxDepth:i??1}]))})(e,N);if(N.errors.length>d)return;let B=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,{hints:R(t.hints),groups:Object.entries(t.groups).map(([e,t])=>({instanceName:e,groupId:t?.as??e,...t?.description===void 0?{}:{description:t.description},dryRuns:t?.allowDryRuns??!0}))}]));return{declarations:{entities:Object.fromEntries(Object.keys(e.entities??{}).map(e=>[e,(E.get(e)??[]).map(e=>({name:e.name,source:e.source,type:e.type,localized:e.localized,describedByManifest:e.describedByManifest,...void 0===e.description?{}:{description:e.description},...void 0===e.valueDescription?{}:{valueDescription:e.valueDescription},...void 0===e.enumValues?{}:{enumValues:e.enumValues},...void 0===e.lenses?{}:{lenses:e.lenses}}))])),enumValues:Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries(Object.entries(t.resolvedShapes.get(e)?.properties??{}).flatMap(([e,t])=>{let i=T(t,A).enumValues;return i?[[e,i]]:[]}))])),deletable:Object.keys(e.deletable??{}),writable:Object.fromEntries(Object.entries(e.writable??{}).map(([e,i])=>[e,Object.fromEntries(Object.entries(i).map(([i,r])=>[i,{defaultOptionsName:r?.options?.as===void 0,members:Object.fromEntries(t.entityTypes.filter(i=>i===e||[...t.aliases].find(([t])=>t===e)?.[1].includes(i)).flatMap(r=>{let n=h(t.resolvedShapes.get(r)?.properties??{},i),s=n&&g(r,{property:i,writableKey:e},n,{model:t,resolveRef:A,exposed:new Map,sources:{}},N.at("writable")),o=V.get(r)?.find(t=>t.entry===`${e}.${i}`);return s?[[r,{field:s,...T(n,A).localized?{exposedDescription:b}:{},...o?{options:{options:o.options,hints:o.hints}}:{}}]]:[]}))}]))])),childRecipes:B(e.childRecipes??{}),replaceRecipes:B(e.replaceRecipes??{})},entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:i.navigationStates,viewStates:i.viewStates,toolStates:i.toolStates},deletableTypes:k,writableTypes:K,actionFields:G,childRecipes:Object.fromEntries(Object.entries(F.groups).map(([e,t])=>[e,{groups:t,hints:F.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(W.groups).map(([e,t])=>[e,{groups:t,hints:W.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...V].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),fields:Object.fromEntries([...C].map(([e,t])=>[e,t.map(t=>o(t,E.get(e)??[]))])),lenses:z}};export const createAssistantSchema=(e,t,n)=>{let s=resolveAssistantManifest(e,t,n);if(s)try{return{...r(s),resolved:s}}catch(e){if(e instanceof i)return void n.at("entities").error(a.ASSISTANT_FIELD_SHAPE_CONFLICT,l.ASSISTANT_FIELD_SHAPE_CONFLICT(e.fieldName,e.exposures));n.error(a.ASSISTANT_INVALID_SCHEMA,l.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
@@ -55,6 +55,23 @@ export interface paths {
55
55
  readonly patch?: never
56
56
  readonly trace?: never
57
57
  }
58
+ readonly '/auth/identity': {
59
+ readonly parameters: {
60
+ readonly query?: never
61
+ readonly header?: never
62
+ readonly path?: never
63
+ readonly cookie?: never
64
+ }
65
+ readonly get?: never
66
+ readonly put?: never
67
+ /** @description Resolve a verified customer Cognito identity to a stable Phoenix account and its active workspaces. Creates an empty account on first use; does not grant project or system access. */
68
+ readonly post: operations['resolveIdentity']
69
+ readonly delete?: never
70
+ readonly options?: never
71
+ readonly head?: never
72
+ readonly patch?: never
73
+ readonly trace?: never
74
+ }
58
75
  readonly '/auth/me': {
59
76
  readonly parameters: {
60
77
  readonly query?: never
@@ -1603,6 +1620,85 @@ export interface operations {
1603
1620
  }
1604
1621
  }
1605
1622
  }
1623
+ readonly resolveIdentity: {
1624
+ readonly parameters: {
1625
+ readonly query?: never
1626
+ readonly header?: never
1627
+ readonly path?: never
1628
+ readonly cookie?: never
1629
+ }
1630
+ readonly requestBody?: never
1631
+ readonly responses: {
1632
+ /** @description The Phoenix account and its active Cognito customer memberships. */
1633
+ readonly 200: {
1634
+ headers: {
1635
+ readonly [name: string]: unknown
1636
+ }
1637
+ content: {
1638
+ readonly 'application/json': {
1639
+ /** Format: uuid */
1640
+ readonly userId: string
1641
+ readonly workspaces: readonly {
1642
+ /** Format: uuid */
1643
+ readonly customerId: string
1644
+ readonly name: string
1645
+ /** @enum {string} */
1646
+ readonly role: 'user' | 'admin' | 'superadmin'
1647
+ readonly slug: string
1648
+ readonly tags: readonly string[]
1649
+ /** @enum {string} */
1650
+ readonly type: 'standard' | 'sdk_builder'
1651
+ }[]
1652
+ }
1653
+ }
1654
+ }
1655
+ /** @description Unauthorized! */
1656
+ readonly 401: {
1657
+ headers: {
1658
+ readonly [name: string]: unknown
1659
+ }
1660
+ content: {
1661
+ readonly 'application/json': components['schemas']['UnauthorizedError']
1662
+ }
1663
+ }
1664
+ /** @description Forbidden! */
1665
+ readonly 403: {
1666
+ headers: {
1667
+ readonly [name: string]: unknown
1668
+ }
1669
+ content: {
1670
+ readonly 'application/json': components['schemas']['ForbiddenError']
1671
+ }
1672
+ }
1673
+ /** @description Not Found! */
1674
+ readonly 404: {
1675
+ headers: {
1676
+ readonly [name: string]: unknown
1677
+ }
1678
+ content: {
1679
+ readonly 'application/json': components['schemas']['NotFoundError']
1680
+ }
1681
+ }
1682
+ /** @description Service Unavailable! */
1683
+ readonly 503: {
1684
+ headers: {
1685
+ readonly [name: string]: unknown
1686
+ }
1687
+ content: {
1688
+ readonly 'application/json': components['schemas']['ServiceUnavailableError']
1689
+ }
1690
+ }
1691
+ /** @description An unexpected error occurred! */
1692
+ readonly default: {
1693
+ headers: {
1694
+ readonly [name: string]: unknown
1695
+ }
1696
+ content: {
1697
+ readonly 'application/json': components['schemas']['DefaultResponse']
1698
+ }
1699
+ }
1700
+ }
1701
+ }
1606
1702
  readonly getApiSession: {
1607
1703
  readonly parameters: {
1608
1704
  readonly query?: never
@@ -1 +1 @@
1
- import{createApplicationRuntimeExtension as e}from"#package/react-sdk";import{createConfiguratorExtensionSelectors as s}from"./selectors.js";export const createConfiguratorExtensions=o=>[e(s({domainContextSelectors:o.selectors.domainContext.configurator,specSelectors:o.selectors.spec,domainServicesSelectors:o.selectors.domainServices,accessSelectors:o.selectors.access,commonServicesSelectors:o.selectors.commonServices}).getSystems())];
1
+ import{createApplicationRuntimeExtension as e}from"#package/react-sdk";import{createConfiguratorExtensionSelectors as s}from"./selectors.js";export const createConfiguratorExtensions=o=>[e(s({getState:o.getState,domainContextSelectors:o.selectors.domainContext.configurator,specSelectors:o.selectors.spec,domainServicesSelectors:o.selectors.domainServices,accessSelectors:o.selectors.access,commonServicesSelectors:o.selectors.commonServices}).getSystems())];
@@ -1,8 +1,9 @@
1
- import type { AccessInfoSelectors, DomainContextSelectors, DomainServicesSelectors, SpecSelectors } from '#package/domain';
1
+ import { type AccessInfoSelectors, type DomainContextSelectorState, type DomainContextSelectors, type DomainServicesSelectors, type SpecSelectors } from '#package/domain';
2
2
  import type { CommonServicesSelectors } from '#package/react-sdk';
3
3
  import type { AnyConfiguratorExtensionSystems } from './configurator-extension-systems.js';
4
4
  import { AnimationSystem, type AnyCameraSystem, type AnyCanvasSystem, type AnyDragAndDropSystem, type AnyExportSystem, type AnyImageRenderingSystem, type AnyLayoutSystem, type AnySketchingSystem, AssistantSystem, CameraControlSystem, GraphQLSystem } from './systems/index.js';
5
5
  interface Context {
6
+ readonly getState: () => DomainContextSelectorState;
6
7
  readonly domainContextSelectors: DomainContextSelectors;
7
8
  readonly specSelectors: SpecSelectors;
8
9
  readonly domainServicesSelectors: DomainServicesSelectors;
@@ -18,6 +19,7 @@ interface Context {
18
19
  * matching the domain layer. Every configurator system reads the domain through
19
20
  * `domainContextSelectors` and its same-layer peers through this slice's own selectors, so no
20
21
  * system is handed a constructed instance and construction order stops being a dependency graph.
22
+ * The exceptions are the narrowed getters of `systemContext`, each with its reason there.
21
23
  */
22
24
  export declare const createConfiguratorExtensionSelectors: (context: Context) => {
23
25
  getSystems: () => AnyConfiguratorExtensionSystems;