@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
@@ -0,0 +1,849 @@
1
+ /**
2
+ * APIKeysPage Component
3
+ *
4
+ * API key management page for authentication and authorization.
5
+ * Allows users to create, view, and manage API keys with scopes.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { useState, useEffect, useCallback } from 'react';
11
+ import {
12
+ Box,
13
+ Card,
14
+ CardContent,
15
+ Table,
16
+ TableBody,
17
+ TableCell,
18
+ TableContainer,
19
+ TableHead,
20
+ TableRow,
21
+ Chip,
22
+ Alert,
23
+ LinearProgress,
24
+ IconButton,
25
+ Tooltip,
26
+ TextField,
27
+ FormControl,
28
+ InputLabel,
29
+ Select,
30
+ MenuItem,
31
+ FormHelperText,
32
+ Checkbox,
33
+ FormControlLabel,
34
+ FormGroup,
35
+ } from '@mui/material';
36
+ import {
37
+ Text,
38
+ Button,
39
+ Dialog,
40
+ DialogTitle,
41
+ DialogContent,
42
+ DialogActions,
43
+ GridLayout,
44
+ } from '@qwickapps/react-framework';
45
+ import KeyIcon from '@mui/icons-material/Key';
46
+ import ContentCopyIcon from '@mui/icons-material/ContentCopy';
47
+ import DeleteIcon from '@mui/icons-material/Delete';
48
+ import EditIcon from '@mui/icons-material/Edit';
49
+ import VisibilityIcon from '@mui/icons-material/Visibility';
50
+ import VisibilityOffIcon from '@mui/icons-material/VisibilityOff';
51
+ import CheckCircleIcon from '@mui/icons-material/CheckCircle';
52
+ import CancelIcon from '@mui/icons-material/Cancel';
53
+ import {
54
+ api,
55
+ type ApiKey,
56
+ type ApiKeyWithPlaintext,
57
+ type CreateApiKeyRequest,
58
+ type PluginScopesGroup,
59
+ type KeyUsageResponse,
60
+ } from '../api/controlPanelApi';
61
+ import AssessmentIcon from '@mui/icons-material/Assessment';
62
+
63
+ export interface APIKeysPageProps {
64
+ title?: string;
65
+ subtitle?: string;
66
+ }
67
+
68
+ export function APIKeysPage({
69
+ title = 'API Keys',
70
+ subtitle = 'Manage API keys for programmatic access',
71
+ }: APIKeysPageProps) {
72
+ // State
73
+ const [keys, setKeys] = useState<ApiKey[]>([]);
74
+ const [loading, setLoading] = useState(true);
75
+ const [error, setError] = useState<string | null>(null);
76
+ const [success, setSuccess] = useState<string | null>(null);
77
+
78
+ // Phase 2: Available scopes
79
+ const [availableScopes, setAvailableScopes] = useState<PluginScopesGroup[]>([]);
80
+ const [scopesLoading, setScopesLoading] = useState(false);
81
+
82
+ // Phase 2: Usage modal
83
+ const [usageModalOpen, setUsageModalOpen] = useState(false);
84
+ const [usageData, setUsageData] = useState<KeyUsageResponse | null>(null);
85
+ const [usageLoading, setUsageLoading] = useState(false);
86
+
87
+ // Create key dialog state
88
+ const [createDialogOpen, setCreateDialogOpen] = useState(false);
89
+ const [creating, setCreating] = useState(false);
90
+ const [newKey, setNewKey] = useState<CreateApiKeyRequest>({
91
+ name: '',
92
+ key_type: 'pat',
93
+ scopes: [],
94
+ expires_at: '',
95
+ });
96
+
97
+ // Created key display state
98
+ const [createdKey, setCreatedKey] = useState<ApiKeyWithPlaintext | null>(null);
99
+ const [showCreatedKey, setShowCreatedKey] = useState(true);
100
+ const [copiedKey, setCopiedKey] = useState(false);
101
+
102
+ // Edit key dialog state
103
+ const [editDialogOpen, setEditDialogOpen] = useState(false);
104
+ const [editingKey, setEditingKey] = useState<ApiKey | null>(null);
105
+ const [editForm, setEditForm] = useState({
106
+ name: '',
107
+ scopes: [] as string[],
108
+ is_active: true,
109
+ });
110
+
111
+ // Delete confirmation dialog state
112
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
113
+ const [keyToDelete, setKeyToDelete] = useState<{ id: string; name: string } | null>(null);
114
+
115
+ // Fetch API keys
116
+ const fetchKeys = useCallback(async () => {
117
+ setLoading(true);
118
+ try {
119
+ const data = await api.getApiKeys();
120
+ setKeys(data.keys || []);
121
+ setError(null);
122
+ } catch (err) {
123
+ setError(err instanceof Error ? err.message : 'Failed to fetch API keys');
124
+ } finally {
125
+ setLoading(false);
126
+ }
127
+ }, []);
128
+
129
+ useEffect(() => {
130
+ fetchKeys();
131
+ }, [fetchKeys]);
132
+
133
+ // Phase 2: Fetch available scopes
134
+ const fetchScopes = useCallback(async () => {
135
+ setScopesLoading(true);
136
+ try {
137
+ const data = await api.getAvailableScopes();
138
+ setAvailableScopes(data.scopes || []);
139
+ } catch (err) {
140
+ console.error('Failed to fetch scopes:', err);
141
+ // Don't show error to user - scopes are optional
142
+ } finally {
143
+ setScopesLoading(false);
144
+ }
145
+ }, []);
146
+
147
+ useEffect(() => {
148
+ fetchScopes();
149
+ }, [fetchScopes]);
150
+
151
+ // Phase 2: Fetch key usage
152
+ const fetchUsage = async (keyId: string, _keyName: string) => {
153
+ setUsageLoading(true);
154
+ setUsageModalOpen(true);
155
+ try {
156
+ const data = await api.getKeyUsage(keyId, { limit: 100 });
157
+ setUsageData(data);
158
+ } catch (err) {
159
+ setError(err instanceof Error ? err.message : 'Failed to fetch usage data');
160
+ setUsageModalOpen(false);
161
+ } finally {
162
+ setUsageLoading(false);
163
+ }
164
+ };
165
+
166
+ // Create key handler
167
+ const handleCreateKey = async () => {
168
+ setCreating(true);
169
+ try {
170
+ const created = await api.createApiKey(newKey);
171
+ setCreatedKey(created);
172
+ setCreateDialogOpen(false);
173
+ setNewKey({
174
+ name: '',
175
+ key_type: 'pat',
176
+ scopes: [],
177
+ expires_at: '',
178
+ });
179
+ fetchKeys();
180
+ } catch (err) {
181
+ setError(err instanceof Error ? err.message : 'Failed to create API key');
182
+ } finally {
183
+ setCreating(false);
184
+ }
185
+ };
186
+
187
+ // Delete key handlers
188
+ const openDeleteDialog = (keyId: string, keyName: string) => {
189
+ setKeyToDelete({ id: keyId, name: keyName });
190
+ setDeleteDialogOpen(true);
191
+ };
192
+
193
+ const confirmDelete = async () => {
194
+ if (!keyToDelete) return;
195
+
196
+ try {
197
+ await api.deleteApiKey(keyToDelete.id);
198
+ setSuccess(`API key "${keyToDelete.name}" deleted`);
199
+ setDeleteDialogOpen(false);
200
+ setKeyToDelete(null);
201
+ fetchKeys();
202
+ } catch (err) {
203
+ setError(err instanceof Error ? err.message : 'Failed to delete API key');
204
+ }
205
+ };
206
+
207
+ const cancelDelete = () => {
208
+ setDeleteDialogOpen(false);
209
+ setKeyToDelete(null);
210
+ };
211
+
212
+ // Edit key handlers
213
+ const openEditDialog = (key: ApiKey) => {
214
+ setEditingKey(key);
215
+ setEditForm({
216
+ name: key.name,
217
+ scopes: [...key.scopes],
218
+ is_active: key.is_active,
219
+ });
220
+ setEditDialogOpen(true);
221
+ };
222
+
223
+ const handleUpdateKey = async () => {
224
+ if (!editingKey) return;
225
+
226
+ try {
227
+ await api.updateApiKey(editingKey.id, editForm);
228
+ setSuccess(`API key "${editingKey.name}" updated`);
229
+ setEditDialogOpen(false);
230
+ setEditingKey(null);
231
+ fetchKeys();
232
+ } catch (err) {
233
+ setError(err instanceof Error ? err.message : 'Failed to update API key');
234
+ }
235
+ };
236
+
237
+ // Copy key to clipboard
238
+ const copyToClipboard = (text: string) => {
239
+ navigator.clipboard.writeText(text).then(() => {
240
+ setCopiedKey(true);
241
+ setTimeout(() => setCopiedKey(false), 2000);
242
+ });
243
+ };
244
+
245
+ // Close created key dialog
246
+ const closeCreatedKeyDialog = () => {
247
+ setCreatedKey(null);
248
+ setShowCreatedKey(true);
249
+ setCopiedKey(false);
250
+ };
251
+
252
+ // Toggle scope (Phase 2: Support any scope string)
253
+ const toggleScope = (scope: string) => {
254
+ setNewKey(prev => ({
255
+ ...prev,
256
+ scopes: prev.scopes.includes(scope)
257
+ ? prev.scopes.filter(s => s !== scope)
258
+ : [...prev.scopes, scope],
259
+ }));
260
+ };
261
+
262
+ const toggleEditScope = (scope: string) => {
263
+ setEditForm(prev => ({
264
+ ...prev,
265
+ scopes: prev.scopes.includes(scope)
266
+ ? prev.scopes.filter(s => s !== scope)
267
+ : [...prev.scopes, scope],
268
+ }));
269
+ };
270
+
271
+ // Format date
272
+ const formatDate = (date: string | null) => {
273
+ if (!date) return 'Never';
274
+ return new Date(date).toLocaleDateString('en-US', {
275
+ year: 'numeric',
276
+ month: 'short',
277
+ day: 'numeric',
278
+ hour: '2-digit',
279
+ minute: '2-digit',
280
+ });
281
+ };
282
+
283
+ // Get scope color (Phase 2: Support plugin scopes)
284
+ const getScopeColor = (scope: string) => {
285
+ // Legacy scopes
286
+ if (scope === 'read' || scope.includes(':read') || scope === 'system:read') {
287
+ return 'var(--theme-info)';
288
+ }
289
+ if (scope === 'write' || scope.includes(':write') || scope === 'system:write') {
290
+ return 'var(--theme-warning)';
291
+ }
292
+ if (scope === 'admin' || scope.includes(':admin') || scope === 'system:admin') {
293
+ return 'var(--theme-error)';
294
+ }
295
+ // Other plugin scopes
296
+ if (scope.includes(':execute')) {
297
+ return 'var(--theme-success)';
298
+ }
299
+ return 'var(--theme-text-secondary)';
300
+ };
301
+
302
+ return (
303
+ <Box>
304
+ <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 3 }}>
305
+ <Box>
306
+ <Text variant="h4" content={title} customColor="var(--theme-text-primary)" />
307
+ <Text variant="body2" content={subtitle} customColor="var(--theme-text-secondary)" />
308
+ </Box>
309
+ <Button
310
+ variant="primary"
311
+ icon="add"
312
+ label="Create API Key"
313
+ onClick={() => setCreateDialogOpen(true)}
314
+ />
315
+ </Box>
316
+
317
+ {loading && <LinearProgress sx={{ mb: 2 }} />}
318
+
319
+ {error && (
320
+ <Alert severity="error" onClose={() => setError(null)} sx={{ mb: 2 }}>
321
+ {error}
322
+ </Alert>
323
+ )}
324
+
325
+ {success && (
326
+ <Alert severity="success" onClose={() => setSuccess(null)} sx={{ mb: 2 }}>
327
+ {success}
328
+ </Alert>
329
+ )}
330
+
331
+ {/* Stats Card */}
332
+ <GridLayout columns={3} spacing="medium" sx={{ mb: 3 }} equalHeight>
333
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
334
+ <CardContent>
335
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
336
+ <KeyIcon sx={{ fontSize: 40, color: 'var(--theme-primary)' }} />
337
+ <Box>
338
+ <Text variant="h4" content={keys.length.toString()} customColor="var(--theme-text-primary)" />
339
+ <Text variant="body2" content="Total Keys" customColor="var(--theme-text-secondary)" />
340
+ </Box>
341
+ </Box>
342
+ </CardContent>
343
+ </Card>
344
+
345
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
346
+ <CardContent>
347
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
348
+ <CheckCircleIcon sx={{ fontSize: 40, color: 'var(--theme-success)' }} />
349
+ <Box>
350
+ <Text variant="h4" content={keys.filter(k => k.is_active).length.toString()} customColor="var(--theme-text-primary)" />
351
+ <Text variant="body2" content="Active Keys" customColor="var(--theme-text-secondary)" />
352
+ </Box>
353
+ </Box>
354
+ </CardContent>
355
+ </Card>
356
+
357
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
358
+ <CardContent>
359
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
360
+ <CancelIcon sx={{ fontSize: 40, color: keys.filter(k => !k.is_active).length > 0 ? 'var(--theme-error)' : 'var(--theme-text-secondary)' }} />
361
+ <Box>
362
+ <Text variant="h4" content={keys.filter(k => !k.is_active).length.toString()} customColor="var(--theme-text-primary)" />
363
+ <Text variant="body2" content="Inactive Keys" customColor="var(--theme-text-secondary)" />
364
+ </Box>
365
+ </Box>
366
+ </CardContent>
367
+ </Card>
368
+ </GridLayout>
369
+
370
+ {/* API Keys Table */}
371
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
372
+ <CardContent sx={{ p: 0 }}>
373
+ <TableContainer>
374
+ <Table>
375
+ <TableHead>
376
+ <TableRow>
377
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>Name</TableCell>
378
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>Prefix</TableCell>
379
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>Type</TableCell>
380
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>Scopes</TableCell>
381
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>Status</TableCell>
382
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>Last Used</TableCell>
383
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>Expires</TableCell>
384
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }} align="right">Actions</TableCell>
385
+ </TableRow>
386
+ </TableHead>
387
+ <TableBody>
388
+ {keys.map((key) => (
389
+ <TableRow key={key.id} hover>
390
+ <TableCell sx={{ color: 'var(--theme-text-primary)', borderColor: 'var(--theme-border)' }}>
391
+ <Text variant="body1" content={key.name} fontWeight="500" />
392
+ </TableCell>
393
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', fontFamily: 'monospace', fontSize: '0.85rem' }}>
394
+ {key.key_prefix}...
395
+ </TableCell>
396
+ <TableCell sx={{ borderColor: 'var(--theme-border)' }}>
397
+ <Chip
398
+ size="small"
399
+ label={key.key_type.toUpperCase()}
400
+ sx={{
401
+ bgcolor: key.key_type === 'm2m' ? 'var(--theme-info)20' : 'var(--theme-success)20',
402
+ color: key.key_type === 'm2m' ? 'var(--theme-info)' : 'var(--theme-success)',
403
+ }}
404
+ />
405
+ </TableCell>
406
+ <TableCell sx={{ borderColor: 'var(--theme-border)' }}>
407
+ <Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap' }}>
408
+ {key.scopes.map((scope) => (
409
+ <Chip
410
+ key={scope}
411
+ size="small"
412
+ label={scope}
413
+ sx={{
414
+ bgcolor: `${getScopeColor(scope)}20`,
415
+ color: getScopeColor(scope),
416
+ fontSize: '0.7rem',
417
+ }}
418
+ />
419
+ ))}
420
+ </Box>
421
+ </TableCell>
422
+ <TableCell sx={{ borderColor: 'var(--theme-border)' }}>
423
+ <Chip
424
+ size="small"
425
+ icon={key.is_active ? <CheckCircleIcon sx={{ fontSize: 14 }} /> : <CancelIcon sx={{ fontSize: 14 }} />}
426
+ label={key.is_active ? 'Active' : 'Inactive'}
427
+ sx={{
428
+ bgcolor: key.is_active ? 'var(--theme-success)20' : 'var(--theme-error)20',
429
+ color: key.is_active ? 'var(--theme-success)' : 'var(--theme-error)',
430
+ }}
431
+ />
432
+ </TableCell>
433
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>
434
+ {formatDate(key.last_used_at)}
435
+ </TableCell>
436
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)' }}>
437
+ {formatDate(key.expires_at)}
438
+ </TableCell>
439
+ <TableCell sx={{ borderColor: 'var(--theme-border)' }} align="right">
440
+ <Tooltip title="View Usage">
441
+ <IconButton size="small" onClick={() => fetchUsage(key.id, key.name)}>
442
+ <AssessmentIcon fontSize="small" />
443
+ </IconButton>
444
+ </Tooltip>
445
+ <Tooltip title="Edit">
446
+ <IconButton size="small" onClick={() => openEditDialog(key)}>
447
+ <EditIcon fontSize="small" />
448
+ </IconButton>
449
+ </Tooltip>
450
+ <Tooltip title="Delete">
451
+ <IconButton
452
+ size="small"
453
+ onClick={() => openDeleteDialog(key.id, key.name)}
454
+ sx={{ color: 'var(--theme-error)' }}
455
+ >
456
+ <DeleteIcon fontSize="small" />
457
+ </IconButton>
458
+ </Tooltip>
459
+ </TableCell>
460
+ </TableRow>
461
+ ))}
462
+ {keys.length === 0 && !loading && (
463
+ <TableRow>
464
+ <TableCell colSpan={8} align="center" sx={{ py: 4, color: 'var(--theme-text-secondary)' }}>
465
+ No API keys found. Create one to get started.
466
+ </TableCell>
467
+ </TableRow>
468
+ )}
469
+ </TableBody>
470
+ </Table>
471
+ </TableContainer>
472
+ </CardContent>
473
+ </Card>
474
+
475
+ {/* Create Key Dialog */}
476
+ <Dialog open={createDialogOpen} onClose={() => setCreateDialogOpen(false)} maxWidth="sm" fullWidth>
477
+ <DialogTitle>Create API Key</DialogTitle>
478
+ <DialogContent>
479
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, mt: 1 }}>
480
+ <TextField
481
+ label="Key Name"
482
+ fullWidth
483
+ value={newKey.name}
484
+ onChange={(e) => setNewKey({ ...newKey, name: e.target.value })}
485
+ placeholder="Enter a descriptive name"
486
+ helperText="Choose a name that helps you identify this key"
487
+ />
488
+
489
+ <FormControl fullWidth>
490
+ <InputLabel>Key Type</InputLabel>
491
+ <Select
492
+ value={newKey.key_type}
493
+ label="Key Type"
494
+ onChange={(e) => setNewKey({ ...newKey, key_type: e.target.value as 'm2m' | 'pat' })}
495
+ >
496
+ <MenuItem value="pat">PAT (Personal Access Token)</MenuItem>
497
+ <MenuItem value="m2m">M2M (Machine-to-Machine)</MenuItem>
498
+ </Select>
499
+ <FormHelperText>
500
+ PAT for personal use, M2M for service-to-service communication
501
+ </FormHelperText>
502
+ </FormControl>
503
+
504
+ <FormControl component="fieldset">
505
+ <Text variant="subtitle2" content="Scopes" customColor="var(--theme-text-primary)" />
506
+ {scopesLoading ? (
507
+ <LinearProgress sx={{ mt: 1 }} />
508
+ ) : (
509
+ <Box sx={{ maxHeight: '300px', overflowY: 'auto' }}>
510
+ {availableScopes.map((group) => (
511
+ <Box key={group.pluginId} sx={{ mb: 2 }}>
512
+ <Text
513
+ variant="caption"
514
+ content={group.pluginId.toUpperCase()}
515
+ customColor="var(--theme-text-secondary)"
516
+ fontWeight="600"
517
+ />
518
+ <FormGroup>
519
+ {group.scopes.map((scope) => (
520
+ <FormControlLabel
521
+ key={scope.name}
522
+ control={
523
+ <Checkbox
524
+ checked={newKey.scopes.includes(scope.name)}
525
+ onChange={() => toggleScope(scope.name)}
526
+ size="small"
527
+ />
528
+ }
529
+ label={`${scope.name} - ${scope.description}`}
530
+ sx={{ ml: 1 }}
531
+ />
532
+ ))}
533
+ </FormGroup>
534
+ </Box>
535
+ ))}
536
+ </Box>
537
+ )}
538
+ </FormControl>
539
+
540
+ <TextField
541
+ label="Expiration (Optional)"
542
+ type="datetime-local"
543
+ fullWidth
544
+ value={newKey.expires_at}
545
+ onChange={(e) => setNewKey({ ...newKey, expires_at: e.target.value })}
546
+ InputLabelProps={{ shrink: true }}
547
+ helperText="Leave empty for no expiration (90 days default)"
548
+ />
549
+ </Box>
550
+ </DialogContent>
551
+ <DialogActions>
552
+ <Button variant="text" label="Cancel" onClick={() => setCreateDialogOpen(false)} />
553
+ <Button
554
+ variant="primary"
555
+ label="Create Key"
556
+ onClick={handleCreateKey}
557
+ disabled={creating || !newKey.name || newKey.scopes.length === 0}
558
+ />
559
+ </DialogActions>
560
+ </Dialog>
561
+
562
+ {/* Created Key Display Dialog */}
563
+ <Dialog open={!!createdKey} onClose={closeCreatedKeyDialog} maxWidth="md" fullWidth>
564
+ <DialogTitle>API Key Created</DialogTitle>
565
+ <DialogContent>
566
+ <Alert severity="warning" sx={{ mb: 2 }}>
567
+ <Text variant="body2" content="Save this key now. You won't be able to see it again!" fontWeight="500" />
568
+ </Alert>
569
+
570
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
571
+ <Box>
572
+ <Text variant="subtitle2" content="Key Name" customColor="var(--theme-text-secondary)" />
573
+ <Text variant="body1" content={createdKey?.name || ''} fontWeight="500" />
574
+ </Box>
575
+
576
+ <Box>
577
+ <Text variant="subtitle2" content="API Key" customColor="var(--theme-text-secondary)" />
578
+ <Box sx={{ display: 'flex', gap: 1, alignItems: 'center', mt: 1 }}>
579
+ <TextField
580
+ fullWidth
581
+ value={createdKey?.key || ''}
582
+ type={showCreatedKey ? 'text' : 'password'}
583
+ InputProps={{
584
+ readOnly: true,
585
+ sx: { fontFamily: 'monospace', fontSize: '0.9rem' },
586
+ }}
587
+ />
588
+ <Tooltip title={showCreatedKey ? 'Hide' : 'Show'}>
589
+ <IconButton onClick={() => setShowCreatedKey(!showCreatedKey)}>
590
+ {showCreatedKey ? <VisibilityOffIcon /> : <VisibilityIcon />}
591
+ </IconButton>
592
+ </Tooltip>
593
+ <Tooltip title={copiedKey ? 'Copied!' : 'Copy'}>
594
+ <IconButton onClick={() => copyToClipboard(createdKey?.key || '')}>
595
+ <ContentCopyIcon />
596
+ </IconButton>
597
+ </Tooltip>
598
+ </Box>
599
+ </Box>
600
+
601
+ <Box>
602
+ <Text variant="subtitle2" content="Scopes" customColor="var(--theme-text-secondary)" />
603
+ <Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap', mt: 1 }}>
604
+ {createdKey?.scopes.map((scope) => (
605
+ <Chip
606
+ key={scope}
607
+ size="small"
608
+ label={scope}
609
+ sx={{
610
+ bgcolor: `${getScopeColor(scope)}20`,
611
+ color: getScopeColor(scope),
612
+ }}
613
+ />
614
+ ))}
615
+ </Box>
616
+ </Box>
617
+ </Box>
618
+ </DialogContent>
619
+ <DialogActions>
620
+ <Button variant="primary" label="I've Saved the Key" onClick={closeCreatedKeyDialog} />
621
+ </DialogActions>
622
+ </Dialog>
623
+
624
+ {/* Edit Key Dialog */}
625
+ <Dialog open={editDialogOpen} onClose={() => setEditDialogOpen(false)} maxWidth="sm" fullWidth>
626
+ <DialogTitle>Edit API Key</DialogTitle>
627
+ <DialogContent>
628
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, mt: 1 }}>
629
+ <TextField
630
+ label="Key Name"
631
+ fullWidth
632
+ value={editForm.name}
633
+ onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}
634
+ />
635
+
636
+ <FormControl component="fieldset">
637
+ <Text variant="subtitle2" content="Scopes" customColor="var(--theme-text-primary)" />
638
+ {scopesLoading ? (
639
+ <LinearProgress sx={{ mt: 1 }} />
640
+ ) : (
641
+ <Box sx={{ maxHeight: '300px', overflowY: 'auto' }}>
642
+ {availableScopes.map((group) => (
643
+ <Box key={group.pluginId} sx={{ mb: 2 }}>
644
+ <Text
645
+ variant="caption"
646
+ content={group.pluginId.toUpperCase()}
647
+ customColor="var(--theme-text-secondary)"
648
+ fontWeight="600"
649
+ />
650
+ <FormGroup>
651
+ {group.scopes.map((scope) => (
652
+ <FormControlLabel
653
+ key={scope.name}
654
+ control={
655
+ <Checkbox
656
+ checked={editForm.scopes.includes(scope.name)}
657
+ onChange={() => toggleEditScope(scope.name)}
658
+ size="small"
659
+ />
660
+ }
661
+ label={`${scope.name} - ${scope.description}`}
662
+ sx={{ ml: 1 }}
663
+ />
664
+ ))}
665
+ </FormGroup>
666
+ </Box>
667
+ ))}
668
+ </Box>
669
+ )}
670
+ </FormControl>
671
+
672
+ <FormControlLabel
673
+ control={
674
+ <Checkbox
675
+ checked={editForm.is_active}
676
+ onChange={(e) => setEditForm({ ...editForm, is_active: e.target.checked })}
677
+ />
678
+ }
679
+ label="Active (key can be used for authentication)"
680
+ />
681
+ </Box>
682
+ </DialogContent>
683
+ <DialogActions>
684
+ <Button variant="text" label="Cancel" onClick={() => setEditDialogOpen(false)} />
685
+ <Button
686
+ variant="primary"
687
+ label="Update Key"
688
+ onClick={handleUpdateKey}
689
+ disabled={!editForm.name || editForm.scopes.length === 0}
690
+ />
691
+ </DialogActions>
692
+ </Dialog>
693
+
694
+ {/* Delete Confirmation Dialog */}
695
+ <Dialog open={deleteDialogOpen} onClose={cancelDelete} maxWidth="sm" fullWidth>
696
+ <DialogTitle>Delete API Key</DialogTitle>
697
+ <DialogContent>
698
+ <Alert severity="warning" sx={{ mb: 2 }}>
699
+ This action cannot be undone. The API key will be permanently deleted.
700
+ </Alert>
701
+ <Text
702
+ variant="body1"
703
+ content={`Are you sure you want to delete the API key "${keyToDelete?.name}"?`}
704
+ customColor="var(--theme-text-primary)"
705
+ />
706
+ </DialogContent>
707
+ <DialogActions>
708
+ <Button variant="text" label="Cancel" onClick={cancelDelete} />
709
+ <Button
710
+ variant="primary"
711
+ label="Delete"
712
+ onClick={confirmDelete}
713
+ sx={{
714
+ bgcolor: 'var(--theme-error)',
715
+ '&:hover': { bgcolor: 'var(--theme-error)' },
716
+ }}
717
+ />
718
+ </DialogActions>
719
+ </Dialog>
720
+
721
+ {/* Phase 2: Usage Modal */}
722
+ <Dialog open={usageModalOpen} onClose={() => setUsageModalOpen(false)} maxWidth="lg" fullWidth>
723
+ <DialogTitle>API Key Usage - {usageData?.keyName}</DialogTitle>
724
+ <DialogContent>
725
+ {usageLoading ? (
726
+ <Box sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>
727
+ <LinearProgress sx={{ width: '100%' }} />
728
+ </Box>
729
+ ) : usageData ? (
730
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
731
+ {/* Stats Summary */}
732
+ <GridLayout columns={4} spacing="medium">
733
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
734
+ <CardContent>
735
+ <Text variant="h5" content={usageData.totalCalls.toString()} customColor="var(--theme-primary)" />
736
+ <Text variant="body2" content="Total Calls" customColor="var(--theme-text-secondary)" />
737
+ </CardContent>
738
+ </Card>
739
+
740
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
741
+ <CardContent>
742
+ <Text variant="h5" content={formatDate(usageData.lastUsed)} customColor="var(--theme-success)" />
743
+ <Text variant="body2" content="Last Used" customColor="var(--theme-text-secondary)" />
744
+ </CardContent>
745
+ </Card>
746
+
747
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
748
+ <CardContent>
749
+ <Text variant="h5" content={Object.keys(usageData.callsByEndpoint).length.toString()} customColor="var(--theme-warning)" />
750
+ <Text variant="body2" content="Unique Endpoints" customColor="var(--theme-text-secondary)" />
751
+ </CardContent>
752
+ </Card>
753
+
754
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
755
+ <CardContent>
756
+ <Text variant="h5" content={Object.keys(usageData.callsByStatus).length.toString()} customColor="var(--theme-info)" />
757
+ <Text variant="body2" content="Status Codes" customColor="var(--theme-text-secondary)" />
758
+ </CardContent>
759
+ </Card>
760
+ </GridLayout>
761
+
762
+ {/* Usage Logs Table */}
763
+ <Card sx={{ bgcolor: 'var(--theme-surface)' }}>
764
+ <CardContent sx={{ p: 0 }}>
765
+ <Box sx={{ p: 2, borderBottom: '1px solid var(--theme-border)' }}>
766
+ <Text variant="h6" content="Recent Requests" customColor="var(--theme-text-primary)" />
767
+ </Box>
768
+ <TableContainer sx={{ maxHeight: '400px' }}>
769
+ <Table stickyHeader>
770
+ <TableHead>
771
+ <TableRow>
772
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', bgcolor: 'var(--theme-surface)' }}>Timestamp</TableCell>
773
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', bgcolor: 'var(--theme-surface)' }}>Method</TableCell>
774
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', bgcolor: 'var(--theme-surface)' }}>Endpoint</TableCell>
775
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', bgcolor: 'var(--theme-surface)' }}>Status</TableCell>
776
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', bgcolor: 'var(--theme-surface)' }}>IP Address</TableCell>
777
+ </TableRow>
778
+ </TableHead>
779
+ <TableBody>
780
+ {usageData.logs.map((log) => (
781
+ <TableRow key={log.id} hover>
782
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', fontSize: '0.85rem' }}>
783
+ {formatDate(log.timestamp)}
784
+ </TableCell>
785
+ <TableCell sx={{ borderColor: 'var(--theme-border)' }}>
786
+ <Chip
787
+ size="small"
788
+ label={log.method}
789
+ sx={{
790
+ bgcolor: log.method === 'GET' ? 'var(--theme-info)20' : 'var(--theme-success)20',
791
+ color: log.method === 'GET' ? 'var(--theme-info)' : 'var(--theme-success)',
792
+ fontSize: '0.7rem',
793
+ fontFamily: 'monospace',
794
+ }}
795
+ />
796
+ </TableCell>
797
+ <TableCell sx={{ color: 'var(--theme-text-primary)', borderColor: 'var(--theme-border)', fontFamily: 'monospace', fontSize: '0.85rem' }}>
798
+ {log.endpoint}
799
+ </TableCell>
800
+ <TableCell sx={{ borderColor: 'var(--theme-border)' }}>
801
+ <Chip
802
+ size="small"
803
+ label={log.status_code || 'N/A'}
804
+ sx={{
805
+ bgcolor:
806
+ log.status_code && log.status_code >= 200 && log.status_code < 300
807
+ ? 'var(--theme-success)20'
808
+ : log.status_code && log.status_code >= 400
809
+ ? 'var(--theme-error)20'
810
+ : 'var(--theme-text-secondary)20',
811
+ color:
812
+ log.status_code && log.status_code >= 200 && log.status_code < 300
813
+ ? 'var(--theme-success)'
814
+ : log.status_code && log.status_code >= 400
815
+ ? 'var(--theme-error)'
816
+ : 'var(--theme-text-secondary)',
817
+ fontSize: '0.7rem',
818
+ }}
819
+ />
820
+ </TableCell>
821
+ <TableCell sx={{ color: 'var(--theme-text-secondary)', borderColor: 'var(--theme-border)', fontFamily: 'monospace', fontSize: '0.85rem' }}>
822
+ {log.ip_address || 'N/A'}
823
+ </TableCell>
824
+ </TableRow>
825
+ ))}
826
+ {usageData.logs.length === 0 && (
827
+ <TableRow>
828
+ <TableCell colSpan={5} align="center" sx={{ py: 4, color: 'var(--theme-text-secondary)' }}>
829
+ No usage logs found for this key.
830
+ </TableCell>
831
+ </TableRow>
832
+ )}
833
+ </TableBody>
834
+ </Table>
835
+ </TableContainer>
836
+ </CardContent>
837
+ </Card>
838
+ </Box>
839
+ ) : (
840
+ <Alert severity="info">No usage data available</Alert>
841
+ )}
842
+ </DialogContent>
843
+ <DialogActions>
844
+ <Button variant="text" label="Close" onClick={() => setUsageModalOpen(false)} />
845
+ </DialogActions>
846
+ </Dialog>
847
+ </Box>
848
+ );
849
+ }