@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,91 @@
1
+ /**
2
+ * LLM adapter factory with type guards
3
+ */
4
+ import { detectCapabilities, getBestLLMBackend, } from '../../capabilities/detector.js';
5
+ import { UnsupportedAdapterError } from '../../core/errors.js';
6
+ /**
7
+ * Type guard for WebLLM options
8
+ */
9
+ function isWebLLMOptions(options) {
10
+ return !options.type || options.type === 'webllm';
11
+ }
12
+ /**
13
+ * Type guard for Transformers.js LLM options
14
+ */
15
+ function isTransformersLLMOptions(options) {
16
+ return options.type === 'transformers-llm';
17
+ }
18
+ /**
19
+ * Create an LLM adapter
20
+ *
21
+ * Uses lazy loading to only import the requested adapter.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * // WebLLM (default)
26
+ * const llm = await getLLM();
27
+ *
28
+ * // With specific model
29
+ * const llm = await getLLM({ defaultModel: 'Llama-3.2-1B-Instruct-q4f16_1-MLC' });
30
+ * ```
31
+ */
32
+ export async function getLLM(options = {}) {
33
+ if (isWebLLMOptions(options)) {
34
+ const { WebLLMAdapter } = await import('./webllm.js');
35
+ return new WebLLMAdapter(options);
36
+ }
37
+ if (isTransformersLLMOptions(options)) {
38
+ // Transformers.js adapter not yet implemented
39
+ throw new UnsupportedAdapterError('transformers-llm', ['webllm']);
40
+ }
41
+ throw new UnsupportedAdapterError(options.type, [
42
+ 'webllm',
43
+ 'transformers-llm',
44
+ ]);
45
+ }
46
+ /**
47
+ * Auto-detect and create the best available LLM adapter
48
+ *
49
+ * Selection priority:
50
+ * 1. WebLLM with WebGPU (best performance)
51
+ * 2. Transformers.js as fallback
52
+ *
53
+ * @throws If no LLM adapter is available
54
+ */
55
+ export async function getLLMAuto(options = {}) {
56
+ const caps = detectCapabilities();
57
+ const backend = getBestLLMBackend(caps);
58
+ if (!backend) {
59
+ throw new Error('No LLM capability available in this browser');
60
+ }
61
+ if (backend === 'webllm') {
62
+ return getLLM({
63
+ type: 'webllm',
64
+ ...options,
65
+ });
66
+ }
67
+ // transformers-llm fallback (not yet implemented)
68
+ return getLLM({
69
+ type: 'webllm', // Fall back to webllm even without WebGPU
70
+ ...options,
71
+ });
72
+ }
73
+ /**
74
+ * Check if a specific LLM backend is available
75
+ */
76
+ export function isLLMAvailable(type) {
77
+ const caps = detectCapabilities();
78
+ if (type === 'webllm') {
79
+ return caps.llm.webllm;
80
+ }
81
+ if (type === 'transformers-llm') {
82
+ return caps.llm.transformersLLM;
83
+ }
84
+ return false;
85
+ }
86
+ /**
87
+ * Check if WebGPU is available for accelerated inference
88
+ */
89
+ export function hasWebGPU() {
90
+ return detectCapabilities().llm.webgpu;
91
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * LLM adapters
3
+ */
4
+ export * from './factory.js';
5
+ export * from './types.js';
6
+ export { WebLLMAdapter } from './webllm.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/llm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * LLM adapters
3
+ */
4
+ export * from './factory.js';
5
+ export * from './types.js';
6
+ export { WebLLMAdapter } from './webllm.js';
@@ -0,0 +1,182 @@
1
+ /**
2
+ * LLM adapter types
3
+ */
4
+ import type { BaseBrowserAIOptions, InitState, OnProgress } from '../../core/types.js';
5
+ /**
6
+ * LLM message structure (matching standard chat format)
7
+ */
8
+ export interface LLMMessage {
9
+ role: 'system' | 'user' | 'assistant';
10
+ content: string;
11
+ }
12
+ /**
13
+ * LLM response structure
14
+ */
15
+ export interface LLMResponse {
16
+ /** Generated text content */
17
+ content: string;
18
+ /** Token usage statistics */
19
+ usage?: {
20
+ promptTokens: number;
21
+ completionTokens: number;
22
+ totalTokens: number;
23
+ };
24
+ /** Why generation stopped */
25
+ finishReason?: 'stop' | 'length' | 'error';
26
+ /** Model used for generation */
27
+ model?: string;
28
+ }
29
+ /**
30
+ * LLM model information
31
+ */
32
+ export interface LLMModel {
33
+ /** Model identifier */
34
+ id: string;
35
+ /** Human-readable name */
36
+ name: string;
37
+ /** Maximum context length in tokens */
38
+ contextLength: number;
39
+ /** Download size in bytes */
40
+ downloadSize: number;
41
+ /** Quantization method (e.g., 'q4f16_1', 'q4f32_1') */
42
+ quantization?: string;
43
+ /** VRAM required in bytes */
44
+ vramRequired?: number;
45
+ }
46
+ /**
47
+ * LLM adapter capabilities
48
+ */
49
+ export interface LLMCapabilities {
50
+ /** Available models */
51
+ models: LLMModel[];
52
+ /** Whether streaming is supported */
53
+ streaming: boolean;
54
+ /** Maximum context length (of best model) */
55
+ maxContextLength: number;
56
+ /** Whether download is required */
57
+ requiresDownload: boolean;
58
+ /** Whether WebGPU acceleration is available */
59
+ webgpu: boolean;
60
+ }
61
+ /**
62
+ * Options for LLM chat completion
63
+ */
64
+ export interface LLMChatOptions {
65
+ /** Model ID to use */
66
+ model?: string;
67
+ /** Maximum tokens to generate */
68
+ maxTokens?: number;
69
+ /** Sampling temperature (0-2, higher = more creative) */
70
+ temperature?: number;
71
+ /** Top-p (nucleus) sampling */
72
+ topP?: number;
73
+ /** Stop sequences */
74
+ stop?: string[];
75
+ /** Streaming callback for partial results */
76
+ onToken?: (token: string) => void;
77
+ }
78
+ /**
79
+ * LLM adapter interface - all LLM implementations must implement this
80
+ */
81
+ export interface LLMAdapter {
82
+ /** Adapter type identifier */
83
+ readonly type: 'webllm' | 'transformers-llm';
84
+ /** Current initialization state */
85
+ readonly initState: InitState;
86
+ /** Currently loaded model ID */
87
+ readonly currentModel: string | null;
88
+ /**
89
+ * Initialize the adapter with a specific model
90
+ * Downloads model files if not cached
91
+ */
92
+ ensureInitialized(modelId?: string, onProgress?: OnProgress): Promise<void>;
93
+ /**
94
+ * Get adapter capabilities and available models
95
+ */
96
+ getCapabilities(): Promise<LLMCapabilities>;
97
+ /**
98
+ * Generate chat completion
99
+ */
100
+ chat(messages: LLMMessage[], options?: LLMChatOptions): Promise<LLMResponse>;
101
+ /**
102
+ * Generate streaming chat completion
103
+ */
104
+ stream(messages: LLMMessage[], options?: LLMChatOptions): AsyncIterable<string>;
105
+ /**
106
+ * Simple message interface - single turn conversation
107
+ */
108
+ message(text: string, options?: LLMChatOptions & {
109
+ systemPrompt?: string;
110
+ }): Promise<string>;
111
+ /**
112
+ * Count tokens in text (approximate)
113
+ */
114
+ countTokens?(text: string): Promise<number>;
115
+ /**
116
+ * Unload current model to free VRAM/memory
117
+ */
118
+ unloadModel(): Promise<void>;
119
+ /**
120
+ * Dispose of all resources
121
+ */
122
+ dispose(): Promise<void>;
123
+ }
124
+ /**
125
+ * WebLLM adapter options
126
+ */
127
+ export interface WebLLMOptions extends BaseBrowserAIOptions {
128
+ type?: 'webllm';
129
+ /** Default model to load */
130
+ defaultModel?: string;
131
+ /** App configuration for WebLLM */
132
+ appConfig?: any;
133
+ }
134
+ /**
135
+ * Transformers.js LLM adapter options
136
+ */
137
+ export interface TransformersLLMOptions extends BaseBrowserAIOptions {
138
+ type: 'transformers-llm';
139
+ /** Default model to load */
140
+ defaultModel?: string;
141
+ }
142
+ /**
143
+ * Union type for LLM factory options
144
+ */
145
+ export type GetLLMOptions = WebLLMOptions | TransformersLLMOptions;
146
+ /**
147
+ * Common small models suitable for browser use
148
+ */
149
+ export declare const RECOMMENDED_MODELS: {
150
+ readonly 'smollm2-360m': {
151
+ readonly id: "SmolLM2-360M-Instruct-q4f16_1-MLC";
152
+ readonly name: "SmolLM2 360M";
153
+ readonly contextLength: 2048;
154
+ readonly downloadSize: number;
155
+ };
156
+ readonly 'smollm2-1.7b': {
157
+ readonly id: "SmolLM2-1.7B-Instruct-q4f16_1-MLC";
158
+ readonly name: "SmolLM2 1.7B";
159
+ readonly contextLength: 2048;
160
+ readonly downloadSize: number;
161
+ };
162
+ readonly 'qwen2.5-1.5b': {
163
+ readonly id: "Qwen2.5-1.5B-Instruct-q4f16_1-MLC";
164
+ readonly name: "Qwen2.5 1.5B";
165
+ readonly contextLength: 32768;
166
+ readonly downloadSize: number;
167
+ };
168
+ readonly 'phi-3-mini': {
169
+ readonly id: "Phi-3-mini-4k-instruct-q4f16_1-MLC";
170
+ readonly name: "Phi-3 Mini 4K";
171
+ readonly contextLength: 4096;
172
+ readonly downloadSize: number;
173
+ };
174
+ readonly 'llama-3.2-1b': {
175
+ readonly id: "Llama-3.2-1B-Instruct-q4f16_1-MLC";
176
+ readonly name: "Llama 3.2 1B";
177
+ readonly contextLength: 8192;
178
+ readonly downloadSize: number;
179
+ };
180
+ };
181
+ export type RecommendedModelKey = keyof typeof RECOMMENDED_MODELS;
182
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/llm/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * LLM adapter types
3
+ */
4
+ /**
5
+ * Common small models suitable for browser use
6
+ */
7
+ export const RECOMMENDED_MODELS = {
8
+ // Smallest, fastest
9
+ 'smollm2-360m': {
10
+ id: 'SmolLM2-360M-Instruct-q4f16_1-MLC',
11
+ name: 'SmolLM2 360M',
12
+ contextLength: 2048,
13
+ downloadSize: 250 * 1024 * 1024, // ~250MB
14
+ },
15
+ // Good balance
16
+ 'smollm2-1.7b': {
17
+ id: 'SmolLM2-1.7B-Instruct-q4f16_1-MLC',
18
+ name: 'SmolLM2 1.7B',
19
+ contextLength: 2048,
20
+ downloadSize: 1.1 * 1024 * 1024 * 1024, // ~1.1GB
21
+ },
22
+ // Larger, more capable
23
+ 'qwen2.5-1.5b': {
24
+ id: 'Qwen2.5-1.5B-Instruct-q4f16_1-MLC',
25
+ name: 'Qwen2.5 1.5B',
26
+ contextLength: 32768,
27
+ downloadSize: 1 * 1024 * 1024 * 1024, // ~1GB
28
+ },
29
+ // Phi-3 mini
30
+ 'phi-3-mini': {
31
+ id: 'Phi-3-mini-4k-instruct-q4f16_1-MLC',
32
+ name: 'Phi-3 Mini 4K',
33
+ contextLength: 4096,
34
+ downloadSize: 2.3 * 1024 * 1024 * 1024, // ~2.3GB
35
+ },
36
+ // Llama 3.2
37
+ 'llama-3.2-1b': {
38
+ id: 'Llama-3.2-1B-Instruct-q4f16_1-MLC',
39
+ name: 'Llama 3.2 1B',
40
+ contextLength: 8192,
41
+ downloadSize: 800 * 1024 * 1024, // ~800MB
42
+ },
43
+ };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * WebLLM adapter
3
+ *
4
+ * Uses @mlc-ai/web-llm for running LLMs in the browser with WebGPU.
5
+ * Requires downloading model files (100MB - 4GB+ depending on model).
6
+ */
7
+ import type { InitState, OnProgress } from '../../core/types.js';
8
+ import type { LLMAdapter, LLMCapabilities, LLMChatOptions, LLMMessage, LLMResponse, WebLLMOptions } from './types.js';
9
+ /**
10
+ * WebLLM adapter for in-browser LLM inference
11
+ */
12
+ export declare class WebLLMAdapter implements LLMAdapter {
13
+ readonly type: "webllm";
14
+ private _initState;
15
+ private _currentModel;
16
+ private options;
17
+ private engine;
18
+ constructor(options?: WebLLMOptions);
19
+ get initState(): InitState;
20
+ get currentModel(): string | null;
21
+ ensureInitialized(modelId?: string, onProgress?: OnProgress): Promise<void>;
22
+ private importWebLLM;
23
+ getCapabilities(): Promise<LLMCapabilities>;
24
+ chat(messages: LLMMessage[], options?: LLMChatOptions): Promise<LLMResponse>;
25
+ stream(messages: LLMMessage[], options?: LLMChatOptions): AsyncIterable<string>;
26
+ message(text: string, options?: LLMChatOptions & {
27
+ systemPrompt?: string;
28
+ }): Promise<string>;
29
+ countTokens(text: string): Promise<number>;
30
+ unloadModel(): Promise<void>;
31
+ dispose(): Promise<void>;
32
+ }
33
+ //# sourceMappingURL=webllm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webllm.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/llm/webllm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAEV,SAAS,EACT,UAAU,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,cAAc,EACd,UAAU,EAEV,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,OAAO,CAAgB;IAG/B,OAAO,CAAC,MAAM,CAAa;gBAEf,OAAO,GAAE,aAAkB;IAOvC,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAEK,iBAAiB,CACrB,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,IAAI,CAAC;YAoFF,YAAY;IAWpB,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;IAsB3C,IAAI,CACR,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC;IAoChB,MAAM,CACX,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAAC,MAAM,CAAC;IA+BlB,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAc,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO,GACvD,OAAO,CAAC,MAAM,CAAC;IAmBZ,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * WebLLM adapter
3
+ *
4
+ * Uses @mlc-ai/web-llm for running LLMs in the browser with WebGPU.
5
+ * Requires downloading model files (100MB - 4GB+ depending on model).
6
+ */
7
+ import { importOptional } from '@happyvertical/smrt-ui/utils/import-optional.js';
8
+ import { CapabilityNotAvailableError, InitializationError, ModelLoadError, } from '../../core/errors.js';
9
+ import { RECOMMENDED_MODELS } from './types.js';
10
+ // Default model - small and fast
11
+ const DEFAULT_MODEL = 'SmolLM2-360M-Instruct-q4f16_1-MLC';
12
+ /**
13
+ * WebLLM adapter for in-browser LLM inference
14
+ */
15
+ export class WebLLMAdapter {
16
+ type = 'webllm';
17
+ _initState = 'uninitialized';
18
+ _currentModel = null;
19
+ options;
20
+ // WebLLM engine instance
21
+ engine = null;
22
+ constructor(options = {}) {
23
+ this.options = {
24
+ defaultModel: DEFAULT_MODEL,
25
+ ...options,
26
+ };
27
+ }
28
+ get initState() {
29
+ return this._initState;
30
+ }
31
+ get currentModel() {
32
+ return this._currentModel;
33
+ }
34
+ async ensureInitialized(modelId, onProgress) {
35
+ const targetModel = modelId || this.options.defaultModel || DEFAULT_MODEL;
36
+ // Already loaded with the right model
37
+ if (this._initState === 'ready' && this._currentModel === targetModel) {
38
+ return;
39
+ }
40
+ // If we have a different model loaded, unload it first
41
+ if (this._currentModel && this._currentModel !== targetModel) {
42
+ await this.unloadModel();
43
+ }
44
+ if (this._initState === 'initializing') {
45
+ return new Promise((resolve, reject) => {
46
+ const check = () => {
47
+ if (this._initState === 'ready')
48
+ resolve();
49
+ else if (this._initState === 'error')
50
+ reject(new Error('Initialization failed'));
51
+ else
52
+ setTimeout(check, 100);
53
+ };
54
+ check();
55
+ });
56
+ }
57
+ this._initState = 'initializing';
58
+ try {
59
+ // Check WebGPU support
60
+ if (!('gpu' in navigator)) {
61
+ throw new CapabilityNotAvailableError('WebGPU', 'webllm');
62
+ }
63
+ // Dynamically import WebLLM
64
+ const webllm = await this.importWebLLM();
65
+ // Create progress callback wrapper
66
+ const progressCallback = (report) => {
67
+ if (!onProgress)
68
+ return;
69
+ const progress = {
70
+ state: 'downloading',
71
+ bytesLoaded: 0,
72
+ bytesTotal: 0,
73
+ percent: Math.round(report.progress * 100),
74
+ currentFile: report.text,
75
+ };
76
+ if (report.progress >= 1) {
77
+ progress.state = 'complete';
78
+ }
79
+ onProgress(progress);
80
+ };
81
+ // Create MLCEngine
82
+ this.engine = await webllm.CreateMLCEngine(targetModel, {
83
+ initProgressCallback: progressCallback,
84
+ appConfig: this.options.appConfig,
85
+ });
86
+ this._currentModel = targetModel;
87
+ this._initState = 'ready';
88
+ onProgress?.({
89
+ state: 'complete',
90
+ bytesLoaded: 100,
91
+ bytesTotal: 100,
92
+ percent: 100,
93
+ });
94
+ }
95
+ catch (error) {
96
+ this._initState = 'error';
97
+ if (error instanceof Error) {
98
+ if (error.message.includes('WebGPU')) {
99
+ throw new CapabilityNotAvailableError('WebGPU', 'webllm');
100
+ }
101
+ throw new ModelLoadError(targetModel, error.message, 'webllm');
102
+ }
103
+ throw new InitializationError('webllm', String(error));
104
+ }
105
+ }
106
+ async importWebLLM() {
107
+ try {
108
+ return await importOptional('@mlc-ai/web-llm');
109
+ }
110
+ catch {
111
+ throw new InitializationError('webllm', '@mlc-ai/web-llm not installed. Run: npm install @mlc-ai/web-llm');
112
+ }
113
+ }
114
+ async getCapabilities() {
115
+ const webgpu = typeof navigator !== 'undefined' && 'gpu' in navigator;
116
+ // Convert recommended models to LLMModel format
117
+ const models = Object.entries(RECOMMENDED_MODELS).map(([_key, model]) => ({
118
+ id: model.id,
119
+ name: model.name,
120
+ contextLength: model.contextLength,
121
+ downloadSize: model.downloadSize,
122
+ }));
123
+ return {
124
+ models,
125
+ streaming: true,
126
+ maxContextLength: 32768, // Qwen2.5 has highest
127
+ requiresDownload: true,
128
+ webgpu,
129
+ };
130
+ }
131
+ async chat(messages, options = {}) {
132
+ await this.ensureInitialized(options.model);
133
+ if (!this.engine) {
134
+ throw new Error('Engine not initialized');
135
+ }
136
+ const response = await this.engine.chat.completions.create({
137
+ messages: messages.map((m) => ({
138
+ role: m.role,
139
+ content: m.content,
140
+ })),
141
+ model: this._currentModel,
142
+ max_tokens: options.maxTokens,
143
+ temperature: options.temperature,
144
+ top_p: options.topP,
145
+ stop: options.stop,
146
+ stream: false,
147
+ });
148
+ const choice = response.choices[0];
149
+ return {
150
+ content: choice.message?.content || '',
151
+ usage: response.usage
152
+ ? {
153
+ promptTokens: response.usage.prompt_tokens,
154
+ completionTokens: response.usage.completion_tokens,
155
+ totalTokens: response.usage.total_tokens,
156
+ }
157
+ : undefined,
158
+ finishReason: choice.finish_reason,
159
+ model: this._currentModel || undefined,
160
+ };
161
+ }
162
+ async *stream(messages, options = {}) {
163
+ await this.ensureInitialized(options.model);
164
+ if (!this.engine) {
165
+ throw new Error('Engine not initialized');
166
+ }
167
+ const stream = await this.engine.chat.completions.create({
168
+ messages: messages.map((m) => ({
169
+ role: m.role,
170
+ content: m.content,
171
+ })),
172
+ model: this._currentModel,
173
+ max_tokens: options.maxTokens,
174
+ temperature: options.temperature,
175
+ top_p: options.topP,
176
+ stop: options.stop,
177
+ stream: true,
178
+ });
179
+ for await (const chunk of stream) {
180
+ const content = chunk.choices[0]?.delta?.content;
181
+ if (content) {
182
+ if (options.onToken) {
183
+ options.onToken(content);
184
+ }
185
+ yield content;
186
+ }
187
+ }
188
+ }
189
+ async message(text, options = {}) {
190
+ const messages = [];
191
+ if (options.systemPrompt) {
192
+ messages.push({
193
+ role: 'system',
194
+ content: options.systemPrompt,
195
+ });
196
+ }
197
+ messages.push({
198
+ role: 'user',
199
+ content: text,
200
+ });
201
+ const response = await this.chat(messages, options);
202
+ return response.content;
203
+ }
204
+ async countTokens(text) {
205
+ // WebLLM doesn't expose tokenizer directly
206
+ // Use rough estimation: ~4 chars per token for English
207
+ return Math.ceil(text.length / 4);
208
+ }
209
+ async unloadModel() {
210
+ if (this.engine) {
211
+ try {
212
+ await this.engine.unload();
213
+ }
214
+ catch {
215
+ // Ignore unload errors
216
+ }
217
+ this.engine = null;
218
+ }
219
+ this._currentModel = null;
220
+ this._initState = 'uninitialized';
221
+ }
222
+ async dispose() {
223
+ await this.unloadModel();
224
+ }
225
+ }
@@ -0,0 +1,31 @@
1
+ import type { InitState, OnProgress } from '../../core/types.js';
2
+ import type { BrowserSpeechSTTOptions, STTAdapter, STTCapabilities, STTOptions, STTResult } from './types.js';
3
+ /**
4
+ * Browser Speech Recognition adapter
5
+ */
6
+ export declare class BrowserSpeechSTTAdapter implements STTAdapter {
7
+ readonly type: "browser-speech";
8
+ private _initState;
9
+ private recognition;
10
+ private options;
11
+ private _isListening;
12
+ private resultListeners;
13
+ private errorListeners;
14
+ private startListeners;
15
+ private endListeners;
16
+ constructor(options?: BrowserSpeechSTTOptions);
17
+ get initState(): InitState;
18
+ ensureInitialized(_onProgress?: OnProgress): Promise<void>;
19
+ private setupRecognitionHandlers;
20
+ getCapabilities(): STTCapabilities;
21
+ start(options?: STTOptions): Promise<void>;
22
+ stop(): Promise<void>;
23
+ abort(): void;
24
+ isListening(): boolean;
25
+ onResult(callback: (result: STTResult) => void): () => void;
26
+ onError(callback: (error: Error) => void): () => void;
27
+ onStart(callback: () => void): () => void;
28
+ onEnd(callback: () => void): () => void;
29
+ dispose(): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=browser-speech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-speech.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/stt/browser-speech.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,uBAAuB,EACvB,UAAU,EACV,eAAe,EACf,UAAU,EACV,SAAS,EACV,MAAM,YAAY,CAAC;AAepB;;GAEG;AACH,qBAAa,uBAAwB,YAAW,UAAU;IACxD,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;IAE1C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAAS;IAG7B,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAAyB;gBAEjC,OAAO,GAAE,uBAA4B;IAQjD,IAAI,SAAS,IAAI,SAAS,CAEzB;IAEK,iBAAiB,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqChE,OAAO,CAAC,wBAAwB;IAwEhC,eAAe,IAAI,eAAe;IA2B5B,KAAK,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,KAAK,IAAI,IAAI;IAMb,WAAW,IAAI,OAAO;IAItB,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAK3D,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAKrD,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKzC,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAS/B"}