@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,69 @@
1
+ /**
2
+ * Hook for LLM (Large Language Model) functionality
3
+ */
4
+ /**
5
+ * Options for useLLM hook
6
+ */
7
+ export interface UseLLMOptions {
8
+ /** Auto-initialize on mount */
9
+ autoInit?: boolean;
10
+ /** Model ID to load */
11
+ model?: string;
12
+ /** Default system prompt */
13
+ systemPrompt?: string;
14
+ }
15
+ /**
16
+ * Return type for useLLM hook
17
+ */
18
+ export interface UseLLMReturn {
19
+ /** Send a message and get response */
20
+ chat: (text: string, options?: {
21
+ systemPrompt?: string;
22
+ onToken?: (token: string) => void;
23
+ }) => Promise<string>;
24
+ /** Initialize the adapter */
25
+ initialize: (modelId?: string) => Promise<void>;
26
+ /** Unload model to free memory */
27
+ unload: () => Promise<void>;
28
+ /** Current state (reactive) */
29
+ readonly isReady: boolean;
30
+ readonly isInitializing: boolean;
31
+ readonly isGenerating: boolean;
32
+ readonly currentModel: string | null;
33
+ readonly error: Error | null;
34
+ readonly downloadProgress: number;
35
+ }
36
+ /**
37
+ * Hook for LLM chat
38
+ *
39
+ * @example
40
+ * ```svelte
41
+ * <script>
42
+ * import { useLLM } from '@happyvertical/smrt-svelte';
43
+ *
44
+ * const llm = useLLM({ systemPrompt: 'You are a helpful assistant.' });
45
+ *
46
+ * let input = $state('');
47
+ * let response = $state('');
48
+ *
49
+ * async function handleSubmit() {
50
+ * response = '';
51
+ * response = await llm.chat(input, {
52
+ * onToken: (token) => { response += token; }
53
+ * });
54
+ * }
55
+ * </script>
56
+ *
57
+ * {#if llm.isInitializing}
58
+ * <p>Loading model... {llm.downloadProgress}%</p>
59
+ * {:else}
60
+ * <form onsubmit={handleSubmit}>
61
+ * <input bind:value={input} />
62
+ * <button disabled={llm.isGenerating}>Send</button>
63
+ * </form>
64
+ * <p>{response}</p>
65
+ * {/if}
66
+ * ```
67
+ */
68
+ export declare function useLLM(options?: UseLLMOptions): UseLLMReturn;
69
+ //# sourceMappingURL=useLLM.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLLM.svelte.d.ts","sourceRoot":"","sources":["../../src/hooks/useLLM.svelte.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,KACnE,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,6BAA6B;IAC7B,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,kCAAkC;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,CAwDhE"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Hook for LLM (Large Language Model) functionality
3
+ */
4
+ import { onDestroy } from 'svelte';
5
+ import { getAppStateContext } from '../state/context.js';
6
+ /**
7
+ * Hook for LLM chat
8
+ *
9
+ * @example
10
+ * ```svelte
11
+ * <script>
12
+ * import { useLLM } from '@happyvertical/smrt-svelte';
13
+ *
14
+ * const llm = useLLM({ systemPrompt: 'You are a helpful assistant.' });
15
+ *
16
+ * let input = $state('');
17
+ * let response = $state('');
18
+ *
19
+ * async function handleSubmit() {
20
+ * response = '';
21
+ * response = await llm.chat(input, {
22
+ * onToken: (token) => { response += token; }
23
+ * });
24
+ * }
25
+ * </script>
26
+ *
27
+ * {#if llm.isInitializing}
28
+ * <p>Loading model... {llm.downloadProgress}%</p>
29
+ * {:else}
30
+ * <form onsubmit={handleSubmit}>
31
+ * <input bind:value={input} />
32
+ * <button disabled={llm.isGenerating}>Send</button>
33
+ * </form>
34
+ * <p>{response}</p>
35
+ * {/if}
36
+ * ```
37
+ */
38
+ export function useLLM(options = {}) {
39
+ const app = getAppStateContext();
40
+ // Auto-initialize if requested
41
+ if (options.autoInit) {
42
+ app.initializeLLM(options.model).catch(() => {
43
+ // Error is stored in state
44
+ });
45
+ }
46
+ const chat = async (text, chatOptions) => {
47
+ return app.chat(text, {
48
+ systemPrompt: chatOptions?.systemPrompt ?? options.systemPrompt,
49
+ onToken: chatOptions?.onToken,
50
+ });
51
+ };
52
+ const initialize = async (modelId) => {
53
+ await app.initializeLLM(modelId ?? options.model);
54
+ };
55
+ const unload = async () => {
56
+ await app.unloadLLM();
57
+ };
58
+ // Cleanup on destroy - don't unload by default as model download is expensive
59
+ onDestroy(() => {
60
+ // Could add option to auto-unload here
61
+ });
62
+ return {
63
+ chat,
64
+ initialize,
65
+ unload,
66
+ get isReady() {
67
+ return app.state.ai.llm.initState === 'ready';
68
+ },
69
+ get isInitializing() {
70
+ return app.state.ai.llm.initState === 'initializing';
71
+ },
72
+ get isGenerating() {
73
+ return app.state.ai.llm.isGenerating;
74
+ },
75
+ get currentModel() {
76
+ return app.state.ai.llm.currentModel;
77
+ },
78
+ get error() {
79
+ return app.state.ai.llm.error;
80
+ },
81
+ get downloadProgress() {
82
+ return app.state.ai.llm.downloadProgress?.percent ?? 0;
83
+ },
84
+ };
85
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Hook for Speech-to-Text functionality
3
+ */
4
+ import type { GetSTTOptions, STTOptions } from '../browser-ai/index.js';
5
+ /**
6
+ * Options for useSTT hook
7
+ */
8
+ export interface UseSTTOptions {
9
+ /** Auto-initialize on mount */
10
+ autoInit?: boolean;
11
+ /** Default STT options */
12
+ defaultOptions?: STTOptions;
13
+ }
14
+ /**
15
+ * Return type for useSTT hook
16
+ */
17
+ export interface UseSTTReturn {
18
+ /** Start listening */
19
+ start: (options?: STTOptions) => Promise<void>;
20
+ /** Stop listening */
21
+ stop: () => Promise<void>;
22
+ /** Initialize the adapter (called automatically if autoInit) */
23
+ initialize: (options?: GetSTTOptions) => Promise<void>;
24
+ /** Current state (reactive) */
25
+ readonly isListening: boolean;
26
+ readonly isReady: boolean;
27
+ readonly isInitializing: boolean;
28
+ /** Final transcribed text (updates on speech completion) */
29
+ readonly lastResult: string;
30
+ /** Interim transcribed text (updates live during speech) */
31
+ readonly interimResult: string;
32
+ /** Current result - interim while listening, last result otherwise */
33
+ readonly currentResult: string;
34
+ readonly error: Error | null;
35
+ readonly downloadProgress: number;
36
+ /** Current adapter type (e.g., 'browser', 'whisper-wasm', 'whisper-cpp') */
37
+ readonly adapterType: string | null;
38
+ }
39
+ /**
40
+ * Hook for Speech-to-Text
41
+ *
42
+ * @example
43
+ * ```svelte
44
+ * <script>
45
+ * import { useSTT } from '@happyvertical/smrt-svelte';
46
+ *
47
+ * const stt = useSTT();
48
+ *
49
+ * async function handleClick() {
50
+ * if (stt.isListening) {
51
+ * await stt.stop();
52
+ * } else {
53
+ * await stt.start();
54
+ * }
55
+ * }
56
+ * </script>
57
+ *
58
+ * <button onclick={handleClick}>
59
+ * {stt.isListening ? 'Stop' : 'Start'} Listening
60
+ * </button>
61
+ *
62
+ * {#if stt.lastResult}
63
+ * <p>You said: {stt.lastResult}</p>
64
+ * {/if}
65
+ * ```
66
+ */
67
+ export declare function useSTT(options?: UseSTTOptions): UseSTTReturn;
68
+ //# sourceMappingURL=useSTT.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSTT.svelte.d.ts","sourceRoot":"","sources":["../../src/hooks/useSTT.svelte.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGxE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,qBAAqB;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,gEAAgE;IAChE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,+BAA+B;IAC/B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,CAqEhE"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Hook for Speech-to-Text functionality
3
+ */
4
+ import { onDestroy } from 'svelte';
5
+ import { getAppStateContext } from '../state/context.js';
6
+ /**
7
+ * Hook for Speech-to-Text
8
+ *
9
+ * @example
10
+ * ```svelte
11
+ * <script>
12
+ * import { useSTT } from '@happyvertical/smrt-svelte';
13
+ *
14
+ * const stt = useSTT();
15
+ *
16
+ * async function handleClick() {
17
+ * if (stt.isListening) {
18
+ * await stt.stop();
19
+ * } else {
20
+ * await stt.start();
21
+ * }
22
+ * }
23
+ * </script>
24
+ *
25
+ * <button onclick={handleClick}>
26
+ * {stt.isListening ? 'Stop' : 'Start'} Listening
27
+ * </button>
28
+ *
29
+ * {#if stt.lastResult}
30
+ * <p>You said: {stt.lastResult}</p>
31
+ * {/if}
32
+ * ```
33
+ */
34
+ export function useSTT(options = {}) {
35
+ const app = getAppStateContext();
36
+ // Auto-initialize if requested
37
+ if (options.autoInit) {
38
+ app.initializeSTT().catch(() => {
39
+ // Error is stored in state
40
+ });
41
+ }
42
+ const start = async (sttOptions) => {
43
+ await app.startListening({
44
+ ...options.defaultOptions,
45
+ ...sttOptions,
46
+ });
47
+ };
48
+ const stop = async () => {
49
+ await app.stopListening();
50
+ };
51
+ const initialize = async (initOptions) => {
52
+ await app.initializeSTT(initOptions);
53
+ };
54
+ // Cleanup on destroy
55
+ onDestroy(() => {
56
+ if (app.state.ai.stt.isListening) {
57
+ app.stopListening().catch(() => { });
58
+ }
59
+ });
60
+ return {
61
+ start,
62
+ stop,
63
+ initialize,
64
+ get isListening() {
65
+ return app.state.ai.stt.isListening;
66
+ },
67
+ get isReady() {
68
+ return app.state.ai.stt.initState === 'ready';
69
+ },
70
+ get isInitializing() {
71
+ return app.state.ai.stt.initState === 'initializing';
72
+ },
73
+ get lastResult() {
74
+ return app.state.ai.stt.lastResult;
75
+ },
76
+ get interimResult() {
77
+ return app.state.ai.stt.interimResult;
78
+ },
79
+ get currentResult() {
80
+ // Return interim while listening, otherwise last result
81
+ const { isListening, interimResult, lastResult } = app.state.ai.stt;
82
+ if (isListening && interimResult) {
83
+ return interimResult;
84
+ }
85
+ return lastResult;
86
+ },
87
+ get error() {
88
+ return app.state.ai.stt.error;
89
+ },
90
+ get downloadProgress() {
91
+ return app.state.ai.stt.downloadProgress?.percent ?? 0;
92
+ },
93
+ get adapterType() {
94
+ return app.state.ai.stt.adapter?.type ?? null;
95
+ },
96
+ };
97
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Hook to access WebSocket state and methods
3
+ */
4
+ import type { SocketStatus } from '../state/app-state.js';
5
+ /**
6
+ * Access WebSocket state and methods
7
+ *
8
+ * @example
9
+ * ```svelte
10
+ * <script>
11
+ * import { useSocket } from '@happyvertical/smrt-svelte';
12
+ *
13
+ * const socket = useSocket();
14
+ *
15
+ * function sendPing() {
16
+ * socket.send({ type: 'ping' });
17
+ * }
18
+ * </script>
19
+ *
20
+ * <p>Status: {socket.status}</p>
21
+ * <p>Connected: {socket.isConnected}</p>
22
+ * <button onclick={sendPing} disabled={!socket.isConnected}>
23
+ * Ping
24
+ * </button>
25
+ * ```
26
+ */
27
+ export declare function useSocket(): {
28
+ /** Current connection status */
29
+ readonly status: SocketStatus;
30
+ /** Whether the socket is connected */
31
+ readonly isConnected: boolean;
32
+ /** Whether the socket is reconnecting */
33
+ readonly isReconnecting: boolean;
34
+ /** Number of reconnection attempts */
35
+ readonly reconnectAttempts: number;
36
+ /** Last connection error */
37
+ readonly lastError: Event | null;
38
+ /** Send a message through the socket */
39
+ send: (data: unknown) => void;
40
+ /** Manually trigger reconnection */
41
+ reconnect: () => void;
42
+ /** Disconnect from the server */
43
+ disconnect: () => void;
44
+ };
45
+ //# sourceMappingURL=useSocket.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSocket.svelte.d.ts","sourceRoot":"","sources":["../../src/hooks/useSocket.svelte.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,IAAI;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,sCAAsC;IACtC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,sCAAsC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACjC,wCAAwC;IACxC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9B,oCAAoC;IACpC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iCAAiC;IACjC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CA4BA"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Hook to access WebSocket state and methods
3
+ */
4
+ import { getAppStateContext } from '../state/context.js';
5
+ /**
6
+ * Access WebSocket state and methods
7
+ *
8
+ * @example
9
+ * ```svelte
10
+ * <script>
11
+ * import { useSocket } from '@happyvertical/smrt-svelte';
12
+ *
13
+ * const socket = useSocket();
14
+ *
15
+ * function sendPing() {
16
+ * socket.send({ type: 'ping' });
17
+ * }
18
+ * </script>
19
+ *
20
+ * <p>Status: {socket.status}</p>
21
+ * <p>Connected: {socket.isConnected}</p>
22
+ * <button onclick={sendPing} disabled={!socket.isConnected}>
23
+ * Ping
24
+ * </button>
25
+ * ```
26
+ */
27
+ export function useSocket() {
28
+ const app = getAppStateContext();
29
+ return {
30
+ get status() {
31
+ return app.state.socket.status;
32
+ },
33
+ get isConnected() {
34
+ return app.state.socket.status === 'connected';
35
+ },
36
+ get isReconnecting() {
37
+ return app.state.socket.status === 'reconnecting';
38
+ },
39
+ get reconnectAttempts() {
40
+ return app.state.socket.reconnectAttempts;
41
+ },
42
+ get lastError() {
43
+ return app.state.socket.lastError;
44
+ },
45
+ send: (data) => app.sendMessage(data),
46
+ reconnect: () => {
47
+ const config = app.socketConfig;
48
+ if (config) {
49
+ app.connectSocket(config);
50
+ }
51
+ },
52
+ disconnect: () => app.disconnectSocket(),
53
+ };
54
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Hook for Text-to-Speech functionality
3
+ */
4
+ import type { TTSOptions, TTSVoice } from '../browser-ai/index.js';
5
+ /**
6
+ * Options for useTTS hook
7
+ */
8
+ export interface UseTTSOptions {
9
+ /** Auto-initialize on mount */
10
+ autoInit?: boolean;
11
+ /** Default TTS options */
12
+ defaultOptions?: TTSOptions;
13
+ }
14
+ /**
15
+ * Return type for useTTS hook
16
+ */
17
+ export interface UseTTSReturn {
18
+ /** Speak text */
19
+ speak: (text: string, options?: TTSOptions) => Promise<void>;
20
+ /** Stop speaking */
21
+ stop: () => void;
22
+ /** Pause speaking */
23
+ pause: () => void;
24
+ /** Resume speaking */
25
+ resume: () => void;
26
+ /** Initialize the adapter (called automatically if autoInit) */
27
+ initialize: () => Promise<void>;
28
+ /** Get available voices */
29
+ getVoices: () => TTSVoice[];
30
+ /** Current state (reactive) */
31
+ readonly isSpeaking: boolean;
32
+ readonly isPaused: boolean;
33
+ readonly isReady: boolean;
34
+ readonly isInitializing: boolean;
35
+ readonly error: Error | null;
36
+ readonly downloadProgress: number;
37
+ }
38
+ /**
39
+ * Hook for Text-to-Speech
40
+ *
41
+ * @example
42
+ * ```svelte
43
+ * <script>
44
+ * import { useTTS } from '@happyvertical/smrt-svelte';
45
+ *
46
+ * const tts = useTTS();
47
+ * let text = 'Hello, world!';
48
+ *
49
+ * async function handleSpeak() {
50
+ * if (tts.isSpeaking) {
51
+ * tts.stop();
52
+ * } else {
53
+ * await tts.speak(text);
54
+ * }
55
+ * }
56
+ * </script>
57
+ *
58
+ * <input bind:value={text} />
59
+ * <button onclick={handleSpeak}>
60
+ * {tts.isSpeaking ? 'Stop' : 'Speak'}
61
+ * </button>
62
+ * ```
63
+ */
64
+ export declare function useTTS(options?: UseTTSOptions): UseTTSReturn;
65
+ //# sourceMappingURL=useTTS.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTTS.svelte.d.ts","sourceRoot":"","sources":["../../src/hooks/useTTS.svelte.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGnE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,oBAAoB;IACpB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,qBAAqB;IACrB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,sBAAsB;IACtB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,gEAAgE;IAChE,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,2BAA2B;IAC3B,SAAS,EAAE,MAAM,QAAQ,EAAE,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,CAsEhE"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Hook for Text-to-Speech functionality
3
+ */
4
+ import { onDestroy } from 'svelte';
5
+ import { getAppStateContext } from '../state/context.js';
6
+ /**
7
+ * Hook for Text-to-Speech
8
+ *
9
+ * @example
10
+ * ```svelte
11
+ * <script>
12
+ * import { useTTS } from '@happyvertical/smrt-svelte';
13
+ *
14
+ * const tts = useTTS();
15
+ * let text = 'Hello, world!';
16
+ *
17
+ * async function handleSpeak() {
18
+ * if (tts.isSpeaking) {
19
+ * tts.stop();
20
+ * } else {
21
+ * await tts.speak(text);
22
+ * }
23
+ * }
24
+ * </script>
25
+ *
26
+ * <input bind:value={text} />
27
+ * <button onclick={handleSpeak}>
28
+ * {tts.isSpeaking ? 'Stop' : 'Speak'}
29
+ * </button>
30
+ * ```
31
+ */
32
+ export function useTTS(options = {}) {
33
+ const app = getAppStateContext();
34
+ // Auto-initialize if requested
35
+ if (options.autoInit) {
36
+ app.initializeTTS().catch(() => {
37
+ // Error is stored in state
38
+ });
39
+ }
40
+ const speak = async (text, ttsOptions) => {
41
+ await app.speak(text, {
42
+ ...options.defaultOptions,
43
+ ...ttsOptions,
44
+ });
45
+ };
46
+ const stop = () => {
47
+ app.stopSpeaking();
48
+ };
49
+ const pause = () => {
50
+ app.pauseSpeaking();
51
+ };
52
+ const resume = () => {
53
+ app.resumeSpeaking();
54
+ };
55
+ const initialize = async () => {
56
+ await app.initializeTTS();
57
+ };
58
+ const getVoices = () => {
59
+ return app.getTTSVoices();
60
+ };
61
+ // Cleanup on destroy
62
+ onDestroy(() => {
63
+ if (app.state.ai.tts.isSpeaking) {
64
+ app.stopSpeaking();
65
+ }
66
+ });
67
+ return {
68
+ speak,
69
+ stop,
70
+ pause,
71
+ resume,
72
+ initialize,
73
+ getVoices,
74
+ get isSpeaking() {
75
+ return app.state.ai.tts.isSpeaking;
76
+ },
77
+ get isPaused() {
78
+ return app.state.ai.tts.isPaused;
79
+ },
80
+ get isReady() {
81
+ return app.state.ai.tts.initState === 'ready';
82
+ },
83
+ get isInitializing() {
84
+ return app.state.ai.tts.initState === 'initializing';
85
+ },
86
+ get error() {
87
+ return app.state.ai.tts.error;
88
+ },
89
+ get downloadProgress() {
90
+ return app.state.ai.tts.downloadProgress?.percent ?? 0;
91
+ },
92
+ };
93
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Hook for accessing theme context
3
+ */
4
+ import { type ThemeContext } from '@happyvertical/smrt-ui/theme';
5
+ /**
6
+ * Get theme context (throws if not available)
7
+ */
8
+ export declare function useTheme(): ThemeContext;
9
+ /**
10
+ * Try to get theme context (returns null if not available)
11
+ */
12
+ export declare function useTryTheme(): ThemeContext | null;
13
+ //# sourceMappingURL=useTheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useTheme.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,8BAA8B,CAAC;AAEtC;;GAEG;AACH,wBAAgB,QAAQ,IAAI,YAAY,CAEvC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,YAAY,GAAG,IAAI,CAEjD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Hook for accessing theme context
3
+ */
4
+ import { getThemeContext, tryGetThemeContext, } from '@happyvertical/smrt-ui/theme';
5
+ /**
6
+ * Get theme context (throws if not available)
7
+ */
8
+ export function useTheme() {
9
+ return getThemeContext();
10
+ }
11
+ /**
12
+ * Try to get theme context (returns null if not available)
13
+ */
14
+ export function useTryTheme() {
15
+ return tryGetThemeContext();
16
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Integration coverage for the server snapshot builder (S13 #1418): it seeds the
3
+ * languages registry from smrt-svelte's English defaults and resolves them into
4
+ * a template dictionary the client renders synchronously. Exercises the real
5
+ * `@happyvertical/smrt-languages` resolver (no DB → code-default layer only).
6
+ *
7
+ * `server.ts` imports the languages package root, whose `__smrt-register__`
8
+ * manifest side-effect throws under vitest's source-alias (it resolves
9
+ * `manifest.json` via the dev-server URL, not a file). That manifest is the
10
+ * ObjectRegistry's, unrelated to string resolution (which uses the separate
11
+ * LanguageRegistry), so we record-not-throw via SMRT_STRICT_REGISTRY=false set
12
+ * before a dynamic import of the module under test.
13
+ */
14
+ import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest';
15
+ let buildI18nSnapshot;
16
+ let defineMessages;
17
+ let clearRegisteredMessages;
18
+ beforeAll(async () => {
19
+ vi.stubEnv('SMRT_STRICT_REGISTRY', 'false');
20
+ ({ buildI18nSnapshot } = await import('../server.js'));
21
+ ({ defineMessages, clearRegisteredMessages } = await import('@happyvertical/smrt-ui/i18n'));
22
+ });
23
+ afterEach(() => {
24
+ clearRegisteredMessages();
25
+ });
26
+ describe('buildI18nSnapshot', () => {
27
+ it('resolves registered English defaults into a template dictionary', async () => {
28
+ defineMessages({
29
+ 'ui.snapshot_test.empty': 'No data available',
30
+ 'ui.snapshot_test.range': 'Showing {count} of {total}',
31
+ });
32
+ const snapshot = await buildI18nSnapshot({ locale: 'en' });
33
+ expect(snapshot.locale).toBe('en');
34
+ expect(snapshot.messages['ui.snapshot_test.empty']).toBe('No data available');
35
+ // Templates are shipped un-rendered; the client interpolates at call time.
36
+ expect(snapshot.messages['ui.snapshot_test.range']).toBe('Showing {count} of {total}');
37
+ });
38
+ it('honors an explicit key subset', async () => {
39
+ defineMessages({
40
+ 'ui.snapshot_test.a': 'Alpha',
41
+ 'ui.snapshot_test.b': 'Beta',
42
+ });
43
+ const snapshot = await buildI18nSnapshot({
44
+ locale: 'en',
45
+ keys: ['ui.snapshot_test.a'],
46
+ });
47
+ expect(snapshot.messages['ui.snapshot_test.a']).toBe('Alpha');
48
+ expect(snapshot.messages['ui.snapshot_test.b']).toBeUndefined();
49
+ });
50
+ });