@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.
- package/dist/adapter/factory.d.ts +9 -0
- package/dist/adapter/factory.d.ts.map +1 -0
- package/dist/adapter/factory.js +23 -0
- package/dist/adapter/factory.js.map +1 -0
- package/dist/adapter/pocketbase.d.ts +37 -0
- package/dist/adapter/pocketbase.d.ts.map +1 -0
- package/dist/adapter/pocketbase.js +350 -0
- package/dist/adapter/pocketbase.js.map +1 -0
- package/dist/adapter/schema-map.d.ts +45 -0
- package/dist/adapter/schema-map.d.ts.map +1 -0
- package/dist/adapter/schema-map.js +75 -0
- package/dist/adapter/schema-map.js.map +1 -0
- package/dist/adapter/supabase.d.ts +32 -0
- package/dist/adapter/supabase.d.ts.map +1 -0
- package/dist/adapter/supabase.js +294 -0
- package/dist/adapter/supabase.js.map +1 -0
- package/dist/adapter/types.d.ts +67 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +9 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +62 -0
- package/dist/config.js.map +1 -0
- package/dist/errors/adapter-error.d.ts +12 -0
- package/dist/errors/adapter-error.d.ts.map +1 -0
- package/dist/errors/adapter-error.js +15 -0
- package/dist/errors/adapter-error.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/search/alias-expansion.d.ts +53 -0
- package/dist/search/alias-expansion.d.ts.map +1 -0
- package/dist/search/alias-expansion.js +131 -0
- package/dist/search/alias-expansion.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +40 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/business/blog-create.d.ts +9 -0
- package/dist/tools/business/blog-create.d.ts.map +1 -0
- package/dist/tools/business/blog-create.js +53 -0
- package/dist/tools/business/blog-create.js.map +1 -0
- package/dist/tools/business/blog-delete.d.ts +9 -0
- package/dist/tools/business/blog-delete.d.ts.map +1 -0
- package/dist/tools/business/blog-delete.js +29 -0
- package/dist/tools/business/blog-delete.js.map +1 -0
- package/dist/tools/business/blog-list.d.ts +9 -0
- package/dist/tools/business/blog-list.d.ts.map +1 -0
- package/dist/tools/business/blog-list.js +37 -0
- package/dist/tools/business/blog-list.js.map +1 -0
- package/dist/tools/business/blog-update.d.ts +9 -0
- package/dist/tools/business/blog-update.d.ts.map +1 -0
- package/dist/tools/business/blog-update.js +66 -0
- package/dist/tools/business/blog-update.js.map +1 -0
- package/dist/tools/business/content-queue-add.d.ts +9 -0
- package/dist/tools/business/content-queue-add.d.ts.map +1 -0
- package/dist/tools/business/content-queue-add.js +40 -0
- package/dist/tools/business/content-queue-add.js.map +1 -0
- package/dist/tools/business/content-queue-list.d.ts +9 -0
- package/dist/tools/business/content-queue-list.d.ts.map +1 -0
- package/dist/tools/business/content-queue-list.js +41 -0
- package/dist/tools/business/content-queue-list.js.map +1 -0
- package/dist/tools/business/email-queue-add.d.ts +9 -0
- package/dist/tools/business/email-queue-add.d.ts.map +1 -0
- package/dist/tools/business/email-queue-add.js +47 -0
- package/dist/tools/business/email-queue-add.js.map +1 -0
- package/dist/tools/business/prospect-create.d.ts +9 -0
- package/dist/tools/business/prospect-create.d.ts.map +1 -0
- package/dist/tools/business/prospect-create.js +50 -0
- package/dist/tools/business/prospect-create.js.map +1 -0
- package/dist/tools/business/prospect-list.d.ts +9 -0
- package/dist/tools/business/prospect-list.d.ts.map +1 -0
- package/dist/tools/business/prospect-list.js +37 -0
- package/dist/tools/business/prospect-list.js.map +1 -0
- package/dist/tools/business/prospect-search.d.ts +9 -0
- package/dist/tools/business/prospect-search.d.ts.map +1 -0
- package/dist/tools/business/prospect-search.js +29 -0
- package/dist/tools/business/prospect-search.js.map +1 -0
- package/dist/tools/business/prospect-update.d.ts +9 -0
- package/dist/tools/business/prospect-update.d.ts.map +1 -0
- package/dist/tools/business/prospect-update.js +68 -0
- package/dist/tools/business/prospect-update.js.map +1 -0
- package/dist/tools/memory/brain-decay.d.ts +11 -0
- package/dist/tools/memory/brain-decay.d.ts.map +1 -0
- package/dist/tools/memory/brain-decay.js +58 -0
- package/dist/tools/memory/brain-decay.js.map +1 -0
- package/dist/tools/memory/brain-stats.d.ts +11 -0
- package/dist/tools/memory/brain-stats.d.ts.map +1 -0
- package/dist/tools/memory/brain-stats.js +63 -0
- package/dist/tools/memory/brain-stats.js.map +1 -0
- package/dist/tools/memory/contact-create.d.ts +9 -0
- package/dist/tools/memory/contact-create.d.ts.map +1 -0
- package/dist/tools/memory/contact-create.js +42 -0
- package/dist/tools/memory/contact-create.js.map +1 -0
- package/dist/tools/memory/contact-list.d.ts +9 -0
- package/dist/tools/memory/contact-list.d.ts.map +1 -0
- package/dist/tools/memory/contact-list.js +30 -0
- package/dist/tools/memory/contact-list.js.map +1 -0
- package/dist/tools/memory/contact-search.d.ts +9 -0
- package/dist/tools/memory/contact-search.d.ts.map +1 -0
- package/dist/tools/memory/contact-search.js +29 -0
- package/dist/tools/memory/contact-search.js.map +1 -0
- package/dist/tools/memory/contact-update.d.ts +9 -0
- package/dist/tools/memory/contact-update.d.ts.map +1 -0
- package/dist/tools/memory/contact-update.js +59 -0
- package/dist/tools/memory/contact-update.js.map +1 -0
- package/dist/tools/memory/goal-create.d.ts +9 -0
- package/dist/tools/memory/goal-create.d.ts.map +1 -0
- package/dist/tools/memory/goal-create.js +40 -0
- package/dist/tools/memory/goal-create.js.map +1 -0
- package/dist/tools/memory/goal-list.d.ts +9 -0
- package/dist/tools/memory/goal-list.d.ts.map +1 -0
- package/dist/tools/memory/goal-list.js +41 -0
- package/dist/tools/memory/goal-list.js.map +1 -0
- package/dist/tools/memory/goal-update.d.ts +9 -0
- package/dist/tools/memory/goal-update.d.ts.map +1 -0
- package/dist/tools/memory/goal-update.js +51 -0
- package/dist/tools/memory/goal-update.js.map +1 -0
- package/dist/tools/memory/knowledge-decide.d.ts +10 -0
- package/dist/tools/memory/knowledge-decide.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-decide.js +39 -0
- package/dist/tools/memory/knowledge-decide.js.map +1 -0
- package/dist/tools/memory/knowledge-delete.d.ts +10 -0
- package/dist/tools/memory/knowledge-delete.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-delete.js +33 -0
- package/dist/tools/memory/knowledge-delete.js.map +1 -0
- package/dist/tools/memory/knowledge-learn.d.ts +10 -0
- package/dist/tools/memory/knowledge-learn.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-learn.js +39 -0
- package/dist/tools/memory/knowledge-learn.js.map +1 -0
- package/dist/tools/memory/knowledge-list.d.ts +9 -0
- package/dist/tools/memory/knowledge-list.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-list.js +43 -0
- package/dist/tools/memory/knowledge-list.js.map +1 -0
- package/dist/tools/memory/knowledge-recall.d.ts +11 -0
- package/dist/tools/memory/knowledge-recall.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-recall.js +79 -0
- package/dist/tools/memory/knowledge-recall.js.map +1 -0
- package/dist/tools/memory/knowledge-store.d.ts +10 -0
- package/dist/tools/memory/knowledge-store.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-store.js +56 -0
- package/dist/tools/memory/knowledge-store.js.map +1 -0
- package/dist/tools/memory/knowledge-update.d.ts +10 -0
- package/dist/tools/memory/knowledge-update.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-update.js +50 -0
- package/dist/tools/memory/knowledge-update.js.map +1 -0
- package/dist/tools/memory/knowledge-validate.d.ts +10 -0
- package/dist/tools/memory/knowledge-validate.d.ts.map +1 -0
- package/dist/tools/memory/knowledge-validate.js +40 -0
- package/dist/tools/memory/knowledge-validate.js.map +1 -0
- package/dist/tools/memory/session-list.d.ts +9 -0
- package/dist/tools/memory/session-list.d.ts.map +1 -0
- package/dist/tools/memory/session-list.js +30 -0
- package/dist/tools/memory/session-list.js.map +1 -0
- package/dist/tools/memory/session-log.d.ts +9 -0
- package/dist/tools/memory/session-log.d.ts.map +1 -0
- package/dist/tools/memory/session-log.js +56 -0
- package/dist/tools/memory/session-log.js.map +1 -0
- package/dist/tools/memory/task-create.d.ts +9 -0
- package/dist/tools/memory/task-create.d.ts.map +1 -0
- package/dist/tools/memory/task-create.js +38 -0
- package/dist/tools/memory/task-create.js.map +1 -0
- package/dist/tools/memory/task-list.d.ts +9 -0
- package/dist/tools/memory/task-list.d.ts.map +1 -0
- package/dist/tools/memory/task-list.js +41 -0
- package/dist/tools/memory/task-list.js.map +1 -0
- package/dist/tools/memory/task-update.d.ts +9 -0
- package/dist/tools/memory/task-update.d.ts.map +1 -0
- package/dist/tools/memory/task-update.js +50 -0
- package/dist/tools/memory/task-update.js.map +1 -0
- package/dist/tools/register.d.ts +7 -0
- package/dist/tools/register.d.ts.map +1 -0
- package/dist/tools/register.js +84 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/setup/setup-migrate.d.ts +10 -0
- package/dist/tools/setup/setup-migrate.d.ts.map +1 -0
- package/dist/tools/setup/setup-migrate.js +73 -0
- package/dist/tools/setup/setup-migrate.js.map +1 -0
- package/dist/tools/setup/setup-seed.d.ts +9 -0
- package/dist/tools/setup/setup-seed.d.ts.map +1 -0
- package/dist/tools/setup/setup-seed.js +133 -0
- package/dist/tools/setup/setup-seed.js.map +1 -0
- package/dist/tools/setup/setup-status.d.ts +9 -0
- package/dist/tools/setup/setup-status.d.ts.map +1 -0
- package/dist/tools/setup/setup-status.js +76 -0
- package/dist/tools/setup/setup-status.js.map +1 -0
- package/dist/tools/shared.d.ts +56 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +93 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/types/records.d.ts +163 -0
- package/dist/types/records.d.ts.map +1 -0
- package/dist/types/records.js +8 -0
- package/dist/types/records.js.map +1 -0
- package/migrations/pocketbase/001_core_schema.js +72 -0
- package/migrations/pocketbase/002_goals_tasks.js +49 -0
- package/migrations/pocketbase/003_contacts.js +29 -0
- package/migrations/pocketbase/004_entity_aliases.js +40 -0
- package/migrations/pocketbase/005_prospects.js +33 -0
- package/migrations/pocketbase/006_business.js +80 -0
- package/migrations/pocketbase/007_newsletter_affiliates.js +50 -0
- package/migrations/supabase/001_core_schema.sql +78 -0
- package/migrations/supabase/002_goals_tasks.sql +38 -0
- package/migrations/supabase/003_contacts.sql +27 -0
- package/migrations/supabase/004_entity_aliases.sql +22 -0
- package/migrations/supabase/005_prospects.sql +31 -0
- package/migrations/supabase/006_business.sql +68 -0
- package/migrations/supabase/007_seed_aliases.sql +69 -0
- package/migrations/supabase/008_newsletter_affiliates.sql +39 -0
- package/package.json +48 -0
- 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":"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"}
|
|
@@ -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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|