@salsita-ai/sdk 0.50.0-develop.b9eb39baf0 → 0.50.0-develop.bc4bdb2ffc

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 (572) hide show
  1. package/README.md +1 -1
  2. package/dist/admin/create-admin-pages-from-spec.d.ts +1 -1
  3. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +34 -34
  4. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.d.ts +1 -1
  5. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.js +1 -1
  6. package/dist/application-spec/generate-application/code/templates/env-example.js +4 -0
  7. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +4 -3
  8. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -2
  9. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  10. package/dist/client/authorized-client.d.ts +3 -1
  11. package/dist/client/authorized-client.js +1 -1
  12. package/dist/client/contract.d.ts +34 -0
  13. package/dist/client/contract.js +1 -1
  14. package/dist/client/index.d.ts +2 -2
  15. package/dist/client/index.js +1 -1
  16. package/dist/client/local-authorized-client.d.ts +3 -1
  17. package/dist/client/local-authorized-client.js +1 -1
  18. package/dist/client/memory-authorized-client.d.ts +3 -1
  19. package/dist/client/memory-authorized-client.js +1 -1
  20. package/dist/client/phoenix-api.d.ts +212 -1
  21. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +56 -2
  22. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  23. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  24. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  25. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  26. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +2 -1
  27. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -1
  28. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -2
  29. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  30. package/dist/configurator/ui/assistant/thread-items.d.ts +13 -2
  31. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  32. package/dist/docs/index.json +1 -1
  33. package/dist/docs/phoenix/deployments.mdx +1 -1
  34. package/dist/docs/phoenix/expression-context.mdx +11 -3
  35. package/dist/docs/phoenix/phoenix-cli.mdx +24 -21
  36. package/dist/docs/phoenix/sdk-builder-workflow.mdx +6 -6
  37. package/dist/domain/admin-domain/__generated/enhanced-model.d.ts +1 -2
  38. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +10 -11
  39. package/dist/domain/admin-domain/index.d.ts +4 -5
  40. package/dist/domain/admin-domain/index.js +1 -1
  41. package/dist/domain/application/assistant/assistant-manifest.d.ts +2 -0
  42. package/dist/domain/application/assistant/assistant-value-type.js +1 -1
  43. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  44. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +1 -11
  45. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  46. package/dist/domain/application/assistant-mutations.d.ts +1 -2
  47. package/dist/domain/application/assistant-mutations.js +1 -1
  48. package/dist/domain/application/assistant-recipe-groups.d.ts +1 -3
  49. package/dist/domain/application/index.d.ts +1 -1
  50. package/dist/domain/application/index.js +1 -1
  51. package/dist/domain/available-system-components.js +1 -1
  52. package/dist/domain/{actions → core/action}/action-factory.d.ts +3 -2
  53. package/dist/domain/core/{action.d.ts → action/action.d.ts} +15 -15
  54. package/dist/domain/core/action/index.d.ts +2 -0
  55. package/dist/domain/core/action/index.js +1 -0
  56. package/dist/domain/{components → core/component}/component-reader-types.d.ts +1 -1
  57. package/dist/domain/{components → core/component}/debug-state-component.d.ts +1 -1
  58. package/dist/domain/core/component/debug-state-component.js +1 -0
  59. package/dist/domain/{components → core/component}/domain-component-optic.d.ts +37 -36
  60. package/dist/domain/core/component/domain-component-optic.js +16 -0
  61. package/dist/domain/{components → core/component}/drag-state-component.d.ts +1 -1
  62. package/dist/domain/core/component/drag-state-component.js +1 -0
  63. package/dist/domain/{components → core/component}/export-state-component.d.ts +1 -1
  64. package/dist/domain/core/component/export-state-component.js +1 -0
  65. package/dist/domain/{components → core/component}/fullscreen-state-component.d.ts +1 -1
  66. package/dist/domain/core/component/fullscreen-state-component.js +1 -0
  67. package/dist/domain/{components → core/component}/group-components-by-entity-id-and-name.d.ts +1 -1
  68. package/dist/domain/core/component/group-components-by-entity-id-and-name.js +1 -0
  69. package/dist/domain/{components → core/component}/hover-state-component.d.ts +1 -1
  70. package/dist/domain/core/component/hover-state-component.js +1 -0
  71. package/dist/domain/core/component/index.d.ts +18 -0
  72. package/dist/domain/core/component/index.js +1 -0
  73. package/dist/domain/{components → core/component}/legacy-filter.d.ts +2 -1
  74. package/dist/domain/{components → core/component}/navigation-state-component.d.ts +1 -1
  75. package/dist/domain/core/component/navigation-state-component.js +1 -0
  76. package/dist/domain/{components → core/component}/selection-state-component.d.ts +1 -1
  77. package/dist/domain/core/component/selection-state-component.js +1 -0
  78. package/dist/domain/{components → core/component}/system-component-builder.d.ts +1 -1
  79. package/dist/domain/core/component/system-component-builder.js +1 -0
  80. package/dist/domain/{components → core/component}/system-component-filter.d.ts +19 -17
  81. package/dist/domain/core/component/system-virtual-entity.js +1 -0
  82. package/dist/domain/{components → core/component}/tool-state-component.d.ts +1 -1
  83. package/dist/domain/core/component/tool-state-component.js +1 -0
  84. package/dist/domain/{components → core/component}/updates.d.ts +1 -1
  85. package/dist/domain/{components → core/component}/view-state-component.d.ts +1 -1
  86. package/dist/domain/core/component/view-state-component.js +1 -0
  87. package/dist/domain/{components → core/component}/viewport-state-component.d.ts +1 -1
  88. package/dist/domain/core/component/viewport-state-component.js +1 -0
  89. package/dist/domain/core/domain-factory.d.ts +3 -3
  90. package/dist/domain/core/domain.d.ts +3 -3
  91. package/dist/domain/core/expression/aliased-expressions.d.ts +10 -0
  92. package/dist/domain/{expressions → core/expression}/constant-expressions.d.ts +2 -1
  93. package/dist/domain/core/expression/constant-expressions.js +1 -0
  94. package/dist/domain/{expressions → core/expression}/custom-expression.d.ts +9 -7
  95. package/dist/domain/core/expression/custom-expression.js +1 -0
  96. package/dist/domain/core/{expression.d.ts → expression/expression.d.ts} +17 -19
  97. package/dist/domain/core/expression/index.d.ts +4 -0
  98. package/dist/domain/core/expression/index.js +1 -0
  99. package/dist/domain/core/index.d.ts +7 -4
  100. package/dist/domain/core/index.js +1 -1
  101. package/dist/domain/{invariants → core/invariant}/builtin-invariant.d.ts +2 -1
  102. package/dist/domain/{invariants → core/invariant}/custom-invariants.d.ts +7 -7
  103. package/dist/domain/core/invariant/custom-invariants.js +1 -0
  104. package/dist/domain/core/invariant/index.d.ts +5 -0
  105. package/dist/domain/core/invariant/index.js +1 -0
  106. package/dist/domain/{invariants → core/invariant}/invariants.d.ts +6 -4
  107. package/dist/domain/core/invariant/invariants.js +1 -0
  108. package/dist/domain/core/invariant/violation-component.js +1 -0
  109. package/dist/domain/{invariants → core/invariant}/violation.d.ts +2 -2
  110. package/dist/domain/core/recipe/index.d.ts +1 -0
  111. package/dist/domain/core/recipe/index.js +1 -0
  112. package/dist/domain/{domain-context/recipe-system → core/recipe}/recipes.d.ts +1 -1
  113. package/dist/domain/core/recipe/recipes.js +1 -0
  114. package/dist/domain/{relations → core/relation}/all-of-type-relation.d.ts +3 -1
  115. package/dist/domain/core/relation/all-of-type-relation.js +1 -0
  116. package/dist/domain/{relations → core/relation}/component-factories.d.ts +1 -1
  117. package/dist/domain/core/relation/component-factories.js +1 -0
  118. package/dist/domain/{relations → core/relation}/composed-of.d.ts +1 -1
  119. package/dist/domain/core/relation/composed-of.js +1 -0
  120. package/dist/domain/{relations → core/relation}/direct-relation.d.ts +2 -1
  121. package/dist/domain/core/relation/index.d.ts +9 -0
  122. package/dist/domain/core/relation/index.js +1 -0
  123. package/dist/domain/{relations → core/relation}/indirect-relation.d.ts +3 -1
  124. package/dist/domain/core/relation/indirect-relation.js +1 -0
  125. package/dist/domain/{relations → core/relation}/reference-component.d.ts +4 -4
  126. package/dist/domain/core/relation/reference-component.js +1 -0
  127. package/dist/domain/{relations → core/relation}/reference-field.d.ts +1 -1
  128. package/dist/domain/{relations → core/relation}/relation-factory.d.ts +2 -1
  129. package/dist/domain/{relations → core/relation}/relation-implementation.d.ts +3 -1
  130. package/dist/domain/core/relation/relation-implementation.js +1 -0
  131. package/dist/domain/core/state/id-sequence.d.ts +15 -0
  132. package/dist/domain/core/state/id-sequence.js +1 -0
  133. package/dist/domain/core/state/index.d.ts +3 -0
  134. package/dist/domain/core/state/index.js +1 -0
  135. package/dist/domain/core/{migrations.d.ts → state/migrations.d.ts} +1 -1
  136. package/dist/domain/core/{state.d.ts → state/state.d.ts} +1 -1
  137. package/dist/domain/domain-builder.d.ts +1 -4
  138. package/dist/domain/domain-context/action-system/action-system.d.ts +2 -2
  139. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  140. package/dist/domain/domain-context/dimension-system/dimension-state.js +1 -1
  141. package/dist/domain/domain-context/dimension-system/dimension-system.d.ts +1 -2
  142. package/dist/domain/domain-context/index.d.ts +1 -2
  143. package/dist/domain/domain-context/index.js +1 -1
  144. package/dist/domain/domain-context/navigation-system/navigation-system.d.ts +3 -4
  145. package/dist/domain/domain-context/navigation-system/navigation-system.js +1 -1
  146. package/dist/domain/domain-context/navigation-system/navigation-updates.d.ts +1 -12
  147. package/dist/domain/domain-context/navigation-system/navigation-updates.js +1 -1
  148. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.d.ts +1 -3
  149. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.js +1 -1
  150. package/dist/domain/domain-context/relation-transformers/cascade-deletes.js +1 -1
  151. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.d.ts +1 -1
  152. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.js +1 -1
  153. package/dist/domain/domain-context/relation-transformers/create-entity-refs.d.ts +1 -1
  154. package/dist/domain/domain-context/relation-transformers/create-entity-refs.js +2 -2
  155. package/dist/domain/domain-context/relation-transformers/replace-refs.d.ts +1 -1
  156. package/dist/domain/domain-context/relation-transformers/replace-refs.js +1 -1
  157. package/dist/domain/domain-context/store-system/apply-updates.d.ts +1 -2
  158. package/dist/domain/domain-context/store-system/next-domain-entity-id.d.ts +1 -12
  159. package/dist/domain/domain-context/store-system/reconcile-projected-entities.d.ts +1 -2
  160. package/dist/domain/domain-context/store-system/reconcile-projected-entities.js +1 -1
  161. package/dist/domain/domain-context/store-system/store-system.d.ts +1 -3
  162. package/dist/domain/domain-context/store-system/store-system.js +2 -2
  163. package/dist/domain/domain-context/store-system/system-state.d.ts +1 -1
  164. package/dist/domain/domain-context/store-system/system-state.js +1 -1
  165. package/dist/domain/domain-context/transformers/actions-builder.d.ts +1 -2
  166. package/dist/domain/domain-context/transformers/auto-snap-transformer.d.ts +1 -2
  167. package/dist/domain/domain-context/transformers/context.d.ts +1 -4
  168. package/dist/domain/domain-context/transformers/entity-builder.d.ts +1 -5
  169. package/dist/domain/domain-context/transformers/then-builder.d.ts +1 -2
  170. package/dist/domain/domain-context/transformers/when-builder.d.ts +1 -5
  171. package/dist/domain/domain-runtime/domain-context/component-reader.d.ts +1 -2
  172. package/dist/domain/domain-runtime/domain-context/component-reader.js +1 -1
  173. package/dist/domain/domain-runtime/domain-context/expression-context.d.ts +8 -0
  174. package/dist/domain/domain-runtime/domain-context/expression-context.js +1 -0
  175. package/dist/domain/domain-runtime/domain-context/index.d.ts +2 -0
  176. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.d.ts +18 -0
  177. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.js +1 -0
  178. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +3 -3
  179. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  180. package/dist/domain/domain-runtime/domain-runtime.d.ts +8 -8
  181. package/dist/domain/domain-runtime/spec/index.d.ts +3 -0
  182. package/dist/domain/domain-runtime/spec/index.js +1 -1
  183. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  184. package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.d.ts +1 -1
  185. package/dist/domain/{actions → domain-runtime/spec}/prepare-action-implementations.d.ts +1 -1
  186. package/dist/domain/domain-runtime/spec/prepare-action-implementations.js +5 -0
  187. package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.d.ts +1 -1
  188. package/dist/domain/domain-runtime/spec/types.d.ts +1 -2
  189. package/dist/domain/extensions/angle-indicator.js +1 -0
  190. package/dist/domain/extensions/attribute-switch.js +1 -0
  191. package/dist/domain/{system-components → extensions}/autorotate-camera-component.d.ts +1 -1
  192. package/dist/domain/extensions/autorotate-camera-component.js +1 -0
  193. package/dist/domain/extensions/basic-sidebar-footer.js +1 -0
  194. package/dist/domain/extensions/camera-based-hidden-entity-object.js +1 -0
  195. package/dist/domain/extensions/camera-based-hidden-entity.js +1 -0
  196. package/dist/domain/extensions/canvas-config.js +1 -0
  197. package/dist/domain/extensions/canvas-custom-environment.js +1 -0
  198. package/dist/domain/extensions/canvas-padding.js +1 -0
  199. package/dist/domain/extensions/canvas-preset-environment.js +1 -0
  200. package/dist/domain/{system-components → extensions}/child-entity-recipe-hierarchy.d.ts +2 -2
  201. package/dist/domain/extensions/child-entity-recipe-hierarchy.js +1 -0
  202. package/dist/domain/extensions/client-side-image.js +1 -0
  203. package/dist/domain/extensions/color-value.js +1 -0
  204. package/dist/domain/{system-components → extensions}/common/angle-indicator-schema.d.ts +1 -1
  205. package/dist/domain/extensions/common/angle-indicator-schema.js +1 -0
  206. package/dist/domain/extensions/common/index.d.ts +4 -0
  207. package/dist/domain/extensions/common/index.js +1 -0
  208. package/dist/domain/{system-components → extensions}/custom-header.d.ts +1 -1
  209. package/dist/domain/extensions/custom-header.js +1 -0
  210. package/dist/domain/extensions/custom-price-footer.js +1 -0
  211. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.d.ts +1 -1
  212. package/dist/domain/extensions/custom-sidebar-footer.js +1 -0
  213. package/dist/domain/extensions/dimension-indicator.js +1 -0
  214. package/dist/domain/{system-components → extensions}/editable-angle-indicator.d.ts +2 -1
  215. package/dist/domain/extensions/editable-angle-indicator.js +1 -0
  216. package/dist/domain/{system-components → extensions}/editable-distance-dimension-indicator.d.ts +2 -1
  217. package/dist/domain/extensions/editable-distance-dimension-indicator.js +1 -0
  218. package/dist/domain/{system-components → extensions}/editable-offset-indicator.d.ts +2 -1
  219. package/dist/domain/extensions/editable-offset-indicator.js +1 -0
  220. package/dist/domain/{system-components → extensions}/editable-size-indicator.d.ts +2 -1
  221. package/dist/domain/extensions/editable-size-indicator.js +1 -0
  222. package/dist/domain/{system-components → extensions}/entity-header.d.ts +1 -1
  223. package/dist/domain/extensions/entity-header.js +1 -0
  224. package/dist/domain/extensions/exit-tool-mode-fab.js +1 -0
  225. package/dist/domain/extensions/finalize-action.js +1 -0
  226. package/dist/domain/extensions/finalize-component.js +1 -0
  227. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -0
  228. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -0
  229. package/dist/domain/extensions/fixed-header.js +1 -0
  230. package/dist/domain/extensions/floating-header.js +1 -0
  231. package/dist/domain/extensions/hidden-header.js +1 -0
  232. package/dist/domain/extensions/hidden-sidebar-footer.js +1 -0
  233. package/dist/domain/extensions/horizontal-tabs.js +1 -0
  234. package/dist/domain/extensions/index.d.ts +69 -0
  235. package/dist/domain/extensions/index.js +1 -0
  236. package/dist/domain/{system-components → extensions}/list-selector-dimension-indicator.d.ts +2 -1
  237. package/dist/domain/extensions/list-selector-dimension-indicator.js +1 -0
  238. package/dist/domain/extensions/multilingual-text-value.js +1 -0
  239. package/dist/domain/extensions/navigation-steps.js +1 -0
  240. package/dist/domain/extensions/offset-anchors.js +1 -0
  241. package/dist/domain/extensions/offset-indicator.js +1 -0
  242. package/dist/domain/extensions/offset.js +1 -0
  243. package/dist/domain/extensions/other-action.js +1 -0
  244. package/dist/domain/{system-components → extensions}/property-page.d.ts +1 -1
  245. package/dist/domain/extensions/property-page.js +1 -0
  246. package/dist/domain/extensions/read-sidebar-footer.js +1 -0
  247. package/dist/domain/{system-components → extensions}/replace-entity-recipe-hierarchy.d.ts +2 -2
  248. package/dist/domain/extensions/replace-entity-recipe-hierarchy.js +1 -0
  249. package/dist/domain/extensions/rotatable.js +1 -0
  250. package/dist/domain/extensions/rotation-handle.js +1 -0
  251. package/dist/domain/extensions/save-template-thumbnail.js +1 -0
  252. package/dist/domain/{system-components → extensions}/scene-entity-add-fab.d.ts +1 -1
  253. package/dist/domain/extensions/scene-entity-add-fab.js +1 -0
  254. package/dist/domain/extensions/scene-entity-animation.js +1 -0
  255. package/dist/domain/extensions/scene-entity-control.js +1 -0
  256. package/dist/domain/{system-components → extensions}/scene-entity-delete-fab.d.ts +1 -1
  257. package/dist/domain/extensions/scene-entity-delete-fab.js +1 -0
  258. package/dist/domain/extensions/scene-entity-floor-object.js +1 -0
  259. package/dist/domain/{system-components → extensions}/scene-entity-html-hotspot.d.ts +1 -1
  260. package/dist/domain/extensions/scene-entity-html-hotspot.js +1 -0
  261. package/dist/domain/{system-components → extensions}/scene-entity-navigation-hotspot.d.ts +1 -1
  262. package/dist/domain/extensions/scene-entity-navigation-hotspot.js +1 -0
  263. package/dist/domain/{system-components → extensions}/scene-entity-object-html-hotspot.d.ts +1 -1
  264. package/dist/domain/extensions/scene-entity-object-html-hotspot.js +1 -0
  265. package/dist/domain/{system-components → extensions}/scene-entity-select-hotspot.d.ts +1 -1
  266. package/dist/domain/extensions/scene-entity-select-hotspot.js +1 -0
  267. package/dist/domain/extensions/scene-entity-wall-object.js +1 -0
  268. package/dist/domain/extensions/selectable-component.js +1 -0
  269. package/dist/domain/extensions/sidebar-tabs.js +1 -0
  270. package/dist/domain/extensions/simple-summary.js +1 -0
  271. package/dist/domain/extensions/size.js +1 -0
  272. package/dist/domain/extensions/sketching-draw.js +1 -0
  273. package/dist/domain/{system-components → extensions}/sketching-edit.d.ts +1 -1
  274. package/dist/domain/extensions/sketching-edit.js +1 -0
  275. package/dist/domain/extensions/summary-component.js +1 -0
  276. package/dist/domain/extensions/text-value.js +1 -0
  277. package/dist/domain/extensions/tool-controls.js +1 -0
  278. package/dist/domain/{system-components → extensions}/tool-menu-fab.d.ts +1 -1
  279. package/dist/domain/extensions/tool-menu-fab.js +1 -0
  280. package/dist/domain/{system-components → extensions}/toolbar.d.ts +1 -1
  281. package/dist/domain/extensions/toolbar.js +1 -0
  282. package/dist/domain/extensions/universal-sidebar-footer.js +1 -0
  283. package/dist/domain/extensions/view-controls.js +1 -0
  284. package/dist/domain/index.d.ts +2 -32
  285. package/dist/domain/index.js +1 -1
  286. package/dist/domain/projections/blender-projections/blender-projections.d.ts +1 -1
  287. package/dist/domain/projections/blender-projections/blender-projections.js +1 -1
  288. package/dist/domain/projections/composition-projections.js +1 -1
  289. package/dist/domain/projections/validation-projections.d.ts +1 -2
  290. package/dist/domain/projections/validation-projections.js +1 -1
  291. package/dist/domain/system-components/admin-sidebar.js +1 -1
  292. package/dist/domain/system-components/angle-dimension.js +1 -1
  293. package/dist/domain/system-components/application-config.js +1 -1
  294. package/dist/domain/system-components/attribute-selection.js +1 -1
  295. package/dist/domain/system-components/bounding-box-component.d.ts +1 -1
  296. package/dist/domain/system-components/bounding-box-component.js +1 -1
  297. package/dist/domain/system-components/bounding-sphere-component.d.ts +1 -1
  298. package/dist/domain/system-components/bounding-sphere-component.js +1 -1
  299. package/dist/domain/system-components/child-entity-recipes.d.ts +1 -1
  300. package/dist/domain/system-components/child-entity-recipes.js +1 -1
  301. package/dist/domain/system-components/child-entity-selection.d.ts +1 -2
  302. package/dist/domain/system-components/child-entity-selection.js +1 -1
  303. package/dist/domain/system-components/collision-box-geometry.d.ts +1 -1
  304. package/dist/domain/system-components/collision-box-geometry.js +1 -1
  305. package/dist/domain/system-components/collision-geometry.d.ts +1 -1
  306. package/dist/domain/system-components/collision-geometry.js +1 -1
  307. package/dist/domain/system-components/collision-point-geometry.d.ts +1 -1
  308. package/dist/domain/system-components/collision-point-geometry.js +1 -1
  309. package/dist/domain/system-components/common/index.d.ts +0 -4
  310. package/dist/domain/system-components/common/index.js +1 -1
  311. package/dist/domain/system-components/common/recipes.d.ts +1 -2
  312. package/dist/domain/system-components/constraint.d.ts +1 -1
  313. package/dist/domain/system-components/constraint.js +1 -1
  314. package/dist/domain/system-components/custom-scene-entity.js +1 -1
  315. package/dist/domain/system-components/detail.js +1 -1
  316. package/dist/domain/system-components/distance-dimension-select.js +1 -1
  317. package/dist/domain/system-components/distance-dimension.js +1 -1
  318. package/dist/domain/system-components/drag-handle.js +1 -1
  319. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  320. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  321. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  322. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  323. package/dist/domain/system-components/generic-dimension.js +1 -1
  324. package/dist/domain/system-components/hidden-entity.js +1 -1
  325. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -2
  326. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  327. package/dist/domain/system-components/index.d.ts +0 -68
  328. package/dist/domain/system-components/index.js +1 -1
  329. package/dist/domain/system-components/material-override-property-transition.js +1 -1
  330. package/dist/domain/system-components/material-override-transformer.js +1 -1
  331. package/dist/domain/system-components/material-swatch.js +1 -1
  332. package/dist/domain/system-components/navigation-page.js +1 -1
  333. package/dist/domain/system-components/navigation-panel-list.js +1 -1
  334. package/dist/domain/system-components/pivot-point.js +1 -1
  335. package/dist/domain/system-components/price.js +1 -1
  336. package/dist/domain/system-components/projected-entities.js +1 -1
  337. package/dist/domain/system-components/replace-entity-recipes.d.ts +1 -1
  338. package/dist/domain/system-components/replace-entity-recipes.js +1 -1
  339. package/dist/domain/system-components/scene-entity-ambient-light.js +1 -1
  340. package/dist/domain/system-components/scene-entity-box-object.js +1 -1
  341. package/dist/domain/system-components/scene-entity-directional-light.js +1 -1
  342. package/dist/domain/system-components/scene-entity-local-material-override.js +1 -1
  343. package/dist/domain/system-components/scene-entity-material-override.js +1 -1
  344. package/dist/domain/system-components/scene-entity-object-clip.js +1 -1
  345. package/dist/domain/system-components/scene-entity-object-decal.js +1 -1
  346. package/dist/domain/system-components/scene-entity-object-group.js +1 -1
  347. package/dist/domain/system-components/scene-entity-object-local-material-override.js +1 -1
  348. package/dist/domain/system-components/scene-entity-object-material-override.js +1 -1
  349. package/dist/domain/system-components/scene-entity-object-properties.js +1 -1
  350. package/dist/domain/system-components/scene-entity-object-remote-material-override.js +1 -1
  351. package/dist/domain/system-components/scene-entity-object-text-decal.js +1 -1
  352. package/dist/domain/system-components/scene-entity-object-transformer.js +1 -1
  353. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.js +1 -1
  354. package/dist/domain/system-components/scene-entity-object.js +1 -1
  355. package/dist/domain/system-components/scene-entity-point-light.js +1 -1
  356. package/dist/domain/system-components/scene-entity-properties.js +1 -1
  357. package/dist/domain/system-components/scene-entity-rect-area-light.js +1 -1
  358. package/dist/domain/system-components/scene-entity-remote-material-override.js +1 -1
  359. package/dist/domain/system-components/scene-entity-remote-object.js +1 -1
  360. package/dist/domain/system-components/scene-entity-spot-light.js +1 -1
  361. package/dist/domain/system-components/scene-entity-transimissive-material-override.js +1 -1
  362. package/dist/domain/system-components/sketching-line.js +1 -1
  363. package/dist/domain/system-components/sketching-rectangle.js +1 -1
  364. package/dist/domain/system-components/sketching.js +1 -1
  365. package/dist/domain/system-components/snap-axis.js +1 -1
  366. package/dist/domain/system-components/snap-edge.js +1 -1
  367. package/dist/domain/system-components/snap-plane.js +1 -1
  368. package/dist/domain/system-components/snap-point.js +1 -1
  369. package/dist/domain/system-components/static-orthographic-camera-component.d.ts +1 -1
  370. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  371. package/dist/domain/system-components/static-perspective-camera-component.d.ts +1 -1
  372. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  373. package/dist/domain/utils/memo-eval.d.ts +2 -2
  374. package/dist/i18n/locales/cs/messages.js +1 -1
  375. package/dist/i18n/locales/da/messages.js +1 -1
  376. package/dist/i18n/locales/de/messages.js +1 -1
  377. package/dist/i18n/locales/de-AT/messages.js +1 -1
  378. package/dist/i18n/locales/en/messages.js +1 -1
  379. package/dist/i18n/locales/en-AU/messages.js +1 -1
  380. package/dist/i18n/locales/en-GB/messages.js +1 -1
  381. package/dist/i18n/locales/es/messages.js +1 -1
  382. package/dist/i18n/locales/fr/messages.js +1 -1
  383. package/dist/i18n/locales/hu/messages.js +1 -1
  384. package/dist/i18n/locales/it/messages.js +1 -1
  385. package/dist/i18n/locales/nl/messages.js +1 -1
  386. package/dist/i18n/locales/pl/messages.js +1 -1
  387. package/dist/i18n/locales/pt/messages.js +1 -1
  388. package/dist/i18n/locales/ro/messages.js +1 -1
  389. package/dist/i18n/locales/sk/messages.js +1 -1
  390. package/dist/i18n/locales/tr/messages.js +1 -1
  391. package/dist/legacy/domain-cli/gen/implementation.js +5 -5
  392. package/dist/legacy/domain-cli/gen/invariants.js +5 -3
  393. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  394. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  395. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.d.ts +1 -1
  396. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.js +4 -0
  397. package/dist/phoenix/scripts/build-admin.js +1 -1
  398. package/dist/ui-sdk/theme/types.d.ts +1 -1
  399. package/dist/webhook/builders/common.d.ts +5 -0
  400. package/dist/webhook/builders/webhook-builder.js +1 -1
  401. package/package.json +3 -3
  402. package/dist/domain/actions/prepare-action-implementations.js +0 -5
  403. package/dist/domain/components/debug-state-component.js +0 -1
  404. package/dist/domain/components/domain-component-optic.js +0 -16
  405. package/dist/domain/components/drag-state-component.js +0 -1
  406. package/dist/domain/components/export-state-component.js +0 -1
  407. package/dist/domain/components/fullscreen-state-component.js +0 -1
  408. package/dist/domain/components/group-components-by-entity-id-and-name.js +0 -1
  409. package/dist/domain/components/hover-state-component.js +0 -1
  410. package/dist/domain/components/index.d.ts +0 -2
  411. package/dist/domain/components/index.js +0 -1
  412. package/dist/domain/components/navigation-state-component.js +0 -1
  413. package/dist/domain/components/selection-state-component.js +0 -1
  414. package/dist/domain/components/system-component-builder.js +0 -1
  415. package/dist/domain/components/system-virtual-entity.js +0 -1
  416. package/dist/domain/components/tool-state-component.js +0 -1
  417. package/dist/domain/components/view-state-component.js +0 -1
  418. package/dist/domain/components/viewport-state-component.js +0 -1
  419. package/dist/domain/domain-context/recipe-system/recipes.js +0 -1
  420. package/dist/domain/expressions/constant-expressions.js +0 -1
  421. package/dist/domain/expressions/custom-expression.js +0 -1
  422. package/dist/domain/expressions/index.d.ts +0 -1
  423. package/dist/domain/expressions/index.js +0 -1
  424. package/dist/domain/invariants/custom-invariants.js +0 -1
  425. package/dist/domain/invariants/invariants.js +0 -1
  426. package/dist/domain/invariants/violation-component.js +0 -1
  427. package/dist/domain/relations/all-of-type-relation.js +0 -1
  428. package/dist/domain/relations/component-factories.js +0 -1
  429. package/dist/domain/relations/composed-of.js +0 -1
  430. package/dist/domain/relations/indirect-relation.js +0 -1
  431. package/dist/domain/relations/reference-component.js +0 -1
  432. package/dist/domain/system-components/angle-indicator.js +0 -1
  433. package/dist/domain/system-components/attribute-switch.js +0 -1
  434. package/dist/domain/system-components/autorotate-camera-component.js +0 -1
  435. package/dist/domain/system-components/basic-sidebar-footer.js +0 -1
  436. package/dist/domain/system-components/camera-based-hidden-entity-object.js +0 -1
  437. package/dist/domain/system-components/camera-based-hidden-entity.js +0 -1
  438. package/dist/domain/system-components/canvas-config.js +0 -1
  439. package/dist/domain/system-components/canvas-custom-environment.js +0 -1
  440. package/dist/domain/system-components/canvas-padding.js +0 -1
  441. package/dist/domain/system-components/canvas-preset-environment.js +0 -1
  442. package/dist/domain/system-components/child-entity-recipe-hierarchy.js +0 -1
  443. package/dist/domain/system-components/client-side-image.js +0 -1
  444. package/dist/domain/system-components/color-value.js +0 -1
  445. package/dist/domain/system-components/common/angle-indicator-schema.js +0 -1
  446. package/dist/domain/system-components/custom-header.js +0 -1
  447. package/dist/domain/system-components/custom-price-footer.js +0 -1
  448. package/dist/domain/system-components/custom-sidebar-footer.js +0 -1
  449. package/dist/domain/system-components/dimension-indicator.js +0 -1
  450. package/dist/domain/system-components/editable-angle-indicator.js +0 -1
  451. package/dist/domain/system-components/editable-distance-dimension-indicator.js +0 -1
  452. package/dist/domain/system-components/editable-offset-indicator.js +0 -1
  453. package/dist/domain/system-components/editable-size-indicator.js +0 -1
  454. package/dist/domain/system-components/entity-header.js +0 -1
  455. package/dist/domain/system-components/exit-tool-mode-fab.js +0 -1
  456. package/dist/domain/system-components/finalize-action.js +0 -1
  457. package/dist/domain/system-components/finalize-component.js +0 -1
  458. package/dist/domain/system-components/fit-selection-orthographic-camera-component.js +0 -1
  459. package/dist/domain/system-components/fit-selection-perspective-camera-component.js +0 -1
  460. package/dist/domain/system-components/fixed-header.js +0 -1
  461. package/dist/domain/system-components/floating-header.js +0 -1
  462. package/dist/domain/system-components/hidden-header.js +0 -1
  463. package/dist/domain/system-components/hidden-sidebar-footer.js +0 -1
  464. package/dist/domain/system-components/horizontal-tabs.js +0 -1
  465. package/dist/domain/system-components/list-selector-dimension-indicator.js +0 -1
  466. package/dist/domain/system-components/multilingual-text-value.js +0 -1
  467. package/dist/domain/system-components/navigation-steps.js +0 -1
  468. package/dist/domain/system-components/offset-anchors.js +0 -1
  469. package/dist/domain/system-components/offset-indicator.js +0 -1
  470. package/dist/domain/system-components/offset.js +0 -1
  471. package/dist/domain/system-components/other-action.js +0 -1
  472. package/dist/domain/system-components/property-page.js +0 -1
  473. package/dist/domain/system-components/read-sidebar-footer.js +0 -1
  474. package/dist/domain/system-components/replace-entity-recipe-hierarchy.js +0 -1
  475. package/dist/domain/system-components/rotatable.js +0 -1
  476. package/dist/domain/system-components/rotation-handle.js +0 -1
  477. package/dist/domain/system-components/save-template-thumbnail.js +0 -1
  478. package/dist/domain/system-components/scene-entity-add-fab.js +0 -1
  479. package/dist/domain/system-components/scene-entity-animation.js +0 -1
  480. package/dist/domain/system-components/scene-entity-control.js +0 -1
  481. package/dist/domain/system-components/scene-entity-delete-fab.js +0 -1
  482. package/dist/domain/system-components/scene-entity-floor-object.js +0 -1
  483. package/dist/domain/system-components/scene-entity-html-hotspot.js +0 -1
  484. package/dist/domain/system-components/scene-entity-navigation-hotspot.js +0 -1
  485. package/dist/domain/system-components/scene-entity-object-html-hotspot.js +0 -1
  486. package/dist/domain/system-components/scene-entity-select-hotspot.js +0 -1
  487. package/dist/domain/system-components/scene-entity-wall-object.js +0 -1
  488. package/dist/domain/system-components/selectable-component.js +0 -1
  489. package/dist/domain/system-components/sidebar-tabs.js +0 -1
  490. package/dist/domain/system-components/simple-summary.js +0 -1
  491. package/dist/domain/system-components/size.js +0 -1
  492. package/dist/domain/system-components/sketching-draw.js +0 -1
  493. package/dist/domain/system-components/sketching-edit.js +0 -1
  494. package/dist/domain/system-components/summary-component.js +0 -1
  495. package/dist/domain/system-components/text-value.js +0 -1
  496. package/dist/domain/system-components/tool-controls.js +0 -1
  497. package/dist/domain/system-components/tool-menu-fab.js +0 -1
  498. package/dist/domain/system-components/toolbar.js +0 -1
  499. package/dist/domain/system-components/universal-sidebar-footer.js +0 -1
  500. package/dist/domain/system-components/view-controls.js +0 -1
  501. /package/dist/domain/{actions → core/action}/action-factory.js +0 -0
  502. /package/dist/domain/core/{action.js → action/action.js} +0 -0
  503. /package/dist/domain/{components → core/component}/component-reader-types.js +0 -0
  504. /package/dist/domain/{components → core/component}/legacy-filter.js +0 -0
  505. /package/dist/domain/{components → core/component}/system-component-filter.js +0 -0
  506. /package/dist/domain/{components → core/component}/system-virtual-entity.d.ts +0 -0
  507. /package/dist/domain/{components → core/component}/updates.js +0 -0
  508. /package/dist/domain/core/{expression.js → expression/aliased-expressions.js} +0 -0
  509. /package/dist/domain/{relations/reference-field.js → core/expression/expression.js} +0 -0
  510. /package/dist/domain/{invariants → core/invariant}/builtin-invariant.js +0 -0
  511. /package/dist/domain/{invariants → core/invariant}/violation-component.d.ts +0 -0
  512. /package/dist/domain/{invariants → core/invariant}/violation.js +0 -0
  513. /package/dist/domain/{relations → core/relation}/direct-relation.js +0 -0
  514. /package/dist/domain/{relations/relation-implementation.js → core/relation/reference-field.js} +0 -0
  515. /package/dist/domain/{relations → core/relation}/relation-factory.js +0 -0
  516. /package/dist/domain/core/{migrations.js → state/migrations.js} +0 -0
  517. /package/dist/domain/core/{state.js → state/state.js} +0 -0
  518. /package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.js +0 -0
  519. /package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.js +0 -0
  520. /package/dist/domain/{system-components → extensions}/angle-indicator.d.ts +0 -0
  521. /package/dist/domain/{system-components → extensions}/attribute-switch.d.ts +0 -0
  522. /package/dist/domain/{system-components → extensions}/basic-sidebar-footer.d.ts +0 -0
  523. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity-object.d.ts +0 -0
  524. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity.d.ts +0 -0
  525. /package/dist/domain/{system-components → extensions}/canvas-config.d.ts +0 -0
  526. /package/dist/domain/{system-components → extensions}/canvas-custom-environment.d.ts +0 -0
  527. /package/dist/domain/{system-components → extensions}/canvas-padding.d.ts +0 -0
  528. /package/dist/domain/{system-components → extensions}/canvas-preset-environment.d.ts +0 -0
  529. /package/dist/domain/{system-components → extensions}/client-side-image.d.ts +0 -0
  530. /package/dist/domain/{system-components → extensions}/color-value.d.ts +0 -0
  531. /package/dist/domain/{system-components → extensions}/common/dimension-indicator-schema.d.ts +0 -0
  532. /package/dist/domain/{system-components → extensions}/common/dimension-indicator-schema.js +0 -0
  533. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.d.ts +0 -0
  534. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.js +0 -0
  535. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.d.ts +0 -0
  536. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.js +0 -0
  537. /package/dist/domain/{system-components → extensions}/custom-price-footer.d.ts +0 -0
  538. /package/dist/domain/{system-components → extensions}/dimension-indicator.d.ts +0 -0
  539. /package/dist/domain/{system-components → extensions}/exit-tool-mode-fab.d.ts +0 -0
  540. /package/dist/domain/{system-components → extensions}/finalize-action.d.ts +0 -0
  541. /package/dist/domain/{system-components → extensions}/finalize-component.d.ts +0 -0
  542. /package/dist/domain/{system-components → extensions}/fit-selection-orthographic-camera-component.d.ts +0 -0
  543. /package/dist/domain/{system-components → extensions}/fit-selection-perspective-camera-component.d.ts +0 -0
  544. /package/dist/domain/{system-components → extensions}/fixed-header.d.ts +0 -0
  545. /package/dist/domain/{system-components → extensions}/floating-header.d.ts +0 -0
  546. /package/dist/domain/{system-components → extensions}/hidden-header.d.ts +0 -0
  547. /package/dist/domain/{system-components → extensions}/hidden-sidebar-footer.d.ts +0 -0
  548. /package/dist/domain/{system-components → extensions}/horizontal-tabs.d.ts +0 -0
  549. /package/dist/domain/{system-components → extensions}/multilingual-text-value.d.ts +0 -0
  550. /package/dist/domain/{system-components → extensions}/navigation-steps.d.ts +0 -0
  551. /package/dist/domain/{system-components → extensions}/offset-anchors.d.ts +0 -0
  552. /package/dist/domain/{system-components → extensions}/offset-indicator.d.ts +0 -0
  553. /package/dist/domain/{system-components → extensions}/offset.d.ts +0 -0
  554. /package/dist/domain/{system-components → extensions}/other-action.d.ts +0 -0
  555. /package/dist/domain/{system-components → extensions}/read-sidebar-footer.d.ts +0 -0
  556. /package/dist/domain/{system-components → extensions}/rotatable.d.ts +0 -0
  557. /package/dist/domain/{system-components → extensions}/rotation-handle.d.ts +0 -0
  558. /package/dist/domain/{system-components → extensions}/save-template-thumbnail.d.ts +0 -0
  559. /package/dist/domain/{system-components → extensions}/scene-entity-animation.d.ts +0 -0
  560. /package/dist/domain/{system-components → extensions}/scene-entity-control.d.ts +0 -0
  561. /package/dist/domain/{system-components → extensions}/scene-entity-floor-object.d.ts +0 -0
  562. /package/dist/domain/{system-components → extensions}/scene-entity-wall-object.d.ts +0 -0
  563. /package/dist/domain/{system-components → extensions}/selectable-component.d.ts +0 -0
  564. /package/dist/domain/{system-components → extensions}/sidebar-tabs.d.ts +0 -0
  565. /package/dist/domain/{system-components → extensions}/simple-summary.d.ts +0 -0
  566. /package/dist/domain/{system-components → extensions}/size.d.ts +0 -0
  567. /package/dist/domain/{system-components → extensions}/sketching-draw.d.ts +0 -0
  568. /package/dist/domain/{system-components → extensions}/summary-component.d.ts +0 -0
  569. /package/dist/domain/{system-components → extensions}/text-value.d.ts +0 -0
  570. /package/dist/domain/{system-components → extensions}/tool-controls.d.ts +0 -0
  571. /package/dist/domain/{system-components → extensions}/universal-sidebar-footer.d.ts +0 -0
  572. /package/dist/domain/{system-components → extensions}/view-controls.d.ts +0 -0
package/README.md CHANGED
@@ -99,7 +99,7 @@ The `package.json` `exports` map is the machine-readable list, and the TypeScrip
99
99
 
100
100
  - `pnpm phoenix docs -s "<topic>"` searches the bundled documentation; `phoenix docs -r <path>` reads a page.
101
101
  - `phoenix sync` generates agent skills into `.claude/skills/` and `.agents/skills/`, so coding agents know the project conventions and the CLI.
102
- - Studio, where you sign in and manage projects, has builder guides for getting started, the CLI and deployments.
102
+ - The builder docs at [docs.salsita.ai](https://docs.salsita.ai) have the guides for getting started and the CLI reference; Studio is where you sign in and manage projects.
103
103
  - `pnpm phoenix feedback "<message>"` reaches the team directly.
104
104
 
105
105
  Existing projects may still call the legacy `domain-cli`, `webhook-cli`, `deployment-cli` and `embedding-cli` binaries, which remain installed for compatibility. New automation uses `phoenix`.
@@ -2,7 +2,7 @@ import type { AdminPagesSpec, DataSpec, DomainComponentOptic, NavigationListItem
2
2
  type AdminPageComponent = DomainComponentOptic<any, any, any, any, any, any, SystemComponentTypeConstraint>;
3
3
  type AdminPageNavigationItem = NavigationListItem | NestedNavigationListItem;
4
4
  export declare const createAdminPagesFromSpec: (spec: AdminPagesSpec, dataSpec?: DataSpec) => {
5
- components: (import("../domain/components/domain-component-optic.js").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Admin, import("#package/domain").SystemComponentType<"navigationPanelList", import("#package/domain").NavigationPanelListComponentState, never>> | import("../domain/components/domain-component-optic.js").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Preset, import("#package/domain").SystemComponentType<"attributeSelection", import("#package/domain").AttributeSelectionComponentState, "value">> | AdminPageComponent)[];
5
+ components: (import("#package/domain").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Admin, import("#package/domain").SystemComponentType<"navigationPanelList", import("#package/domain").NavigationPanelListComponentState, never>, unknown> | import("#package/domain").DomainComponentSimpleOptic<import("#package/domain").AnyDomainEntity, import("#package/domain").Admin, import("../domain/admin-domain/__generated/application-types.js").PublishedData, import("../domain/admin-domain/__generated/application-types.js").SessionData, Record<string, unknown>, import("#package/domain").Preset, import("#package/domain").SystemComponentType<"attributeSelection", import("#package/domain").AttributeSelectionComponentState, "value">, unknown> | AdminPageComponent)[];
6
6
  pages: AdminPageNavigationItem[];
7
7
  };
8
8
  export {};
@@ -1,6 +1,6 @@
1
- import{skipApplicationTypeImports as e}from"../../common/index.js";import{generateComponentOpticsCode as n}from"./generate-component-optics.js";import{generateDefaultsBlock as t}from"./generate-defaults.js";import{generateInvariantsBlock as i}from"./generate-invariants.js";import{generateRelationExpressionsCode as a}from"./generate-relation-expressions.js";import{generateStaticValueCode as o}from"./generate-static-value-code.js";import{generateValueExpressionsCode as s}from"./generate-value-expressions.js";let r="@salsita-ai/sdk/domain",m=(e,n,t)=>{let i=[],a=[];for(let o of e.modelVersion.entitySchemas){let e=JSON.stringify(o.shapeSchema,null,2);i.push(`${t}const ${o.entityType} = new DomainEntityReflection<${n}${o.entityType}>('${o.entityType}', [${e}])`),a.push(String(o.entityType))}return{entityDecls:i.join("\n"),entityNames:a}};export const generateDomainBlock=l=>{let{domainSpec:$,invariants:p,actions:c,typePrefix:d,versionNsPrefix:u,isAdmin:y,modelVersionsExportName:h,relationExpressionsExportName:f,componentOpticsExportName:D,valueExpressionsExportName:E,createRecipeExportName:S,imports:R,registerApplicationTypeImports:g=e}=l;R.addImport(r,"$DomainEntityReflection"),R.addImport(r,"DomainBuilder"),R.addImport(r,"DomainComponentOpticBuilder"),R.addImport(r,"DomainEntityReflection"),R.addImport(r,"EnhancedAliasReflection"),R.addImport(r,"InvariantBuilder"),R.addImport(r,"RawAliasReflection"),R.addImport(r,"SchemaReflection"),R.addImport(r,"createCustomExpressionFactory"),R.addImport(r,"createCustomInvariantFactory"),y&&(R.addImport(r,"commonAdminCustomExpressions"),R.addImport(r,"commonAdminViolationExpressions"),R.addImport(r,"createMapPublishedRevisionDataHandlerFactory"),R.addImport(r,"createMapPublishedChunkedDataHandlerFactory"),R.addImport(r,"createDataRowValidatorHandler"),R.addImport(r,"createSheetValidatorHandler")),R.addTypeImport(r,"SchemaOfObject"),c&&(R.addImport(r,"createActionFactory"),R.addTypeImport(r,"ActionDefinition"));let{entityTypes:v,entitySchemas:x}=$.latestModel,A=[...$.latestModel.aliases],j=A.map(([e])=>String(e)),C=j.includes("RootEntity")?"RootEntity":"AnyDomainEntity",{resolvedVersions:I}=$,M=I.latestVersion,w=d?`${d}.`:"",B=new Map([...$.expressions.constants].map(([e,n])=>[String(e),n])),b=(e,n)=>{let t=[...B.get(n)?.keys()??[]],i=t.length>0?`, ${t.map(e=>`'${e}'`).join(" | ")}`:"";return`${e}<${w}$${n}${i}>`},P=e=>{let n=B.get(e);if(!n)return"{}";let t=[...n].map(([e,n])=>{let t=o(n,R).replaceAll("\n","\n ");return` ${e}: ${t},`});return`{
1
+ import{skipApplicationTypeImports as e}from"../../common/index.js";import{generateComponentOpticsCode as n}from"./generate-component-optics.js";import{generateDefaultsBlock as t}from"./generate-defaults.js";import{generateInvariantsBlock as i}from"./generate-invariants.js";import{generateRelationExpressionsCode as a}from"./generate-relation-expressions.js";import{generateStaticValueCode as o}from"./generate-static-value-code.js";import{generateValueExpressionsCode as s}from"./generate-value-expressions.js";let r="@salsita-ai/sdk/domain",m=(e,n,t)=>{let i=[],a=[];for(let o of e.modelVersion.entitySchemas){let e=JSON.stringify(o.shapeSchema,null,2);i.push(`${t}const ${o.entityType} = new DomainEntityReflection<${n}${o.entityType}>('${o.entityType}', [${e}])`),a.push(String(o.entityType))}return{entityDecls:i.join("\n"),entityNames:a}};export const generateDomainBlock=l=>{let{domainSpec:$,invariants:p,actions:c,typePrefix:d,versionNsPrefix:u,isAdmin:y,modelVersionsExportName:h,relationExpressionsExportName:f,componentOpticsExportName:E,valueExpressionsExportName:D,createRecipeExportName:S,imports:R,registerApplicationTypeImports:g=e}=l;R.addImport(r,"$DomainEntityReflection"),R.addImport(r,"DomainBuilder"),R.addImport(r,"DomainComponentOpticBuilder"),R.addImport(r,"DomainEntityReflection"),R.addImport(r,"EnhancedAliasReflection"),R.addImport(r,"InvariantBuilder"),R.addImport(r,"RawAliasReflection"),R.addImport(r,"SchemaReflection"),R.addImport(r,"createCustomExpressionFactory"),R.addImport(r,"createCustomInvariantFactory"),y&&(R.addImport(r,"commonAdminCustomExpressions"),R.addImport(r,"commonAdminViolationExpressions"),R.addImport(r,"createMapPublishedRevisionDataHandlerFactory"),R.addImport(r,"createMapPublishedChunkedDataHandlerFactory"),R.addImport(r,"createDataRowValidatorHandler"),R.addImport(r,"createSheetValidatorHandler")),R.addTypeImport(r,"RuntimeExpressionContext"),R.addTypeImport(r,"SchemaOfObject"),c&&(R.addImport(r,"createActionFactory"),R.addTypeImport(r,"ActionDefinition"));let{entityTypes:v,entitySchemas:x}=$.latestModel,A=[...$.latestModel.aliases],j=A.map(([e])=>String(e)),C=j.includes("RootEntity")?"RootEntity":"AnyDomainEntity",{resolvedVersions:I}=$,M=I.latestVersion,w=d?`${d}.`:"",B=new Map([...$.expressions.constants].map(([e,n])=>[String(e),n])),b=(e,n)=>{let t=[...B.get(n)?.keys()??[]],i=t.length>0?`, ${t.map(e=>`'${e}'`).join(" | ")}`:"";return`${e}<${w}$${n}${i}>`},P=e=>{let n=B.get(e);if(!n)return"{}";let t=[...n].map(([e,n])=>{let t=o(n,R).replaceAll("\n","\n ");return` ${e}: ${t},`});return`{
2
2
  ${t.join("\n")}
3
- }`},k=x.map(e=>{let n=JSON.stringify(e.shapeSchema,null,2);return` const ${e.entityType} = new DomainEntityReflection<${w}${e.entityType}>('${e.entityType}', [${n}])`}),F=A.map(([e,n])=>{let t=n.map(String).join(", ");return` const ${e} = new RawAliasReflection<${w}${e}>('${e}', [${t}])`}),H=[...$.latestModel.commonTypes],V=H.map(([e])=>String(e)),O=I.versionedModels.filter(e=>!e.isLatest).map(e=>`${u}${e.version}`);g(R,[...y?["Admin",...O]:[...v.map(String),...j,...V,...v.map(e=>`$${String(e)}`),...j.map(e=>`$${e}`),"Aliases","$Map",...O,...c?["ActionTypes","NavigationState","ViewState","ToolState","ExportState"]:[]],"PublishedData","SessionData","FrontendData",...y?[]:["BackendData"]]);let T=H.map(([e,n])=>{let t=JSON.stringify(n.runtimeSchema,null,2);return n.schema.enum?.length&&n.schema.enum.every(e=>"string"==typeof e)?` const ${e}: EnumLike<${w}${e}> = new EnumReflection('${e}', ${t}) as EnumLike<${w}${e}>`:` const ${e}: SchemaReflection<${w}${e}> = new SchemaReflection('${e}', ${t})`}),N=[...$.latestModel.shapes],J=N.map(([e,n])=>{let t=JSON.stringify(n.runtimeSchema,null,2);return` const ${e}Shape = new SchemaReflection('${e}Shape', ${t})`}),L=N.map(([e])=>`${e}Shape`),_=j.map(e=>` ${e}: ${e}.types,`).join("\n"),z=j.map(e=>` ${e},`).join("\n"),G=V.map(e=>` ${e},`).join("\n"),q=L.map(e=>` ${e},`).join("\n"),K=v.map(e=>` ${e},`).join("\n"),Q=[];for(let[e,n]of $.expressions.expressions)n.size>0&&Q.push(` const ${e}Expressions = ${JSON.stringify([...n.keys()])}`);let U=v.map(e=>{let n=$.expressions.entityExpressions.get(e),t=(n?.shapeGroups??[]).map(e=>`${e}Expressions`),i=t.length>0?t.map(e=>`...${e}`).join(", "):"",a=b("$DomainEntityReflection",String(e));return` const $${e}: ${a} = new ${a}('${e}', [${i}], ${P(String(e))})`}).join("\n"),W=v.map(e=>` ${e}: $${e},`).join("\n"),X=A.map(([e,n])=>{let t=n.map(e=>JSON.stringify(String(e))).join(", "),i=b("EnhancedAliasReflection",String(e));return` const $${e}: ${i} = new ${i}('$${e}', [${t}], ${P(String(e))})`}).join("\n"),Y=[...v.map(String),...j].map(e=>` $${e},`).join("\n"),Z=[],ee=[];for(let e of I.versionedModels)if(e.isLatest)Z.push(` ${e.version}: entities,`),ee.push(` readonly ${e.version}: {
3
+ }`},k=x.map(e=>{let n=JSON.stringify(e.shapeSchema,null,2);return` const ${e.entityType} = new DomainEntityReflection<${w}${e.entityType}>('${e.entityType}', [${n}])`}),F=A.map(([e,n])=>{let t=n.map(String).join(", ");return` const ${e} = new RawAliasReflection<${w}${e}>('${e}', [${t}])`}),H=[...$.latestModel.commonTypes],T=H.map(([e])=>String(e)),V=I.versionedModels.filter(e=>!e.isLatest).map(e=>`${u}${e.version}`);g(R,[...y?["Admin",...V]:[...v.map(String),...j,...T,...v.map(e=>`$${String(e)}`),...j.map(e=>`$${e}`),"Aliases","$Map",...V,...c?["ActionTypes","NavigationState","ViewState","ToolState","ExportState"]:[]],"PublishedData","SessionData","FrontendData",...y?[]:["BackendData"]]);let O=H.map(([e,n])=>{let t=JSON.stringify(n.runtimeSchema,null,2);return n.schema.enum?.length&&n.schema.enum.every(e=>"string"==typeof e)?` const ${e}: EnumLike<${w}${e}> = new EnumReflection('${e}', ${t}) as EnumLike<${w}${e}>`:` const ${e}: SchemaReflection<${w}${e}> = new SchemaReflection('${e}', ${t})`}),N=[...$.latestModel.shapes],J=N.map(([e,n])=>{let t=JSON.stringify(n.runtimeSchema,null,2);return` const ${e}Shape = new SchemaReflection('${e}Shape', ${t})`}),L=N.map(([e])=>`${e}Shape`),_=j.map(e=>` ${e}: ${e}.types,`).join("\n"),z=j.map(e=>` ${e},`).join("\n"),G=T.map(e=>` ${e},`).join("\n"),q=L.map(e=>` ${e},`).join("\n"),K=v.map(e=>` ${e},`).join("\n"),Q=[];for(let[e,n]of $.expressions.expressions)n.size>0&&Q.push(` const ${e}Expressions = ${JSON.stringify([...n.keys()])}`);let U=v.map(e=>{let n=$.expressions.entityExpressions.get(e),t=(n?.shapeGroups??[]).map(e=>`${e}Expressions`),i=t.length>0?t.map(e=>`...${e}`).join(", "):"",a=b("$DomainEntityReflection",String(e));return` const $${e}: ${a} = new ${a}('${e}', [${i}], ${P(String(e))})`}).join("\n"),W=v.map(e=>` ${e}: $${e},`).join("\n"),X=A.map(([e,n])=>{let t=n.map(e=>JSON.stringify(String(e))).join(", "),i=b("EnhancedAliasReflection",String(e));return` const $${e}: ${i} = new ${i}('$${e}', [${t}], ${P(String(e))})`}).join("\n"),Y=[...v.map(String),...j].map(e=>` $${e},`).join("\n"),Z=[],ee=[];for(let e of I.versionedModels)if(e.isLatest)Z.push(` ${e.version}: entities,`),ee.push(` readonly ${e.version}: {
4
4
  ${v.map(e=>` readonly ${String(e)}: DomainEntityReflection<${w}${String(e)}>`).join("\n")}
5
5
  }`);else{let n=`${u}${e.version}.`,{entityDecls:t,entityNames:i}=m(e,n," "),a=i.map(e=>` ${e},`).join("\n");Z.push(` ${e.version}: (() => {
6
6
  ${t}
@@ -9,34 +9,34 @@ ${a}
9
9
  } as const
10
10
  })(),`),ee.push(` readonly ${e.version}: {
11
11
  ${i.map(e=>` readonly ${e}: DomainEntityReflection<${n}${e}>`).join("\n")}
12
- }`)}let en=y?"adminDomainBuilder":"domainBuilder",et=y?"attachAdminComponent":"attachComponent",ei=y?"implementAdminCustomExpressions":"implementCustomExpressions",ea=y?"implementCustomAdminInvariants":"implementCustomInvariants",eo=y?"adminInvariantBuilder":"invariantBuilder",es=y?"adminModel":"model",er=y?"adminEnhancedModel":"enhancedModel",em=y?"implementAdminRelation":"implementRelation",el=y?"__adminDomain":"__configuratorDomain",e$="PublishedData, SessionData, FrontendData",ep=`${w}AnyDomainEntity, ${w}RootEntity, ${w}$Map, ${e$}, ${w}Aliases`,ec=`<${ep}>`,ed=i(p,ep,R),eu=(e,n)=>e===n?e:`${e}: ${n}`,ey=[...$.expressions.expressions.values()].some(e=>[...e.values()].some(e=>"relation"===e.implementation.kind));ey&&R.addImport(r,"createRelationFactory");let eh=ey?`
12
+ }`)}let en=y?"adminDomainBuilder":"domainBuilder",et=y?"attachAdminComponent":"attachComponent",ei=y?"implementAdminCustomExpressions":"implementCustomExpressions",ea=y?"implementCustomAdminInvariants":"implementCustomInvariants",eo=y?"adminInvariantBuilder":"invariantBuilder",es=y?"adminModel":"model",er=y?"adminEnhancedModel":"enhancedModel",em=y?"implementAdminRelation":"implementRelation",el=y?"__adminDomain":"__configuratorDomain",e$="PublishedData, SessionData, FrontendData",ep=`${w}AnyDomainEntity, ${w}RootEntity, ${w}$Map, ${e$}, ${w}Aliases`,ec=`<${ep}>`,ed=`RuntimeExpressionContext<${w}AnyDomainEntity>`,eu=`<${ep}, ${ed}>`,ey=i(p,ep,ed,R),eh=(e,n)=>e===n?e:`${e}: ${n}`,ef=[...$.expressions.expressions.values()].some(e=>[...e.values()].some(e=>"relation"===e.implementation.kind));ef&&R.addImport(r,"createRelationFactory");let eE=ef?`
13
13
  const ${em} = createRelationFactory${ec}(aliases)
14
14
 
15
- const relationExpressions = ${a($.expressions,em)}`:"\n const relationExpressions = {} as const",ef=`
16
- const componentOptics = ${n($.components,R)}`,eD=`
17
- const valueExpressions = ${s($.expressions,R,"implementCustomExpressions",y?{PresetCategory:"commonAdminCustomExpressions.PresetCategory"}:{})}`;R.addImport(r,"RecipeFactoryBuilder");let eE=t($.defaults,R),eS=[...c?.values()??[]].map(e=>({name:String(e.name),...void 0===e.description?{}:{description:e.description},params:e.paramsSchema})),eR=c?`
18
- const actionDefinitions: readonly ActionDefinition[] = ${JSON.stringify(eS,null,2).replaceAll("\n","\n ")}
15
+ const relationExpressions = ${a($.expressions,em)}`:"\n const relationExpressions = {} as const",eD=`
16
+ const componentOptics = ${n($.components,R)}`,eS=`
17
+ const valueExpressions = ${s($.expressions,R,"implementCustomExpressions",y?{PresetCategory:"commonAdminCustomExpressions.PresetCategory"}:{})}`;R.addImport(r,"RecipeFactoryBuilder");let eR=t($.defaults,R),eg=[...c?.values()??[]].map(e=>({name:String(e.name),...void 0===e.description?{}:{description:e.description},params:e.paramsSchema})),ev=c?`
18
+ const actionDefinitions: readonly ActionDefinition[] = ${JSON.stringify(eg,null,2).replaceAll("\n","\n ")}
19
19
 
20
- const implementActions = createActionFactory<${w}AnyDomainEntity, ${w}RootEntity, ${w}$Map, ${e$}, NavigationState, ViewState, ToolState, ExportState, ActionTypes>()`:"",eg=`
20
+ const implementActions = createActionFactory<${w}AnyDomainEntity, ${w}RootEntity, ${w}$Map, ${e$}, NavigationState, ViewState, ToolState, ExportState, ActionTypes, ${ed}>()`:"",ex=`
21
21
  const createRecipe = RecipeFactoryBuilder.forAliases<${w}AnyDomainEntity, ${w}Aliases>(aliases)
22
22
  .forEntities(AnyDomainEntity.reflections)
23
23
  .withDefaults(defaults)
24
- .build()`,ev=[...v.map(e=>` readonly ${String(e)}: DomainEntityReflection<${w}${String(e)}>`),...j.map(e=>` readonly ${e}: RawAliasReflection<${w}${e}>`),...H.map(([e,n])=>{let t=n.schema.enum?.length&&n.schema.enum.every(e=>"string"==typeof e)?"EnumLike":"SchemaReflection";return` readonly ${e}: ${t}<${w}${e}>`}),...L.map(e=>` readonly ${e}: SchemaReflection<unknown>`)].join("\n"),ex=`{
25
- ${ev}
26
- }`,eA=[...v.map(e=>` readonly $${String(e)}: ${b("$DomainEntityReflection",String(e))}`),...j.map(e=>` readonly $${e}: ${b("EnhancedAliasReflection",e)}`)].join("\n"),ej=`{
24
+ .build()`,eA=[...v.map(e=>` readonly ${String(e)}: DomainEntityReflection<${w}${String(e)}>`),...j.map(e=>` readonly ${e}: RawAliasReflection<${w}${e}>`),...H.map(([e,n])=>{let t=n.schema.enum?.length&&n.schema.enum.every(e=>"string"==typeof e)?"EnumLike":"SchemaReflection";return` readonly ${e}: ${t}<${w}${e}>`}),...L.map(e=>` readonly ${e}: SchemaReflection<unknown>`)].join("\n"),ej=`{
27
25
  ${eA}
28
- }`,eC=`{
26
+ }`,eC=[...v.map(e=>` readonly $${String(e)}: ${b("$DomainEntityReflection",String(e))}`),...j.map(e=>` readonly $${e}: ${b("EnhancedAliasReflection",e)}`)].join("\n"),eI=`{
27
+ ${eC}
28
+ }`,eM=`{
29
29
  ${ee.join("\n")}
30
30
  }`;return`const ${el} = (() => {
31
31
  const modelVersion = ${M}
32
32
 
33
- ${eE}
33
+ ${eR}
34
34
 
35
35
  ${k.join("\n")}
36
36
 
37
37
  ${F.join("\n")}
38
38
 
39
- ${T.join("\n")}
39
+ ${O.join("\n")}
40
40
 
41
41
  ${J.join("\n")}
42
42
 
@@ -66,22 +66,22 @@ ${W}
66
66
  ${Y}
67
67
  } as const
68
68
 
69
- const implementCustomExpressions = createCustomExpressionFactory${ec}({})
70
- ${eR}${eh}
71
- ${eD}
69
+ const implementCustomExpressions = createCustomExpressionFactory${eu}({})
70
+ ${ev}${eE}
71
+ ${eS}
72
72
 
73
73
  const modelVersions = {
74
74
  ${Z.join("\n")}
75
75
  } as const
76
- const attachComponent = DomainComponentOpticBuilder.from${ec}(aliases)
76
+ const attachComponent = DomainComponentOpticBuilder.from${eu}(aliases)
77
77
 
78
- ${ed}
78
+ ${ey}
79
79
  const invariantBuilder = new InvariantBuilder${ec}(aliases)${y?"\n .withInvariants(implementCustomInvariants(commonAdminViolationExpressions))":""}
80
80
  ${y?`
81
81
  const createMapPublishedRevisionDataHandler = createMapPublishedRevisionDataHandlerFactory<${w}AnyDomainEntity, ${w}RootEntity, ${w}$Map, PublishedData>()
82
82
  const createMapPublishedChunkedDataHandler = createMapPublishedChunkedDataHandlerFactory<${w}AnyDomainEntity, ${w}RootEntity, ${w}$Map>()
83
- `:""}${ef}
84
- ${eg}
83
+ `:""}${eD}
84
+ ${ex}
85
85
 
86
86
  return {
87
87
  domainBuilder: DomainBuilder.from${ec}(
@@ -113,21 +113,21 @@ ${eg}
113
113
  })()
114
114
 
115
115
  const {
116
- ${eu("domainBuilder",en)},
117
- ${eu("attachComponent",et)},
118
- ${eu("implementCustomExpressions",ei)},
119
- ${eu("implementCustomInvariants",ea)},
120
- ${eu("invariantBuilder",eo)},${y?`
116
+ ${eh("domainBuilder",en)},
117
+ ${eh("attachComponent",et)},
118
+ ${eh("implementCustomExpressions",ei)},
119
+ ${eh("implementCustomInvariants",ea)},
120
+ ${eh("invariantBuilder",eo)},${y?`
121
121
  createMapPublishedRevisionDataHandler,
122
122
  createMapPublishedChunkedDataHandler,`:`
123
123
  implementActions,`}
124
- ${eu("relationExpressions",f)},
125
- ${eu("valueExpressions",E)},
126
- ${eu("componentOptics",D)},
127
- ${eu("createRecipe",S)},
124
+ ${eh("relationExpressions",f)},
125
+ ${eh("valueExpressions",D)},
126
+ ${eh("componentOptics",E)},
127
+ ${eh("createRecipe",S)},
128
128
  } = ${el}
129
129
 
130
- const ${es}: ${ex} = ${el}.model
131
- const ${er}: ${ej} = ${el}.enhancedModel
132
- const ${h}: ${eC} = ${el}.modelVersions
133
- export { ${en}, ${et}, ${ei}, ${ea}, ${eo}, ${es}, ${er}, ${f}, ${E}, ${D}, ${h}, ${S}${y?", createMapPublishedRevisionDataHandler, createMapPublishedChunkedDataHandler, createDataRowValidatorHandler, createSheetValidatorHandler":", implementActions"} }`};
130
+ const ${es}: ${ej} = ${el}.model
131
+ const ${er}: ${eI} = ${el}.enhancedModel
132
+ const ${h}: ${eM} = ${el}.modelVersions
133
+ export { ${en}, ${et}, ${ei}, ${ea}, ${eo}, ${es}, ${er}, ${f}, ${D}, ${E}, ${h}, ${S}${y?", createMapPublishedRevisionDataHandler, createMapPublishedChunkedDataHandler, createDataRowValidatorHandler, createSheetValidatorHandler":", implementActions"} }`};
@@ -1,4 +1,4 @@
1
1
  import type { Invariants } from '../../../../parse-application-files/index.js';
2
2
  import type { CodeImports } from '../../common/index.js';
3
3
  /** Emits the custom-invariant blueprint and factory declarations for one generated domain block. */
4
- export declare const generateInvariantsBlock: (invariants: Invariants, factoryGenerics: string, imports: CodeImports) => string;
4
+ export declare const generateInvariantsBlock: (invariants: Invariants, factoryGenerics: string, contextExtension: string, imports: CodeImports) => string;
@@ -1 +1 @@
1
- import{stringifyMsgMacroCode as t}from"../../../../core/index.js";let i=(i,o)=>"string"==typeof i?JSON.stringify(i):(o.addImport("@lingui/core/macro","msg"),t(i)),o=t=>"static"===t.kind?"boolean":t.violationTypes.map(t=>JSON.stringify(String(t))).join(" | ");export const generateInvariantsBlock=(t,e,n)=>{let{entries:r}=t,s=[" interface CustomInvariantBlueprints {"];for(let[t,i]of Object.entries(r)){for(let[e,n]of(s.push(` ${t}: {`),Object.entries(i)))s.push(` ${e}: ${o(n)}`);s.push(" }")}for(let[t,o]of(s.push(" }"," const staticViolations = {"),Object.entries(r))){let e=Object.values(o).filter(t=>"static"===t.kind);if(0!==e.length){for(let o of(s.push(` ${t}: {`),e)){let t=[`type: ${JSON.stringify(String(o.violationType))}`,`severity: ${JSON.stringify(o.severity)}`,`message: ${i(o.message,n)}`];void 0!==o.controlViolationPriority&&t.push(`controlViolationPriority: ${o.controlViolationPriority}`),s.push(` ${o.name}: { ${t.join(", ")} },`)}s.push(" },")}}return s.push(" } as const",` const implementCustomInvariants = createCustomInvariantFactory<${e}, CustomInvariantBlueprints>()(staticViolations)`),s.join("\n")};
1
+ import{stringifyMsgMacroCode as t}from"../../../../core/index.js";let i=(i,o)=>"string"==typeof i?JSON.stringify(i):(o.addImport("@lingui/core/macro","msg"),t(i)),o=t=>"static"===t.kind?"boolean":t.violationTypes.map(t=>JSON.stringify(String(t))).join(" | ");export const generateInvariantsBlock=(t,e,n,r)=>{let{entries:s}=t,a=[" interface CustomInvariantBlueprints {"];for(let[t,i]of Object.entries(s)){for(let[e,n]of(a.push(` ${t}: {`),Object.entries(i)))a.push(` ${e}: ${o(n)}`);a.push(" }")}for(let[t,o]of(a.push(" }"," const staticViolations = {"),Object.entries(s))){let e=Object.values(o).filter(t=>"static"===t.kind);if(0!==e.length){for(let o of(a.push(` ${t}: {`),e)){let t=[`type: ${JSON.stringify(String(o.violationType))}`,`severity: ${JSON.stringify(o.severity)}`,`message: ${i(o.message,r)}`];void 0!==o.controlViolationPriority&&t.push(`controlViolationPriority: ${o.controlViolationPriority}`),a.push(` ${o.name}: { ${t.join(", ")} },`)}a.push(" },")}}return a.push(" } as const",` const implementCustomInvariants = createCustomInvariantFactory<${e}, CustomInvariantBlueprints, ${n}>()(staticViolations)`),a.join("\n")};
@@ -39,6 +39,10 @@ export const generateApplicationSpecEnvExample=()=>`# This file documents develo
39
39
  # FORCE_REBUILD=false
40
40
  # USE_APPLICATION_SPEC=true
41
41
  # IS_DEV=true
42
+ # A development environment keeps the assistant thread when the assistant setup
43
+ # (manifest, instructions, AI settings) changes. Set to true to lock the thread
44
+ # on a setup change, as every other environment does.
45
+ # ASSISTANT_STRICT_THREADS=false
42
46
  #
43
47
  # Persistence mode controls how configurator state is stored.
44
48
  # Options: 'server' (default), 'local-storage', 'memory'
@@ -1,11 +1,11 @@
1
- let e=e=>`webhookHandlers${e}`;export const generateApplicationSpecWebhookBuilders=(t,o)=>{let i=t.appMetadata.useClerk?` clerk: {
1
+ let t=t=>`webhookHandlers${t}`;export const generateApplicationSpecWebhookBuilders=(e,o)=>{let i=e.appMetadata.useClerk?` clerk: {
2
2
  apiKey: phx.webhooksEnv.CLERK_API_KEY,
3
3
  authorizedParties: [phx.webhooksEnv.FRONTEND_URL, phx.webhooksEnv.RESOURCES_URL],
4
4
  jwtSecret: phx.webhooksEnv.JWT_SECRET_BASE64,
5
5
  oauthClientId: phx.webhooksEnv.OAUTH_PROVIDER_CLIENT_ID,
6
6
  oauthClientSecret: phx.webhooksEnv.OAUTH_PROVIDER_CLIENT_SECRET,
7
7
  oauthProviderBaseUrl: phx.webhooksEnv.OAUTH_PROVIDER_BASE_URL,
8
- },`:"",r=o.map((t,o)=>{let i=e(o),r=t.replace(/\.tsx?$/,".js");return`import ${i} from '../${r}'`}).join("\n"),n=o.length>0,s=o.map((t,o)=>`{ origin: '${t}', exports: ${e(o)} }`),a=`[${s.join(", ")}]`,l=n?`
8
+ },`:"",r=o.map((e,o)=>{let i=t(o),r=e.replace(/\.tsx?$/,".js");return`import ${i} from '../${r}'`}).join("\n"),n=o.length>0,s=o.map((e,o)=>`{ origin: '${e}', exports: ${t(o)} }`),a=`[${s.join(", ")}]`,l=n?`
9
9
  .withHandlers(${a})`:"";return`// Auto-generated by application-spec pipeline. Do not edit.
10
10
  import { createDomainWebhook } from '@salsita-ai/sdk/webhook'
11
11
  import type { DeploymentAssistant } from '@salsita-ai/sdk/contracts/assistant'
@@ -16,7 +16,7 @@ import { customAdminComponentOptics } from './admin-domain-code.js'
16
16
  ${r?`
17
17
  ${r}
18
18
  `:""}
19
- const $assistantServerSettings: Pick<DeploymentAssistant, 'instructions' | 'ai'> | null = ${JSON.stringify(t.configurator.assistantServerSettings?{instructions:t.configurator.assistantServerSettings.instructions??void 0,ai:t.configurator.assistantServerSettings.ai}:null)}
19
+ const $assistantServerSettings: Pick<DeploymentAssistant, 'instructions' | 'ai'> | null = ${JSON.stringify(e.configurator.assistantServerSettings?{instructions:e.configurator.assistantServerSettings.instructions??void 0,ai:e.configurator.assistantServerSettings.ai}:null)}
20
20
 
21
21
  const webhookConfiguratorBuilder = configuratorBuilder
22
22
  .withComponentOptics(customComponentOptics)
@@ -37,6 +37,7 @@ export const {
37
37
  configuratorBuilder: webhookConfiguratorBuilder,
38
38
  createI18n,
39
39
  assistantServerSettings: $assistantServerSettings,
40
+ assistantStrictThreads: phx.webhooksEnv.ASSISTANT_STRICT_THREADS,
40
41
  ${i}
41
42
  })
42
43
 
@@ -1,6 +1,6 @@
1
- import{generateEnvReader as e}from"../common/env-reader.js";import{autoHeader as r}from"../common/file-headers.js";let t={IS_DEV:{type:"bool",default:!1,devDefault:!0},AWS_S3_PUBLIC_RESOURCES_BUCKET:{type:"str",required:!0},AWS_S3_RESOURCES_REGION:{type:"str",required:!0},DEPLOYMENT_RESOURCES_PATH:{type:"str",default:"deployment-resources"}},o={CLERK_API_KEY:{type:"str",required:!0},FRONTEND_URL:{type:"str",required:!0},JWT_SECRET_BASE64:{type:"str",required:!0},OAUTH_PROVIDER_CLIENT_ID:{type:"str",required:!0},OAUTH_PROVIDER_CLIENT_SECRET:{type:"str",required:!0},OAUTH_PROVIDER_BASE_URL:{type:"str",required:!0},RESOURCES_URL:{type:"str",required:!0}};export const generateApplicationSpecWebhooksConfig=i=>{let n=i.infra.env?.webhook??{},R=i.appMetadata.useClerk?o:{},{imports:E,config:p}=e({...t,...R,...n}),s=E.length>0?`import { ${E.join(", ")} } from 'envalid'
1
+ import{generateEnvReader as e}from"../common/env-reader.js";import{autoHeader as r}from"../common/file-headers.js";let t={IS_DEV:{type:"bool",default:!1,devDefault:!0},ASSISTANT_STRICT_THREADS:{type:"bool",default:!1},AWS_S3_PUBLIC_RESOURCES_BUCKET:{type:"str",required:!0},AWS_S3_RESOURCES_REGION:{type:"str",required:!0},DEPLOYMENT_RESOURCES_PATH:{type:"str",default:"deployment-resources"}},o={CLERK_API_KEY:{type:"str",required:!0},FRONTEND_URL:{type:"str",required:!0},JWT_SECRET_BASE64:{type:"str",required:!0},OAUTH_PROVIDER_CLIENT_ID:{type:"str",required:!0},OAUTH_PROVIDER_CLIENT_SECRET:{type:"str",required:!0},OAUTH_PROVIDER_BASE_URL:{type:"str",required:!0},RESOURCES_URL:{type:"str",required:!0}};export const generateApplicationSpecWebhooksConfig=i=>{let n=i.infra.env?.webhook??{},R=i.appMetadata.useClerk?o:{},{imports:E,config:p}=e({...t,...R,...n}),_=E.length>0?`import { ${E.join(", ")} } from 'envalid'
2
2
  `:"";return`${r("webhooks.config.ts","Runtime environment config for the webhook server.")}
3
- ${s}import { createEnvReader } from '@salsita-ai/sdk/common/env'
3
+ ${_}import { createEnvReader } from '@salsita-ai/sdk/common/env'
4
4
 
5
5
  const readRuntimeConfig = createEnvReader(${p})
6
6
 
@@ -1 +1 @@
1
- import{isArray as e}from"@salsita-ai/common/utils";import{buildAssistantManifest as t}from"#package/domain";import{DiagnosticCode as r,diagnosticMessages as i}from"../../../../errors/index.js";import{ASSISTANT_HINTS as n}from"../../../raw-spec/index.js";import{createSchemaRefResolver as s,isNullableSchema as o,phxDefinitionRefName as a}from"../../common/index.js";import{resolveAssistantFieldType as l}from"./assistant-field-type.js";let p="AnyDomainEntity",S={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},N={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},T=new Set(["id","type","meta"]),d=new Set(["Query","Mutation","Navigation","RecipeGroup","Recipe","DryRun","DryRunError","FieldOption","JSON","String","Int","Float","Boolean","ID"]),c=(e,t)=>{if(!t||0===t.length)return e;let r=`One of: ${t.map(e=>`"${e}"`).join(", ")}.`;return e?/[.!?]$/.test(e)?`${e} ${r}`:`${e}. ${r}`:r},f=new Set(["id","type"]),m="The raw stored value: a string, a message descriptor or a multilingual object.",A=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],u=(e,t,{model:r,components:i})=>{let n=new Set([e,...[...r.aliases].filter(([,t])=>t.includes(e)).map(([e])=>e)]);return i.filter(({componentName:e,typeOrAlias:r})=>e===t&&n.has(r)).map(({instanceName:e})=>String(e))},_=(...e)=>n.filter(t=>e.some(e=>e?.includes(t))),E=(e,t,n,s)=>{let{model:o}=n,a=new Map,l=new Map;for(let[p,{groups:S,hints:N}]of Object.entries(e)){let e=o.entityTypes.find(e=>e===p),T=e?[e]:[...o.aliases].find(([e])=>e===p)?.[1];if(!T){s.at(p).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE(t.section,p));continue}for(let[e,o]of(T.forEach(e=>l.set(e,_(l.get(e),N))),Object.entries(S))){let l=s.at(p,"groups",e),S=`${p}.groups.${e}`,N={groupId:o?.as??e,instanceName:e,...o?.description===void 0?{}:{description:o.description},dryRuns:o?.allowDryRuns??!0};for(let s of T){let o=u(s,t.component,n),T=a.get(s)??[],d=T.find(e=>e.group.groupId===N.groupId);o.includes(e)?d?l.error(r.ASSISTANT_DUPLICATE_RECIPE_GROUP,i.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,s,N.groupId,[d.entry,S])):a.set(s,[...T,{group:N,entry:S,entryCtx:l}]):l.error(r.ASSISTANT_UNKNOWN_RECIPE_GROUP,i.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,p,e,s,o))}}}let p=o.entityTypes.flatMap(e=>{let t=a.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(p.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:l,metaEntries:new Map(p.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},I=e=>`${e}Meta`,O=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,y=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},h=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t),o={...r,nonNull:!1},a=n?`${c(s,i)??""} ${m}`.trim():c(s,i);return{type:{...n?{kind:"scalar",name:"JSON",nonNull:!1}:o,nonNull:r.nonNull},...void 0===a?{}:{description:a}}},g=(t,r)=>{let i=(t=>{let r=y(t),i=r?.type==="array"&&r.items&&!e(r.items)?y(r.items):void 0,n=i??r;if(n?.$ref!==void 0&&"$DomainEntity"===a(n.$ref))return{target:n.references??p,list:void 0!==i}})(t);if(i)return{kind:"edge",...i,nullable:o(t,r),...void 0===t.description?{}:{description:t.description}};let{type:n,enumValues:s,localized:S,description:N}=l(t,r),T=c(N,s);return S?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:n.nonNull},description:`${N??""} ${m}`.trim()}:{kind:"value",type:n,...void 0===T?{}:{description:T}}},v=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t);return{type:{kind:"value",type:r},localized:!0===n,description:s,enumValues:i}},R=(e,t,n,s,o)=>{let a=t.startsWith("$")?((e,t,n,s)=>{let o=((e,t,{expressions:r,entityTypes:i})=>{let n=i.find(t=>t===e);for(let i of void 0===n?[e]:r.entityExpressions.get(n)?.shapeGroups??[]){let e=[...r.expressions.get(i)?.values()??[]].find(e=>e.name===t);if(e?.declaredSchema)return{implementation:e.implementation,declaredSchema:e.declaredSchema}}})(e.name,t,n);if(!o)return void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:a}=o;if("violations"===a.kind)return void s.error(r.ASSISTANT_UNSUPPORTED_EXPRESSION,i.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===a.kind){let[{target:e,cardinality:t}]=a.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return v(o.declaredSchema,n.resolveRef)})(e,t,s,o):((e,t,{resolveRef:n},s)=>{let o=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return o?v(o,n):void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,s,o);if(!a)return;let l=n?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return T.has(l)?void o.error(r.ASSISTANT_RESERVED_FIELD_NAME,i.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,l)):{name:l,source:t,type:a.type,localized:a.localized,description:c(n?.description??a.description,a.enumValues),describedByManifest:n?.description!==void 0,enumValues:a.enumValues,valueDescription:n?.description??a.description}},M=(e,t,n,s,o)=>{let a=new Map,l=new Set(n);for(let s of[...t.flat(),...n]){let t=a.get(s.name);t?t.source!==s.source?o.error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,s.name,[t.source,s.source])):l.has(s)&&s.describedByManifest&&a.set(s.name,{...t,description:s.description,describedByManifest:!0,valueDescription:s.valueDescription}):a.set(s.name,s)}return[...a.values()].map(e=>{let t=e.enumValues&&s(e.source);return t?{...e,enumValues:t,description:c(e.valueDescription,t)}:e})};export const resolveAssistantManifest=(e,{model:t,states:n,phxDefinitions:o,expressions:a,components:T,actions:y},v)=>{let b=v.errors.length,D=v.at("entities"),C=s(t.commonTypes,o);for(let e of t.resolvedShapes.keys())d.has(e)&&v.error(r.ASSISTANT_RESERVED_TYPE_NAME,i.ASSISTANT_RESERVED_TYPE_NAME(e,[...d]));let P=((e,t,r)=>{let i=new Map;for(let n of e){let e=[];for(let[i,s]of Object.entries(n.entries)){let o=R(n,i,s,t,r.at(n.name,i));o&&e.push(o)}i.set(n.name,e)}return i})(((e,t,n)=>{let s=[];for(let[r,i]of t.resolvedShapes){let t=e[r];t&&s.push({name:r,shape:i,entries:t})}let o=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))o.has(t)||n.at(t).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("entities",t));return s})(e.entities??{},t,D),{resolveRef:C,expressions:a,entityTypes:t.entityTypes},D),U=M(p,[],P.get(p)??[],()=>void 0,v),j=new Map([[p,U]]);for(let e of t.aliases.keys())e!==p&&j.set(e,M(e,[U],P.get(e)??[],()=>void 0,v));for(let e of t.entityTypes){let r=[p,...[...t.aliases].filter(([t,r])=>t!==p&&r.includes(e)).map(([e])=>e)],i=[...t.resolvedShapes].find(([t])=>t===e)?.[1];j.set(e,M(e,r.map(e=>j.get(e)??[]),P.get(e)??[],e=>{let t=Object.entries(i?.properties??{}).find(([t])=>t===e)?.[1];return t&&l(t,C).enumValues},v))}let L=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((j.get(e)??[]).map(({name:e,source:t,localized:r})=>[e,r?{source:t,localized:!0}:{source:t}]))])),$=E(e.childRecipes??{},S,{model:t,components:T},v.at("childRecipes")),w=E(e.replaceRecipes??{},N,{model:t,components:T},v.at("replaceRecipes")),W=((e,t,n)=>{let s=new Set;for(let o of Object.keys(e)){let e=t.entityTypes.find(e=>e===o),a=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1];a?a.forEach(e=>s.add(e)):n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("deletable",o))}return t.entityTypes.filter(e=>s.has(e))})(e.deletable??{},t,v.at("deletable")),F=((e,t,n)=>{let{model:s}=t,o=((e,t,n)=>{let s=new Map;for(let[o,a]of Object.entries(e)){let e=t.entityTypes.find(e=>e===o),l=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1],p=[...t.resolvedShapes].find(([e])=>e===o)?.[1];if(!l||!p){n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("writable",o));continue}for(let e of Object.keys(a)){let t=n.at(o,e);e.startsWith("$")||f.has(e)?t.error(r.ASSISTANT_NOT_WRITABLE,i.ASSISTANT_NOT_WRITABLE(o,e)):A(p.properties,e)?l.forEach(t=>{let r=s.get(t)??new Map;s.set(t,r.has(e)?r:r.set(e,o))}):t.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("writable",o,e))}}return s})(e,s,n);return s.entityTypes.flatMap(e=>{let a=[...s.resolvedShapes].find(([t])=>t===e)?.[1],p=[...o.get(e)??[]].flatMap(([s,o])=>{let p=a&&A(a.properties,s);return(p&&((e,{property:t,writableKey:n},s,{resolveRef:o,exposed:a,sources:p},S)=>{let N=Object.entries(A(p,e)??{}),T=a.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===T?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void S.at(n,t).error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${n}.${t}`));let{type:f,enumValues:u,localized:_,description:E}=l(s,o),I={...f,nonNull:!1},O=T??t,y=void 0===T?c(E,u):void 0;return _?{name:O,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:y?`${y} ${m}`:m}:{name:O,property:t,type:I,...void 0===y?{}:{description:y}}})(e,{property:s,writableKey:o},p,t,n))??[]});return p.length>0?[{entityType:e,fields:p}]:[]})})(e.writable??{},{model:t,resolveRef:C,exposed:P,sources:L},v.at("writable")),k=((e,t,n,s)=>{let{model:o}=n,a=new Map;for(let[l,p]of Object.entries(e)){let e=o.entityTypes.find(e=>e===l),T=e?[e]:[...o.aliases].find(([e])=>e===l)?.[1]??[];for(let[e,o]of Object.entries(p)){let p=o?.options;if(!p)continue;let d=s.at(l,e,"options"),c=`${l}.${e}`;for(let s of T){let o=t.find(e=>e.entityType===s)?.fields.find(t=>t.property===e);if(!o)continue;let l=p.as??`${o.name}Options`,T=u(s,p.componentType,n),f=a.get(s)??[],m=f.find(e=>e.options.edgeName===l||e.options.field===o.name);if(T.includes(p.instanceName))if(l===S.section||l===N.section)d.error(r.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,i.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(c,l,o.name));else if(m)d.error(r.ASSISTANT_DUPLICATE_OPTIONS_EDGE,i.ASSISTANT_DUPLICATE_OPTIONS_EDGE(s,m.options.edgeName===l?{edgeName:l}:{field:o.name},[m.entry,c]));else{let e={field:o.name,edgeName:l,componentType:p.componentType,instanceName:p.instanceName,validate:p.validate??!0,dryRuns:p.allowDryRuns??!0};a.set(s,[...f,{options:e,hints:_(p.hints),entry:c,entryCtx:d}])}else d.error(r.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,i.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(c,p,s,T))}}}return a})(e.writable??{},F,{model:t,components:T},v.at("writable"));var K=[$.metaEntries,w.metaEntries,new Map([...k].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[]))];for(let e of t.entityTypes){let n=K.flatMap(t=>t.get(e)??[])[0],s=I(e);n&&[...t.resolvedShapes.keys()].some(e=>e===s)&&n.error(r.ASSISTANT_META_TYPE_NAME_CONFLICT,i.ASSISTANT_META_TYPE_NAME_CONFLICT(e,s))}let Y=t.entityTypes.filter(e=>($.groups[e]?.length??0)>0||(w.groups[e]?.length??0)>0||(k.get(e)?.length??0)>0).map(I),V=((e,{actions:t,resolveRef:n,builtInMutations:s,typeNames:o},a)=>{let l=[],p=[...t.values()].map(e=>String(e.name));for(let[S,N]of Object.entries(e)){let e=a.at(S),T=[...t.values()].find(e=>e.name===S);if(!T){e.error(r.ASSISTANT_UNKNOWN_ACTION,i.ASSISTANT_UNKNOWN_ACTION(S,p));continue}let d=N?.as??S,c=l.find(e=>e.fieldName===d),f=O(d);if(s.has(d)||c){e.error(r.ASSISTANT_MUTATION_NAME_CONFLICT,i.ASSISTANT_MUTATION_NAME_CONFLICT(S,d,c?`"assistant.actions.${c.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(o.has(f)||l.some(e=>O(e.fieldName)===f)){e.error(r.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,i.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(S,d,f));continue}let m=N?.description??T.description;l.push({fieldName:d,actionName:S,...void 0===m?{}:{description:m},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,h(t,n)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,g(t,n)]))})}return l})(e.actions??{},{actions:y,resolveRef:C,builtInMutations:new Set(["deleteEntity",S.mutation,N.mutation,...F.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...d,...t.resolvedShapes.keys(),...Y])},v.at("actions"));if(!(v.errors.length>b))return{entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:n.navigationStates,viewStates:n.viewStates,toolStates:n.toolStates},deletableTypes:W,writableTypes:F,actionFields:V,childRecipes:Object.fromEntries(Object.entries($.groups).map(([e,t])=>[e,{groups:t,hints:$.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(w.groups).map(([e,t])=>[e,{groups:t,hints:w.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...k].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),fields:Object.fromEntries([...j].map(([e,t])=>[e,t.map(e=>({name:e.name,source:e.source,localized:e.localized,type:e.type,...void 0===e.description?{}:{description:e.description}}))]))}};export const createAssistantSchema=(e,n,s)=>{let o=resolveAssistantManifest(e,n,s);if(o)try{return{...t(o),resolved:o}}catch(e){s.error(r.ASSISTANT_INVALID_SCHEMA,i.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
1
+ import{isArray as e}from"@salsita-ai/common/utils";import{buildAssistantManifest as t}from"#package/domain";import{DiagnosticCode as r,diagnosticMessages as i}from"../../../../errors/index.js";import{ASSISTANT_HINTS as n}from"../../../raw-spec/index.js";import{createSchemaRefResolver as s,isNullableSchema as o,phxDefinitionRefName as a}from"../../common/index.js";import{resolveAssistantFieldType as l}from"./assistant-field-type.js";let p="AnyDomainEntity",S={section:"childRecipes",component:"childEntityRecipes",mutation:"addChild"},N={section:"replaceRecipes",component:"replaceEntityRecipes",mutation:"replaceEntity"},T=new Set(["id","type","meta"]),d=new Set(["Query","Mutation","Navigation","RecipeGroup","Recipe","DryRun","DryRunError","FieldOption","JSON","String","Int","Float","Boolean","ID"]),c=(e,t)=>{if(!t||0===t.length)return e;let r=`One of: ${t.map(e=>`"${e}"`).join(", ")}.`;return e?/[.!?]$/.test(e)?`${e} ${r}`:`${e}. ${r}`:r},f=new Set(["id","type"]),m="A string, a message descriptor or a multilingual object; passed without translation.",A=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],u=(e,t,{model:r,components:i})=>{let n=new Set([e,...[...r.aliases].filter(([,t])=>t.includes(e)).map(([e])=>e)]);return i.filter(({componentName:e,typeOrAlias:r})=>e===t&&n.has(r)).map(({instanceName:e})=>String(e))},_=(...e)=>n.filter(t=>e.some(e=>e?.includes(t))),E=(e,t,n,s)=>{let{model:o}=n,a=new Map,l=new Map;for(let[p,{groups:S,hints:N}]of Object.entries(e)){let e=o.entityTypes.find(e=>e===p),T=e?[e]:[...o.aliases].find(([e])=>e===p)?.[1];if(!T){s.at(p).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE(t.section,p));continue}for(let[e,o]of(T.forEach(e=>l.set(e,_(l.get(e),N))),Object.entries(S))){let l=s.at(p,"groups",e),S=`${p}.groups.${e}`,N={groupId:o?.as??e,instanceName:e,...o?.description===void 0?{}:{description:o.description},dryRuns:o?.allowDryRuns??!0};for(let s of T){let o=u(s,t.component,n),T=a.get(s)??[],d=T.find(e=>e.group.groupId===N.groupId);o.includes(e)?d?l.error(r.ASSISTANT_DUPLICATE_RECIPE_GROUP,i.ASSISTANT_DUPLICATE_RECIPE_GROUP(t,s,N.groupId,[d.entry,S])):a.set(s,[...T,{group:N,entry:S,entryCtx:l}]):l.error(r.ASSISTANT_UNKNOWN_RECIPE_GROUP,i.ASSISTANT_UNKNOWN_RECIPE_GROUP(t,p,e,s,o))}}}let p=o.entityTypes.flatMap(e=>{let t=a.get(e);return t?[{entityType:e,groups:t}]:[]});return{groups:Object.fromEntries(p.map(({entityType:e,groups:t})=>[e,t.map(({group:e})=>e)])),hints:l,metaEntries:new Map(p.flatMap(({entityType:e,groups:[t]})=>t?[[e,t.entryCtx]]:[]))}},I=e=>`${e}Meta`,O=e=>`${e.charAt(0).toUpperCase()+e.slice(1)}Result`,y=e=>{let t=(({anyOf:e,oneOf:t})=>[...e??[],...t??[]].filter(e=>"null"!==e.type))(e);return e.$ref||1!==t.length?e:t[0]},h=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t),o={...r,nonNull:!1},a=n?`${c(s,i)??""} ${m}`.trim():c(s,i);return{type:{...n?{kind:"scalar",name:"JSON",nonNull:!1}:o,nonNull:r.nonNull},...void 0===a?{}:{description:a}}},g=(t,r)=>{let i=(t=>{let r=y(t),i=r?.type==="array"&&r.items&&!e(r.items)?y(r.items):void 0,n=i??r;if(n?.$ref!==void 0&&"$DomainEntity"===a(n.$ref))return{target:n.references??p,list:void 0!==i}})(t);if(i)return{kind:"edge",...i,nullable:o(t,r),...void 0===t.description?{}:{description:t.description}};let{type:n,enumValues:s,localized:S,description:N}=l(t,r),T=c(N,s);return S?{kind:"value",type:{kind:"scalar",name:"JSON",nonNull:n.nonNull},description:`${N??""} ${m}`.trim()}:{kind:"value",type:n,...void 0===T?{}:{description:T}}},v=(e,t)=>{let{type:r,enumValues:i,localized:n,description:s}=l(e,t);return{type:{kind:"value",type:r},localized:!0===n,description:s,enumValues:i}},R=(e,t,n,s,o)=>{let a=t.startsWith("$")?((e,t,n,s)=>{let o=((e,t,{expressions:r,entityTypes:i})=>{let n=i.find(t=>t===e);for(let i of void 0===n?[e]:r.entityExpressions.get(n)?.shapeGroups??[]){let e=[...r.expressions.get(i)?.values()??[]].find(e=>e.name===t);if(e?.declaredSchema)return{implementation:e.implementation,declaredSchema:e.declaredSchema}}})(e.name,t,n);if(!o)return void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t));let{implementation:a}=o;if("violations"===a.kind)return void s.error(r.ASSISTANT_UNSUPPORTED_EXPRESSION,i.ASSISTANT_UNSUPPORTED_EXPRESSION(e.name,t));if("relation"===a.kind){let[{target:e,cardinality:t}]=a.params;return{type:{kind:"edge",target:e,cardinality:t},localized:!1,description:void 0}}return v(o.declaredSchema,n.resolveRef)})(e,t,s,o):((e,t,{resolveRef:n},s)=>{let o=Object.entries(e.shape.properties).find(([e])=>e===t)?.[1];return o?v(o,n):void s.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("entities",e.name,t))})(e,t,s,o);if(!a)return;let l=n?.as??(t.startsWith("$")?`_${t.slice(1)}`:t);return T.has(l)?void o.error(r.ASSISTANT_RESERVED_FIELD_NAME,i.ASSISTANT_RESERVED_FIELD_NAME(e.name,t,l)):{name:l,source:t,type:a.type,localized:a.localized,description:c(n?.description??a.description,a.enumValues),describedByManifest:n?.description!==void 0,enumValues:a.enumValues,valueDescription:n?.description??a.description}},M=(e,t,n,s,o)=>{let a=new Map,l=new Set(n);for(let s of[...t.flat(),...n]){let t=a.get(s.name);t?t.source!==s.source?o.error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,s.name,[t.source,s.source])):l.has(s)&&s.describedByManifest&&a.set(s.name,{...t,description:s.description,describedByManifest:!0,valueDescription:s.valueDescription}):a.set(s.name,s)}return[...a.values()].map(e=>{let t=e.enumValues&&s(e.source);return t?{...e,enumValues:t,description:c(e.valueDescription,t)}:e})};export const resolveAssistantManifest=(e,{model:t,states:n,phxDefinitions:o,expressions:a,components:T,actions:y},v)=>{let b=v.errors.length,D=v.at("entities"),C=s(t.commonTypes,o);for(let e of t.resolvedShapes.keys())d.has(e)&&v.error(r.ASSISTANT_RESERVED_TYPE_NAME,i.ASSISTANT_RESERVED_TYPE_NAME(e,[...d]));let P=((e,t,r)=>{let i=new Map;for(let n of e){let e=[];for(let[i,s]of Object.entries(n.entries)){let o=R(n,i,s,t,r.at(n.name,i));o&&e.push(o)}i.set(n.name,e)}return i})(((e,t,n)=>{let s=[];for(let[r,i]of t.resolvedShapes){let t=e[r];t&&s.push({name:r,shape:i,entries:t})}let o=new Set(t.resolvedShapes.keys());for(let t of Object.keys(e))o.has(t)||n.at(t).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("entities",t));return s})(e.entities??{},t,D),{resolveRef:C,expressions:a,entityTypes:t.entityTypes},D),U=M(p,[],P.get(p)??[],()=>void 0,v),j=new Map([[p,U]]);for(let e of t.aliases.keys())e!==p&&j.set(e,M(e,[U],P.get(e)??[],()=>void 0,v));for(let e of t.entityTypes){let r=[p,...[...t.aliases].filter(([t,r])=>t!==p&&r.includes(e)).map(([e])=>e)],i=[...t.resolvedShapes].find(([t])=>t===e)?.[1];j.set(e,M(e,r.map(e=>j.get(e)??[]),P.get(e)??[],e=>{let t=Object.entries(i?.properties??{}).find(([t])=>t===e)?.[1];return t&&l(t,C).enumValues},v))}let L=Object.fromEntries(t.entityTypes.map(e=>[e,Object.fromEntries((j.get(e)??[]).map(({name:e,source:t,localized:r})=>[e,r?{source:t,localized:!0}:{source:t}]))])),$=E(e.childRecipes??{},S,{model:t,components:T},v.at("childRecipes")),w=E(e.replaceRecipes??{},N,{model:t,components:T},v.at("replaceRecipes")),W=((e,t,n)=>{let s=new Set;for(let o of Object.keys(e)){let e=t.entityTypes.find(e=>e===o),a=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1];a?a.forEach(e=>s.add(e)):n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("deletable",o))}return t.entityTypes.filter(e=>s.has(e))})(e.deletable??{},t,v.at("deletable")),F=((e,t,n)=>{let{model:s}=t,o=((e,t,n)=>{let s=new Map;for(let[o,a]of Object.entries(e)){let e=t.entityTypes.find(e=>e===o),l=e?[e]:[...t.aliases].find(([e])=>e===o)?.[1],p=[...t.resolvedShapes].find(([e])=>e===o)?.[1];if(!l||!p){n.at(o).error(r.ASSISTANT_UNKNOWN_TYPE,i.ASSISTANT_UNKNOWN_TYPE("writable",o));continue}for(let e of Object.keys(a)){let t=n.at(o,e);e.startsWith("$")||f.has(e)?t.error(r.ASSISTANT_NOT_WRITABLE,i.ASSISTANT_NOT_WRITABLE(o,e)):A(p.properties,e)?l.forEach(t=>{let r=s.get(t)??new Map;s.set(t,r.has(e)?r:r.set(e,o))}):t.error(r.ASSISTANT_UNKNOWN_FIELD,i.ASSISTANT_UNKNOWN_FIELD("writable",o,e))}}return s})(e,s,n);return s.entityTypes.flatMap(e=>{let a=[...s.resolvedShapes].find(([t])=>t===e)?.[1],p=[...o.get(e)??[]].flatMap(([s,o])=>{let p=a&&A(a.properties,s);return(p&&((e,{property:t,writableKey:n},s,{resolveRef:o,exposed:a,sources:p},S)=>{let N=Object.entries(A(p,e)??{}),T=a.get(e)?.find(({source:e})=>e===t)?.name??N.find(([,{source:e}])=>e===t)?.[0],d=void 0===T?N.find(([e])=>e===t)?.[1]:void 0;if(d)return void S.at(n,t).error(r.ASSISTANT_FIELD_NAME_CONFLICT,i.ASSISTANT_FIELD_NAME_CONFLICT(e,t,[d.source,t],`${n}.${t}`));let{type:f,enumValues:u,localized:_,description:E}=l(s,o),I={...f,nonNull:!1},O=T??t,y=void 0===T?c(E,u):void 0;return _?{name:O,property:t,type:{kind:"scalar",name:"JSON",nonNull:!1},description:y?`${y} ${m}`:m}:{name:O,property:t,type:I,...void 0===y?{}:{description:y}}})(e,{property:s,writableKey:o},p,t,n))??[]});return p.length>0?[{entityType:e,fields:p}]:[]})})(e.writable??{},{model:t,resolveRef:C,exposed:P,sources:L},v.at("writable")),k=((e,t,n,s)=>{let{model:o}=n,a=new Map;for(let[l,p]of Object.entries(e)){let e=o.entityTypes.find(e=>e===l),T=e?[e]:[...o.aliases].find(([e])=>e===l)?.[1]??[];for(let[e,o]of Object.entries(p)){let p=o?.options;if(!p)continue;let d=s.at(l,e,"options"),c=`${l}.${e}`;for(let s of T){let o=t.find(e=>e.entityType===s)?.fields.find(t=>t.property===e);if(!o)continue;let l=p.as??`${o.name}Options`,T=u(s,p.componentType,n),f=a.get(s)??[],m=f.find(e=>e.options.edgeName===l||e.options.field===o.name);if(T.includes(p.instanceName))if(l===S.section||l===N.section)d.error(r.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME,i.ASSISTANT_RESERVED_OPTIONS_EDGE_NAME(c,l,o.name));else if(m)d.error(r.ASSISTANT_DUPLICATE_OPTIONS_EDGE,i.ASSISTANT_DUPLICATE_OPTIONS_EDGE(s,m.options.edgeName===l?{edgeName:l}:{field:o.name},[m.entry,c]));else{let e={field:o.name,edgeName:l,componentType:p.componentType,instanceName:p.instanceName,validate:p.validate??!0,dryRuns:p.allowDryRuns??!0};a.set(s,[...f,{options:e,hints:_(p.hints),entry:c,entryCtx:d}])}else d.error(r.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT,i.ASSISTANT_UNKNOWN_OPTIONS_COMPONENT(c,p,s,T))}}}return a})(e.writable??{},F,{model:t,components:T},v.at("writable"));var K=[$.metaEntries,w.metaEntries,new Map([...k].flatMap(([e,[t]])=>t?[[e,t.entryCtx]]:[]))];for(let e of t.entityTypes){let n=K.flatMap(t=>t.get(e)??[])[0],s=I(e);n&&[...t.resolvedShapes.keys()].some(e=>e===s)&&n.error(r.ASSISTANT_META_TYPE_NAME_CONFLICT,i.ASSISTANT_META_TYPE_NAME_CONFLICT(e,s))}let Y=t.entityTypes.filter(e=>($.groups[e]?.length??0)>0||(w.groups[e]?.length??0)>0||(k.get(e)?.length??0)>0).map(I),V=((e,{actions:t,resolveRef:n,builtInMutations:s,typeNames:o},a)=>{let l=[],p=[...t.values()].map(e=>String(e.name));for(let[S,N]of Object.entries(e)){let e=a.at(S),T=[...t.values()].find(e=>e.name===S);if(!T){e.error(r.ASSISTANT_UNKNOWN_ACTION,i.ASSISTANT_UNKNOWN_ACTION(S,p));continue}let d=N?.as??S,c=l.find(e=>e.fieldName===d),f=O(d);if(s.has(d)||c){e.error(r.ASSISTANT_MUTATION_NAME_CONFLICT,i.ASSISTANT_MUTATION_NAME_CONFLICT(S,d,c?`"assistant.actions.${c.actionName}" already exposes`:"the built-in mutation of that name already takes"));continue}if(o.has(f)||l.some(e=>O(e.fieldName)===f)){e.error(r.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT,i.ASSISTANT_ACTION_RESULT_TYPE_CONFLICT(S,d,f));continue}let m=N?.description??T.description;l.push({fieldName:d,actionName:S,...void 0===m?{}:{description:m},args:Object.fromEntries(Object.entries(T.params).map(([e,{schema:t}])=>[e,h(t,n)])),result:Object.fromEntries(Object.entries(T.result).map(([e,t])=>[e,g(t,n)]))})}return l})(e.actions??{},{actions:y,resolveRef:C,builtInMutations:new Set(["deleteEntity",S.mutation,N.mutation,...F.map(({entityType:e})=>`modify${e}`)]),typeNames:new Set([...d,...t.resolvedShapes.keys(),...Y])},v.at("actions"));if(!(v.errors.length>b))return{entityTypes:t.entityTypes,aliases:Object.fromEntries(t.aliases),exampleType:t.rootEntityTypes[0]??t.entityTypes[0],states:{navigationStates:n.navigationStates,viewStates:n.viewStates,toolStates:n.toolStates},deletableTypes:W,writableTypes:F,actionFields:V,childRecipes:Object.fromEntries(Object.entries($.groups).map(([e,t])=>[e,{groups:t,hints:$.hints.get(e)??[]}])),replaceRecipes:Object.fromEntries(Object.entries(w.groups).map(([e,t])=>[e,{groups:t,hints:w.hints.get(e)??[]}])),optionsEdges:Object.fromEntries([...k].map(([e,t])=>[e,t.map(({options:e,hints:t})=>({options:e,hints:t}))])),fields:Object.fromEntries([...j].map(([e,t])=>[e,t.map(e=>({name:e.name,source:e.source,localized:e.localized,type:e.type,...void 0===e.description?{}:{description:e.description}}))]))}};export const createAssistantSchema=(e,n,s)=>{let o=resolveAssistantManifest(e,n,s);if(o)try{return{...t(o),resolved:o}}catch(e){s.error(r.ASSISTANT_INVALID_SCHEMA,i.ASSISTANT_INVALID_SCHEMA([e instanceof Error?e.message:String(e)]));return}};
@@ -1,6 +1,6 @@
1
1
  import type { AccessLevel } from '@salsita-ai/contracts/api';
2
2
  import { type ChatStreamChunk } from '@salsita-ai/contracts/chat';
3
- import { type AssistantChatConnection, type AuthorizedPhoenixApiClient, type ChatToolCall, type ChatToolCallResult, type ConfigurationPayload, type ConfigurationSchema, type waitForFinalizationResultSettings } from './contract.js';
3
+ import { type AssistantChatConnection, type AssistantEarlierThread, type AssistantThreadCompaction, type AuthorizedPhoenixApiClient, type ChatToolCall, type ChatToolCallResult, type ConfigurationPayload, type ConfigurationSchema, type waitForFinalizationResultSettings } from './contract.js';
4
4
  import type { components } from './phoenix-api.js';
5
5
  export declare class AuthorizedClient<FINALIZE_DATA extends Record<string, unknown>, FINALIZE_RESULT extends Record<string, unknown>, FRONTEND_DATA extends Record<string, unknown>> implements AuthorizedPhoenixApiClient<FINALIZE_DATA, FINALIZE_RESULT, FRONTEND_DATA> {
6
6
  private readonly _baseUrl;
@@ -26,6 +26,8 @@ export declare class AuthorizedClient<FINALIZE_DATA extends Record<string, unkno
26
26
  getSpeechToText: (configurationId: string, blob: Blob) => Promise<string>;
27
27
  getTextToSpeech: (configurationId: string, content: string) => Promise<Blob>;
28
28
  getAssistantChatConnection: (configurationId: string) => AssistantChatConnection;
29
+ compactAssistantThread: (configurationId: string) => Promise<AssistantThreadCompaction>;
30
+ getAssistantEarlierThread: (configurationId: string, threadId: string, limit: number) => Promise<AssistantEarlierThread>;
29
31
  sendMessage: (configurationId: string, content: string, context?: Record<string, string>) => Promise<ReadableStream<ChatStreamChunk>>;
30
32
  sendToolCallResults: (configurationId: string, calls: ChatToolCall[], results: ChatToolCallResult[], agent?: string) => Promise<ReadableStream<ChatStreamChunk>>;
31
33
  generateShareLink: (configurationId: string, revisionId: string, expiration: number, access: AccessLevel, baseUrl: string | undefined) => Promise<{
@@ -1 +1 @@
1
- import{match as t}from"ts-pattern";import{InfoError as a}from"@salsita-ai/common/utils";import{isChatError as e}from"@salsita-ai/contracts/chat";import{createApiBaseClient as r}from"./base-client.js";import{InvalidAccessKeyError as i}from"./contract.js";let o=()=>new TransformStream({transform(t,a){a.enqueue(t)}}),n=async(t,a)=>{for(;;){let{done:r,value:i}=await t.read();if(r){await a.close();break}for(let t of i.split("\n").filter(t=>""!==t.trim()).map(t=>JSON.parse(t))){if(e(t))return void await a.abort(Error(t.error));await a.write(t)}}},s=(e,r)=>{let o=`${r} API request failed: ${JSON.stringify(e)}`;return t(e).with({statusCode:403,invalidAccessKey:!0},()=>new i).with({statusCode:403},()=>new a(o)).otherwise(()=>Error(o))};export class AuthorizedClient{_baseUrl;_getAccessToken;_getSessionToken;_client;constructor(t,a,e){this._baseUrl=t,this._getAccessToken=a,this._getSessionToken=e,this._client=r(this._baseUrl)}_authHeaders=async()=>{let t=this._getAccessToken(),a=await this._getSessionToken();return{"X-Access-Key":t,Authorization:`Bearer ${a}`}};getConfiguration=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}",{params:{path:{configurationId:t}},headers:a});if(e.error)throw s(e.error,"getConfiguration");return e.data};updateConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.PUT("/configurations/{configurationId}",{params:{path:{configurationId:t}},body:a,headers:e});if(r.error)throw s(r.error,"updateConfiguration");return r.data};finalize=async(t,a,e,r,i)=>{let o=await this._authHeaders(),n=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/finalize",{params:{path:{configurationId:t,finalizationUuid:a},query:{locale:r}},body:{finalizeData:e,frontendData:i},headers:o});if(n.error)throw s(n.error,"finalize")};waitForFinalizationToComplete=async(t,a,e)=>{let r=e?.pollingFrequency??500,i=Math.ceil((e?.pollingTimeout??3e4)/r);for(let e=0;e<i;e++){let e=await this._authHeaders(),i=await this._client.GET("/configurations/{configurationId}/{finalizationUuid}/state",{params:{path:{configurationId:t,finalizationUuid:a}},headers:e});if(i.error)throw s(i.error,"getFinalizeJobState");let o=i.data;if("completed"===o.state)return o.result[0];if("failed"===o.state)throw Error("finalization failed");if("unknown"===o.state)throw Error("finalization state is unknown");await new Promise(t=>setTimeout(t,r))}throw Error("finalization did not complete within the specified timeout")};getConfigurationRevision=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/revisions/{revisionId}",{params:{path:{configurationId:t,revisionId:a}},headers:e});if(r.error)throw s(r.error,"getConfigurationRevision");return r.data};getChatConversation=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}/chat",{params:{path:{configurationId:t}},headers:a});if(e.error)throw s(e.error,"getChatConversation");return e.data};getSpeechToText=async(t,a)=>{let e=await this._authHeaders(),r=new FormData;r.append("voiceFile",a,"voice.wav");let i=await this._client.POST("/configurations/{configurationId}/chat/stt",{params:{path:{configurationId:t}},headers:e,body:r,bodySerializer:()=>r});if(i.error)throw s(i.error,"getSpeechToText");return i.data.text};getTextToSpeech=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/chat/tts",{params:{path:{configurationId:t}},body:{content:a},headers:e,parseAs:"arrayBuffer"});if(r.error)throw s(r.error,"getTextToSpeech");return new Blob([r.data],{type:"audio/mp3"})};getAssistantChatConnection=t=>({url:new URL(`configurations/${encodeURIComponent(t)}/assistant/chat`,`${this._baseUrl}/`).toString(),headers:this._authHeaders});sendMessage=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/chat/message",{params:{path:{configurationId:t}},body:{content:a,context:e},headers:r,parseAs:"stream"});if(i.error)throw s(i.error,"sendMessage");let h=i.data?.pipeThrough(new TextDecoderStream).getReader();if(!h)throw Error("sendMessage API response did not contain a readable stream");let l=o();return n(h,l.writable.getWriter()),l.readable};sendToolCallResults=async(t,a,e,r)=>{let i=await this._authHeaders(),h=await this._client.POST("/configurations/{configurationId}/chat/tool-calls",{params:{path:{configurationId:t}},body:{agent:r,calls:a,results:e},headers:i,parseAs:"stream"});if(h.error)throw s(h.error,"sendToolCallResults");let l=h.data?.pipeThrough(new TextDecoderStream).getReader();if(!l)throw Error("sendMessage API response did not contain a readable stream");let c=o();return n(l,c.writable.getWriter()),c.readable};generateShareLink=async(t,a,e,r,i)=>{let o=await this._authHeaders(),n=await this._client.POST("/configurations/{configurationId}/share-link",{params:{path:{configurationId:t}},body:{revisionId:a,expiration:e,access:r,baseUrl:i},headers:o});if(n.error)throw s(n.error,"generateShareLink");return n.data};generateUploadLinks=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/image-upload-links",{params:{path:{configurationId:t,finalizationUuid:a}},body:{names:e},headers:r});if(i.error)throw s(i.error,"generateUploadLinks");return i.data.links};getConfigurationPublicUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/public/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw s(r.error,"getConfigurationPublicUploadLink");return r.data};getConfigurationPrivateUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw s(r.error,"getConfigurationPrivateUploadLink");return r.data};getConfigurationPrivateResourceLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw s(r.error,"getConfigurationPrivateUploadLink");return r.data};cloneConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/revisions/{revisionId}/clone",{params:{path:{configurationId:t,revisionId:a}},headers:{...e,"Content-Type":null}});if(r.error)throw s(r.error,"cloneConfiguration");return r.data}}
1
+ import{match as t}from"ts-pattern";import{InfoError as a}from"@salsita-ai/common/utils";import{isChatError as e}from"@salsita-ai/contracts/chat";import{createApiBaseClient as r}from"./base-client.js";import{AssistantRequestError as i,InvalidAccessKeyError as o}from"./contract.js";let n=()=>new TransformStream({transform(t,a){a.enqueue(t)}}),s=async(t,a)=>{for(;;){let{done:r,value:i}=await t.read();if(r){await a.close();break}for(let t of i.split("\n").filter(t=>""!==t.trim()).map(t=>JSON.parse(t))){if(e(t))return void await a.abort(Error(t.error));await a.write(t)}}},h=(e,r)=>{let i=`${r} API request failed: ${JSON.stringify(e)}`;return t(e).with({statusCode:403,invalidAccessKey:!0},()=>new o).with({statusCode:403},()=>new a(i)).otherwise(()=>Error(i))};export class AuthorizedClient{_baseUrl;_getAccessToken;_getSessionToken;_client;constructor(t,a,e){this._baseUrl=t,this._getAccessToken=a,this._getSessionToken=e,this._client=r(this._baseUrl)}_authHeaders=async()=>{let t=this._getAccessToken(),a=await this._getSessionToken();return{"X-Access-Key":t,Authorization:`Bearer ${a}`}};getConfiguration=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}",{params:{path:{configurationId:t}},headers:a});if(e.error)throw h(e.error,"getConfiguration");return e.data};updateConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.PUT("/configurations/{configurationId}",{params:{path:{configurationId:t}},body:a,headers:e});if(r.error)throw h(r.error,"updateConfiguration");return r.data};finalize=async(t,a,e,r,i)=>{let o=await this._authHeaders(),n=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/finalize",{params:{path:{configurationId:t,finalizationUuid:a},query:{locale:r}},body:{finalizeData:e,frontendData:i},headers:o});if(n.error)throw h(n.error,"finalize")};waitForFinalizationToComplete=async(t,a,e)=>{let r=e?.pollingFrequency??500,i=Math.ceil((e?.pollingTimeout??3e4)/r);for(let e=0;e<i;e++){let e=await this._authHeaders(),i=await this._client.GET("/configurations/{configurationId}/{finalizationUuid}/state",{params:{path:{configurationId:t,finalizationUuid:a}},headers:e});if(i.error)throw h(i.error,"getFinalizeJobState");let o=i.data;if("completed"===o.state)return o.result[0];if("failed"===o.state)throw Error("finalization failed");if("unknown"===o.state)throw Error("finalization state is unknown");await new Promise(t=>setTimeout(t,r))}throw Error("finalization did not complete within the specified timeout")};getConfigurationRevision=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/revisions/{revisionId}",{params:{path:{configurationId:t,revisionId:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationRevision");return r.data};getChatConversation=async t=>{let a=await this._authHeaders(),e=await this._client.GET("/configurations/{configurationId}/chat",{params:{path:{configurationId:t}},headers:a});if(e.error)throw h(e.error,"getChatConversation");return e.data};getSpeechToText=async(t,a)=>{let e=await this._authHeaders(),r=new FormData;r.append("voiceFile",a,"voice.wav");let i=await this._client.POST("/configurations/{configurationId}/chat/stt",{params:{path:{configurationId:t}},headers:e,body:r,bodySerializer:()=>r});if(i.error)throw h(i.error,"getSpeechToText");return i.data.text};getTextToSpeech=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/chat/tts",{params:{path:{configurationId:t}},body:{content:a},headers:e,parseAs:"arrayBuffer"});if(r.error)throw h(r.error,"getTextToSpeech");return new Blob([r.data],{type:"audio/mp3"})};getAssistantChatConnection=t=>({url:new URL(`configurations/${encodeURIComponent(t)}/assistant/chat`,`${this._baseUrl}/`).toString(),headers:this._authHeaders});compactAssistantThread=async t=>{let a=await this._authHeaders(),e=await this._client.POST("/configurations/{configurationId}/assistant/chat/compact",{params:{path:{configurationId:t}},headers:{...a,"Content-Type":null}});if(e.error)throw new i(`compactAssistantThread API request failed: ${JSON.stringify(e.error)}`,e.response.status);return e.data};getAssistantEarlierThread=async(t,a,e)=>{let r=await this._authHeaders(),o=await this._client.GET("/configurations/{configurationId}/assistant/chat/threads/{threadId}",{params:{path:{configurationId:t,threadId:a},query:{limit:e}},headers:r});if(o.error)throw new i(`getAssistantEarlierThread API request failed: ${JSON.stringify(o.error)}`,o.response.status);let{messages:n}=o.data;return{threadId:a,messages:Array.isArray(n)?n:[],previousThreadId:o.response.headers.get("x-assistant-previous-thread")}};sendMessage=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/chat/message",{params:{path:{configurationId:t}},body:{content:a,context:e},headers:r,parseAs:"stream"});if(i.error)throw h(i.error,"sendMessage");let o=i.data?.pipeThrough(new TextDecoderStream).getReader();if(!o)throw Error("sendMessage API response did not contain a readable stream");let c=n();return s(o,c.writable.getWriter()),c.readable};sendToolCallResults=async(t,a,e,r)=>{let i=await this._authHeaders(),o=await this._client.POST("/configurations/{configurationId}/chat/tool-calls",{params:{path:{configurationId:t}},body:{agent:r,calls:a,results:e},headers:i,parseAs:"stream"});if(o.error)throw h(o.error,"sendToolCallResults");let c=o.data?.pipeThrough(new TextDecoderStream).getReader();if(!c)throw Error("sendMessage API response did not contain a readable stream");let u=n();return s(c,u.writable.getWriter()),u.readable};generateShareLink=async(t,a,e,r,i)=>{let o=await this._authHeaders(),n=await this._client.POST("/configurations/{configurationId}/share-link",{params:{path:{configurationId:t}},body:{revisionId:a,expiration:e,access:r,baseUrl:i},headers:o});if(n.error)throw h(n.error,"generateShareLink");return n.data};generateUploadLinks=async(t,a,e)=>{let r=await this._authHeaders(),i=await this._client.POST("/configurations/{configurationId}/{finalizationUuid}/image-upload-links",{params:{path:{configurationId:t,finalizationUuid:a}},body:{names:e},headers:r});if(i.error)throw h(i.error,"generateUploadLinks");return i.data.links};getConfigurationPublicUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/public/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPublicUploadLink");return r.data};getConfigurationPrivateUploadLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private/upload",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPrivateUploadLink");return r.data};getConfigurationPrivateResourceLink=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.GET("/configurations/{configurationId}/resources/{key}/private",{params:{path:{configurationId:t,key:a}},headers:e});if(r.error)throw h(r.error,"getConfigurationPrivateUploadLink");return r.data};cloneConfiguration=async(t,a)=>{let e=await this._authHeaders(),r=await this._client.POST("/configurations/{configurationId}/revisions/{revisionId}/clone",{params:{path:{configurationId:t,revisionId:a}},headers:{...e,"Content-Type":null}});if(r.error)throw h(r.error,"cloneConfiguration");return r.data}}
@@ -1,3 +1,4 @@
1
+ import type { UIMessage } from '@tanstack/ai-client';
1
2
  import type { AccessLevel } from '@salsita-ai/contracts/api';
2
3
  import type { ChatStreamChunk } from '@salsita-ai/contracts/chat';
3
4
  import type { DomainEntity } from '#package/domain';
@@ -88,6 +89,17 @@ export interface AuthorizedPhoenixApiClient<FINALIZE_DATA extends Record<string,
88
89
  getChatConversation: (configurationId: string) => Promise<ChatConversation>;
89
90
  /** Where and how to reach the experimental assistant chat of the configuration. */
90
91
  getAssistantChatConnection: (configurationId: string) => AssistantChatConnection;
92
+ /**
93
+ * Continues the assistant thread of the configuration, which the server no longer lets this session
94
+ * continue, in a new thread that starts from a summary of it. Rejects with an
95
+ * {@link AssistantRequestError} when the server refuses.
96
+ */
97
+ compactAssistantThread: (configurationId: string) => Promise<AssistantThreadCompaction>;
98
+ /**
99
+ * Reads a closed assistant thread of the configuration that a later thread continues, at most
100
+ * `limit` of its newest messages. Rejects with an {@link AssistantRequestError} when the server refuses.
101
+ */
102
+ getAssistantEarlierThread: (configurationId: string, threadId: string, limit: number) => Promise<AssistantEarlierThread>;
91
103
  getSpeechToText: (configurationId: string, blob: Blob) => Promise<string>;
92
104
  getTextToSpeech: (configurationId: string, text: string) => Promise<Blob>;
93
105
  sendMessage: (configurationId: string, message: string, state?: Record<string, string>) => Promise<ReadableStream<ChatStreamChunk>>;
@@ -118,6 +130,28 @@ export interface AssistantChatConnection {
118
130
  */
119
131
  readonly headers: () => Promise<Record<string, string>>;
120
132
  }
133
+ /** An assistant thread that was closed, and the thread that continues it. */
134
+ export interface AssistantThreadCompaction {
135
+ /** The new thread, which the chat of the configuration now runs on. */
136
+ readonly threadId: string;
137
+ /** The closed thread the new one continues. */
138
+ readonly previousThreadId: string;
139
+ }
140
+ /** A closed assistant thread, as the panel paints it above the thread that continues it. */
141
+ export interface AssistantEarlierThread {
142
+ readonly threadId: string;
143
+ readonly messages: ReadonlyArray<UIMessage>;
144
+ /** The thread this one continues in turn; `null` when it is the first of the conversation. */
145
+ readonly previousThreadId: string | null;
146
+ }
147
+ /** A request about an assistant thread that the server answered with a failure. */
148
+ export declare class AssistantRequestError extends Error {
149
+ /** The HTTP status of the answer, which tells a refusal from an outage. */
150
+ readonly status: number;
151
+ constructor(message: string,
152
+ /** The HTTP status of the answer, which tells a refusal from an outage. */
153
+ status: number);
154
+ }
121
155
  export declare class InvalidDeploymentError extends Error {
122
156
  constructor();
123
157
  }
@@ -1 +1 @@
1
- export class InvalidDeploymentError extends Error{constructor(){super(),this.name="InvalidDeployment",this.message="The referenced deployment is invalid."}}export class InvalidAccessKeyError extends Error{constructor(){super("The access token is no longer valid because it expired or the server rejected it. Open the configuration from a fresh link."),this.name="InvalidAccessKey"}}export class ChunkNotFoundError extends Error{chunkKey;constructor(e){super(`Published chunk "${e}" not found`),this.chunkKey=e,this.name="ChunkNotFound"}}export class OAuthStaleConnectionError extends Error{constructor(){super("OAuth connection is stale"),this.name="OAuthStaleConnectionError"}}export class ConfigurationSchemaMismatchError extends Error{details;constructor(e){super("Preset data does not match the configuration schema registered on the server. Why: the preset/demo entity data was changed without re-registering the schema, or the schema drifted. Fix: re-register/redeploy the domain schema, or update the preset data to match the current schema."),this.details=e,this.name="ConfigurationSchemaMismatchError"}}export const isConfigurationSchemaMismatchError=e=>e instanceof ConfigurationSchemaMismatchError;
1
+ export class AssistantRequestError extends Error{status;constructor(e,r){super(e),this.status=r,this.name="AssistantRequestError"}}export class InvalidDeploymentError extends Error{constructor(){super(),this.name="InvalidDeployment",this.message="The referenced deployment is invalid."}}export class InvalidAccessKeyError extends Error{constructor(){super("The access token is no longer valid because it expired or the server rejected it. Open the configuration from a fresh link."),this.name="InvalidAccessKey"}}export class ChunkNotFoundError extends Error{chunkKey;constructor(e){super(`Published chunk "${e}" not found`),this.chunkKey=e,this.name="ChunkNotFound"}}export class OAuthStaleConnectionError extends Error{constructor(){super("OAuth connection is stale"),this.name="OAuthStaleConnectionError"}}export class ConfigurationSchemaMismatchError extends Error{details;constructor(e){super("Preset data does not match the configuration schema registered on the server. Why: the preset/demo entity data was changed without re-registering the schema, or the schema drifted. Fix: re-register/redeploy the domain schema, or update the preset data to match the current schema."),this.details=e,this.name="ConfigurationSchemaMismatchError"}}export const isConfigurationSchemaMismatchError=e=>e instanceof ConfigurationSchemaMismatchError;
@@ -9,5 +9,5 @@ export { MemoryAuthorizedPhoenixApiClient } from './memory-authorized-client.js'
9
9
  export { MemoryAuthenticatedClientPhoenixApiClient, memoryStorage } from './memory-authenticated-client.js';
10
10
  export { createUnsignedJWT } from './unsigned-jwt.js';
11
11
  export type { components as ApiTypes } from './phoenix-api.js';
12
- export type { ConfigurationPayload, ConfigurationSchema, ChatConfiguration, ChatConversation, ChatEmbedding, ChatMessageParam, ChatToolCallResult, Entity, UnauthenticatedPhoenixApiClient, AuthenticatedClientPhoenixApiClient, AuthorizedPhoenixApiClient, AssistantChatConnection, OAuthProvider, OAuthAccessTokenResult, GoogleOAuthConfig, ReleaseToProductionResult, SharePointSiteConfig, } from './contract.js';
13
- export { InvalidAccessKeyError, InvalidDeploymentError, ChunkNotFoundError, OAuthStaleConnectionError, ConfigurationSchemaMismatchError, isConfigurationSchemaMismatchError, } from './contract.js';
12
+ export type { ConfigurationPayload, ConfigurationSchema, ChatConfiguration, ChatConversation, ChatEmbedding, ChatMessageParam, ChatToolCallResult, Entity, UnauthenticatedPhoenixApiClient, AuthenticatedClientPhoenixApiClient, AuthorizedPhoenixApiClient, AssistantChatConnection, AssistantEarlierThread, AssistantThreadCompaction, OAuthProvider, OAuthAccessTokenResult, GoogleOAuthConfig, ReleaseToProductionResult, SharePointSiteConfig, } from './contract.js';
13
+ export { AssistantRequestError, InvalidAccessKeyError, InvalidDeploymentError, ChunkNotFoundError, OAuthStaleConnectionError, ConfigurationSchemaMismatchError, isConfigurationSchemaMismatchError, } from './contract.js';
@@ -1 +1 @@
1
- export{createApiBaseClient}from"./base-client.js";export{AuthorizedClient}from"./authorized-client.js";export{AuthenticatedClient}from"./authenticated-client.js";export{UnauthenticatedClient}from"./unauthenticated-client.js";export{LocalStorageAuthorizedPhoenixApiClient}from"./local-authorized-client.js";export{LocalStorageAuthenticatedClientPhoenixApiClient}from"./local-authenticated-client.js";export{LocalStorageUnauthenticatedPhoenixApiClient}from"./local-unauthenticated-client.js";export{MemoryAuthorizedPhoenixApiClient}from"./memory-authorized-client.js";export{MemoryAuthenticatedClientPhoenixApiClient,memoryStorage}from"./memory-authenticated-client.js";export{createUnsignedJWT}from"./unsigned-jwt.js";export{InvalidAccessKeyError,InvalidDeploymentError,ChunkNotFoundError,OAuthStaleConnectionError,ConfigurationSchemaMismatchError,isConfigurationSchemaMismatchError}from"./contract.js";
1
+ export{createApiBaseClient}from"./base-client.js";export{AuthorizedClient}from"./authorized-client.js";export{AuthenticatedClient}from"./authenticated-client.js";export{UnauthenticatedClient}from"./unauthenticated-client.js";export{LocalStorageAuthorizedPhoenixApiClient}from"./local-authorized-client.js";export{LocalStorageAuthenticatedClientPhoenixApiClient}from"./local-authenticated-client.js";export{LocalStorageUnauthenticatedPhoenixApiClient}from"./local-unauthenticated-client.js";export{MemoryAuthorizedPhoenixApiClient}from"./memory-authorized-client.js";export{MemoryAuthenticatedClientPhoenixApiClient,memoryStorage}from"./memory-authenticated-client.js";export{createUnsignedJWT}from"./unsigned-jwt.js";export{AssistantRequestError,InvalidAccessKeyError,InvalidDeploymentError,ChunkNotFoundError,OAuthStaleConnectionError,ConfigurationSchemaMismatchError,isConfigurationSchemaMismatchError}from"./contract.js";
@@ -1,5 +1,5 @@
1
1
  import type { ChatMessageContentChunk, ChatToolCalls } from '@salsita-ai/contracts/chat';
2
- import type { AssistantChatConnection, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
2
+ import type { AssistantChatConnection, AssistantEarlierThread, AssistantThreadCompaction, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
3
3
  import { LocalStorageAuthenticatedClientPhoenixApiClient } from './local-authenticated-client.js';
4
4
  /**
5
5
  * Local storage implementation for local dev, it does not check for schema changes, so you may need to create new configuration if the schema changes and
@@ -15,6 +15,8 @@ export declare class LocalStorageAuthorizedPhoenixApiClient<FINALIZE_DATA extend
15
15
  waitForFinalizationToComplete: () => Promise<FINALIZE_RESULT>;
16
16
  getConfigurationRevision: (configurationId: string, revisionId: string) => Promise<ConfigurationSchema>;
17
17
  getAssistantChatConnection: () => AssistantChatConnection;
18
+ compactAssistantThread: () => Promise<AssistantThreadCompaction>;
19
+ getAssistantEarlierThread: () => Promise<AssistantEarlierThread>;
18
20
  getChatConversation: (configurationId: string) => Promise<readonly {
19
21
  readonly augmentation?: import("./phoenix-api.js").components['schemas']['ChatMessageAugmentation'];
20
22
  readonly content?: string;
@@ -1 +1 @@
1
- import*as t from"uuid";import{ChunkType as e}from"@salsita-ai/contracts/chat";import{LocalStorageAuthenticatedClientPhoenixApiClient as o}from"./local-authenticated-client.js";let r=(t,o)=>{let r={role:"assistant",content:["I see","Yes","Definitely"][Math.round(2*Math.random())]};return localStorage.setItem(`${o}-chat`,JSON.stringify([...t,r])),Promise.resolve(new ReadableStream({start(t){t.enqueue({type:e.content,content:r.content??""}),t.close()}}))};export class LocalStorageAuthorizedPhoenixApiClient extends o{getConfigurationData=t=>{let e=JSON.parse(localStorage.getItem(t)??"[]");if(!e||0===e.length)throw Error("Configuration not found!");return e};getConfiguration=t=>{let e=this.getConfigurationData(t);return Promise.resolve(e[e.length-1])};updateConfiguration=(e,o)=>{let r=this.getConfigurationData(e),n=t.v4(),i={...o,configurationId:e,revisionId:n,modelVersion:this._modelVersion};return localStorage.setItem(e,JSON.stringify([...r,i])),Promise.resolve({revisionId:n})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(t,e)=>{let o=this.getConfigurationData(t).find(t=>t.revisionId===e);if(!o)throw Error("Revision not found!");return Promise.resolve(o)};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getChatConversation=async t=>JSON.parse(localStorage.getItem(`${t}-chat`)??"[]");sendMessage=async(t,e)=>{let o=await this.getChatConversation(t);return localStorage.setItem(`${t}-chat`,JSON.stringify([...o,e])),r(o,t)};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async t=>r(await this.getChatConversation(t),t);generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(t,e)=>{let o=localStorage.getItem(t);if(!o)throw Error("Configuration not found");let r=JSON.parse(o).find(t=>t.revisionId===e);if(!r)throw Error("Revision not found");return this.createConfiguration(r)}}
1
+ import*as t from"uuid";import{ChunkType as e}from"@salsita-ai/contracts/chat";import{LocalStorageAuthenticatedClientPhoenixApiClient as o}from"./local-authenticated-client.js";let r=(t,o)=>{let r={role:"assistant",content:["I see","Yes","Definitely"][Math.round(2*Math.random())]};return localStorage.setItem(`${o}-chat`,JSON.stringify([...t,r])),Promise.resolve(new ReadableStream({start(t){t.enqueue({type:e.content,content:r.content??""}),t.close()}}))};export class LocalStorageAuthorizedPhoenixApiClient extends o{getConfigurationData=t=>{let e=JSON.parse(localStorage.getItem(t)??"[]");if(!e||0===e.length)throw Error("Configuration not found!");return e};getConfiguration=t=>{let e=this.getConfigurationData(t);return Promise.resolve(e[e.length-1])};updateConfiguration=(e,o)=>{let r=this.getConfigurationData(e),n=t.v4(),a={...o,configurationId:e,revisionId:n,modelVersion:this._modelVersion};return localStorage.setItem(e,JSON.stringify([...r,a])),Promise.resolve({revisionId:n})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(t,e)=>{let o=this.getConfigurationData(t).find(t=>t.revisionId===e);if(!o)throw Error("Revision not found!");return Promise.resolve(o)};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};compactAssistantThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getAssistantEarlierThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getChatConversation=async t=>JSON.parse(localStorage.getItem(`${t}-chat`)??"[]");sendMessage=async(t,e)=>{let o=await this.getChatConversation(t);return localStorage.setItem(`${t}-chat`,JSON.stringify([...o,e])),r(o,t)};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async t=>r(await this.getChatConversation(t),t);generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(t,e)=>{let o=localStorage.getItem(t);if(!o)throw Error("Configuration not found");let r=JSON.parse(o).find(t=>t.revisionId===e);if(!r)throw Error("Revision not found");return this.createConfiguration(r)}}
@@ -1,4 +1,4 @@
1
- import type { AssistantChatConnection, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
1
+ import type { AssistantChatConnection, AssistantEarlierThread, AssistantThreadCompaction, AuthorizedPhoenixApiClient, ConfigurationPayload, ConfigurationSchema } from './contract.js';
2
2
  import { MemoryAuthenticatedClientPhoenixApiClient } from './memory-authenticated-client.js';
3
3
  /**
4
4
  * Memory implementation for local dev, it does not check for schema changes, so you may need to create new configuration if the schema changes and
@@ -15,6 +15,8 @@ export declare class MemoryAuthorizedPhoenixApiClient<FINALIZE_DATA extends Reco
15
15
  getConfigurationRevision: (configurationId: string, revisionId: string) => Promise<ConfigurationSchema>;
16
16
  getChatConversation: () => Promise<never>;
17
17
  getAssistantChatConnection: () => AssistantChatConnection;
18
+ compactAssistantThread: () => Promise<AssistantThreadCompaction>;
19
+ getAssistantEarlierThread: () => Promise<AssistantEarlierThread>;
18
20
  sendMessage: () => Promise<never>;
19
21
  getSpeechToText: () => Promise<never>;
20
22
  getTextToSpeech: () => Promise<never>;
@@ -1 +1 @@
1
- import*as t from"uuid";import{MemoryAuthenticatedClientPhoenixApiClient as e,memoryStorage as o}from"./memory-authenticated-client.js";export class MemoryAuthorizedPhoenixApiClient extends e{getConfigurationData=t=>{let e=o.get(t);if(!e||!e||0===e.length)throw Error("Configuration not found!");return e};getConfiguration=t=>{let e=this.getConfigurationData(t);return Promise.resolve(e[e.length-1])};updateConfiguration=(e,r)=>{let n=this.getConfigurationData(e),i=t.v4(),a={...r,configurationId:e,revisionId:i,modelVersion:this._modelVersion};return o.set(e,[...n,a]),Promise.resolve({revisionId:i})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(t,e)=>{let o=this.getConfigurationData(t).find(t=>t.revisionId===e);if(!o)throw Error("Revision not found!");return Promise.resolve(o)};getChatConversation=async()=>{throw Error("Not implemented!")};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};sendMessage=async()=>{throw Error("Not implemented!")};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async()=>{throw Error("Not implemented!")};generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(t,e)=>{let r=o.get(t);if(!r)throw Error("Configuration not found");let n=r.find(t=>t.revisionId===e);if(!n)throw Error("Revision not found");return this.createConfiguration(n)}}
1
+ import*as e from"uuid";import{MemoryAuthenticatedClientPhoenixApiClient as t,memoryStorage as r}from"./memory-authenticated-client.js";export class MemoryAuthorizedPhoenixApiClient extends t{getConfigurationData=e=>{let t=r.get(e);if(!t||!t||0===t.length)throw Error("Configuration not found!");return t};getConfiguration=e=>{let t=this.getConfigurationData(e);return Promise.resolve(t[t.length-1])};updateConfiguration=(t,o)=>{let n=this.getConfigurationData(t),i=e.v4(),a={...o,configurationId:t,revisionId:i,modelVersion:this._modelVersion};return r.set(t,[...n,a]),Promise.resolve({revisionId:i})};finalize=()=>{throw Error("Not implemented!")};waitForFinalizationToComplete=()=>{throw Error("Not implemented!")};getConfigurationRevision=(e,t)=>{let r=this.getConfigurationData(e).find(e=>e.revisionId===t);if(!r)throw Error("Revision not found!");return Promise.resolve(r)};getChatConversation=async()=>{throw Error("Not implemented!")};getAssistantChatConnection=()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};compactAssistantThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};getAssistantEarlierThread=async()=>{throw Error("The assistant chat needs the Phoenix server. Run the configurator against a server deployment.")};sendMessage=async()=>{throw Error("Not implemented!")};getSpeechToText=async()=>{throw Error("Not implemented!")};getTextToSpeech=async()=>{throw Error("Not implemented!")};sendToolCallResults=async()=>{throw Error("Not implemented!")};generateShareLink=async()=>({link:"https://yourcompany.com/configurator/link-will-not-work-it-is-dummy-link"});generateUploadLinks=async()=>{throw Error("Not implemented!")};getConfigurationPublicUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateUploadLink=async()=>{throw Error("Not implemented!")};getConfigurationPrivateResourceLink=async()=>{throw Error("Not implemented!")};cloneConfiguration=async(e,t)=>{let o=r.get(e);if(!o)throw Error("Configuration not found");let n=o.find(e=>e.revisionId===t);if(!n)throw Error("Revision not found");return this.createConfiguration(n)}}