@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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS adapter factory with type guards
|
|
3
|
+
*
|
|
4
|
+
* Uses discriminated unions and lazy loading following SDK patterns.
|
|
5
|
+
*/
|
|
6
|
+
import type { BrowserSynthesisTTSOptions, TTSAdapter } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Options for getting a TTS adapter
|
|
9
|
+
*/
|
|
10
|
+
export type GetTTSOptions = (BrowserSynthesisTTSOptions & {
|
|
11
|
+
type?: 'browser-synthesis';
|
|
12
|
+
}) | {
|
|
13
|
+
type: 'transformers';
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Create a TTS adapter
|
|
17
|
+
*
|
|
18
|
+
* Uses lazy loading to only import the requested adapter.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* // Browser Speech Synthesis (default)
|
|
23
|
+
* const tts = await getTTS();
|
|
24
|
+
*
|
|
25
|
+
* // Explicit Browser Synthesis
|
|
26
|
+
* const tts = await getTTS({ type: 'browser-synthesis' });
|
|
27
|
+
*
|
|
28
|
+
* // With custom defaults
|
|
29
|
+
* const tts = await getTTS({ defaultRate: 1.2, defaultVoice: 'Google US English' });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function getTTS(options?: GetTTSOptions): Promise<TTSAdapter>;
|
|
33
|
+
/**
|
|
34
|
+
* Auto-detect and create the best available TTS adapter
|
|
35
|
+
*
|
|
36
|
+
* Selection priority:
|
|
37
|
+
* 1. Browser Speech Synthesis (no download, instant)
|
|
38
|
+
* 2. Transformers.js TTS (requires model download)
|
|
39
|
+
*
|
|
40
|
+
* @throws {Error} If no TTS adapter is available
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const tts = await getTTSAuto();
|
|
45
|
+
* console.log(`Using ${tts.type} adapter`);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function getTTSAuto(options?: Partial<Omit<GetTTSOptions, 'type'>>): Promise<TTSAdapter>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a specific TTS backend is available
|
|
51
|
+
*/
|
|
52
|
+
export declare function isTTSAvailable(type: 'browser-synthesis' | 'transformers'): boolean;
|
|
53
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/tts/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,CAAC,0BAA0B,GAAG;IAAE,IAAI,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,GAC7D;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AAoB7B;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgB7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAM,GACjD,OAAO,CAAC,UAAU,CAAC,CAiBrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,mBAAmB,GAAG,cAAc,GACzC,OAAO,CAYT"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS adapter factory with type guards
|
|
3
|
+
*
|
|
4
|
+
* Uses discriminated unions and lazy loading following SDK patterns.
|
|
5
|
+
*/
|
|
6
|
+
import { detectCapabilities, getBestTTSBackend, } from '../../capabilities/detector.js';
|
|
7
|
+
import { UnsupportedAdapterError } from '../../core/errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Type guard for Browser Speech Synthesis options
|
|
10
|
+
*/
|
|
11
|
+
function isBrowserSynthesisOptions(options) {
|
|
12
|
+
return !options.type || options.type === 'browser-synthesis';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Type guard for Transformers.js TTS options
|
|
16
|
+
*/
|
|
17
|
+
function isTransformersOptions(options) {
|
|
18
|
+
return options.type === 'transformers';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a TTS adapter
|
|
22
|
+
*
|
|
23
|
+
* Uses lazy loading to only import the requested adapter.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* // Browser Speech Synthesis (default)
|
|
28
|
+
* const tts = await getTTS();
|
|
29
|
+
*
|
|
30
|
+
* // Explicit Browser Synthesis
|
|
31
|
+
* const tts = await getTTS({ type: 'browser-synthesis' });
|
|
32
|
+
*
|
|
33
|
+
* // With custom defaults
|
|
34
|
+
* const tts = await getTTS({ defaultRate: 1.2, defaultVoice: 'Google US English' });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export async function getTTS(options = {}) {
|
|
38
|
+
if (isBrowserSynthesisOptions(options)) {
|
|
39
|
+
const { BrowserSynthesisTTSAdapter } = await import('./browser-synthesis.js');
|
|
40
|
+
return new BrowserSynthesisTTSAdapter(options);
|
|
41
|
+
}
|
|
42
|
+
if (isTransformersOptions(options)) {
|
|
43
|
+
// Transformers.js TTS not yet implemented
|
|
44
|
+
throw new UnsupportedAdapterError('transformers', ['browser-synthesis']);
|
|
45
|
+
}
|
|
46
|
+
throw new UnsupportedAdapterError(options.type, [
|
|
47
|
+
'browser-synthesis',
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Auto-detect and create the best available TTS adapter
|
|
52
|
+
*
|
|
53
|
+
* Selection priority:
|
|
54
|
+
* 1. Browser Speech Synthesis (no download, instant)
|
|
55
|
+
* 2. Transformers.js TTS (requires model download)
|
|
56
|
+
*
|
|
57
|
+
* @throws {Error} If no TTS adapter is available
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const tts = await getTTSAuto();
|
|
62
|
+
* console.log(`Using ${tts.type} adapter`);
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export async function getTTSAuto(options = {}) {
|
|
66
|
+
const caps = detectCapabilities();
|
|
67
|
+
const backend = getBestTTSBackend(caps);
|
|
68
|
+
if (!backend) {
|
|
69
|
+
throw new Error('No TTS capability available in this browser');
|
|
70
|
+
}
|
|
71
|
+
if (backend === 'browser-synthesis') {
|
|
72
|
+
return getTTS({
|
|
73
|
+
type: 'browser-synthesis',
|
|
74
|
+
...options,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Transformers.js TTS not yet implemented
|
|
78
|
+
throw new Error('Transformers.js TTS not yet implemented');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Check if a specific TTS backend is available
|
|
82
|
+
*/
|
|
83
|
+
export function isTTSAvailable(type) {
|
|
84
|
+
const caps = detectCapabilities();
|
|
85
|
+
if (type === 'browser-synthesis') {
|
|
86
|
+
return caps.tts.browserSynthesisAPI;
|
|
87
|
+
}
|
|
88
|
+
if (type === 'transformers') {
|
|
89
|
+
return caps.tts.transformersTTS;
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/tts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text-to-Speech adapter types
|
|
3
|
+
*/
|
|
4
|
+
import type { InitState, OnProgress } from '../../core/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Voice information
|
|
7
|
+
*/
|
|
8
|
+
export interface TTSVoice {
|
|
9
|
+
/** Voice identifier */
|
|
10
|
+
id: string;
|
|
11
|
+
/** Display name */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Language code (BCP-47) */
|
|
14
|
+
language: string;
|
|
15
|
+
/** Whether this is a local voice */
|
|
16
|
+
local: boolean;
|
|
17
|
+
/** Whether this is the default voice */
|
|
18
|
+
default: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* TTS synthesis options
|
|
22
|
+
*/
|
|
23
|
+
export interface TTSOptions {
|
|
24
|
+
/** Voice to use (by id or name) */
|
|
25
|
+
voice?: string;
|
|
26
|
+
/** Language code (BCP-47) */
|
|
27
|
+
language?: string;
|
|
28
|
+
/** Speech rate (0.1 to 10, default 1) */
|
|
29
|
+
rate?: number;
|
|
30
|
+
/** Pitch (0 to 2, default 1) */
|
|
31
|
+
pitch?: number;
|
|
32
|
+
/** Volume (0 to 1, default 1) */
|
|
33
|
+
volume?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* TTS adapter capabilities
|
|
37
|
+
*/
|
|
38
|
+
export interface TTSCapabilities {
|
|
39
|
+
/** Available voices */
|
|
40
|
+
voices: TTSVoice[];
|
|
41
|
+
/** Supports SSML markup */
|
|
42
|
+
ssml: boolean;
|
|
43
|
+
/** Supports rate adjustment */
|
|
44
|
+
rateRange: {
|
|
45
|
+
min: number;
|
|
46
|
+
max: number;
|
|
47
|
+
};
|
|
48
|
+
/** Supports pitch adjustment */
|
|
49
|
+
pitchRange: {
|
|
50
|
+
min: number;
|
|
51
|
+
max: number;
|
|
52
|
+
};
|
|
53
|
+
/** Requires download */
|
|
54
|
+
requiresDownload: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Browser Speech Synthesis adapter options
|
|
58
|
+
*/
|
|
59
|
+
export interface BrowserSynthesisTTSOptions {
|
|
60
|
+
/** Default language */
|
|
61
|
+
defaultLanguage?: string;
|
|
62
|
+
/** Default voice name */
|
|
63
|
+
defaultVoice?: string;
|
|
64
|
+
/** Default rate */
|
|
65
|
+
defaultRate?: number;
|
|
66
|
+
/** Default pitch */
|
|
67
|
+
defaultPitch?: number;
|
|
68
|
+
/** Default volume */
|
|
69
|
+
defaultVolume?: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* TTS adapter interface
|
|
73
|
+
*/
|
|
74
|
+
export interface TTSAdapter {
|
|
75
|
+
/** Adapter type identifier */
|
|
76
|
+
readonly type: 'browser-synthesis' | 'transformers';
|
|
77
|
+
/** Current initialization state */
|
|
78
|
+
readonly initState: InitState;
|
|
79
|
+
/**
|
|
80
|
+
* Ensure the adapter is initialized
|
|
81
|
+
* @param onProgress Optional progress callback for downloads
|
|
82
|
+
*/
|
|
83
|
+
ensureInitialized(onProgress?: OnProgress): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Get adapter capabilities
|
|
86
|
+
*/
|
|
87
|
+
getCapabilities(): TTSCapabilities;
|
|
88
|
+
/**
|
|
89
|
+
* Get available voices
|
|
90
|
+
*/
|
|
91
|
+
getVoices(): TTSVoice[];
|
|
92
|
+
/**
|
|
93
|
+
* Speak text
|
|
94
|
+
* @param text Text to speak
|
|
95
|
+
* @param options Synthesis options
|
|
96
|
+
* @returns Promise that resolves when speech is complete
|
|
97
|
+
*/
|
|
98
|
+
speak(text: string, options?: TTSOptions): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Stop current speech
|
|
101
|
+
*/
|
|
102
|
+
stop(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Pause current speech
|
|
105
|
+
*/
|
|
106
|
+
pause(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Resume paused speech
|
|
109
|
+
*/
|
|
110
|
+
resume(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Check if currently speaking
|
|
113
|
+
*/
|
|
114
|
+
isSpeaking(): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Check if paused
|
|
117
|
+
*/
|
|
118
|
+
isPaused(): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Register callback for when speech starts
|
|
121
|
+
*/
|
|
122
|
+
onStart(callback: () => void): () => void;
|
|
123
|
+
/**
|
|
124
|
+
* Register callback for when speech ends
|
|
125
|
+
*/
|
|
126
|
+
onEnd(callback: () => void): () => void;
|
|
127
|
+
/**
|
|
128
|
+
* Register callback for errors
|
|
129
|
+
*/
|
|
130
|
+
onError(callback: (error: Error) => void): () => void;
|
|
131
|
+
/**
|
|
132
|
+
* Register callback for word boundary events
|
|
133
|
+
*/
|
|
134
|
+
onBoundary(callback: (charIndex: number, charLength: number) => void): () => void;
|
|
135
|
+
/**
|
|
136
|
+
* Dispose of resources
|
|
137
|
+
*/
|
|
138
|
+
dispose(): Promise<void>;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/tts/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser capability detection for AI features
|
|
3
|
+
*/
|
|
4
|
+
import type { BrowserAICapabilities } from '../core/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Detect all browser AI capabilities
|
|
7
|
+
* This is synchronous and cheap to call - no network requests
|
|
8
|
+
*/
|
|
9
|
+
export declare function detectCapabilities(): BrowserAICapabilities;
|
|
10
|
+
/**
|
|
11
|
+
* Check if any STT capability is available
|
|
12
|
+
*/
|
|
13
|
+
export declare function hasSTT(caps: BrowserAICapabilities): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Check if any TTS capability is available
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasTTS(caps: BrowserAICapabilities): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Check if any LLM capability is available
|
|
20
|
+
*/
|
|
21
|
+
export declare function hasLLM(caps: BrowserAICapabilities): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Check if "smrt" mode can be enabled (at least one AI capability available)
|
|
24
|
+
*/
|
|
25
|
+
export declare function canEnableSmrtMode(caps: BrowserAICapabilities): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get the best available STT backend
|
|
28
|
+
*/
|
|
29
|
+
export declare function getBestSTTBackend(caps: BrowserAICapabilities): 'whisper-wasm' | 'browser-speech' | null;
|
|
30
|
+
/**
|
|
31
|
+
* Get the best available TTS backend
|
|
32
|
+
*/
|
|
33
|
+
export declare function getBestTTSBackend(caps: BrowserAICapabilities): 'browser-synthesis' | 'transformers' | null;
|
|
34
|
+
/**
|
|
35
|
+
* Get the best available LLM backend
|
|
36
|
+
*/
|
|
37
|
+
export declare function getBestLLMBackend(caps: BrowserAICapabilities): 'webllm' | 'transformers-llm' | null;
|
|
38
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/browser-ai/capabilities/detector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,qBAAqB,CAS1D;AAqJD;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,qBAAqB,GAC1B,cAAc,GAAG,gBAAgB,GAAG,IAAI,CAY1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,qBAAqB,GAC1B,mBAAmB,GAAG,cAAc,GAAG,IAAI,CAS7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,qBAAqB,GAC1B,QAAQ,GAAG,kBAAkB,GAAG,IAAI,CAYtC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser capability detection for AI features
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Detect all browser AI capabilities
|
|
6
|
+
* This is synchronous and cheap to call - no network requests
|
|
7
|
+
*/
|
|
8
|
+
export function detectCapabilities() {
|
|
9
|
+
const browser = detectBrowserCapabilities();
|
|
10
|
+
return {
|
|
11
|
+
stt: detectSTTCapabilities(browser),
|
|
12
|
+
tts: detectTTSCapabilities(browser),
|
|
13
|
+
llm: detectLLMCapabilities(browser),
|
|
14
|
+
browser,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Detect general browser capabilities
|
|
19
|
+
*/
|
|
20
|
+
function detectBrowserCapabilities() {
|
|
21
|
+
// Check if we're in a browser environment
|
|
22
|
+
const isBrowser = typeof window !== 'undefined';
|
|
23
|
+
if (!isBrowser) {
|
|
24
|
+
return {
|
|
25
|
+
sharedArrayBuffer: false,
|
|
26
|
+
webWorkers: false,
|
|
27
|
+
indexedDB: false,
|
|
28
|
+
wasmSupport: false,
|
|
29
|
+
wasmSimd: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
sharedArrayBuffer: typeof SharedArrayBuffer !== 'undefined',
|
|
34
|
+
webWorkers: typeof Worker !== 'undefined',
|
|
35
|
+
indexedDB: typeof indexedDB !== 'undefined',
|
|
36
|
+
wasmSupport: typeof WebAssembly !== 'undefined',
|
|
37
|
+
wasmSimd: detectWasmSimd(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Detect WASM SIMD support
|
|
42
|
+
*/
|
|
43
|
+
function detectWasmSimd() {
|
|
44
|
+
if (typeof WebAssembly === 'undefined')
|
|
45
|
+
return false;
|
|
46
|
+
try {
|
|
47
|
+
// SIMD detection via a minimal WASM module that uses SIMD
|
|
48
|
+
// This is the standard way to detect SIMD support
|
|
49
|
+
const simdTest = new Uint8Array([
|
|
50
|
+
0x00,
|
|
51
|
+
0x61,
|
|
52
|
+
0x73,
|
|
53
|
+
0x6d, // WASM magic
|
|
54
|
+
0x01,
|
|
55
|
+
0x00,
|
|
56
|
+
0x00,
|
|
57
|
+
0x00, // Version 1
|
|
58
|
+
0x01,
|
|
59
|
+
0x05,
|
|
60
|
+
0x01,
|
|
61
|
+
0x60,
|
|
62
|
+
0x00,
|
|
63
|
+
0x01,
|
|
64
|
+
0x7b, // Type section: () -> v128
|
|
65
|
+
0x03,
|
|
66
|
+
0x02,
|
|
67
|
+
0x01,
|
|
68
|
+
0x00, // Function section
|
|
69
|
+
0x0a,
|
|
70
|
+
0x0a,
|
|
71
|
+
0x01,
|
|
72
|
+
0x08,
|
|
73
|
+
0x00,
|
|
74
|
+
0xfd,
|
|
75
|
+
0x0c, // Code with v128.const
|
|
76
|
+
0x00,
|
|
77
|
+
0x00,
|
|
78
|
+
0x00,
|
|
79
|
+
0x00,
|
|
80
|
+
0x00,
|
|
81
|
+
0x00,
|
|
82
|
+
0x00,
|
|
83
|
+
0x00,
|
|
84
|
+
0x00,
|
|
85
|
+
0x00,
|
|
86
|
+
0x00,
|
|
87
|
+
0x00,
|
|
88
|
+
0x00,
|
|
89
|
+
0x00,
|
|
90
|
+
0x00,
|
|
91
|
+
0x00,
|
|
92
|
+
0x0b,
|
|
93
|
+
]);
|
|
94
|
+
return WebAssembly.validate(simdTest);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Detect STT capabilities
|
|
102
|
+
*/
|
|
103
|
+
function detectSTTCapabilities(browser) {
|
|
104
|
+
const isBrowser = typeof window !== 'undefined';
|
|
105
|
+
return {
|
|
106
|
+
// Web Speech API
|
|
107
|
+
browserSpeechAPI: isBrowser &&
|
|
108
|
+
('SpeechRecognition' in window || 'webkitSpeechRecognition' in window),
|
|
109
|
+
// Whisper WASM requires WASM support
|
|
110
|
+
// SharedArrayBuffer is nice for threading but not strictly required
|
|
111
|
+
whisperWasm: browser.wasmSupport,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Detect TTS capabilities
|
|
116
|
+
*/
|
|
117
|
+
function detectTTSCapabilities(browser) {
|
|
118
|
+
const isBrowser = typeof window !== 'undefined';
|
|
119
|
+
return {
|
|
120
|
+
// Speech Synthesis API
|
|
121
|
+
browserSynthesisAPI: isBrowser && 'speechSynthesis' in window,
|
|
122
|
+
// Transformers.js TTS requires WASM
|
|
123
|
+
transformersTTS: browser.wasmSupport,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Detect LLM capabilities
|
|
128
|
+
*/
|
|
129
|
+
function detectLLMCapabilities(browser) {
|
|
130
|
+
const isBrowser = typeof window !== 'undefined';
|
|
131
|
+
// Check for WebGPU
|
|
132
|
+
const webgpu = isBrowser && 'gpu' in navigator;
|
|
133
|
+
return {
|
|
134
|
+
// WebLLM requires WebGPU for good performance
|
|
135
|
+
// Can fall back to WASM but very slow
|
|
136
|
+
webllm: webgpu || browser.wasmSupport,
|
|
137
|
+
// Transformers.js can use WASM
|
|
138
|
+
transformersLLM: browser.wasmSupport,
|
|
139
|
+
// WebGPU for acceleration
|
|
140
|
+
webgpu,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if any STT capability is available
|
|
145
|
+
*/
|
|
146
|
+
export function hasSTT(caps) {
|
|
147
|
+
return caps.stt.browserSpeechAPI || caps.stt.whisperWasm;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if any TTS capability is available
|
|
151
|
+
*/
|
|
152
|
+
export function hasTTS(caps) {
|
|
153
|
+
return caps.tts.browserSynthesisAPI || caps.tts.transformersTTS;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if any LLM capability is available
|
|
157
|
+
*/
|
|
158
|
+
export function hasLLM(caps) {
|
|
159
|
+
return caps.llm.webllm || caps.llm.transformersLLM;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Check if "smrt" mode can be enabled (at least one AI capability available)
|
|
163
|
+
*/
|
|
164
|
+
export function canEnableSmrtMode(caps) {
|
|
165
|
+
return hasSTT(caps) || hasTTS(caps) || hasLLM(caps);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get the best available STT backend
|
|
169
|
+
*/
|
|
170
|
+
export function getBestSTTBackend(caps) {
|
|
171
|
+
// Prefer Whisper for accuracy if available
|
|
172
|
+
if (caps.stt.whisperWasm && caps.llm.webgpu) {
|
|
173
|
+
return 'whisper-wasm';
|
|
174
|
+
}
|
|
175
|
+
if (caps.stt.browserSpeechAPI) {
|
|
176
|
+
return 'browser-speech';
|
|
177
|
+
}
|
|
178
|
+
if (caps.stt.whisperWasm) {
|
|
179
|
+
return 'whisper-wasm';
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get the best available TTS backend
|
|
185
|
+
*/
|
|
186
|
+
export function getBestTTSBackend(caps) {
|
|
187
|
+
// Prefer browser synthesis (no download, instant)
|
|
188
|
+
if (caps.tts.browserSynthesisAPI) {
|
|
189
|
+
return 'browser-synthesis';
|
|
190
|
+
}
|
|
191
|
+
if (caps.tts.transformersTTS) {
|
|
192
|
+
return 'transformers';
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get the best available LLM backend
|
|
198
|
+
*/
|
|
199
|
+
export function getBestLLMBackend(caps) {
|
|
200
|
+
// Prefer WebLLM with WebGPU for performance
|
|
201
|
+
if (caps.llm.webllm && caps.llm.webgpu) {
|
|
202
|
+
return 'webllm';
|
|
203
|
+
}
|
|
204
|
+
if (caps.llm.transformersLLM) {
|
|
205
|
+
return 'transformers-llm';
|
|
206
|
+
}
|
|
207
|
+
if (caps.llm.webllm) {
|
|
208
|
+
return 'webllm';
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for browser AI capabilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for browser AI operations
|
|
6
|
+
*/
|
|
7
|
+
export declare class BrowserAIError extends Error {
|
|
8
|
+
code: string;
|
|
9
|
+
adapter?: string | undefined;
|
|
10
|
+
constructor(message: string, code: string, adapter?: string | undefined);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Thrown when an adapter fails to initialize
|
|
14
|
+
*/
|
|
15
|
+
export declare class InitializationError extends BrowserAIError {
|
|
16
|
+
constructor(adapter: string, reason?: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when a required capability is not available
|
|
20
|
+
*/
|
|
21
|
+
export declare class CapabilityNotAvailableError extends BrowserAIError {
|
|
22
|
+
constructor(capability: string, adapter?: string);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Thrown when a model download fails
|
|
26
|
+
*/
|
|
27
|
+
export declare class DownloadError extends BrowserAIError {
|
|
28
|
+
url: string;
|
|
29
|
+
constructor(url: string, reason?: string, adapter?: string);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Thrown when model loading fails
|
|
33
|
+
*/
|
|
34
|
+
export declare class ModelLoadError extends BrowserAIError {
|
|
35
|
+
model: string;
|
|
36
|
+
constructor(model: string, reason?: string, adapter?: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Thrown when an operation times out
|
|
40
|
+
*/
|
|
41
|
+
export declare class TimeoutError extends BrowserAIError {
|
|
42
|
+
constructor(operation: string, timeoutMs: number, adapter?: string);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Thrown when user denies permission (e.g., microphone access)
|
|
46
|
+
*/
|
|
47
|
+
export declare class PermissionDeniedError extends BrowserAIError {
|
|
48
|
+
constructor(permission: string, adapter?: string);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Thrown when an adapter is not in the correct state for an operation
|
|
52
|
+
*/
|
|
53
|
+
export declare class InvalidStateError extends BrowserAIError {
|
|
54
|
+
constructor(expectedState: string, actualState: string, adapter?: string);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Thrown when an adapter type is not supported
|
|
58
|
+
*/
|
|
59
|
+
export declare class UnsupportedAdapterError extends BrowserAIError {
|
|
60
|
+
constructor(adapterType: string, supportedTypes: string[]);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/browser-ai/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;IAG9B,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,MAAM;gBAFvB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,YAAA;CAK1B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAQ7C;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,cAAc;gBACjD,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAQjD;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAEtC,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM;CASnB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAEvC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM;CASnB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,cAAc;gBAClC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAQnE;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,cAAc;gBAC3C,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAIjD;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;gBACvC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAQzE;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,cAAc;gBAC7C,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE;CAO1D"}
|