@bubblelab/bubble-core 0.1.0

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 (275) hide show
  1. package/LICENSE.txt +202 -0
  2. package/dist/bubble-bundle.d.ts +2021 -0
  3. package/dist/bubble-factory.d.ts +161 -0
  4. package/dist/bubble-factory.d.ts.map +1 -0
  5. package/dist/bubble-factory.js +426 -0
  6. package/dist/bubble-factory.js.map +1 -0
  7. package/dist/bubble-flow/bubble-flow-class.d.ts +19 -0
  8. package/dist/bubble-flow/bubble-flow-class.d.ts.map +1 -0
  9. package/dist/bubble-flow/bubble-flow-class.js +23 -0
  10. package/dist/bubble-flow/bubble-flow-class.js.map +1 -0
  11. package/dist/bubble-flow/sample/data-analyst-flow.d.ts +15 -0
  12. package/dist/bubble-flow/sample/data-analyst-flow.d.ts.map +1 -0
  13. package/dist/bubble-flow/sample/data-analyst-flow.js +63 -0
  14. package/dist/bubble-flow/sample/data-analyst-flow.js.map +1 -0
  15. package/dist/bubble-flow/sample/error-ts.d.ts +23 -0
  16. package/dist/bubble-flow/sample/error-ts.d.ts.map +1 -0
  17. package/dist/bubble-flow/sample/error-ts.js +31 -0
  18. package/dist/bubble-flow/sample/error-ts.js.map +1 -0
  19. package/dist/bubble-flow/sample/sanitytest.d.ts +10 -0
  20. package/dist/bubble-flow/sample/sanitytest.d.ts.map +1 -0
  21. package/dist/bubble-flow/sample/sanitytest.js +13 -0
  22. package/dist/bubble-flow/sample/sanitytest.js.map +1 -0
  23. package/dist/bubble-flow/sample/simple-webhook-2.d.ts +19 -0
  24. package/dist/bubble-flow/sample/simple-webhook-2.d.ts.map +1 -0
  25. package/dist/bubble-flow/sample/simple-webhook-2.js +23 -0
  26. package/dist/bubble-flow/sample/simple-webhook-2.js.map +1 -0
  27. package/dist/bubble-flow/sample/simple-webhook.d.ts +10 -0
  28. package/dist/bubble-flow/sample/simple-webhook.d.ts.map +1 -0
  29. package/dist/bubble-flow/sample/simple-webhook.js +18 -0
  30. package/dist/bubble-flow/sample/simple-webhook.js.map +1 -0
  31. package/dist/bubble-flow/sample/simplified-data-analysis.flow.d.ts +29 -0
  32. package/dist/bubble-flow/sample/simplified-data-analysis.flow.d.ts.map +1 -0
  33. package/dist/bubble-flow/sample/simplified-data-analysis.flow.js +150 -0
  34. package/dist/bubble-flow/sample/simplified-data-analysis.flow.js.map +1 -0
  35. package/dist/bubble-flow/sample/slack-v0.1.d.ts +10 -0
  36. package/dist/bubble-flow/sample/slack-v0.1.d.ts.map +1 -0
  37. package/dist/bubble-flow/sample/slack-v0.1.js +59 -0
  38. package/dist/bubble-flow/sample/slack-v0.1.js.map +1 -0
  39. package/dist/bubble-flow/sample/slackagenttest.d.ts +10 -0
  40. package/dist/bubble-flow/sample/slackagenttest.d.ts.map +1 -0
  41. package/dist/bubble-flow/sample/slackagenttest.js +59 -0
  42. package/dist/bubble-flow/sample/slackagenttest.js.map +1 -0
  43. package/dist/bubble-trigger/index.d.ts +2 -0
  44. package/dist/bubble-trigger/index.d.ts.map +1 -0
  45. package/dist/bubble-trigger/index.js +2 -0
  46. package/dist/bubble-trigger/index.js.map +1 -0
  47. package/dist/bubble-trigger/types.d.ts +87 -0
  48. package/dist/bubble-trigger/types.d.ts.map +1 -0
  49. package/dist/bubble-trigger/types.js +14 -0
  50. package/dist/bubble-trigger/types.js.map +1 -0
  51. package/dist/bubbles/service-bubble/ai-agent.d.ts +428 -0
  52. package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -0
  53. package/dist/bubbles/service-bubble/ai-agent.js +881 -0
  54. package/dist/bubbles/service-bubble/ai-agent.js.map +1 -0
  55. package/dist/bubbles/service-bubble/gmail.d.ts +3073 -0
  56. package/dist/bubbles/service-bubble/gmail.d.ts.map +1 -0
  57. package/dist/bubbles/service-bubble/gmail.js +908 -0
  58. package/dist/bubbles/service-bubble/gmail.js.map +1 -0
  59. package/dist/bubbles/service-bubble/google-calendar.d.ts +3377 -0
  60. package/dist/bubbles/service-bubble/google-calendar.d.ts.map +1 -0
  61. package/dist/bubbles/service-bubble/google-calendar.js +527 -0
  62. package/dist/bubbles/service-bubble/google-calendar.js.map +1 -0
  63. package/dist/bubbles/service-bubble/google-drive.d.ts +1152 -0
  64. package/dist/bubbles/service-bubble/google-drive.d.ts.map +1 -0
  65. package/dist/bubbles/service-bubble/google-drive.js +943 -0
  66. package/dist/bubbles/service-bubble/google-drive.js.map +1 -0
  67. package/dist/bubbles/service-bubble/google-sheets.d.ts +1811 -0
  68. package/dist/bubbles/service-bubble/google-sheets.d.ts.map +1 -0
  69. package/dist/bubbles/service-bubble/google-sheets.js +904 -0
  70. package/dist/bubbles/service-bubble/google-sheets.js.map +1 -0
  71. package/dist/bubbles/service-bubble/hello-world.d.ts +74 -0
  72. package/dist/bubbles/service-bubble/hello-world.d.ts.map +1 -0
  73. package/dist/bubbles/service-bubble/hello-world.js +67 -0
  74. package/dist/bubbles/service-bubble/hello-world.js.map +1 -0
  75. package/dist/bubbles/service-bubble/http.d.ts +134 -0
  76. package/dist/bubbles/service-bubble/http.d.ts.map +1 -0
  77. package/dist/bubbles/service-bubble/http.js +184 -0
  78. package/dist/bubbles/service-bubble/http.js.map +1 -0
  79. package/dist/bubbles/service-bubble/postgresql.d.ts +180 -0
  80. package/dist/bubbles/service-bubble/postgresql.d.ts.map +1 -0
  81. package/dist/bubbles/service-bubble/postgresql.js +448 -0
  82. package/dist/bubbles/service-bubble/postgresql.js.map +1 -0
  83. package/dist/bubbles/service-bubble/resend.d.ts +301 -0
  84. package/dist/bubbles/service-bubble/resend.d.ts.map +1 -0
  85. package/dist/bubbles/service-bubble/resend.js +253 -0
  86. package/dist/bubbles/service-bubble/resend.js.map +1 -0
  87. package/dist/bubbles/service-bubble/slack.d.ts +5869 -0
  88. package/dist/bubbles/service-bubble/slack.d.ts.map +1 -0
  89. package/dist/bubbles/service-bubble/slack.js +1536 -0
  90. package/dist/bubbles/service-bubble/slack.js.map +1 -0
  91. package/dist/bubbles/service-bubble/storage.d.ts +571 -0
  92. package/dist/bubbles/service-bubble/storage.d.ts.map +1 -0
  93. package/dist/bubbles/service-bubble/storage.js +504 -0
  94. package/dist/bubbles/service-bubble/storage.js.map +1 -0
  95. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +308 -0
  96. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts.map +1 -0
  97. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js +285 -0
  98. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js.map +1 -0
  99. package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +416 -0
  100. package/dist/bubbles/tool-bubble/chart-js-tool.d.ts.map +1 -0
  101. package/dist/bubbles/tool-bubble/chart-js-tool.js +570 -0
  102. package/dist/bubbles/tool-bubble/chart-js-tool.js.map +1 -0
  103. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts +99 -0
  104. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts.map +1 -0
  105. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js +645 -0
  106. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js.map +1 -0
  107. package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts +112 -0
  108. package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts.map +1 -0
  109. package/dist/bubbles/tool-bubble/list-bubbles-tool.js +82 -0
  110. package/dist/bubbles/tool-bubble/list-bubbles-tool.js.map +1 -0
  111. package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +413 -0
  112. package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts.map +1 -0
  113. package/dist/bubbles/tool-bubble/reddit-scrape-tool.js +327 -0
  114. package/dist/bubbles/tool-bubble/reddit-scrape-tool.js.map +1 -0
  115. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +122 -0
  116. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts.map +1 -0
  117. package/dist/bubbles/tool-bubble/research-agent-tool.js +343 -0
  118. package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -0
  119. package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +131 -0
  120. package/dist/bubbles/tool-bubble/sql-query-tool.d.ts.map +1 -0
  121. package/dist/bubbles/tool-bubble/sql-query-tool.js +147 -0
  122. package/dist/bubbles/tool-bubble/sql-query-tool.js.map +1 -0
  123. package/dist/bubbles/tool-bubble/tool-template.d.ts +257 -0
  124. package/dist/bubbles/tool-bubble/tool-template.d.ts.map +1 -0
  125. package/dist/bubbles/tool-bubble/tool-template.js +238 -0
  126. package/dist/bubbles/tool-bubble/tool-template.js.map +1 -0
  127. package/dist/bubbles/tool-bubble/virtual-file-editor-example.d.ts +8 -0
  128. package/dist/bubbles/tool-bubble/virtual-file-editor-example.d.ts.map +1 -0
  129. package/dist/bubbles/tool-bubble/virtual-file-editor-example.js +65 -0
  130. package/dist/bubbles/tool-bubble/virtual-file-editor-example.js.map +1 -0
  131. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.d.ts +125 -0
  132. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.d.ts.map +1 -0
  133. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.js +169 -0
  134. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.js.map +1 -0
  135. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +218 -0
  136. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts.map +1 -0
  137. package/dist/bubbles/tool-bubble/web-crawl-tool.js +255 -0
  138. package/dist/bubbles/tool-bubble/web-crawl-tool.js.map +1 -0
  139. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +134 -0
  140. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts.map +1 -0
  141. package/dist/bubbles/tool-bubble/web-extract-tool.js +175 -0
  142. package/dist/bubbles/tool-bubble/web-extract-tool.js.map +1 -0
  143. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +228 -0
  144. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts.map +1 -0
  145. package/dist/bubbles/tool-bubble/web-scrape-tool.js +214 -0
  146. package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -0
  147. package/dist/bubbles/tool-bubble/web-search-tool.d.ts +134 -0
  148. package/dist/bubbles/tool-bubble/web-search-tool.d.ts.map +1 -0
  149. package/dist/bubbles/tool-bubble/web-search-tool.js +155 -0
  150. package/dist/bubbles/tool-bubble/web-search-tool.js.map +1 -0
  151. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts +114 -0
  152. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts.map +1 -0
  153. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js +777 -0
  154. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js.map +1 -0
  155. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.d.ts +97 -0
  156. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.d.ts.map +1 -0
  157. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.js +327 -0
  158. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.js.map +1 -0
  159. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts +303 -0
  160. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts.map +1 -0
  161. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.js +297 -0
  162. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.js.map +1 -0
  163. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.d.ts +157 -0
  164. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.d.ts.map +1 -0
  165. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.js +310 -0
  166. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.js.map +1 -0
  167. package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +543 -0
  168. package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts.map +1 -0
  169. package/dist/bubbles/workflow-bubble/generate-document.workflow.js +628 -0
  170. package/dist/bubbles/workflow-bubble/generate-document.workflow.js.map +1 -0
  171. package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts +679 -0
  172. package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts.map +1 -0
  173. package/dist/bubbles/workflow-bubble/parse-document.workflow.js +604 -0
  174. package/dist/bubbles/workflow-bubble/parse-document.workflow.js.map +1 -0
  175. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +1011 -0
  176. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts.map +1 -0
  177. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js +841 -0
  178. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js.map +1 -0
  179. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +883 -0
  180. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts.map +1 -0
  181. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js +781 -0
  182. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js.map +1 -0
  183. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +300 -0
  184. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts.map +1 -0
  185. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js +508 -0
  186. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js.map +1 -0
  187. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +731 -0
  188. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts.map +1 -0
  189. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js +690 -0
  190. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js.map +1 -0
  191. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts +401 -0
  192. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts.map +1 -0
  193. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js +382 -0
  194. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js.map +1 -0
  195. package/dist/bubbles/workflow-bubble/workflow-template.d.ts +144 -0
  196. package/dist/bubbles/workflow-bubble/workflow-template.d.ts.map +1 -0
  197. package/dist/bubbles/workflow-bubble/workflow-template.js +124 -0
  198. package/dist/bubbles/workflow-bubble/workflow-template.js.map +1 -0
  199. package/dist/index.d.ts +46 -0
  200. package/dist/index.d.ts.map +1 -0
  201. package/dist/index.js +53 -0
  202. package/dist/index.js.map +1 -0
  203. package/dist/logging/BubbleLogger.d.ts +146 -0
  204. package/dist/logging/BubbleLogger.d.ts.map +1 -0
  205. package/dist/logging/BubbleLogger.js +472 -0
  206. package/dist/logging/BubbleLogger.js.map +1 -0
  207. package/dist/logging/StreamingBubbleLogger.d.ts +85 -0
  208. package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -0
  209. package/dist/logging/StreamingBubbleLogger.js +340 -0
  210. package/dist/logging/StreamingBubbleLogger.js.map +1 -0
  211. package/dist/types/ai-models.d.ts +4 -0
  212. package/dist/types/ai-models.d.ts.map +1 -0
  213. package/dist/types/ai-models.js +14 -0
  214. package/dist/types/ai-models.js.map +1 -0
  215. package/dist/types/available-tools.d.ts +4 -0
  216. package/dist/types/available-tools.d.ts.map +1 -0
  217. package/dist/types/available-tools.js +19 -0
  218. package/dist/types/available-tools.js.map +1 -0
  219. package/dist/types/base-bubble-class.d.ts +47 -0
  220. package/dist/types/base-bubble-class.d.ts.map +1 -0
  221. package/dist/types/base-bubble-class.js +212 -0
  222. package/dist/types/base-bubble-class.js.map +1 -0
  223. package/dist/types/bubble-errors.d.ts +44 -0
  224. package/dist/types/bubble-errors.d.ts.map +1 -0
  225. package/dist/types/bubble-errors.js +51 -0
  226. package/dist/types/bubble-errors.js.map +1 -0
  227. package/dist/types/bubble.d.ts +73 -0
  228. package/dist/types/bubble.d.ts.map +1 -0
  229. package/dist/types/bubble.js +2 -0
  230. package/dist/types/bubble.js.map +1 -0
  231. package/dist/types/credentials.d.ts +6 -0
  232. package/dist/types/credentials.d.ts.map +1 -0
  233. package/dist/types/credentials.js +6 -0
  234. package/dist/types/credentials.js.map +1 -0
  235. package/dist/types/service-bubble-class.d.ts +31 -0
  236. package/dist/types/service-bubble-class.d.ts.map +1 -0
  237. package/dist/types/service-bubble-class.js +36 -0
  238. package/dist/types/service-bubble-class.js.map +1 -0
  239. package/dist/types/streaming-events.d.ts +18 -0
  240. package/dist/types/streaming-events.d.ts.map +1 -0
  241. package/dist/types/streaming-events.js +5 -0
  242. package/dist/types/streaming-events.js.map +1 -0
  243. package/dist/types/tool-bubble-class.d.ts +19 -0
  244. package/dist/types/tool-bubble-class.d.ts.map +1 -0
  245. package/dist/types/tool-bubble-class.js +48 -0
  246. package/dist/types/tool-bubble-class.js.map +1 -0
  247. package/dist/types/workflow-bubble-class.d.ts +25 -0
  248. package/dist/types/workflow-bubble-class.d.ts.map +1 -0
  249. package/dist/types/workflow-bubble-class.js +30 -0
  250. package/dist/types/workflow-bubble-class.js.map +1 -0
  251. package/dist/utils/bubbleflow-parser.d.ts +32 -0
  252. package/dist/utils/bubbleflow-parser.d.ts.map +1 -0
  253. package/dist/utils/bubbleflow-parser.js +332 -0
  254. package/dist/utils/bubbleflow-parser.js.map +1 -0
  255. package/dist/utils/bubbleflow-validation.d.ts +9 -0
  256. package/dist/utils/bubbleflow-validation.d.ts.map +1 -0
  257. package/dist/utils/bubbleflow-validation.js +116 -0
  258. package/dist/utils/bubbleflow-validation.js.map +1 -0
  259. package/dist/utils/json-parsing.d.ts +20 -0
  260. package/dist/utils/json-parsing.d.ts.map +1 -0
  261. package/dist/utils/json-parsing.js +394 -0
  262. package/dist/utils/json-parsing.js.map +1 -0
  263. package/dist/utils/mock-data-generator.d.ts +43 -0
  264. package/dist/utils/mock-data-generator.d.ts.map +1 -0
  265. package/dist/utils/mock-data-generator.js +312 -0
  266. package/dist/utils/mock-data-generator.js.map +1 -0
  267. package/dist/utils/param-helper.d.ts +2 -0
  268. package/dist/utils/param-helper.d.ts.map +1 -0
  269. package/dist/utils/param-helper.js +5 -0
  270. package/dist/utils/param-helper.js.map +1 -0
  271. package/dist/utils/source-bubble-parser.d.ts +31 -0
  272. package/dist/utils/source-bubble-parser.d.ts.map +1 -0
  273. package/dist/utils/source-bubble-parser.js +231 -0
  274. package/dist/utils/source-bubble-parser.js.map +1 -0
  275. package/package.json +63 -0
@@ -0,0 +1,327 @@
1
+ import { z } from 'zod';
2
+ import { ToolBubble } from '../../types/tool-bubble-class.js';
3
+ import { CredentialType } from '@bubblelab/shared-schemas';
4
+ // Reddit post structure schema
5
+ const RedditPostSchema = z.object({
6
+ title: z.string().describe('Post title'),
7
+ url: z.string().describe('Post URL (external link or Reddit permalink)'),
8
+ author: z.string().describe('Username of the post author'),
9
+ score: z.number().describe('Post upvote score'),
10
+ numComments: z.number().describe('Number of comments on the post'),
11
+ createdUtc: z.number().describe('Post creation timestamp (Unix UTC)'),
12
+ postUrl: z.string().describe('Reddit url to the post'),
13
+ selftext: z.string().describe('Post content text (for text posts)'),
14
+ subreddit: z.string().describe('Subreddit name'),
15
+ postHint: z
16
+ .string()
17
+ .nullable()
18
+ .optional()
19
+ .describe('Post type hint (image, video, link, etc.)'),
20
+ isSelf: z
21
+ .boolean()
22
+ .describe('Whether this is a text post (true) or link post (false)'),
23
+ thumbnail: z.string().optional().describe('Thumbnail image URL if available'),
24
+ domain: z.string().optional().describe('Domain of external link'),
25
+ flair: z.string().optional().describe('Post flair text'),
26
+ });
27
+ // Define the parameters schema for the Reddit Scrape Tool
28
+ const RedditScrapeToolParamsSchema = z.object({
29
+ subreddit: z
30
+ .string()
31
+ .min(1, 'Subreddit name is required')
32
+ .regex(/^[a-zA-Z0-9_]+$/, 'Subreddit name can only contain letters, numbers, and underscores')
33
+ .describe('Name of the subreddit to scrape (without r/ prefix)'),
34
+ limit: z
35
+ .number()
36
+ .min(1, 'Limit must be at least 1')
37
+ .max(500, 'Limit cannot exceed 500')
38
+ .default(25)
39
+ .describe('Maximum number of posts to fetch (1-500, default: 25)'),
40
+ sort: z
41
+ .enum(['hot', 'new', 'top', 'rising'])
42
+ .default('hot')
43
+ .describe('Sorting method for posts (default: hot)'),
44
+ timeFilter: z
45
+ .enum(['hour', 'day', 'week', 'month', 'year', 'all'])
46
+ .optional()
47
+ .describe('Time filter for "top" sort (only applies when sort=top)'),
48
+ filterToday: z
49
+ .boolean()
50
+ .default(false)
51
+ .describe('Filter results to only include posts from today'),
52
+ includeStickied: z
53
+ .boolean()
54
+ .default(false)
55
+ .describe('Include stickied/pinned posts in results'),
56
+ minScore: z
57
+ .number()
58
+ .optional()
59
+ .describe('Minimum upvote score required for posts'),
60
+ credentials: z
61
+ .record(z.nativeEnum(CredentialType), z.string())
62
+ .optional()
63
+ .describe('Optional credentials for enhanced features'),
64
+ });
65
+ // Result schema for the Reddit scrape tool
66
+ const RedditScrapeToolResultSchema = z.object({
67
+ posts: z.array(RedditPostSchema).describe('Array of scraped Reddit posts'),
68
+ metadata: z
69
+ .object({
70
+ subreddit: z.string().describe('Subreddit that was scraped'),
71
+ requestedLimit: z.number().describe('Number of posts requested'),
72
+ actualCount: z.number().describe('Actual number of posts returned'),
73
+ filteredCount: z.number().describe('Number of posts after filtering'),
74
+ sort: z.string().describe('Sorting method used'),
75
+ timeFilter: z.string().optional().describe('Time filter used (if any)'),
76
+ scrapedAt: z.string().describe('ISO timestamp when scraping occurred'),
77
+ apiEndpoint: z.string().describe('Reddit API endpoint used'),
78
+ })
79
+ .describe('Metadata about the scraping operation'),
80
+ success: z.boolean().describe('Whether the scraping was successful'),
81
+ error: z.string().describe('Error message if scraping failed'),
82
+ });
83
+ export class RedditScrapeTool extends ToolBubble {
84
+ // Required static metadata
85
+ static bubbleName = 'reddit-scrape-tool';
86
+ static schema = RedditScrapeToolParamsSchema;
87
+ static resultSchema = RedditScrapeToolResultSchema;
88
+ static shortDescription = 'Scrapes posts from any Reddit subreddit with flexible filtering and sorting options';
89
+ static longDescription = `
90
+ A specialized tool for scraping Reddit posts from any subreddit with comprehensive filtering and sorting capabilities.
91
+
92
+ 🔥 Core Features:
93
+ - Scrape posts from any public subreddit
94
+ - Multiple sorting options (hot, new, top, rising)
95
+ - Flexible post limits (1-100 posts)
96
+ - Time-based filtering for top posts
97
+ - Today-only filtering option
98
+ - Score-based filtering
99
+ - Stickied post inclusion/exclusion
100
+
101
+ 📊 Post Data Extracted:
102
+ - Title, author, and content
103
+ - Upvote scores and comment counts
104
+ - Creation timestamps and permalinks
105
+ - Post types (text vs link posts)
106
+ - External URLs and domains
107
+ - Thumbnails and flairs
108
+ - Comprehensive metadata
109
+
110
+ 🎯 Use Cases:
111
+ - Monitor specific subreddits for trends
112
+ - Gather posts for content analysis
113
+ - Track community engagement metrics
114
+ - Feed Reddit data into other workflows
115
+ - Research subreddit activity patterns
116
+ - Content aggregation and curation
117
+
118
+ ⚡ Technical Features:
119
+ - Uses Reddit's official JSON API
120
+ - No authentication required for public posts
121
+ - Respects Reddit's rate limiting
122
+ - Handles large subreddits efficiently
123
+ - Robust error handling and validation
124
+ - Clean, structured data output
125
+
126
+ Perfect for integration with AI agents, data analysis workflows, and content monitoring systems.
127
+ `;
128
+ static alias = 'reddit';
129
+ static type = 'tool';
130
+ constructor(params = {
131
+ subreddit: 'news',
132
+ limit: 25,
133
+ sort: 'hot',
134
+ }, context) {
135
+ super(params, context);
136
+ }
137
+ async performAction(context) {
138
+ void context; // Context available but not currently used
139
+ const { subreddit, limit, sort, timeFilter } = this.params;
140
+ const scrapedAt = new Date().toISOString();
141
+ try {
142
+ console.log(`[RedditScrapeTool] Scraping r/${subreddit} with ${limit} ${sort} posts`);
143
+ // Build Reddit API URL
144
+ const apiUrl = this.buildRedditApiUrl();
145
+ console.log(`[RedditScrapeTool] API endpoint: ${apiUrl}`);
146
+ // Fetch data from Reddit's JSON API
147
+ const redditData = await this.fetchRedditData(apiUrl);
148
+ // Parse and process posts
149
+ const rawPosts = this.parseRedditResponse(redditData);
150
+ console.log(`[RedditScrapeTool] Found ${rawPosts.length} raw posts`);
151
+ // Apply filters
152
+ const filteredPosts = this.applyFilters(rawPosts);
153
+ console.log(`[RedditScrapeTool] ${filteredPosts.length} posts after filtering`);
154
+ // Limit results
155
+ const finalPosts = filteredPosts.slice(0, limit);
156
+ return {
157
+ posts: finalPosts,
158
+ metadata: {
159
+ subreddit,
160
+ requestedLimit: limit,
161
+ actualCount: rawPosts.length,
162
+ filteredCount: filteredPosts.length,
163
+ sort,
164
+ timeFilter,
165
+ scrapedAt,
166
+ apiEndpoint: apiUrl,
167
+ },
168
+ success: true,
169
+ error: '',
170
+ };
171
+ }
172
+ catch (error) {
173
+ console.error('[RedditScrapeTool] Scraping error:', error);
174
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
175
+ return {
176
+ posts: [],
177
+ metadata: {
178
+ subreddit,
179
+ requestedLimit: limit,
180
+ actualCount: 0,
181
+ filteredCount: 0,
182
+ sort,
183
+ timeFilter,
184
+ scrapedAt,
185
+ apiEndpoint: '',
186
+ },
187
+ success: false,
188
+ error: errorMessage,
189
+ };
190
+ }
191
+ }
192
+ /**
193
+ * Build the Reddit JSON API URL
194
+ */
195
+ buildRedditApiUrl() {
196
+ const { subreddit, sort, timeFilter, limit } = this.params;
197
+ let url = `https://www.reddit.com/r/${subreddit}/${sort}.json?limit=${Math.min(limit * 2, 100)}`;
198
+ // Add time filter for top posts
199
+ if (sort === 'top' && timeFilter) {
200
+ url += `&t=${timeFilter}`;
201
+ }
202
+ return url;
203
+ }
204
+ /**
205
+ * Get a random user agent to avoid being blocked
206
+ */
207
+ getRandomUserAgent() {
208
+ const userAgents = [
209
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
210
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
211
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
212
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',
213
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0',
214
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:120.0) Gecko/20100101 Firefox/120.0',
215
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
216
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/120.0.0.0',
217
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
218
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
219
+ ];
220
+ return userAgents[Math.floor(Math.random() * userAgents.length)];
221
+ }
222
+ /**
223
+ * Fetch data from Reddit's JSON API
224
+ */
225
+ async fetchRedditData(url) {
226
+ const https = await import('https');
227
+ return new Promise((resolve, reject) => {
228
+ const request = https.get(url, {
229
+ headers: {
230
+ 'User-Agent': this.getRandomUserAgent(),
231
+ },
232
+ }, (response) => {
233
+ let data = '';
234
+ response.on('data', (chunk) => {
235
+ data += chunk;
236
+ });
237
+ response.on('end', () => {
238
+ if (response.statusCode === 200) {
239
+ try {
240
+ const jsonData = JSON.parse(data);
241
+ resolve(jsonData);
242
+ }
243
+ catch (parseError) {
244
+ reject(new Error(`Failed to parse Reddit JSON response: ${parseError}`));
245
+ }
246
+ }
247
+ else {
248
+ reject(new Error(`Reddit API returned status ${response.statusCode}: ${response.statusMessage}`));
249
+ }
250
+ });
251
+ });
252
+ request.on('error', (error) => {
253
+ reject(new Error(`Network error: ${error.message}`));
254
+ });
255
+ request.setTimeout(15000, () => {
256
+ request.destroy();
257
+ reject(new Error('Request timeout - Reddit API did not respond within 15 seconds'));
258
+ });
259
+ });
260
+ }
261
+ /**
262
+ * Parse Reddit JSON response into standardized post objects
263
+ */
264
+ parseRedditResponse(data) {
265
+ const posts = [];
266
+ try {
267
+ if (data?.data?.children) {
268
+ for (const child of data.data.children) {
269
+ const post = child.data;
270
+ // Skip if not a post (could be an ad or other content)
271
+ if (!post || !post.title)
272
+ continue;
273
+ posts.push({
274
+ title: post.title,
275
+ url: post.url || '',
276
+ author: post.author || '[deleted]',
277
+ score: post.score || 0,
278
+ numComments: post.num_comments || 0,
279
+ createdUtc: post.created_utc || 0,
280
+ postUrl: post.permalink
281
+ ? `https://reddit.com${post.permalink}`
282
+ : '',
283
+ selftext: post.selftext || '',
284
+ subreddit: post.subreddit || this.params.subreddit,
285
+ postHint: post.post_hint || null,
286
+ isSelf: post.is_self || false,
287
+ thumbnail: post.thumbnail !== 'self' && post.thumbnail !== 'default'
288
+ ? post.thumbnail
289
+ : undefined,
290
+ domain: post.domain || undefined,
291
+ flair: post.link_flair_text || undefined,
292
+ });
293
+ }
294
+ }
295
+ }
296
+ catch (error) {
297
+ console.error('[RedditScrapeTool] Error parsing Reddit response:', error);
298
+ throw new Error(`Failed to parse Reddit data: ${error}`);
299
+ }
300
+ return posts;
301
+ }
302
+ /**
303
+ * Apply various filters to the posts
304
+ */
305
+ applyFilters(posts) {
306
+ let filtered = [...posts];
307
+ // Filter out stickied posts if not requested
308
+ if (!this.params.includeStickied) {
309
+ // Note: Reddit's JSON API typically marks stickied posts with 'stickied: true'
310
+ // but we'll filter based on common patterns since we don't have that field in our schema
311
+ filtered = filtered.filter((post) => !post.title.toLowerCase().includes('[sticky]'));
312
+ }
313
+ // Apply minimum score filter
314
+ if (this.params.minScore !== undefined) {
315
+ filtered = filtered.filter((post) => post.score >= this.params.minScore);
316
+ }
317
+ // Filter to today's posts if requested
318
+ if (this.params.filterToday) {
319
+ const now = new Date();
320
+ const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime() /
321
+ 1000;
322
+ filtered = filtered.filter((post) => post.createdUtc >= todayStart);
323
+ }
324
+ return filtered;
325
+ }
326
+ }
327
+ //# sourceMappingURL=reddit-scrape-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reddit-scrape-tool.js","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/reddit-scrape-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ import { z } from 'zod';
2
+ import { ToolBubble } from '../../types/tool-bubble-class.js';
3
+ import type { BubbleContext } from '../../types/bubble.js';
4
+ import { CredentialType, type BubbleName } from '@bubblelab/shared-schemas';
5
+ declare const ResearchAgentToolParamsSchema: z.ZodObject<{
6
+ task: z.ZodString;
7
+ expectedResultSchema: z.ZodString;
8
+ model: z.ZodOptional<z.ZodDefault<z.ZodEnum<["openai/gpt-5", "openai/gpt-5-mini", "openai/gpt-o4-mini", "google/gemini-2.5-pro", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-image-preview"]>>>;
9
+ maxTokens: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
10
+ maxIterations: z.ZodDefault<z.ZodNumber>;
11
+ credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ maxIterations: number;
14
+ task: string;
15
+ expectedResultSchema: string;
16
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
17
+ model?: "openai/gpt-5" | "openai/gpt-5-mini" | "openai/gpt-o4-mini" | "google/gemini-2.5-pro" | "google/gemini-2.5-flash" | "google/gemini-2.5-flash-lite" | "google/gemini-2.5-flash-image-preview" | undefined;
18
+ maxTokens?: number | undefined;
19
+ }, {
20
+ task: string;
21
+ expectedResultSchema: string;
22
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
23
+ model?: "openai/gpt-5" | "openai/gpt-5-mini" | "openai/gpt-o4-mini" | "google/gemini-2.5-pro" | "google/gemini-2.5-flash" | "google/gemini-2.5-flash-lite" | "google/gemini-2.5-flash-image-preview" | undefined;
24
+ maxTokens?: number | undefined;
25
+ maxIterations?: number | undefined;
26
+ }>;
27
+ declare const ResearchAgentToolResultSchema: z.ZodObject<{
28
+ result: z.ZodAny;
29
+ summary: z.ZodString;
30
+ sourcesUsed: z.ZodArray<z.ZodString, "many">;
31
+ iterationsUsed: z.ZodNumber;
32
+ success: z.ZodBoolean;
33
+ error: z.ZodString;
34
+ }, "strip", z.ZodTypeAny, {
35
+ success: boolean;
36
+ error: string;
37
+ summary: string;
38
+ sourcesUsed: string[];
39
+ iterationsUsed: number;
40
+ result?: any;
41
+ }, {
42
+ success: boolean;
43
+ error: string;
44
+ summary: string;
45
+ sourcesUsed: string[];
46
+ iterationsUsed: number;
47
+ result?: any;
48
+ }>;
49
+ type ResearchAgentToolParams = z.output<typeof ResearchAgentToolParamsSchema>;
50
+ type ResearchAgentToolResult = z.output<typeof ResearchAgentToolResultSchema>;
51
+ type ResearchAgentToolParamsInput = z.input<typeof ResearchAgentToolParamsSchema>;
52
+ export declare class ResearchAgentTool extends ToolBubble<ResearchAgentToolParams, ResearchAgentToolResult> {
53
+ static readonly bubbleName: BubbleName;
54
+ static readonly schema: z.ZodObject<{
55
+ task: z.ZodString;
56
+ expectedResultSchema: z.ZodString;
57
+ model: z.ZodOptional<z.ZodDefault<z.ZodEnum<["openai/gpt-5", "openai/gpt-5-mini", "openai/gpt-o4-mini", "google/gemini-2.5-pro", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-image-preview"]>>>;
58
+ maxTokens: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
59
+ maxIterations: z.ZodDefault<z.ZodNumber>;
60
+ credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
61
+ }, "strip", z.ZodTypeAny, {
62
+ maxIterations: number;
63
+ task: string;
64
+ expectedResultSchema: string;
65
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
66
+ model?: "openai/gpt-5" | "openai/gpt-5-mini" | "openai/gpt-o4-mini" | "google/gemini-2.5-pro" | "google/gemini-2.5-flash" | "google/gemini-2.5-flash-lite" | "google/gemini-2.5-flash-image-preview" | undefined;
67
+ maxTokens?: number | undefined;
68
+ }, {
69
+ task: string;
70
+ expectedResultSchema: string;
71
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
72
+ model?: "openai/gpt-5" | "openai/gpt-5-mini" | "openai/gpt-o4-mini" | "google/gemini-2.5-pro" | "google/gemini-2.5-flash" | "google/gemini-2.5-flash-lite" | "google/gemini-2.5-flash-image-preview" | undefined;
73
+ maxTokens?: number | undefined;
74
+ maxIterations?: number | undefined;
75
+ }>;
76
+ static readonly resultSchema: z.ZodObject<{
77
+ result: z.ZodAny;
78
+ summary: z.ZodString;
79
+ sourcesUsed: z.ZodArray<z.ZodString, "many">;
80
+ iterationsUsed: z.ZodNumber;
81
+ success: z.ZodBoolean;
82
+ error: z.ZodString;
83
+ }, "strip", z.ZodTypeAny, {
84
+ success: boolean;
85
+ error: string;
86
+ summary: string;
87
+ sourcesUsed: string[];
88
+ iterationsUsed: number;
89
+ result?: any;
90
+ }, {
91
+ success: boolean;
92
+ error: string;
93
+ summary: string;
94
+ sourcesUsed: string[];
95
+ iterationsUsed: number;
96
+ result?: any;
97
+ }>;
98
+ static readonly shortDescription = "AI-powered research agent that searches and scrapes the internet to gather structured information";
99
+ static readonly longDescription = "\n A sophisticated research agent that strategically combines web search and selective web scraping to gather and structure information from the internet.\n \n Features:\n - Intelligent web search using Firecrawl's search API to find relevant sources\n - Strategic web scraping - for detailed content from specific high-value pages\n - Multi-page web crawling - for comprehensive coverage across entire websites\n - AI-powered analysis to synthesize information into the requested JSON structure\n - Up to 100 iterations for thorough research and data gathering\n - Structured result formatting based on provided JSON schema\n - Comprehensive source tracking and research summary\n \n Research Strategy:\n - Prioritizes efficient web search to gather comprehensive information\n - Uses scraping strategically for detailed content from specific pages\n - Uses crawling for comprehensive coverage across multiple related pages\n - Only uses scraping/crawling when search results lack sufficient detail\n - Focuses on quality over quantity in content extraction\n \n Use cases:\n - Market research with structured competitor analysis\n - Academic research gathering from multiple sources \n - Product research with feature comparisons\n - News and trend analysis with categorized findings\n - Technical research requiring documentation synthesis\n - Any research task requiring web data in a specific format\n \n The agent starts with systematic web searches, then strategically uses scraping for specific pages or crawling for comprehensive site coverage when additional detail is needed. It provides a summary of the research conducted and lists all sources used.\n ";
100
+ static readonly alias = "research";
101
+ static readonly type = "tool";
102
+ constructor(params?: ResearchAgentToolParamsInput, context?: BubbleContext);
103
+ performAction(context?: BubbleContext): Promise<ResearchAgentToolResult>;
104
+ /**
105
+ * Build the main research prompt for the AI agent
106
+ */
107
+ private buildResearchPrompt;
108
+ /**
109
+ * Build the system prompt that defines the AI agent's behavior
110
+ */
111
+ private buildSystemPrompt;
112
+ /**
113
+ * Extract URLs and sources from the tool calls made during research
114
+ */
115
+ private extractSourcesFromToolCalls;
116
+ /**
117
+ * Generate a concise summary of the research conducted
118
+ */
119
+ private generateResearchSummary;
120
+ }
121
+ export {};
122
+ //# sourceMappingURL=research-agent-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-agent-tool.d.ts","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/research-agent-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAa5E,QAAA,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;EAsCjC,CAAC;AAGH,QAAA,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;EAuBjC,CAAC;AAGH,KAAK,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAC9E,KAAK,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAC9E,KAAK,4BAA4B,GAAG,CAAC,CAAC,KAAK,CACzC,OAAO,6BAA6B,CACrC,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,UAAU,CAC/C,uBAAuB,EACvB,uBAAuB,CACxB;IAEC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAyB;IAC/D,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;OAAiC;IACvD,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;OAAiC;IAC7D,MAAM,CAAC,QAAQ,CAAC,gBAAgB,uGACsE;IACtG,MAAM,CAAC,QAAQ,CAAC,eAAe,0tDA4B7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc;IACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;gBAG5B,MAAM,GAAE,4BAGP,EACD,OAAO,CAAC,EAAE,aAAa;IAKnB,aAAa,CACjB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,uBAAuB,CAAC;IA0InC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkDzB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA8CnC;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAShC"}