@happyvertical/smrt-svelte 0.30.0

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 (357) hide show
  1. package/AGENTS.md +317 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +185 -0
  5. package/dist/Provider.svelte +204 -0
  6. package/dist/Provider.svelte.d.ts +73 -0
  7. package/dist/Provider.svelte.d.ts.map +1 -0
  8. package/dist/__tests__/app-state.test.js +156 -0
  9. package/dist/__tests__/warm-clients.test.js +186 -0
  10. package/dist/browser-ai/adapters/llm/factory.d.ts +38 -0
  11. package/dist/browser-ai/adapters/llm/factory.d.ts.map +1 -0
  12. package/dist/browser-ai/adapters/llm/factory.js +91 -0
  13. package/dist/browser-ai/adapters/llm/index.d.ts +7 -0
  14. package/dist/browser-ai/adapters/llm/index.d.ts.map +1 -0
  15. package/dist/browser-ai/adapters/llm/index.js +6 -0
  16. package/dist/browser-ai/adapters/llm/types.d.ts +182 -0
  17. package/dist/browser-ai/adapters/llm/types.d.ts.map +1 -0
  18. package/dist/browser-ai/adapters/llm/types.js +43 -0
  19. package/dist/browser-ai/adapters/llm/webllm.d.ts +33 -0
  20. package/dist/browser-ai/adapters/llm/webllm.d.ts.map +1 -0
  21. package/dist/browser-ai/adapters/llm/webllm.js +225 -0
  22. package/dist/browser-ai/adapters/stt/browser-speech.d.ts +31 -0
  23. package/dist/browser-ai/adapters/stt/browser-speech.d.ts.map +1 -0
  24. package/dist/browser-ai/adapters/stt/browser-speech.js +217 -0
  25. package/dist/browser-ai/adapters/stt/factory.d.ts +49 -0
  26. package/dist/browser-ai/adapters/stt/factory.d.ts.map +1 -0
  27. package/dist/browser-ai/adapters/stt/factory.js +110 -0
  28. package/dist/browser-ai/adapters/stt/index.d.ts +9 -0
  29. package/dist/browser-ai/adapters/stt/index.d.ts.map +1 -0
  30. package/dist/browser-ai/adapters/stt/index.js +8 -0
  31. package/dist/browser-ai/adapters/stt/types.d.ts +154 -0
  32. package/dist/browser-ai/adapters/stt/types.d.ts.map +1 -0
  33. package/dist/browser-ai/adapters/stt/types.js +4 -0
  34. package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts +46 -0
  35. package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts.map +1 -0
  36. package/dist/browser-ai/adapters/stt/whisper-cpp.js +348 -0
  37. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts +51 -0
  38. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts.map +1 -0
  39. package/dist/browser-ai/adapters/stt/whisper-wasm.js +380 -0
  40. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts +42 -0
  41. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts.map +1 -0
  42. package/dist/browser-ai/adapters/tts/browser-synthesis.js +235 -0
  43. package/dist/browser-ai/adapters/tts/factory.d.ts +53 -0
  44. package/dist/browser-ai/adapters/tts/factory.d.ts.map +1 -0
  45. package/dist/browser-ai/adapters/tts/factory.js +92 -0
  46. package/dist/browser-ai/adapters/tts/index.d.ts +7 -0
  47. package/dist/browser-ai/adapters/tts/index.d.ts.map +1 -0
  48. package/dist/browser-ai/adapters/tts/index.js +6 -0
  49. package/dist/browser-ai/adapters/tts/types.d.ts +140 -0
  50. package/dist/browser-ai/adapters/tts/types.d.ts.map +1 -0
  51. package/dist/browser-ai/adapters/tts/types.js +4 -0
  52. package/dist/browser-ai/capabilities/detector.d.ts +38 -0
  53. package/dist/browser-ai/capabilities/detector.d.ts.map +1 -0
  54. package/dist/browser-ai/capabilities/detector.js +211 -0
  55. package/dist/browser-ai/core/errors.d.ts +62 -0
  56. package/dist/browser-ai/core/errors.d.ts.map +1 -0
  57. package/dist/browser-ai/core/errors.js +92 -0
  58. package/dist/browser-ai/core/index.d.ts +6 -0
  59. package/dist/browser-ai/core/index.d.ts.map +1 -0
  60. package/dist/browser-ai/core/index.js +5 -0
  61. package/dist/browser-ai/core/types.d.ts +115 -0
  62. package/dist/browser-ai/core/types.d.ts.map +1 -0
  63. package/dist/browser-ai/core/types.js +34 -0
  64. package/dist/browser-ai/index.d.ts +12 -0
  65. package/dist/browser-ai/index.d.ts.map +1 -0
  66. package/dist/browser-ai/index.js +16 -0
  67. package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte +77 -0
  68. package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts +16 -0
  69. package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts.map +1 -0
  70. package/dist/browser-ai/svelte/components/CapabilityGate.svelte +57 -0
  71. package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts +15 -0
  72. package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts.map +1 -0
  73. package/dist/browser-ai/svelte/components/DownloadProgress.svelte +141 -0
  74. package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts +15 -0
  75. package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts.map +1 -0
  76. package/dist/browser-ai/svelte/components/STTTest.svelte +379 -0
  77. package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts +9 -0
  78. package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts.map +1 -0
  79. package/dist/browser-ai/svelte/components/VoiceInput.svelte +200 -0
  80. package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts +16 -0
  81. package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts.map +1 -0
  82. package/dist/browser-ai/svelte/index.d.ts +15 -0
  83. package/dist/browser-ai/svelte/index.d.ts.map +1 -0
  84. package/dist/browser-ai/svelte/index.js +28 -0
  85. package/dist/browser-ai/ui.d.ts +16 -0
  86. package/dist/browser-ai/ui.d.ts.map +1 -0
  87. package/dist/browser-ai/ui.js +67 -0
  88. package/dist/components/admin/AgentAdminPanel.svelte +111 -0
  89. package/dist/components/admin/AgentAdminPanel.svelte.d.ts +25 -0
  90. package/dist/components/admin/AgentAdminPanel.svelte.d.ts.map +1 -0
  91. package/dist/components/admin/AgentAdminTabs.svelte +280 -0
  92. package/dist/components/admin/AgentAdminTabs.svelte.d.ts +23 -0
  93. package/dist/components/admin/AgentAdminTabs.svelte.d.ts.map +1 -0
  94. package/dist/components/admin/AgentSettingsShell.svelte +257 -0
  95. package/dist/components/admin/AgentSettingsShell.svelte.d.ts +33 -0
  96. package/dist/components/admin/AgentSettingsShell.svelte.d.ts.map +1 -0
  97. package/dist/components/admin/index.d.ts +5 -0
  98. package/dist/components/admin/index.d.ts.map +1 -0
  99. package/dist/components/admin/index.js +6 -0
  100. package/dist/components/forms/AddressInput.svelte +500 -0
  101. package/dist/components/forms/AddressInput.svelte.d.ts +36 -0
  102. package/dist/components/forms/AddressInput.svelte.d.ts.map +1 -0
  103. package/dist/components/forms/CheckboxInput.svelte +208 -0
  104. package/dist/components/forms/CheckboxInput.svelte.d.ts +20 -0
  105. package/dist/components/forms/CheckboxInput.svelte.d.ts.map +1 -0
  106. package/dist/components/forms/DateRangeInput.svelte +628 -0
  107. package/dist/components/forms/DateRangeInput.svelte.d.ts +33 -0
  108. package/dist/components/forms/DateRangeInput.svelte.d.ts.map +1 -0
  109. package/dist/components/forms/DateTimeInput.svelte +521 -0
  110. package/dist/components/forms/DateTimeInput.svelte.d.ts +24 -0
  111. package/dist/components/forms/DateTimeInput.svelte.d.ts.map +1 -0
  112. package/dist/components/forms/FileUpload.svelte +358 -0
  113. package/dist/components/forms/FileUpload.svelte.d.ts +22 -0
  114. package/dist/components/forms/FileUpload.svelte.d.ts.map +1 -0
  115. package/dist/components/forms/Form.svelte +771 -0
  116. package/dist/components/forms/Form.svelte.d.ts +26 -0
  117. package/dist/components/forms/Form.svelte.d.ts.map +1 -0
  118. package/dist/components/forms/FormGroup.svelte +86 -0
  119. package/dist/components/forms/FormGroup.svelte.d.ts +13 -0
  120. package/dist/components/forms/FormGroup.svelte.d.ts.map +1 -0
  121. package/dist/components/forms/FormMicButton.svelte +179 -0
  122. package/dist/components/forms/FormMicButton.svelte.d.ts +10 -0
  123. package/dist/components/forms/FormMicButton.svelte.d.ts.map +1 -0
  124. package/dist/components/forms/Input.svelte +83 -0
  125. package/dist/components/forms/Input.svelte.d.ts +9 -0
  126. package/dist/components/forms/Input.svelte.d.ts.map +1 -0
  127. package/dist/components/forms/MeasurementInput.svelte +505 -0
  128. package/dist/components/forms/MeasurementInput.svelte.d.ts +35 -0
  129. package/dist/components/forms/MeasurementInput.svelte.d.ts.map +1 -0
  130. package/dist/components/forms/MoneyInput.svelte +412 -0
  131. package/dist/components/forms/MoneyInput.svelte.d.ts +30 -0
  132. package/dist/components/forms/MoneyInput.svelte.d.ts.map +1 -0
  133. package/dist/components/forms/NumberInput.svelte +310 -0
  134. package/dist/components/forms/NumberInput.svelte.d.ts +28 -0
  135. package/dist/components/forms/NumberInput.svelte.d.ts.map +1 -0
  136. package/dist/components/forms/PhoneInput.svelte +530 -0
  137. package/dist/components/forms/PhoneInput.svelte.d.ts +22 -0
  138. package/dist/components/forms/PhoneInput.svelte.d.ts.map +1 -0
  139. package/dist/components/forms/SearchInput.svelte +358 -0
  140. package/dist/components/forms/SearchInput.svelte.d.ts +33 -0
  141. package/dist/components/forms/SearchInput.svelte.d.ts.map +1 -0
  142. package/dist/components/forms/Select.svelte +83 -0
  143. package/dist/components/forms/Select.svelte.d.ts +11 -0
  144. package/dist/components/forms/Select.svelte.d.ts.map +1 -0
  145. package/dist/components/forms/SelectInput.svelte +254 -0
  146. package/dist/components/forms/SelectInput.svelte.d.ts +25 -0
  147. package/dist/components/forms/SelectInput.svelte.d.ts.map +1 -0
  148. package/dist/components/forms/TextInput.svelte +415 -0
  149. package/dist/components/forms/TextInput.svelte.d.ts +26 -0
  150. package/dist/components/forms/TextInput.svelte.d.ts.map +1 -0
  151. package/dist/components/forms/Textarea.svelte +85 -0
  152. package/dist/components/forms/Textarea.svelte.d.ts +10 -0
  153. package/dist/components/forms/Textarea.svelte.d.ts.map +1 -0
  154. package/dist/components/forms/TextareaInput.svelte +386 -0
  155. package/dist/components/forms/TextareaInput.svelte.d.ts +26 -0
  156. package/dist/components/forms/TextareaInput.svelte.d.ts.map +1 -0
  157. package/dist/components/forms/Toggle.svelte +217 -0
  158. package/dist/components/forms/Toggle.svelte.d.ts +37 -0
  159. package/dist/components/forms/Toggle.svelte.d.ts.map +1 -0
  160. package/dist/components/forms/__tests__/AddressInput.behavior.test.js +122 -0
  161. package/dist/components/forms/__tests__/CheckboxInput.test.js +92 -0
  162. package/dist/components/forms/__tests__/DateRangeInput.behavior.test.js +135 -0
  163. package/dist/components/forms/__tests__/DateTimeInput.behavior.test.js +103 -0
  164. package/dist/components/forms/__tests__/FileUpload.test.js +90 -0
  165. package/dist/components/forms/__tests__/Form.behavior.test.js +137 -0
  166. package/dist/components/forms/__tests__/Form.test.js +58 -0
  167. package/dist/components/forms/__tests__/FormGroup.test.js +48 -0
  168. package/dist/components/forms/__tests__/FormMicButton.test.js +86 -0
  169. package/dist/components/forms/__tests__/Input.test.js +49 -0
  170. package/dist/components/forms/__tests__/MeasurementInput.behavior.test.js +129 -0
  171. package/dist/components/forms/__tests__/MoneyInput.behavior.test.js +124 -0
  172. package/dist/components/forms/__tests__/NumberInput.behavior.test.js +141 -0
  173. package/dist/components/forms/__tests__/PhoneInput.behavior.test.js +96 -0
  174. package/dist/components/forms/__tests__/SearchInput.test.js +79 -0
  175. package/dist/components/forms/__tests__/Select.test.js +37 -0
  176. package/dist/components/forms/__tests__/SelectInput.behavior.test.js +132 -0
  177. package/dist/components/forms/__tests__/TextInput.behavior.test.js +131 -0
  178. package/dist/components/forms/__tests__/Textarea.test.js +39 -0
  179. package/dist/components/forms/__tests__/TextareaInput.behavior.test.js +96 -0
  180. package/dist/components/forms/__tests__/Toggle.test.js +87 -0
  181. package/dist/components/forms/__tests__/composite-inputs-a11y.test.js +69 -0
  182. package/dist/components/forms/__tests__/form-group-input.fixture.svelte +16 -0
  183. package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts +9 -0
  184. package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts.map +1 -0
  185. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte +33 -0
  186. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts +12 -0
  187. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts.map +1 -0
  188. package/dist/components/forms/__tests__/rich-inputs-a11y.test.js +87 -0
  189. package/dist/components/forms/index.d.ts +25 -0
  190. package/dist/components/forms/index.d.ts.map +1 -0
  191. package/dist/components/forms/index.js +25 -0
  192. package/dist/components/forms/types.d.ts +33 -0
  193. package/dist/components/forms/types.d.ts.map +1 -0
  194. package/dist/components/forms/types.js +4 -0
  195. package/dist/components/module/ModulePanel.svelte +134 -0
  196. package/dist/components/module/ModulePanel.svelte.d.ts +22 -0
  197. package/dist/components/module/ModulePanel.svelte.d.ts.map +1 -0
  198. package/dist/components/module/index.d.ts +5 -0
  199. package/dist/components/module/index.d.ts.map +1 -0
  200. package/dist/components/module/index.js +4 -0
  201. package/dist/components/workspace/Breadcrumbs.svelte +141 -0
  202. package/dist/components/workspace/Breadcrumbs.svelte.d.ts +21 -0
  203. package/dist/components/workspace/Breadcrumbs.svelte.d.ts.map +1 -0
  204. package/dist/components/workspace/NavTree.svelte +354 -0
  205. package/dist/components/workspace/NavTree.svelte.d.ts +45 -0
  206. package/dist/components/workspace/NavTree.svelte.d.ts.map +1 -0
  207. package/dist/components/workspace/README.md +34 -0
  208. package/dist/components/workspace/RoleShell.svelte +309 -0
  209. package/dist/components/workspace/RoleShell.svelte.d.ts +91 -0
  210. package/dist/components/workspace/RoleShell.svelte.d.ts.map +1 -0
  211. package/dist/components/workspace/WorkspaceShell.svelte +951 -0
  212. package/dist/components/workspace/WorkspaceShell.svelte.d.ts +112 -0
  213. package/dist/components/workspace/WorkspaceShell.svelte.d.ts.map +1 -0
  214. package/dist/components/workspace/__tests__/RoleShell.test.js +772 -0
  215. package/dist/components/workspace/__tests__/WorkspaceShell.test.js +630 -0
  216. package/dist/components/workspace/__tests__/breadcrumbs-helpers.test.js +141 -0
  217. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte +45 -0
  218. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts +21 -0
  219. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts.map +1 -0
  220. package/dist/components/workspace/__tests__/define-tools-dock.test.js +1010 -0
  221. package/dist/components/workspace/__tests__/harness.svelte +25 -0
  222. package/dist/components/workspace/__tests__/harness.svelte.d.ts +14 -0
  223. package/dist/components/workspace/__tests__/harness.svelte.d.ts.map +1 -0
  224. package/dist/components/workspace/__tests__/index.test.js +37 -0
  225. package/dist/components/workspace/__tests__/manifest-nav-helpers.test.js +24 -0
  226. package/dist/components/workspace/__tests__/manifest-nav.test.js +599 -0
  227. package/dist/components/workspace/__tests__/nav-helpers.test.js +95 -0
  228. package/dist/components/workspace/__tests__/render-harness.svelte +66 -0
  229. package/dist/components/workspace/__tests__/render-harness.svelte.d.ts +32 -0
  230. package/dist/components/workspace/__tests__/render-harness.svelte.d.ts.map +1 -0
  231. package/dist/components/workspace/__tests__/render-tools-dock.test.js +243 -0
  232. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte +58 -0
  233. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts +16 -0
  234. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts.map +1 -0
  235. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte +41 -0
  236. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts +13 -0
  237. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts.map +1 -0
  238. package/dist/components/workspace/__tests__/test-icon.svelte +17 -0
  239. package/dist/components/workspace/__tests__/test-icon.svelte.d.ts +19 -0
  240. package/dist/components/workspace/__tests__/test-icon.svelte.d.ts.map +1 -0
  241. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte +38 -0
  242. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts +22 -0
  243. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts.map +1 -0
  244. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts +65 -0
  245. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts.map +1 -0
  246. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.js +115 -0
  247. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts +15 -0
  248. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts.map +1 -0
  249. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.js +7 -0
  250. package/dist/components/workspace/__tests__/typed-tool-fixture.test.js +115 -0
  251. package/dist/components/workspace/__tests__/use-harness-orphan.svelte +9 -0
  252. package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts +19 -0
  253. package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts.map +1 -0
  254. package/dist/components/workspace/__tests__/use-harness.svelte +23 -0
  255. package/dist/components/workspace/__tests__/use-harness.svelte.d.ts +8 -0
  256. package/dist/components/workspace/__tests__/use-harness.svelte.d.ts.map +1 -0
  257. package/dist/components/workspace/__tests__/use-tools-dock.test.js +33 -0
  258. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte +43 -0
  259. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts +11 -0
  260. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts.map +1 -0
  261. package/dist/components/workspace/breadcrumbs-helpers.d.ts +44 -0
  262. package/dist/components/workspace/breadcrumbs-helpers.d.ts.map +1 -0
  263. package/dist/components/workspace/breadcrumbs-helpers.js +88 -0
  264. package/dist/components/workspace/index.d.ts +16 -0
  265. package/dist/components/workspace/index.d.ts.map +1 -0
  266. package/dist/components/workspace/index.js +14 -0
  267. package/dist/components/workspace/manifest-nav.d.ts +200 -0
  268. package/dist/components/workspace/manifest-nav.d.ts.map +1 -0
  269. package/dist/components/workspace/manifest-nav.js +408 -0
  270. package/dist/components/workspace/nav-helpers.d.ts +36 -0
  271. package/dist/components/workspace/nav-helpers.d.ts.map +1 -0
  272. package/dist/components/workspace/nav-helpers.js +60 -0
  273. package/dist/components/workspace/server/__tests__/compose-availability.test.js +383 -0
  274. package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts +78 -0
  275. package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts.map +1 -0
  276. package/dist/components/workspace/server/__tests__/typed-context-fixture.js +104 -0
  277. package/dist/components/workspace/server/compose-availability.d.ts +73 -0
  278. package/dist/components/workspace/server/compose-availability.d.ts.map +1 -0
  279. package/dist/components/workspace/server/compose-availability.js +114 -0
  280. package/dist/components/workspace/server/index.d.ts +13 -0
  281. package/dist/components/workspace/server/index.d.ts.map +1 -0
  282. package/dist/components/workspace/server/index.js +11 -0
  283. package/dist/components/workspace/server/types.d.ts +108 -0
  284. package/dist/components/workspace/server/types.d.ts.map +1 -0
  285. package/dist/components/workspace/server/types.js +11 -0
  286. package/dist/components/workspace/tools-dock/ToolsDock.svelte +565 -0
  287. package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts +14 -0
  288. package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts.map +1 -0
  289. package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts +143 -0
  290. package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts.map +1 -0
  291. package/dist/components/workspace/tools-dock/define-tools-dock.svelte.js +487 -0
  292. package/dist/components/workspace/tools-dock/use-tools-dock.d.ts +41 -0
  293. package/dist/components/workspace/tools-dock/use-tools-dock.d.ts.map +1 -0
  294. package/dist/components/workspace/tools-dock/use-tools-dock.js +50 -0
  295. package/dist/components/workspace/types.d.ts +372 -0
  296. package/dist/components/workspace/types.d.ts.map +1 -0
  297. package/dist/components/workspace/types.js +6 -0
  298. package/dist/hooks/index.d.ts +11 -0
  299. package/dist/hooks/index.d.ts.map +1 -0
  300. package/dist/hooks/index.js +10 -0
  301. package/dist/hooks/useAppState.svelte.d.ts +46 -0
  302. package/dist/hooks/useAppState.svelte.d.ts.map +1 -0
  303. package/dist/hooks/useAppState.svelte.js +59 -0
  304. package/dist/hooks/useAuth.svelte.d.ts +41 -0
  305. package/dist/hooks/useAuth.svelte.d.ts.map +1 -0
  306. package/dist/hooks/useAuth.svelte.js +43 -0
  307. package/dist/hooks/useLLM.svelte.d.ts +69 -0
  308. package/dist/hooks/useLLM.svelte.d.ts.map +1 -0
  309. package/dist/hooks/useLLM.svelte.js +85 -0
  310. package/dist/hooks/useSTT.svelte.d.ts +68 -0
  311. package/dist/hooks/useSTT.svelte.d.ts.map +1 -0
  312. package/dist/hooks/useSTT.svelte.js +97 -0
  313. package/dist/hooks/useSocket.svelte.d.ts +45 -0
  314. package/dist/hooks/useSocket.svelte.d.ts.map +1 -0
  315. package/dist/hooks/useSocket.svelte.js +54 -0
  316. package/dist/hooks/useTTS.svelte.d.ts +65 -0
  317. package/dist/hooks/useTTS.svelte.d.ts.map +1 -0
  318. package/dist/hooks/useTTS.svelte.js +93 -0
  319. package/dist/hooks/useTheme.d.ts +13 -0
  320. package/dist/hooks/useTheme.d.ts.map +1 -0
  321. package/dist/hooks/useTheme.js +16 -0
  322. package/dist/i18n/__tests__/server.spec.js +50 -0
  323. package/dist/i18n/server.d.ts +47 -0
  324. package/dist/i18n/server.d.ts.map +1 -0
  325. package/dist/i18n/server.js +58 -0
  326. package/dist/i18n/strings.forms.d.ts +33 -0
  327. package/dist/i18n/strings.forms.d.ts.map +1 -0
  328. package/dist/i18n/strings.forms.js +54 -0
  329. package/dist/i18n/strings.workspace.d.ts +34 -0
  330. package/dist/i18n/strings.workspace.d.ts.map +1 -0
  331. package/dist/i18n/strings.workspace.js +40 -0
  332. package/dist/index.d.ts +18 -0
  333. package/dist/index.d.ts.map +1 -0
  334. package/dist/index.js +23 -0
  335. package/dist/state/__tests__/warm-clients.test.js +40 -0
  336. package/dist/state/app-state.d.ts +308 -0
  337. package/dist/state/app-state.d.ts.map +1 -0
  338. package/dist/state/app-state.js +64 -0
  339. package/dist/state/app-state.svelte.d.ts +196 -0
  340. package/dist/state/app-state.svelte.d.ts.map +1 -0
  341. package/dist/state/app-state.svelte.js +774 -0
  342. package/dist/state/context.d.ts +23 -0
  343. package/dist/state/context.d.ts.map +1 -0
  344. package/dist/state/context.js +32 -0
  345. package/dist/state/form-context.d.ts +59 -0
  346. package/dist/state/form-context.d.ts.map +1 -0
  347. package/dist/state/form-context.js +31 -0
  348. package/dist/state/form-group-context.d.ts +13 -0
  349. package/dist/state/form-group-context.d.ts.map +1 -0
  350. package/dist/state/form-group-context.js +28 -0
  351. package/dist/state/index.d.ts +9 -0
  352. package/dist/state/index.d.ts.map +1 -0
  353. package/dist/state/index.js +8 -0
  354. package/dist/state/warm-clients.d.ts +136 -0
  355. package/dist/state/warm-clients.d.ts.map +1 -0
  356. package/dist/state/warm-clients.js +231 -0
  357. package/package.json +137 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Pure helpers for breadcrumb derivation.
3
+ *
4
+ * Extracted so the path-walking logic can be unit-tested without rendering
5
+ * a Svelte component.
6
+ */
7
+ /**
8
+ * Walk a nav tree depth-first and return the label of the item whose
9
+ * `href` matches exactly, or `null` if not found.
10
+ */
11
+ export function findLabelInNav(items, href) {
12
+ for (const item of items) {
13
+ if (item.href === href)
14
+ return item.label;
15
+ if (item.children?.length) {
16
+ const label = findLabelInNav(item.children, href);
17
+ if (label)
18
+ return label;
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ /**
24
+ * Default label fallback for unknown segments: capitalize the first letter
25
+ * and turn dashes/underscores into spaces.
26
+ */
27
+ export function capitalizeSegment(segment) {
28
+ if (!segment)
29
+ return segment;
30
+ const cleaned = segment.replace(/[-_]/g, ' ');
31
+ return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);
32
+ }
33
+ /**
34
+ * Derive a breadcrumb trail from a pathname + nav tree.
35
+ *
36
+ * Strategy:
37
+ * 1. Optionally prepend `rootCrumb`.
38
+ * 2. Split the pathname into segments.
39
+ * 3. If `startAfter` is set, locate its trailing segment in the
40
+ * pathname and skip everything before/including it. The
41
+ * `startAfter` value may include a leading slash or none and
42
+ * may be a multi-segment path (e.g. `sites/foo`).
43
+ * 4. Walk the remaining segments, building cumulative paths; for
44
+ * each, try to find a matching nav label, otherwise capitalize.
45
+ */
46
+ export function deriveCrumbsFromNav(pathname, nav, options = {}) {
47
+ const { rootCrumb, startAfter, capitalize = true } = options;
48
+ const result = [];
49
+ if (rootCrumb) {
50
+ result.push(rootCrumb);
51
+ }
52
+ const segments = (pathname || '').split('/').filter(Boolean);
53
+ // Resolve which segment index we start emitting crumbs after.
54
+ let startIndex = 0;
55
+ let basePath = '';
56
+ if (startAfter) {
57
+ const startSegments = startAfter.split('/').filter(Boolean);
58
+ if (startSegments.length > 0) {
59
+ // Match the full contiguous `startSegments` sequence in `segments`,
60
+ // not just the last token — otherwise an ambiguous pathname like
61
+ // `/sites/sites/content` with `startAfter: 'sites/sites'` would
62
+ // anchor on the first `sites` and build the wrong base path.
63
+ let matched = false;
64
+ outer: for (let i = 0; i <= segments.length - startSegments.length; i++) {
65
+ for (let j = 0; j < startSegments.length; j++) {
66
+ if (segments[i + j] !== startSegments[j])
67
+ continue outer;
68
+ }
69
+ startIndex = i + startSegments.length;
70
+ basePath = `/${segments.slice(0, startIndex).join('/')}`;
71
+ matched = true;
72
+ break;
73
+ }
74
+ if (!matched) {
75
+ // startAfter not in path → nothing to walk.
76
+ return result;
77
+ }
78
+ }
79
+ }
80
+ let currentPath = basePath;
81
+ for (const segment of segments.slice(startIndex)) {
82
+ currentPath += `/${segment}`;
83
+ const label = findLabelInNav(nav, currentPath) ??
84
+ (capitalize ? capitalizeSegment(segment) : segment);
85
+ result.push({ label, href: currentPath });
86
+ }
87
+ return result;
88
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @happyvertical/smrt-svelte/workspace
3
+ *
4
+ * Workspace shell primitives for admin UIs. See packages/smrt-svelte/CLAUDE.md
5
+ * for layering principles. Implementations land via #1227, #1228, #1229.
6
+ */
7
+ export { default as Breadcrumbs } from './Breadcrumbs.svelte';
8
+ export { type NavSection, type NavTreeFromManifestOptions, navTreeFromManifest, pluralizeClassName, type SmrtManifestEntryLike, type SmrtManifestLike, } from './manifest-nav.js';
9
+ export { default as NavTree } from './NavTree.svelte';
10
+ export { default as RoleShell } from './RoleShell.svelte';
11
+ export { type DefineToolsDockOptions, defineToolsDock, TOOLS_DOCK_KEY, type ToolsDockInstance, } from './tools-dock/define-tools-dock.svelte.js';
12
+ export { default as ToolsDock } from './tools-dock/ToolsDock.svelte';
13
+ export { tryUseToolsDock, useToolsDock } from './tools-dock/use-tools-dock.js';
14
+ export type { AvailableTool, BreadcrumbItem, NavItem, RoleConfig, ToolDef, ToolsDockApi, ToolsDockContext, ToolsDockEvents, } from './types.js';
15
+ export { default as WorkspaceShell } from './WorkspaceShell.svelte';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EACL,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,KAAK,sBAAsB,EAC3B,eAAe,EACf,cAAc,EACd,KAAK,iBAAiB,GACvB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC/E,YAAY,EACV,aAAa,EACb,cAAc,EACd,OAAO,EACP,UAAU,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @happyvertical/smrt-svelte/workspace
3
+ *
4
+ * Workspace shell primitives for admin UIs. See packages/smrt-svelte/CLAUDE.md
5
+ * for layering principles. Implementations land via #1227, #1228, #1229.
6
+ */
7
+ export { default as Breadcrumbs } from './Breadcrumbs.svelte';
8
+ export { navTreeFromManifest, pluralizeClassName, } from './manifest-nav.js';
9
+ export { default as NavTree } from './NavTree.svelte';
10
+ export { default as RoleShell } from './RoleShell.svelte';
11
+ export { defineToolsDock, TOOLS_DOCK_KEY, } from './tools-dock/define-tools-dock.svelte.js';
12
+ export { default as ToolsDock } from './tools-dock/ToolsDock.svelte';
13
+ export { tryUseToolsDock, useToolsDock } from './tools-dock/use-tools-dock.js';
14
+ export { default as WorkspaceShell } from './WorkspaceShell.svelte';
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Pure helper that turns a SMRT manifest into the `NavItem[]` shape the
3
+ * existing `NavTree` / `RoleShell` primitives expect.
4
+ *
5
+ * This is the "manifest → admin UI" adapter called out as a friction gap in
6
+ * happyvertical/smrt#1235 / #1226 / #1248: every consumer hand-writes its nav
7
+ * config today, with dozens of `@smrt()` classes that boilerplate drifts.
8
+ * Opt in here to manifest-driven nav while keeping the primitives themselves
9
+ * SmrtObject-agnostic.
10
+ *
11
+ * Design constraints (see #1248 for the full brief):
12
+ * - Pure function. No SvelteKit imports, no SSR coupling, no module side
13
+ * effects. Data in → data out.
14
+ * - Cross-industry-safe. Never assumes apparel / furniture / automotive
15
+ * vocabulary; consumers supply their own `sectionHints`.
16
+ * - Deterministic output. Sections and items both sort alphabetically by
17
+ * title so manifest-order churn doesn't shuffle the rendered nav.
18
+ * - Decoupled from any concrete role/permission package. `permittedResources`
19
+ * is just a plain string array of qualified class names.
20
+ *
21
+ * The structural `SmrtManifestLike` / `SmrtManifestEntryLike` shapes here
22
+ * intentionally subset the real `SmartObjectManifest` from `@happyvertical/smrt-core`.
23
+ * Adding a peer dependency on core would create a circular reference (core
24
+ * pulls in svelte primitives downstream), so the helper accepts anything
25
+ * that matches the documented shape. Pass a `SmartObjectManifest` directly
26
+ * and TypeScript is happy.
27
+ */
28
+ /**
29
+ * Visibility flavours emitted by `@smrt({ visibility })`. Mirrors
30
+ * `SmrtVisibility` in `@happyvertical/smrt-core` without importing it
31
+ * (see the file-top note on why we avoid a core peer dep).
32
+ */
33
+ type ManifestVisibility = 'public' | 'internal' | 'test';
34
+ /** Subset of `SmartObjectDefinition` the nav helper reads from. */
35
+ export interface SmrtManifestEntryLike {
36
+ /** Qualified name in `@package/name:ClassName` form. Primary key. */
37
+ qualifiedName?: string;
38
+ /** Simple class name (PascalCase). */
39
+ className: string;
40
+ /** Package name where the class is defined. */
41
+ packageName?: string;
42
+ /** Pluralized resource name (used by the REST generator for the URL path). */
43
+ collection?: string;
44
+ /** Base class name as written in source. */
45
+ extends?: string;
46
+ /**
47
+ * Top-level visibility flag — `SmartObjectDefinition` hoists this out of
48
+ * `decoratorConfig` so it can be read without parsing the raw config. The
49
+ * helper reads here first, then falls back to `decoratorConfig.visibility`
50
+ * for older / hand-built manifests.
51
+ */
52
+ visibility?: ManifestVisibility;
53
+ /**
54
+ * The `@smrt({...})` config object captured by the AST scanner. Fields
55
+ * are optional in the structural type so partial manifests still satisfy
56
+ * it. The helper specifically looks at `ui?: { icon?, label? }`.
57
+ */
58
+ decoratorConfig?: {
59
+ ui?: {
60
+ icon?: string;
61
+ label?: string;
62
+ };
63
+ /**
64
+ * Subset of the `@smrt({ api })` shape we care about for nav filtering —
65
+ * entries with `api: false` (or an `include` that drops `list` / an
66
+ * `exclude` that drops `list`) don't get a REST list route and so
67
+ * can't anchor a nav link.
68
+ */
69
+ api?: boolean | {
70
+ include?: string[];
71
+ exclude?: string[];
72
+ [key: string]: unknown;
73
+ };
74
+ /**
75
+ * Raw visibility flag as written in source. Read as a fallback when
76
+ * the top-level `visibility` field is absent.
77
+ */
78
+ visibility?: ManifestVisibility;
79
+ [key: string]: unknown;
80
+ };
81
+ }
82
+ /** Subset of `SmartObjectManifest`. */
83
+ export interface SmrtManifestLike {
84
+ objects: Record<string, SmrtManifestEntryLike>;
85
+ }
86
+ import type { NavItem } from './types.js';
87
+ /**
88
+ * A nav section emitted by `navTreeFromManifest`. Structurally identical to
89
+ * `NavItem` — a top-level entry whose `children` are the resources grouped
90
+ * under it. Aliased for documentation clarity.
91
+ */
92
+ export type NavSection = NavItem;
93
+ /** Options consumed by {@link navTreeFromManifest}. */
94
+ export interface NavTreeFromManifestOptions {
95
+ /**
96
+ * Qualified class names a role is allowed to see (e.g.
97
+ * `'@happyvertical/smrt-content:Article'`). Entries outside this list are
98
+ * dropped. Omit to include every visible resource.
99
+ *
100
+ * Plain string array on purpose — this helper must not depend on
101
+ * `smrt-users` or any concrete role / permission package. Wire your
102
+ * resolver (`PermissionResolver` from smrt-users etc.) at the
103
+ * `+layout.server.ts` level and pass the resulting allow-list in.
104
+ */
105
+ permittedResources?: string[];
106
+ /**
107
+ * Map of qualifier substring → section title. A class's qualified name
108
+ * is checked against each key with `String.includes()`; the first match
109
+ * wins. When no hint matches, the section title defaults to the package
110
+ * suffix after the last `/` and before the `:` —
111
+ * `@happyvertical/smrt-content:Article` → "smrt-content".
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * sectionHints: {
116
+ * '@happyvertical/smrt-content': 'Content',
117
+ * '@happyvertical/smrt-commerce': 'Commerce',
118
+ * '@acme/apparel': 'Catalog',
119
+ * }
120
+ * ```
121
+ */
122
+ sectionHints?: Record<string, string>;
123
+ /**
124
+ * Base path for generated hrefs. Defaults to `/api/v1` so the emitted
125
+ * URLs match SMRT's REST generator (`/api/v1/{collection}`). Pass an
126
+ * empty string to emit unprefixed paths like `/articles`.
127
+ */
128
+ basePath?: string;
129
+ }
130
+ /**
131
+ * Minimal English pluralizer. Handles the common suffix rules sufficient
132
+ * for class-name → label conversion (Article → Articles, Category →
133
+ * Categories, Box → Boxes, etc.). For irregulars or exotic plurals,
134
+ * override with `@smrt({ ui: { label: 'Foo bars' } })`.
135
+ *
136
+ * Exported only for tests / advanced callers; most code should let
137
+ * `navTreeFromManifest` apply it.
138
+ */
139
+ export declare function pluralizeClassName(name: string): string;
140
+ /**
141
+ * Walk a SMRT manifest and emit the `NavSection[]` shape that
142
+ * `<NavTree items={...}>` and `RoleConfig.sections` consume.
143
+ *
144
+ * Algorithm:
145
+ * 1. Drop collection classes (`*Collection` / `extends: 'SmrtCollection'`).
146
+ * 2. Drop entries marked `@smrt({ visibility: 'internal' | 'test' })` —
147
+ * they're plumbing / fixtures and never belong in admin nav.
148
+ * 3. Drop entries that don't expose a REST `list` route (`@smrt({ api: false })`,
149
+ * `include` without `list`, or `exclude` containing `list`).
150
+ * 4. Drop STI subtypes that share their parent's `collection` value —
151
+ * the REST endpoint at the shared collection URL is polymorphic and
152
+ * shows all subtypes through one link.
153
+ * 5. If `permittedResources` is provided, drop entries whose qualified
154
+ * name isn't in the list. Otherwise keep all remaining entries.
155
+ * 6. Group remaining entries by their resolved section title.
156
+ * 4. For each entry, emit a `NavItem` with:
157
+ * - `label` = `decoratorConfig.ui.label` ?? `pluralizeClassName(className)`
158
+ * - `href` = `${basePath}/${collection}` (defaults to `/api/v1/{collection}`)
159
+ * falling back to `${basePath}/{kebab-case-class}` if the
160
+ * manifest entry omits `collection`.
161
+ * - `icon` = `decoratorConfig.ui.icon` if present.
162
+ * 5. Sort items inside each section by label, then sort sections by title.
163
+ * The result is fully deterministic given a manifest input.
164
+ *
165
+ * @example Plug into RoleShell
166
+ * ```ts
167
+ * import { manifest } from '@my-app/manifest';
168
+ * import { navTreeFromManifest } from '@happyvertical/smrt-svelte/workspace';
169
+ *
170
+ * const sections = navTreeFromManifest(manifest, {
171
+ * sectionHints: {
172
+ * '@happyvertical/smrt-content': 'Content',
173
+ * '@happyvertical/smrt-commerce': 'Commerce',
174
+ * },
175
+ * });
176
+ * const roles: RoleConfig[] = [
177
+ * { id: 'admin', label: 'Admin', sections },
178
+ * ];
179
+ * ```
180
+ *
181
+ * @example Per-role filtering
182
+ * ```ts
183
+ * const editor = navTreeFromManifest(manifest, {
184
+ * permittedResources: [
185
+ * '@happyvertical/smrt-content:Article',
186
+ * '@happyvertical/smrt-content:Document',
187
+ * ],
188
+ * });
189
+ * // editor: [{ label: 'Content', children: [Articles, Documents] }]
190
+ * ```
191
+ *
192
+ * @example Unprefixed hrefs
193
+ * ```ts
194
+ * const sections = navTreeFromManifest(manifest, { basePath: '' });
195
+ * // items[0].href === '/articles' (not '/api/v1/articles')
196
+ * ```
197
+ */
198
+ export declare function navTreeFromManifest(manifest: SmrtManifestLike, options?: NavTreeFromManifestOptions): NavSection[];
199
+ export {};
200
+ //# sourceMappingURL=manifest-nav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-nav.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/manifest-nav.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH;;;;GAIG;AACH,KAAK,kBAAkB,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD,mEAAmE;AACnE,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC;;;;OAIG;IACH,eAAe,CAAC,EAAE;QAChB,EAAE,CAAC,EAAE;YACH,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;QACF;;;;;WAKG;QACH,GAAG,CAAC,EACA,OAAO,GACP;YAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;QACvE;;;WAGG;QACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;QAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAChD;AAWD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC;AAEjC,uDAAuD;AACvD,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;;OASG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAWD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAevD;AA6OD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE,0BAA+B,GACvC,UAAU,EAAE,CAkEd"}