@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.
- package/LICENSE +22 -0
- package/README.md +147 -0
- package/dist/audit-store.d.ts +56 -0
- package/dist/audit-store.d.ts.map +1 -0
- package/dist/audit-store.js +120 -0
- package/dist/audit-store.js.map +1 -0
- package/dist/cleanup/cross-db-cleanup.d.ts +82 -0
- package/dist/cleanup/cross-db-cleanup.d.ts.map +1 -0
- package/dist/cleanup/cross-db-cleanup.js +189 -0
- package/dist/cleanup/cross-db-cleanup.js.map +1 -0
- package/dist/cleanup/index.d.ts +11 -0
- package/dist/cleanup/index.d.ts.map +1 -0
- package/dist/cleanup/index.js +11 -0
- package/dist/cleanup/index.js.map +1 -0
- package/dist/cleanup/rag-site-cleanup.d.ts +58 -0
- package/dist/cleanup/rag-site-cleanup.d.ts.map +1 -0
- package/dist/cleanup/rag-site-cleanup.js +68 -0
- package/dist/cleanup/rag-site-cleanup.js.map +1 -0
- package/dist/cleanup/stale-tokens.d.ts +37 -0
- package/dist/cleanup/stale-tokens.d.ts.map +1 -0
- package/dist/cleanup/stale-tokens.js +113 -0
- package/dist/cleanup/stale-tokens.js.map +1 -0
- package/dist/client/index.d.ts +237 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +445 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +109 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +10 -0
- package/dist/client/types.js.map +1 -0
- package/dist/crypto.d.ts +27 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +74 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/log-transport.d.ts +20 -0
- package/dist/log-transport.d.ts.map +1 -0
- package/dist/log-transport.js +51 -0
- package/dist/log-transport.js.map +1 -0
- package/dist/pool.d.ts +37 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +260 -0
- package/dist/pool.js.map +1 -0
- package/dist/queries/boards.d.ts +154 -0
- package/dist/queries/boards.d.ts.map +1 -0
- package/dist/queries/boards.js +94 -0
- package/dist/queries/boards.js.map +1 -0
- package/dist/queries/code-provenance.d.ts +252 -0
- package/dist/queries/code-provenance.d.ts.map +1 -0
- package/dist/queries/code-provenance.js +136 -0
- package/dist/queries/code-provenance.js.map +1 -0
- package/dist/queries/conversations.d.ts +29 -0
- package/dist/queries/conversations.d.ts.map +1 -0
- package/dist/queries/conversations.js +83 -0
- package/dist/queries/conversations.js.map +1 -0
- package/dist/queries/media.d.ts +84 -0
- package/dist/queries/media.d.ts.map +1 -0
- package/dist/queries/media.js +47 -0
- package/dist/queries/media.js.map +1 -0
- package/dist/queries/oauth-accounts.d.ts +9 -0
- package/dist/queries/oauth-accounts.d.ts.map +1 -0
- package/dist/queries/oauth-accounts.js +15 -0
- package/dist/queries/oauth-accounts.js.map +1 -0
- package/dist/queries/orders.d.ts +91 -0
- package/dist/queries/orders.d.ts.map +1 -0
- package/dist/queries/orders.js +36 -0
- package/dist/queries/orders.js.map +1 -0
- package/dist/queries/pages.d.ts +119 -0
- package/dist/queries/pages.d.ts.map +1 -0
- package/dist/queries/pages.js +56 -0
- package/dist/queries/pages.js.map +1 -0
- package/dist/queries/passkeys.d.ts +21 -0
- package/dist/queries/passkeys.d.ts.map +1 -0
- package/dist/queries/passkeys.js +19 -0
- package/dist/queries/passkeys.js.map +1 -0
- package/dist/queries/posts.d.ts +138 -0
- package/dist/queries/posts.d.ts.map +1 -0
- package/dist/queries/posts.js +76 -0
- package/dist/queries/posts.js.map +1 -0
- package/dist/queries/products.d.ts +102 -0
- package/dist/queries/products.d.ts.map +1 -0
- package/dist/queries/products.js +55 -0
- package/dist/queries/products.js.map +1 -0
- package/dist/queries/sessions.d.ts +30 -0
- package/dist/queries/sessions.d.ts.map +1 -0
- package/dist/queries/sessions.js +37 -0
- package/dist/queries/sessions.js.map +1 -0
- package/dist/queries/sites.d.ts +127 -0
- package/dist/queries/sites.d.ts.map +1 -0
- package/dist/queries/sites.js +83 -0
- package/dist/queries/sites.js.map +1 -0
- package/dist/queries/ticket-comments.d.ts +70 -0
- package/dist/queries/ticket-comments.d.ts.map +1 -0
- package/dist/queries/ticket-comments.js +90 -0
- package/dist/queries/ticket-comments.js.map +1 -0
- package/dist/queries/ticket-labels.d.ts +79 -0
- package/dist/queries/ticket-labels.d.ts.map +1 -0
- package/dist/queries/ticket-labels.js +55 -0
- package/dist/queries/ticket-labels.js.map +1 -0
- package/dist/queries/tickets.d.ts +342 -0
- package/dist/queries/tickets.d.ts.map +1 -0
- package/dist/queries/tickets.js +110 -0
- package/dist/queries/tickets.js.map +1 -0
- package/dist/queries/user-api-keys.d.ts +28 -0
- package/dist/queries/user-api-keys.d.ts.map +1 -0
- package/dist/queries/user-api-keys.js +49 -0
- package/dist/queries/user-api-keys.js.map +1 -0
- package/dist/queries/users.d.ts +269 -0
- package/dist/queries/users.d.ts.map +1 -0
- package/dist/queries/users.js +113 -0
- package/dist/queries/users.js.map +1 -0
- package/dist/saga/crdt-resolver.d.ts +75 -0
- package/dist/saga/crdt-resolver.d.ts.map +1 -0
- package/dist/saga/crdt-resolver.js +168 -0
- package/dist/saga/crdt-resolver.js.map +1 -0
- package/dist/saga/idempotent-operation.d.ts +52 -0
- package/dist/saga/idempotent-operation.d.ts.map +1 -0
- package/dist/saga/idempotent-operation.js +78 -0
- package/dist/saga/idempotent-operation.js.map +1 -0
- package/dist/saga/index.d.ts +29 -0
- package/dist/saga/index.d.ts.map +1 -0
- package/dist/saga/index.js +30 -0
- package/dist/saga/index.js.map +1 -0
- package/dist/saga/neon-saga.d.ts +50 -0
- package/dist/saga/neon-saga.d.ts.map +1 -0
- package/dist/saga/neon-saga.js +234 -0
- package/dist/saga/neon-saga.js.map +1 -0
- package/dist/saga/recovery.d.ts +50 -0
- package/dist/saga/recovery.d.ts.map +1 -0
- package/dist/saga/recovery.js +92 -0
- package/dist/saga/recovery.js.map +1 -0
- package/dist/saga/resilient-step.d.ts +38 -0
- package/dist/saga/resilient-step.d.ts.map +1 -0
- package/dist/saga/resilient-step.js +75 -0
- package/dist/saga/resilient-step.js.map +1 -0
- package/dist/saga/types.d.ts +94 -0
- package/dist/saga/types.d.ts.map +1 -0
- package/dist/saga/types.js +9 -0
- package/dist/saga/types.js.map +1 -0
- package/dist/schema/accounts.d.ts +962 -0
- package/dist/schema/accounts.d.ts.map +1 -0
- package/dist/schema/accounts.js +125 -0
- package/dist/schema/accounts.js.map +1 -0
- package/dist/schema/agents.d.ts +1710 -0
- package/dist/schema/agents.d.ts.map +1 -0
- package/dist/schema/agents.js +298 -0
- package/dist/schema/agents.js.map +1 -0
- package/dist/schema/api-keys.d.ts +315 -0
- package/dist/schema/api-keys.d.ts.map +1 -0
- package/dist/schema/api-keys.js +56 -0
- package/dist/schema/api-keys.js.map +1 -0
- package/dist/schema/app-logs.d.ts +168 -0
- package/dist/schema/app-logs.d.ts.map +1 -0
- package/dist/schema/app-logs.js +25 -0
- package/dist/schema/app-logs.js.map +1 -0
- package/dist/schema/audit-log.d.ts +191 -0
- package/dist/schema/audit-log.d.ts.map +1 -0
- package/dist/schema/audit-log.js +39 -0
- package/dist/schema/audit-log.js.map +1 -0
- package/dist/schema/circuit-breaker.d.ts +139 -0
- package/dist/schema/circuit-breaker.d.ts.map +1 -0
- package/dist/schema/circuit-breaker.js +28 -0
- package/dist/schema/circuit-breaker.js.map +1 -0
- package/dist/schema/cms.d.ts +1083 -0
- package/dist/schema/cms.d.ts.map +1 -0
- package/dist/schema/cms.js +151 -0
- package/dist/schema/cms.js.map +1 -0
- package/dist/schema/code-provenance.d.ts +488 -0
- package/dist/schema/code-provenance.d.ts.map +1 -0
- package/dist/schema/code-provenance.js +72 -0
- package/dist/schema/code-provenance.js.map +1 -0
- package/dist/schema/collab-edits.d.ts +165 -0
- package/dist/schema/collab-edits.d.ts.map +1 -0
- package/dist/schema/collab-edits.js +21 -0
- package/dist/schema/collab-edits.js.map +1 -0
- package/dist/schema/coordination.d.ts +967 -0
- package/dist/schema/coordination.d.ts.map +1 -0
- package/dist/schema/coordination.js +112 -0
- package/dist/schema/coordination.js.map +1 -0
- package/dist/schema/crdt-operations.d.ts +153 -0
- package/dist/schema/crdt-operations.d.ts.map +1 -0
- package/dist/schema/crdt-operations.js +33 -0
- package/dist/schema/crdt-operations.js.map +1 -0
- package/dist/schema/error-events.d.ts +223 -0
- package/dist/schema/error-events.d.ts.map +1 -0
- package/dist/schema/error-events.js +44 -0
- package/dist/schema/error-events.js.map +1 -0
- package/dist/schema/gdpr.d.ts +529 -0
- package/dist/schema/gdpr.d.ts.map +1 -0
- package/dist/schema/gdpr.js +93 -0
- package/dist/schema/gdpr.js.map +1 -0
- package/dist/schema/idempotency.d.ts +104 -0
- package/dist/schema/idempotency.d.ts.map +1 -0
- package/dist/schema/idempotency.js +24 -0
- package/dist/schema/idempotency.js.map +1 -0
- package/dist/schema/index.d.ts +194 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +451 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/jobs.d.ts +242 -0
- package/dist/schema/jobs.d.ts.map +1 -0
- package/dist/schema/jobs.js +48 -0
- package/dist/schema/jobs.js.map +1 -0
- package/dist/schema/licenses.d.ts +274 -0
- package/dist/schema/licenses.d.ts.map +1 -0
- package/dist/schema/licenses.js +66 -0
- package/dist/schema/licenses.js.map +1 -0
- package/dist/schema/magic-links.d.ts +136 -0
- package/dist/schema/magic-links.d.ts.map +1 -0
- package/dist/schema/magic-links.js +32 -0
- package/dist/schema/magic-links.js.map +1 -0
- package/dist/schema/marketplace.d.ts +496 -0
- package/dist/schema/marketplace.d.ts.map +1 -0
- package/dist/schema/marketplace.js +114 -0
- package/dist/schema/marketplace.js.map +1 -0
- package/dist/schema/node-ids.d.ts +122 -0
- package/dist/schema/node-ids.d.ts.map +1 -0
- package/dist/schema/node-ids.js +25 -0
- package/dist/schema/node-ids.js.map +1 -0
- package/dist/schema/oauth-accounts.d.ts +205 -0
- package/dist/schema/oauth-accounts.d.ts.map +1 -0
- package/dist/schema/oauth-accounts.js +35 -0
- package/dist/schema/oauth-accounts.js.map +1 -0
- package/dist/schema/pages.d.ts +522 -0
- package/dist/schema/pages.d.ts.map +1 -0
- package/dist/schema/pages.js +80 -0
- package/dist/schema/pages.js.map +1 -0
- package/dist/schema/passkeys.d.ts +208 -0
- package/dist/schema/passkeys.d.ts.map +1 -0
- package/dist/schema/passkeys.js +48 -0
- package/dist/schema/passkeys.js.map +1 -0
- package/dist/schema/password-reset-tokens.d.ts +137 -0
- package/dist/schema/password-reset-tokens.d.ts.map +1 -0
- package/dist/schema/password-reset-tokens.js +29 -0
- package/dist/schema/password-reset-tokens.js.map +1 -0
- package/dist/schema/products.d.ts +536 -0
- package/dist/schema/products.d.ts.map +1 -0
- package/dist/schema/products.js +104 -0
- package/dist/schema/products.js.map +1 -0
- package/dist/schema/rag.d.ts +566 -0
- package/dist/schema/rag.d.ts.map +1 -0
- package/dist/schema/rag.js +85 -0
- package/dist/schema/rag.js.map +1 -0
- package/dist/schema/rate-limits.d.ts +212 -0
- package/dist/schema/rate-limits.d.ts.map +1 -0
- package/dist/schema/rate-limits.js +41 -0
- package/dist/schema/rate-limits.js.map +1 -0
- package/dist/schema/rest.d.ts +45 -0
- package/dist/schema/rest.d.ts.map +1 -0
- package/dist/schema/rest.js +51 -0
- package/dist/schema/rest.js.map +1 -0
- package/dist/schema/revealcoin.d.ts +267 -0
- package/dist/schema/revealcoin.d.ts.map +1 -0
- package/dist/schema/revealcoin.js +54 -0
- package/dist/schema/revealcoin.js.map +1 -0
- package/dist/schema/revmarket.d.ts +971 -0
- package/dist/schema/revmarket.d.ts.map +1 -0
- package/dist/schema/revmarket.js +160 -0
- package/dist/schema/revmarket.js.map +1 -0
- package/dist/schema/sites.d.ts +399 -0
- package/dist/schema/sites.d.ts.map +1 -0
- package/dist/schema/sites.js +69 -0
- package/dist/schema/sites.js.map +1 -0
- package/dist/schema/tenants.d.ts +188 -0
- package/dist/schema/tenants.d.ts.map +1 -0
- package/dist/schema/tenants.js +14 -0
- package/dist/schema/tenants.js.map +1 -0
- package/dist/schema/tickets.d.ts +1118 -0
- package/dist/schema/tickets.d.ts.map +1 -0
- package/dist/schema/tickets.js +165 -0
- package/dist/schema/tickets.js.map +1 -0
- package/dist/schema/users.d.ts +779 -0
- package/dist/schema/users.d.ts.map +1 -0
- package/dist/schema/users.js +111 -0
- package/dist/schema/users.js.map +1 -0
- package/dist/schema/vector.d.ts +17 -0
- package/dist/schema/vector.d.ts.map +1 -0
- package/dist/schema/vector.js +20 -0
- package/dist/schema/vector.js.map +1 -0
- package/dist/schema/waitlist.d.ts +151 -0
- package/dist/schema/waitlist.d.ts.map +1 -0
- package/dist/schema/waitlist.js +17 -0
- package/dist/schema/waitlist.js.map +1 -0
- package/dist/schema/webhook-events.d.ts +68 -0
- package/dist/schema/webhook-events.d.ts.map +1 -0
- package/dist/schema/webhook-events.js +17 -0
- package/dist/schema/webhook-events.js.map +1 -0
- package/dist/schema/yjs-documents.d.ts +116 -0
- package/dist/schema/yjs-documents.d.ts.map +1 -0
- package/dist/schema/yjs-documents.js +15 -0
- package/dist/schema/yjs-documents.js.map +1 -0
- package/dist/scripts/cleanup-expired.d.ts +12 -0
- package/dist/scripts/cleanup-expired.d.ts.map +1 -0
- package/dist/scripts/cleanup-expired.js +50 -0
- package/dist/scripts/cleanup-expired.js.map +1 -0
- package/dist/types/database.d.ts +1286 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/database.js +262 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/discover.d.ts +83 -0
- package/dist/types/discover.d.ts.map +1 -0
- package/dist/types/discover.js +271 -0
- package/dist/types/discover.js.map +1 -0
- package/dist/types/extract-relationships.d.ts +115 -0
- package/dist/types/extract-relationships.d.ts.map +1 -0
- package/dist/types/extract-relationships.js +455 -0
- package/dist/types/extract-relationships.js.map +1 -0
- package/dist/types/generate-contracts.d.ts +19 -0
- package/dist/types/generate-contracts.d.ts.map +1 -0
- package/dist/types/generate-contracts.js +127 -0
- package/dist/types/generate-contracts.js.map +1 -0
- package/dist/types/generate-zod-schemas.d.ts +20 -0
- package/dist/types/generate-zod-schemas.d.ts.map +1 -0
- package/dist/types/generate-zod-schemas.js +127 -0
- package/dist/types/generate-zod-schemas.js.map +1 -0
- package/dist/types/generate.d.ts +17 -0
- package/dist/types/generate.d.ts.map +1 -0
- package/dist/types/generate.js +296 -0
- package/dist/types/generate.js.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/introspect.d.ts +75 -0
- package/dist/types/introspect.d.ts.map +1 -0
- package/dist/types/introspect.js +186 -0
- package/dist/types/introspect.js.map +1 -0
- package/dist/types/stripe-schema.d.ts +893 -0
- package/dist/types/stripe-schema.d.ts.map +1 -0
- package/dist/types/stripe-schema.js +117 -0
- package/dist/types/stripe-schema.js.map +1 -0
- package/dist/utils/soft-delete.d.ts +45 -0
- package/dist/utils/soft-delete.d.ts.map +1 -0
- package/dist/utils/soft-delete.js +45 -0
- package/dist/utils/soft-delete.js.map +1 -0
- package/dist/validation/cross-db.d.ts +60 -0
- package/dist/validation/cross-db.d.ts.map +1 -0
- package/dist/validation/cross-db.js +146 -0
- package/dist/validation/cross-db.js.map +1 -0
- 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"}
|