@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
package/AGENTS.md
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
# @happyvertical/smrt-svelte
|
|
2
|
+
|
|
3
|
+
Top-of-stack Svelte 5 integration layer for SMRT: the app `Provider`, auth / AI hooks, browser AI (STT/TTS/LLM), forms, server-side i18n, and the domain-aware composites (admin, module, workspace). The domain-agnostic UI primitives, i18n client, theme system, and module UI registry now live in `@happyvertical/smrt-ui` (#1582) — import those from there (e.g. `@happyvertical/smrt-ui/ui`, `@happyvertical/smrt-ui/i18n`).
|
|
4
|
+
|
|
5
|
+
## Provider (Root Component)
|
|
6
|
+
|
|
7
|
+
Wraps app in `+layout.svelte`. Provides auth state, permissions, WebSocket, and AI capabilities.
|
|
8
|
+
|
|
9
|
+
```svelte
|
|
10
|
+
<script>
|
|
11
|
+
let { data, children } = $props();
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<Provider user={data.user} permissions={data.permissions}
|
|
15
|
+
ai={{ preload: 'idle', stt: { type: 'whisper-cpp' } }}>
|
|
16
|
+
{@render children()}
|
|
17
|
+
</Provider>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Hooks
|
|
21
|
+
|
|
22
|
+
| Hook | Returns |
|
|
23
|
+
|------|---------|
|
|
24
|
+
| `useAuth()` | `user`, `isAuthenticated`, `permissions`, `hasPermission()` |
|
|
25
|
+
| `useSocket()` | `status`, `isConnected`, `send()`, `reconnect()`, `disconnect()` |
|
|
26
|
+
| `useAppState()` | Full `SmrtAppStateManager` -- mode, AI adapters, capabilities |
|
|
27
|
+
| `useSTT()` | `start()`, `stop()`, `isListening`, `lastResult`, `interimResult` |
|
|
28
|
+
| `useTTS()` | `speak()`, `stop()`, `isSpeaking`, `getVoices()` |
|
|
29
|
+
| `useLLM()` | `chat()`, `initialize()`, `unload()`, `isGenerating`, `downloadProgress` |
|
|
30
|
+
| `useTheme()` | Theme context from `ThemeProvider` |
|
|
31
|
+
|
|
32
|
+
## AI System
|
|
33
|
+
|
|
34
|
+
- **Preload strategies**: `none`, `eager`, `idle` (recommended), `on-visible`
|
|
35
|
+
- **Warm client cache**: module-level Map survives navigation/remounts -- avoids re-downloading WASM/models
|
|
36
|
+
- **Adapters**: STT (browser-speech, whisper-cpp, whisper-wasm), TTS (browser-synthesis), LLM (webllm, transformers-llm)
|
|
37
|
+
- Cache API: `getCachedSTT()`, `getCachedTTS()`, `getCachedLLM()`, `getCacheStats()`, `clearAllCaches()`
|
|
38
|
+
|
|
39
|
+
## Components
|
|
40
|
+
|
|
41
|
+
The domain-agnostic primitives (`ui`, `layout`, `feedback`, `nav`, `display`,
|
|
42
|
+
`calendar`, `chat`, `permissions`, **`roles`/`memberships`**, `theme`) and the
|
|
43
|
+
i18n client / module registry moved to `@happyvertical/smrt-ui` — import them
|
|
44
|
+
from there (`@happyvertical/smrt-ui/{ui,layout,feedback,…}`). This package keeps
|
|
45
|
+
the top-of-stack, domain-aware pieces:
|
|
46
|
+
|
|
47
|
+
| Category | Components |
|
|
48
|
+
|----------|------------|
|
|
49
|
+
| AI | `Provider`, `AILoadingOverlay`, `CapabilityGate`, `DownloadProgress`, `STTTest`, `VoiceInput` |
|
|
50
|
+
| Forms (`/forms`) | `TextInput`, `Select`, `MoneyInput`, `DateTimeInput`, `Toggle`, `FileUpload`, `AddressInput`, + more (AI-wired inputs use the hooks/browser-ai here) |
|
|
51
|
+
| Admin (`/admin`) | `AgentAdminPanel`, `AgentAdminTabs`, `AgentSettingsShell` (import `@happyvertical/smrt-agents/ui`) |
|
|
52
|
+
| Module | `ModulePanel` |
|
|
53
|
+
| Workspace (`/workspace`) | `WorkspaceShell`, `NavTree`, `Breadcrumbs`, `ToolsDock`, `RoleShell` |
|
|
54
|
+
|
|
55
|
+
### Gap primitives & S10 consolidation (L3 #1422)
|
|
56
|
+
|
|
57
|
+
L3 added the generic primitives domain packages were re-rolling, so S10 (#1415)
|
|
58
|
+
has a consolidation target: `Avatar`, `Chip`, `Skeleton`, `Tooltip`, `Dropdown`
|
|
59
|
+
(menu-button), and `Tree` (flat-DOM ARIA tree, generalizes `NavTree`) under
|
|
60
|
+
`./ui`; plus `MessageBubble`, `ReactionPicker`, `TypingIndicator` under the
|
|
61
|
+
`./chat` subpath. Each ships with design tokens, keyboard + ARIA a11y, JSDoc'd
|
|
62
|
+
props, a golden test, and a playground page (`playground/.../primitives`).
|
|
63
|
+
|
|
64
|
+
**Adoption-only for S10** — these already meet the library bar; S10 should
|
|
65
|
+
migrate domain re-rolls *onto* them rather than build new primitives:
|
|
66
|
+
|
|
67
|
+
- **`FileUpload`** (`./forms`) — the canonical upload input; replace ad-hoc
|
|
68
|
+
drop zones.
|
|
69
|
+
- **`Modal` + forms** (`./feedback` + `./forms`) — compose for dialogs; no
|
|
70
|
+
bespoke modal shells.
|
|
71
|
+
- **`ConfirmDialog`** (`./feedback`) — the standard confirm/destructive-action
|
|
72
|
+
flow.
|
|
73
|
+
- **`Card`** (`./ui`) — the standard surface/container; retire local card CSS.
|
|
74
|
+
|
|
75
|
+
### Import convention (S10 #1415)
|
|
76
|
+
|
|
77
|
+
Domain packages **consume** these primitives; they do not re-roll them. The
|
|
78
|
+
duplication of Modal/Form/Button/Avatar across packages is the root cause of
|
|
79
|
+
inconsistent a11y, tokens, and states downstream — fix it by importing from the
|
|
80
|
+
library. Which barrel for what:
|
|
81
|
+
|
|
82
|
+
| Need | Import from |
|
|
83
|
+
|------|-------------|
|
|
84
|
+
| Buttons, cards, badges, avatars, chips, skeletons, tooltips, dropdowns, trees, pagination | `@happyvertical/smrt-svelte/ui` (or the package root) |
|
|
85
|
+
| Text/select/number/date/money/address inputs, toggles, file upload, `Form`, `FormGroup` | `@happyvertical/smrt-svelte/forms` |
|
|
86
|
+
| `Modal`, `ConfirmDialog`, `LoadingOverlay`, `ProgressBar` | `@happyvertical/smrt-svelte/feedback` |
|
|
87
|
+
| `Container`, `Grid`, `Header`, `Footer`, `PageHeader`, `EmptyState` | `@happyvertical/smrt-svelte/layout` |
|
|
88
|
+
| Chat message bubble, reaction picker, typing indicator | `@happyvertical/smrt-svelte/chat` |
|
|
89
|
+
| Admin shell, nav tree, breadcrumbs, tools dock | `@happyvertical/smrt-svelte/workspace` |
|
|
90
|
+
|
|
91
|
+
The package root re-exports `./ui`, `./forms`, etc., so `from
|
|
92
|
+
'@happyvertical/smrt-svelte'` also works; prefer the specific subpath in domain
|
|
93
|
+
code for tree-shaking and clarity.
|
|
94
|
+
|
|
95
|
+
**Consolidating an existing re-roll** — two patterns:
|
|
96
|
+
|
|
97
|
+
1. **Direct use** (preferred for new code and when the local API already matches):
|
|
98
|
+
delete the local component, import the library primitive at each call site.
|
|
99
|
+
2. **Thin adapter** (when a package has an established, differing prop vocabulary
|
|
100
|
+
or a `ModuleUIRegistry` registration to preserve): keep the local file but
|
|
101
|
+
reduce it to a wrapper that maps the package's props onto the library
|
|
102
|
+
component — no duplicated markup/styles/logic. Example:
|
|
103
|
+
`chat/.../shared/Avatar.svelte` maps `avatarUrl`→`src` and `onlineStatus`'s
|
|
104
|
+
`dnd`→the library's `busy`, delegating everything else.
|
|
105
|
+
|
|
106
|
+
**Missing a primitive or prop?** Add it upstream in `smrt-svelte`, don't re-roll
|
|
107
|
+
downstream (e.g. the library `Avatar` gained an image-error→initials fallback
|
|
108
|
+
while consolidating chat's avatar).
|
|
109
|
+
|
|
110
|
+
## i18n (`./i18n` + `./i18n/server`, Sweep S13 #1418)
|
|
111
|
+
|
|
112
|
+
Routes user-facing strings through `@happyvertical/smrt-languages`. The server
|
|
113
|
+
pre-resolves a per-locale dictionary of **templates**; the client reads it
|
|
114
|
+
synchronously and interpolates `{var}` placeholders with its own dependency-free
|
|
115
|
+
`renderTemplate` (`src/i18n/render.ts`, parity-tested against languages — the
|
|
116
|
+
client never bundles the heavy languages package). No async in render. The
|
|
117
|
+
languages root is imported only by the Node-only `/i18n/server` subpath. See
|
|
118
|
+
`docs/content/architecture/i18n.md`.
|
|
119
|
+
|
|
120
|
+
- **`defineMessages({ key: englishDefault })`** — register a package's English
|
|
121
|
+
code defaults (key namespace `<package>.<component>.<descriptor>`; smrt-svelte
|
|
122
|
+
primitives use `ui.`). Returns a typed key map. Client-safe (no languages
|
|
123
|
+
root import). smrt-svelte's own catalog is `src/i18n/strings.ts`.
|
|
124
|
+
- **`useI18n()` → `{ locale, t }`** and **`<Trans key vars />`** — equal
|
|
125
|
+
first-class APIs (`t` for attributes like `placeholder`/`aria-label`, `<Trans>`
|
|
126
|
+
for element bodies). Resolution order: snapshot template → registered default
|
|
127
|
+
→ the key itself (never blank). Both work outside a `<Provider>` (fall back to
|
|
128
|
+
registered defaults) so primitives stay usable in isolation/tests.
|
|
129
|
+
- **`<Provider i18n={snapshot}>`** puts the store on context; the prop is
|
|
130
|
+
seeded synchronously (SSR-safe) and a locale switch (reassigning `i18n`)
|
|
131
|
+
re-renders every `t` / `<Trans>`.
|
|
132
|
+
- **`buildI18nSnapshot({ locale, tenantId, db })`** (`./i18n/server`, Node-only)
|
|
133
|
+
— a consumer's load function calls it for the request locale and passes the
|
|
134
|
+
result to `<Provider>`. It seeds the languages registry from `defineMessages`
|
|
135
|
+
defaults, then resolves each key through the override/tenant/locale chain.
|
|
136
|
+
- Enforcement: `scripts/check-hardcoded-strings.mjs` (`pnpm
|
|
137
|
+
check:hardcoded-strings`) flags hardcoded prose in `.svelte` markup —
|
|
138
|
+
report-only until a package's extraction completes, then add it to the
|
|
139
|
+
script's `STRICT_PACKAGES`. Phase 1 extracted `DataTable` as the pilot.
|
|
140
|
+
|
|
141
|
+
## Permission Action
|
|
142
|
+
|
|
143
|
+
```svelte
|
|
144
|
+
<div use:permission={{ slug: 'articles.delete', permissions: userPermissions }}>Delete</div>
|
|
145
|
+
<div use:permission={{ slug: 'articles.delete', permissions: userPermissions, hideOnly: true }}>Delete</div>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Themes
|
|
149
|
+
|
|
150
|
+
Two theme systems: `src/theme/` (simple ThemeProvider with design tokens) and `src/themes/` (full preset system with material/glass/studio, CSS generation, runtime switching). **`src/themes/` is canonical** — it is the only path that delivers the complete preset-aware `--smrt-*` token surface (colors + typography + spacing + radius + elevation + motion) across material/glass/studio. `src/theme/` is the simpler/legacy provider; it emits the same CSS variable vocabulary from its single built-in scale for backward compatibility, but it does not support preset switching or preset-specific values.
|
|
151
|
+
|
|
152
|
+
### Design-token vocabulary (issue #1431)
|
|
153
|
+
|
|
154
|
+
Components consume a Material-3 vocabulary. To keep one vocabulary that always resolves, the canonical names are emitted **plus** additive aliases — never rename canonical tokens:
|
|
155
|
+
|
|
156
|
+
- **Radius**: canonical `none|sm|md|lg|xl|2xl|3xl|full`; aliases `extra-small|small|medium|large|extra-large`.
|
|
157
|
+
- **Spacing**: canonical numeric scale `0…24`; aliases `xs|sm|md|lg|xl|2xl|3xl` mapped onto numeric values.
|
|
158
|
+
- **Motion**: canonical `instant|fast|normal|slow|slower`; aliases `short1…long4` (M3 ms scale).
|
|
159
|
+
- **Typography**: per-variant `-size|-line-height|-weight|-tracking|-font-family` **plus** a `-font` CSS-shorthand alias (`weight size/line-height family`).
|
|
160
|
+
- **Helpers**: `--smrt-font-family-mono`, named `--smrt-typography-weight-{normal,medium,semibold,bold}`, and `--smrt-z-index-{dropdown…tooltip}` (incl. `dialog`).
|
|
161
|
+
|
|
162
|
+
Single source of truth: `src/themes/shared.ts` (alias maps) → emitted by `src/themes/css-generator.ts` (JS `ThemeProvider`), mirrored into the static preset CSS (`src/themes/styles/*.css`) and the simple provider (`src/theme/tokens.ts`). `scripts/check-svelte-tokens.mjs` (CI + `pnpm check:svelte-tokens`) fails on any consumed-but-unemitted `--smrt-*` token; `src/themes/__tests__/token-aliases.test.ts` pins the emitted set. Don't introduce new `--smrt-*` names in components without emitting them from a delivery path.
|
|
163
|
+
|
|
164
|
+
## Key Files
|
|
165
|
+
|
|
166
|
+
- `src/Provider.svelte` -- root component, state initialization
|
|
167
|
+
- `src/state/` -- SmrtAppStateManager ($state rune), warm client cache
|
|
168
|
+
- `src/hooks/` -- useAuth, useSocket, useAppState, useSTT, useTTS, useLLM, useTheme
|
|
169
|
+
- `src/components/` -- UI components by category
|
|
170
|
+
- `src/themes/` -- ThemeProvider, ThemeSwitcher, CSS presets
|
|
171
|
+
- `src/browser-ai/` -- STT/TTS/LLM adapters, capability detection (bundled, not external)
|
|
172
|
+
- `src/registry/` -- ModuleUIRegistry for cross-package component discovery
|
|
173
|
+
|
|
174
|
+
## Component testing (golden tests)
|
|
175
|
+
|
|
176
|
+
Component test harness (sweep L4, #1423): `@testing-library/svelte` + `@testing-library/jest-dom` + `@testing-library/user-event` + `axe-core`, wired through `src/test-support/setup.ts` (jest-dom matchers, Testing Library auto-cleanup, a jsdom `<dialog>` `showModal`/`close` polyfill). The smrt-vitest plugin appends its own setup to `setupFiles` — it merges, so don't remove the entry.
|
|
177
|
+
|
|
178
|
+
**Golden test pattern** — render → assert role/name/state → drive with `user-event` → prove axe-clean. `src/components/ui/__tests__/Button.test.ts` is the reference:
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
import { render, screen } from '@testing-library/svelte';
|
|
182
|
+
import userEvent from '@testing-library/user-event';
|
|
183
|
+
import { expectNoA11yViolations } from '../../../test-support/a11y';
|
|
184
|
+
|
|
185
|
+
render(Component, { props: { /* … */ } });
|
|
186
|
+
const el = screen.getByRole('button', { name: 'Save' });
|
|
187
|
+
await userEvent.click(el);
|
|
188
|
+
expect(el).toHaveAttribute('aria-busy', 'true');
|
|
189
|
+
const { container } = render(Component, { props });
|
|
190
|
+
await expectNoA11yViolations(container); // axe; color-contrast off (jsdom has no paint)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
- **Snippet props** (`children`, cell/header renderers): build with `createRawSnippet(() => ({ render: () => '<span>…</span>' }))`.
|
|
194
|
+
- **Hook-dependent components** (anything calling `useAppState`/`useSTT`/`useAuth` — they throw outside `<Provider>`): `vi.mock` the hook module with stub defaults. See `src/components/forms/__tests__/Form.test.ts`.
|
|
195
|
+
- **Form-input a11y** (programmatic labels, `aria-describedby`, axe-clean for `Input`/`TextInput`/etc.) is L1's deliverable (#1420) on top of this harness — bare primitives like `Input` get behavior tests here, labelled axe coverage there.
|
|
196
|
+
- Existing reference suites: Button, Input, Modal, DataTable, Form. The pattern is what sweep S11 (#1416) rolls out repo-wide.
|
|
197
|
+
|
|
198
|
+
## Dependencies
|
|
199
|
+
|
|
200
|
+
- `@happyvertical/smrt-types` (shared types) — includes the identity data contracts (`User`, `Role`, `Membership`, `Tenant`) the role/membership components type against, so no dependency on `smrt-users` / `smrt-profiles` is needed
|
|
201
|
+
- Peer: `svelte` >=5.18.2, `@happyvertical/smrt-agents`, `@happyvertical/smrt-jobs` (all optional)
|
|
202
|
+
|
|
203
|
+
## Workspace shell primitives
|
|
204
|
+
|
|
205
|
+
The `./workspace` subpath (`src/components/workspace/`) holds admin-shell primitives:
|
|
206
|
+
`WorkspaceShell`, `NavTree`, `Breadcrumbs`, and `ToolsDock` (plus `defineToolsDock` /
|
|
207
|
+
`useToolsDock`). Shared types live in `workspace/types.ts` and are re-exported via the
|
|
208
|
+
subpath barrel.
|
|
209
|
+
|
|
210
|
+
**Layering**: primitives first (this folder), opinionated wrapper second (`AdminShell` — deferred),
|
|
211
|
+
domain-specific tools live outside the framework in consumer packages.
|
|
212
|
+
|
|
213
|
+
**Principles**:
|
|
214
|
+
- SvelteKit-agnostic — no `$app/state` or `$app/navigation` imports
|
|
215
|
+
- SSR-safe — guard all `window` / `localStorage` access
|
|
216
|
+
- No token bridges — consume `var(--smrt-color-*)` directly
|
|
217
|
+
- Tool IDs are arbitrary strings (extensible, not an enum)
|
|
218
|
+
|
|
219
|
+
**State-mirroring recipes** (issue #1235):
|
|
220
|
+
- Dock events. `'dock:state-changed'` fires on `open()`/`close()`/`toggle()` and
|
|
221
|
+
on availability-driven `activeTool` clears (payload: `{ isOpen, activeTool }`).
|
|
222
|
+
`'dock:context-changed'` fires on `setContext()` with a different reference
|
|
223
|
+
(payload: `{ context }`). Legacy `'dock:change'` (payload: `{ isOpen, activeTool, context }`)
|
|
224
|
+
still fires on every observable transition (incl. badge-only availability
|
|
225
|
+
refresh) for back-compat with consumers mirroring `availableTools` — it's
|
|
226
|
+
`@deprecated`; prefer the granular pair. The `'dock:*'` prefix is reserved
|
|
227
|
+
for built-ins; consumer events should pick a different namespace.
|
|
228
|
+
- `WorkspaceShell` exposes `bind:mobileNavOpen` so consumers can lift the drawer
|
|
229
|
+
state. Pair it with `<NavTree onNavigate={() => mobileNavOpen = false} />` to
|
|
230
|
+
close the drawer on navigation without any DOM querying.
|
|
231
|
+
- `ToolDef.iconComponent?: Component` renders a custom icon (lucide-svelte etc.)
|
|
232
|
+
inside the rail glyph (and as a leading glyph in topbar layout). Takes
|
|
233
|
+
precedence over `icon: string`, then `label.charAt(0)` as last resort.
|
|
234
|
+
- `dock.refreshAvailability()` forces a re-run of `fetchAvailability` with the
|
|
235
|
+
current context. `setContext()` short-circuits on strict-equal references —
|
|
236
|
+
use refresh when a side-channel event (websocket, button) signals availability
|
|
237
|
+
or badges changed without a context change.
|
|
238
|
+
- Typed `defineToolsDock<TData, TActions>`. The factory's two generics flow
|
|
239
|
+
into `fetchAvailability`'s `ctx` param and through `ToolsDockContext<TData, TActions>`
|
|
240
|
+
for tool components. Inside a tool, type `context` locally:
|
|
241
|
+
`let { context }: { context: ToolsDockContext<MyData, MyActions> | null } = $props();`.
|
|
242
|
+
`context?.actions?.foo()` is then fully typed — no per-consumer redeclaration.
|
|
243
|
+
`ToolDef` itself is no longer generic (stored as a homogeneous `ToolDef[]`);
|
|
244
|
+
the consumer-side cast at registration is gone, the typed surface lives on
|
|
245
|
+
the component's `context` prop instead.
|
|
246
|
+
- Layout positioning. `<ToolsDock layout='topbar'>` renders its own
|
|
247
|
+
`position: fixed` panel — **do not also use `<WorkspaceShell>`'s `inspector`
|
|
248
|
+
snippet** in that mode (the two panels overlap with no z-index coordination).
|
|
249
|
+
`'rail'` layout is safe to compose alongside `inspector` — its panel sits
|
|
250
|
+
inside the dock's own aside.
|
|
251
|
+
|
|
252
|
+
### RoleShell
|
|
253
|
+
|
|
254
|
+
Opinionated thin wrapper for multi-role admin shells. Pass a `RoleConfig[]` list
|
|
255
|
+
and the current role id; renders `<WorkspaceShell>` + `<NavTree>` + `<Breadcrumbs>`
|
|
256
|
+
wired together. Role colors flow through as `--smrt-role-color` CSS custom property.
|
|
257
|
+
|
|
258
|
+
```svelte
|
|
259
|
+
<script lang="ts">
|
|
260
|
+
import { page } from '$app/state';
|
|
261
|
+
import { RoleShell } from '@happyvertical/smrt-svelte/workspace';
|
|
262
|
+
import AccountMenu from '$lib/AccountMenu.svelte';
|
|
263
|
+
import { ROLE_CONFIGS } from '$lib/roles';
|
|
264
|
+
|
|
265
|
+
let { data, children } = $props();
|
|
266
|
+
let mobileNavOpen = $state(false);
|
|
267
|
+
</script>
|
|
268
|
+
|
|
269
|
+
<RoleShell
|
|
270
|
+
roles={ROLE_CONFIGS}
|
|
271
|
+
currentRole={data.currentRole}
|
|
272
|
+
currentPath={page.url.pathname}
|
|
273
|
+
bind:mobileNavOpen
|
|
274
|
+
>
|
|
275
|
+
{#snippet sidebarFooter()}
|
|
276
|
+
<AccountMenu user={data.user} />
|
|
277
|
+
{/snippet}
|
|
278
|
+
{@render children?.()}
|
|
279
|
+
</RoleShell>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
The `{@render children?.()}` call is the Svelte 5 idiom for rendering a
|
|
283
|
+
layout's child route content — replace with the equivalent slot/render call
|
|
284
|
+
for your framework if you're not using SvelteKit's `+layout.svelte` flow.
|
|
285
|
+
|
|
286
|
+
The shell intentionally doesn't know about specific role IDs — consumers pick
|
|
287
|
+
whatever set their app needs. Use this for role-based admin dashboards; use
|
|
288
|
+
`<WorkspaceShell>` directly for non-role apps.
|
|
289
|
+
|
|
290
|
+
See epic [happyvertical/smrt#1226](https://github.com/happyvertical/smrt/issues/1226) for context;
|
|
291
|
+
implementations land via #1227 (`WorkspaceShell`), #1228 (`NavTree`/`Breadcrumbs`), and #1229
|
|
292
|
+
(`ToolsDock` + registry).
|
|
293
|
+
|
|
294
|
+
### Dock availability gates (server-side)
|
|
295
|
+
|
|
296
|
+
`ToolDef.gates?: string[]` declares the gates a tool must pass to be visible.
|
|
297
|
+
Convention: `<prefix>:<identifier>` (e.g. `permission:articles.publish`,
|
|
298
|
+
`feature:video-tools`, `myapp:show-jobs`). `composeDockAvailability` from
|
|
299
|
+
`@happyvertical/smrt-svelte/workspace/server` evaluates them — register one
|
|
300
|
+
evaluator per prefix, throws on unknown prefixes (loud-fail beats silent-leak),
|
|
301
|
+
AND semantics across a tool's gates. Node-safe, no Svelte imports.
|
|
302
|
+
|
|
303
|
+
The framework does NOT ship built-in evaluators — every prefix the dock sees
|
|
304
|
+
must have a caller-supplied evaluator in the map (otherwise composition
|
|
305
|
+
throws). `permission:` and `feature:` are recommended conventions for
|
|
306
|
+
ecosystem cohesion (consumers typically wire `PermissionResolver` from
|
|
307
|
+
smrt-users and `FeatureResolver` from smrt-features as those evaluators), but
|
|
308
|
+
they're not reserved — apps may pick any namespace. App-specific gates
|
|
309
|
+
should use a dedicated namespace (e.g. `myapp:`) to avoid colliding with
|
|
310
|
+
future built-ins.
|
|
311
|
+
|
|
312
|
+
Recommended pattern: in the consumer's `+server.ts` endpoint that backs
|
|
313
|
+
`fetchAvailability`, wrap `PermissionResolver` (smrt-users) and `FeatureResolver`
|
|
314
|
+
(smrt-features) as evaluators and pass them in. Tools without `gates` stay
|
|
315
|
+
unconditionally visible (back-compat). Anytown's hand-coded
|
|
316
|
+
`apps/dashboard/src/lib/server/content-tool-dock.ts` is a candidate for
|
|
317
|
+
migration in a follow-up.
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright <2025> <Happy Vertical Corporation>
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# @happyvertical/smrt-svelte
|
|
2
|
+
|
|
3
|
+
Svelte 5 component library for the SMRT framework. Provides UI components, browser AI integration (STT/TTS/LLM with warm cache), a theme system, permission-aware rendering, and module UI registry for agent admin panels.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @happyvertical/smrt-svelte
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Provider Setup
|
|
14
|
+
|
|
15
|
+
```svelte
|
|
16
|
+
<script>
|
|
17
|
+
import { Provider } from '@happyvertical/smrt-svelte';
|
|
18
|
+
let { children } = $props();
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<Provider user={data.user} permissions={data.permissions}
|
|
22
|
+
ai={{ preload: 'idle', stt: { type: 'whisper-cpp' } }}>
|
|
23
|
+
{@render children()}
|
|
24
|
+
</Provider>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Form Components
|
|
28
|
+
|
|
29
|
+
```svelte
|
|
30
|
+
<script>
|
|
31
|
+
import { TextInput, Select, MoneyInput, DateTimeInput, Toggle } from '@happyvertical/smrt-svelte/forms';
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<TextInput label="Name" bind:value={name} />
|
|
35
|
+
<MoneyInput label="Price" bind:value={price} currency="USD" />
|
|
36
|
+
<DateTimeInput label="Launch Date" bind:value={date} />
|
|
37
|
+
<Toggle label="Active" bind:checked={active} />
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### UI Components
|
|
41
|
+
|
|
42
|
+
```svelte
|
|
43
|
+
<script>
|
|
44
|
+
import { Button, Card, Badge, Pagination } from '@happyvertical/smrt-svelte/ui';
|
|
45
|
+
import { DataTable } from '@happyvertical/smrt-svelte';
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<Card>
|
|
49
|
+
<DataTable columns={cols} rows={data} />
|
|
50
|
+
<Pagination total={100} page={1} perPage={20} />
|
|
51
|
+
</Card>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Permission-Aware Rendering
|
|
55
|
+
|
|
56
|
+
```svelte
|
|
57
|
+
<script>
|
|
58
|
+
import { PermissionCheck, permission } from '@happyvertical/smrt-svelte';
|
|
59
|
+
</script>
|
|
60
|
+
|
|
61
|
+
<PermissionCheck requires="admin:write">
|
|
62
|
+
<button>Admin Action</button>
|
|
63
|
+
</PermissionCheck>
|
|
64
|
+
|
|
65
|
+
<!-- Or as a Svelte action -->
|
|
66
|
+
<div use:permission={{ slug: 'admin:read', permissions: userPermissions }}>
|
|
67
|
+
Protected content
|
|
68
|
+
</div>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Theme System
|
|
72
|
+
|
|
73
|
+
```svelte
|
|
74
|
+
<script>
|
|
75
|
+
import { ThemeProvider } from '@happyvertical/smrt-svelte/themes';
|
|
76
|
+
</script>
|
|
77
|
+
|
|
78
|
+
<ThemeProvider preset="glass" colorScheme="system">
|
|
79
|
+
{@render children()}
|
|
80
|
+
</ThemeProvider>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Workspace Navigation
|
|
84
|
+
|
|
85
|
+
```svelte
|
|
86
|
+
<script lang="ts">
|
|
87
|
+
import { manifest } from '$lib/smrt-manifest';
|
|
88
|
+
import {
|
|
89
|
+
RoleShell,
|
|
90
|
+
navTreeFromManifest,
|
|
91
|
+
} from '@happyvertical/smrt-svelte/workspace';
|
|
92
|
+
|
|
93
|
+
let { children } = $props();
|
|
94
|
+
|
|
95
|
+
const sections = navTreeFromManifest(manifest, {
|
|
96
|
+
sectionHints: {
|
|
97
|
+
'@happyvertical/smrt-content': 'Content',
|
|
98
|
+
'@happyvertical/smrt-profiles': 'Profiles',
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const roles = [{ id: 'admin', label: 'Admin', sections }];
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<RoleShell {roles} currentRole="admin" currentPath="/admin/articles">
|
|
106
|
+
{@render children?.()}
|
|
107
|
+
</RoleShell>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Filter the same manifest by role permissions when only a subset of resources
|
|
111
|
+
should be visible:
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
import { navTreeFromManifest } from '@happyvertical/smrt-svelte/workspace';
|
|
115
|
+
|
|
116
|
+
const editorSections = navTreeFromManifest(manifest, {
|
|
117
|
+
permittedResources: [
|
|
118
|
+
'@happyvertical/smrt-content:Article',
|
|
119
|
+
'@happyvertical/smrt-content:Document',
|
|
120
|
+
],
|
|
121
|
+
sectionHints: {
|
|
122
|
+
'@happyvertical/smrt-content': 'Content',
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Exports
|
|
128
|
+
|
|
129
|
+
### Entry Points
|
|
130
|
+
|
|
131
|
+
| Import Path | Contents |
|
|
132
|
+
|-------------|----------|
|
|
133
|
+
| `@happyvertical/smrt-svelte` | Provider, DataTable, permission utilities, hooks, state, components |
|
|
134
|
+
| `@happyvertical/smrt-svelte/admin` | Agent admin panel components |
|
|
135
|
+
| `@happyvertical/smrt-svelte/calendar` | Calendar and DayView |
|
|
136
|
+
| `@happyvertical/smrt-svelte/forms` | Form inputs (TextInput, Select, MoneyInput, etc.) |
|
|
137
|
+
| `@happyvertical/smrt-svelte/layout` | Layout (Container, Grid, Header, Footer, Masthead, etc.) |
|
|
138
|
+
| `@happyvertical/smrt-svelte/ui` | UI primitives (Button, Card, Badge, Pagination) |
|
|
139
|
+
| `@happyvertical/smrt-svelte/themes` | ThemeProvider, presets (material/glass/studio), CSS generation |
|
|
140
|
+
| `@happyvertical/smrt-svelte/registry` | ModuleUIRegistry for agent admin panels |
|
|
141
|
+
| `@happyvertical/smrt-svelte/workspace` | WorkspaceShell, RoleShell, NavTree, Breadcrumbs, ToolsDock, and manifest nav helpers |
|
|
142
|
+
| `@happyvertical/smrt-svelte/browser-ai` | Browser AI client (STT/TTS/LLM adapters, capability detection) |
|
|
143
|
+
| `@happyvertical/smrt-svelte/browser-ai/svelte` | Svelte AI components (VoiceInput, CapabilityGate, etc.) |
|
|
144
|
+
| `@happyvertical/smrt-svelte/styles/tokens.css` | Design tokens CSS |
|
|
145
|
+
|
|
146
|
+
### Components by Category
|
|
147
|
+
|
|
148
|
+
**Forms**: `AddressInput`, `CheckboxInput`, `DateRangeInput`, `DateTimeInput`, `FileUpload`, `Form`, `FormGroup`, `FormMicButton`, `Input`, `MeasurementInput`, `MoneyInput`, `NumberInput`, `PhoneInput`, `SearchInput`, `Select`, `SelectInput`, `Textarea`, `TextareaInput`, `TextInput`, `Toggle`
|
|
149
|
+
|
|
150
|
+
**Layout**: `Container`, `EmptyState`, `Footer`, `Grid`, `Header`, `Masthead`, `PageHeader`, `SummaryCard`
|
|
151
|
+
|
|
152
|
+
**UI**: `Badge`, `Button`, `Card`, `Pagination`
|
|
153
|
+
|
|
154
|
+
**Display**: `ConfidenceBadge`, `CurrencyDisplay`, `DateDisplay`, `Icon`, `StatusBadge`
|
|
155
|
+
|
|
156
|
+
**Feedback**: `ConfirmDialog`, `LoadingOverlay`, `Modal`, `ProgressBar`
|
|
157
|
+
|
|
158
|
+
**Navigation**: `FilterChips`, `Tabs`
|
|
159
|
+
|
|
160
|
+
**Data**: `DataTable`
|
|
161
|
+
|
|
162
|
+
**Permissions**: `PermissionCheck`, `RoleBadge`, `RoleSelector`
|
|
163
|
+
|
|
164
|
+
**Admin**: `AgentAdminPanel`, `AgentAdminTabs`, `AgentSettingsShell`
|
|
165
|
+
|
|
166
|
+
**Other**: `Calendar`, `DayView`, `MembershipCard`, `MembershipList`, `ModulePanel`
|
|
167
|
+
|
|
168
|
+
**Browser AI**: `AILoadingOverlay`, `CapabilityGate`, `DownloadProgress`, `STTTest`, `VoiceInput`
|
|
169
|
+
|
|
170
|
+
### Hooks
|
|
171
|
+
|
|
172
|
+
`useAuth`, `useSocket`, `useAppState`, `useSTT`, `useTTS`, `useLLM`, `useTheme`
|
|
173
|
+
|
|
174
|
+
### Functions & Actions
|
|
175
|
+
|
|
176
|
+
`hasPermission`, `hasAnyPermission`, `hasAllPermissions`, `permission` (action), `ripple` (action)
|
|
177
|
+
|
|
178
|
+
### Cache API
|
|
179
|
+
|
|
180
|
+
`getCachedSTT`, `getCachedTTS`, `getCachedLLM`, `getCacheStats`, `clearAllCaches`
|
|
181
|
+
|
|
182
|
+
## Dependencies
|
|
183
|
+
|
|
184
|
+
- `@happyvertical/smrt-types` -- shared type definitions
|
|
185
|
+
- Peer: `svelte` >=5.18.2, `@happyvertical/smrt-agents`, `@happyvertical/smrt-jobs`, `@happyvertical/smrt-profiles`, `@happyvertical/smrt-users` (all optional)
|