@revealui/db 0.2.1 → 0.3.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 (256) hide show
  1. package/dist/audit-store.d.ts.map +1 -1
  2. package/dist/audit-store.js.map +1 -1
  3. package/dist/cleanup/cross-db-cleanup.d.ts +82 -0
  4. package/dist/cleanup/cross-db-cleanup.d.ts.map +1 -0
  5. package/dist/cleanup/cross-db-cleanup.js +189 -0
  6. package/dist/cleanup/cross-db-cleanup.js.map +1 -0
  7. package/dist/cleanup/index.d.ts +11 -0
  8. package/dist/cleanup/index.d.ts.map +1 -0
  9. package/dist/cleanup/index.js +11 -0
  10. package/dist/cleanup/index.js.map +1 -0
  11. package/dist/cleanup/rag-site-cleanup.d.ts +58 -0
  12. package/dist/cleanup/rag-site-cleanup.d.ts.map +1 -0
  13. package/dist/cleanup/rag-site-cleanup.js +68 -0
  14. package/dist/cleanup/rag-site-cleanup.js.map +1 -0
  15. package/dist/cleanup/stale-tokens.d.ts +37 -0
  16. package/dist/cleanup/stale-tokens.d.ts.map +1 -0
  17. package/dist/cleanup/stale-tokens.js +113 -0
  18. package/dist/cleanup/stale-tokens.js.map +1 -0
  19. package/dist/client/index.d.ts +14 -1
  20. package/dist/client/index.d.ts.map +1 -1
  21. package/dist/client/index.js +49 -13
  22. package/dist/client/index.js.map +1 -1
  23. package/dist/client/types.d.ts.map +1 -1
  24. package/dist/crypto.js.map +1 -1
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +4 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/log-transport.d.ts.map +1 -1
  30. package/dist/log-transport.js +3 -1
  31. package/dist/log-transport.js.map +1 -1
  32. package/dist/pool.d.ts +2 -1
  33. package/dist/pool.d.ts.map +1 -1
  34. package/dist/pool.js +56 -22
  35. package/dist/pool.js.map +1 -1
  36. package/dist/queries/boards.d.ts +13 -1
  37. package/dist/queries/boards.d.ts.map +1 -1
  38. package/dist/queries/boards.js +5 -2
  39. package/dist/queries/boards.js.map +1 -1
  40. package/dist/queries/code-provenance.d.ts.map +1 -1
  41. package/dist/queries/code-provenance.js.map +1 -1
  42. package/dist/queries/conversations.d.ts +29 -0
  43. package/dist/queries/conversations.d.ts.map +1 -0
  44. package/dist/queries/conversations.js +80 -0
  45. package/dist/queries/conversations.js.map +1 -0
  46. package/dist/queries/media.d.ts +9 -0
  47. package/dist/queries/media.d.ts.map +1 -1
  48. package/dist/queries/media.js +23 -13
  49. package/dist/queries/media.js.map +1 -1
  50. package/dist/queries/orders.d.ts +87 -0
  51. package/dist/queries/orders.d.ts.map +1 -0
  52. package/dist/queries/orders.js +36 -0
  53. package/dist/queries/orders.js.map +1 -0
  54. package/dist/queries/pages.d.ts +10 -0
  55. package/dist/queries/pages.d.ts.map +1 -1
  56. package/dist/queries/pages.js +19 -5
  57. package/dist/queries/pages.js.map +1 -1
  58. package/dist/queries/posts.d.ts +41 -0
  59. package/dist/queries/posts.d.ts.map +1 -1
  60. package/dist/queries/posts.js +38 -5
  61. package/dist/queries/posts.js.map +1 -1
  62. package/dist/queries/products.d.ts +102 -0
  63. package/dist/queries/products.d.ts.map +1 -0
  64. package/dist/queries/products.js +55 -0
  65. package/dist/queries/products.js.map +1 -0
  66. package/dist/queries/sites.d.ts +36 -1
  67. package/dist/queries/sites.d.ts.map +1 -1
  68. package/dist/queries/sites.js +45 -5
  69. package/dist/queries/sites.js.map +1 -1
  70. package/dist/queries/ticket-comments.d.ts +34 -1
  71. package/dist/queries/ticket-comments.d.ts.map +1 -1
  72. package/dist/queries/ticket-comments.js +32 -1
  73. package/dist/queries/ticket-comments.js.map +1 -1
  74. package/dist/queries/ticket-labels.d.ts +10 -0
  75. package/dist/queries/ticket-labels.d.ts.map +1 -1
  76. package/dist/queries/ticket-labels.js +4 -0
  77. package/dist/queries/ticket-labels.js.map +1 -1
  78. package/dist/queries/tickets.d.ts +42 -1
  79. package/dist/queries/tickets.d.ts.map +1 -1
  80. package/dist/queries/tickets.js +28 -7
  81. package/dist/queries/tickets.js.map +1 -1
  82. package/dist/queries/users.d.ts +221 -0
  83. package/dist/queries/users.d.ts.map +1 -0
  84. package/dist/queries/users.js +94 -0
  85. package/dist/queries/users.js.map +1 -0
  86. package/dist/schema/accounts.d.ts +962 -0
  87. package/dist/schema/accounts.d.ts.map +1 -0
  88. package/dist/schema/accounts.js +117 -0
  89. package/dist/schema/accounts.js.map +1 -0
  90. package/dist/schema/agents.d.ts +216 -1
  91. package/dist/schema/agents.d.ts.map +1 -1
  92. package/dist/schema/agents.js +61 -6
  93. package/dist/schema/agents.js.map +1 -1
  94. package/dist/schema/api-keys.d.ts +17 -0
  95. package/dist/schema/api-keys.d.ts.map +1 -1
  96. package/dist/schema/api-keys.js +3 -0
  97. package/dist/schema/api-keys.js.map +1 -1
  98. package/dist/schema/app-logs.d.ts.map +1 -1
  99. package/dist/schema/app-logs.js.map +1 -1
  100. package/dist/schema/audit-log.d.ts.map +1 -1
  101. package/dist/schema/audit-log.js.map +1 -1
  102. package/dist/schema/circuit-breaker.d.ts +139 -0
  103. package/dist/schema/circuit-breaker.d.ts.map +1 -0
  104. package/dist/schema/circuit-breaker.js +28 -0
  105. package/dist/schema/circuit-breaker.js.map +1 -0
  106. package/dist/schema/cms.d.ts +68 -0
  107. package/dist/schema/cms.d.ts.map +1 -1
  108. package/dist/schema/cms.js +18 -4
  109. package/dist/schema/cms.js.map +1 -1
  110. package/dist/schema/code-provenance.d.ts.map +1 -1
  111. package/dist/schema/code-provenance.js.map +1 -1
  112. package/dist/schema/collab-edits.d.ts.map +1 -1
  113. package/dist/schema/collab-edits.js +2 -2
  114. package/dist/schema/collab-edits.js.map +1 -1
  115. package/dist/schema/coordination.d.ts +967 -0
  116. package/dist/schema/coordination.d.ts.map +1 -0
  117. package/dist/schema/coordination.js +109 -0
  118. package/dist/schema/coordination.js.map +1 -0
  119. package/dist/schema/crdt-operations.d.ts.map +1 -1
  120. package/dist/schema/crdt-operations.js.map +1 -1
  121. package/dist/schema/error-events.d.ts.map +1 -1
  122. package/dist/schema/error-events.js.map +1 -1
  123. package/dist/schema/gdpr.d.ts +529 -0
  124. package/dist/schema/gdpr.d.ts.map +1 -0
  125. package/dist/schema/gdpr.js +93 -0
  126. package/dist/schema/gdpr.js.map +1 -0
  127. package/dist/schema/index.d.ts +44 -1
  128. package/dist/schema/index.d.ts.map +1 -1
  129. package/dist/schema/index.js +93 -0
  130. package/dist/schema/index.js.map +1 -1
  131. package/dist/schema/jobs.d.ts +242 -0
  132. package/dist/schema/jobs.d.ts.map +1 -0
  133. package/dist/schema/jobs.js +48 -0
  134. package/dist/schema/jobs.js.map +1 -0
  135. package/dist/schema/licenses.d.ts +68 -0
  136. package/dist/schema/licenses.d.ts.map +1 -1
  137. package/dist/schema/licenses.js +11 -2
  138. package/dist/schema/licenses.js.map +1 -1
  139. package/dist/schema/magic-links.d.ts +136 -0
  140. package/dist/schema/magic-links.d.ts.map +1 -0
  141. package/dist/schema/magic-links.js +32 -0
  142. package/dist/schema/magic-links.js.map +1 -0
  143. package/dist/schema/marketplace.d.ts +496 -0
  144. package/dist/schema/marketplace.d.ts.map +1 -0
  145. package/dist/schema/marketplace.js +114 -0
  146. package/dist/schema/marketplace.js.map +1 -0
  147. package/dist/schema/node-ids.d.ts.map +1 -1
  148. package/dist/schema/node-ids.js.map +1 -1
  149. package/dist/schema/oauth-accounts.d.ts +34 -0
  150. package/dist/schema/oauth-accounts.d.ts.map +1 -1
  151. package/dist/schema/oauth-accounts.js +5 -0
  152. package/dist/schema/oauth-accounts.js.map +1 -1
  153. package/dist/schema/pages.d.ts +34 -0
  154. package/dist/schema/pages.d.ts.map +1 -1
  155. package/dist/schema/pages.js +14 -4
  156. package/dist/schema/pages.js.map +1 -1
  157. package/dist/schema/passkeys.d.ts +208 -0
  158. package/dist/schema/passkeys.d.ts.map +1 -0
  159. package/dist/schema/passkeys.js +48 -0
  160. package/dist/schema/passkeys.js.map +1 -0
  161. package/dist/schema/password-reset-tokens.d.ts.map +1 -1
  162. package/dist/schema/password-reset-tokens.js +5 -2
  163. package/dist/schema/password-reset-tokens.js.map +1 -1
  164. package/dist/schema/products.d.ts +519 -0
  165. package/dist/schema/products.d.ts.map +1 -0
  166. package/dist/schema/products.js +101 -0
  167. package/dist/schema/products.js.map +1 -0
  168. package/dist/schema/rag.d.ts.map +1 -1
  169. package/dist/schema/rag.js +5 -2
  170. package/dist/schema/rag.js.map +1 -1
  171. package/dist/schema/rate-limits.d.ts.map +1 -1
  172. package/dist/schema/rate-limits.js +5 -2
  173. package/dist/schema/rate-limits.js.map +1 -1
  174. package/dist/schema/rest.d.ts +12 -2
  175. package/dist/schema/rest.d.ts.map +1 -1
  176. package/dist/schema/rest.js +12 -2
  177. package/dist/schema/rest.js.map +1 -1
  178. package/dist/schema/revealcoin.d.ts +267 -0
  179. package/dist/schema/revealcoin.d.ts.map +1 -0
  180. package/dist/schema/revealcoin.js +54 -0
  181. package/dist/schema/revealcoin.js.map +1 -0
  182. package/dist/schema/sites.d.ts +34 -0
  183. package/dist/schema/sites.d.ts.map +1 -1
  184. package/dist/schema/sites.js +15 -3
  185. package/dist/schema/sites.js.map +1 -1
  186. package/dist/schema/tenants.d.ts +188 -0
  187. package/dist/schema/tenants.d.ts.map +1 -0
  188. package/dist/schema/tenants.js +14 -0
  189. package/dist/schema/tenants.js.map +1 -0
  190. package/dist/schema/tickets.d.ts.map +1 -1
  191. package/dist/schema/tickets.js +17 -5
  192. package/dist/schema/tickets.js.map +1 -1
  193. package/dist/schema/users.d.ts +174 -0
  194. package/dist/schema/users.d.ts.map +1 -1
  195. package/dist/schema/users.js +31 -3
  196. package/dist/schema/users.js.map +1 -1
  197. package/dist/schema/vector.d.ts +10 -3
  198. package/dist/schema/vector.d.ts.map +1 -1
  199. package/dist/schema/vector.js +11 -4
  200. package/dist/schema/vector.js.map +1 -1
  201. package/dist/schema/waitlist.d.ts.map +1 -1
  202. package/dist/schema/waitlist.js.map +1 -1
  203. package/dist/schema/webhook-events.d.ts.map +1 -1
  204. package/dist/schema/webhook-events.js.map +1 -1
  205. package/dist/schema/yjs-documents.d.ts.map +1 -1
  206. package/dist/schema/yjs-documents.js.map +1 -1
  207. package/dist/scripts/cleanup-expired.d.ts +12 -0
  208. package/dist/scripts/cleanup-expired.d.ts.map +1 -0
  209. package/dist/scripts/cleanup-expired.js +50 -0
  210. package/dist/scripts/cleanup-expired.js.map +1 -0
  211. package/dist/types/database.d.ts +387 -2
  212. package/dist/types/database.d.ts.map +1 -1
  213. package/dist/types/database.js +80 -1
  214. package/dist/types/database.js.map +1 -1
  215. package/dist/types/discover.d.ts +2 -2
  216. package/dist/types/discover.d.ts.map +1 -1
  217. package/dist/types/discover.js +16 -16
  218. package/dist/types/discover.js.map +1 -1
  219. package/dist/types/extract-relationships.d.ts.map +1 -1
  220. package/dist/types/extract-relationships.js.map +1 -1
  221. package/dist/types/generate-contracts.js +1 -1
  222. package/dist/types/generate-contracts.js.map +1 -1
  223. package/dist/types/generate-zod-schemas.js.map +1 -1
  224. package/dist/types/generate.js.map +1 -1
  225. package/dist/types/index.d.ts.map +1 -1
  226. package/dist/types/introspect.d.ts.map +1 -1
  227. package/dist/types/introspect.js +0 -1
  228. package/dist/types/introspect.js.map +1 -1
  229. package/dist/types/stripe-schema.d.ts.map +1 -1
  230. package/dist/types/stripe-schema.js +7 -2
  231. package/dist/types/stripe-schema.js.map +1 -1
  232. package/dist/utils/soft-delete.d.ts +45 -0
  233. package/dist/utils/soft-delete.d.ts.map +1 -0
  234. package/dist/utils/soft-delete.js +45 -0
  235. package/dist/utils/soft-delete.js.map +1 -0
  236. package/dist/validation/cross-db.d.ts +60 -0
  237. package/dist/validation/cross-db.d.ts.map +1 -0
  238. package/dist/validation/cross-db.js +146 -0
  239. package/dist/validation/cross-db.js.map +1 -0
  240. package/package.json +60 -12
  241. package/dist/queries/optimized-queries.d.ts +0 -89
  242. package/dist/queries/optimized-queries.d.ts.map +0 -1
  243. package/dist/queries/optimized-queries.js +0 -371
  244. package/dist/queries/optimized-queries.js.map +0 -1
  245. package/dist/queries/todos.d.ts +0 -37
  246. package/dist/queries/todos.d.ts.map +0 -1
  247. package/dist/queries/todos.js +0 -37
  248. package/dist/queries/todos.js.map +0 -1
  249. package/dist/schema/query.d.ts +0 -11
  250. package/dist/schema/query.d.ts.map +0 -1
  251. package/dist/schema/query.js +0 -11
  252. package/dist/schema/query.js.map +0 -1
  253. package/dist/schema/todos.d.ts +0 -98
  254. package/dist/schema/todos.d.ts.map +0 -1
  255. package/dist/schema/todos.js +0 -12
  256. package/dist/schema/todos.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAMjD,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,OAAO,CAAC,EAAE,IAAI,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;;;GAKG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,6CAA6C;IACvC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,4DAA4D;IACtD,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvD,mDAAmD;IAC7C,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoCvD,2DAA2D;IACrD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9C,0CAA0C;IACpC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,SAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAUlE"}
1
+ {"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAMlD,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;GAKG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,6CAA6C;IACvC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,4DAA4D;IACtD,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvD,mDAAmD;IAC7C,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoCvD,2DAA2D;IACrD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9C,0CAA0C;IACpC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,SAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAUlE"}
@@ -1 +1 @@
1
- {"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Cross-Database Cleanup Utility
3
+ *
4
+ * Removes orphaned vector data (Supabase) when the owning site has been
5
+ * soft-deleted in NeonDB. PostgreSQL FK cascades cannot span separate
6
+ * database instances, so this utility bridges the gap.
7
+ *
8
+ * Affected Supabase tables:
9
+ * - agentMemories.siteId -> sites.id (NeonDB)
10
+ * - ragDocuments.workspaceId -> sites.id (NeonDB)
11
+ * - ragChunks.workspaceId -> sites.id (NeonDB)
12
+ *
13
+ * Safe to run multiple times (idempotent). Supports dry-run mode and
14
+ * configurable batch sizes via `configureCleanup()`.
15
+ */
16
+ import type { NeonHttpDatabase } from 'drizzle-orm/neon-http';
17
+ import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
18
+ export interface CleanupConfig {
19
+ /** Maximum number of IDs to delete per batch (default: 500) */
20
+ batchSize: number;
21
+ /** When true, report what would be deleted without actually deleting (default: false) */
22
+ dryRun: boolean;
23
+ }
24
+ /**
25
+ * Override cleanup configuration. Useful for tests (small batch sizes)
26
+ * or preview runs (dry-run mode).
27
+ */
28
+ export declare function configureCleanup(overrides: Partial<CleanupConfig>): void;
29
+ /**
30
+ * Minimal Drizzle client interface accepted by cleanup functions.
31
+ * Covers both NeonHttpDatabase and NodePgDatabase without importing
32
+ * the full schema generic, keeping the API flexible for callers.
33
+ */
34
+ type DrizzleClient = NeonHttpDatabase<any> | NodePgDatabase<any>;
35
+ export interface CleanupResult {
36
+ /** Number of agent memories deleted (or that would be deleted in dry-run) */
37
+ agentMemoriesDeleted: number;
38
+ /** Number of RAG documents deleted (or that would be deleted in dry-run) */
39
+ ragDocumentsDeleted: number;
40
+ /** Number of RAG chunks deleted (or that would be deleted in dry-run) */
41
+ ragChunksDeleted: number;
42
+ /** Site IDs whose data was cleaned up */
43
+ deletedSiteIds: string[];
44
+ /** Whether this was a dry-run (no actual deletions) */
45
+ dryRun: boolean;
46
+ }
47
+ /**
48
+ * Removes orphaned vector data from Supabase for sites that have been
49
+ * soft-deleted in NeonDB (sites.deletedAt IS NOT NULL).
50
+ *
51
+ * Steps:
52
+ * 1. Query NeonDB for soft-deleted site IDs.
53
+ * 2. Query Supabase for agentMemories / ragDocuments / ragChunks referencing
54
+ * those site IDs.
55
+ * 3. Delete the orphaned records in batches.
56
+ *
57
+ * @param restDb - Drizzle client connected to NeonDB (REST database)
58
+ * @param vectorDb - Drizzle client connected to Supabase (vector database)
59
+ * @returns Summary of what was cleaned up
60
+ */
61
+ export declare function cleanupOrphanedVectorData(restDb: DrizzleClient, vectorDb: DrizzleClient): Promise<CleanupResult>;
62
+ /**
63
+ * Removes all vector data (agent memories + RAG) for a single site from
64
+ * the Supabase vector database. Designed to be called fire-and-forget
65
+ * after a site is soft-deleted in NeonDB.
66
+ *
67
+ * Deletion order respects FK constraints:
68
+ * 1. ragChunks (references ragDocuments.id)
69
+ * 2. ragDocuments (references sites.id via workspaceId)
70
+ * 3. agentMemories (references sites.id via siteId)
71
+ *
72
+ * @param vectorDb - Drizzle client connected to Supabase (vector database)
73
+ * @param siteId - The site ID whose vector data should be removed
74
+ * @returns Summary of what was cleaned up
75
+ */
76
+ export declare function cleanupVectorDataForSite(vectorDb: DrizzleClient, siteId: string): Promise<{
77
+ agentMemoriesDeleted: number;
78
+ ragChunksDeleted: number;
79
+ ragDocumentsDeleted: number;
80
+ }>;
81
+ export {};
82
+ //# sourceMappingURL=cross-db-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-db-cleanup.d.ts","sourceRoot":"","sources":["../../src/cleanup/cross-db-cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,MAAM,EAAE,OAAO,CAAC;CACjB;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAExE;AAMD;;;;GAIG;AAEH,KAAK,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAC;CACjB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,CAAC,CAuCxB;AAyFD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IACT,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC,CAwBD"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Cross-Database Cleanup Utility
3
+ *
4
+ * Removes orphaned vector data (Supabase) when the owning site has been
5
+ * soft-deleted in NeonDB. PostgreSQL FK cascades cannot span separate
6
+ * database instances, so this utility bridges the gap.
7
+ *
8
+ * Affected Supabase tables:
9
+ * - agentMemories.siteId -> sites.id (NeonDB)
10
+ * - ragDocuments.workspaceId -> sites.id (NeonDB)
11
+ * - ragChunks.workspaceId -> sites.id (NeonDB)
12
+ *
13
+ * Safe to run multiple times (idempotent). Supports dry-run mode and
14
+ * configurable batch sizes via `configureCleanup()`.
15
+ */
16
+ import { eq, inArray, isNotNull } from 'drizzle-orm';
17
+ import { agentMemories } from '../schema/agents.js';
18
+ import { ragChunks, ragDocuments } from '../schema/rag.js';
19
+ import { sites } from '../schema/sites.js';
20
+ const DEFAULT_CONFIG = {
21
+ batchSize: 500,
22
+ dryRun: false,
23
+ };
24
+ let config = { ...DEFAULT_CONFIG };
25
+ /**
26
+ * Override cleanup configuration. Useful for tests (small batch sizes)
27
+ * or preview runs (dry-run mode).
28
+ */
29
+ export function configureCleanup(overrides) {
30
+ config = { ...DEFAULT_CONFIG, ...overrides };
31
+ }
32
+ // =============================================================================
33
+ // Core cleanup function
34
+ // =============================================================================
35
+ /**
36
+ * Removes orphaned vector data from Supabase for sites that have been
37
+ * soft-deleted in NeonDB (sites.deletedAt IS NOT NULL).
38
+ *
39
+ * Steps:
40
+ * 1. Query NeonDB for soft-deleted site IDs.
41
+ * 2. Query Supabase for agentMemories / ragDocuments / ragChunks referencing
42
+ * those site IDs.
43
+ * 3. Delete the orphaned records in batches.
44
+ *
45
+ * @param restDb - Drizzle client connected to NeonDB (REST database)
46
+ * @param vectorDb - Drizzle client connected to Supabase (vector database)
47
+ * @returns Summary of what was cleaned up
48
+ */
49
+ export async function cleanupOrphanedVectorData(restDb, vectorDb) {
50
+ // 1. Find all soft-deleted site IDs in NeonDB
51
+ const deletedSiteRows = await restDb
52
+ .select({ id: sites.id })
53
+ .from(sites)
54
+ .where(isNotNull(sites.deletedAt));
55
+ const deletedSiteIds = deletedSiteRows.map((row) => row.id);
56
+ if (deletedSiteIds.length === 0) {
57
+ return {
58
+ agentMemoriesDeleted: 0,
59
+ ragDocumentsDeleted: 0,
60
+ ragChunksDeleted: 0,
61
+ deletedSiteIds: [],
62
+ dryRun: config.dryRun,
63
+ };
64
+ }
65
+ // 2. Find orphaned records in Supabase (one query per table)
66
+ const orphanedMemoryIds = await findOrphanedMemoryIds(vectorDb, deletedSiteIds);
67
+ const orphanedDocumentIds = await findOrphanedDocumentIds(vectorDb, deletedSiteIds);
68
+ const orphanedChunkIds = await findOrphanedChunkIds(vectorDb, deletedSiteIds);
69
+ // 3. Delete orphaned records (unless dry-run)
70
+ if (!config.dryRun) {
71
+ await deleteMemoriesById(vectorDb, orphanedMemoryIds);
72
+ // Delete chunks before documents to respect FK ordering (chunks -> documents)
73
+ await deleteChunksById(vectorDb, orphanedChunkIds);
74
+ await deleteDocumentsById(vectorDb, orphanedDocumentIds);
75
+ }
76
+ return {
77
+ agentMemoriesDeleted: orphanedMemoryIds.length,
78
+ ragDocumentsDeleted: orphanedDocumentIds.length,
79
+ ragChunksDeleted: orphanedChunkIds.length,
80
+ deletedSiteIds,
81
+ dryRun: config.dryRun,
82
+ };
83
+ }
84
+ // =============================================================================
85
+ // Per-table find helpers (type-safe, no generics needed)
86
+ // =============================================================================
87
+ async function findOrphanedMemoryIds(vectorDb, deletedSiteIds) {
88
+ const allIds = [];
89
+ for (let i = 0; i < deletedSiteIds.length; i += config.batchSize) {
90
+ const batch = deletedSiteIds.slice(i, i + config.batchSize);
91
+ const rows = await vectorDb
92
+ .select({ id: agentMemories.id })
93
+ .from(agentMemories)
94
+ .where(inArray(agentMemories.siteId, batch));
95
+ for (const row of rows) {
96
+ allIds.push(row.id);
97
+ }
98
+ }
99
+ return allIds;
100
+ }
101
+ async function findOrphanedDocumentIds(vectorDb, deletedSiteIds) {
102
+ const allIds = [];
103
+ for (let i = 0; i < deletedSiteIds.length; i += config.batchSize) {
104
+ const batch = deletedSiteIds.slice(i, i + config.batchSize);
105
+ const rows = await vectorDb
106
+ .select({ id: ragDocuments.id })
107
+ .from(ragDocuments)
108
+ .where(inArray(ragDocuments.workspaceId, batch));
109
+ for (const row of rows) {
110
+ allIds.push(row.id);
111
+ }
112
+ }
113
+ return allIds;
114
+ }
115
+ async function findOrphanedChunkIds(vectorDb, deletedSiteIds) {
116
+ const allIds = [];
117
+ for (let i = 0; i < deletedSiteIds.length; i += config.batchSize) {
118
+ const batch = deletedSiteIds.slice(i, i + config.batchSize);
119
+ const rows = await vectorDb
120
+ .select({ id: ragChunks.id })
121
+ .from(ragChunks)
122
+ .where(inArray(ragChunks.workspaceId, batch));
123
+ for (const row of rows) {
124
+ allIds.push(row.id);
125
+ }
126
+ }
127
+ return allIds;
128
+ }
129
+ // =============================================================================
130
+ // Per-table delete helpers
131
+ // =============================================================================
132
+ async function deleteMemoriesById(vectorDb, ids) {
133
+ for (let i = 0; i < ids.length; i += config.batchSize) {
134
+ const batch = ids.slice(i, i + config.batchSize);
135
+ await vectorDb.delete(agentMemories).where(inArray(agentMemories.id, batch));
136
+ }
137
+ }
138
+ async function deleteDocumentsById(vectorDb, ids) {
139
+ for (let i = 0; i < ids.length; i += config.batchSize) {
140
+ const batch = ids.slice(i, i + config.batchSize);
141
+ await vectorDb.delete(ragDocuments).where(inArray(ragDocuments.id, batch));
142
+ }
143
+ }
144
+ async function deleteChunksById(vectorDb, ids) {
145
+ for (let i = 0; i < ids.length; i += config.batchSize) {
146
+ const batch = ids.slice(i, i + config.batchSize);
147
+ await vectorDb.delete(ragChunks).where(inArray(ragChunks.id, batch));
148
+ }
149
+ }
150
+ // =============================================================================
151
+ // Targeted single-site cleanup (fire-and-forget from deletion hooks)
152
+ // =============================================================================
153
+ /**
154
+ * Removes all vector data (agent memories + RAG) for a single site from
155
+ * the Supabase vector database. Designed to be called fire-and-forget
156
+ * after a site is soft-deleted in NeonDB.
157
+ *
158
+ * Deletion order respects FK constraints:
159
+ * 1. ragChunks (references ragDocuments.id)
160
+ * 2. ragDocuments (references sites.id via workspaceId)
161
+ * 3. agentMemories (references sites.id via siteId)
162
+ *
163
+ * @param vectorDb - Drizzle client connected to Supabase (vector database)
164
+ * @param siteId - The site ID whose vector data should be removed
165
+ * @returns Summary of what was cleaned up
166
+ */
167
+ export async function cleanupVectorDataForSite(vectorDb, siteId) {
168
+ // 1. RAG chunks (child of ragDocuments)
169
+ const deletedChunks = await vectorDb
170
+ .delete(ragChunks)
171
+ .where(eq(ragChunks.workspaceId, siteId))
172
+ .returning();
173
+ // 2. RAG documents
174
+ const deletedDocs = await vectorDb
175
+ .delete(ragDocuments)
176
+ .where(eq(ragDocuments.workspaceId, siteId))
177
+ .returning();
178
+ // 3. Agent memories
179
+ const deletedMemories = await vectorDb
180
+ .delete(agentMemories)
181
+ .where(eq(agentMemories.siteId, siteId))
182
+ .returning();
183
+ return {
184
+ agentMemoriesDeleted: deletedMemories.length,
185
+ ragChunksDeleted: deletedChunks.length,
186
+ ragDocumentsDeleted: deletedDocs.length,
187
+ };
188
+ }
189
+ //# sourceMappingURL=cross-db-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-db-cleanup.js","sourceRoot":"","sources":["../../src/cleanup/cross-db-cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cross-Database Cleanup Utilities
3
+ *
4
+ * Bridges the gap between NeonDB (REST) and Supabase (vector) databases
5
+ * by cleaning up orphaned records that FK cascades cannot reach across
6
+ * separate database instances.
7
+ */
8
+ export { type CleanupConfig, type CleanupResult, cleanupOrphanedVectorData, cleanupVectorDataForSite, configureCleanup, } from './cross-db-cleanup.js';
9
+ export { cleanupRagDataForSite } from './rag-site-cleanup.js';
10
+ export { type CleanupTable, cleanupStaleTokens, type StaleTokenCleanupOptions, type StaleTokenCleanupResult, } from './stale-tokens.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cleanup/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,KAAK,YAAY,EACjB,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cross-Database Cleanup Utilities
3
+ *
4
+ * Bridges the gap between NeonDB (REST) and Supabase (vector) databases
5
+ * by cleaning up orphaned records that FK cascades cannot reach across
6
+ * separate database instances.
7
+ */
8
+ export { cleanupOrphanedVectorData, cleanupVectorDataForSite, configureCleanup, } from './cross-db-cleanup.js';
9
+ export { cleanupRagDataForSite } from './rag-site-cleanup.js';
10
+ export { cleanupStaleTokens, } from './stale-tokens.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cleanup/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAEL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * RAG Site Cleanup — Cascade delete for a single site
3
+ *
4
+ * When a site is deleted from NeonDB, the cross-database FK cascades to
5
+ * Supabase are NOT enforced at the DB level. This function immediately
6
+ * removes all RAG data belonging to a specific site from the vector DB.
7
+ *
8
+ * Affected Supabase tables (deleted in FK-safe order):
9
+ * 1. rag_chunks (workspaceId -> sites.id)
10
+ * 2. rag_documents (workspaceId -> sites.id)
11
+ * 3. rag_workspaces (id = sites.id)
12
+ *
13
+ * Designed to be called fire-and-forget from the site DELETE route.
14
+ * Errors are caught and logged — they never block the site deletion response.
15
+ */
16
+ import type { NeonHttpDatabase } from 'drizzle-orm/neon-http';
17
+ import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
18
+ /**
19
+ * Minimal Drizzle client interface accepted by cleanup functions.
20
+ * Covers both NeonHttpDatabase and NodePgDatabase without importing
21
+ * the full schema generic, keeping the API flexible for callers.
22
+ */
23
+ type DrizzleClient = NeonHttpDatabase<any> | NodePgDatabase<any>;
24
+ export interface RagSiteCleanupResult {
25
+ /** Site ID that was cleaned up */
26
+ siteId: string;
27
+ /** Number of RAG chunks deleted */
28
+ ragChunksDeleted: number;
29
+ /** Number of RAG documents deleted */
30
+ ragDocumentsDeleted: number;
31
+ /** Whether the RAG workspace row was deleted */
32
+ ragWorkspaceDeleted: boolean;
33
+ }
34
+ /**
35
+ * Logger interface matching @revealui/core observability logger.
36
+ * Accepts a subset so callers are not forced to import the full logger.
37
+ */
38
+ export interface CleanupLogger {
39
+ info(message: string, meta?: Record<string, unknown>): void;
40
+ error(message: string, error?: unknown): void;
41
+ }
42
+ /**
43
+ * Deletes all RAG data (chunks, documents, workspace) for a single site
44
+ * from the Supabase vector database.
45
+ *
46
+ * Deletion order respects FK constraints within Supabase:
47
+ * 1. rag_chunks (references rag_documents.id)
48
+ * 2. rag_documents (references sites.id via workspaceId)
49
+ * 3. rag_workspaces (id = site.id)
50
+ *
51
+ * @param vectorDb - Drizzle client connected to Supabase (vector database)
52
+ * @param siteId - The site ID whose RAG data should be removed
53
+ * @param logger - Optional logger for observability
54
+ * @returns Summary of what was cleaned up
55
+ */
56
+ export declare function cleanupRagDataForSite(vectorDb: DrizzleClient, siteId: string, logger?: CleanupLogger): Promise<RagSiteCleanupResult>;
57
+ export {};
58
+ //# sourceMappingURL=rag-site-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-site-cleanup.d.ts","sourceRoot":"","sources":["../../src/cleanup/rag-site-cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAOhE;;;;GAIG;AAEH,KAAK,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/C;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAuC/B"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * RAG Site Cleanup — Cascade delete for a single site
3
+ *
4
+ * When a site is deleted from NeonDB, the cross-database FK cascades to
5
+ * Supabase are NOT enforced at the DB level. This function immediately
6
+ * removes all RAG data belonging to a specific site from the vector DB.
7
+ *
8
+ * Affected Supabase tables (deleted in FK-safe order):
9
+ * 1. rag_chunks (workspaceId -> sites.id)
10
+ * 2. rag_documents (workspaceId -> sites.id)
11
+ * 3. rag_workspaces (id = sites.id)
12
+ *
13
+ * Designed to be called fire-and-forget from the site DELETE route.
14
+ * Errors are caught and logged — they never block the site deletion response.
15
+ */
16
+ import { eq } from 'drizzle-orm';
17
+ import { ragChunks, ragDocuments, ragWorkspaces } from '../schema/rag.js';
18
+ // =============================================================================
19
+ // Core cleanup function
20
+ // =============================================================================
21
+ /**
22
+ * Deletes all RAG data (chunks, documents, workspace) for a single site
23
+ * from the Supabase vector database.
24
+ *
25
+ * Deletion order respects FK constraints within Supabase:
26
+ * 1. rag_chunks (references rag_documents.id)
27
+ * 2. rag_documents (references sites.id via workspaceId)
28
+ * 3. rag_workspaces (id = site.id)
29
+ *
30
+ * @param vectorDb - Drizzle client connected to Supabase (vector database)
31
+ * @param siteId - The site ID whose RAG data should be removed
32
+ * @param logger - Optional logger for observability
33
+ * @returns Summary of what was cleaned up
34
+ */
35
+ export async function cleanupRagDataForSite(vectorDb, siteId, logger) {
36
+ // 1. Delete all chunks belonging to this site
37
+ const deletedChunks = await vectorDb
38
+ .delete(ragChunks)
39
+ .where(eq(ragChunks.workspaceId, siteId))
40
+ .returning();
41
+ // 2. Delete all documents belonging to this site
42
+ const deletedDocs = await vectorDb
43
+ .delete(ragDocuments)
44
+ .where(eq(ragDocuments.workspaceId, siteId))
45
+ .returning();
46
+ // 3. Delete the workspace row (id = siteId)
47
+ const deletedWorkspace = await vectorDb
48
+ .delete(ragWorkspaces)
49
+ .where(eq(ragWorkspaces.id, siteId))
50
+ .returning();
51
+ const result = {
52
+ siteId,
53
+ ragChunksDeleted: deletedChunks.length,
54
+ ragDocumentsDeleted: deletedDocs.length,
55
+ ragWorkspaceDeleted: deletedWorkspace.length > 0,
56
+ };
57
+ if (logger &&
58
+ (result.ragChunksDeleted > 0 || result.ragDocumentsDeleted > 0 || result.ragWorkspaceDeleted)) {
59
+ logger.info('RAG data cleaned up for deleted site', {
60
+ siteId: result.siteId,
61
+ ragChunksDeleted: result.ragChunksDeleted,
62
+ ragDocumentsDeleted: result.ragDocumentsDeleted,
63
+ ragWorkspaceDeleted: result.ragWorkspaceDeleted,
64
+ });
65
+ }
66
+ return result;
67
+ }
68
+ //# sourceMappingURL=rag-site-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-site-cleanup.js","sourceRoot":"","sources":["../../src/cleanup/rag-site-cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAkC1E,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAuB,EACvB,MAAc,EACd,MAAsB;IAEtB,8CAA8C;IAC9C,MAAM,aAAa,GAAG,MAAM,QAAQ;SACjC,MAAM,CAAC,SAAS,CAAC;SACjB,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;SACxC,SAAS,EAAE,CAAC;IAEf,iDAAiD;IACjD,MAAM,WAAW,GAAG,MAAM,QAAQ;SAC/B,MAAM,CAAC,YAAY,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;SAC3C,SAAS,EAAE,CAAC;IAEf,4CAA4C;IAC5C,MAAM,gBAAgB,GAAG,MAAM,QAAQ;SACpC,MAAM,CAAC,aAAa,CAAC;SACrB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;SACnC,SAAS,EAAE,CAAC;IAEf,MAAM,MAAM,GAAyB;QACnC,MAAM;QACN,gBAAgB,EAAE,aAAa,CAAC,MAAM;QACtC,mBAAmB,EAAE,WAAW,CAAC,MAAM;QACvC,mBAAmB,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC;KACjD,CAAC;IAEF,IACE,MAAM;QACN,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,IAAI,MAAM,CAAC,mBAAmB,GAAG,CAAC,IAAI,MAAM,CAAC,mBAAmB,CAAC,EAC7F,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;YAClD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;SAChD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Stale Token Cleanup
3
+ *
4
+ * Deletes expired/revoked rows from auth tables that accumulate over time.
5
+ * Mirrors the Vercel cron route logic so cleanup can be triggered manually
6
+ * via `revealui db cleanup` when crons are unavailable (e.g. Hobby plan).
7
+ *
8
+ * Tables:
9
+ * - sessions — expiresAt < now OR deletedAt IS NOT NULL
10
+ * - rate_limits — resetAt < now
11
+ * - password_reset_tokens — expiresAt < now
12
+ * - magic_links — expiresAt < now
13
+ * - pages (scheduled) — status = 'scheduled' AND scheduledAt <= now
14
+ *
15
+ * Idempotent — safe to run multiple times.
16
+ */
17
+ export type CleanupTable = 'sessions' | 'rateLimits' | 'passwordResetTokens' | 'magicLinks' | 'scheduledPages';
18
+ export interface StaleTokenCleanupOptions {
19
+ /** When true, counts rows without deleting (default: false) */
20
+ dryRun?: boolean;
21
+ /** Limit cleanup to specific tables; defaults to all */
22
+ tables?: CleanupTable[];
23
+ }
24
+ export interface StaleTokenCleanupResult {
25
+ sessions: number;
26
+ rateLimits: number;
27
+ passwordResetTokens: number;
28
+ magicLinks: number;
29
+ scheduledPages: number;
30
+ dryRun: boolean;
31
+ }
32
+ /**
33
+ * Cleans up (or counts, in dry-run mode) stale rows from auth tables.
34
+ * Reads POSTGRES_URL / DATABASE_URL from the environment via getClient().
35
+ */
36
+ export declare function cleanupStaleTokens(options?: StaleTokenCleanupOptions): Promise<StaleTokenCleanupResult>;
37
+ //# sourceMappingURL=stale-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-tokens.d.ts","sourceRoot":"","sources":["../../src/cleanup/stale-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,YAAY,GACZ,qBAAqB,GACrB,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAUD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAmFlC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Stale Token Cleanup
3
+ *
4
+ * Deletes expired/revoked rows from auth tables that accumulate over time.
5
+ * Mirrors the Vercel cron route logic so cleanup can be triggered manually
6
+ * via `revealui db cleanup` when crons are unavailable (e.g. Hobby plan).
7
+ *
8
+ * Tables:
9
+ * - sessions — expiresAt < now OR deletedAt IS NOT NULL
10
+ * - rate_limits — resetAt < now
11
+ * - password_reset_tokens — expiresAt < now
12
+ * - magic_links — expiresAt < now
13
+ * - pages (scheduled) — status = 'scheduled' AND scheduledAt <= now
14
+ *
15
+ * Idempotent — safe to run multiple times.
16
+ */
17
+ import { and, eq, isNotNull, lt, lte, or } from 'drizzle-orm';
18
+ import { getClient } from '../client/index.js';
19
+ import { magicLinks } from '../schema/magic-links.js';
20
+ import { pages } from '../schema/pages.js';
21
+ import { passwordResetTokens } from '../schema/password-reset-tokens.js';
22
+ import { rateLimits } from '../schema/rate-limits.js';
23
+ import { sessions } from '../schema/users.js';
24
+ const ALL_TABLES = [
25
+ 'sessions',
26
+ 'rateLimits',
27
+ 'passwordResetTokens',
28
+ 'magicLinks',
29
+ 'scheduledPages',
30
+ ];
31
+ /**
32
+ * Cleans up (or counts, in dry-run mode) stale rows from auth tables.
33
+ * Reads POSTGRES_URL / DATABASE_URL from the environment via getClient().
34
+ */
35
+ export async function cleanupStaleTokens(options = {}) {
36
+ const { dryRun = false, tables = ALL_TABLES } = options;
37
+ const db = getClient();
38
+ const now = new Date();
39
+ const result = {
40
+ sessions: 0,
41
+ rateLimits: 0,
42
+ passwordResetTokens: 0,
43
+ magicLinks: 0,
44
+ scheduledPages: 0,
45
+ dryRun,
46
+ };
47
+ if (tables.includes('sessions')) {
48
+ const where = or(lt(sessions.expiresAt, now), isNotNull(sessions.deletedAt));
49
+ if (dryRun) {
50
+ const rows = await db.select({ id: sessions.id }).from(sessions).where(where);
51
+ result.sessions = rows.length;
52
+ }
53
+ else {
54
+ const deleted = await db.delete(sessions).where(where).returning();
55
+ result.sessions = deleted.length;
56
+ }
57
+ }
58
+ if (tables.includes('rateLimits')) {
59
+ const where = lt(rateLimits.resetAt, now);
60
+ if (dryRun) {
61
+ const rows = await db.select({ key: rateLimits.key }).from(rateLimits).where(where);
62
+ result.rateLimits = rows.length;
63
+ }
64
+ else {
65
+ const deleted = await db.delete(rateLimits).where(where).returning();
66
+ result.rateLimits = deleted.length;
67
+ }
68
+ }
69
+ if (tables.includes('passwordResetTokens')) {
70
+ const where = lt(passwordResetTokens.expiresAt, now);
71
+ if (dryRun) {
72
+ const rows = await db
73
+ .select({ id: passwordResetTokens.id })
74
+ .from(passwordResetTokens)
75
+ .where(where);
76
+ result.passwordResetTokens = rows.length;
77
+ }
78
+ else {
79
+ const deleted = await db.delete(passwordResetTokens).where(where).returning();
80
+ result.passwordResetTokens = deleted.length;
81
+ }
82
+ }
83
+ if (tables.includes('magicLinks')) {
84
+ const where = lt(magicLinks.expiresAt, now);
85
+ if (dryRun) {
86
+ const rows = await db.select({ id: magicLinks.id }).from(magicLinks).where(where);
87
+ result.magicLinks = rows.length;
88
+ }
89
+ else {
90
+ const deleted = await db.delete(magicLinks).where(where).returning();
91
+ result.magicLinks = deleted.length;
92
+ }
93
+ }
94
+ if (tables.includes('scheduledPages')) {
95
+ const where = and(eq(pages.status, 'scheduled'), isNotNull(pages.scheduledAt), lte(pages.scheduledAt, now));
96
+ if (dryRun) {
97
+ const rows = await db.select({ id: pages.id }).from(pages).where(where);
98
+ result.scheduledPages = rows.length;
99
+ }
100
+ else {
101
+ const due = await db.select({ id: pages.id }).from(pages).where(where);
102
+ for (const page of due) {
103
+ await db
104
+ .update(pages)
105
+ .set({ status: 'published', publishedAt: now, updatedAt: now })
106
+ .where(eq(pages.id, page.id));
107
+ }
108
+ result.scheduledPages = due.length;
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+ //# sourceMappingURL=stale-tokens.js.map