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