@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.
- package/AGENTS.md +317 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +185 -0
- package/dist/Provider.svelte +204 -0
- package/dist/Provider.svelte.d.ts +73 -0
- package/dist/Provider.svelte.d.ts.map +1 -0
- package/dist/__tests__/app-state.test.js +156 -0
- package/dist/__tests__/warm-clients.test.js +186 -0
- package/dist/browser-ai/adapters/llm/factory.d.ts +38 -0
- package/dist/browser-ai/adapters/llm/factory.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/factory.js +91 -0
- package/dist/browser-ai/adapters/llm/index.d.ts +7 -0
- package/dist/browser-ai/adapters/llm/index.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/index.js +6 -0
- package/dist/browser-ai/adapters/llm/types.d.ts +182 -0
- package/dist/browser-ai/adapters/llm/types.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/types.js +43 -0
- package/dist/browser-ai/adapters/llm/webllm.d.ts +33 -0
- package/dist/browser-ai/adapters/llm/webllm.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/webllm.js +225 -0
- package/dist/browser-ai/adapters/stt/browser-speech.d.ts +31 -0
- package/dist/browser-ai/adapters/stt/browser-speech.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/browser-speech.js +217 -0
- package/dist/browser-ai/adapters/stt/factory.d.ts +49 -0
- package/dist/browser-ai/adapters/stt/factory.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/factory.js +110 -0
- package/dist/browser-ai/adapters/stt/index.d.ts +9 -0
- package/dist/browser-ai/adapters/stt/index.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/index.js +8 -0
- package/dist/browser-ai/adapters/stt/types.d.ts +154 -0
- package/dist/browser-ai/adapters/stt/types.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/types.js +4 -0
- package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts +46 -0
- package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/whisper-cpp.js +348 -0
- package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts +51 -0
- package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/whisper-wasm.js +380 -0
- package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts +42 -0
- package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/browser-synthesis.js +235 -0
- package/dist/browser-ai/adapters/tts/factory.d.ts +53 -0
- package/dist/browser-ai/adapters/tts/factory.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/factory.js +92 -0
- package/dist/browser-ai/adapters/tts/index.d.ts +7 -0
- package/dist/browser-ai/adapters/tts/index.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/index.js +6 -0
- package/dist/browser-ai/adapters/tts/types.d.ts +140 -0
- package/dist/browser-ai/adapters/tts/types.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/types.js +4 -0
- package/dist/browser-ai/capabilities/detector.d.ts +38 -0
- package/dist/browser-ai/capabilities/detector.d.ts.map +1 -0
- package/dist/browser-ai/capabilities/detector.js +211 -0
- package/dist/browser-ai/core/errors.d.ts +62 -0
- package/dist/browser-ai/core/errors.d.ts.map +1 -0
- package/dist/browser-ai/core/errors.js +92 -0
- package/dist/browser-ai/core/index.d.ts +6 -0
- package/dist/browser-ai/core/index.d.ts.map +1 -0
- package/dist/browser-ai/core/index.js +5 -0
- package/dist/browser-ai/core/types.d.ts +115 -0
- package/dist/browser-ai/core/types.d.ts.map +1 -0
- package/dist/browser-ai/core/types.js +34 -0
- package/dist/browser-ai/index.d.ts +12 -0
- package/dist/browser-ai/index.d.ts.map +1 -0
- package/dist/browser-ai/index.js +16 -0
- package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte +77 -0
- package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts +16 -0
- package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/CapabilityGate.svelte +57 -0
- package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts +15 -0
- package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/DownloadProgress.svelte +141 -0
- package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts +15 -0
- package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/STTTest.svelte +379 -0
- package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts +9 -0
- package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/VoiceInput.svelte +200 -0
- package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts +16 -0
- package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/index.d.ts +15 -0
- package/dist/browser-ai/svelte/index.d.ts.map +1 -0
- package/dist/browser-ai/svelte/index.js +28 -0
- package/dist/browser-ai/ui.d.ts +16 -0
- package/dist/browser-ai/ui.d.ts.map +1 -0
- package/dist/browser-ai/ui.js +67 -0
- package/dist/components/admin/AgentAdminPanel.svelte +111 -0
- package/dist/components/admin/AgentAdminPanel.svelte.d.ts +25 -0
- package/dist/components/admin/AgentAdminPanel.svelte.d.ts.map +1 -0
- package/dist/components/admin/AgentAdminTabs.svelte +280 -0
- package/dist/components/admin/AgentAdminTabs.svelte.d.ts +23 -0
- package/dist/components/admin/AgentAdminTabs.svelte.d.ts.map +1 -0
- package/dist/components/admin/AgentSettingsShell.svelte +257 -0
- package/dist/components/admin/AgentSettingsShell.svelte.d.ts +33 -0
- package/dist/components/admin/AgentSettingsShell.svelte.d.ts.map +1 -0
- package/dist/components/admin/index.d.ts +5 -0
- package/dist/components/admin/index.d.ts.map +1 -0
- package/dist/components/admin/index.js +6 -0
- package/dist/components/forms/AddressInput.svelte +500 -0
- package/dist/components/forms/AddressInput.svelte.d.ts +36 -0
- package/dist/components/forms/AddressInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/CheckboxInput.svelte +208 -0
- package/dist/components/forms/CheckboxInput.svelte.d.ts +20 -0
- package/dist/components/forms/CheckboxInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/DateRangeInput.svelte +628 -0
- package/dist/components/forms/DateRangeInput.svelte.d.ts +33 -0
- package/dist/components/forms/DateRangeInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/DateTimeInput.svelte +521 -0
- package/dist/components/forms/DateTimeInput.svelte.d.ts +24 -0
- package/dist/components/forms/DateTimeInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/FileUpload.svelte +358 -0
- package/dist/components/forms/FileUpload.svelte.d.ts +22 -0
- package/dist/components/forms/FileUpload.svelte.d.ts.map +1 -0
- package/dist/components/forms/Form.svelte +771 -0
- package/dist/components/forms/Form.svelte.d.ts +26 -0
- package/dist/components/forms/Form.svelte.d.ts.map +1 -0
- package/dist/components/forms/FormGroup.svelte +86 -0
- package/dist/components/forms/FormGroup.svelte.d.ts +13 -0
- package/dist/components/forms/FormGroup.svelte.d.ts.map +1 -0
- package/dist/components/forms/FormMicButton.svelte +179 -0
- package/dist/components/forms/FormMicButton.svelte.d.ts +10 -0
- package/dist/components/forms/FormMicButton.svelte.d.ts.map +1 -0
- package/dist/components/forms/Input.svelte +83 -0
- package/dist/components/forms/Input.svelte.d.ts +9 -0
- package/dist/components/forms/Input.svelte.d.ts.map +1 -0
- package/dist/components/forms/MeasurementInput.svelte +505 -0
- package/dist/components/forms/MeasurementInput.svelte.d.ts +35 -0
- package/dist/components/forms/MeasurementInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/MoneyInput.svelte +412 -0
- package/dist/components/forms/MoneyInput.svelte.d.ts +30 -0
- package/dist/components/forms/MoneyInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/NumberInput.svelte +310 -0
- package/dist/components/forms/NumberInput.svelte.d.ts +28 -0
- package/dist/components/forms/NumberInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/PhoneInput.svelte +530 -0
- package/dist/components/forms/PhoneInput.svelte.d.ts +22 -0
- package/dist/components/forms/PhoneInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/SearchInput.svelte +358 -0
- package/dist/components/forms/SearchInput.svelte.d.ts +33 -0
- package/dist/components/forms/SearchInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/Select.svelte +83 -0
- package/dist/components/forms/Select.svelte.d.ts +11 -0
- package/dist/components/forms/Select.svelte.d.ts.map +1 -0
- package/dist/components/forms/SelectInput.svelte +254 -0
- package/dist/components/forms/SelectInput.svelte.d.ts +25 -0
- package/dist/components/forms/SelectInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/TextInput.svelte +415 -0
- package/dist/components/forms/TextInput.svelte.d.ts +26 -0
- package/dist/components/forms/TextInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/Textarea.svelte +85 -0
- package/dist/components/forms/Textarea.svelte.d.ts +10 -0
- package/dist/components/forms/Textarea.svelte.d.ts.map +1 -0
- package/dist/components/forms/TextareaInput.svelte +386 -0
- package/dist/components/forms/TextareaInput.svelte.d.ts +26 -0
- package/dist/components/forms/TextareaInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/Toggle.svelte +217 -0
- package/dist/components/forms/Toggle.svelte.d.ts +37 -0
- package/dist/components/forms/Toggle.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/AddressInput.behavior.test.js +122 -0
- package/dist/components/forms/__tests__/CheckboxInput.test.js +92 -0
- package/dist/components/forms/__tests__/DateRangeInput.behavior.test.js +135 -0
- package/dist/components/forms/__tests__/DateTimeInput.behavior.test.js +103 -0
- package/dist/components/forms/__tests__/FileUpload.test.js +90 -0
- package/dist/components/forms/__tests__/Form.behavior.test.js +137 -0
- package/dist/components/forms/__tests__/Form.test.js +58 -0
- package/dist/components/forms/__tests__/FormGroup.test.js +48 -0
- package/dist/components/forms/__tests__/FormMicButton.test.js +86 -0
- package/dist/components/forms/__tests__/Input.test.js +49 -0
- package/dist/components/forms/__tests__/MeasurementInput.behavior.test.js +129 -0
- package/dist/components/forms/__tests__/MoneyInput.behavior.test.js +124 -0
- package/dist/components/forms/__tests__/NumberInput.behavior.test.js +141 -0
- package/dist/components/forms/__tests__/PhoneInput.behavior.test.js +96 -0
- package/dist/components/forms/__tests__/SearchInput.test.js +79 -0
- package/dist/components/forms/__tests__/Select.test.js +37 -0
- package/dist/components/forms/__tests__/SelectInput.behavior.test.js +132 -0
- package/dist/components/forms/__tests__/TextInput.behavior.test.js +131 -0
- package/dist/components/forms/__tests__/Textarea.test.js +39 -0
- package/dist/components/forms/__tests__/TextareaInput.behavior.test.js +96 -0
- package/dist/components/forms/__tests__/Toggle.test.js +87 -0
- package/dist/components/forms/__tests__/composite-inputs-a11y.test.js +69 -0
- package/dist/components/forms/__tests__/form-group-input.fixture.svelte +16 -0
- package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts +9 -0
- package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte +33 -0
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts +12 -0
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/rich-inputs-a11y.test.js +87 -0
- package/dist/components/forms/index.d.ts +25 -0
- package/dist/components/forms/index.d.ts.map +1 -0
- package/dist/components/forms/index.js +25 -0
- package/dist/components/forms/types.d.ts +33 -0
- package/dist/components/forms/types.d.ts.map +1 -0
- package/dist/components/forms/types.js +4 -0
- package/dist/components/module/ModulePanel.svelte +134 -0
- package/dist/components/module/ModulePanel.svelte.d.ts +22 -0
- package/dist/components/module/ModulePanel.svelte.d.ts.map +1 -0
- package/dist/components/module/index.d.ts +5 -0
- package/dist/components/module/index.d.ts.map +1 -0
- package/dist/components/module/index.js +4 -0
- package/dist/components/workspace/Breadcrumbs.svelte +141 -0
- package/dist/components/workspace/Breadcrumbs.svelte.d.ts +21 -0
- package/dist/components/workspace/Breadcrumbs.svelte.d.ts.map +1 -0
- package/dist/components/workspace/NavTree.svelte +354 -0
- package/dist/components/workspace/NavTree.svelte.d.ts +45 -0
- package/dist/components/workspace/NavTree.svelte.d.ts.map +1 -0
- package/dist/components/workspace/README.md +34 -0
- package/dist/components/workspace/RoleShell.svelte +309 -0
- package/dist/components/workspace/RoleShell.svelte.d.ts +91 -0
- package/dist/components/workspace/RoleShell.svelte.d.ts.map +1 -0
- package/dist/components/workspace/WorkspaceShell.svelte +951 -0
- package/dist/components/workspace/WorkspaceShell.svelte.d.ts +112 -0
- package/dist/components/workspace/WorkspaceShell.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/RoleShell.test.js +772 -0
- package/dist/components/workspace/__tests__/WorkspaceShell.test.js +630 -0
- package/dist/components/workspace/__tests__/breadcrumbs-helpers.test.js +141 -0
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte +45 -0
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts +21 -0
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/define-tools-dock.test.js +1010 -0
- package/dist/components/workspace/__tests__/harness.svelte +25 -0
- package/dist/components/workspace/__tests__/harness.svelte.d.ts +14 -0
- package/dist/components/workspace/__tests__/harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/index.test.js +37 -0
- package/dist/components/workspace/__tests__/manifest-nav-helpers.test.js +24 -0
- package/dist/components/workspace/__tests__/manifest-nav.test.js +599 -0
- package/dist/components/workspace/__tests__/nav-helpers.test.js +95 -0
- package/dist/components/workspace/__tests__/render-harness.svelte +66 -0
- package/dist/components/workspace/__tests__/render-harness.svelte.d.ts +32 -0
- package/dist/components/workspace/__tests__/render-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/render-tools-dock.test.js +243 -0
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte +58 -0
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts +16 -0
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte +41 -0
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts +13 -0
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/test-icon.svelte +17 -0
- package/dist/components/workspace/__tests__/test-icon.svelte.d.ts +19 -0
- package/dist/components/workspace/__tests__/test-icon.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte +38 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts +22 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts +65 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.js +115 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts +15 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.js +7 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture.test.js +115 -0
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte +9 -0
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts +19 -0
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/use-harness.svelte +23 -0
- package/dist/components/workspace/__tests__/use-harness.svelte.d.ts +8 -0
- package/dist/components/workspace/__tests__/use-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/use-tools-dock.test.js +33 -0
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte +43 -0
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts +11 -0
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/breadcrumbs-helpers.d.ts +44 -0
- package/dist/components/workspace/breadcrumbs-helpers.d.ts.map +1 -0
- package/dist/components/workspace/breadcrumbs-helpers.js +88 -0
- package/dist/components/workspace/index.d.ts +16 -0
- package/dist/components/workspace/index.d.ts.map +1 -0
- package/dist/components/workspace/index.js +14 -0
- package/dist/components/workspace/manifest-nav.d.ts +200 -0
- package/dist/components/workspace/manifest-nav.d.ts.map +1 -0
- package/dist/components/workspace/manifest-nav.js +408 -0
- package/dist/components/workspace/nav-helpers.d.ts +36 -0
- package/dist/components/workspace/nav-helpers.d.ts.map +1 -0
- package/dist/components/workspace/nav-helpers.js +60 -0
- package/dist/components/workspace/server/__tests__/compose-availability.test.js +383 -0
- package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts +78 -0
- package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts.map +1 -0
- package/dist/components/workspace/server/__tests__/typed-context-fixture.js +104 -0
- package/dist/components/workspace/server/compose-availability.d.ts +73 -0
- package/dist/components/workspace/server/compose-availability.d.ts.map +1 -0
- package/dist/components/workspace/server/compose-availability.js +114 -0
- package/dist/components/workspace/server/index.d.ts +13 -0
- package/dist/components/workspace/server/index.d.ts.map +1 -0
- package/dist/components/workspace/server/index.js +11 -0
- package/dist/components/workspace/server/types.d.ts +108 -0
- package/dist/components/workspace/server/types.d.ts.map +1 -0
- package/dist/components/workspace/server/types.js +11 -0
- package/dist/components/workspace/tools-dock/ToolsDock.svelte +565 -0
- package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts +14 -0
- package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts.map +1 -0
- package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts +143 -0
- package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts.map +1 -0
- package/dist/components/workspace/tools-dock/define-tools-dock.svelte.js +487 -0
- package/dist/components/workspace/tools-dock/use-tools-dock.d.ts +41 -0
- package/dist/components/workspace/tools-dock/use-tools-dock.d.ts.map +1 -0
- package/dist/components/workspace/tools-dock/use-tools-dock.js +50 -0
- package/dist/components/workspace/types.d.ts +372 -0
- package/dist/components/workspace/types.d.ts.map +1 -0
- package/dist/components/workspace/types.js +6 -0
- package/dist/hooks/index.d.ts +11 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/useAppState.svelte.d.ts +46 -0
- package/dist/hooks/useAppState.svelte.d.ts.map +1 -0
- package/dist/hooks/useAppState.svelte.js +59 -0
- package/dist/hooks/useAuth.svelte.d.ts +41 -0
- package/dist/hooks/useAuth.svelte.d.ts.map +1 -0
- package/dist/hooks/useAuth.svelte.js +43 -0
- package/dist/hooks/useLLM.svelte.d.ts +69 -0
- package/dist/hooks/useLLM.svelte.d.ts.map +1 -0
- package/dist/hooks/useLLM.svelte.js +85 -0
- package/dist/hooks/useSTT.svelte.d.ts +68 -0
- package/dist/hooks/useSTT.svelte.d.ts.map +1 -0
- package/dist/hooks/useSTT.svelte.js +97 -0
- package/dist/hooks/useSocket.svelte.d.ts +45 -0
- package/dist/hooks/useSocket.svelte.d.ts.map +1 -0
- package/dist/hooks/useSocket.svelte.js +54 -0
- package/dist/hooks/useTTS.svelte.d.ts +65 -0
- package/dist/hooks/useTTS.svelte.d.ts.map +1 -0
- package/dist/hooks/useTTS.svelte.js +93 -0
- package/dist/hooks/useTheme.d.ts +13 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useTheme.js +16 -0
- package/dist/i18n/__tests__/server.spec.js +50 -0
- package/dist/i18n/server.d.ts +47 -0
- package/dist/i18n/server.d.ts.map +1 -0
- package/dist/i18n/server.js +58 -0
- package/dist/i18n/strings.forms.d.ts +33 -0
- package/dist/i18n/strings.forms.d.ts.map +1 -0
- package/dist/i18n/strings.forms.js +54 -0
- package/dist/i18n/strings.workspace.d.ts +34 -0
- package/dist/i18n/strings.workspace.d.ts.map +1 -0
- package/dist/i18n/strings.workspace.js +40 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/state/__tests__/warm-clients.test.js +40 -0
- package/dist/state/app-state.d.ts +308 -0
- package/dist/state/app-state.d.ts.map +1 -0
- package/dist/state/app-state.js +64 -0
- package/dist/state/app-state.svelte.d.ts +196 -0
- package/dist/state/app-state.svelte.d.ts.map +1 -0
- package/dist/state/app-state.svelte.js +774 -0
- package/dist/state/context.d.ts +23 -0
- package/dist/state/context.d.ts.map +1 -0
- package/dist/state/context.js +32 -0
- package/dist/state/form-context.d.ts +59 -0
- package/dist/state/form-context.d.ts.map +1 -0
- package/dist/state/form-context.js +31 -0
- package/dist/state/form-group-context.d.ts +13 -0
- package/dist/state/form-group-context.d.ts.map +1 -0
- package/dist/state/form-group-context.js +28 -0
- package/dist/state/index.d.ts +9 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +8 -0
- package/dist/state/warm-clients.d.ts +136 -0
- package/dist/state/warm-clients.d.ts.map +1 -0
- package/dist/state/warm-clients.js +231 -0
- 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 @@
|
|
|
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,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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EACT,UAAU,EACX,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3C,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,+CAA+C;IAC/C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,kBAAkB,CAAC;IAE7C,mCAAmC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B,gCAAgC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC;;;OAGG;IACH,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAE5C;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7E;;OAEG;IACH,MAAM,CACJ,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAAC,MAAM,CAAC,CAAC;IAEzB;;OAEG;IACH,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,IAAI,EAAE,kBAAkB,CAAC;IACzB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,sBAAsB,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCrB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,kBAAkB,CAAC"}
|
|
@@ -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"}
|