@qwickapps/server 1.5.2 → 1.6.1

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 (723) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +177 -0
  3. package/dist/core/control-panel.d.ts.map +1 -1
  4. package/dist/core/control-panel.js +118 -261
  5. package/dist/core/control-panel.js.map +1 -1
  6. package/dist/core/plugin-registry.d.ts +20 -0
  7. package/dist/core/plugin-registry.d.ts.map +1 -1
  8. package/dist/core/plugin-registry.js +27 -2
  9. package/dist/core/plugin-registry.js.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/plugins/api-keys/ApiKeysManagementPage.d.ts +9 -0
  15. package/dist/plugins/api-keys/ApiKeysManagementPage.d.ts.map +1 -0
  16. package/dist/plugins/api-keys/ApiKeysManagementPage.js +66 -0
  17. package/dist/plugins/api-keys/ApiKeysManagementPage.js.map +1 -0
  18. package/dist/plugins/api-keys/ApiKeysStatusWidget.d.ts +9 -0
  19. package/dist/plugins/api-keys/ApiKeysStatusWidget.d.ts.map +1 -0
  20. package/dist/plugins/api-keys/ApiKeysStatusWidget.js +30 -0
  21. package/dist/plugins/api-keys/ApiKeysStatusWidget.js.map +1 -0
  22. package/dist/plugins/api-keys/api-keys-plugin.d.ts +46 -0
  23. package/dist/plugins/api-keys/api-keys-plugin.d.ts.map +1 -0
  24. package/dist/plugins/api-keys/api-keys-plugin.js +452 -0
  25. package/dist/plugins/api-keys/api-keys-plugin.js.map +1 -0
  26. package/dist/plugins/api-keys/index.d.ts +18 -0
  27. package/dist/plugins/api-keys/index.d.ts.map +1 -0
  28. package/dist/plugins/api-keys/index.js +20 -0
  29. package/dist/plugins/api-keys/index.js.map +1 -0
  30. package/dist/plugins/api-keys/middleware/bearer-token-auth.d.ts +74 -0
  31. package/dist/plugins/api-keys/middleware/bearer-token-auth.d.ts.map +1 -0
  32. package/dist/plugins/api-keys/middleware/bearer-token-auth.js +201 -0
  33. package/dist/plugins/api-keys/middleware/bearer-token-auth.js.map +1 -0
  34. package/dist/plugins/api-keys/middleware/index.d.ts +8 -0
  35. package/dist/plugins/api-keys/middleware/index.d.ts.map +1 -0
  36. package/dist/plugins/api-keys/middleware/index.js +8 -0
  37. package/dist/plugins/api-keys/middleware/index.js.map +1 -0
  38. package/dist/plugins/api-keys/middleware/usage-logging.d.ts +21 -0
  39. package/dist/plugins/api-keys/middleware/usage-logging.d.ts.map +1 -0
  40. package/dist/plugins/api-keys/middleware/usage-logging.js +57 -0
  41. package/dist/plugins/api-keys/middleware/usage-logging.js.map +1 -0
  42. package/dist/plugins/api-keys/stores/index.d.ts +9 -0
  43. package/dist/plugins/api-keys/stores/index.d.ts.map +1 -0
  44. package/dist/plugins/api-keys/stores/index.js +9 -0
  45. package/dist/plugins/api-keys/stores/index.js.map +1 -0
  46. package/dist/plugins/api-keys/stores/plugin-scope-store.d.ts +81 -0
  47. package/dist/plugins/api-keys/stores/plugin-scope-store.d.ts.map +1 -0
  48. package/dist/plugins/api-keys/stores/plugin-scope-store.js +155 -0
  49. package/dist/plugins/api-keys/stores/plugin-scope-store.js.map +1 -0
  50. package/dist/plugins/api-keys/stores/postgres-store.d.ts +34 -0
  51. package/dist/plugins/api-keys/stores/postgres-store.d.ts.map +1 -0
  52. package/dist/plugins/api-keys/stores/postgres-store.js +360 -0
  53. package/dist/plugins/api-keys/stores/postgres-store.js.map +1 -0
  54. package/dist/plugins/api-keys/stores/usage-log-store.d.ts +119 -0
  55. package/dist/plugins/api-keys/stores/usage-log-store.d.ts.map +1 -0
  56. package/dist/plugins/api-keys/stores/usage-log-store.js +246 -0
  57. package/dist/plugins/api-keys/stores/usage-log-store.js.map +1 -0
  58. package/dist/plugins/api-keys/types.d.ts +309 -0
  59. package/dist/plugins/api-keys/types.d.ts.map +1 -0
  60. package/dist/plugins/api-keys/types.js +105 -0
  61. package/dist/plugins/api-keys/types.js.map +1 -0
  62. package/dist/plugins/auth/AuthManagementPage.d.ts +9 -0
  63. package/dist/plugins/auth/AuthManagementPage.d.ts.map +1 -0
  64. package/dist/plugins/auth/AuthManagementPage.js +73 -0
  65. package/dist/plugins/auth/AuthManagementPage.js.map +1 -0
  66. package/dist/plugins/auth/AuthStatusWidget.d.ts +9 -0
  67. package/dist/plugins/auth/AuthStatusWidget.d.ts.map +1 -0
  68. package/dist/plugins/auth/AuthStatusWidget.js +30 -0
  69. package/dist/plugins/auth/AuthStatusWidget.js.map +1 -0
  70. package/dist/plugins/auth/adapters/basic-adapter.d.ts +1 -0
  71. package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -1
  72. package/dist/plugins/auth/adapters/basic-adapter.js +54 -0
  73. package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -1
  74. package/dist/plugins/auth/auth-plugin.js +1 -1
  75. package/dist/plugins/auth/auth-plugin.js.map +1 -1
  76. package/dist/plugins/auth/env-config.d.ts +15 -1
  77. package/dist/plugins/auth/env-config.d.ts.map +1 -1
  78. package/dist/plugins/auth/env-config.js +16 -6
  79. package/dist/plugins/auth/env-config.js.map +1 -1
  80. package/dist/plugins/auth/index.d.ts +5 -1
  81. package/dist/plugins/auth/index.d.ts.map +1 -1
  82. package/dist/plugins/auth/index.js +7 -1
  83. package/dist/plugins/auth/index.js.map +1 -1
  84. package/dist/plugins/bans/BansManagementPage.d.ts +9 -0
  85. package/dist/plugins/bans/BansManagementPage.d.ts.map +1 -0
  86. package/dist/plugins/bans/BansManagementPage.js +65 -0
  87. package/dist/plugins/bans/BansManagementPage.js.map +1 -0
  88. package/dist/plugins/bans/BansStatusWidget.d.ts +9 -0
  89. package/dist/plugins/bans/BansStatusWidget.d.ts.map +1 -0
  90. package/dist/plugins/bans/BansStatusWidget.js +30 -0
  91. package/dist/plugins/bans/BansStatusWidget.js.map +1 -0
  92. package/dist/plugins/bans/bans-plugin.js +1 -1
  93. package/dist/plugins/bans/bans-plugin.js.map +1 -1
  94. package/dist/plugins/bans/index.d.ts +4 -0
  95. package/dist/plugins/bans/index.d.ts.map +1 -1
  96. package/dist/plugins/bans/index.js +3 -0
  97. package/dist/plugins/bans/index.js.map +1 -1
  98. package/dist/plugins/cache/CacheManagementPage.d.ts +13 -0
  99. package/dist/plugins/cache/CacheManagementPage.d.ts.map +1 -0
  100. package/dist/plugins/cache/CacheManagementPage.js +175 -0
  101. package/dist/plugins/cache/CacheManagementPage.js.map +1 -0
  102. package/dist/plugins/cache/CacheStatusWidget.d.ts +13 -0
  103. package/dist/plugins/cache/CacheStatusWidget.d.ts.map +1 -0
  104. package/dist/plugins/cache/CacheStatusWidget.js +80 -0
  105. package/dist/plugins/cache/CacheStatusWidget.js.map +1 -0
  106. package/dist/plugins/cache/index.d.ts +10 -0
  107. package/dist/plugins/cache/index.d.ts.map +1 -0
  108. package/dist/plugins/cache/index.js +8 -0
  109. package/dist/plugins/cache/index.js.map +1 -0
  110. package/dist/plugins/cms/cms-plugin.d.ts +24 -0
  111. package/dist/plugins/cms/cms-plugin.d.ts.map +1 -0
  112. package/dist/plugins/cms/cms-plugin.js +220 -0
  113. package/dist/plugins/cms/cms-plugin.js.map +1 -0
  114. package/dist/plugins/cms/index.d.ts +8 -0
  115. package/dist/plugins/cms/index.d.ts.map +1 -0
  116. package/dist/plugins/cms/index.js +7 -0
  117. package/dist/plugins/cms/index.js.map +1 -0
  118. package/dist/plugins/config-plugin.js +4 -4
  119. package/dist/plugins/config-plugin.js.map +1 -1
  120. package/dist/plugins/core/index.d.ts +32 -0
  121. package/dist/plugins/core/index.d.ts.map +1 -0
  122. package/dist/plugins/core/index.js +129 -0
  123. package/dist/plugins/core/index.js.map +1 -0
  124. package/dist/plugins/devices/DevicesManagementPage.d.ts +9 -0
  125. package/dist/plugins/devices/DevicesManagementPage.d.ts.map +1 -0
  126. package/dist/plugins/devices/DevicesManagementPage.js +65 -0
  127. package/dist/plugins/devices/DevicesManagementPage.js.map +1 -0
  128. package/dist/plugins/devices/DevicesStatusWidget.d.ts +9 -0
  129. package/dist/plugins/devices/DevicesStatusWidget.d.ts.map +1 -0
  130. package/dist/plugins/devices/DevicesStatusWidget.js +30 -0
  131. package/dist/plugins/devices/DevicesStatusWidget.js.map +1 -0
  132. package/dist/plugins/devices/devices-plugin.js +1 -1
  133. package/dist/plugins/devices/devices-plugin.js.map +1 -1
  134. package/dist/plugins/devices/index.d.ts +4 -0
  135. package/dist/plugins/devices/index.d.ts.map +1 -1
  136. package/dist/plugins/devices/index.js +3 -0
  137. package/dist/plugins/devices/index.js.map +1 -1
  138. package/dist/plugins/diagnostics/DiagnosticsManagementPage.d.ts +13 -0
  139. package/dist/plugins/diagnostics/DiagnosticsManagementPage.d.ts.map +1 -0
  140. package/dist/plugins/diagnostics/DiagnosticsManagementPage.js +78 -0
  141. package/dist/plugins/diagnostics/DiagnosticsManagementPage.js.map +1 -0
  142. package/dist/plugins/diagnostics/DiagnosticsStatusWidget.d.ts +13 -0
  143. package/dist/plugins/diagnostics/DiagnosticsStatusWidget.d.ts.map +1 -0
  144. package/dist/plugins/diagnostics/DiagnosticsStatusWidget.js +87 -0
  145. package/dist/plugins/diagnostics/DiagnosticsStatusWidget.js.map +1 -0
  146. package/dist/plugins/diagnostics/index.d.ts +10 -0
  147. package/dist/plugins/diagnostics/index.d.ts.map +1 -0
  148. package/dist/plugins/diagnostics/index.js +8 -0
  149. package/dist/plugins/diagnostics/index.js.map +1 -0
  150. package/dist/plugins/diagnostics-plugin.js +4 -3
  151. package/dist/plugins/diagnostics-plugin.js.map +1 -1
  152. package/dist/plugins/entitlements/EntitlementsManagementPage.d.ts +9 -0
  153. package/dist/plugins/entitlements/EntitlementsManagementPage.d.ts.map +1 -0
  154. package/dist/plugins/entitlements/EntitlementsManagementPage.js +59 -0
  155. package/dist/plugins/entitlements/EntitlementsManagementPage.js.map +1 -0
  156. package/dist/plugins/entitlements/EntitlementsStatusWidget.d.ts +9 -0
  157. package/dist/plugins/entitlements/EntitlementsStatusWidget.d.ts.map +1 -0
  158. package/dist/plugins/entitlements/EntitlementsStatusWidget.js +30 -0
  159. package/dist/plugins/entitlements/EntitlementsStatusWidget.js.map +1 -0
  160. package/dist/plugins/entitlements/entitlements-plugin.js +1 -1
  161. package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -1
  162. package/dist/plugins/entitlements/index.d.ts +4 -0
  163. package/dist/plugins/entitlements/index.d.ts.map +1 -1
  164. package/dist/plugins/entitlements/index.js +3 -0
  165. package/dist/plugins/entitlements/index.js.map +1 -1
  166. package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
  167. package/dist/plugins/frontend-app-plugin.js +5 -2
  168. package/dist/plugins/frontend-app-plugin.js.map +1 -1
  169. package/dist/plugins/health/HealthManagementPage.d.ts +13 -0
  170. package/dist/plugins/health/HealthManagementPage.d.ts.map +1 -0
  171. package/dist/plugins/health/HealthManagementPage.js +120 -0
  172. package/dist/plugins/health/HealthManagementPage.js.map +1 -0
  173. package/dist/plugins/health/HealthStatusWidget.d.ts +13 -0
  174. package/dist/plugins/health/HealthStatusWidget.d.ts.map +1 -0
  175. package/dist/plugins/health/HealthStatusWidget.js +80 -0
  176. package/dist/plugins/health/HealthStatusWidget.js.map +1 -0
  177. package/dist/plugins/health/index.d.ts +10 -0
  178. package/dist/plugins/health/index.d.ts.map +1 -0
  179. package/dist/plugins/health/index.js +8 -0
  180. package/dist/plugins/health/index.js.map +1 -0
  181. package/dist/plugins/index.d.ts +9 -1
  182. package/dist/plugins/index.d.ts.map +1 -1
  183. package/dist/plugins/index.js +6 -1
  184. package/dist/plugins/index.js.map +1 -1
  185. package/dist/plugins/logs/LogsManagementPage.d.ts +13 -0
  186. package/dist/plugins/logs/LogsManagementPage.d.ts.map +1 -0
  187. package/dist/plugins/logs/LogsManagementPage.js +151 -0
  188. package/dist/plugins/logs/LogsManagementPage.js.map +1 -0
  189. package/dist/plugins/logs/LogsStatusWidget.d.ts +13 -0
  190. package/dist/plugins/logs/LogsStatusWidget.d.ts.map +1 -0
  191. package/dist/plugins/logs/LogsStatusWidget.js +76 -0
  192. package/dist/plugins/logs/LogsStatusWidget.js.map +1 -0
  193. package/dist/plugins/logs/index.d.ts +10 -0
  194. package/dist/plugins/logs/index.d.ts.map +1 -0
  195. package/dist/plugins/logs/index.js +8 -0
  196. package/dist/plugins/logs/index.js.map +1 -0
  197. package/dist/plugins/logs-plugin.js +6 -6
  198. package/dist/plugins/logs-plugin.js.map +1 -1
  199. package/dist/plugins/maintenance/MaintenanceManagementPage.d.ts +13 -0
  200. package/dist/plugins/maintenance/MaintenanceManagementPage.d.ts.map +1 -0
  201. package/dist/plugins/maintenance/MaintenanceManagementPage.js +40 -0
  202. package/dist/plugins/maintenance/MaintenanceManagementPage.js.map +1 -0
  203. package/dist/plugins/maintenance/MaintenanceStatusWidget.d.ts +13 -0
  204. package/dist/plugins/maintenance/MaintenanceStatusWidget.d.ts.map +1 -0
  205. package/dist/plugins/maintenance/MaintenanceStatusWidget.js +76 -0
  206. package/dist/plugins/maintenance/MaintenanceStatusWidget.js.map +1 -0
  207. package/dist/plugins/maintenance/SeedExecutor.d.ts +17 -0
  208. package/dist/plugins/maintenance/SeedExecutor.d.ts.map +1 -0
  209. package/dist/plugins/maintenance/SeedExecutor.js +154 -0
  210. package/dist/plugins/maintenance/SeedExecutor.js.map +1 -0
  211. package/dist/plugins/maintenance/SeedHistory.d.ts +14 -0
  212. package/dist/plugins/maintenance/SeedHistory.d.ts.map +1 -0
  213. package/dist/plugins/maintenance/SeedHistory.js +183 -0
  214. package/dist/plugins/maintenance/SeedHistory.js.map +1 -0
  215. package/dist/plugins/maintenance/SeedList.d.ts +15 -0
  216. package/dist/plugins/maintenance/SeedList.d.ts.map +1 -0
  217. package/dist/plugins/maintenance/SeedList.js +68 -0
  218. package/dist/plugins/maintenance/SeedList.js.map +1 -0
  219. package/dist/plugins/maintenance/SeedManagementPage.d.ts +14 -0
  220. package/dist/plugins/maintenance/SeedManagementPage.d.ts.map +1 -0
  221. package/dist/plugins/maintenance/SeedManagementPage.js +42 -0
  222. package/dist/plugins/maintenance/SeedManagementPage.js.map +1 -0
  223. package/dist/plugins/maintenance/index.d.ts +20 -0
  224. package/dist/plugins/maintenance/index.d.ts.map +1 -0
  225. package/dist/plugins/maintenance/index.js +15 -0
  226. package/dist/plugins/maintenance/index.js.map +1 -0
  227. package/dist/plugins/maintenance/seed-executor.d.ts +55 -0
  228. package/dist/plugins/maintenance/seed-executor.d.ts.map +1 -0
  229. package/dist/plugins/maintenance/seed-executor.js +178 -0
  230. package/dist/plugins/maintenance/seed-executor.js.map +1 -0
  231. package/dist/plugins/maintenance-plugin.d.ts +35 -0
  232. package/dist/plugins/maintenance-plugin.d.ts.map +1 -0
  233. package/dist/plugins/maintenance-plugin.js +321 -0
  234. package/dist/plugins/maintenance-plugin.js.map +1 -0
  235. package/dist/plugins/notifications/NotificationsManagementPage.d.ts +13 -0
  236. package/dist/plugins/notifications/NotificationsManagementPage.d.ts.map +1 -0
  237. package/dist/plugins/notifications/NotificationsManagementPage.js +59 -0
  238. package/dist/plugins/notifications/NotificationsManagementPage.js.map +1 -0
  239. package/dist/plugins/notifications/NotificationsStatusWidget.d.ts +9 -0
  240. package/dist/plugins/notifications/NotificationsStatusWidget.d.ts.map +1 -0
  241. package/dist/plugins/notifications/NotificationsStatusWidget.js +30 -0
  242. package/dist/plugins/notifications/NotificationsStatusWidget.js.map +1 -0
  243. package/dist/plugins/notifications/index.d.ts +4 -0
  244. package/dist/plugins/notifications/index.d.ts.map +1 -1
  245. package/dist/plugins/notifications/index.js +3 -0
  246. package/dist/plugins/notifications/index.js.map +1 -1
  247. package/dist/plugins/notifications/notifications-plugin.js +1 -1
  248. package/dist/plugins/notifications/notifications-plugin.js.map +1 -1
  249. package/dist/plugins/parental/ParentalManagementPage.d.ts +9 -0
  250. package/dist/plugins/parental/ParentalManagementPage.d.ts.map +1 -0
  251. package/dist/plugins/parental/ParentalManagementPage.js +56 -0
  252. package/dist/plugins/parental/ParentalManagementPage.js.map +1 -0
  253. package/dist/plugins/parental/ParentalStatusWidget.d.ts +9 -0
  254. package/dist/plugins/parental/ParentalStatusWidget.d.ts.map +1 -0
  255. package/dist/plugins/parental/ParentalStatusWidget.js +30 -0
  256. package/dist/plugins/parental/ParentalStatusWidget.js.map +1 -0
  257. package/dist/plugins/parental/index.d.ts +4 -0
  258. package/dist/plugins/parental/index.d.ts.map +1 -1
  259. package/dist/plugins/parental/index.js +3 -0
  260. package/dist/plugins/parental/index.js.map +1 -1
  261. package/dist/plugins/parental/parental-plugin.js +1 -1
  262. package/dist/plugins/parental/parental-plugin.js.map +1 -1
  263. package/dist/plugins/postgres/PostgresManagementPage.d.ts +13 -0
  264. package/dist/plugins/postgres/PostgresManagementPage.d.ts.map +1 -0
  265. package/dist/plugins/postgres/PostgresManagementPage.js +139 -0
  266. package/dist/plugins/postgres/PostgresManagementPage.js.map +1 -0
  267. package/dist/plugins/postgres/PostgresStatusWidget.d.ts +13 -0
  268. package/dist/plugins/postgres/PostgresStatusWidget.d.ts.map +1 -0
  269. package/dist/plugins/postgres/PostgresStatusWidget.js +87 -0
  270. package/dist/plugins/postgres/PostgresStatusWidget.js.map +1 -0
  271. package/dist/plugins/postgres/index.d.ts +10 -0
  272. package/dist/plugins/postgres/index.d.ts.map +1 -0
  273. package/dist/plugins/postgres/index.js +8 -0
  274. package/dist/plugins/postgres/index.js.map +1 -0
  275. package/dist/plugins/preferences/PreferencesManagementPage.d.ts +9 -0
  276. package/dist/plugins/preferences/PreferencesManagementPage.d.ts.map +1 -0
  277. package/dist/plugins/preferences/PreferencesManagementPage.js +67 -0
  278. package/dist/plugins/preferences/PreferencesManagementPage.js.map +1 -0
  279. package/dist/plugins/preferences/PreferencesStatusWidget.d.ts +9 -0
  280. package/dist/plugins/preferences/PreferencesStatusWidget.d.ts.map +1 -0
  281. package/dist/plugins/preferences/PreferencesStatusWidget.js +30 -0
  282. package/dist/plugins/preferences/PreferencesStatusWidget.js.map +1 -0
  283. package/dist/plugins/preferences/index.d.ts +4 -0
  284. package/dist/plugins/preferences/index.d.ts.map +1 -1
  285. package/dist/plugins/preferences/index.js +3 -0
  286. package/dist/plugins/preferences/index.js.map +1 -1
  287. package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -1
  288. package/dist/plugins/preferences/preferences-plugin.js +9 -4
  289. package/dist/plugins/preferences/preferences-plugin.js.map +1 -1
  290. package/dist/plugins/preferences/types.d.ts +5 -0
  291. package/dist/plugins/preferences/types.d.ts.map +1 -1
  292. package/dist/plugins/preferences/types.js +5 -1
  293. package/dist/plugins/preferences/types.js.map +1 -1
  294. package/dist/plugins/profiles/ProfilesManagementPage.d.ts +9 -0
  295. package/dist/plugins/profiles/ProfilesManagementPage.d.ts.map +1 -0
  296. package/dist/plugins/profiles/ProfilesManagementPage.js +51 -0
  297. package/dist/plugins/profiles/ProfilesManagementPage.js.map +1 -0
  298. package/dist/plugins/profiles/ProfilesStatusWidget.d.ts +9 -0
  299. package/dist/plugins/profiles/ProfilesStatusWidget.d.ts.map +1 -0
  300. package/dist/plugins/profiles/ProfilesStatusWidget.js +30 -0
  301. package/dist/plugins/profiles/ProfilesStatusWidget.js.map +1 -0
  302. package/dist/plugins/profiles/index.d.ts +4 -0
  303. package/dist/plugins/profiles/index.d.ts.map +1 -1
  304. package/dist/plugins/profiles/index.js +3 -0
  305. package/dist/plugins/profiles/index.js.map +1 -1
  306. package/dist/plugins/profiles/profiles-plugin.js +1 -1
  307. package/dist/plugins/profiles/profiles-plugin.js.map +1 -1
  308. package/dist/plugins/qwickbrain/QwickbrainManagementPage.d.ts +13 -0
  309. package/dist/plugins/qwickbrain/QwickbrainManagementPage.d.ts.map +1 -0
  310. package/dist/plugins/qwickbrain/QwickbrainManagementPage.js +59 -0
  311. package/dist/plugins/qwickbrain/QwickbrainManagementPage.js.map +1 -0
  312. package/dist/plugins/qwickbrain/QwickbrainStatusWidget.d.ts +9 -0
  313. package/dist/plugins/qwickbrain/QwickbrainStatusWidget.d.ts.map +1 -0
  314. package/dist/plugins/qwickbrain/QwickbrainStatusWidget.js +30 -0
  315. package/dist/plugins/qwickbrain/QwickbrainStatusWidget.js.map +1 -0
  316. package/dist/plugins/qwickbrain/index.d.ts +4 -0
  317. package/dist/plugins/qwickbrain/index.d.ts.map +1 -1
  318. package/dist/plugins/qwickbrain/index.js +3 -0
  319. package/dist/plugins/qwickbrain/index.js.map +1 -1
  320. package/dist/plugins/qwickbrain/qwickbrain-plugin.d.ts.map +1 -1
  321. package/dist/plugins/qwickbrain/qwickbrain-plugin.js +12 -34
  322. package/dist/plugins/qwickbrain/qwickbrain-plugin.js.map +1 -1
  323. package/dist/plugins/qwickbrain/types.d.ts +0 -1
  324. package/dist/plugins/qwickbrain/types.d.ts.map +1 -1
  325. package/dist/plugins/rate-limit/RateLimitManagementPage.d.ts +13 -0
  326. package/dist/plugins/rate-limit/RateLimitManagementPage.d.ts.map +1 -0
  327. package/dist/plugins/rate-limit/RateLimitManagementPage.js +60 -0
  328. package/dist/plugins/rate-limit/RateLimitManagementPage.js.map +1 -0
  329. package/dist/plugins/rate-limit/RateLimitStatusWidget.d.ts +9 -0
  330. package/dist/plugins/rate-limit/RateLimitStatusWidget.d.ts.map +1 -0
  331. package/dist/plugins/rate-limit/RateLimitStatusWidget.js +30 -0
  332. package/dist/plugins/rate-limit/RateLimitStatusWidget.js.map +1 -0
  333. package/dist/plugins/rate-limit/index.d.ts +4 -0
  334. package/dist/plugins/rate-limit/index.d.ts.map +1 -1
  335. package/dist/plugins/rate-limit/index.js +3 -0
  336. package/dist/plugins/rate-limit/index.js.map +1 -1
  337. package/dist/plugins/rate-limit/rate-limit-plugin.js +5 -5
  338. package/dist/plugins/rate-limit/rate-limit-plugin.js.map +1 -1
  339. package/dist/plugins/subscriptions/SubscriptionsManagementPage.d.ts +9 -0
  340. package/dist/plugins/subscriptions/SubscriptionsManagementPage.d.ts.map +1 -0
  341. package/dist/plugins/subscriptions/SubscriptionsManagementPage.js +66 -0
  342. package/dist/plugins/subscriptions/SubscriptionsManagementPage.js.map +1 -0
  343. package/dist/plugins/subscriptions/SubscriptionsStatusWidget.d.ts +9 -0
  344. package/dist/plugins/subscriptions/SubscriptionsStatusWidget.d.ts.map +1 -0
  345. package/dist/plugins/subscriptions/SubscriptionsStatusWidget.js +30 -0
  346. package/dist/plugins/subscriptions/SubscriptionsStatusWidget.js.map +1 -0
  347. package/dist/plugins/subscriptions/index.d.ts +4 -0
  348. package/dist/plugins/subscriptions/index.d.ts.map +1 -1
  349. package/dist/plugins/subscriptions/index.js +3 -0
  350. package/dist/plugins/subscriptions/index.js.map +1 -1
  351. package/dist/plugins/subscriptions/subscriptions-plugin.js +1 -1
  352. package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -1
  353. package/dist/plugins/usage/UsageManagementPage.d.ts +9 -0
  354. package/dist/plugins/usage/UsageManagementPage.d.ts.map +1 -0
  355. package/dist/plugins/usage/UsageManagementPage.js +42 -0
  356. package/dist/plugins/usage/UsageManagementPage.js.map +1 -0
  357. package/dist/plugins/usage/UsageStatusWidget.d.ts +9 -0
  358. package/dist/plugins/usage/UsageStatusWidget.d.ts.map +1 -0
  359. package/dist/plugins/usage/UsageStatusWidget.js +30 -0
  360. package/dist/plugins/usage/UsageStatusWidget.js.map +1 -0
  361. package/dist/plugins/usage/index.d.ts +4 -0
  362. package/dist/plugins/usage/index.d.ts.map +1 -1
  363. package/dist/plugins/usage/index.js +3 -0
  364. package/dist/plugins/usage/index.js.map +1 -1
  365. package/dist/plugins/usage/usage-plugin.js +1 -1
  366. package/dist/plugins/usage/usage-plugin.js.map +1 -1
  367. package/dist/plugins/users/UsersManagementPage.d.ts +13 -0
  368. package/dist/plugins/users/UsersManagementPage.d.ts.map +1 -0
  369. package/dist/plugins/users/UsersManagementPage.js +199 -0
  370. package/dist/plugins/users/UsersManagementPage.js.map +1 -0
  371. package/dist/plugins/users/UsersStatusWidget.d.ts +13 -0
  372. package/dist/plugins/users/UsersStatusWidget.d.ts.map +1 -0
  373. package/dist/plugins/users/UsersStatusWidget.js +79 -0
  374. package/dist/plugins/users/UsersStatusWidget.js.map +1 -0
  375. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -1
  376. package/dist/plugins/users/stores/postgres-store.js +74 -19
  377. package/dist/plugins/users/stores/postgres-store.js.map +1 -1
  378. package/dist/plugins/users/types.d.ts +30 -1
  379. package/dist/plugins/users/types.d.ts.map +1 -1
  380. package/dist/plugins/users/users-plugin.d.ts.map +1 -1
  381. package/dist/plugins/users/users-plugin.js +118 -3
  382. package/dist/plugins/users/users-plugin.js.map +1 -1
  383. package/dist-ui/assets/index-BiEHWqD3.js +528 -0
  384. package/dist-ui/assets/index-BiEHWqD3.js.map +1 -0
  385. package/dist-ui/index.html +1 -1
  386. package/dist-ui-lib/index.js +3682 -2765
  387. package/dist-ui-lib/index.js.map +1 -1
  388. package/dist-ui-lib/src/api/clientBuilder.d.ts +33 -0
  389. package/dist-ui-lib/{api → src/api}/controlPanelApi.d.ts +124 -0
  390. package/dist-ui-lib/src/api/index.d.ts +11 -0
  391. package/dist-ui-lib/src/api/types.d.ts +313 -0
  392. package/dist-ui-lib/{components → src/components}/ControlPanelApp.d.ts +2 -1
  393. package/dist-ui-lib/src/components/auth/AcceptInvitationPage.d.ts +21 -0
  394. package/dist-ui-lib/src/components/auth/LoginPage.d.ts +27 -0
  395. package/dist-ui-lib/src/components/auth/PasswordResetConfirmPage.d.ts +17 -0
  396. package/dist-ui-lib/src/components/auth/PasswordResetPage.d.ts +12 -0
  397. package/dist-ui-lib/src/components/auth/SignupPage.d.ts +27 -0
  398. package/dist-ui-lib/src/components/auth/VerifyEmailPage.d.ts +12 -0
  399. package/dist-ui-lib/src/components/auth/index.d.ts +19 -0
  400. package/dist-ui-lib/src/components/auth/shared/AuthError.d.ts +9 -0
  401. package/dist-ui-lib/src/components/auth/shared/AuthLayout.d.ts +11 -0
  402. package/dist-ui-lib/src/components/auth/shared/index.d.ts +7 -0
  403. package/dist-ui-lib/{components → src/components}/index.d.ts +5 -2
  404. package/dist-ui-lib/src/components/plugins/PluginConfigPanel.d.ts +65 -0
  405. package/dist-ui-lib/src/components/plugins/PluginManagementPage.d.ts +62 -0
  406. package/dist-ui-lib/src/components/plugins/PluginStatusWidget.d.ts +51 -0
  407. package/dist-ui-lib/src/components/plugins/index.d.ts +13 -0
  408. package/dist-ui-lib/src/config/preferences.d.ts +16 -0
  409. package/dist-ui-lib/src/dashboard/widgets/CMSMaintenanceWidget.d.ts +8 -0
  410. package/dist-ui-lib/src/dashboard/widgets/CMSStatusWidget.d.ts +8 -0
  411. package/dist-ui-lib/{dashboard → src/dashboard}/widgets/index.d.ts +2 -0
  412. package/dist-ui-lib/src/hooks/useJobStream.d.ts +38 -0
  413. package/dist-ui-lib/src/pages/AcceptInvitationPage.d.ts +28 -0
  414. package/dist-ui-lib/src/pages/PreferencesPage.d.ts +9 -0
  415. package/package.json +12 -5
  416. package/src/core/control-panel.ts +141 -286
  417. package/src/core/plugin-registry.ts +52 -3
  418. package/src/index.ts +27 -0
  419. package/src/plugins/api-keys/API_ROUTES.md +165 -0
  420. package/src/plugins/api-keys/ApiKeysManagementPage.test.tsx +58 -0
  421. package/src/plugins/api-keys/ApiKeysManagementPage.tsx +131 -0
  422. package/src/plugins/api-keys/ApiKeysStatusWidget.test.tsx +112 -0
  423. package/src/plugins/api-keys/ApiKeysStatusWidget.tsx +53 -0
  424. package/src/plugins/api-keys/api-keys-plugin.ts +533 -0
  425. package/src/plugins/api-keys/index.ts +55 -0
  426. package/src/plugins/api-keys/middleware/bearer-token-auth.ts +250 -0
  427. package/src/plugins/api-keys/middleware/index.ts +15 -0
  428. package/src/plugins/api-keys/middleware/usage-logging.ts +78 -0
  429. package/src/plugins/api-keys/stores/index.ts +21 -0
  430. package/src/plugins/api-keys/stores/plugin-scope-store.ts +280 -0
  431. package/src/plugins/api-keys/stores/postgres-store.ts +487 -0
  432. package/src/plugins/api-keys/stores/usage-log-store.ts +423 -0
  433. package/src/plugins/api-keys/types.ts +307 -0
  434. package/src/plugins/auth/API_ROUTES.md +110 -0
  435. package/src/plugins/auth/AuthManagementPage.test.tsx +58 -0
  436. package/src/plugins/auth/AuthManagementPage.tsx +170 -0
  437. package/src/plugins/auth/AuthStatusWidget.test.tsx +112 -0
  438. package/src/plugins/auth/AuthStatusWidget.tsx +53 -0
  439. package/src/plugins/auth/adapters/basic-adapter.ts +62 -0
  440. package/src/plugins/auth/auth-plugin.ts +1 -1
  441. package/src/plugins/auth/env-config.ts +16 -6
  442. package/src/plugins/auth/index.ts +9 -0
  443. package/src/plugins/bans/API_ROUTES.md +183 -0
  444. package/src/plugins/bans/BansManagementPage.test.tsx +58 -0
  445. package/src/plugins/bans/BansManagementPage.tsx +129 -0
  446. package/src/plugins/bans/BansStatusWidget.test.tsx +112 -0
  447. package/src/plugins/bans/BansStatusWidget.tsx +53 -0
  448. package/src/plugins/bans/bans-plugin.ts +1 -1
  449. package/src/plugins/bans/index.ts +6 -0
  450. package/src/plugins/cache/API_ROUTES.md +312 -0
  451. package/src/plugins/cache/CacheManagementPage.test.tsx +57 -0
  452. package/src/plugins/cache/CacheManagementPage.tsx +360 -0
  453. package/src/plugins/cache/CacheStatusWidget.test.tsx +113 -0
  454. package/src/plugins/cache/CacheStatusWidget.tsx +122 -0
  455. package/src/plugins/cache/index.ts +10 -0
  456. package/src/plugins/cms/cms-plugin.ts +259 -0
  457. package/src/plugins/cms/index.ts +8 -0
  458. package/src/plugins/config-plugin.ts +4 -4
  459. package/src/plugins/core/index.ts +164 -0
  460. package/src/plugins/devices/API_ROUTES.md +27 -0
  461. package/src/plugins/devices/DevicesManagementPage.test.tsx +58 -0
  462. package/src/plugins/devices/DevicesManagementPage.tsx +124 -0
  463. package/src/plugins/devices/DevicesStatusWidget.test.tsx +109 -0
  464. package/src/plugins/devices/DevicesStatusWidget.tsx +52 -0
  465. package/src/plugins/devices/devices-plugin.ts +1 -1
  466. package/src/plugins/devices/index.ts +6 -0
  467. package/src/plugins/diagnostics/API_ROUTES.md +316 -0
  468. package/src/plugins/diagnostics/DiagnosticsManagementPage.test.tsx +58 -0
  469. package/src/plugins/diagnostics/DiagnosticsManagementPage.tsx +306 -0
  470. package/src/plugins/diagnostics/DiagnosticsStatusWidget.test.tsx +112 -0
  471. package/src/plugins/diagnostics/DiagnosticsStatusWidget.tsx +129 -0
  472. package/src/plugins/diagnostics/index.ts +10 -0
  473. package/src/plugins/diagnostics-plugin.ts +3 -3
  474. package/src/plugins/entitlements/API_ROUTES.md +27 -0
  475. package/src/plugins/entitlements/EntitlementsManagementPage.test.tsx +58 -0
  476. package/src/plugins/entitlements/EntitlementsManagementPage.tsx +113 -0
  477. package/src/plugins/entitlements/EntitlementsStatusWidget.test.tsx +109 -0
  478. package/src/plugins/entitlements/EntitlementsStatusWidget.tsx +52 -0
  479. package/src/plugins/entitlements/entitlements-plugin.ts +1 -1
  480. package/src/plugins/entitlements/index.ts +6 -0
  481. package/src/plugins/frontend-app-plugin.ts +7 -2
  482. package/src/plugins/health/API_ROUTES.md +283 -0
  483. package/src/plugins/health/HealthManagementPage.test.tsx +57 -0
  484. package/src/plugins/health/HealthManagementPage.tsx +320 -0
  485. package/src/plugins/health/HealthStatusWidget.test.tsx +107 -0
  486. package/src/plugins/health/HealthStatusWidget.tsx +134 -0
  487. package/src/plugins/health/index.ts +10 -0
  488. package/src/plugins/index.ts +49 -0
  489. package/src/plugins/logs/API_ROUTES.md +297 -0
  490. package/src/plugins/logs/LogsManagementPage.test.tsx +58 -0
  491. package/src/plugins/logs/LogsManagementPage.tsx +283 -0
  492. package/src/plugins/logs/LogsStatusWidget.test.tsx +119 -0
  493. package/src/plugins/logs/LogsStatusWidget.tsx +123 -0
  494. package/src/plugins/logs/index.ts +10 -0
  495. package/src/plugins/logs-plugin.ts +6 -6
  496. package/src/plugins/maintenance/MaintenanceManagementPage.tsx +193 -0
  497. package/src/plugins/maintenance/MaintenanceStatusWidget.tsx +120 -0
  498. package/src/plugins/maintenance/SeedExecutor.tsx +236 -0
  499. package/src/plugins/maintenance/SeedHistory.tsx +360 -0
  500. package/src/plugins/maintenance/SeedList.tsx +130 -0
  501. package/src/plugins/maintenance/SeedManagementPage.tsx +91 -0
  502. package/src/plugins/maintenance/index.ts +24 -0
  503. package/src/plugins/maintenance/seed-executor.ts +224 -0
  504. package/src/plugins/maintenance-plugin.ts +409 -0
  505. package/src/plugins/notifications/NotificationsManagementPage.test.tsx +58 -0
  506. package/src/plugins/notifications/NotificationsManagementPage.tsx +128 -0
  507. package/src/plugins/notifications/NotificationsStatusWidget.test.tsx +109 -0
  508. package/src/plugins/notifications/NotificationsStatusWidget.tsx +52 -0
  509. package/src/plugins/notifications/index.ts +6 -0
  510. package/src/plugins/notifications/notifications-plugin.ts +1 -1
  511. package/src/plugins/parental/API_ROUTES.md +30 -0
  512. package/src/plugins/parental/ParentalManagementPage.test.tsx +58 -0
  513. package/src/plugins/parental/ParentalManagementPage.tsx +119 -0
  514. package/src/plugins/parental/ParentalStatusWidget.test.tsx +109 -0
  515. package/src/plugins/parental/ParentalStatusWidget.tsx +52 -0
  516. package/src/plugins/parental/index.ts +6 -0
  517. package/src/plugins/parental/parental-plugin.ts +1 -1
  518. package/src/plugins/postgres/API_ROUTES.md +243 -0
  519. package/src/plugins/postgres/PostgresManagementPage.test.tsx +62 -0
  520. package/src/plugins/postgres/PostgresManagementPage.tsx +362 -0
  521. package/src/plugins/postgres/PostgresStatusWidget.test.tsx +117 -0
  522. package/src/plugins/postgres/PostgresStatusWidget.tsx +131 -0
  523. package/src/plugins/postgres/index.ts +10 -0
  524. package/src/plugins/preferences/API_ROUTES.md +162 -0
  525. package/src/plugins/preferences/PreferencesManagementPage.test.tsx +58 -0
  526. package/src/plugins/preferences/PreferencesManagementPage.tsx +139 -0
  527. package/src/plugins/preferences/PreferencesStatusWidget.test.tsx +109 -0
  528. package/src/plugins/preferences/PreferencesStatusWidget.tsx +52 -0
  529. package/src/plugins/preferences/index.ts +6 -0
  530. package/src/plugins/preferences/preferences-plugin.ts +10 -5
  531. package/src/plugins/preferences/types.d.ts +95 -0
  532. package/src/plugins/preferences/types.ts +6 -0
  533. package/src/plugins/profiles/API_ROUTES.md +27 -0
  534. package/src/plugins/profiles/ProfilesManagementPage.test.tsx +58 -0
  535. package/src/plugins/profiles/ProfilesManagementPage.tsx +113 -0
  536. package/src/plugins/profiles/ProfilesStatusWidget.test.tsx +109 -0
  537. package/src/plugins/profiles/ProfilesStatusWidget.tsx +52 -0
  538. package/src/plugins/profiles/index.ts +6 -0
  539. package/src/plugins/profiles/profiles-plugin.ts +1 -1
  540. package/src/plugins/qwickbrain/QwickbrainManagementPage.test.tsx +58 -0
  541. package/src/plugins/qwickbrain/QwickbrainManagementPage.tsx +126 -0
  542. package/src/plugins/qwickbrain/QwickbrainStatusWidget.test.tsx +109 -0
  543. package/src/plugins/qwickbrain/QwickbrainStatusWidget.tsx +52 -0
  544. package/src/plugins/qwickbrain/index.ts +6 -0
  545. package/src/plugins/qwickbrain/qwickbrain-plugin.ts +12 -36
  546. package/src/plugins/qwickbrain/types.ts +0 -1
  547. package/src/plugins/rate-limit/RateLimitManagementPage.test.tsx +58 -0
  548. package/src/plugins/rate-limit/RateLimitManagementPage.tsx +127 -0
  549. package/src/plugins/rate-limit/RateLimitStatusWidget.test.tsx +109 -0
  550. package/src/plugins/rate-limit/RateLimitStatusWidget.tsx +52 -0
  551. package/src/plugins/rate-limit/index.ts +6 -0
  552. package/src/plugins/rate-limit/rate-limit-plugin.ts +5 -5
  553. package/src/plugins/subscriptions/API_ROUTES.md +27 -0
  554. package/src/plugins/subscriptions/SubscriptionsManagementPage.test.tsx +58 -0
  555. package/src/plugins/subscriptions/SubscriptionsManagementPage.tsx +125 -0
  556. package/src/plugins/subscriptions/SubscriptionsStatusWidget.test.tsx +109 -0
  557. package/src/plugins/subscriptions/SubscriptionsStatusWidget.tsx +52 -0
  558. package/src/plugins/subscriptions/index.ts +6 -0
  559. package/src/plugins/subscriptions/subscriptions-plugin.ts +1 -1
  560. package/src/plugins/usage/API_ROUTES.md +24 -0
  561. package/src/plugins/usage/UsageManagementPage.test.tsx +58 -0
  562. package/src/plugins/usage/UsageManagementPage.tsx +93 -0
  563. package/src/plugins/usage/UsageStatusWidget.test.tsx +109 -0
  564. package/src/plugins/usage/UsageStatusWidget.tsx +52 -0
  565. package/src/plugins/usage/index.ts +6 -0
  566. package/src/plugins/usage/usage-plugin.ts +1 -1
  567. package/src/plugins/users/API_ROUTES.md +311 -0
  568. package/src/plugins/users/UsersManagementPage.test.tsx +58 -0
  569. package/src/plugins/users/UsersManagementPage.tsx +384 -0
  570. package/src/plugins/users/UsersStatusWidget.test.tsx +114 -0
  571. package/src/plugins/users/UsersStatusWidget.tsx +120 -0
  572. package/src/plugins/users/__tests__/postgres-store.test.ts +1 -0
  573. package/src/plugins/users/__tests__/users-plugin.test.ts +22 -18
  574. package/src/plugins/users/stores/postgres-store.ts +95 -17
  575. package/src/plugins/users/types.ts +33 -1
  576. package/src/plugins/users/users-plugin.ts +137 -3
  577. package/ui/src/App.tsx +18 -4
  578. package/ui/src/api/clientBuilder.ts +206 -0
  579. package/ui/src/api/controlPanelApi.ts +309 -122
  580. package/ui/src/api/index.ts +12 -0
  581. package/ui/src/api/types.ts +276 -0
  582. package/ui/src/components/ControlPanelApp.tsx +4 -5
  583. package/ui/src/components/auth/AcceptInvitationPage.tsx +151 -0
  584. package/ui/src/components/auth/LoginPage.tsx +122 -0
  585. package/ui/src/components/auth/PasswordResetConfirmPage.tsx +109 -0
  586. package/ui/src/components/auth/PasswordResetPage.tsx +95 -0
  587. package/ui/src/components/auth/SignupPage.tsx +140 -0
  588. package/ui/src/components/auth/VerifyEmailPage.tsx +38 -0
  589. package/ui/src/components/auth/__tests__/AcceptInvitationPage.test.tsx +201 -0
  590. package/ui/src/components/auth/__tests__/LoginPage.test.tsx +207 -0
  591. package/ui/src/components/auth/__tests__/PasswordResetConfirmPage.test.tsx +183 -0
  592. package/ui/src/components/auth/__tests__/PasswordResetPage.test.tsx +174 -0
  593. package/ui/src/components/auth/__tests__/SignupPage.test.tsx +210 -0
  594. package/ui/src/components/auth/__tests__/VerifyEmailPage.test.tsx +53 -0
  595. package/ui/src/components/auth/index.ts +26 -0
  596. package/ui/src/components/auth/shared/AuthError.tsx +28 -0
  597. package/ui/src/components/auth/shared/AuthLayout.tsx +42 -0
  598. package/ui/src/components/auth/shared/index.ts +9 -0
  599. package/ui/src/components/index.ts +21 -2
  600. package/ui/src/components/plugins/PluginConfigPanel.tsx +315 -0
  601. package/ui/src/components/plugins/PluginManagementPage.tsx +218 -0
  602. package/ui/src/components/plugins/PluginStatusWidget.tsx +158 -0
  603. package/ui/src/components/plugins/index.ts +20 -0
  604. package/ui/src/config/preferences.ts +18 -0
  605. package/ui/src/dashboard/builtInWidgets.tsx +15 -1
  606. package/ui/src/dashboard/widgets/CMSMaintenanceWidget.tsx +229 -0
  607. package/ui/src/dashboard/widgets/CMSStatusWidget.tsx +115 -0
  608. package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +1 -1
  609. package/ui/src/dashboard/widgets/index.ts +2 -0
  610. package/ui/src/hooks/useJobStream.ts +194 -0
  611. package/ui/src/pages/APIKeysPage.tsx +849 -0
  612. package/ui/src/pages/AcceptInvitationPage.tsx +169 -0
  613. package/ui/src/pages/ContentOpsJobsPage.tsx +422 -0
  614. package/ui/src/pages/MaintenancePage.tsx +27 -0
  615. package/ui/src/pages/NotificationsPage.tsx +1 -1
  616. package/ui/src/pages/PluginPage.tsx +3 -1
  617. package/ui/src/pages/PreferencesPage.tsx +240 -0
  618. package/ui/src/pages/UsersPage.tsx +225 -2
  619. package/ui/src/pages/__tests__/PreferencesPage.test.tsx +273 -0
  620. package/ui/src/pages/index.ts +15 -0
  621. package/ui/tsconfig.lib.json +4 -2
  622. package/dist/plugins/auth/adapter-wrapper.test.d.ts +0 -7
  623. package/dist/plugins/auth/adapter-wrapper.test.d.ts.map +0 -1
  624. package/dist/plugins/auth/adapter-wrapper.test.js +0 -303
  625. package/dist/plugins/auth/adapter-wrapper.test.js.map +0 -1
  626. package/dist/plugins/auth/auth-plugin.test.d.ts +0 -9
  627. package/dist/plugins/auth/auth-plugin.test.d.ts.map +0 -1
  628. package/dist/plugins/auth/auth-plugin.test.js +0 -280
  629. package/dist/plugins/auth/auth-plugin.test.js.map +0 -1
  630. package/dist/plugins/auth/config-store.test.d.ts +0 -7
  631. package/dist/plugins/auth/config-store.test.d.ts.map +0 -1
  632. package/dist/plugins/auth/config-store.test.js +0 -299
  633. package/dist/plugins/auth/config-store.test.js.map +0 -1
  634. package/dist/plugins/auth/supertokens-adapter.test.d.ts +0 -10
  635. package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +0 -1
  636. package/dist/plugins/auth/supertokens-adapter.test.js +0 -486
  637. package/dist/plugins/auth/supertokens-adapter.test.js.map +0 -1
  638. package/dist/plugins/cache-plugin.test.d.ts +0 -8
  639. package/dist/plugins/cache-plugin.test.d.ts.map +0 -1
  640. package/dist/plugins/cache-plugin.test.js +0 -255
  641. package/dist/plugins/cache-plugin.test.js.map +0 -1
  642. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +0 -11
  643. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +0 -1
  644. package/dist/plugins/devices/__tests__/devices-plugin.test.js +0 -410
  645. package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +0 -1
  646. package/dist/plugins/devices/__tests__/token-utils.test.d.ts +0 -7
  647. package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +0 -1
  648. package/dist/plugins/devices/__tests__/token-utils.test.js +0 -199
  649. package/dist/plugins/devices/__tests__/token-utils.test.js.map +0 -1
  650. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +0 -5
  651. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +0 -1
  652. package/dist/plugins/notifications/__tests__/notifications-manager.test.js +0 -470
  653. package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +0 -1
  654. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +0 -12
  655. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +0 -1
  656. package/dist/plugins/parental/__tests__/parental-plugin.test.js +0 -349
  657. package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +0 -1
  658. package/dist/plugins/postgres-plugin.test.d.ts +0 -8
  659. package/dist/plugins/postgres-plugin.test.d.ts.map +0 -1
  660. package/dist/plugins/postgres-plugin.test.js +0 -186
  661. package/dist/plugins/postgres-plugin.test.js.map +0 -1
  662. package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +0 -7
  663. package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +0 -1
  664. package/dist/plugins/preferences/__tests__/deep-merge.test.js +0 -215
  665. package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +0 -1
  666. package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +0 -7
  667. package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +0 -1
  668. package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +0 -265
  669. package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +0 -1
  670. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +0 -11
  671. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +0 -1
  672. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +0 -243
  673. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +0 -1
  674. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts +0 -7
  675. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts.map +0 -1
  676. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js +0 -220
  677. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js.map +0 -1
  678. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +0 -11
  679. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +0 -1
  680. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +0 -305
  681. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +0 -1
  682. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +0 -11
  683. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +0 -1
  684. package/dist/plugins/usage/__tests__/usage-plugin.test.js +0 -218
  685. package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +0 -1
  686. package/dist/plugins/users/__tests__/postgres-store.test.d.ts +0 -10
  687. package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +0 -1
  688. package/dist/plugins/users/__tests__/postgres-store.test.js +0 -229
  689. package/dist/plugins/users/__tests__/postgres-store.test.js.map +0 -1
  690. package/dist/plugins/users/__tests__/users-plugin.test.d.ts +0 -9
  691. package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +0 -1
  692. package/dist/plugins/users/__tests__/users-plugin.test.js +0 -549
  693. package/dist/plugins/users/__tests__/users-plugin.test.js.map +0 -1
  694. package/dist-ui/assets/index-BfC7mG5L.js +0 -469
  695. package/dist-ui/assets/index-BfC7mG5L.js.map +0 -1
  696. package/dist-ui-lib/components/StatCard.d.ts +0 -16
  697. package/dist-ui-lib/pages/ConfigPage.d.ts +0 -1
  698. package/dist-ui-lib/pages/DiagnosticsPage.d.ts +0 -1
  699. package/dist-ui-lib/pages/IntegrationsPage.d.ts +0 -1
  700. package/dist-ui-lib/pages/NotificationsPage.d.ts +0 -9
  701. package/dist-ui-lib/pages/PluginPage.d.ts +0 -15
  702. package/dist-ui-lib/pages/PluginsPage.d.ts +0 -1
  703. package/dist-ui-lib/pages/RateLimitPage.d.ts +0 -1
  704. package/ui/src/components/StatCard.tsx +0 -58
  705. /package/dist-ui-lib/{config → src/config}/AppConfig.d.ts +0 -0
  706. /package/dist-ui-lib/{dashboard → src/dashboard}/DashboardWidgetRegistry.d.ts +0 -0
  707. /package/dist-ui-lib/{dashboard → src/dashboard}/DashboardWidgetRenderer.d.ts +0 -0
  708. /package/dist-ui-lib/{dashboard → src/dashboard}/PluginWidgetRenderer.d.ts +0 -0
  709. /package/dist-ui-lib/{dashboard → src/dashboard}/WidgetComponentRegistry.d.ts +0 -0
  710. /package/dist-ui-lib/{dashboard → src/dashboard}/builtInWidgets.d.ts +0 -0
  711. /package/dist-ui-lib/{dashboard → src/dashboard}/index.d.ts +0 -0
  712. /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/AuthStatusWidget.d.ts +0 -0
  713. /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/IntegrationStatusWidget.d.ts +0 -0
  714. /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/NotificationsStatsWidget.d.ts +0 -0
  715. /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/ServiceHealthWidget.d.ts +0 -0
  716. /package/dist-ui-lib/{pages → src/pages}/AuthPage.d.ts +0 -0
  717. /package/dist-ui-lib/{pages → src/pages}/DashboardPage.d.ts +0 -0
  718. /package/dist-ui-lib/{pages → src/pages}/EntitlementsPage.d.ts +0 -0
  719. /package/dist-ui-lib/{pages → src/pages}/LogsPage.d.ts +0 -0
  720. /package/dist-ui-lib/{pages → src/pages}/NotFoundPage.d.ts +0 -0
  721. /package/dist-ui-lib/{pages → src/pages}/SystemPage.d.ts +0 -0
  722. /package/dist-ui-lib/{pages → src/pages}/UsersPage.d.ts +0 -0
  723. /package/dist-ui-lib/{utils → src/utils}/formatters.d.ts +0 -0
@@ -6,7 +6,13 @@
6
6
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
7
  */
8
8
 
9
- import express, { type Application, type Router, type Request, type Response } from 'express';
9
+ import express, {
10
+ type Application,
11
+ type Router,
12
+ type Request,
13
+ type Response,
14
+ type RequestHandler,
15
+ } from 'express';
10
16
  import helmet from 'helmet';
11
17
  import cors from 'cors';
12
18
  import compression from 'compression';
@@ -29,6 +35,8 @@ import {
29
35
  type PluginConfig,
30
36
  type PluginRegistryImpl,
31
37
  } from './plugin-registry.js';
38
+ import { bearerTokenAuth } from '../plugins/api-keys/index.js';
39
+ import { createCorePlugin } from '../plugins/core/index.js';
32
40
 
33
41
  // Get the package root directory for serving UI assets
34
42
  const __filename = fileURLToPath(import.meta.url);
@@ -60,6 +68,61 @@ export interface CreateControlPanelOptions {
60
68
  logging?: LoggingConfig;
61
69
  }
62
70
 
71
+ /**
72
+ * Infer a descriptive route name from path and method
73
+ * Examples:
74
+ * /api/logs + GET → query
75
+ * /api/logs/sources + GET → sources
76
+ * /api/users/:id + GET → get
77
+ * /api/users + POST → create
78
+ */
79
+ function inferRouteName(path: string, method: string, pluginId?: string): string {
80
+ // Remove /api prefix and leading/trailing slashes
81
+ let cleanPath = path.replace(/^\/api\//, '').replace(/^\/|\/$/g, '');
82
+
83
+ // For non-core plugins, strip the plugin slug prefix from the path
84
+ if (pluginId && pluginId !== 'core' && cleanPath.startsWith(pluginId + '/')) {
85
+ cleanPath = cleanPath.substring(pluginId.length + 1);
86
+ } else if (pluginId && pluginId !== 'core' && cleanPath === pluginId) {
87
+ // Handle root path for plugin (e.g., /logs -> '')
88
+ cleanPath = '';
89
+ }
90
+
91
+ // Split into segments
92
+ const segments = cleanPath.split('/').filter(Boolean);
93
+
94
+ // If path has parameters (e.g., /users/:id), use method-based naming
95
+ if (path.includes(':')) {
96
+ const methodMap: Record<string, string> = {
97
+ get: 'get',
98
+ post: 'create',
99
+ put: 'update',
100
+ patch: 'update',
101
+ delete: 'delete',
102
+ };
103
+ return methodMap[method.toLowerCase()] || method.toLowerCase();
104
+ }
105
+
106
+ // For root paths (plugin root), use 'query' for GET, otherwise method name
107
+ if (segments.length === 0) {
108
+ if (method.toLowerCase() === 'get') {
109
+ return 'query';
110
+ }
111
+ return method.toLowerCase();
112
+ }
113
+
114
+ if (segments.length === 1) {
115
+ // Single segment paths like /sources, /health, /info, /invite, /sync, /stats
116
+ // Use the segment name directly for all methods
117
+ const segment = segments[0];
118
+ // Convert hyphens to camelCase (ui-contributions -> uiContributions)
119
+ return segment.replace(/-./g, x => x[1].toUpperCase());
120
+ }
121
+
122
+ // Multi-segment paths like /logs/sources - use last segment
123
+ return segments[segments.length - 1];
124
+ }
125
+
63
126
  /**
64
127
  * Create a control panel instance
65
128
  */
@@ -129,129 +192,72 @@ export function createControlPanel(options: CreateControlPanelOptions): ControlP
129
192
  // Only protect the control panel path, not the root or other paths
130
193
  app.use(mountPath, guardMiddleware);
131
194
  }
132
- const apiBasePath = mountPath === '/' ? '/api' : `${mountPath}/api`;
133
-
134
195
  // Request logging
135
196
  app.use((req, _res, next) => {
136
197
  logger.debug(`${req.method} ${req.path}`);
137
198
  next();
138
199
  });
139
200
 
140
- // Mount router at the configured path
141
- app.use(apiBasePath, router);
201
+ // CRITICAL: System APIs always mount at /api regardless of mountPath
202
+ // This ensures consistent API paths across all products
203
+ // See: ADR-012-QwickApps-Server-Routing-Architecture
204
+ app.use('/api', router);
142
205
 
143
206
  // Built-in routes
144
207
 
145
- /**
146
- * GET /api/health - Aggregated health status
147
- */
148
- router.get('/health', (_req: Request, res: Response) => {
149
- const results = healthManager.getResults();
150
- const status = healthManager.getAggregatedStatus();
151
- const uptime = Date.now() - startTime;
152
-
153
- res.status(status === 'healthy' ? 200 : status === 'degraded' ? 200 : 503).json({
154
- status,
155
- timestamp: new Date().toISOString(),
156
- uptime,
157
- checks: results,
158
- });
159
- });
208
+ // Core routes (/health, /info, /diagnostics, /ui-contributions, /plugins) have been moved
209
+ // to the core plugin (src/plugins/core/index.ts) so they appear in the API client manifest
160
210
 
161
211
  /**
162
- * GET /api/info - Product information
212
+ * GET /api/client-manifest - Route manifest for client code generation
213
+ *
214
+ * Returns all registered API routes with metadata for dynamic client building.
215
+ * Frontend applications can fetch this manifest to auto-generate typed API clients.
163
216
  */
164
- router.get('/info', (_req: Request, res: Response) => {
165
- res.json({
166
- product: config.productName,
167
- logoName: config.logoName || config.productName,
168
- logoIconUrl: config.logoIconUrl,
169
- version: config.version || 'unknown',
170
- uptime: Date.now() - startTime,
171
- links: config.links || [],
172
- branding: config.branding || {},
173
- });
174
- });
217
+ router.get('/client-manifest', (_req: Request, res: Response) => {
218
+ const routes = pluginRegistry.getRoutes();
175
219
 
176
- /**
177
- * GET /api/diagnostics - Full diagnostics for AI agents
178
- */
179
- router.get('/diagnostics', (_req: Request, res: Response) => {
180
- const report = getDiagnostics();
181
- res.json(report);
182
- });
220
+ // Build manifest with namespaced keys (pluginId.routeName)
221
+ const manifest: Record<string, {
222
+ method: string;
223
+ path: string;
224
+ auth: boolean;
225
+ }> = {};
183
226
 
184
- /**
185
- * GET /api/ui-contributions - UI contributions from all plugins
186
- *
187
- * Returns menu items, pages, and widgets registered by plugins.
188
- * Used by the React UI to build dynamic navigation and pages.
189
- */
190
- router.get('/ui-contributions', (_req: Request, res: Response) => {
191
- res.json({
192
- menuItems: pluginRegistry.getMenuItems(),
193
- pages: pluginRegistry.getPages(),
194
- widgets: pluginRegistry.getWidgets(),
195
- plugins: pluginRegistry.listPlugins(),
196
- });
197
- });
227
+ for (const route of routes) {
228
+ // Skip middleware routes (method: 'use')
229
+ if (route.method === 'use') {
230
+ continue;
231
+ }
198
232
 
199
- /**
200
- * GET /api/plugins - List all registered plugins with contribution counts
201
- */
202
- router.get('/plugins', (_req: Request, res: Response) => {
203
- const plugins = pluginRegistry.listPlugins().map((plugin) => {
204
- const contributions = pluginRegistry.getPluginContributions(plugin.id);
205
- return {
206
- ...plugin,
207
- contributionCounts: {
208
- routes: contributions.routes.length,
209
- menuItems: contributions.menuItems.length,
210
- pages: contributions.pages.length,
211
- widgets: contributions.widgets.length,
212
- hasConfig: !!contributions.config,
213
- },
214
- };
215
- });
216
- res.json({ plugins });
217
- });
233
+ const pluginId = route.pluginId || 'core';
234
+ const routeName = inferRouteName(route.path, route.method, pluginId);
235
+ const key = `${pluginId}.${routeName}`;
218
236
 
219
- /**
220
- * GET /api/plugins/:id - Get detailed plugin info with contributions
221
- */
222
- router.get('/plugins/:id', (req: Request, res: Response) => {
223
- const { id } = req.params;
224
- const plugins = pluginRegistry.listPlugins();
225
- const plugin = plugins.find((p) => p.id === id);
226
-
227
- if (!plugin) {
228
- res.status(404).json({ error: `Plugin not found: ${id}` });
229
- return;
237
+ manifest[key] = {
238
+ method: route.method.toUpperCase(),
239
+ path: `/api${route.path}`,
240
+ auth: route.auth?.required || false,
241
+ };
230
242
  }
231
243
 
232
- const contributions = pluginRegistry.getPluginContributions(id);
233
- res.json({
234
- ...plugin,
235
- contributions,
236
- });
244
+ res.json({ routes: manifest, version: '1.0' });
237
245
  });
238
246
 
239
247
  /**
240
248
  * Serve dashboard UI at the configured mount path
241
249
  *
242
- * Priority:
243
- * 1. If useRichUI is true and dist-ui exists, serve React SPA
244
- * 2. Otherwise serve simple static HTML dashboard
250
+ * ONLY serves the React SPA from dist-ui. No HTML fallback.
245
251
  */
246
252
  if (!config.disableDashboard) {
247
253
  // Use customUiPath if provided, otherwise fall back to package's dist-ui
248
254
  const effectiveUiPath = config.customUiPath || uiDistPath;
249
255
  const hasRichUI = existsSync(effectiveUiPath);
250
- const useRichUI = config.useRichUI !== false && hasRichUI;
251
-
252
- logger.debug(`Dashboard config: mountPath=${mountPath}, effectiveUiPath=${effectiveUiPath}, hasRichUI=${hasRichUI}, useRichUI=${useRichUI}`);
253
256
 
254
- if (useRichUI) {
257
+ if (!hasRichUI) {
258
+ logger.error(`React UI not found at ${effectiveUiPath}. Control panel UI will not be available.`);
259
+ logger.error(`Build the UI first: cd packages/qwickapps-server && npm run build:ui`);
260
+ } else {
255
261
  logger.debug(`Serving React UI from ${effectiveUiPath}`);
256
262
 
257
263
  // Read index.html template
@@ -297,8 +303,8 @@ export function createControlPanel(options: CreateControlPanelOptions): ControlP
297
303
  // SPA fallback - serve index.html for all non-API routes under the mount path
298
304
  const spaFallbackPath = mountPath === '/' ? '/*' : `${mountPath}/*`;
299
305
  app.get(spaFallbackPath, (req: Request, res: Response, next) => {
300
- // Skip API routes
301
- if (req.path.startsWith(apiBasePath)) {
306
+ // Skip API routes (always at /api)
307
+ if (req.path.startsWith('/api')) {
302
308
  return next();
303
309
  }
304
310
  res.type('html').send(getIndexHtml(req));
@@ -310,13 +316,6 @@ export function createControlPanel(options: CreateControlPanelOptions): ControlP
310
316
  res.type('html').send(getIndexHtml(req));
311
317
  });
312
318
  }
313
- } else {
314
- logger.debug(`Serving basic HTML dashboard`);
315
- const dashboardPath = mountPath === '/' ? '/' : mountPath;
316
- app.get(dashboardPath, (_req: Request, res: Response) => {
317
- const html = generateDashboardHtml(config, healthManager.getResults(), mountPath);
318
- res.type('html').send(html);
319
- });
320
319
  }
321
320
  }
322
321
 
@@ -370,11 +369,26 @@ export function createControlPanel(options: CreateControlPanelOptions): ControlP
370
369
 
371
370
  // Start server
372
371
  const start = async (): Promise<void> => {
372
+ // Start core plugin first (registers /info, /health, /diagnostics, etc.)
373
+ const corePlugin = createCorePlugin({
374
+ config,
375
+ startTime,
376
+ healthManager,
377
+ getDiagnostics,
378
+ });
379
+ const coreSuccess = await pluginRegistry.startPlugin(corePlugin, {});
380
+ if (!coreSuccess) {
381
+ logger.error('Failed to start core plugin');
382
+ }
383
+
373
384
  // Start initial plugins via registry
374
385
  for (const { plugin, config: pluginConfig } of plugins) {
375
386
  const success = await pluginRegistry.startPlugin(plugin, pluginConfig || {});
376
387
  if (!success) {
377
- logger.error(`Failed to start plugin: ${plugin.id}`);
388
+ // Retrieve error details from registry for better debugging
389
+ const pluginInfo = pluginRegistry.listPlugins().find(p => p.id === plugin.id);
390
+ const errorDetails = pluginInfo?.error || 'Unknown error';
391
+ logger.error(`Failed to start plugin: ${plugin.id}`, { error: errorDetails });
378
392
  }
379
393
  }
380
394
 
@@ -392,37 +406,45 @@ export function createControlPanel(options: CreateControlPanelOptions): ControlP
392
406
  return b.path.length - a.path.length;
393
407
  });
394
408
 
395
- // Register routes with Express
409
+ // Register routes with Express router (mounted at apiBasePath)
396
410
  logger.debug(`Registering ${routes.length} routes in priority order:`);
397
411
  for (const route of routes) {
398
- // TODO: Add auth middleware if route.auth?.required
399
- // For now, just register the handler
400
- // Auth will be handled by auth plugin middleware globally
412
+ const handlers: RequestHandler[] = [];
413
+
414
+ // Add auth middleware if route requires it
415
+ if (route.auth?.required) {
416
+ handlers.push(
417
+ bearerTokenAuth({
418
+ allowedKeyTypes: ['m2m'], // M2M keys for authenticated routes
419
+ requiredScopes: [], // No specific scopes required for now
420
+ })
421
+ );
422
+ }
401
423
 
402
- const handlers = [route.handler];
424
+ handlers.push(route.handler);
403
425
 
404
426
  switch (route.method) {
405
427
  case 'get':
406
- app.get(route.path, ...handlers);
428
+ router.get(route.path, ...handlers);
407
429
  break;
408
430
  case 'post':
409
- app.post(route.path, ...handlers);
431
+ router.post(route.path, ...handlers);
410
432
  break;
411
433
  case 'put':
412
- app.put(route.path, ...handlers);
434
+ router.put(route.path, ...handlers);
413
435
  break;
414
436
  case 'delete':
415
- app.delete(route.path, ...handlers);
437
+ router.delete(route.path, ...handlers);
416
438
  break;
417
439
  case 'patch':
418
- app.patch(route.path, ...handlers);
440
+ router.patch(route.path, ...handlers);
419
441
  break;
420
442
  case 'use':
421
- app.use(route.path, ...handlers);
443
+ router.use(route.path, ...handlers);
422
444
  break;
423
445
  }
424
446
 
425
- logger.debug(` ${route.method.toUpperCase()} ${route.path}`);
447
+ logger.debug(` ${route.method.toUpperCase()} /api${route.path}`);
426
448
  }
427
449
 
428
450
  return new Promise((resolve) => {
@@ -463,171 +485,6 @@ export function createControlPanel(options: CreateControlPanelOptions): ControlP
463
485
  };
464
486
  }
465
487
 
466
- /**
467
- * Generate simple dashboard HTML
468
- */
469
- function generateDashboardHtml(
470
- config: ControlPanelConfig,
471
- health: Record<string, { status: string; latency?: number; lastChecked: Date }>,
472
- mountPath: string = '/cpanel'
473
- ): string {
474
- const apiBasePath = mountPath === '/' ? '/api' : `${mountPath}/api`;
475
- const healthEntries = Object.entries(health);
476
- const overallStatus = healthEntries.every((e) => e[1].status === 'healthy')
477
- ? 'healthy'
478
- : healthEntries.some((e) => e[1].status === 'unhealthy')
479
- ? 'unhealthy'
480
- : 'degraded';
481
-
482
- const statusColor =
483
- overallStatus === 'healthy' ? '#22c55e' : overallStatus === 'degraded' ? '#f59e0b' : '#ef4444';
484
-
485
- const linksHtml = (config.links || [])
486
- .map(
487
- (link) =>
488
- `<a href="${link.url}" ${link.external ? 'target="_blank"' : ''} class="link">${link.label}</a>`
489
- )
490
- .join('');
491
-
492
- const healthHtml = healthEntries
493
- .map(
494
- ([name, result]) => `
495
- <div class="health-item">
496
- <span class="status-dot" style="background-color: ${
497
- result.status === 'healthy' ? '#22c55e' : result.status === 'degraded' ? '#f59e0b' : '#ef4444'
498
- }"></span>
499
- <span class="name">${name}</span>
500
- <span class="latency">${result.latency ? `${result.latency}ms` : '-'}</span>
501
- </div>
502
- `
503
- )
504
- .join('');
505
-
506
- return `<!DOCTYPE html>
507
- <html lang="en">
508
- <head>
509
- <meta charset="UTF-8">
510
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
511
- <title>${config.productName} - Control Panel</title>
512
- <style>
513
- * { margin: 0; padding: 0; box-sizing: border-box; }
514
- body {
515
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
516
- background: #0f172a;
517
- color: #e2e8f0;
518
- min-height: 100vh;
519
- padding: 2rem;
520
- }
521
- .container { max-width: 1200px; margin: 0 auto; }
522
- header {
523
- display: flex;
524
- justify-content: space-between;
525
- align-items: center;
526
- margin-bottom: 2rem;
527
- padding-bottom: 1rem;
528
- border-bottom: 1px solid #334155;
529
- }
530
- h1 { font-size: 1.5rem; color: ${config.branding?.primaryColor || '#6366f1'}; }
531
- .status-badge {
532
- display: inline-flex;
533
- align-items: center;
534
- gap: 0.5rem;
535
- padding: 0.5rem 1rem;
536
- border-radius: 9999px;
537
- background: ${statusColor}20;
538
- color: ${statusColor};
539
- font-weight: 600;
540
- }
541
- .status-dot {
542
- width: 8px;
543
- height: 8px;
544
- border-radius: 50%;
545
- background: currentColor;
546
- }
547
- .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem; }
548
- .card {
549
- background: #1e293b;
550
- border-radius: 0.75rem;
551
- padding: 1.5rem;
552
- border: 1px solid #334155;
553
- }
554
- .card h2 {
555
- font-size: 0.875rem;
556
- text-transform: uppercase;
557
- letter-spacing: 0.05em;
558
- color: #94a3b8;
559
- margin-bottom: 1rem;
560
- }
561
- .health-item {
562
- display: flex;
563
- align-items: center;
564
- gap: 0.75rem;
565
- padding: 0.75rem 0;
566
- border-bottom: 1px solid #334155;
567
- }
568
- .health-item:last-child { border-bottom: none; }
569
- .health-item .name { flex: 1; }
570
- .health-item .latency { color: #64748b; font-size: 0.875rem; }
571
- .links { display: flex; flex-wrap: wrap; gap: 0.75rem; }
572
- .link {
573
- display: inline-block;
574
- padding: 0.75rem 1.5rem;
575
- background: #334155;
576
- color: #e2e8f0;
577
- text-decoration: none;
578
- border-radius: 0.5rem;
579
- transition: background 0.2s;
580
- }
581
- .link:hover { background: #475569; }
582
- .api-links { margin-top: 2rem; padding-top: 1rem; border-top: 1px solid #334155; }
583
- .api-links a { color: #6366f1; margin-right: 1.5rem; text-decoration: none; }
584
- .api-links a:hover { text-decoration: underline; }
585
- </style>
586
- </head>
587
- <body>
588
- <div class="container">
589
- <header>
590
- <h1>${config.productName} Control Panel</h1>
591
- <div class="status-badge">
592
- <span class="status-dot"></span>
593
- ${overallStatus.charAt(0).toUpperCase() + overallStatus.slice(1)}
594
- </div>
595
- </header>
596
-
597
- <div class="cards">
598
- <div class="card">
599
- <h2>Health Checks</h2>
600
- ${healthHtml || '<p style="color: #64748b;">No health checks configured</p>'}
601
- </div>
602
-
603
- ${
604
- (config.links || []).length > 0
605
- ? `
606
- <div class="card">
607
- <h2>Quick Links</h2>
608
- <div class="links">${linksHtml}</div>
609
- </div>
610
- `
611
- : ''
612
- }
613
- </div>
614
-
615
- <div class="api-links">
616
- <strong>API:</strong>
617
- <a href="${apiBasePath}/health">Health</a>
618
- <a href="${apiBasePath}/info">Info</a>
619
- <a href="${apiBasePath}/diagnostics">Diagnostics</a>
620
- </div>
621
- </div>
622
-
623
- <script>
624
- // Auto-refresh health status every 10 seconds
625
- setTimeout(() => location.reload(), 10000);
626
- </script>
627
- </body>
628
- </html>`;
629
- }
630
-
631
488
  /**
632
489
  * Generate landing page HTML for root path
633
490
  */
@@ -641,10 +498,7 @@ function generateLandingPageHtml(options: {
641
498
  }): string {
642
499
  const { productName, title, heading, description, controlPanelPath, links = [] } = options;
643
500
 
644
- const linksHtml = [
645
- { label: 'Control Panel', url: controlPanelPath },
646
- ...links,
647
- ]
501
+ const linksHtml = links
648
502
  .map(
649
503
  (link) =>
650
504
  `<a href="${link.url}" class="link">${link.label}</a>`
@@ -739,3 +593,4 @@ function generateLandingPageHtml(options: {
739
593
  </body>
740
594
  </html>`;
741
595
  }
596
+
@@ -23,7 +23,7 @@ import { HealthManager } from './health-manager.js';
23
23
  * Events that plugins can react to
24
24
  */
25
25
  export type PluginEvent =
26
- | { type: 'plugin:started'; pluginId: string; config: unknown }
26
+ | { type: 'plugin:started'; pluginId: string; plugin: Plugin; config: unknown }
27
27
  | { type: 'plugin:stopped'; pluginId: string }
28
28
  | { type: 'plugin:config-changed'; pluginId: string; key: string; oldValue: unknown; newValue: unknown }
29
29
  | { type: 'plugin:error'; pluginId: string; error: Error };
@@ -64,6 +64,18 @@ export interface PluginInfo {
64
64
  */
65
65
  export type PluginType = 'regular' | 'system';
66
66
 
67
+ /**
68
+ * Plugin scope definition for API key authorization
69
+ */
70
+ export interface PluginScope {
71
+ /** Scope name in format 'plugin-id:action' (e.g., 'qwickbrain:execute') */
72
+ name: string;
73
+ /** Human-readable description for UI */
74
+ description: string;
75
+ /** Optional category for grouping (read, write, admin) */
76
+ category?: 'read' | 'write' | 'admin';
77
+ }
78
+
67
79
  /**
68
80
  * The Plugin interface - simple lifecycle with event handling
69
81
  */
@@ -93,6 +105,15 @@ export interface Plugin {
93
105
  */
94
106
  slug?: string;
95
107
 
108
+ /**
109
+ * Scopes that this plugin declares for API key authorization
110
+ * Format: 'plugin-id:action' (e.g., 'qwickbrain:execute')
111
+ *
112
+ * Scopes are registered automatically when the plugin starts and
113
+ * can be assigned to API keys for fine-grained access control.
114
+ */
115
+ scopes?: PluginScope[];
116
+
96
117
  /**
97
118
  * Configuration options for this plugin
98
119
  */
@@ -446,7 +467,22 @@ export class PluginRegistryImpl implements PluginRegistry {
446
467
  // Auto-prefix for regular plugins
447
468
  if (pluginType === 'regular') {
448
469
  const slug = this.pluginSlugs.get(this.currentPlugin)!;
449
- fullPath = `/${slug}${route.path}`;
470
+
471
+ // Detect and auto-fix duplicate slug prefix (defensive measure)
472
+ // Example: Plugin 'users' should use prefix '/' not '/users'
473
+ // If configured as '/users', we auto-fix to '/' to prevent /api/users/users
474
+ let normalizedPath = route.path;
475
+ if (route.path.startsWith(`/${slug}/`) || route.path === `/${slug}`) {
476
+ normalizedPath = route.path.substring(slug.length + 1) || '/';
477
+ this.logger.warn(
478
+ `⚠️ DUPLICATE SLUG PREFIX DETECTED: Plugin '${this.currentPlugin}' configured with prefix='${route.path}'` +
479
+ `\n Auto-fixed to prefix='${normalizedPath}' to prevent double-prefixing.` +
480
+ `\n Please update plugin configuration to use prefix='${normalizedPath}' instead of prefix='${route.path}'.` +
481
+ `\n See: packages/qwickapps-server/src/plugins/*/types.ts for correct prefix documentation.`
482
+ );
483
+ }
484
+
485
+ fullPath = `/${slug}${normalizedPath}`;
450
486
  }
451
487
 
452
488
  const routeWithMetadata: RouteDefinition = {
@@ -693,6 +729,7 @@ export class PluginRegistryImpl implements PluginRegistry {
693
729
  this.emit({
694
730
  type: 'plugin:started',
695
731
  pluginId: plugin.id,
732
+ plugin,
696
733
  config,
697
734
  });
698
735
 
@@ -710,7 +747,19 @@ export class PluginRegistryImpl implements PluginRegistry {
710
747
  error: error instanceof Error ? error : new Error(errorMessage),
711
748
  });
712
749
 
713
- this.logger.error(`Plugin ${plugin.id} failed to start`, { error: errorMessage });
750
+ // Log full error with stack trace for debugging
751
+ if (error instanceof Error) {
752
+ this.logger.error(`Plugin ${plugin.id} failed to start: ${errorMessage}`, {
753
+ error: error.message,
754
+ stack: error.stack,
755
+ plugin: plugin.id,
756
+ });
757
+ } else {
758
+ this.logger.error(`Plugin ${plugin.id} failed to start: ${errorMessage}`, {
759
+ error: errorMessage,
760
+ plugin: plugin.id,
761
+ });
762
+ }
714
763
  return false;
715
764
  }
716
765
  }