@bubblelab/bubble-core 0.1.174 → 0.1.176

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 (50) hide show
  1. package/dist/bubble-bundle.d.ts +105 -27
  2. package/dist/bubble-factory.d.ts.map +1 -1
  3. package/dist/bubble-factory.js +8 -0
  4. package/dist/bubble-factory.js.map +1 -1
  5. package/dist/bubbles/service-bubble/attio/attio.d.ts +563 -0
  6. package/dist/bubbles/service-bubble/attio/attio.d.ts.map +1 -0
  7. package/dist/bubbles/service-bubble/attio/attio.js +484 -0
  8. package/dist/bubbles/service-bubble/attio/attio.js.map +1 -0
  9. package/dist/bubbles/service-bubble/attio/attio.schema.d.ts +527 -0
  10. package/dist/bubbles/service-bubble/attio/attio.schema.d.ts.map +1 -0
  11. package/dist/bubbles/service-bubble/attio/attio.schema.js +386 -0
  12. package/dist/bubbles/service-bubble/attio/attio.schema.js.map +1 -0
  13. package/dist/bubbles/service-bubble/attio/attio.utils.d.ts +1 -0
  14. package/dist/bubbles/service-bubble/attio/attio.utils.d.ts.map +1 -0
  15. package/dist/bubbles/service-bubble/attio/attio.utils.js +4 -0
  16. package/dist/bubbles/service-bubble/attio/attio.utils.js.map +1 -0
  17. package/dist/bubbles/service-bubble/attio/index.d.ts +3 -0
  18. package/dist/bubbles/service-bubble/attio/index.d.ts.map +1 -0
  19. package/dist/bubbles/service-bubble/attio/index.js +3 -0
  20. package/dist/bubbles/service-bubble/attio/index.js.map +1 -0
  21. package/dist/bubbles/service-bubble/capability-pipeline.js +2 -2
  22. package/dist/bubbles/service-bubble/capability-pipeline.js.map +1 -1
  23. package/dist/bubbles/service-bubble/hubspot/hubspot.d.ts +388 -0
  24. package/dist/bubbles/service-bubble/hubspot/hubspot.d.ts.map +1 -0
  25. package/dist/bubbles/service-bubble/hubspot/hubspot.js +241 -0
  26. package/dist/bubbles/service-bubble/hubspot/hubspot.js.map +1 -0
  27. package/dist/bubbles/service-bubble/hubspot/hubspot.schema.d.ts +345 -0
  28. package/dist/bubbles/service-bubble/hubspot/hubspot.schema.d.ts.map +1 -0
  29. package/dist/bubbles/service-bubble/hubspot/hubspot.schema.js +180 -0
  30. package/dist/bubbles/service-bubble/hubspot/hubspot.schema.js.map +1 -0
  31. package/dist/bubbles/service-bubble/hubspot/index.d.ts +3 -0
  32. package/dist/bubbles/service-bubble/hubspot/index.d.ts.map +1 -0
  33. package/dist/bubbles/service-bubble/hubspot/index.js +3 -0
  34. package/dist/bubbles/service-bubble/hubspot/index.js.map +1 -0
  35. package/dist/bubbles/tool-bubble/browser-tools/_shared/ai/ai-browser-agent.d.ts +5 -30
  36. package/dist/bubbles/tool-bubble/browser-tools/_shared/ai/ai-browser-agent.d.ts.map +1 -1
  37. package/dist/bubbles/tool-bubble/browser-tools/_shared/ai/ai-browser-agent.js +70 -204
  38. package/dist/bubbles/tool-bubble/browser-tools/_shared/ai/ai-browser-agent.js.map +1 -1
  39. package/dist/bubbles/tool-bubble/browser-tools/_shared/ai/ai-browser-agent.types.d.ts +4 -0
  40. package/dist/bubbles/tool-bubble/browser-tools/_shared/ai/ai-browser-agent.types.d.ts.map +1 -1
  41. package/dist/bubbles/tool-bubble/browser-tools/linkedin-connection/tool.d.ts +31 -0
  42. package/dist/bubbles/tool-bubble/browser-tools/linkedin-connection/tool.d.ts.map +1 -1
  43. package/dist/bubbles/tool-bubble/browser-tools/linkedin-connection/tool.js +202 -39
  44. package/dist/bubbles/tool-bubble/browser-tools/linkedin-connection/tool.js.map +1 -1
  45. package/dist/bubbles.json +1598 -2
  46. package/dist/index.d.ts +4 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +2 -0
  49. package/dist/index.js.map +1 -1
  50. package/package.json +2 -2
@@ -0,0 +1,388 @@
1
+ import { ServiceBubble } from '../../../types/service-bubble-class.js';
2
+ import type { BubbleContext } from '../../../types/bubble.js';
3
+ import { CredentialType } from '@bubblelab/shared-schemas';
4
+ import { type HubSpotParamsInput, type HubSpotResult } from './hubspot.schema.js';
5
+ /**
6
+ * HubSpot CRM Service Bubble
7
+ *
8
+ * Comprehensive HubSpot CRM integration for managing contacts, companies, deals, and tickets.
9
+ *
10
+ * Features:
11
+ * - Full CRUD operations for all CRM object types
12
+ * - Advanced search with filter groups (AND/OR logic)
13
+ * - Property-based data management
14
+ * - Pagination support for large datasets
15
+ *
16
+ * Use cases:
17
+ * - Lead management and contact synchronization
18
+ * - Company and deal pipeline tracking
19
+ * - Support ticket management
20
+ * - CRM data enrichment and automation
21
+ *
22
+ * Security Features:
23
+ * - OAuth 2.0 authentication with HubSpot
24
+ * - Scoped access permissions
25
+ * - Secure credential handling
26
+ */
27
+ export declare class HubSpotBubble<T extends HubSpotParamsInput = HubSpotParamsInput> extends ServiceBubble<T, Extract<HubSpotResult, {
28
+ operation: T['operation'];
29
+ }>> {
30
+ static readonly type: "service";
31
+ static readonly service = "hubspot";
32
+ static readonly authType: "oauth";
33
+ static readonly bubbleName = "hubspot";
34
+ static readonly schema: import("zod").ZodDiscriminatedUnion<"operation", [import("zod").ZodObject<{
35
+ operation: import("zod").ZodLiteral<"create_record">;
36
+ object_type: import("zod").ZodEnum<["contacts", "companies", "deals", "tickets"]>;
37
+ properties: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
38
+ credentials: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodNativeEnum<typeof CredentialType>, import("zod").ZodString>>;
39
+ }, "strip", import("zod").ZodTypeAny, {
40
+ properties: Record<string, string>;
41
+ operation: "create_record";
42
+ object_type: "deals" | "contacts" | "companies" | "tickets";
43
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
44
+ }, {
45
+ properties: Record<string, string>;
46
+ operation: "create_record";
47
+ object_type: "deals" | "contacts" | "companies" | "tickets";
48
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
49
+ }>, import("zod").ZodObject<{
50
+ operation: import("zod").ZodLiteral<"get_record">;
51
+ object_type: import("zod").ZodEnum<["contacts", "companies", "deals", "tickets"]>;
52
+ record_id: import("zod").ZodString;
53
+ properties: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
54
+ credentials: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodNativeEnum<typeof CredentialType>, import("zod").ZodString>>;
55
+ }, "strip", import("zod").ZodTypeAny, {
56
+ operation: "get_record";
57
+ record_id: string;
58
+ object_type: "deals" | "contacts" | "companies" | "tickets";
59
+ properties?: string[] | undefined;
60
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
61
+ }, {
62
+ operation: "get_record";
63
+ record_id: string;
64
+ object_type: "deals" | "contacts" | "companies" | "tickets";
65
+ properties?: string[] | undefined;
66
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
67
+ }>, import("zod").ZodObject<{
68
+ operation: import("zod").ZodLiteral<"update_record">;
69
+ object_type: import("zod").ZodEnum<["contacts", "companies", "deals", "tickets"]>;
70
+ record_id: import("zod").ZodString;
71
+ properties: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
72
+ credentials: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodNativeEnum<typeof CredentialType>, import("zod").ZodString>>;
73
+ }, "strip", import("zod").ZodTypeAny, {
74
+ properties: Record<string, string>;
75
+ operation: "update_record";
76
+ record_id: string;
77
+ object_type: "deals" | "contacts" | "companies" | "tickets";
78
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
79
+ }, {
80
+ properties: Record<string, string>;
81
+ operation: "update_record";
82
+ record_id: string;
83
+ object_type: "deals" | "contacts" | "companies" | "tickets";
84
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
85
+ }>, import("zod").ZodObject<{
86
+ operation: import("zod").ZodLiteral<"search_records">;
87
+ object_type: import("zod").ZodEnum<["contacts", "companies", "deals", "tickets"]>;
88
+ filter_groups: import("zod").ZodArray<import("zod").ZodObject<{
89
+ filters: import("zod").ZodArray<import("zod").ZodObject<{
90
+ propertyName: import("zod").ZodString;
91
+ operator: import("zod").ZodEnum<["EQ", "NEQ", "LT", "LTE", "GT", "GTE", "BETWEEN", "IN", "NOT_IN", "HAS_PROPERTY", "NOT_HAS_PROPERTY", "CONTAINS_TOKEN", "NOT_CONTAINS_TOKEN"]>;
92
+ value: import("zod").ZodOptional<import("zod").ZodString>;
93
+ highValue: import("zod").ZodOptional<import("zod").ZodString>;
94
+ values: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
95
+ }, "strip", import("zod").ZodTypeAny, {
96
+ propertyName: string;
97
+ operator: "GT" | "IN" | "LT" | "EQ" | "NEQ" | "LTE" | "GTE" | "BETWEEN" | "NOT_IN" | "HAS_PROPERTY" | "NOT_HAS_PROPERTY" | "CONTAINS_TOKEN" | "NOT_CONTAINS_TOKEN";
98
+ value?: string | undefined;
99
+ values?: string[] | undefined;
100
+ highValue?: string | undefined;
101
+ }, {
102
+ propertyName: string;
103
+ operator: "GT" | "IN" | "LT" | "EQ" | "NEQ" | "LTE" | "GTE" | "BETWEEN" | "NOT_IN" | "HAS_PROPERTY" | "NOT_HAS_PROPERTY" | "CONTAINS_TOKEN" | "NOT_CONTAINS_TOKEN";
104
+ value?: string | undefined;
105
+ values?: string[] | undefined;
106
+ highValue?: string | undefined;
107
+ }>, "many">;
108
+ }, "strip", import("zod").ZodTypeAny, {
109
+ filters: {
110
+ propertyName: string;
111
+ operator: "GT" | "IN" | "LT" | "EQ" | "NEQ" | "LTE" | "GTE" | "BETWEEN" | "NOT_IN" | "HAS_PROPERTY" | "NOT_HAS_PROPERTY" | "CONTAINS_TOKEN" | "NOT_CONTAINS_TOKEN";
112
+ value?: string | undefined;
113
+ values?: string[] | undefined;
114
+ highValue?: string | undefined;
115
+ }[];
116
+ }, {
117
+ filters: {
118
+ propertyName: string;
119
+ operator: "GT" | "IN" | "LT" | "EQ" | "NEQ" | "LTE" | "GTE" | "BETWEEN" | "NOT_IN" | "HAS_PROPERTY" | "NOT_HAS_PROPERTY" | "CONTAINS_TOKEN" | "NOT_CONTAINS_TOKEN";
120
+ value?: string | undefined;
121
+ values?: string[] | undefined;
122
+ highValue?: string | undefined;
123
+ }[];
124
+ }>, "many">;
125
+ properties: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
126
+ limit: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
127
+ after: import("zod").ZodOptional<import("zod").ZodString>;
128
+ credentials: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodNativeEnum<typeof CredentialType>, import("zod").ZodString>>;
129
+ }, "strip", import("zod").ZodTypeAny, {
130
+ operation: "search_records";
131
+ limit: number;
132
+ object_type: "deals" | "contacts" | "companies" | "tickets";
133
+ filter_groups: {
134
+ filters: {
135
+ propertyName: string;
136
+ operator: "GT" | "IN" | "LT" | "EQ" | "NEQ" | "LTE" | "GTE" | "BETWEEN" | "NOT_IN" | "HAS_PROPERTY" | "NOT_HAS_PROPERTY" | "CONTAINS_TOKEN" | "NOT_CONTAINS_TOKEN";
137
+ value?: string | undefined;
138
+ values?: string[] | undefined;
139
+ highValue?: string | undefined;
140
+ }[];
141
+ }[];
142
+ properties?: string[] | undefined;
143
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
144
+ after?: string | undefined;
145
+ }, {
146
+ operation: "search_records";
147
+ object_type: "deals" | "contacts" | "companies" | "tickets";
148
+ filter_groups: {
149
+ filters: {
150
+ propertyName: string;
151
+ operator: "GT" | "IN" | "LT" | "EQ" | "NEQ" | "LTE" | "GTE" | "BETWEEN" | "NOT_IN" | "HAS_PROPERTY" | "NOT_HAS_PROPERTY" | "CONTAINS_TOKEN" | "NOT_CONTAINS_TOKEN";
152
+ value?: string | undefined;
153
+ values?: string[] | undefined;
154
+ highValue?: string | undefined;
155
+ }[];
156
+ }[];
157
+ properties?: string[] | undefined;
158
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
159
+ limit?: number | undefined;
160
+ after?: string | undefined;
161
+ }>]>;
162
+ static readonly resultSchema: import("zod").ZodDiscriminatedUnion<"operation", [import("zod").ZodObject<{
163
+ operation: import("zod").ZodLiteral<"create_record">;
164
+ success: import("zod").ZodBoolean;
165
+ record: import("zod").ZodOptional<import("zod").ZodObject<{
166
+ id: import("zod").ZodString;
167
+ properties: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
168
+ createdAt: import("zod").ZodOptional<import("zod").ZodString>;
169
+ updatedAt: import("zod").ZodOptional<import("zod").ZodString>;
170
+ archived: import("zod").ZodOptional<import("zod").ZodBoolean>;
171
+ }, "strip", import("zod").ZodTypeAny, {
172
+ properties: Record<string, unknown>;
173
+ id: string;
174
+ createdAt?: string | undefined;
175
+ archived?: boolean | undefined;
176
+ updatedAt?: string | undefined;
177
+ }, {
178
+ properties: Record<string, unknown>;
179
+ id: string;
180
+ createdAt?: string | undefined;
181
+ archived?: boolean | undefined;
182
+ updatedAt?: string | undefined;
183
+ }>>;
184
+ error: import("zod").ZodString;
185
+ }, "strip", import("zod").ZodTypeAny, {
186
+ success: boolean;
187
+ error: string;
188
+ operation: "create_record";
189
+ record?: {
190
+ properties: Record<string, unknown>;
191
+ id: string;
192
+ createdAt?: string | undefined;
193
+ archived?: boolean | undefined;
194
+ updatedAt?: string | undefined;
195
+ } | undefined;
196
+ }, {
197
+ success: boolean;
198
+ error: string;
199
+ operation: "create_record";
200
+ record?: {
201
+ properties: Record<string, unknown>;
202
+ id: string;
203
+ createdAt?: string | undefined;
204
+ archived?: boolean | undefined;
205
+ updatedAt?: string | undefined;
206
+ } | undefined;
207
+ }>, import("zod").ZodObject<{
208
+ operation: import("zod").ZodLiteral<"get_record">;
209
+ success: import("zod").ZodBoolean;
210
+ record: import("zod").ZodOptional<import("zod").ZodObject<{
211
+ id: import("zod").ZodString;
212
+ properties: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
213
+ createdAt: import("zod").ZodOptional<import("zod").ZodString>;
214
+ updatedAt: import("zod").ZodOptional<import("zod").ZodString>;
215
+ archived: import("zod").ZodOptional<import("zod").ZodBoolean>;
216
+ }, "strip", import("zod").ZodTypeAny, {
217
+ properties: Record<string, unknown>;
218
+ id: string;
219
+ createdAt?: string | undefined;
220
+ archived?: boolean | undefined;
221
+ updatedAt?: string | undefined;
222
+ }, {
223
+ properties: Record<string, unknown>;
224
+ id: string;
225
+ createdAt?: string | undefined;
226
+ archived?: boolean | undefined;
227
+ updatedAt?: string | undefined;
228
+ }>>;
229
+ error: import("zod").ZodString;
230
+ }, "strip", import("zod").ZodTypeAny, {
231
+ success: boolean;
232
+ error: string;
233
+ operation: "get_record";
234
+ record?: {
235
+ properties: Record<string, unknown>;
236
+ id: string;
237
+ createdAt?: string | undefined;
238
+ archived?: boolean | undefined;
239
+ updatedAt?: string | undefined;
240
+ } | undefined;
241
+ }, {
242
+ success: boolean;
243
+ error: string;
244
+ operation: "get_record";
245
+ record?: {
246
+ properties: Record<string, unknown>;
247
+ id: string;
248
+ createdAt?: string | undefined;
249
+ archived?: boolean | undefined;
250
+ updatedAt?: string | undefined;
251
+ } | undefined;
252
+ }>, import("zod").ZodObject<{
253
+ operation: import("zod").ZodLiteral<"update_record">;
254
+ success: import("zod").ZodBoolean;
255
+ record: import("zod").ZodOptional<import("zod").ZodObject<{
256
+ id: import("zod").ZodString;
257
+ properties: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
258
+ createdAt: import("zod").ZodOptional<import("zod").ZodString>;
259
+ updatedAt: import("zod").ZodOptional<import("zod").ZodString>;
260
+ archived: import("zod").ZodOptional<import("zod").ZodBoolean>;
261
+ }, "strip", import("zod").ZodTypeAny, {
262
+ properties: Record<string, unknown>;
263
+ id: string;
264
+ createdAt?: string | undefined;
265
+ archived?: boolean | undefined;
266
+ updatedAt?: string | undefined;
267
+ }, {
268
+ properties: Record<string, unknown>;
269
+ id: string;
270
+ createdAt?: string | undefined;
271
+ archived?: boolean | undefined;
272
+ updatedAt?: string | undefined;
273
+ }>>;
274
+ error: import("zod").ZodString;
275
+ }, "strip", import("zod").ZodTypeAny, {
276
+ success: boolean;
277
+ error: string;
278
+ operation: "update_record";
279
+ record?: {
280
+ properties: Record<string, unknown>;
281
+ id: string;
282
+ createdAt?: string | undefined;
283
+ archived?: boolean | undefined;
284
+ updatedAt?: string | undefined;
285
+ } | undefined;
286
+ }, {
287
+ success: boolean;
288
+ error: string;
289
+ operation: "update_record";
290
+ record?: {
291
+ properties: Record<string, unknown>;
292
+ id: string;
293
+ createdAt?: string | undefined;
294
+ archived?: boolean | undefined;
295
+ updatedAt?: string | undefined;
296
+ } | undefined;
297
+ }>, import("zod").ZodObject<{
298
+ operation: import("zod").ZodLiteral<"search_records">;
299
+ success: import("zod").ZodBoolean;
300
+ results: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
301
+ id: import("zod").ZodString;
302
+ properties: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
303
+ createdAt: import("zod").ZodOptional<import("zod").ZodString>;
304
+ updatedAt: import("zod").ZodOptional<import("zod").ZodString>;
305
+ archived: import("zod").ZodOptional<import("zod").ZodBoolean>;
306
+ }, "strip", import("zod").ZodTypeAny, {
307
+ properties: Record<string, unknown>;
308
+ id: string;
309
+ createdAt?: string | undefined;
310
+ archived?: boolean | undefined;
311
+ updatedAt?: string | undefined;
312
+ }, {
313
+ properties: Record<string, unknown>;
314
+ id: string;
315
+ createdAt?: string | undefined;
316
+ archived?: boolean | undefined;
317
+ updatedAt?: string | undefined;
318
+ }>, "many">>;
319
+ total: import("zod").ZodOptional<import("zod").ZodNumber>;
320
+ paging: import("zod").ZodOptional<import("zod").ZodObject<{
321
+ next: import("zod").ZodOptional<import("zod").ZodObject<{
322
+ after: import("zod").ZodString;
323
+ }, "strip", import("zod").ZodTypeAny, {
324
+ after: string;
325
+ }, {
326
+ after: string;
327
+ }>>;
328
+ }, "strip", import("zod").ZodTypeAny, {
329
+ next?: {
330
+ after: string;
331
+ } | undefined;
332
+ }, {
333
+ next?: {
334
+ after: string;
335
+ } | undefined;
336
+ }>>;
337
+ error: import("zod").ZodString;
338
+ }, "strip", import("zod").ZodTypeAny, {
339
+ success: boolean;
340
+ error: string;
341
+ operation: "search_records";
342
+ total?: number | undefined;
343
+ results?: {
344
+ properties: Record<string, unknown>;
345
+ id: string;
346
+ createdAt?: string | undefined;
347
+ archived?: boolean | undefined;
348
+ updatedAt?: string | undefined;
349
+ }[] | undefined;
350
+ paging?: {
351
+ next?: {
352
+ after: string;
353
+ } | undefined;
354
+ } | undefined;
355
+ }, {
356
+ success: boolean;
357
+ error: string;
358
+ operation: "search_records";
359
+ total?: number | undefined;
360
+ results?: {
361
+ properties: Record<string, unknown>;
362
+ id: string;
363
+ createdAt?: string | undefined;
364
+ archived?: boolean | undefined;
365
+ updatedAt?: string | undefined;
366
+ }[] | undefined;
367
+ paging?: {
368
+ next?: {
369
+ after: string;
370
+ } | undefined;
371
+ } | undefined;
372
+ }>]>;
373
+ static readonly shortDescription = "HubSpot CRM integration for contacts, companies, deals, and tickets";
374
+ static readonly longDescription = "\n HubSpot CRM service integration for comprehensive customer relationship management.\n\n Features:\n - Create, read, update, and search contacts, companies, deals, and tickets\n - Advanced search with filter groups supporting AND/OR logic\n - Flexible property-based data management\n - Pagination for handling large datasets\n\n Use cases:\n - Lead management and contact synchronization\n - Company tracking and deal pipeline management\n - Support ticket creation and tracking\n - CRM data enrichment and workflow automation\n\n Security Features:\n - OAuth 2.0 authentication with HubSpot\n - Scoped access permissions for CRM operations\n - Secure credential handling and validation\n ";
375
+ static readonly alias = "crm";
376
+ constructor(params?: T, context?: BubbleContext);
377
+ testCredential(): Promise<boolean>;
378
+ protected chooseCredential(): string | undefined;
379
+ private makeHubSpotApiRequest;
380
+ protected performAction(context?: BubbleContext): Promise<Extract<HubSpotResult, {
381
+ operation: T['operation'];
382
+ }>>;
383
+ private createRecord;
384
+ private getRecord;
385
+ private updateRecord;
386
+ private searchRecords;
387
+ }
388
+ //# sourceMappingURL=hubspot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubspot.d.ts","sourceRoot":"","sources":["../../../../src/bubbles/service-bubble/hubspot/hubspot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa,CACxB,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,CACjD,SAAQ,aAAa,CACrB,CAAC,EACD,OAAO,CAAC,aAAa,EAAE;IAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;CAAE,CAAC,CACtD;IACC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;IAC5C,MAAM,CAAC,QAAQ,CAAC,UAAU,aAAa;IACvC,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAuB;IAC7C,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAuB;IACnD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,yEACwC;IACxE,MAAM,CAAC,QAAQ,CAAC,eAAe,wuBAmB7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS;gBAG5B,MAAM,GAAE,CAIF,EACN,OAAO,CAAC,EAAE,aAAa;IAKZ,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAqB/C,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;YAYlC,qBAAqB;cAwCnB,aAAa,CAC3B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE;QAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,CAAC;YAqDnD,YAAY;YAyBZ,SAAS;YA6BT,YAAY;YAyBZ,aAAa;CAiD5B"}
@@ -0,0 +1,241 @@
1
+ import { ServiceBubble } from '../../../types/service-bubble-class.js';
2
+ import { CredentialType } from '@bubblelab/shared-schemas';
3
+ import { HubSpotParamsSchema, HubSpotResultSchema, } from './hubspot.schema.js';
4
+ /**
5
+ * HubSpot CRM Service Bubble
6
+ *
7
+ * Comprehensive HubSpot CRM integration for managing contacts, companies, deals, and tickets.
8
+ *
9
+ * Features:
10
+ * - Full CRUD operations for all CRM object types
11
+ * - Advanced search with filter groups (AND/OR logic)
12
+ * - Property-based data management
13
+ * - Pagination support for large datasets
14
+ *
15
+ * Use cases:
16
+ * - Lead management and contact synchronization
17
+ * - Company and deal pipeline tracking
18
+ * - Support ticket management
19
+ * - CRM data enrichment and automation
20
+ *
21
+ * Security Features:
22
+ * - OAuth 2.0 authentication with HubSpot
23
+ * - Scoped access permissions
24
+ * - Secure credential handling
25
+ */
26
+ export class HubSpotBubble extends ServiceBubble {
27
+ static type = 'service';
28
+ static service = 'hubspot';
29
+ static authType = 'oauth';
30
+ static bubbleName = 'hubspot';
31
+ static schema = HubSpotParamsSchema;
32
+ static resultSchema = HubSpotResultSchema;
33
+ static shortDescription = 'HubSpot CRM integration for contacts, companies, deals, and tickets';
34
+ static longDescription = `
35
+ HubSpot CRM service integration for comprehensive customer relationship management.
36
+
37
+ Features:
38
+ - Create, read, update, and search contacts, companies, deals, and tickets
39
+ - Advanced search with filter groups supporting AND/OR logic
40
+ - Flexible property-based data management
41
+ - Pagination for handling large datasets
42
+
43
+ Use cases:
44
+ - Lead management and contact synchronization
45
+ - Company tracking and deal pipeline management
46
+ - Support ticket creation and tracking
47
+ - CRM data enrichment and workflow automation
48
+
49
+ Security Features:
50
+ - OAuth 2.0 authentication with HubSpot
51
+ - Scoped access permissions for CRM operations
52
+ - Secure credential handling and validation
53
+ `;
54
+ static alias = 'crm';
55
+ constructor(params = {
56
+ operation: 'get_record',
57
+ object_type: 'contacts',
58
+ record_id: '',
59
+ }, context) {
60
+ super(params, context);
61
+ }
62
+ async testCredential() {
63
+ const credential = this.chooseCredential();
64
+ if (!credential) {
65
+ throw new Error('HubSpot credentials are required');
66
+ }
67
+ try {
68
+ const response = await fetch('https://api.hubapi.com/crm/v3/objects/contacts?limit=1', {
69
+ headers: {
70
+ Authorization: `Bearer ${credential}`,
71
+ },
72
+ });
73
+ return response.ok;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ chooseCredential() {
80
+ const { credentials } = this.params;
81
+ if (!credentials || typeof credentials !== 'object') {
82
+ throw new Error('No HubSpot credentials provided');
83
+ }
84
+ return credentials[CredentialType.HUBSPOT_CRED];
85
+ }
86
+ async makeHubSpotApiRequest(endpoint, method = 'GET', body) {
87
+ const credential = this.chooseCredential();
88
+ if (!credential) {
89
+ throw new Error('HubSpot credentials are required');
90
+ }
91
+ const url = endpoint.startsWith('https://')
92
+ ? endpoint
93
+ : `https://api.hubapi.com${endpoint}`;
94
+ const requestInit = {
95
+ method,
96
+ headers: {
97
+ Authorization: `Bearer ${credential}`,
98
+ 'Content-Type': 'application/json',
99
+ },
100
+ };
101
+ if (body && method !== 'GET') {
102
+ requestInit.body = JSON.stringify(body);
103
+ }
104
+ const response = await fetch(url, requestInit);
105
+ if (!response.ok) {
106
+ const errorText = await response.text();
107
+ throw new Error(`HubSpot API error (${response.status}): ${errorText}`);
108
+ }
109
+ const contentType = response.headers.get('content-type');
110
+ if (contentType && contentType.includes('application/json')) {
111
+ return await response.json();
112
+ }
113
+ return await response.text();
114
+ }
115
+ async performAction(context) {
116
+ void context;
117
+ const { operation } = this.params;
118
+ try {
119
+ const result = await (async () => {
120
+ const parsedParams = this.params;
121
+ switch (operation) {
122
+ case 'create_record':
123
+ return await this.createRecord(parsedParams);
124
+ case 'get_record':
125
+ return await this.getRecord(parsedParams);
126
+ case 'update_record':
127
+ return await this.updateRecord(parsedParams);
128
+ case 'search_records':
129
+ return await this.searchRecords(parsedParams);
130
+ default:
131
+ throw new Error(`Unsupported operation: ${operation}`);
132
+ }
133
+ })();
134
+ return result;
135
+ }
136
+ catch (error) {
137
+ return {
138
+ operation,
139
+ success: false,
140
+ error: error instanceof Error ? error.message : 'Unknown error occurred',
141
+ };
142
+ }
143
+ }
144
+ async createRecord(params) {
145
+ const { object_type, properties } = params;
146
+ const response = await this.makeHubSpotApiRequest(`/crm/v3/objects/${object_type}`, 'POST', { properties });
147
+ return {
148
+ operation: 'create_record',
149
+ success: true,
150
+ record: {
151
+ id: response.id,
152
+ properties: response.properties,
153
+ createdAt: response.createdAt,
154
+ updatedAt: response.updatedAt,
155
+ archived: response.archived,
156
+ },
157
+ error: '',
158
+ };
159
+ }
160
+ async getRecord(params) {
161
+ const { object_type, record_id, properties } = params;
162
+ const queryParams = new URLSearchParams();
163
+ if (properties && properties.length > 0) {
164
+ queryParams.set('properties', properties.join(','));
165
+ }
166
+ const queryString = queryParams.toString();
167
+ const endpoint = `/crm/v3/objects/${object_type}/${record_id}${queryString ? `?${queryString}` : ''}`;
168
+ const response = await this.makeHubSpotApiRequest(endpoint, 'GET');
169
+ return {
170
+ operation: 'get_record',
171
+ success: true,
172
+ record: {
173
+ id: response.id,
174
+ properties: response.properties,
175
+ createdAt: response.createdAt,
176
+ updatedAt: response.updatedAt,
177
+ archived: response.archived,
178
+ },
179
+ error: '',
180
+ };
181
+ }
182
+ async updateRecord(params) {
183
+ const { object_type, record_id, properties } = params;
184
+ const response = await this.makeHubSpotApiRequest(`/crm/v3/objects/${object_type}/${record_id}`, 'PATCH', { properties });
185
+ return {
186
+ operation: 'update_record',
187
+ success: true,
188
+ record: {
189
+ id: response.id,
190
+ properties: response.properties,
191
+ createdAt: response.createdAt,
192
+ updatedAt: response.updatedAt,
193
+ archived: response.archived,
194
+ },
195
+ error: '',
196
+ };
197
+ }
198
+ async searchRecords(params) {
199
+ const { object_type, filter_groups, properties, limit, after } = params;
200
+ const body = {
201
+ filterGroups: filter_groups.map((group) => ({
202
+ filters: group.filters.map((filter) => {
203
+ const f = {
204
+ propertyName: filter.propertyName,
205
+ operator: filter.operator,
206
+ };
207
+ if (filter.value !== undefined)
208
+ f.value = filter.value;
209
+ if (filter.highValue !== undefined)
210
+ f.highValue = filter.highValue;
211
+ if (filter.values !== undefined)
212
+ f.values = filter.values;
213
+ return f;
214
+ }),
215
+ })),
216
+ limit: limit || 10,
217
+ };
218
+ if (properties && properties.length > 0) {
219
+ body.properties = properties;
220
+ }
221
+ if (after) {
222
+ body.after = after;
223
+ }
224
+ const response = await this.makeHubSpotApiRequest(`/crm/v3/objects/${object_type}/search`, 'POST', body);
225
+ return {
226
+ operation: 'search_records',
227
+ success: true,
228
+ results: (response.results || []).map((r) => ({
229
+ id: r.id,
230
+ properties: r.properties,
231
+ createdAt: r.createdAt,
232
+ updatedAt: r.updatedAt,
233
+ archived: r.archived,
234
+ })),
235
+ total: response.total,
236
+ paging: response.paging,
237
+ error: '',
238
+ };
239
+ }
240
+ }
241
+ //# sourceMappingURL=hubspot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubspot.js","sourceRoot":"","sources":["../../../../src/bubbles/service-bubble/hubspot/hubspot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAIpB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,aAEX,SAAQ,aAGT;IACC,MAAM,CAAU,IAAI,GAAG,SAAkB,CAAC;IAC1C,MAAM,CAAU,OAAO,GAAG,SAAS,CAAC;IACpC,MAAM,CAAU,QAAQ,GAAG,OAAgB,CAAC;IAC5C,MAAM,CAAU,UAAU,GAAG,SAAS,CAAC;IACvC,MAAM,CAAU,MAAM,GAAG,mBAAmB,CAAC;IAC7C,MAAM,CAAU,YAAY,GAAG,mBAAmB,CAAC;IACnD,MAAM,CAAU,gBAAgB,GAC9B,qEAAqE,CAAC;IACxE,MAAM,CAAU,eAAe,GAAG;;;;;;;;;;;;;;;;;;;GAmBjC,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,KAAK,CAAC;IAE9B,YACE,SAAY;QACV,SAAS,EAAE,YAAY;QACvB,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,EAAE;KACT,EACN,OAAuB;QAEvB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,wDAAwD,EACxD;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,UAAU,EAAE;iBACtC;aACF,CACF,CAAC;YACF,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAES,gBAAgB;QACxB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,MAE5B,CAAC;QAEF,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,QAAgB,EAChB,SAA8C,KAAK,EACnD,IAAc;QAEd,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,yBAAyB,QAAQ,EAAE,CAAC;QAExC,MAAM,WAAW,GAAgB;YAC/B,MAAM;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,UAAU,EAAE;gBACrC,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC;QAEF,IAAI,IAAI,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAE/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5D,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,OAAuB;QAEvB,KAAK,OAAO,CAAC;QAEb,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAA4B,EAAE;gBACvD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAuB,CAAC;gBAClD,QAAQ,SAAS,EAAE,CAAC;oBAClB,KAAK,eAAe;wBAClB,OAAO,MAAM,IAAI,CAAC,YAAY,CAC5B,YAGC,CACF,CAAC;oBACJ,KAAK,YAAY;wBACf,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,YAGC,CACF,CAAC;oBACJ,KAAK,eAAe;wBAClB,OAAO,MAAM,IAAI,CAAC,YAAY,CAC5B,YAGC,CACF,CAAC;oBACJ,KAAK,gBAAgB;wBACnB,OAAO,MAAM,IAAI,CAAC,aAAa,CAC7B,YAGC,CACF,CAAC;oBACJ;wBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,OAAO,MAA+D,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,SAAS;gBACT,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;aACX,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAA8D;QAE9D,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAE3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAC/C,mBAAmB,WAAW,EAAE,EAChC,MAAM,EACN,EAAE,UAAU,EAAE,CACf,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,IAAI;YACb,MAAM,EAAE;gBACN,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;YACD,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,MAA2D;QAE3D,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAEtD,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,mBAAmB,WAAW,IAAI,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAEtG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEnE,OAAO;YACL,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE;gBACN,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;YACD,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAA8D;QAE9D,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAC/C,mBAAmB,WAAW,IAAI,SAAS,EAAE,EAC7C,OAAO,EACP,EAAE,UAAU,EAAE,CACf,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,IAAI;YACb,MAAM,EAAE;gBACN,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;YACD,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,MAA+D;QAE/D,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAExE,MAAM,IAAI,GAA4B;YACpC,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1C,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBACpC,MAAM,CAAC,GAA4B;wBACjC,YAAY,EAAE,MAAM,CAAC,YAAY;wBACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;qBAC1B,CAAC;oBACF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;wBAAE,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACvD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;wBAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;oBACnE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;wBAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBAC1D,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC;aACH,CAAC,CAAC;YACH,KAAK,EAAE,KAAK,IAAI,EAAE;SACnB,CAAC;QAEF,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAC/C,mBAAmB,WAAW,SAAS,EACvC,MAAM,EACN,IAAI,CACL,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACjD,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;YACH,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC"}