@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,198 @@
1
+ export class BusiboxAIAdapter {
2
+ constructor(config) {
3
+ this.baseUrl = config.agentApiUrl ?? process.env.AGENT_API_URL ?? 'http://agent-api:8000';
4
+ this.getToken = config.getToken;
5
+ }
6
+ async streamChat(params) {
7
+ let token;
8
+ try {
9
+ token = await this.getToken();
10
+ }
11
+ catch (err) {
12
+ return this.errorStream(`Failed to acquire token: ${String(err)}`);
13
+ }
14
+ let response;
15
+ try {
16
+ response = await fetch(`${this.baseUrl}/chat/message/stream`, {
17
+ method: 'POST',
18
+ headers: {
19
+ Authorization: `Bearer ${token}`,
20
+ 'Content-Type': 'application/json',
21
+ },
22
+ body: JSON.stringify({
23
+ messages: this.convertMessages(params.messages),
24
+ agent_name: params.agent,
25
+ model: params.model,
26
+ system_prompt: params.systemPrompt,
27
+ tools: params.tools?.map((t) => t.name),
28
+ }),
29
+ });
30
+ }
31
+ catch (err) {
32
+ return this.errorStream(`Network error: ${String(err)}`);
33
+ }
34
+ if (!response.ok) {
35
+ return this.errorStream(`Agent API error: ${response.status} ${response.statusText}`);
36
+ }
37
+ return this.transformSSEStream(response.body);
38
+ }
39
+ async invoke(params) {
40
+ const token = await this.getToken();
41
+ const response = await fetch(`${this.baseUrl}/runs/invoke`, {
42
+ method: 'POST',
43
+ headers: {
44
+ Authorization: `Bearer ${token}`,
45
+ 'Content-Type': 'application/json',
46
+ },
47
+ body: JSON.stringify({
48
+ agent_name: params.agent,
49
+ input: params.input,
50
+ response_schema: zodToJsonSchema(params.responseSchema),
51
+ model: params.model,
52
+ }),
53
+ });
54
+ if (!response.ok) {
55
+ throw new Error(`Agent API invoke failed: ${response.status} ${response.statusText}`);
56
+ }
57
+ const data = await response.json();
58
+ return params.responseSchema.parse(data.output ?? data);
59
+ }
60
+ async syncAgents(definitions) {
61
+ const token = await this.getToken();
62
+ const response = await fetch(`${this.baseUrl}/agents/sync`, {
63
+ method: 'POST',
64
+ headers: {
65
+ Authorization: `Bearer ${token}`,
66
+ 'Content-Type': 'application/json',
67
+ },
68
+ body: JSON.stringify({ agents: definitions }),
69
+ });
70
+ if (!response.ok) {
71
+ throw new Error(`Agent sync failed: ${response.status} ${response.statusText}`);
72
+ }
73
+ }
74
+ async listModels() {
75
+ const token = await this.getToken();
76
+ try {
77
+ const response = await fetch(`${this.baseUrl}/llm/models`, {
78
+ headers: { Authorization: `Bearer ${token}` },
79
+ });
80
+ if (!response.ok)
81
+ return [];
82
+ const data = await response.json();
83
+ return (data.models ?? []);
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ }
89
+ // --- Private helpers ---
90
+ convertMessages(messages) {
91
+ return messages.map((m) => ({
92
+ role: m.role,
93
+ content: m.content,
94
+ tool_calls: m.toolCalls,
95
+ tool_results: m.toolResults,
96
+ }));
97
+ }
98
+ transformSSEStream(body) {
99
+ const decoder = new TextDecoder();
100
+ let buffer = '';
101
+ return new ReadableStream({
102
+ async start(controller) {
103
+ const reader = body.getReader();
104
+ try {
105
+ while (true) {
106
+ const { done, value } = await reader.read();
107
+ if (done) {
108
+ controller.enqueue({ type: 'done' });
109
+ controller.close();
110
+ break;
111
+ }
112
+ buffer += decoder.decode(value, { stream: true });
113
+ const lines = buffer.split('\n');
114
+ buffer = lines.pop() ?? '';
115
+ for (const line of lines) {
116
+ if (line.startsWith('data: ')) {
117
+ const payload = line.slice(6).trim();
118
+ if (payload === '[DONE]')
119
+ continue;
120
+ try {
121
+ const event = JSON.parse(payload);
122
+ const mapped = mapAgentEvent(event);
123
+ if (mapped)
124
+ controller.enqueue(mapped);
125
+ }
126
+ catch {
127
+ // Skip malformed SSE lines
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ catch (err) {
134
+ controller.enqueue({ type: 'error', error: String(err) });
135
+ controller.enqueue({ type: 'done' });
136
+ controller.close();
137
+ }
138
+ },
139
+ });
140
+ }
141
+ errorStream(message) {
142
+ return new ReadableStream({
143
+ start(controller) {
144
+ controller.enqueue({ type: 'error', error: message });
145
+ controller.enqueue({ type: 'done' });
146
+ controller.close();
147
+ },
148
+ });
149
+ }
150
+ }
151
+ function mapAgentEvent(event) {
152
+ switch (event['type']) {
153
+ case 'content':
154
+ case 'text':
155
+ return { type: 'text-delta', content: (event['text'] ?? event['content']) };
156
+ case 'tool_use':
157
+ case 'tool_call':
158
+ return { type: 'tool-call', toolCall: event['tool_call'] };
159
+ case 'tool_result':
160
+ return { type: 'tool-result', toolResult: event['tool_result'] };
161
+ case 'error':
162
+ return { type: 'error', error: event['message'] };
163
+ case 'done':
164
+ case 'end':
165
+ return {
166
+ type: 'done',
167
+ usage: event['usage'],
168
+ };
169
+ default:
170
+ return null;
171
+ }
172
+ }
173
+ /** Minimal Zod-to-JSON-Schema conversion for agent-api response_schema */
174
+ function zodToJsonSchema(schema) {
175
+ const def = schema._def;
176
+ const type = def['type'] ?? '';
177
+ if (type === 'object' || def['typeName'] === 'ZodObject') {
178
+ const shape = def['shape'] ?? {};
179
+ const properties = {};
180
+ const required = [];
181
+ for (const [key, fieldSchema] of Object.entries(shape)) {
182
+ properties[key] = zodToJsonSchema(fieldSchema);
183
+ const fieldDef = fieldSchema._def;
184
+ const isOptional = fieldDef['typeName'] === 'ZodOptional' || fieldDef['type'] === 'optional';
185
+ if (!isOptional)
186
+ required.push(key);
187
+ }
188
+ return { type: 'object', properties, required };
189
+ }
190
+ switch (type) {
191
+ case 'string': return { type: 'string' };
192
+ case 'number': return { type: 'number' };
193
+ case 'boolean': return { type: 'boolean' };
194
+ case 'array': return { type: 'array', items: zodToJsonSchema(def['element']) };
195
+ default: return { type: 'string' };
196
+ }
197
+ }
198
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { AuthAdapter, PlatformUser, TokenClaims } from '../../interfaces/auth';
2
+ interface BusiboxAuthConfig {
3
+ authzBaseUrl?: string;
4
+ jwksUrl?: string;
5
+ /** App audience for token exchange (e.g. 'agent-api') */
6
+ audience?: string;
7
+ /** Get the current session JWT (from server-side session) */
8
+ getSessionToken: (request: Request) => Promise<string | null>;
9
+ }
10
+ export declare class BusiboxAuthAdapter implements AuthAdapter {
11
+ private authzBaseUrl;
12
+ private jwksUrl;
13
+ private audience;
14
+ private getSessionToken;
15
+ private _jwks;
16
+ constructor(config: BusiboxAuthConfig);
17
+ getCurrentUser(request: Request): Promise<PlatformUser | null>;
18
+ getServiceToken(audience: string): Promise<string>;
19
+ validateToken(token: string): Promise<TokenClaims | null>;
20
+ requireAuth(request: Request): Promise<PlatformUser>;
21
+ private getJwks;
22
+ private verifyJwt;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpF,UAAU,iBAAiB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/D;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,KAAK,CAAsD;gBAEvD,MAAM,EAAE,iBAAiB;IAO/B,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAoB9D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAelD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAIzD,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ1D,OAAO,CAAC,OAAO;YAOD,SAAS;CAiBxB"}
@@ -0,0 +1,76 @@
1
+ import { jwtVerify, createRemoteJWKSet } from 'jose';
2
+ export class BusiboxAuthAdapter {
3
+ constructor(config) {
4
+ this._jwks = null;
5
+ this.authzBaseUrl = config.authzBaseUrl ?? process.env.AUTHZ_BASE_URL ?? 'http://authz-api:8010';
6
+ this.jwksUrl = config.jwksUrl ?? `${this.authzBaseUrl}/.well-known/jwks.json`;
7
+ this.audience = config.audience ?? 'busibox';
8
+ this.getSessionToken = config.getSessionToken;
9
+ }
10
+ async getCurrentUser(request) {
11
+ try {
12
+ const token = await this.getSessionToken(request);
13
+ if (!token)
14
+ return null;
15
+ const claims = await this.verifyJwt(token);
16
+ if (!claims)
17
+ return null;
18
+ return {
19
+ id: claims.sub,
20
+ email: claims['email'] ?? '',
21
+ name: claims['name'],
22
+ role: claims['role'],
23
+ metadata: { scopes: claims.scopes },
24
+ };
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ async getServiceToken(audience) {
31
+ const response = await fetch(`${this.authzBaseUrl}/token/service`, {
32
+ method: 'POST',
33
+ headers: { 'Content-Type': 'application/json' },
34
+ body: JSON.stringify({ audience }),
35
+ });
36
+ if (!response.ok) {
37
+ throw new Error(`Failed to get service token for "${audience}": ${response.status}`);
38
+ }
39
+ const data = await response.json();
40
+ return data.token;
41
+ }
42
+ async validateToken(token) {
43
+ return this.verifyJwt(token);
44
+ }
45
+ async requireAuth(request) {
46
+ const user = await this.getCurrentUser(request);
47
+ if (!user) {
48
+ throw new Error('Unauthorized');
49
+ }
50
+ return user;
51
+ }
52
+ getJwks() {
53
+ if (!this._jwks) {
54
+ this._jwks = createRemoteJWKSet(new URL(this.jwksUrl));
55
+ }
56
+ return this._jwks;
57
+ }
58
+ async verifyJwt(token) {
59
+ try {
60
+ const { payload } = await jwtVerify(token, this.getJwks(), {
61
+ audience: this.audience,
62
+ });
63
+ return {
64
+ sub: payload.sub ?? '',
65
+ aud: typeof payload.aud === 'string' ? payload.aud : undefined,
66
+ exp: payload.exp ?? 0,
67
+ scopes: payload['scopes'],
68
+ ...payload,
69
+ };
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAYrD,MAAM,OAAO,kBAAkB;IAO7B,YAAY,MAAyB;QAF7B,UAAK,GAAiD,IAAI,CAAC;QAGjE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uBAAuB,CAAC;QACjG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,IAAI,CAAC,YAAY,wBAAwB,CAAC;QAC9E,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAgB;QACnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAEzB,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,GAAG;gBACd,KAAK,EAAG,MAAM,CAAC,OAAO,CAAY,IAAI,EAAE;gBACxC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAuB;gBAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,CAAuB;gBAC1C,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;aACpC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,gBAAgB,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAuB,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAgB;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;gBACzD,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE;gBACtB,GAAG,EAAE,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;gBAC9D,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;gBACrB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAyB;gBACjD,GAAI,OAAmC;aACxC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ import type { DataAdapter, Filter, CollectionSchema, QueryResult, SortField } from '../../interfaces/data';
2
+ interface BusiboxDataConfig {
3
+ dataApiUrl?: string;
4
+ getToken: () => Promise<string>;
5
+ }
6
+ export declare class BusiboxDataAdapter implements DataAdapter {
7
+ private baseUrl;
8
+ private getToken;
9
+ /** Cache doc_id by collection name */
10
+ private docIdCache;
11
+ constructor(config: BusiboxDataConfig);
12
+ ensureCollection(collection: string, schema: CollectionSchema): Promise<void>;
13
+ insert(collection: string, records: Record<string, unknown>[]): Promise<string[]>;
14
+ get<T = Record<string, unknown>>(collection: string, id: string): Promise<T | null>;
15
+ query<T = Record<string, unknown>>(collection: string, params?: {
16
+ filters?: Filter[];
17
+ sort?: SortField[];
18
+ limit?: number;
19
+ offset?: number;
20
+ }): Promise<QueryResult<T>>;
21
+ update(collection: string, filters: Filter[], data: Record<string, unknown>): Promise<number>;
22
+ delete(collection: string, filters: Filter[]): Promise<number>;
23
+ private getTokenAndDocId;
24
+ private requireDocId;
25
+ private findDocument;
26
+ private fetch;
27
+ private fetchRaw;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EAEN,gBAAgB,EAChB,WAAW,EACX,SAAS,EACV,MAAM,uBAAuB,CAAC;AAE/B,UAAU,iBAAiB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAcD,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAwB;IACxC,sCAAsC;IACtC,OAAO,CAAC,UAAU,CAAkC;gBAExC,MAAM,EAAE,iBAAiB;IAW/B,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB7E,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAYjF,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;IAWnF,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;IAeZ,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YActD,gBAAgB;YAMhB,YAAY;YAaZ,YAAY;YAUZ,KAAK;YAaL,QAAQ;CAcvB"}
@@ -0,0 +1,163 @@
1
+ export class BusiboxDataAdapter {
2
+ constructor(config) {
3
+ /** Cache doc_id by collection name */
4
+ this.docIdCache = new Map();
5
+ this.baseUrl =
6
+ config.dataApiUrl ??
7
+ (() => {
8
+ const host = process.env.DATA_API_HOST ?? 'localhost';
9
+ const port = process.env.DATA_API_PORT ?? '8002';
10
+ return `http://${host}:${port}`;
11
+ })();
12
+ this.getToken = config.getToken;
13
+ }
14
+ async ensureCollection(collection, schema) {
15
+ const token = await this.getToken();
16
+ // Check if document already exists
17
+ const existing = await this.findDocument(token, collection);
18
+ if (existing) {
19
+ this.docIdCache.set(collection, existing.id);
20
+ return;
21
+ }
22
+ // Create the document
23
+ const response = await this.fetch(token, '/documents', {
24
+ method: 'POST',
25
+ body: JSON.stringify({
26
+ name: collection,
27
+ schema: collectionSchemaToDataApi(schema),
28
+ visibility: 'personal',
29
+ }),
30
+ });
31
+ const doc = await response.json();
32
+ this.docIdCache.set(collection, doc.id);
33
+ }
34
+ async insert(collection, records) {
35
+ const [token, docId] = await this.getTokenAndDocId(collection);
36
+ const response = await this.fetch(token, `/documents/${docId}/records`, {
37
+ method: 'POST',
38
+ body: JSON.stringify({ records }),
39
+ });
40
+ const result = await response.json();
41
+ return result.ids;
42
+ }
43
+ async get(collection, id) {
44
+ const [token, docId] = await this.getTokenAndDocId(collection);
45
+ const response = await this.fetchRaw(token, `/documents/${docId}/records/${id}`);
46
+ if (response.status === 404)
47
+ return null;
48
+ if (!response.ok)
49
+ throw new Error(`Data API error: ${response.status}`);
50
+ const record = await response.json();
51
+ return record;
52
+ }
53
+ async query(collection, params) {
54
+ const [token, docId] = await this.getTokenAndDocId(collection);
55
+ const body = {
56
+ filters: params?.filters ? filtersToDataApi(params.filters) : [],
57
+ sort: params?.sort ?? [],
58
+ limit: params?.limit ?? 100,
59
+ offset: params?.offset ?? 0,
60
+ };
61
+ const response = await this.fetch(token, `/documents/${docId}/records/query`, {
62
+ method: 'POST',
63
+ body: JSON.stringify(body),
64
+ });
65
+ const result = await response.json();
66
+ return { records: result.records, total: result.total };
67
+ }
68
+ async update(collection, filters, data) {
69
+ const [token, docId] = await this.getTokenAndDocId(collection);
70
+ const response = await this.fetch(token, `/documents/${docId}/records`, {
71
+ method: 'PATCH',
72
+ body: JSON.stringify({
73
+ filters: filtersToDataApi(filters),
74
+ data,
75
+ }),
76
+ });
77
+ const result = await response.json();
78
+ return result.updated;
79
+ }
80
+ async delete(collection, filters) {
81
+ const [token, docId] = await this.getTokenAndDocId(collection);
82
+ const response = await this.fetch(token, `/documents/${docId}/records`, {
83
+ method: 'DELETE',
84
+ body: JSON.stringify({ filters: filtersToDataApi(filters) }),
85
+ });
86
+ const result = await response.json();
87
+ return result.deleted;
88
+ }
89
+ // --- Private helpers ---
90
+ async getTokenAndDocId(collection) {
91
+ const token = await this.getToken();
92
+ const docId = await this.requireDocId(token, collection);
93
+ return [token, docId];
94
+ }
95
+ async requireDocId(token, collection) {
96
+ if (this.docIdCache.has(collection))
97
+ return this.docIdCache.get(collection);
98
+ const doc = await this.findDocument(token, collection);
99
+ if (!doc) {
100
+ throw new Error(`Collection "${collection}" not found. Call ensureCollection first.`);
101
+ }
102
+ this.docIdCache.set(collection, doc.id);
103
+ return doc.id;
104
+ }
105
+ async findDocument(token, collection) {
106
+ const response = await this.fetchRaw(token, '/documents?limit=100');
107
+ if (!response.ok)
108
+ return null;
109
+ const result = await response.json();
110
+ return result.documents.find((d) => d.name === collection) ?? null;
111
+ }
112
+ async fetch(token, path, init = {}) {
113
+ const response = await this.fetchRaw(token, path, init);
114
+ if (!response.ok) {
115
+ const body = await response.text().catch(() => '');
116
+ throw new Error(`Data API error ${response.status}: ${body}`);
117
+ }
118
+ return response;
119
+ }
120
+ async fetchRaw(token, path, init = {}) {
121
+ return fetch(`${this.baseUrl}${path}`, {
122
+ ...init,
123
+ headers: {
124
+ Authorization: `Bearer ${token}`,
125
+ 'Content-Type': 'application/json',
126
+ ...(init.headers ?? {}),
127
+ },
128
+ });
129
+ }
130
+ }
131
+ function collectionSchemaToDataApi(schema) {
132
+ const fields = {};
133
+ for (const field of schema.fields) {
134
+ fields[field.name] = {
135
+ type: field.type,
136
+ nullable: field.nullable ?? true,
137
+ primary_key: field.primaryKey ?? false,
138
+ unique: field.unique ?? false,
139
+ default: field.default,
140
+ references: field.references,
141
+ };
142
+ }
143
+ return { fields, indexes: schema.indexes ?? [] };
144
+ }
145
+ const OP_MAP = {
146
+ eq: 'eq',
147
+ neq: 'neq',
148
+ gt: 'gt',
149
+ gte: 'gte',
150
+ lt: 'lt',
151
+ lte: 'lte',
152
+ in: 'in',
153
+ contains: 'contains',
154
+ startsWith: 'starts_with',
155
+ };
156
+ function filtersToDataApi(filters) {
157
+ return filters.map((f) => ({
158
+ field: f.field,
159
+ op: OP_MAP[f.op],
160
+ value: f.value,
161
+ }));
162
+ }
163
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
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
+ export { BusiboxAIAdapter } from './ai';
13
+ export { BusiboxDataAdapter } from './data';
14
+ export { BusiboxSearchAdapter } from './search';
15
+ export { BusiboxStorageAdapter } from './storage';
16
+ export { BusiboxAuthAdapter } from './auth';
17
+ export interface BusiboxAdapterConfig {
18
+ /** Returns the current user's JWT for service-to-service calls */
19
+ getToken: () => Promise<string>;
20
+ /** Custom Authz base URL (default: AUTHZ_BASE_URL env var) */
21
+ authzBaseUrl?: string;
22
+ /** Custom Agent API URL (default: AGENT_API_URL env var) */
23
+ agentApiUrl?: string;
24
+ /** Custom Data API URL (default: DATA_API_HOST/PORT env vars) */
25
+ dataApiUrl?: string;
26
+ /** Custom Search API URL (default: SEARCH_API_URL env var) */
27
+ searchApiUrl?: string;
28
+ /** How to get the session JWT from a request for auth (default: Authorization header) */
29
+ getSessionToken?: (request: Request) => Promise<string | null>;
30
+ }
31
+ /**
32
+ * Register all Busibox adapters with the platform registry.
33
+ * Call this once during app startup (e.g. in your middleware or root layout).
34
+ */
35
+ export declare function registerBusiboxAdapters(config: BusiboxAdapterConfig): void;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/adapters/busibox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,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,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAChE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAgC1E"}
@@ -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"}