@bubblelab/bubble-core 0.1.289 → 0.1.291

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 (105) hide show
  1. package/dist/bubble-bundle.d.ts +183 -163
  2. package/dist/bubble-factory.d.ts.map +1 -1
  3. package/dist/bubble-factory.js +3 -0
  4. package/dist/bubble-factory.js.map +1 -1
  5. package/dist/bubbles/service-bubble/ai-agent.d.ts +84 -84
  6. package/dist/bubbles/service-bubble/airtable.d.ts +100 -100
  7. package/dist/bubbles/service-bubble/apify/actors/app-rankings-scraper.d.ts +6 -6
  8. package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts +2 -2
  9. package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts +8 -8
  10. package/dist/bubbles/service-bubble/apify/actors/linkedin-jobs-scraper.d.ts +2 -2
  11. package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts +22 -22
  12. package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-detail.d.ts +38 -38
  13. package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts +52 -52
  14. package/dist/bubbles/service-bubble/apify/actors/tiktok-scraper.d.ts +6 -6
  15. package/dist/bubbles/service-bubble/apify/actors/twitter-scraper.d.ts +12 -12
  16. package/dist/bubbles/service-bubble/apify/actors/youtube-scraper.d.ts +12 -12
  17. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts +132 -132
  18. package/dist/bubbles/service-bubble/apify/apify.d.ts +22 -22
  19. package/dist/bubbles/service-bubble/asana/asana.d.ts +3 -3
  20. package/dist/bubbles/service-bubble/asana/asana.schema.d.ts +1 -1
  21. package/dist/bubbles/service-bubble/ashby/ashby.d.ts +168 -168
  22. package/dist/bubbles/service-bubble/ashby/ashby.schema.d.ts +32 -32
  23. package/dist/bubbles/service-bubble/assembled/assembled.d.ts +4 -4
  24. package/dist/bubbles/service-bubble/assembled/assembled.schema.d.ts +6 -6
  25. package/dist/bubbles/service-bubble/attio/attio.d.ts +6 -6
  26. package/dist/bubbles/service-bubble/attio/attio.schema.d.ts +6 -6
  27. package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts +5 -5
  28. package/dist/bubbles/service-bubble/browserbase/browserbase.schema.d.ts +1 -1
  29. package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts +78 -78
  30. package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts +8 -8
  31. package/dist/bubbles/service-bubble/discord/discord.d.ts +12 -12
  32. package/dist/bubbles/service-bubble/discord/discord.schema.d.ts +12 -12
  33. package/dist/bubbles/service-bubble/firecrawl.d.ts +278 -278
  34. package/dist/bubbles/service-bubble/followupboss.d.ts +4 -4
  35. package/dist/bubbles/service-bubble/github.d.ts +12 -12
  36. package/dist/bubbles/service-bubble/gmail.d.ts +104 -104
  37. package/dist/bubbles/service-bubble/google-calendar.d.ts +80 -80
  38. package/dist/bubbles/service-bubble/google-drive.d.ts +40 -40
  39. package/dist/bubbles/service-bubble/granola/granola.d.ts +446 -0
  40. package/dist/bubbles/service-bubble/granola/granola.d.ts.map +1 -0
  41. package/dist/bubbles/service-bubble/granola/granola.js +187 -0
  42. package/dist/bubbles/service-bubble/granola/granola.js.map +1 -0
  43. package/dist/bubbles/service-bubble/granola/granola.schema.d.ts +766 -0
  44. package/dist/bubbles/service-bubble/granola/granola.schema.d.ts.map +1 -0
  45. package/dist/bubbles/service-bubble/granola/granola.schema.js +196 -0
  46. package/dist/bubbles/service-bubble/granola/granola.schema.js.map +1 -0
  47. package/dist/bubbles/service-bubble/granola/index.d.ts +3 -0
  48. package/dist/bubbles/service-bubble/granola/index.d.ts.map +1 -0
  49. package/dist/bubbles/service-bubble/granola/index.js +3 -0
  50. package/dist/bubbles/service-bubble/granola/index.js.map +1 -0
  51. package/dist/bubbles/service-bubble/http.d.ts +14 -14
  52. package/dist/bubbles/service-bubble/hubspot/hubspot.d.ts +8 -8
  53. package/dist/bubbles/service-bubble/hubspot/hubspot.schema.d.ts +2 -2
  54. package/dist/bubbles/service-bubble/insforge-db.d.ts +8 -8
  55. package/dist/bubbles/service-bubble/jira/jira.d.ts +16 -16
  56. package/dist/bubbles/service-bubble/jira/jira.schema.d.ts +36 -36
  57. package/dist/bubbles/service-bubble/metabase/metabase.d.ts +6 -6
  58. package/dist/bubbles/service-bubble/metabase/metabase.schema.d.ts +2 -2
  59. package/dist/bubbles/service-bubble/notion/notion.d.ts +272 -272
  60. package/dist/bubbles/service-bubble/notion/property-schemas.d.ts +16 -16
  61. package/dist/bubbles/service-bubble/postgresql.d.ts +8 -8
  62. package/dist/bubbles/service-bubble/posthog/posthog.d.ts +8 -8
  63. package/dist/bubbles/service-bubble/posthog/posthog.schema.d.ts +14 -14
  64. package/dist/bubbles/service-bubble/resend.d.ts +12 -12
  65. package/dist/bubbles/service-bubble/sendsafely/sendsafely.d.ts +4 -4
  66. package/dist/bubbles/service-bubble/slab/slab.d.ts +16 -16
  67. package/dist/bubbles/service-bubble/slack/slack.d.ts +294 -294
  68. package/dist/bubbles/service-bubble/snowflake/snowflake.d.ts +4 -4
  69. package/dist/bubbles/service-bubble/snowflake/snowflake.schema.d.ts +4 -4
  70. package/dist/bubbles/service-bubble/sortly/sortly.d.ts +38 -38
  71. package/dist/bubbles/service-bubble/sortly/sortly.schema.d.ts +40 -40
  72. package/dist/bubbles/service-bubble/stripe/stripe.d.ts +33 -33
  73. package/dist/bubbles/service-bubble/stripe/stripe.schema.d.ts +28 -28
  74. package/dist/bubbles/service-bubble/xero/xero.d.ts +2 -2
  75. package/dist/bubbles/service-bubble/xero/xero.schema.d.ts +2 -2
  76. package/dist/bubbles/service-bubble/zendesk/zendesk.d.ts +22 -22
  77. package/dist/bubbles/service-bubble/zendesk/zendesk.schema.d.ts +20 -20
  78. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.d.ts +6 -6
  79. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.d.ts +8 -8
  80. package/dist/bubbles/tool-bubble/app-rankings-tool.d.ts +16 -16
  81. package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +4 -4
  82. package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts +10 -10
  83. package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +385 -385
  84. package/dist/bubbles/tool-bubble/list-capabilities-tool.d.ts +8 -8
  85. package/dist/bubbles/tool-bubble/people-search-tool.d.ts +10 -10
  86. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +4 -4
  87. package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +4 -4
  88. package/dist/bubbles/tool-bubble/tiktok-tool.d.ts +60 -60
  89. package/dist/bubbles/tool-bubble/twitter-tool.d.ts +134 -134
  90. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +4 -4
  91. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +4 -4
  92. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +8 -8
  93. package/dist/bubbles/tool-bubble/yc-scraper-tool.d.ts +8 -8
  94. package/dist/bubbles/tool-bubble/youtube-tool.d.ts +20 -20
  95. package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +12 -12
  96. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +44 -44
  97. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +16 -16
  98. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +2 -2
  99. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +42 -42
  100. package/dist/bubbles.json +458 -2
  101. package/dist/index.d.ts +1 -0
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +1 -0
  104. package/dist/index.js.map +1 -1
  105. package/package.json +2 -2
@@ -0,0 +1,446 @@
1
+ import { CredentialType } from '@bubblelab/shared-schemas';
2
+ import { ServiceBubble } from '../../../types/service-bubble-class.js';
3
+ import type { BubbleContext } from '../../../types/bubble.js';
4
+ import { type GranolaParamsInput, type GranolaResult } from './granola.schema.js';
5
+ /**
6
+ * GranolaBubble - Integration with Granola meeting notes API
7
+ *
8
+ * Provides read-only operations for accessing Granola meeting notes:
9
+ * - List notes with pagination and date filtering
10
+ * - Get note details with optional transcript
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // List recent notes
15
+ * const result = await new GranolaBubble({
16
+ * operation: 'list_notes',
17
+ * page_size: 10,
18
+ * }).action();
19
+ *
20
+ * // Get a specific note with transcript
21
+ * const note = await new GranolaBubble({
22
+ * operation: 'get_note',
23
+ * note_id: 'not_1d3tmYTlCICgjy',
24
+ * include_transcript: true,
25
+ * }).action();
26
+ * ```
27
+ */
28
+ export declare class GranolaBubble<T extends GranolaParamsInput = GranolaParamsInput> extends ServiceBubble<T, Extract<GranolaResult, {
29
+ operation: T['operation'];
30
+ }>> {
31
+ static readonly service = "granola";
32
+ static readonly authType: "apikey";
33
+ static readonly bubbleName: "granola";
34
+ static readonly type: "service";
35
+ static readonly schema: import("zod").ZodDiscriminatedUnion<"operation", [import("zod").ZodObject<{
36
+ operation: import("zod").ZodEffects<import("zod").ZodLiteral<"list_notes">, "list_notes", "list_notes">;
37
+ created_before: import("zod").ZodOptional<import("zod").ZodString>;
38
+ created_after: import("zod").ZodOptional<import("zod").ZodString>;
39
+ updated_after: import("zod").ZodOptional<import("zod").ZodString>;
40
+ cursor: import("zod").ZodOptional<import("zod").ZodString>;
41
+ page_size: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
42
+ credentials: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodNativeEnum<typeof CredentialType>, import("zod").ZodString>>;
43
+ }, "strip", import("zod").ZodTypeAny, {
44
+ operation: "list_notes";
45
+ page_size: number;
46
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
47
+ cursor?: string | undefined;
48
+ created_before?: string | undefined;
49
+ created_after?: string | undefined;
50
+ updated_after?: string | undefined;
51
+ }, {
52
+ operation: "list_notes";
53
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
54
+ cursor?: string | undefined;
55
+ page_size?: number | undefined;
56
+ created_before?: string | undefined;
57
+ created_after?: string | undefined;
58
+ updated_after?: string | undefined;
59
+ }>, import("zod").ZodObject<{
60
+ operation: import("zod").ZodEffects<import("zod").ZodLiteral<"get_note">, "get_note", "get_note">;
61
+ note_id: import("zod").ZodString;
62
+ include_transcript: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodBoolean>>;
63
+ credentials: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodNativeEnum<typeof CredentialType>, import("zod").ZodString>>;
64
+ }, "strip", import("zod").ZodTypeAny, {
65
+ operation: "get_note";
66
+ note_id: string;
67
+ include_transcript: boolean;
68
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
69
+ }, {
70
+ operation: "get_note";
71
+ note_id: string;
72
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
73
+ include_transcript?: boolean | undefined;
74
+ }>]>;
75
+ static readonly resultSchema: import("zod").ZodDiscriminatedUnion<"operation", [import("zod").ZodObject<{
76
+ operation: import("zod").ZodLiteral<"list_notes">;
77
+ success: import("zod").ZodBoolean;
78
+ notes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
79
+ id: import("zod").ZodString;
80
+ object: import("zod").ZodLiteral<"note">;
81
+ title: import("zod").ZodNullable<import("zod").ZodString>;
82
+ owner: import("zod").ZodObject<{
83
+ name: import("zod").ZodNullable<import("zod").ZodString>;
84
+ email: import("zod").ZodString;
85
+ }, "strip", import("zod").ZodTypeAny, {
86
+ name: string | null;
87
+ email: string;
88
+ }, {
89
+ name: string | null;
90
+ email: string;
91
+ }>;
92
+ created_at: import("zod").ZodString;
93
+ updated_at: import("zod").ZodString;
94
+ }, "strip", import("zod").ZodTypeAny, {
95
+ object: "note";
96
+ title: string | null;
97
+ id: string;
98
+ created_at: string;
99
+ owner: {
100
+ name: string | null;
101
+ email: string;
102
+ };
103
+ updated_at: string;
104
+ }, {
105
+ object: "note";
106
+ title: string | null;
107
+ id: string;
108
+ created_at: string;
109
+ owner: {
110
+ name: string | null;
111
+ email: string;
112
+ };
113
+ updated_at: string;
114
+ }>, "many">>;
115
+ hasMore: import("zod").ZodOptional<import("zod").ZodBoolean>;
116
+ cursor: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
117
+ error: import("zod").ZodString;
118
+ }, "strip", import("zod").ZodTypeAny, {
119
+ error: string;
120
+ success: boolean;
121
+ operation: "list_notes";
122
+ cursor?: string | null | undefined;
123
+ notes?: {
124
+ object: "note";
125
+ title: string | null;
126
+ id: string;
127
+ created_at: string;
128
+ owner: {
129
+ name: string | null;
130
+ email: string;
131
+ };
132
+ updated_at: string;
133
+ }[] | undefined;
134
+ hasMore?: boolean | undefined;
135
+ }, {
136
+ error: string;
137
+ success: boolean;
138
+ operation: "list_notes";
139
+ cursor?: string | null | undefined;
140
+ notes?: {
141
+ object: "note";
142
+ title: string | null;
143
+ id: string;
144
+ created_at: string;
145
+ owner: {
146
+ name: string | null;
147
+ email: string;
148
+ };
149
+ updated_at: string;
150
+ }[] | undefined;
151
+ hasMore?: boolean | undefined;
152
+ }>, import("zod").ZodObject<{
153
+ operation: import("zod").ZodLiteral<"get_note">;
154
+ success: import("zod").ZodBoolean;
155
+ note: import("zod").ZodOptional<import("zod").ZodObject<{
156
+ id: import("zod").ZodString;
157
+ object: import("zod").ZodLiteral<"note">;
158
+ title: import("zod").ZodNullable<import("zod").ZodString>;
159
+ owner: import("zod").ZodObject<{
160
+ name: import("zod").ZodNullable<import("zod").ZodString>;
161
+ email: import("zod").ZodString;
162
+ }, "strip", import("zod").ZodTypeAny, {
163
+ name: string | null;
164
+ email: string;
165
+ }, {
166
+ name: string | null;
167
+ email: string;
168
+ }>;
169
+ created_at: import("zod").ZodString;
170
+ updated_at: import("zod").ZodString;
171
+ } & {
172
+ calendar_event: import("zod").ZodNullable<import("zod").ZodObject<{
173
+ event_title: import("zod").ZodNullable<import("zod").ZodString>;
174
+ invitees: import("zod").ZodArray<import("zod").ZodObject<{
175
+ email: import("zod").ZodString;
176
+ }, "strip", import("zod").ZodTypeAny, {
177
+ email: string;
178
+ }, {
179
+ email: string;
180
+ }>, "many">;
181
+ organiser: import("zod").ZodNullable<import("zod").ZodString>;
182
+ calendar_event_id: import("zod").ZodNullable<import("zod").ZodString>;
183
+ scheduled_start_time: import("zod").ZodNullable<import("zod").ZodString>;
184
+ scheduled_end_time: import("zod").ZodNullable<import("zod").ZodString>;
185
+ }, "strip", import("zod").ZodTypeAny, {
186
+ event_title: string | null;
187
+ invitees: {
188
+ email: string;
189
+ }[];
190
+ organiser: string | null;
191
+ calendar_event_id: string | null;
192
+ scheduled_start_time: string | null;
193
+ scheduled_end_time: string | null;
194
+ }, {
195
+ event_title: string | null;
196
+ invitees: {
197
+ email: string;
198
+ }[];
199
+ organiser: string | null;
200
+ calendar_event_id: string | null;
201
+ scheduled_start_time: string | null;
202
+ scheduled_end_time: string | null;
203
+ }>>;
204
+ attendees: import("zod").ZodArray<import("zod").ZodObject<{
205
+ name: import("zod").ZodNullable<import("zod").ZodString>;
206
+ email: import("zod").ZodString;
207
+ }, "strip", import("zod").ZodTypeAny, {
208
+ name: string | null;
209
+ email: string;
210
+ }, {
211
+ name: string | null;
212
+ email: string;
213
+ }>, "many">;
214
+ folder_membership: import("zod").ZodArray<import("zod").ZodObject<{
215
+ id: import("zod").ZodString;
216
+ object: import("zod").ZodLiteral<"folder">;
217
+ name: import("zod").ZodString;
218
+ }, "strip", import("zod").ZodTypeAny, {
219
+ object: "folder";
220
+ name: string;
221
+ id: string;
222
+ }, {
223
+ object: "folder";
224
+ name: string;
225
+ id: string;
226
+ }>, "many">;
227
+ summary_text: import("zod").ZodString;
228
+ summary_markdown: import("zod").ZodNullable<import("zod").ZodString>;
229
+ transcript: import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodObject<{
230
+ speaker: import("zod").ZodObject<{
231
+ source: import("zod").ZodEnum<["microphone", "speaker"]>;
232
+ diarization_label: import("zod").ZodOptional<import("zod").ZodString>;
233
+ }, "strip", import("zod").ZodTypeAny, {
234
+ source: "microphone" | "speaker";
235
+ diarization_label?: string | undefined;
236
+ }, {
237
+ source: "microphone" | "speaker";
238
+ diarization_label?: string | undefined;
239
+ }>;
240
+ text: import("zod").ZodString;
241
+ start_time: import("zod").ZodString;
242
+ end_time: import("zod").ZodString;
243
+ }, "strip", import("zod").ZodTypeAny, {
244
+ text: string;
245
+ speaker: {
246
+ source: "microphone" | "speaker";
247
+ diarization_label?: string | undefined;
248
+ };
249
+ start_time: string;
250
+ end_time: string;
251
+ }, {
252
+ text: string;
253
+ speaker: {
254
+ source: "microphone" | "speaker";
255
+ diarization_label?: string | undefined;
256
+ };
257
+ start_time: string;
258
+ end_time: string;
259
+ }>, "many">>;
260
+ }, "strip", import("zod").ZodTypeAny, {
261
+ object: "note";
262
+ title: string | null;
263
+ id: string;
264
+ created_at: string;
265
+ owner: {
266
+ name: string | null;
267
+ email: string;
268
+ };
269
+ attendees: {
270
+ name: string | null;
271
+ email: string;
272
+ }[];
273
+ updated_at: string;
274
+ calendar_event: {
275
+ event_title: string | null;
276
+ invitees: {
277
+ email: string;
278
+ }[];
279
+ organiser: string | null;
280
+ calendar_event_id: string | null;
281
+ scheduled_start_time: string | null;
282
+ scheduled_end_time: string | null;
283
+ } | null;
284
+ folder_membership: {
285
+ object: "folder";
286
+ name: string;
287
+ id: string;
288
+ }[];
289
+ summary_text: string;
290
+ summary_markdown: string | null;
291
+ transcript: {
292
+ text: string;
293
+ speaker: {
294
+ source: "microphone" | "speaker";
295
+ diarization_label?: string | undefined;
296
+ };
297
+ start_time: string;
298
+ end_time: string;
299
+ }[] | null;
300
+ }, {
301
+ object: "note";
302
+ title: string | null;
303
+ id: string;
304
+ created_at: string;
305
+ owner: {
306
+ name: string | null;
307
+ email: string;
308
+ };
309
+ attendees: {
310
+ name: string | null;
311
+ email: string;
312
+ }[];
313
+ updated_at: string;
314
+ calendar_event: {
315
+ event_title: string | null;
316
+ invitees: {
317
+ email: string;
318
+ }[];
319
+ organiser: string | null;
320
+ calendar_event_id: string | null;
321
+ scheduled_start_time: string | null;
322
+ scheduled_end_time: string | null;
323
+ } | null;
324
+ folder_membership: {
325
+ object: "folder";
326
+ name: string;
327
+ id: string;
328
+ }[];
329
+ summary_text: string;
330
+ summary_markdown: string | null;
331
+ transcript: {
332
+ text: string;
333
+ speaker: {
334
+ source: "microphone" | "speaker";
335
+ diarization_label?: string | undefined;
336
+ };
337
+ start_time: string;
338
+ end_time: string;
339
+ }[] | null;
340
+ }>>;
341
+ error: import("zod").ZodString;
342
+ }, "strip", import("zod").ZodTypeAny, {
343
+ error: string;
344
+ success: boolean;
345
+ operation: "get_note";
346
+ note?: {
347
+ object: "note";
348
+ title: string | null;
349
+ id: string;
350
+ created_at: string;
351
+ owner: {
352
+ name: string | null;
353
+ email: string;
354
+ };
355
+ attendees: {
356
+ name: string | null;
357
+ email: string;
358
+ }[];
359
+ updated_at: string;
360
+ calendar_event: {
361
+ event_title: string | null;
362
+ invitees: {
363
+ email: string;
364
+ }[];
365
+ organiser: string | null;
366
+ calendar_event_id: string | null;
367
+ scheduled_start_time: string | null;
368
+ scheduled_end_time: string | null;
369
+ } | null;
370
+ folder_membership: {
371
+ object: "folder";
372
+ name: string;
373
+ id: string;
374
+ }[];
375
+ summary_text: string;
376
+ summary_markdown: string | null;
377
+ transcript: {
378
+ text: string;
379
+ speaker: {
380
+ source: "microphone" | "speaker";
381
+ diarization_label?: string | undefined;
382
+ };
383
+ start_time: string;
384
+ end_time: string;
385
+ }[] | null;
386
+ } | undefined;
387
+ }, {
388
+ error: string;
389
+ success: boolean;
390
+ operation: "get_note";
391
+ note?: {
392
+ object: "note";
393
+ title: string | null;
394
+ id: string;
395
+ created_at: string;
396
+ owner: {
397
+ name: string | null;
398
+ email: string;
399
+ };
400
+ attendees: {
401
+ name: string | null;
402
+ email: string;
403
+ }[];
404
+ updated_at: string;
405
+ calendar_event: {
406
+ event_title: string | null;
407
+ invitees: {
408
+ email: string;
409
+ }[];
410
+ organiser: string | null;
411
+ calendar_event_id: string | null;
412
+ scheduled_start_time: string | null;
413
+ scheduled_end_time: string | null;
414
+ } | null;
415
+ folder_membership: {
416
+ object: "folder";
417
+ name: string;
418
+ id: string;
419
+ }[];
420
+ summary_text: string;
421
+ summary_markdown: string | null;
422
+ transcript: {
423
+ text: string;
424
+ speaker: {
425
+ source: "microphone" | "speaker";
426
+ diarization_label?: string | undefined;
427
+ };
428
+ start_time: string;
429
+ end_time: string;
430
+ }[] | null;
431
+ } | undefined;
432
+ }>]>;
433
+ static readonly shortDescription = "Granola meeting notes and transcription integration";
434
+ static readonly longDescription = "\n Granola is an AI meeting notes tool that captures and summarizes meetings.\n This bubble provides read-only access to:\n - List meeting notes with filtering by creation/update dates\n - Paginate through notes using cursor-based pagination\n - Get full note details including summaries, attendees, and calendar events\n - Optionally retrieve meeting transcripts\n\n Authentication:\n - Uses Bearer token (API key) from Granola Settings > API\n - Requires Business or Enterprise plan for personal keys\n - Enterprise keys access all Team space notes\n\n Rate Limits:\n - 25 request burst capacity\n - 5 requests/second sustained rate\n ";
435
+ static readonly alias = "granola-notes";
436
+ constructor(params?: T, context?: BubbleContext);
437
+ protected chooseCredential(): string | undefined;
438
+ testCredential(): Promise<boolean>;
439
+ protected performAction(context?: BubbleContext): Promise<Extract<GranolaResult, {
440
+ operation: T['operation'];
441
+ }>>;
442
+ private listNotes;
443
+ private getNote;
444
+ private makeGranolaRequest;
445
+ }
446
+ //# sourceMappingURL=granola.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granola.d.ts","sourceRoot":"","sources":["../../../../src/bubbles/service-bubble/granola/granola.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAC;AAI7B;;;;;;;;;;;;;;;;;;;;;;GAsBG;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,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAC7C,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAG,SAAS,CAAU;IAChD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAuB;IAC7C,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAuB;IACnD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,yDACwB;IACxD,MAAM,CAAC,QAAQ,CAAC,eAAe,2qBAgB7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,mBAAmB;gBAGtC,MAAM,GAAE,CAGF,EACN,OAAO,CAAC,EAAE,aAAa;IAKzB,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAS1C,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;cAqBxB,aAAa,CAC3B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE;QAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,CAAC;YAsCnD,SAAS;YA0CT,OAAO;YAoCP,kBAAkB;CAcjC"}
@@ -0,0 +1,187 @@
1
+ import { CredentialType } from '@bubblelab/shared-schemas';
2
+ import { ServiceBubble } from '../../../types/service-bubble-class.js';
3
+ import { GranolaParamsSchema, GranolaResultSchema, } from './granola.schema.js';
4
+ const GRANOLA_API_BASE = 'https://public-api.granola.ai';
5
+ /**
6
+ * GranolaBubble - Integration with Granola meeting notes API
7
+ *
8
+ * Provides read-only operations for accessing Granola meeting notes:
9
+ * - List notes with pagination and date filtering
10
+ * - Get note details with optional transcript
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // List recent notes
15
+ * const result = await new GranolaBubble({
16
+ * operation: 'list_notes',
17
+ * page_size: 10,
18
+ * }).action();
19
+ *
20
+ * // Get a specific note with transcript
21
+ * const note = await new GranolaBubble({
22
+ * operation: 'get_note',
23
+ * note_id: 'not_1d3tmYTlCICgjy',
24
+ * include_transcript: true,
25
+ * }).action();
26
+ * ```
27
+ */
28
+ export class GranolaBubble extends ServiceBubble {
29
+ static service = 'granola';
30
+ static authType = 'apikey';
31
+ static bubbleName = 'granola';
32
+ static type = 'service';
33
+ static schema = GranolaParamsSchema;
34
+ static resultSchema = GranolaResultSchema;
35
+ static shortDescription = 'Granola meeting notes and transcription integration';
36
+ static longDescription = `
37
+ Granola is an AI meeting notes tool that captures and summarizes meetings.
38
+ This bubble provides read-only access to:
39
+ - List meeting notes with filtering by creation/update dates
40
+ - Paginate through notes using cursor-based pagination
41
+ - Get full note details including summaries, attendees, and calendar events
42
+ - Optionally retrieve meeting transcripts
43
+
44
+ Authentication:
45
+ - Uses Bearer token (API key) from Granola Settings > API
46
+ - Requires Business or Enterprise plan for personal keys
47
+ - Enterprise keys access all Team space notes
48
+
49
+ Rate Limits:
50
+ - 25 request burst capacity
51
+ - 5 requests/second sustained rate
52
+ `;
53
+ static alias = 'granola-notes';
54
+ constructor(params = {
55
+ operation: 'list_notes',
56
+ page_size: 10,
57
+ }, context) {
58
+ super(params, context);
59
+ }
60
+ chooseCredential() {
61
+ const params = this.params;
62
+ const credentials = params.credentials;
63
+ if (!credentials || typeof credentials !== 'object') {
64
+ return undefined;
65
+ }
66
+ return credentials[CredentialType.GRANOLA_API_KEY];
67
+ }
68
+ async testCredential() {
69
+ const apiKey = this.chooseCredential();
70
+ if (!apiKey) {
71
+ return false;
72
+ }
73
+ // Validate by listing notes with page_size=1
74
+ const response = await fetch(`${GRANOLA_API_BASE}/v1/notes?page_size=1`, {
75
+ method: 'GET',
76
+ headers: {
77
+ Authorization: `Bearer ${apiKey}`,
78
+ 'Content-Type': 'application/json',
79
+ },
80
+ });
81
+ if (!response.ok) {
82
+ throw new Error(`Granola API key validation failed: ${response.status}`);
83
+ }
84
+ return true;
85
+ }
86
+ async performAction(context) {
87
+ void context;
88
+ const params = this.params;
89
+ const { operation } = params;
90
+ try {
91
+ switch (operation) {
92
+ case 'list_notes':
93
+ return (await this.listNotes(params));
94
+ case 'get_note':
95
+ return (await this.getNote(params));
96
+ default:
97
+ return {
98
+ operation: operation,
99
+ success: false,
100
+ error: `Unknown operation: ${operation}`,
101
+ };
102
+ }
103
+ }
104
+ catch (error) {
105
+ return {
106
+ operation: operation,
107
+ success: false,
108
+ error: error instanceof Error ? error.message : String(error),
109
+ };
110
+ }
111
+ }
112
+ // ============================================================================
113
+ // API Methods
114
+ // ============================================================================
115
+ async listNotes(params) {
116
+ const queryParams = new URLSearchParams();
117
+ if (params.created_before)
118
+ queryParams.set('created_before', params.created_before);
119
+ if (params.created_after)
120
+ queryParams.set('created_after', params.created_after);
121
+ if (params.updated_after)
122
+ queryParams.set('updated_after', params.updated_after);
123
+ if (params.cursor)
124
+ queryParams.set('cursor', params.cursor);
125
+ if (params.page_size)
126
+ queryParams.set('page_size', String(params.page_size));
127
+ const url = `${GRANOLA_API_BASE}/v1/notes${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;
128
+ const response = await this.makeGranolaRequest(url);
129
+ if (!response.ok) {
130
+ const errorText = await response.text();
131
+ return {
132
+ operation: 'list_notes',
133
+ success: false,
134
+ error: `Granola API error (${response.status}): ${errorText}`,
135
+ };
136
+ }
137
+ const data = (await response.json());
138
+ return {
139
+ operation: 'list_notes',
140
+ success: true,
141
+ error: '',
142
+ notes: data.notes,
143
+ hasMore: data.hasMore,
144
+ cursor: data.cursor,
145
+ };
146
+ }
147
+ async getNote(params) {
148
+ const queryParams = new URLSearchParams();
149
+ if (params.include_transcript) {
150
+ queryParams.set('include', 'transcript');
151
+ }
152
+ const url = `${GRANOLA_API_BASE}/v1/notes/${params.note_id}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;
153
+ const response = await this.makeGranolaRequest(url);
154
+ if (!response.ok) {
155
+ const errorText = await response.text();
156
+ return {
157
+ operation: 'get_note',
158
+ success: false,
159
+ error: `Granola API error (${response.status}): ${errorText}`,
160
+ };
161
+ }
162
+ const note = (await response.json());
163
+ return {
164
+ operation: 'get_note',
165
+ success: true,
166
+ error: '',
167
+ note,
168
+ };
169
+ }
170
+ // ============================================================================
171
+ // Helpers
172
+ // ============================================================================
173
+ async makeGranolaRequest(url) {
174
+ const apiKey = this.chooseCredential();
175
+ if (!apiKey) {
176
+ throw new Error('No Granola API key provided');
177
+ }
178
+ return fetch(url, {
179
+ method: 'GET',
180
+ headers: {
181
+ Authorization: `Bearer ${apiKey}`,
182
+ 'Content-Type': 'application/json',
183
+ },
184
+ });
185
+ }
186
+ }
187
+ //# sourceMappingURL=granola.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granola.js","sourceRoot":"","sources":["../../../../src/bubbles/service-bubble/granola/granola.ts"],"names":[],"mappings":"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"}