@revealui/db 0.0.0-canary-20260409021642

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 (343) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +147 -0
  3. package/dist/audit-store.d.ts +56 -0
  4. package/dist/audit-store.d.ts.map +1 -0
  5. package/dist/audit-store.js +120 -0
  6. package/dist/audit-store.js.map +1 -0
  7. package/dist/cleanup/cross-db-cleanup.d.ts +82 -0
  8. package/dist/cleanup/cross-db-cleanup.d.ts.map +1 -0
  9. package/dist/cleanup/cross-db-cleanup.js +189 -0
  10. package/dist/cleanup/cross-db-cleanup.js.map +1 -0
  11. package/dist/cleanup/index.d.ts +11 -0
  12. package/dist/cleanup/index.d.ts.map +1 -0
  13. package/dist/cleanup/index.js +11 -0
  14. package/dist/cleanup/index.js.map +1 -0
  15. package/dist/cleanup/rag-site-cleanup.d.ts +58 -0
  16. package/dist/cleanup/rag-site-cleanup.d.ts.map +1 -0
  17. package/dist/cleanup/rag-site-cleanup.js +68 -0
  18. package/dist/cleanup/rag-site-cleanup.js.map +1 -0
  19. package/dist/cleanup/stale-tokens.d.ts +37 -0
  20. package/dist/cleanup/stale-tokens.d.ts.map +1 -0
  21. package/dist/cleanup/stale-tokens.js +113 -0
  22. package/dist/cleanup/stale-tokens.js.map +1 -0
  23. package/dist/client/index.d.ts +237 -0
  24. package/dist/client/index.d.ts.map +1 -0
  25. package/dist/client/index.js +445 -0
  26. package/dist/client/index.js.map +1 -0
  27. package/dist/client/types.d.ts +109 -0
  28. package/dist/client/types.d.ts.map +1 -0
  29. package/dist/client/types.js +10 -0
  30. package/dist/client/types.js.map +1 -0
  31. package/dist/crypto.d.ts +27 -0
  32. package/dist/crypto.d.ts.map +1 -0
  33. package/dist/crypto.js +74 -0
  34. package/dist/crypto.js.map +1 -0
  35. package/dist/index.d.ts +32 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +35 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/log-transport.d.ts +20 -0
  40. package/dist/log-transport.d.ts.map +1 -0
  41. package/dist/log-transport.js +51 -0
  42. package/dist/log-transport.js.map +1 -0
  43. package/dist/pool.d.ts +37 -0
  44. package/dist/pool.d.ts.map +1 -0
  45. package/dist/pool.js +260 -0
  46. package/dist/pool.js.map +1 -0
  47. package/dist/queries/boards.d.ts +154 -0
  48. package/dist/queries/boards.d.ts.map +1 -0
  49. package/dist/queries/boards.js +94 -0
  50. package/dist/queries/boards.js.map +1 -0
  51. package/dist/queries/code-provenance.d.ts +252 -0
  52. package/dist/queries/code-provenance.d.ts.map +1 -0
  53. package/dist/queries/code-provenance.js +136 -0
  54. package/dist/queries/code-provenance.js.map +1 -0
  55. package/dist/queries/conversations.d.ts +29 -0
  56. package/dist/queries/conversations.d.ts.map +1 -0
  57. package/dist/queries/conversations.js +83 -0
  58. package/dist/queries/conversations.js.map +1 -0
  59. package/dist/queries/media.d.ts +84 -0
  60. package/dist/queries/media.d.ts.map +1 -0
  61. package/dist/queries/media.js +47 -0
  62. package/dist/queries/media.js.map +1 -0
  63. package/dist/queries/oauth-accounts.d.ts +9 -0
  64. package/dist/queries/oauth-accounts.d.ts.map +1 -0
  65. package/dist/queries/oauth-accounts.js +15 -0
  66. package/dist/queries/oauth-accounts.js.map +1 -0
  67. package/dist/queries/orders.d.ts +91 -0
  68. package/dist/queries/orders.d.ts.map +1 -0
  69. package/dist/queries/orders.js +36 -0
  70. package/dist/queries/orders.js.map +1 -0
  71. package/dist/queries/pages.d.ts +119 -0
  72. package/dist/queries/pages.d.ts.map +1 -0
  73. package/dist/queries/pages.js +56 -0
  74. package/dist/queries/pages.js.map +1 -0
  75. package/dist/queries/passkeys.d.ts +21 -0
  76. package/dist/queries/passkeys.d.ts.map +1 -0
  77. package/dist/queries/passkeys.js +19 -0
  78. package/dist/queries/passkeys.js.map +1 -0
  79. package/dist/queries/posts.d.ts +138 -0
  80. package/dist/queries/posts.d.ts.map +1 -0
  81. package/dist/queries/posts.js +76 -0
  82. package/dist/queries/posts.js.map +1 -0
  83. package/dist/queries/products.d.ts +102 -0
  84. package/dist/queries/products.d.ts.map +1 -0
  85. package/dist/queries/products.js +55 -0
  86. package/dist/queries/products.js.map +1 -0
  87. package/dist/queries/sessions.d.ts +30 -0
  88. package/dist/queries/sessions.d.ts.map +1 -0
  89. package/dist/queries/sessions.js +37 -0
  90. package/dist/queries/sessions.js.map +1 -0
  91. package/dist/queries/sites.d.ts +127 -0
  92. package/dist/queries/sites.d.ts.map +1 -0
  93. package/dist/queries/sites.js +83 -0
  94. package/dist/queries/sites.js.map +1 -0
  95. package/dist/queries/ticket-comments.d.ts +70 -0
  96. package/dist/queries/ticket-comments.d.ts.map +1 -0
  97. package/dist/queries/ticket-comments.js +90 -0
  98. package/dist/queries/ticket-comments.js.map +1 -0
  99. package/dist/queries/ticket-labels.d.ts +79 -0
  100. package/dist/queries/ticket-labels.d.ts.map +1 -0
  101. package/dist/queries/ticket-labels.js +55 -0
  102. package/dist/queries/ticket-labels.js.map +1 -0
  103. package/dist/queries/tickets.d.ts +342 -0
  104. package/dist/queries/tickets.d.ts.map +1 -0
  105. package/dist/queries/tickets.js +110 -0
  106. package/dist/queries/tickets.js.map +1 -0
  107. package/dist/queries/user-api-keys.d.ts +28 -0
  108. package/dist/queries/user-api-keys.d.ts.map +1 -0
  109. package/dist/queries/user-api-keys.js +49 -0
  110. package/dist/queries/user-api-keys.js.map +1 -0
  111. package/dist/queries/users.d.ts +269 -0
  112. package/dist/queries/users.d.ts.map +1 -0
  113. package/dist/queries/users.js +113 -0
  114. package/dist/queries/users.js.map +1 -0
  115. package/dist/saga/crdt-resolver.d.ts +75 -0
  116. package/dist/saga/crdt-resolver.d.ts.map +1 -0
  117. package/dist/saga/crdt-resolver.js +168 -0
  118. package/dist/saga/crdt-resolver.js.map +1 -0
  119. package/dist/saga/idempotent-operation.d.ts +52 -0
  120. package/dist/saga/idempotent-operation.d.ts.map +1 -0
  121. package/dist/saga/idempotent-operation.js +78 -0
  122. package/dist/saga/idempotent-operation.js.map +1 -0
  123. package/dist/saga/index.d.ts +29 -0
  124. package/dist/saga/index.d.ts.map +1 -0
  125. package/dist/saga/index.js +30 -0
  126. package/dist/saga/index.js.map +1 -0
  127. package/dist/saga/neon-saga.d.ts +50 -0
  128. package/dist/saga/neon-saga.d.ts.map +1 -0
  129. package/dist/saga/neon-saga.js +234 -0
  130. package/dist/saga/neon-saga.js.map +1 -0
  131. package/dist/saga/recovery.d.ts +50 -0
  132. package/dist/saga/recovery.d.ts.map +1 -0
  133. package/dist/saga/recovery.js +92 -0
  134. package/dist/saga/recovery.js.map +1 -0
  135. package/dist/saga/resilient-step.d.ts +38 -0
  136. package/dist/saga/resilient-step.d.ts.map +1 -0
  137. package/dist/saga/resilient-step.js +75 -0
  138. package/dist/saga/resilient-step.js.map +1 -0
  139. package/dist/saga/types.d.ts +94 -0
  140. package/dist/saga/types.d.ts.map +1 -0
  141. package/dist/saga/types.js +9 -0
  142. package/dist/saga/types.js.map +1 -0
  143. package/dist/schema/accounts.d.ts +962 -0
  144. package/dist/schema/accounts.d.ts.map +1 -0
  145. package/dist/schema/accounts.js +125 -0
  146. package/dist/schema/accounts.js.map +1 -0
  147. package/dist/schema/agents.d.ts +1710 -0
  148. package/dist/schema/agents.d.ts.map +1 -0
  149. package/dist/schema/agents.js +298 -0
  150. package/dist/schema/agents.js.map +1 -0
  151. package/dist/schema/api-keys.d.ts +315 -0
  152. package/dist/schema/api-keys.d.ts.map +1 -0
  153. package/dist/schema/api-keys.js +56 -0
  154. package/dist/schema/api-keys.js.map +1 -0
  155. package/dist/schema/app-logs.d.ts +168 -0
  156. package/dist/schema/app-logs.d.ts.map +1 -0
  157. package/dist/schema/app-logs.js +25 -0
  158. package/dist/schema/app-logs.js.map +1 -0
  159. package/dist/schema/audit-log.d.ts +191 -0
  160. package/dist/schema/audit-log.d.ts.map +1 -0
  161. package/dist/schema/audit-log.js +39 -0
  162. package/dist/schema/audit-log.js.map +1 -0
  163. package/dist/schema/circuit-breaker.d.ts +139 -0
  164. package/dist/schema/circuit-breaker.d.ts.map +1 -0
  165. package/dist/schema/circuit-breaker.js +28 -0
  166. package/dist/schema/circuit-breaker.js.map +1 -0
  167. package/dist/schema/cms.d.ts +1083 -0
  168. package/dist/schema/cms.d.ts.map +1 -0
  169. package/dist/schema/cms.js +151 -0
  170. package/dist/schema/cms.js.map +1 -0
  171. package/dist/schema/code-provenance.d.ts +488 -0
  172. package/dist/schema/code-provenance.d.ts.map +1 -0
  173. package/dist/schema/code-provenance.js +72 -0
  174. package/dist/schema/code-provenance.js.map +1 -0
  175. package/dist/schema/collab-edits.d.ts +165 -0
  176. package/dist/schema/collab-edits.d.ts.map +1 -0
  177. package/dist/schema/collab-edits.js +21 -0
  178. package/dist/schema/collab-edits.js.map +1 -0
  179. package/dist/schema/coordination.d.ts +967 -0
  180. package/dist/schema/coordination.d.ts.map +1 -0
  181. package/dist/schema/coordination.js +112 -0
  182. package/dist/schema/coordination.js.map +1 -0
  183. package/dist/schema/crdt-operations.d.ts +153 -0
  184. package/dist/schema/crdt-operations.d.ts.map +1 -0
  185. package/dist/schema/crdt-operations.js +33 -0
  186. package/dist/schema/crdt-operations.js.map +1 -0
  187. package/dist/schema/error-events.d.ts +223 -0
  188. package/dist/schema/error-events.d.ts.map +1 -0
  189. package/dist/schema/error-events.js +44 -0
  190. package/dist/schema/error-events.js.map +1 -0
  191. package/dist/schema/gdpr.d.ts +529 -0
  192. package/dist/schema/gdpr.d.ts.map +1 -0
  193. package/dist/schema/gdpr.js +93 -0
  194. package/dist/schema/gdpr.js.map +1 -0
  195. package/dist/schema/idempotency.d.ts +104 -0
  196. package/dist/schema/idempotency.d.ts.map +1 -0
  197. package/dist/schema/idempotency.js +24 -0
  198. package/dist/schema/idempotency.js.map +1 -0
  199. package/dist/schema/index.d.ts +194 -0
  200. package/dist/schema/index.d.ts.map +1 -0
  201. package/dist/schema/index.js +451 -0
  202. package/dist/schema/index.js.map +1 -0
  203. package/dist/schema/jobs.d.ts +242 -0
  204. package/dist/schema/jobs.d.ts.map +1 -0
  205. package/dist/schema/jobs.js +48 -0
  206. package/dist/schema/jobs.js.map +1 -0
  207. package/dist/schema/licenses.d.ts +274 -0
  208. package/dist/schema/licenses.d.ts.map +1 -0
  209. package/dist/schema/licenses.js +66 -0
  210. package/dist/schema/licenses.js.map +1 -0
  211. package/dist/schema/magic-links.d.ts +136 -0
  212. package/dist/schema/magic-links.d.ts.map +1 -0
  213. package/dist/schema/magic-links.js +32 -0
  214. package/dist/schema/magic-links.js.map +1 -0
  215. package/dist/schema/marketplace.d.ts +496 -0
  216. package/dist/schema/marketplace.d.ts.map +1 -0
  217. package/dist/schema/marketplace.js +114 -0
  218. package/dist/schema/marketplace.js.map +1 -0
  219. package/dist/schema/node-ids.d.ts +122 -0
  220. package/dist/schema/node-ids.d.ts.map +1 -0
  221. package/dist/schema/node-ids.js +25 -0
  222. package/dist/schema/node-ids.js.map +1 -0
  223. package/dist/schema/oauth-accounts.d.ts +205 -0
  224. package/dist/schema/oauth-accounts.d.ts.map +1 -0
  225. package/dist/schema/oauth-accounts.js +35 -0
  226. package/dist/schema/oauth-accounts.js.map +1 -0
  227. package/dist/schema/pages.d.ts +522 -0
  228. package/dist/schema/pages.d.ts.map +1 -0
  229. package/dist/schema/pages.js +80 -0
  230. package/dist/schema/pages.js.map +1 -0
  231. package/dist/schema/passkeys.d.ts +208 -0
  232. package/dist/schema/passkeys.d.ts.map +1 -0
  233. package/dist/schema/passkeys.js +48 -0
  234. package/dist/schema/passkeys.js.map +1 -0
  235. package/dist/schema/password-reset-tokens.d.ts +137 -0
  236. package/dist/schema/password-reset-tokens.d.ts.map +1 -0
  237. package/dist/schema/password-reset-tokens.js +29 -0
  238. package/dist/schema/password-reset-tokens.js.map +1 -0
  239. package/dist/schema/products.d.ts +536 -0
  240. package/dist/schema/products.d.ts.map +1 -0
  241. package/dist/schema/products.js +104 -0
  242. package/dist/schema/products.js.map +1 -0
  243. package/dist/schema/rag.d.ts +566 -0
  244. package/dist/schema/rag.d.ts.map +1 -0
  245. package/dist/schema/rag.js +85 -0
  246. package/dist/schema/rag.js.map +1 -0
  247. package/dist/schema/rate-limits.d.ts +212 -0
  248. package/dist/schema/rate-limits.d.ts.map +1 -0
  249. package/dist/schema/rate-limits.js +41 -0
  250. package/dist/schema/rate-limits.js.map +1 -0
  251. package/dist/schema/rest.d.ts +45 -0
  252. package/dist/schema/rest.d.ts.map +1 -0
  253. package/dist/schema/rest.js +51 -0
  254. package/dist/schema/rest.js.map +1 -0
  255. package/dist/schema/revealcoin.d.ts +267 -0
  256. package/dist/schema/revealcoin.d.ts.map +1 -0
  257. package/dist/schema/revealcoin.js +54 -0
  258. package/dist/schema/revealcoin.js.map +1 -0
  259. package/dist/schema/revmarket.d.ts +971 -0
  260. package/dist/schema/revmarket.d.ts.map +1 -0
  261. package/dist/schema/revmarket.js +160 -0
  262. package/dist/schema/revmarket.js.map +1 -0
  263. package/dist/schema/sites.d.ts +399 -0
  264. package/dist/schema/sites.d.ts.map +1 -0
  265. package/dist/schema/sites.js +69 -0
  266. package/dist/schema/sites.js.map +1 -0
  267. package/dist/schema/tenants.d.ts +188 -0
  268. package/dist/schema/tenants.d.ts.map +1 -0
  269. package/dist/schema/tenants.js +14 -0
  270. package/dist/schema/tenants.js.map +1 -0
  271. package/dist/schema/tickets.d.ts +1118 -0
  272. package/dist/schema/tickets.d.ts.map +1 -0
  273. package/dist/schema/tickets.js +165 -0
  274. package/dist/schema/tickets.js.map +1 -0
  275. package/dist/schema/users.d.ts +779 -0
  276. package/dist/schema/users.d.ts.map +1 -0
  277. package/dist/schema/users.js +111 -0
  278. package/dist/schema/users.js.map +1 -0
  279. package/dist/schema/vector.d.ts +17 -0
  280. package/dist/schema/vector.d.ts.map +1 -0
  281. package/dist/schema/vector.js +20 -0
  282. package/dist/schema/vector.js.map +1 -0
  283. package/dist/schema/waitlist.d.ts +151 -0
  284. package/dist/schema/waitlist.d.ts.map +1 -0
  285. package/dist/schema/waitlist.js +17 -0
  286. package/dist/schema/waitlist.js.map +1 -0
  287. package/dist/schema/webhook-events.d.ts +68 -0
  288. package/dist/schema/webhook-events.d.ts.map +1 -0
  289. package/dist/schema/webhook-events.js +17 -0
  290. package/dist/schema/webhook-events.js.map +1 -0
  291. package/dist/schema/yjs-documents.d.ts +116 -0
  292. package/dist/schema/yjs-documents.d.ts.map +1 -0
  293. package/dist/schema/yjs-documents.js +15 -0
  294. package/dist/schema/yjs-documents.js.map +1 -0
  295. package/dist/scripts/cleanup-expired.d.ts +12 -0
  296. package/dist/scripts/cleanup-expired.d.ts.map +1 -0
  297. package/dist/scripts/cleanup-expired.js +50 -0
  298. package/dist/scripts/cleanup-expired.js.map +1 -0
  299. package/dist/types/database.d.ts +1286 -0
  300. package/dist/types/database.d.ts.map +1 -0
  301. package/dist/types/database.js +262 -0
  302. package/dist/types/database.js.map +1 -0
  303. package/dist/types/discover.d.ts +83 -0
  304. package/dist/types/discover.d.ts.map +1 -0
  305. package/dist/types/discover.js +271 -0
  306. package/dist/types/discover.js.map +1 -0
  307. package/dist/types/extract-relationships.d.ts +115 -0
  308. package/dist/types/extract-relationships.d.ts.map +1 -0
  309. package/dist/types/extract-relationships.js +455 -0
  310. package/dist/types/extract-relationships.js.map +1 -0
  311. package/dist/types/generate-contracts.d.ts +19 -0
  312. package/dist/types/generate-contracts.d.ts.map +1 -0
  313. package/dist/types/generate-contracts.js +127 -0
  314. package/dist/types/generate-contracts.js.map +1 -0
  315. package/dist/types/generate-zod-schemas.d.ts +20 -0
  316. package/dist/types/generate-zod-schemas.d.ts.map +1 -0
  317. package/dist/types/generate-zod-schemas.js +127 -0
  318. package/dist/types/generate-zod-schemas.js.map +1 -0
  319. package/dist/types/generate.d.ts +17 -0
  320. package/dist/types/generate.d.ts.map +1 -0
  321. package/dist/types/generate.js +296 -0
  322. package/dist/types/generate.js.map +1 -0
  323. package/dist/types/index.d.ts +19 -0
  324. package/dist/types/index.d.ts.map +1 -0
  325. package/dist/types/index.js +19 -0
  326. package/dist/types/index.js.map +1 -0
  327. package/dist/types/introspect.d.ts +75 -0
  328. package/dist/types/introspect.d.ts.map +1 -0
  329. package/dist/types/introspect.js +186 -0
  330. package/dist/types/introspect.js.map +1 -0
  331. package/dist/types/stripe-schema.d.ts +893 -0
  332. package/dist/types/stripe-schema.d.ts.map +1 -0
  333. package/dist/types/stripe-schema.js +117 -0
  334. package/dist/types/stripe-schema.js.map +1 -0
  335. package/dist/utils/soft-delete.d.ts +45 -0
  336. package/dist/utils/soft-delete.d.ts.map +1 -0
  337. package/dist/utils/soft-delete.js +45 -0
  338. package/dist/utils/soft-delete.js.map +1 -0
  339. package/dist/validation/cross-db.d.ts +60 -0
  340. package/dist/validation/cross-db.d.ts.map +1 -0
  341. package/dist/validation/cross-db.js +146 -0
  342. package/dist/validation/cross-db.js.map +1 -0
  343. package/package.json +243 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 RevealUI Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,147 @@
1
+ # @revealui/db
2
+
3
+ Database schemas and Drizzle ORM integration for RevealUI.
4
+
5
+ > **Test Coverage:** ~60% (best coverage in project, but still needs improvement)
6
+
7
+ ## Features
8
+
9
+ - **Drizzle ORM**: Type-safe database queries with Drizzle
10
+ - **Schema Management**: Database schema definitions for all RevealUI tables
11
+ - **Multiple Providers**: Works with Neon, Supabase, and Vercel Postgres
12
+ - **Type Generation**: Auto-generate TypeScript types from database schema
13
+ - **Migrations**: Database migration management with Drizzle Kit
14
+ - **Type-safe**: Full TypeScript support with inferred types
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ pnpm add @revealui/db
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ ### Import Database Client
25
+
26
+ ```typescript
27
+ import { createClient } from '@revealui/db/client'
28
+
29
+ const db = createClient({
30
+ connectionString: process.env.POSTGRES_URL!
31
+ })
32
+ ```
33
+
34
+ ### Import Schemas
35
+
36
+ ```typescript
37
+ // Import all schemas
38
+ import * as schema from '@revealui/db/schema'
39
+
40
+ // Import specific schemas
41
+ import { users } from '@revealui/db/schema/users'
42
+ import { posts } from '@revealui/db/schema/cms'
43
+ import { agentContexts } from '@revealui/db/schema/agents'
44
+ import { vectorMemory } from '@revealui/db/schema/vector'
45
+ ```
46
+
47
+ ### Query Database
48
+
49
+ ```typescript
50
+ import { createClient } from '@revealui/db/client'
51
+ import { users } from '@revealui/db/schema/users'
52
+ import { eq } from 'drizzle-orm'
53
+
54
+ const db = createClient({ connectionString: process.env.POSTGRES_URL! })
55
+
56
+ // Query users
57
+ const allUsers = await db.select().from(users)
58
+
59
+ // Query with filter
60
+ const user = await db.select().from(users).where(eq(users.email, 'user@example.com'))
61
+
62
+ // Insert user
63
+ await db.insert(users).values({
64
+ email: 'newuser@example.com',
65
+ name: 'New User'
66
+ })
67
+ ```
68
+
69
+ ## Available Exports
70
+
71
+ - `@revealui/db` - Main export with database client
72
+ - `@revealui/db/client` - Database client factory
73
+ - `@revealui/db/schema` - All database schemas
74
+ - `@revealui/db/schema/agents` - Agent-related tables
75
+ - `@revealui/db/schema/cms` - CMS tables (posts, pages, media)
76
+ - `@revealui/db/schema/users` - User and authentication tables
77
+ - `@revealui/db/schema/vector` - Vector memory tables
78
+ - `@revealui/db/schema/crdt-operations` - CRDT operation log
79
+ - `@revealui/db/schema/node-ids` - Node ID mapping
80
+ - `@revealui/db/schema/rate-limits` - Rate limiting tables
81
+ - `@revealui/db/schema/sites` - Site configuration tables
82
+ - `@revealui/db/types` - TypeScript types for database entities
83
+
84
+ ## Database Management
85
+
86
+ ```bash
87
+ # Generate types from schema
88
+ pnpm --filter @revealui/db generate:types
89
+
90
+ # Generate migration files
91
+ pnpm --filter @revealui/db db:generate
92
+
93
+ # Run migrations
94
+ pnpm --filter @revealui/db db:migrate
95
+
96
+ # Push schema changes (development only)
97
+ pnpm --filter @revealui/db db:push
98
+
99
+ # Open Drizzle Studio (database GUI)
100
+ pnpm --filter @revealui/db db:studio
101
+ ```
102
+
103
+ ## Type Safety
104
+
105
+ All database operations are fully type-safe:
106
+
107
+ ```typescript
108
+ import { createClient } from '@revealui/db/client'
109
+ import { users } from '@revealui/db/schema/users'
110
+
111
+ const db = createClient({ connectionString: process.env.POSTGRES_URL! })
112
+
113
+ // TypeScript knows the shape of user rows
114
+ const allUsers = await db.select().from(users)
115
+ // allUsers: { id: string, email: string, name: string | null, ... }[]
116
+
117
+ // Insert is type-checked
118
+ await db.insert(users).values({
119
+ email: 'test@example.com',
120
+ name: 'Test User'
121
+ // TypeScript error if you add invalid fields
122
+ })
123
+ ```
124
+
125
+ ## When to Use This
126
+
127
+ - You need type-safe database queries against the RevealUI schema (users, posts, agents, vectors)
128
+ - You're running migrations or generating types from the Drizzle schema
129
+ - You want a pre-configured client for Neon, Supabase, or Vercel Postgres
130
+ - **Not** for validation logic — use `@revealui/contracts` for Zod schemas
131
+ - **Not** for direct SQL — use Drizzle's query builder or `db.execute()` for raw queries
132
+
133
+ ## JOSHUA Alignment
134
+
135
+ - **Unified**: One schema definition (50 tables) drives types, queries, and migrations across all apps
136
+ - **Orthogonal**: Schema files are cleanly separated by domain (cms, users, agents, vector, crdt) with no cross-domain entanglement
137
+ - **Sovereign**: Your database, your schema, your migrations — no hosted schema service in the loop
138
+
139
+ ## Related Documentation
140
+
141
+ - [Database Guide](../../docs/DATABASE.md) - Complete database setup and configuration
142
+ - [Database Management](../../docs/DATABASE_MANAGEMENT.md) - Operations and maintenance
143
+ - [Drizzle ORM Docs](https://orm.drizzle.team/) - Official Drizzle documentation
144
+
145
+ ## License
146
+
147
+ MIT
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Drizzle Audit Store
3
+ *
4
+ * Persistent implementation of the AuditStore interface from @revealui/ai.
5
+ * Stores audit entries in the audit_log PostgreSQL table via Drizzle ORM.
6
+ * Append-only — no update or delete operations.
7
+ *
8
+ * Types are defined locally to avoid a circular dependency on @revealui/ai.
9
+ * They mirror AuditEntry and AuditFilter from @revealui/ai/audit/types.
10
+ */
11
+ import type { Database } from './client/index.js';
12
+ /** Audit entry stored in the database */
13
+ export interface AuditEntry {
14
+ id: string;
15
+ timestamp: Date;
16
+ eventType: string;
17
+ severity: string;
18
+ agentId: string;
19
+ taskId?: string;
20
+ sessionId?: string;
21
+ payload: Record<string, unknown>;
22
+ policyViolations: string[];
23
+ }
24
+ /** Filters for querying audit entries */
25
+ export interface AuditFilter {
26
+ agentId?: string;
27
+ taskId?: string;
28
+ sessionId?: string;
29
+ eventTypes?: string[];
30
+ severity?: string[];
31
+ startTime?: Date;
32
+ endTime?: Date;
33
+ limit?: number;
34
+ offset?: number;
35
+ }
36
+ /**
37
+ * PostgreSQL-backed audit store using Drizzle ORM.
38
+ * Implements the AuditStore interface for production use.
39
+ *
40
+ * All writes are append-only. The table has no UPDATE or DELETE operations.
41
+ */
42
+ export declare class DrizzleAuditStore {
43
+ private readonly db;
44
+ constructor(db: Database);
45
+ /** Append a single entry to the audit log */
46
+ append(entry: AuditEntry): Promise<void>;
47
+ /** Append multiple entries atomically in a single INSERT */
48
+ appendBatch(entries: AuditEntry[]): Promise<void>;
49
+ /** Query entries with filters (human-side only) */
50
+ query(filter: AuditFilter): Promise<AuditEntry[]>;
51
+ /** Get total entry count (optionally filtered by agent) */
52
+ count(agentId?: string): Promise<number>;
53
+ /** Get entries since a given timestamp */
54
+ since(timestamp: Date, limit?: number): Promise<AuditEntry[]>;
55
+ }
56
+ //# sourceMappingURL=audit-store.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Drizzle Audit Store
3
+ *
4
+ * Persistent implementation of the AuditStore interface from @revealui/ai.
5
+ * Stores audit entries in the audit_log PostgreSQL table via Drizzle ORM.
6
+ * Append-only — no update or delete operations.
7
+ *
8
+ * Types are defined locally to avoid a circular dependency on @revealui/ai.
9
+ * They mirror AuditEntry and AuditFilter from @revealui/ai/audit/types.
10
+ */
11
+ import { and, count, desc, eq, gte, inArray, lte } from 'drizzle-orm';
12
+ import { auditLog } from './schema/audit-log.js';
13
+ // ─── Drizzle Audit Store ────────────────────────────────────────────────────
14
+ /**
15
+ * PostgreSQL-backed audit store using Drizzle ORM.
16
+ * Implements the AuditStore interface for production use.
17
+ *
18
+ * All writes are append-only. The table has no UPDATE or DELETE operations.
19
+ */
20
+ export class DrizzleAuditStore {
21
+ db;
22
+ constructor(db) {
23
+ this.db = db;
24
+ }
25
+ /** Append a single entry to the audit log */
26
+ async append(entry) {
27
+ await this.db.insert(auditLog).values({
28
+ id: entry.id,
29
+ timestamp: entry.timestamp,
30
+ eventType: entry.eventType,
31
+ severity: entry.severity,
32
+ agentId: entry.agentId,
33
+ taskId: entry.taskId ?? null,
34
+ sessionId: entry.sessionId ?? null,
35
+ payload: entry.payload,
36
+ policyViolations: entry.policyViolations,
37
+ });
38
+ }
39
+ /** Append multiple entries atomically in a single INSERT */
40
+ async appendBatch(entries) {
41
+ if (entries.length === 0)
42
+ return;
43
+ await this.db.insert(auditLog).values(entries.map((entry) => ({
44
+ id: entry.id,
45
+ timestamp: entry.timestamp,
46
+ eventType: entry.eventType,
47
+ severity: entry.severity,
48
+ agentId: entry.agentId,
49
+ taskId: entry.taskId ?? null,
50
+ sessionId: entry.sessionId ?? null,
51
+ payload: entry.payload,
52
+ policyViolations: entry.policyViolations,
53
+ })));
54
+ }
55
+ /** Query entries with filters (human-side only) */
56
+ async query(filter) {
57
+ const conditions = [];
58
+ if (filter.agentId) {
59
+ conditions.push(eq(auditLog.agentId, filter.agentId));
60
+ }
61
+ if (filter.taskId) {
62
+ conditions.push(eq(auditLog.taskId, filter.taskId));
63
+ }
64
+ if (filter.sessionId) {
65
+ conditions.push(eq(auditLog.sessionId, filter.sessionId));
66
+ }
67
+ if (filter.eventTypes && filter.eventTypes.length > 0) {
68
+ conditions.push(inArray(auditLog.eventType, filter.eventTypes));
69
+ }
70
+ if (filter.severity && filter.severity.length > 0) {
71
+ conditions.push(inArray(auditLog.severity, filter.severity));
72
+ }
73
+ if (filter.startTime) {
74
+ conditions.push(gte(auditLog.timestamp, filter.startTime));
75
+ }
76
+ if (filter.endTime) {
77
+ conditions.push(lte(auditLog.timestamp, filter.endTime));
78
+ }
79
+ const rows = await this.db
80
+ .select()
81
+ .from(auditLog)
82
+ .where(conditions.length > 0 ? and(...conditions) : undefined)
83
+ .orderBy(desc(auditLog.timestamp))
84
+ .limit(filter.limit ?? 1000)
85
+ .offset(filter.offset ?? 0);
86
+ return rows.map(rowToEntry);
87
+ }
88
+ /** Get total entry count (optionally filtered by agent) */
89
+ async count(agentId) {
90
+ const condition = agentId ? eq(auditLog.agentId, agentId) : undefined;
91
+ const result = await this.db.select({ value: count() }).from(auditLog).where(condition);
92
+ return result[0]?.value ?? 0;
93
+ }
94
+ /** Get entries since a given timestamp */
95
+ async since(timestamp, limit = 1000) {
96
+ const rows = await this.db
97
+ .select()
98
+ .from(auditLog)
99
+ .where(gte(auditLog.timestamp, timestamp))
100
+ .orderBy(desc(auditLog.timestamp))
101
+ .limit(limit);
102
+ return rows.map(rowToEntry);
103
+ }
104
+ }
105
+ // ─── Row Mapping ────────────────────────────────────────────────────────────
106
+ /** Convert a database row to an AuditEntry */
107
+ function rowToEntry(row) {
108
+ return {
109
+ id: row.id,
110
+ timestamp: row.timestamp,
111
+ eventType: row.eventType,
112
+ severity: row.severity,
113
+ agentId: row.agentId,
114
+ taskId: row.taskId ?? undefined,
115
+ sessionId: row.sessionId ?? undefined,
116
+ payload: (row.payload ?? {}),
117
+ policyViolations: row.policyViolations ?? [],
118
+ };
119
+ }
120
+ //# sourceMappingURL=audit-store.js.map
@@ -0,0 +1 @@
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"}