@happyvertical/smrt-svelte 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/AGENTS.md +317 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +185 -0
  5. package/dist/Provider.svelte +204 -0
  6. package/dist/Provider.svelte.d.ts +73 -0
  7. package/dist/Provider.svelte.d.ts.map +1 -0
  8. package/dist/__tests__/app-state.test.js +156 -0
  9. package/dist/__tests__/warm-clients.test.js +186 -0
  10. package/dist/browser-ai/adapters/llm/factory.d.ts +38 -0
  11. package/dist/browser-ai/adapters/llm/factory.d.ts.map +1 -0
  12. package/dist/browser-ai/adapters/llm/factory.js +91 -0
  13. package/dist/browser-ai/adapters/llm/index.d.ts +7 -0
  14. package/dist/browser-ai/adapters/llm/index.d.ts.map +1 -0
  15. package/dist/browser-ai/adapters/llm/index.js +6 -0
  16. package/dist/browser-ai/adapters/llm/types.d.ts +182 -0
  17. package/dist/browser-ai/adapters/llm/types.d.ts.map +1 -0
  18. package/dist/browser-ai/adapters/llm/types.js +43 -0
  19. package/dist/browser-ai/adapters/llm/webllm.d.ts +33 -0
  20. package/dist/browser-ai/adapters/llm/webllm.d.ts.map +1 -0
  21. package/dist/browser-ai/adapters/llm/webllm.js +225 -0
  22. package/dist/browser-ai/adapters/stt/browser-speech.d.ts +31 -0
  23. package/dist/browser-ai/adapters/stt/browser-speech.d.ts.map +1 -0
  24. package/dist/browser-ai/adapters/stt/browser-speech.js +217 -0
  25. package/dist/browser-ai/adapters/stt/factory.d.ts +49 -0
  26. package/dist/browser-ai/adapters/stt/factory.d.ts.map +1 -0
  27. package/dist/browser-ai/adapters/stt/factory.js +110 -0
  28. package/dist/browser-ai/adapters/stt/index.d.ts +9 -0
  29. package/dist/browser-ai/adapters/stt/index.d.ts.map +1 -0
  30. package/dist/browser-ai/adapters/stt/index.js +8 -0
  31. package/dist/browser-ai/adapters/stt/types.d.ts +154 -0
  32. package/dist/browser-ai/adapters/stt/types.d.ts.map +1 -0
  33. package/dist/browser-ai/adapters/stt/types.js +4 -0
  34. package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts +46 -0
  35. package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts.map +1 -0
  36. package/dist/browser-ai/adapters/stt/whisper-cpp.js +348 -0
  37. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts +51 -0
  38. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts.map +1 -0
  39. package/dist/browser-ai/adapters/stt/whisper-wasm.js +380 -0
  40. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts +42 -0
  41. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts.map +1 -0
  42. package/dist/browser-ai/adapters/tts/browser-synthesis.js +235 -0
  43. package/dist/browser-ai/adapters/tts/factory.d.ts +53 -0
  44. package/dist/browser-ai/adapters/tts/factory.d.ts.map +1 -0
  45. package/dist/browser-ai/adapters/tts/factory.js +92 -0
  46. package/dist/browser-ai/adapters/tts/index.d.ts +7 -0
  47. package/dist/browser-ai/adapters/tts/index.d.ts.map +1 -0
  48. package/dist/browser-ai/adapters/tts/index.js +6 -0
  49. package/dist/browser-ai/adapters/tts/types.d.ts +140 -0
  50. package/dist/browser-ai/adapters/tts/types.d.ts.map +1 -0
  51. package/dist/browser-ai/adapters/tts/types.js +4 -0
  52. package/dist/browser-ai/capabilities/detector.d.ts +38 -0
  53. package/dist/browser-ai/capabilities/detector.d.ts.map +1 -0
  54. package/dist/browser-ai/capabilities/detector.js +211 -0
  55. package/dist/browser-ai/core/errors.d.ts +62 -0
  56. package/dist/browser-ai/core/errors.d.ts.map +1 -0
  57. package/dist/browser-ai/core/errors.js +92 -0
  58. package/dist/browser-ai/core/index.d.ts +6 -0
  59. package/dist/browser-ai/core/index.d.ts.map +1 -0
  60. package/dist/browser-ai/core/index.js +5 -0
  61. package/dist/browser-ai/core/types.d.ts +115 -0
  62. package/dist/browser-ai/core/types.d.ts.map +1 -0
  63. package/dist/browser-ai/core/types.js +34 -0
  64. package/dist/browser-ai/index.d.ts +12 -0
  65. package/dist/browser-ai/index.d.ts.map +1 -0
  66. package/dist/browser-ai/index.js +16 -0
  67. package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte +77 -0
  68. package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts +16 -0
  69. package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts.map +1 -0
  70. package/dist/browser-ai/svelte/components/CapabilityGate.svelte +57 -0
  71. package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts +15 -0
  72. package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts.map +1 -0
  73. package/dist/browser-ai/svelte/components/DownloadProgress.svelte +141 -0
  74. package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts +15 -0
  75. package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts.map +1 -0
  76. package/dist/browser-ai/svelte/components/STTTest.svelte +379 -0
  77. package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts +9 -0
  78. package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts.map +1 -0
  79. package/dist/browser-ai/svelte/components/VoiceInput.svelte +200 -0
  80. package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts +16 -0
  81. package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts.map +1 -0
  82. package/dist/browser-ai/svelte/index.d.ts +15 -0
  83. package/dist/browser-ai/svelte/index.d.ts.map +1 -0
  84. package/dist/browser-ai/svelte/index.js +28 -0
  85. package/dist/browser-ai/ui.d.ts +16 -0
  86. package/dist/browser-ai/ui.d.ts.map +1 -0
  87. package/dist/browser-ai/ui.js +67 -0
  88. package/dist/components/admin/AgentAdminPanel.svelte +111 -0
  89. package/dist/components/admin/AgentAdminPanel.svelte.d.ts +25 -0
  90. package/dist/components/admin/AgentAdminPanel.svelte.d.ts.map +1 -0
  91. package/dist/components/admin/AgentAdminTabs.svelte +280 -0
  92. package/dist/components/admin/AgentAdminTabs.svelte.d.ts +23 -0
  93. package/dist/components/admin/AgentAdminTabs.svelte.d.ts.map +1 -0
  94. package/dist/components/admin/AgentSettingsShell.svelte +257 -0
  95. package/dist/components/admin/AgentSettingsShell.svelte.d.ts +33 -0
  96. package/dist/components/admin/AgentSettingsShell.svelte.d.ts.map +1 -0
  97. package/dist/components/admin/index.d.ts +5 -0
  98. package/dist/components/admin/index.d.ts.map +1 -0
  99. package/dist/components/admin/index.js +6 -0
  100. package/dist/components/forms/AddressInput.svelte +500 -0
  101. package/dist/components/forms/AddressInput.svelte.d.ts +36 -0
  102. package/dist/components/forms/AddressInput.svelte.d.ts.map +1 -0
  103. package/dist/components/forms/CheckboxInput.svelte +208 -0
  104. package/dist/components/forms/CheckboxInput.svelte.d.ts +20 -0
  105. package/dist/components/forms/CheckboxInput.svelte.d.ts.map +1 -0
  106. package/dist/components/forms/DateRangeInput.svelte +628 -0
  107. package/dist/components/forms/DateRangeInput.svelte.d.ts +33 -0
  108. package/dist/components/forms/DateRangeInput.svelte.d.ts.map +1 -0
  109. package/dist/components/forms/DateTimeInput.svelte +521 -0
  110. package/dist/components/forms/DateTimeInput.svelte.d.ts +24 -0
  111. package/dist/components/forms/DateTimeInput.svelte.d.ts.map +1 -0
  112. package/dist/components/forms/FileUpload.svelte +358 -0
  113. package/dist/components/forms/FileUpload.svelte.d.ts +22 -0
  114. package/dist/components/forms/FileUpload.svelte.d.ts.map +1 -0
  115. package/dist/components/forms/Form.svelte +771 -0
  116. package/dist/components/forms/Form.svelte.d.ts +26 -0
  117. package/dist/components/forms/Form.svelte.d.ts.map +1 -0
  118. package/dist/components/forms/FormGroup.svelte +86 -0
  119. package/dist/components/forms/FormGroup.svelte.d.ts +13 -0
  120. package/dist/components/forms/FormGroup.svelte.d.ts.map +1 -0
  121. package/dist/components/forms/FormMicButton.svelte +179 -0
  122. package/dist/components/forms/FormMicButton.svelte.d.ts +10 -0
  123. package/dist/components/forms/FormMicButton.svelte.d.ts.map +1 -0
  124. package/dist/components/forms/Input.svelte +83 -0
  125. package/dist/components/forms/Input.svelte.d.ts +9 -0
  126. package/dist/components/forms/Input.svelte.d.ts.map +1 -0
  127. package/dist/components/forms/MeasurementInput.svelte +505 -0
  128. package/dist/components/forms/MeasurementInput.svelte.d.ts +35 -0
  129. package/dist/components/forms/MeasurementInput.svelte.d.ts.map +1 -0
  130. package/dist/components/forms/MoneyInput.svelte +412 -0
  131. package/dist/components/forms/MoneyInput.svelte.d.ts +30 -0
  132. package/dist/components/forms/MoneyInput.svelte.d.ts.map +1 -0
  133. package/dist/components/forms/NumberInput.svelte +310 -0
  134. package/dist/components/forms/NumberInput.svelte.d.ts +28 -0
  135. package/dist/components/forms/NumberInput.svelte.d.ts.map +1 -0
  136. package/dist/components/forms/PhoneInput.svelte +530 -0
  137. package/dist/components/forms/PhoneInput.svelte.d.ts +22 -0
  138. package/dist/components/forms/PhoneInput.svelte.d.ts.map +1 -0
  139. package/dist/components/forms/SearchInput.svelte +358 -0
  140. package/dist/components/forms/SearchInput.svelte.d.ts +33 -0
  141. package/dist/components/forms/SearchInput.svelte.d.ts.map +1 -0
  142. package/dist/components/forms/Select.svelte +83 -0
  143. package/dist/components/forms/Select.svelte.d.ts +11 -0
  144. package/dist/components/forms/Select.svelte.d.ts.map +1 -0
  145. package/dist/components/forms/SelectInput.svelte +254 -0
  146. package/dist/components/forms/SelectInput.svelte.d.ts +25 -0
  147. package/dist/components/forms/SelectInput.svelte.d.ts.map +1 -0
  148. package/dist/components/forms/TextInput.svelte +415 -0
  149. package/dist/components/forms/TextInput.svelte.d.ts +26 -0
  150. package/dist/components/forms/TextInput.svelte.d.ts.map +1 -0
  151. package/dist/components/forms/Textarea.svelte +85 -0
  152. package/dist/components/forms/Textarea.svelte.d.ts +10 -0
  153. package/dist/components/forms/Textarea.svelte.d.ts.map +1 -0
  154. package/dist/components/forms/TextareaInput.svelte +386 -0
  155. package/dist/components/forms/TextareaInput.svelte.d.ts +26 -0
  156. package/dist/components/forms/TextareaInput.svelte.d.ts.map +1 -0
  157. package/dist/components/forms/Toggle.svelte +217 -0
  158. package/dist/components/forms/Toggle.svelte.d.ts +37 -0
  159. package/dist/components/forms/Toggle.svelte.d.ts.map +1 -0
  160. package/dist/components/forms/__tests__/AddressInput.behavior.test.js +122 -0
  161. package/dist/components/forms/__tests__/CheckboxInput.test.js +92 -0
  162. package/dist/components/forms/__tests__/DateRangeInput.behavior.test.js +135 -0
  163. package/dist/components/forms/__tests__/DateTimeInput.behavior.test.js +103 -0
  164. package/dist/components/forms/__tests__/FileUpload.test.js +90 -0
  165. package/dist/components/forms/__tests__/Form.behavior.test.js +137 -0
  166. package/dist/components/forms/__tests__/Form.test.js +58 -0
  167. package/dist/components/forms/__tests__/FormGroup.test.js +48 -0
  168. package/dist/components/forms/__tests__/FormMicButton.test.js +86 -0
  169. package/dist/components/forms/__tests__/Input.test.js +49 -0
  170. package/dist/components/forms/__tests__/MeasurementInput.behavior.test.js +129 -0
  171. package/dist/components/forms/__tests__/MoneyInput.behavior.test.js +124 -0
  172. package/dist/components/forms/__tests__/NumberInput.behavior.test.js +141 -0
  173. package/dist/components/forms/__tests__/PhoneInput.behavior.test.js +96 -0
  174. package/dist/components/forms/__tests__/SearchInput.test.js +79 -0
  175. package/dist/components/forms/__tests__/Select.test.js +37 -0
  176. package/dist/components/forms/__tests__/SelectInput.behavior.test.js +132 -0
  177. package/dist/components/forms/__tests__/TextInput.behavior.test.js +131 -0
  178. package/dist/components/forms/__tests__/Textarea.test.js +39 -0
  179. package/dist/components/forms/__tests__/TextareaInput.behavior.test.js +96 -0
  180. package/dist/components/forms/__tests__/Toggle.test.js +87 -0
  181. package/dist/components/forms/__tests__/composite-inputs-a11y.test.js +69 -0
  182. package/dist/components/forms/__tests__/form-group-input.fixture.svelte +16 -0
  183. package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts +9 -0
  184. package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts.map +1 -0
  185. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte +33 -0
  186. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts +12 -0
  187. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts.map +1 -0
  188. package/dist/components/forms/__tests__/rich-inputs-a11y.test.js +87 -0
  189. package/dist/components/forms/index.d.ts +25 -0
  190. package/dist/components/forms/index.d.ts.map +1 -0
  191. package/dist/components/forms/index.js +25 -0
  192. package/dist/components/forms/types.d.ts +33 -0
  193. package/dist/components/forms/types.d.ts.map +1 -0
  194. package/dist/components/forms/types.js +4 -0
  195. package/dist/components/module/ModulePanel.svelte +134 -0
  196. package/dist/components/module/ModulePanel.svelte.d.ts +22 -0
  197. package/dist/components/module/ModulePanel.svelte.d.ts.map +1 -0
  198. package/dist/components/module/index.d.ts +5 -0
  199. package/dist/components/module/index.d.ts.map +1 -0
  200. package/dist/components/module/index.js +4 -0
  201. package/dist/components/workspace/Breadcrumbs.svelte +141 -0
  202. package/dist/components/workspace/Breadcrumbs.svelte.d.ts +21 -0
  203. package/dist/components/workspace/Breadcrumbs.svelte.d.ts.map +1 -0
  204. package/dist/components/workspace/NavTree.svelte +354 -0
  205. package/dist/components/workspace/NavTree.svelte.d.ts +45 -0
  206. package/dist/components/workspace/NavTree.svelte.d.ts.map +1 -0
  207. package/dist/components/workspace/README.md +34 -0
  208. package/dist/components/workspace/RoleShell.svelte +309 -0
  209. package/dist/components/workspace/RoleShell.svelte.d.ts +91 -0
  210. package/dist/components/workspace/RoleShell.svelte.d.ts.map +1 -0
  211. package/dist/components/workspace/WorkspaceShell.svelte +951 -0
  212. package/dist/components/workspace/WorkspaceShell.svelte.d.ts +112 -0
  213. package/dist/components/workspace/WorkspaceShell.svelte.d.ts.map +1 -0
  214. package/dist/components/workspace/__tests__/RoleShell.test.js +772 -0
  215. package/dist/components/workspace/__tests__/WorkspaceShell.test.js +630 -0
  216. package/dist/components/workspace/__tests__/breadcrumbs-helpers.test.js +141 -0
  217. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte +45 -0
  218. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts +21 -0
  219. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts.map +1 -0
  220. package/dist/components/workspace/__tests__/define-tools-dock.test.js +1010 -0
  221. package/dist/components/workspace/__tests__/harness.svelte +25 -0
  222. package/dist/components/workspace/__tests__/harness.svelte.d.ts +14 -0
  223. package/dist/components/workspace/__tests__/harness.svelte.d.ts.map +1 -0
  224. package/dist/components/workspace/__tests__/index.test.js +37 -0
  225. package/dist/components/workspace/__tests__/manifest-nav-helpers.test.js +24 -0
  226. package/dist/components/workspace/__tests__/manifest-nav.test.js +599 -0
  227. package/dist/components/workspace/__tests__/nav-helpers.test.js +95 -0
  228. package/dist/components/workspace/__tests__/render-harness.svelte +66 -0
  229. package/dist/components/workspace/__tests__/render-harness.svelte.d.ts +32 -0
  230. package/dist/components/workspace/__tests__/render-harness.svelte.d.ts.map +1 -0
  231. package/dist/components/workspace/__tests__/render-tools-dock.test.js +243 -0
  232. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte +58 -0
  233. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts +16 -0
  234. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts.map +1 -0
  235. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte +41 -0
  236. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts +13 -0
  237. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts.map +1 -0
  238. package/dist/components/workspace/__tests__/test-icon.svelte +17 -0
  239. package/dist/components/workspace/__tests__/test-icon.svelte.d.ts +19 -0
  240. package/dist/components/workspace/__tests__/test-icon.svelte.d.ts.map +1 -0
  241. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte +38 -0
  242. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts +22 -0
  243. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts.map +1 -0
  244. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts +65 -0
  245. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts.map +1 -0
  246. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.js +115 -0
  247. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts +15 -0
  248. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts.map +1 -0
  249. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.js +7 -0
  250. package/dist/components/workspace/__tests__/typed-tool-fixture.test.js +115 -0
  251. package/dist/components/workspace/__tests__/use-harness-orphan.svelte +9 -0
  252. package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts +19 -0
  253. package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts.map +1 -0
  254. package/dist/components/workspace/__tests__/use-harness.svelte +23 -0
  255. package/dist/components/workspace/__tests__/use-harness.svelte.d.ts +8 -0
  256. package/dist/components/workspace/__tests__/use-harness.svelte.d.ts.map +1 -0
  257. package/dist/components/workspace/__tests__/use-tools-dock.test.js +33 -0
  258. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte +43 -0
  259. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts +11 -0
  260. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts.map +1 -0
  261. package/dist/components/workspace/breadcrumbs-helpers.d.ts +44 -0
  262. package/dist/components/workspace/breadcrumbs-helpers.d.ts.map +1 -0
  263. package/dist/components/workspace/breadcrumbs-helpers.js +88 -0
  264. package/dist/components/workspace/index.d.ts +16 -0
  265. package/dist/components/workspace/index.d.ts.map +1 -0
  266. package/dist/components/workspace/index.js +14 -0
  267. package/dist/components/workspace/manifest-nav.d.ts +200 -0
  268. package/dist/components/workspace/manifest-nav.d.ts.map +1 -0
  269. package/dist/components/workspace/manifest-nav.js +408 -0
  270. package/dist/components/workspace/nav-helpers.d.ts +36 -0
  271. package/dist/components/workspace/nav-helpers.d.ts.map +1 -0
  272. package/dist/components/workspace/nav-helpers.js +60 -0
  273. package/dist/components/workspace/server/__tests__/compose-availability.test.js +383 -0
  274. package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts +78 -0
  275. package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts.map +1 -0
  276. package/dist/components/workspace/server/__tests__/typed-context-fixture.js +104 -0
  277. package/dist/components/workspace/server/compose-availability.d.ts +73 -0
  278. package/dist/components/workspace/server/compose-availability.d.ts.map +1 -0
  279. package/dist/components/workspace/server/compose-availability.js +114 -0
  280. package/dist/components/workspace/server/index.d.ts +13 -0
  281. package/dist/components/workspace/server/index.d.ts.map +1 -0
  282. package/dist/components/workspace/server/index.js +11 -0
  283. package/dist/components/workspace/server/types.d.ts +108 -0
  284. package/dist/components/workspace/server/types.d.ts.map +1 -0
  285. package/dist/components/workspace/server/types.js +11 -0
  286. package/dist/components/workspace/tools-dock/ToolsDock.svelte +565 -0
  287. package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts +14 -0
  288. package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts.map +1 -0
  289. package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts +143 -0
  290. package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts.map +1 -0
  291. package/dist/components/workspace/tools-dock/define-tools-dock.svelte.js +487 -0
  292. package/dist/components/workspace/tools-dock/use-tools-dock.d.ts +41 -0
  293. package/dist/components/workspace/tools-dock/use-tools-dock.d.ts.map +1 -0
  294. package/dist/components/workspace/tools-dock/use-tools-dock.js +50 -0
  295. package/dist/components/workspace/types.d.ts +372 -0
  296. package/dist/components/workspace/types.d.ts.map +1 -0
  297. package/dist/components/workspace/types.js +6 -0
  298. package/dist/hooks/index.d.ts +11 -0
  299. package/dist/hooks/index.d.ts.map +1 -0
  300. package/dist/hooks/index.js +10 -0
  301. package/dist/hooks/useAppState.svelte.d.ts +46 -0
  302. package/dist/hooks/useAppState.svelte.d.ts.map +1 -0
  303. package/dist/hooks/useAppState.svelte.js +59 -0
  304. package/dist/hooks/useAuth.svelte.d.ts +41 -0
  305. package/dist/hooks/useAuth.svelte.d.ts.map +1 -0
  306. package/dist/hooks/useAuth.svelte.js +43 -0
  307. package/dist/hooks/useLLM.svelte.d.ts +69 -0
  308. package/dist/hooks/useLLM.svelte.d.ts.map +1 -0
  309. package/dist/hooks/useLLM.svelte.js +85 -0
  310. package/dist/hooks/useSTT.svelte.d.ts +68 -0
  311. package/dist/hooks/useSTT.svelte.d.ts.map +1 -0
  312. package/dist/hooks/useSTT.svelte.js +97 -0
  313. package/dist/hooks/useSocket.svelte.d.ts +45 -0
  314. package/dist/hooks/useSocket.svelte.d.ts.map +1 -0
  315. package/dist/hooks/useSocket.svelte.js +54 -0
  316. package/dist/hooks/useTTS.svelte.d.ts +65 -0
  317. package/dist/hooks/useTTS.svelte.d.ts.map +1 -0
  318. package/dist/hooks/useTTS.svelte.js +93 -0
  319. package/dist/hooks/useTheme.d.ts +13 -0
  320. package/dist/hooks/useTheme.d.ts.map +1 -0
  321. package/dist/hooks/useTheme.js +16 -0
  322. package/dist/i18n/__tests__/server.spec.js +50 -0
  323. package/dist/i18n/server.d.ts +47 -0
  324. package/dist/i18n/server.d.ts.map +1 -0
  325. package/dist/i18n/server.js +58 -0
  326. package/dist/i18n/strings.forms.d.ts +33 -0
  327. package/dist/i18n/strings.forms.d.ts.map +1 -0
  328. package/dist/i18n/strings.forms.js +54 -0
  329. package/dist/i18n/strings.workspace.d.ts +34 -0
  330. package/dist/i18n/strings.workspace.d.ts.map +1 -0
  331. package/dist/i18n/strings.workspace.js +40 -0
  332. package/dist/index.d.ts +18 -0
  333. package/dist/index.d.ts.map +1 -0
  334. package/dist/index.js +23 -0
  335. package/dist/state/__tests__/warm-clients.test.js +40 -0
  336. package/dist/state/app-state.d.ts +308 -0
  337. package/dist/state/app-state.d.ts.map +1 -0
  338. package/dist/state/app-state.js +64 -0
  339. package/dist/state/app-state.svelte.d.ts +196 -0
  340. package/dist/state/app-state.svelte.d.ts.map +1 -0
  341. package/dist/state/app-state.svelte.js +774 -0
  342. package/dist/state/context.d.ts +23 -0
  343. package/dist/state/context.d.ts.map +1 -0
  344. package/dist/state/context.js +32 -0
  345. package/dist/state/form-context.d.ts +59 -0
  346. package/dist/state/form-context.d.ts.map +1 -0
  347. package/dist/state/form-context.js +31 -0
  348. package/dist/state/form-group-context.d.ts +13 -0
  349. package/dist/state/form-group-context.d.ts.map +1 -0
  350. package/dist/state/form-group-context.js +28 -0
  351. package/dist/state/index.d.ts +9 -0
  352. package/dist/state/index.d.ts.map +1 -0
  353. package/dist/state/index.js +8 -0
  354. package/dist/state/warm-clients.d.ts +136 -0
  355. package/dist/state/warm-clients.d.ts.map +1 -0
  356. package/dist/state/warm-clients.js +231 -0
  357. package/package.json +137 -0
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)