@jazzmind/busibox-app 3.0.55 → 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 (87) hide show
  1. package/dist/components/chat/ChatContainer.d.ts.map +1 -1
  2. package/dist/components/chat/ChatContainer.js +1 -0
  3. package/dist/components/chat/ChatContainer.js.map +1 -1
  4. package/dist/components/chat/MessageList.d.ts.map +1 -1
  5. package/dist/components/chat/MessageList.js +11 -4
  6. package/dist/components/chat/MessageList.js.map +1 -1
  7. package/dist/platform/adapters/busibox/ai.d.ts +31 -0
  8. package/dist/platform/adapters/busibox/ai.d.ts.map +1 -0
  9. package/dist/platform/adapters/busibox/ai.js +198 -0
  10. package/dist/platform/adapters/busibox/ai.js.map +1 -0
  11. package/dist/platform/adapters/busibox/auth.d.ts +25 -0
  12. package/dist/platform/adapters/busibox/auth.d.ts.map +1 -0
  13. package/dist/platform/adapters/busibox/auth.js +76 -0
  14. package/dist/platform/adapters/busibox/auth.js.map +1 -0
  15. package/dist/platform/adapters/busibox/data.d.ts +30 -0
  16. package/dist/platform/adapters/busibox/data.d.ts.map +1 -0
  17. package/dist/platform/adapters/busibox/data.js +163 -0
  18. package/dist/platform/adapters/busibox/data.js.map +1 -0
  19. package/dist/platform/adapters/busibox/index.d.ts +36 -0
  20. package/dist/platform/adapters/busibox/index.d.ts.map +1 -0
  21. package/dist/platform/adapters/busibox/index.js +66 -0
  22. package/dist/platform/adapters/busibox/index.js.map +1 -0
  23. package/dist/platform/adapters/busibox/search.d.ts +21 -0
  24. package/dist/platform/adapters/busibox/search.d.ts.map +1 -0
  25. package/dist/platform/adapters/busibox/search.js +62 -0
  26. package/dist/platform/adapters/busibox/search.js.map +1 -0
  27. package/dist/platform/adapters/busibox/storage.d.ts +28 -0
  28. package/dist/platform/adapters/busibox/storage.d.ts.map +1 -0
  29. package/dist/platform/adapters/busibox/storage.js +107 -0
  30. package/dist/platform/adapters/busibox/storage.js.map +1 -0
  31. package/dist/platform/adapters/vercel/ai.d.ts +36 -0
  32. package/dist/platform/adapters/vercel/ai.d.ts.map +1 -0
  33. package/dist/platform/adapters/vercel/ai.js +150 -0
  34. package/dist/platform/adapters/vercel/ai.js.map +1 -0
  35. package/dist/platform/adapters/vercel/auth.d.ts +22 -0
  36. package/dist/platform/adapters/vercel/auth.d.ts.map +1 -0
  37. package/dist/platform/adapters/vercel/auth.js +75 -0
  38. package/dist/platform/adapters/vercel/auth.js.map +1 -0
  39. package/dist/platform/adapters/vercel/data.d.ts +25 -0
  40. package/dist/platform/adapters/vercel/data.d.ts.map +1 -0
  41. package/dist/platform/adapters/vercel/data.js +194 -0
  42. package/dist/platform/adapters/vercel/data.js.map +1 -0
  43. package/dist/platform/adapters/vercel/index.d.ts +43 -0
  44. package/dist/platform/adapters/vercel/index.d.ts.map +1 -0
  45. package/dist/platform/adapters/vercel/index.js +44 -0
  46. package/dist/platform/adapters/vercel/index.js.map +1 -0
  47. package/dist/platform/adapters/vercel/search.d.ts +27 -0
  48. package/dist/platform/adapters/vercel/search.d.ts.map +1 -0
  49. package/dist/platform/adapters/vercel/search.js +140 -0
  50. package/dist/platform/adapters/vercel/search.js.map +1 -0
  51. package/dist/platform/adapters/vercel/storage.d.ts +30 -0
  52. package/dist/platform/adapters/vercel/storage.d.ts.map +1 -0
  53. package/dist/platform/adapters/vercel/storage.js +82 -0
  54. package/dist/platform/adapters/vercel/storage.js.map +1 -0
  55. package/dist/platform/config.d.ts +17 -0
  56. package/dist/platform/config.d.ts.map +1 -0
  57. package/dist/platform/config.js +32 -0
  58. package/dist/platform/config.js.map +1 -0
  59. package/dist/platform/index.d.ts +21 -0
  60. package/dist/platform/index.d.ts.map +1 -0
  61. package/dist/platform/index.js +41 -0
  62. package/dist/platform/index.js.map +1 -0
  63. package/dist/platform/interfaces/ai.d.ts +74 -0
  64. package/dist/platform/interfaces/ai.d.ts.map +1 -0
  65. package/dist/platform/interfaces/ai.js +2 -0
  66. package/dist/platform/interfaces/ai.js.map +1 -0
  67. package/dist/platform/interfaces/auth.d.ts +21 -0
  68. package/dist/platform/interfaces/auth.d.ts.map +1 -0
  69. package/dist/platform/interfaces/auth.js +2 -0
  70. package/dist/platform/interfaces/auth.js.map +1 -0
  71. package/dist/platform/interfaces/data.d.ts +49 -0
  72. package/dist/platform/interfaces/data.d.ts.map +1 -0
  73. package/dist/platform/interfaces/data.js +2 -0
  74. package/dist/platform/interfaces/data.js.map +1 -0
  75. package/dist/platform/interfaces/index.d.ts +6 -0
  76. package/dist/platform/interfaces/index.d.ts.map +1 -0
  77. package/dist/platform/interfaces/index.js +2 -0
  78. package/dist/platform/interfaces/index.js.map +1 -0
  79. package/dist/platform/interfaces/search.d.ts +19 -0
  80. package/dist/platform/interfaces/search.d.ts.map +1 -0
  81. package/dist/platform/interfaces/search.js +2 -0
  82. package/dist/platform/interfaces/search.js.map +1 -0
  83. package/dist/platform/interfaces/storage.d.ts +25 -0
  84. package/dist/platform/interfaces/storage.d.ts.map +1 -0
  85. package/dist/platform/interfaces/storage.js +2 -0
  86. package/dist/platform/interfaces/storage.js.map +1 -0
  87. package/package.json +59 -4
@@ -0,0 +1,21 @@
1
+ import type { SearchAdapter, SearchResult } from '../../interfaces/search';
2
+ import type { Filter } from '../../interfaces/data';
3
+ interface BusiboxSearchConfig {
4
+ searchApiUrl?: string;
5
+ getToken: () => Promise<string>;
6
+ }
7
+ export declare class BusiboxSearchAdapter implements SearchAdapter {
8
+ private baseUrl;
9
+ private getToken;
10
+ constructor(config: BusiboxSearchConfig);
11
+ search(params: {
12
+ query: string;
13
+ collections?: string[];
14
+ mode?: 'hybrid' | 'semantic' | 'keyword';
15
+ limit?: number;
16
+ filters?: Filter[];
17
+ }): Promise<SearchResult[]>;
18
+ embed(texts: string[]): Promise<number[][]>;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/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,mBAAmB;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAUD,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,MAAM,EAAE,mBAAmB;IAYjC,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;IAoCrB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAmBlD"}
@@ -0,0 +1,62 @@
1
+ export class BusiboxSearchAdapter {
2
+ constructor(config) {
3
+ this.baseUrl =
4
+ config.searchApiUrl ??
5
+ process.env.SEARCH_API_URL ??
6
+ (() => {
7
+ const host = process.env.SEARCH_API_HOST ?? 'localhost';
8
+ const port = process.env.SEARCH_API_PORT ?? '8003';
9
+ return `http://${host}:${port}`;
10
+ })();
11
+ this.getToken = config.getToken;
12
+ }
13
+ async search(params) {
14
+ const token = await this.getToken();
15
+ const response = await fetch(`${this.baseUrl}/search`, {
16
+ method: 'POST',
17
+ headers: {
18
+ Authorization: `Bearer ${token}`,
19
+ 'Content-Type': 'application/json',
20
+ },
21
+ body: JSON.stringify({
22
+ query: params.query,
23
+ document_ids: params.collections,
24
+ mode: params.mode ?? 'hybrid',
25
+ limit: params.limit ?? 10,
26
+ filters: params.filters?.map((f) => ({
27
+ field: f.field,
28
+ op: f.op,
29
+ value: f.value,
30
+ })),
31
+ }),
32
+ });
33
+ if (!response.ok) {
34
+ throw new Error(`Search API error: ${response.status} ${response.statusText}`);
35
+ }
36
+ const data = await response.json();
37
+ return (data.results ?? []).map((r) => ({
38
+ id: r.id,
39
+ collection: r.document_id,
40
+ content: r.content,
41
+ score: r.score,
42
+ metadata: r.metadata,
43
+ }));
44
+ }
45
+ async embed(texts) {
46
+ const token = await this.getToken();
47
+ const response = await fetch(`${this.baseUrl}/embed`, {
48
+ method: 'POST',
49
+ headers: {
50
+ Authorization: `Bearer ${token}`,
51
+ 'Content-Type': 'application/json',
52
+ },
53
+ body: JSON.stringify({ texts }),
54
+ });
55
+ if (!response.ok) {
56
+ throw new Error(`Embed API error: ${response.status} ${response.statusText}`);
57
+ }
58
+ const data = await response.json();
59
+ return data.embeddings;
60
+ }
61
+ }
62
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { StorageAdapter, UploadResult } from '../../interfaces/storage';
2
+ interface BusiboxStorageConfig {
3
+ dataApiUrl?: string;
4
+ getToken: () => Promise<string>;
5
+ }
6
+ export declare class BusiboxStorageAdapter implements StorageAdapter {
7
+ private baseUrl;
8
+ private getToken;
9
+ constructor(config: BusiboxStorageConfig);
10
+ upload(file: File | Buffer | ReadableStream, options: {
11
+ filename: string;
12
+ contentType?: string;
13
+ visibility?: 'private' | 'public';
14
+ metadata?: Record<string, string>;
15
+ }): Promise<UploadResult>;
16
+ download(id: string): Promise<ReadableStream>;
17
+ delete(id: string): Promise<void>;
18
+ getUrl(id: string, options?: {
19
+ expiresIn?: number;
20
+ }): Promise<string>;
21
+ list(prefix?: string): Promise<Array<{
22
+ id: string;
23
+ filename: string;
24
+ size: number;
25
+ }>>;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7E,UAAU,oBAAoB;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,MAAM,EAAE,oBAAoB;IAWlC,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;IAwDlB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAe7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBrE,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;CAiB5F"}
@@ -0,0 +1,107 @@
1
+ export class BusiboxStorageAdapter {
2
+ constructor(config) {
3
+ this.baseUrl =
4
+ config.dataApiUrl ??
5
+ (() => {
6
+ const host = process.env.DATA_API_HOST ?? 'localhost';
7
+ const port = process.env.DATA_API_PORT ?? '8002';
8
+ return `http://${host}:${port}`;
9
+ })();
10
+ this.getToken = config.getToken;
11
+ }
12
+ async upload(file, options) {
13
+ const token = await this.getToken();
14
+ const formData = new FormData();
15
+ if (file instanceof Buffer) {
16
+ formData.append('file', new Blob([file.buffer], { type: options.contentType ?? 'application/octet-stream' }), options.filename);
17
+ }
18
+ else if (file instanceof File) {
19
+ formData.append('file', file, options.filename);
20
+ }
21
+ else {
22
+ // ReadableStream: collect chunks then upload as blob
23
+ const chunks = [];
24
+ const reader = file.getReader();
25
+ while (true) {
26
+ const { done, value } = await reader.read();
27
+ if (done)
28
+ break;
29
+ if (value)
30
+ chunks.push(value);
31
+ }
32
+ const blob = new Blob(chunks.map(c => c.buffer), { type: options.contentType ?? 'application/octet-stream' });
33
+ formData.append('file', blob, options.filename);
34
+ }
35
+ if (options.visibility)
36
+ formData.append('visibility', options.visibility);
37
+ if (options.metadata) {
38
+ formData.append('metadata', JSON.stringify(options.metadata));
39
+ }
40
+ const response = await fetch(`${this.baseUrl}/files`, {
41
+ method: 'POST',
42
+ headers: { Authorization: `Bearer ${token}` },
43
+ body: formData,
44
+ });
45
+ if (!response.ok) {
46
+ throw new Error(`Storage upload error: ${response.status} ${response.statusText}`);
47
+ }
48
+ const data = await response.json();
49
+ return {
50
+ id: data.id,
51
+ url: data.url ?? `${this.baseUrl}/files/${data.id}`,
52
+ size: data.size,
53
+ contentType: data.content_type ?? options.contentType ?? 'application/octet-stream',
54
+ };
55
+ }
56
+ async download(id) {
57
+ const token = await this.getToken();
58
+ const response = await fetch(`${this.baseUrl}/files/${id}/download`, {
59
+ headers: { Authorization: `Bearer ${token}` },
60
+ });
61
+ if (!response.ok) {
62
+ if (response.status === 404)
63
+ throw new Error(`File not found: ${id}`);
64
+ throw new Error(`Storage download error: ${response.status} ${response.statusText}`);
65
+ }
66
+ return response.body;
67
+ }
68
+ async delete(id) {
69
+ const token = await this.getToken();
70
+ const response = await fetch(`${this.baseUrl}/files/${id}`, {
71
+ method: 'DELETE',
72
+ headers: { Authorization: `Bearer ${token}` },
73
+ });
74
+ if (!response.ok) {
75
+ if (response.status === 404)
76
+ throw new Error(`File not found: ${id}`);
77
+ throw new Error(`Storage delete error: ${response.status} ${response.statusText}`);
78
+ }
79
+ }
80
+ async getUrl(id, options) {
81
+ const token = await this.getToken();
82
+ const params = options?.expiresIn ? `?expires_in=${options.expiresIn}` : '';
83
+ const response = await fetch(`${this.baseUrl}/files/${id}/url${params}`, {
84
+ headers: { Authorization: `Bearer ${token}` },
85
+ });
86
+ if (!response.ok) {
87
+ if (response.status === 404)
88
+ throw new Error(`File not found: ${id}`);
89
+ throw new Error(`Storage getUrl error: ${response.status} ${response.statusText}`);
90
+ }
91
+ const data = await response.json();
92
+ return data.url;
93
+ }
94
+ async list(prefix) {
95
+ const token = await this.getToken();
96
+ const params = prefix ? `?prefix=${encodeURIComponent(prefix)}` : '';
97
+ const response = await fetch(`${this.baseUrl}/files${params}`, {
98
+ headers: { Authorization: `Bearer ${token}` },
99
+ });
100
+ if (!response.ok) {
101
+ throw new Error(`Storage list error: ${response.status} ${response.statusText}`);
102
+ }
103
+ const data = await response.json();
104
+ return data.files ?? [];
105
+ }
106
+ }
107
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ZodSchema } from 'zod';
2
+ import type { AIAdapter, StreamEvent, Message, ToolDef, ModelInfo } from '../../interfaces/ai';
3
+ interface VercelAIConfig {
4
+ defaultProvider?: 'anthropic' | 'openai';
5
+ anthropicApiKey?: string;
6
+ openaiApiKey?: string;
7
+ models?: {
8
+ fast?: string;
9
+ smart?: string;
10
+ };
11
+ }
12
+ export declare class VercelAIAdapter implements AIAdapter {
13
+ private config;
14
+ constructor(config?: VercelAIConfig);
15
+ streamChat(params: {
16
+ messages: Message[];
17
+ agent?: string;
18
+ model?: string;
19
+ tools?: ToolDef[];
20
+ systemPrompt?: string;
21
+ }): Promise<ReadableStream<StreamEvent>>;
22
+ invoke<T>(params: {
23
+ agent?: string;
24
+ input: Record<string, unknown>;
25
+ responseSchema: ZodSchema<T>;
26
+ model?: string;
27
+ }): Promise<T>;
28
+ listModels(): Promise<ModelInfo[]>;
29
+ private importAI;
30
+ private resolveModel;
31
+ private convertMessages;
32
+ private transformAISDKStream;
33
+ private errorStream;
34
+ }
35
+ export {};
36
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,OAAO,EACP,OAAO,EAEP,SAAS,EACV,MAAM,qBAAqB,CAAC;AAE7B,UAAU,cAAc;IACtB,eAAe,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAOD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAgF;gBAElF,MAAM,GAAE,cAAmB;IAQjC,UAAU,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAiBlC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,CAAC,CAAC;IAeR,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAoB1B,QAAQ;YAUR,YAAY;IAY1B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,WAAW;CASpB"}
@@ -0,0 +1,150 @@
1
+ export class VercelAIAdapter {
2
+ constructor(config = {}) {
3
+ this.config = {
4
+ defaultProvider: config.defaultProvider ?? 'anthropic',
5
+ models: config.models ?? { fast: 'claude-haiku-4-5', smart: 'claude-sonnet-4-5' },
6
+ ...config,
7
+ };
8
+ }
9
+ async streamChat(params) {
10
+ try {
11
+ const { streamText } = await this.importAI();
12
+ const model = await this.resolveModel(params.model);
13
+ const result = streamText({
14
+ model,
15
+ messages: this.convertMessages(params.messages),
16
+ system: params.systemPrompt,
17
+ });
18
+ return this.transformAISDKStream(result);
19
+ }
20
+ catch (err) {
21
+ return this.errorStream(String(err));
22
+ }
23
+ }
24
+ async invoke(params) {
25
+ const { generateObject } = await this.importAI();
26
+ const model = await this.resolveModel(params.model ?? this.config.models.fast);
27
+ const prompt = JSON.stringify(params.input);
28
+ const { object } = await generateObject({
29
+ model,
30
+ prompt,
31
+ schema: params.responseSchema,
32
+ });
33
+ return object;
34
+ }
35
+ async listModels() {
36
+ const models = [];
37
+ if (this.config.defaultProvider === 'anthropic') {
38
+ models.push({ id: 'claude-haiku-4-5', name: 'Claude Haiku 4.5', provider: 'anthropic', capabilities: ['chat', 'structured', 'tools'] }, { id: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5', provider: 'anthropic', capabilities: ['chat', 'structured', 'tools', 'vision'] });
39
+ }
40
+ else if (this.config.defaultProvider === 'openai') {
41
+ models.push({ id: 'gpt-4o-mini', name: 'GPT-4o Mini', provider: 'openai', capabilities: ['chat', 'structured', 'tools'] }, { id: 'gpt-4o', name: 'GPT-4o', provider: 'openai', capabilities: ['chat', 'structured', 'tools', 'vision'] });
42
+ }
43
+ return models;
44
+ }
45
+ // --- Private helpers ---
46
+ async importAI() {
47
+ try {
48
+ return await import('ai');
49
+ }
50
+ catch {
51
+ throw new Error('Vercel AI adapter requires the "ai" package. Run: pnpm add ai @ai-sdk/anthropic');
52
+ }
53
+ }
54
+ async resolveModel(modelId) {
55
+ const effectiveModel = modelId ?? this.config.models.fast ?? 'claude-haiku-4-5';
56
+ if (this.config.defaultProvider === 'openai') {
57
+ const { openai } = await importOpenAI(this.config.openaiApiKey);
58
+ return openai(effectiveModel);
59
+ }
60
+ const { anthropic } = await importAnthropic(this.config.anthropicApiKey);
61
+ return anthropic(effectiveModel);
62
+ }
63
+ convertMessages(messages) {
64
+ return messages.map((m) => ({
65
+ role: m.role,
66
+ content: m.content,
67
+ }));
68
+ }
69
+ transformAISDKStream(result) {
70
+ return new ReadableStream({
71
+ async start(controller) {
72
+ let inputTokens = 0;
73
+ let outputTokens = 0;
74
+ try {
75
+ for await (const part of result.fullStream) {
76
+ const p = part;
77
+ switch (p['type']) {
78
+ case 'text-delta':
79
+ controller.enqueue({ type: 'text-delta', content: p['textDelta'] });
80
+ break;
81
+ case 'tool-call':
82
+ controller.enqueue({
83
+ type: 'tool-call',
84
+ toolCall: {
85
+ id: p['toolCallId'],
86
+ name: p['toolName'],
87
+ args: p['args'],
88
+ },
89
+ });
90
+ break;
91
+ case 'tool-result':
92
+ controller.enqueue({
93
+ type: 'tool-result',
94
+ toolResult: {
95
+ id: p['toolCallId'],
96
+ result: p['result'],
97
+ },
98
+ });
99
+ break;
100
+ case 'finish': {
101
+ const usage = p['usage'];
102
+ inputTokens = usage?.promptTokens ?? 0;
103
+ outputTokens = usage?.completionTokens ?? 0;
104
+ break;
105
+ }
106
+ case 'error':
107
+ controller.enqueue({ type: 'error', error: String(p['error']) });
108
+ break;
109
+ }
110
+ }
111
+ controller.enqueue({ type: 'done', usage: { inputTokens, outputTokens } });
112
+ controller.close();
113
+ }
114
+ catch (err) {
115
+ controller.enqueue({ type: 'error', error: String(err) });
116
+ controller.enqueue({ type: 'done', usage: { inputTokens, outputTokens } });
117
+ controller.close();
118
+ }
119
+ },
120
+ });
121
+ }
122
+ errorStream(message) {
123
+ return new ReadableStream({
124
+ start(controller) {
125
+ controller.enqueue({ type: 'error', error: message });
126
+ controller.enqueue({ type: 'done', usage: { inputTokens: 0, outputTokens: 0 } });
127
+ controller.close();
128
+ },
129
+ });
130
+ }
131
+ }
132
+ async function importAnthropic(apiKey) {
133
+ try {
134
+ const { createAnthropic } = await import('@ai-sdk/anthropic');
135
+ return { anthropic: createAnthropic({ apiKey: apiKey ?? process.env.ANTHROPIC_API_KEY }) };
136
+ }
137
+ catch {
138
+ throw new Error('Vercel AI adapter requires "@ai-sdk/anthropic". Run: pnpm add @ai-sdk/anthropic');
139
+ }
140
+ }
141
+ async function importOpenAI(apiKey) {
142
+ try {
143
+ const { createOpenAI } = await import('@ai-sdk/openai');
144
+ return { openai: createOpenAI({ apiKey: apiKey ?? process.env.OPENAI_API_KEY }) };
145
+ }
146
+ catch {
147
+ throw new Error('Vercel AI adapter requires "@ai-sdk/openai". Run: pnpm add @ai-sdk/openai');
148
+ }
149
+ }
150
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AuthAdapter, PlatformUser, TokenClaims } from '../../interfaces/auth';
2
+ interface VercelAuthConfig {
3
+ /** Get session from Auth.js. If not provided, reads Bearer token from Authorization header. */
4
+ getSession?: (request: Request) => Promise<{
5
+ user?: {
6
+ id?: string;
7
+ email?: string | null;
8
+ name?: string | null;
9
+ role?: string;
10
+ } | null;
11
+ } | null>;
12
+ }
13
+ export declare class VercelAuthAdapter implements AuthAdapter {
14
+ private getSession?;
15
+ constructor(config?: VercelAuthConfig);
16
+ getCurrentUser(request: Request): Promise<PlatformUser | null>;
17
+ validateToken(token: string): Promise<TokenClaims | null>;
18
+ requireAuth(request: Request): Promise<PlatformUser>;
19
+ private decodeJwt;
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpF,UAAU,gBAAgB;IACxB,+FAA+F;IAC/F,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;CACX;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,UAAU,CAAC,CAAiC;gBAExC,MAAM,GAAE,gBAAqB;IAInC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyB9D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkBzD,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAM1D,OAAO,CAAC,SAAS;CA0BlB"}
@@ -0,0 +1,75 @@
1
+ export class VercelAuthAdapter {
2
+ constructor(config = {}) {
3
+ this.getSession = config.getSession;
4
+ }
5
+ async getCurrentUser(request) {
6
+ if (this.getSession) {
7
+ try {
8
+ const session = await this.getSession(request);
9
+ if (!session?.user?.email)
10
+ return null;
11
+ return {
12
+ id: session.user.id ?? session.user.email,
13
+ email: session.user.email,
14
+ name: session.user.name ?? undefined,
15
+ role: session.user.role ?? 'user',
16
+ };
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ // Fallback: decode JWT from Authorization header (for API routes using next-auth JWT)
23
+ const auth = request.headers.get('Authorization');
24
+ if (!auth?.startsWith('Bearer '))
25
+ return null;
26
+ const token = auth.slice(7);
27
+ return this.decodeJwt(token);
28
+ }
29
+ async validateToken(token) {
30
+ // Attempt to decode JWT payload (no verification — rely on session middleware for that)
31
+ try {
32
+ const [, payload] = token.split('.');
33
+ if (!payload)
34
+ return null;
35
+ const decoded = JSON.parse(Buffer.from(payload, 'base64url').toString());
36
+ if (!decoded.sub || !decoded.exp)
37
+ return null;
38
+ // Check expiry
39
+ if (decoded.exp < Math.floor(Date.now() / 1000))
40
+ return null;
41
+ return decoded;
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ async requireAuth(request) {
48
+ const user = await this.getCurrentUser(request);
49
+ if (!user)
50
+ throw new Error('Unauthorized');
51
+ return user;
52
+ }
53
+ decodeJwt(token) {
54
+ try {
55
+ const [, payload] = token.split('.');
56
+ if (!payload)
57
+ return null;
58
+ const decoded = JSON.parse(Buffer.from(payload, 'base64url').toString());
59
+ if (!decoded.sub || !decoded.email)
60
+ return null;
61
+ if (decoded.exp && decoded.exp < Math.floor(Date.now() / 1000))
62
+ return null;
63
+ return {
64
+ id: decoded.sub,
65
+ email: decoded.email,
66
+ name: decoded.name,
67
+ role: decoded.role ?? 'user',
68
+ };
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/platform/adapters/vercel/auth.ts"],"names":[],"mappings":"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"}
@@ -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"}