@revealui/db 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/dist/audit-store.d.ts.map +1 -1
  2. package/dist/audit-store.js.map +1 -1
  3. package/dist/cleanup/cross-db-cleanup.d.ts +63 -0
  4. package/dist/cleanup/cross-db-cleanup.d.ts.map +1 -0
  5. package/dist/cleanup/cross-db-cleanup.js +150 -0
  6. package/dist/cleanup/cross-db-cleanup.js.map +1 -0
  7. package/dist/cleanup/index.d.ts +10 -0
  8. package/dist/cleanup/index.d.ts.map +1 -0
  9. package/dist/cleanup/index.js +10 -0
  10. package/dist/cleanup/index.js.map +1 -0
  11. package/dist/cleanup/stale-tokens.d.ts +37 -0
  12. package/dist/cleanup/stale-tokens.d.ts.map +1 -0
  13. package/dist/cleanup/stale-tokens.js +113 -0
  14. package/dist/cleanup/stale-tokens.js.map +1 -0
  15. package/dist/client/index.d.ts +13 -0
  16. package/dist/client/index.d.ts.map +1 -1
  17. package/dist/client/index.js +46 -7
  18. package/dist/client/index.js.map +1 -1
  19. package/dist/client/types.d.ts.map +1 -1
  20. package/dist/crypto.js.map +1 -1
  21. package/dist/index.d.ts +2 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/log-transport.d.ts.map +1 -1
  26. package/dist/log-transport.js +3 -1
  27. package/dist/log-transport.js.map +1 -1
  28. package/dist/pool.d.ts +0 -3
  29. package/dist/pool.d.ts.map +1 -1
  30. package/dist/pool.js +13 -5
  31. package/dist/pool.js.map +1 -1
  32. package/dist/queries/boards.d.ts +13 -1
  33. package/dist/queries/boards.d.ts.map +1 -1
  34. package/dist/queries/boards.js +5 -2
  35. package/dist/queries/boards.js.map +1 -1
  36. package/dist/queries/code-provenance.d.ts.map +1 -1
  37. package/dist/queries/code-provenance.js.map +1 -1
  38. package/dist/queries/media.d.ts +9 -0
  39. package/dist/queries/media.d.ts.map +1 -1
  40. package/dist/queries/media.js +23 -13
  41. package/dist/queries/media.js.map +1 -1
  42. package/dist/queries/pages.d.ts +10 -0
  43. package/dist/queries/pages.d.ts.map +1 -1
  44. package/dist/queries/pages.js +24 -5
  45. package/dist/queries/pages.js.map +1 -1
  46. package/dist/queries/posts.d.ts +10 -0
  47. package/dist/queries/posts.d.ts.map +1 -1
  48. package/dist/queries/posts.js +17 -5
  49. package/dist/queries/posts.js.map +1 -1
  50. package/dist/queries/sites.d.ts +36 -1
  51. package/dist/queries/sites.d.ts.map +1 -1
  52. package/dist/queries/sites.js +45 -5
  53. package/dist/queries/sites.js.map +1 -1
  54. package/dist/queries/ticket-comments.d.ts +9 -1
  55. package/dist/queries/ticket-comments.d.ts.map +1 -1
  56. package/dist/queries/ticket-comments.js +4 -0
  57. package/dist/queries/ticket-comments.js.map +1 -1
  58. package/dist/queries/ticket-labels.d.ts +10 -0
  59. package/dist/queries/ticket-labels.d.ts.map +1 -1
  60. package/dist/queries/ticket-labels.js +4 -0
  61. package/dist/queries/ticket-labels.js.map +1 -1
  62. package/dist/queries/tickets.d.ts +1 -1
  63. package/dist/queries/tickets.d.ts.map +1 -1
  64. package/dist/queries/tickets.js +4 -7
  65. package/dist/queries/tickets.js.map +1 -1
  66. package/dist/queries/users.d.ts +109 -0
  67. package/dist/queries/users.d.ts.map +1 -0
  68. package/dist/queries/users.js +44 -0
  69. package/dist/queries/users.js.map +1 -0
  70. package/dist/schema/accounts.d.ts +962 -0
  71. package/dist/schema/accounts.d.ts.map +1 -0
  72. package/dist/schema/accounts.js +115 -0
  73. package/dist/schema/accounts.js.map +1 -0
  74. package/dist/schema/agents.d.ts +165 -1
  75. package/dist/schema/agents.d.ts.map +1 -1
  76. package/dist/schema/agents.js +56 -5
  77. package/dist/schema/agents.js.map +1 -1
  78. package/dist/schema/api-keys.d.ts +17 -0
  79. package/dist/schema/api-keys.d.ts.map +1 -1
  80. package/dist/schema/api-keys.js +3 -0
  81. package/dist/schema/api-keys.js.map +1 -1
  82. package/dist/schema/app-logs.d.ts.map +1 -1
  83. package/dist/schema/app-logs.js.map +1 -1
  84. package/dist/schema/audit-log.d.ts.map +1 -1
  85. package/dist/schema/audit-log.js.map +1 -1
  86. package/dist/schema/cms.d.ts +68 -0
  87. package/dist/schema/cms.d.ts.map +1 -1
  88. package/dist/schema/cms.js +18 -4
  89. package/dist/schema/cms.js.map +1 -1
  90. package/dist/schema/code-provenance.d.ts.map +1 -1
  91. package/dist/schema/code-provenance.js.map +1 -1
  92. package/dist/schema/collab-edits.d.ts.map +1 -1
  93. package/dist/schema/collab-edits.js +2 -2
  94. package/dist/schema/collab-edits.js.map +1 -1
  95. package/dist/schema/coordination.d.ts +967 -0
  96. package/dist/schema/coordination.d.ts.map +1 -0
  97. package/dist/schema/coordination.js +109 -0
  98. package/dist/schema/coordination.js.map +1 -0
  99. package/dist/schema/crdt-operations.d.ts.map +1 -1
  100. package/dist/schema/crdt-operations.js.map +1 -1
  101. package/dist/schema/error-events.d.ts.map +1 -1
  102. package/dist/schema/error-events.js.map +1 -1
  103. package/dist/schema/gdpr.d.ts +529 -0
  104. package/dist/schema/gdpr.d.ts.map +1 -0
  105. package/dist/schema/gdpr.js +93 -0
  106. package/dist/schema/gdpr.js.map +1 -0
  107. package/dist/schema/index.d.ts +37 -1
  108. package/dist/schema/index.d.ts.map +1 -1
  109. package/dist/schema/index.js +73 -0
  110. package/dist/schema/index.js.map +1 -1
  111. package/dist/schema/jobs.d.ts +242 -0
  112. package/dist/schema/jobs.d.ts.map +1 -0
  113. package/dist/schema/jobs.js +48 -0
  114. package/dist/schema/jobs.js.map +1 -0
  115. package/dist/schema/licenses.d.ts +51 -0
  116. package/dist/schema/licenses.d.ts.map +1 -1
  117. package/dist/schema/licenses.js +8 -2
  118. package/dist/schema/licenses.js.map +1 -1
  119. package/dist/schema/magic-links.d.ts +136 -0
  120. package/dist/schema/magic-links.d.ts.map +1 -0
  121. package/dist/schema/magic-links.js +32 -0
  122. package/dist/schema/magic-links.js.map +1 -0
  123. package/dist/schema/marketplace.d.ts +496 -0
  124. package/dist/schema/marketplace.d.ts.map +1 -0
  125. package/dist/schema/marketplace.js +110 -0
  126. package/dist/schema/marketplace.js.map +1 -0
  127. package/dist/schema/node-ids.d.ts.map +1 -1
  128. package/dist/schema/node-ids.js.map +1 -1
  129. package/dist/schema/oauth-accounts.d.ts +34 -0
  130. package/dist/schema/oauth-accounts.d.ts.map +1 -1
  131. package/dist/schema/oauth-accounts.js +5 -0
  132. package/dist/schema/oauth-accounts.js.map +1 -1
  133. package/dist/schema/pages.d.ts +34 -0
  134. package/dist/schema/pages.d.ts.map +1 -1
  135. package/dist/schema/pages.js +14 -4
  136. package/dist/schema/pages.js.map +1 -1
  137. package/dist/schema/passkeys.d.ts +208 -0
  138. package/dist/schema/passkeys.d.ts.map +1 -0
  139. package/dist/schema/passkeys.js +47 -0
  140. package/dist/schema/passkeys.js.map +1 -0
  141. package/dist/schema/password-reset-tokens.d.ts.map +1 -1
  142. package/dist/schema/password-reset-tokens.js +5 -2
  143. package/dist/schema/password-reset-tokens.js.map +1 -1
  144. package/dist/schema/rag.d.ts.map +1 -1
  145. package/dist/schema/rag.js +5 -2
  146. package/dist/schema/rag.js.map +1 -1
  147. package/dist/schema/rate-limits.d.ts.map +1 -1
  148. package/dist/schema/rate-limits.js +5 -2
  149. package/dist/schema/rate-limits.js.map +1 -1
  150. package/dist/schema/rest.d.ts +9 -2
  151. package/dist/schema/rest.d.ts.map +1 -1
  152. package/dist/schema/rest.js +9 -2
  153. package/dist/schema/rest.js.map +1 -1
  154. package/dist/schema/sites.d.ts +34 -0
  155. package/dist/schema/sites.d.ts.map +1 -1
  156. package/dist/schema/sites.js +15 -3
  157. package/dist/schema/sites.js.map +1 -1
  158. package/dist/schema/tenants.d.ts +188 -0
  159. package/dist/schema/tenants.d.ts.map +1 -0
  160. package/dist/schema/tenants.js +15 -0
  161. package/dist/schema/tenants.js.map +1 -0
  162. package/dist/schema/tickets.d.ts.map +1 -1
  163. package/dist/schema/tickets.js +17 -5
  164. package/dist/schema/tickets.js.map +1 -1
  165. package/dist/schema/users.d.ts +174 -0
  166. package/dist/schema/users.d.ts.map +1 -1
  167. package/dist/schema/users.js +32 -3
  168. package/dist/schema/users.js.map +1 -1
  169. package/dist/schema/vector.d.ts.map +1 -1
  170. package/dist/schema/vector.js.map +1 -1
  171. package/dist/schema/waitlist.d.ts.map +1 -1
  172. package/dist/schema/waitlist.js.map +1 -1
  173. package/dist/schema/webhook-events.d.ts.map +1 -1
  174. package/dist/schema/webhook-events.js.map +1 -1
  175. package/dist/schema/yjs-documents.d.ts.map +1 -1
  176. package/dist/schema/yjs-documents.js.map +1 -1
  177. package/dist/scripts/cleanup-expired.d.ts +12 -0
  178. package/dist/scripts/cleanup-expired.d.ts.map +1 -0
  179. package/dist/scripts/cleanup-expired.js +50 -0
  180. package/dist/scripts/cleanup-expired.js.map +1 -0
  181. package/dist/security-audit-storage.d.ts +54 -0
  182. package/dist/security-audit-storage.d.ts.map +1 -0
  183. package/dist/security-audit-storage.js +100 -0
  184. package/dist/security-audit-storage.js.map +1 -0
  185. package/dist/types/database.d.ts +320 -2
  186. package/dist/types/database.d.ts.map +1 -1
  187. package/dist/types/database.js +66 -1
  188. package/dist/types/database.js.map +1 -1
  189. package/dist/types/discover.d.ts +2 -2
  190. package/dist/types/discover.d.ts.map +1 -1
  191. package/dist/types/discover.js +16 -16
  192. package/dist/types/discover.js.map +1 -1
  193. package/dist/types/extract-relationships.d.ts.map +1 -1
  194. package/dist/types/extract-relationships.js.map +1 -1
  195. package/dist/types/generate-contracts.js.map +1 -1
  196. package/dist/types/generate-zod-schemas.js.map +1 -1
  197. package/dist/types/generate.js.map +1 -1
  198. package/dist/types/index.d.ts.map +1 -1
  199. package/dist/types/introspect.d.ts.map +1 -1
  200. package/dist/types/introspect.js +0 -1
  201. package/dist/types/introspect.js.map +1 -1
  202. package/dist/types/stripe-schema.d.ts.map +1 -1
  203. package/dist/types/stripe-schema.js +7 -2
  204. package/dist/types/stripe-schema.js.map +1 -1
  205. package/dist/utils/soft-delete.d.ts +45 -0
  206. package/dist/utils/soft-delete.d.ts.map +1 -0
  207. package/dist/utils/soft-delete.js +45 -0
  208. package/dist/utils/soft-delete.js.map +1 -0
  209. package/dist/validation/cross-db.d.ts +60 -0
  210. package/dist/validation/cross-db.d.ts.map +1 -0
  211. package/dist/validation/cross-db.js +146 -0
  212. package/dist/validation/cross-db.js.map +1 -0
  213. package/package.json +25 -6
@@ -0,0 +1,110 @@
1
+ /**
2
+ * MCP Marketplace Tables (Phase 5.5)
3
+ *
4
+ * Community developers publish MCP servers with a per-call price.
5
+ * RevealUI acts as a payment proxy: callers pay via x402 (USDC on Base),
6
+ * RevealUI takes 20%, developer earns 80%.
7
+ *
8
+ * Payment batching: individual USDC micropayments accumulate in
9
+ * marketplace_transactions. Stripe Connect transfers are batched
10
+ * (daily/weekly) rather than immediate — Stripe's minimum transfer is $0.50
11
+ * which exceeds typical per-call amounts.
12
+ */
13
+ import { integer, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
14
+ import { users } from './users.js';
15
+ // =============================================================================
16
+ // Marketplace Servers
17
+ // =============================================================================
18
+ /**
19
+ * Registry of community-published MCP servers available through the marketplace.
20
+ * Each server has a per-call price in USDC; callers pay via x402.
21
+ */
22
+ export const marketplaceServers = pgTable('marketplace_servers', {
23
+ /** Nanoid-style short ID (e.g. 'mcp_abc123xyz') */
24
+ id: text('id').primaryKey(),
25
+ /** Human-readable display name */
26
+ name: text('name').notNull(),
27
+ /** Short description of what the server does */
28
+ description: text('description').notNull(),
29
+ /**
30
+ * Canonical MCP server endpoint (HTTPS required in production).
31
+ * Kept internal — callers invoke via /api/marketplace/servers/:id/invoke.
32
+ */
33
+ url: text('url').notNull(),
34
+ /** Top-level category for discovery filtering */
35
+ category: text('category').notNull().default('other'),
36
+ /** Searchable tags */
37
+ tags: text('tags').array().$type().notNull().default([]),
38
+ /**
39
+ * Per-call price in human-readable USDC (e.g. '0.005' = $0.005).
40
+ * USDC has 6 decimal places; atomic units = price * 1_000_000.
41
+ */
42
+ pricePerCallUsdc: text('price_per_call_usdc').notNull().default('0.001'),
43
+ /** User who published this server */
44
+ developerId: text('developer_id')
45
+ .notNull()
46
+ .references(() => users.id, { onDelete: 'cascade' }),
47
+ /**
48
+ * Stripe Connect Express account ID (acct_...).
49
+ * Populated after the developer completes Connect onboarding.
50
+ * Required before automatic payouts can be initiated.
51
+ */
52
+ stripeAccountId: text('stripe_account_id'),
53
+ /**
54
+ * Lifecycle status:
55
+ * - pending: newly published, not yet discoverable (reserved for future approval flow)
56
+ * - active: discoverable and callable
57
+ * - suspended: temporarily hidden (admin action)
58
+ */
59
+ status: text('status').notNull().default('active'),
60
+ /** Total successful invocations (incremented on each completed call) */
61
+ callCount: integer('call_count').notNull().default(0),
62
+ /** Arbitrary developer-supplied metadata (contact, docs URL, etc.) */
63
+ metadata: jsonb('metadata').$type().default({}),
64
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
65
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
66
+ });
67
+ // =============================================================================
68
+ // Marketplace Transactions
69
+ // =============================================================================
70
+ /**
71
+ * Per-call payment ledger.
72
+ * One row per successful marketplace invocation.
73
+ * Used for developer earnings dashboards, payout calculations, and auditing.
74
+ */
75
+ export const marketplaceTransactions = pgTable('marketplace_transactions', {
76
+ id: text('id').primaryKey(),
77
+ /** Server that was called */
78
+ serverId: text('server_id')
79
+ .notNull()
80
+ .references(() => marketplaceServers.id, { onDelete: 'cascade' }),
81
+ /**
82
+ * User who made the call, if authenticated.
83
+ * Nullable — x402 payments can come from anonymous agents.
84
+ */
85
+ callerId: text('caller_id'),
86
+ /** Total amount paid by caller in human-readable USDC */
87
+ amountUsdc: text('amount_usdc').notNull(),
88
+ /** Platform fee (20%) in human-readable USDC */
89
+ platformFeeUsdc: text('platform_fee_usdc').notNull(),
90
+ /** Developer earnings (80%) in human-readable USDC */
91
+ developerAmountUsdc: text('developer_amount_usdc').notNull(),
92
+ /**
93
+ * Stripe transfer ID (tr_...) once a payout has been initiated.
94
+ * Null until batch payout runs.
95
+ */
96
+ stripeTransferId: text('stripe_transfer_id'),
97
+ /** Payment method used: 'x402' */
98
+ paymentMethod: text('payment_method').notNull().default('x402'),
99
+ /**
100
+ * Transaction status:
101
+ * - pending: payment verified, server call in-flight
102
+ * - completed: server responded successfully
103
+ * - failed: server call failed (payment still taken — refund flow TBD)
104
+ */
105
+ status: text('status').notNull().default('pending'),
106
+ /** Additional context (request hash, network, etc.) */
107
+ metadata: jsonb('metadata').$type().default({}),
108
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
109
+ });
110
+ //# sourceMappingURL=marketplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/schema/marketplace.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"node-ids.d.ts","sourceRoot":"","sources":["../../src/schema/node-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBzB,CAAA;AAMF,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,YAAY,CAAA;AAC9D,MAAM,MAAM,gBAAgB,GAAG,OAAO,cAAc,CAAC,YAAY,CAAA"}
1
+ {"version":3,"file":"node-ids.d.ts","sourceRoot":"","sources":["../../src/schema/node-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBzB,CAAC;AAMH,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,YAAY,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,OAAO,cAAc,CAAC,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"node-ids.js","sourceRoot":"","sources":["../../src/schema/node-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE;IACxD,yDAAyD;IACzD,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,mCAAmC;IACnC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAEzC,2CAA2C;IAC3C,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IAErC,gDAAgD;IAChD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAE1C,aAAa;IACb,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACjF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CAClF,CAAC,CAAA"}
1
+ {"version":3,"file":"node-ids.js","sourceRoot":"","sources":["../../src/schema/node-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE;IACxD,yDAAyD;IACzD,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,mCAAmC;IACnC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAEzC,2CAA2C;IAC3C,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IAErC,gDAAgD;IAChD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAE1C,aAAa;IACb,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACjF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CAClF,CAAC,CAAC"}
@@ -163,6 +163,40 @@ export declare const oauthAccounts: import("drizzle-orm/pg-core").PgTableWithCol
163
163
  identity: undefined;
164
164
  generated: undefined;
165
165
  }, {}, {}>;
166
+ deletedAt: import("drizzle-orm/pg-core").PgColumn<{
167
+ name: "deleted_at";
168
+ tableName: "oauth_accounts";
169
+ dataType: "date";
170
+ columnType: "PgTimestamp";
171
+ data: Date;
172
+ driverParam: string;
173
+ notNull: false;
174
+ hasDefault: false;
175
+ isPrimaryKey: false;
176
+ isAutoincrement: false;
177
+ hasRuntimeDefault: false;
178
+ enumValues: undefined;
179
+ baseColumn: never;
180
+ identity: undefined;
181
+ generated: undefined;
182
+ }, {}, {}>;
183
+ anonymizedAt: import("drizzle-orm/pg-core").PgColumn<{
184
+ name: "anonymized_at";
185
+ tableName: "oauth_accounts";
186
+ dataType: "date";
187
+ columnType: "PgTimestamp";
188
+ data: Date;
189
+ driverParam: string;
190
+ notNull: false;
191
+ hasDefault: false;
192
+ isPrimaryKey: false;
193
+ isAutoincrement: false;
194
+ hasRuntimeDefault: false;
195
+ enumValues: undefined;
196
+ baseColumn: never;
197
+ identity: undefined;
198
+ generated: undefined;
199
+ }, {}, {}>;
166
200
  };
167
201
  dialect: "pg";
168
202
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-accounts.d.ts","sourceRoot":"","sources":["../../src/schema/oauth-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBzB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAA;AAC5D,MAAM,MAAM,eAAe,GAAG,OAAO,aAAa,CAAC,YAAY,CAAA"}
1
+ {"version":3,"file":"oauth-accounts.d.ts","sourceRoot":"","sources":["../../src/schema/oauth-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC7D,MAAM,MAAM,eAAe,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC"}
@@ -23,8 +23,13 @@ export const oauthAccounts = pgTable('oauth_accounts', {
23
23
  // Timestamps
24
24
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
25
25
  updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
26
+ // Soft-delete: null = active, timestamp = when unlinked
27
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
28
+ // GDPR anonymization: null = not anonymized, timestamp = when PII (providerEmail/Name/AvatarUrl) was wiped
29
+ anonymizedAt: timestamp('anonymized_at', { withTimezone: true }),
26
30
  }, (t) => [
27
31
  uniqueIndex('oauth_accounts_provider_user_idx').on(t.provider, t.providerUserId),
28
32
  index('oauth_accounts_user_id_idx').on(t.userId),
33
+ index('oauth_accounts_deleted_at_idx').on(t.deletedAt),
29
34
  ]);
30
35
  //# sourceMappingURL=oauth-accounts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-accounts.js","sourceRoot":"","sources":["../../src/schema/oauth-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAClC,gBAAgB,EAChB;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,QAAQ;IACR,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,oBAAoB;IACpB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,iCAAiC;IACvE,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE;IAClD,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACrC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;IACnC,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,CAAC;IAE9C,aAAa;IACb,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACjF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CAClF,EACD,CAAC,CAAC,EAAE,EAAE,CAAC;IACL,WAAW,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,cAAc,CAAC;IAChF,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;CACjD,CACF,CAAA"}
1
+ {"version":3,"file":"oauth-accounts.js","sourceRoot":"","sources":["../../src/schema/oauth-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAClC,gBAAgB,EAChB;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,QAAQ;IACR,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,oBAAoB;IACpB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,iCAAiC;IACvE,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE;IAClD,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACrC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;IACnC,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,CAAC;IAE9C,aAAa;IACb,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACjF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IAEjF,wDAAwD;IACxD,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAE1D,2GAA2G;IAC3G,YAAY,EAAE,SAAS,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;CACjE,EACD,CAAC,CAAC,EAAE,EAAE,CAAC;IACL,WAAW,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,cAAc,CAAC;IAChF,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAChD,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;CACvD,CACF,CAAC"}
@@ -42,6 +42,23 @@ export declare const pages: import("drizzle-orm/pg-core").PgTableWithColumns<{
42
42
  identity: undefined;
43
43
  generated: undefined;
44
44
  }, {}, {}>;
45
+ version: import("drizzle-orm/pg-core").PgColumn<{
46
+ name: "version";
47
+ tableName: "pages";
48
+ dataType: "number";
49
+ columnType: "PgInteger";
50
+ data: number;
51
+ driverParam: string | number;
52
+ notNull: true;
53
+ hasDefault: true;
54
+ isPrimaryKey: false;
55
+ isAutoincrement: false;
56
+ hasRuntimeDefault: false;
57
+ enumValues: undefined;
58
+ baseColumn: never;
59
+ identity: undefined;
60
+ generated: undefined;
61
+ }, {}, {}>;
45
62
  siteId: import("drizzle-orm/pg-core").PgColumn<{
46
63
  name: "site_id";
47
64
  tableName: "pages";
@@ -316,6 +333,23 @@ export declare const pages: import("drizzle-orm/pg-core").PgTableWithColumns<{
316
333
  identity: undefined;
317
334
  generated: undefined;
318
335
  }, {}, {}>;
336
+ deletedAt: import("drizzle-orm/pg-core").PgColumn<{
337
+ name: "deleted_at";
338
+ tableName: "pages";
339
+ dataType: "date";
340
+ columnType: "PgTimestamp";
341
+ data: Date;
342
+ driverParam: string;
343
+ notNull: false;
344
+ hasDefault: false;
345
+ isPrimaryKey: false;
346
+ isAutoincrement: false;
347
+ hasRuntimeDefault: false;
348
+ enumValues: undefined;
349
+ baseColumn: never;
350
+ identity: undefined;
351
+ generated: undefined;
352
+ }, {}, {}>;
319
353
  };
320
354
  dialect: "pg";
321
355
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/schema/pages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0ChB,CAAA;AAMF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBxB,CAAA;AAMF,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,YAAY,CAAA;AAC5C,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,YAAY,CAAA;AAC/C,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAA;AAC5D,MAAM,MAAM,eAAe,GAAG,OAAO,aAAa,CAAC,YAAY,CAAA"}
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/schema/pages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DjB,CAAC;AAMF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BzB,CAAC;AAMF,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AAC7C,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC7D,MAAM,MAAM,eAAe,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * These tables store page content and hierarchies.
5
5
  * The schema structure mirrors the Zod schemas in @revealui/contracts/entities.
6
6
  */
7
- import { integer, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
7
+ import { index, integer, jsonb, pgTable, text, timestamp, uniqueIndex } from 'drizzle-orm/pg-core';
8
8
  import { sites } from './sites.js';
9
9
  import { users } from './users.js';
10
10
  // =============================================================================
@@ -15,11 +15,13 @@ export const pages = pgTable('pages', {
15
15
  id: text('id').primaryKey(),
16
16
  // Schema versioning for migrations
17
17
  schemaVersion: text('schema_version').notNull().default('1'),
18
+ // Optimistic locking — incremented on each update, checked to detect concurrent edits
19
+ version: integer('version').notNull().default(1),
18
20
  // Relationships
19
21
  siteId: text('site_id')
20
22
  .notNull()
21
23
  .references(() => sites.id, { onDelete: 'cascade' }),
22
- parentId: text('parent_id'),
24
+ parentId: text('parent_id').references(() => pages.id, { onDelete: 'cascade' }),
23
25
  templateId: text('template_id'),
24
26
  // Basic info
25
27
  title: text('title').notNull(),
@@ -42,7 +44,15 @@ export const pages = pgTable('pages', {
42
44
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
43
45
  updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
44
46
  publishedAt: timestamp('published_at', { withTimezone: true }),
45
- });
47
+ // Soft-delete: null = active, timestamp = when deleted
48
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
49
+ }, (table) => [
50
+ index('pages_parent_id_idx').on(table.parentId),
51
+ index('pages_site_id_idx').on(table.siteId),
52
+ index('pages_site_status_idx').on(table.siteId, table.status),
53
+ uniqueIndex('pages_slug_site_id_idx').on(table.slug, table.siteId),
54
+ index('pages_deleted_at_idx').on(table.deletedAt),
55
+ ]);
46
56
  // =============================================================================
47
57
  // Page Revisions Table (for version history)
48
58
  // =============================================================================
@@ -66,5 +76,5 @@ export const pageRevisions = pgTable('page_revisions', {
66
76
  changeDescription: text('change_description'),
67
77
  // Timestamps
68
78
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
69
- });
79
+ }, (table) => [index('page_revisions_page_id_idx').on(table.pageId)]);
70
80
  //# sourceMappingURL=pages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/schema/pages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/schema/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Passkeys table
3
+ *
4
+ * Stores WebAuthn/FIDO2 passkey credentials for passwordless authentication.
5
+ * Each user can register multiple passkeys (e.g., fingerprint, security key, phone).
6
+ * Credential IDs and public keys are stored per the WebAuthn specification.
7
+ */
8
+ export declare const passkeys: import("drizzle-orm/pg-core").PgTableWithColumns<{
9
+ name: "passkeys";
10
+ schema: undefined;
11
+ columns: {
12
+ id: import("drizzle-orm/pg-core").PgColumn<{
13
+ name: "id";
14
+ tableName: "passkeys";
15
+ dataType: "string";
16
+ columnType: "PgText";
17
+ data: string;
18
+ driverParam: string;
19
+ notNull: true;
20
+ hasDefault: false;
21
+ isPrimaryKey: true;
22
+ isAutoincrement: false;
23
+ hasRuntimeDefault: false;
24
+ enumValues: [string, ...string[]];
25
+ baseColumn: never;
26
+ identity: undefined;
27
+ generated: undefined;
28
+ }, {}, {}>;
29
+ userId: import("drizzle-orm/pg-core").PgColumn<{
30
+ name: "user_id";
31
+ tableName: "passkeys";
32
+ dataType: "string";
33
+ columnType: "PgText";
34
+ data: string;
35
+ driverParam: string;
36
+ notNull: true;
37
+ hasDefault: false;
38
+ isPrimaryKey: false;
39
+ isAutoincrement: false;
40
+ hasRuntimeDefault: false;
41
+ enumValues: [string, ...string[]];
42
+ baseColumn: never;
43
+ identity: undefined;
44
+ generated: undefined;
45
+ }, {}, {}>;
46
+ credentialId: import("drizzle-orm/pg-core").PgColumn<{
47
+ name: "credential_id";
48
+ tableName: "passkeys";
49
+ dataType: "string";
50
+ columnType: "PgText";
51
+ data: string;
52
+ driverParam: string;
53
+ notNull: true;
54
+ hasDefault: false;
55
+ isPrimaryKey: false;
56
+ isAutoincrement: false;
57
+ hasRuntimeDefault: false;
58
+ enumValues: [string, ...string[]];
59
+ baseColumn: never;
60
+ identity: undefined;
61
+ generated: undefined;
62
+ }, {}, {}>;
63
+ publicKey: import("drizzle-orm/pg-core").PgColumn<{
64
+ name: "public_key";
65
+ tableName: "passkeys";
66
+ dataType: "custom";
67
+ columnType: "PgCustomColumn";
68
+ data: Buffer<ArrayBufferLike>;
69
+ driverParam: unknown;
70
+ notNull: true;
71
+ hasDefault: false;
72
+ isPrimaryKey: false;
73
+ isAutoincrement: false;
74
+ hasRuntimeDefault: false;
75
+ enumValues: undefined;
76
+ baseColumn: never;
77
+ identity: undefined;
78
+ generated: undefined;
79
+ }, {}, {
80
+ pgColumnBuilderBrand: "PgCustomColumnBuilderBrand";
81
+ }>;
82
+ counter: import("drizzle-orm/pg-core").PgColumn<{
83
+ name: "counter";
84
+ tableName: "passkeys";
85
+ dataType: "number";
86
+ columnType: "PgInteger";
87
+ data: number;
88
+ driverParam: string | number;
89
+ notNull: true;
90
+ hasDefault: true;
91
+ isPrimaryKey: false;
92
+ isAutoincrement: false;
93
+ hasRuntimeDefault: false;
94
+ enumValues: undefined;
95
+ baseColumn: never;
96
+ identity: undefined;
97
+ generated: undefined;
98
+ }, {}, {}>;
99
+ transports: import("drizzle-orm/pg-core").PgColumn<{
100
+ name: "transports";
101
+ tableName: "passkeys";
102
+ dataType: "json";
103
+ columnType: "PgJsonb";
104
+ data: string[];
105
+ driverParam: unknown;
106
+ notNull: false;
107
+ hasDefault: false;
108
+ isPrimaryKey: false;
109
+ isAutoincrement: false;
110
+ hasRuntimeDefault: false;
111
+ enumValues: undefined;
112
+ baseColumn: never;
113
+ identity: undefined;
114
+ generated: undefined;
115
+ }, {}, {
116
+ $type: string[];
117
+ }>;
118
+ aaguid: import("drizzle-orm/pg-core").PgColumn<{
119
+ name: "aaguid";
120
+ tableName: "passkeys";
121
+ dataType: "string";
122
+ columnType: "PgText";
123
+ data: string;
124
+ driverParam: string;
125
+ notNull: false;
126
+ hasDefault: false;
127
+ isPrimaryKey: false;
128
+ isAutoincrement: false;
129
+ hasRuntimeDefault: false;
130
+ enumValues: [string, ...string[]];
131
+ baseColumn: never;
132
+ identity: undefined;
133
+ generated: undefined;
134
+ }, {}, {}>;
135
+ deviceName: import("drizzle-orm/pg-core").PgColumn<{
136
+ name: "device_name";
137
+ tableName: "passkeys";
138
+ dataType: "string";
139
+ columnType: "PgText";
140
+ data: string;
141
+ driverParam: string;
142
+ notNull: false;
143
+ hasDefault: false;
144
+ isPrimaryKey: false;
145
+ isAutoincrement: false;
146
+ hasRuntimeDefault: false;
147
+ enumValues: [string, ...string[]];
148
+ baseColumn: never;
149
+ identity: undefined;
150
+ generated: undefined;
151
+ }, {}, {}>;
152
+ backedUp: import("drizzle-orm/pg-core").PgColumn<{
153
+ name: "backed_up";
154
+ tableName: "passkeys";
155
+ dataType: "boolean";
156
+ columnType: "PgBoolean";
157
+ data: boolean;
158
+ driverParam: boolean;
159
+ notNull: true;
160
+ hasDefault: true;
161
+ isPrimaryKey: false;
162
+ isAutoincrement: false;
163
+ hasRuntimeDefault: false;
164
+ enumValues: undefined;
165
+ baseColumn: never;
166
+ identity: undefined;
167
+ generated: undefined;
168
+ }, {}, {}>;
169
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
170
+ name: "created_at";
171
+ tableName: "passkeys";
172
+ dataType: "date";
173
+ columnType: "PgTimestamp";
174
+ data: Date;
175
+ driverParam: string;
176
+ notNull: true;
177
+ hasDefault: true;
178
+ isPrimaryKey: false;
179
+ isAutoincrement: false;
180
+ hasRuntimeDefault: false;
181
+ enumValues: undefined;
182
+ baseColumn: never;
183
+ identity: undefined;
184
+ generated: undefined;
185
+ }, {}, {}>;
186
+ lastUsedAt: import("drizzle-orm/pg-core").PgColumn<{
187
+ name: "last_used_at";
188
+ tableName: "passkeys";
189
+ dataType: "date";
190
+ columnType: "PgTimestamp";
191
+ data: Date;
192
+ driverParam: string;
193
+ notNull: false;
194
+ hasDefault: false;
195
+ isPrimaryKey: false;
196
+ isAutoincrement: false;
197
+ hasRuntimeDefault: false;
198
+ enumValues: undefined;
199
+ baseColumn: never;
200
+ identity: undefined;
201
+ generated: undefined;
202
+ }, {}, {}>;
203
+ };
204
+ dialect: "pg";
205
+ }>;
206
+ export type Passkey = typeof passkeys.$inferSelect;
207
+ export type NewPasskey = typeof passkeys.$inferInsert;
208
+ //# sourceMappingURL=passkeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkeys.d.ts","sourceRoot":"","sources":["../../src/schema/passkeys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6BH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCpB,CAAC;AAMF,MAAM,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Passkeys table
3
+ *
4
+ * Stores WebAuthn/FIDO2 passkey credentials for passwordless authentication.
5
+ * Each user can register multiple passkeys (e.g., fingerprint, security key, phone).
6
+ * Credential IDs and public keys are stored per the WebAuthn specification.
7
+ */
8
+ import { boolean, customType, index, integer, jsonb, pgTable, text, timestamp, uniqueIndex, } from 'drizzle-orm/pg-core';
9
+ import { users } from './users.js';
10
+ // =============================================================================
11
+ // Custom Types
12
+ // =============================================================================
13
+ const bytea = customType({
14
+ dataType() {
15
+ return 'bytea';
16
+ },
17
+ });
18
+ // =============================================================================
19
+ // Passkeys Table
20
+ // =============================================================================
21
+ export const passkeys = pgTable('passkeys', {
22
+ id: text('id').primaryKey(),
23
+ userId: text('user_id')
24
+ .notNull()
25
+ .references(() => users.id, { onDelete: 'cascade' }),
26
+ // WebAuthn credential ID (base64url-encoded by convention)
27
+ credentialId: text('credential_id').notNull(),
28
+ // COSE public key (binary)
29
+ publicKey: bytea('public_key').notNull(),
30
+ // Signature counter for clone detection
31
+ counter: integer('counter').notNull().default(0),
32
+ // Allowed transports (e.g., "usb", "ble", "nfc", "internal")
33
+ transports: jsonb('transports').$type(),
34
+ // Authenticator Attestation GUID (identifies authenticator model)
35
+ aaguid: text('aaguid'),
36
+ // User-assigned friendly name (e.g., "MacBook Pro Touch ID")
37
+ deviceName: text('device_name'),
38
+ // Whether the credential is backed up (e.g., iCloud Keychain, Google Password Manager)
39
+ backedUp: boolean('backed_up').default(false).notNull(),
40
+ // Timestamps
41
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
42
+ lastUsedAt: timestamp('last_used_at', { withTimezone: true }),
43
+ }, (table) => [
44
+ index('passkeys_user_id_idx').on(table.userId),
45
+ uniqueIndex('passkeys_credential_id_idx').on(table.credentialId),
46
+ ]);
47
+ //# sourceMappingURL=passkeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkeys.js","sourceRoot":"","sources":["../../src/schema/passkeys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,UAAU,EACV,KAAK,EACL,OAAO,EACP,KAAK,EACL,OAAO,EACP,IAAI,EACJ,SAAS,EACT,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,MAAM,KAAK,GAAG,UAAU,CAAmB;IACzC,QAAQ;QACN,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC,CAAC;AAEH,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAC7B,UAAU,EACV;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,2DAA2D;IAC3D,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;IAE7C,2BAA2B;IAC3B,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAExC,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhD,6DAA6D;IAC7D,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,EAAY;IAEjD,kEAAkE;IAClE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;IAEtB,6DAA6D;IAC7D,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;IAE/B,uFAAuF;IACvF,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAEvD,aAAa;IACb,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACjF,UAAU,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;CAC9D,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9C,WAAW,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;CACjE,CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"password-reset-tokens.d.ts","sourceRoot":"","sources":["../../src/schema/password-reset-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc9B,CAAA;AAMF,MAAM,MAAM,kBAAkB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAA;AACxE,MAAM,MAAM,qBAAqB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAA"}
1
+ {"version":3,"file":"password-reset-tokens.d.ts","sourceRoot":"","sources":["../../src/schema/password-reset-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqB/B,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC;AACzE,MAAM,MAAM,qBAAqB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC"}
@@ -6,7 +6,7 @@
6
6
  * Token values are stored as HMAC-SHA256 hashes with a per-token salt
7
7
  * for protection against rainbow table attacks on DB breach.
8
8
  */
9
- import { pgTable, text, timestamp } from 'drizzle-orm/pg-core';
9
+ import { index, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
10
10
  import { users } from './users.js';
11
11
  // =============================================================================
12
12
  // Password Reset Tokens Table
@@ -22,5 +22,8 @@ export const passwordResetTokens = pgTable('password_reset_tokens', {
22
22
  expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
23
23
  usedAt: timestamp('used_at', { withTimezone: true }),
24
24
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
25
- });
25
+ }, (table) => [
26
+ // R5-H6: Index for cleanup queries that scan by expiry
27
+ index('password_reset_tokens_expires_at_idx').on(table.expiresAt),
28
+ ]);
26
29
  //# sourceMappingURL=password-reset-tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"password-reset-tokens.js","sourceRoot":"","sources":["../../src/schema/password-reset-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,EAAE;IAClE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAChD,8EAA8E;IAC9E,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAEnD,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACpE,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACpD,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CAClF,CAAC,CAAA"}
1
+ {"version":3,"file":"password-reset-tokens.js","sourceRoot":"","sources":["../../src/schema/password-reset-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CACxC,uBAAuB,EACvB;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAChD,8EAA8E;IAC9E,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAEnD,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACpE,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACpD,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CAClF,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,uDAAuD;IACvD,KAAK,CAAC,sCAAsC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAClE,CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rag.d.ts","sourceRoot":"","sources":["../../src/schema/rag.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyBH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BvB,CAAA;AAMF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBpB,CAAA;AAMF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUxB,CAAA;AAMF,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,YAAY,CAAA;AAC1D,MAAM,MAAM,cAAc,GAAG,OAAO,YAAY,CAAC,YAAY,CAAA;AAC7D,MAAM,MAAM,QAAQ,GAAG,OAAO,SAAS,CAAC,YAAY,CAAA;AACpD,MAAM,MAAM,WAAW,GAAG,OAAO,SAAS,CAAC,YAAY,CAAA;AACvD,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAA;AAC5D,MAAM,MAAM,eAAe,GAAG,OAAO,aAAa,CAAC,YAAY,CAAA"}
1
+ {"version":3,"file":"rag.d.ts","sourceRoot":"","sources":["../../src/schema/rag.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyBH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BvB,CAAC;AAMH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BrB,CAAC;AAMF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUxB,CAAC;AAMH,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,YAAY,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,OAAO,YAAY,CAAC,YAAY,CAAC;AAC9D,MAAM,MAAM,QAAQ,GAAG,OAAO,SAAS,CAAC,YAAY,CAAC;AACrD,MAAM,MAAM,WAAW,GAAG,OAAO,SAAS,CAAC,YAAY,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC7D,MAAM,MAAM,eAAe,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC"}