@bubblelab/bubble-core 0.1.103 → 0.1.106

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 (67) hide show
  1. package/dist/bubble-bundle.d.ts +100 -55
  2. package/dist/bubble-factory.d.ts.map +1 -1
  3. package/dist/bubble-factory.js +4 -0
  4. package/dist/bubble-factory.js.map +1 -1
  5. package/dist/bubbles/service-bubble/ai-agent.d.ts +4 -4
  6. package/dist/bubbles/service-bubble/apify/apify.d.ts +4 -4
  7. package/dist/bubbles/service-bubble/confluence/confluence.d.ts +1957 -0
  8. package/dist/bubbles/service-bubble/confluence/confluence.d.ts.map +1 -0
  9. package/dist/bubbles/service-bubble/confluence/confluence.integration.flow.d.ts +35 -0
  10. package/dist/bubbles/service-bubble/confluence/confluence.integration.flow.d.ts.map +1 -0
  11. package/dist/bubbles/service-bubble/confluence/confluence.integration.flow.js +327 -0
  12. package/dist/bubbles/service-bubble/confluence/confluence.integration.flow.js.map +1 -0
  13. package/dist/bubbles/service-bubble/confluence/confluence.js +534 -0
  14. package/dist/bubbles/service-bubble/confluence/confluence.js.map +1 -0
  15. package/dist/bubbles/service-bubble/confluence/confluence.schema.d.ts +2435 -0
  16. package/dist/bubbles/service-bubble/confluence/confluence.schema.d.ts.map +1 -0
  17. package/dist/bubbles/service-bubble/confluence/confluence.schema.js +467 -0
  18. package/dist/bubbles/service-bubble/confluence/confluence.schema.js.map +1 -0
  19. package/dist/bubbles/service-bubble/confluence/confluence.utils.d.ts +49 -0
  20. package/dist/bubbles/service-bubble/confluence/confluence.utils.d.ts.map +1 -0
  21. package/dist/bubbles/service-bubble/confluence/confluence.utils.js +337 -0
  22. package/dist/bubbles/service-bubble/confluence/confluence.utils.js.map +1 -0
  23. package/dist/bubbles/service-bubble/confluence/index.d.ts +5 -0
  24. package/dist/bubbles/service-bubble/confluence/index.d.ts.map +1 -0
  25. package/dist/bubbles/service-bubble/confluence/index.js +5 -0
  26. package/dist/bubbles/service-bubble/confluence/index.js.map +1 -0
  27. package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts +8 -8
  28. package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts +16 -16
  29. package/dist/bubbles/service-bubble/firecrawl.d.ts +4 -4
  30. package/dist/bubbles/service-bubble/gmail.d.ts +84 -84
  31. package/dist/bubbles/service-bubble/google-drive.d.ts +32 -32
  32. package/dist/bubbles/service-bubble/google-drive.d.ts.map +1 -1
  33. package/dist/bubbles/service-bubble/google-drive.js +22 -2
  34. package/dist/bubbles/service-bubble/google-drive.js.map +1 -1
  35. package/dist/bubbles/service-bubble/google-sheets/google-sheets.schema.js +6 -6
  36. package/dist/bubbles/service-bubble/google-sheets/google-sheets.schema.js.map +1 -1
  37. package/dist/bubbles/service-bubble/jira/jira.d.ts +12 -12
  38. package/dist/bubbles/service-bubble/jira/jira.schema.d.ts +14 -14
  39. package/dist/bubbles/service-bubble/resend.d.ts +4 -4
  40. package/dist/bubbles/service-bubble/salesforce/index.d.ts +4 -0
  41. package/dist/bubbles/service-bubble/salesforce/index.d.ts.map +1 -0
  42. package/dist/bubbles/service-bubble/salesforce/index.js +4 -0
  43. package/dist/bubbles/service-bubble/salesforce/index.js.map +1 -0
  44. package/dist/bubbles/service-bubble/salesforce/salesforce.d.ts +1331 -0
  45. package/dist/bubbles/service-bubble/salesforce/salesforce.d.ts.map +1 -0
  46. package/dist/bubbles/service-bubble/salesforce/salesforce.js +618 -0
  47. package/dist/bubbles/service-bubble/salesforce/salesforce.js.map +1 -0
  48. package/dist/bubbles/service-bubble/salesforce/salesforce.schema.d.ts +1445 -0
  49. package/dist/bubbles/service-bubble/salesforce/salesforce.schema.d.ts.map +1 -0
  50. package/dist/bubbles/service-bubble/salesforce/salesforce.schema.js +609 -0
  51. package/dist/bubbles/service-bubble/salesforce/salesforce.schema.js.map +1 -0
  52. package/dist/bubbles/service-bubble/salesforce/salesforce.utils.d.ts +87 -0
  53. package/dist/bubbles/service-bubble/salesforce/salesforce.utils.d.ts.map +1 -0
  54. package/dist/bubbles/service-bubble/salesforce/salesforce.utils.js +181 -0
  55. package/dist/bubbles/service-bubble/salesforce/salesforce.utils.js.map +1 -0
  56. package/dist/bubbles/service-bubble/slack/slack.d.ts +36 -36
  57. package/dist/bubbles/tool-bubble/tiktok-tool.d.ts +8 -8
  58. package/dist/bubbles/tool-bubble/twitter-tool.d.ts +10 -10
  59. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +8 -8
  60. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +16 -16
  61. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +16 -16
  62. package/dist/bubbles.json +1247 -8
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +1 -0
  66. package/dist/index.js.map +1 -1
  67. package/package.json +2 -2
@@ -0,0 +1,534 @@
1
+ import { ServiceBubble } from '../../../types/service-bubble-class.js';
2
+ import { CredentialType } from '@bubblelab/shared-schemas';
3
+ import { ConfluenceParamsSchema, ConfluenceResultSchema, } from './confluence.schema.js';
4
+ import { markdownToConfluenceStorage, storageToText, enhanceErrorMessage, } from './confluence.utils.js';
5
+ /**
6
+ * Confluence Service Bubble
7
+ *
8
+ * Integration with Confluence Cloud for wiki and content management.
9
+ *
10
+ * Operations:
11
+ * - list_spaces: List spaces with optional filtering
12
+ * - get_space: Get space details by ID
13
+ * - list_pages: List pages with filtering (by space, title, status)
14
+ * - get_page: Get page by ID with body content
15
+ * - create_page: Create a new page in a space
16
+ * - update_page: Update page (auto-fetches current version)
17
+ * - delete_page: Delete/trash a page
18
+ * - search: Search via CQL (v1 endpoint)
19
+ * - add_comment: Add footer comment to a page
20
+ * - get_comments: List footer comments for a page
21
+ *
22
+ * Features:
23
+ * - Markdown content auto-converted to Confluence storage format (XHTML)
24
+ * - Auto-version management for page updates
25
+ * - Uses REST API v2 for most operations, v1 for search/labels
26
+ */
27
+ export class ConfluenceBubble extends ServiceBubble {
28
+ static type = 'service';
29
+ static service = 'confluence';
30
+ static authType = 'oauth';
31
+ static bubbleName = 'confluence';
32
+ static schema = ConfluenceParamsSchema;
33
+ static resultSchema = ConfluenceResultSchema;
34
+ static shortDescription = 'Confluence integration for wiki pages and content management';
35
+ static longDescription = `
36
+ Confluence Cloud integration for managing wiki content, spaces, and pages.
37
+
38
+ Operations:
39
+ - list_spaces: List Confluence spaces with filtering
40
+ - get_space: Get space details by ID
41
+ - list_pages: List pages (filter by space, title, status)
42
+ - get_page: Get page by ID with body content
43
+ - create_page: Create a new page in a space
44
+ - update_page: Update page content (auto-increments version)
45
+ - delete_page: Delete/trash a page
46
+ - search: Search via CQL (Confluence Query Language)
47
+ - add_comment: Add footer comment to a page
48
+ - get_comments: List footer comments for a page
49
+
50
+ Features:
51
+ - Markdown content auto-converted to Confluence storage format (XHTML)
52
+ - Auto-version management for page updates
53
+ - CQL search support for powerful content discovery
54
+
55
+ Authentication:
56
+ - OAuth 2.0 via Atlassian Cloud (same provider as Jira)
57
+ `;
58
+ static alias = 'confluence';
59
+ constructor(params, context) {
60
+ super(params, context);
61
+ }
62
+ async testCredential() {
63
+ const apiToken = this.chooseCredential();
64
+ if (!apiToken) {
65
+ throw new Error('Confluence credentials are required');
66
+ }
67
+ try {
68
+ const response = await this.makeConfluenceApiRequest('/wiki/api/v2/spaces?limit=1', 'GET');
69
+ return Boolean(response && 'results' in response);
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ /**
76
+ * Parse Confluence credentials: base64-encoded JSON { accessToken, cloudId, siteUrl }
77
+ * Same format as Jira since both use Atlassian Cloud OAuth.
78
+ */
79
+ parseCredentials() {
80
+ const { credentials } = this.params;
81
+ if (!credentials || typeof credentials !== 'object') {
82
+ return null;
83
+ }
84
+ const confluenceCredRaw = credentials[CredentialType.CONFLUENCE_CRED];
85
+ if (!confluenceCredRaw) {
86
+ return null;
87
+ }
88
+ try {
89
+ const decoded = Buffer.from(confluenceCredRaw, 'base64').toString('utf-8');
90
+ const parsed = JSON.parse(decoded);
91
+ if (parsed.accessToken && parsed.cloudId) {
92
+ return {
93
+ accessToken: parsed.accessToken,
94
+ baseUrl: `https://api.atlassian.com/ex/confluence/${parsed.cloudId}`,
95
+ };
96
+ }
97
+ }
98
+ catch {
99
+ // Invalid credential format
100
+ }
101
+ return null;
102
+ }
103
+ /**
104
+ * Resolve a space_key to a space_id via the Confluence API.
105
+ */
106
+ async resolveSpaceKey(spaceKey) {
107
+ const response = await this.makeConfluenceApiRequest(`/wiki/api/v2/spaces?keys=${encodeURIComponent(spaceKey)}&limit=1`, 'GET');
108
+ const results = Array.isArray(response.results) ? response.results : [];
109
+ if (results.length === 0) {
110
+ throw new Error(`Space not found for key: ${spaceKey}`);
111
+ }
112
+ return results[0].id;
113
+ }
114
+ /**
115
+ * Get the space_id from params, resolving space_key if needed.
116
+ */
117
+ async getSpaceId(params) {
118
+ if (params.space_id)
119
+ return params.space_id;
120
+ if (params.space_key)
121
+ return this.resolveSpaceKey(params.space_key);
122
+ return undefined;
123
+ }
124
+ /**
125
+ * Make a request to the Confluence REST API v2.
126
+ */
127
+ async makeConfluenceApiRequest(endpoint, method = 'GET', body) {
128
+ const creds = this.parseCredentials();
129
+ if (!creds) {
130
+ throw new Error('Invalid Confluence credentials. Expected base64-encoded JSON with { accessToken, cloudId }.');
131
+ }
132
+ const url = `${creds.baseUrl}${endpoint}`;
133
+ const requestHeaders = {
134
+ Authorization: `Bearer ${creds.accessToken}`,
135
+ 'Content-Type': 'application/json',
136
+ Accept: 'application/json',
137
+ };
138
+ const requestInit = {
139
+ method,
140
+ headers: requestHeaders,
141
+ };
142
+ if (body && method !== 'GET') {
143
+ requestInit.body = JSON.stringify(body);
144
+ }
145
+ const response = await fetch(url, requestInit);
146
+ if (!response.ok) {
147
+ const errorText = await response.text();
148
+ const enhancedError = enhanceErrorMessage(errorText, response.status, response.statusText);
149
+ throw new Error(enhancedError);
150
+ }
151
+ if (response.status === 204) {
152
+ return {};
153
+ }
154
+ const contentType = response.headers.get('content-type');
155
+ if (contentType && contentType.includes('application/json')) {
156
+ return (await response.json());
157
+ }
158
+ return {};
159
+ }
160
+ /**
161
+ * Make a request to the Confluence REST API v1 (used for search and labels).
162
+ */
163
+ async makeConfluenceV1ApiRequest(endpoint, method = 'GET', body) {
164
+ const creds = this.parseCredentials();
165
+ if (!creds) {
166
+ throw new Error('Invalid Confluence credentials. Expected base64-encoded JSON with { accessToken, cloudId }.');
167
+ }
168
+ const url = `${creds.baseUrl}${endpoint}`;
169
+ const requestHeaders = {
170
+ Authorization: `Bearer ${creds.accessToken}`,
171
+ 'Content-Type': 'application/json',
172
+ Accept: 'application/json',
173
+ };
174
+ const requestInit = {
175
+ method,
176
+ headers: requestHeaders,
177
+ };
178
+ if (body && method !== 'GET') {
179
+ requestInit.body = JSON.stringify(body);
180
+ }
181
+ const response = await fetch(url, requestInit);
182
+ if (!response.ok) {
183
+ const errorText = await response.text();
184
+ const enhancedError = enhanceErrorMessage(errorText, response.status, response.statusText);
185
+ throw new Error(enhancedError);
186
+ }
187
+ if (response.status === 204) {
188
+ return {};
189
+ }
190
+ const contentType = response.headers.get('content-type');
191
+ if (contentType && contentType.includes('application/json')) {
192
+ return (await response.json());
193
+ }
194
+ return {};
195
+ }
196
+ async performAction(context) {
197
+ void context;
198
+ const { operation } = this.params;
199
+ try {
200
+ const result = await (async () => {
201
+ const parsedParams = this.params;
202
+ switch (operation) {
203
+ case 'list_spaces':
204
+ return await this.listSpaces(parsedParams);
205
+ case 'get_space':
206
+ return await this.getSpace(parsedParams);
207
+ case 'list_pages':
208
+ return await this.listPages(parsedParams);
209
+ case 'get_page':
210
+ return await this.getPage(parsedParams);
211
+ case 'create_page':
212
+ return await this.createPage(parsedParams);
213
+ case 'update_page':
214
+ return await this.updatePage(parsedParams);
215
+ case 'delete_page':
216
+ return await this.deletePage(parsedParams);
217
+ case 'search':
218
+ return await this.search(parsedParams);
219
+ case 'add_comment':
220
+ return await this.addComment(parsedParams);
221
+ case 'get_comments':
222
+ return await this.getComments(parsedParams);
223
+ default:
224
+ throw new Error(`Unsupported operation: ${operation}`);
225
+ }
226
+ })();
227
+ return result;
228
+ }
229
+ catch (error) {
230
+ return {
231
+ operation,
232
+ success: false,
233
+ error: error instanceof Error ? error.message : 'Unknown error occurred',
234
+ };
235
+ }
236
+ }
237
+ // -------------------------------------------------------------------------
238
+ // OPERATION 1: list_spaces
239
+ // -------------------------------------------------------------------------
240
+ async listSpaces(params) {
241
+ const queryParams = new URLSearchParams();
242
+ queryParams.set('limit', String(params.limit ?? 25));
243
+ if (params.cursor) {
244
+ queryParams.set('cursor', params.cursor);
245
+ }
246
+ if (params.type) {
247
+ queryParams.set('type', params.type);
248
+ }
249
+ if (params.status) {
250
+ queryParams.set('status', params.status);
251
+ }
252
+ const response = await this.makeConfluenceApiRequest(`/wiki/api/v2/spaces?${queryParams.toString()}`, 'GET');
253
+ const results = Array.isArray(response.results) ? response.results : [];
254
+ const links = response._links;
255
+ const nextCursor = links?.next
256
+ ? (new URL(links.next, 'https://placeholder.com').searchParams.get('cursor') ?? undefined)
257
+ : undefined;
258
+ return {
259
+ operation: 'list_spaces',
260
+ success: true,
261
+ spaces: results,
262
+ cursor: nextCursor,
263
+ error: '',
264
+ };
265
+ }
266
+ // -------------------------------------------------------------------------
267
+ // OPERATION 2: get_space
268
+ // -------------------------------------------------------------------------
269
+ async getSpace(params) {
270
+ const response = await this.makeConfluenceApiRequest(`/wiki/api/v2/spaces/${encodeURIComponent(params.space_id)}?description-format=plain`, 'GET');
271
+ return {
272
+ operation: 'get_space',
273
+ success: true,
274
+ space: response,
275
+ error: '',
276
+ };
277
+ }
278
+ // -------------------------------------------------------------------------
279
+ // OPERATION 3: list_pages
280
+ // -------------------------------------------------------------------------
281
+ async listPages(params) {
282
+ const queryParams = new URLSearchParams();
283
+ queryParams.set('limit', String(params.limit ?? 25));
284
+ const spaceId = await this.getSpaceId(params);
285
+ if (spaceId) {
286
+ queryParams.set('space-id', spaceId);
287
+ }
288
+ if (params.title) {
289
+ queryParams.set('title', params.title);
290
+ }
291
+ if (params.status) {
292
+ queryParams.set('status', params.status);
293
+ }
294
+ if (params.cursor) {
295
+ queryParams.set('cursor', params.cursor);
296
+ }
297
+ const response = await this.makeConfluenceApiRequest(`/wiki/api/v2/pages?${queryParams.toString()}`, 'GET');
298
+ const results = Array.isArray(response.results) ? response.results : [];
299
+ const links = response._links;
300
+ const nextCursor = links?.next
301
+ ? (new URL(links.next, 'https://placeholder.com').searchParams.get('cursor') ?? undefined)
302
+ : undefined;
303
+ return {
304
+ operation: 'list_pages',
305
+ success: true,
306
+ pages: results,
307
+ cursor: nextCursor,
308
+ error: '',
309
+ };
310
+ }
311
+ // -------------------------------------------------------------------------
312
+ // OPERATION 4: get_page
313
+ // -------------------------------------------------------------------------
314
+ async getPage(params) {
315
+ const queryParams = new URLSearchParams();
316
+ if (params.include_body !== false) {
317
+ queryParams.set('body-format', 'storage');
318
+ }
319
+ const queryString = queryParams.toString();
320
+ const endpoint = `/wiki/api/v2/pages/${encodeURIComponent(params.page_id)}${queryString ? `?${queryString}` : ''}`;
321
+ const response = await this.makeConfluenceApiRequest(endpoint, 'GET');
322
+ // Convert storage body to plain text for easier consumption
323
+ if (response.body &&
324
+ typeof response.body === 'object' &&
325
+ 'storage' in response.body) {
326
+ const body = response.body;
327
+ if (body.storage?.value) {
328
+ // Keep original storage format and add a plain text version
329
+ response.bodyText = storageToText(body.storage.value);
330
+ }
331
+ }
332
+ return {
333
+ operation: 'get_page',
334
+ success: true,
335
+ page: response,
336
+ error: '',
337
+ };
338
+ }
339
+ // -------------------------------------------------------------------------
340
+ // OPERATION 5: create_page
341
+ // -------------------------------------------------------------------------
342
+ async createPage(params) {
343
+ const spaceId = await this.getSpaceId(params);
344
+ if (!spaceId) {
345
+ throw new Error('Either space_id or space_key is required');
346
+ }
347
+ const requestBody = {
348
+ spaceId,
349
+ status: params.status ?? 'current',
350
+ title: params.title,
351
+ };
352
+ if (params.body) {
353
+ requestBody.body = {
354
+ representation: 'storage',
355
+ value: markdownToConfluenceStorage(params.body),
356
+ };
357
+ }
358
+ if (params.parent_id) {
359
+ requestBody.parentId = params.parent_id;
360
+ }
361
+ const response = await this.makeConfluenceApiRequest('/wiki/api/v2/pages', 'POST', requestBody);
362
+ return {
363
+ operation: 'create_page',
364
+ success: true,
365
+ page: {
366
+ id: response.id,
367
+ title: response.title,
368
+ status: response.status,
369
+ _links: response._links,
370
+ },
371
+ error: '',
372
+ };
373
+ }
374
+ // -------------------------------------------------------------------------
375
+ // OPERATION 6: update_page
376
+ // -------------------------------------------------------------------------
377
+ async updatePage(params) {
378
+ // Fetch current page to get version number, title, and body (for preservation)
379
+ const currentPage = await this.makeConfluenceApiRequest(`/wiki/api/v2/pages/${encodeURIComponent(params.page_id)}?body-format=storage`, 'GET');
380
+ const currentVersion = currentPage.version;
381
+ if (!currentVersion) {
382
+ throw new Error('Could not determine current page version');
383
+ }
384
+ const requestBody = {
385
+ id: params.page_id,
386
+ status: params.status ?? 'current',
387
+ title: params.title ?? currentPage.title,
388
+ version: {
389
+ number: currentVersion.number + 1,
390
+ message: params.version_message,
391
+ },
392
+ };
393
+ if (params.body !== undefined) {
394
+ // User provided new body — convert markdown to storage format
395
+ requestBody.body = {
396
+ representation: 'storage',
397
+ value: markdownToConfluenceStorage(params.body),
398
+ };
399
+ }
400
+ else {
401
+ // Preserve existing body when only updating title/status
402
+ const currentBody = currentPage.body;
403
+ if (currentBody?.storage?.value) {
404
+ requestBody.body = {
405
+ representation: 'storage',
406
+ value: currentBody.storage.value,
407
+ };
408
+ }
409
+ }
410
+ const response = await this.makeConfluenceApiRequest(`/wiki/api/v2/pages/${encodeURIComponent(params.page_id)}`, 'PUT', requestBody);
411
+ return {
412
+ operation: 'update_page',
413
+ success: true,
414
+ page: {
415
+ id: response.id,
416
+ title: response.title,
417
+ version: response.version,
418
+ },
419
+ error: '',
420
+ };
421
+ }
422
+ // -------------------------------------------------------------------------
423
+ // OPERATION 7: delete_page
424
+ // -------------------------------------------------------------------------
425
+ async deletePage(params) {
426
+ await this.makeConfluenceApiRequest(`/wiki/api/v2/pages/${encodeURIComponent(params.page_id)}`, 'DELETE');
427
+ return {
428
+ operation: 'delete_page',
429
+ success: true,
430
+ page_id: params.page_id,
431
+ error: '',
432
+ };
433
+ }
434
+ // -------------------------------------------------------------------------
435
+ // OPERATION 8: search (uses v1 CQL endpoint)
436
+ // -------------------------------------------------------------------------
437
+ async search(params) {
438
+ const queryParams = new URLSearchParams({
439
+ cql: params.cql,
440
+ limit: String(params.limit ?? 25),
441
+ start: String(params.start ?? 0),
442
+ });
443
+ const response = await this.makeConfluenceV1ApiRequest(`/wiki/rest/api/search?${queryParams.toString()}`, 'GET');
444
+ const rawResults = Array.isArray(response.results) ? response.results : [];
445
+ const results = rawResults.map((r) => ({
446
+ id: r.content?.id,
447
+ type: r.content?.type,
448
+ title: r.content?.title ?? r.title,
449
+ status: r.content?.status,
450
+ excerpt: r.excerpt,
451
+ url: r.url,
452
+ lastModified: r.lastModified,
453
+ _links: r.content?._links,
454
+ content: r.content,
455
+ }));
456
+ return {
457
+ operation: 'search',
458
+ success: true,
459
+ results: results,
460
+ total: (response.totalSize ?? response.size),
461
+ start: response.start,
462
+ limit: response.limit,
463
+ error: '',
464
+ };
465
+ }
466
+ // -------------------------------------------------------------------------
467
+ // OPERATION 9: add_comment
468
+ // -------------------------------------------------------------------------
469
+ async addComment(params) {
470
+ const requestBody = {
471
+ pageId: params.page_id,
472
+ body: {
473
+ representation: 'storage',
474
+ value: markdownToConfluenceStorage(params.body),
475
+ },
476
+ };
477
+ const response = await this.makeConfluenceApiRequest('/wiki/api/v2/footer-comments', 'POST', requestBody);
478
+ return {
479
+ operation: 'add_comment',
480
+ success: true,
481
+ comment: {
482
+ id: response.id,
483
+ body: {
484
+ storage: {
485
+ value: params.body, // Return original text for readability
486
+ representation: 'storage',
487
+ },
488
+ },
489
+ createdAt: response.version?.createdAt,
490
+ },
491
+ error: '',
492
+ };
493
+ }
494
+ // -------------------------------------------------------------------------
495
+ // OPERATION 10: get_comments
496
+ // -------------------------------------------------------------------------
497
+ async getComments(params) {
498
+ const queryParams = new URLSearchParams();
499
+ queryParams.set('limit', String(params.limit ?? 25));
500
+ queryParams.set('body-format', 'storage');
501
+ if (params.cursor) {
502
+ queryParams.set('cursor', params.cursor);
503
+ }
504
+ const response = await this.makeConfluenceApiRequest(`/wiki/api/v2/pages/${encodeURIComponent(params.page_id)}/footer-comments?${queryParams.toString()}`, 'GET');
505
+ const results = Array.isArray(response.results) ? response.results : [];
506
+ const links = response._links;
507
+ const nextCursor = links?.next
508
+ ? (new URL(links.next, 'https://placeholder.com').searchParams.get('cursor') ?? undefined)
509
+ : undefined;
510
+ // Convert storage format to plain text for each comment
511
+ const comments = results.map((comment) => {
512
+ const body = comment.body;
513
+ if (body?.storage?.value) {
514
+ comment.bodyText = storageToText(body.storage.value);
515
+ }
516
+ return comment;
517
+ });
518
+ return {
519
+ operation: 'get_comments',
520
+ success: true,
521
+ comments: comments,
522
+ cursor: nextCursor,
523
+ error: '',
524
+ };
525
+ }
526
+ chooseCredential() {
527
+ const { credentials } = this.params;
528
+ if (!credentials || typeof credentials !== 'object') {
529
+ return undefined;
530
+ }
531
+ return credentials[CredentialType.CONFLUENCE_CRED];
532
+ }
533
+ }
534
+ //# sourceMappingURL=confluence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../../../src/bubbles/service-bubble/confluence/confluence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GAcvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,aAAa,EACb,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,gBAEX,SAAQ,aAGT;IACC,MAAM,CAAU,IAAI,GAAG,SAAkB,CAAC;IAC1C,MAAM,CAAU,OAAO,GAAG,YAAY,CAAC;IACvC,MAAM,CAAU,QAAQ,GAAG,OAAgB,CAAC;IAC5C,MAAM,CAAU,UAAU,GAAG,YAAY,CAAC;IAC1C,MAAM,CAAU,MAAM,GAAG,sBAAsB,CAAC;IAChD,MAAM,CAAU,YAAY,GAAG,sBAAsB,CAAC;IACtD,MAAM,CAAU,gBAAgB,GAC9B,8DAA8D,CAAC;IACjE,MAAM,CAAU,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;GAsBjC,CAAC;IACF,MAAM,CAAU,KAAK,GAAG,YAAY,CAAC;IAErC,YAAY,MAAS,EAAE,OAAuB;QAC5C,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,6BAA6B,EAC7B,KAAK,CACN,CAAC;YACF,OAAO,OAAO,CAAC,QAAQ,IAAI,SAAS,IAAI,QAAQ,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,gBAAgB;QAItB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,MAE5B,CAAC;QAEF,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,iBAAiB,GAAG,WAAW,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAC/D,OAAO,CACR,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEnC,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzC,OAAO;oBACL,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,OAAO,EAAE,2CAA2C,MAAM,CAAC,OAAO,EAAE;iBACrE,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,QAAgB;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,4BAA4B,kBAAkB,CAAC,QAAQ,CAAC,UAAU,EAClE,KAAK,CACN,CAAC;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAQ,OAAO,CAAC,CAAC,CAAoB,CAAC,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,MAGxB;QACC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;QAC5C,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,wBAAwB,CACpC,QAAgB,EAChB,SAA4C,KAAK,EACjD,IAAc;QAEd,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAE1C,MAAM,cAAc,GAA2B;YAC7C,aAAa,EAAE,UAAU,KAAK,CAAC,WAAW,EAAE;YAC5C,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,MAAM,WAAW,GAAgB;YAC/B,MAAM;YACN,OAAO,EAAE,cAAc;SACxB,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,aAAa,GAAG,mBAAmB,CACvC,SAAS,EACT,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,CACpB,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,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,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,0BAA0B,CACtC,QAAgB,EAChB,SAAyB,KAAK,EAC9B,IAAc;QAEd,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAE1C,MAAM,cAAc,GAA2B;YAC7C,aAAa,EAAE,UAAU,KAAK,CAAC,WAAW,EAAE;YAC5C,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,MAAM,WAAW,GAAgB;YAC/B,MAAM;YACN,OAAO,EAAE,cAAc;SACxB,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,aAAa,GAAG,mBAAmB,CACvC,SAAS,EACT,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,CACpB,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,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,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,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,IAA+B,EAAE;gBAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,MAA0B,CAAC;gBAErD,QAAQ,SAAS,EAAE,CAAC;oBAClB,KAAK,aAAa;wBAChB,OAAO,MAAM,IAAI,CAAC,UAAU,CAC1B,YAA0C,CAC3C,CAAC;oBACJ,KAAK,WAAW;wBACd,OAAO,MAAM,IAAI,CAAC,QAAQ,CACxB,YAAwC,CACzC,CAAC;oBACJ,KAAK,YAAY;wBACf,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,YAAyC,CAC1C,CAAC;oBACJ,KAAK,UAAU;wBACb,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,YAAuC,CAAC,CAAC;oBACrE,KAAK,aAAa;wBAChB,OAAO,MAAM,IAAI,CAAC,UAAU,CAC1B,YAA0C,CAC3C,CAAC;oBACJ,KAAK,aAAa;wBAChB,OAAO,MAAM,IAAI,CAAC,UAAU,CAC1B,YAA0C,CAC3C,CAAC;oBACJ,KAAK,aAAa;wBAChB,OAAO,MAAM,IAAI,CAAC,UAAU,CAC1B,YAA0C,CAC3C,CAAC;oBACJ,KAAK,QAAQ;wBACX,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,YAAsC,CAAC,CAAC;oBACnE,KAAK,aAAa;wBAChB,OAAO,MAAM,IAAI,CAAC,UAAU,CAC1B,YAA0C,CAC3C,CAAC;oBACJ,KAAK,cAAc;wBACjB,OAAO,MAAM,IAAI,CAAC,WAAW,CAC3B,YAA2C,CAC5C,CAAC;oBACJ;wBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,OAAO,MAAkE,CAAC;QAC5E,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;aACR,CAAC;QAChE,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IACpE,KAAK,CAAC,UAAU,CACtB,MAAkC;QAElC,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAErD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,uBAAuB,WAAW,CAAC,QAAQ,EAAE,EAAE,EAC/C,KAAK,CACN,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAuC,CAAC;QAC/D,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI;YAC5B,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,YAAY,CAAC,GAAG,CAC9D,QAAQ,CACT,IAAI,SAAS,CAAC;YACjB,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,OAEC;YACT,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,yBAAyB;IACzB,4EAA4E;IACpE,KAAK,CAAC,QAAQ,CACpB,MAAgC;QAEhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,uBAAuB,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EACrF,KAAK,CACN,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,QAEE;YACT,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,0BAA0B;IAC1B,4EAA4E;IACpE,KAAK,CAAC,SAAS,CACrB,MAAiC;QAEjC,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAErD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,sBAAsB,WAAW,CAAC,QAAQ,EAAE,EAAE,EAC9C,KAAK,CACN,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAuC,CAAC;QAC/D,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI;YAC5B,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,YAAY,CAAC,GAAG,CAC9D,QAAQ,CACT,IAAI,SAAS,CAAC;YACjB,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO;YACL,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,OAEE;YACT,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,wBAAwB;IACxB,4EAA4E;IACpE,KAAK,CAAC,OAAO,CACnB,MAA+B;QAE/B,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YAClC,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAEnH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEtE,4DAA4D;QAC5D,IACE,QAAQ,CAAC,IAAI;YACb,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;YACjC,SAAS,IAAK,QAAQ,CAAC,IAAgC,EACvD,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAErB,CAAC;YACF,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBACxB,4DAA4D;gBAC3D,QAAoC,CAAC,QAAQ,GAAG,aAAa,CAC5D,IAAI,CAAC,OAAO,CAAC,KAAK,CACnB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,QAAmE;YACzE,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IACpE,KAAK,CAAC,UAAU,CACtB,MAAkC;QAElC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,WAAW,GAA4B;YAC3C,OAAO;YACP,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,WAAW,CAAC,IAAI,GAAG;gBACjB,cAAc,EAAE,SAAS;gBACzB,KAAK,EAAE,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC;aAChD,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,oBAAoB,EACpB,MAAM,EACN,WAAW,CACZ,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,EAAE,EAAE,QAAQ,CAAC,EAAY;gBACzB,KAAK,EAAE,QAAQ,CAAC,KAAe;gBAC/B,MAAM,EAAE,QAAQ,CAAC,MAA4B;gBAC7C,MAAM,EAAE,QAAQ,CAAC,MAAwC;aAC1D;YACD,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IACpE,KAAK,CAAC,UAAU,CACtB,MAAkC;QAElC,+EAA+E;QAC/E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,wBAAwB,CACrD,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAC9E,KAAK,CACN,CAAC;QAEF,MAAM,cAAc,GAAG,WAAW,CAAC,OAEtB,CAAC;QACd,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,WAAW,GAA4B;YAC3C,EAAE,EAAE,MAAM,CAAC,OAAO;YAClB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAK,WAAW,CAAC,KAAgB;YACpD,OAAO,EAAE;gBACP,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;gBACjC,OAAO,EAAE,MAAM,CAAC,eAAe;aAChC;SACF,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,8DAA8D;YAC9D,WAAW,CAAC,IAAI,GAAG;gBACjB,cAAc,EAAE,SAAS;gBACzB,KAAK,EAAE,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC;aAChD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,yDAAyD;YACzD,MAAM,WAAW,GAAG,WAAW,CAAC,IAEnB,CAAC;YACd,IAAI,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAChC,WAAW,CAAC,IAAI,GAAG;oBACjB,cAAc,EAAE,SAAS;oBACzB,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK;iBACjC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAC1D,KAAK,EACL,WAAW,CACZ,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,EAAE,EAAE,QAAQ,CAAC,EAAY;gBACzB,KAAK,EAAE,QAAQ,CAAC,KAAe;gBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAyC;aAC5D;YACD,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IACpE,KAAK,CAAC,UAAU,CACtB,MAAkC;QAElC,MAAM,IAAI,CAAC,wBAAwB,CACjC,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAC1D,QAAQ,CACT,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,6CAA6C;IAC7C,4EAA4E;IACpE,KAAK,CAAC,MAAM,CAClB,MAA8B;QAE9B,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;YACtC,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;SACjC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,0BAA0B,CACpD,yBAAyB,WAAW,CAAC,QAAQ,EAAE,EAAE,EACjD,KAAK,CACN,CAAC;QAEF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAiB3E,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC;YACtD,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI;YACrB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,KAAK;YAClC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM;YACzB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM;YACzB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,OAEA;YACT,KAAK,EAAE,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAuB;YAClE,KAAK,EAAE,QAAQ,CAAC,KAA2B;YAC3C,KAAK,EAAE,QAAQ,CAAC,KAA2B;YAC3C,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IACpE,KAAK,CAAC,UAAU,CACtB,MAAkC;QAElC,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,IAAI,EAAE;gBACJ,cAAc,EAAE,SAAS;gBACzB,KAAK,EAAE,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC;aAChD;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,8BAA8B,EAC9B,MAAM,EACN,WAAW,CACZ,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP,EAAE,EAAE,QAAQ,CAAC,EAAY;gBACzB,IAAI,EAAE;oBACJ,OAAO,EAAE;wBACP,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,uCAAuC;wBAC3D,cAAc,EAAE,SAAS;qBAC1B;iBACF;gBACD,SAAS,EAAG,QAAQ,CAAC,OAAkC,EAAE,SAAS;aACnE;YACD,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,6BAA6B;IAC7B,4EAA4E;IACpE,KAAK,CAAC,WAAW,CACvB,MAAmC;QAEnC,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAE1C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,WAAW,CAAC,QAAQ,EAAE,EAAE,EACpG,KAAK,CACN,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAuC,CAAC;QAC/D,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI;YAC5B,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,YAAY,CAAC,GAAG,CAC9D,QAAQ,CACT,IAAI,SAAS,CAAC;YACjB,CAAC,CAAC,SAAS,CAAC;QAEd,wDAAwD;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,OAAgC,EAAE,EAAE;YAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAoD,CAAC;YAC1E,IAAI,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACxB,OAAmC,CAAC,QAAQ,GAAG,aAAa,CAC3D,IAAI,CAAC,OAAO,CAAC,KAAK,CACnB,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,QAED;YACT,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,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,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,WAAW,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IACrD,CAAC"}