@salsita-ai/sdk 0.50.0-develop.c33986dc44 → 0.50.0-develop.c402728d10

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 (558) hide show
  1. package/README.md +5 -1
  2. package/dist/admin/AdminShell.js +1 -1
  3. package/dist/admin/legacy-admin/Application.js +1 -1
  4. package/dist/application-spec/core/enhanced-json-value.d.ts +2 -31
  5. package/dist/application-spec/core/enhanced-json-value.js +1 -1
  6. package/dist/application-spec/core/index.d.ts +1 -3
  7. package/dist/application-spec/core/index.js +1 -1
  8. package/dist/application-spec/core/json-schema.d.ts +2 -52
  9. package/dist/application-spec/core/markers/index.d.ts +1 -1
  10. package/dist/application-spec/core/markers/index.js +1 -1
  11. package/dist/application-spec/core/markers/msg-marker.d.ts +2 -28
  12. package/dist/application-spec/core/markers/msg-marker.js +1 -1
  13. package/dist/application-spec/core/markers/raw-eval-write-marker.d.ts +1 -1
  14. package/dist/application-spec/core/markers/raw-eval-write-marker.js +1 -1
  15. package/dist/application-spec/core/markers/raw-read-write-marker.js +1 -1
  16. package/dist/application-spec/errors/diagnostic-codes.d.ts +8 -1
  17. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  18. package/dist/application-spec/errors/diagnostic-messages.d.ts +15 -1
  19. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  20. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  21. package/dist/application-spec/generate-application/code/templates/index.d.ts +2 -6
  22. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  23. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill-bundle.d.ts +10 -0
  24. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill-bundle.js +7 -0
  25. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  26. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +1 -1
  27. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +1 -1
  28. package/dist/application-spec/generate-application/code/templates/story/wrapper.js +2 -4
  29. package/dist/application-spec/generate-application/implementations/phx-model.d.ts +1 -1
  30. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.d.ts +1 -2
  31. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.d.ts +1 -2
  32. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.d.ts +1 -2
  33. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.d.ts +1 -1
  34. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -1
  35. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +1 -2
  36. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -1
  37. package/dist/application-spec/generate-application/runtime/generate-runtime-instance.d.ts +1 -1
  38. package/dist/application-spec/generate-application/runtime/generate-runtime-instance.js +1 -1
  39. package/dist/application-spec/generate-application/runtime/sections/actions-runtime.d.ts +1 -2
  40. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +1 -1
  41. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  42. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.d.ts +1 -1
  43. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +1 -2
  44. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.d.ts +1 -2
  45. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  46. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.d.ts +1 -2
  47. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.js +1 -1
  48. package/dist/application-spec/generate-application/runtime/sections/preset-runtime.d.ts +2 -3
  49. package/dist/application-spec/generate-application/runtime/sections/reflection-constants-runtime.d.ts +1 -1
  50. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.d.ts +1 -1
  51. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.d.ts +96 -31
  52. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.d.ts +1 -1
  53. package/dist/application-spec/parse-application-files/merge/merged-assistant.d.ts +13 -4
  54. package/dist/application-spec/parse-application-files/merge/merged-assistant.js +1 -1
  55. package/dist/application-spec/parse-application-files/merge/merged-infra.d.ts +4 -11
  56. package/dist/application-spec/parse-application-files/merge/merged-transformers.d.ts +2 -4
  57. package/dist/application-spec/parse-application-files/parse-application-files.js +1 -1
  58. package/dist/application-spec/parse-application-files/raw-spec/raw-acl.d.ts +2 -2
  59. package/dist/application-spec/parse-application-files/raw-spec/raw-acl.js +1 -1
  60. package/dist/application-spec/parse-application-files/raw-spec/raw-admin-pages.d.ts +3 -24
  61. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +25 -20
  62. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  63. package/dist/application-spec/parse-application-files/raw-spec/raw-expressions.d.ts +1 -1
  64. package/dist/application-spec/parse-application-files/raw-spec/raw-expressions.js +1 -1
  65. package/dist/application-spec/parse-application-files/raw-spec/raw-resources.d.ts +19 -64
  66. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-pages.d.ts +3 -20
  67. package/dist/application-spec/parse-application-files/spec/application/admin-spec/states.d.ts +3 -5
  68. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/states.d.ts +3 -8
  69. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding.d.ts +3 -13
  70. package/dist/application-spec/parse-application-files/spec/components/bindings/write-binding.d.ts +4 -32
  71. package/dist/application-spec/parse-application-files/spec/components/component-filter.d.ts +4 -10
  72. package/dist/application-spec/parse-application-files/spec/components/components.d.ts +3 -4
  73. package/dist/application-spec/parse-application-files/spec/components/index.d.ts +1 -2
  74. package/dist/application-spec/parse-application-files/spec/components/index.js +1 -1
  75. package/dist/application-spec/parse-application-files/spec/components/sdk-component-entry.d.ts +1 -1
  76. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.d.ts +2 -3
  77. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.js +1 -1
  78. package/dist/application-spec/parse-application-files/spec/components/user-components.d.ts +2 -3
  79. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.d.ts +2 -2
  80. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +7 -29
  81. package/dist/application-spec/parse-application-files/spec/expressions/index.d.ts +0 -1
  82. package/dist/application-spec/parse-application-files/spec/expressions/memo-eval-plan.d.ts +4 -71
  83. package/dist/application-spec/parse-application-files/spec/expressions/memo-eval-plan.js +1 -1
  84. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.d.ts +2 -2
  85. package/dist/application-spec/parse-application-files/spec/invariants/invariant.d.ts +5 -21
  86. package/dist/application-spec/parse-application-files/spec/invariants/invariants.d.ts +4 -14
  87. package/dist/application-spec/parse-application-files/spec/model/aliases.d.ts +3 -9
  88. package/dist/application-spec/parse-application-files/spec/model/common-types.d.ts +6 -14
  89. package/dist/application-spec/parse-application-files/spec/model/defaults.d.ts +6 -31
  90. package/dist/application-spec/parse-application-files/spec/model/entity-types.d.ts +3 -8
  91. package/dist/application-spec/parse-application-files/spec/model/model-version-key.d.ts +3 -3
  92. package/dist/application-spec/parse-application-files/spec/model/names/action-name.d.ts +3 -7
  93. package/dist/application-spec/parse-application-files/spec/model/names/alias-name.d.ts +3 -7
  94. package/dist/application-spec/parse-application-files/spec/model/names/entity-or-alias-name.d.ts +3 -8
  95. package/dist/application-spec/parse-application-files/spec/model/names/entity-type-name.d.ts +3 -8
  96. package/dist/application-spec/parse-application-files/spec/model/names/expression-name.d.ts +3 -6
  97. package/dist/application-spec/parse-application-files/spec/model/names/instance-name.d.ts +3 -7
  98. package/dist/application-spec/parse-application-files/spec/model/names/invariant-name.d.ts +3 -3
  99. package/dist/application-spec/parse-application-files/spec/model/names/shape-property-name.d.ts +3 -11
  100. package/dist/application-spec/parse-application-files/spec/model/names/violation-type-name.d.ts +3 -3
  101. package/dist/application-spec/parse-application-files/spec/model/presets.d.ts +6 -29
  102. package/dist/application-spec/parse-application-files/spec/sections/actions.d.ts +6 -23
  103. package/dist/application-spec/parse-application-files/spec/sections/app-metadata.d.ts +3 -18
  104. package/dist/application-spec/parse-application-files/spec/sections/application-version.d.ts +3 -7
  105. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  106. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant.js +1 -1
  107. package/dist/application-spec/parse-application-files/spec/sections/data-spec/chunks.d.ts +6 -23
  108. package/dist/application-spec/parse-application-files/spec/sections/data-spec/custom-data-spec.d.ts +1 -16
  109. package/dist/application-spec/parse-application-files/spec/sections/data-spec/data-entry-key.d.ts +3 -9
  110. package/dist/application-spec/parse-application-files/spec/sections/data-spec/data-spec.d.ts +1 -10
  111. package/dist/application-spec/parse-application-files/spec/sections/data-spec/swatch-data-spec.d.ts +1 -14
  112. package/dist/application-spec/parse-application-files/spec/sections/state-value.d.ts +3 -7
  113. package/dist/application-spec/parse-application-files/spec/sections/theme.d.ts +3 -10
  114. package/dist/application-spec/parse-application-files/spec/sections/transformers.d.ts +4 -11
  115. package/dist/application-spec/parse-application-files/spec/sections/ui.d.ts +3 -12
  116. package/dist/client/authorized-client.d.ts +3 -1
  117. package/dist/client/authorized-client.js +1 -1
  118. package/dist/client/contract.d.ts +30 -1
  119. package/dist/client/contract.js +1 -1
  120. package/dist/client/index.d.ts +1 -1
  121. package/dist/client/local-authorized-client.d.ts +3 -1
  122. package/dist/client/local-authorized-client.js +1 -1
  123. package/dist/client/memory-authorized-client.d.ts +4 -1
  124. package/dist/client/memory-authorized-client.js +1 -1
  125. package/dist/client/phoenix-api.d.ts +259 -1
  126. package/dist/configurator/ConfiguratorApp.js +1 -1
  127. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  128. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +64 -6
  129. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  130. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +21 -4
  131. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  132. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +70 -56
  133. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  134. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +30 -9
  135. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  136. package/dist/configurator/application-runtime/extensions/systems/graphql-system/violations.d.ts +40 -0
  137. package/dist/configurator/application-runtime/extensions/systems/graphql-system/violations.js +1 -0
  138. package/dist/configurator/common/configurator-interface.d.ts +2 -2
  139. package/dist/configurator/common/configurator-interface.js +1 -1
  140. package/dist/configurator/configurator-context/configurator-hooks/index.d.ts +0 -1
  141. package/dist/configurator/configurator-context/configurator-hooks/index.js +1 -1
  142. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.js +1 -1
  143. package/dist/configurator/configurator-context/index.d.ts +0 -5
  144. package/dist/configurator/configurator-context/index.js +1 -1
  145. package/dist/configurator/pages/ConfiguratorNotFoundPage.js +1 -1
  146. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  147. package/dist/configurator/pages/NewConfiguratorPage.js +1 -1
  148. package/dist/configurator/pages/error-boundaries/DevContextFallback.js +1 -1
  149. package/dist/configurator/pages/error-boundaries/DevLoadingFallback.js +1 -1
  150. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  151. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +6 -0
  152. package/dist/configurator/ui/assistant/AssistantComposer.js +2 -1
  153. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  154. package/dist/configurator/ui/assistant/attachments/MessageImages.d.ts +11 -0
  155. package/dist/configurator/ui/assistant/attachments/MessageImages.js +1 -0
  156. package/dist/configurator/ui/assistant/attachments/index.d.ts +2 -0
  157. package/dist/configurator/ui/assistant/attachments/index.js +1 -0
  158. package/dist/configurator/ui/assistant/attachments/prepare-image.d.ts +19 -0
  159. package/dist/configurator/ui/assistant/attachments/prepare-image.js +1 -0
  160. package/dist/configurator/ui/assistant/screenshots/ScreenshotThumbnails.d.ts +1 -1
  161. package/dist/configurator/ui/assistant/screenshots/ScreenshotThumbnails.js +1 -1
  162. package/dist/configurator/ui/assistant/screenshots/index.d.ts +1 -0
  163. package/dist/configurator/ui/assistant/screenshots/index.js +1 -1
  164. package/dist/configurator/ui/assistant/screenshots/tool-screenshots.d.ts +12 -4
  165. package/dist/configurator/ui/assistant/screenshots/tool-screenshots.js +1 -1
  166. package/dist/configurator/ui/assistant/screenshots/use-screenshot-src.d.ts +8 -0
  167. package/dist/configurator/ui/assistant/screenshots/use-screenshot-src.js +1 -0
  168. package/dist/configurator/ui/assistant/thread-items.d.ts +2 -0
  169. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  170. package/dist/configurator/ui/assistant/tool-chip.d.ts +19 -9
  171. package/dist/configurator/ui/assistant/tool-chip.js +1 -1
  172. package/dist/configurator/ui/configurator-layout/slots/canvas/GPUAccelerationDisabled.js +1 -1
  173. package/dist/configurator/ui/configurator-layout/slots/canvas/WebGLNotSupported.js +1 -1
  174. package/dist/configurator/ui/configurator-layout/slots/readonly-banner/CloneToEditDialog.js +1 -1
  175. package/dist/configurator/ui/configurator-layout/universal/DesktopPreview.js +1 -1
  176. package/dist/configurator/ui/configurator-layout/universal/MobilePreview.js +1 -1
  177. package/dist/configurator/ui/legacy/chat/MobileChat.js +1 -1
  178. package/dist/configurator/ui/legacy/layout/common/CommonTopNavigation.js +1 -1
  179. package/dist/configurator/ui/legacy/layout/simple/SimpleSidebar.js +1 -1
  180. package/dist/configurator/ui/legacy/layout/simple/SimpleTopNavigation.js +1 -1
  181. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.js +1 -1
  182. package/dist/configurator/ui/legacy/layout/steps/StepsOwnerLayout.js +1 -1
  183. package/dist/configurator/ui/legacy/layout/steps/StepsSideBar.js +1 -1
  184. package/dist/configurator/ui/legacy/layout/tabs/TabsSidebar.js +1 -1
  185. package/dist/configurator/ui/phoenix-layout-elements/header/common/back-button/use-go-back-action.js +1 -1
  186. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.js +1 -1
  187. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/basic/use-basic-sidebar-footer.js +1 -1
  188. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/PreviousStepButton.js +1 -1
  189. package/dist/configurator/ui/preset-layout/CategoryPresetUi.js +1 -1
  190. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.js +1 -1
  191. package/dist/docs/3d-scene/cameras/custom.mdx +4 -2
  192. package/dist/docs/drag-and-drop/room-planner.mdx +1 -1
  193. package/dist/docs/index.json +1 -1
  194. package/dist/docs/phoenix/configurator-interface.mdx +1 -1
  195. package/dist/docs/phoenix/domain-model.mdx +4 -1
  196. package/dist/docs/phoenix/layout-slots.mdx +21 -0
  197. package/dist/docs/phoenix/migration-guide.mdx +3 -3
  198. package/dist/docs/phoenix/phoenix-cli.mdx +40 -7
  199. package/dist/docs/phoenix/project-structure.mdx +23 -19
  200. package/dist/docs/phoenix/sdk-builder-workflow.mdx +2 -2
  201. package/dist/docs/phoenix/webhooks.mdx +9 -1
  202. package/dist/domain/application/application-config.d.ts +6 -24
  203. package/dist/domain/application/assistant/assistant-manifest.d.ts +13 -3
  204. package/dist/domain/application/assistant/assistant-manifest.js +1 -1
  205. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +5 -9
  206. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -1
  207. package/dist/domain/application/assistant/build-assistant-lenses.js +1 -1
  208. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -1
  209. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  210. package/dist/domain/application/assistant/index.d.ts +3 -3
  211. package/dist/domain/application/assistant/index.js +1 -1
  212. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -1
  213. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +2 -4
  214. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -1
  215. package/dist/domain/application/assistant-mutations.js +1 -1
  216. package/dist/domain/available-system-components/available-system-components.d.ts +11 -0
  217. package/dist/domain/available-system-components/available-system-components.js +1 -0
  218. package/dist/domain/available-system-components/index.d.ts +1 -0
  219. package/dist/domain/available-system-components/index.js +1 -0
  220. package/dist/domain/{domain-builder.d.ts → domain-builder/domain-builder.d.ts} +2 -2
  221. package/dist/domain/domain-builder/domain-builder.js +1 -0
  222. package/dist/domain/domain-builder/index.d.ts +1 -0
  223. package/dist/domain/domain-builder/index.js +1 -0
  224. package/dist/domain/extensions/export-images/agent-screenshot.d.ts +6 -0
  225. package/dist/domain/extensions/export-images/agent-screenshot.js +1 -1
  226. package/dist/domain/extensions/export-images/index.d.ts +1 -1
  227. package/dist/domain/extensions/export-images/index.js +1 -1
  228. package/dist/domain/extensions/index.d.ts +1 -1
  229. package/dist/domain/extensions/index.js +1 -1
  230. package/dist/domain/index.d.ts +3 -2
  231. package/dist/domain/index.js +1 -1
  232. package/dist/domain/spec/application/admin-pages-section.d.ts +29 -0
  233. package/dist/domain/spec/application/admin-pages.d.ts +26 -0
  234. package/dist/domain/spec/application/admin-states.d.ts +5 -0
  235. package/dist/domain/spec/application/configurator-states.d.ts +8 -0
  236. package/dist/domain/spec/application/configurator-states.js +1 -0
  237. package/dist/domain/spec/application/index.d.ts +5 -0
  238. package/dist/domain/spec/application/index.js +1 -0
  239. package/dist/domain/spec/components/bindings/index.d.ts +2 -0
  240. package/dist/domain/spec/components/bindings/index.js +1 -0
  241. package/dist/domain/spec/components/bindings/read-binding.d.ts +13 -0
  242. package/dist/domain/spec/components/bindings/read-binding.js +1 -0
  243. package/dist/domain/spec/components/bindings/write-binding.d.ts +32 -0
  244. package/dist/domain/spec/components/bindings/write-binding.js +1 -0
  245. package/dist/{application-spec/parse-application-files → domain}/spec/components/component-entry.d.ts +3 -3
  246. package/dist/domain/spec/components/component-entry.js +1 -0
  247. package/dist/{application-spec/core → domain/spec}/components/component-filter.d.ts +3 -2
  248. package/dist/domain/spec/components/component-filters.d.ts +10 -0
  249. package/dist/domain/spec/components/component-filters.js +1 -0
  250. package/dist/domain/spec/components/components.d.ts +4 -0
  251. package/dist/domain/spec/components/components.js +1 -0
  252. package/dist/domain/spec/components/index.d.ts +6 -0
  253. package/dist/domain/spec/enhanced-json/enhanced-json-value.d.ts +30 -0
  254. package/dist/domain/spec/enhanced-json/enhanced-json-value.js +1 -0
  255. package/dist/domain/spec/enhanced-json/index.d.ts +1 -0
  256. package/dist/domain/spec/enhanced-json/index.js +1 -0
  257. package/dist/{application-spec/parse-application-files → domain}/spec/expressions/expression.d.ts +9 -3
  258. package/dist/domain/spec/expressions/expression.js +1 -0
  259. package/dist/domain/spec/expressions/expressions.d.ts +27 -0
  260. package/dist/domain/spec/expressions/expressions.js +1 -0
  261. package/dist/domain/spec/expressions/index.d.ts +5 -0
  262. package/dist/domain/spec/expressions/memo-eval-plan.d.ts +70 -0
  263. package/dist/domain/spec/expressions/memo-eval-plan.js +1 -0
  264. package/dist/domain/spec/expressions/relation-expression-params.js +1 -0
  265. package/dist/domain/spec/index.d.ts +9 -0
  266. package/dist/domain/spec/index.js +1 -0
  267. package/dist/domain/spec/invariants/index.d.ts +2 -0
  268. package/dist/domain/spec/invariants/index.js +1 -0
  269. package/dist/domain/spec/invariants/invariant.d.ts +24 -0
  270. package/dist/domain/spec/invariants/invariant.js +1 -0
  271. package/dist/domain/spec/invariants/invariants.d.ts +14 -0
  272. package/dist/domain/spec/invariants/invariants.js +1 -0
  273. package/dist/domain/spec/json-schema.d.ts +52 -0
  274. package/dist/domain/spec/json-schema.js +1 -0
  275. package/dist/domain/spec/markers/index.d.ts +3 -0
  276. package/dist/domain/spec/markers/index.js +1 -0
  277. package/dist/domain/spec/markers/msg-marker.d.ts +28 -0
  278. package/dist/domain/spec/markers/msg-marker.js +1 -0
  279. package/dist/domain/spec/model/aliases.d.ts +9 -0
  280. package/dist/domain/spec/model/aliases.js +1 -0
  281. package/dist/domain/spec/model/common-types.d.ts +15 -0
  282. package/dist/domain/spec/model/common-types.js +1 -0
  283. package/dist/domain/spec/model/defaults.d.ts +33 -0
  284. package/dist/domain/spec/model/defaults.js +1 -0
  285. package/dist/domain/spec/model/entity-types.d.ts +8 -0
  286. package/dist/domain/spec/model/entity-types.js +1 -0
  287. package/dist/domain/spec/model/index.d.ts +7 -0
  288. package/dist/domain/spec/model/index.js +1 -0
  289. package/dist/domain/spec/model/model-version-key.d.ts +3 -0
  290. package/dist/domain/spec/model/model-version-key.js +1 -0
  291. package/dist/domain/spec/model/names/action-name.d.ts +7 -0
  292. package/dist/domain/spec/model/names/action-name.js +1 -0
  293. package/dist/domain/spec/model/names/alias-name.d.ts +7 -0
  294. package/dist/domain/spec/model/names/alias-name.js +1 -0
  295. package/dist/domain/spec/model/names/entity-or-alias-name.d.ts +8 -0
  296. package/dist/domain/spec/model/names/entity-or-alias-name.js +1 -0
  297. package/dist/domain/spec/model/names/entity-type-name.d.ts +8 -0
  298. package/dist/domain/spec/model/names/entity-type-name.js +1 -0
  299. package/dist/domain/spec/model/names/expression-name.d.ts +6 -0
  300. package/dist/domain/spec/model/names/expression-name.js +1 -0
  301. package/dist/domain/spec/model/names/index.d.ts +9 -0
  302. package/dist/domain/spec/model/names/index.js +1 -0
  303. package/dist/domain/spec/model/names/instance-name.d.ts +7 -0
  304. package/dist/domain/spec/model/names/instance-name.js +1 -0
  305. package/dist/domain/spec/model/names/invariant-name.d.ts +3 -0
  306. package/dist/domain/spec/model/names/invariant-name.js +1 -0
  307. package/dist/domain/spec/model/names/shape-property-name.d.ts +11 -0
  308. package/dist/domain/spec/model/names/shape-property-name.js +1 -0
  309. package/dist/domain/spec/model/names/violation-type-name.d.ts +3 -0
  310. package/dist/domain/spec/model/names/violation-type-name.js +1 -0
  311. package/dist/domain/spec/model/presets.d.ts +30 -0
  312. package/dist/domain/spec/model/presets.js +1 -0
  313. package/dist/domain/spec/sections/actions.d.ts +23 -0
  314. package/dist/domain/spec/sections/actions.js +1 -0
  315. package/dist/domain/spec/sections/app-metadata.d.ts +18 -0
  316. package/dist/domain/spec/sections/app-metadata.js +1 -0
  317. package/dist/domain/spec/sections/application-version.d.ts +7 -0
  318. package/dist/domain/spec/sections/application-version.js +1 -0
  319. package/dist/domain/spec/sections/data-spec/chunks.d.ts +23 -0
  320. package/dist/domain/spec/sections/data-spec/chunks.js +1 -0
  321. package/dist/domain/spec/sections/data-spec/custom-data-spec-entry.d.ts +16 -0
  322. package/dist/domain/spec/sections/data-spec/custom-data-spec-entry.js +1 -0
  323. package/dist/domain/spec/sections/data-spec/data-entry-key.d.ts +9 -0
  324. package/dist/domain/spec/sections/data-spec/data-entry-key.js +1 -0
  325. package/dist/domain/spec/sections/data-spec/index.d.ts +5 -0
  326. package/dist/domain/spec/sections/data-spec/index.js +1 -0
  327. package/dist/domain/spec/sections/data-spec/parsed-data-spec-entries.d.ts +10 -0
  328. package/dist/domain/spec/sections/data-spec/parsed-data-spec-entries.js +1 -0
  329. package/dist/domain/spec/sections/data-spec/swatch-data-spec-entry.d.ts +14 -0
  330. package/dist/domain/spec/sections/data-spec/swatch-data-spec-entry.js +1 -0
  331. package/dist/domain/spec/sections/index.d.ts +9 -0
  332. package/dist/domain/spec/sections/index.js +1 -0
  333. package/dist/domain/spec/sections/infra/acl.d.ts +12 -0
  334. package/dist/domain/spec/sections/infra/acl.js +1 -0
  335. package/dist/domain/spec/sections/infra/index.d.ts +3 -0
  336. package/dist/domain/spec/sections/infra/index.js +1 -0
  337. package/dist/domain/spec/sections/infra/resource-entry.d.ts +46 -0
  338. package/dist/domain/spec/sections/infra/resource-entry.js +1 -0
  339. package/dist/domain/spec/sections/infra/resources-config.d.ts +10 -0
  340. package/dist/domain/spec/sections/infra/resources-config.js +1 -0
  341. package/dist/domain/spec/sections/state-value.d.ts +7 -0
  342. package/dist/domain/spec/sections/state-value.js +1 -0
  343. package/dist/domain/spec/sections/theme.d.ts +10 -0
  344. package/dist/domain/spec/sections/theme.js +1 -0
  345. package/dist/domain/spec/sections/transformers.d.ts +15 -0
  346. package/dist/domain/spec/sections/transformers.js +1 -0
  347. package/dist/domain/spec/sections/ui.d.ts +12 -0
  348. package/dist/domain/spec/sections/ui.js +1 -0
  349. package/dist/domain/system-definitions.js +1 -1
  350. package/dist/domain/utils/index.d.ts +2 -0
  351. package/dist/domain/utils/index.js +1 -0
  352. package/dist/editor/graphql/GraphQLPanel.js +1 -1
  353. package/dist/i18n/locales/cs/messages.js +1 -1
  354. package/dist/i18n/locales/da/messages.js +1 -1
  355. package/dist/i18n/locales/de/messages.js +1 -1
  356. package/dist/i18n/locales/de-AT/messages.js +1 -1
  357. package/dist/i18n/locales/en/messages.js +1 -1
  358. package/dist/i18n/locales/en-AU/messages.js +1 -1
  359. package/dist/i18n/locales/en-GB/messages.js +1 -1
  360. package/dist/i18n/locales/es/messages.js +1 -1
  361. package/dist/i18n/locales/fr/messages.js +1 -1
  362. package/dist/i18n/locales/hu/messages.js +1 -1
  363. package/dist/i18n/locales/it/messages.js +1 -1
  364. package/dist/i18n/locales/nl/messages.js +1 -1
  365. package/dist/i18n/locales/pl/messages.js +1 -1
  366. package/dist/i18n/locales/pt/messages.js +1 -1
  367. package/dist/i18n/locales/ro/messages.js +1 -1
  368. package/dist/i18n/locales/sk/messages.js +1 -1
  369. package/dist/i18n/locales/tr/messages.js +1 -1
  370. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +2 -2
  371. package/dist/legacy/phoenix-cli/services/webhook-service/transport.js +1 -1
  372. package/dist/legacy/phoenix-cli/services/webhook-service/tunnel.d.ts +1 -0
  373. package/dist/legacy/phoenix-cli/services/webhook-service/tunnel.js +1 -1
  374. package/dist/legacy/webhook-cli/lambda-local/index.js +1 -1
  375. package/dist/phoenix/application-spec/generate-application-spec-project.d.ts +1 -0
  376. package/dist/phoenix/application-spec/generate-application-spec-project.js +2 -2
  377. package/dist/phoenix/application-spec/generate-project-files.d.ts +1 -0
  378. package/dist/phoenix/application-spec/index.d.ts +1 -0
  379. package/dist/phoenix/application-spec/index.js +1 -1
  380. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +11 -0
  381. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  382. package/dist/phoenix/bin.js +1 -1
  383. package/dist/phoenix/cli.js +1 -1
  384. package/dist/phoenix/commands/activate-deployment.js +1 -1
  385. package/dist/phoenix/commands/build.js +1 -1
  386. package/dist/phoenix/commands/changelog.js +1 -1
  387. package/dist/phoenix/commands/check.js +1 -1
  388. package/dist/phoenix/commands/clean.js +1 -1
  389. package/dist/phoenix/commands/cleanup-environment.js +2 -2
  390. package/dist/phoenix/commands/create-environment.js +1 -1
  391. package/dist/phoenix/commands/data.js +1 -1
  392. package/dist/phoenix/commands/deploy.js +1 -1
  393. package/dist/phoenix/commands/deployment-build-envs-command.js +1 -1
  394. package/dist/phoenix/commands/dev.js +4 -5
  395. package/dist/phoenix/commands/docs.js +1 -1
  396. package/dist/phoenix/commands/finish-deployment-command.js +1 -1
  397. package/dist/phoenix/commands/fix.js +1 -1
  398. package/dist/phoenix/commands/index.d.ts +1 -1
  399. package/dist/phoenix/commands/index.js +1 -1
  400. package/dist/phoenix/commands/inspect-assets.js +1 -1
  401. package/dist/phoenix/commands/list-environments.js +1 -1
  402. package/dist/phoenix/commands/login.d.ts +4 -1
  403. package/dist/phoenix/commands/login.js +2 -2
  404. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  405. package/dist/phoenix/commands/register-deployment.js +1 -1
  406. package/dist/phoenix/commands/scene.js +1 -1
  407. package/dist/phoenix/commands/screenshot.js +1 -1
  408. package/dist/phoenix/commands/state.js +1 -1
  409. package/dist/phoenix/commands/story-build.js +3 -3
  410. package/dist/phoenix/commands/story-create.js +1 -1
  411. package/dist/phoenix/commands/story-dev.js +2 -2
  412. package/dist/phoenix/commands/sync.js +1 -1
  413. package/dist/phoenix/commands/variants.js +1 -1
  414. package/dist/phoenix/editor-server/commands-router.js +1 -1
  415. package/dist/phoenix/editor-server/editor-server.d.ts +2 -13
  416. package/dist/phoenix/editor-server/editor-server.js +1 -1
  417. package/dist/phoenix/editor-server/spec-router.js +1 -1
  418. package/dist/phoenix/editor-server/trpc.d.ts +2 -12
  419. package/dist/phoenix/lingui/index.d.ts +1 -0
  420. package/dist/phoenix/lingui/index.js +1 -0
  421. package/dist/phoenix/lingui/lingui.d.ts +18 -0
  422. package/dist/phoenix/lingui/lingui.js +1 -0
  423. package/dist/phoenix/services/application-spec-project-watcher.d.ts +11 -6
  424. package/dist/phoenix/services/application-spec-project-watcher.js +2 -2
  425. package/dist/phoenix/services/cli-credentials.d.ts +3 -0
  426. package/dist/phoenix/services/cli-credentials.js +1 -1
  427. package/dist/phoenix/services/cli-exit.d.ts +5 -0
  428. package/dist/phoenix/services/cli-exit.js +1 -0
  429. package/dist/phoenix/services/deployment/deployment-preparation-service.d.ts +28 -0
  430. package/dist/phoenix/services/deployment/deployment-preparation-service.js +1 -0
  431. package/dist/phoenix/{commands → services/deployment}/generated-env-markers.d.ts +1 -0
  432. package/dist/phoenix/services/deployment/generated-env-markers.js +1 -0
  433. package/dist/phoenix/services/deployment/index.d.ts +2 -0
  434. package/dist/phoenix/services/deployment/index.js +1 -0
  435. package/dist/phoenix/services/index.d.ts +5 -1
  436. package/dist/phoenix/services/index.js +1 -1
  437. package/dist/phoenix/services/lingui-watcher.js +1 -1
  438. package/dist/phoenix/services/phoenix-store.d.ts +3 -0
  439. package/dist/phoenix/services/phoenix-store.js +1 -1
  440. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  441. package/dist/phoenix/services/session/editor-server-handle.d.ts +5 -0
  442. package/dist/phoenix/services/session/editor-server-handle.js +1 -0
  443. package/dist/phoenix/services/session/index.d.ts +2 -0
  444. package/dist/phoenix/services/session/index.js +1 -0
  445. package/dist/phoenix/services/session/phoenix-application.d.ts +82 -0
  446. package/dist/phoenix/services/session/phoenix-application.js +2 -0
  447. package/dist/phoenix/services/telemetry/amplitude-telemetry-transport.d.ts +9 -0
  448. package/dist/phoenix/services/telemetry/amplitude-telemetry-transport.js +1 -0
  449. package/dist/phoenix/services/telemetry/index.d.ts +3 -0
  450. package/dist/phoenix/services/telemetry/index.js +1 -0
  451. package/dist/phoenix/services/telemetry/telemetry-client.d.ts +25 -0
  452. package/dist/phoenix/services/telemetry/telemetry-client.js +1 -0
  453. package/dist/phoenix/services/telemetry/telemetry-command.d.ts +2 -0
  454. package/dist/phoenix/services/telemetry/telemetry-command.js +1 -0
  455. package/dist/phoenix/services/telemetry/telemetry-event.d.ts +44 -0
  456. package/dist/phoenix/services/telemetry/telemetry-event.js +1 -0
  457. package/dist/phoenix/services/telemetry/telemetry-state.d.ts +25 -0
  458. package/dist/phoenix/services/telemetry/telemetry-state.js +2 -0
  459. package/dist/phoenix/services/vite-config.js +1 -1
  460. package/dist/phoenix/services/webhook-service/transport.js +1 -1
  461. package/dist/phoenix/services/webhook-service/tunnel.d.ts +1 -0
  462. package/dist/phoenix/services/webhook-service/tunnel.js +1 -1
  463. package/dist/react-sdk/application-runtime/domain-application-context/chat-system.d.ts +1 -1
  464. package/dist/{configurator/configurator-context → react-sdk}/configurator-routing/ConfiguratorRoutingProvider.d.ts +1 -1
  465. package/dist/react-sdk/configurator-routing/ConfiguratorRoutingProvider.js +1 -0
  466. package/dist/{configurator/configurator-context → react-sdk}/configurator-routing/OnGoToIndexHandler.d.ts +1 -2
  467. package/dist/react-sdk/configurator-routing/OnGoToIndexHandler.js +1 -0
  468. package/dist/react-sdk/configurator-routing/index.d.ts +3 -0
  469. package/dist/{configurator/configurator-context → react-sdk}/configurator-routing/index.js +1 -1
  470. package/dist/{configurator/configurator-context → react-sdk}/configurator-routing/use-power-routing-lifecycle.d.ts +2 -0
  471. package/dist/react-sdk/configurator-routing/use-power-routing-lifecycle.js +1 -0
  472. package/dist/react-sdk/domain-application-context/BackendDataProvider.js +1 -1
  473. package/dist/react-sdk/domain-application-context/ConfigurationPersistSystemFailureHandler.js +1 -1
  474. package/dist/react-sdk/domain-application-context/FrontendDataProvider.js +1 -1
  475. package/dist/react-sdk/domain-application-context/OnPresetLoadedHandler.js +1 -0
  476. package/dist/react-sdk/domain-application-context/PublishedDataProvider.js +1 -1
  477. package/dist/react-sdk/domain-application-context/chat-hooks.d.ts +4 -0
  478. package/dist/react-sdk/domain-application-context/chat-hooks.js +1 -0
  479. package/dist/react-sdk/domain-application-context/index.d.ts +2 -0
  480. package/dist/react-sdk/domain-application-context/index.js +1 -1
  481. package/dist/react-sdk/elements/PhoenixEntityElement.js +1 -1
  482. package/dist/react-sdk/elements/PhoenixLayoutElement.js +1 -1
  483. package/dist/react-sdk/index.d.ts +5 -0
  484. package/dist/react-sdk/index.js +1 -1
  485. package/dist/react-sdk/integration/IntegrationSubscription.js +1 -0
  486. package/dist/react-sdk/integration/index.d.ts +1 -0
  487. package/dist/react-sdk/integration/index.js +1 -0
  488. package/dist/react-sdk/lifecycle-providers/ConfiguratorDataProvider.d.ts +8 -0
  489. package/dist/react-sdk/lifecycle-providers/ConfiguratorDataProvider.js +1 -0
  490. package/dist/react-sdk/lifecycle-providers/LifecycleProviders.js +1 -0
  491. package/dist/react-sdk/lifecycle-providers/index.d.ts +2 -0
  492. package/dist/react-sdk/lifecycle-providers/index.js +1 -0
  493. package/dist/react-sdk/notifications/index.d.ts +1 -0
  494. package/dist/react-sdk/notifications/index.js +1 -0
  495. package/dist/react-sdk/notifications/snackbar-action-button.d.ts +30 -0
  496. package/dist/react-sdk/notifications/snackbar-action-button.js +1 -0
  497. package/dist/react-sdk/preset-selection/PresetSelectionProvider.js +1 -0
  498. package/dist/react-sdk/preset-selection/index.d.ts +1 -0
  499. package/dist/react-sdk/preset-selection/index.js +1 -0
  500. package/dist/react-sdk/session/SessionServiceProvider.d.ts +5 -0
  501. package/dist/react-sdk/session/SessionServiceProvider.js +1 -1
  502. package/dist/ui-sdk/components/snackbar/Snackbar.d.ts +24 -3
  503. package/dist/ui-sdk/components/snackbar/Snackbar.js +1 -1
  504. package/dist/ui-sdk/icons/__generated/Paperclip.d.ts +3 -0
  505. package/dist/ui-sdk/icons/__generated/Paperclip.js +1 -0
  506. package/dist/ui-sdk/icons/__generated/index.d.ts +2 -0
  507. package/dist/ui-sdk/icons/__generated/index.js +1 -1
  508. package/dist/ui-sdk/icons/icons-registry.js +1 -1
  509. package/dist/ui-sdk/theme/types.d.ts +1 -1
  510. package/dist/watch/glob-matcher.d.ts +4 -4
  511. package/dist/watch/glob-matcher.js +1 -1
  512. package/dist/watch/watch.d.ts +4 -4
  513. package/dist/watch/watch.js +1 -1
  514. package/package.json +3 -3
  515. package/schema/domain-spec.json +22 -4
  516. package/dist/application-spec/core/components/index.d.ts +0 -2
  517. package/dist/application-spec/core/expressions/index.d.ts +0 -2
  518. package/dist/configurator/configurator-context/ConfiguratorDataProvider.d.ts +0 -2
  519. package/dist/configurator/configurator-context/ConfiguratorDataProvider.js +0 -1
  520. package/dist/configurator/configurator-context/IntegrationSubscription.js +0 -1
  521. package/dist/configurator/configurator-context/LifecycleProviders.js +0 -1
  522. package/dist/configurator/configurator-context/OnPresetLoadedHandler.js +0 -1
  523. package/dist/configurator/configurator-context/PresetSelectionProvider.js +0 -1
  524. package/dist/configurator/configurator-context/configurator-hooks/chat-hooks.d.ts +0 -1
  525. package/dist/configurator/configurator-context/configurator-hooks/chat-hooks.js +0 -1
  526. package/dist/configurator/configurator-context/configurator-routing/ConfiguratorRoutingProvider.js +0 -1
  527. package/dist/configurator/configurator-context/configurator-routing/OnGoToIndexHandler.js +0 -1
  528. package/dist/configurator/configurator-context/configurator-routing/index.d.ts +0 -2
  529. package/dist/configurator/configurator-context/configurator-routing/use-power-routing-lifecycle.js +0 -1
  530. package/dist/domain/available-system-components.d.ts +0 -11
  531. package/dist/domain/available-system-components.js +0 -1
  532. package/dist/domain/domain-builder.js +0 -1
  533. package/dist/phoenix/commands/generated-env-markers.js +0 -1
  534. package/dist/phoenix/services/lingui.d.ts +0 -15
  535. package/dist/phoenix/services/lingui.js +0 -1
  536. package/dist/phoenix/services/phoenix-application.d.ts +0 -21
  537. package/dist/phoenix/services/phoenix-application.js +0 -1
  538. /package/dist/{application-spec/core/expressions/relation-expression-params.js → domain/spec/application/admin-pages-section.js} +0 -0
  539. /package/dist/{application-spec/parse-application-files/spec/components/component-entry.js → domain/spec/application/admin-pages.js} +0 -0
  540. /package/dist/{application-spec/parse-application-files/spec/expressions/expression.js → domain/spec/application/admin-states.js} +0 -0
  541. /package/dist/{application-spec/core → domain/spec/application}/application-instance.d.ts +0 -0
  542. /package/dist/{application-spec/core → domain/spec/application}/application-instance.js +0 -0
  543. /package/dist/{application-spec/core → domain/spec}/components/component-filter.js +0 -0
  544. /package/dist/{application-spec/core → domain/spec}/components/index.js +0 -0
  545. /package/dist/{application-spec/core → domain/spec}/components/sdk-code-ref.d.ts +0 -0
  546. /package/dist/{application-spec/core → domain/spec}/components/sdk-code-ref.js +0 -0
  547. /package/dist/{application-spec/core → domain/spec}/expressions/index.js +0 -0
  548. /package/dist/{application-spec/core → domain/spec}/expressions/relation-expression-params.d.ts +0 -0
  549. /package/dist/{application-spec/core → domain/spec}/expressions/sdk-expression-implementation.d.ts +0 -0
  550. /package/dist/{application-spec/core → domain/spec}/expressions/sdk-expression-implementation.js +0 -0
  551. /package/dist/{application-spec/parse-application-files/spec/components → domain/spec/markers}/component-prop-target.d.ts +0 -0
  552. /package/dist/{application-spec/parse-application-files/spec/components → domain/spec/markers}/component-prop-target.js +0 -0
  553. /package/dist/{application-spec/core → domain/spec}/markers/eval-marker.d.ts +0 -0
  554. /package/dist/{application-spec/core → domain/spec}/markers/eval-marker.js +0 -0
  555. /package/dist/{configurator/configurator-context → react-sdk/domain-application-context}/OnPresetLoadedHandler.d.ts +0 -0
  556. /package/dist/{configurator/configurator-context → react-sdk/integration}/IntegrationSubscription.d.ts +0 -0
  557. /package/dist/{configurator/configurator-context → react-sdk/lifecycle-providers}/LifecycleProviders.d.ts +0 -0
  558. /package/dist/{configurator/configurator-context → react-sdk/preset-selection}/PresetSelectionProvider.d.ts +0 -0
@@ -0,0 +1,28 @@
1
+ import type { ApplicationSpec } from '#package/application-spec';
2
+ import type { Logger } from '../../utils/index.js';
3
+ import type { DevelopmentCredential } from '../development-credential.js';
4
+ import type { PhoenixStore } from '../phoenix-store.js';
5
+ /** The deployment identity a server-backed dev session prepares and checks after rebuilds. */
6
+ export interface DeploymentPreparationServiceProps {
7
+ readonly serverUrl: string;
8
+ readonly credential: DevelopmentCredential;
9
+ readonly projectSlug: string;
10
+ readonly environmentSlug: string;
11
+ readonly sdkVersion: string;
12
+ }
13
+ export interface DeploymentPreparationServiceContext {
14
+ readonly logger: Logger;
15
+ readonly store: PhoenixStore;
16
+ }
17
+ /** Prepares the active dev deployment and reports spec changes that require a session restart. */
18
+ export declare class DeploymentPreparationService {
19
+ private readonly props;
20
+ private readonly context;
21
+ constructor(props: DeploymentPreparationServiceProps, context: DeploymentPreparationServiceContext);
22
+ prepare(): Promise<void>;
23
+ prepareAtStartup(options: {
24
+ readonly skipUpload: boolean;
25
+ readonly debug: boolean;
26
+ }): Promise<void>;
27
+ reportUnregisteredSpec(applicationSpec: ApplicationSpec): Promise<void>;
28
+ }
@@ -0,0 +1 @@
1
+ import{mkdir as e}from"node:fs/promises";import{dirname as t}from"node:path";import{resolveGeneratedEnvFile as r}from"@salsita-ai/common/env";import{getDeploymentFingerprint as o}from"../../application-spec/index.js";import{prepareDevelopmentEnvironment as n}from"../prepare-development-environment.js";import{readGeneratedEnvMarkers as i}from"./generated-env-markers.js";export class DeploymentPreparationService{props;context;constructor(e,t){this.props=e,this.context=t}prepare(){return this.prepareAtStartup({skipUpload:!0,debug:!1})}async prepareAtStartup(o){let i=r(".");await e(t(i),{recursive:!0}),await n({serverUrl:this.props.serverUrl,projectSlug:this.props.projectSlug,environmentSlug:this.props.environmentSlug,credential:this.props.credential,outFile:i,skipUpload:o.skipUpload,overrideSchema:!0,debug:o.debug,projectVersion:this.props.sdkVersion},{logger:this.context.logger})}async reportUnregisteredSpec(e){try{let t=o(e),n=await i(r("."));if(!n||n.PHOENIX_DEPLOYMENT_FINGERPRINT===t)return void this.context.store.reportedFingerprint$.next(null);if(this.context.store.reportedFingerprint$.value===t)return;this.context.store.reportedFingerprint$.next(t),this.context.logger.error("The development deployment on the server still has the domain model and deployment settings it was prepared with, not the ones the spec now declares: a running phoenix dev cannot register a change, because its webhook tunnel and the preview stay bound to the deployment they started with. Restart phoenix dev to prepare the deployment again, then open the Preview address it prints rather than reloading a tab whose address has ?cid=, which loads a configuration saved with the earlier model.")}catch(e){this.context.logger.warn(`Could not compare the spec with the development deployment: ${e instanceof Error?e.message:String(e)}. After a domain model change, restart phoenix dev to register it.`)}}}
@@ -3,5 +3,6 @@ export interface GeneratedEnvMarkers {
3
3
  readonly PHOENIX_PROJECT_SLUG?: string;
4
4
  readonly PHOENIX_ENVIRONMENT_SLUG?: string;
5
5
  readonly PHOENIX_SERVER_URL?: string;
6
+ readonly PHOENIX_DEPLOYMENT_FINGERPRINT?: string;
6
7
  }
7
8
  export declare const readGeneratedEnvMarkers: (outFile: string) => Promise<GeneratedEnvMarkers | null>;
@@ -0,0 +1 @@
1
+ import{parse as E}from"dotenv";import{readFile as N}from"node:fs/promises";export const readGeneratedEnvMarkers=async r=>{try{let _=E(await N(r));return{DEPLOYMENT_ID:_.DEPLOYMENT_ID,PHOENIX_PROJECT_SLUG:_.PHOENIX_PROJECT_SLUG,PHOENIX_ENVIRONMENT_SLUG:_.PHOENIX_ENVIRONMENT_SLUG,PHOENIX_SERVER_URL:_.PHOENIX_SERVER_URL,PHOENIX_DEPLOYMENT_FINGERPRINT:_.PHOENIX_DEPLOYMENT_FINGERPRINT}}catch(E){if(E instanceof Error&&"code"in E&&"ENOENT"===E.code)return null;throw E}};
@@ -0,0 +1,2 @@
1
+ export { readGeneratedEnvMarkers } from './generated-env-markers.js';
2
+ export { DeploymentPreparationService } from './deployment-preparation-service.js';
@@ -0,0 +1 @@
1
+ export{readGeneratedEnvMarkers}from"./generated-env-markers.js";export{DeploymentPreparationService}from"./deployment-preparation-service.js";
@@ -1,13 +1,15 @@
1
1
  export type { BrowserConsoleEvent, DataRequest, DataResult, EditorContextData, EditorLifecycleStatus, EditorStateData, MockTemplateUpdateEvent, SceneRequest, SceneResult, ScreenshotRequest, ScreenshotResult, SpecUpdateEvent, StateRequest, StateResult, StateSection, } from './phoenix-pubsub.js';
2
2
  export { PhoenixPubSub } from './phoenix-pubsub.js';
3
3
  export { PhoenixStore } from './phoenix-store.js';
4
- export { PhoenixApplication } from './phoenix-application.js';
4
+ export { DeploymentPreparationService, readGeneratedEnvMarkers } from './deployment/index.js';
5
+ export { PhoenixApplication, type PhoenixApplicationProps, type PhoenixApplicationContext, type PhoenixDevelopmentOptions, type EditorServerHandle, } from './session/index.js';
5
6
  export { VariantFileSession } from './variant-file-session.js';
6
7
  export { VariantPreviewService } from './variant-preview-service.js';
7
8
  export { MockTemplateWatcher, type MockTemplateWatcherConfig } from './mock-template-watcher.js';
8
9
  export { ApplicationSpecProjectWatcher, type ApplicationSpecProjectWatcherConfig, } from './application-spec-project-watcher.js';
9
10
  export { ApplicationSpecStoryWatcher, type ApplicationSpecStoryWatcherConfig, } from './application-spec-story-watcher.js';
10
11
  export { LinguiWatcher, type LinguiWatcherConfig } from './lingui-watcher.js';
12
+ export { bootstrapLinguiCatalogs, extractAndCompileLingui } from '../lingui/index.js';
11
13
  export { loadMockTemplates, parseMockTemplateYaml, type LoadMockTemplatesResult, type ParsedMockTemplate, } from './spec-files.js';
12
14
  export { LOG_STREAMS, LogBus, type LogEntry, type LogLevel, type LogPage, type LogQuery, type LogStream, } from './log-bus.js';
13
15
  export { createBusLogger, type CreateBusLoggerOptions } from './bus-logger.js';
@@ -18,6 +20,8 @@ export { STORY_DEV_MARKER_PATH, readActiveStoryDevMarker, type StoryDevMarker }
18
20
  export { composeDefaultBanner } from './phx-banner-plugin.js';
19
21
  export { getViteBuildConfigs, getViteDevConfig, setViteLogSink, type ViteLogSink, type ViteLogSinkOptions, } from './vite-config.js';
20
22
  export { getServerCredentials, removeServerCredentials, saveServerCredentials } from './cli-credentials.js';
23
+ export { exitCli, setBeforeCliExit } from './cli-exit.js';
21
24
  export { createSourceArchive, extractSourceArchive } from './source-archive.js';
22
25
  export { resolveSignedInDevelopmentEnvironment } from './signed-in-development-environment.js';
26
+ export { createTelemetryClient, resolveTelemetryCommand, type CommandTelemetryAttempt, type TelemetryAssociation, type TelemetryClient, type TelemetryCommand, } from './telemetry/index.js';
23
27
  export { DEFAULT_PHOENIX_REGION, PHOENIX_REGIONS, PUBLIC_PHOENIX_REGIONS, getRegionServerUrl, getRegionStudioUrl, } from './phoenix-regions.js';
@@ -1 +1 @@
1
- export{PhoenixPubSub}from"./phoenix-pubsub.js";export{PhoenixStore}from"./phoenix-store.js";export{PhoenixApplication}from"./phoenix-application.js";export{VariantFileSession}from"./variant-file-session.js";export{VariantPreviewService}from"./variant-preview-service.js";export{MockTemplateWatcher}from"./mock-template-watcher.js";export{ApplicationSpecProjectWatcher}from"./application-spec-project-watcher.js";export{ApplicationSpecStoryWatcher}from"./application-spec-story-watcher.js";export{LinguiWatcher}from"./lingui-watcher.js";export{loadMockTemplates,parseMockTemplateYaml}from"./spec-files.js";export{LOG_STREAMS,LogBus}from"./log-bus.js";export{createBusLogger}from"./bus-logger.js";export{patchConsole}from"./console-capture.js";export{WebhookTunnelMonitor}from"./webhook-tunnel-monitor.js";export{compileWithSwc,watchWithSwc}from"./swc.js";export{STORY_DEV_MARKER_PATH,readActiveStoryDevMarker}from"./story-dev-marker.js";export{composeDefaultBanner}from"./phx-banner-plugin.js";export{getViteBuildConfigs,getViteDevConfig,setViteLogSink}from"./vite-config.js";export{getServerCredentials,removeServerCredentials,saveServerCredentials}from"./cli-credentials.js";export{createSourceArchive,extractSourceArchive}from"./source-archive.js";export{resolveSignedInDevelopmentEnvironment}from"./signed-in-development-environment.js";export{DEFAULT_PHOENIX_REGION,PHOENIX_REGIONS,PUBLIC_PHOENIX_REGIONS,getRegionServerUrl,getRegionStudioUrl}from"./phoenix-regions.js";
1
+ export{PhoenixPubSub}from"./phoenix-pubsub.js";export{PhoenixStore}from"./phoenix-store.js";export{DeploymentPreparationService,readGeneratedEnvMarkers}from"./deployment/index.js";export{PhoenixApplication}from"./session/index.js";export{VariantFileSession}from"./variant-file-session.js";export{VariantPreviewService}from"./variant-preview-service.js";export{MockTemplateWatcher}from"./mock-template-watcher.js";export{ApplicationSpecProjectWatcher}from"./application-spec-project-watcher.js";export{ApplicationSpecStoryWatcher}from"./application-spec-story-watcher.js";export{LinguiWatcher}from"./lingui-watcher.js";export{bootstrapLinguiCatalogs,extractAndCompileLingui}from"../lingui/index.js";export{loadMockTemplates,parseMockTemplateYaml}from"./spec-files.js";export{LOG_STREAMS,LogBus}from"./log-bus.js";export{createBusLogger}from"./bus-logger.js";export{patchConsole}from"./console-capture.js";export{WebhookTunnelMonitor}from"./webhook-tunnel-monitor.js";export{compileWithSwc,watchWithSwc}from"./swc.js";export{STORY_DEV_MARKER_PATH,readActiveStoryDevMarker}from"./story-dev-marker.js";export{composeDefaultBanner}from"./phx-banner-plugin.js";export{getViteBuildConfigs,getViteDevConfig,setViteLogSink}from"./vite-config.js";export{getServerCredentials,removeServerCredentials,saveServerCredentials}from"./cli-credentials.js";export{exitCli,setBeforeCliExit}from"./cli-exit.js";export{createSourceArchive,extractSourceArchive}from"./source-archive.js";export{resolveSignedInDevelopmentEnvironment}from"./signed-in-development-environment.js";export{createTelemetryClient,resolveTelemetryCommand}from"./telemetry/index.js";export{DEFAULT_PHOENIX_REGION,PHOENIX_REGIONS,PUBLIC_PHOENIX_REGIONS,getRegionServerUrl,getRegionStudioUrl}from"./phoenix-regions.js";
@@ -1 +1 @@
1
- import e from"promise-queue";import{Subject as t,buffer as i,debounceTime as s}from"rxjs";import{watch as r}from"#package/watch";import{compileLingui as n,extractAndCompileLingui as o}from"./lingui.js";let c=["src/**/*.{ts,tsx}","src/locales/**/*.po"],g=["src/locales/**/*.{ts,tsx}"];export class LinguiWatcher{watcher=null;subscription=null;runQueue=new e(1,1/0);changeSubject$=new t;logger;isShuttingDown=!1;constructor(e){this.logger=e.logger}start(){this.setupFileWatcher(),this.setupRunSubscription()}trigger(){this.changeSubject$.next("<codegen-rebuild>")}async close(){this.isShuttingDown=!0,this.watcher&&(await this.watcher.close(),this.watcher=null),this.subscription?.unsubscribe(),this.changeSubject$.complete()}setupFileWatcher(){this.watcher=r(c,{ignored:g,cwd:process.cwd(),ignoreInitial:!0,persistent:!0}),this.watcher.on("all",(e,t)=>{("change"===e||"add"===e||"unlink"===e)&&(this.logger.debug(`Lingui source ${e}: ${t}`),this.changeSubject$.next(t))}).on("error",e=>{this.logger.error(`Lingui watcher error: ${e instanceof Error?e.message:String(e)}`,e)})}setupRunSubscription(){let e=this.changeSubject$.pipe(s(200));this.subscription=this.changeSubject$.pipe(i(e)).subscribe(e=>{let t=e.some(e=>!e.endsWith(".po"));this.runQueue.add(async()=>{if(!this.isShuttingDown)try{t?(this.logger.info("Lingui sources changed, extracting and compiling i18n messages..."),await o({logger:this.logger})):(this.logger.info("Lingui catalogs changed, compiling i18n messages..."),await n({logger:this.logger}))}catch(e){this.logger.error(`Lingui update failed: ${e instanceof Error?e.message:String(e)}`,e)}})})}}
1
+ import e from"promise-queue";import{Subject as i,buffer as t,debounceTime as s}from"rxjs";import{watch as r}from"#package/watch";import{compileLingui as n,extractAndCompileLingui as o}from"../lingui/index.js";let c=["src/**/*.{ts,tsx}","src/locales/**/*.po"],g=["src/locales/**/*.{ts,tsx}"];export class LinguiWatcher{watcher=null;subscription=null;runQueue=new e(1,1/0);changeSubject$=new i;logger;isShuttingDown=!1;constructor(e){this.logger=e.logger}start(){this.setupFileWatcher(),this.setupRunSubscription()}trigger(){this.changeSubject$.next("<codegen-rebuild>")}async close(){this.isShuttingDown=!0,this.watcher&&(await this.watcher.close(),this.watcher=null),this.subscription?.unsubscribe(),this.changeSubject$.complete()}setupFileWatcher(){this.watcher=r(c,{ignored:g,cwd:process.cwd(),ignoreInitial:!0,persistent:!0}),this.watcher.on("all",(e,i)=>{("change"===e||"add"===e||"unlink"===e)&&(this.logger.debug(`Lingui source ${e}: ${i}`),this.changeSubject$.next(i))}).on("error",e=>{this.logger.error(`Lingui watcher error: ${e instanceof Error?e.message:String(e)}`,e)})}setupRunSubscription(){let e=this.changeSubject$.pipe(s(200));this.subscription=this.changeSubject$.pipe(t(e)).subscribe(e=>{let i=e.some(e=>!e.endsWith(".po"));this.runQueue.add(async()=>{if(!this.isShuttingDown)try{i?(this.logger.info("Lingui sources changed, extracting and compiling i18n messages..."),await o({logger:this.logger})):(this.logger.info("Lingui catalogs changed, compiling i18n messages..."),await n({logger:this.logger}))}catch(e){this.logger.error(`Lingui update failed: ${e instanceof Error?e.message:String(e)}`,e)}})})}}
@@ -1,4 +1,5 @@
1
1
  import { BehaviorSubject } from 'rxjs';
2
+ import type { ViteDevServer } from 'vite';
2
3
  /**
3
4
  * A frontend file script or standalone HTML proposal served from `.phoenix/variants/`.
4
5
  */
@@ -44,5 +45,7 @@ export interface VariantPreviewState {
44
45
  * editor server reaches it only through them. Events that carry no state stay on PhoenixPubSub.
45
46
  */
46
47
  export declare class PhoenixStore {
48
+ readonly viteServer$: BehaviorSubject<ViteDevServer | null>;
49
+ readonly reportedFingerprint$: BehaviorSubject<string | null>;
47
50
  readonly variantPreview$: BehaviorSubject<VariantPreviewState>;
48
51
  }
@@ -1 +1 @@
1
- import{BehaviorSubject as e}from"rxjs";export class PhoenixStore{variantPreview$=new e({open:null,activeChoice:null,unclaimed:null})}
1
+ import{BehaviorSubject as e}from"rxjs";export class PhoenixStore{viteServer$=new e(null);reportedFingerprint$=new e(null);variantPreview$=new e({open:null,activeChoice:null,unclaimed:null})}
@@ -1,2 +1,2 @@
1
- import{writeFile as e}from"node:fs/promises";import{createApiBaseClient as i}from"#package/client";import{resolveApplicationSpecDeploymentData as t}from"../application-spec/index.js";import{formatEnvContent as r,uploadFilesWithPresignedUrls as a}from"../utils/index.js";import{getDevelopmentCredentialHint as o,getDevelopmentHeaders as s}from"./development-credential.js";export const prepareDevelopmentEnvironment=async(n,l)=>{let{logger:p}=l,{projectSlug:d,environmentSlug:m,serverUrl:c,credential:h,outFile:v,skipUpload:f,overrideSchema:u,projectVersion:g}=n;p.step("Preparing development environment"),p.info(`Preparing development environment for project "${d}", environment "${m}"`);let E=i(c);p.debug(`Using server URL: ${c}`);let b=await t({skipUpload:f,logger:p});p.info("Preparing and activating the development deployment on the server...");let{data:P,error:$}=await E.POST("/environments/development/prepare",{body:{applicationVersion:b.applicationVersion,publishedDataHash:b.publishedDataHash,useAuthHook:b.useAuthHook,overrideSchema:u,configurationSchema:{version:b.schemaVersion,schema:b.schema},adminConfigurationSchema:b.adminSchema?{schema:b.adminSchema,version:b.adminSchemaVersion}:void 0,chat:b.chat,embeddings:b.embeddings,...b.assistant?{assistant:!0}:{},acl:{canCreate:b.aclCanCreate},privateFiles:[...b.assets.privateFilePaths],publicFiles:[...b.assets.publicFilePaths],sdkVersion:g},headers:s(h,{projectSlug:d,environmentSlug:m})});if($)throw Error(`Failed to prepare development deployment for ${d}/${m} on ${c}: ${$.message}. ${o(h,d)}`);if(!P)throw Error("No data returned from server while preparing the development deployment.");let{environmentVariables:y,privateUploadUrls:w,publicUploadUrls:F}=P;if(f)p.debug("Skipping file upload");else{p.info("Uploading files to S3...");let e={privateFiles:[...b.assets.privateFilesFullPaths].map(e=>{let i=e.replace("assets/private/",""),t=w[i];if(!t)throw Error(`No upload URL provided for private file ${i}, the server did not return a presigned URL for this file, please verify the file exists in the assets/private directory.`);return{localPath:e,uploadUrl:t}}),publicFiles:[...b.assets.publicFilesFullPaths].map(e=>{let i=e.replace("assets/public/",""),t=F[i];if(!t)throw Error(`No upload URL provided for public file ${i}, the server did not return a presigned URL for this file, please verify the file exists in the assets/public directory.`);return{localPath:e,uploadUrl:t}})};await a(e,{logger:p})}try{await e(v,`${r({...y,PHOENIX_PROJECT_SLUG:d,PHOENIX_ENVIRONMENT_SLUG:m,PHOENIX_SERVER_URL:c})}
1
+ import{writeFile as e}from"node:fs/promises";import{createApiBaseClient as i}from"#package/client";import{resolveApplicationSpecDeploymentData as t}from"../application-spec/index.js";import{formatEnvContent as r,uploadFilesWithPresignedUrls as a}from"../utils/index.js";import{getDevelopmentCredentialHint as o,getDevelopmentHeaders as s}from"./development-credential.js";export const prepareDevelopmentEnvironment=async(n,l)=>{let{logger:p}=l,{projectSlug:d,environmentSlug:m,serverUrl:c,credential:h,outFile:v,skipUpload:f,overrideSchema:u,projectVersion:E}=n;p.step("Preparing development environment"),p.info(`Preparing development environment for project "${d}", environment "${m}"`);let g=i(c);p.debug(`Using server URL: ${c}`);let P=await t({skipUpload:f,logger:p});p.info("Preparing and activating the development deployment on the server...");let{data:b,error:$}=await g.POST("/environments/development/prepare",{body:{applicationVersion:P.applicationVersion,publishedDataHash:P.publishedDataHash,useAuthHook:P.useAuthHook,overrideSchema:u,configurationSchema:{version:P.schemaVersion,schema:P.schema},adminConfigurationSchema:P.adminSchema?{schema:P.adminSchema,version:P.adminSchemaVersion}:void 0,chat:P.chat,embeddings:P.embeddings,...P.assistant?{assistant:!0}:{},acl:{canCreate:P.aclCanCreate},privateFiles:[...P.assets.privateFilePaths],publicFiles:[...P.assets.publicFilePaths],sdkVersion:E},headers:s(h,{projectSlug:d,environmentSlug:m})});if($)throw Error(`Failed to prepare development deployment for ${d}/${m} on ${c}: ${$.message}. ${o(h,d)}`);if(!b)throw Error("No data returned from server while preparing the development deployment.");let{environmentVariables:y,privateUploadUrls:N,publicUploadUrls:w}=b;if(f)p.debug("Skipping file upload");else{p.info("Uploading files to S3...");let e={privateFiles:[...P.assets.privateFilesFullPaths].map(e=>{let i=e.replace("assets/private/",""),t=N[i];if(!t)throw Error(`No upload URL provided for private file ${i}, the server did not return a presigned URL for this file, please verify the file exists in the assets/private directory.`);return{localPath:e,uploadUrl:t}}),publicFiles:[...P.assets.publicFilesFullPaths].map(e=>{let i=e.replace("assets/public/",""),t=w[i];if(!t)throw Error(`No upload URL provided for public file ${i}, the server did not return a presigned URL for this file, please verify the file exists in the assets/public directory.`);return{localPath:e,uploadUrl:t}})};await a(e,{logger:p})}try{await e(v,`${r({...y,PHOENIX_PROJECT_SLUG:d,PHOENIX_ENVIRONMENT_SLUG:m,PHOENIX_SERVER_URL:c,PHOENIX_DEPLOYMENT_FINGERPRINT:P.fingerprint})}
2
2
  `),p.debug(`Environment variables written to ${v}`)}catch{throw Error(`Failed to write environment variables to file at ${v}, please verify you have write permissions to this location.`)}p.info(`Project: ${d}`),p.info(`Environment: ${m}`),p.info(`Deployment ID: ${y.DEPLOYMENT_ID}`),p.success("Development environment prepared successfully!")};
@@ -0,0 +1,5 @@
1
+ /** A session-owned editor transport, including the result of binding its port. */
2
+ export interface EditorServerHandle {
3
+ readonly ready: Promise<void>;
4
+ readonly close: () => Promise<void>;
5
+ }
@@ -0,0 +1,2 @@
1
+ export { PhoenixApplication, type PhoenixApplicationProps, type PhoenixApplicationContext, type PhoenixDevelopmentOptions, } from './phoenix-application.js';
2
+ export type { EditorServerHandle } from './editor-server-handle.js';
@@ -0,0 +1 @@
1
+ export{PhoenixApplication}from"./phoenix-application.js";
@@ -0,0 +1,82 @@
1
+ import { Subject } from 'rxjs';
2
+ import { createServer } from 'vite';
3
+ import { type Logger } from '../../utils/index.js';
4
+ import { DeploymentPreparationService } from '../deployment/index.js';
5
+ import { type DevelopmentCredential } from '../development-credential.js';
6
+ import { LinguiWatcher } from '../lingui-watcher.js';
7
+ import { LogBus } from '../log-bus.js';
8
+ import { type BrowserConsoleEvent, PhoenixPubSub } from '../phoenix-pubsub.js';
9
+ import { PhoenixStore } from '../phoenix-store.js';
10
+ import { VariantPreviewService } from '../variant-preview-service.js';
11
+ import { WebhookTunnelMonitor } from '../webhook-tunnel-monitor.js';
12
+ import type { EditorServerHandle } from './editor-server-handle.js';
13
+ /** Resolved inputs for one development session; the application constructs its service graph. */
14
+ export interface PhoenixDevelopmentOptions {
15
+ readonly sdkVersion: string;
16
+ readonly projectSlug: string;
17
+ readonly environmentSlug: string;
18
+ readonly cliUseWorkspace: boolean | undefined;
19
+ readonly enableEditor: boolean | undefined;
20
+ readonly debug: boolean;
21
+ readonly withLingui: boolean;
22
+ readonly persistenceMode: string | undefined;
23
+ readonly force: boolean;
24
+ readonly serverUrl: string | undefined;
25
+ readonly credential: DevelopmentCredential | undefined;
26
+ readonly skipUpload: boolean;
27
+ }
28
+ export interface PhoenixApplicationProps {
29
+ readonly projectRoot: string;
30
+ readonly mode: 'dev' | 'story';
31
+ readonly development: PhoenixDevelopmentOptions | undefined;
32
+ readonly editorPort: number | undefined;
33
+ }
34
+ /** Host adapters for the editor transport and terminal presentation at lifecycle boundaries. */
35
+ export interface PhoenixApplicationContext {
36
+ readonly logger: Logger;
37
+ readonly createEditorServer: (props: {
38
+ readonly port: number;
39
+ readonly application: PhoenixApplication;
40
+ readonly logger: Logger;
41
+ readonly debug: boolean;
42
+ }) => EditorServerHandle;
43
+ readonly onProjectPrepared: (logs: LogBus) => void;
44
+ readonly onStartupFailure: (error: unknown) => void;
45
+ readonly onBrowserConsole: (event: BrowserConsoleEvent, logs: LogBus) => void;
46
+ }
47
+ /** Composes, starts and closes one dev or story session, including resources acquired during a failed start. */
48
+ export declare class PhoenixApplication {
49
+ private readonly props;
50
+ private readonly context;
51
+ readonly store: PhoenixStore;
52
+ readonly pubsub: PhoenixPubSub;
53
+ readonly failures$: Subject<Error>;
54
+ private readonly logsValue;
55
+ private readonly tunnelMonitorValue;
56
+ private readonly deploymentPreparationValue;
57
+ private variantPreviewsValue;
58
+ private linguiWatcherValue;
59
+ private projectWatcher;
60
+ private storyWatcher;
61
+ private mockTemplateWatcher;
62
+ private editorServer;
63
+ private webhookTunnel;
64
+ private browserConsoleSubscription;
65
+ private startPromise;
66
+ private closePromise;
67
+ constructor(props: PhoenixApplicationProps, context: PhoenixApplicationContext);
68
+ get logs(): LogBus | undefined;
69
+ get tunnelMonitor(): WebhookTunnelMonitor | undefined;
70
+ get deploymentPreparation(): DeploymentPreparationService | undefined;
71
+ get projectRoot(): string;
72
+ get mode(): 'dev' | 'story';
73
+ get variantPreviews(): VariantPreviewService | undefined;
74
+ get linguiWatcher(): LinguiWatcher | undefined;
75
+ start(): Promise<Awaited<ReturnType<typeof createServer>> | undefined>;
76
+ close(): Promise<void>;
77
+ private startSession;
78
+ private startEditor;
79
+ private startDevelopment;
80
+ private assertStarting;
81
+ private closeResources;
82
+ }
@@ -0,0 +1,2 @@
1
+ import{Subject as e}from"rxjs";import{createServer as t}from"vite";import{resolveGeneratedEnvFile as o}from"@salsita-ai/common/env";import{generateProjectFiles as r,getDeploymentFingerprint as s}from"../../application-spec/index.js";import{exists as i}from"../../utils/index.js";import{buildWebhooks as n,webhookLogContext as a}from"../../webhooks/index.js";import{ApplicationSpecProjectWatcher as l}from"../application-spec-project-watcher.js";import{ApplicationSpecStoryWatcher as c}from"../application-spec-story-watcher.js";import{DeploymentPreparationService as h,readGeneratedEnvMarkers as p}from"../deployment/index.js";import{getDevelopmentCredentialHint as u}from"../development-credential.js";import{LinguiWatcher as m}from"../lingui-watcher.js";import{LogBus as g}from"../log-bus.js";import{MockTemplateWatcher as d}from"../mock-template-watcher.js";import{PhoenixPubSub as v}from"../phoenix-pubsub.js";import{PhoenixStore as w}from"../phoenix-store.js";import{VariantPreviewService as b}from"../variant-preview-service.js";import{getViteDevConfig as S}from"../vite-config.js";import{createWebhookTunnelTransport as E,readOrCreateTunnelSessionId as x,startWebhookService as f}from"../webhook-service/index.js";import{WebhookTunnelMonitor as P}from"../webhook-tunnel-monitor.js";export class PhoenixApplication{props;context;store=new w;pubsub=new v;failures$=new e;logsValue;tunnelMonitorValue;deploymentPreparationValue;variantPreviewsValue;linguiWatcherValue;projectWatcher;storyWatcher;mockTemplateWatcher;editorServer;webhookTunnel;browserConsoleSubscription;startPromise;closePromise;constructor(e,t){this.props=e,this.context=t;let o="dev"===e.mode?e.development:void 0,r=o&&(!o.persistenceMode||"server"===o.persistenceMode);this.logsValue="dev"===e.mode?new g:void 0,this.tunnelMonitorValue=r&&o.serverUrl?new P(o.serverUrl):void 0,this.deploymentPreparationValue=r&&o.serverUrl&&o.credential?new h({serverUrl:o.serverUrl,credential:o.credential,projectSlug:o.projectSlug,environmentSlug:o.environmentSlug,sdkVersion:o.sdkVersion},{store:this.store,get logger(){return t.logger}}):void 0}get logs(){return this.logsValue}get tunnelMonitor(){return this.tunnelMonitorValue}get deploymentPreparation(){return this.deploymentPreparationValue}get projectRoot(){return this.props.projectRoot}get mode(){return this.props.mode}get variantPreviews(){return this.variantPreviewsValue}get linguiWatcher(){return this.linguiWatcherValue}start(){return this.startPromise??=this.startSession(),this.startPromise}close(){return this.closePromise??=this.closeResources(this.context.logger),this.closePromise}async startSession(){try{if(this.assertStarting(),"story"===this.mode)return void await this.startEditor();let e=this.logs;if(!e)throw Error("Cannot start development: the application has no log bus.");return this.browserConsoleSubscription=this.pubsub.browserConsole$.subscribe(t=>this.context.onBrowserConsole(t,e)),await this.startDevelopment()}catch(e){throw this.closePromise||this.context.onStartupFailure(e),await this.close(),e}}async startEditor(){let e=this.props.editorPort;void 0!==e&&("dev"===this.mode&&this.context.logger.step("Starting editor WebSocket server"),this.editorServer=this.context.createEditorServer({port:e,application:this,logger:this.context.logger,debug:this.props.development?.debug??!1}),await this.editorServer.ready,this.assertStarting(),"dev"===this.mode&&this.context.logger.debug(`Editor WebSocket server started on port ${e}`),this.mockTemplateWatcher=new d({projectRoot:this.projectRoot,pubsub:this.pubsub,logger:this.context.logger}),this.mockTemplateWatcher.start(),"story"===this.mode&&(this.storyWatcher=new c({projectRoot:this.projectRoot,pubsub:this.pubsub,logger:this.context.logger}),this.storyWatcher.start()))}async startDevelopment(){let e=this.props.development,c=this.logs;if(!e||!c)throw Error("Cannot start development: session options are missing. Supply development options when constructing the application.");let{sdkVersion:h,projectSlug:g,environmentSlug:d,cliUseWorkspace:v,enableEditor:w,debug:P,withLingui:j,persistenceMode:y,force:k,serverUrl:V,credential:W,skipUpload:R}=e,{store:N,pubsub:T,deploymentPreparation:I,tunnelMonitor:_}=this;process.env.NODE_ENV="development",y&&(process.env.PERSISTENCE_MODE=y);let O=!y||"server"===y;if(O&&V&&(process.env.SERVER_URL=V),this.context.logger.step("Starting development mode"),!await i("spec"))throw Object.assign(Error('Spec folder not found. Run "phoenix init" first.'),{code:"SPEC_NOT_FOUND"});if(O&&(!V||!W))throw Error("Server persistence needs a server and a credential. Run `phoenix login <workspace>`, or create a development environment in Studio and paste its .env block into .env.");this.context.logger.step("Building project files");let{templateFiles:D,applicationSpec:$}=await r({sdkVersion:h,projectSlug:g,environmentSlug:d,cliUseWorkspace:v,enableEditor:w,withLingui:j,force:k},{logger:this.context.logger});if(this.assertStarting(),this.context.logger.success("Project files built successfully"),O&&V&&W){let e=o("."),t=await p(e);k||t?.PHOENIX_PROJECT_SLUG!==g||t.PHOENIX_ENVIRONMENT_SLUG!==d||t.PHOENIX_SERVER_URL!==V||t.PHOENIX_DEPLOYMENT_FINGERPRINT!==s($)?(this.context.logger.step("Preparing development deployment"),await I?.prepareAtStartup({skipUpload:R,debug:P})):this.context.logger.debug(`${e} matches the current development environment, skipping prepare`)}if(this.assertStarting(),this.context.onProjectPrepared(c),j?(this.linguiWatcherValue=new m({logger:this.context.logger}),this.linguiWatcherValue.start()):this.context.logger.warn("Continuous Lingui updates are disabled; missing catalogs were bootstrapped at startup. Pass --withLingui or set WITH_LINGUI=true to enable."),O&&(this.context.logger.step("Building webhooks"),await a.run("webhook",async()=>{await n({experimental:!0,skipNodeEnvOverride:!0,webhookEntryPoint:"./.phoenix/.swc/.phoenix/webhook.js"})})),O&&V&&W){let e=o("."),t=await p(e);if(!t?.DEPLOYMENT_ID)throw Error(`Webhook tunnel cannot start because ${e} has no DEPLOYMENT_ID. Rerun phoenix dev to prepare the development deployment.`);this.assertStarting();let r=await x();this.assertStarting();let s=await f({experimental:!0,transport:E({serverUrl:V,credential:W,projectSlug:g,environmentSlug:d}),rejectionHint:u(W,g),environmentSlug:d,deploymentId:t.DEPLOYMENT_ID,sessionId:r,onStatus:(e,o)=>{_?.setStatus(e,{deploymentId:t.DEPLOYMENT_ID,sessionId:r,message:o??null})},onRequest:e=>_?.record(e)});this.closePromise&&(await s.stop(),this.assertStarting()),this.webhookTunnel=s,_?.setStatus("waiting",{deploymentId:t.DEPLOYMENT_ID,sessionId:r}),s.stopped.catch(e=>{this.failures$.next(Error(`Webhook tunnel failed: ${e instanceof Error?e.message:String(e)}`)),this.close()}),this.context.logger.success("Webhook tunnel started")}this.assertStarting();let M=new l({pubsub:T,logger:this.context.logger,sdkVersion:h,projectSlug:g,environmentSlug:d,cliUseWorkspace:v,enableEditor:w??!0,inlineTemplates:!1,useServer:O},{store:N,linguiWatcher:this.linguiWatcherValue,deploymentPreparation:I});this.projectWatcher=M,this.variantPreviewsValue=new b({projectRoot:this.projectRoot},{store:N,logger:this.context.logger,projectWatcher:M}),w&&void 0!==this.props.editorPort&&await this.startEditor();let C=await S({templateFiles:D}),L=await t(C);return this.closePromise&&(await L.close(),this.assertStarting()),this.store.viteServer$.next(L),await L.listen(),this.assertStarting(),this.context.logger.step("Starting Vite dev server"),M.start(L),L}assertStarting(){if(this.closePromise)throw Error("Cannot continue startup: the session has already closed. Start a new Phoenix application.")}async closeResources(e){"dev"===this.mode&&e.debug("Shutting down...");let t="story"===this.mode?[{name:"story source watcher",close:()=>this.storyWatcher?.close()},{name:"mock-template watcher",close:()=>this.mockTemplateWatcher?.close()},{name:"editor server",close:()=>this.editorServer?.close()}]:[{name:"lingui watcher",close:()=>this.linguiWatcherValue?.close()},{name:"project watcher",close:()=>this.projectWatcher?.close()},{name:"mock template watcher",close:()=>this.mockTemplateWatcher?.close()},{name:"editor server",close:()=>this.editorServer?.close()},{name:"variant previews",close:()=>this.variantPreviewsValue?.dispose()},{name:"vite server",close:()=>this.store.viteServer$.value?.close()},{name:"webhook tunnel",close:()=>this.webhookTunnel?.stop()}],o=[];for(let r of t)try{"dev"===this.mode&&e.debug(`Shutting down ${r.name}`),await r.close()}catch(s){let t=s instanceof Error?s.message:String(s);"story"===this.mode?e.warn(`Failed to close the story-dev ${r.name}: ${t}. The process will continue shutting down.`):o.push(`${r.name}: ${t}`)}this.browserConsoleSubscription?.unsubscribe(),this.failures$.complete(),o.length>0&&e.warn(`Cleanup warnings:
2
+ ${o.join("\n ")}`),"dev"===this.mode&&e.debug("Shutdown complete")}}
@@ -0,0 +1,9 @@
1
+ import type { TelemetryEvent } from './telemetry-event.js';
2
+ export interface TelemetryTransport {
3
+ readonly send: (events: readonly TelemetryEvent[], timeoutMs: number) => Promise<void>;
4
+ }
5
+ interface AmplitudeTelemetryTransportContext {
6
+ readonly fetch: typeof fetch;
7
+ }
8
+ export declare const createAmplitudeTelemetryTransport: (context?: AmplitudeTelemetryTransportContext) => TelemetryTransport;
9
+ export {};
@@ -0,0 +1 @@
1
+ let e=e=>({event_type:e.name,device_id:e.deviceId,...void 0===e.userId?{}:{user_id:e.userId},insert_id:e.eventId,time:e.occurredAt.getTime(),event_properties:e.properties}),t=e=>429===e.status||e.status>=500;export const createAmplitudeTelemetryTransport=(r={fetch})=>({send:async(a,i)=>{if(0===a.length)return;let n=new AbortController,o=setTimeout(()=>n.abort(),i),s=JSON.stringify({api_key:"46b8fa9ce868c9da04f8ad2b6715a2f7",events:a.map(e)});try{for(let e=0;e<2;e+=1)try{let e=await r.fetch("https://api2.amplitude.com/2/httpapi",{method:"POST",headers:{"content-type":"application/json"},body:s,signal:n.signal});if(await e.body?.cancel(),e.ok||!t(e))return}catch{if(n.signal.aborted)return}}finally{n.abort(),clearTimeout(o)}}});
@@ -0,0 +1,3 @@
1
+ export { createTelemetryClient, type CommandTelemetryAttempt, type TelemetryClient } from './telemetry-client.js';
2
+ export { resolveTelemetryCommand, type TelemetryCommand } from './telemetry-command.js';
3
+ export type { TelemetryAssociation } from './telemetry-state.js';
@@ -0,0 +1 @@
1
+ export{createTelemetryClient}from"./telemetry-client.js";export{resolveTelemetryCommand}from"./telemetry-command.js";
@@ -0,0 +1,25 @@
1
+ import { type TelemetryTransport } from './amplitude-telemetry-transport.js';
2
+ import type { TelemetryCommand } from './telemetry-command.js';
3
+ import { type TelemetryFailureCategory, type TelemetryOutcome } from './telemetry-event.js';
4
+ import { type TelemetryAssociation, type TelemetryIdentity } from './telemetry-state.js';
5
+ export interface CommandTelemetryAttempt {
6
+ readonly ready: () => void;
7
+ readonly complete: (outcome: TelemetryOutcome, failureCategory?: TelemetryFailureCategory) => void;
8
+ }
9
+ export interface TelemetryClient {
10
+ readonly startCommandAttempt: (command: TelemetryCommand) => CommandTelemetryAttempt;
11
+ readonly identify: (association: TelemetryAssociation) => Promise<void>;
12
+ readonly flush: () => Promise<void>;
13
+ }
14
+ interface CreateTelemetryClientProps {
15
+ readonly sdkVersion: string;
16
+ }
17
+ interface TelemetryClientContext {
18
+ readonly createId: () => string;
19
+ readonly loadIdentity: () => Promise<TelemetryIdentity>;
20
+ readonly now: () => Date;
21
+ readonly saveAssociation: (identity: TelemetryIdentity, association: TelemetryAssociation) => Promise<void>;
22
+ readonly transport: TelemetryTransport;
23
+ }
24
+ export declare const createTelemetryClient: (props: CreateTelemetryClientProps, context?: TelemetryClientContext) => Promise<TelemetryClient>;
25
+ export {};
@@ -0,0 +1 @@
1
+ import{randomUUID as t}from"node:crypto";import{createAmplitudeTelemetryTransport as e}from"./amplitude-telemetry-transport.js";import{createCommandEvent as r}from"./telemetry-event.js";import{loadTelemetryIdentity as o,saveTelemetryAssociation as n}from"./telemetry-state.js";let a={ready:()=>void 0,complete:()=>void 0},s={startCommandAttempt:()=>a,identify:async()=>void 0,flush:async()=>void 0};export const createTelemetryClient=async(a,i={createId:t,loadIdentity:o,now:()=>new Date,saveAssociation:n,transport:e()})=>{if("1"===process.env.PHOENIX_TELEMETRY_DISABLED)return s;try{var d;let t,e;return d=await i.loadIdentity(),t=[],e=d,{startCommandAttempt:o=>{let n=i.createId(),s=i.now(),d=!1,c=!1;return t=[...t,r({identity:e,sdkVersion:a.sdkVersion,command:o,attemptId:n,phase:"started",outcome:"unknown",occurredAt:s},i)],{ready:()=>{if("dev"!==o||c||d)return;c=!0;let m=i.now();t=[...t,r({identity:e,sdkVersion:a.sdkVersion,command:o,attemptId:n,phase:"ready",outcome:"unknown",occurredAt:m,durationMs:Math.max(0,m.getTime()-s.getTime())},i)]},complete:(c,m)=>{if(d)return;d=!0;let u=i.now();t=[...t,r({identity:e,sdkVersion:a.sdkVersion,command:o,attemptId:n,phase:"completed",outcome:c,occurredAt:u,durationMs:Math.max(0,u.getTime()-s.getTime()),failureCategory:m},i)]}}},identify:async t=>{e={...e,...t};try{await i.saveAssociation(e,t)}catch{return}},flush:async()=>{let e=t;t=[];try{await i.transport.send(e,1e3)}catch{return}}}}catch{return s}};
@@ -0,0 +1,2 @@
1
+ export type TelemetryCommand = 'build' | 'changelog' | 'check' | 'clean' | 'deploy' | 'deployment:activate' | 'deployment:build-envs' | 'deployment:extract-sources' | 'deployment:finish' | 'deployment:prepare' | 'deployment:prepare-dev' | 'deployment:prepare-local' | 'deployment:register' | 'dev' | 'docs' | 'environment:cleanup' | 'environment:create' | 'environment:list' | 'feedback' | 'fix' | 'init' | 'inspect:assets' | 'inspect:data' | 'inspect:scene' | 'inspect:state' | 'link' | 'login' | 'logout' | 'prepare:ci' | 'screenshot' | 'story' | 'sync' | 'unlink' | 'variants';
2
+ export declare const resolveTelemetryCommand: (arguments_: readonly string[]) => TelemetryCommand | null;
@@ -0,0 +1 @@
1
+ let e={b:"build",build:"build",c:"check",changelog:"changelog",check:"check",ci:"prepare:ci",cl:"clean",clean:"clean",clog:"changelog",d:"dev",da:"deployment:activate",dbe:"deployment:build-envs",deploy:"deploy","dep:activate":"deployment:activate","dep:build-envs":"deployment:build-envs","dep:finish":"deployment:finish","dep:prepare":"deployment:prepare","dep:prepare-dev":"deployment:prepare-dev","dep:prepare-local":"deployment:prepare-local","dep:register":"deployment:register","deployment:activate":"deployment:activate","deployment:build-envs":"deployment:build-envs","deployment:extract-sources":"deployment:extract-sources","deployment:finish":"deployment:finish","deployment:prepare":"deployment:prepare","deployment:prepare-dev":"deployment:prepare-dev","deployment:prepare-local":"deployment:prepare-local","deployment:register":"deployment:register",dev:"dev",df:"deployment:finish",doc:"docs",docs:"docs",dp:"deployment:prepare",dpd:"deployment:prepare-dev",dpl:"deployment:prepare-local",dr:"deployment:register",ec:"environment:cleanup","env:cleanup":"environment:cleanup","env:create":"environment:create","env:list":"environment:list","environment:cleanup":"environment:cleanup","environment:create":"environment:create","environment:list":"environment:list",f:"fix",feedback:"feedback",fix:"fix",ia:"inspect:assets",id:"inspect:data",init:"init","inspect:assets":"inspect:assets","inspect:data":"inspect:data","inspect:scene":"inspect:scene","inspect:state":"inspect:state",is:"inspect:state",isc:"inspect:scene",l:"link",link:"link",login:"login",logout:"logout",pci:"prepare:ci","prepare:ci":"prepare:ci",s:"sync",screenshot:"screenshot",ss:"screenshot",st:"story",story:"story",sync:"sync",ul:"unlink",unlink:"unlink",variants:"variants"};export const resolveTelemetryCommand=n=>e[n[0]??""]??null;
@@ -0,0 +1,44 @@
1
+ import type { TelemetryCommand } from './telemetry-command.js';
2
+ import type { TelemetryIdentity } from './telemetry-state.js';
3
+ export type TelemetryOutcome = 'succeeded' | 'failed';
4
+ export type TelemetryFailureCategory = 'command_failed';
5
+ export type TelemetrySource = 'cli' | 'studio' | 'backend' | 'preview';
6
+ export type TelemetryClassification = 'internal' | 'beta' | 'general' | 'unknown';
7
+ export interface TelemetryEvent {
8
+ /** Unique event delivery identity, mapped to Amplitude's insert_id. */
9
+ readonly eventId: string;
10
+ readonly name: 'cli_command_started' | 'cli_dev_server_ready' | 'cli_command_completed';
11
+ readonly occurredAt: Date;
12
+ readonly deviceId: string;
13
+ readonly userId?: string;
14
+ readonly properties: {
15
+ readonly schema_version: 1;
16
+ readonly source: TelemetrySource;
17
+ readonly command: TelemetryCommand;
18
+ readonly attempt_id: string;
19
+ readonly phase: 'started' | 'ready' | 'completed';
20
+ readonly outcome: 'unknown' | TelemetryOutcome;
21
+ readonly duration_ms?: number;
22
+ readonly failure_category?: TelemetryFailureCategory;
23
+ readonly sdk_version: string;
24
+ readonly classification: TelemetryClassification;
25
+ readonly work_session_id: string;
26
+ readonly workspace_id?: string;
27
+ };
28
+ }
29
+ interface CreateCommandEventProps {
30
+ readonly identity: TelemetryIdentity;
31
+ readonly sdkVersion: string;
32
+ readonly command: TelemetryCommand;
33
+ readonly attemptId: string;
34
+ readonly phase: 'started' | 'ready' | 'completed';
35
+ readonly outcome: 'unknown' | TelemetryOutcome;
36
+ readonly occurredAt: Date;
37
+ readonly durationMs?: number;
38
+ readonly failureCategory?: TelemetryFailureCategory;
39
+ }
40
+ interface TelemetryEventContext {
41
+ readonly createId: () => string;
42
+ }
43
+ export declare const createCommandEvent: (props: CreateCommandEventProps, context: TelemetryEventContext) => TelemetryEvent;
44
+ export {};
@@ -0,0 +1 @@
1
+ export const createCommandEvent=(e,t)=>({eventId:t.createId(),name:"ready"===e.phase?"cli_dev_server_ready":"started"===e.phase?"cli_command_started":"cli_command_completed",occurredAt:e.occurredAt,deviceId:e.identity.installationId,..."userId"in e.identity?{userId:e.identity.userId}:{},properties:{schema_version:1,source:"cli",command:e.command,attempt_id:e.attemptId,phase:e.phase,outcome:e.outcome,...void 0===e.durationMs?{}:{duration_ms:e.durationMs},...void 0===e.failureCategory?{}:{failure_category:e.failureCategory},sdk_version:e.sdkVersion,classification:"userId"in e.identity?"general":"unknown",work_session_id:e.identity.workSessionId,..."workspaceId"in e.identity?{workspace_id:e.identity.workspaceId}:{}}});
@@ -0,0 +1,25 @@
1
+ export interface AnonymousTelemetryIdentity {
2
+ /** Random identifier for one operating-system user profile, without machine or account data. */
3
+ readonly installationId: string;
4
+ /** Random identifier for CLI activity separated by less than thirty minutes. */
5
+ readonly workSessionId: string;
6
+ }
7
+ export interface TelemetryAssociation {
8
+ /** Stable authenticated builder user ID, mapped to Amplitude's user_id after authentication. */
9
+ readonly userId: string;
10
+ /** Internal UUID of the SDK-builder workspace the CLI authenticated against. */
11
+ readonly workspaceId: string;
12
+ }
13
+ export type TelemetryIdentity = AnonymousTelemetryIdentity | (AnonymousTelemetryIdentity & TelemetryAssociation);
14
+ interface TelemetryStateContext {
15
+ readonly createId: () => string;
16
+ readonly now: () => Date;
17
+ }
18
+ export declare const getTelemetryStatePath: () => string;
19
+ /**
20
+ * Loads the anonymous CLI identity and records current activity. Broken or unwritable state never blocks a command:
21
+ * the invocation gets an ephemeral identity, while an invalid existing file is left untouched for inspection.
22
+ */
23
+ export declare const loadTelemetryIdentity: (context?: TelemetryStateContext) => Promise<TelemetryIdentity>;
24
+ export declare const saveTelemetryAssociation: (identity: TelemetryIdentity, association: TelemetryAssociation) => Promise<void>;
25
+ export {};
@@ -0,0 +1,2 @@
1
+ import{randomUUID as t}from"node:crypto";import{chmod as e,mkdir as i,readFile as n,writeFile as a}from"node:fs/promises";import{homedir as s}from"node:os";import{dirname as r,join as o}from"node:path";import{z as d}from"zod";let l=d.object({installationId:d.string().uuid(),workSessionId:d.string().uuid(),lastActiveAt:d.string().datetime()}),c=d.union([l.extend({userId:d.string().min(5),workspaceId:d.string().uuid()}),l.strict()]),I={createId:t,now:()=>new Date};export const getTelemetryStatePath=()=>process.env.PHOENIX_TELEMETRY_FILE??o(s(),".phoenix","telemetry.json");let u=async(t,n)=>{await i(r(t),{recursive:!0,mode:448}),await a(t,`${JSON.stringify(n,null,2)}
2
+ `,{mode:384}),await e(t,384)},w=async t=>{let e;try{e=await n(t,"utf8")}catch(t){return t instanceof Error&&"code"in t&&"ENOENT"===t.code?{kind:"missing"}:{kind:"invalid"}}try{let t=c.safeParse(JSON.parse(e));return t.success?{kind:"valid",state:t.data}:{kind:"invalid"}}catch{return{kind:"invalid"}}};export const loadTelemetryIdentity=async(t=I)=>{let e=getTelemetryStatePath(),i=await w(e),n="valid"===i.kind?i.state:null,a=t.now(),s=null===n?null:Date.parse(n.lastActiveAt),r=null===s||a.getTime()-s>=18e5,o=null===n?{installationId:t.createId(),workSessionId:t.createId(),lastActiveAt:a.toISOString()}:{...n,workSessionId:r?t.createId():n.workSessionId,lastActiveAt:a.toISOString()};try{"invalid"!==i.kind&&await u(e,o)}catch{return{installationId:o.installationId,workSessionId:o.workSessionId}}return{installationId:o.installationId,workSessionId:o.workSessionId,..."userId"in o&&"workspaceId"in o?{userId:o.userId,workspaceId:o.workspaceId}:{}}};export const saveTelemetryAssociation=async(t,e)=>{let i=getTelemetryStatePath(),n=await w(i);"valid"===n.kind&&n.state.installationId===t.installationId&&n.state.workSessionId===t.workSessionId&&await u(i,{...n.state,...e})};
@@ -1 +1 @@
1
- import{getConfig as e}from"@lingui/conf";import{lingui as i}from"@lingui/vite-plugin";import t from"@vitejs/plugin-react";import{mkdir as n,readFile as r,writeFile as o}from"fs/promises";import a from"lodash-es/camelCase.js";import{createRequire as s}from"node:module";import{dirname as l,resolve as m}from"path";import{createLogger as f}from"vite";import p from"vite-plugin-css-injected-by-js";import{isUsingLocalSdk as d}from"../utils/package-info.js";import{loadFrontendConfigModule as c}from"./frontend-config.js";import{LINGUI_CONFIG_PATH as g}from"./lingui.js";import{phxBannerPlugin as u}from"./phx-banner-plugin.js";import{phxCspNoncePlugin as h}from"./phx-csp-nonce-plugin.js";import{phxGlobalIsolationPlugin as b}from"./phx-global-isolation-plugin.js";import{phxLicensesPlugin as S}from"./phx-licenses-plugin.js";import{phxVariantPreviewsPlugin as y}from"./phx-variant-previews-plugin.js";let O=null;export const setViteLogSink=(e,i={})=>{O={sink:e,echo:i.echo??!1}};let x=["react","react-dom","three","@react-three/fiber","@react-three/drei","@react-three/postprocessing","its-fine","@emotion/react","@emotion/styled","@mui/material","@mui/system","@tanstack/react-query","rxjs"],D=()=>[s(import.meta.url).resolve("@lingui/babel-plugin-lingui-macro"),{linguiConfig:e({configPath:g})}],E=e=>{let i=e.DEPLOYMENT_ID;if("string"!=typeof i)throw Error("DEPLOYMENT_ID is required in runtime config");return i};export const getViteDevConfig=async e=>{var n,r;let o,a,p=d(),u=c(),h=u.readRuntimeConfig(),S=u.frontendBuildConfig,v=D(),j=Object.fromEntries((e?.templateFiles??[]).map(e=>[e,`.phoenix/${e}`]));return{...O&&{customLogger:(n=O.sink,r=O.echo,o=f(),{get hasWarned(){return o.hasWarned},info:(e,i)=>{n("info",e),r&&o.info(e,i)},warn:(e,i)=>{n("warn",e),r&&o.warn(e,i)},warnOnce:(e,i)=>{n("warn",e),r&&o.warnOnce(e,i)},error:(e,i)=>{n("error",e),r&&o.error(e,i)},clearScreen:e=>{r&&o.clearScreen(e)},hasErrorLogged:e=>o.hasErrorLogged(e)}),...O.echo?{}:{clearScreen:!1}},mode:"development",optimizeDeps:{exclude:["@swc/wasm-web"],...p&&{entries:["index.html","admin.html",...e?.templateFiles??[]],force:!0}},...p&&{resolve:{alias:(a=s(m(process.cwd(),"package.json")),x.flatMap(e=>{try{let i=l(a.resolve(`${e}/package.json`));return[{find:RegExp(`^${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(/|$)`),replacement:`${i}$1`}]}catch{return[]}}))}},plugins:[t({babel:{plugins:[v]}}),i({configPath:g}),{name:"vite:runtime-config",apply:(e,i)=>"build"===i.command||"development"===i.mode,config:e=>{let i=u.readRuntimeConfig(),t=u.frontendBuildConfig;return{...e,define:{...e.define,"phx.frontendEnv":JSON.stringify(i),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(t.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(t.gltfDecoder)}}}},b({getDeploymentId:()=>E(u.readRuntimeConfig())}),y()],define:{"process.env":{},"import.meta.env.DEV":!0,"import.meta.env.PROD":!1,"phx.frontendEnv":JSON.stringify(h),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(S.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(S.gltfDecoder)},build:{rollupOptions:{input:{index:".phoenix/index.html",admin:".phoenix/admin.html",...j}}},root:m(process.cwd(),"./.phoenix"),server:{watch:{ignored:["./**/*.{ts,tsx}","./.swc/**","../spec/**","../src/**"]}}}};export const getViteBuildConfigs=async e=>{let s=c(),f=s.readRuntimeConfig(),d=s.frontendBuildConfig,y=D(),O=S(),x=u({sdkVersion:e.sdkVersion,banner:e.banner}),v=[{name:"salsita-configurator",entryFile:"./configurator.ts",mainScriptPath:"./configurator.ts",htmlFiles:["./index.html",...{templateFiles:e.templateFiles}.templateFiles],main:!0,format:"iife"},{name:"salsita-admin",entryFile:"./admin.ts",mainScriptPath:"./admin.ts",htmlFiles:["./admin.html"],main:!1,format:"iife"},{name:"salsita-embedded-admin",entryFile:"./embedded-admin.ts",mainScriptPath:"./embedded-admin.ts",htmlFiles:[],main:!1,format:"es"},{name:"salsita-embedded-configurator",entryFile:"./embedded-configurator.ts",mainScriptPath:"./embedded-configurator.ts",htmlFiles:[],main:!1,format:"es"}].map(c=>({plugins:[t({babel:{plugins:[y]}}),i({configPath:g}),p({useStrictCSP:!0}),h(),b({getDeploymentId:()=>E(s.readRuntimeConfig())}),{name:"vite:lib-index",writeBundle:async()=>{if(!c.htmlFiles.length)return;let i="iife"===c.format?`${c.name}.iife.js`:`${c.name}.js`;for(let t of c.htmlFiles){if(c.main&&e.enableEditor&&"./index.html"===t)continue;let a=m("./.phoenix",t),s=m("./.phoenix/dist/frontend",t);await n(l(s),{recursive:!0});let f=(await r(a,"utf-8")).replace(c.mainScriptPath,i);await o(s,f,"utf-8")}}},O,x],build:{outDir:"./dist/frontend",chunkSizeWarningLimit:4e3,lib:{entry:c.entryFile,name:a(c.name),formats:[c.format],fileName:()=>"iife"===c.format?`${c.name}.iife.js`:`${c.name}.js`},rollupOptions:{external:[],output:{assetFileNames:`${c.name}.[ext]`}},minify:!0,emptyOutDir:!1},root:m(process.cwd(),"./.phoenix"),define:{"process.env":{},"process.env.NODE_ENV":JSON.stringify("production"),"phx.frontendEnv":JSON.stringify(f),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(d.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(d.gltfDecoder)}}));return e.enableEditor?[...v,{plugins:[t({babel:{plugins:[y]}}),i({configPath:g}),p({useStrictCSP:!0}),h(),O,x],build:{outDir:"./dist/frontend",chunkSizeWarningLimit:4e3,rollupOptions:{external:[]},minify:!0,emptyOutDir:!1},root:m(process.cwd(),"./.phoenix"),define:{"process.env":{},"process.env.NODE_ENV":JSON.stringify("production"),"phx.frontendEnv":JSON.stringify(f),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(d.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(d.gltfDecoder)}}]:v};
1
+ import{getConfig as e}from"@lingui/conf";import{lingui as i}from"@lingui/vite-plugin";import t from"@vitejs/plugin-react";import{mkdir as n,readFile as r,writeFile as o}from"fs/promises";import a from"lodash-es/camelCase.js";import{createHash as s}from"node:crypto";import{readFileSync as l,rmSync as m,writeFileSync as p}from"node:fs";import{createRequire as f}from"node:module";import{dirname as d,resolve as c}from"path";import{createLogger as g}from"vite";import u from"vite-plugin-css-injected-by-js";import{LINGUI_CONFIG_PATH as h}from"../lingui/index.js";import{isUsingLocalSdk as y}from"../utils/package-info.js";import{loadFrontendConfigModule as b}from"./frontend-config.js";import{phxBannerPlugin as S}from"./phx-banner-plugin.js";import{phxCspNoncePlugin as x}from"./phx-csp-nonce-plugin.js";import{phxGlobalIsolationPlugin as O}from"./phx-global-isolation-plugin.js";import{phxLicensesPlugin as D}from"./phx-licenses-plugin.js";import{phxVariantPreviewsPlugin as E}from"./phx-variant-previews-plugin.js";let v=null;export const setViteLogSink=(e,i={})=>{v={sink:e,echo:i.echo??!1}};let P=["react","react-dom","three","@react-three/fiber","@react-three/drei","@react-three/postprocessing","its-fine","@emotion/react","@emotion/styled","@mui/material","@mui/system","@tanstack/react-query","rxjs"],j=()=>{let t=l(h),n=s("sha256").update(t).digest("hex"),r=c(`${h}.${process.pid}.${n}.json`);try{return p(r,t),{macroPlugin:[f(import.meta.url).resolve("@lingui/babel-plugin-lingui-macro"),{linguiConfig:e({configPath:r})}],catalogPlugin:i({configPath:r})}}finally{m(r,{force:!0})}},C=e=>{let i=e.DEPLOYMENT_ID;if("string"!=typeof i)throw Error("DEPLOYMENT_ID is required in runtime config");return i};export const getViteDevConfig=async e=>{var i,n;let r,o,a=y(),s=b(),l=s.readRuntimeConfig(),m=s.frontendBuildConfig,p=j(),u=Object.fromEntries((e?.templateFiles??[]).map(e=>[e,`.phoenix/${e}`]));return{...v&&{customLogger:(i=v.sink,n=v.echo,r=g(),{get hasWarned(){return r.hasWarned},info:(e,t)=>{i("info",e),n&&r.info(e,t)},warn:(e,t)=>{i("warn",e),n&&r.warn(e,t)},warnOnce:(e,t)=>{i("warn",e),n&&r.warnOnce(e,t)},error:(e,t)=>{i("error",e),n&&r.error(e,t)},clearScreen:e=>{n&&r.clearScreen(e)},hasErrorLogged:e=>r.hasErrorLogged(e)}),...v.echo?{}:{clearScreen:!1}},mode:"development",optimizeDeps:{exclude:["@swc/wasm-web"],...a&&{entries:["index.html","admin.html",...e?.templateFiles??[]],force:!0}},...a&&{resolve:{alias:(o=f(c(process.cwd(),"package.json")),P.flatMap(e=>{try{let i=d(o.resolve(`${e}/package.json`));return[{find:RegExp(`^${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(/|$)`),replacement:`${i}$1`}]}catch{return[]}}))}},plugins:[t({babel:{plugins:[p.macroPlugin]}}),p.catalogPlugin,{name:"vite:runtime-config",apply:(e,i)=>"build"===i.command||"development"===i.mode,config:e=>{let i=s.readRuntimeConfig(),t=s.frontendBuildConfig;return{...e,define:{...e.define,"phx.frontendEnv":JSON.stringify(i),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(t.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(t.gltfDecoder)}}}},O({getDeploymentId:()=>C(s.readRuntimeConfig())}),E()],define:{"process.env":{},"import.meta.env.DEV":!0,"import.meta.env.PROD":!1,"phx.frontendEnv":JSON.stringify(l),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(m.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(m.gltfDecoder)},build:{rollupOptions:{input:{index:".phoenix/index.html",admin:".phoenix/admin.html",...u}}},root:c(process.cwd(),"./.phoenix"),server:{watch:{ignored:["./**/*.{ts,tsx}","./.swc/**","../spec/**","../src/**"]}}}};export const getViteBuildConfigs=async e=>{let i=b(),s=i.readRuntimeConfig(),l=i.frontendBuildConfig,m=j(),p=D(),f=S({sdkVersion:e.sdkVersion,banner:e.banner}),g=[{name:"salsita-configurator",entryFile:"./configurator.ts",mainScriptPath:"./configurator.ts",htmlFiles:["./index.html",...{templateFiles:e.templateFiles}.templateFiles],main:!0,format:"iife"},{name:"salsita-admin",entryFile:"./admin.ts",mainScriptPath:"./admin.ts",htmlFiles:["./admin.html"],main:!1,format:"iife"},{name:"salsita-embedded-admin",entryFile:"./embedded-admin.ts",mainScriptPath:"./embedded-admin.ts",htmlFiles:[],main:!1,format:"es"},{name:"salsita-embedded-configurator",entryFile:"./embedded-configurator.ts",mainScriptPath:"./embedded-configurator.ts",htmlFiles:[],main:!1,format:"es"}].map(g=>({plugins:[t({babel:{plugins:[m.macroPlugin]}}),m.catalogPlugin,u({useStrictCSP:!0}),x(),O({getDeploymentId:()=>C(i.readRuntimeConfig())}),{name:"vite:lib-index",writeBundle:async()=>{if(!g.htmlFiles.length)return;let i="iife"===g.format?`${g.name}.iife.js`:`${g.name}.js`;for(let t of g.htmlFiles){if(g.main&&e.enableEditor&&"./index.html"===t)continue;let a=c("./.phoenix",t),s=c("./.phoenix/dist/frontend",t);await n(d(s),{recursive:!0});let l=(await r(a,"utf-8")).replace(g.mainScriptPath,i);await o(s,l,"utf-8")}}},p,f],build:{outDir:"./dist/frontend",chunkSizeWarningLimit:4e3,lib:{entry:g.entryFile,name:a(g.name),formats:[g.format],fileName:()=>"iife"===g.format?`${g.name}.iife.js`:`${g.name}.js`},rollupOptions:{external:[],output:{assetFileNames:`${g.name}.[ext]`}},minify:!0,emptyOutDir:!1},root:c(process.cwd(),"./.phoenix"),define:{"process.env":{},"process.env.NODE_ENV":JSON.stringify("production"),"phx.frontendEnv":JSON.stringify(s),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(l.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(l.gltfDecoder)}}));return e.enableEditor?[...g,{plugins:[t({babel:{plugins:[m.macroPlugin]}}),m.catalogPlugin,u({useStrictCSP:!0}),x(),p,f],build:{outDir:"./dist/frontend",chunkSizeWarningLimit:4e3,rollupOptions:{external:[]},minify:!0,emptyOutDir:!1},root:c(process.cwd(),"./.phoenix"),define:{"process.env":{},"process.env.NODE_ENV":JSON.stringify("production"),"phx.frontendEnv":JSON.stringify(s),"globalThis.PHX_SCHEMA_VALIDATOR":JSON.stringify(l.jsonSchemaValidator),"globalThis.PHX_GLTF_DECODER":JSON.stringify(l.gltfDecoder)}}]:g};
@@ -1 +1 @@
1
- import{createApiBaseClient as e}from"#package/client";import{getDevelopmentHeaders as t}from"../development-credential.js";let o=(e,t)=>({ok:!1,status:t.status,message:e.message});export const createWebhookTunnelTransport=({serverUrl:a,credential:n,projectSlug:l,environmentSlug:r})=>{let s=e(a),p=t(n,{projectSlug:l,environmentSlug:r});return{poll:async({deploymentId:e,sessionId:t,signal:a})=>{let{data:n,error:l,response:r}=await s.POST("/deployments/{deploymentId}/webhook-tunnel/poll",{params:{path:{deploymentId:e}},body:{sessionId:t},headers:p,signal:a});return l?o(l,r):{ok:!0,value:n?.request??null}},respond:async({deploymentId:e,sessionId:t,requestId:a,status:n,headers:l,body:r,signal:d})=>{let{error:m,response:u}=await s.POST("/deployments/{deploymentId}/webhook-tunnel/respond",{params:{path:{deploymentId:e}},body:{sessionId:t,requestId:a,status:n,headers:l,body:r},headers:p,signal:d});return m?o(m,u):{ok:!0,value:void 0}}}};
1
+ import{createApiBaseClient as e}from"#package/client";import{getDevelopmentHeaders as t}from"../development-credential.js";let n=(e,t)=>({ok:!1,status:t.status,message:e.message});export const createWebhookTunnelTransport=({serverUrl:o,credential:s,projectSlug:a,environmentSlug:r})=>{let l=e(o),d=t(s,{projectSlug:a,environmentSlug:r});return{poll:async({deploymentId:e,sessionId:t,signal:o})=>{let{data:s,error:a,response:r}=await l.POST("/deployments/{deploymentId}/webhook-tunnel/poll",{params:{path:{deploymentId:e}},body:{sessionId:t,acceptResponseEncoding:"gzip"},headers:d,signal:o});return a?n(a,r):{ok:!0,value:s?.request??null}},respond:async({deploymentId:e,sessionId:t,requestId:o,status:s,headers:a,body:r,isBase64Encoded:p,signal:u})=>{let i={sessionId:t,requestId:o,status:s,headers:a,body:r,isBase64Encoded:p};if(Buffer.byteLength(JSON.stringify(i),"utf8")>5242880)return{ok:!1,status:413,message:"Webhook tunnel response exceeds the 5 MiB encoded request limit. Reduce the backend data and retry."};let{error:m,response:c}=await l.POST("/deployments/{deploymentId}/webhook-tunnel/respond",{params:{path:{deploymentId:e}},body:i,headers:d,signal:u});return m?n(m,c):{ok:!0,value:void 0}}}};
@@ -46,6 +46,7 @@ export interface TunnelRespondRequest {
46
46
  readonly status: number;
47
47
  readonly headers?: Readonly<Record<string, string>>;
48
48
  readonly body: string;
49
+ readonly isBase64Encoded?: boolean;
49
50
  readonly signal: AbortSignal;
50
51
  }
51
52
  /** Server boundary used by the package-independent tunnel lifecycle. */
@@ -1 +1 @@
1
- import{execute as e,getLogger as t,webhookLogContext as r}from"../../webhooks/index.js";export class TunnelTerminalError extends Error{kind;constructor(e,t){super(t),this.kind=e}}let n=async e=>{e.aborted||await new Promise(t=>{let r=()=>{clearTimeout(n),t()},n=setTimeout(()=>{e.removeEventListener("abort",r),t()},5e3);e.addEventListener("abort",r,{once:!0})})},o=e=>new URL(e.url,"http://webhook-tunnel.invalid").searchParams.get("o")??"finalize",s=async(t,n,o)=>{if(o.aborted)return null;let s=()=>void 0,a=new Promise(e=>{(s=()=>e(null),o.aborted)?s():o.addEventListener("abort",s,{once:!0})}),i=(async()=>{try{var o,s;let a=await r.run("webhook",()=>{let r;return e({lambdaPath:n.bundle,lambdaHandler:n.handler,esm:!1,event:(r=new URL(t.url,"http://webhook-tunnel.invalid"),{version:"2.0",routeKey:"$default",rawPath:r.pathname,rawQueryString:r.search,cookies:[],headers:t.headers,queryStringParameters:Object.fromEntries(r.searchParams),requestContext:{accountId:"123456789012",apiId:"api-id",authentication:{},authorizer:{},http:{method:t.method,path:r.pathname,protocol:"HTTP/1.1",sourceIp:"127.0.0.1",userAgent:"phoenix-webhook-tunnel"},requestId:t.requestId,routeKey:"$default",stage:"$default",time:new Date().toISOString(),timeEpoch:Date.now()},body:t.body??void 0,isBase64Encoded:!1}),verboseLevel:n.verbosity??0,timeoutMs:6e4})});if((o=a)&&"object"==typeof o&&"statusCode"in o&&"number"==typeof o.statusCode&&(!("headers"in o)||void 0===o.headers||(s=o.headers)&&"object"==typeof s&&Object.values(s).every(e=>"string"==typeof e)))return{status:a.statusCode,headers:a.headers,body:"string"==typeof a.body?a.body:JSON.stringify(a.body??""),error:null};return{status:200,body:JSON.stringify(a)??"",error:null}}catch(t){let e=t instanceof Error?t.message:String(t);return{status:500,body:JSON.stringify({message:e}),error:e}}})(),l=await Promise.race([i,a]);return o.removeEventListener("abort",s),l};export const startTunnel=e=>{let{transport:r,rejectionHint:a,environmentSlug:i,deploymentId:l,sessionId:d,pollLoops:u=2,onStatus:c,onRequest:h}=e,m=t(),f=new AbortController,p=!1,y=!1,w=!1,b=0,g=null,v=null,$=[],k=new Set,T=e=>void 0,q=new Promise((e,t)=>{T=t}),E=(e,t)=>{m.log(e,t)},I=(e,t)=>{try{c?.(e,t)}catch{}},S=e=>{try{h?.(e)}catch{}},P=e=>(g||(g=e,p=!0,f.abort(),E("error",e.message),I("conflict"===e.kind?"conflict":"error",e.message)),g),x=e=>{w=!0,E("warn",e),I("error",e)},W=()=>new TunnelTerminalError("conflict",`Webhook tunnel for environment ${i} (deployment ${l}) is owned by another phoenix dev session. Stop the other session and restart.`),R=e=>new TunnelTerminalError("rejected",`${e} ${a}`),D=async(e,t)=>{for(;!p;){try{let n=await r.respond({deploymentId:l,sessionId:d,requestId:e.requestId,status:t.status,headers:t.headers,body:t.body,signal:f.signal});if(n.ok)return;if(403===n.status)throw P(W());if(404===n.status)throw P(new TunnelTerminalError("stale",n.message));if(n.status<500)throw P(R(n.message));x(`Webhook tunnel response could not reach the server: ${n.message} Retrying in 5 seconds.`)}catch(e){if(e instanceof TunnelTerminalError)throw e;if(p)return;x(`Webhook tunnel response could not reach the server: ${e instanceof Error?e.message:String(e)} Retrying in 5 seconds.`)}await n(f.signal)}},L=e=>{let t=o(e),r=Date.now();w&&(b+=1),E("warn",`Tunneled ${t} request ${e.requestId} skipped because its deadline expired.`),S({requestId:e.requestId,operation:t,method:e.method,url:e.url,startedAt:r,durationMs:0,outcome:"skipped-expired",responseStatus:null,requestBody:e.body,responseBody:null,error:"Request deadline expired before phoenix dev picked it up."})},j=async t=>{let r=o(t),n=Date.now(),a=await s(t,e,f.signal);if(!a)return;let i=Date.now()-n,l=a.error?"failed":"served";E(a.error?"warn":"info",`Tunneled ${r} request ${t.requestId} ${l} in ${i}ms (status ${a.status}).`),S({requestId:t.requestId,operation:r,method:t.method,url:t.url,startedAt:n,durationMs:i,outcome:l,responseStatus:a.status,requestBody:t.body,responseBody:a.body,error:a.error}),await D(t,a)},O=()=>{for(;!p&&k.size<u;){let e=$.shift();if(!e)return;if(e.deadline<Date.now()){L(e);continue}let t=j(e);k.add(t),t.then(()=>{k.delete(t),O()},e=>{k.delete(t),T(e)})}},B=async e=>{let t=0;for(;!p;)try{let o=await r.poll({deploymentId:l,sessionId:d,signal:f.signal});if(!o.ok){if(409===o.status){if(y||t>=3)throw P(W());t+=1,0===e&&E("warn",`Webhook tunnel for environment ${i} is already claimed. Retrying in 5 seconds (${t}/3).`)}else if(403===o.status)throw P(R(o.message));else if(404===o.status)throw P(new TunnelTerminalError("stale",o.message));else if(o.status<500)throw P(R(o.message));else x(`Webhook tunnel poll failed: ${o.message} Retrying in 5 seconds.`);await n(f.signal);continue}t=0;let s=o.value,a=!!s&&s.deadline<Date.now();s&&a&&L(s),y||(y=!0,E("info",`Webhook tunnel connected for environment ${i} (deployment ${l}, session ${d}).`)),w&&(E("info",`Webhook tunnel reconnected${b>0?`; ${b} queued request(s) expired and were skipped during the interruption.`:"."}`),w=!1,b=0),I("connected"),s&&!a&&($.push(s),O())}catch(e){if(e instanceof TunnelTerminalError)throw e;if(p)return;x(`Webhook tunnel poll could not reach the server: ${e instanceof Error?e.message:String(e)} Retrying in 5 seconds.`),await n(f.signal)}};I("waiting");let C=Promise.race([Promise.all(Array.from({length:u},(e,t)=>B(t))).then(async()=>{await Promise.all(k)}),q]);return{sessionId:d,stop:()=>v||(p=!0,f.abort(),E("info",`Webhook tunnel stopped for environment ${i} (deployment ${l}).`),I("stopped"),v=C.catch(e=>{if(!(e instanceof TunnelTerminalError))throw e})),stopped:C}};
1
+ import{execute as e,getLogger as t,webhookLogContext as r}from"../../webhooks/index.js";export class TunnelTerminalError extends Error{kind;constructor(e,t){super(t),this.kind=e}}let n=async e=>{e.aborted||await new Promise(t=>{let r=()=>{clearTimeout(n),t()},n=setTimeout(()=>{e.removeEventListener("abort",r),t()},5e3);e.addEventListener("abort",r,{once:!0})})},o=e=>new URL(e.url,"http://webhook-tunnel.invalid").searchParams.get("o")??"finalize",s=async(t,n,o)=>{if(o.aborted)return null;let s=()=>void 0,a=new Promise(e=>{(s=()=>e(null),o.aborted)?s():o.addEventListener("abort",s,{once:!0})}),i=(async()=>{try{var o,s;let a=await r.run("webhook",()=>{let r;return e({lambdaPath:n.bundle,lambdaHandler:n.handler,esm:!1,event:(r=new URL(t.url,"http://webhook-tunnel.invalid"),{version:"2.0",routeKey:"$default",rawPath:r.pathname,rawQueryString:r.search,cookies:[],headers:t.headers,queryStringParameters:Object.fromEntries(r.searchParams),requestContext:{accountId:"123456789012",apiId:"api-id",authentication:{},authorizer:{},http:{method:t.method,path:r.pathname,protocol:"HTTP/1.1",sourceIp:"127.0.0.1",userAgent:"phoenix-webhook-tunnel"},requestId:t.requestId,routeKey:"$default",stage:"$default",time:new Date().toISOString(),timeEpoch:Date.now()},body:t.body??void 0,isBase64Encoded:!1}),verboseLevel:n.verbosity??0,timeoutMs:6e4})});if((o=a)&&"object"==typeof o&&"statusCode"in o&&"number"==typeof o.statusCode&&(!("headers"in o)||void 0===o.headers||(s=o.headers)&&"object"==typeof s&&Object.values(s).every(e=>"string"==typeof e)))return{status:a.statusCode,...void 0!==a.isBase64Encoded&&{isBase64Encoded:a.isBase64Encoded},headers:a.headers,body:"string"==typeof a.body?a.body:JSON.stringify(a.body??""),error:null};return{status:200,body:JSON.stringify(a)??"",error:null}}catch(t){let e=t instanceof Error?t.message:String(t);return{status:500,body:JSON.stringify({message:e}),error:e}}})(),d=await Promise.race([i,a]);return o.removeEventListener("abort",s),d};export const startTunnel=e=>{let{transport:r,rejectionHint:a,environmentSlug:i,deploymentId:d,sessionId:l,pollLoops:u=2,onStatus:c,onRequest:h}=e,m=t(),f=new AbortController,y=!1,p=!1,w=!1,b=0,g=null,v=null,$=[],E=new Set,T=e=>void 0,k=new Promise((e,t)=>{T=t}),q=(e,t)=>{m.log(e,t)},B=(e,t)=>{try{c?.(e,t)}catch{}},I=e=>{try{h?.(e)}catch{}},S=e=>(g||(g=e,y=!0,f.abort(),q("error",e.message),B("conflict"===e.kind?"conflict":"error",e.message)),g),P=e=>{w=!0,q("warn",e),B("error",e)},x=()=>new TunnelTerminalError("conflict",`Webhook tunnel for environment ${i} (deployment ${d}) is owned by another phoenix dev session. Stop the other session and restart.`),W=e=>new TunnelTerminalError("rejected",`${e} ${a}`),L=async(e,t)=>{for(;!y;){try{let n=await r.respond({deploymentId:d,sessionId:l,requestId:e.requestId,status:t.status,headers:t.headers,body:t.body,...void 0!==t.isBase64Encoded&&{isBase64Encoded:t.isBase64Encoded},signal:f.signal});if(n.ok)return;if(413===n.status)throw S(new TunnelTerminalError("rejected",n.message));if(403===n.status)throw S(x());if(404===n.status)throw S(new TunnelTerminalError("stale",n.message));if(n.status<500)throw S(W(n.message));P(`Webhook tunnel response could not reach the server: ${n.message} Retrying in 5 seconds.`)}catch(e){if(e instanceof TunnelTerminalError)throw e;if(y)return;P(`Webhook tunnel response could not reach the server: ${e instanceof Error?e.message:String(e)} Retrying in 5 seconds.`)}await n(f.signal)}},R=e=>{let t=o(e),r=Date.now();w&&(b+=1),q("warn",`Tunneled ${t} request ${e.requestId} skipped because its deadline expired.`),I({requestId:e.requestId,operation:t,method:e.method,url:e.url,startedAt:r,durationMs:0,outcome:"skipped-expired",responseStatus:null,requestBody:e.body,responseBody:null,error:"Request deadline expired before phoenix dev picked it up."})},j=async t=>{let r=o(t),n=Date.now(),a=await s(t,e,f.signal);if(!a)return;let i=Date.now()-n,d=a.error?"failed":"served";q(a.error?"warn":"info",`Tunneled ${r} request ${t.requestId} ${d} in ${i}ms (status ${a.status}).`),I({requestId:t.requestId,operation:r,method:t.method,url:t.url,startedAt:n,durationMs:i,outcome:d,responseStatus:a.status,requestBody:t.body,responseBody:a.isBase64Encoded?`[Binary response omitted: ${Buffer.byteLength(a.body,"utf8")} encoded bytes]`:a.body,error:a.error}),await L(t,a)},D=()=>{for(;!y&&E.size<u;){let e=$.shift();if(!e)return;if(e.deadline<Date.now()){R(e);continue}let t=j(e);E.add(t),t.then(()=>{E.delete(t),D()},e=>{E.delete(t),T(e)})}},O=async e=>{let t=0;for(;!y;)try{let o=await r.poll({deploymentId:d,sessionId:l,signal:f.signal});if(!o.ok){if(409===o.status){if(p||t>=3)throw S(x());t+=1,0===e&&q("warn",`Webhook tunnel for environment ${i} is already claimed. Retrying in 5 seconds (${t}/3).`)}else if(403===o.status)throw S(W(o.message));else if(404===o.status)throw S(new TunnelTerminalError("stale",o.message));else if(o.status<500)throw S(W(o.message));else P(`Webhook tunnel poll failed: ${o.message} Retrying in 5 seconds.`);await n(f.signal);continue}t=0;let s=o.value,a=!!s&&s.deadline<Date.now();s&&a&&R(s),p||(p=!0,q("info",`Webhook tunnel connected for environment ${i} (deployment ${d}, session ${l}).`)),w&&(q("info",`Webhook tunnel reconnected${b>0?`; ${b} queued request(s) expired and were skipped during the interruption.`:"."}`),w=!1,b=0),B("connected"),s&&!a&&($.push(s),D())}catch(e){if(e instanceof TunnelTerminalError)throw e;if(y)return;P(`Webhook tunnel poll could not reach the server: ${e instanceof Error?e.message:String(e)} Retrying in 5 seconds.`),await n(f.signal)}};B("waiting");let C=Promise.race([Promise.all(Array.from({length:u},(e,t)=>O(t))).then(async()=>{await Promise.all(E)}),k]);return{sessionId:l,stop:()=>v||(y=!0,f.abort(),q("info",`Webhook tunnel stopped for environment ${i} (deployment ${d}).`),B("stopped"),v=C.catch(e=>{if(!(e instanceof TunnelTerminalError))throw e})),stopped:C}};
@@ -29,7 +29,7 @@ export interface SendVoiceMessageParams<CHAT_CONTEXT extends Record<string, unkn
29
29
  * Runtime chat service consumed only by the legacy configurator chat UI. Its user-facing consumers
30
30
  * live under `configurator/ui/legacy/`: `Chat` is reached through `MobileChat`, `TabsSidebar`,
31
31
  * `StepsSideBar`, and `SimpleSidebar`, with availability gated by
32
- * `configurator/configurator-context/configurator-hooks/chat-hooks.ts`.
32
+ * `react-sdk/domain-application-context/chat-hooks.ts`.
33
33
  *
34
34
  * `sendMessage` deliberately retains a known reinitialization race. Its `ChunkType.calls`
35
35
  * continuation does not recheck the captured generation after `processToolCalls` before publishing
@@ -3,7 +3,7 @@ import type { ReactNode } from 'react';
3
3
  * This is probably a temporary solution, we may need an actual routing library in the future.
4
4
  * @beta
5
5
  */
6
- export declare const useConfiguratorRouting: () => import("#package/react-sdk").RoutingService;
6
+ export declare const useConfiguratorRouting: () => import("../index.js").RoutingService;
7
7
  export type UseConfiguratorRouting = typeof useConfiguratorRouting;
8
8
  export interface ConfiguratorRoutingProviderProps {
9
9
  readonly children: ReactNode;
@@ -0,0 +1 @@
1
+ import{jsx as r,Fragment as t}from"react/jsx-runtime";import{useCallback as o,useEffect as e,useLayoutEffect as n,useState as i}from"react";import{standardWebComponentEvents as a,standardWebComponentProperties as u}from"#package/domain";import{ApplicationRoutes as g,INTEGRATION_MODE_SETTINGS as s,setConfigurationIdQuery as m,useDispatchWebComponentEvent as d,useRoutingSelectors as l,useRoutingService as c,useWebComponentProperty$ as f,useWebComponentPropertyValue as p}from"../application-runtime/index.js";import{useOnGoToIndexHandler as x}from"./OnGoToIndexHandler.js";export const useConfiguratorRouting=()=>c();export const ConfiguratorRoutingProvider=T=>{let{children:b}=T,j=c(),v=l(),C=x(),I=p(u.integrationMode),O=f(u.route),R=d(a.navigated),h=o(r=>{O.next(r),s[I].writeCidToUrl&&(r.route===g.Configuration?m(r.configurationId):m(null)),R(r)},[R,I,O]),[G,k]=i(!1),w=C?.handler;return(e(()=>{if(w)return j.registerOnGoToIndex(w)},[j,w]),e(()=>j.registerOnNavigated(h),[j,h]),n(()=>{j.routeTo(O.value),k(!0)},[j,O,I]),e(()=>{let r=O.subscribe(r=>{v.getRoutingState()!==r&&j.routeTo(r)});return()=>{r.unsubscribe()}},[j,v,O]),G)?r(t,{children:b}):null};
@@ -1,6 +1,5 @@
1
1
  import type { SystemPhoenixHandlerRegistration } from '#package/domain';
2
- import { type OnGoToIndexContext, type OnGoToIndexHandler } from '#package/react-sdk';
3
- export type { OnGoToIndexContext, OnGoToIndexHandler } from '#package/react-sdk';
2
+ import type { OnGoToIndexContext, OnGoToIndexHandler } from '../application-runtime/index.js';
4
3
  export declare const createOnGoToIndexHandler: (hook: () => {
5
4
  handler: OnGoToIndexHandler;
6
5
  }) => SystemPhoenixHandlerRegistration<OnGoToIndexContext, void>;
@@ -0,0 +1 @@
1
+ import{createSystemPhoenixHandler as o}from"#package/domain";import{useSystemPhoenixHandler as e}from"../handlers/index.js";let n="OnGoToIndex";export const createOnGoToIndexHandler=e=>o(n,e);export const useOnGoToIndexHandler=()=>e(n);
@@ -0,0 +1,3 @@
1
+ export { ConfiguratorRoutingProvider, useConfiguratorRouting, type UseConfiguratorRouting, } from './ConfiguratorRoutingProvider.js';
2
+ export { createOnGoToIndexHandler, useOnGoToIndexHandler, type CreateOnGoToIndexHandler } from './OnGoToIndexHandler.js';
3
+ export { usePowerRoutingLifecycle } from './use-power-routing-lifecycle.js';
@@ -1 +1 @@
1
- export{ConfiguratorRoutingProvider,useConfiguratorRouting}from"./ConfiguratorRoutingProvider.js";export{createOnGoToIndexHandler,useOnGoToIndexHandler}from"./OnGoToIndexHandler.js";
1
+ export{ConfiguratorRoutingProvider,useConfiguratorRouting}from"./ConfiguratorRoutingProvider.js";export{createOnGoToIndexHandler,useOnGoToIndexHandler}from"./OnGoToIndexHandler.js";export{usePowerRoutingLifecycle}from"./use-power-routing-lifecycle.js";
@@ -5,5 +5,7 @@
5
5
  * - When power goes from "on" to "off"
6
6
  * - reset route to Index (resetRouteOnPowerDown setting)
7
7
  * - clear `cid` (writeCidToUrl setting)
8
+ *
9
+ * @internal Runtime plumbing for the SDK's own configurator application, which runs it at its root.
8
10
  */
9
11
  export declare const usePowerRoutingLifecycle: () => void;
@@ -0,0 +1 @@
1
+ import{useEffect as e}from"react";import{pairwise as o,startWith as t}from"rxjs";import{match as r}from"ts-pattern";import{standardWebComponentProperties as n}from"#package/domain";import{ApplicationRoutes as i,INTEGRATION_MODE_SETTINGS as a,getAccessTokenFromQuery as u,getConfigurationIdFromQuery as f,setConfigurationIdQuery as s,useRoutingService as l,useWebComponentProperty$ as m,useWebComponentPropertyValue as p}from"../application-runtime/index.js";let d=Symbol("INITIAL_EMISSION");export const usePowerRoutingLifecycle=()=>{let c=p(n.integrationMode),b=m(n.power),w=b.pipe(t(d),o()),x=l(),I=m(n.route);e(()=>{let e=w.subscribe(([e,o])=>{if((e===d||"standby"===e||"off"===e)&&"on"===o&&a[c].readCidAndCaFromUrl){let e=f(),o=u();if(e){let t={route:i.Configuration,configurationId:e,accessToken:o??void 0};I.next(t),x.routeTo(t)}}if("on"===e&&("standby"===o||"off"===o)&&a[c].resetRouteOnPowerDown){let e={route:i.Index};I.next(e),x.routeTo(e),a[c].writeCidToUrl&&s(null)}});return()=>e.unsubscribe()},[w,c,I,x]),e(()=>{r(b.value).with("standby","off",()=>a[c].powerOnOnCid).with("on",()=>!1).exhaustive()&&f()&&b.next("on")},[b,c])};