@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,92 @@
1
+ /**
2
+ * Error classes for browser AI capabilities
3
+ */
4
+ /**
5
+ * Base error class for browser AI operations
6
+ */
7
+ export class BrowserAIError extends Error {
8
+ code;
9
+ adapter;
10
+ constructor(message, code, adapter) {
11
+ super(message);
12
+ this.code = code;
13
+ this.adapter = adapter;
14
+ this.name = 'BrowserAIError';
15
+ }
16
+ }
17
+ /**
18
+ * Thrown when an adapter fails to initialize
19
+ */
20
+ export class InitializationError extends BrowserAIError {
21
+ constructor(adapter, reason) {
22
+ super(`Failed to initialize ${adapter} adapter${reason ? `: ${reason}` : ''}`, 'INITIALIZATION_ERROR', adapter);
23
+ this.name = 'InitializationError';
24
+ }
25
+ }
26
+ /**
27
+ * Thrown when a required capability is not available
28
+ */
29
+ export class CapabilityNotAvailableError extends BrowserAIError {
30
+ constructor(capability, adapter) {
31
+ super(`Required capability not available: ${capability}`, 'CAPABILITY_NOT_AVAILABLE', adapter);
32
+ this.name = 'CapabilityNotAvailableError';
33
+ }
34
+ }
35
+ /**
36
+ * Thrown when a model download fails
37
+ */
38
+ export class DownloadError extends BrowserAIError {
39
+ url;
40
+ constructor(url, reason, adapter) {
41
+ super(`Failed to download from ${url}${reason ? `: ${reason}` : ''}`, 'DOWNLOAD_ERROR', adapter);
42
+ this.url = url;
43
+ this.name = 'DownloadError';
44
+ }
45
+ }
46
+ /**
47
+ * Thrown when model loading fails
48
+ */
49
+ export class ModelLoadError extends BrowserAIError {
50
+ model;
51
+ constructor(model, reason, adapter) {
52
+ super(`Failed to load model ${model}${reason ? `: ${reason}` : ''}`, 'MODEL_LOAD_ERROR', adapter);
53
+ this.model = model;
54
+ this.name = 'ModelLoadError';
55
+ }
56
+ }
57
+ /**
58
+ * Thrown when an operation times out
59
+ */
60
+ export class TimeoutError extends BrowserAIError {
61
+ constructor(operation, timeoutMs, adapter) {
62
+ super(`Operation timed out after ${timeoutMs}ms: ${operation}`, 'TIMEOUT_ERROR', adapter);
63
+ this.name = 'TimeoutError';
64
+ }
65
+ }
66
+ /**
67
+ * Thrown when user denies permission (e.g., microphone access)
68
+ */
69
+ export class PermissionDeniedError extends BrowserAIError {
70
+ constructor(permission, adapter) {
71
+ super(`Permission denied: ${permission}`, 'PERMISSION_DENIED', adapter);
72
+ this.name = 'PermissionDeniedError';
73
+ }
74
+ }
75
+ /**
76
+ * Thrown when an adapter is not in the correct state for an operation
77
+ */
78
+ export class InvalidStateError extends BrowserAIError {
79
+ constructor(expectedState, actualState, adapter) {
80
+ super(`Invalid state: expected ${expectedState}, got ${actualState}`, 'INVALID_STATE', adapter);
81
+ this.name = 'InvalidStateError';
82
+ }
83
+ }
84
+ /**
85
+ * Thrown when an adapter type is not supported
86
+ */
87
+ export class UnsupportedAdapterError extends BrowserAIError {
88
+ constructor(adapterType, supportedTypes) {
89
+ super(`Unsupported adapter type: ${adapterType}. Supported: ${supportedTypes.join(', ')}`, 'UNSUPPORTED_ADAPTER');
90
+ this.name = 'UnsupportedAdapterError';
91
+ }
92
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core types and utilities
3
+ */
4
+ export * from './errors.js';
5
+ export * from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/browser-ai/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core types and utilities
3
+ */
4
+ export * from './errors.js';
5
+ export * from './types.js';
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Core types for browser AI capabilities
3
+ */
4
+ /**
5
+ * Download progress tracking for large models/WASM files
6
+ */
7
+ export interface DownloadProgressInfo {
8
+ /** Current download state */
9
+ state: 'idle' | 'downloading' | 'extracting' | 'complete' | 'error';
10
+ /** Bytes downloaded so far */
11
+ bytesLoaded: number;
12
+ /** Total bytes to download (0 if unknown) */
13
+ bytesTotal: number;
14
+ /** Progress percentage (0-100) */
15
+ percent: number;
16
+ /** Current file being downloaded (for multi-file downloads) */
17
+ currentFile?: string;
18
+ /** Estimated time remaining in ms */
19
+ estimatedTimeRemaining?: number;
20
+ /** Error message if state is 'error' */
21
+ error?: string;
22
+ }
23
+ /**
24
+ * Callback for download progress updates
25
+ */
26
+ export type OnProgress = (progress: DownloadProgressInfo) => void;
27
+ /**
28
+ * Initialization state for adapters with two-phase init
29
+ */
30
+ export type InitState = 'uninitialized' | 'initializing' | 'ready' | 'error';
31
+ /**
32
+ * Base options for all browser AI adapters
33
+ */
34
+ export interface BaseBrowserAIOptions {
35
+ /** Callback for download progress */
36
+ onProgress?: OnProgress;
37
+ /** Timeout for initialization in ms */
38
+ timeout?: number;
39
+ /**
40
+ * Whether to allow loading models from local /models/ path.
41
+ * When false, models are loaded from remote CDN (HuggingFace Hub).
42
+ * @default false - Use remote models by default to avoid 404s
43
+ */
44
+ allowLocalModels?: boolean;
45
+ }
46
+ /**
47
+ * Speech-to-text capabilities
48
+ */
49
+ export interface STTCapabilitiesInfo {
50
+ /** Browser Web Speech API available */
51
+ browserSpeechAPI: boolean;
52
+ /** Whisper WASM can run (requires WASM + potentially SharedArrayBuffer) */
53
+ whisperWasm: boolean;
54
+ }
55
+ /**
56
+ * Text-to-speech capabilities
57
+ */
58
+ export interface TTSCapabilitiesInfo {
59
+ /** Browser Speech Synthesis API available */
60
+ browserSynthesisAPI: boolean;
61
+ /** Transformers.js TTS can run */
62
+ transformersTTS: boolean;
63
+ }
64
+ /**
65
+ * LLM capabilities
66
+ */
67
+ export interface LLMCapabilitiesInfo {
68
+ /** WebLLM can run */
69
+ webllm: boolean;
70
+ /** Transformers.js LLM can run */
71
+ transformersLLM: boolean;
72
+ /** WebGPU acceleration available */
73
+ webgpu: boolean;
74
+ }
75
+ /**
76
+ * General browser capabilities
77
+ */
78
+ export interface BrowserCapabilitiesInfo {
79
+ /** SharedArrayBuffer available (needed for some WASM) */
80
+ sharedArrayBuffer: boolean;
81
+ /** Web Workers available */
82
+ webWorkers: boolean;
83
+ /** IndexedDB available (for caching models) */
84
+ indexedDB: boolean;
85
+ /** WebAssembly supported */
86
+ wasmSupport: boolean;
87
+ /** SIMD WASM supported */
88
+ wasmSimd: boolean;
89
+ }
90
+ /**
91
+ * Complete browser AI capabilities
92
+ */
93
+ export interface BrowserAICapabilities {
94
+ /** Speech-to-text capabilities */
95
+ stt: STTCapabilitiesInfo;
96
+ /** Text-to-speech capabilities */
97
+ tts: TTSCapabilitiesInfo;
98
+ /** LLM capabilities */
99
+ llm: LLMCapabilitiesInfo;
100
+ /** General browser capabilities */
101
+ browser: BrowserCapabilitiesInfo;
102
+ }
103
+ /**
104
+ * Create a default "idle" progress state
105
+ */
106
+ export declare function createIdleProgress(): DownloadProgressInfo;
107
+ /**
108
+ * Create an error progress state
109
+ */
110
+ export declare function createErrorProgress(error: string): DownloadProgressInfo;
111
+ /**
112
+ * Calculate progress percentage
113
+ */
114
+ export declare function calculatePercent(loaded: number, total: number): number;
115
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser-ai/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IACpE,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAElE;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,cAAc,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kCAAkC;IAClC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,kCAAkC;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,oCAAoC;IACpC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,yDAAyD;IACzD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,GAAG,EAAE,mBAAmB,CAAC;IACzB,kCAAkC;IAClC,GAAG,EAAE,mBAAmB,CAAC;IACzB,uBAAuB;IACvB,GAAG,EAAE,mBAAmB,CAAC;IACzB,mCAAmC;IACnC,OAAO,EAAE,uBAAuB,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,CAOzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAQvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtE"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Core types for browser AI capabilities
3
+ */
4
+ /**
5
+ * Create a default "idle" progress state
6
+ */
7
+ export function createIdleProgress() {
8
+ return {
9
+ state: 'idle',
10
+ bytesLoaded: 0,
11
+ bytesTotal: 0,
12
+ percent: 0,
13
+ };
14
+ }
15
+ /**
16
+ * Create an error progress state
17
+ */
18
+ export function createErrorProgress(error) {
19
+ return {
20
+ state: 'error',
21
+ bytesLoaded: 0,
22
+ bytesTotal: 0,
23
+ percent: 0,
24
+ error,
25
+ };
26
+ }
27
+ /**
28
+ * Calculate progress percentage
29
+ */
30
+ export function calculatePercent(loaded, total) {
31
+ if (total === 0)
32
+ return 0;
33
+ return Math.round((loaded / total) * 100);
34
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @happyvertical/browser-ai
3
+ *
4
+ * Framework-agnostic browser AI capabilities with adapter pattern.
5
+ * Provides STT, TTS, and LLM functionality with multiple backend options.
6
+ */
7
+ export * from './adapters/llm/index.js';
8
+ export * from './adapters/stt/index.js';
9
+ export * from './adapters/tts/index.js';
10
+ export * from './capabilities/detector.js';
11
+ export * from './core/index.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-ai/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,yBAAyB,CAAC;AAExC,cAAc,yBAAyB,CAAC;AAExC,cAAc,yBAAyB,CAAC;AAExC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @happyvertical/browser-ai
3
+ *
4
+ * Framework-agnostic browser AI capabilities with adapter pattern.
5
+ * Provides STT, TTS, and LLM functionality with multiple backend options.
6
+ */
7
+ // LLM adapters
8
+ export * from './adapters/llm/index.js';
9
+ // STT adapters
10
+ export * from './adapters/stt/index.js';
11
+ // TTS adapters
12
+ export * from './adapters/tts/index.js';
13
+ // Capability detection
14
+ export * from './capabilities/detector.js';
15
+ // Core types and errors
16
+ export * from './core/index.js';
@@ -0,0 +1,77 @@
1
+ <script lang="ts">
2
+ /**
3
+ * AI Loading Overlay Component
4
+ *
5
+ * Shows a full-screen overlay while AI models are being downloaded/initialized.
6
+ * Wraps the generic LoadingOverlay with AI-specific state management.
7
+ */
8
+
9
+ import { LoadingOverlay } from '@happyvertical/smrt-ui/feedback';
10
+ import type { AILoadingState } from '../../../state/app-state.js';
11
+ import { getAppStateContext } from '../../../state/context.js';
12
+
13
+ export interface Props {
14
+ /** Custom loading message (overrides auto-detected phase label) */
15
+ message?: string;
16
+ /** Whether to show the overlay (auto-detected from state if not provided) */
17
+ show?: boolean;
18
+ /** Allow dismissing the overlay */
19
+ dismissible?: boolean;
20
+ /** Custom CSS class */
21
+ class?: string;
22
+ /** Callback when dismissed */
23
+ ondismiss?: () => void;
24
+ }
25
+
26
+ const {
27
+ message,
28
+ show,
29
+ dismissible = false,
30
+ class: className = '',
31
+ ondismiss,
32
+ }: Props = $props();
33
+
34
+ const appState = getAppStateContext();
35
+
36
+ // AI-specific state
37
+ const isLoading = $derived(appState.isAILoading);
38
+ const aiLoading = $derived(appState.aiLoading);
39
+
40
+ // Use explicit show prop if provided, otherwise auto-detect from AI state
41
+ const shouldShow = $derived(show ?? isLoading);
42
+
43
+ // Get phase label based on AI loading state
44
+ function getPhaseLabel(phase: AILoadingState['phase']): string {
45
+ switch (phase) {
46
+ case 'checking':
47
+ return 'Checking AI capabilities...';
48
+ case 'downloading':
49
+ return 'Downloading AI models...';
50
+ case 'initializing':
51
+ return 'Initializing AI...';
52
+ case 'ready':
53
+ return 'AI Ready';
54
+ case 'error':
55
+ return 'Error loading AI';
56
+ default:
57
+ return 'Loading...';
58
+ }
59
+ }
60
+
61
+ // Compute props for generic LoadingOverlay
62
+ const overlayMessage = $derived(message ?? getPhaseLabel(aiLoading.phase));
63
+ const overlayProgress = $derived(aiLoading.overallProgress);
64
+ const overlayItems = $derived(aiLoading.loaded);
65
+ const overlayError = $derived(aiLoading.error);
66
+ </script>
67
+
68
+ <LoadingOverlay
69
+ show={shouldShow}
70
+ message={overlayMessage}
71
+ progress={overlayProgress}
72
+ items={overlayItems}
73
+ error={overlayError}
74
+ dismissible={dismissible}
75
+ class={className}
76
+ ondismiss={ondismiss}
77
+ />
@@ -0,0 +1,16 @@
1
+ export interface Props {
2
+ /** Custom loading message (overrides auto-detected phase label) */
3
+ message?: string;
4
+ /** Whether to show the overlay (auto-detected from state if not provided) */
5
+ show?: boolean;
6
+ /** Allow dismissing the overlay */
7
+ dismissible?: boolean;
8
+ /** Custom CSS class */
9
+ class?: string;
10
+ /** Callback when dismissed */
11
+ ondismiss?: () => void;
12
+ }
13
+ declare const AILoadingOverlay: import("svelte").Component<Props, {}, "">;
14
+ type AILoadingOverlay = ReturnType<typeof AILoadingOverlay>;
15
+ export default AILoadingOverlay;
16
+ //# sourceMappingURL=AILoadingOverlay.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AILoadingOverlay.svelte.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/svelte/components/AILoadingOverlay.svelte.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,KAAK;IACpB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAuDD,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,57 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { useAppState } from '../../../hooks/useAppState.svelte.js';
4
+
5
+ export interface Props {
6
+ /** Require 'smrt' mode to be enabled */
7
+ requireSmrt?: boolean;
8
+ /** Require specific capability */
9
+ require?: 'stt' | 'tts' | 'llm' | 'webgpu';
10
+ /** Content to show when requirements are met */
11
+ children: Snippet;
12
+ /** Fallback content when requirements are not met */
13
+ fallback?: Snippet;
14
+ }
15
+
16
+ const { requireSmrt = false, require, children, fallback }: Props = $props();
17
+
18
+ const app = useAppState();
19
+
20
+ const hasCapability = $derived.by(() => {
21
+ const caps = app.state.capabilities;
22
+ if (!caps) return false;
23
+
24
+ switch (require) {
25
+ case 'stt':
26
+ return caps.stt.browserSpeechAPI || caps.stt.whisperWasm;
27
+ case 'tts':
28
+ return caps.tts.browserSynthesisAPI || caps.tts.transformersTTS;
29
+ case 'llm':
30
+ return caps.llm.webllm || caps.llm.transformersLLM;
31
+ case 'webgpu':
32
+ return caps.llm.webgpu;
33
+ default:
34
+ return true;
35
+ }
36
+ });
37
+
38
+ const shouldShow = $derived.by(() => {
39
+ // Check mode requirement
40
+ if (requireSmrt && app.state.mode !== 'smrt') {
41
+ return false;
42
+ }
43
+
44
+ // Check capability requirement
45
+ if (require && !hasCapability) {
46
+ return false;
47
+ }
48
+
49
+ return true;
50
+ });
51
+ </script>
52
+
53
+ {#if shouldShow}
54
+ {@render children()}
55
+ {:else if fallback}
56
+ {@render fallback()}
57
+ {/if}
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from 'svelte';
2
+ export interface Props {
3
+ /** Require 'smrt' mode to be enabled */
4
+ requireSmrt?: boolean;
5
+ /** Require specific capability */
6
+ require?: 'stt' | 'tts' | 'llm' | 'webgpu';
7
+ /** Content to show when requirements are met */
8
+ children: Snippet;
9
+ /** Fallback content when requirements are not met */
10
+ fallback?: Snippet;
11
+ }
12
+ declare const CapabilityGate: import("svelte").Component<Props, {}, "">;
13
+ type CapabilityGate = ReturnType<typeof CapabilityGate>;
14
+ export default CapabilityGate;
15
+ //# sourceMappingURL=CapabilityGate.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapabilityGate.svelte.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/svelte/components/CapabilityGate.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,KAAK;IACpB,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kCAAkC;IAClC,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAmDD,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,141 @@
1
+ <script lang="ts">
2
+ import type { DownloadProgressInfo } from '../../index.js';
3
+
4
+ export interface Props {
5
+ /** Progress data */
6
+ progress: DownloadProgressInfo | null;
7
+ /** Label to show above progress bar */
8
+ label?: string;
9
+ /** Show percentage text */
10
+ showPercent?: boolean;
11
+ /** Show bytes downloaded */
12
+ showBytes?: boolean;
13
+ }
14
+
15
+ const {
16
+ progress,
17
+ label = 'Loading...',
18
+ showPercent = true,
19
+ showBytes = false,
20
+ }: Props = $props();
21
+
22
+ function formatBytes(bytes: number): string {
23
+ if (bytes === 0) return '0 B';
24
+ const k = 1024;
25
+ const sizes = ['B', 'KB', 'MB', 'GB'];
26
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
27
+ return `${parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
28
+ }
29
+ </script>
30
+
31
+ <div class="download-progress">
32
+ <div class="label">
33
+ <span>{label}</span>
34
+ {#if showPercent && progress}
35
+ <span class="percent">{progress.percent}%</span>
36
+ {/if}
37
+ </div>
38
+
39
+ <div class="progress-bar">
40
+ <div
41
+ class="progress-fill"
42
+ style:width="{progress?.percent ?? 0}%"
43
+ class:indeterminate={!progress || progress.state === 'idle'}
44
+ ></div>
45
+ </div>
46
+
47
+ {#if showBytes && progress && progress.bytesTotal > 0}
48
+ <div class="bytes">
49
+ {formatBytes(progress.bytesLoaded)} / {formatBytes(progress.bytesTotal)}
50
+ </div>
51
+ {/if}
52
+
53
+ {#if progress?.currentFile}
54
+ <div class="current-file">{progress.currentFile}</div>
55
+ {/if}
56
+
57
+ {#if progress?.state === 'error'}
58
+ <div class="error">{progress.error}</div>
59
+ {/if}
60
+ </div>
61
+
62
+ <style>
63
+ .download-progress {
64
+ width: 100%;
65
+ padding: var(--smrt-spacing-md, 12px);
66
+ background: var(--smrt-color-surface-container-low, #f9fafb);
67
+ border-radius: var(--smrt-radius-medium, 8px);
68
+ }
69
+
70
+ .label {
71
+ display: flex;
72
+ justify-content: space-between;
73
+ align-items: center;
74
+ font: var(--smrt-typography-body-medium-font, 0.875rem / 1.25 sans-serif);
75
+ color: var(--smrt-color-on-surface, #1a1c1e);
76
+ margin-bottom: var(--smrt-spacing-sm, 8px);
77
+ }
78
+
79
+ .percent {
80
+ font-weight: var(--smrt-typography-weight-semibold, 600);
81
+ color: var(--smrt-color-primary, #005ac1);
82
+ }
83
+
84
+ .progress-bar {
85
+ width: 100%;
86
+ height: 8px;
87
+ background: var(--smrt-color-outline-variant, #c4c6cf);
88
+ border-radius: var(--smrt-radius-small, 4px);
89
+ overflow: hidden;
90
+ }
91
+
92
+ .progress-fill {
93
+ height: 100%;
94
+ background: linear-gradient(90deg, var(--smrt-color-primary, #005ac1), var(--smrt-color-primary-container, #d6e3ff));
95
+ border-radius: var(--smrt-radius-small, 4px);
96
+ transition: width var(--smrt-duration-medium1, 300ms) var(--smrt-easing-standard, ease);
97
+ }
98
+
99
+ .progress-fill.indeterminate {
100
+ width: 30% !important;
101
+ animation: indeterminate 1.5s infinite linear;
102
+ }
103
+
104
+ @keyframes indeterminate {
105
+ 0% { transform: translateX(-100%); }
106
+ 100% { transform: translateX(400%); }
107
+ }
108
+
109
+ .bytes {
110
+ font: var(--smrt-typography-body-small-font, 0.75rem / 1.25 sans-serif);
111
+ color: var(--smrt-color-on-surface-variant, #43474e);
112
+ margin-top: var(--smrt-spacing-2, 8px);
113
+ text-align: center;
114
+ }
115
+
116
+ .current-file {
117
+ font: var(--smrt-typography-body-small-font, 0.75rem / 1.25 sans-serif);
118
+ color: var(--smrt-color-outline, #74777f);
119
+ margin-top: var(--smrt-spacing-1, 4px);
120
+ text-align: center;
121
+ white-space: nowrap;
122
+ overflow: hidden;
123
+ text-overflow: ellipsis;
124
+ }
125
+
126
+ .error {
127
+ font: var(--smrt-typography-body-small-font, 0.75rem / 1.25 sans-serif);
128
+ color: var(--smrt-color-error, #ba1a1a);
129
+ margin-top: var(--smrt-spacing-2, 8px);
130
+ }
131
+
132
+ @media (prefers-reduced-motion: reduce) {
133
+ .progress-fill {
134
+ transition: none;
135
+ }
136
+
137
+ .progress-fill.indeterminate {
138
+ animation: none;
139
+ }
140
+ }
141
+ </style>
@@ -0,0 +1,15 @@
1
+ import type { DownloadProgressInfo } from '../../index.js';
2
+ export interface Props {
3
+ /** Progress data */
4
+ progress: DownloadProgressInfo | null;
5
+ /** Label to show above progress bar */
6
+ label?: string;
7
+ /** Show percentage text */
8
+ showPercent?: boolean;
9
+ /** Show bytes downloaded */
10
+ showBytes?: boolean;
11
+ }
12
+ declare const DownloadProgress: import("svelte").Component<Props, {}, "">;
13
+ type DownloadProgress = ReturnType<typeof DownloadProgress>;
14
+ export default DownloadProgress;
15
+ //# sourceMappingURL=DownloadProgress.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DownloadProgress.svelte.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/svelte/components/DownloadProgress.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,MAAM,WAAW,KAAK;IACpB,oBAAoB;IACpB,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAoDD,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}