@nekutima/biome-sdk 0.1.31 → 0.1.33

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 (51) hide show
  1. package/README.md +4 -0
  2. package/dist/chat/chat.service.d.ts +47 -31
  3. package/dist/chat/chat.service.d.ts.map +1 -1
  4. package/dist/chat/chat.service.js +158 -8
  5. package/dist/chat/chat.service.js.map +1 -1
  6. package/dist/ecosystem/ecosystem.model.d.ts +46 -3
  7. package/dist/ecosystem/ecosystem.model.d.ts.map +1 -1
  8. package/dist/ecosystem/ecosystem.model.js +2 -2
  9. package/dist/ecosystem/ecosystem.service.d.ts +76 -0
  10. package/dist/ecosystem/ecosystem.service.d.ts.map +1 -0
  11. package/dist/ecosystem/ecosystem.service.js +211 -0
  12. package/dist/ecosystem/ecosystem.service.js.map +1 -0
  13. package/dist/ecosystem/organization.model.d.ts +83 -0
  14. package/dist/ecosystem/organization.model.d.ts.map +1 -0
  15. package/dist/ecosystem/organization.model.js +7 -0
  16. package/dist/ecosystem/organization.model.js.map +1 -0
  17. package/dist/ecosystem/organization.service.d.ts +76 -0
  18. package/dist/ecosystem/organization.service.d.ts.map +1 -0
  19. package/dist/ecosystem/organization.service.js +213 -0
  20. package/dist/ecosystem/organization.service.js.map +1 -0
  21. package/dist/ecosystem/person.model.d.ts +75 -0
  22. package/dist/ecosystem/person.model.d.ts.map +1 -0
  23. package/dist/ecosystem/person.model.js +7 -0
  24. package/dist/ecosystem/person.model.js.map +1 -0
  25. package/dist/ecosystem/person.service.d.ts +77 -0
  26. package/dist/ecosystem/person.service.d.ts.map +1 -0
  27. package/dist/ecosystem/person.service.js +214 -0
  28. package/dist/ecosystem/person.service.js.map +1 -0
  29. package/dist/ecosystem/schemas.d.ts +30 -1
  30. package/dist/ecosystem/schemas.d.ts.map +1 -1
  31. package/dist/ecosystem/schemas.js +39 -2
  32. package/dist/ecosystem/schemas.js.map +1 -1
  33. package/dist/ecosystem/search.model.d.ts +28 -0
  34. package/dist/ecosystem/search.model.d.ts.map +1 -0
  35. package/dist/ecosystem/search.model.js +6 -0
  36. package/dist/ecosystem/search.model.js.map +1 -0
  37. package/dist/ecosystem/search.service.d.ts +30 -0
  38. package/dist/ecosystem/search.service.d.ts.map +1 -0
  39. package/dist/ecosystem/search.service.js +92 -0
  40. package/dist/ecosystem/search.service.js.map +1 -0
  41. package/dist/index.d.ts +18 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +25 -3
  44. package/dist/index.js.map +1 -1
  45. package/dist/models/chat.model.d.ts +52 -11
  46. package/dist/models/chat.model.d.ts.map +1 -1
  47. package/dist/utils/validation.utils.d.ts +20 -0
  48. package/dist/utils/validation.utils.d.ts.map +1 -1
  49. package/dist/utils/validation.utils.js +39 -1
  50. package/dist/utils/validation.utils.js.map +1 -1
  51. package/package.json +1 -2
package/README.md CHANGED
@@ -11,6 +11,7 @@ The Biome SDK is the **official contract** between frontend and backend teams, p
11
11
  - 🔄 **Authentication** - Login, logout, session management
12
12
  - 📋 **Task Management** - CRUD operations, state transitions, search
13
13
  - 👤 **Profile Management** - User profiles, updates, validation
14
+ - 💬 **Chat System** - Real-time messaging, typing indicators, read receipts
14
15
  - 📁 **File Upload** - Image validation, upload, management
15
16
  - 🛡️ **CSRF Protection** - Auto-injection, token management
16
17
  - 🔧 **Utilities** - Sorting, validation, date manipulation
@@ -176,6 +177,9 @@ const biomeNoCsrf = BiomeSDK.initialize({
176
177
  - [CONTRACT.md](./CONTRACT.md) - SDK contract and scope
177
178
  - [FRONTEND_INTEGRATION.md](./FRONTEND_INTEGRATION.md) - Frontend integration guide
178
179
  - [BACKEND_INTEGRATION.md](./BACKEND_INTEGRATION.md) - Backend integration guide
180
+ - [docs/INDEX.md](./docs/INDEX.md) - Complete documentation index
181
+ - [docs/chat-sdk.md](./docs/chat-sdk.md) - Comprehensive chat SDK documentation
182
+ - [CHANGELOG.md](./CHANGELOG.md) - Version history and changes
179
183
 
180
184
  ## Version
181
185
 
@@ -1,48 +1,64 @@
1
1
  import { BiomeHttpClient } from "../core/http-client";
2
- export interface ChatMessageWithSender {
3
- id: number;
4
- chatId: number;
5
- senderId: number;
6
- senderUsername: string;
7
- senderAvatarUrl?: string;
8
- content: string;
9
- createdAt: Date;
10
- updatedAt?: Date;
11
- }
12
- export interface ChatWithParticipants {
13
- id: number;
14
- taskId: number;
15
- participantIds: number[];
16
- participantUsernames: string[];
17
- createdAt: Date;
18
- updatedAt?: Date;
19
- }
20
- export interface TaskChatMessagesResponse {
21
- chat: ChatWithParticipants;
22
- messages: ChatMessageWithSender[];
23
- pagination: {
24
- hasMore: boolean;
25
- nextCursor?: string;
26
- };
27
- }
28
- export interface SendChatMessageResponse {
29
- message: ChatMessageWithSender;
30
- }
2
+ import { ChatMessageWithSender, TaskChatMessagesResponse, ChatEvent } from "../models/chat.model";
31
3
  export declare class BiomeChat {
32
4
  private readonly http;
5
+ private eventSources;
6
+ private eventListeners;
33
7
  constructor(http: BiomeHttpClient);
34
8
  /**
35
9
  * Get chat messages for a task
10
+ * @param taskId - The task ID
11
+ * @param cursor - Pagination cursor for loading more messages
12
+ * @param limit - Number of messages to fetch (default: 50)
36
13
  */
37
- getMessages(taskId: number, cursor?: string): Promise<TaskChatMessagesResponse>;
14
+ getMessages(taskId: number, cursor?: string, limit?: number): Promise<TaskChatMessagesResponse>;
38
15
  /**
39
16
  * Send a chat message for a task
17
+ * @param taskId - The task ID
18
+ * @param content - The message content
40
19
  */
41
20
  sendMessage(taskId: number, content: string): Promise<ChatMessageWithSender>;
21
+ /**
22
+ * Mark a message as read
23
+ * @param messageId - The message ID to mark as read
24
+ */
25
+ markMessageAsRead(messageId: number): Promise<void>;
26
+ /**
27
+ * Send typing indicator
28
+ * @param taskId - The task ID
29
+ * @param isTyping - Whether user is typing
30
+ */
31
+ sendTypingIndicator(taskId: number, isTyping: boolean): Promise<void>;
42
32
  /**
43
33
  * Connect to chat events via SSE
44
- * Returns raw EventSource for frontend to handle
34
+ * @param chatId - The chat ID
35
+ * @returns EventSource connection
45
36
  */
46
37
  connect(chatId: number): EventSource;
38
+ /**
39
+ * Disconnect from chat events
40
+ * @param chatId - The chat ID
41
+ */
42
+ disconnect(chatId: number): void;
43
+ /**
44
+ * Subscribe to chat events
45
+ * @param chatId - The chat ID
46
+ * @param listener - Event listener callback
47
+ */
48
+ subscribeToEvents(chatId: number, listener: (event: ChatEvent) => void): void;
49
+ /**
50
+ * Unsubscribe from chat events
51
+ * @param chatId - The chat ID
52
+ * @param listener - Event listener callback to remove
53
+ */
54
+ unsubscribeFromEvents(chatId: number, listener: (event: ChatEvent) => void): void;
55
+ /**
56
+ * Get all active chat connections
57
+ */
58
+ getActiveConnections(): number[];
59
+ /**
60
+ * Disconnect all chat connections
61
+ */
62
+ disconnectAll(): void;
47
63
  }
48
64
  //# sourceMappingURL=chat.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,UAAU,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,qBAAqB,CAAC;CAChC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;gBAE3B,IAAI,EAAE,eAAe;IAIjC;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;IAYpC;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,CAAC;IAWjC;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW;CAMrC"}
1
+ {"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EAIxB,SAAS,EACV,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,cAAc,CAA6D;gBAEvE,IAAI,EAAE,eAAe;IAIjC;;;;;OAKG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,wBAAwB,CAAC;IAiBpC;;;;OAIG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,CAAC;IAqBjC;;;OAGG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD;;;;OAIG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3E;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW;IAUpC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAShC;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI;IAsD7E;;;;OAIG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI;IAUjF;;OAEG;IACH,oBAAoB,IAAI,MAAM,EAAE;IAIhC;;OAEG;IACH,aAAa,IAAI,IAAI;CAOtB"}
@@ -4,42 +4,192 @@ exports.BiomeChat = void 0;
4
4
  const error_handler_1 = require("../core/error-handler");
5
5
  class BiomeChat {
6
6
  constructor(http) {
7
+ this.eventSources = new Map();
8
+ this.eventListeners = new Map();
7
9
  this.http = http;
8
10
  }
9
11
  /**
10
12
  * Get chat messages for a task
13
+ * @param taskId - The task ID
14
+ * @param cursor - Pagination cursor for loading more messages
15
+ * @param limit - Number of messages to fetch (default: 50)
11
16
  */
12
- async getMessages(taskId, cursor) {
17
+ async getMessages(taskId, cursor, limit = 50) {
13
18
  try {
14
- const params = cursor ? `?cursor=${encodeURIComponent(cursor)}` : "";
15
- const response = await this.http.get(`/tasks/task/${taskId}/chat/messages${params}`);
19
+ const params = new URLSearchParams();
20
+ if (cursor)
21
+ params.append('cursor', cursor);
22
+ if (limit)
23
+ params.append('limit', limit.toString());
24
+ const queryString = params.toString() ? `?${params.toString()}` : "";
25
+ const response = await this.http.get(`/tasks/task/${taskId}/chat/messages${queryString}`);
16
26
  return response.payload;
17
27
  }
18
28
  catch (error) {
19
- throw (0, error_handler_1.createSdkError)(error, "Failed to get chat messages");
29
+ const sdkError = (0, error_handler_1.createSdkError)(error, "Failed to get chat messages");
30
+ throw new Error(sdkError.userMessage || sdkError.message);
20
31
  }
21
32
  }
22
33
  /**
23
34
  * Send a chat message for a task
35
+ * @param taskId - The task ID
36
+ * @param content - The message content
24
37
  */
25
38
  async sendMessage(taskId, content) {
26
39
  try {
40
+ // Validate message content
41
+ if (!content || content.trim().length === 0) {
42
+ const error = (0, error_handler_1.createSdkError)(new Error("Message content cannot be empty"), "Invalid message");
43
+ throw new Error(error.userMessage || error.message);
44
+ }
27
45
  const response = await this.http.post(`/tasks/task/${taskId}/chat/messages`, { content });
28
46
  return response.payload.message;
29
47
  }
30
48
  catch (error) {
31
- throw (0, error_handler_1.createSdkError)(error, "Failed to send chat message");
49
+ if (error instanceof Error && error.message.includes("Message content cannot be empty")) {
50
+ throw error;
51
+ }
52
+ const sdkError = (0, error_handler_1.createSdkError)(error, "Failed to send chat message");
53
+ throw new Error(sdkError.userMessage || sdkError.message);
54
+ }
55
+ }
56
+ /**
57
+ * Mark a message as read
58
+ * @param messageId - The message ID to mark as read
59
+ */
60
+ async markMessageAsRead(messageId) {
61
+ try {
62
+ await this.http.post(`/chats/messages/${messageId}/read`, {});
63
+ }
64
+ catch (error) {
65
+ const sdkError = (0, error_handler_1.createSdkError)(error, "Failed to mark message as read");
66
+ throw new Error(sdkError.userMessage || sdkError.message);
67
+ }
68
+ }
69
+ /**
70
+ * Send typing indicator
71
+ * @param taskId - The task ID
72
+ * @param isTyping - Whether user is typing
73
+ */
74
+ async sendTypingIndicator(taskId, isTyping) {
75
+ try {
76
+ await this.http.post(`/tasks/task/${taskId}/chat/typing`, { isTyping });
77
+ }
78
+ catch (error) {
79
+ // Silently fail typing indicators to avoid disrupting user experience
80
+ console.debug("Failed to send typing indicator:", error);
32
81
  }
33
82
  }
34
83
  /**
35
84
  * Connect to chat events via SSE
36
- * Returns raw EventSource for frontend to handle
85
+ * @param chatId - The chat ID
86
+ * @returns EventSource connection
37
87
  */
38
88
  connect(chatId) {
39
- const baseUrl = this.http.baseURL;
40
- return new EventSource(`${baseUrl}/chats/${chatId}/events`, {
89
+ const baseUrl = this.http.baseURL.replace(/\/$/, ''); // Remove trailing slash
90
+ const eventSource = new EventSource(`${baseUrl}/chats/${chatId}/events`, {
41
91
  withCredentials: true,
42
92
  });
93
+ this.eventSources.set(chatId, eventSource);
94
+ return eventSource;
95
+ }
96
+ /**
97
+ * Disconnect from chat events
98
+ * @param chatId - The chat ID
99
+ */
100
+ disconnect(chatId) {
101
+ const eventSource = this.eventSources.get(chatId);
102
+ if (eventSource) {
103
+ eventSource.close();
104
+ this.eventSources.delete(chatId);
105
+ this.eventListeners.delete(chatId);
106
+ }
107
+ }
108
+ /**
109
+ * Subscribe to chat events
110
+ * @param chatId - The chat ID
111
+ * @param listener - Event listener callback
112
+ */
113
+ subscribeToEvents(chatId, listener) {
114
+ if (!this.eventListeners.has(chatId)) {
115
+ this.eventListeners.set(chatId, []);
116
+ // Set up the EventSource connection if not already connected
117
+ let eventSource = this.eventSources.get(chatId);
118
+ if (!eventSource) {
119
+ eventSource = this.connect(chatId);
120
+ }
121
+ // Handle different event types
122
+ eventSource.addEventListener('chat.message.created', (e) => {
123
+ try {
124
+ const payload = JSON.parse(e.data);
125
+ const event = {
126
+ type: 'message.created',
127
+ payload: payload
128
+ };
129
+ this.eventListeners.get(chatId)?.forEach(cb => cb(event));
130
+ }
131
+ catch (error) {
132
+ console.error('Failed to parse message.created event:', error);
133
+ }
134
+ });
135
+ eventSource.addEventListener('chat.message.read', (e) => {
136
+ try {
137
+ const payload = JSON.parse(e.data);
138
+ const event = {
139
+ type: 'message.read',
140
+ payload: payload
141
+ };
142
+ this.eventListeners.get(chatId)?.forEach(cb => cb(event));
143
+ }
144
+ catch (error) {
145
+ console.error('Failed to parse message.read event:', error);
146
+ }
147
+ });
148
+ eventSource.addEventListener('user.typing', (e) => {
149
+ try {
150
+ const payload = JSON.parse(e.data);
151
+ const event = {
152
+ type: 'user.typing',
153
+ payload: payload
154
+ };
155
+ this.eventListeners.get(chatId)?.forEach(cb => cb(event));
156
+ }
157
+ catch (error) {
158
+ console.error('Failed to parse user.typing event:', error);
159
+ }
160
+ });
161
+ }
162
+ this.eventListeners.get(chatId)?.push(listener);
163
+ }
164
+ /**
165
+ * Unsubscribe from chat events
166
+ * @param chatId - The chat ID
167
+ * @param listener - Event listener callback to remove
168
+ */
169
+ unsubscribeFromEvents(chatId, listener) {
170
+ const listeners = this.eventListeners.get(chatId);
171
+ if (listeners) {
172
+ const index = listeners.indexOf(listener);
173
+ if (index > -1) {
174
+ listeners.splice(index, 1);
175
+ }
176
+ }
177
+ }
178
+ /**
179
+ * Get all active chat connections
180
+ */
181
+ getActiveConnections() {
182
+ return Array.from(this.eventSources.keys());
183
+ }
184
+ /**
185
+ * Disconnect all chat connections
186
+ */
187
+ disconnectAll() {
188
+ this.eventSources.forEach((es, chatId) => {
189
+ es.close();
190
+ });
191
+ this.eventSources.clear();
192
+ this.eventListeners.clear();
43
193
  }
44
194
  }
45
195
  exports.BiomeChat = BiomeChat;
@@ -1 +1 @@
1
- {"version":3,"file":"chat.service.js","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":";;;AACA,yDAAuD;AAoCvD,MAAa,SAAS;IAGpB,YAAY,IAAqB;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,MAAc,EACd,MAAe;QAEf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAElC,eAAe,MAAM,iBAAiB,MAAM,EAAE,CAAC,CAAC;YAClD,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,8BAAc,EAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,MAAc,EACd,OAAe;QAEf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAEnC,eAAe,MAAM,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,8BAAc,EAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,MAAc;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,OAAO,IAAI,WAAW,CAAC,GAAG,OAAO,UAAU,MAAM,SAAS,EAAE;YAC1D,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;IACL,CAAC;CACF;AApDD,8BAoDC"}
1
+ {"version":3,"file":"chat.service.js","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":";;;AACA,yDAAuD;AAWvD,MAAa,SAAS;IAKpB,YAAY,IAAqB;QAHzB,iBAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;QACnD,mBAAc,GAAmD,IAAI,GAAG,EAAE,CAAC;QAGjF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CACf,MAAc,EACd,MAAe,EACf,QAAgB,EAAE;QAElB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,IAAI,KAAK;gBAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEpD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAElC,eAAe,MAAM,iBAAiB,WAAW,EAAE,CAAC,CAAC;YACvD,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAA,8BAAc,EAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CACf,MAAc,EACd,OAAe;QAEf,IAAI,CAAC;YACH,2BAA2B;YAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,IAAA,8BAAc,EAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBAC9F,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAEnC,eAAe,MAAM,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;gBACxF,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,QAAQ,GAAG,IAAA,8BAAc,EAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAClB,mBAAmB,SAAS,OAAO,EACnC,EAAE,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAA,8BAAc,EAAC,KAAK,EAAE,gCAAgC,CAAC,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,QAAiB;QACzD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAClB,eAAe,MAAM,cAAc,EACnC,EAAE,QAAQ,EAAE,CACb,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sEAAsE;YACtE,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,MAAc;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAC9E,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,GAAG,OAAO,UAAU,MAAM,SAAS,EAAE;YACvE,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,MAAc;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAAc,EAAE,QAAoC;QACpE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAEpC,6DAA6D;YAC7D,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YAED,+BAA+B;YAC/B,WAAW,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC,CAAe,EAAE,EAAE;gBACvE,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnC,MAAM,KAAK,GAAc;wBACvB,IAAI,EAAE,iBAAiB;wBACvB,OAAO,EAAE,OAAgC;qBAC1C,CAAC;oBACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAe,EAAE,EAAE;gBACpE,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnC,MAAM,KAAK,GAAc;wBACvB,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,OAA+B;qBACzC,CAAC;oBACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAe,EAAE,EAAE;gBAC9D,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnC,MAAM,KAAK,GAAc;wBACvB,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,OAA0B;qBACpC,CAAC;oBACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACH,qBAAqB,CAAC,MAAc,EAAE,QAAoC;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACf,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;YACvC,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACF;AAzND,8BAyNC"}
@@ -1,16 +1,59 @@
1
1
  /**
2
- * Unified Ecosystem model for Biome platform
3
- * This model is shared between frontend and backend
2
+ * Ecosystem model for Biome platform
3
+ * Ecosystems are containers that can be nested and have participants
4
4
  */
5
+ import { OrganizationMinimal } from './organization.model';
6
+ import { PersonMinimal } from './person.model';
7
+ export type EcosystemType = 'business' | 'personal' | 'community' | 'government' | 'nonprofit' | 'other';
8
+ export type EcosystemStatus = 'active' | 'inactive' | 'archived';
9
+ export { OrganizationMinimal };
10
+ export { PersonMinimal };
5
11
  export interface Ecosystem {
6
12
  id?: number;
7
13
  name: string;
8
14
  description?: string;
9
- deleted: boolean;
15
+ type?: EcosystemType;
16
+ status?: EcosystemStatus;
17
+ ownerId: number;
18
+ parentEcosystemId?: number;
19
+ deletedAt?: Date;
20
+ deletedBy?: number;
10
21
  createdAt: Date;
11
22
  createdBy: number;
12
23
  updatedAt: Date;
13
24
  updatedBy: number;
14
25
  }
15
26
  export type EcosystemMinimal = Pick<Ecosystem, 'id' | 'name' | 'description'>;
27
+ export interface CreateEcosystemRequest {
28
+ name: string;
29
+ description?: string;
30
+ type?: EcosystemType;
31
+ parentEcosystemId?: number;
32
+ }
33
+ export interface UpdateEcosystemRequest {
34
+ name?: string;
35
+ description?: string;
36
+ type?: EcosystemType;
37
+ status?: EcosystemStatus;
38
+ parentEcosystemId?: number;
39
+ }
40
+ export interface EcosystemListParams {
41
+ page?: number;
42
+ limit?: number;
43
+ status?: EcosystemStatus;
44
+ parentEcosystemId?: number;
45
+ }
46
+ export interface EcosystemListResponse {
47
+ ecosystems: Ecosystem[];
48
+ pagination: {
49
+ page: number;
50
+ limit: number;
51
+ total: number;
52
+ totalPages: number;
53
+ };
54
+ }
55
+ export interface EcosystemWithParticipants extends Ecosystem {
56
+ organizations: OrganizationMinimal[];
57
+ people: PersonMinimal[];
58
+ }
16
59
  //# sourceMappingURL=ecosystem.model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ecosystem.model.d.ts","sourceRoot":"","sources":["../../src/ecosystem/ecosystem.model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"ecosystem.model.d.ts","sourceRoot":"","sources":["../../src/ecosystem/ecosystem.model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAU,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AACzG,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,WAAW,SAAS;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC;AAE9E,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IAClC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAED,MAAM,WAAW,yBAA0B,SAAQ,SAAS;IACxD,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,MAAM,EAAE,aAAa,EAAE,CAAC;CAC3B"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
- * Unified Ecosystem model for Biome platform
4
- * This model is shared between frontend and backend
3
+ * Ecosystem model for Biome platform
4
+ * Ecosystems are containers that can be nested and have participants
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  //# sourceMappingURL=ecosystem.model.js.map
@@ -0,0 +1,76 @@
1
+ import { BiomeHttpClient } from "../core/http-client";
2
+ import { Ecosystem, CreateEcosystemRequest, UpdateEcosystemRequest, EcosystemListParams, EcosystemListResponse, OrganizationMinimal, PersonMinimal } from "./ecosystem.model";
3
+ /**
4
+ * Ecosystem management service
5
+ */
6
+ export declare class BiomeEcosystems {
7
+ private http;
8
+ constructor(http: BiomeHttpClient);
9
+ /**
10
+ * Get ecosystem by ID
11
+ */
12
+ getById(id: number): Promise<Ecosystem>;
13
+ /**
14
+ * Get organizations belonging to an ecosystem
15
+ */
16
+ getOrganizations(ecosystemId: number): Promise<OrganizationMinimal[]>;
17
+ /**
18
+ * Get people belonging to an ecosystem
19
+ */
20
+ getPeople(ecosystemId: number): Promise<PersonMinimal[]>;
21
+ /**
22
+ * List ecosystems with pagination and filters
23
+ */
24
+ list(params?: EcosystemListParams): Promise<EcosystemListResponse>;
25
+ /**
26
+ * Get child ecosystems (nested 1:n)
27
+ */
28
+ getChildren(parentId: number): Promise<Ecosystem[]>;
29
+ /**
30
+ * Create a new ecosystem
31
+ */
32
+ create(ecosystem: CreateEcosystemRequest): Promise<{
33
+ id: number;
34
+ }>;
35
+ /**
36
+ * Update an existing ecosystem
37
+ */
38
+ update(id: number, updates: UpdateEcosystemRequest): Promise<Ecosystem>;
39
+ /**
40
+ * Delete an ecosystem (soft delete)
41
+ */
42
+ delete(id: number): Promise<void>;
43
+ /**
44
+ * Add organization to ecosystem
45
+ */
46
+ addOrganization(ecosystemId: number, organizationId: number): Promise<void>;
47
+ /**
48
+ * Remove organization from ecosystem
49
+ */
50
+ removeOrganization(ecosystemId: number, organizationId: number): Promise<void>;
51
+ /**
52
+ * Add person to ecosystem
53
+ */
54
+ addPerson(ecosystemId: number, personId: number): Promise<void>;
55
+ /**
56
+ * Remove person from ecosystem
57
+ */
58
+ removePerson(ecosystemId: number, personId: number): Promise<void>;
59
+ /**
60
+ * Set parent ecosystem (for nesting)
61
+ */
62
+ setParent(ecosystemId: number, parentEcosystemId: number): Promise<Ecosystem>;
63
+ /**
64
+ * Remove parent ecosystem
65
+ */
66
+ removeParent(ecosystemId: number): Promise<Ecosystem>;
67
+ /**
68
+ * Transfer ownership to another user
69
+ */
70
+ transferOwnership(ecosystemId: number, newOwnerId: number): Promise<Ecosystem>;
71
+ /**
72
+ * Build query parameters from filters
73
+ */
74
+ private buildQueryParams;
75
+ }
76
+ //# sourceMappingURL=ecosystem.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem.service.d.ts","sourceRoot":"","sources":["../../src/ecosystem/ecosystem.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EACH,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EAErB,mBAAmB,EACnB,aAAa,EAChB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,qBAAa,eAAe;IACZ,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,eAAe;IAEzC;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAW7C;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAW3E;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAW9D;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAYxE;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAWzD;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,sBAAsB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAYxE;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;IAY7E;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvC;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjF;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpF;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrE;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxE;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAYnF;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAW3D;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAYpF;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAoB3B"}