@iwo-szapar/data-mcp 0.1.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/adapter/factory.d.ts +9 -0
  2. package/dist/adapter/factory.d.ts.map +1 -0
  3. package/dist/adapter/factory.js +23 -0
  4. package/dist/adapter/factory.js.map +1 -0
  5. package/dist/adapter/pocketbase.d.ts +37 -0
  6. package/dist/adapter/pocketbase.d.ts.map +1 -0
  7. package/dist/adapter/pocketbase.js +350 -0
  8. package/dist/adapter/pocketbase.js.map +1 -0
  9. package/dist/adapter/schema-map.d.ts +45 -0
  10. package/dist/adapter/schema-map.d.ts.map +1 -0
  11. package/dist/adapter/schema-map.js +75 -0
  12. package/dist/adapter/schema-map.js.map +1 -0
  13. package/dist/adapter/supabase.d.ts +32 -0
  14. package/dist/adapter/supabase.d.ts.map +1 -0
  15. package/dist/adapter/supabase.js +294 -0
  16. package/dist/adapter/supabase.js.map +1 -0
  17. package/dist/adapter/types.d.ts +67 -0
  18. package/dist/adapter/types.d.ts.map +1 -0
  19. package/dist/adapter/types.js +9 -0
  20. package/dist/adapter/types.js.map +1 -0
  21. package/dist/config.d.ts +31 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +62 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/errors/adapter-error.d.ts +12 -0
  26. package/dist/errors/adapter-error.d.ts.map +1 -0
  27. package/dist/errors/adapter-error.js +15 -0
  28. package/dist/errors/adapter-error.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +27 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/search/alias-expansion.d.ts +53 -0
  34. package/dist/search/alias-expansion.d.ts.map +1 -0
  35. package/dist/search/alias-expansion.js +131 -0
  36. package/dist/search/alias-expansion.js.map +1 -0
  37. package/dist/server.d.ts +9 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +40 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/tools/business/blog-create.d.ts +9 -0
  42. package/dist/tools/business/blog-create.d.ts.map +1 -0
  43. package/dist/tools/business/blog-create.js +53 -0
  44. package/dist/tools/business/blog-create.js.map +1 -0
  45. package/dist/tools/business/blog-delete.d.ts +9 -0
  46. package/dist/tools/business/blog-delete.d.ts.map +1 -0
  47. package/dist/tools/business/blog-delete.js +29 -0
  48. package/dist/tools/business/blog-delete.js.map +1 -0
  49. package/dist/tools/business/blog-list.d.ts +9 -0
  50. package/dist/tools/business/blog-list.d.ts.map +1 -0
  51. package/dist/tools/business/blog-list.js +37 -0
  52. package/dist/tools/business/blog-list.js.map +1 -0
  53. package/dist/tools/business/blog-update.d.ts +9 -0
  54. package/dist/tools/business/blog-update.d.ts.map +1 -0
  55. package/dist/tools/business/blog-update.js +66 -0
  56. package/dist/tools/business/blog-update.js.map +1 -0
  57. package/dist/tools/business/content-queue-add.d.ts +9 -0
  58. package/dist/tools/business/content-queue-add.d.ts.map +1 -0
  59. package/dist/tools/business/content-queue-add.js +40 -0
  60. package/dist/tools/business/content-queue-add.js.map +1 -0
  61. package/dist/tools/business/content-queue-list.d.ts +9 -0
  62. package/dist/tools/business/content-queue-list.d.ts.map +1 -0
  63. package/dist/tools/business/content-queue-list.js +41 -0
  64. package/dist/tools/business/content-queue-list.js.map +1 -0
  65. package/dist/tools/business/email-queue-add.d.ts +9 -0
  66. package/dist/tools/business/email-queue-add.d.ts.map +1 -0
  67. package/dist/tools/business/email-queue-add.js +47 -0
  68. package/dist/tools/business/email-queue-add.js.map +1 -0
  69. package/dist/tools/business/prospect-create.d.ts +9 -0
  70. package/dist/tools/business/prospect-create.d.ts.map +1 -0
  71. package/dist/tools/business/prospect-create.js +50 -0
  72. package/dist/tools/business/prospect-create.js.map +1 -0
  73. package/dist/tools/business/prospect-list.d.ts +9 -0
  74. package/dist/tools/business/prospect-list.d.ts.map +1 -0
  75. package/dist/tools/business/prospect-list.js +37 -0
  76. package/dist/tools/business/prospect-list.js.map +1 -0
  77. package/dist/tools/business/prospect-search.d.ts +9 -0
  78. package/dist/tools/business/prospect-search.d.ts.map +1 -0
  79. package/dist/tools/business/prospect-search.js +29 -0
  80. package/dist/tools/business/prospect-search.js.map +1 -0
  81. package/dist/tools/business/prospect-update.d.ts +9 -0
  82. package/dist/tools/business/prospect-update.d.ts.map +1 -0
  83. package/dist/tools/business/prospect-update.js +68 -0
  84. package/dist/tools/business/prospect-update.js.map +1 -0
  85. package/dist/tools/memory/brain-decay.d.ts +11 -0
  86. package/dist/tools/memory/brain-decay.d.ts.map +1 -0
  87. package/dist/tools/memory/brain-decay.js +58 -0
  88. package/dist/tools/memory/brain-decay.js.map +1 -0
  89. package/dist/tools/memory/brain-stats.d.ts +11 -0
  90. package/dist/tools/memory/brain-stats.d.ts.map +1 -0
  91. package/dist/tools/memory/brain-stats.js +63 -0
  92. package/dist/tools/memory/brain-stats.js.map +1 -0
  93. package/dist/tools/memory/contact-create.d.ts +9 -0
  94. package/dist/tools/memory/contact-create.d.ts.map +1 -0
  95. package/dist/tools/memory/contact-create.js +42 -0
  96. package/dist/tools/memory/contact-create.js.map +1 -0
  97. package/dist/tools/memory/contact-list.d.ts +9 -0
  98. package/dist/tools/memory/contact-list.d.ts.map +1 -0
  99. package/dist/tools/memory/contact-list.js +30 -0
  100. package/dist/tools/memory/contact-list.js.map +1 -0
  101. package/dist/tools/memory/contact-search.d.ts +9 -0
  102. package/dist/tools/memory/contact-search.d.ts.map +1 -0
  103. package/dist/tools/memory/contact-search.js +29 -0
  104. package/dist/tools/memory/contact-search.js.map +1 -0
  105. package/dist/tools/memory/contact-update.d.ts +9 -0
  106. package/dist/tools/memory/contact-update.d.ts.map +1 -0
  107. package/dist/tools/memory/contact-update.js +59 -0
  108. package/dist/tools/memory/contact-update.js.map +1 -0
  109. package/dist/tools/memory/goal-create.d.ts +9 -0
  110. package/dist/tools/memory/goal-create.d.ts.map +1 -0
  111. package/dist/tools/memory/goal-create.js +40 -0
  112. package/dist/tools/memory/goal-create.js.map +1 -0
  113. package/dist/tools/memory/goal-list.d.ts +9 -0
  114. package/dist/tools/memory/goal-list.d.ts.map +1 -0
  115. package/dist/tools/memory/goal-list.js +41 -0
  116. package/dist/tools/memory/goal-list.js.map +1 -0
  117. package/dist/tools/memory/goal-update.d.ts +9 -0
  118. package/dist/tools/memory/goal-update.d.ts.map +1 -0
  119. package/dist/tools/memory/goal-update.js +51 -0
  120. package/dist/tools/memory/goal-update.js.map +1 -0
  121. package/dist/tools/memory/knowledge-decide.d.ts +10 -0
  122. package/dist/tools/memory/knowledge-decide.d.ts.map +1 -0
  123. package/dist/tools/memory/knowledge-decide.js +39 -0
  124. package/dist/tools/memory/knowledge-decide.js.map +1 -0
  125. package/dist/tools/memory/knowledge-delete.d.ts +10 -0
  126. package/dist/tools/memory/knowledge-delete.d.ts.map +1 -0
  127. package/dist/tools/memory/knowledge-delete.js +33 -0
  128. package/dist/tools/memory/knowledge-delete.js.map +1 -0
  129. package/dist/tools/memory/knowledge-learn.d.ts +10 -0
  130. package/dist/tools/memory/knowledge-learn.d.ts.map +1 -0
  131. package/dist/tools/memory/knowledge-learn.js +39 -0
  132. package/dist/tools/memory/knowledge-learn.js.map +1 -0
  133. package/dist/tools/memory/knowledge-list.d.ts +9 -0
  134. package/dist/tools/memory/knowledge-list.d.ts.map +1 -0
  135. package/dist/tools/memory/knowledge-list.js +43 -0
  136. package/dist/tools/memory/knowledge-list.js.map +1 -0
  137. package/dist/tools/memory/knowledge-recall.d.ts +11 -0
  138. package/dist/tools/memory/knowledge-recall.d.ts.map +1 -0
  139. package/dist/tools/memory/knowledge-recall.js +79 -0
  140. package/dist/tools/memory/knowledge-recall.js.map +1 -0
  141. package/dist/tools/memory/knowledge-store.d.ts +10 -0
  142. package/dist/tools/memory/knowledge-store.d.ts.map +1 -0
  143. package/dist/tools/memory/knowledge-store.js +56 -0
  144. package/dist/tools/memory/knowledge-store.js.map +1 -0
  145. package/dist/tools/memory/knowledge-update.d.ts +10 -0
  146. package/dist/tools/memory/knowledge-update.d.ts.map +1 -0
  147. package/dist/tools/memory/knowledge-update.js +50 -0
  148. package/dist/tools/memory/knowledge-update.js.map +1 -0
  149. package/dist/tools/memory/knowledge-validate.d.ts +10 -0
  150. package/dist/tools/memory/knowledge-validate.d.ts.map +1 -0
  151. package/dist/tools/memory/knowledge-validate.js +40 -0
  152. package/dist/tools/memory/knowledge-validate.js.map +1 -0
  153. package/dist/tools/memory/session-list.d.ts +9 -0
  154. package/dist/tools/memory/session-list.d.ts.map +1 -0
  155. package/dist/tools/memory/session-list.js +30 -0
  156. package/dist/tools/memory/session-list.js.map +1 -0
  157. package/dist/tools/memory/session-log.d.ts +9 -0
  158. package/dist/tools/memory/session-log.d.ts.map +1 -0
  159. package/dist/tools/memory/session-log.js +56 -0
  160. package/dist/tools/memory/session-log.js.map +1 -0
  161. package/dist/tools/memory/task-create.d.ts +9 -0
  162. package/dist/tools/memory/task-create.d.ts.map +1 -0
  163. package/dist/tools/memory/task-create.js +38 -0
  164. package/dist/tools/memory/task-create.js.map +1 -0
  165. package/dist/tools/memory/task-list.d.ts +9 -0
  166. package/dist/tools/memory/task-list.d.ts.map +1 -0
  167. package/dist/tools/memory/task-list.js +41 -0
  168. package/dist/tools/memory/task-list.js.map +1 -0
  169. package/dist/tools/memory/task-update.d.ts +9 -0
  170. package/dist/tools/memory/task-update.d.ts.map +1 -0
  171. package/dist/tools/memory/task-update.js +50 -0
  172. package/dist/tools/memory/task-update.js.map +1 -0
  173. package/dist/tools/register.d.ts +7 -0
  174. package/dist/tools/register.d.ts.map +1 -0
  175. package/dist/tools/register.js +84 -0
  176. package/dist/tools/register.js.map +1 -0
  177. package/dist/tools/setup/setup-migrate.d.ts +10 -0
  178. package/dist/tools/setup/setup-migrate.d.ts.map +1 -0
  179. package/dist/tools/setup/setup-migrate.js +73 -0
  180. package/dist/tools/setup/setup-migrate.js.map +1 -0
  181. package/dist/tools/setup/setup-seed.d.ts +9 -0
  182. package/dist/tools/setup/setup-seed.d.ts.map +1 -0
  183. package/dist/tools/setup/setup-seed.js +133 -0
  184. package/dist/tools/setup/setup-seed.js.map +1 -0
  185. package/dist/tools/setup/setup-status.d.ts +9 -0
  186. package/dist/tools/setup/setup-status.d.ts.map +1 -0
  187. package/dist/tools/setup/setup-status.js +76 -0
  188. package/dist/tools/setup/setup-status.js.map +1 -0
  189. package/dist/tools/shared.d.ts +56 -0
  190. package/dist/tools/shared.d.ts.map +1 -0
  191. package/dist/tools/shared.js +93 -0
  192. package/dist/tools/shared.js.map +1 -0
  193. package/dist/types/records.d.ts +163 -0
  194. package/dist/types/records.d.ts.map +1 -0
  195. package/dist/types/records.js +8 -0
  196. package/dist/types/records.js.map +1 -0
  197. package/migrations/pocketbase/001_core_schema.js +72 -0
  198. package/migrations/pocketbase/002_goals_tasks.js +49 -0
  199. package/migrations/pocketbase/003_contacts.js +29 -0
  200. package/migrations/pocketbase/004_entity_aliases.js +40 -0
  201. package/migrations/pocketbase/005_prospects.js +33 -0
  202. package/migrations/pocketbase/006_business.js +80 -0
  203. package/migrations/pocketbase/007_newsletter_affiliates.js +50 -0
  204. package/migrations/supabase/001_core_schema.sql +78 -0
  205. package/migrations/supabase/002_goals_tasks.sql +38 -0
  206. package/migrations/supabase/003_contacts.sql +27 -0
  207. package/migrations/supabase/004_entity_aliases.sql +22 -0
  208. package/migrations/supabase/005_prospects.sql +31 -0
  209. package/migrations/supabase/006_business.sql +68 -0
  210. package/migrations/supabase/007_seed_aliases.sql +69 -0
  211. package/migrations/supabase/008_newsletter_affiliates.sql +39 -0
  212. package/package.json +48 -0
  213. package/seed/entity-aliases.json +57 -0
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Supabase adapter implementation.
3
+ *
4
+ * Uses service role key for authentication.
5
+ * textSearch uses PostgreSQL tsvector when available, ILIKE fallback.
6
+ * ILIKE search sanitizes \, %, _ characters.
7
+ */
8
+ import { createClient } from '@supabase/supabase-js';
9
+ import { AdapterError } from '../errors/adapter-error.js';
10
+ export class SupabaseAdapter {
11
+ backend = 'supabase';
12
+ client;
13
+ constructor(url, key) {
14
+ this.client = createClient(url, key);
15
+ }
16
+ async create(collection, data) {
17
+ const { data: result, error } = await this.client
18
+ .from(collection)
19
+ .insert(data)
20
+ .select()
21
+ .single();
22
+ if (error)
23
+ throw mapSupabaseError(error, collection);
24
+ return result;
25
+ }
26
+ async getOne(collection, id) {
27
+ const { data: result, error } = await this.client
28
+ .from(collection)
29
+ .select('*')
30
+ .eq('id', id)
31
+ .single();
32
+ if (error)
33
+ throw mapSupabaseError(error, collection);
34
+ return result;
35
+ }
36
+ async list(collection, options) {
37
+ const limit = options?.page?.limit ?? 50;
38
+ const offset = options?.page?.offset ?? 0;
39
+ let query = this.client.from(collection).select('*', { count: 'exact' });
40
+ query = applyFilter(query, options?.filter);
41
+ if (options?.sort) {
42
+ for (const s of options.sort) {
43
+ query = query.order(s.field, { ascending: s.direction === 'asc' });
44
+ }
45
+ }
46
+ else {
47
+ query = query.order('created_at', { ascending: false });
48
+ }
49
+ query = query.range(offset, offset + limit - 1);
50
+ const { data, error, count } = await query;
51
+ if (error)
52
+ throw mapSupabaseError(error, collection);
53
+ return {
54
+ items: (data ?? []),
55
+ totalItems: count ?? 0,
56
+ page: Math.floor(offset / limit) + 1,
57
+ perPage: limit,
58
+ };
59
+ }
60
+ async textSearch(collection, query, options) {
61
+ const limit = options?.limit ?? 20;
62
+ // Try tsvector search first
63
+ try {
64
+ let q = this.client
65
+ .from(collection)
66
+ .select('*')
67
+ .textSearch('search_vector', query, { type: 'plain', config: 'english' })
68
+ .limit(limit);
69
+ q = applyFilter(q, options?.filter);
70
+ const { data, error } = await q;
71
+ // If tsvector query succeeded (no error), return results even if empty
72
+ // Only fall through to ILIKE if the column/function doesn't exist (error)
73
+ if (!error) {
74
+ return (data ?? []);
75
+ }
76
+ // Error indicates search_vector column likely doesn't exist — fall through
77
+ }
78
+ catch {
79
+ // search_vector column may not exist — fall through to ILIKE
80
+ }
81
+ // ILIKE fallback
82
+ const fields = options?.fields ?? ['title', 'content'];
83
+ const escaped = escapeIlike(query);
84
+ const orClauses = fields.map((f) => `${f}.ilike.%${escaped}%`).join(',');
85
+ let q = this.client
86
+ .from(collection)
87
+ .select('*')
88
+ .or(orClauses)
89
+ .order('created_at', { ascending: false })
90
+ .limit(limit);
91
+ q = applyFilter(q, options?.filter);
92
+ const { data, error } = await q;
93
+ if (error)
94
+ throw mapSupabaseError(error, collection);
95
+ return (data ?? []);
96
+ }
97
+ async update(collection, id, data) {
98
+ const { data: result, error } = await this.client
99
+ .from(collection)
100
+ .update(data)
101
+ .eq('id', id)
102
+ .select()
103
+ .single();
104
+ if (error)
105
+ throw mapSupabaseError(error, collection);
106
+ return result;
107
+ }
108
+ async delete(collection, id) {
109
+ const { error } = await this.client
110
+ .from(collection)
111
+ .delete()
112
+ .eq('id', id);
113
+ if (error)
114
+ throw mapSupabaseError(error, collection);
115
+ }
116
+ async upsert(collection, data, uniqueFields) {
117
+ // Build a query to find existing record by unique fields
118
+ let query = this.client.from(collection).select('id');
119
+ for (const field of uniqueFields) {
120
+ const value = data[field];
121
+ if (typeof value === 'string') {
122
+ const escaped = value.replace(/[\\%_]/g, '\\$&');
123
+ query = query.ilike(field, escaped);
124
+ }
125
+ else {
126
+ query = query.eq(field, value);
127
+ }
128
+ }
129
+ const { data: existing } = await query.limit(1).maybeSingle();
130
+ if (existing) {
131
+ return this.update(collection, existing.id, data);
132
+ }
133
+ return this.create(collection, data);
134
+ }
135
+ async count(collection, filter) {
136
+ let query = this.client.from(collection).select('id', { count: 'exact', head: true });
137
+ query = applyFilter(query, filter);
138
+ const { count, error } = await query;
139
+ if (error)
140
+ throw mapSupabaseError(error, collection);
141
+ return count ?? 0;
142
+ }
143
+ async collectionExists(collection) {
144
+ const { error } = await this.client
145
+ .from(collection)
146
+ .select('id', { count: 'exact', head: true })
147
+ .limit(0);
148
+ if (!error)
149
+ return true;
150
+ // PGRST205 = not in schema cache = table doesn't exist
151
+ if (error.code === 'PGRST205' || error.code === '42P01' || error.code === 'PGRST106') {
152
+ return false;
153
+ }
154
+ if (error.message?.includes('relation') && error.message?.includes('does not exist')) {
155
+ return false;
156
+ }
157
+ // Some other error — assume table exists but there's a different issue
158
+ return true;
159
+ }
160
+ async listCollections() {
161
+ // Query pg_tables for tables in the public schema
162
+ const { data, error } = await this.client
163
+ .rpc('get_public_tables');
164
+ if (error) {
165
+ // Fallback: try information_schema
166
+ const { data: fallbackData, error: fallbackError } = await this.client
167
+ .from('information_schema.tables')
168
+ .select('table_name')
169
+ .eq('table_schema', 'public')
170
+ .eq('table_type', 'BASE TABLE');
171
+ if (fallbackError)
172
+ throw mapSupabaseError(fallbackError);
173
+ return (fallbackData ?? []).map((r) => r.table_name);
174
+ }
175
+ return (data ?? []).map((r) => r.table_name);
176
+ }
177
+ }
178
+ /**
179
+ * Escape special ILIKE characters: \, %, _
180
+ */
181
+ function escapeIlike(input) {
182
+ return input.replace(/[\\%_]/g, '\\$&');
183
+ }
184
+ /**
185
+ * Apply Filter (OR-of-AND groups) to a Supabase query.
186
+ * Uses `any` for the query type since PostgREST builder types are complex generics.
187
+ */
188
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
189
+ function applyFilter(query, filter) {
190
+ if (!filter || filter.length === 0)
191
+ return query;
192
+ if (filter.length === 1 && filter[0].length === 1) {
193
+ return applyClause(query, filter[0][0]);
194
+ }
195
+ if (filter.length === 1) {
196
+ let q = query;
197
+ for (const clause of filter[0]) {
198
+ q = applyClause(q, clause);
199
+ }
200
+ return q;
201
+ }
202
+ // Multiple OR groups: build .or() string
203
+ const orParts = filter.map((andGroup) => {
204
+ if (andGroup.length === 1) {
205
+ return clauseToSupabaseOr(andGroup[0]);
206
+ }
207
+ return `and(${andGroup.map(clauseToSupabaseOr).join(',')})`;
208
+ });
209
+ return query.or(orParts.join(','));
210
+ }
211
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
212
+ function applyClause(query, clause) {
213
+ const { field, op, value } = clause;
214
+ switch (op) {
215
+ case 'eq': return query.eq(field, value);
216
+ case 'neq': return query.neq(field, value);
217
+ case 'gt': return query.gt(field, value);
218
+ case 'gte': return query.gte(field, value);
219
+ case 'lt': return query.lt(field, value);
220
+ case 'lte': return query.lte(field, value);
221
+ case 'like': return query.ilike(field, `%${escapeIlike(value)}%`);
222
+ case 'in': return query.in(field, value);
223
+ case 'contains': return query.contains(field, [value]);
224
+ default: return query.eq(field, value);
225
+ }
226
+ }
227
+ /**
228
+ * Validate a field name contains only safe characters (alphanumeric + underscore + dot).
229
+ * Prevents filter injection via field names.
230
+ */
231
+ function validateFieldName(field) {
232
+ if (!/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(field)) {
233
+ throw new AdapterError('VALIDATION_ERROR', `Invalid field name: ${field}`);
234
+ }
235
+ }
236
+ /**
237
+ * Encode a value for safe interpolation into PostgREST filter strings.
238
+ * URL-encodes characters that have special meaning in PostgREST syntax.
239
+ */
240
+ function encodeFilterValue(value) {
241
+ return encodeURIComponent(String(value));
242
+ }
243
+ function clauseToSupabaseOr(clause) {
244
+ const { field, op, value } = clause;
245
+ validateFieldName(field);
246
+ switch (op) {
247
+ case 'eq': return `${field}.eq.${encodeFilterValue(value)}`;
248
+ case 'neq': return `${field}.neq.${encodeFilterValue(value)}`;
249
+ case 'gt': return `${field}.gt.${encodeFilterValue(value)}`;
250
+ case 'gte': return `${field}.gte.${encodeFilterValue(value)}`;
251
+ case 'lt': return `${field}.lt.${encodeFilterValue(value)}`;
252
+ case 'lte': return `${field}.lte.${encodeFilterValue(value)}`;
253
+ case 'like': return `${field}.ilike.%${encodeFilterValue(escapeIlike(value))}%`;
254
+ case 'in': return `${field}.in.(${value.map(v => encodeFilterValue(v)).join(',')})`;
255
+ case 'contains': return `${field}.cs.{${encodeFilterValue(value)}}`;
256
+ default: return `${field}.eq.${encodeFilterValue(value)}`;
257
+ }
258
+ }
259
+ /**
260
+ * Map Supabase/PostgREST errors to AdapterError codes.
261
+ */
262
+ function mapSupabaseError(error, collection) {
263
+ const code = error.code ?? '';
264
+ const message = error.message ?? 'Unknown Supabase error';
265
+ // Collection/table not found
266
+ if (code === 'PGRST205' || code === '42P01' || code === 'PGRST106') {
267
+ return new AdapterError('COLLECTION_NOT_FOUND', `Table '${collection ?? 'unknown'}' not found`);
268
+ }
269
+ if (message.includes('relation') && message.includes('does not exist')) {
270
+ return new AdapterError('COLLECTION_NOT_FOUND', `Table '${collection ?? 'unknown'}' not found`);
271
+ }
272
+ // Record not found
273
+ if (code === 'PGRST116') {
274
+ return new AdapterError('RECORD_NOT_FOUND', `Record not found in '${collection ?? 'unknown'}'`);
275
+ }
276
+ // Unique violation
277
+ if (code === '23505') {
278
+ return new AdapterError('UNIQUE_VIOLATION', message);
279
+ }
280
+ // Validation errors
281
+ if (code === '23502' || code === '23503' || code === '22001') {
282
+ return new AdapterError('VALIDATION_ERROR', message);
283
+ }
284
+ // Auth errors
285
+ if (code === '42501' || code === 'PGRST301') {
286
+ return new AdapterError('AUTH_ERROR', message);
287
+ }
288
+ // Connection errors
289
+ if (message.includes('fetch failed') || message.includes('ENOTFOUND') || message.includes('ECONNREFUSED')) {
290
+ return new AdapterError('CONNECTION_ERROR', `Cannot connect to Supabase`);
291
+ }
292
+ return new AdapterError('UNKNOWN', message);
293
+ }
294
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/adapter/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAuB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,MAAM,OAAO,eAAe;IACjB,OAAO,GAAG,UAAmB,CAAC;IAC/B,MAAM,CAAiB;IAE/B,YAAY,GAAW,EAAE,GAAW;QAClC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,IAA6B;QAE7B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aAC9C,IAAI,CAAC,UAAU,CAAC;aAChB,MAAM,CAAC,IAAI,CAAC;aACZ,MAAM,EAAE;aACR,MAAM,EAAE,CAAC;QAEZ,IAAI,KAAK;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO,MAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,EAAU;QAEV,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aAC9C,IAAI,CAAC,UAAU,CAAC;aAChB,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;aACZ,MAAM,EAAE,CAAC;QAEZ,IAAI,KAAK;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO,MAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,UAAkB,EAClB,OAIC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QAE1C,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAE5C,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC7B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;QAEhD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC;QAC3C,IAAI,KAAK;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAErD,OAAO;YACL,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAQ;YAC1B,UAAU,EAAE,KAAK,IAAI,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;YACpC,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,UAAkB,EAClB,KAAa,EACb,OAIC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QAEnC,4BAA4B;QAC5B,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;iBAChB,IAAI,CAAC,UAAU,CAAC;iBAChB,MAAM,CAAC,GAAG,CAAC;iBACX,UAAU,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;iBACxE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEhB,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;YAEhC,uEAAuE;YACvE,0EAA0E;YAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,IAAI,EAAE,CAAQ,CAAC;YAC7B,CAAC;YACD,2EAA2E;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEzE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;aAChB,IAAI,CAAC,UAAU,CAAC;aAChB,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,SAAS,CAAC;aACb,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;aACzC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhB,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,IAAI,EAAE,CAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,EAAU,EACV,IAA6B;QAE7B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aAC9C,IAAI,CAAC,UAAU,CAAC;aAChB,MAAM,CAAC,IAAI,CAAC;aACZ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,MAAM,EAAE,CAAC;QAEZ,IAAI,KAAK;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO,MAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,EAAU;QACzC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aAChC,IAAI,CAAC,UAAU,CAAC;aAChB,MAAM,EAAE;aACR,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEhB,IAAI,KAAK;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,IAA6B,EAC7B,YAAsB;QAEtB,yDAAyD;QACzD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACjD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAe,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAE9D,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,MAAM,CAAI,UAAU,EAAG,QAAoC,CAAC,EAAY,EAAE,IAAI,CAAC,CAAC;QAC9F,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAI,UAAU,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,MAAe;QAC7C,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtF,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEnC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC;QACrC,IAAI,KAAK;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO,KAAK,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QACvC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aAChC,IAAI,CAAC,UAAU,CAAC;aAChB,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aAC5C,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,uDAAuD;QACvD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,uEAAuE;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,kDAAkD;QAClD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aACtC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAE5B,IAAI,KAAK,EAAE,CAAC;YACV,mCAAmC;YACnC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;iBACnE,IAAI,CAAC,2BAAqC,CAAC;iBAC3C,MAAM,CAAC,YAAY,CAAC;iBACpB,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC;iBAC5B,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAElC,IAAI,aAAa;gBAAE,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACzD,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,UAAoB,CAAC,CAAC;QAC1F,CAAC;QAED,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,UAAoB,CAAC,CAAC;IAClF,CAAC;CACF;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,8DAA8D;AAC9D,SAAS,WAAW,CAAC,KAAU,EAAE,MAAe;IAC9C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,OAAO,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,8DAA8D;AAC9D,SAAS,WAAW,CAAC,KAAU,EAAE,MAAoB;IACnD,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEpC,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,WAAW,CAAC,KAAe,CAAC,GAAG,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAiB,CAAC,CAAC;QACrD,KAAK,UAAU,CAAC,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,uBAAuB,KAAK,EAAE,CAC/B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAoB;IAC9C,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACpC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEzB,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,KAAK,OAAO,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,KAAK,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,KAAK,OAAO,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,KAAK,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,KAAK,OAAO,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,KAAK,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,KAAK,WAAW,iBAAiB,CAAC,WAAW,CAAC,KAAe,CAAC,CAAC,GAAG,CAAC;QAC1F,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,KAAK,QAAS,KAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAClG,KAAK,UAAU,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC;QACpE,OAAO,CAAC,CAAC,OAAO,GAAG,KAAK,OAAO,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,KAA4D,EAC5D,UAAmB;IAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,wBAAwB,CAAC;IAE1D,6BAA6B;IAC7B,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACnE,OAAO,IAAI,YAAY,CAAC,sBAAsB,EAAE,UAAU,UAAU,IAAI,SAAS,aAAa,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACvE,OAAO,IAAI,YAAY,CAAC,sBAAsB,EAAE,UAAU,UAAU,IAAI,SAAS,aAAa,CAAC,CAAC;IAClG,CAAC;IAED,mBAAmB;IACnB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,YAAY,CAAC,kBAAkB,EAAE,wBAAwB,UAAU,IAAI,SAAS,GAAG,CAAC,CAAC;IAClG,CAAC;IAED,mBAAmB;IACnB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7D,OAAO,IAAI,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,cAAc;IACd,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5C,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1G,OAAO,IAAI,YAAY,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * DataAdapter interface — the core abstraction between tools and backends.
3
+ *
4
+ * All tools interact with data through this interface.
5
+ * PocketBase and Supabase adapters implement it.
6
+ * SchemaMapProxy wraps any adapter to remap collection names.
7
+ */
8
+ export interface PageOptions {
9
+ limit?: number;
10
+ offset?: number;
11
+ }
12
+ export interface SortClause {
13
+ field: string;
14
+ direction: 'asc' | 'desc';
15
+ }
16
+ /**
17
+ * Filter as OR-of-AND groups.
18
+ * Each inner group is ANDed; outer groups are ORed.
19
+ * Example: [[{field:'type',op:'eq',value:'fact'}]] means type = 'fact'
20
+ * Example: [[{field:'type',op:'eq',value:'fact'}],[{field:'type',op:'eq',value:'pattern'}]]
21
+ * means type = 'fact' OR type = 'pattern'
22
+ */
23
+ export interface FilterClause {
24
+ field: string;
25
+ op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'like' | 'in' | 'contains';
26
+ value: string | number | boolean | string[] | null;
27
+ }
28
+ export type Filter = FilterClause[][];
29
+ export interface ListResult<T> {
30
+ items: T[];
31
+ totalItems: number;
32
+ page: number;
33
+ perPage: number;
34
+ }
35
+ export interface DataAdapter {
36
+ /** Backend identifier */
37
+ readonly backend: 'pocketbase' | 'supabase';
38
+ /** Create a record in a collection */
39
+ create<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>): Promise<T>;
40
+ /** Get a single record by ID */
41
+ getOne<T extends Record<string, unknown>>(collection: string, id: string): Promise<T>;
42
+ /** List records with optional filters, sorting, and pagination */
43
+ list<T extends Record<string, unknown>>(collection: string, options?: {
44
+ filter?: Filter;
45
+ sort?: SortClause[];
46
+ page?: PageOptions;
47
+ }): Promise<ListResult<T>>;
48
+ /** Full-text search on a collection */
49
+ textSearch<T extends Record<string, unknown>>(collection: string, query: string, options?: {
50
+ fields?: string[];
51
+ filter?: Filter;
52
+ limit?: number;
53
+ }): Promise<T[]>;
54
+ /** Update a record by ID (partial update) */
55
+ update<T extends Record<string, unknown>>(collection: string, id: string, data: Record<string, unknown>): Promise<T>;
56
+ /** Delete a record by ID */
57
+ delete(collection: string, id: string): Promise<void>;
58
+ /** Upsert: create or update based on unique fields */
59
+ upsert<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>, uniqueFields: string[]): Promise<T>;
60
+ /** Count records matching optional filter */
61
+ count(collection: string, filter?: Filter): Promise<number>;
62
+ /** Check if a collection exists */
63
+ collectionExists(collection: string): Promise<boolean>;
64
+ /** List all collection names */
65
+ listCollections(): Promise<string[]>;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * DataAdapter interface — the core abstraction between tools and backends.
3
+ *
4
+ * All tools interact with data through this interface.
5
+ * PocketBase and Supabase adapters implement it.
6
+ * SchemaMapProxy wraps any adapter to remap collection names.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Configuration parsing from environment variables.
3
+ *
4
+ * SB_BACKEND: 'pocketbase' | 'supabase' (required)
5
+ * SB_POCKETBASE_URL: PocketBase server URL (required if backend=pocketbase)
6
+ * SB_POCKETBASE_ADMIN_EMAIL: PocketBase admin email (required if backend=pocketbase)
7
+ * SB_POCKETBASE_ADMIN_PASSWORD: PocketBase admin password (required if backend=pocketbase)
8
+ * SB_SUPABASE_URL: Supabase project URL (required if backend=supabase)
9
+ * SB_SUPABASE_KEY: Supabase service role key (required if backend=supabase)
10
+ * SB_SCHEMA_MAP: JSON string mapping logical names to actual table names (optional)
11
+ * SB_RESEND_API_KEY: Resend API key for email sending (optional)
12
+ */
13
+ export type Backend = 'pocketbase' | 'supabase';
14
+ export interface PocketBaseConfig {
15
+ backend: 'pocketbase';
16
+ pocketbaseUrl: string;
17
+ pocketbaseAdminEmail: string;
18
+ pocketbaseAdminPassword: string;
19
+ schemaMap: Record<string, string>;
20
+ resendApiKey?: string;
21
+ }
22
+ export interface SupabaseConfig {
23
+ backend: 'supabase';
24
+ supabaseUrl: string;
25
+ supabaseKey: string;
26
+ schemaMap: Record<string, string>;
27
+ resendApiKey?: string;
28
+ }
29
+ export type Config = PocketBaseConfig | SupabaseConfig;
30
+ export declare function parseConfig(): Config;
31
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,UAAU,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,MAAM,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAEvD,wBAAgB,WAAW,IAAI,MAAM,CA4BpC"}
package/dist/config.js ADDED
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Configuration parsing from environment variables.
3
+ *
4
+ * SB_BACKEND: 'pocketbase' | 'supabase' (required)
5
+ * SB_POCKETBASE_URL: PocketBase server URL (required if backend=pocketbase)
6
+ * SB_POCKETBASE_ADMIN_EMAIL: PocketBase admin email (required if backend=pocketbase)
7
+ * SB_POCKETBASE_ADMIN_PASSWORD: PocketBase admin password (required if backend=pocketbase)
8
+ * SB_SUPABASE_URL: Supabase project URL (required if backend=supabase)
9
+ * SB_SUPABASE_KEY: Supabase service role key (required if backend=supabase)
10
+ * SB_SCHEMA_MAP: JSON string mapping logical names to actual table names (optional)
11
+ * SB_RESEND_API_KEY: Resend API key for email sending (optional)
12
+ */
13
+ export function parseConfig() {
14
+ const backend = requireEnv('SB_BACKEND');
15
+ if (backend !== 'pocketbase' && backend !== 'supabase') {
16
+ throw new Error(`SB_BACKEND must be 'pocketbase' or 'supabase', got '${backend}'`);
17
+ }
18
+ const schemaMap = parseSchemaMap(process.env.SB_SCHEMA_MAP);
19
+ const resendApiKey = process.env.SB_RESEND_API_KEY || undefined;
20
+ if (backend === 'pocketbase') {
21
+ return {
22
+ backend,
23
+ pocketbaseUrl: requireEnv('SB_POCKETBASE_URL'),
24
+ pocketbaseAdminEmail: requireEnv('SB_POCKETBASE_ADMIN_EMAIL'),
25
+ pocketbaseAdminPassword: requireEnv('SB_POCKETBASE_ADMIN_PASSWORD'),
26
+ schemaMap,
27
+ resendApiKey,
28
+ };
29
+ }
30
+ return {
31
+ backend,
32
+ supabaseUrl: requireEnv('SB_SUPABASE_URL'),
33
+ supabaseKey: requireEnv('SB_SUPABASE_KEY'),
34
+ schemaMap,
35
+ resendApiKey,
36
+ };
37
+ }
38
+ function requireEnv(name) {
39
+ const value = process.env[name];
40
+ if (!value) {
41
+ throw new Error(`Missing required environment variable: ${name}`);
42
+ }
43
+ return value;
44
+ }
45
+ function parseSchemaMap(raw) {
46
+ if (!raw)
47
+ return {};
48
+ try {
49
+ const parsed = JSON.parse(raw);
50
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
51
+ throw new Error('SB_SCHEMA_MAP must be a JSON object');
52
+ }
53
+ return parsed;
54
+ }
55
+ catch (err) {
56
+ if (err instanceof SyntaxError) {
57
+ throw new Error(`SB_SCHEMA_MAP is not valid JSON: ${err.message}`);
58
+ }
59
+ throw err;
60
+ }
61
+ }
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuBH,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAY,CAAC;IAEpD,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,uDAAuD,OAAO,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,SAAS,CAAC;IAEhE,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO;YACP,aAAa,EAAE,UAAU,CAAC,mBAAmB,CAAC;YAC9C,oBAAoB,EAAE,UAAU,CAAC,2BAA2B,CAAC;YAC7D,uBAAuB,EAAE,UAAU,CAAC,8BAA8B,CAAC;YACnE,SAAS;YACT,YAAY;SACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO;QACP,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC;QAC1C,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC;QAC1C,SAAS;QACT,YAAY;KACb,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAAuB;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,MAAgC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Adapter error taxonomy.
3
+ *
4
+ * All adapter implementations throw AdapterError with a specific code.
5
+ * Tool handlers use handleAdapterError() to convert these to safe MCP responses.
6
+ */
7
+ export type AdapterErrorCode = 'COLLECTION_NOT_FOUND' | 'RECORD_NOT_FOUND' | 'VALIDATION_ERROR' | 'UNIQUE_VIOLATION' | 'CONNECTION_ERROR' | 'AUTH_ERROR' | 'UNKNOWN';
8
+ export declare class AdapterError extends Error {
9
+ readonly code: AdapterErrorCode;
10
+ constructor(code: AdapterErrorCode, message: string);
11
+ }
12
+ //# sourceMappingURL=adapter-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-error.d.ts","sourceRoot":"","sources":["../../src/errors/adapter-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,gBAAgB,GACxB,sBAAsB,GACtB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,YAAY,GACZ,SAAS,CAAC;AAEd,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;gBAEpB,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;CAKpD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Adapter error taxonomy.
3
+ *
4
+ * All adapter implementations throw AdapterError with a specific code.
5
+ * Tool handlers use handleAdapterError() to convert these to safe MCP responses.
6
+ */
7
+ export class AdapterError extends Error {
8
+ code;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.name = 'AdapterError';
12
+ this.code = code;
13
+ }
14
+ }
15
+ //# sourceMappingURL=adapter-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-error.js","sourceRoot":"","sources":["../../src/errors/adapter-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IAEhC,YAAY,IAAsB,EAAE,OAAe;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @second-brain/data-mcp — entry point
4
+ *
5
+ * Parses configuration, creates the appropriate adapter,
6
+ * builds the MCP server, and connects via stdio transport.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @second-brain/data-mcp — entry point
4
+ *
5
+ * Parses configuration, creates the appropriate adapter,
6
+ * builds the MCP server, and connects via stdio transport.
7
+ */
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { parseConfig } from './config.js';
10
+ import { createAdapter } from './adapter/factory.js';
11
+ import { createServer } from './server.js';
12
+ async function main() {
13
+ try {
14
+ const config = parseConfig();
15
+ const adapter = createAdapter(config);
16
+ const server = createServer(adapter);
17
+ const transport = new StdioServerTransport();
18
+ await server.connect(transport);
19
+ console.error(`[data-mcp] Started with ${config.backend} backend`);
20
+ }
21
+ catch (error) {
22
+ console.error('[data-mcp] Fatal error:', error instanceof Error ? error.message : error);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ main();
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Entity alias expansion for knowledge recall.
3
+ *
4
+ * Loads aliases from the entity_aliases collection and expands query tokens.
5
+ * Example: "payment stuff" -> ["payment", "stuff", "stripe", "checkout", "pricing", "invoice"]
6
+ *
7
+ * Degrades silently if entity_aliases table is missing.
8
+ */
9
+ import type { DataAdapter } from '../adapter/types.js';
10
+ /**
11
+ * AliasExpander — encapsulates alias cache and expansion logic.
12
+ *
13
+ * Takes a DataAdapter in its constructor. The cache is per-instance,
14
+ * making it easy to test without module-level singletons.
15
+ */
16
+ export declare class AliasExpander {
17
+ private readonly adapter;
18
+ private cache;
19
+ private cacheTimestamp;
20
+ constructor(adapter: DataAdapter);
21
+ /**
22
+ * Expand a search query with entity aliases.
23
+ *
24
+ * Tokenizes the query, looks up each token in the alias map,
25
+ * and adds expanded terms to the result.
26
+ *
27
+ * Returns deduplicated array of all query terms (original + expansions).
28
+ */
29
+ expandQuery(query: string): Promise<string[]>;
30
+ /** Clear the internal alias cache (useful for testing) */
31
+ clearCache(): void;
32
+ /**
33
+ * Load all aliases from the entity_aliases collection.
34
+ * Builds a map: alias -> [canonical, ...other_aliases_for_same_canonical]
35
+ * Also maps: canonical -> [all its aliases]
36
+ */
37
+ private loadAliases;
38
+ }
39
+ /** Create an AliasExpander for the given adapter */
40
+ export declare function createAliasExpander(adapter: DataAdapter): AliasExpander;
41
+ /**
42
+ * Convenience function: expand a search query with entity aliases.
43
+ *
44
+ * Uses a shared expander per adapter for caching. For repeated calls,
45
+ * prefer creating and reusing an AliasExpander instance directly.
46
+ */
47
+ export declare function expandQueryWithAliases(adapter: DataAdapter, query: string): Promise<string[]>;
48
+ /**
49
+ * Clear all shared alias caches.
50
+ * @deprecated Use AliasExpander class instances with clearCache() instead.
51
+ */
52
+ export declare function clearAliasCache(): void;
53
+ //# sourceMappingURL=alias-expansion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alias-expansion.d.ts","sourceRoot":"","sources":["../../src/search/alias-expansion.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AASvD;;;;;GAKG;AACH,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,cAAc,CAAK;gBAEE,OAAO,EAAE,WAAW;IAEjD;;;;;;;OAOG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBnD,0DAA0D;IAC1D,UAAU,IAAI,IAAI;IAKlB;;;;OAIG;YACW,WAAW;CAqD1B;AAED,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAEvE;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAKnB;AAKD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAKtC"}