@revealui/db 0.2.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 (191) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +137 -0
  3. package/dist/audit-store.d.ts +56 -0
  4. package/dist/audit-store.d.ts.map +1 -0
  5. package/dist/audit-store.js +120 -0
  6. package/dist/audit-store.js.map +1 -0
  7. package/dist/client/index.d.ts +214 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +396 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/types.d.ts +109 -0
  12. package/dist/client/types.d.ts.map +1 -0
  13. package/dist/client/types.js +10 -0
  14. package/dist/client/types.js.map +1 -0
  15. package/dist/crypto.d.ts +27 -0
  16. package/dist/crypto.d.ts.map +1 -0
  17. package/dist/crypto.js +68 -0
  18. package/dist/crypto.js.map +1 -0
  19. package/dist/index.d.ts +29 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +31 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/log-transport.d.ts +20 -0
  24. package/dist/log-transport.d.ts.map +1 -0
  25. package/dist/log-transport.js +49 -0
  26. package/dist/log-transport.js.map +1 -0
  27. package/dist/pool.d.ts +36 -0
  28. package/dist/pool.d.ts.map +1 -0
  29. package/dist/pool.js +218 -0
  30. package/dist/pool.js.map +1 -0
  31. package/dist/queries/boards.d.ts +138 -0
  32. package/dist/queries/boards.d.ts.map +1 -0
  33. package/dist/queries/boards.js +87 -0
  34. package/dist/queries/boards.js.map +1 -0
  35. package/dist/queries/code-provenance.d.ts +250 -0
  36. package/dist/queries/code-provenance.d.ts.map +1 -0
  37. package/dist/queries/code-provenance.js +130 -0
  38. package/dist/queries/code-provenance.js.map +1 -0
  39. package/dist/queries/optimized-queries.d.ts +89 -0
  40. package/dist/queries/optimized-queries.d.ts.map +1 -0
  41. package/dist/queries/optimized-queries.js +371 -0
  42. package/dist/queries/optimized-queries.js.map +1 -0
  43. package/dist/queries/ticket-comments.d.ts +37 -0
  44. package/dist/queries/ticket-comments.d.ts.map +1 -0
  45. package/dist/queries/ticket-comments.js +52 -0
  46. package/dist/queries/ticket-comments.js.map +1 -0
  47. package/dist/queries/ticket-labels.d.ts +69 -0
  48. package/dist/queries/ticket-labels.d.ts.map +1 -0
  49. package/dist/queries/ticket-labels.js +51 -0
  50. package/dist/queries/ticket-labels.js.map +1 -0
  51. package/dist/queries/tickets.d.ts +301 -0
  52. package/dist/queries/tickets.d.ts.map +1 -0
  53. package/dist/queries/tickets.js +89 -0
  54. package/dist/queries/tickets.js.map +1 -0
  55. package/dist/queries/todos.d.ts +37 -0
  56. package/dist/queries/todos.d.ts.map +1 -0
  57. package/dist/queries/todos.js +37 -0
  58. package/dist/queries/todos.js.map +1 -0
  59. package/dist/schema/agents.d.ts +1413 -0
  60. package/dist/schema/agents.d.ts.map +1 -0
  61. package/dist/schema/agents.js +207 -0
  62. package/dist/schema/agents.js.map +1 -0
  63. package/dist/schema/api-keys.d.ts +298 -0
  64. package/dist/schema/api-keys.d.ts.map +1 -0
  65. package/dist/schema/api-keys.js +53 -0
  66. package/dist/schema/api-keys.js.map +1 -0
  67. package/dist/schema/app-logs.d.ts +168 -0
  68. package/dist/schema/app-logs.d.ts.map +1 -0
  69. package/dist/schema/app-logs.js +25 -0
  70. package/dist/schema/app-logs.js.map +1 -0
  71. package/dist/schema/audit-log.d.ts +174 -0
  72. package/dist/schema/audit-log.d.ts.map +1 -0
  73. package/dist/schema/audit-log.js +37 -0
  74. package/dist/schema/audit-log.js.map +1 -0
  75. package/dist/schema/cms.d.ts +1015 -0
  76. package/dist/schema/cms.d.ts.map +1 -0
  77. package/dist/schema/cms.js +137 -0
  78. package/dist/schema/cms.js.map +1 -0
  79. package/dist/schema/code-provenance.d.ts +488 -0
  80. package/dist/schema/code-provenance.d.ts.map +1 -0
  81. package/dist/schema/code-provenance.js +72 -0
  82. package/dist/schema/code-provenance.js.map +1 -0
  83. package/dist/schema/collab-edits.d.ts +165 -0
  84. package/dist/schema/collab-edits.d.ts.map +1 -0
  85. package/dist/schema/collab-edits.js +21 -0
  86. package/dist/schema/collab-edits.js.map +1 -0
  87. package/dist/schema/crdt-operations.d.ts +153 -0
  88. package/dist/schema/crdt-operations.d.ts.map +1 -0
  89. package/dist/schema/crdt-operations.js +30 -0
  90. package/dist/schema/crdt-operations.js.map +1 -0
  91. package/dist/schema/error-events.d.ts +223 -0
  92. package/dist/schema/error-events.d.ts.map +1 -0
  93. package/dist/schema/error-events.js +44 -0
  94. package/dist/schema/error-events.js.map +1 -0
  95. package/dist/schema/index.d.ts +130 -0
  96. package/dist/schema/index.d.ts.map +1 -0
  97. package/dist/schema/index.js +310 -0
  98. package/dist/schema/index.js.map +1 -0
  99. package/dist/schema/licenses.d.ts +189 -0
  100. package/dist/schema/licenses.d.ts.map +1 -0
  101. package/dist/schema/licenses.js +39 -0
  102. package/dist/schema/licenses.js.map +1 -0
  103. package/dist/schema/node-ids.d.ts +122 -0
  104. package/dist/schema/node-ids.d.ts.map +1 -0
  105. package/dist/schema/node-ids.js +25 -0
  106. package/dist/schema/node-ids.js.map +1 -0
  107. package/dist/schema/pages.d.ts +488 -0
  108. package/dist/schema/pages.d.ts.map +1 -0
  109. package/dist/schema/pages.js +70 -0
  110. package/dist/schema/pages.js.map +1 -0
  111. package/dist/schema/password-reset-tokens.d.ts +137 -0
  112. package/dist/schema/password-reset-tokens.d.ts.map +1 -0
  113. package/dist/schema/password-reset-tokens.js +26 -0
  114. package/dist/schema/password-reset-tokens.js.map +1 -0
  115. package/dist/schema/query.d.ts +11 -0
  116. package/dist/schema/query.d.ts.map +1 -0
  117. package/dist/schema/query.js +11 -0
  118. package/dist/schema/query.js.map +1 -0
  119. package/dist/schema/rate-limits.d.ts +212 -0
  120. package/dist/schema/rate-limits.d.ts.map +1 -0
  121. package/dist/schema/rate-limits.js +38 -0
  122. package/dist/schema/rate-limits.js.map +1 -0
  123. package/dist/schema/rest.d.ts +31 -0
  124. package/dist/schema/rest.d.ts.map +1 -0
  125. package/dist/schema/rest.js +37 -0
  126. package/dist/schema/rest.js.map +1 -0
  127. package/dist/schema/sites.d.ts +365 -0
  128. package/dist/schema/sites.d.ts.map +1 -0
  129. package/dist/schema/sites.js +62 -0
  130. package/dist/schema/sites.js.map +1 -0
  131. package/dist/schema/tickets.d.ts +1118 -0
  132. package/dist/schema/tickets.d.ts.map +1 -0
  133. package/dist/schema/tickets.js +150 -0
  134. package/dist/schema/tickets.js.map +1 -0
  135. package/dist/schema/todos.d.ts +98 -0
  136. package/dist/schema/todos.d.ts.map +1 -0
  137. package/dist/schema/todos.js +12 -0
  138. package/dist/schema/todos.js.map +1 -0
  139. package/dist/schema/users.d.ts +503 -0
  140. package/dist/schema/users.d.ts.map +1 -0
  141. package/dist/schema/users.js +75 -0
  142. package/dist/schema/users.js.map +1 -0
  143. package/dist/schema/vector.d.ts +9 -0
  144. package/dist/schema/vector.d.ts.map +1 -0
  145. package/dist/schema/vector.js +9 -0
  146. package/dist/schema/vector.js.map +1 -0
  147. package/dist/schema/waitlist.d.ts +151 -0
  148. package/dist/schema/waitlist.d.ts.map +1 -0
  149. package/dist/schema/waitlist.js +17 -0
  150. package/dist/schema/waitlist.js.map +1 -0
  151. package/dist/schema/yjs-documents.d.ts +116 -0
  152. package/dist/schema/yjs-documents.d.ts.map +1 -0
  153. package/dist/schema/yjs-documents.js +15 -0
  154. package/dist/schema/yjs-documents.js.map +1 -0
  155. package/dist/types/database.d.ts +740 -0
  156. package/dist/types/database.d.ts.map +1 -0
  157. package/dist/types/database.js +151 -0
  158. package/dist/types/database.js.map +1 -0
  159. package/dist/types/discover.d.ts +83 -0
  160. package/dist/types/discover.d.ts.map +1 -0
  161. package/dist/types/discover.js +271 -0
  162. package/dist/types/discover.js.map +1 -0
  163. package/dist/types/extract-relationships.d.ts +115 -0
  164. package/dist/types/extract-relationships.d.ts.map +1 -0
  165. package/dist/types/extract-relationships.js +455 -0
  166. package/dist/types/extract-relationships.js.map +1 -0
  167. package/dist/types/generate-contracts.d.ts +19 -0
  168. package/dist/types/generate-contracts.d.ts.map +1 -0
  169. package/dist/types/generate-contracts.js +128 -0
  170. package/dist/types/generate-contracts.js.map +1 -0
  171. package/dist/types/generate-zod-schemas.d.ts +20 -0
  172. package/dist/types/generate-zod-schemas.d.ts.map +1 -0
  173. package/dist/types/generate-zod-schemas.js +128 -0
  174. package/dist/types/generate-zod-schemas.js.map +1 -0
  175. package/dist/types/generate.d.ts +17 -0
  176. package/dist/types/generate.d.ts.map +1 -0
  177. package/dist/types/generate.js +298 -0
  178. package/dist/types/generate.js.map +1 -0
  179. package/dist/types/index.d.ts +19 -0
  180. package/dist/types/index.d.ts.map +1 -0
  181. package/dist/types/index.js +19 -0
  182. package/dist/types/index.js.map +1 -0
  183. package/dist/types/introspect.d.ts +75 -0
  184. package/dist/types/introspect.d.ts.map +1 -0
  185. package/dist/types/introspect.js +187 -0
  186. package/dist/types/introspect.js.map +1 -0
  187. package/dist/types/stripe-schema.d.ts +893 -0
  188. package/dist/types/stripe-schema.d.ts.map +1 -0
  189. package/dist/types/stripe-schema.js +112 -0
  190. package/dist/types/stripe-schema.js.map +1 -0
  191. package/package.json +154 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/schema/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Agent tables - Derived from @revealui/contracts agents module
3
+ *
4
+ * These tables store AI agent context, memory, and conversations.
5
+ * The schema structure mirrors the Zod schemas in @revealui/contracts/agents.
6
+ *
7
+ * Note: Vector columns require pgvector extension to be enabled in PostgreSQL.
8
+ */
9
+ import { boolean, customType, integer, jsonb, pgTable, real, text, timestamp, } from 'drizzle-orm/pg-core';
10
+ import { sites } from './sites.js';
11
+ import { users } from './users.js';
12
+ // =============================================================================
13
+ // Custom Vector Type for pgvector
14
+ // =============================================================================
15
+ // Define vector type for embeddings (requires pgvector extension)
16
+ const vector = customType({
17
+ dataType(config) {
18
+ return `vector(${config?.dimensions ?? 1536})`;
19
+ },
20
+ toDriver(value) {
21
+ return `[${value.join(',')}]`;
22
+ },
23
+ fromDriver(value) {
24
+ // Parse PostgreSQL vector format: [1,2,3]
25
+ const parsed = JSON.parse(value.replace(/^\[/, '[').replace(/\]$/, ']'));
26
+ return parsed;
27
+ },
28
+ });
29
+ // =============================================================================
30
+ // Agent Contexts Table
31
+ // =============================================================================
32
+ export const agentContexts = pgTable('agent_contexts', {
33
+ // Primary identifier (format: sessionId:agentId)
34
+ id: text('id').primaryKey(),
35
+ // Schema versioning
36
+ version: integer('version').notNull().default(1),
37
+ // Relationships
38
+ sessionId: text('session_id').notNull(),
39
+ agentId: text('agent_id').notNull(),
40
+ // Context data (JSON blob for working memory, focus, etc.)
41
+ context: jsonb('context').default({}),
42
+ // Priority for context retrieval (0-1)
43
+ priority: real('priority').default(0.5),
44
+ // Optional embedding for semantic retrieval
45
+ embedding: vector('embedding', { dimensions: 1536 }),
46
+ // Timestamps
47
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
48
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
49
+ });
50
+ // =============================================================================
51
+ // Agent Memories Table (Long-term memory)
52
+ // =============================================================================
53
+ export const agentMemories = pgTable('agent_memories', {
54
+ // Primary identifier
55
+ id: text('id').primaryKey(),
56
+ // Schema versioning
57
+ version: integer('version').notNull().default(1),
58
+ // Memory content
59
+ content: text('content').notNull(),
60
+ // Memory type: fact, preference, decision, feedback, example, correction, skill, warning
61
+ type: text('type').notNull(),
62
+ // Source of this memory
63
+ source: jsonb('source').notNull(),
64
+ // Vector embedding for semantic search
65
+ embedding: vector('embedding', { dimensions: 1536 }),
66
+ // Full embedding metadata (model, dimension, generatedAt)
67
+ embeddingMetadata: jsonb('embedding_metadata'),
68
+ // Metadata (importance, tags, expiry, etc.)
69
+ metadata: jsonb('metadata').default({}),
70
+ // Access tracking
71
+ accessCount: integer('access_count').default(0),
72
+ accessedAt: timestamp('accessed_at', { withTimezone: true }),
73
+ // Verification status
74
+ verified: boolean('verified').default(false),
75
+ verifiedBy: text('verified_by').references(() => users.id, {
76
+ onDelete: 'set null',
77
+ }),
78
+ verifiedAt: timestamp('verified_at', { withTimezone: true }),
79
+ // Scope: which site/agent this memory applies to
80
+ siteId: text('site_id').references(() => sites.id, { onDelete: 'cascade' }),
81
+ agentId: text('agent_id'),
82
+ // Timestamps
83
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
84
+ expiresAt: timestamp('expires_at', { withTimezone: true }),
85
+ });
86
+ // =============================================================================
87
+ // Conversations Table
88
+ // =============================================================================
89
+ export const conversations = pgTable('conversations', {
90
+ // Primary identifier
91
+ id: text('id').primaryKey(),
92
+ // Relationships
93
+ userId: text('user_id')
94
+ .notNull()
95
+ .references(() => users.id, { onDelete: 'cascade' }),
96
+ agentId: text('agent_id').notNull(),
97
+ // Conversation details
98
+ title: text('title'),
99
+ status: text('status').notNull().default('active'),
100
+ // Multi-device sync fields
101
+ deviceId: text('device_id'),
102
+ lastSyncedAt: timestamp('last_synced_at', { withTimezone: true }),
103
+ // Schema versioning
104
+ version: integer('version').notNull().default(1),
105
+ // Timestamps
106
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
107
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
108
+ });
109
+ // =============================================================================
110
+ // Messages Table (separate from conversations for sync)
111
+ // =============================================================================
112
+ export const messages = pgTable('messages', {
113
+ // Primary identifier
114
+ id: text('id').primaryKey(),
115
+ // Relationships
116
+ conversationId: text('conversation_id')
117
+ .notNull()
118
+ .references(() => conversations.id, { onDelete: 'cascade' }),
119
+ // Message content
120
+ role: text('role').notNull(), // 'user', 'assistant', 'system'
121
+ content: text('content').notNull(),
122
+ // Timing
123
+ timestamp: timestamp('timestamp', { withTimezone: true }).defaultNow().notNull(),
124
+ });
125
+ // =============================================================================
126
+ // User Devices Table (for multi-device sync)
127
+ // =============================================================================
128
+ export const userDevices = pgTable('user_devices', {
129
+ // Primary identifier
130
+ id: text('id').primaryKey(),
131
+ // Relationships
132
+ userId: text('user_id')
133
+ .notNull()
134
+ .references(() => users.id, { onDelete: 'cascade' }),
135
+ deviceId: text('device_id').notNull().unique(),
136
+ // Device information
137
+ deviceName: text('device_name'),
138
+ deviceType: text('device_type'), // 'desktop', 'mobile', 'tablet'
139
+ userAgent: text('user_agent'),
140
+ // Sync status
141
+ lastSeen: timestamp('last_seen', { withTimezone: true }).defaultNow(),
142
+ isActive: boolean('is_active').default(true),
143
+ // Timestamps
144
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
145
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
146
+ });
147
+ // =============================================================================
148
+ // Sync Metadata Table (for tracking sync state)
149
+ // =============================================================================
150
+ export const syncMetadata = pgTable('sync_metadata', {
151
+ // Primary identifier
152
+ id: text('id').primaryKey(),
153
+ // Relationships
154
+ userId: text('user_id')
155
+ .notNull()
156
+ .references(() => users.id, { onDelete: 'cascade' }),
157
+ // Sync state
158
+ lastSyncTimestamp: timestamp('last_sync_timestamp', {
159
+ withTimezone: true,
160
+ }).defaultNow(),
161
+ syncVersion: integer('sync_version').default(1),
162
+ deviceCount: integer('device_count').default(1),
163
+ // Conflict tracking
164
+ conflictsResolved: integer('conflicts_resolved').default(0),
165
+ lastConflictAt: timestamp('last_conflict_at', { withTimezone: true }),
166
+ // Timestamps
167
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
168
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
169
+ });
170
+ // =============================================================================
171
+ // Agent Actions Table (Audit log of agent actions)
172
+ // =============================================================================
173
+ export const agentActions = pgTable('agent_actions', {
174
+ // Primary identifier
175
+ id: text('id').primaryKey(),
176
+ // Schema versioning
177
+ version: integer('version').notNull().default(1),
178
+ // Relationships
179
+ conversationId: text('conversation_id').references(() => conversations.id, {
180
+ onDelete: 'cascade',
181
+ }),
182
+ agentId: text('agent_id').notNull(),
183
+ // Action details
184
+ tool: text('tool').notNull(),
185
+ params: jsonb('params'),
186
+ result: jsonb('result'),
187
+ // Status: pending, running, completed, failed, cancelled
188
+ status: text('status').notNull().default('pending'),
189
+ error: text('error'),
190
+ // Timing
191
+ startedAt: timestamp('started_at', { withTimezone: true }).defaultNow().notNull(),
192
+ completedAt: timestamp('completed_at', { withTimezone: true }),
193
+ durationMs: integer('duration_ms'),
194
+ // Context for understanding the action
195
+ reasoning: text('reasoning'),
196
+ confidence: real('confidence'),
197
+ });
198
+ // =============================================================================
199
+ // Registered Agents Table (Persisted A2A agent definitions)
200
+ // =============================================================================
201
+ export const registeredAgents = pgTable('registered_agents', {
202
+ id: text('id').primaryKey(),
203
+ definition: jsonb('definition').$type().notNull(),
204
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
205
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
206
+ });
207
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/schema/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * API Key tables — Bring Your Own Key (BYOK) encrypted credential storage
3
+ *
4
+ * Server-side AES-256-GCM envelope encryption for background agent workflows.
5
+ * Keys are encrypted at rest with a KEK from REVEALUI_KEK env var.
6
+ * Only the last 4 characters are stored in plaintext (keyHint) for UI display.
7
+ */
8
+ export declare const userApiKeys: import("drizzle-orm/pg-core").PgTableWithColumns<{
9
+ name: "user_api_keys";
10
+ schema: undefined;
11
+ columns: {
12
+ id: import("drizzle-orm/pg-core").PgColumn<{
13
+ name: "id";
14
+ tableName: "user_api_keys";
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: "user_api_keys";
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
+ provider: import("drizzle-orm/pg-core").PgColumn<{
47
+ name: "provider";
48
+ tableName: "user_api_keys";
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
+ encryptedKey: import("drizzle-orm/pg-core").PgColumn<{
64
+ name: "encrypted_key";
65
+ tableName: "user_api_keys";
66
+ dataType: "string";
67
+ columnType: "PgText";
68
+ data: string;
69
+ driverParam: string;
70
+ notNull: true;
71
+ hasDefault: false;
72
+ isPrimaryKey: false;
73
+ isAutoincrement: false;
74
+ hasRuntimeDefault: false;
75
+ enumValues: [string, ...string[]];
76
+ baseColumn: never;
77
+ identity: undefined;
78
+ generated: undefined;
79
+ }, {}, {}>;
80
+ keyHint: import("drizzle-orm/pg-core").PgColumn<{
81
+ name: "key_hint";
82
+ tableName: "user_api_keys";
83
+ dataType: "string";
84
+ columnType: "PgText";
85
+ data: string;
86
+ driverParam: string;
87
+ notNull: false;
88
+ hasDefault: false;
89
+ isPrimaryKey: false;
90
+ isAutoincrement: false;
91
+ hasRuntimeDefault: false;
92
+ enumValues: [string, ...string[]];
93
+ baseColumn: never;
94
+ identity: undefined;
95
+ generated: undefined;
96
+ }, {}, {}>;
97
+ label: import("drizzle-orm/pg-core").PgColumn<{
98
+ name: "label";
99
+ tableName: "user_api_keys";
100
+ dataType: "string";
101
+ columnType: "PgText";
102
+ data: string;
103
+ driverParam: string;
104
+ notNull: false;
105
+ hasDefault: false;
106
+ isPrimaryKey: false;
107
+ isAutoincrement: false;
108
+ hasRuntimeDefault: false;
109
+ enumValues: [string, ...string[]];
110
+ baseColumn: never;
111
+ identity: undefined;
112
+ generated: undefined;
113
+ }, {}, {}>;
114
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
115
+ name: "created_at";
116
+ tableName: "user_api_keys";
117
+ dataType: "date";
118
+ columnType: "PgTimestamp";
119
+ data: Date;
120
+ driverParam: string;
121
+ notNull: true;
122
+ hasDefault: true;
123
+ isPrimaryKey: false;
124
+ isAutoincrement: false;
125
+ hasRuntimeDefault: false;
126
+ enumValues: undefined;
127
+ baseColumn: never;
128
+ identity: undefined;
129
+ generated: undefined;
130
+ }, {}, {}>;
131
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
132
+ name: "updated_at";
133
+ tableName: "user_api_keys";
134
+ dataType: "date";
135
+ columnType: "PgTimestamp";
136
+ data: Date;
137
+ driverParam: string;
138
+ notNull: true;
139
+ hasDefault: true;
140
+ isPrimaryKey: false;
141
+ isAutoincrement: false;
142
+ hasRuntimeDefault: false;
143
+ enumValues: undefined;
144
+ baseColumn: never;
145
+ identity: undefined;
146
+ generated: undefined;
147
+ }, {}, {}>;
148
+ lastUsedAt: import("drizzle-orm/pg-core").PgColumn<{
149
+ name: "last_used_at";
150
+ tableName: "user_api_keys";
151
+ dataType: "date";
152
+ columnType: "PgTimestamp";
153
+ data: Date;
154
+ driverParam: string;
155
+ notNull: false;
156
+ hasDefault: false;
157
+ isPrimaryKey: false;
158
+ isAutoincrement: false;
159
+ hasRuntimeDefault: false;
160
+ enumValues: undefined;
161
+ baseColumn: never;
162
+ identity: undefined;
163
+ generated: undefined;
164
+ }, {}, {}>;
165
+ };
166
+ dialect: "pg";
167
+ }>;
168
+ export type UserApiKey = typeof userApiKeys.$inferSelect;
169
+ export type NewUserApiKey = typeof userApiKeys.$inferInsert;
170
+ export declare const tenantProviderConfigs: import("drizzle-orm/pg-core").PgTableWithColumns<{
171
+ name: "tenant_provider_configs";
172
+ schema: undefined;
173
+ columns: {
174
+ id: import("drizzle-orm/pg-core").PgColumn<{
175
+ name: "id";
176
+ tableName: "tenant_provider_configs";
177
+ dataType: "string";
178
+ columnType: "PgText";
179
+ data: string;
180
+ driverParam: string;
181
+ notNull: true;
182
+ hasDefault: false;
183
+ isPrimaryKey: true;
184
+ isAutoincrement: false;
185
+ hasRuntimeDefault: false;
186
+ enumValues: [string, ...string[]];
187
+ baseColumn: never;
188
+ identity: undefined;
189
+ generated: undefined;
190
+ }, {}, {}>;
191
+ userId: import("drizzle-orm/pg-core").PgColumn<{
192
+ name: "user_id";
193
+ tableName: "tenant_provider_configs";
194
+ dataType: "string";
195
+ columnType: "PgText";
196
+ data: string;
197
+ driverParam: string;
198
+ notNull: true;
199
+ hasDefault: false;
200
+ isPrimaryKey: false;
201
+ isAutoincrement: false;
202
+ hasRuntimeDefault: false;
203
+ enumValues: [string, ...string[]];
204
+ baseColumn: never;
205
+ identity: undefined;
206
+ generated: undefined;
207
+ }, {}, {}>;
208
+ provider: import("drizzle-orm/pg-core").PgColumn<{
209
+ name: "provider";
210
+ tableName: "tenant_provider_configs";
211
+ dataType: "string";
212
+ columnType: "PgText";
213
+ data: string;
214
+ driverParam: string;
215
+ notNull: true;
216
+ hasDefault: false;
217
+ isPrimaryKey: false;
218
+ isAutoincrement: false;
219
+ hasRuntimeDefault: false;
220
+ enumValues: [string, ...string[]];
221
+ baseColumn: never;
222
+ identity: undefined;
223
+ generated: undefined;
224
+ }, {}, {}>;
225
+ isDefault: import("drizzle-orm/pg-core").PgColumn<{
226
+ name: "is_default";
227
+ tableName: "tenant_provider_configs";
228
+ dataType: "boolean";
229
+ columnType: "PgBoolean";
230
+ data: boolean;
231
+ driverParam: boolean;
232
+ notNull: true;
233
+ hasDefault: true;
234
+ isPrimaryKey: false;
235
+ isAutoincrement: false;
236
+ hasRuntimeDefault: false;
237
+ enumValues: undefined;
238
+ baseColumn: never;
239
+ identity: undefined;
240
+ generated: undefined;
241
+ }, {}, {}>;
242
+ model: import("drizzle-orm/pg-core").PgColumn<{
243
+ name: "model";
244
+ tableName: "tenant_provider_configs";
245
+ dataType: "string";
246
+ columnType: "PgText";
247
+ data: string;
248
+ driverParam: string;
249
+ notNull: false;
250
+ hasDefault: false;
251
+ isPrimaryKey: false;
252
+ isAutoincrement: false;
253
+ hasRuntimeDefault: false;
254
+ enumValues: [string, ...string[]];
255
+ baseColumn: never;
256
+ identity: undefined;
257
+ generated: undefined;
258
+ }, {}, {}>;
259
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
260
+ name: "created_at";
261
+ tableName: "tenant_provider_configs";
262
+ dataType: "date";
263
+ columnType: "PgTimestamp";
264
+ data: Date;
265
+ driverParam: string;
266
+ notNull: true;
267
+ hasDefault: true;
268
+ isPrimaryKey: false;
269
+ isAutoincrement: false;
270
+ hasRuntimeDefault: false;
271
+ enumValues: undefined;
272
+ baseColumn: never;
273
+ identity: undefined;
274
+ generated: undefined;
275
+ }, {}, {}>;
276
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
277
+ name: "updated_at";
278
+ tableName: "tenant_provider_configs";
279
+ dataType: "date";
280
+ columnType: "PgTimestamp";
281
+ data: Date;
282
+ driverParam: string;
283
+ notNull: true;
284
+ hasDefault: true;
285
+ isPrimaryKey: false;
286
+ isAutoincrement: false;
287
+ hasRuntimeDefault: false;
288
+ enumValues: undefined;
289
+ baseColumn: never;
290
+ identity: undefined;
291
+ generated: undefined;
292
+ }, {}, {}>;
293
+ };
294
+ dialect: "pg";
295
+ }>;
296
+ export type TenantProviderConfig = typeof tenantProviderConfigs.$inferSelect;
297
+ export type NewTenantProviderConfig = typeof tenantProviderConfigs.$inferInsert;
298
+ //# sourceMappingURL=api-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../src/schema/api-keys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BvB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,WAAW,CAAC,YAAY,CAAA;AACxD,MAAM,MAAM,aAAa,GAAG,OAAO,WAAW,CAAC,YAAY,CAAA;AAM3D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBjC,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,qBAAqB,CAAC,YAAY,CAAA;AAC5E,MAAM,MAAM,uBAAuB,GAAG,OAAO,qBAAqB,CAAC,YAAY,CAAA"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * API Key tables — Bring Your Own Key (BYOK) encrypted credential storage
3
+ *
4
+ * Server-side AES-256-GCM envelope encryption for background agent workflows.
5
+ * Keys are encrypted at rest with a KEK from REVEALUI_KEK env var.
6
+ * Only the last 4 characters are stored in plaintext (keyHint) for UI display.
7
+ */
8
+ import { boolean, index, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
9
+ import { users } from './users.js';
10
+ // =============================================================================
11
+ // User API Keys Table
12
+ // =============================================================================
13
+ export const userApiKeys = pgTable('user_api_keys', {
14
+ id: text('id').primaryKey(),
15
+ // Owner
16
+ userId: text('user_id')
17
+ .notNull()
18
+ .references(() => users.id, { onDelete: 'cascade' }),
19
+ // Which LLM provider this key belongs to
20
+ provider: text('provider').notNull(), // 'openai' | 'anthropic' | 'groq' | 'ollama' | 'huggingface' | 'vultr'
21
+ // AES-256-GCM envelope-encrypted API key
22
+ // Format: <base64(iv)>.<base64(authTag)>.<base64(ciphertext)>
23
+ encryptedKey: text('encrypted_key').notNull(),
24
+ // Last 4 characters of the plaintext key shown in the UI (e.g. "...ab12")
25
+ keyHint: text('key_hint'),
26
+ // User-visible label (e.g. "My Anthropic key")
27
+ label: text('label'),
28
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
29
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
30
+ lastUsedAt: timestamp('last_used_at', { withTimezone: true }),
31
+ }, (table) => [
32
+ index('user_api_keys_user_id_idx').on(table.userId),
33
+ index('user_api_keys_user_provider_idx').on(table.userId, table.provider),
34
+ ]);
35
+ // =============================================================================
36
+ // Tenant Provider Configs Table
37
+ // =============================================================================
38
+ export const tenantProviderConfigs = pgTable('tenant_provider_configs', {
39
+ id: text('id').primaryKey(),
40
+ // Owner
41
+ userId: text('user_id')
42
+ .notNull()
43
+ .references(() => users.id, { onDelete: 'cascade' }),
44
+ // Which LLM provider this config applies to
45
+ provider: text('provider').notNull(),
46
+ // Whether this is the default provider for this user's agents
47
+ isDefault: boolean('is_default').notNull().default(false),
48
+ // Preferred model override (e.g. "claude-sonnet-4-6", "gpt-4o")
49
+ model: text('model'),
50
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
51
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
52
+ }, (table) => [index('tenant_provider_configs_user_id_idx').on(table.userId)]);
53
+ //# sourceMappingURL=api-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/schema/api-keys.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAChC,eAAe,EACf;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,yCAAyC;IACzC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,uEAAuE;IAE7G,yCAAyC;IACzC,8DAA8D;IAC9D,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;IAE7C,0EAA0E;IAC1E,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC;IAEzB,+CAA+C;IAC/C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;IAEpB,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;IACjF,UAAU,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;CAC9D,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IACnD,KAAK,CAAC,iCAAiC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;CAC1E,CACF,CAAA;AAKD,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAEhF,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAC1C,yBAAyB,EACzB;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,4CAA4C;IAC5C,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IAEpC,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAEzD,gEAAgE;IAChE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;IAEpB,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,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAC3E,CAAA"}