@qwickapps/server 1.7.0 → 1.7.2

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 (335) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +13 -116
  3. package/dist/src/core/control-panel.d.ts.map +1 -1
  4. package/dist/src/core/control-panel.js +6 -4
  5. package/dist/src/core/control-panel.js.map +1 -1
  6. package/dist/src/core/gateway.d.ts.map +1 -1
  7. package/dist/src/core/gateway.js +24 -2
  8. package/dist/src/core/gateway.js.map +1 -1
  9. package/dist/src/core/plugin-registry.d.ts +15 -2
  10. package/dist/src/core/plugin-registry.d.ts.map +1 -1
  11. package/dist/src/core/plugin-registry.js.map +1 -1
  12. package/dist/src/index.d.ts +2 -2
  13. package/dist/src/index.d.ts.map +1 -1
  14. package/dist/src/index.js +9 -3
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/plugins/api-keys/api-keys-plugin.d.ts +5 -2
  17. package/dist/src/plugins/api-keys/api-keys-plugin.d.ts.map +1 -1
  18. package/dist/src/plugins/api-keys/api-keys-plugin.js +61 -19
  19. package/dist/src/plugins/api-keys/api-keys-plugin.js.map +1 -1
  20. package/dist/src/plugins/api-keys/index.d.ts +0 -4
  21. package/dist/src/plugins/api-keys/index.d.ts.map +1 -1
  22. package/dist/src/plugins/api-keys/index.js +2 -3
  23. package/dist/src/plugins/api-keys/index.js.map +1 -1
  24. package/dist/src/plugins/api-keys/stores/postgres-store.d.ts.map +1 -1
  25. package/dist/src/plugins/api-keys/stores/postgres-store.js +29 -0
  26. package/dist/src/plugins/api-keys/stores/postgres-store.js.map +1 -1
  27. package/dist/src/plugins/api-keys/types.d.ts +9 -3
  28. package/dist/src/plugins/api-keys/types.d.ts.map +1 -1
  29. package/dist/src/plugins/api-keys/types.js.map +1 -1
  30. package/dist/src/plugins/auth/auth-plugin.d.ts.map +1 -1
  31. package/dist/src/plugins/auth/auth-plugin.js +4 -2
  32. package/dist/src/plugins/auth/auth-plugin.js.map +1 -1
  33. package/dist/src/plugins/auth/env-config.d.ts.map +1 -1
  34. package/dist/src/plugins/auth/env-config.js +1 -0
  35. package/dist/src/plugins/auth/env-config.js.map +1 -1
  36. package/dist/src/plugins/auth/index.d.ts +0 -4
  37. package/dist/src/plugins/auth/index.d.ts.map +1 -1
  38. package/dist/src/plugins/auth/index.js +2 -3
  39. package/dist/src/plugins/auth/index.js.map +1 -1
  40. package/dist/src/plugins/bans/bans-plugin.d.ts +5 -2
  41. package/dist/src/plugins/bans/bans-plugin.d.ts.map +1 -1
  42. package/dist/src/plugins/bans/bans-plugin.js +71 -25
  43. package/dist/src/plugins/bans/bans-plugin.js.map +1 -1
  44. package/dist/src/plugins/bans/index.d.ts +1 -5
  45. package/dist/src/plugins/bans/index.d.ts.map +1 -1
  46. package/dist/src/plugins/bans/index.js +3 -4
  47. package/dist/src/plugins/bans/index.js.map +1 -1
  48. package/dist/src/plugins/bans/stores/in-memory-store.d.ts +34 -0
  49. package/dist/src/plugins/bans/stores/in-memory-store.d.ts.map +1 -0
  50. package/dist/src/plugins/bans/stores/in-memory-store.js +97 -0
  51. package/dist/src/plugins/bans/stores/in-memory-store.js.map +1 -0
  52. package/dist/src/plugins/bans/stores/index.d.ts +1 -0
  53. package/dist/src/plugins/bans/stores/index.d.ts.map +1 -1
  54. package/dist/src/plugins/bans/stores/index.js +1 -0
  55. package/dist/src/plugins/bans/stores/index.js.map +1 -1
  56. package/dist/src/plugins/bans/types.d.ts +13 -6
  57. package/dist/src/plugins/bans/types.d.ts.map +1 -1
  58. package/dist/src/plugins/cache-plugin.d.ts +35 -16
  59. package/dist/src/plugins/cache-plugin.d.ts.map +1 -1
  60. package/dist/src/plugins/cache-plugin.js +299 -20
  61. package/dist/src/plugins/cache-plugin.js.map +1 -1
  62. package/dist/src/plugins/cms/cms-plugin.d.ts.map +1 -1
  63. package/dist/src/plugins/cms/cms-plugin.js +3 -1
  64. package/dist/src/plugins/cms/cms-plugin.js.map +1 -1
  65. package/dist/src/plugins/devices/devices-plugin.d.ts +5 -2
  66. package/dist/src/plugins/devices/devices-plugin.d.ts.map +1 -1
  67. package/dist/src/plugins/devices/devices-plugin.js +62 -26
  68. package/dist/src/plugins/devices/devices-plugin.js.map +1 -1
  69. package/dist/src/plugins/devices/index.d.ts +0 -4
  70. package/dist/src/plugins/devices/index.d.ts.map +1 -1
  71. package/dist/src/plugins/devices/index.js +2 -3
  72. package/dist/src/plugins/devices/index.js.map +1 -1
  73. package/dist/src/plugins/entitlements/entitlements-plugin.d.ts +5 -2
  74. package/dist/src/plugins/entitlements/entitlements-plugin.d.ts.map +1 -1
  75. package/dist/src/plugins/entitlements/entitlements-plugin.js +78 -41
  76. package/dist/src/plugins/entitlements/entitlements-plugin.js.map +1 -1
  77. package/dist/src/plugins/entitlements/index.d.ts +1 -5
  78. package/dist/src/plugins/entitlements/index.d.ts.map +1 -1
  79. package/dist/src/plugins/entitlements/index.js +3 -4
  80. package/dist/src/plugins/entitlements/index.js.map +1 -1
  81. package/dist/src/plugins/entitlements/sources/in-memory-source.d.ts +9 -0
  82. package/dist/src/plugins/entitlements/sources/in-memory-source.d.ts.map +1 -0
  83. package/dist/src/plugins/entitlements/sources/in-memory-source.js +65 -0
  84. package/dist/src/plugins/entitlements/sources/in-memory-source.js.map +1 -0
  85. package/dist/src/plugins/entitlements/sources/index.d.ts +1 -0
  86. package/dist/src/plugins/entitlements/sources/index.d.ts.map +1 -1
  87. package/dist/src/plugins/entitlements/sources/index.js +1 -0
  88. package/dist/src/plugins/entitlements/sources/index.js.map +1 -1
  89. package/dist/src/plugins/entitlements/types.d.ts +9 -2
  90. package/dist/src/plugins/entitlements/types.d.ts.map +1 -1
  91. package/dist/src/plugins/health-plugin.d.ts.map +1 -1
  92. package/dist/src/plugins/health-plugin.js +1 -0
  93. package/dist/src/plugins/health-plugin.js.map +1 -1
  94. package/dist/src/plugins/index.d.ts +4 -4
  95. package/dist/src/plugins/index.d.ts.map +1 -1
  96. package/dist/src/plugins/index.js +4 -4
  97. package/dist/src/plugins/index.js.map +1 -1
  98. package/dist/src/plugins/logs-plugin.d.ts.map +1 -1
  99. package/dist/src/plugins/logs-plugin.js +49 -1
  100. package/dist/src/plugins/logs-plugin.js.map +1 -1
  101. package/dist/src/plugins/maintenance-plugin.d.ts.map +1 -1
  102. package/dist/src/plugins/maintenance-plugin.js +39 -0
  103. package/dist/src/plugins/maintenance-plugin.js.map +1 -1
  104. package/dist/src/plugins/notifications/index.d.ts +0 -4
  105. package/dist/src/plugins/notifications/index.d.ts.map +1 -1
  106. package/dist/src/plugins/notifications/index.js +2 -3
  107. package/dist/src/plugins/notifications/index.js.map +1 -1
  108. package/dist/src/plugins/notifications/notifications-plugin.d.ts +5 -2
  109. package/dist/src/plugins/notifications/notifications-plugin.d.ts.map +1 -1
  110. package/dist/src/plugins/notifications/notifications-plugin.js +46 -13
  111. package/dist/src/plugins/notifications/notifications-plugin.js.map +1 -1
  112. package/dist/src/plugins/parental/index.d.ts +0 -4
  113. package/dist/src/plugins/parental/index.d.ts.map +1 -1
  114. package/dist/src/plugins/parental/index.js +2 -3
  115. package/dist/src/plugins/parental/index.js.map +1 -1
  116. package/dist/src/plugins/parental/parental-plugin.d.ts +5 -2
  117. package/dist/src/plugins/parental/parental-plugin.d.ts.map +1 -1
  118. package/dist/src/plugins/parental/parental-plugin.js +60 -24
  119. package/dist/src/plugins/parental/parental-plugin.js.map +1 -1
  120. package/dist/src/plugins/postgres-plugin.d.ts +3 -1
  121. package/dist/src/plugins/postgres-plugin.d.ts.map +1 -1
  122. package/dist/src/plugins/postgres-plugin.js +18 -8
  123. package/dist/src/plugins/postgres-plugin.js.map +1 -1
  124. package/dist/src/plugins/preferences/index.d.ts +0 -4
  125. package/dist/src/plugins/preferences/index.d.ts.map +1 -1
  126. package/dist/src/plugins/preferences/index.js +2 -3
  127. package/dist/src/plugins/preferences/index.js.map +1 -1
  128. package/dist/src/plugins/preferences/preferences-plugin.d.ts +5 -2
  129. package/dist/src/plugins/preferences/preferences-plugin.d.ts.map +1 -1
  130. package/dist/src/plugins/preferences/preferences-plugin.js +63 -19
  131. package/dist/src/plugins/preferences/preferences-plugin.js.map +1 -1
  132. package/dist/src/plugins/profiles/index.d.ts +0 -4
  133. package/dist/src/plugins/profiles/index.d.ts.map +1 -1
  134. package/dist/src/plugins/profiles/index.js +2 -3
  135. package/dist/src/plugins/profiles/index.js.map +1 -1
  136. package/dist/src/plugins/profiles/profiles-plugin.d.ts +5 -2
  137. package/dist/src/plugins/profiles/profiles-plugin.d.ts.map +1 -1
  138. package/dist/src/plugins/profiles/profiles-plugin.js +60 -26
  139. package/dist/src/plugins/profiles/profiles-plugin.js.map +1 -1
  140. package/dist/src/plugins/profiles/types.d.ts +9 -2
  141. package/dist/src/plugins/profiles/types.d.ts.map +1 -1
  142. package/dist/src/plugins/qwickbrain/index.d.ts +0 -4
  143. package/dist/src/plugins/qwickbrain/index.d.ts.map +1 -1
  144. package/dist/src/plugins/qwickbrain/index.js +2 -3
  145. package/dist/src/plugins/qwickbrain/index.js.map +1 -1
  146. package/dist/src/plugins/qwickbrain/qwickbrain-plugin.d.ts.map +1 -1
  147. package/dist/src/plugins/qwickbrain/qwickbrain-plugin.js +117 -0
  148. package/dist/src/plugins/qwickbrain/qwickbrain-plugin.js.map +1 -1
  149. package/dist/src/plugins/rate-limit/index.d.ts +0 -4
  150. package/dist/src/plugins/rate-limit/index.d.ts.map +1 -1
  151. package/dist/src/plugins/rate-limit/index.js +2 -3
  152. package/dist/src/plugins/rate-limit/index.js.map +1 -1
  153. package/dist/src/plugins/subscriptions/index.d.ts +0 -4
  154. package/dist/src/plugins/subscriptions/index.d.ts.map +1 -1
  155. package/dist/src/plugins/subscriptions/index.js +2 -3
  156. package/dist/src/plugins/subscriptions/index.js.map +1 -1
  157. package/dist/src/plugins/subscriptions/subscriptions-plugin.d.ts +5 -2
  158. package/dist/src/plugins/subscriptions/subscriptions-plugin.d.ts.map +1 -1
  159. package/dist/src/plugins/subscriptions/subscriptions-plugin.js +63 -29
  160. package/dist/src/plugins/subscriptions/subscriptions-plugin.js.map +1 -1
  161. package/dist/src/plugins/subscriptions/types.d.ts +8 -2
  162. package/dist/src/plugins/subscriptions/types.d.ts.map +1 -1
  163. package/dist/src/plugins/tenants/index.d.ts +1 -1
  164. package/dist/src/plugins/tenants/index.d.ts.map +1 -1
  165. package/dist/src/plugins/tenants/index.js +1 -1
  166. package/dist/src/plugins/tenants/index.js.map +1 -1
  167. package/dist/src/plugins/tenants/stores/in-memory-store.d.ts +59 -0
  168. package/dist/src/plugins/tenants/stores/in-memory-store.d.ts.map +1 -0
  169. package/dist/src/plugins/tenants/stores/in-memory-store.js +257 -0
  170. package/dist/src/plugins/tenants/stores/in-memory-store.js.map +1 -0
  171. package/dist/src/plugins/tenants/stores/index.d.ts +8 -0
  172. package/dist/src/plugins/tenants/stores/index.d.ts.map +1 -0
  173. package/dist/src/plugins/tenants/stores/index.js +8 -0
  174. package/dist/src/plugins/tenants/stores/index.js.map +1 -0
  175. package/dist/src/plugins/tenants/tenants-plugin.d.ts +5 -2
  176. package/dist/src/plugins/tenants/tenants-plugin.d.ts.map +1 -1
  177. package/dist/src/plugins/tenants/tenants-plugin.js +93 -60
  178. package/dist/src/plugins/tenants/tenants-plugin.js.map +1 -1
  179. package/dist/src/plugins/tenants/types.d.ts +8 -2
  180. package/dist/src/plugins/tenants/types.d.ts.map +1 -1
  181. package/dist/src/plugins/usage/index.d.ts +0 -4
  182. package/dist/src/plugins/usage/index.d.ts.map +1 -1
  183. package/dist/src/plugins/usage/index.js +2 -3
  184. package/dist/src/plugins/usage/index.js.map +1 -1
  185. package/dist/src/plugins/usage/usage-plugin.d.ts +5 -2
  186. package/dist/src/plugins/usage/usage-plugin.d.ts.map +1 -1
  187. package/dist/src/plugins/usage/usage-plugin.js +57 -23
  188. package/dist/src/plugins/usage/usage-plugin.js.map +1 -1
  189. package/dist/src/plugins/users/index.d.ts +1 -1
  190. package/dist/src/plugins/users/index.d.ts.map +1 -1
  191. package/dist/src/plugins/users/index.js +1 -1
  192. package/dist/src/plugins/users/index.js.map +1 -1
  193. package/dist/src/plugins/users/stores/in-memory-store.d.ts +36 -0
  194. package/dist/src/plugins/users/stores/in-memory-store.d.ts.map +1 -0
  195. package/dist/src/plugins/users/stores/in-memory-store.js +122 -0
  196. package/dist/src/plugins/users/stores/in-memory-store.js.map +1 -0
  197. package/dist/src/plugins/users/stores/index.d.ts +1 -0
  198. package/dist/src/plugins/users/stores/index.d.ts.map +1 -1
  199. package/dist/src/plugins/users/stores/index.js +1 -0
  200. package/dist/src/plugins/users/stores/index.js.map +1 -1
  201. package/dist/src/plugins/users/types.d.ts +7 -2
  202. package/dist/src/plugins/users/types.d.ts.map +1 -1
  203. package/dist/src/plugins/users/users-plugin.d.ts +5 -2
  204. package/dist/src/plugins/users/users-plugin.d.ts.map +1 -1
  205. package/dist/src/plugins/users/users-plugin.js +56 -23
  206. package/dist/src/plugins/users/users-plugin.js.map +1 -1
  207. package/dist/ui/src/api/controlPanelApi.d.ts +10 -1
  208. package/dist/ui/src/api/controlPanelApi.d.ts.map +1 -1
  209. package/dist/ui/src/api/controlPanelApi.js.map +1 -1
  210. package/dist/ui/src/dashboard/PluginWidgetRenderer.d.ts +3 -1
  211. package/dist/ui/src/dashboard/PluginWidgetRenderer.d.ts.map +1 -1
  212. package/dist/ui/src/dashboard/PluginWidgetRenderer.js +5 -1
  213. package/dist/ui/src/dashboard/PluginWidgetRenderer.js.map +1 -1
  214. package/dist/ui/src/dashboard/builtInWidgets.d.ts.map +1 -1
  215. package/dist/ui/src/dashboard/builtInWidgets.js +13 -1
  216. package/dist/ui/src/dashboard/builtInWidgets.js.map +1 -1
  217. package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.d.ts +11 -0
  218. package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.d.ts.map +1 -0
  219. package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.js +77 -0
  220. package/dist/ui/src/dashboard/widgets/CacheMaintenanceWidget.js.map +1 -0
  221. package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.d.ts +10 -0
  222. package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.d.ts.map +1 -0
  223. package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.js +14 -0
  224. package/dist/ui/src/dashboard/widgets/DatabaseOpsWidget.js.map +1 -0
  225. package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.d.ts +10 -0
  226. package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.d.ts.map +1 -0
  227. package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.js +14 -0
  228. package/dist/ui/src/dashboard/widgets/EnvironmentConfigWidget.js.map +1 -0
  229. package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.d.ts +11 -0
  230. package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.d.ts.map +1 -0
  231. package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.js +96 -0
  232. package/dist/ui/src/dashboard/widgets/LogsMaintenanceWidget.js.map +1 -0
  233. package/dist/ui/src/dashboard/widgets/SeedManagementWidget.d.ts +10 -0
  234. package/dist/ui/src/dashboard/widgets/SeedManagementWidget.d.ts.map +1 -0
  235. package/dist/ui/src/dashboard/widgets/SeedManagementWidget.js +55 -0
  236. package/dist/ui/src/dashboard/widgets/SeedManagementWidget.js.map +1 -0
  237. package/dist/ui/src/dashboard/widgets/ServiceControlWidget.d.ts +10 -0
  238. package/dist/ui/src/dashboard/widgets/ServiceControlWidget.d.ts.map +1 -0
  239. package/dist/ui/src/dashboard/widgets/ServiceControlWidget.js +14 -0
  240. package/dist/ui/src/dashboard/widgets/ServiceControlWidget.js.map +1 -0
  241. package/dist/ui/src/dashboard/widgets/index.d.ts +6 -0
  242. package/dist/ui/src/dashboard/widgets/index.d.ts.map +1 -1
  243. package/dist/ui/src/dashboard/widgets/index.js +6 -0
  244. package/dist/ui/src/dashboard/widgets/index.js.map +1 -1
  245. package/dist/ui/src/pages/DashboardPage.js +1 -1
  246. package/dist/ui/src/pages/DashboardPage.js.map +1 -1
  247. package/dist-ui/assets/index-0gzisPdy.js +528 -0
  248. package/dist-ui/assets/{index-lm1yX6UD.js.map → index-0gzisPdy.js.map} +1 -1
  249. package/dist-ui/index.html +1 -1
  250. package/dist-ui-lib/index.js +3109 -2774
  251. package/dist-ui-lib/index.js.map +1 -1
  252. package/dist-ui-lib/src/api/controlPanelApi.d.ts +10 -1
  253. package/dist-ui-lib/src/dashboard/PluginWidgetRenderer.d.ts +3 -1
  254. package/dist-ui-lib/src/dashboard/widgets/CacheMaintenanceWidget.d.ts +10 -0
  255. package/dist-ui-lib/src/dashboard/widgets/DatabaseOpsWidget.d.ts +9 -0
  256. package/dist-ui-lib/src/dashboard/widgets/EnvironmentConfigWidget.d.ts +9 -0
  257. package/dist-ui-lib/src/dashboard/widgets/LogsMaintenanceWidget.d.ts +10 -0
  258. package/dist-ui-lib/src/dashboard/widgets/SeedManagementWidget.d.ts +9 -0
  259. package/dist-ui-lib/src/dashboard/widgets/ServiceControlWidget.d.ts +9 -0
  260. package/dist-ui-lib/src/dashboard/widgets/index.d.ts +6 -0
  261. package/package.json +12 -6
  262. package/src/core/control-panel.ts +6 -4
  263. package/src/core/gateway.ts +25 -2
  264. package/src/core/plugin-registry.ts +15 -2
  265. package/src/index.ts +53 -0
  266. package/src/plugins/api-keys/api-keys-plugin.ts +64 -20
  267. package/src/plugins/api-keys/index.ts +2 -5
  268. package/src/plugins/api-keys/stores/postgres-store.ts +30 -0
  269. package/src/plugins/api-keys/types.ts +9 -3
  270. package/src/plugins/auth/auth-plugin.ts +4 -2
  271. package/src/plugins/auth/env-config.ts +1 -0
  272. package/src/plugins/auth/index.ts +3 -5
  273. package/src/plugins/bans/bans-plugin.ts +71 -26
  274. package/src/plugins/bans/index.ts +4 -6
  275. package/src/plugins/bans/stores/in-memory-store.ts +106 -0
  276. package/src/plugins/bans/stores/index.ts +1 -0
  277. package/src/plugins/bans/types.ts +13 -6
  278. package/src/plugins/cache-plugin.test.ts +2 -2
  279. package/src/plugins/cache-plugin.ts +331 -30
  280. package/src/plugins/cms/cms-plugin.ts +3 -1
  281. package/src/plugins/devices/devices-plugin.ts +62 -27
  282. package/src/plugins/devices/index.ts +3 -5
  283. package/src/plugins/entitlements/entitlements-plugin.ts +81 -43
  284. package/src/plugins/entitlements/index.ts +4 -6
  285. package/src/plugins/entitlements/sources/in-memory-source.ts +76 -0
  286. package/src/plugins/entitlements/sources/index.ts +1 -0
  287. package/src/plugins/entitlements/types.ts +9 -2
  288. package/src/plugins/health-plugin.ts +1 -0
  289. package/src/plugins/index.ts +4 -1
  290. package/src/plugins/logs-plugin.ts +55 -1
  291. package/src/plugins/maintenance-plugin.ts +43 -0
  292. package/src/plugins/notifications/index.ts +3 -5
  293. package/src/plugins/notifications/notifications-plugin.ts +49 -19
  294. package/src/plugins/parental/index.ts +3 -5
  295. package/src/plugins/parental/parental-plugin.ts +63 -25
  296. package/src/plugins/postgres-plugin.test.ts +2 -2
  297. package/src/plugins/postgres-plugin.ts +20 -9
  298. package/src/plugins/preferences/index.ts +3 -5
  299. package/src/plugins/preferences/preferences-plugin.ts +66 -20
  300. package/src/plugins/profiles/index.ts +3 -5
  301. package/src/plugins/profiles/profiles-plugin.ts +60 -27
  302. package/src/plugins/profiles/types.ts +9 -2
  303. package/src/plugins/qwickbrain/index.ts +3 -5
  304. package/src/plugins/qwickbrain/qwickbrain-plugin.ts +135 -0
  305. package/src/plugins/rate-limit/index.ts +3 -5
  306. package/src/plugins/subscriptions/index.ts +3 -5
  307. package/src/plugins/subscriptions/subscriptions-plugin.ts +63 -30
  308. package/src/plugins/subscriptions/types.ts +8 -2
  309. package/src/plugins/tenants/index.ts +1 -1
  310. package/src/plugins/tenants/stores/in-memory-store.ts +335 -0
  311. package/src/plugins/tenants/stores/index.ts +13 -0
  312. package/src/plugins/tenants/tenants-plugin.ts +97 -62
  313. package/src/plugins/tenants/types.ts +8 -2
  314. package/src/plugins/usage/index.ts +3 -5
  315. package/src/plugins/usage/usage-plugin.ts +60 -26
  316. package/src/plugins/users/index.ts +1 -1
  317. package/src/plugins/users/stores/in-memory-store.ts +140 -0
  318. package/src/plugins/users/stores/index.ts +1 -0
  319. package/src/plugins/users/types.ts +7 -2
  320. package/src/plugins/users/users-plugin.ts +56 -24
  321. package/src/testing/index.ts +1 -0
  322. package/src/testing/pg-mem-pool.ts +33 -0
  323. package/ui/src/api/controlPanelApi.ts +10 -1
  324. package/ui/src/dashboard/PluginWidgetRenderer.tsx +8 -0
  325. package/ui/src/dashboard/builtInWidgets.tsx +19 -1
  326. package/ui/src/dashboard/widgets/CacheMaintenanceWidget.tsx +195 -0
  327. package/ui/src/dashboard/widgets/DatabaseOpsWidget.tsx +29 -0
  328. package/ui/src/dashboard/widgets/EnvironmentConfigWidget.tsx +29 -0
  329. package/ui/src/dashboard/widgets/LogsMaintenanceWidget.tsx +247 -0
  330. package/ui/src/dashboard/widgets/SeedManagementWidget.tsx +128 -0
  331. package/ui/src/dashboard/widgets/ServiceControlWidget.tsx +29 -0
  332. package/ui/src/dashboard/widgets/index.ts +6 -0
  333. package/ui/src/pages/DashboardPage.tsx +2 -2
  334. package/ui/src/pages/MaintenancePage.tsx +1 -1
  335. package/dist-ui/assets/index-lm1yX6UD.js +0 -528
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Cache Maintenance Widget
3
+ *
4
+ * Provides cache management operations:
5
+ * - View cache statistics
6
+ * - Clear cache (flush all keys)
7
+ *
8
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
9
+ */
10
+
11
+ import { useState, useEffect } from 'react';
12
+ import {
13
+ Card,
14
+ CardContent,
15
+ Typography,
16
+ Button,
17
+ Alert,
18
+ Box,
19
+ Dialog,
20
+ DialogTitle,
21
+ DialogContent,
22
+ DialogContentText,
23
+ DialogActions,
24
+ CircularProgress,
25
+ Chip,
26
+ } from '@mui/material';
27
+ import DeleteIcon from '@mui/icons-material/Delete';
28
+ import RefreshIcon from '@mui/icons-material/Refresh';
29
+ import CheckCircleIcon from '@mui/icons-material/CheckCircle';
30
+ import ErrorIcon from '@mui/icons-material/Error';
31
+
32
+ interface CacheStats {
33
+ connected: boolean;
34
+ keyCount: number;
35
+ usedMemory?: string;
36
+ }
37
+
38
+ export function CacheMaintenanceWidget() {
39
+ const [stats, setStats] = useState<CacheStats | null>(null);
40
+ const [loading, setLoading] = useState(true);
41
+ const [flushing, setFlushing] = useState(false);
42
+ const [error, setError] = useState<string | null>(null);
43
+ const [success, setSuccess] = useState<string | null>(null);
44
+ const [confirmOpen, setConfirmOpen] = useState(false);
45
+
46
+ const fetchStats = async () => {
47
+ setLoading(true);
48
+ setError(null);
49
+ try {
50
+ const response = await fetch('/api/cache:default/stats');
51
+ if (!response.ok) {
52
+ if (response.status === 404) {
53
+ throw new Error('Cache plugin not configured');
54
+ }
55
+ throw new Error('Failed to fetch cache stats');
56
+ }
57
+ const data = await response.json();
58
+ setStats(data);
59
+ } catch (err) {
60
+ setError(err instanceof Error ? err.message : 'Failed to fetch cache stats');
61
+ setStats(null);
62
+ } finally {
63
+ setLoading(false);
64
+ }
65
+ };
66
+
67
+ useEffect(() => {
68
+ fetchStats();
69
+ }, []);
70
+
71
+ const handleFlushCache = async () => {
72
+ setConfirmOpen(false);
73
+ setFlushing(true);
74
+ setError(null);
75
+ setSuccess(null);
76
+
77
+ try {
78
+ const response = await fetch('/api/cache:default/flush', {
79
+ method: 'POST',
80
+ headers: { 'Content-Type': 'application/json' },
81
+ });
82
+
83
+ if (!response.ok) {
84
+ const data = await response.json();
85
+ throw new Error(data.error || 'Failed to flush cache');
86
+ }
87
+
88
+ const data = await response.json();
89
+ setSuccess(
90
+ data.message + (data.deletedCount !== undefined ? ` (${data.deletedCount} keys deleted)` : '')
91
+ );
92
+
93
+ // Refresh stats
94
+ await fetchStats();
95
+ } catch (err) {
96
+ setError(err instanceof Error ? err.message : 'Failed to flush cache');
97
+ } finally {
98
+ setFlushing(false);
99
+ }
100
+ };
101
+
102
+ return (
103
+ <Card>
104
+ <CardContent>
105
+ <Typography variant="h6" gutterBottom>
106
+ Cache Management
107
+ </Typography>
108
+ <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
109
+ View cache statistics and clear cache
110
+ </Typography>
111
+
112
+ {error && (
113
+ <Alert severity="error" sx={{ mb: 2 }} onClose={() => setError(null)}>
114
+ {error}
115
+ </Alert>
116
+ )}
117
+
118
+ {success && (
119
+ <Alert severity="success" sx={{ mb: 2 }} onClose={() => setSuccess(null)}>
120
+ {success}
121
+ </Alert>
122
+ )}
123
+
124
+ {loading ? (
125
+ <Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}>
126
+ <CircularProgress size={30} />
127
+ </Box>
128
+ ) : stats ? (
129
+ <Box sx={{ mb: 2 }}>
130
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>
131
+ <Typography variant="body2" color="text.secondary">
132
+ <strong>Status:</strong>
133
+ </Typography>
134
+ <Chip
135
+ size="small"
136
+ icon={stats.connected ? <CheckCircleIcon /> : <ErrorIcon />}
137
+ label={stats.connected ? 'Connected' : 'Disconnected'}
138
+ color={stats.connected ? 'success' : 'error'}
139
+ />
140
+ </Box>
141
+
142
+ <Typography variant="body2" color="text.secondary">
143
+ <strong>Key Count:</strong> {stats.keyCount.toLocaleString()}
144
+ </Typography>
145
+
146
+ {stats.usedMemory && (
147
+ <Typography variant="body2" color="text.secondary">
148
+ <strong>Memory Used:</strong> {stats.usedMemory}
149
+ </Typography>
150
+ )}
151
+ </Box>
152
+ ) : null}
153
+
154
+ <Box sx={{ display: 'flex', gap: 1 }}>
155
+ <Button
156
+ variant="outlined"
157
+ color="primary"
158
+ size="small"
159
+ startIcon={<RefreshIcon />}
160
+ onClick={fetchStats}
161
+ disabled={loading}
162
+ >
163
+ Refresh
164
+ </Button>
165
+ <Button
166
+ variant="contained"
167
+ color="error"
168
+ size="small"
169
+ startIcon={flushing ? <CircularProgress size={16} color="inherit" /> : <DeleteIcon />}
170
+ onClick={() => setConfirmOpen(true)}
171
+ disabled={!stats || !stats.connected || flushing || loading}
172
+ >
173
+ Flush Cache
174
+ </Button>
175
+ </Box>
176
+
177
+ <Dialog open={confirmOpen} onClose={() => setConfirmOpen(false)}>
178
+ <DialogTitle>Flush Cache</DialogTitle>
179
+ <DialogContent>
180
+ <DialogContentText>
181
+ Are you sure you want to flush the cache? This will delete{' '}
182
+ {stats?.keyCount.toLocaleString()} keys. This action cannot be undone.
183
+ </DialogContentText>
184
+ </DialogContent>
185
+ <DialogActions>
186
+ <Button onClick={() => setConfirmOpen(false)}>Cancel</Button>
187
+ <Button onClick={handleFlushCache} color="error" variant="contained">
188
+ Flush
189
+ </Button>
190
+ </DialogActions>
191
+ </Dialog>
192
+ </CardContent>
193
+ </Card>
194
+ );
195
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Database Operations Widget
3
+ *
4
+ * Provides database backup, restore, and maintenance operations.
5
+ * Part of the maintenance plugin.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { Card, CardContent, Typography, Alert } from '@mui/material';
11
+
12
+ export function DatabaseOpsWidget() {
13
+ return (
14
+ <Card>
15
+ <CardContent>
16
+ <Typography variant="h6" gutterBottom>
17
+ Database Operations
18
+ </Typography>
19
+ <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
20
+ Backup, restore, and maintain database
21
+ </Typography>
22
+
23
+ <Alert severity="info">
24
+ Database operations UI coming soon. This will allow you to backup and restore your database.
25
+ </Alert>
26
+ </CardContent>
27
+ </Card>
28
+ );
29
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Environment Configuration Widget
3
+ *
4
+ * Displays and allows editing environment variables.
5
+ * Part of the maintenance plugin.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { Card, CardContent, Typography, Alert } from '@mui/material';
11
+
12
+ export function EnvironmentConfigWidget() {
13
+ return (
14
+ <Card>
15
+ <CardContent>
16
+ <Typography variant="h6" gutterBottom>
17
+ Environment Configuration
18
+ </Typography>
19
+ <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
20
+ View and manage environment variables
21
+ </Typography>
22
+
23
+ <Alert severity="info">
24
+ Environment configuration UI coming soon. This will allow you to view and edit environment variables.
25
+ </Alert>
26
+ </CardContent>
27
+ </Card>
28
+ );
29
+ }
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Logs Maintenance Widget
3
+ *
4
+ * Provides log management operations:
5
+ * - View log statistics
6
+ * - Clear log files
7
+ *
8
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
9
+ */
10
+
11
+ import { useState, useEffect } from 'react';
12
+ import {
13
+ Card,
14
+ CardContent,
15
+ Typography,
16
+ Button,
17
+ Alert,
18
+ Box,
19
+ Select,
20
+ MenuItem,
21
+ FormControl,
22
+ InputLabel,
23
+ Dialog,
24
+ DialogTitle,
25
+ DialogContent,
26
+ DialogContentText,
27
+ DialogActions,
28
+ CircularProgress,
29
+ } from '@mui/material';
30
+ import DeleteIcon from '@mui/icons-material/Delete';
31
+ import RefreshIcon from '@mui/icons-material/Refresh';
32
+
33
+ interface LogSource {
34
+ name: string;
35
+ type: string;
36
+ }
37
+
38
+ interface LogStats {
39
+ totalLogs: number;
40
+ byLevel: {
41
+ debug: number;
42
+ info: number;
43
+ warn: number;
44
+ error: number;
45
+ };
46
+ fileSize: number;
47
+ fileSizeFormatted: string;
48
+ oldestLog: string | null;
49
+ newestLog: string | null;
50
+ }
51
+
52
+ export function LogsMaintenanceWidget() {
53
+ const [sources, setSources] = useState<LogSource[]>([]);
54
+ const [selectedSource, setSelectedSource] = useState<string>('');
55
+ const [stats, setStats] = useState<LogStats | null>(null);
56
+ const [loading, setLoading] = useState(true);
57
+ const [clearing, setClearing] = useState(false);
58
+ const [error, setError] = useState<string | null>(null);
59
+ const [success, setSuccess] = useState<string | null>(null);
60
+ const [confirmOpen, setConfirmOpen] = useState(false);
61
+
62
+ const fetchSources = async () => {
63
+ try {
64
+ const response = await fetch('/api/logs/sources');
65
+ if (!response.ok) throw new Error('Failed to fetch log sources');
66
+ const data = await response.json();
67
+ setSources(data.sources || []);
68
+ if (data.sources && data.sources.length > 0 && !selectedSource) {
69
+ setSelectedSource(data.sources[0].name);
70
+ }
71
+ } catch (err) {
72
+ setError(err instanceof Error ? err.message : 'Failed to fetch log sources');
73
+ }
74
+ };
75
+
76
+ const fetchStats = async () => {
77
+ if (!selectedSource) return;
78
+
79
+ setLoading(true);
80
+ setError(null);
81
+ try {
82
+ const response = await fetch(`/api/logs/stats?source=${selectedSource}`);
83
+ if (!response.ok) throw new Error('Failed to fetch log stats');
84
+ const data = await response.json();
85
+ setStats(data);
86
+ } catch (err) {
87
+ setError(err instanceof Error ? err.message : 'Failed to fetch log stats');
88
+ setStats(null);
89
+ } finally {
90
+ setLoading(false);
91
+ }
92
+ };
93
+
94
+ useEffect(() => {
95
+ fetchSources();
96
+ }, []);
97
+
98
+ useEffect(() => {
99
+ if (selectedSource) {
100
+ fetchStats();
101
+ }
102
+ }, [selectedSource]);
103
+
104
+ const handleClearLogs = async () => {
105
+ setConfirmOpen(false);
106
+ setClearing(true);
107
+ setError(null);
108
+ setSuccess(null);
109
+
110
+ try {
111
+ const response = await fetch('/api/logs/clear', {
112
+ method: 'POST',
113
+ headers: { 'Content-Type': 'application/json' },
114
+ body: JSON.stringify({ source: selectedSource }),
115
+ });
116
+
117
+ if (!response.ok) {
118
+ const data = await response.json();
119
+ throw new Error(data.error || 'Failed to clear logs');
120
+ }
121
+
122
+ const data = await response.json();
123
+ setSuccess(data.message || 'Logs cleared successfully');
124
+
125
+ // Refresh stats
126
+ await fetchStats();
127
+ } catch (err) {
128
+ setError(err instanceof Error ? err.message : 'Failed to clear logs');
129
+ } finally {
130
+ setClearing(false);
131
+ }
132
+ };
133
+
134
+ return (
135
+ <Card>
136
+ <CardContent>
137
+ <Typography variant="h6" gutterBottom>
138
+ Log Management
139
+ </Typography>
140
+ <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
141
+ View log statistics and clear log files
142
+ </Typography>
143
+
144
+ {error && (
145
+ <Alert severity="error" sx={{ mb: 2 }} onClose={() => setError(null)}>
146
+ {error}
147
+ </Alert>
148
+ )}
149
+
150
+ {success && (
151
+ <Alert severity="success" sx={{ mb: 2 }} onClose={() => setSuccess(null)}>
152
+ {success}
153
+ </Alert>
154
+ )}
155
+
156
+ <Box sx={{ mb: 2 }}>
157
+ <FormControl fullWidth size="small">
158
+ <InputLabel>Log Source</InputLabel>
159
+ <Select
160
+ value={selectedSource}
161
+ label="Log Source"
162
+ onChange={(e) => setSelectedSource(e.target.value)}
163
+ disabled={sources.length === 0}
164
+ >
165
+ {sources.map((source) => (
166
+ <MenuItem key={source.name} value={source.name}>
167
+ {source.name} ({source.type})
168
+ </MenuItem>
169
+ ))}
170
+ </Select>
171
+ </FormControl>
172
+ </Box>
173
+
174
+ {loading ? (
175
+ <Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}>
176
+ <CircularProgress size={30} />
177
+ </Box>
178
+ ) : stats ? (
179
+ <Box sx={{ mb: 2 }}>
180
+ <Typography variant="body2" color="text.secondary">
181
+ <strong>Total Logs:</strong> {stats.totalLogs.toLocaleString()}
182
+ </Typography>
183
+ <Typography variant="body2" color="text.secondary">
184
+ <strong>File Size:</strong> {stats.fileSizeFormatted}
185
+ </Typography>
186
+ <Typography variant="body2" color="text.secondary" sx={{ mt: 1 }}>
187
+ <strong>By Level:</strong>
188
+ </Typography>
189
+ <Box sx={{ pl: 2 }}>
190
+ <Typography variant="body2" color="text.secondary">
191
+ Debug: {stats.byLevel.debug.toLocaleString()}
192
+ </Typography>
193
+ <Typography variant="body2" color="text.secondary">
194
+ Info: {stats.byLevel.info.toLocaleString()}
195
+ </Typography>
196
+ <Typography variant="body2" color="text.secondary">
197
+ Warn: {stats.byLevel.warn.toLocaleString()}
198
+ </Typography>
199
+ <Typography variant="body2" color="error">
200
+ Error: {stats.byLevel.error.toLocaleString()}
201
+ </Typography>
202
+ </Box>
203
+ </Box>
204
+ ) : null}
205
+
206
+ <Box sx={{ display: 'flex', gap: 1 }}>
207
+ <Button
208
+ variant="outlined"
209
+ color="primary"
210
+ size="small"
211
+ startIcon={<RefreshIcon />}
212
+ onClick={fetchStats}
213
+ disabled={!selectedSource || loading}
214
+ >
215
+ Refresh
216
+ </Button>
217
+ <Button
218
+ variant="contained"
219
+ color="error"
220
+ size="small"
221
+ startIcon={clearing ? <CircularProgress size={16} color="inherit" /> : <DeleteIcon />}
222
+ onClick={() => setConfirmOpen(true)}
223
+ disabled={!selectedSource || clearing || loading}
224
+ >
225
+ Clear Logs
226
+ </Button>
227
+ </Box>
228
+
229
+ <Dialog open={confirmOpen} onClose={() => setConfirmOpen(false)}>
230
+ <DialogTitle>Clear Log File</DialogTitle>
231
+ <DialogContent>
232
+ <DialogContentText>
233
+ Are you sure you want to clear the "{selectedSource}" log file? This action cannot
234
+ be undone.
235
+ </DialogContentText>
236
+ </DialogContent>
237
+ <DialogActions>
238
+ <Button onClick={() => setConfirmOpen(false)}>Cancel</Button>
239
+ <Button onClick={handleClearLogs} color="error" variant="contained">
240
+ Clear
241
+ </Button>
242
+ </DialogActions>
243
+ </Dialog>
244
+ </CardContent>
245
+ </Card>
246
+ );
247
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Seed Management Widget
3
+ *
4
+ * Displays available seed scripts and allows executing them.
5
+ * Part of the maintenance plugin.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { useState, useEffect } from 'react';
11
+ import {
12
+ Card,
13
+ CardContent,
14
+ Typography,
15
+ Button,
16
+ List,
17
+ ListItem,
18
+ ListItemText,
19
+ CircularProgress,
20
+ Alert,
21
+ Box,
22
+ } from '@mui/material';
23
+ import PlayArrowIcon from '@mui/icons-material/PlayArrow';
24
+
25
+ interface SeedScript {
26
+ name: string;
27
+ path: string;
28
+ size: number;
29
+ createdAt: string;
30
+ modifiedAt: string;
31
+ }
32
+
33
+ export function SeedManagementWidget() {
34
+ const [seeds, setSeeds] = useState<SeedScript[]>([]);
35
+ const [loading, setLoading] = useState(true);
36
+ const [error, setError] = useState<string | null>(null);
37
+ const [executing, setExecuting] = useState<string | null>(null);
38
+
39
+ useEffect(() => {
40
+ fetchSeeds();
41
+ }, []);
42
+
43
+ const fetchSeeds = async () => {
44
+ try {
45
+ // TODO: Add proper API endpoint for seed discovery
46
+ // const response = await api.get('/maintenance/seeds/discover');
47
+ // setSeeds(response.seeds || []);
48
+ setSeeds([]);
49
+ setError(null);
50
+ } catch (err) {
51
+ setError(err instanceof Error ? err.message : 'Failed to fetch seeds');
52
+ } finally {
53
+ setLoading(false);
54
+ }
55
+ };
56
+
57
+ const executeSeed = async (seedName: string) => {
58
+ setExecuting(seedName);
59
+ try {
60
+ // TODO: Add proper API endpoint for seed execution
61
+ // await api.post(`/maintenance/seeds/execute`, { name: seedName });
62
+ alert(`Seed ${seedName} executed successfully`);
63
+ } catch (err) {
64
+ alert(`Failed to execute seed: ${err instanceof Error ? err.message : 'Unknown error'}`);
65
+ } finally {
66
+ setExecuting(null);
67
+ }
68
+ };
69
+
70
+ if (loading) {
71
+ return (
72
+ <Card>
73
+ <CardContent>
74
+ <Box sx={{ display: 'flex', justifyContent: 'center', py: 2 }}>
75
+ <CircularProgress size={24} />
76
+ </Box>
77
+ </CardContent>
78
+ </Card>
79
+ );
80
+ }
81
+
82
+ return (
83
+ <Card>
84
+ <CardContent>
85
+ <Typography variant="h6" gutterBottom>
86
+ Seed Management
87
+ </Typography>
88
+ <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
89
+ Manage and execute seed scripts
90
+ </Typography>
91
+
92
+ {error && (
93
+ <Alert severity="error" sx={{ mb: 2 }}>
94
+ {error}
95
+ </Alert>
96
+ )}
97
+
98
+ {seeds.length === 0 ? (
99
+ <Alert severity="info">No seed scripts found</Alert>
100
+ ) : (
101
+ <List>
102
+ {seeds.map((seed) => (
103
+ <ListItem
104
+ key={seed.name}
105
+ secondaryAction={
106
+ <Button
107
+ variant="contained"
108
+ size="small"
109
+ startIcon={executing === seed.name ? <CircularProgress size={16} /> : <PlayArrowIcon />}
110
+ onClick={() => executeSeed(seed.name)}
111
+ disabled={executing !== null}
112
+ >
113
+ Execute
114
+ </Button>
115
+ }
116
+ >
117
+ <ListItemText
118
+ primary={seed.name}
119
+ secondary={`Modified: ${new Date(seed.modifiedAt).toLocaleDateString()}`}
120
+ />
121
+ </ListItem>
122
+ ))}
123
+ </List>
124
+ )}
125
+ </CardContent>
126
+ </Card>
127
+ );
128
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Service Control Widget
3
+ *
4
+ * Provides controls for starting, stopping, and restarting services.
5
+ * Part of the maintenance plugin.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { Card, CardContent, Typography, Alert } from '@mui/material';
11
+
12
+ export function ServiceControlWidget() {
13
+ return (
14
+ <Card>
15
+ <CardContent>
16
+ <Typography variant="h6" gutterBottom>
17
+ Service Control
18
+ </Typography>
19
+ <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
20
+ Start, stop, and restart services
21
+ </Typography>
22
+
23
+ <Alert severity="info">
24
+ Service control functionality coming soon. This will allow you to manage service lifecycle.
25
+ </Alert>
26
+ </CardContent>
27
+ </Card>
28
+ );
29
+ }
@@ -10,3 +10,9 @@ export { AuthStatusWidget } from './AuthStatusWidget';
10
10
  export { NotificationsStatsWidget } from './NotificationsStatsWidget';
11
11
  export { CMSStatusWidget } from './CMSStatusWidget';
12
12
  export { CMSMaintenanceWidget } from './CMSMaintenanceWidget';
13
+ export { SeedManagementWidget } from './SeedManagementWidget';
14
+ export { ServiceControlWidget } from './ServiceControlWidget';
15
+ export { EnvironmentConfigWidget } from './EnvironmentConfigWidget';
16
+ export { DatabaseOpsWidget } from './DatabaseOpsWidget';
17
+ export { LogsMaintenanceWidget } from './LogsMaintenanceWidget';
18
+ export { CacheMaintenanceWidget } from './CacheMaintenanceWidget';
@@ -133,8 +133,8 @@ export function DashboardPage() {
133
133
  </CardActionArea>
134
134
  </Card>
135
135
 
136
- {/* Plugin widgets (from server-side widget contributions) */}
137
- <PluginWidgetRenderer />
136
+ {/* Plugin widgets (from server-side widget contributions) - status widgets only */}
137
+ <PluginWidgetRenderer widgetType="status" />
138
138
 
139
139
  {/* Legacy widgets from context (for backwards compatibility) */}
140
140
  <DashboardWidgetRenderer />
@@ -21,7 +21,7 @@ export function MaintenancePage() {
21
21
  </Typography>
22
22
 
23
23
  {/* Render all maintenance widgets from plugins */}
24
- <PluginWidgetRenderer defaultOnly={false} />
24
+ <PluginWidgetRenderer widgetType="maintenance" defaultOnly={true} />
25
25
  </Box>
26
26
  );
27
27
  }