@selvajs/supabase-provider 0.14.3 → 0.14.4-beta.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.
Files changed (160) hide show
  1. package/LICENSE +1 -1
  2. package/dist/auth/SupabaseAuthProvider.d.ts +57 -0
  3. package/dist/auth/SupabaseAuthProvider.d.ts.map +1 -1
  4. package/dist/auth/SupabaseAuthProvider.js +123 -18
  5. package/dist/auth/SupabaseAuthProvider.js.map +1 -1
  6. package/dist/data/SupabaseComputeServerStore.d.ts +34 -2
  7. package/dist/data/SupabaseComputeServerStore.d.ts.map +1 -1
  8. package/dist/data/SupabaseComputeServerStore.js +146 -39
  9. package/dist/data/SupabaseComputeServerStore.js.map +1 -1
  10. package/dist/data/SupabaseDataProvider.d.ts +18 -3
  11. package/dist/data/SupabaseDataProvider.d.ts.map +1 -1
  12. package/dist/data/SupabaseDataProvider.js +83 -18
  13. package/dist/data/SupabaseDataProvider.js.map +1 -1
  14. package/dist/data/SupabaseDefinitionStore.d.ts +3 -1
  15. package/dist/data/SupabaseDefinitionStore.d.ts.map +1 -1
  16. package/dist/data/SupabaseDefinitionStore.js +94 -67
  17. package/dist/data/SupabaseDefinitionStore.js.map +1 -1
  18. package/dist/data/SupabaseInviteStore.d.ts.map +1 -1
  19. package/dist/data/SupabaseInviteStore.js +11 -22
  20. package/dist/data/SupabaseInviteStore.js.map +1 -1
  21. package/dist/data/SupabaseOrgStore.d.ts.map +1 -1
  22. package/dist/data/SupabaseOrgStore.js +49 -86
  23. package/dist/data/SupabaseOrgStore.js.map +1 -1
  24. package/dist/data/SupabaseProjectStore.d.ts.map +1 -1
  25. package/dist/data/SupabaseProjectStore.js +51 -70
  26. package/dist/data/SupabaseProjectStore.js.map +1 -1
  27. package/dist/data/SupabaseShareLinkStore.d.ts.map +1 -1
  28. package/dist/data/SupabaseShareLinkStore.js +13 -27
  29. package/dist/data/SupabaseShareLinkStore.js.map +1 -1
  30. package/dist/data/client.d.ts +35 -3
  31. package/dist/data/client.d.ts.map +1 -1
  32. package/dist/data/client.js +67 -16
  33. package/dist/data/client.js.map +1 -1
  34. package/dist/data/errors.d.ts +2 -0
  35. package/dist/data/errors.d.ts.map +1 -0
  36. package/dist/data/errors.js +23 -0
  37. package/dist/data/errors.js.map +1 -0
  38. package/dist/data/index.d.ts +8 -2
  39. package/dist/data/index.d.ts.map +1 -1
  40. package/dist/data/index.js +6 -1
  41. package/dist/data/index.js.map +1 -1
  42. package/dist/data/migrationHead.d.ts +14 -0
  43. package/dist/data/migrationHead.d.ts.map +1 -0
  44. package/dist/data/migrationHead.js +14 -0
  45. package/dist/data/migrationHead.js.map +1 -0
  46. package/dist/data/query.d.ts +20 -0
  47. package/dist/data/query.d.ts.map +1 -0
  48. package/dist/data/query.js +13 -0
  49. package/dist/data/query.js.map +1 -0
  50. package/dist/data/rowStamp.d.ts +38 -0
  51. package/dist/data/rowStamp.d.ts.map +1 -0
  52. package/dist/data/rowStamp.js +43 -0
  53. package/dist/data/rowStamp.js.map +1 -0
  54. package/dist/index.d.ts +2 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/permissions/SupabasePlatformPermissionStore.d.ts +5 -3
  59. package/dist/permissions/SupabasePlatformPermissionStore.d.ts.map +1 -1
  60. package/dist/permissions/SupabasePlatformPermissionStore.js +17 -30
  61. package/dist/permissions/SupabasePlatformPermissionStore.js.map +1 -1
  62. package/dist/storage/SupabaseStorageProvider.d.ts.map +1 -1
  63. package/dist/storage/SupabaseStorageProvider.js +3 -0
  64. package/dist/storage/SupabaseStorageProvider.js.map +1 -1
  65. package/package.json +13 -14
  66. package/supabase/.branches/_current_branch +1 -0
  67. package/supabase/.temp/cli-latest +1 -0
  68. package/supabase/migrations/20260711120000_selva_definition_schema_version.sql +18 -0
  69. package/supabase/migrations/20260712120000_user_profiles_disabled_and_gin.sql +95 -0
  70. package/supabase/migrations/20260712123000_selva_migration_head_fn.sql +38 -0
  71. package/supabase/migrations/20260713120000_selva_next_version_number.sql +59 -0
  72. package/supabase/migrations/20260713140000_selva_solve_cache_limit.sql +15 -0
  73. package/dist/auth/__tests__/conformance.test.d.ts +0 -2
  74. package/dist/auth/__tests__/conformance.test.d.ts.map +0 -1
  75. package/dist/auth/__tests__/conformance.test.js +0 -76
  76. package/dist/auth/__tests__/conformance.test.js.map +0 -1
  77. package/dist/data/__tests__/compute-server-conformance.test.d.ts +0 -2
  78. package/dist/data/__tests__/compute-server-conformance.test.d.ts.map +0 -1
  79. package/dist/data/__tests__/compute-server-conformance.test.js +0 -40
  80. package/dist/data/__tests__/compute-server-conformance.test.js.map +0 -1
  81. package/dist/data/__tests__/definition-conformance.test.d.ts +0 -2
  82. package/dist/data/__tests__/definition-conformance.test.d.ts.map +0 -1
  83. package/dist/data/__tests__/definition-conformance.test.js +0 -85
  84. package/dist/data/__tests__/definition-conformance.test.js.map +0 -1
  85. package/dist/data/__tests__/event-sink-conformance.test.d.ts +0 -2
  86. package/dist/data/__tests__/event-sink-conformance.test.d.ts.map +0 -1
  87. package/dist/data/__tests__/event-sink-conformance.test.js +0 -27
  88. package/dist/data/__tests__/event-sink-conformance.test.js.map +0 -1
  89. package/dist/data/__tests__/invite-conformance.test.d.ts +0 -2
  90. package/dist/data/__tests__/invite-conformance.test.d.ts.map +0 -1
  91. package/dist/data/__tests__/invite-conformance.test.js +0 -45
  92. package/dist/data/__tests__/invite-conformance.test.js.map +0 -1
  93. package/dist/data/__tests__/org-conformance.test.d.ts +0 -2
  94. package/dist/data/__tests__/org-conformance.test.d.ts.map +0 -1
  95. package/dist/data/__tests__/org-conformance.test.js +0 -29
  96. package/dist/data/__tests__/org-conformance.test.js.map +0 -1
  97. package/dist/data/__tests__/project-conformance.test.d.ts +0 -2
  98. package/dist/data/__tests__/project-conformance.test.d.ts.map +0 -1
  99. package/dist/data/__tests__/project-conformance.test.js +0 -57
  100. package/dist/data/__tests__/project-conformance.test.js.map +0 -1
  101. package/dist/data/__tests__/share-link-conformance.test.d.ts +0 -2
  102. package/dist/data/__tests__/share-link-conformance.test.d.ts.map +0 -1
  103. package/dist/data/__tests__/share-link-conformance.test.js +0 -88
  104. package/dist/data/__tests__/share-link-conformance.test.js.map +0 -1
  105. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts +0 -2
  106. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts.map +0 -1
  107. package/dist/data/__tests__/solve-metric-sink-conformance.test.js +0 -52
  108. package/dist/data/__tests__/solve-metric-sink-conformance.test.js.map +0 -1
  109. package/dist/data/__tests__/test-helpers.d.ts +0 -52
  110. package/dist/data/__tests__/test-helpers.d.ts.map +0 -1
  111. package/dist/data/__tests__/test-helpers.js +0 -177
  112. package/dist/data/__tests__/test-helpers.js.map +0 -1
  113. package/dist/permissions/__tests__/conformance.test.d.ts +0 -2
  114. package/dist/permissions/__tests__/conformance.test.d.ts.map +0 -1
  115. package/dist/permissions/__tests__/conformance.test.js +0 -27
  116. package/dist/permissions/__tests__/conformance.test.js.map +0 -1
  117. package/dist/storage/__tests__/conformance.test.d.ts +0 -2
  118. package/dist/storage/__tests__/conformance.test.d.ts.map +0 -1
  119. package/dist/storage/__tests__/conformance.test.js +0 -149
  120. package/dist/storage/__tests__/conformance.test.js.map +0 -1
  121. package/dist/userProfile/__tests__/conformance.test.d.ts +0 -2
  122. package/dist/userProfile/__tests__/conformance.test.d.ts.map +0 -1
  123. package/dist/userProfile/__tests__/conformance.test.js +0 -38
  124. package/dist/userProfile/__tests__/conformance.test.js.map +0 -1
  125. package/src/auth/SupabaseAuthProvider.ts +0 -464
  126. package/src/auth/__tests__/conformance.test.ts +0 -78
  127. package/src/auth/index.ts +0 -2
  128. package/src/cli/sync-migrations.ts +0 -133
  129. package/src/data/SupabaseAuditQuery.ts +0 -103
  130. package/src/data/SupabaseComputeServerStore.ts +0 -262
  131. package/src/data/SupabaseDataProvider.ts +0 -133
  132. package/src/data/SupabaseDefinitionStore.ts +0 -520
  133. package/src/data/SupabaseEventSink.ts +0 -30
  134. package/src/data/SupabaseInviteStore.ts +0 -183
  135. package/src/data/SupabaseOrgStore.ts +0 -552
  136. package/src/data/SupabaseProjectStore.ts +0 -454
  137. package/src/data/SupabaseShareLinkStore.ts +0 -191
  138. package/src/data/SupabaseSolveMetricSink.ts +0 -38
  139. package/src/data/__tests__/compute-server-conformance.test.ts +0 -40
  140. package/src/data/__tests__/definition-conformance.test.ts +0 -89
  141. package/src/data/__tests__/event-sink-conformance.test.ts +0 -32
  142. package/src/data/__tests__/invite-conformance.test.ts +0 -46
  143. package/src/data/__tests__/org-conformance.test.ts +0 -30
  144. package/src/data/__tests__/project-conformance.test.ts +0 -57
  145. package/src/data/__tests__/share-link-conformance.test.ts +0 -87
  146. package/src/data/__tests__/solve-metric-sink-conformance.test.ts +0 -59
  147. package/src/data/__tests__/test-helpers.ts +0 -188
  148. package/src/data/client.ts +0 -98
  149. package/src/data/index.ts +0 -12
  150. package/src/data/pagination.ts +0 -68
  151. package/src/index.ts +0 -24
  152. package/src/permissions/SupabasePlatformPermissionStore.ts +0 -161
  153. package/src/permissions/__tests__/conformance.test.ts +0 -28
  154. package/src/permissions/index.ts +0 -1
  155. package/src/storage/SupabaseStorageProvider.ts +0 -182
  156. package/src/storage/__tests__/conformance.test.ts +0 -152
  157. package/src/storage/index.ts +0 -2
  158. package/src/userProfile/SupabaseUserProfileProvider.ts +0 -177
  159. package/src/userProfile/__tests__/conformance.test.ts +0 -39
  160. package/src/userProfile/index.ts +0 -1
@@ -1,5 +1,14 @@
1
1
  import { isOrgServer, isPlatformServer } from '@selvajs/platform';
2
- import { ProviderError } from '@selvajs/platform';
2
+ // Secret crypto functions come from the server-only subpath (they use
3
+ // `node:crypto`, kept out of the root barrel so client bundles don't pull it in).
4
+ import { decryptSecret, encryptSecret, isEncryptedSecret } from '@selvajs/platform/computeServer';
5
+ import { mapPostgrestError } from './errors.js';
6
+ /** Explicit column list for `compute_servers` — every field `rowToServer` consumes. */
7
+ const SERVER_COLUMNS = 'id, scope, owner_org_id, shared_with_all, label, server_url, api_key, timeout_ms, retry_count';
8
+ /** Columns from the share join table read in `getConfig`. */
9
+ const SHARE_COLUMNS = 'server_id, org_id';
10
+ /** Columns from the per-org default table read in `getConfig`. */
11
+ const ORG_DEFAULT_COLUMNS = 'org_id, default_server_id';
3
12
  /**
4
13
  * Compute-server config backed by three tables:
5
14
  * - `compute_servers`: one row per server. `scope = 'platform' | 'org'`.
@@ -16,15 +25,25 @@ import { ProviderError } from '@selvajs/platform';
16
25
  */
17
26
  export class SupabaseComputeServerStore {
18
27
  clients;
19
- constructor(clients) {
28
+ secretKey;
29
+ /**
30
+ * `secretKey` (from `SELVA_AT_REST_KEY`) encrypts `api_key` before it is
31
+ * written to `compute_servers.api_key` and decrypts it on read, so the
32
+ * Rhino.Compute credential never sits in the DB as plaintext — matching the
33
+ * local provider's on-disk envelope. Optional only for legacy construction
34
+ * paths (tests that never touch apiKeys); a store built without a key throws
35
+ * if asked to write or read a secret. Wire it via `SupabaseDataProvider`.
36
+ */
37
+ constructor(clients, secretKey) {
20
38
  this.clients = clients;
39
+ this.secretKey = secretKey;
21
40
  }
22
41
  async getConfig(ctx) {
23
42
  const client = this.clients.forRequest(ctx);
24
43
  const [serversRes, sharesRes, orgDefRes, platDefRes] = await Promise.all([
25
- client.from('compute_servers').select('*'),
26
- client.from('compute_server_shares').select('*'),
27
- client.from('compute_server_org_defaults').select('*'),
44
+ client.from('compute_servers').select(SERVER_COLUMNS),
45
+ client.from('compute_server_shares').select(SHARE_COLUMNS),
46
+ client.from('compute_server_org_defaults').select(ORG_DEFAULT_COLUMNS),
28
47
  client
29
48
  .from('compute_server_platform_default')
30
49
  .select('default_server_id')
@@ -32,13 +51,13 @@ export class SupabaseComputeServerStore {
32
51
  .maybeSingle()
33
52
  ]);
34
53
  if (serversRes.error)
35
- throw mapError(serversRes.error);
54
+ throw mapPostgrestError(serversRes.error);
36
55
  if (sharesRes.error)
37
- throw mapError(sharesRes.error);
56
+ throw mapPostgrestError(sharesRes.error);
38
57
  if (orgDefRes.error)
39
- throw mapError(orgDefRes.error);
58
+ throw mapPostgrestError(orgDefRes.error);
40
59
  if (platDefRes.error)
41
- throw mapError(platDefRes.error);
60
+ throw mapPostgrestError(platDefRes.error);
42
61
  // Build per-server `sharedWith` allowlists from the join table.
43
62
  const sharedByServer = new Map();
44
63
  for (const row of sharesRes.data ?? []) {
@@ -46,7 +65,7 @@ export class SupabaseComputeServerStore {
46
65
  list.push(row.org_id);
47
66
  sharedByServer.set(row.server_id, list);
48
67
  }
49
- const servers = (serversRes.data ?? []).map((row) => rowToServer(row, sharedByServer));
68
+ const servers = (serversRes.data ?? []).map((row) => rowToServer(this.decryptRowApiKey(row), sharedByServer));
50
69
  const orgDefaults = {};
51
70
  for (const row of orgDefRes.data ?? []) {
52
71
  if (row.default_server_id)
@@ -64,13 +83,13 @@ export class SupabaseComputeServerStore {
64
83
  // Replace-all of platform rows.
65
84
  const { error: delErr } = await client.from('compute_servers').delete().eq('scope', 'platform');
66
85
  if (delErr)
67
- throw mapError(delErr);
86
+ throw mapPostgrestError(delErr);
68
87
  if (platformOnly.length > 0) {
69
88
  const { error: insErr } = await client
70
89
  .from('compute_servers')
71
- .insert(platformOnly.map(serverToRow));
90
+ .insert(platformOnly.map((s) => serverToRow(this.encryptServerApiKey(s))));
72
91
  if (insErr)
73
- throw mapError(insErr);
92
+ throw mapPostgrestError(insErr);
74
93
  // Rebuild the share rows for any non-`all` platform servers.
75
94
  const shareRows = platformOnly.flatMap((s) => s.sharedWith === 'all'
76
95
  ? []
@@ -78,7 +97,7 @@ export class SupabaseComputeServerStore {
78
97
  if (shareRows.length > 0) {
79
98
  const { error: shErr } = await client.from('compute_server_shares').insert(shareRows);
80
99
  if (shErr)
81
- throw mapError(shErr);
100
+ throw mapPostgrestError(shErr);
82
101
  }
83
102
  }
84
103
  const { error: defErr } = await client
@@ -86,7 +105,7 @@ export class SupabaseComputeServerStore {
86
105
  .update({ default_server_id: defaultServerId ?? null })
87
106
  .eq('singleton', true);
88
107
  if (defErr)
89
- throw mapError(defErr);
108
+ throw mapPostgrestError(defErr);
90
109
  }
91
110
  async saveOrgServers(ctx, orgId, servers, defaultServerId) {
92
111
  const client = this.clients.forRequest(ctx);
@@ -97,13 +116,13 @@ export class SupabaseComputeServerStore {
97
116
  .eq('scope', 'org')
98
117
  .eq('owner_org_id', orgId);
99
118
  if (delErr)
100
- throw mapError(delErr);
119
+ throw mapPostgrestError(delErr);
101
120
  if (orgOnly.length > 0) {
102
121
  const { error: insErr } = await client
103
122
  .from('compute_servers')
104
- .insert(orgOnly.map(serverToRow));
123
+ .insert(orgOnly.map((s) => serverToRow(this.encryptServerApiKey(s))));
105
124
  if (insErr)
106
- throw mapError(insErr);
125
+ throw mapPostgrestError(insErr);
107
126
  }
108
127
  if (defaultServerId === null) {
109
128
  const { error } = await client
@@ -111,14 +130,14 @@ export class SupabaseComputeServerStore {
111
130
  .delete()
112
131
  .eq('org_id', orgId);
113
132
  if (error)
114
- throw mapError(error);
133
+ throw mapPostgrestError(error);
115
134
  }
116
135
  else if (typeof defaultServerId === 'string') {
117
136
  const { error } = await client
118
137
  .from('compute_server_org_defaults')
119
138
  .upsert({ org_id: orgId, default_server_id: defaultServerId });
120
139
  if (error)
121
- throw mapError(error);
140
+ throw mapPostgrestError(error);
122
141
  }
123
142
  }
124
143
  async setOrgDefault(ctx, orgId, serverId) {
@@ -129,14 +148,14 @@ export class SupabaseComputeServerStore {
129
148
  .delete()
130
149
  .eq('org_id', orgId);
131
150
  if (error)
132
- throw mapError(error);
151
+ throw mapPostgrestError(error);
133
152
  return;
134
153
  }
135
154
  const { error } = await client
136
155
  .from('compute_server_org_defaults')
137
156
  .upsert({ org_id: orgId, default_server_id: serverId });
138
157
  if (error)
139
- throw mapError(error);
158
+ throw mapPostgrestError(error);
140
159
  }
141
160
  async deleteByOrg(ctx, orgId) {
142
161
  const client = this.clients.forRequest(ctx);
@@ -147,7 +166,7 @@ export class SupabaseComputeServerStore {
147
166
  .delete()
148
167
  .eq('org_id', orgId);
149
168
  if (defErr)
150
- throw mapError(defErr);
169
+ throw mapPostgrestError(defErr);
151
170
  // Org-private servers owned by this org.
152
171
  const { error: srvErr } = await client
153
172
  .from('compute_servers')
@@ -155,14 +174,116 @@ export class SupabaseComputeServerStore {
155
174
  .eq('scope', 'org')
156
175
  .eq('owner_org_id', orgId);
157
176
  if (srvErr)
158
- throw mapError(srvErr);
177
+ throw mapPostgrestError(srvErr);
159
178
  // Strip this org from any platform server share allowlist.
160
179
  const { error: shErr } = await client
161
180
  .from('compute_server_shares')
162
181
  .delete()
163
182
  .eq('org_id', orgId);
164
183
  if (shErr)
165
- throw mapError(shErr);
184
+ throw mapPostgrestError(shErr);
185
+ }
186
+ // ==========================================================================
187
+ // At-rest secret handling
188
+ // ==========================================================================
189
+ /**
190
+ * Encrypt a server's `apiKey` before it is written to the DB. Idempotent —
191
+ * an already-enveloped value is passed through, so a round-trip (read →
192
+ * save) never double-encrypts. Throws if the store was built without a key
193
+ * but a real secret needs writing, so we never silently persist plaintext.
194
+ */
195
+ encryptServerApiKey(s) {
196
+ if (!s.apiKey)
197
+ return s;
198
+ if (isEncryptedSecret(s.apiKey))
199
+ return s;
200
+ if (!this.secretKey) {
201
+ throw new Error('Cannot store a compute-server apiKey: SELVA_AT_REST_KEY is not configured. ' +
202
+ 'Set it so secrets are encrypted at rest.');
203
+ }
204
+ return { ...s, apiKey: encryptSecret(s.apiKey, this.secretKey) };
205
+ }
206
+ /**
207
+ * Decrypt a row's `api_key` on read. Tolerant, mirroring the local provider:
208
+ * a row whose ciphertext can't be authenticated under the current key is
209
+ * returned with `api_key: null` and a warning logged, so the page keeps
210
+ * rendering (solves against that server fail later at Rhino.Compute). A
211
+ * plaintext value that predates encryption is passed through unchanged and
212
+ * surfaced by `verifySecrets()` — never silently dropped.
213
+ */
214
+ decryptRowApiKey(row) {
215
+ if (!row.api_key)
216
+ return row;
217
+ if (!isEncryptedSecret(row.api_key)) {
218
+ // Legacy/hand-inserted plaintext. Pass through so an existing key
219
+ // keeps working; verifySecrets() flags it for re-save via /admin/compute.
220
+ console.warn(`[selva] compute_servers row "${row.label}" (${row.id}) has a plaintext api_key. ` +
221
+ 'Re-save it via /admin/compute so it is stored encrypted.');
222
+ return row;
223
+ }
224
+ if (!this.secretKey) {
225
+ console.warn(`[selva] Cannot decrypt api_key for compute server "${row.label}" (${row.id}): ` +
226
+ 'SELVA_AT_REST_KEY is not configured. Returning without a key; solves will fail.');
227
+ return { ...row, api_key: null };
228
+ }
229
+ try {
230
+ return { ...row, api_key: decryptSecret(row.api_key, this.secretKey) };
231
+ }
232
+ catch (cause) {
233
+ console.warn(`[selva] Could not decrypt api_key for compute server "${row.label}" (${row.id}). ` +
234
+ 'The stored ciphertext does not match the current SELVA_AT_REST_KEY. ' +
235
+ 'This server will be returned without an apiKey; solves against it will fail. ' +
236
+ 'Re-enter the key via /admin/compute, or restore the original SELVA_AT_REST_KEY.', cause);
237
+ return { ...row, api_key: null };
238
+ }
239
+ }
240
+ /**
241
+ * Boot-time integrity check over every `compute_servers` row. Uses the
242
+ * service client (no request context at boot) to read raw ciphertext, then
243
+ * attempts to decrypt each `api_key`. Does NOT throw — returns a structured
244
+ * report for boot health to drive `/api/health`.
245
+ */
246
+ async verifySecrets() {
247
+ const { data, error } = await this.clients.serviceClient
248
+ .from('compute_servers')
249
+ .select('id, label, api_key');
250
+ if (error)
251
+ throw mapPostgrestError(error);
252
+ const failures = [];
253
+ let plaintextFound = false;
254
+ for (const row of data ?? []) {
255
+ const apiKey = row.api_key;
256
+ const id = row.id;
257
+ const label = row.label;
258
+ if (!apiKey)
259
+ continue;
260
+ if (!isEncryptedSecret(apiKey)) {
261
+ plaintextFound = true;
262
+ failures.push({ serverId: id, serverLabel: label, reason: 'plaintext_on_disk' });
263
+ continue;
264
+ }
265
+ if (!this.secretKey) {
266
+ failures.push({
267
+ serverId: id,
268
+ serverLabel: label,
269
+ reason: 'key_mismatch',
270
+ cause: 'SELVA_AT_REST_KEY is not configured'
271
+ });
272
+ continue;
273
+ }
274
+ try {
275
+ decryptSecret(apiKey, this.secretKey);
276
+ }
277
+ catch (cause) {
278
+ failures.push({
279
+ serverId: id,
280
+ serverLabel: label,
281
+ reason: 'key_mismatch',
282
+ cause: cause instanceof Error ? cause.message : String(cause)
283
+ });
284
+ }
285
+ }
286
+ return { ok: failures.length === 0, failures, plaintextFound };
166
287
  }
167
288
  }
168
289
  function rowToServer(row, sharedByServer) {
@@ -210,18 +331,4 @@ function serverToRow(s) {
210
331
  shared_with_all: false
211
332
  };
212
333
  }
213
- function mapError(e) {
214
- const pg = e;
215
- if (pg?.code === '23505')
216
- return new ProviderError(pg.message ?? 'Duplicate record', 409);
217
- if (pg?.code === '23503')
218
- return new ProviderError(pg.message ?? 'Foreign key violation', 409);
219
- if (e instanceof Error)
220
- return e;
221
- if (e && typeof e === 'object') {
222
- const obj = e;
223
- return new Error(obj.code ? `[${obj.code}] ${obj.message ?? ''}` : (obj.message ?? String(e)));
224
- }
225
- return new Error(String(e));
226
- }
227
334
  //# sourceMappingURL=SupabaseComputeServerStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseComputeServerStore.js","sourceRoot":"","sources":["../../src/data/SupabaseComputeServerStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SupabaseComputeServerStore.js","sourceRoot":"","sources":["../../src/data/SupabaseComputeServerStore.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { IDataProvider, IEventSink, IPlatformProjectGrantStore } from '@selvajs/platform';
1
+ import type { IDataProvider, IEventSink, IPlatformProjectGrantStore, SchemaVersionReport } from '@selvajs/platform';
2
2
  import type { ClientBundle, BuildClientOptions } from './client.js';
3
3
  import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
4
4
  import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
@@ -27,6 +27,8 @@ export declare class SupabaseDataProvider implements IDataProvider {
27
27
  readonly permissions: SupabasePlatformPermissionStore;
28
28
  readonly platformProjectGrants: IPlatformProjectGrantStore;
29
29
  readonly auditQuery: SupabaseAuditQuery;
30
+ /** The sink every store emits into — exposed per `IDataProvider.events`. */
31
+ readonly events: IEventSink;
30
32
  /**
31
33
  * Per-solve timing sink, built from the same client bundle. Exposed so the
32
34
  * app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
@@ -35,17 +37,30 @@ export declare class SupabaseDataProvider implements IDataProvider {
35
37
  readonly solveMetrics: SupabaseSolveMetricSink;
36
38
  private constructor();
37
39
  static fromEnv(env: Record<string, string | undefined>, events?: IEventSink): SupabaseDataProvider;
38
- static create(opts: BuildClientOptions, events?: IEventSink): SupabaseDataProvider;
40
+ static create(opts: BuildClientOptions, events?: IEventSink, secretKey?: Buffer): SupabaseDataProvider;
39
41
  /**
40
42
  * Build from a pre-existing `ClientBundle`. Useful for tests or advanced
41
43
  * cases that need to inject a custom event sink or share a bundle externally.
44
+ * `secretKey` is optional here — omit it only when the caller never touches
45
+ * compute-server apiKeys (writes without a key throw rather than persist
46
+ * plaintext).
42
47
  */
43
- static fromBundle(bundle: ClientBundle, events?: IEventSink): SupabaseDataProvider;
48
+ static fromBundle(bundle: ClientBundle, events?: IEventSink, secretKey?: Buffer): SupabaseDataProvider;
44
49
  /**
45
50
  * Expose the underlying bundle so other providers in the same package
46
51
  * (storage, user profile, auth) can share one set of clients per process.
47
52
  */
48
53
  getClientBundle(): ClientBundle;
54
+ /**
55
+ * App↔DB schema handshake (audit O3). Calls `selva.migration_head()` — a
56
+ * SECURITY DEFINER function shipped in this package's migrations — and
57
+ * compares it against the head this build expects. Three failure shapes:
58
+ * the RPC itself is missing (database never applied the handshake
59
+ * migration), the head is empty (no migrations pushed at all), or the head
60
+ * is lexicographically behind (operator updated the app but forgot
61
+ * `supabase db push`). Never throws; boot health consumes the report.
62
+ */
63
+ verifySchemaVersion(): Promise<SchemaVersionReport>;
49
64
  /**
50
65
  * No-op: `public.user_profiles` is auto-seeded by the `handle_new_auth_user`
51
66
  * trigger on every `auth.users` insert (see `0001_initial.sql`). The data
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseDataProvider.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AA0BpG;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAmBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlBzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,+BAA+B,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC;IAE/C,OAAO;IAiBP,MAAM,CAAC,OAAO,CACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,UAAU,GACjB,oBAAoB;IAWvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAKlF;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAIlF;;;OAGG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
1
+ {"version":3,"file":"SupabaseDataProvider.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EACb,UAAU,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AA0BpG;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAqBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,+BAA+B,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC;IAE/C,OAAO;IAmBP,MAAM,CAAC,OAAO,CACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,UAAU,GACjB,oBAAoB;IAkBvB,MAAM,CAAC,MAAM,CACZ,IAAI,EAAE,kBAAkB,EACxB,MAAM,CAAC,EAAE,UAAU,EACnB,SAAS,CAAC,EAAE,MAAM,GAChB,oBAAoB;IAKvB;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAChB,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,UAAU,EACnB,SAAS,CAAC,EAAE,MAAM,GAChB,oBAAoB;IAIvB;;;OAGG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;;;;;OAQG;IACG,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAgDzD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
@@ -1,5 +1,7 @@
1
1
  import { ProviderError } from '@selvajs/platform';
2
- import { buildClientBundle } from './client.js';
2
+ import { decodeSecretKey } from '@selvajs/platform/computeServer';
3
+ import { EXPECTED_MIGRATION_HEAD } from './migrationHead.js';
4
+ import { buildClientBundle, clientBundleFromEnv } from './client.js';
3
5
  import { SupabaseEventSink } from './SupabaseEventSink.js';
4
6
  import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
5
7
  import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
@@ -51,20 +53,23 @@ export class SupabaseDataProvider {
51
53
  permissions;
52
54
  platformProjectGrants;
53
55
  auditQuery;
56
+ /** The sink every store emits into — exposed per `IDataProvider.events`. */
57
+ events;
54
58
  /**
55
59
  * Per-solve timing sink, built from the same client bundle. Exposed so the
56
60
  * app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
57
61
  * constructing a second Supabase client.
58
62
  */
59
63
  solveMetrics;
60
- constructor(clients, events) {
64
+ constructor(clients, events, secretKey) {
61
65
  this.clients = clients;
66
+ this.events = events;
62
67
  this.solveMetrics = new SupabaseSolveMetricSink(clients);
63
68
  this.orgs = new SupabaseOrgStore(clients, events);
64
69
  this.projects = new SupabaseProjectStore(clients, events);
65
70
  this.definitions = new SupabaseDefinitionStore(clients, events);
66
71
  this.invites = new SupabaseInviteStore(clients, events);
67
- this.computeServer = new SupabaseComputeServerStore(clients);
72
+ this.computeServer = new SupabaseComputeServerStore(clients, secretKey);
68
73
  this.shareLinks = new SupabaseShareLinkStore(clients, events);
69
74
  this.userProfile = new SupabaseUserProfileProvider(clients);
70
75
  this.permissions = new SupabasePlatformPermissionStore(clients);
@@ -72,28 +77,33 @@ export class SupabaseDataProvider {
72
77
  this.auditQuery = new SupabaseAuditQuery(clients);
73
78
  }
74
79
  static fromEnv(env, events) {
75
- const supabaseUrl = env.SUPABASE_URL;
76
- const anonKey = env.SUPABASE_ANON_KEY;
77
- const serviceRoleKey = env.SUPABASE_SERVICE_ROLE_KEY;
78
- if (!supabaseUrl)
79
- throw new Error('Missing required env var: SUPABASE_URL');
80
- if (!anonKey)
81
- throw new Error('Missing required env var: SUPABASE_ANON_KEY');
82
- if (!serviceRoleKey)
83
- throw new Error('Missing required env var: SUPABASE_SERVICE_ROLE_KEY');
84
- const bundle = buildClientBundle({ supabaseUrl, anonKey, serviceRoleKey });
85
- return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle));
80
+ // Bundle-only env parse (URL + anon + service-role) is shared with
81
+ // `clientBundleFromEnv`; the full data provider additionally requires the
82
+ // at-rest key below.
83
+ const bundle = clientBundleFromEnv(env);
84
+ // Required so compute-server apiKeys are encrypted at rest in the DB —
85
+ // same guarantee (and same key) as the local provider's on-disk envelope.
86
+ if (!env.SELVA_AT_REST_KEY) {
87
+ throw new Error('Missing required env var: SELVA_AT_REST_KEY (32-byte hex or base64). ' +
88
+ 'Required to encrypt compute-server API keys at rest. ' +
89
+ "Generate one with: node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"");
90
+ }
91
+ const secretKey = decodeSecretKey(env.SELVA_AT_REST_KEY);
92
+ return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle), secretKey);
86
93
  }
87
- static create(opts, events) {
94
+ static create(opts, events, secretKey) {
88
95
  const bundle = buildClientBundle(opts);
89
- return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle));
96
+ return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle), secretKey);
90
97
  }
91
98
  /**
92
99
  * Build from a pre-existing `ClientBundle`. Useful for tests or advanced
93
100
  * cases that need to inject a custom event sink or share a bundle externally.
101
+ * `secretKey` is optional here — omit it only when the caller never touches
102
+ * compute-server apiKeys (writes without a key throw rather than persist
103
+ * plaintext).
94
104
  */
95
- static fromBundle(bundle, events) {
96
- return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle));
105
+ static fromBundle(bundle, events, secretKey) {
106
+ return new SupabaseDataProvider(bundle, events ?? new SupabaseEventSink(bundle), secretKey);
97
107
  }
98
108
  /**
99
109
  * Expose the underlying bundle so other providers in the same package
@@ -102,6 +112,61 @@ export class SupabaseDataProvider {
102
112
  getClientBundle() {
103
113
  return this.clients;
104
114
  }
115
+ /**
116
+ * App↔DB schema handshake (audit O3). Calls `selva.migration_head()` — a
117
+ * SECURITY DEFINER function shipped in this package's migrations — and
118
+ * compares it against the head this build expects. Three failure shapes:
119
+ * the RPC itself is missing (database never applied the handshake
120
+ * migration), the head is empty (no migrations pushed at all), or the head
121
+ * is lexicographically behind (operator updated the app but forgot
122
+ * `supabase db push`). Never throws; boot health consumes the report.
123
+ */
124
+ async verifySchemaVersion() {
125
+ const expected = EXPECTED_MIGRATION_HEAD;
126
+ const pushHint = 'Apply the pending Supabase migrations: sync them into your project ' +
127
+ '(see @selvajs/supabase-provider sync-migrations) and run `npx supabase db push`.';
128
+ try {
129
+ const { data, error } = await this.clients.serviceClient.rpc('migration_head');
130
+ if (error) {
131
+ return {
132
+ ok: false,
133
+ expected,
134
+ actual: null,
135
+ message: `selva.migration_head() is not available (${error.message ?? error.code ?? 'unknown error'}) ` +
136
+ `— the database schema is behind this app version. ${pushHint}`
137
+ };
138
+ }
139
+ const actual = typeof data === 'string' ? data : '';
140
+ if (!actual) {
141
+ return {
142
+ ok: false,
143
+ expected,
144
+ actual: '',
145
+ message: `The database reports no applied migrations. ${pushHint}`
146
+ };
147
+ }
148
+ // Timestamp prefixes are fixed-width, so lexicographic order is
149
+ // chronological. A head AHEAD of the app (rolled-back app, newer DB) is
150
+ // tolerated — the schema is append-only/additive by convention.
151
+ const ok = actual >= expected;
152
+ return {
153
+ ok,
154
+ expected,
155
+ actual,
156
+ message: ok
157
+ ? undefined
158
+ : `Database migration head ${actual} is behind the app's expected ${expected}. ${pushHint}`
159
+ };
160
+ }
161
+ catch (err) {
162
+ return {
163
+ ok: false,
164
+ expected,
165
+ actual: null,
166
+ message: `Schema handshake failed: ${err instanceof Error ? err.message : String(err)}`
167
+ };
168
+ }
169
+ }
105
170
  /**
106
171
  * No-op: `public.user_profiles` is auto-seeded by the `handle_new_auth_user`
107
172
  * trigger on every `auth.users` insert (see `0001_initial.sql`). The data
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseDataProvider.js","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SupabaseDataProvider.js","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import type { ClientBundle } from './client.js';
7
7
  *
8
8
  * Deletion protection (§6) is enforced by FK constraints — `live_version_id`
9
9
  * and `draft_version_id` are ON DELETE RESTRICT. Trying to delete a
10
- * referenced version raises 23503 which `mapError` turns into a 409.
10
+ * referenced version raises 23503 which `mapPostgrestError` turns into a 409.
11
11
  *
12
12
  * `incrementSolveCount` uses a SQL function for atomic UPDATE — no
13
13
  * read-modify-write race like the local provider has.
@@ -26,7 +26,9 @@ export declare class SupabaseDefinitionStore implements IDefinitionStore {
26
26
  create(ctx: RequestContext, record: DefinitionRecord): Promise<void>;
27
27
  update(ctx: RequestContext, guid: string, patch: DefinitionRecordPatch): Promise<void>;
28
28
  delete(ctx: RequestContext, guid: string): Promise<void>;
29
+ deleteByProject(ctx: RequestContext, projectId: string): Promise<void>;
29
30
  incrementSolveCount(ctx: RequestContext, guid: string): Promise<void>;
31
+ reserveNextVersionNumber(ctx: RequestContext, guid: string): Promise<number>;
30
32
  createVersion(ctx: RequestContext, version: DefinitionVersion): Promise<void>;
31
33
  listVersions(ctx: RequestContext, definitionId: string, opts?: ListOptions): Promise<Page<DefinitionVersion>>;
32
34
  getVersion(ctx: RequestContext, versionId: string): Promise<DefinitionVersion | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseDefinitionStore.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDefinitionStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,qBAAqB,EAGrB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IAI9D,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAGlB,OAAO,EAAE,YAAY,EACtC,MAAM,GAAE,UAAgC;IASnC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAIxF,aAAa,CAClB,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAI5B,UAAU,CACf,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE,qBAAqB,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAIpB,OAAO;IAkDf,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAYxE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBtF,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBxD,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrE,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7E,YAAY,CACjB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAc7B,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAWrF,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IASzF,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpE,cAAc,CACnB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAYV,eAAe,CACpB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAIV,oBAAoB,CACzB,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;YAqCF,cAAc;CA+B5B"}
1
+ {"version":3,"file":"SupabaseDefinitionStore.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDefinitionStore.ts"],"names":[],"mappings":"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"}