@qwickapps/server 1.4.0 → 1.5.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 (273) hide show
  1. package/CHANGELOG.md +507 -0
  2. package/README.md +9 -0
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +12 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/plugins/bans/bans-plugin.d.ts.map +1 -1
  8. package/dist/plugins/bans/bans-plugin.js +12 -3
  9. package/dist/plugins/bans/bans-plugin.js.map +1 -1
  10. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +11 -0
  11. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +1 -0
  12. package/dist/plugins/devices/__tests__/devices-plugin.test.js +410 -0
  13. package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +1 -0
  14. package/dist/plugins/devices/__tests__/token-utils.test.d.ts +7 -0
  15. package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +1 -0
  16. package/dist/plugins/devices/__tests__/token-utils.test.js +197 -0
  17. package/dist/plugins/devices/__tests__/token-utils.test.js.map +1 -0
  18. package/dist/plugins/devices/adapters/compute-adapter.d.ts +36 -0
  19. package/dist/plugins/devices/adapters/compute-adapter.d.ts.map +1 -0
  20. package/dist/plugins/devices/adapters/compute-adapter.js +100 -0
  21. package/dist/plugins/devices/adapters/compute-adapter.js.map +1 -0
  22. package/dist/plugins/devices/adapters/index.d.ts +12 -0
  23. package/dist/plugins/devices/adapters/index.d.ts.map +1 -0
  24. package/dist/plugins/devices/adapters/index.js +10 -0
  25. package/dist/plugins/devices/adapters/index.js.map +1 -0
  26. package/dist/plugins/devices/adapters/mobile-adapter.d.ts +41 -0
  27. package/dist/plugins/devices/adapters/mobile-adapter.d.ts.map +1 -0
  28. package/dist/plugins/devices/adapters/mobile-adapter.js +131 -0
  29. package/dist/plugins/devices/adapters/mobile-adapter.js.map +1 -0
  30. package/dist/plugins/devices/devices-plugin.d.ts +70 -0
  31. package/dist/plugins/devices/devices-plugin.d.ts.map +1 -0
  32. package/dist/plugins/devices/devices-plugin.js +453 -0
  33. package/dist/plugins/devices/devices-plugin.js.map +1 -0
  34. package/dist/plugins/devices/index.d.ts +18 -0
  35. package/dist/plugins/devices/index.d.ts.map +1 -0
  36. package/dist/plugins/devices/index.js +18 -0
  37. package/dist/plugins/devices/index.js.map +1 -0
  38. package/dist/plugins/devices/stores/index.d.ts +9 -0
  39. package/dist/plugins/devices/stores/index.d.ts.map +1 -0
  40. package/dist/plugins/devices/stores/index.js +9 -0
  41. package/dist/plugins/devices/stores/index.js.map +1 -0
  42. package/dist/plugins/devices/stores/postgres-store.d.ts +26 -0
  43. package/dist/plugins/devices/stores/postgres-store.d.ts.map +1 -0
  44. package/dist/plugins/devices/stores/postgres-store.js +199 -0
  45. package/dist/plugins/devices/stores/postgres-store.js.map +1 -0
  46. package/dist/plugins/devices/token-utils.d.ts +100 -0
  47. package/dist/plugins/devices/token-utils.d.ts.map +1 -0
  48. package/dist/plugins/devices/token-utils.js +162 -0
  49. package/dist/plugins/devices/token-utils.js.map +1 -0
  50. package/dist/plugins/devices/types.d.ts +307 -0
  51. package/dist/plugins/devices/types.d.ts.map +1 -0
  52. package/dist/plugins/devices/types.js +10 -0
  53. package/dist/plugins/devices/types.js.map +1 -0
  54. package/dist/plugins/index.d.ts +14 -2
  55. package/dist/plugins/index.d.ts.map +1 -1
  56. package/dist/plugins/index.js +13 -1
  57. package/dist/plugins/index.js.map +1 -1
  58. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +5 -0
  59. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +1 -0
  60. package/dist/plugins/notifications/__tests__/notifications-manager.test.js +470 -0
  61. package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +1 -0
  62. package/dist/plugins/notifications/index.d.ts +71 -0
  63. package/dist/plugins/notifications/index.d.ts.map +1 -0
  64. package/dist/plugins/notifications/index.js +72 -0
  65. package/dist/plugins/notifications/index.js.map +1 -0
  66. package/dist/plugins/notifications/notifications-manager.d.ts +182 -0
  67. package/dist/plugins/notifications/notifications-manager.d.ts.map +1 -0
  68. package/dist/plugins/notifications/notifications-manager.js +610 -0
  69. package/dist/plugins/notifications/notifications-manager.js.map +1 -0
  70. package/dist/plugins/notifications/notifications-plugin.d.ts +83 -0
  71. package/dist/plugins/notifications/notifications-plugin.d.ts.map +1 -0
  72. package/dist/plugins/notifications/notifications-plugin.js +337 -0
  73. package/dist/plugins/notifications/notifications-plugin.js.map +1 -0
  74. package/dist/plugins/notifications/types.d.ts +164 -0
  75. package/dist/plugins/notifications/types.d.ts.map +1 -0
  76. package/dist/plugins/notifications/types.js +9 -0
  77. package/dist/plugins/notifications/types.js.map +1 -0
  78. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +12 -0
  79. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +1 -0
  80. package/dist/plugins/parental/__tests__/parental-plugin.test.js +349 -0
  81. package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +1 -0
  82. package/dist/plugins/parental/adapters/index.d.ts +8 -0
  83. package/dist/plugins/parental/adapters/index.d.ts.map +1 -0
  84. package/dist/plugins/parental/adapters/index.js +7 -0
  85. package/dist/plugins/parental/adapters/index.js.map +1 -0
  86. package/dist/plugins/parental/adapters/kids-adapter.d.ts +24 -0
  87. package/dist/plugins/parental/adapters/kids-adapter.d.ts.map +1 -0
  88. package/dist/plugins/parental/adapters/kids-adapter.js +174 -0
  89. package/dist/plugins/parental/adapters/kids-adapter.js.map +1 -0
  90. package/dist/plugins/parental/index.d.ts +14 -0
  91. package/dist/plugins/parental/index.d.ts.map +1 -0
  92. package/dist/plugins/parental/index.js +15 -0
  93. package/dist/plugins/parental/index.js.map +1 -0
  94. package/dist/plugins/parental/parental-plugin.d.ts +88 -0
  95. package/dist/plugins/parental/parental-plugin.d.ts.map +1 -0
  96. package/dist/plugins/parental/parental-plugin.js +666 -0
  97. package/dist/plugins/parental/parental-plugin.js.map +1 -0
  98. package/dist/plugins/parental/stores/index.d.ts +7 -0
  99. package/dist/plugins/parental/stores/index.d.ts.map +1 -0
  100. package/dist/plugins/parental/stores/index.js +7 -0
  101. package/dist/plugins/parental/stores/index.js.map +1 -0
  102. package/dist/plugins/parental/stores/postgres-store.d.ts +10 -0
  103. package/dist/plugins/parental/stores/postgres-store.d.ts.map +1 -0
  104. package/dist/plugins/parental/stores/postgres-store.js +209 -0
  105. package/dist/plugins/parental/stores/postgres-store.js.map +1 -0
  106. package/dist/plugins/parental/types.d.ts +154 -0
  107. package/dist/plugins/parental/types.d.ts.map +1 -0
  108. package/dist/plugins/parental/types.js +10 -0
  109. package/dist/plugins/parental/types.js.map +1 -0
  110. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +11 -0
  111. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +1 -0
  112. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +243 -0
  113. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +1 -0
  114. package/dist/plugins/profiles/index.d.ts +12 -0
  115. package/dist/plugins/profiles/index.d.ts.map +1 -0
  116. package/dist/plugins/profiles/index.js +13 -0
  117. package/dist/plugins/profiles/index.js.map +1 -0
  118. package/dist/plugins/profiles/profiles-plugin.d.ts +71 -0
  119. package/dist/plugins/profiles/profiles-plugin.d.ts.map +1 -0
  120. package/dist/plugins/profiles/profiles-plugin.js +481 -0
  121. package/dist/plugins/profiles/profiles-plugin.js.map +1 -0
  122. package/dist/plugins/profiles/stores/index.d.ts +9 -0
  123. package/dist/plugins/profiles/stores/index.d.ts.map +1 -0
  124. package/dist/plugins/profiles/stores/index.js +9 -0
  125. package/dist/plugins/profiles/stores/index.js.map +1 -0
  126. package/dist/plugins/profiles/stores/postgres-store.d.ts +18 -0
  127. package/dist/plugins/profiles/stores/postgres-store.d.ts.map +1 -0
  128. package/dist/plugins/profiles/stores/postgres-store.js +310 -0
  129. package/dist/plugins/profiles/stores/postgres-store.js.map +1 -0
  130. package/dist/plugins/profiles/types.d.ts +289 -0
  131. package/dist/plugins/profiles/types.d.ts.map +1 -0
  132. package/dist/plugins/profiles/types.js +10 -0
  133. package/dist/plugins/profiles/types.js.map +1 -0
  134. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +11 -0
  135. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +1 -0
  136. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +305 -0
  137. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +1 -0
  138. package/dist/plugins/subscriptions/index.d.ts +12 -0
  139. package/dist/plugins/subscriptions/index.d.ts.map +1 -0
  140. package/dist/plugins/subscriptions/index.js +13 -0
  141. package/dist/plugins/subscriptions/index.js.map +1 -0
  142. package/dist/plugins/subscriptions/stores/index.d.ts +9 -0
  143. package/dist/plugins/subscriptions/stores/index.d.ts.map +1 -0
  144. package/dist/plugins/subscriptions/stores/index.js +9 -0
  145. package/dist/plugins/subscriptions/stores/index.js.map +1 -0
  146. package/dist/plugins/subscriptions/stores/postgres-store.d.ts +14 -0
  147. package/dist/plugins/subscriptions/stores/postgres-store.d.ts.map +1 -0
  148. package/dist/plugins/subscriptions/stores/postgres-store.js +359 -0
  149. package/dist/plugins/subscriptions/stores/postgres-store.js.map +1 -0
  150. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts +82 -0
  151. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts.map +1 -0
  152. package/dist/plugins/subscriptions/subscriptions-plugin.js +449 -0
  153. package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -0
  154. package/dist/plugins/subscriptions/types.d.ts +308 -0
  155. package/dist/plugins/subscriptions/types.d.ts.map +1 -0
  156. package/dist/plugins/subscriptions/types.js +10 -0
  157. package/dist/plugins/subscriptions/types.js.map +1 -0
  158. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +11 -0
  159. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +1 -0
  160. package/dist/plugins/usage/__tests__/usage-plugin.test.js +218 -0
  161. package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +1 -0
  162. package/dist/plugins/usage/index.d.ts +12 -0
  163. package/dist/plugins/usage/index.d.ts.map +1 -0
  164. package/dist/plugins/usage/index.js +13 -0
  165. package/dist/plugins/usage/index.js.map +1 -0
  166. package/dist/plugins/usage/stores/index.d.ts +9 -0
  167. package/dist/plugins/usage/stores/index.d.ts.map +1 -0
  168. package/dist/plugins/usage/stores/index.js +9 -0
  169. package/dist/plugins/usage/stores/index.js.map +1 -0
  170. package/dist/plugins/usage/stores/postgres-store.d.ts +14 -0
  171. package/dist/plugins/usage/stores/postgres-store.d.ts.map +1 -0
  172. package/dist/plugins/usage/stores/postgres-store.js +146 -0
  173. package/dist/plugins/usage/stores/postgres-store.js.map +1 -0
  174. package/dist/plugins/usage/types.d.ts +195 -0
  175. package/dist/plugins/usage/types.d.ts.map +1 -0
  176. package/dist/plugins/usage/types.js +10 -0
  177. package/dist/plugins/usage/types.js.map +1 -0
  178. package/dist/plugins/usage/usage-plugin.d.ts +51 -0
  179. package/dist/plugins/usage/usage-plugin.d.ts.map +1 -0
  180. package/dist/plugins/usage/usage-plugin.js +412 -0
  181. package/dist/plugins/usage/usage-plugin.js.map +1 -0
  182. package/dist/plugins/users/__tests__/postgres-store.test.d.ts +10 -0
  183. package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +1 -0
  184. package/dist/plugins/users/__tests__/postgres-store.test.js +229 -0
  185. package/dist/plugins/users/__tests__/postgres-store.test.js.map +1 -0
  186. package/dist/plugins/users/__tests__/users-plugin.test.js +3 -0
  187. package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -1
  188. package/dist/plugins/users/index.d.ts +2 -2
  189. package/dist/plugins/users/index.d.ts.map +1 -1
  190. package/dist/plugins/users/index.js +1 -1
  191. package/dist/plugins/users/index.js.map +1 -1
  192. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -1
  193. package/dist/plugins/users/stores/postgres-store.js +76 -0
  194. package/dist/plugins/users/stores/postgres-store.js.map +1 -1
  195. package/dist/plugins/users/types.d.ts +74 -6
  196. package/dist/plugins/users/types.d.ts.map +1 -1
  197. package/dist/plugins/users/users-plugin.d.ts +15 -1
  198. package/dist/plugins/users/users-plugin.d.ts.map +1 -1
  199. package/dist/plugins/users/users-plugin.js +29 -0
  200. package/dist/plugins/users/users-plugin.js.map +1 -1
  201. package/dist-ui/assets/index-CynOqPkb.js +469 -0
  202. package/dist-ui/assets/index-CynOqPkb.js.map +1 -0
  203. package/dist-ui/index.html +1 -1
  204. package/dist-ui-lib/api/controlPanelApi.d.ts +46 -0
  205. package/dist-ui-lib/components/StatCard.d.ts +16 -0
  206. package/dist-ui-lib/dashboard/widgets/NotificationsStatsWidget.d.ts +12 -0
  207. package/dist-ui-lib/dashboard/widgets/index.d.ts +1 -0
  208. package/dist-ui-lib/index.js +1822 -1611
  209. package/dist-ui-lib/index.js.map +1 -1
  210. package/dist-ui-lib/pages/NotificationsPage.d.ts +9 -0
  211. package/dist-ui-lib/utils/formatters.d.ts +19 -0
  212. package/package.json +3 -2
  213. package/src/index.ts +178 -0
  214. package/src/plugins/bans/bans-plugin.ts +15 -3
  215. package/src/plugins/devices/__tests__/devices-plugin.test.ts +551 -0
  216. package/src/plugins/devices/__tests__/token-utils.test.ts +264 -0
  217. package/src/plugins/devices/adapters/compute-adapter.ts +139 -0
  218. package/src/plugins/devices/adapters/index.ts +13 -0
  219. package/src/plugins/devices/adapters/mobile-adapter.ts +179 -0
  220. package/src/plugins/devices/devices-plugin.ts +538 -0
  221. package/src/plugins/devices/index.ts +69 -0
  222. package/src/plugins/devices/stores/index.ts +9 -0
  223. package/src/plugins/devices/stores/postgres-store.ts +304 -0
  224. package/src/plugins/devices/token-utils.ts +213 -0
  225. package/src/plugins/devices/types.ts +351 -0
  226. package/src/plugins/index.ts +218 -0
  227. package/src/plugins/notifications/__tests__/notifications-manager.test.ts +637 -0
  228. package/src/plugins/notifications/index.ts +91 -0
  229. package/src/plugins/notifications/notifications-manager.ts +773 -0
  230. package/src/plugins/notifications/notifications-plugin.ts +398 -0
  231. package/src/plugins/notifications/types.ts +207 -0
  232. package/src/plugins/parental/__tests__/parental-plugin.test.ts +465 -0
  233. package/src/plugins/parental/adapters/index.ts +8 -0
  234. package/src/plugins/parental/adapters/kids-adapter.ts +206 -0
  235. package/src/plugins/parental/index.ts +55 -0
  236. package/src/plugins/parental/parental-plugin.ts +759 -0
  237. package/src/plugins/parental/stores/index.ts +7 -0
  238. package/src/plugins/parental/stores/postgres-store.ts +304 -0
  239. package/src/plugins/parental/types.ts +180 -0
  240. package/src/plugins/profiles/__tests__/profiles-plugin.test.ts +321 -0
  241. package/src/plugins/profiles/index.ts +49 -0
  242. package/src/plugins/profiles/profiles-plugin.ts +546 -0
  243. package/src/plugins/profiles/stores/index.ts +9 -0
  244. package/src/plugins/profiles/stores/postgres-store.ts +439 -0
  245. package/src/plugins/profiles/types.ts +338 -0
  246. package/src/plugins/subscriptions/__tests__/subscriptions-plugin.test.ts +404 -0
  247. package/src/plugins/subscriptions/index.ts +51 -0
  248. package/src/plugins/subscriptions/stores/index.ts +9 -0
  249. package/src/plugins/subscriptions/stores/postgres-store.ts +482 -0
  250. package/src/plugins/subscriptions/subscriptions-plugin.ts +530 -0
  251. package/src/plugins/subscriptions/types.ts +355 -0
  252. package/src/plugins/usage/__tests__/usage-plugin.test.ts +288 -0
  253. package/src/plugins/usage/index.ts +39 -0
  254. package/src/plugins/usage/stores/index.ts +9 -0
  255. package/src/plugins/usage/stores/postgres-store.ts +213 -0
  256. package/src/plugins/usage/types.ts +222 -0
  257. package/src/plugins/usage/usage-plugin.ts +484 -0
  258. package/src/plugins/users/__tests__/postgres-store.test.ts +326 -0
  259. package/src/plugins/users/__tests__/users-plugin.test.ts +3 -0
  260. package/src/plugins/users/index.ts +6 -0
  261. package/src/plugins/users/stores/postgres-store.ts +104 -0
  262. package/src/plugins/users/types.ts +82 -6
  263. package/src/plugins/users/users-plugin.ts +37 -0
  264. package/ui/src/App.tsx +5 -1
  265. package/ui/src/api/controlPanelApi.ts +103 -6
  266. package/ui/src/components/StatCard.tsx +58 -0
  267. package/ui/src/dashboard/builtInWidgets.tsx +3 -1
  268. package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +167 -0
  269. package/ui/src/dashboard/widgets/index.ts +1 -0
  270. package/ui/src/pages/NotificationsPage.tsx +417 -0
  271. package/ui/src/utils/formatters.ts +33 -0
  272. package/dist-ui/assets/index-D7DoZ9rL.js +0 -478
  273. package/dist-ui/assets/index-D7DoZ9rL.js.map +0 -1
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Devices Plugin Types
3
+ *
4
+ * Type definitions for device management with adapter support.
5
+ * Supports different device types through adapters (compute, mobile, IoT).
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ /**
11
+ * Core device record in the database
12
+ */
13
+ export interface Device {
14
+ /** Primary key - UUID */
15
+ id: string;
16
+ /** Organization ID for multi-tenant isolation */
17
+ org_id?: string;
18
+ /** Owner user ID */
19
+ user_id?: string;
20
+ /** Adapter type that created this device */
21
+ adapter_type: string;
22
+ /** Device name */
23
+ name: string;
24
+ /** First 8 characters of token for identification */
25
+ token_prefix?: string;
26
+ /** Token expiration time */
27
+ token_expires_at: Date;
28
+ /** Last time device was seen */
29
+ last_seen_at?: Date;
30
+ /** Last known IP address */
31
+ last_ip?: string;
32
+ /** Whether device is active */
33
+ is_active: boolean;
34
+ /** Adapter-specific metadata */
35
+ metadata: Record<string, unknown>;
36
+ /** When the device was created */
37
+ created_at: Date;
38
+ /** When the device was last updated */
39
+ updated_at: Date;
40
+ /** Soft delete timestamp */
41
+ deleted_at?: Date;
42
+ }
43
+
44
+ /**
45
+ * Device with token (returned only on create)
46
+ */
47
+ export interface DeviceWithToken extends Device {
48
+ /** Raw token (only returned on create, never stored) */
49
+ token: string;
50
+ }
51
+
52
+ /**
53
+ * Device creation payload (adapter-agnostic)
54
+ */
55
+ export interface CreateDeviceInput {
56
+ /** Organization ID */
57
+ org_id?: string;
58
+ /** Owner user ID */
59
+ user_id?: string;
60
+ /** Device name */
61
+ name: string;
62
+ /** Token validity in days (default: 90) */
63
+ token_validity_days?: number;
64
+ /** Adapter-specific fields */
65
+ metadata?: Record<string, unknown>;
66
+ }
67
+
68
+ /**
69
+ * Device update payload
70
+ */
71
+ export interface UpdateDeviceInput {
72
+ /** Device name */
73
+ name?: string;
74
+ /** Whether device is active */
75
+ is_active?: boolean;
76
+ /** Adapter-specific metadata */
77
+ metadata?: Record<string, unknown>;
78
+ }
79
+
80
+ /**
81
+ * Device search parameters
82
+ */
83
+ export interface DeviceSearchParams {
84
+ /** Organization ID filter */
85
+ org_id?: string;
86
+ /** User ID filter */
87
+ user_id?: string;
88
+ /** Adapter type filter */
89
+ adapter_type?: string;
90
+ /** Active status filter */
91
+ is_active?: boolean;
92
+ /** Search query (searches name) */
93
+ query?: string;
94
+ /** Page number (1-indexed) */
95
+ page?: number;
96
+ /** Items per page */
97
+ limit?: number;
98
+ /** Sort field */
99
+ sortBy?: 'name' | 'created_at' | 'last_seen_at';
100
+ /** Sort direction */
101
+ sortOrder?: 'asc' | 'desc';
102
+ }
103
+
104
+ /**
105
+ * Paginated device list response
106
+ */
107
+ export interface DeviceListResponse {
108
+ devices: Device[];
109
+ total: number;
110
+ page: number;
111
+ limit: number;
112
+ totalPages: number;
113
+ }
114
+
115
+ /**
116
+ * Token verification result
117
+ */
118
+ export interface TokenVerificationResult {
119
+ /** Whether the token is valid */
120
+ valid: boolean;
121
+ /** The device if valid */
122
+ device?: Device;
123
+ /** Error message if invalid */
124
+ error?: string;
125
+ }
126
+
127
+ // ═══════════════════════════════════════════════════════════════════════════
128
+ // Adapter Interface
129
+ // ═══════════════════════════════════════════════════════════════════════════
130
+
131
+ /**
132
+ * Validation result from adapter
133
+ */
134
+ export interface ValidationResult {
135
+ /** Whether validation passed */
136
+ valid: boolean;
137
+ /** Error messages if invalid */
138
+ errors?: string[];
139
+ }
140
+
141
+ /**
142
+ * Device adapter interface - all adapters must implement this
143
+ */
144
+ export interface DeviceAdapter {
145
+ /** Adapter name (e.g., 'compute', 'mobile', 'iot') */
146
+ name: string;
147
+
148
+ /** Token prefix for this adapter (e.g., 'qwf_dev', 'qwb_mob') */
149
+ tokenPrefix: string;
150
+
151
+ /**
152
+ * Validate device input before creation
153
+ */
154
+ validateDeviceInput(input: CreateDeviceInput): ValidationResult;
155
+
156
+ /**
157
+ * Transform input for storage (add adapter-specific defaults)
158
+ */
159
+ transformForStorage(input: CreateDeviceInput): Record<string, unknown>;
160
+
161
+ /**
162
+ * Transform row from storage to typed device
163
+ */
164
+ transformFromStorage(row: Record<string, unknown>): Record<string, unknown>;
165
+
166
+ /**
167
+ * Hook called after device is created (optional)
168
+ */
169
+ onDeviceCreated?(device: Device): Promise<void>;
170
+
171
+ /**
172
+ * Hook called after device is deleted (optional)
173
+ */
174
+ onDeviceDeleted?(device: Device): Promise<void>;
175
+
176
+ /**
177
+ * Hook called when device token is verified (optional)
178
+ */
179
+ onDeviceVerified?(device: Device, ip?: string): Promise<void>;
180
+ }
181
+
182
+ // ═══════════════════════════════════════════════════════════════════════════
183
+ // Store Interface
184
+ // ═══════════════════════════════════════════════════════════════════════════
185
+
186
+ /**
187
+ * Device store interface - all storage backends must implement this
188
+ */
189
+ export interface DeviceStore {
190
+ /** Store name (e.g., 'postgres', 'memory') */
191
+ name: string;
192
+
193
+ /**
194
+ * Initialize the store (create tables, etc.)
195
+ */
196
+ initialize(): Promise<void>;
197
+
198
+ /**
199
+ * Get a device by ID
200
+ */
201
+ getById(id: string): Promise<Device | null>;
202
+
203
+ /**
204
+ * Get a device by token hash
205
+ */
206
+ getByTokenHash(tokenHash: string): Promise<Device | null>;
207
+
208
+ /**
209
+ * Create a new device (stores token hash, not raw token)
210
+ */
211
+ create(input: CreateDeviceInput & { tokenHash: string; tokenPrefix: string; tokenExpiresAt: Date; adapterType: string }): Promise<Device>;
212
+
213
+ /**
214
+ * Update an existing device
215
+ */
216
+ update(id: string, input: UpdateDeviceInput): Promise<Device | null>;
217
+
218
+ /**
219
+ * Soft delete a device
220
+ */
221
+ delete(id: string): Promise<boolean>;
222
+
223
+ /**
224
+ * Search/list devices
225
+ */
226
+ search(params: DeviceSearchParams): Promise<DeviceListResponse>;
227
+
228
+ /**
229
+ * Update last seen timestamp
230
+ */
231
+ updateLastSeen(id: string, ip?: string): Promise<void>;
232
+
233
+ /**
234
+ * Regenerate token for a device (returns new token hash and prefix)
235
+ */
236
+ updateToken(id: string, tokenHash: string, tokenPrefix: string, expiresAt: Date): Promise<boolean>;
237
+
238
+ /**
239
+ * Cleanup expired tokens
240
+ */
241
+ cleanupExpired(): Promise<number>;
242
+
243
+ /**
244
+ * Shutdown the store
245
+ */
246
+ shutdown(): Promise<void>;
247
+ }
248
+
249
+ // ═══════════════════════════════════════════════════════════════════════════
250
+ // Configuration Types
251
+ // ═══════════════════════════════════════════════════════════════════════════
252
+
253
+ /**
254
+ * PostgreSQL device store configuration
255
+ */
256
+ export interface PostgresDeviceStoreConfig {
257
+ /** PostgreSQL pool instance or a function that returns one (for lazy initialization) */
258
+ pool: unknown | (() => unknown);
259
+ /** Devices table name (default: 'devices') */
260
+ tableName?: string;
261
+ /** Schema name (default: 'public') */
262
+ schema?: string;
263
+ /** Auto-create tables on init (default: true) */
264
+ autoCreateTables?: boolean;
265
+ }
266
+
267
+ /**
268
+ * API configuration
269
+ */
270
+ export interface DevicesApiConfig {
271
+ /** API route prefix (default: '/devices') */
272
+ prefix?: string;
273
+ /** Enable CRUD endpoints */
274
+ crud?: boolean;
275
+ /** Enable token verification endpoint */
276
+ verify?: boolean;
277
+ }
278
+
279
+ /**
280
+ * Devices plugin configuration
281
+ */
282
+ export interface DevicesPluginConfig {
283
+ /** Device storage backend */
284
+ store: DeviceStore;
285
+ /** Device adapter (defines device type) */
286
+ adapter: DeviceAdapter;
287
+ /** Default token validity in days (default: 90) */
288
+ defaultTokenValidityDays?: number;
289
+ /** API configuration */
290
+ api?: DevicesApiConfig;
291
+ /** Enable debug logging */
292
+ debug?: boolean;
293
+ }
294
+
295
+ // ═══════════════════════════════════════════════════════════════════════════
296
+ // Adapter-specific Metadata Types
297
+ // ═══════════════════════════════════════════════════════════════════════════
298
+
299
+ /**
300
+ * Compute device metadata (QwickForge - laptops, containers)
301
+ */
302
+ export interface ComputeDeviceMetadata {
303
+ /** Hostname of the device */
304
+ hostname?: string;
305
+ /** Operating system (darwin, linux, win32) */
306
+ os?: string;
307
+ /** OS version */
308
+ os_version?: string;
309
+ /** CPU architecture (x64, arm64) */
310
+ arch?: string;
311
+ /** CLI capabilities */
312
+ cli_capabilities?: string[];
313
+ /** Container ID if running in container */
314
+ container_id?: string;
315
+ /** Node.js version */
316
+ node_version?: string;
317
+ }
318
+
319
+ /**
320
+ * Mobile device metadata (QwickBot - phones, tablets)
321
+ */
322
+ export interface MobileDeviceMetadata {
323
+ /** Device model (iPhone 15 Pro, Pixel 8) */
324
+ device_model?: string;
325
+ /** OS name (iOS, Android) */
326
+ os_name?: string;
327
+ /** OS version */
328
+ os_version?: string;
329
+ /** App version */
330
+ app_version?: string;
331
+ /** Push notification token (FCM/APNs) */
332
+ push_token?: string;
333
+ /** Screen width */
334
+ screen_width?: number;
335
+ /** Screen height */
336
+ screen_height?: number;
337
+ }
338
+
339
+ /**
340
+ * IoT device metadata (future - robots, sensors)
341
+ */
342
+ export interface IoTDeviceMetadata {
343
+ /** Firmware version */
344
+ firmware_version?: string;
345
+ /** Available sensors */
346
+ sensors?: string[];
347
+ /** Device capabilities */
348
+ capabilities?: string[];
349
+ /** MAC address */
350
+ mac_address?: string;
351
+ }
@@ -66,6 +66,8 @@ export {
66
66
  getUserStore,
67
67
  getUserById,
68
68
  getUserByEmail,
69
+ getUserByIdentifier,
70
+ linkUserIdentifiers,
69
71
  findOrCreateUser,
70
72
  postgresUserStore,
71
73
  } from './users/index.js';
@@ -81,6 +83,8 @@ export type {
81
83
  UserSyncConfig,
82
84
  UsersApiConfig,
83
85
  UsersUiConfig,
86
+ UserIdentifiers,
87
+ StoredIdentifiers,
84
88
  } from './users/index.js';
85
89
 
86
90
  // Bans plugin (separate from Users, depends on Users)
@@ -205,3 +209,217 @@ export type {
205
209
  CleanupJob,
206
210
  CleanupJobConfig,
207
211
  } from './rate-limit/index.js';
212
+
213
+ // Devices plugin
214
+ export {
215
+ createDevicesPlugin,
216
+ getDeviceStore,
217
+ getDeviceAdapter,
218
+ registerDevice,
219
+ verifyDeviceToken,
220
+ getDeviceById,
221
+ updateDevice,
222
+ deleteDevice,
223
+ regenerateToken,
224
+ listUserDevices,
225
+ listOrgDevices,
226
+ deactivateDevice,
227
+ activateDevice,
228
+ cleanupExpiredTokens,
229
+ postgresDeviceStore,
230
+ computeDeviceAdapter,
231
+ mobileDeviceAdapter,
232
+ generateDeviceToken,
233
+ generatePairingCode,
234
+ hashToken,
235
+ verifyToken,
236
+ isValidTokenFormat,
237
+ isTokenExpired,
238
+ getTokenExpiration,
239
+ DeviceTokens,
240
+ } from './devices/index.js';
241
+ export type {
242
+ Device,
243
+ DeviceWithToken,
244
+ CreateDeviceInput,
245
+ UpdateDeviceInput,
246
+ DeviceSearchParams,
247
+ DeviceListResponse,
248
+ TokenVerificationResult,
249
+ DeviceAdapter,
250
+ ValidationResult as DeviceValidationResult,
251
+ DeviceStore,
252
+ DevicesPluginConfig,
253
+ DevicesApiConfig,
254
+ PostgresDeviceStoreConfig,
255
+ ComputeDeviceMetadata,
256
+ MobileDeviceMetadata,
257
+ IoTDeviceMetadata,
258
+ ComputeAdapterConfig,
259
+ MobileAdapterConfig,
260
+ DeviceTokenPair,
261
+ } from './devices/index.js';
262
+
263
+ // Profiles plugin
264
+ export {
265
+ createProfilesPlugin,
266
+ getProfileStore,
267
+ createProfile,
268
+ getProfileById,
269
+ updateProfile,
270
+ deleteProfile,
271
+ listUserProfiles,
272
+ getDefaultProfile,
273
+ setDefaultProfile,
274
+ getProfilesByAgeGroup,
275
+ getChildProfiles,
276
+ getProfileAge,
277
+ checkTimeRestrictions,
278
+ getContentFilterLevel,
279
+ canAccessContent,
280
+ postgresProfileStore,
281
+ } from './profiles/index.js';
282
+ export type {
283
+ Profile,
284
+ CreateProfileInput,
285
+ UpdateProfileInput,
286
+ ProfileSearchParams,
287
+ ProfileListResponse,
288
+ TimeRestrictionResult,
289
+ ContentFilterLevel,
290
+ AgeGroup,
291
+ ProfileStore,
292
+ ProfilesPluginConfig,
293
+ ProfilesApiConfig,
294
+ PostgresProfileStoreConfig,
295
+ AgeThresholds,
296
+ QwickBotProfileMetadata,
297
+ GamingProfileMetadata,
298
+ } from './profiles/index.js';
299
+
300
+ // Subscriptions plugin
301
+ export {
302
+ createSubscriptionsPlugin,
303
+ getSubscriptionsStore,
304
+ createTier,
305
+ getTierBySlug,
306
+ getTierById,
307
+ listTiers,
308
+ getTierEntitlements,
309
+ setTierEntitlements,
310
+ getUserSubscription,
311
+ createUserSubscription,
312
+ updateUserSubscription,
313
+ cancelSubscription,
314
+ getUserTierSlug,
315
+ getFeatureLimit,
316
+ hasFeature,
317
+ checkFeatureLimit,
318
+ ensureUserSubscription,
319
+ postgresSubscriptionsStore,
320
+ } from './subscriptions/index.js';
321
+ export type {
322
+ SubscriptionTier,
323
+ SubscriptionEntitlement,
324
+ UserSubscription,
325
+ UserSubscriptionWithTier,
326
+ SubscriptionStatus,
327
+ FeatureLimitResult,
328
+ CreateTierInput,
329
+ UpdateTierInput,
330
+ CreateEntitlementInput,
331
+ CreateUserSubscriptionInput,
332
+ UpdateUserSubscriptionInput,
333
+ SubscriptionsStore,
334
+ SubscriptionsPluginConfig,
335
+ SubscriptionsApiConfig,
336
+ PostgresSubscriptionsStoreConfig,
337
+ } from './subscriptions/index.js';
338
+
339
+ // Usage plugin
340
+ export {
341
+ createUsagePlugin,
342
+ getUsageStore,
343
+ getDailyUsage,
344
+ incrementUsage,
345
+ checkUsageLimit,
346
+ getFeatureUsageStatus,
347
+ getDailyUsageSummary,
348
+ resetUsage,
349
+ getRemainingQuota,
350
+ canUseFeature,
351
+ postgresUsageStore,
352
+ } from './usage/index.js';
353
+ export type {
354
+ DailyUsage,
355
+ MonthlyUsage,
356
+ UsageIncrementResult,
357
+ UsageStatus,
358
+ UsageSummary,
359
+ UsageStore,
360
+ UsagePluginConfig,
361
+ UsageApiConfig,
362
+ UsageCleanupConfig,
363
+ PostgresUsageStoreConfig,
364
+ } from './usage/index.js';
365
+
366
+ // Parental plugin
367
+ export {
368
+ createParentalPlugin,
369
+ getParentalStore,
370
+ getParentalAdapter,
371
+ getGuardianSettings,
372
+ createGuardianSettings,
373
+ updateGuardianSettings,
374
+ setPin,
375
+ verifyPin,
376
+ incrementFailedPinAttempts,
377
+ resetFailedPinAttempts,
378
+ getRestrictions,
379
+ createRestriction,
380
+ updateRestriction,
381
+ deleteRestriction,
382
+ pauseProfile,
383
+ resumeProfile,
384
+ checkProfileAccess,
385
+ logActivity,
386
+ getActivityLog,
387
+ postgresParentalStore,
388
+ kidsAdapter,
389
+ } from './parental/index.js';
390
+ export type {
391
+ GuardianSettings,
392
+ ProfileRestriction,
393
+ ActivityLog,
394
+ AccessCheckResult,
395
+ CreateGuardianSettingsInput,
396
+ UpdateGuardianSettingsInput,
397
+ CreateRestrictionInput,
398
+ LogActivityInput,
399
+ ParentalAdapter,
400
+ ParentalStore,
401
+ ParentalPluginConfig,
402
+ ParentalApiConfig,
403
+ PostgresParentalStoreConfig,
404
+ KidsAdapterConfig,
405
+ } from './parental/index.js';
406
+
407
+ // Notifications plugin
408
+ export {
409
+ createNotificationsPlugin,
410
+ NotificationsManager,
411
+ getNotificationsManager,
412
+ hasNotificationsManager,
413
+ broadcastToDevice,
414
+ broadcastToUser,
415
+ broadcastToAll,
416
+ } from './notifications/index.js';
417
+ export type {
418
+ NotificationsPluginConfig,
419
+ SSEClient,
420
+ NotifyPayload,
421
+ SSEEvent,
422
+ NotificationsStats,
423
+ ConnectionHealth,
424
+ NotificationsManagerInterface,
425
+ } from './notifications/index.js';