@jazzmind/busibox-app 3.0.56 → 3.0.57

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 (81) hide show
  1. package/dist/platform/adapters/busibox/ai.d.ts +31 -0
  2. package/dist/platform/adapters/busibox/ai.d.ts.map +1 -0
  3. package/dist/platform/adapters/busibox/ai.js +198 -0
  4. package/dist/platform/adapters/busibox/ai.js.map +1 -0
  5. package/dist/platform/adapters/busibox/auth.d.ts +25 -0
  6. package/dist/platform/adapters/busibox/auth.d.ts.map +1 -0
  7. package/dist/platform/adapters/busibox/auth.js +76 -0
  8. package/dist/platform/adapters/busibox/auth.js.map +1 -0
  9. package/dist/platform/adapters/busibox/data.d.ts +30 -0
  10. package/dist/platform/adapters/busibox/data.d.ts.map +1 -0
  11. package/dist/platform/adapters/busibox/data.js +163 -0
  12. package/dist/platform/adapters/busibox/data.js.map +1 -0
  13. package/dist/platform/adapters/busibox/index.d.ts +36 -0
  14. package/dist/platform/adapters/busibox/index.d.ts.map +1 -0
  15. package/dist/platform/adapters/busibox/index.js +66 -0
  16. package/dist/platform/adapters/busibox/index.js.map +1 -0
  17. package/dist/platform/adapters/busibox/search.d.ts +21 -0
  18. package/dist/platform/adapters/busibox/search.d.ts.map +1 -0
  19. package/dist/platform/adapters/busibox/search.js +62 -0
  20. package/dist/platform/adapters/busibox/search.js.map +1 -0
  21. package/dist/platform/adapters/busibox/storage.d.ts +28 -0
  22. package/dist/platform/adapters/busibox/storage.d.ts.map +1 -0
  23. package/dist/platform/adapters/busibox/storage.js +107 -0
  24. package/dist/platform/adapters/busibox/storage.js.map +1 -0
  25. package/dist/platform/adapters/vercel/ai.d.ts +36 -0
  26. package/dist/platform/adapters/vercel/ai.d.ts.map +1 -0
  27. package/dist/platform/adapters/vercel/ai.js +150 -0
  28. package/dist/platform/adapters/vercel/ai.js.map +1 -0
  29. package/dist/platform/adapters/vercel/auth.d.ts +22 -0
  30. package/dist/platform/adapters/vercel/auth.d.ts.map +1 -0
  31. package/dist/platform/adapters/vercel/auth.js +75 -0
  32. package/dist/platform/adapters/vercel/auth.js.map +1 -0
  33. package/dist/platform/adapters/vercel/data.d.ts +25 -0
  34. package/dist/platform/adapters/vercel/data.d.ts.map +1 -0
  35. package/dist/platform/adapters/vercel/data.js +194 -0
  36. package/dist/platform/adapters/vercel/data.js.map +1 -0
  37. package/dist/platform/adapters/vercel/index.d.ts +43 -0
  38. package/dist/platform/adapters/vercel/index.d.ts.map +1 -0
  39. package/dist/platform/adapters/vercel/index.js +44 -0
  40. package/dist/platform/adapters/vercel/index.js.map +1 -0
  41. package/dist/platform/adapters/vercel/search.d.ts +27 -0
  42. package/dist/platform/adapters/vercel/search.d.ts.map +1 -0
  43. package/dist/platform/adapters/vercel/search.js +140 -0
  44. package/dist/platform/adapters/vercel/search.js.map +1 -0
  45. package/dist/platform/adapters/vercel/storage.d.ts +30 -0
  46. package/dist/platform/adapters/vercel/storage.d.ts.map +1 -0
  47. package/dist/platform/adapters/vercel/storage.js +82 -0
  48. package/dist/platform/adapters/vercel/storage.js.map +1 -0
  49. package/dist/platform/config.d.ts +17 -0
  50. package/dist/platform/config.d.ts.map +1 -0
  51. package/dist/platform/config.js +32 -0
  52. package/dist/platform/config.js.map +1 -0
  53. package/dist/platform/index.d.ts +21 -0
  54. package/dist/platform/index.d.ts.map +1 -0
  55. package/dist/platform/index.js +41 -0
  56. package/dist/platform/index.js.map +1 -0
  57. package/dist/platform/interfaces/ai.d.ts +74 -0
  58. package/dist/platform/interfaces/ai.d.ts.map +1 -0
  59. package/dist/platform/interfaces/ai.js +2 -0
  60. package/dist/platform/interfaces/ai.js.map +1 -0
  61. package/dist/platform/interfaces/auth.d.ts +21 -0
  62. package/dist/platform/interfaces/auth.d.ts.map +1 -0
  63. package/dist/platform/interfaces/auth.js +2 -0
  64. package/dist/platform/interfaces/auth.js.map +1 -0
  65. package/dist/platform/interfaces/data.d.ts +49 -0
  66. package/dist/platform/interfaces/data.d.ts.map +1 -0
  67. package/dist/platform/interfaces/data.js +2 -0
  68. package/dist/platform/interfaces/data.js.map +1 -0
  69. package/dist/platform/interfaces/index.d.ts +6 -0
  70. package/dist/platform/interfaces/index.d.ts.map +1 -0
  71. package/dist/platform/interfaces/index.js +2 -0
  72. package/dist/platform/interfaces/index.js.map +1 -0
  73. package/dist/platform/interfaces/search.d.ts +19 -0
  74. package/dist/platform/interfaces/search.d.ts.map +1 -0
  75. package/dist/platform/interfaces/search.js +2 -0
  76. package/dist/platform/interfaces/search.js.map +1 -0
  77. package/dist/platform/interfaces/storage.d.ts +25 -0
  78. package/dist/platform/interfaces/storage.d.ts.map +1 -0
  79. package/dist/platform/interfaces/storage.js +2 -0
  80. package/dist/platform/interfaces/storage.js.map +1 -0
  81. package/package.json +59 -4
@@ -0,0 +1,25 @@
1
+ import type { DataAdapter, Filter, CollectionSchema, QueryResult, SortField } from '../../interfaces/data';
2
+ interface VercelDataConfig {
3
+ databaseUrl?: string;
4
+ }
5
+ export declare class VercelDataAdapter implements DataAdapter {
6
+ private databaseUrl;
7
+ private _client;
8
+ constructor(config?: VercelDataConfig);
9
+ ensureCollection(collection: string, schema: CollectionSchema): Promise<void>;
10
+ insert(collection: string, records: Record<string, unknown>[]): Promise<string[]>;
11
+ get<T = Record<string, unknown>>(collection: string, id: string): Promise<T | null>;
12
+ query<T = Record<string, unknown>>(collection: string, params?: {
13
+ filters?: Filter[];
14
+ sort?: SortField[];
15
+ limit?: number;
16
+ offset?: number;
17
+ }): Promise<QueryResult<T>>;
18
+ update(collection: string, filters: Filter[], data: Record<string, unknown>): Promise<number>;
19
+ delete(collection: string, filters: Filter[]): Promise<number>;
20
+ transaction<T>(fn: (tx: DataAdapter) => Promise<T>): Promise<T>;
21
+ private getClient;
22
+ private execute;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EAEN,gBAAgB,EAEhB,WAAW,EACX,SAAS,EACV,MAAM,uBAAuB,CAAC;AAG/B,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA0B;gBAE7B,MAAM,GAAE,gBAAqB;IAKnC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7E,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBjF,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAQnF,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GACA,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAmBpB,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC;IAiBZ,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAS9D,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAQvD,SAAS;YAuCT,OAAO;CAItB"}
@@ -0,0 +1,194 @@
1
+ import { randomUUID } from 'crypto';
2
+ export class VercelDataAdapter {
3
+ constructor(config = {}) {
4
+ this._client = null;
5
+ this.databaseUrl =
6
+ config.databaseUrl ?? process.env.DATABASE_URL ?? '';
7
+ }
8
+ async ensureCollection(collection, schema) {
9
+ const sql = buildCreateTableSql(collection, schema);
10
+ await this.execute(sql);
11
+ for (const index of schema.indexes ?? []) {
12
+ const indexName = `${collection}_${index.fields.join('_')}_idx`;
13
+ const unique = index.unique ? 'UNIQUE ' : '';
14
+ await this.execute(`CREATE ${unique}INDEX IF NOT EXISTS "${indexName}" ON "${collection}" (${index.fields.map((f) => `"${f}"`).join(', ')})`);
15
+ }
16
+ }
17
+ async insert(collection, records) {
18
+ const ids = [];
19
+ for (const record of records) {
20
+ const id = record['id'] ?? randomUUID();
21
+ const withId = { ...record, id };
22
+ const keys = Object.keys(withId);
23
+ const placeholders = keys.map((_, i) => `$${i + 1}`).join(', ');
24
+ const values = keys.map((k) => withId[k]);
25
+ const cols = keys.map((k) => `"${k}"`).join(', ');
26
+ await this.execute(`INSERT INTO "${collection}" (${cols}) VALUES (${placeholders})`, values);
27
+ ids.push(id);
28
+ }
29
+ return ids;
30
+ }
31
+ async get(collection, id) {
32
+ const result = await this.execute(`SELECT * FROM "${collection}" WHERE id = $1 LIMIT 1`, [id]);
33
+ return result.rows[0] ?? null;
34
+ }
35
+ async query(collection, params) {
36
+ const { where, values } = buildWhereClause(params?.filters);
37
+ // Count query
38
+ const countSql = `SELECT COUNT(*) as total FROM "${collection}"${where}`;
39
+ const countResult = await this.execute(countSql, values);
40
+ const total = Number(countResult.rows[0]['total'] ?? 0);
41
+ // Data query
42
+ const orderBy = buildOrderBy(params?.sort);
43
+ const limit = params?.limit != null ? ` LIMIT ${params.limit}` : '';
44
+ const offset = params?.offset != null ? ` OFFSET ${params.offset}` : '';
45
+ const dataSql = `SELECT * FROM "${collection}"${where}${orderBy}${limit}${offset}`;
46
+ const dataResult = await this.execute(dataSql, values);
47
+ return { records: dataResult.rows, total };
48
+ }
49
+ async update(collection, filters, data) {
50
+ if (Object.keys(data).length === 0)
51
+ return 0;
52
+ const setKeys = Object.keys(data);
53
+ const setClause = setKeys.map((k, i) => `"${k}" = $${i + 1}`).join(', ');
54
+ const setValues = setKeys.map((k) => data[k]);
55
+ const { where, values: filterValues } = buildWhereClause(filters, setValues.length);
56
+ const result = await this.execute(`UPDATE "${collection}" SET ${setClause}${where}`, [...setValues, ...filterValues]);
57
+ return result.rowCount;
58
+ }
59
+ async delete(collection, filters) {
60
+ const { where, values } = buildWhereClause(filters);
61
+ const result = await this.execute(`DELETE FROM "${collection}"${where}`, values);
62
+ return result.rowCount;
63
+ }
64
+ async transaction(fn) {
65
+ // For Neon serverless, we run in a single query context
66
+ // For now, delegate to the same adapter (full transaction support requires connection pooling)
67
+ return fn(this);
68
+ }
69
+ // --- Private helpers ---
70
+ async getClient() {
71
+ if (this._client)
72
+ return this._client;
73
+ try {
74
+ const { neon } = await import('@neondatabase/serverless');
75
+ const sql = neon(this.databaseUrl);
76
+ // Wrap neon tagged-template SQL client into a query(sql, params) interface.
77
+ // Neon supports (text, params) call form even though TS types only expose tagged template.
78
+ const sqlFn = sql;
79
+ this._client = {
80
+ async query(statement, params = []) {
81
+ const result = await sqlFn(statement, params);
82
+ const rows = Array.isArray(result) ? result : [];
83
+ return {
84
+ rows: rows,
85
+ rowCount: rows.length,
86
+ };
87
+ },
88
+ async end() { },
89
+ };
90
+ return this._client;
91
+ }
92
+ catch {
93
+ // Fall back to pg if neon is not available
94
+ try {
95
+ const { Client } = await import('pg');
96
+ const client = new Client({ connectionString: this.databaseUrl });
97
+ await client.connect();
98
+ this._client = client;
99
+ return this._client;
100
+ }
101
+ catch {
102
+ throw new Error('Vercel data adapter requires "@neondatabase/serverless" or "pg". ' +
103
+ 'Run: pnpm add @neondatabase/serverless');
104
+ }
105
+ }
106
+ }
107
+ async execute(sql, params = []) {
108
+ const client = await this.getClient();
109
+ return client.query(sql, params);
110
+ }
111
+ }
112
+ // --- SQL builders ---
113
+ function buildCreateTableSql(collection, schema) {
114
+ const cols = schema.fields.map((f) => fieldToSql(f)).join(',\n ');
115
+ return `CREATE TABLE IF NOT EXISTS "${collection}" (\n ${cols}\n)`;
116
+ }
117
+ function fieldToSql(field) {
118
+ const type = pgType(field.type);
119
+ const parts = [`"${field.name}" ${type}`];
120
+ if (field.primaryKey)
121
+ parts.push('PRIMARY KEY');
122
+ if (!field.nullable && !field.primaryKey)
123
+ parts.push('NOT NULL');
124
+ if (field.unique && !field.primaryKey)
125
+ parts.push('UNIQUE');
126
+ if (field.default !== undefined) {
127
+ parts.push(`DEFAULT ${pgDefault(field.default, field.type)}`);
128
+ }
129
+ return parts.join(' ');
130
+ }
131
+ function pgType(type) {
132
+ switch (type) {
133
+ case 'text': return 'TEXT';
134
+ case 'integer': return 'INTEGER';
135
+ case 'float': return 'DOUBLE PRECISION';
136
+ case 'boolean': return 'BOOLEAN';
137
+ case 'timestamp': return 'TIMESTAMPTZ';
138
+ case 'json': return 'JSONB';
139
+ case 'uuid': return 'UUID';
140
+ default: return 'TEXT';
141
+ }
142
+ }
143
+ function pgDefault(value, type) {
144
+ if (value === 'now()' || value === 'CURRENT_TIMESTAMP')
145
+ return 'NOW()';
146
+ if (type === 'uuid' && value === 'gen_random_uuid()')
147
+ return 'gen_random_uuid()';
148
+ if (typeof value === 'string')
149
+ return `'${value}'`;
150
+ if (typeof value === 'boolean')
151
+ return value ? 'TRUE' : 'FALSE';
152
+ return String(value);
153
+ }
154
+ const OP_SQL = {
155
+ eq: '=',
156
+ neq: '!=',
157
+ gt: '>',
158
+ gte: '>=',
159
+ lt: '<',
160
+ lte: '<=',
161
+ in: 'IN',
162
+ contains: 'LIKE',
163
+ startsWith: 'LIKE',
164
+ };
165
+ function buildWhereClause(filters, paramOffset = 0) {
166
+ if (!filters?.length)
167
+ return { where: '', values: [] };
168
+ const values = [];
169
+ const conditions = filters.map((f) => {
170
+ paramOffset++;
171
+ if (f.op === 'in') {
172
+ values.push(f.value);
173
+ return `"${f.field}" = ANY($${paramOffset})`;
174
+ }
175
+ if (f.op === 'contains') {
176
+ values.push(`%${f.value}%`);
177
+ return `"${f.field}" LIKE $${paramOffset}`;
178
+ }
179
+ if (f.op === 'startsWith') {
180
+ values.push(`${f.value}%`);
181
+ return `"${f.field}" LIKE $${paramOffset}`;
182
+ }
183
+ values.push(f.value);
184
+ return `"${f.field}" ${OP_SQL[f.op]} $${paramOffset}`;
185
+ });
186
+ return { where: ` WHERE ${conditions.join(' AND ')}`, values };
187
+ }
188
+ function buildOrderBy(sorts) {
189
+ if (!sorts?.length)
190
+ return '';
191
+ const parts = sorts.map((s) => `"${s.field}" ${s.direction.toUpperCase()}`);
192
+ return ` ORDER BY ${parts.join(', ')}`;
193
+ }
194
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Vercel platform adapter bundle.
3
+ *
4
+ * Importing this module registers all Vercel adapters with the platform registry.
5
+ * Usage:
6
+ *
7
+ * import '@jazzmind/busibox-app/platform/vercel';
8
+ * // or with custom config:
9
+ * import { registerVercelAdapters } from '@jazzmind/busibox-app/platform/vercel';
10
+ * registerVercelAdapters({ getSession: auth });
11
+ */
12
+ export { VercelAIAdapter } from './ai';
13
+ export { VercelDataAdapter } from './data';
14
+ export { VercelSearchAdapter } from './search';
15
+ export { VercelStorageAdapter } from './storage';
16
+ export { VercelAuthAdapter } from './auth';
17
+ export interface VercelAdapterConfig {
18
+ /** Auth.js auth() function for session retrieval */
19
+ getSession?: (request: Request) => Promise<{
20
+ user?: {
21
+ id?: string;
22
+ email?: string | null;
23
+ name?: string | null;
24
+ role?: string;
25
+ } | null;
26
+ } | null>;
27
+ /** Override database URL (default: DATABASE_URL env var) */
28
+ databaseUrl?: string;
29
+ /** Vercel Blob token (default: BLOB_READ_WRITE_TOKEN env var) */
30
+ blobToken?: string;
31
+ /** AI provider: 'anthropic' | 'openai' (default: 'anthropic') */
32
+ aiProvider?: 'anthropic' | 'openai';
33
+ /** Model overrides */
34
+ models?: {
35
+ fast?: string;
36
+ smart?: string;
37
+ };
38
+ }
39
+ /**
40
+ * Register all Vercel adapters with the platform registry.
41
+ */
42
+ export declare function registerVercelAdapters(config?: VercelAdapterConfig): void;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QACzC,IAAI,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAC3F,GAAG,IAAI,CAAC,CAAC;IACV,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACpC,sBAAsB;IACtB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,mBAAwB,GAAG,IAAI,CAqB7E"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Vercel platform adapter bundle.
3
+ *
4
+ * Importing this module registers all Vercel adapters with the platform registry.
5
+ * Usage:
6
+ *
7
+ * import '@jazzmind/busibox-app/platform/vercel';
8
+ * // or with custom config:
9
+ * import { registerVercelAdapters } from '@jazzmind/busibox-app/platform/vercel';
10
+ * registerVercelAdapters({ getSession: auth });
11
+ */
12
+ import { registerAdapter } from '../../index';
13
+ import { VercelAIAdapter } from './ai';
14
+ import { VercelDataAdapter } from './data';
15
+ import { VercelSearchAdapter } from './search';
16
+ import { VercelStorageAdapter } from './storage';
17
+ import { VercelAuthAdapter } from './auth';
18
+ export { VercelAIAdapter } from './ai';
19
+ export { VercelDataAdapter } from './data';
20
+ export { VercelSearchAdapter } from './search';
21
+ export { VercelStorageAdapter } from './storage';
22
+ export { VercelAuthAdapter } from './auth';
23
+ /**
24
+ * Register all Vercel adapters with the platform registry.
25
+ */
26
+ export function registerVercelAdapters(config = {}) {
27
+ registerAdapter('vercel', 'ai', new VercelAIAdapter({
28
+ defaultProvider: config.aiProvider ?? 'anthropic',
29
+ models: config.models,
30
+ }));
31
+ registerAdapter('vercel', 'data', new VercelDataAdapter({
32
+ databaseUrl: config.databaseUrl,
33
+ }));
34
+ registerAdapter('vercel', 'search', new VercelSearchAdapter({
35
+ databaseUrl: config.databaseUrl,
36
+ }));
37
+ registerAdapter('vercel', 'storage', new VercelStorageAdapter({
38
+ token: config.blobToken,
39
+ }));
40
+ registerAdapter('vercel', 'auth', new VercelAuthAdapter({
41
+ getSession: config.getSession,
42
+ }));
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAiB3C;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAA8B,EAAE;IACrE,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC;QAClD,eAAe,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW;QACjD,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,iBAAiB,CAAC;QACtD,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,mBAAmB,CAAC;QAC1D,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,oBAAoB,CAAC;QAC5D,KAAK,EAAE,MAAM,CAAC,SAAS;KACxB,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,iBAAiB,CAAC;QACtD,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { SearchAdapter, SearchResult } from '../../interfaces/search';
2
+ import type { Filter } from '../../interfaces/data';
3
+ interface VercelSearchConfig {
4
+ databaseUrl?: string;
5
+ embeddingApiKey?: string;
6
+ /** Model for embeddings (default: text-embedding-3-small) */
7
+ embeddingModel?: string;
8
+ }
9
+ export declare class VercelSearchAdapter implements SearchAdapter {
10
+ private databaseUrl;
11
+ private embeddingModel;
12
+ private _sql;
13
+ constructor(config?: VercelSearchConfig);
14
+ search(params: {
15
+ query: string;
16
+ collections?: string[];
17
+ mode?: 'hybrid' | 'semantic' | 'keyword';
18
+ limit?: number;
19
+ filters?: Filter[];
20
+ }): Promise<SearchResult[]>;
21
+ embed(texts: string[]): Promise<number[][]>;
22
+ private getSql;
23
+ private keywordSearch;
24
+ private semanticSearch;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,IAAI,CAAsB;gBAEtB,MAAM,GAAE,kBAAuB;IAKrC,MAAM,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;QACzC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqBrB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAqBnC,MAAM;YAqBN,aAAa;YA8Cb,cAAc;CAwC7B"}
@@ -0,0 +1,140 @@
1
+ export class VercelSearchAdapter {
2
+ constructor(config = {}) {
3
+ this._sql = null;
4
+ this.databaseUrl = config.databaseUrl ?? process.env.DATABASE_URL ?? '';
5
+ this.embeddingModel = config.embeddingModel ?? 'text-embedding-3-small';
6
+ }
7
+ async search(params) {
8
+ const mode = params.mode ?? 'keyword';
9
+ const limit = params.limit ?? 10;
10
+ if (mode === 'semantic') {
11
+ return this.semanticSearch(params.query, params.collections, limit);
12
+ }
13
+ if (mode === 'keyword') {
14
+ return this.keywordSearch(params.query, params.collections, limit);
15
+ }
16
+ // hybrid: combine both
17
+ const [semantic, keyword] = await Promise.all([
18
+ this.semanticSearch(params.query, params.collections, limit).catch(() => []),
19
+ this.keywordSearch(params.query, params.collections, limit),
20
+ ]);
21
+ return mergeResults(semantic, keyword, limit);
22
+ }
23
+ async embed(texts) {
24
+ try {
25
+ const { createOpenAI } = await import('@ai-sdk/openai');
26
+ const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY });
27
+ const { embed } = await import('ai');
28
+ const model = openai.embedding(this.embeddingModel);
29
+ const results = await Promise.all(texts.map((text) => embed({ model, value: text })));
30
+ return results.map((r) => r.embedding);
31
+ }
32
+ catch {
33
+ throw new Error('Vercel search embed requires "ai" and "@ai-sdk/openai". ' +
34
+ 'Run: pnpm add ai @ai-sdk/openai');
35
+ }
36
+ }
37
+ // --- Private helpers ---
38
+ async getSql() {
39
+ if (this._sql)
40
+ return this._sql;
41
+ try {
42
+ const { neon } = await import('@neondatabase/serverless');
43
+ const sql = neon(this.databaseUrl);
44
+ // Neon supports (text, params) call form; cast past the tagged-template TS types
45
+ const sqlFn = sql;
46
+ this._sql = async (statement, params = []) => {
47
+ const result = await sqlFn(statement, params);
48
+ return Array.isArray(result) ? result : [];
49
+ };
50
+ return this._sql;
51
+ }
52
+ catch {
53
+ throw new Error('Vercel search adapter requires "@neondatabase/serverless". ' +
54
+ 'Run: pnpm add @neondatabase/serverless');
55
+ }
56
+ }
57
+ async keywordSearch(query, collections, limit = 10) {
58
+ const sql = await this.getSql();
59
+ // Full text search using ts_vector across all registered tables.
60
+ // For simplicity, we search each collection table individually.
61
+ const tables = collections ?? [];
62
+ if (tables.length === 0) {
63
+ // No tables to search — return empty
64
+ return [];
65
+ }
66
+ const allResults = [];
67
+ for (const table of tables) {
68
+ try {
69
+ const rows = await sql(`SELECT *, ts_rank(to_tsvector('english', content::text), plainto_tsquery('english', $1)) AS score
70
+ FROM "${table}"
71
+ WHERE to_tsvector('english', content::text) @@ plainto_tsquery('english', $1)
72
+ ORDER BY score DESC
73
+ LIMIT $2`, [query, limit]);
74
+ for (const row of rows) {
75
+ allResults.push({
76
+ id: String(row['id']),
77
+ collection: table,
78
+ content: String(row['content'] ?? row['text'] ?? ''),
79
+ score: Number(row['score'] ?? 0),
80
+ metadata: row['metadata'],
81
+ });
82
+ }
83
+ }
84
+ catch {
85
+ // Table may not have a content column — skip gracefully
86
+ }
87
+ }
88
+ return allResults.sort((a, b) => b.score - a.score).slice(0, limit);
89
+ }
90
+ async semanticSearch(query, collections, limit = 10) {
91
+ const [embedding] = await this.embed([query]);
92
+ const sql = await this.getSql();
93
+ const tables = collections ?? [];
94
+ if (tables.length === 0)
95
+ return [];
96
+ const allResults = [];
97
+ for (const table of tables) {
98
+ try {
99
+ const rows = await sql(`SELECT *, 1 - (embedding <=> $1::vector) AS score
100
+ FROM "${table}"
101
+ WHERE embedding IS NOT NULL
102
+ ORDER BY embedding <=> $1::vector
103
+ LIMIT $2`, [`[${embedding.join(',')}]`, limit]);
104
+ for (const row of rows) {
105
+ allResults.push({
106
+ id: String(row['id']),
107
+ collection: table,
108
+ content: String(row['content'] ?? ''),
109
+ score: Number(row['score'] ?? 0),
110
+ metadata: row['metadata'],
111
+ });
112
+ }
113
+ }
114
+ catch {
115
+ // Table may not have pgvector column — skip gracefully
116
+ }
117
+ }
118
+ return allResults.sort((a, b) => b.score - a.score).slice(0, limit);
119
+ }
120
+ }
121
+ function mergeResults(semantic, keyword, limit) {
122
+ const seen = new Set();
123
+ const merged = [];
124
+ const all = [...semantic, ...keyword].map((r, i) => ({
125
+ ...r,
126
+ // Reciprocal rank fusion score
127
+ rrf: 1 / (60 + i + 1),
128
+ }));
129
+ // Group by id
130
+ const scores = new Map();
131
+ for (const r of all) {
132
+ scores.set(r.id, (scores.get(r.id) ?? 0) + r.rrf);
133
+ }
134
+ // Re-rank by combined RRF score
135
+ const deduped = [...new Map(all.map((r) => [r.id, r])).values()]
136
+ .sort((a, b) => (scores.get(b.id) ?? 0) - (scores.get(a.id) ?? 0))
137
+ .slice(0, limit);
138
+ return deduped;
139
+ }
140
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { StorageAdapter, UploadResult } from '../../interfaces/storage';
2
+ interface VercelStorageConfig {
3
+ token?: string;
4
+ /** S3-compatible endpoint for non-Vercel environments */
5
+ s3Endpoint?: string;
6
+ s3AccessKeyId?: string;
7
+ s3SecretAccessKey?: string;
8
+ s3Bucket?: string;
9
+ }
10
+ export declare class VercelStorageAdapter implements StorageAdapter {
11
+ private config;
12
+ constructor(config?: VercelStorageConfig);
13
+ upload(file: File | Buffer | ReadableStream, options: {
14
+ filename: string;
15
+ contentType?: string;
16
+ visibility?: 'private' | 'public';
17
+ metadata?: Record<string, string>;
18
+ }): Promise<UploadResult>;
19
+ download(id: string): Promise<ReadableStream>;
20
+ delete(id: string): Promise<void>;
21
+ getUrl(id: string): Promise<string>;
22
+ list(prefix?: string): Promise<Array<{
23
+ id: string;
24
+ filename: string;
25
+ size: number;
26
+ }>>;
27
+ private importVercelBlob;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7E,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,GAAE,mBAAwB;IAItC,MAAM,CACV,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,cAAc,EACpC,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;QAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,GACA,OAAO,CAAC,YAAY,CAAC;IA8BlB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;YAe7E,gBAAgB;CAS/B"}
@@ -0,0 +1,82 @@
1
+ export class VercelStorageAdapter {
2
+ constructor(config = {}) {
3
+ this.config = config;
4
+ }
5
+ async upload(file, options) {
6
+ const { put } = await this.importVercelBlob();
7
+ const access = options.visibility === 'public' ? 'public' : 'private';
8
+ let data;
9
+ if (file instanceof Buffer) {
10
+ data = new Blob([file.buffer], {
11
+ type: options.contentType ?? 'application/octet-stream',
12
+ });
13
+ }
14
+ else {
15
+ data = file;
16
+ }
17
+ const result = await put(options.filename, data, {
18
+ access,
19
+ contentType: options.contentType,
20
+ addRandomSuffix: true,
21
+ token: this.config.token ?? process.env.BLOB_READ_WRITE_TOKEN,
22
+ });
23
+ const blobResult = result;
24
+ return {
25
+ id: result.url,
26
+ url: result.url,
27
+ size: blobResult['size'] ?? 0,
28
+ contentType: result.contentType ?? options.contentType ?? 'application/octet-stream',
29
+ };
30
+ }
31
+ async download(id) {
32
+ // id is the blob URL for Vercel Blob
33
+ const response = await fetch(id);
34
+ if (!response.ok) {
35
+ if (response.status === 404)
36
+ throw new Error(`File not found: ${id}`);
37
+ throw new Error(`Download failed: ${response.status} ${response.statusText}`);
38
+ }
39
+ return response.body;
40
+ }
41
+ async delete(id) {
42
+ const { del } = await this.importVercelBlob();
43
+ try {
44
+ await del(id, {
45
+ token: this.config.token ?? process.env.BLOB_READ_WRITE_TOKEN,
46
+ });
47
+ }
48
+ catch (err) {
49
+ if (String(err).includes('not found')) {
50
+ throw new Error(`File not found: ${id}`);
51
+ }
52
+ throw err;
53
+ }
54
+ }
55
+ async getUrl(id) {
56
+ // For Vercel Blob, the id IS the URL
57
+ if (!id)
58
+ throw new Error(`File not found: ${id}`);
59
+ return id;
60
+ }
61
+ async list(prefix) {
62
+ const { list } = await this.importVercelBlob();
63
+ const result = await list({
64
+ prefix,
65
+ token: this.config.token ?? process.env.BLOB_READ_WRITE_TOKEN,
66
+ });
67
+ return result.blobs.map((b) => ({
68
+ id: b.url,
69
+ filename: b.pathname,
70
+ size: b['size'] ?? 0,
71
+ }));
72
+ }
73
+ async importVercelBlob() {
74
+ try {
75
+ return await import('@vercel/blob');
76
+ }
77
+ catch {
78
+ throw new Error('Vercel storage adapter requires "@vercel/blob". Run: pnpm add @vercel/blob');
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/storage.ts"],"names":[],"mappings":"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"}