@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,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter factory — creates the correct DataAdapter based on configuration.
|
|
3
|
+
*
|
|
4
|
+
* Always wraps the adapter in SchemaMapProxy (transparent if no mappings).
|
|
5
|
+
*/
|
|
6
|
+
import type { Config } from '../config.js';
|
|
7
|
+
import type { DataAdapter } from './types.js';
|
|
8
|
+
export declare function createAdapter(config: Config): DataAdapter;
|
|
9
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/adapter/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAsBzD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter factory — creates the correct DataAdapter based on configuration.
|
|
3
|
+
*
|
|
4
|
+
* Always wraps the adapter in SchemaMapProxy (transparent if no mappings).
|
|
5
|
+
*/
|
|
6
|
+
import { PocketBaseAdapter } from './pocketbase.js';
|
|
7
|
+
import { SupabaseAdapter } from './supabase.js';
|
|
8
|
+
import { SchemaMap, SchemaMapProxy } from './schema-map.js';
|
|
9
|
+
export function createAdapter(config) {
|
|
10
|
+
let adapter;
|
|
11
|
+
if (config.backend === 'pocketbase') {
|
|
12
|
+
adapter = new PocketBaseAdapter(config.pocketbaseUrl, config.pocketbaseAdminEmail, config.pocketbaseAdminPassword);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
adapter = new SupabaseAdapter(config.supabaseUrl, config.supabaseKey);
|
|
16
|
+
}
|
|
17
|
+
const schemaMap = new SchemaMap(config.schemaMap);
|
|
18
|
+
if (!schemaMap.isEmpty) {
|
|
19
|
+
return new SchemaMapProxy(adapter, schemaMap);
|
|
20
|
+
}
|
|
21
|
+
return adapter;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/adapter/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE5D,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,OAAoB,CAAC;IAEzB,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACpC,OAAO,GAAG,IAAI,iBAAiB,CAC7B,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,oBAAoB,EAC3B,MAAM,CAAC,uBAAuB,CAC/B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,IAAI,eAAe,CAC3B,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,CACnB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PocketBase adapter implementation.
|
|
3
|
+
*
|
|
4
|
+
* Authenticates via _superusers collection (admin auth).
|
|
5
|
+
* Translates Filter to PocketBase filter syntax.
|
|
6
|
+
* textSearch falls back to ~ (LIKE) operator on title+content fields.
|
|
7
|
+
*/
|
|
8
|
+
import type { DataAdapter, Filter, ListResult, SortClause, PageOptions } from './types.js';
|
|
9
|
+
export declare class PocketBaseAdapter implements DataAdapter {
|
|
10
|
+
private readonly url;
|
|
11
|
+
private readonly adminEmail;
|
|
12
|
+
private readonly adminPassword;
|
|
13
|
+
readonly backend: "pocketbase";
|
|
14
|
+
private pb;
|
|
15
|
+
private authenticated;
|
|
16
|
+
constructor(url: string, adminEmail: string, adminPassword: string);
|
|
17
|
+
private ensureAuth;
|
|
18
|
+
create<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>): Promise<T>;
|
|
19
|
+
getOne<T extends Record<string, unknown>>(collection: string, id: string): Promise<T>;
|
|
20
|
+
list<T extends Record<string, unknown>>(collection: string, options?: {
|
|
21
|
+
filter?: Filter;
|
|
22
|
+
sort?: SortClause[];
|
|
23
|
+
page?: PageOptions;
|
|
24
|
+
}): Promise<ListResult<T>>;
|
|
25
|
+
textSearch<T extends Record<string, unknown>>(collection: string, query: string, options?: {
|
|
26
|
+
fields?: string[];
|
|
27
|
+
filter?: Filter;
|
|
28
|
+
limit?: number;
|
|
29
|
+
}): Promise<T[]>;
|
|
30
|
+
update<T extends Record<string, unknown>>(collection: string, id: string, data: Record<string, unknown>): Promise<T>;
|
|
31
|
+
delete(collection: string, id: string): Promise<void>;
|
|
32
|
+
upsert<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>, uniqueFields: string[]): Promise<T>;
|
|
33
|
+
count(collection: string, filter?: Filter): Promise<number>;
|
|
34
|
+
collectionExists(collection: string): Promise<boolean>;
|
|
35
|
+
listCollections(): Promise<string[]>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=pocketbase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pocketbase.d.ts","sourceRoot":"","sources":["../../src/adapter/pocketbase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAgB,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzG,qBAAa,iBAAkB,YAAW,WAAW;IAMjD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAPhC,QAAQ,CAAC,OAAO,EAAG,YAAY,CAAU;IACzC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,aAAa,CAAS;gBAGX,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM;YAO1B,UAAU;IAalB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAUP,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,CAAC,CAAC;IAUP,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,EAAE,WAAW,CAAC;KACpB,GACA,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IA2BnB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,CAAC,EAAE,CAAC;IAoCT,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAUP,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,CAAC,CAAC;IAiCP,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc3D,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtD,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAW3C"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PocketBase adapter implementation.
|
|
3
|
+
*
|
|
4
|
+
* Authenticates via _superusers collection (admin auth).
|
|
5
|
+
* Translates Filter to PocketBase filter syntax.
|
|
6
|
+
* textSearch falls back to ~ (LIKE) operator on title+content fields.
|
|
7
|
+
*/
|
|
8
|
+
import PocketBase from 'pocketbase';
|
|
9
|
+
import { AdapterError } from '../errors/adapter-error.js';
|
|
10
|
+
export class PocketBaseAdapter {
|
|
11
|
+
url;
|
|
12
|
+
adminEmail;
|
|
13
|
+
adminPassword;
|
|
14
|
+
backend = 'pocketbase';
|
|
15
|
+
pb;
|
|
16
|
+
authenticated = false;
|
|
17
|
+
constructor(url, adminEmail, adminPassword) {
|
|
18
|
+
this.url = url;
|
|
19
|
+
this.adminEmail = adminEmail;
|
|
20
|
+
this.adminPassword = adminPassword;
|
|
21
|
+
this.pb = new PocketBase(url);
|
|
22
|
+
// Disable auto-cancellation — MCP server handles concurrent requests
|
|
23
|
+
this.pb.autoCancellation(false);
|
|
24
|
+
}
|
|
25
|
+
async ensureAuth() {
|
|
26
|
+
if (this.authenticated && this.pb.authStore.isValid)
|
|
27
|
+
return;
|
|
28
|
+
try {
|
|
29
|
+
await this.pb.collection('_superusers').authWithPassword(this.adminEmail, this.adminPassword);
|
|
30
|
+
this.authenticated = true;
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
throw mapPocketBaseError(err);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async create(collection, data) {
|
|
37
|
+
await this.ensureAuth();
|
|
38
|
+
try {
|
|
39
|
+
const record = await this.pb.collection(collection).create(data);
|
|
40
|
+
return recordToPlain(record);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw mapPocketBaseError(err, collection);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async getOne(collection, id) {
|
|
47
|
+
await this.ensureAuth();
|
|
48
|
+
try {
|
|
49
|
+
const record = await this.pb.collection(collection).getOne(id);
|
|
50
|
+
return recordToPlain(record);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
throw mapPocketBaseError(err, collection);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async list(collection, options) {
|
|
57
|
+
await this.ensureAuth();
|
|
58
|
+
try {
|
|
59
|
+
const perPage = options?.page?.limit ?? 50;
|
|
60
|
+
const offset = options?.page?.offset ?? 0;
|
|
61
|
+
const page = Math.floor(offset / perPage) + 1;
|
|
62
|
+
const pbOptions = {};
|
|
63
|
+
if (options?.filter) {
|
|
64
|
+
pbOptions.filter = filterToPocketBase(options.filter);
|
|
65
|
+
}
|
|
66
|
+
if (options?.sort) {
|
|
67
|
+
pbOptions.sort = sortToPocketBase(options.sort);
|
|
68
|
+
}
|
|
69
|
+
const result = await this.pb.collection(collection).getList(page, perPage, pbOptions);
|
|
70
|
+
return {
|
|
71
|
+
items: result.items.map((r) => recordToPlain(r)),
|
|
72
|
+
totalItems: result.totalItems,
|
|
73
|
+
page: result.page,
|
|
74
|
+
perPage: result.perPage,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
throw mapPocketBaseError(err, collection);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async textSearch(collection, query, options) {
|
|
82
|
+
await this.ensureAuth();
|
|
83
|
+
try {
|
|
84
|
+
const fields = options?.fields ?? ['title', 'content'];
|
|
85
|
+
const limit = options?.limit ?? 20;
|
|
86
|
+
// PocketBase LIKE search: field ~ 'value'
|
|
87
|
+
// Sanitize query: strip all PocketBase filter metacharacters to prevent injection
|
|
88
|
+
const sanitized = sanitizePocketBaseValue(query);
|
|
89
|
+
const searchClauses = fields.map((f) => {
|
|
90
|
+
validateFieldName(f);
|
|
91
|
+
return `${f} ~ '${sanitized}'`;
|
|
92
|
+
});
|
|
93
|
+
const searchFilter = `(${searchClauses.join(' || ')})`;
|
|
94
|
+
let fullFilter = searchFilter;
|
|
95
|
+
if (options?.filter) {
|
|
96
|
+
const additionalFilter = filterToPocketBase(options.filter);
|
|
97
|
+
if (additionalFilter) {
|
|
98
|
+
fullFilter = `(${searchFilter}) && (${additionalFilter})`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// PocketBase 0.25+ doesn't allow sorting by system fields (created/updated).
|
|
102
|
+
// Use -id which is monotonically increasing (same effect as -created).
|
|
103
|
+
const result = await this.pb.collection(collection).getList(1, limit, {
|
|
104
|
+
filter: fullFilter,
|
|
105
|
+
sort: '-id',
|
|
106
|
+
});
|
|
107
|
+
return result.items.map((r) => recordToPlain(r));
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
throw mapPocketBaseError(err, collection);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async update(collection, id, data) {
|
|
114
|
+
await this.ensureAuth();
|
|
115
|
+
try {
|
|
116
|
+
const record = await this.pb.collection(collection).update(id, data);
|
|
117
|
+
return recordToPlain(record);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
throw mapPocketBaseError(err, collection);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async delete(collection, id) {
|
|
124
|
+
await this.ensureAuth();
|
|
125
|
+
try {
|
|
126
|
+
await this.pb.collection(collection).delete(id);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
throw mapPocketBaseError(err, collection);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async upsert(collection, data, uniqueFields) {
|
|
133
|
+
await this.ensureAuth();
|
|
134
|
+
try {
|
|
135
|
+
// Build filter from unique fields — use sanitized values to prevent injection
|
|
136
|
+
const clauses = uniqueFields.map((field) => {
|
|
137
|
+
validateFieldName(field);
|
|
138
|
+
const value = data[field];
|
|
139
|
+
if (typeof value === 'string') {
|
|
140
|
+
return `${field} = '${sanitizePocketBaseValue(value)}'`;
|
|
141
|
+
}
|
|
142
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
143
|
+
return `${field} = ${value}`;
|
|
144
|
+
}
|
|
145
|
+
return `${field} = '${sanitizePocketBaseValue(String(value ?? ''))}'`;
|
|
146
|
+
});
|
|
147
|
+
const filter = clauses.join(' && ');
|
|
148
|
+
// Try to find existing
|
|
149
|
+
const result = await this.pb.collection(collection).getList(1, 1, { filter });
|
|
150
|
+
if (result.items.length > 0) {
|
|
151
|
+
const existing = result.items[0];
|
|
152
|
+
const updated = await this.pb.collection(collection).update(existing.id, data);
|
|
153
|
+
return recordToPlain(updated);
|
|
154
|
+
}
|
|
155
|
+
// Create new
|
|
156
|
+
const created = await this.pb.collection(collection).create(data);
|
|
157
|
+
return recordToPlain(created);
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
throw mapPocketBaseError(err, collection);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async count(collection, filter) {
|
|
164
|
+
await this.ensureAuth();
|
|
165
|
+
try {
|
|
166
|
+
const pbOptions = {};
|
|
167
|
+
if (filter) {
|
|
168
|
+
pbOptions.filter = filterToPocketBase(filter);
|
|
169
|
+
}
|
|
170
|
+
const result = await this.pb.collection(collection).getList(1, 1, pbOptions);
|
|
171
|
+
return result.totalItems;
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
throw mapPocketBaseError(err, collection);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async collectionExists(collection) {
|
|
178
|
+
await this.ensureAuth();
|
|
179
|
+
try {
|
|
180
|
+
// Try listing 0 items — if collection doesn't exist, PB throws
|
|
181
|
+
await this.pb.collection(collection).getList(1, 1);
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async listCollections() {
|
|
189
|
+
await this.ensureAuth();
|
|
190
|
+
try {
|
|
191
|
+
const collections = await this.pb.collections.getFullList();
|
|
192
|
+
return collections
|
|
193
|
+
.map((c) => c.name)
|
|
194
|
+
.filter((name) => !name.startsWith('_'));
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
throw mapPocketBaseError(err);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Convert a PocketBase record object to a plain object.
|
|
203
|
+
* PocketBase uses 'created'/'updated' instead of 'created_at'/'updated_at'.
|
|
204
|
+
*/
|
|
205
|
+
function recordToPlain(record) {
|
|
206
|
+
const plain = {};
|
|
207
|
+
for (const [key, value] of Object.entries(record)) {
|
|
208
|
+
if (key === 'collectionId' || key === 'collectionName' || key === 'expand')
|
|
209
|
+
continue;
|
|
210
|
+
// Map PocketBase field names to our standard names
|
|
211
|
+
if (key === 'created') {
|
|
212
|
+
plain['created_at'] = value;
|
|
213
|
+
}
|
|
214
|
+
else if (key === 'updated') {
|
|
215
|
+
plain['updated_at'] = value;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
plain[key] = value;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return plain;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Convert Filter (OR-of-AND groups) to PocketBase filter string.
|
|
225
|
+
*/
|
|
226
|
+
function filterToPocketBase(filter) {
|
|
227
|
+
if (filter.length === 0)
|
|
228
|
+
return '';
|
|
229
|
+
const orGroups = filter.map((andGroup) => {
|
|
230
|
+
const andClauses = andGroup.map(clauseToPocketBase);
|
|
231
|
+
return andClauses.length === 1 ? andClauses[0] : `(${andClauses.join(' && ')})`;
|
|
232
|
+
});
|
|
233
|
+
return orGroups.length === 1 ? orGroups[0] : `(${orGroups.join(' || ')})`;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Sanitize a string value for use in PocketBase filter expressions.
|
|
237
|
+
* Strips/escapes all PocketBase filter metacharacters to prevent injection.
|
|
238
|
+
*/
|
|
239
|
+
function sanitizePocketBaseValue(value) {
|
|
240
|
+
// Escape single quotes (PocketBase string delimiter)
|
|
241
|
+
let sanitized = value.replace(/'/g, "\\'");
|
|
242
|
+
// Remove characters that could alter filter logic
|
|
243
|
+
// PocketBase filter syntax: &&, ||, ~, !, =, !=, >, <, >=, <=, (, )
|
|
244
|
+
// We only need to worry about these OUTSIDE of quoted strings
|
|
245
|
+
// Since we always wrap in quotes, just escaping ' is sufficient IF we also
|
|
246
|
+
// strip any unmatched quotes. But to be safe, also strip backslash sequences
|
|
247
|
+
// that could escape our closing quote.
|
|
248
|
+
sanitized = sanitized.replace(/\\/g, '\\\\');
|
|
249
|
+
return sanitized;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Validate a field name contains only safe characters (alphanumeric + underscore).
|
|
253
|
+
* Prevents filter injection via field names.
|
|
254
|
+
*/
|
|
255
|
+
function validateFieldName(field) {
|
|
256
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(field)) {
|
|
257
|
+
throw new AdapterError('VALIDATION_ERROR', `Invalid field name: ${field}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function clauseToPocketBase(clause) {
|
|
261
|
+
const { field, op, value } = clause;
|
|
262
|
+
validateFieldName(field);
|
|
263
|
+
const formatValue = (v) => {
|
|
264
|
+
if (v === null)
|
|
265
|
+
return 'null';
|
|
266
|
+
if (typeof v === 'string')
|
|
267
|
+
return `'${sanitizePocketBaseValue(v)}'`;
|
|
268
|
+
if (typeof v === 'boolean')
|
|
269
|
+
return v ? 'true' : 'false';
|
|
270
|
+
return String(v);
|
|
271
|
+
};
|
|
272
|
+
switch (op) {
|
|
273
|
+
case 'eq':
|
|
274
|
+
return `${field} = ${formatValue(value)}`;
|
|
275
|
+
case 'neq':
|
|
276
|
+
return `${field} != ${formatValue(value)}`;
|
|
277
|
+
case 'gt':
|
|
278
|
+
return `${field} > ${formatValue(value)}`;
|
|
279
|
+
case 'gte':
|
|
280
|
+
return `${field} >= ${formatValue(value)}`;
|
|
281
|
+
case 'lt':
|
|
282
|
+
return `${field} < ${formatValue(value)}`;
|
|
283
|
+
case 'lte':
|
|
284
|
+
return `${field} <= ${formatValue(value)}`;
|
|
285
|
+
case 'like':
|
|
286
|
+
return `${field} ~ ${formatValue(value)}`;
|
|
287
|
+
case 'in': {
|
|
288
|
+
const arr = value;
|
|
289
|
+
const formatted = arr.map((v) => `'${sanitizePocketBaseValue(v)}'`).join(',');
|
|
290
|
+
return `${field} ?= ${formatted}`;
|
|
291
|
+
}
|
|
292
|
+
case 'contains':
|
|
293
|
+
return `${field} ~ ${formatValue(value)}`;
|
|
294
|
+
default:
|
|
295
|
+
return `${field} = ${formatValue(value)}`;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function sortToPocketBase(sorts) {
|
|
299
|
+
return sorts
|
|
300
|
+
.map((s) => {
|
|
301
|
+
// PocketBase 0.25+ doesn't allow sorting by system fields (created/updated).
|
|
302
|
+
// Map created_at/updated_at to user-sortable alternatives.
|
|
303
|
+
let field = s.field;
|
|
304
|
+
if (field === 'created_at' || field === 'created')
|
|
305
|
+
field = 'id'; // id is monotonically increasing
|
|
306
|
+
if (field === 'updated_at' || field === 'updated')
|
|
307
|
+
field = 'id';
|
|
308
|
+
return s.direction === 'desc' ? `-${field}` : `+${field}`;
|
|
309
|
+
})
|
|
310
|
+
.join(',');
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Map PocketBase errors to AdapterError codes.
|
|
314
|
+
*/
|
|
315
|
+
function mapPocketBaseError(err, collection) {
|
|
316
|
+
if (err instanceof AdapterError)
|
|
317
|
+
return err;
|
|
318
|
+
const pbErr = err;
|
|
319
|
+
const status = pbErr.status ?? pbErr.response?.code;
|
|
320
|
+
const message = pbErr.response?.message ?? pbErr.message ?? 'Unknown PocketBase error';
|
|
321
|
+
if (status === 404) {
|
|
322
|
+
// Could be collection not found or record not found
|
|
323
|
+
if (message.includes('missing collection') || message.includes('Missing collection')) {
|
|
324
|
+
return new AdapterError('COLLECTION_NOT_FOUND', `Collection '${collection ?? 'unknown'}' not found`);
|
|
325
|
+
}
|
|
326
|
+
return new AdapterError('RECORD_NOT_FOUND', `Record not found in '${collection ?? 'unknown'}'`);
|
|
327
|
+
}
|
|
328
|
+
if (status === 400) {
|
|
329
|
+
if (pbErr.response?.data) {
|
|
330
|
+
// Check for unique constraint
|
|
331
|
+
const data = pbErr.response.data;
|
|
332
|
+
for (const val of Object.values(data)) {
|
|
333
|
+
const fieldErr = val;
|
|
334
|
+
if (fieldErr.code === 'validation_not_unique') {
|
|
335
|
+
return new AdapterError('UNIQUE_VIOLATION', message);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return new AdapterError('VALIDATION_ERROR', message);
|
|
340
|
+
}
|
|
341
|
+
if (status === 401 || status === 403) {
|
|
342
|
+
return new AdapterError('AUTH_ERROR', message);
|
|
343
|
+
}
|
|
344
|
+
// Connection errors
|
|
345
|
+
if (err instanceof TypeError && err.message.includes('fetch')) {
|
|
346
|
+
return new AdapterError('CONNECTION_ERROR', `Cannot connect to PocketBase at ${collection ?? 'unknown URL'}`);
|
|
347
|
+
}
|
|
348
|
+
return new AdapterError('UNKNOWN', message);
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=pocketbase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pocketbase.js","sourceRoot":"","sources":["../../src/adapter/pocketbase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema mapping — translates logical collection names to actual backend names.
|
|
3
|
+
*
|
|
4
|
+
* SchemaMap: holds the mapping table.
|
|
5
|
+
* SchemaMapProxy: wraps any DataAdapter, remapping collection names transparently.
|
|
6
|
+
*
|
|
7
|
+
* Example: SB_SCHEMA_MAP='{"knowledge":"sb_knowledge","sessions":"sb_sessions"}'
|
|
8
|
+
* Tools call adapter.create('knowledge', ...) and it becomes adapter.create('sb_knowledge', ...)
|
|
9
|
+
*/
|
|
10
|
+
import type { DataAdapter, Filter, ListResult, SortClause, PageOptions } from './types.js';
|
|
11
|
+
export declare class SchemaMap {
|
|
12
|
+
private readonly map;
|
|
13
|
+
private readonly reverseMap;
|
|
14
|
+
constructor(mapping: Record<string, string>);
|
|
15
|
+
/** Translate logical name to actual backend name */
|
|
16
|
+
resolve(logicalName: string): string;
|
|
17
|
+
/** Translate actual backend name back to logical name */
|
|
18
|
+
unresolve(actualName: string): string;
|
|
19
|
+
get isEmpty(): boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class SchemaMapProxy implements DataAdapter {
|
|
22
|
+
private readonly inner;
|
|
23
|
+
private readonly schema;
|
|
24
|
+
constructor(inner: DataAdapter, schema: SchemaMap);
|
|
25
|
+
get backend(): 'pocketbase' | 'supabase';
|
|
26
|
+
create<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>): Promise<T>;
|
|
27
|
+
getOne<T extends Record<string, unknown>>(collection: string, id: string): Promise<T>;
|
|
28
|
+
list<T extends Record<string, unknown>>(collection: string, options?: {
|
|
29
|
+
filter?: Filter;
|
|
30
|
+
sort?: SortClause[];
|
|
31
|
+
page?: PageOptions;
|
|
32
|
+
}): Promise<ListResult<T>>;
|
|
33
|
+
textSearch<T extends Record<string, unknown>>(collection: string, query: string, options?: {
|
|
34
|
+
fields?: string[];
|
|
35
|
+
filter?: Filter;
|
|
36
|
+
limit?: number;
|
|
37
|
+
}): Promise<T[]>;
|
|
38
|
+
update<T extends Record<string, unknown>>(collection: string, id: string, data: Record<string, unknown>): Promise<T>;
|
|
39
|
+
delete(collection: string, id: string): Promise<void>;
|
|
40
|
+
upsert<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>, uniqueFields: string[]): Promise<T>;
|
|
41
|
+
count(collection: string, filter?: Filter): Promise<number>;
|
|
42
|
+
collectionExists(collection: string): Promise<boolean>;
|
|
43
|
+
listCollections(): Promise<string[]>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=schema-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-map.d.ts","sourceRoot":"","sources":["../../src/adapter/schema-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3F,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;gBAE7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAS3C,oDAAoD;IACpD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIpC,yDAAyD;IACzD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIrC,IAAI,OAAO,IAAI,OAAO,CAErB;CACF;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS;IAKjD,IAAI,OAAO,IAAI,YAAY,GAAG,UAAU,CAEvC;IAEK,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAIP,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,CAAC,CAAC;IAIP,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,EAAE,WAAW,CAAC;KACpB,GACA,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAInB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,CAAC,EAAE,CAAC;IAIT,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAIP,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,CAAC,CAAC;IAIP,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAI3C"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema mapping — translates logical collection names to actual backend names.
|
|
3
|
+
*
|
|
4
|
+
* SchemaMap: holds the mapping table.
|
|
5
|
+
* SchemaMapProxy: wraps any DataAdapter, remapping collection names transparently.
|
|
6
|
+
*
|
|
7
|
+
* Example: SB_SCHEMA_MAP='{"knowledge":"sb_knowledge","sessions":"sb_sessions"}'
|
|
8
|
+
* Tools call adapter.create('knowledge', ...) and it becomes adapter.create('sb_knowledge', ...)
|
|
9
|
+
*/
|
|
10
|
+
export class SchemaMap {
|
|
11
|
+
map;
|
|
12
|
+
reverseMap;
|
|
13
|
+
constructor(mapping) {
|
|
14
|
+
this.map = new Map(Object.entries(mapping));
|
|
15
|
+
const reverse = new Map();
|
|
16
|
+
for (const [logical, actual] of this.map) {
|
|
17
|
+
reverse.set(actual, logical);
|
|
18
|
+
}
|
|
19
|
+
this.reverseMap = reverse;
|
|
20
|
+
}
|
|
21
|
+
/** Translate logical name to actual backend name */
|
|
22
|
+
resolve(logicalName) {
|
|
23
|
+
return this.map.get(logicalName) ?? logicalName;
|
|
24
|
+
}
|
|
25
|
+
/** Translate actual backend name back to logical name */
|
|
26
|
+
unresolve(actualName) {
|
|
27
|
+
return this.reverseMap.get(actualName) ?? actualName;
|
|
28
|
+
}
|
|
29
|
+
get isEmpty() {
|
|
30
|
+
return this.map.size === 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class SchemaMapProxy {
|
|
34
|
+
inner;
|
|
35
|
+
schema;
|
|
36
|
+
constructor(inner, schema) {
|
|
37
|
+
this.inner = inner;
|
|
38
|
+
this.schema = schema;
|
|
39
|
+
}
|
|
40
|
+
get backend() {
|
|
41
|
+
return this.inner.backend;
|
|
42
|
+
}
|
|
43
|
+
async create(collection, data) {
|
|
44
|
+
return this.inner.create(this.schema.resolve(collection), data);
|
|
45
|
+
}
|
|
46
|
+
async getOne(collection, id) {
|
|
47
|
+
return this.inner.getOne(this.schema.resolve(collection), id);
|
|
48
|
+
}
|
|
49
|
+
async list(collection, options) {
|
|
50
|
+
return this.inner.list(this.schema.resolve(collection), options);
|
|
51
|
+
}
|
|
52
|
+
async textSearch(collection, query, options) {
|
|
53
|
+
return this.inner.textSearch(this.schema.resolve(collection), query, options);
|
|
54
|
+
}
|
|
55
|
+
async update(collection, id, data) {
|
|
56
|
+
return this.inner.update(this.schema.resolve(collection), id, data);
|
|
57
|
+
}
|
|
58
|
+
async delete(collection, id) {
|
|
59
|
+
return this.inner.delete(this.schema.resolve(collection), id);
|
|
60
|
+
}
|
|
61
|
+
async upsert(collection, data, uniqueFields) {
|
|
62
|
+
return this.inner.upsert(this.schema.resolve(collection), data, uniqueFields);
|
|
63
|
+
}
|
|
64
|
+
async count(collection, filter) {
|
|
65
|
+
return this.inner.count(this.schema.resolve(collection), filter);
|
|
66
|
+
}
|
|
67
|
+
async collectionExists(collection) {
|
|
68
|
+
return this.inner.collectionExists(this.schema.resolve(collection));
|
|
69
|
+
}
|
|
70
|
+
async listCollections() {
|
|
71
|
+
const collections = await this.inner.listCollections();
|
|
72
|
+
return collections.map((name) => this.schema.unresolve(name));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=schema-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-map.js","sourceRoot":"","sources":["../../src/adapter/schema-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 type { DataAdapter, Filter, ListResult, SortClause, PageOptions } from './types.js';
|
|
9
|
+
export declare class SupabaseAdapter implements DataAdapter {
|
|
10
|
+
readonly backend: "supabase";
|
|
11
|
+
private client;
|
|
12
|
+
constructor(url: string, key: string);
|
|
13
|
+
create<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>): Promise<T>;
|
|
14
|
+
getOne<T extends Record<string, unknown>>(collection: string, id: string): Promise<T>;
|
|
15
|
+
list<T extends Record<string, unknown>>(collection: string, options?: {
|
|
16
|
+
filter?: Filter;
|
|
17
|
+
sort?: SortClause[];
|
|
18
|
+
page?: PageOptions;
|
|
19
|
+
}): Promise<ListResult<T>>;
|
|
20
|
+
textSearch<T extends Record<string, unknown>>(collection: string, query: string, options?: {
|
|
21
|
+
fields?: string[];
|
|
22
|
+
filter?: Filter;
|
|
23
|
+
limit?: number;
|
|
24
|
+
}): Promise<T[]>;
|
|
25
|
+
update<T extends Record<string, unknown>>(collection: string, id: string, data: Record<string, unknown>): Promise<T>;
|
|
26
|
+
delete(collection: string, id: string): Promise<void>;
|
|
27
|
+
upsert<T extends Record<string, unknown>>(collection: string, data: Record<string, unknown>, uniqueFields: string[]): Promise<T>;
|
|
28
|
+
count(collection: string, filter?: Filter): Promise<number>;
|
|
29
|
+
collectionExists(collection: string): Promise<boolean>;
|
|
30
|
+
listCollections(): Promise<string[]>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/adapter/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAgB,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzG,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,OAAO,EAAG,UAAU,CAAU;IACvC,OAAO,CAAC,MAAM,CAAiB;gBAEnB,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAI9B,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAWP,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,CAAC,CAAC;IAWP,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,EAAE,WAAW,CAAC;KACpB,GACA,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IA4BnB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,CAAC,EAAE,CAAC;IA2CT,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAYP,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,CAAC,CAAC;IAsBP,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3D,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBtD,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAmB3C"}
|