@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,255 @@
1
+ import { z } from 'zod';
2
+ import { ToolBubble } from '../../types/tool-bubble-class.js';
3
+ import FirecrawlApp from '@mendable/firecrawl-js';
4
+ import { CredentialType } from '@bubblelab/shared-schemas';
5
+ import { AIAgentBubble } from '../service-bubble/ai-agent.js';
6
+ // Enhanced parameters schema for web crawling
7
+ const WebCrawlToolParamsSchema = z.object({
8
+ url: z
9
+ .string()
10
+ .url('Must be a valid URL')
11
+ .describe('The root URL to crawl and extract content from'),
12
+ format: z
13
+ .enum(['markdown'])
14
+ .default('markdown')
15
+ .describe('Output format for crawled content'),
16
+ onlyMainContent: z
17
+ .boolean()
18
+ .default(true)
19
+ .describe('Extract only main content, filtering out navigation/footers'),
20
+ // Crawl-specific parameters
21
+ maxPages: z
22
+ .number()
23
+ .min(1)
24
+ .max(100)
25
+ .default(10)
26
+ .optional()
27
+ .describe('Maximum number of pages to crawl'),
28
+ crawlDepth: z
29
+ .number()
30
+ .min(1)
31
+ .max(5)
32
+ .default(2)
33
+ .optional()
34
+ .describe('Maximum depth to crawl'),
35
+ includePaths: z
36
+ .array(z.string())
37
+ .optional()
38
+ .describe('URL patterns to include in crawl (regex patterns), Example: ["^/blog/.*$", "^/docs/.*$"]'),
39
+ excludePaths: z
40
+ .array(z.string())
41
+ .optional()
42
+ .describe('URL patterns to exclude from crawl (regex patterns), ["^/admin/.*$", "^/private/.*$"]'),
43
+ // General parameters
44
+ waitFor: z
45
+ .number()
46
+ .min(0)
47
+ .max(30000)
48
+ .default(3000)
49
+ .describe('Time to wait for dynamic content in milliseconds'),
50
+ credentials: z
51
+ .record(z.nativeEnum(CredentialType), z.string())
52
+ .optional()
53
+ .describe('Required credentials including FIRECRAWL_API_KEY'),
54
+ });
55
+ // Result schema for crawl operations
56
+ const WebCrawlToolResultSchema = z.object({
57
+ url: z.string().url().describe('The original URL that was crawled'),
58
+ success: z.boolean().describe('Whether the crawl operation was successful'),
59
+ error: z.string().describe('Error message if crawl failed'),
60
+ // Crawl results
61
+ pages: z
62
+ .array(z.object({
63
+ url: z.string().url(),
64
+ title: z.string().optional(),
65
+ content: z.string(),
66
+ depth: z.number().optional(),
67
+ }))
68
+ .describe('Array of crawled pages with content'),
69
+ totalPages: z.number().describe('Total number of pages crawled'),
70
+ // Metadata
71
+ metadata: z
72
+ .object({
73
+ loadTime: z.number().optional(),
74
+ crawlDepth: z.number().optional(),
75
+ maxPagesReached: z.boolean().optional(),
76
+ })
77
+ .optional()
78
+ .describe('Additional metadata about the crawl operation'),
79
+ });
80
+ export class WebCrawlTool extends ToolBubble {
81
+ // Required static metadata
82
+ static bubbleName = 'web-crawl-tool';
83
+ static schema = WebCrawlToolParamsSchema;
84
+ static resultSchema = WebCrawlToolResultSchema;
85
+ static shortDescription = 'Multi-page web crawling tool for exploring entire websites and subdomains.';
86
+ static longDescription = `
87
+ A powerful web crawling tool that can systematically explore websites and extract content from multiple pages.
88
+
89
+ 🕷️ CRAWL Features:
90
+ - Recursively crawl websites and subdomains
91
+ - Configurable crawl depth and page limits (up to 100 pages)
92
+ - URL pattern filtering (include/exclude paths)
93
+ - Multiple format support (markdown, html, links, rawHtml)
94
+ - Main content focus filtering
95
+ - Discover and extract content from entire sites
96
+
97
+ Technical Features:
98
+ - Handles JavaScript-rendered pages and dynamic content
99
+ - Robust error handling and retry mechanisms
100
+ - Configurable wait times for dynamic content
101
+ - Requires FIRECRAWL_API_KEY credential
102
+
103
+ Use Cases:
104
+ - Site mapping and competitive analysis
105
+ - Documentation aggregation across multiple pages
106
+ - Content analysis and research across domains
107
+ - SEO analysis and site structure discovery
108
+ - Building comprehensive datasets from websites
109
+ `;
110
+ static alias = 'crawl';
111
+ static type = 'tool';
112
+ constructor(params = { url: '' }, context) {
113
+ super(params, context);
114
+ }
115
+ async performAction(context) {
116
+ void context; // Context available but not currently used
117
+ const { url } = this.params;
118
+ const startTime = Date.now();
119
+ try {
120
+ // Get Firecrawl API key from credentials
121
+ const apiKey = this.params.credentials?.FIRECRAWL_API_KEY;
122
+ if (!apiKey) {
123
+ throw new Error('FIRECRAWL_API_KEY is required but not provided in credentials');
124
+ }
125
+ // Initialize Firecrawl client
126
+ const firecrawl = new FirecrawlApp({ apiKey });
127
+ console.log(`[WebCrawlTool] Starting crawl for URL:`, url);
128
+ const crawlResult = await this.executeCrawl(firecrawl, startTime);
129
+ // Process pages in batches of 5 for parallel summarization
130
+ const batchSize = 5;
131
+ const pageCount = crawlResult.pages.length;
132
+ for (let batchStart = 0; batchStart < pageCount; batchStart += batchSize) {
133
+ const batchEnd = Math.min(batchStart + batchSize, pageCount);
134
+ const batch = crawlResult.pages.slice(batchStart, batchEnd);
135
+ // Create promises for parallel processing
136
+ const summarizePromises = batch.map(async (page, batchIndex) => {
137
+ const summarizeAgent = new AIAgentBubble({
138
+ message: `Summarize the crawled page to condense all information and remove any non-essential information, include all links, contact information, companies, don't omit any information. Content: ${page.content}`,
139
+ model: {
140
+ model: 'google/gemini-2.5-flash-lite',
141
+ },
142
+ name: 'Crawl Page Summarizer Agent',
143
+ credentials: this.params.credentials,
144
+ }, this.context);
145
+ try {
146
+ const result = await summarizeAgent.action();
147
+ console.log('[WebCrawlTool] Summarized page content for:', page.url, result.data?.response);
148
+ return {
149
+ index: batchStart + batchIndex,
150
+ url: page.url,
151
+ title: page.title,
152
+ content: result.data?.response,
153
+ depth: page.depth,
154
+ };
155
+ }
156
+ catch (error) {
157
+ console.error('[WebCrawlTool] Error summarizing page:', page.url, error);
158
+ return {
159
+ index: batchStart + batchIndex,
160
+ url: page.url,
161
+ title: page.title,
162
+ content: page.content, // Keep original content if summarization fails
163
+ depth: page.depth,
164
+ };
165
+ }
166
+ });
167
+ // Wait for all promises in this batch to complete
168
+ const batchResults = await Promise.all(summarizePromises);
169
+ // Update the original pages array with summarized content
170
+ batchResults.forEach((result) => {
171
+ crawlResult.pages[result.index] = {
172
+ url: result.url,
173
+ title: result.title,
174
+ content: result.content,
175
+ depth: result.depth,
176
+ };
177
+ });
178
+ console.log(`[WebCrawlTool] Completed batch ${Math.floor(batchStart / batchSize) + 1} of ${Math.ceil(pageCount / batchSize)}`);
179
+ }
180
+ return crawlResult;
181
+ }
182
+ catch (error) {
183
+ console.error(`[WebCrawlTool] Crawl error:`, error);
184
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
185
+ return {
186
+ url,
187
+ success: false,
188
+ error: errorMessage,
189
+ pages: [],
190
+ totalPages: 0,
191
+ metadata: {
192
+ loadTime: Date.now() - startTime,
193
+ },
194
+ };
195
+ }
196
+ }
197
+ /**
198
+ * Execute crawl operation - multi-page site exploration
199
+ */
200
+ async executeCrawl(firecrawl, startTime) {
201
+ const { url, format, onlyMainContent, maxPages, crawlDepth, includePaths, excludePaths, } = this.params;
202
+ // Configure crawling options
203
+ const crawlOptions = {
204
+ limit: maxPages || 10,
205
+ maxDepth: crawlDepth || 2,
206
+ };
207
+ // Add URL filtering if specified
208
+ if (includePaths && includePaths.length > 0) {
209
+ crawlOptions.includePaths = includePaths;
210
+ }
211
+ if (excludePaths && excludePaths.length > 0) {
212
+ crawlOptions.excludePaths = excludePaths;
213
+ }
214
+ console.log('[WebCrawlTool] Crawling with options:', crawlOptions);
215
+ // Execute crawl
216
+ const response = await firecrawl.crawl(url, {
217
+ ...crawlOptions,
218
+ scrapeOptions: {
219
+ formats: [format],
220
+ onlyMainContent,
221
+ removeBase64Images: true,
222
+ },
223
+ });
224
+ // Process crawled pages
225
+ const pages = [];
226
+ // Handle different response structures
227
+ const crawlData = response.completed ? response.data : [];
228
+ for (const page of crawlData) {
229
+ let content = '';
230
+ // Extract content based on format
231
+ if (format === 'markdown' && page.markdown) {
232
+ content = page.markdown;
233
+ }
234
+ pages.push({
235
+ url: page.metadata?.sourceURL || '',
236
+ title: page.metadata?.title || '',
237
+ content: content.trim(),
238
+ depth: page.metadata?.depth,
239
+ });
240
+ }
241
+ return {
242
+ url,
243
+ pages,
244
+ totalPages: pages.length,
245
+ success: true,
246
+ error: '',
247
+ metadata: {
248
+ loadTime: Date.now() - startTime,
249
+ crawlDepth: crawlDepth || 2,
250
+ maxPagesReached: pages.length >= (maxPages || 10),
251
+ },
252
+ };
253
+ }
254
+ }
255
+ //# sourceMappingURL=web-crawl-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-crawl-tool.js","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/web-crawl-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
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 WebExtractToolParamsSchema: z.ZodObject<{
6
+ url: z.ZodString;
7
+ prompt: z.ZodString;
8
+ schema: z.ZodString;
9
+ timeout: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
10
+ credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ schema: string;
13
+ url: string;
14
+ prompt: string;
15
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
16
+ timeout?: number | undefined;
17
+ }, {
18
+ schema: string;
19
+ url: string;
20
+ prompt: string;
21
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
22
+ timeout?: number | undefined;
23
+ }>;
24
+ declare const WebExtractToolResultSchema: z.ZodObject<{
25
+ url: z.ZodString;
26
+ success: z.ZodBoolean;
27
+ error: z.ZodString;
28
+ extractedData: z.ZodAny;
29
+ metadata: z.ZodOptional<z.ZodObject<{
30
+ extractionTime: z.ZodOptional<z.ZodNumber>;
31
+ pageTitle: z.ZodOptional<z.ZodString>;
32
+ statusCode: z.ZodOptional<z.ZodNumber>;
33
+ }, "strip", z.ZodTypeAny, {
34
+ statusCode?: number | undefined;
35
+ extractionTime?: number | undefined;
36
+ pageTitle?: string | undefined;
37
+ }, {
38
+ statusCode?: number | undefined;
39
+ extractionTime?: number | undefined;
40
+ pageTitle?: string | undefined;
41
+ }>>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ success: boolean;
44
+ error: string;
45
+ url: string;
46
+ metadata?: {
47
+ statusCode?: number | undefined;
48
+ extractionTime?: number | undefined;
49
+ pageTitle?: string | undefined;
50
+ } | undefined;
51
+ extractedData?: any;
52
+ }, {
53
+ success: boolean;
54
+ error: string;
55
+ url: string;
56
+ metadata?: {
57
+ statusCode?: number | undefined;
58
+ extractionTime?: number | undefined;
59
+ pageTitle?: string | undefined;
60
+ } | undefined;
61
+ extractedData?: any;
62
+ }>;
63
+ type WebExtractToolParams = z.output<typeof WebExtractToolParamsSchema>;
64
+ type WebExtractToolResult = z.output<typeof WebExtractToolResultSchema>;
65
+ type WebExtractToolParamsInput = z.input<typeof WebExtractToolParamsSchema>;
66
+ export declare class WebExtractTool extends ToolBubble<WebExtractToolParams, WebExtractToolResult> {
67
+ static readonly bubbleName: BubbleName;
68
+ static readonly schema: z.ZodObject<{
69
+ url: z.ZodString;
70
+ prompt: z.ZodString;
71
+ schema: z.ZodString;
72
+ timeout: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
73
+ credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
74
+ }, "strip", z.ZodTypeAny, {
75
+ schema: string;
76
+ url: string;
77
+ prompt: string;
78
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
79
+ timeout?: number | undefined;
80
+ }, {
81
+ schema: string;
82
+ url: string;
83
+ prompt: string;
84
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
85
+ timeout?: number | undefined;
86
+ }>;
87
+ static readonly resultSchema: z.ZodObject<{
88
+ url: z.ZodString;
89
+ success: z.ZodBoolean;
90
+ error: z.ZodString;
91
+ extractedData: z.ZodAny;
92
+ metadata: z.ZodOptional<z.ZodObject<{
93
+ extractionTime: z.ZodOptional<z.ZodNumber>;
94
+ pageTitle: z.ZodOptional<z.ZodString>;
95
+ statusCode: z.ZodOptional<z.ZodNumber>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ statusCode?: number | undefined;
98
+ extractionTime?: number | undefined;
99
+ pageTitle?: string | undefined;
100
+ }, {
101
+ statusCode?: number | undefined;
102
+ extractionTime?: number | undefined;
103
+ pageTitle?: string | undefined;
104
+ }>>;
105
+ }, "strip", z.ZodTypeAny, {
106
+ success: boolean;
107
+ error: string;
108
+ url: string;
109
+ metadata?: {
110
+ statusCode?: number | undefined;
111
+ extractionTime?: number | undefined;
112
+ pageTitle?: string | undefined;
113
+ } | undefined;
114
+ extractedData?: any;
115
+ }, {
116
+ success: boolean;
117
+ error: string;
118
+ url: string;
119
+ metadata?: {
120
+ statusCode?: number | undefined;
121
+ extractionTime?: number | undefined;
122
+ pageTitle?: string | undefined;
123
+ } | undefined;
124
+ extractedData?: any;
125
+ }>;
126
+ static readonly shortDescription = "Extracts structured data from web pages using Firecrawl AI-powered extraction with custom prompts and schemas";
127
+ static readonly longDescription = "\n A powerful web data extraction tool that uses Firecrawl's AI-powered extraction API to extract structured data from web pages.\n \n \uD83C\uDFAF EXTRACT Features:\n - AI-powered structured data extraction using natural language prompts\n - Custom JSON schema validation for extracted data\n - Handles dynamic content and JavaScript-rendered pages\n - Precise extraction of specific elements like images, prices, descriptions\n - Works with complex e-commerce sites and product pages\n - Requires FIRECRAWL_API_KEY credential\n \n Use Cases:\n - Extract product information (names, prices, images) from e-commerce sites\n - Gather structured data from listings and catalogs\n - Extract contact information and business details\n - Parse article metadata and content structure\n - Collect specific data points from forms and tables\n - Extract image URLs, especially for product galleries\n \n How it works:\n 1. Provide a URL and a natural language prompt describing what to extract\n 2. Define a JSON schema for the expected data structure\n 3. Firecrawl's AI analyzes the page and extracts matching data\n 4. Returns structured data validated against your schema\n \n Example use case:\n - URL: Uniqlo product page\n - Prompt: \"Extract the product name, price, and all available product image URLs\"\n - Schema: {\"name\": \"string\", \"price\": \"number\", \"images\": [\"string\"]}\n - Result: Structured JSON with the exact data you need\n ";
128
+ static readonly alias = "extract";
129
+ static readonly type = "tool";
130
+ constructor(params?: WebExtractToolParamsInput, context?: BubbleContext);
131
+ performAction(context?: BubbleContext): Promise<WebExtractToolResult>;
132
+ }
133
+ export {};
134
+ //# sourceMappingURL=web-extract-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-extract-tool.d.ts","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/web-extract-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;AAE3D,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5E,QAAA,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;EA4B9B,CAAC;AAGH,QAAA,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe9B,CAAC;AAGH,KAAK,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AACxE,KAAK,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AACxE,KAAK,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE5E,qBAAa,cAAe,SAAQ,UAAU,CAC5C,oBAAoB,EACpB,oBAAoB,CACrB;IAEC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAsB;IAC5D,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;OAA8B;IACpD,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA8B;IAC1D,MAAM,CAAC,QAAQ,CAAC,gBAAgB,mHACkF;IAClH,MAAM,CAAC,QAAQ,CAAC,eAAe,sgDA8B7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,aAAa;IAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;gBAG5B,MAAM,GAAE,yBAIP,EACD,OAAO,CAAC,EAAE,aAAa;IAKnB,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA6G5E"}
@@ -0,0 +1,175 @@
1
+ import { z } from 'zod';
2
+ import { ToolBubble } from '../../types/tool-bubble-class.js';
3
+ import Firecrawl from '@mendable/firecrawl-js';
4
+ import { CredentialType } from '@bubblelab/shared-schemas';
5
+ // Parameters schema for web extraction
6
+ const WebExtractToolParamsSchema = z.object({
7
+ url: z
8
+ .string()
9
+ .url('Must be a valid URL')
10
+ .describe('The URL to extract structured data from'),
11
+ prompt: z
12
+ .string()
13
+ .min(1, 'Extraction prompt is required')
14
+ .describe('Detailed prompt describing what data to extract from the web page'),
15
+ schema: z
16
+ .string()
17
+ .min(1, 'JSON schema is required')
18
+ .describe('JSON schema string defining the structure of the data to extract'),
19
+ timeout: z
20
+ .number()
21
+ .min(1000)
22
+ .max(60000)
23
+ .default(30000)
24
+ .optional()
25
+ .describe('Timeout in milliseconds for the extraction (default: 30000)'),
26
+ credentials: z
27
+ .record(z.nativeEnum(CredentialType), z.string())
28
+ .optional()
29
+ .describe('Required credentials including FIRECRAWL_API_KEY'),
30
+ });
31
+ // Result schema for extraction operations
32
+ const WebExtractToolResultSchema = z.object({
33
+ url: z.string().url().describe('The original URL that was processed'),
34
+ success: z.boolean().describe('Whether the extraction was successful'),
35
+ error: z.string().describe('Error message if extraction failed'),
36
+ extractedData: z
37
+ .any()
38
+ .describe('The extracted structured data matching the provided schema'),
39
+ metadata: z
40
+ .object({
41
+ extractionTime: z.number().optional(),
42
+ pageTitle: z.string().optional(),
43
+ statusCode: z.number().optional(),
44
+ })
45
+ .optional()
46
+ .describe('Additional metadata about the extraction'),
47
+ });
48
+ export class WebExtractTool extends ToolBubble {
49
+ // Required static metadata
50
+ static bubbleName = 'web-extract-tool';
51
+ static schema = WebExtractToolParamsSchema;
52
+ static resultSchema = WebExtractToolResultSchema;
53
+ static shortDescription = 'Extracts structured data from web pages using Firecrawl AI-powered extraction with custom prompts and schemas';
54
+ static longDescription = `
55
+ A powerful web data extraction tool that uses Firecrawl's AI-powered extraction API to extract structured data from web pages.
56
+
57
+ 🎯 EXTRACT Features:
58
+ - AI-powered structured data extraction using natural language prompts
59
+ - Custom JSON schema validation for extracted data
60
+ - Handles dynamic content and JavaScript-rendered pages
61
+ - Precise extraction of specific elements like images, prices, descriptions
62
+ - Works with complex e-commerce sites and product pages
63
+ - Requires FIRECRAWL_API_KEY credential
64
+
65
+ Use Cases:
66
+ - Extract product information (names, prices, images) from e-commerce sites
67
+ - Gather structured data from listings and catalogs
68
+ - Extract contact information and business details
69
+ - Parse article metadata and content structure
70
+ - Collect specific data points from forms and tables
71
+ - Extract image URLs, especially for product galleries
72
+
73
+ How it works:
74
+ 1. Provide a URL and a natural language prompt describing what to extract
75
+ 2. Define a JSON schema for the expected data structure
76
+ 3. Firecrawl's AI analyzes the page and extracts matching data
77
+ 4. Returns structured data validated against your schema
78
+
79
+ Example use case:
80
+ - URL: Uniqlo product page
81
+ - Prompt: "Extract the product name, price, and all available product image URLs"
82
+ - Schema: {"name": "string", "price": "number", "images": ["string"]}
83
+ - Result: Structured JSON with the exact data you need
84
+ `;
85
+ static alias = 'extract';
86
+ static type = 'tool';
87
+ constructor(params = {
88
+ url: '',
89
+ prompt: '',
90
+ schema: '{}',
91
+ }, context) {
92
+ super(params, context);
93
+ }
94
+ async performAction(context) {
95
+ void context; // Context available but not currently used
96
+ const { url, prompt, schema, timeout } = this.params;
97
+ const startTime = Date.now();
98
+ try {
99
+ // Get Firecrawl API key from credentials
100
+ const apiKey = this.params.credentials?.FIRECRAWL_API_KEY;
101
+ if (!apiKey) {
102
+ throw new Error('FIRECRAWL_API_KEY is required but not provided in credentials');
103
+ }
104
+ // Initialize Firecrawl client
105
+ const firecrawl = new Firecrawl({ apiKey });
106
+ console.log('[WebExtractTool] Extracting data from URL:', url);
107
+ console.log('[WebExtractTool] Using prompt:', prompt.substring(0, 100) + '...');
108
+ console.log('[WebExtractTool] Expected schema:', schema.substring(0, 200) + '...');
109
+ // Validate and parse the JSON schema
110
+ let parsedSchema;
111
+ try {
112
+ parsedSchema = JSON.parse(schema);
113
+ }
114
+ catch (parseError) {
115
+ throw new Error(`Invalid JSON schema provided: ${parseError instanceof Error ? parseError.message : 'Unknown parsing error'}`);
116
+ }
117
+ // Configure extraction options
118
+ const extractOptions = {
119
+ urls: [url],
120
+ prompt,
121
+ schema: parsedSchema,
122
+ timeout: timeout ? timeout / 1000 : 30, // Convert to seconds
123
+ };
124
+ // Execute extraction
125
+ const response = await firecrawl.extract(extractOptions);
126
+ // Handle the response
127
+ if (!response || typeof response !== 'object') {
128
+ throw new Error('Invalid response from Firecrawl extract API');
129
+ }
130
+ // Check if extraction was successful
131
+ if (response.success === false || response.status === 'failed') {
132
+ throw new Error(response.error || 'Extraction failed');
133
+ }
134
+ // Extract the data from the response
135
+ let extractedData = {};
136
+ if (response.data) {
137
+ extractedData = response.data;
138
+ }
139
+ else {
140
+ throw new Error('No data returned from extraction');
141
+ }
142
+ const extractionTime = Date.now() - startTime;
143
+ // Extract metadata if available
144
+ const metadata = {
145
+ extractionTime,
146
+ };
147
+ if (response.sources) {
148
+ metadata.sources = response.sources;
149
+ }
150
+ console.log('[WebExtractTool] Successfully extracted data from:', url);
151
+ console.log('[WebExtractTool] Extraction time:', extractionTime, 'ms');
152
+ return {
153
+ url,
154
+ success: true,
155
+ error: '',
156
+ extractedData,
157
+ metadata,
158
+ };
159
+ }
160
+ catch (error) {
161
+ console.error('[WebExtractTool] Extraction error:', error);
162
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
163
+ return {
164
+ url,
165
+ success: false,
166
+ error: errorMessage,
167
+ extractedData: {},
168
+ metadata: {
169
+ extractionTime: Date.now() - startTime,
170
+ },
171
+ };
172
+ }
173
+ }
174
+ }
175
+ //# sourceMappingURL=web-extract-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-extract-tool.js","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/web-extract-tool.ts"],"names":[],"mappings":"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"}