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