@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,66 @@
1
+ /**
2
+ * Busibox platform adapter bundle.
3
+ *
4
+ * Importing this module registers all Busibox adapters with the platform registry.
5
+ * Usage:
6
+ *
7
+ * import '@jazzmind/busibox-app/platform/busibox';
8
+ * // or with a custom getToken:
9
+ * import { registerBusiboxAdapters } from '@jazzmind/busibox-app/platform/busibox';
10
+ * registerBusiboxAdapters({ getToken: () => Promise.resolve(sessionToken) });
11
+ */
12
+ import { registerAdapter } from '../../index';
13
+ import { BusiboxAIAdapter } from './ai';
14
+ import { BusiboxDataAdapter } from './data';
15
+ import { BusiboxSearchAdapter } from './search';
16
+ import { BusiboxStorageAdapter } from './storage';
17
+ import { BusiboxAuthAdapter } from './auth';
18
+ export { BusiboxAIAdapter } from './ai';
19
+ export { BusiboxDataAdapter } from './data';
20
+ export { BusiboxSearchAdapter } from './search';
21
+ export { BusiboxStorageAdapter } from './storage';
22
+ export { BusiboxAuthAdapter } from './auth';
23
+ /**
24
+ * Register all Busibox adapters with the platform registry.
25
+ * Call this once during app startup (e.g. in your middleware or root layout).
26
+ */
27
+ export function registerBusiboxAdapters(config) {
28
+ const getSessionToken = config.getSessionToken ??
29
+ ((req) => {
30
+ const auth = req.headers.get('Authorization');
31
+ return Promise.resolve(auth?.startsWith('Bearer ') ? auth.slice(7) : null);
32
+ });
33
+ registerAdapter('busibox', 'ai', new BusiboxAIAdapter({
34
+ agentApiUrl: config.agentApiUrl,
35
+ getToken: config.getToken,
36
+ }));
37
+ registerAdapter('busibox', 'data', new BusiboxDataAdapter({
38
+ dataApiUrl: config.dataApiUrl,
39
+ getToken: config.getToken,
40
+ }));
41
+ registerAdapter('busibox', 'search', new BusiboxSearchAdapter({
42
+ searchApiUrl: config.searchApiUrl,
43
+ getToken: config.getToken,
44
+ }));
45
+ registerAdapter('busibox', 'storage', new BusiboxStorageAdapter({
46
+ dataApiUrl: config.dataApiUrl,
47
+ getToken: config.getToken,
48
+ }));
49
+ registerAdapter('busibox', 'auth', new BusiboxAuthAdapter({
50
+ authzBaseUrl: config.authzBaseUrl,
51
+ getSessionToken,
52
+ }));
53
+ }
54
+ // Auto-register with environment-based defaults when imported directly.
55
+ // This path is only taken if AGENT_API_URL or DATA_API_URL are set,
56
+ // meaning we're actually running in a Busibox environment.
57
+ if (typeof process !== 'undefined' &&
58
+ (process.env.AGENT_API_URL || process.env.DATA_API_URL)) {
59
+ registerBusiboxAdapters({
60
+ // In auto-registration mode, token is extracted from each request at runtime.
61
+ // Apps that need a different strategy should call registerBusiboxAdapters() directly.
62
+ getToken: () => Promise.reject(new Error('Busibox adapter requires a getToken function. ' +
63
+ 'Call registerBusiboxAdapters({ getToken: ... }) instead of importing the bundle directly.')),
64
+ });
65
+ }
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAiB5C;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA4B;IAClE,MAAM,eAAe,GACnB,MAAM,CAAC,eAAe;QACtB,CAAC,CAAC,GAAY,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IAEL,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC;QACpD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,kBAAkB,CAAC;QACxD,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,oBAAoB,CAAC;QAC5D,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,qBAAqB,CAAC;QAC9D,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,kBAAkB,CAAC;QACxD,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,eAAe;KAChB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,wEAAwE;AACxE,oEAAoE;AACpE,2DAA2D;AAC3D,IACE,OAAO,OAAO,KAAK,WAAW;IAC9B,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EACvD,CAAC;IACD,uBAAuB,CAAC;QACtB,8EAA8E;QAC9E,sFAAsF;QACtF,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CACtC,gDAAgD;YAChD,2FAA2F,CAC5F,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
@@ -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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"}